From 29e144eddf96991373dcdc2f27f592814a4087eb Mon Sep 17 00:00:00 2001 From: mhoennig Date: Thu, 23 Jul 2026 10:15:23 +0200 Subject: [PATCH] frontend: UI-Default-Sprache aus der Browsersprache (Fallback DE) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ohne gespeicherte werkbaum-lang wählt detectLang() die erste vom Browser gemeldete Sprache (navigator.languages), für die eine Übersetzung existiert (Primär-Subtag; de-AT->de, zh-Hans->zh), sonst Deutsch. Greift auch nach dem Reset. Deutsch bleibt Quellsprache. Als D21 dokumentiert. Co-Authored-By: Claude Opus 4.8 --- docs/DECISIONS.md | 15 +++++++++++++++ frontend/src/app.js | 15 ++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/docs/DECISIONS.md b/docs/DECISIONS.md index d022520..2cf7dad 100644 --- a/docs/DECISIONS.md +++ b/docs/DECISIONS.md @@ -314,3 +314,18 @@ Standalone-Tauglichkeit (`file://`). Verworfene Alternative: Google-Link ersatzlos streichen und nur die System- Schrift (`system-ui`) nutzen — spart die 204 KB, gibt aber die einheitliche Markentypografie (IBM Plex, BRAND) auf. + +## D21 — UI-Default-Sprache aus der Browsersprache, Fallback Deutsch +Ohne gespeicherte Nutzerwahl (`werkbaum-lang`) richtet sich die Anzeige­sprache +nach der **Browsersprache**: die erste aus `navigator.languages`, für die eine +Übersetzung existiert (nur der Primär-Subtag zählt, `de-AT`→`de`, +`zh-Hans-CN`→`zh`); trifft keine zu, bleibt **Deutsch** der Fallback +(`detectLang()` in `app.js`). Zuvor war der Default fest `'de'`, unabhängig vom +Browser. + +Begründung: Ein spanisch- oder englischsprachiger Erstbesucher sah bislang ohne +Not eine deutsche Oberfläche. Die Erkennung greift auch **nach dem Reset** +(löscht `werkbaum-lang`, lädt neu → selber Pfad). **Deutsch bleibt Quellsprache** +(CLAUDE: neue UI-Texte zuerst auf Deutsch) — das betrifft die Autoren-/Pflege­ +seite und ist unabhängig vom Anzeige-Default für Besucher. Eine bewusste +Sprachwahl überschreibt die Erkennung dauerhaft (Persistenz in `werkbaum-lang`). diff --git a/frontend/src/app.js b/frontend/src/app.js index c62e2f4..4ccb792 100644 --- a/frontend/src/app.js +++ b/frontend/src/app.js @@ -1146,8 +1146,21 @@ function applyMobile(){ mqMobile.addEventListener('change', applyMobile); restoreState(); /* Editortext + GUI-Zustand aus dem Browser wiederherstellen */ + +/* Default-Sprache: gespeicherte Wahl, sonst die erste vom Browser gemeldete + Sprache (navigator.languages), die wir übersetzt haben — sonst Deutsch. + Nur der Primär-Subtag zählt (z. B. "de-AT" -> "de", "zh-Hans" -> "zh"). */ +function detectLang(){ + const cands = (navigator.languages && navigator.languages.length) + ? navigator.languages : [navigator.language]; + for(const c of cands){ + const primary = (c || '').toLowerCase().split('-')[0]; + if(I18N[primary]) return primary; + } + return 'de'; +} let startLang = 'de'; -try{ startLang = localStorage.getItem('werkbaum-lang') || 'de'; }catch(_){} +try{ startLang = localStorage.getItem('werkbaum-lang') || detectLang(); }catch(_){ startLang = detectLang(); } applyLang(I18N[startLang] ? startLang : 'de'); /* setzt Texte + rendert */ applyMobile(); /* Mobil-Verhalten (nach Sprache/Restore) anwenden */