Skip to content

fix(i18n): fill missing translations and replace English copies in six locales - #32246

Closed
seijikohara wants to merge 1 commit into
stablyai:mainfrom
seijikohara:fix/i18n-fill-missing-translations
Closed

seijikohara wants to merge 1 commit into
stablyai:mainfrom
seijikohara:fix/i18n-fill-missing-translations

Conversation

@seijikohara

@seijikohara seijikohara commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

ELI5

When Orca runs in Spanish, French, Japanese, Korean, Portuguese or Chinese, some labels and messages still show up in English. Either their translation is missing, or the "translation" is a copy of the English sentence. This PR adds those translations.

What Changed

Before: pnpm run verify:localization-catalog reported 230–248 missing entries for es, fr, ja, ko and zh, and 147 for pt. The runtime falls back to English for each of them. Some target values were also the English sentence itself.

After:

Locale Missing entries Values that copy an English sentence of four or more words
es 248 → 11 178 → 0
fr 238 → 11 16 → 0
ja 230 → 11 20 → 0
ko 230 → 11 108 → 0
zh 230 → 11 20 → 0
pt 147 → 70 0 → 0

How:

  • Missing es, fr, ja, ko and zh entries are added with config/scripts/apply-translation-delta.mjs, which checks placeholders and runs repairTranslatedValue from locale-translation-policy.mjs.
  • That script skips existing keys and does not accept pt. The English-copy replacements and the pt additions therefore went through the same placeholder check and repairTranslatedValue in a one-off script that was not committed. It also refuses to overwrite a value that is not the English copy. The policy repairs changed no value.
  • config/scripts/locale-ja-key-overrides.mjs gets one entry: accounts.hostSignIn.open → 開く. The policy maps a bare "Open" to オープン, the PR state; this key is the button that opens the sign-in page, like the two existing overrides.
  • Only entries that a source file references are added; every missing key had a reference (four through plural or dynamic keys).
  • No key is removed.

