Web i18n: add French (fr) pilot locale #930

Closed
opened 2026-05-07 21:04:45 +00:00 by claude-desktop · 1 comment
Collaborator

Goal

Add fr as the second supported locale for the dashboard (apps/web), completing the pilot scope from US-B2 (specs/i18n-paraglide-user-stories.md) — real translations for login, onboarding, and settings (appearance + language), with no missing keys vs en.json under just paraglide-check.

Parent / related: i18n platform #908, operator UX #909; contributor notes in docs/i18n.md.

Scope

  1. apps/web/messages/fr.json — copy all keys from en.json and translate values (ICU / placeholders preserved).
  2. apps/web/project.inlang/settings.json — add "fr" to languageTags (keep en as sourceLanguageTag).
  3. apps/web/src/lib/locale.ts — extend SUPPORTED_LOCALES with "fr" (typed union updates callers).
  4. Run just codegen so Paraglide emits fr modules; ensure just qa passes (paraglide-check + web typecheck/tests).
  5. Smoke: open /$locale/login, onboarding, settings appearance & language under /fr/… and confirm copy + document.documentElement.lang === "fr".
  6. Tests (US-C3): extend Vitest so at least one pilot route is exercised under fr (localized string or lang), in addition to existing en coverage in $locale.test.tsx.

Non-goals

  • Full dashboard string migration (outside pilot surfaces).
  • TMS / translation workflow automation.

Acceptance criteria

  • fr in Inlang + SUPPORTED_LOCALES; pilot routes render French when URL prefix is fr.
  • messages/fr.json key set matches en.json; CI paraglide-check green.
  • At least one test asserts behavior under non-default (fr) locale.
## Goal Add **`fr`** as the second supported locale for the dashboard (`apps/web`), completing the pilot scope from **US-B2** (`specs/i18n-paraglide-user-stories.md`) — real translations for login, onboarding, and settings (appearance + language), with **no missing keys** vs `en.json` under `just paraglide-check`. Parent / related: i18n platform **#908**, operator UX **#909**; contributor notes in `docs/i18n.md`. ## Scope 1. **`apps/web/messages/fr.json`** — copy all keys from `en.json` and translate values (ICU / placeholders preserved). 2. **`apps/web/project.inlang/settings.json`** — add `"fr"` to `languageTags` (keep `en` as `sourceLanguageTag`). 3. **`apps/web/src/lib/locale.ts`** — extend `SUPPORTED_LOCALES` with `"fr"` (typed union updates callers). 4. Run **`just codegen`** so Paraglide emits `fr` modules; ensure **`just qa`** passes (`paraglide-check` + web typecheck/tests). 5. **Smoke**: open `/$locale/login`, onboarding, settings appearance & language under `/fr/…` and confirm copy + `document.documentElement.lang === "fr"`. 6. **Tests (US-C3)**: extend Vitest so at least one pilot route is exercised under **`fr`** (localized string or `lang`), in addition to existing `en` coverage in `$locale.test.tsx`. ## Non-goals - Full dashboard string migration (outside pilot surfaces). - TMS / translation workflow automation. ## Acceptance criteria - [ ] `fr` in Inlang + `SUPPORTED_LOCALES`; pilot routes render French when URL prefix is `fr`. - [ ] `messages/fr.json` key set matches `en.json`; CI `paraglide-check` green. - [ ] At least one test asserts behavior under non-default (`fr`) locale.
Collaborator

🧹 janitor: this ticket has been idle-assigned since 2026-05-07T21:12:23.000Z. Re-dispatching.

🧹 janitor: this ticket has been idle-assigned since 2026-05-07T21:12:23.000Z. Re-dispatching.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
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/claude-hooks#930
No description provided.