Skip to content

Add native French localization support - #1241

Merged
steipete merged 3 commits into
steipete:mainfrom
Yuxin-Qiao:feat/french-localization-pr
Jun 6, 2026
Merged

Add native French localization support#1241
steipete merged 3 commits into
steipete:mainfrom
Yuxin-Qiao:feat/french-localization-pr

Conversation

@Yuxin-Qiao

Copy link
Copy Markdown
Contributor

Summary

  • add full fr.lproj localization resources for CodexBar
  • add French to the app language picker (fr)
  • add language_french labels across existing locale files so language names render consistently
  • polish French strings for UI, notifications, quota, and settings copy

Validation

  • verified localization placeholder integrity (%@, %d, \(...), escaped newlines)
  • ensured no placeholder mismatches after translation pass

@clawsweeper

clawsweeper Bot commented May 31, 2026

Copy link
Copy Markdown

Codex review: needs maintainer review before merge. Reviewed June 6, 2026, 6:26 PM ET / 22:26 UTC.

Summary
The branch adds a full French Localizable.strings bundle, registers fr in the app language picker, adds language_french labels to existing locales, and notes the change in CHANGELOG.md.

Reproducibility: not applicable. this is a localization feature PR, not a bug report. The observable behavior is covered by the contributor screenshots and static resource checks.

Review metrics: 2 noteworthy metrics.

  • Diff size: 10 files, +1,075/-0. Most of the review surface is localization data plus the language picker registration.
  • French resource size: 1,063 added lines. The new resource bundle is large enough that copy review matters even when static placeholder checks pass.

Merge readiness
Overall: 🐚 platinum hermit
Proof: 🦞 diamond lobster ✨ media proof bonus
Patch quality: 🐚 platinum hermit
Result: ready for maintainer review.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • none.

Risk before merge

  • [P1] Large human-language resource changes still benefit from maintainer or native-speaker copy review even though placeholder and auth literal checks passed.
  • [P1] This read-only review did not run make check or swift test, so CI or maintainer validation remains the build gate.

Maintainer options:

  1. Decide the mitigation before merge
    Ship the French localization through the existing AppLanguage and fr.lproj pattern once CI and copy review are acceptable, keeping provider commands and service domains verbatim.
  2. Pause or close
    Do not merge this PR until maintainers decide whether the risk is worth taking.

Next step before merge

  • No automated repair is needed; the previous provider/auth string blockers are fixed and the PR is ready for maintainer and CI validation.

Security
Cleared: No security or supply-chain concern remains; the diff is localization resources, a language picker case, and a changelog note, and the risky auth/domain literals are preserved at head.

Review details

Best possible solution:

Ship the French localization through the existing AppLanguage and fr.lproj pattern once CI and copy review are acceptable, keeping provider commands and service domains verbatim.

Do we have a high-confidence way to reproduce the issue?

Not applicable; this is a localization feature PR, not a bug report. The observable behavior is covered by the contributor screenshots and static resource checks.

Is this the best way to solve the issue?

Yes; the PR uses the repository's existing maintainable localization pattern by adding an .lproj bundle and registering the language in AppLanguage. The earlier unsafe provider/auth translations were corrected at the current head.

AGENTS.md: found and applied where relevant.

Codex review notes: model gpt-5.5, reasoning high; reviewed against 867ac583a740.

Label changes

Label justifications:

  • P2: Adding native French support is a normal user-facing improvement with limited code-path blast radius.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (screenshot): Contributor-provided screenshots directly show the French UI in key screens after the localization change.
  • proof: sufficient: Contributor real behavior proof is sufficient. Contributor-provided screenshots directly show the French UI in key screens after the localization change.
  • proof: 📸 screenshot: Contributor real behavior proof includes screenshot evidence. Contributor-provided screenshots directly show the French UI in key screens after the localization change.
Evidence reviewed

What I checked:

