---
status: complete
phase: 34-i18n-foundation
source: [34-01-PLAN.md, 34-02-PLAN.md, 34-03-PLAN.md, 34-04-PLAN.md, 34-05-PLAN.md]
started: 2026-04-17T00:00:00.000Z
updated: 2026-04-17T00:00:00.000Z
---

## Current Test
<!-- OVERWRITE each test - shows where we are -->

[testing complete]

## Tests

### 1. App loads with i18n — no errors
expected: Start the dev server fresh (bun run dev). Open the app in the browser. The app loads without console errors related to i18n, missing translation keys, or failed namespace loads. All visible text renders normally (no [object Object] or raw key strings like "common.save").
result: pass

### 2. UI strings are translated (not hardcoded)
expected: Browse around the app — collection page, a thread, setups. All UI chrome text (buttons, labels, headings, empty states) renders in English. No raw strings like "items.title" or untranslated placeholders visible anywhere.
result: pass

### 3. Language picker exists in Settings
expected: Open Settings page. There is a language / language picker section. It shows the current language (English). The picker lists at least English and Deutsch (German) as options.
result: pass

### 4. Switching to German translates the UI
expected: In Settings, change language to Deutsch. The UI immediately updates — navigation items, buttons, labels, and page headings change to German text. No full page reload required.
result: pass — was fixed (full page coverage + ä/ö/ü restored)

### 5. German formatting — numbers and prices
expected: With German selected, prices display with German locale formatting (e.g. "1.234,56 €" with period as thousands separator, comma as decimal, € symbol). Weight values also use comma as decimal separator where applicable.
result: pass

### 6. Switch back to English
expected: In Settings, change language back to English. The UI reverts to English text and English number/price formatting (e.g. "$1,234.56"). Change is immediate, no reload.
result: pass

### 7. Language preference persists on reload
expected: Set the language to Deutsch. Reload the page (F5 / hard refresh). The app remembers the language selection and loads in German without requiring the user to switch again.
result: pass

## Summary

total: 7
passed: 7
issues: 0
pending: 0
skipped: 0

## Gaps

[none]
