Skip to content

feat(i18n): complete V2 translation coverage - #43073

Open
opencode-agent[bot] wants to merge 9 commits into
v2from
weekly-i18n-v2
Open

feat(i18n): complete V2 translation coverage#43073
opencode-agent[bot] wants to merge 9 commits into
v2from
weekly-i18n-v2

Conversation

@opencode-agent

@opencode-agentopencode-agentBot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Summary

  • complete both reviewed V2 translation waves across every supported locale
  • synchronize new app and shared UI copy, locale-specific plural variants, placeholders, and desktop-native strings
  • remove obsolete translation families after the app/session UI refactor
  • keep runtime-English selection and notice classification behind typed i18n/message metadata boundaries
  • replace a remaining hardcoded Story reset action with the existing translation key

Weekly audit refresh — 2026-08-24

The existing ready PR was still open, so this refresh reused it rather than publishing a duplicate. The branch was rebased onto current origin/v2 at 89451c3e322f before auditing.

The refreshed codebase reorganized app i18n under packages/app/src/runtime/i18n and moved current timeline rendering into packages/session-ui. After rebasing the earlier translation work, the audit found:

  • 1,654 missing app dictionary entries across 62 locales from 27 new English keys
  • 868 missing shared-UI entries across 62 locales from 14 new English keys, including localized restart continuation
  • 72 placeholder mismatches in Icelandic, Croatian, Hungarian, and Lithuanian desktop-native copy
  • 625 obsolete background-task and app-level timeline-notice entries left by the prior architecture
  • one remaining hardcoded Reset action in the app Story session header
  • current session UI still identified restart/instruction notices through English text instead of stable metadata

The refresh translates all new copy, repairs placeholder parity, removes obsolete keys, and ports notice localization to the current session UI architecture.

Cumulative translation scope

The original audit wave in this PR repaired 5,003 missing app entries and 186 missing UI entries for workspace management, project/settings extensions, background work, session summaries, timeline outcomes, authentication, and data migration. It also added provider-disconnect failure copy and centralized runtime-English fallback through tDynamic(...).

Together, both waves cover English plus 62 non-English locales across app, UI, and desktop-native surfaces. Locale-specific CLDR variants remain complete beyond the English .one / .other source forms.

Translation method

Translations were prepared and independently reviewed in language-family groups. Reviewers used the English dictionaries as semantic truth, then checked same-locale repository prior art and glossaries before consulting:

  • Unicode CLDR locale and plural data
  • Microsoft and Apple localization guidance and terminology
  • Mozilla style guidance, Firefox localization, and Pontoon
  • KDE and VS Code localization corpora where maintained
  • relevant language authorities and official dictionaries

Review focused on consistent developer terminology for workspace, checkout, project, session, background work, shell, subagent, extension, skill, MCP, LSP, CLI, terminal placement, compatibility, IDs, and migration. Product names, commands, identifiers, paths, URLs, acronyms, and placeholders remain exact.

Special handling includes RTL-safe interpolation around arbitrary Latin values, repository-specific locale identities (br, no, pa, zh, zht), complete locale plural families, and neutral grammar around arbitrary timeline actors. Sparse-corpus uncertainty is recorded for Dzongkha, Faroese, Persian, Burmese, Khmer, Lao, Amharic, Tajik, Turkmen, Uzbek, and related developer terminology.

Runtime localization fixes

  • tDynamic(...) keeps runtime-generated English source details for English locale tags while selecting keyed copy for other locales.
  • Restart recovery publishes stable notice metadata; current session UI renders the localized restart key while preserving the historical English-description fallback.
  • Instruction-update messages carry structured source metadata; session UI prefers it and retains the historical description parser for old messages.
  • Provider disconnect failures use keyed provider-aware copy instead of hardcoded/raw exception text.
  • Feature components no longer own locale branches or translated background-task composition.

Checks

  • full app/UI dictionary coverage and placeholder audit
  • all required Intl.PluralRules categories for every locale
  • retained-English review with targeted native-corpus corrections
  • app, UI, session UI, desktop, enterprise, core, client, schema, server, protocol, and CLI typechecks
  • app unit and browser-unit suites
  • shared UI and session UI suites
  • desktop-native and current reducer tests
  • focused core restart execution tests
  • Prettier, scoped oxlint, and git diff --check

The full desktop test command additionally exposed the Host runtime lacking Bun’s node:sqlite builtin; the remaining desktop tests completed with 68 passes, while desktop typecheck and the scoped 9-test native-i18n suite passed.

Browser E2E and production-build attempts reached the real Vite/Chromium harness but were blocked by Host thread exhaustion before product assertions completed; package tests and typechecks above passed. A broad core-suite attempt was also affected by unrelated baseline/resource-contention failures, while focused restart tests passed.

Requested by: @Hona (Hona via Slack)

@Enough1122

Copy link
Copy Markdown

AI code review — automated review for reference; please use your judgment.
Diff too large for automated review — recommend human review.

@Enough1122

Copy link
Copy Markdown

AI code review — automated review for reference; please use your judgment.

  • Scale note: with ~140 files of translations across dozens of locales, individual strings aren't verifiable here — please ensure your existing key-parity/CI checks cover all locales for the new keys (session.background.*, settings.workspaces.*, etc.) and consider a native-speaker pass for the higher-traffic surfaces.
  • packages/app/src/components/settings-v2/providers.tsx:139 — regression risk: the catch handler previously surfaced the underlying err.message and now shows a generic "failed to disconnect {{provider}}" toast. Users debugging auth/provider issues lose the actual reason (e.g. network vs 403). Consider logging the original error or including it when present.
  • packages/app/src/context/language.tsx:223 (backgroundTasks) — good implementation of the new AGENTS.md rule: one typed operation owns plural selection + composition, and callers just pick move/running phrasing.
  • packages/app/src/context/server-session-v2-reducer.ts:149 — attaching { notice: "instructions", instructionSources } metadata is a behavior change beyond i18n; test was updated accordingly, but any consumers filtering on metadata === undefined may need review.
  • Nice touch using Unicode isolates (\u2068...\u2069) in the Arabic strings for bidirectional safety.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Enough1122@Hona