Skip to content

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

Closed
opencode-agent[bot] wants to merge 15 commits into
v2from
weekly-i18n-v2
Closed

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

Conversation

@opencode-agent

@opencode-agent opencode-agent Bot commented Aug 17, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • complete the latest V2 app and shared-UI dictionaries across all 62 non-English locales
  • cover new SSH, pairing/camera, browser pane, session summary, project settings, settings search, workspace deletion, compaction, and browser-tool copy
  • repair placeholder contracts and remove obsolete ordinary translation keys replaced by complete/plural forms
  • preserve locale-specific CLDR forms, RTL isolation, product/code identifiers, and typed i18n boundaries
  • retain the earlier reviewed translation waves already in this branch

Weekly audit refresh — 2026-09-14

This refresh reused the still-open translation PR rather than publishing an overlapping duplicate. The branch was rebased onto current origin/v2 at 7a31b5c0f7 before auditing.

Findings

The rebased audit found:

  • 10,540 missing app entries: 170 English source keys absent from each of 62 locales
  • 620 missing shared-UI entries: 10 English source keys absent from each locale
  • 174 locale-specific CLDR forms required beyond English .one / .other source forms, including the new complete file-count family
  • 186 placeholder-contract mismatches: app settings.workspaces.deleteAll.warning and UI ui.messagePart.context.thought.one/.other across every locale
  • 744 obsolete ordinary entries: 11 removed app keys and one removed UI key still present in all locale dictionaries
  • nine app and four UI empty values, all confirmed intentional word-order fragments in Azerbaijani, Japanese, Korean, Thai, and Turkish
  • no feature-code locale inspection, Intl.PluralRules, or plural-category key construction/selection

The weekly wave adds 12,388 translated entries/forms, repairs 186 placeholder contracts, and removes 744 obsolete entries.

Product areas

  • SSH lifecycle, authentication, trust, update, reconnect, errors, project opening, and server menu copy
  • HTTP server pairing, QR/camera scanning, mixed-content and invalid-address states
  • browser commands, browser session pane, and browser tool copy
  • session summary for server, MCP, LSP, plugins, skills, authentication, retry, and setup
  • project name/icon/color, startup scripts, LSP state, and empty extension states
  • settings search, server preferences, workspace deletion, timeline visibility/grouping/collapse
  • compaction/provider-compaction status and usage copy

Exact English source keys

app source keys (170)

