Repository navigation
fix(i18n): translate 61 remaining English strings in French locale - #441
Conversation
The French locale had all 4079 keys but 61 values were left in English and surfaced in the UI. The largest gap was the Remote Workspace module, where none of the 28 strings had been translated. Also aligns three git terms and two prompt terms with the glossary the file already uses elsewhere (Valider / Fusionner / Pousser, Instruction). Proper nouns, git CLI flags, SKILL.md templates and input placeholders are deliberately left in English, as are the project's existing choices for tokens and Skill.
|
Thanks for this — it's a genuinely careful piece of work, and the PR description made it easy to review. 🙏 I went through it end to end and everything checks out:
I'll merge this shortly. A few small things for a future pass — none are blockers, and there's no need to touch this PR:
Thanks again — RemoteWorkspace had been sitting untranslated in most locales, so this is a real improvement. |
Follow-up to the French locale pass. Each change resolves a string that was inconsistent with something already in the file or already on screen: - cursor.permissionModeHint opened with "Run Everything", naming an option label that no longer exists in the French UI now that permissionModeForce reads "Tout exécuter". The --force flag stays in both strings. - McpSettings.local.serverIdPlaceholder still read "Server ID" while its label had become "ID du serveur". de and ar move label and placeholder together; fr now does too. - askQuestion.multiSelect goes back to "Multiple" so it stays symmetric with its sibling "Unique", matching en Single/Multiple, es Unica/Multiple, pt Unica/Multipla and de Einfach/Mehrfach. - RemoteWorkspace.dragSort/dragSortConnection now byte-match their exact English twins in Folder.commandDropdown.manageDialog. - conversationContextBar.searchFolder/searchBranch and the three toasts now byte-match their exact English twins elsewhere in the file (ellipsis and apostrophe form). Values only: no keys added, removed or renamed, and no ICU placeholder touched.
Three English strings had two French renderings that were identical except
for a curly vs straight apostrophe, so grep and translation memory saw them
as different strings. Each is normalised to the form its siblings already
use:
- "Failed to open folder" -> straight (5 of 6 sites already were)
- "Auth Mode" -> curly (codex and gemini already were)
- "Import failed: {message}" -> straight (file-dominant form)
After this, no two identical English strings map to French strings that
differ only by punctuation. The 111 remaining same-English/different-French
groups are genuine context-dependent wording ("Aucune"/"Aucun" agreement,
"Supprimer"/"Retirer", "Apercu"/"Ecouter" for a sound) and are left alone.
These three keys are pre-existing and unrelated to the French translation
pass, so this commit can be dropped on its own if you would rather keep the
PR strictly scoped.
|
Rather than hand the follow-ups back to you, I've pushed them onto this branch myself — two commits on top of yours. Happy to drop or adjust any of it. Before writing anything I ran two sweeps, and they changed a couple of my earlier suggestions: Cross-locale check. Every locale renders the ask-question badge as a symmetric pair — "Same English → different French" sweep over the whole file. This one was more useful, and it corrected me: several strings here had an exact English twin elsewhere in
So my earlier "Glisser pour réordonner" suggestion was actually wrong — that's the translation of "Drag to reorder", a different English string. "Drag to sort" already had "Glisser pour trier". Good catch on your part that I nearly got backwards.
Things I deliberately left alone, so they're not silently dropped:
The second commit is separate on purpose: it normalises three pre-existing strings whose two French renderings differed only by a curly vs straight apostrophe ( Verification on the final state: key parity 4079/4079 with Thanks again for the original pass — the twin-matching sweep only found anything because your translations were close enough to compare. |
If a Codex turn finishes just before `_session/steering` reaches it, the adapter starts another turn and returns `startedNewTurn`. The client never receives that new prompt's final response. If the original prompt is still waiting for plan approval, steering waits too, which can block clients that process steering and permission replies serially. This adds the opt-in requested in spacering-net#440: ```json {"_meta":{"steering":{"idleBehavior":"promptRequired"}}} ``` Live turns still receive the input through native steering. When no turn can accept it, the adapter returns `promptRequired` with `reason: "noRunningTurn"`, leaving the input unconsumed and starting no new turn. The client can answer any pending approval, wait for the original prompt to finish, then send the input through a normal `session/prompt`. Calls without the option behave as before. This builds on @fontanierh's patch in spacering-net#441, cherry-picked with the original author and source reference preserved. I added regression tests for pending plan approval, malformed metadata tests, and usage documentation. Fixes spacering-net#440. ## Testing - 33 targeted tests passed. The pending-plan-approval steering tests timed out before the fix. - Typecheck, build, and all six standalone binary targets passed. - Tested idle, live-turn steering, and pending plan approval with real Codex. Steering returned in 1 ms while approval was pending; rejecting implementation completed the original prompt with its stop reason, usage, and quota. - Full suite on Windows: 1,205 passed, 19 failed, 36 skipped. All 19 failures reproduced on unmodified main at `4583cb3`, in history, attachment, and path assertions. The real Codex tests used temporary local runners, adapted for the removed `authRequired()` call in the repository's test script. Cancellation dispatch has unit coverage; the real test used the reject-plan path. For clients: `promptRequired` is a steering result, not completion of the original prompt or its approval request. The existing `_meta.steering.supported` flag also does not distinguish support for this option, so clients need to check the adapter version. --------- Co-authored-by: jim <[email protected]>
Summary
The French locale is structurally complete (4079/4079 keys, none missing), but 61 values were left in English and surface in the UI.
The largest gap is the Remote Workspace module: none of its 28 strings had been translated, including its dialogs and error toasts.
Changes
No branches,Failed to open folder,Switched to {name}, …)commit,mergeandpushin the context bar kept their English form, while the rest of the file already uses Valider, Fusionner, PousserAutomations.sectionPromptread "Prompt" whileAutomations.promptalready reads "Instruction"Initializing {agent} session,Creating session and loading configurationServer ID,Save config.toml,Run Everything (--force), placeholdersDeliberately left in English
Proper nouns (Git, HEAD, MCP, Stdio, Lark, shadcn), git CLI flags (
--hard,--soft,--keep),SKILL.mdtemplates (read by agents, which work in English), input placeholders (ghp_xxx,pnpm install, URLs), and words identical in French (Agent, Interface, Terminal, Configuration, …).The project's existing glossary is preserved:
tokensandSkillare kept untranslated, matching "Consommation de tokens" and "Sélectionnez une Skill" already present in the file.Verification
JSON.stringify(JSON.parse(fr.json), null, 2)reproduces the original file byte-for-byte, so the diff carries no reformatting noisesrc/i18n/messages/fr.jsonis touchedHappy to adjust any wording if a different French term is preferred.