M16: Zweisprachigkeit (DE/EN) im Experte-Tab, eigener L10n-Helfer statt String Catalog

.environment(\.locale) + Localizable.xcstrings schaltete Text(LocalizedStringKey)
live nachweislich nicht um. Ersetzt durch Core/Localization/L10n.swift
(Dictionary-Lookup je AppStorage("appLanguage")), Umschalt-Button in der Toolbar.
Vollständig übersetzt: alle Tab-Namen, alle Menü-Kategorien, kompletter
Experte-Tab inkl. Firewall-Formulare. 60 Tests grün, live bestätigt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YDmUd93KxsYGr2kLTotWnG
This commit is contained in:
Kay
2026-09-15 15:54:26 +02:00
co-authored by Claude Sonnet 5
parent 2e507aa9ef
commit 0d16d05cb3
8 changed files with 220 additions and 51 deletions
+27
View File
@@ -814,3 +814,30 @@ Test, WLAN/Bonding/PPPoE-Live-Tests).
Verwechslung. Live bestätigt ("funktioniert"). Adress-Listen bewusst
weiter zurückgestellt (andere UI-Form nötig). 60 Unit-Tests grün,
Manual.md/HANDOFF.md aktualisiert, Commit + Push.
- "jetzt machen wir das ganze zweisprachig..." → M16 gestartet, Nutzer
wählte "Schrittweise, Tab für Tab" als Vorgehen. Erster Versuch: Apple
String Catalog (`Localizable.xcstrings`) + `.environment(\.locale, ...)`
auf `WindowGroup`-Ebene, Tab-Namen/Kategorien/Experte-Tab-Chrome mit
passenden deutschen Keys befüllt. Live: "wenn ich von DE auf EN
wechsele passiert nicht im experte-Tab" → Root Cause vermutet: Swifts
`Text`/`.help`/etc. wandeln nur String-*Literale* automatisch in
`LocalizedStringKey` um, nicht String-*Variablen* (`field.label` etc.)
— jede Stelle explizit mit `LocalizedStringKey(...)` umschlossen, 60
Tests grün. Live erneut: "bleibt auf deutsch" — Fix wirkungslos.
Tatsächliche Ursache gefunden: `.environment(\.locale)` steuert nicht,
welche Sprachtabelle `Text(LocalizedStringKey)` zur Laufzeit auflöst
(nur Calendar/DateFormatter-artige APIs) — die String-Catalog-Bindung
scheint an der Bundle-internen Locale-Verhandlung beim App-Start
festzuhängen und reagiert nicht auf einen Laufzeit-Override. Fix:
`Localizable.xcstrings` entfernt, neuer eigener Helfer
`Core/Localization/L10n.swift` (`L10n.t(german, appLanguage) -> String`,
simples Dictionary, deutscher Text als Schlüssel), jede betroffene View
liest `@AppStorage("appLanguage")` selbst und ruft `L10n.t(...)` direkt
auf statt über die Environment/Catalog-Kette zu gehen. Umgesetzt für
alle 6 Tab-Namen, alle 13 Menü-Kategorien, komplette Chrome von
`ExpertView.swift`/`ExpertMenuDetailView.swift` (Buttons, Dialoge,
Feld-Labels/-Hilfetexte) — Firewall-Familie darin bereits vollständig
übersetzt aus dem ersten Versuch. 60 Tests grün, live bestätigt ("das
sieht gut aus"). HANDOFF.md/README.md/Manual.md aktualisiert, Commit +
Push. Rest von `RouterOSSchemaCatalog.swift` sowie die übrigen Tabs
bleiben offen für Folgesessions (Tab für Tab, wie vereinbart).