command.browser.open
command.browser.reload
command.session.summary.toggle
dialog.server.menu.remove
file.error.notFound
home.workspaceTip
mcp.auth.interactiveForm
project.settings.color.description
project.settings.extensions.empty.mcps.description
project.settings.extensions.empty.mcps.title
project.settings.extensions.empty.plugins.description
project.settings.extensions.empty.plugins.title
project.settings.extensions.empty.skills.description
project.settings.extensions.empty.skills.title
project.settings.extensions.lsp.configured
project.settings.extensions.lsp.disabled.description
project.settings.extensions.lsp.disabled.title
project.settings.extensions.lsp.empty.description
project.settings.extensions.lsp.empty.title
project.settings.extensions.lsp.loadFailed
project.settings.extensions.lsp.retry
project.settings.extensions.lsp.status.disabled
project.settings.extensions.lsp.status.enabled
project.settings.icon.description
project.settings.name.description
project.settings.name.title
project.settings.worktree.startup.description
project.settings.worktree.startup.hint.base
project.settings.worktree.startup.hint.new
server.connect.address.invalid
server.connect.button
server.connect.camera
server.connect.camera.error
server.connect.camera.insecure
server.connect.camera.starting
server.connect.camera.unavailable
server.connect.description
server.connect.failed
server.connect.mixedContent
server.connect.pair.description
server.connect.scan
server.connect.scan.description
server.connect.scan.invalid
server.connect.title
session.browser.address
session.browser.address.placeholder
session.browser.replaced
session.browser.suspended
session.new.workspace.search.empty
session.queue.attachments.one
session.queue.attachments.other
session.summary.chooseProject
session.summary.configFileMissing
session.summary.configure
session.summary.connecting
session.summary.copyConfigPath
session.summary.failed
session.summary.lsp
session.summary.lsp.configured
session.summary.lsp.empty
session.summary.lsp.manage
session.summary.mcp
session.summary.mcp.add
session.summary.mcp.empty
session.summary.mcp.notReady
session.summary.mcp.onCreation
session.summary.mcp.prepareFailed
session.summary.mcp.signInBeforeSend
session.summary.mcp.title
session.summary.mcp.unavailable
session.summary.needsAuth
session.summary.plugins
session.summary.plugins.add
session.summary.plugins.configured
session.summary.plugins.empty
session.summary.plugins.manage
session.summary.retry
session.summary.server
session.summary.skills
session.summary.skills.add
session.summary.skills.configured
session.summary.skills.empty
session.summary.skills.manage
session.summary.tooltip
session.tab.add
session.tab.browser
settings.backToProjects
settings.backToSettings
settings.general.row.browserPane.description
settings.general.row.browserPane.title
settings.projects.search.placeholder
settings.search.empty
settings.search.empty.query
settings.search.group.pages
settings.search.group.projects
settings.search.group.servers
settings.search.group.settings
settings.search.page
settings.search.placeholder
settings.search.refine
settings.search.result
settings.search.result.unscoped
settings.search.results
settings.server.description
settings.server.preferences.websearch.description
settings.server.preferences.websearch.title
settings.server.section.connection
settings.timeline.collapse
settings.timeline.collapsed.label
settings.timeline.group
settings.timeline.grouped.label
settings.timeline.summary
settings.timeline.visibility.hide
settings.timeline.visibility.label
settings.timeline.visibility.show
settings.workspaces.delete.button
settings.workspaces.deleteAll.confirm.one
settings.workspaces.deleteAll.confirm.other
settings.workspaces.deleteWithoutSessions
settings.workspaces.deleteWithoutSessions.confirm.one
settings.workspaces.deleteWithoutSessions.confirm.other
settings.workspaces.deleteWithoutSessions.warning
settings.workspaces.description
settings.workspaces.empty.description
settings.workspaces.sessions.filtered.one
settings.workspaces.sessions.filtered.other
ssh.action.authenticate
ssh.add
ssh.authenticate
ssh.authenticationRequired
ssh.connect
ssh.connectTo
ssh.continue
ssh.disconnect
ssh.error.connection
ssh.error.host-key
ssh.error.input
ssh.error.install
ssh.error.platform
ssh.error.service
ssh.error.ssh-missing
ssh.error.unpublished
ssh.error.version
ssh.forget
ssh.label
ssh.offline
ssh.openProject
ssh.placeholder
ssh.project
ssh.retry
ssh.server.menu.label
ssh.session.connecting
ssh.session.disconnected
ssh.session.reconnect
ssh.session.reconnectDescription
ssh.stage.authentication
ssh.stage.checking
ssh.stage.connecting
ssh.stage.disconnected
ssh.stage.downloading
ssh.stage.failed
ssh.stage.incompatible
ssh.stage.ready
ssh.stage.starting
ssh.stage.uploading
ssh.target
ssh.trust
ssh.update
workspace.delete.location
workspace.lifecycle.deleting

ui source keys (10)

ui.messagePart.compaction.cancelled
ui.messagePart.compaction.failed
ui.messagePart.compaction.interrupted
ui.messagePart.compaction.running
ui.messagePart.compaction.started
ui.messagePart.compaction.usage
ui.messagePart.providerCompaction
ui.messagePart.tools.used.one
ui.messagePart.tools.used.other
ui.tool.browser

Removed obsolete ordinary keys

App locale dictionaries remove:

  • settings.timeline.advanced.explainer, settings.timeline.activity
  • settings.timeline.placement.title, .separate, .grouped, .hidden
  • settings.timeline.expansion.title, .collapsed, .expanded
  • session.queue.attachments
  • settings.workspaces.deleteAll.confirm

Shared-UI dictionaries remove ui.messagePart.tools.used; the current English source is the typed plural family .one / .other.

Hardcoded, grammar, and accessibility repairs

  • packages/app/src/session/browser/pane.tsx translates known browser-pane protocol errors and announces failures as an assertive alert.
  • packages/session-ui/src/tools/tool-renderer.tsx uses a complete ui.common.fileCount plural family instead of prefixing a number to a noun fragment.
  • packages/ui/src/context/i18n.tsx owns locale-aware list separators; packages/session-ui/src/components/tool-count-summary.tsx no longer hardcodes commas between translated count phrases.
  • packages/desktop/src/renderer/migration-status.tsx renders complete localized progress phrases for phase-only, current, and current/total states; unknown future phases use generic translated migration copy instead of raw English.
  • packages/app/src/settings/workspaces/project.tsx translates the nine project color names used in accessible labels.
  • The rebase also reconciles the shared rich-translation implementation rather than retaining two duplicate declarations.