Left out on purpose:

  • 11 provider balance keys (auto.components.status.bar.StatusBar.* and tooltip.* balance copy, apiKeyBalanceUnavailable). src/renderer/src/i18n/provider-credit-balance-locales.test.ts (from Show provider credit balances alongside usage limits #25408) asserts that es, fr, ja, ko and zh omit them and fall back to English. Translating them means changing that test, which is a separate decision.
  • 70 pt keys that fix(i18n): fill 69 missing Brazilian Portuguese translations #32017 already fills.
  • Shorter English copies (one to three words). Most are intentional: Agent, PR, SSH, CLI commands, environment variable names, product names. Others are agent names under auto.lib.agent.catalog.* or key names such as "Tab". The rest need a case-by-case call. Two places now read oddly because a sibling label is one of them: es PluginsSettingsSection.empty mentions a "Todos" tab whose label is still "All", and fr SleepTwinWorkspaceDialog.alsoSleeps sits under the English title "Sleep Workspace".

Why

The catalog sync never edits target catalogs (config/localization-audit.md), so new English keys stay missing until a localization change fills them. Using the repository's own delta script and translation policy keeps the existing glossary repairs: brand names, CJK spacing, and the ja and ko overrides.

Linked Issue

Fixes #32316

#32316 is area A1 and A2 of #32207, which lists every remaining localization gap.

Visual Proof

Settings → Agents → Agent Permissions with the UI language set to Japanese. Before, the description and the Auto label fell back to English.

Before (main @ 22a95c4) After (this branch)
before: Agent Permissions in Japanese on main after: Agent Permissions in Japanese on this branch

Both images come from a hidden launch of each build (electron-vite build --mode e2e, an isolated E2E profile with uiLanguage: 'ja', ORCA_BACKGROUND_LAUNCH=1), captured through Playwright.

Testing

Tested on macOS (Apple silicon) only. The change is data; it has no platform-specific code.

  • Manual: I built main @ 22a95c4 and this branch, launched each hidden with a Japanese E2E profile, and opened Settings → Agents (screenshots above).

  • The localization checks pass:

    • pnpm run verify:localization-catalog: es, fr, ja, ko and zh 16908/16919 translated; pt 16849/16919
    • pnpm run verify:localization-catalogs
    • pnpm run verify:localization-extraction
    • pnpm run verify:localization-coverage
    • pnpm run verify:localization-runtime-catalog
  • pnpm lint and pnpm typecheck pass.

  • pnpm test fails locally in 385 of 13,490 test files. None of the failures comes from this change:

    • 379 of those files also fail on unmodified main @ 22a95c4 in the same environment. The causes are local: macOS bash 3.2 (mapfile: command not found, MOBILE_CI_ARGS[@]: unbound variable), /var versus /private/var temp paths, zsh prompt and PTY timeouts, and an unresolved @electron-toolkit/tsconfig.
    • The other 6 pass when run alone; under full-suite load they hit timeouts and one timing threshold.
    • Of the 54 test files that read the locale catalogs or the translation policy, only two fail, and both are among the 379.
  • pnpm build fails locally while bundling the mobile web app: react-native-web and expo-router cannot be resolved. Unmodified main @ 22a95c4 fails the same way here.

  • I manually tested these changes locally

  • Automated tests added/updated, or explained why not below

No new tests: this is a data-only change, and the existing catalog checks and tests above cover placeholders, parity and policy repairs.

AI Disclosure

Translations were produced with Claude Code (Claude Opus 5.5). One agent per locale worked from the English source and the terms already used in that locale's catalog and in locale-translation-policy.mjs. I read every ja value. The es, fr, ko, pt and zh values are machine-translation quality: they were checked by separate review agents and spot-checked by me. Review by native speakers is welcome.

Review

AI review with Claude Code (Claude Opus 5.5).

Translations: one review agent each for es + pt, fr, and ko + zh read every changed value. They checked meaning, terminology against the existing catalog, grammar and register, and consistency inside the change set. The fixes they led to:

  • ko: the Space feature is 저장 공간 on screen, not "Space".
  • ja, es, fr, ko: the release build picker says "version", like the rest of its section.
  • es: "issue de Jira" and the feminine "skills", as the neighbouring strings use.
  • fr: two sentences reworded.
  • pt: "Colar com o Mesmo Estilo" for Paste and Match Style.

Compatibility and risk:

  • Cross-platform: no code or path change. The catalogs load the same way on macOS, Linux and Windows.
  • SSH/remote/local: remote clients and paired servers read the same bundled catalogs. No wire or protocol change.
  • Agents and integrations: agent, provider and model names stay in Latin script through locale-translation-policy.mjs. No key under auto.lib.agent.catalog.* changes.
  • Performance: target catalogs load lazily. The six catalogs grow by about 1,200 entries in total, and en-runtime-required.json, the boot bundle, is unchanged.
  • UI quality: meanings were checked against each string's render site. Only the Agent Permissions section above was checked on screen, so longer translations elsewhere were not checked for clipping.
  • Security: data only. Values add no markup; placeholders and the <agents> tag match the English.

Agent skill upstream boundary

  • Not applicable, or this change copies or mechanically translates no upstream skill-installer source, tests, fixtures, registry entries, path tables, comments, or documentation.

Notes

  • Security: none; data only.
  • Cross-platform and SSH/remote: no platform-specific behavior. Remote clients load the same catalogs.
  • Mobile: N/A; the mobile app has no translation layer ([Feature]: Add i18n multi-language support to mobile app #8600).
  • Backwards compatibility: values are added or replaced; no key is removed or renamed.
  • Performance: see Review above.

Author

X handle: none.

Checklist

  • This PR is small and focused
  • I explained what changed and why (ELI5, the user-facing before/after, the mechanism, and why over the alternatives)
  • Before/after screenshots or videos attached for UI changes, or N/A with reason
  • Self-reviewed for correctness, security, and performance
  • Cross-platform, SSH/remote, and path/shortcut impact considered (or N/A)
  • pnpm lint, pnpm typecheck, pnpm test, and pnpm build pass (or CI will cover; local preferred)

…x locales

es, fr, ja, ko and zh each lacked 230-248 entries that en.json has, and pt
lacked 147, so those strings fell back to English. Some target values were
also the English sentence itself (es 178, ko 108, ja 20, zh 20, fr 16).

Add the missing entries through apply-translation-delta.mjs and replace
the English copies with the same placeholder check and
locale-translation-policy repairs. Keep the ja action label "Open" as 開く
for the host sign-in button, like the two existing overrides.

Leave out the 11 provider balance keys, which
provider-credit-balance-locales.test.ts pins to the English fallback, and
the 70 pt keys that stablyai#32017 already fills.

Part of stablyai#32207.
@seijikohara

Copy link
Copy Markdown
Contributor Author

Closing as superseded: #32782 filled the same missing and copied-English catalog entries and closed #32316.

@seijikohara
seijikohara deleted the fix/i18n-fill-missing-translations branch October 27, 2026 13:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: es, fr, ja, ko, pt and zh catalogs miss entries or copy English, so those strings show in English

1 participant