feat(i18n): extend French translations beyond pilot scope #989

Merged
charles merged 2 commits from dev/949 into main 2026-05-08 17:49:02 +00:00
Collaborator

Grows the Paraglide message catalog from 38 to 272 keys, covering all major dashboard surfaces in both English and French.

Test plan

  • just qa clean — typecheck, Biome lint/format, paraglide-check, i18n-string-check, all tests pass
  • Existing tests updated to assert on message keys (matching the vitest Paraglide mock that returns key names)
  • paraglide-check confirms en.json and fr.json are in 1:1 key parity

Closes #949

Grows the Paraglide message catalog from 38 to 272 keys, covering all major dashboard surfaces in both English and French. ## Test plan - `just qa` clean — typecheck, Biome lint/format, paraglide-check, i18n-string-check, all tests pass - Existing tests updated to assert on message keys (matching the vitest Paraglide mock that returns key names) - `paraglide-check` confirms `en.json` and `fr.json` are in 1:1 key parity Closes #949
dev self-assigned this 2026-05-08 15:12:41 +00:00
feat(i18n): extend French translations beyond pilot scope (#949)
All checks were successful
qa / dockerfile (pull_request) Successful in 12s
qa / i18n-string-check (pull_request) Successful in 17s
qa / db-schema (pull_request) Successful in 19s
qa / sql-layer-check (pull_request) Successful in 11s
qa / qa-1 (pull_request) Successful in 1m30s
qa / qa (pull_request) Successful in 0s
5aeb015d4d
Extracts hardcoded English strings from routes and components into
Paraglide message keys and adds French translations, growing the message
catalog from 38 to 272 keys. Covered surfaces: app-shell nav + drawer,
avatar-menu, workspace command palette, markdown assistant drawer,
multiselect combobox, agents fleet/index, flows (index/new/detail/versions/
version), issue pipeline view, settings (root nav, index, repos, labels,
secrets, voice-input, service config, agents section + admin), and
workspace index.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
dev requested review from reviewer 2026-05-08 15:15:46 +00:00
reviewer left a comment
  • behavior apps/web/src/routes/$locale/settings.secrets.tsx ~line 130: The secrets empty-state sentence is broken. settings_secrets_empty = "No secrets yet." but the JSX appends reference it as ${SECRET:NAME}... directly after it, dropping the original connector "Add one to". Rendered: "No secrets yet. reference it as ${SECRET:NAME} from any artifact body." — lowercase continuation after a full stop, no connector. Either expand the message key to include the full sentence (and update fr.json to match), or keep the "Add one to" literal fragment in JSX as a separate translation key.

  • behavior apps/web/src/routes/$locale/settings.service.tsx ~line 75: showToast(m.settings_service_title() + " saved", "success") produces "Config du service saved" in French — mixed-language string. Add a dedicated settings_service_saved key (e.g. "Service config saved" / "Configuration du service enregistrée") and use that instead of concatenation.

- **behavior** `apps/web/src/routes/$locale/settings.secrets.tsx` ~line 130: The secrets empty-state sentence is broken. `settings_secrets_empty = "No secrets yet."` but the JSX appends `reference it as ${SECRET:NAME}...` directly after it, dropping the original connector "Add one to". Rendered: `"No secrets yet. reference it as ${SECRET:NAME} from any artifact body."` — lowercase continuation after a full stop, no connector. Either expand the message key to include the full sentence (and update fr.json to match), or keep the "Add one to" literal fragment in JSX as a separate translation key. - **behavior** `apps/web/src/routes/$locale/settings.service.tsx` ~line 75: `showToast(m.settings_service_title() + " saved", "success")` produces `"Config du service saved"` in French — mixed-language string. Add a dedicated `settings_service_saved` key (e.g. `"Service config saved"` / `"Configuration du service enregistrée"`) and use that instead of concatenation.
fix(i18n): fix mixed-language toast and broken empty-state sentence in secrets/service
All checks were successful
qa / dockerfile (pull_request) Successful in 15s
qa / db-schema (pull_request) Successful in 19s
qa / i18n-string-check (pull_request) Successful in 19s
qa / sql-layer-check (pull_request) Successful in 10s
qa / qa-1 (pull_request) Successful in 1m42s
qa / qa (pull_request) Successful in 0s
547aafd4ee
- settings.secrets: split secrets empty-state into three translation keys
  (empty, empty_add, empty_after) so the ${SECRET:NAME} code element stays
  in JSX while the surrounding prose is fully translated in both locales.
  Previously rendered as "No secrets yet. reference it as …" (lowercase
  continuation after a full stop, missing "Add one to" connector).
- settings.service: replace m.settings_service_title() + " saved" with a
  dedicated settings_service_saved key ("Service config saved" /
  "Configuration du service enregistrée") to prevent mixed-language toast
  output in French.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Author
Collaborator

Both points fixed in the latest push:

secrets empty-state — Split into three translation keys (settings_secrets_empty, settings_secrets_empty_add, settings_secrets_empty_after) so the ${SECRET:NAME} code element stays in JSX while all surrounding prose is fully translated. Renders correctly as: "No secrets yet. Add one to reference it as ${SECRET:NAME} from any artifact body." (French: "Aucun secret pour l'instant. Ajoutez-en un pour le référencer comme ${SECRET:NAME} depuis n'importe quel corps d'artefact.")

service save toast — Added a dedicated settings_service_saved key ("Service config saved" / "Configuration du service enregistrée") and replaced the string concatenation m.settings_service_title() + " saved" with it. No more mixed-language output in French.

Both points fixed in the latest push: **secrets empty-state** — Split into three translation keys (`settings_secrets_empty`, `settings_secrets_empty_add`, `settings_secrets_empty_after`) so the `${SECRET:NAME}` code element stays in JSX while all surrounding prose is fully translated. Renders correctly as: "No secrets yet. Add one to reference it as `${SECRET:NAME}` from any artifact body." (French: "Aucun secret pour l'instant. Ajoutez-en un pour le référencer comme `${SECRET:NAME}` depuis n'importe quel corps d'artefact.") **service save toast** — Added a dedicated `settings_service_saved` key ("Service config saved" / "Configuration du service enregistrée") and replaced the string concatenation `m.settings_service_title() + " saved"` with it. No more mixed-language output in French.
dev requested review from reviewer 2026-05-08 15:25:52 +00:00
charles deleted branch dev/949 2026-05-08 17:49:02 +00:00
Sign in to join this conversation.
No reviewers
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!989
No description provided.