# Phase 34: i18n Foundation - Discussion Log > **Audit trail only.** Do not use as input to planning, research, or execution agents. > Decisions are captured in CONTEXT.md — this log preserves the alternatives considered. **Date:** 2026-04-13 **Phase:** 34-i18n Foundation **Areas discussed:** Translation scope & boundaries, Library & architecture, Language selection UX, First additional language --- ## Translation Scope & Boundaries | Option | Description | Selected | |--------|-------------|----------| | UI chrome only | Buttons, labels, headings, empty states, errors, navigation | | | UI chrome + system content | UI chrome plus default categories, onboarding text, MCP descriptions | ✓ | | Everything including catalog | UI + system + catalog item names/descriptions per locale | | **User's choice:** UI chrome + system content **Notes:** Catalog data translation deferred — too much content to maintain translations for. --- ## Library & Architecture ### Library choice | Option | Description | Selected | |--------|-------------|----------| | react-i18next | Most popular, hook-based, JSON files, namespaces, lazy loading | | | Lingui | Compile-time extraction, smaller runtime, macro-based | | | You decide | Claude picks based on stack fit | ✓ | **User's choice:** Claude's discretion ### Translation storage | Option | Description | Selected | |--------|-------------|----------| | JSON files in repo | en.json, de.json checked into git. Simple, reviewable in PRs | ✓ | | External translation service | Crowdin/Lokalise with web UI for translators | | | You decide | Claude picks | | **User's choice:** JSON in repo. User asked whether this is easy to switch later — confirmed it is. Translation keys are the same regardless of storage; switching to external service is a CI/sync change, not a code rewrite. --- ## Language Selection UX | Option | Description | Selected | |--------|-------------|----------| | Separate setting | Language and currency/market are independent | | | Tied to market | EUR/DE = German, GBP/UK = English | | | Auto-detect with override | Browser locale auto-detect, independent from market, overridable | ✓ | **User's choice:** Auto-detect with override, independent from market/currency. --- ## First Additional Language ### Language choice | Option | Description | Selected | |--------|-------------|----------| | German (de) | Primary target market, user speaks it natively | ✓ | | French (fr) | Tests different grammar family | | | Both German + French | Stress-tests the system | | **User's choice:** German. User noted they can't validate French ("aint speaking french, can only send ai agents to test"). ### Translation production | Option | Description | Selected | |--------|-------------|----------| | Manual translation | User writes German strings | | | AI-generated, user reviews | Claude generates, user does formal review pass | | | AI-generated, fix organically | Claude generates, user catches issues during normal app usage | ✓ | **User's choice:** AI-generated, no dedicated review — fix issues as they're noticed. ## Claude's Discretion - Library choice (react-i18next vs. Lingui) - String key naming convention - Dynamic content interpolation patterns - Extraction strategy (bulk vs. incremental) ## Deferred Ideas None — discussion stayed within phase scope.