Likely related people:

  • Peter Steinberger: Current-main blame for the language picker area and recent localization plumbing history point to Peter as the most central current owner for this surface. (role: recent area contributor; confidence: medium; commits: 723734ef3422; files: Sources/CodexBar/PreferencesGeneralPane.swift, Sources/CodexBar/Localization.swift)
  • Daniel Nylander: Git history shows Daniel added the existing Swedish localization, which is the closest prior language-addition pattern to this French PR. (role: localization feature contributor; confidence: medium; commits: 97e3b58c5f73; files: Sources/CodexBar/Resources/sv.lproj/Localizable.strings, Sources/CodexBar/PreferencesGeneralPane.swift)
  • Yuxin-Qiao: Beyond authoring this PR, current-main history shows Yuxin Qiao previously improved visible Simplified Chinese localization copy. (role: prior localization contributor; confidence: medium; commits: 2deb0f5c9a42; files: Sources/CodexBar/Resources/zh-Hans.lproj/Localizable.strings)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ed33dd5c7d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

"overview_choose_providers" = "Choisissez jusqu'à %@ fournisseurs";
"remove_account_message" = "Supprimer %@ de CodexBar ? Sa maison Codex gérée sera supprimée.";
"version_format" = "Version %@";
"vertex_ai_login_instructions" = "Pour suivre l'utilisation de Vertex AI, authentifiez-vous auprès de Google Cloud.\n\n1. Ouvrez le terminal\n2. Exécutez : gcloud auth application-login par défaut\n3. Suivez les invites du navigateur pour vous connecter\n4. Définissez votre projet : gcloud config set project PROJECT_ID\n\nOuvrir le terminal maintenant ?";

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Keep the Vertex AI gcloud command unlocalized

In the French locale, the Vertex AI setup dialog tells users to run gcloud auth application-login par défaut, but the app's own launcher still executes gcloud auth application-default login --scopes=... in VertexAILoginFlow.swift, and Google documents the command as gcloud auth application-default login. A French user following the manual steps would copy an invalid gcloud command and fail to authenticate Vertex AI.

Useful? React with 👍 / 👎.

"Service" = "Service";
"Show or hide Kiro credits, percent, or both next to the menu bar icon." = "Affichez ou masquez les crédits Kiro, le pourcentage ou les deux à côté de l'icône de la barre de menu.";
"Show usage for organizations you belong to. Personal account is always shown." = "Afficher l'utilisation des organisations auxquelles vous appartenez. Le compte personnel est toujours affiché.";
"Sign in to cursor.com in your browser, then refresh Cursor in CodexBar." = "Connectez-vous à curseur.com dans votre navigateur, puis actualisez le curseur dans CodexBar.";

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve cursor.com in French login hints

This localized Cursor login hint changes the service URL from cursor.com to curseur.com. When Cursor login times out, CursorLoginRunner displays this exact string via L("Sign in to cursor.com in your browser, then refresh Cursor in CodexBar."), so French users are directed to the wrong domain and may not be able to complete the account setup.

Useful? React with 👍 / 👎.

@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels May 31, 2026
@Yuxin-Qiao

Yuxin-Qiao commented Jun 1, 2026

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

Added validation screenshots for the French localization pass.

UI Validation Screenshots

1) Providers View

Providers View (French)

2) Menu Card / Compact View

Menu Card View (French)

3) General Settings View

General Settings (French)

Local Verification

  • French rendering across key screens
  • Placeholder integrity re-checked (%@, %d, \(...), escaped newlines)

Please re-run the review and provide an updated rating on the latest commit.

@clawsweeper

clawsweeper Bot commented Jun 1, 2026

Copy link
Copy Markdown

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper clawsweeper Bot added proof: sufficient Contributor real behavior proof is sufficient. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. P2 Normal priority bug or improvement with limited blast radius. merge-risk: 🚨 auth-provider 🚨 Merging this PR could break OAuth, tokens, provider routing, model choice, or credentials. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jun 1, 2026
@Yuxin-Qiao Yuxin-Qiao changed the title Add comprehensive French localization support Add native French localization support Jun 1, 2026
@clawsweeper clawsweeper Bot added rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. labels Jun 1, 2026
@Yuxin-Qiao

Copy link
Copy Markdown
Contributor Author

Updated #1241 at head c436afa5.

Fixed the remaining high-risk French provider/auth literals called out by ClawSweeper:

  • Kept gcloud auth application-default login verbatim in the Vertex AI instructions.
  • Kept cursor.com verbatim in Cursor session and refresh guidance.
  • Kept the surrounding French copy localized.

Validation:

  • plutil -lint Sources/CodexBar/Resources/fr.lproj/Localizable.strings passed.
  • git diff --check passed.
  • Confirmed no curseur.com or application-login par défaut remains in the French resource.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 5, 2026

Copy link
Copy Markdown

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper clawsweeper Bot added rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. merge-risk: 🚨 auth-provider 🚨 Merging this PR could break OAuth, tokens, provider routing, model choice, or credentials. labels Jun 5, 2026
@steipete
steipete force-pushed the feat/french-localization-pr branch from c436afa to 3c4f7ab Compare June 6, 2026 22:20

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 3c4f7ab429

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

"Cost" = "Coût";
"Could not add Codex account" = "Impossible d'ajouter un compte Codex";
"Could not open Terminal for Gemini" = "Impossible d'ouvrir le terminal pour Gemini";
"Could not start claude /login" = "Impossible de démarrer Claude /connexion";

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Keep the Claude /login command literal

When the Claude login runner fails to launch, StatusItemController+Actions.swift shows this localized string as the alert title for the actual claude /login command. Translating the slash command to Claude /connexion points French users at a command that does not exist, making the recovery/debugging alert misleading; the claude /login token should stay unchanged as in the other locales.

Useful? React with 👍 / 👎.

"No output captured." = "Aucune sortie capturée.";
"No system account" = "Aucun compte système";
"Oasis-Token" = "Oasis-Token";
"Open Augment (Log Out & Back In)" = "Ouvrir l'augmentation (déconnexion et reconnexion)";

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve the Augment provider name

In AugmentProviderImplementation.appendActionMenuEntries, this label is the recovery action shown specifically when an Augment session expires and it opens https://app.augmentcode.com. Translating the product name to “l'augmentation” removes the provider name from the menu, so French users seeing an expired Augment session are not told which service this logout/login action applies to.

Useful? React with 👍 / 👎.

"Utilization End" = "Fin d'utilisation";
"Utilization Start" = "Début de l'utilisation";
"Verbosity" = "Niveau de verbosité";
"Windsurf session JSON bundle" = "Pack JSON de session de planche à voile";

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve Windsurf in the JSON placeholder

WindsurfProviderImplementation.settingsFields uses this string as the secure input placeholder when manual Windsurf session data is required. Translating the provider name to “planche à voile” hides that the field expects a Windsurf localStorage JSON bundle, which can block French users from recognizing what credential to paste.

Useful? React with 👍 / 👎.

@steipete
steipete merged commit d3151b7 into steipete:main Jun 6, 2026
4 checks passed
@steipete

steipete commented Jun 6, 2026

Copy link
Copy Markdown
Owner

Landed as d3151b7.

Tested locally on the rebased integration stack before merge:

  • plutil -lint Sources/CodexBar/Resources/fr.lproj/Localizable.strings
  • plutil -lint Sources/CodexBar/Resources/*.lproj/Localizable.strings
  • swift test --filter LocalizationBundleTests — 5 tests passed
  • make check — SwiftFormat lint mode + SwiftLint passed with 0 violations
  • /Users/steipete/Projects/agent-scripts/skills/autoreview/scripts/autoreview --mode branch --base origin/main --prompt "Review CodexBar PR #1241 integration: French localization resources plus maintainer changelog entry. Focus on runtime/resource correctness, localization key/placeholder integrity, and stale-main merge risk." — clean, no accepted/actionable findings

Remote exact-head verification before merge:

  • PR head verified: 3c4f7ab
  • GitGuardian Security Checks — passed
  • build-linux-cli (linux-arm64, ubuntu-24.04-arm) — passed
  • build-linux-cli (linux-x64, ubuntu-24.04) — passed
  • lint-build-test — passed

Verification images:

  • No new images were needed for my verification pass; this was resource/code validation plus existing PR screenshot proof.

@Yuxin-Qiao
Yuxin-Qiao deleted the feat/french-localization-pr branch June 25, 2026 15:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

P2 Normal priority bug or improvement with limited blast radius. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. proof: sufficient Contributor real behavior proof is sufficient. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants