feat(api): i18n foundation (fluent) + FR/EN key-parity CI gate #20

Merged
charles merged 1 commit from feat/i18n-foundation into main 2026-06-17 15:20:13 +00:00
Owner

Establishes the internationalisation mechanism + the obligation's CI gate (FR-I18N-*).

Changes

  • fluent-templates over locales/{fr,en}.ftl; French default. i18n module: Lang, lang_of(headers) (cookie langAccept-Language → fr), t(lang,key).
  • page_lang() renders shell/nav per locale; page() defaults French so existing call sites are unchanged (incremental string conversion).
  • landing localized end-to-end (first converted screen).
  • CI gate: fr_en_key_parity test asserts both .ftl declare identical keys (FR-I18N-01/05) — runs in cargo test.

Verification

  • just qa green (incl. the parity test). Live: FR default; lang=en cookie switches nav + landing to English (lang="en", "My trips", "Import your GEDCOM").

Remaining screens convert incrementally behind the same gate. Traces: FR-I18N-01/02/04/05 · functional-spec 09.

Establishes the **internationalisation mechanism + the obligation's CI gate** (FR-I18N-*). ## Changes - **fluent-templates** over `locales/{fr,en}.ftl`; French default. `i18n` module: `Lang`, `lang_of(headers)` (cookie `lang` → `Accept-Language` → fr), `t(lang,key)`. - `page_lang()` renders shell/nav per locale; `page()` defaults French so existing call sites are unchanged (**incremental** string conversion). - **landing** localized end-to-end (first converted screen). - **CI gate**: `fr_en_key_parity` test asserts both `.ftl` declare identical keys (FR-I18N-01/05) — runs in `cargo test`. ## Verification - `just qa` green (incl. the parity test). Live: FR default; `lang=en` cookie switches nav + landing to English (`lang="en"`, "My trips", "Import your GEDCOM"). Remaining screens convert incrementally behind the same gate. Traces: FR-I18N-01/02/04/05 · functional-spec 09.
feat(api): i18n foundation (fluent) + FR/EN key-parity CI gate
All checks were successful
qa / qa-1 (pull_request) Successful in 2m32s
qa / qa (pull_request) Successful in 0s
qa / qa-1 (push) Successful in 5m8s
qa / qa (push) Successful in 0s
86c09626eb
Establishes the internationalisation mechanism + the obligation's CI gate
(FR-I18N-*):
- fluent-templates over locales/{fr,en}.ftl; French default. i18n module with
  Lang, lang_of(headers) (cookie `lang` → Accept-Language → fr), t(lang,key).
- page_lang() renders the shell/nav per locale; page() defaults French so the
  many existing call sites are unchanged (incremental string conversion).
- landing localized end-to-end as the first converted screen.
- CI gate: fr_en_key_parity test asserts both .ftl declare identical keys
  (FR-I18N-01/05) — runs in `cargo test`.

Verified live: FR default; `lang=en` cookie switches nav + landing to English.
just qa green. Remaining screens convert incrementally behind the same gate.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
charles/geneatrip!20
No description provided.