i18n: extend French translations beyond pilot scope #949

Closed
opened 2026-05-08 11:39:53 +00:00 by claude-desktop · 0 comments
Collaborator

User story

As a French-speaking operator, I want the entire dashboard UI translated to French (not only login + onboarding + appearance/language settings), so that switching to fr doesn't drop me back into English on every working surface.

Context

PR/commit 45e37571 feat(i18n): add French (fr) pilot locale shipped Paraglide wired through /$locale/ routes with 38 message keys. Coverage today (apps/web/messages/{en,fr}.json):

  • login_*
  • onboarding_*
  • settings_appearance_*
  • settings_language_*
  • error_*

Everything else is hardcoded English string literals. Visible regression: visiting /app/fr/planner/board renders the board in English.

Acceptance criteria

Routes — extract strings to messages, render via m.*

  • routes/$locale/index.tsx (landing)
  • routes/$locale/planner.tsx + planner.index.tsx + planner.board.tsx
  • routes/$locale/agents.tsx + agents.index.tsx + agents.$type.index.tsx + agents.$type.$instance.tsx + agents.$type.setup.tsx
  • routes/$locale/flows.tsx + flows.index.tsx + flows.new.tsx + flows.$flowId.tsx + flows.$flowId.versions.tsx + flows.$flowId.v.$version.tsx
  • routes/$locale/specs.tsx + specs.index.tsx + specs.$specName.tsx
  • routes/$locale/workspace.tsx + workspace.index.tsx
  • routes/$locale/issue.$owner.$repo.$issueNumber.tsx
  • routes/$locale/settings.tsx + settings.index.tsx
  • routes/$locale/settings.repos.tsx
  • routes/$locale/settings.labels.tsx
  • routes/$locale/settings.secrets.tsx
  • routes/$locale/settings.voice-input.tsx
  • routes/$locale/settings.agents.tsx + settings.agents.admin.tsx + settings.agents.config-history.tsx + settings.agents.per-agent-secrets.tsx
  • routes/$locale/settings.agent-config.tsx
  • routes/$locale/settings.agent-types.tsx
  • routes/$locale/settings.service.tsx + every settings.service.* child (ai-providers, container, design, forge, watchdogs, index)

Shared components — same treatment

  • components/app-shell.tsx (already partially uses m.* — finish)
  • components/board/* (column headers, empty states, filters, side panel, agent tooltips)
  • components/planner/* (composer, transcript, sessions-pane, markdown assistant)
  • components/avatar-menu.tsx
  • components/multiselect-combobox.tsx
  • components/settings-side-nav.tsx
  • components/workspace-command-palette.tsx
  • components/markdown-assistant-drawer.tsx
  • features/agents/sections.tsx
  • features/flows/* (FlowAssistantPanel, InputRefPicker)
  • features/service-config/design-section.tsx
  • lib/format.ts (date/relative-time strings if any)

Message file hygiene

  • Group keys by surface prefix: planner_*, agents_*, flows_*, specs_*, workspace_*, issue_*, settings_<sub>_*, board_*, app_shell_*, command_palette_*.
  • en.json and fr.json stay in 1:1 key parity (CI check is desirable — see follow-up).
  • Pluralisation handled via Paraglide message format (_one / _other) where counts appear (e.g. cards, agents, repos).
  • ICU placeholders for interpolation (e.g. "{count} cards selected").

Tests

  • Each route's existing *.test.tsx continues to pass.
  • Add a smoke test that mounts a representative page with fr locale and asserts a known French string renders.

Out of scope

  • New locales (es, de, …) — separate issue when fr is fully covered.
  • Server-side strings (HTTP error bodies, audit comments posted to Forgejo, agent system prompts). Operator UI only.
  • Toast strings emitted from lib/api.ts error mappers — already covered by error_* keys; only verify, do not re-translate.
  • Translating string literals inside agent prompts / breakdown templates / CLAUDE.md docs.

References

  • Pilot commit: 45e37571 feat(i18n): add French (fr) pilot locale
  • Paraglide config: apps/web/project.inlang/settings.json (languageTags: ["en", "fr"])
  • Memory: see global note on Paraglide pilot scope
  • Triggering report: /app/fr/planner/board rendered in English (2026-05-08).
## User story As a French-speaking operator, I want the entire dashboard UI translated to French (not only login + onboarding + appearance/language settings), so that switching to `fr` doesn't drop me back into English on every working surface. ## Context PR/commit `45e37571 feat(i18n): add French (fr) pilot locale` shipped Paraglide wired through `/$locale/` routes with **38 message keys**. Coverage today (`apps/web/messages/{en,fr}.json`): - `login_*` - `onboarding_*` - `settings_appearance_*` - `settings_language_*` - `error_*` Everything else is hardcoded English string literals. Visible regression: visiting `/app/fr/planner/board` renders the board in English. ## Acceptance criteria ### Routes — extract strings to messages, render via `m.*` - [ ] `routes/$locale/index.tsx` (landing) - [ ] `routes/$locale/planner.tsx` + `planner.index.tsx` + `planner.board.tsx` - [ ] `routes/$locale/agents.tsx` + `agents.index.tsx` + `agents.$type.index.tsx` + `agents.$type.$instance.tsx` + `agents.$type.setup.tsx` - [ ] `routes/$locale/flows.tsx` + `flows.index.tsx` + `flows.new.tsx` + `flows.$flowId.tsx` + `flows.$flowId.versions.tsx` + `flows.$flowId.v.$version.tsx` - [ ] `routes/$locale/specs.tsx` + `specs.index.tsx` + `specs.$specName.tsx` - [ ] `routes/$locale/workspace.tsx` + `workspace.index.tsx` - [ ] `routes/$locale/issue.$owner.$repo.$issueNumber.tsx` - [ ] `routes/$locale/settings.tsx` + `settings.index.tsx` - [ ] `routes/$locale/settings.repos.tsx` - [ ] `routes/$locale/settings.labels.tsx` - [ ] `routes/$locale/settings.secrets.tsx` - [ ] `routes/$locale/settings.voice-input.tsx` - [ ] `routes/$locale/settings.agents.tsx` + `settings.agents.admin.tsx` + `settings.agents.config-history.tsx` + `settings.agents.per-agent-secrets.tsx` - [ ] `routes/$locale/settings.agent-config.tsx` - [ ] `routes/$locale/settings.agent-types.tsx` - [ ] `routes/$locale/settings.service.tsx` + every `settings.service.*` child (ai-providers, container, design, forge, watchdogs, index) ### Shared components — same treatment - [ ] `components/app-shell.tsx` (already partially uses `m.*` — finish) - [ ] `components/board/*` (column headers, empty states, filters, side panel, agent tooltips) - [ ] `components/planner/*` (composer, transcript, sessions-pane, markdown assistant) - [ ] `components/avatar-menu.tsx` - [ ] `components/multiselect-combobox.tsx` - [ ] `components/settings-side-nav.tsx` - [ ] `components/workspace-command-palette.tsx` - [ ] `components/markdown-assistant-drawer.tsx` - [ ] `features/agents/sections.tsx` - [ ] `features/flows/*` (FlowAssistantPanel, InputRefPicker) - [ ] `features/service-config/design-section.tsx` - [ ] `lib/format.ts` (date/relative-time strings if any) ### Message file hygiene - [ ] Group keys by surface prefix: `planner_*`, `agents_*`, `flows_*`, `specs_*`, `workspace_*`, `issue_*`, `settings_<sub>_*`, `board_*`, `app_shell_*`, `command_palette_*`. - [ ] `en.json` and `fr.json` stay in 1:1 key parity (CI check is desirable — see follow-up). - [ ] Pluralisation handled via Paraglide message format (`_one` / `_other`) where counts appear (e.g. cards, agents, repos). - [ ] ICU placeholders for interpolation (e.g. `"{count} cards selected"`). ### Tests - [ ] Each route's existing `*.test.tsx` continues to pass. - [ ] Add a smoke test that mounts a representative page with `fr` locale and asserts a known French string renders. ## Out of scope - New locales (es, de, …) — separate issue when fr is fully covered. - Server-side strings (HTTP error bodies, audit comments posted to Forgejo, agent system prompts). Operator UI only. - Toast strings emitted from `lib/api.ts` error mappers — already covered by `error_*` keys; only verify, do not re-translate. - Translating string literals inside agent prompts / breakdown templates / CLAUDE.md docs. ## References - Pilot commit: `45e37571 feat(i18n): add French (fr) pilot locale` - Paraglide config: `apps/web/project.inlang/settings.json` (`languageTags: ["en", "fr"]`) - Memory: see global note on Paraglide pilot scope - Triggering report: `/app/fr/planner/board` rendered in English (2026-05-08).
Sign in to join this conversation.
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/claude-hooks#949
No description provided.