New English source keys translated in every locale:

  • app: session.browser.unsupported; five toast.migration.progress.* current/progress/generic keys; nine common.color.* keys
  • UI: ui.common.fileCount.one, ui.common.fileCount.other

Per-locale counts

Every non-English locale receives 185 app source-key translations and 12 shared-UI source-key translations.

Additional required CLDR forms beyond those English keys:

  • app +0 / UI +0: am, az, bg, bn, da, de, dv, dz, el, et, fa, fi, fo, hi, hu, hy, id, is, ja, ka, km, ko, lo, mk, mn, ms, my, ne, nl, no, pa, si, sq, sv, tg, th, tk, tr, ur, uz, vi, zh, zht
  • app +4 / UI +2: br, bs, ca, es, fr, he, hr, it, lv, ro, sr
  • app +8 / UI +4: cs, lt, pl, ru, sk, sl, uk
  • app +16 / UI +8: ar

Translation-quality method

English dictionaries remained the semantic source of truth. Independent language-family reviews checked repository prior art, Unicode CLDR cardinal rules, Mozilla localization guidance and Firefox/Pontoon, Microsoft and Apple localization guidance, maintained KDE/VS Code and localized Git terminology where available, and the language authorities named in package guidance.

Product names, provider names, commands, identifiers, paths, key labels, acronyms, and placeholders remain exact. New RTL phrases isolate dynamic Latin values where needed. Sparse-corpus terminology is flagged for native review in Dzongkha, Faroese, Persian, Burmese, Khmer, Lao, Amharic, Tajik, Turkmen, Uzbek, Shahmukhi Punjabi, and Divehi.

Cumulative branch behavior

Earlier reviewed waves in this PR translated prior app/UI/desktop drift across the same 62 locales, localized provider/timeline/native errors, preserved runtime English through typed fallback, localized rich lists and count-sensitive copy, and kept locale/plural mechanics behind shared typed APIs.

Checks

  • final parity audit: 1,479 app English keys and 246 shared-UI English keys across 62 non-English locales; zero missing keys, unintended empty values, placeholder mismatches, unexpected ordinary extras, missing CLDR categories, plural placeholder mismatches, or duplicate keys
  • retained-English review: remaining exact matches are product/provider names, acronyms, commands, URLs, key legends, placeholder-only templates, or established identical spellings/borrowings
  • hardcoded-copy rescan: remaining candidates are brands, command/tool protocol text, key labels, CSS/class values, typed translation-key construction, identifiers, or story/dev-only copy
  • typed i18n invariant scan: no feature-code locale inspection, Intl.PluralRules, or plural-category key construction/selection
  • CI explicitly unset for scoped i18n and package tests
  • typechecks: app, UI, session UI, desktop, enterprise, core, client, schema, server, protocol, and CLI
  • tests: app unit 855 passed (1 unrelated skip); app browser-unit 157 passed; shared UI 114 passed; session UI 181 passed; desktop-native i18n 9 passed; focused core restart/session execution 35 passed
  • localized list-separator tests: 18 UI i18n tests passed
  • timeline/performance unit baseline: 53/53 passed before the session/browser call-site changes; 53/53 passed after
  • Prettier, git diff --check, and scoped Oxlint (zero errors) passed

The broad desktop run passed 112 tests; five storage/browser test files could not start because the Host Bun runtime lacks the node:sqlite builtin. Desktop typecheck and the scoped native-i18n suite passed. The app production build could not start under the Host's Node 18 because Rolldown imports Node's newer util.styleText; package typechecks and browser/unit suites 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.

@opencode-agent
opencode-agent Bot force-pushed the weekly-i18n-v2 branch 2 times, most recently from e80e60d to 68b3047 Compare August 30, 2026 17:15
@github-actions

Copy link
Copy Markdown
Contributor

Automated PR Cleanup

Thank you for contributing to opencode.

Due to the high volume of PRs from users and AI agents, we periodically close older PRs using automated criteria so maintainers can focus review time on the most active and community-supported contributions.

This PR was closed because it matched the following cleanup criteria:

  • The PR was created more than 1 month ago
  • The PR had fewer than 2 positive reactions
  • Positive reactions are counted as thumbs-up, heart, celebration, or rocket reactions on the PR

PRs created within the last month are not affected by this cleanup.

If you believe this PR was closed incorrectly, or if you are still actively working on it, please leave a comment explaining why it should be reopened. A maintainer can review and reopen it if appropriate.

Thanks again for taking the time to contribute.

@github-actions github-actions Bot closed this Sep 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants