feat: i18n — translate Android app UI + pass device lang to server
CI / test-and-package (push) Successful in 40s
CI / build-android (push) Successful in 1m25s

- French (values-fr) and German (values-de) string resources for
  all app UI: settings dialog, errors, labels, buttons
- getDeviceLang() detects Locale.getDefault().getLanguage()
  and maps to en/fr/de
- loadUrl() now appends ?lang=XX to the base URL so the web
  app renders in the user's device language automatically
- English remains the fallback for unsupported languages
This commit is contained in:
agentbox
2026-08-01 12:11:57 +00:00
parent 69def70fe6
commit 4abbbecce6
3 changed files with 58 additions and 2 deletions
@@ -8,6 +8,7 @@ import android.net.ConnectivityManager;
import android.net.NetworkInfo; import android.net.NetworkInfo;
import android.net.http.SslError; import android.net.http.SslError;
import android.os.Bundle; import android.os.Bundle;
import java.util.Locale;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.View; import android.view.View;
import android.webkit.CookieManager; import android.webkit.CookieManager;
@@ -212,12 +213,21 @@ public class MainActivity extends AppCompatActivity {
private void loadUrl(String url) { private void loadUrl(String url) {
serverUrl = url; serverUrl = url;
currentUrl = url; // Append device language so the web app renders in the user's language
currentUrl = url + "?lang=" + getDeviceLang();
firstLoad = true; firstLoad = true;
errorView.setVisibility(View.GONE); errorView.setVisibility(View.GONE);
webView.setVisibility(View.VISIBLE); webView.setVisibility(View.VISIBLE);
progressBar.setVisibility(View.VISIBLE); progressBar.setVisibility(View.VISIBLE);
webView.loadUrl(url); webView.loadUrl(currentUrl);
}
/** Map the device's system language to one of the supported codes: en, fr, de. */
private String getDeviceLang() {
String lang = Locale.getDefault().getLanguage();
if ("fr".equals(lang)) return "fr";
if ("de".equals(lang)) return "de";
return "en";
} }
private void showSettingsDialog() { private void showSettingsDialog() {
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Mahlzeiten-Tracker</string>
<string name="refresh">Aktualisieren</string>
<string name="settings">Einstellungen</string>
<string name="settings_title">Server-Konfiguration</string>
<string name="url_label">Geben Sie die Basis-URL Ihres Mahlzeiten-Trackers ein:</string>
<string name="url_hint_text">Die Basisadresse Ihres Servers.\nBeispiel: https://mahlzeiten.beispiel.de</string>
<string name="save">Speichern</string>
<string name="cancel">Abbrechen</string>
<string name="clear_data">Daten löschen</string>
<string name="url_saved">Mit Server verbunden</string>
<string name="url_empty">Bitte geben Sie eine Basis-URL ein</string>
<string name="error_no_network">Keine Netzwerkverbindung.\nZum Wiederholen tippen.</string>
<string name="error_load_failed">Server nicht erreichbar.\nÜberprüfen Sie die URL und tippen Sie zum Wiederholen.\n\nTipp: Öffnen Sie die URL zuerst in einem Browser.</string>
<string name="error_http">Server antwortete mit HTTP %d.\nÜberprüfen Sie Ihre Basis-URL und wiederholen Sie.</string>
<string name="server_not_configured">Kein Server konfiguriert.\nTippen Sie auf ⚙, um Ihre Basis-URL einzugeben.</string>
<string name="data_cleared">Lokale Daten gelöscht</string>
<string name="ssl_error_title">⚠ Zertifikatwarnung</string>
<string name="ssl_error_msg">Der Server %1$s verwendet ein nicht vertrauenswürdiges Zertifikat (Fehler %2$d).\n\nDies ist bei selbst gehosteten Servern üblich. Nur fortfahren, wenn Sie diesem Server vertrauen.</string>
<string name="ssl_proceed">Fortfahren</string>
<string name="ssl_cancel">Abbrechen</string>
</resources>
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Suivi Repas</string>
<string name="refresh">Actualiser</string>
<string name="settings">Paramètres</string>
<string name="settings_title">Configuration du serveur</string>
<string name="url_label">Entrez l\'URL de base de votre Suivi Repas :</string>
<string name="url_hint_text">L\'adresse de base de votre serveur.\nExemple : https://repas.exemple.com</string>
<string name="save">Enregistrer</string>
<string name="cancel">Annuler</string>
<string name="clear_data">Effacer données</string>
<string name="url_saved">Connecté au serveur</string>
<string name="url_empty">Veuillez entrer une URL de base</string>
<string name="error_no_network">Pas de connexion réseau.\nAppuyez pour réessayer.</string>
<string name="error_load_failed">Impossible de joindre le serveur.\nVérifiez l\'URL et appuyez pour réessayer.\n\nConseil : vérifiez que l\'URL s\'ouvre d\'abord dans un navigateur.</string>
<string name="error_http">Le serveur a retourné HTTP %d.\nVérifiez votre URL de base et réessayez.</string>
<string name="server_not_configured">Aucun serveur configuré.\nAppuyez sur l\'icône ⚙ pour entrer votre URL de base.</string>
<string name="data_cleared">Données locales effacées</string>
<string name="ssl_error_title">⚠ Avertissement certificat</string>
<string name="ssl_error_msg">Le serveur %1$s utilise un certificat non fiable (erreur %2$d).\n\nC\'est fréquent pour les serveurs auto-hébergés. Continuez seulement si vous faites confiance à ce serveur.</string>
<string name="ssl_proceed">Continuer</string>
<string name="ssl_cancel">Annuler</string>
</resources>