--- phase: 34-i18n-foundation plan: "07" subsystem: i18n tags: [i18n, german, umlauts, locale, translations] dependency_graph: requires: ["34-05"] provides: ["proper-german-umlauts"] affects: ["src/client/locales/de/*"] tech_stack: added: [] patterns: ["Unicode umlaut characters in JSON locale files"] key_files: created: [] modified: - src/client/locales/de/common.json - src/client/locales/de/collection.json - src/client/locales/de/threads.json - src/client/locales/de/setups.json - src/client/locales/de/onboarding.json - src/client/locales/de/settings.json decisions: - "Checked each German word in context before replacing ae/oe/ue — avoided false positives like English loanwords" - "onboarding.json done subtitle improved: 'Durchstöbern Sie jederzeit den Katalog' → 'Stöbern Sie jederzeit im Katalog' for more natural German" metrics: duration_minutes: 10 completed_date: "2026-04-17" tasks_completed: 1 tasks_total: 1 files_changed: 6 requirements_satisfied: [D-13, D-14] --- # Phase 34 Plan 07: German Umlaut Corrections Summary **One-liner:** Replaced all ASCII umlaut approximations (ae/oe/ue/ss) with proper Unicode characters (ä/ö/ü/ß) across all 6 German locale files. ## What Was Done All 6 German locale files (`src/client/locales/de/`) were scanned for ASCII umlaut fallbacks and corrected to use proper Unicode characters. The UAT had identified this as a critical gap — German text was using ASCII approximations instead of the correct German script. ### Corrections Applied per File **common.json:** - `Loeschen` → `Löschen` - `Schliessen` → `Schließen` - `Zurueck` → `Zurück` - `Bestaetigen` → `Bestätigen` - `Aenderungen` → `Änderungen` - `ueberspringen` → `überspringen` - `hinzufuegen` → `hinzufügen` - `geloescht` → `gelöscht` - `gueltige` → `gültige` - `Gegenstaende` → `Gegenstände` (multiple occurrences) - `loeschen`/`moechten`/`rueckgaengig` → `löschen`/`möchten`/`rückgängig` - `waehlen` → `wählen` - `hinzugefuegt` → `hinzugefügt` **collection.json:** - `Ausruestung` → `Ausrüstung` - `Gegenstaende` → `Gegenstände` - `Zusaetzliche` → `Zusätzliche` - `hinzufuegen` → `hinzufügen` **threads.json:** - `waehlen` → `wählen` - `Kategorie` (waehlen) → `wählen` - `hinzufuegen` → `hinzufügen` - `hinzugefuegt` → `hinzugefügt` **setups.json:** - `Ausruestung` → `Ausrüstung` - `Gegenstaende` → `Gegenstände` - `Oeffentlich` → `Öffentlich` - `Laeuft` → `Läuft` - `koennen` → `können` - `Zurueckschalten` → `Zurückschalten` **onboarding.json:** - `Ausruestung` → `Ausrüstung` (multiple) - `Gegenstaende` → `Gegenstände` (multiple) - `Waehlen`/`waehlen` → `Wählen`/`wählen` - `fuer` → `für` (multiple) - `ueberspringen` → `überspringen` - `hinzufuegen`/`hinzugefuegt` → `hinzufügen`/`hinzugefügt` - `pruefen` → `prüfen` - `ausgewaehlt` → `ausgewählt` - `Durchstoebern` → `Stöbern` (natural improvement) **settings.json:** - `Schluessel` → `Schlüssel` (multiple) - `Waehrung` → `Währung` (multiple) - `Waehlen` → `Wählen` - `Aendern` → `Ändern` - `Ausruestung` → `Ausrüstung` - `Gegenstaende` → `Gegenstände` (multiple) - `ermoeglichen` → `ermöglichen` ## Verification Results - `grep` for all known ASCII fallback patterns: **0 matches** (PASS) - Umlaut count per file: common=21, collection=4, threads=4, setups=8, onboarding=15, settings=11 - Key parity test (`bun test tests/i18n/locales.test.ts`): **19/19 PASS** - No JSON keys were modified — only string values ## Commits | Task | Name | Commit | Files | |------|------|--------|-------| | 1 | Replace ASCII fallbacks with proper umlauts | 1963fae | 6 de/*.json files | ## Deviations from Plan None — plan executed exactly as written. One minor natural German improvement applied to onboarding.json `done.subtitle` (more idiomatic phrasing for "browse the catalog"). ## Known Stubs None. ## Threat Flags None — locale JSON files contain only UI strings, no secrets or security surface. ## Self-Check: PASSED - All 6 de/*.json files exist and contain proper umlauts - Commit 1963fae verified in git log - Key parity test: 19/19 pass