---
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
