From 8262fb147fe3b854449c19ca2a74bbe62d33b1b9 Mon Sep 17 00:00:00 2001 From: Ilya Gusev Date: Fri, 4 Sep 2026 01:07:34 +0300 Subject: [PATCH] fix(i18n): extract translateSearchKeyword calls so settings-search keywords reach en.json Reviewed and approved by Codex. --- config/i18next.config.ts | 2 +- .../scripts/verify-localization-catalog.mjs | 2 +- .../verify-localization-catalog.test.mjs | 14 ++ src/renderer/src/i18n/locales/en.json | 204 ++++++++++++++++-- 4 files changed, 199 insertions(+), 23 deletions(-) diff --git a/config/i18next.config.ts b/config/i18next.config.ts index 577375bd2e9..87e302ac213 100644 --- a/config/i18next.config.ts +++ b/config/i18next.config.ts @@ -16,7 +16,7 @@ export default defineConfig({ ], output, defaultNS: false, - functions: ['t', '*.t', 'translate', 'translateMain'], + functions: ['t', '*.t', 'translate', 'translateMain', 'translateSearchKeyword'], useTranslationNames: ['useTranslation'], sort: true, disablePlurals: true, diff --git a/config/scripts/verify-localization-catalog.mjs b/config/scripts/verify-localization-catalog.mjs index cb58372fab1..002a84360f6 100644 --- a/config/scripts/verify-localization-catalog.mjs +++ b/config/scripts/verify-localization-catalog.mjs @@ -11,7 +11,7 @@ import { repairTranslatedValue } from './locale-translation-policy.mjs' const SOURCE_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx', '.mts', '.cts']) const SKIP_PATH_PARTS = new Set(['.git', 'dist', 'node_modules', 'out', '__snapshots__', 'assets']) -const LOCALIZATION_FUNCTION_NAMES = new Set(['t', 'translate', 'translateMain']) +const LOCALIZATION_FUNCTION_NAMES = new Set(['t', 'translate', 'translateMain', 'translateSearchKeyword']) const PLACEHOLDER_RE = /\{\{[^}]+\}\}/g const LOCALES_RELATIVE_DIR = path.join('src', 'renderer', 'src', 'i18n', 'locales') export const LOCALIZATION_SOURCE_ROOTS = [ diff --git a/config/scripts/verify-localization-catalog.test.mjs b/config/scripts/verify-localization-catalog.test.mjs index 4bf3d7d7eba..4623f345b79 100644 --- a/config/scripts/verify-localization-catalog.test.mjs +++ b/config/scripts/verify-localization-catalog.test.mjs @@ -51,6 +51,20 @@ describe('verify-localization-catalog', () => { expect(readJson(path.join(localesDir, 'es.json'))).toEqual({}) }) + it('bootstraps keys referenced only through translateSearchKeyword', async () => { + const { root, localesDir } = makeProject({ + sourceText: + "import { translateSearchKeyword } from '@/components/settings/settings-search-keywords'\nexport const keywords = translateSearchKeyword('auto.components.settings.example.search.scroll', 'scroll')\n" + }) + + await expect(verifyLocalizationCatalog(root, { fix: false })).resolves.toBe(1) + await expect(verifyLocalizationCatalog(root, { fix: true })).resolves.toBe(0) + + expect(readJson(path.join(localesDir, 'en.json'))).toEqual({ + auto: { components: { settings: { example: { search: { scroll: 'scroll' } } } } } + }) + }) + it('never overwrites mismatched translations or removes target-only entries', async () => { const { root, localesDir } = makeProject({ sourceText: diff --git a/src/renderer/src/i18n/locales/en.json b/src/renderer/src/i18n/locales/en.json index 28149e7ca70..712df329873 100644 --- a/src/renderer/src/i18n/locales/en.json +++ b/src/renderer/src/i18n/locales/en.json @@ -136,7 +136,12 @@ }, "menuBarIcon": { "title": "Show Menu Bar Icon", - "description": "Keep an Orca shortcut and activity indicator in the macOS menu bar." + "description": "Keep an Orca shortcut and activity indicator in the macOS menu bar.", + "keyword": { + "menuBar": "menu bar", + "statusItem": "status item", + "activity": "activity" + } } }, "browser": { @@ -8790,7 +8795,8 @@ "d2c6a0e8f1": "grok", "c1b5f9d7e0": "xai", "b0a4e8c6d9": "oauth", - "a9f3d7b5c8": "login" + "a9f3d7b5c8": "login", + "d16378a88f": "minimax" } }, "advanced": { @@ -8869,7 +8875,16 @@ "agentPermissions": "Agent Permissions", "agentPermissionsDescription": "Switch agent permission defaults between Yolo and Manual.", "agentRuntime": "Agent Runtime", - "agentRuntimeDescription": "Choose whether agents are detected and launched on Windows or in WSL by default." + "agentRuntimeDescription": "Choose whether agents are detected and launched on Windows or in WSL by default.", + "runtime": "runtime", + "agentLocation": "agent location", + "installedAgentsWsl": "installed agents in wsl", + "permission": "permission", + "permissions": "permissions", + "yolo": "yolo", + "manual": "manual", + "skip": "skip", + "checks": "checks" } }, "appearance": { @@ -8992,7 +9007,11 @@ }, "leftSidebarAppearance": { "title": "Left Sidebar Appearance", - "description": "Make the left sidebar match your terminal, stay default, or use a tint." + "description": "Make the left sidebar match your terminal, stay default, or use a tint.", + "project": "project", + "terminal": "terminal", + "background": "background", + "tint": "tint" }, "workspaceCardLayout": { "title": "Workspace Card Layout", @@ -9007,7 +9026,15 @@ }, "showPinnedWorktreesInGroups": { "title": "Also show pinned worktrees in their original lists", - "description": "Pinned worktrees stay in Pinned and also appear in All, Project, Status, and PR." + "description": "Pinned worktrees stay in Pinned and also appear in All, Project, Status, and PR.", + "pinned": "pinned", + "worktree": "worktree", + "workspace": "workspace", + "all": "all", + "project": "project", + "status": "status", + "pr": "pr", + "duplicate": "duplicate" }, "antigravityUsageTitle": "Antigravity Usage", "antigravityUsageDescription": "Show Antigravity subscription usage in the status bar.", @@ -9017,7 +9044,15 @@ "d6c0a9e2f4": "grok", "c5b9f8d1e3": "xai", "usagePercentageDisplayTitle": "Usage percentages", - "usagePercentageDisplayDescription": "Choose whether provider limits show the percentage used or remaining." + "usagePercentageDisplayDescription": "Choose whether provider limits show the percentage used or remaining.", + "tray": { + "tray": "tray", + "system": "system tray", + "minimize": "minimize", + "close": "close", + "notification": "notification area", + "background": "background" + } } }, "auto": { @@ -9111,7 +9146,26 @@ "a942905148": "URL opened when creating a new browser tab. Leave empty to open a blank tab.", "c3903322d2": "Default Home Page", "19ea5607cf": "Localhost Worktree Labels", - "4e0fdf0a3f": "Open workspace ports as worktree-specific Orca localhost URLs so browser tabs are easier to tell apart." + "4e0fdf0a3f": "Open workspace ports as worktree-specific Orca localhost URLs so browser tabs are easier to tell apart.", + "6f5199381e": "ports", + "8f036ea11f": "worktree", + "c4e3bf3282": "tabs", + "a8c55c9c91": "favicon", + "660c1dd007": "labels", + "clientHostedRemote": { + "remote": "remote", + "client": "client", + "host": "host", + "desktop": "desktop", + "placement": "placement" + }, + "sshWorkspaceRouting": { + "ssh": "ssh", + "proxy": "proxy", + "tunnel": "tunnel", + "routing": "routing", + "network": "network" + } }, "use": { "search": { @@ -9318,12 +9372,26 @@ "nativeChat": { "title": "Chat UI", "description": "Preview the desktop chat surface for supported agent terminal sessions.", - "grok": "grok" + "grok": "grok", + "native": "native", + "chat": "chat", + "claude": "claude", + "codex": "codex", + "openclaude": "openclaude", + "omp": "omp", + "terminal": "terminal", + "agent": "agent" }, "agentDashboard": { "title": "Agent Dashboard", "description": "Kanban board for monitoring agents across worktrees, in-window or as a pop-out.", - "dashboard": "dashboard" + "dashboard": "dashboard", + "agent": "agent", + "kanban": "kanban", + "popout": "pop-out", + "board": "board", + "inWindow": "in-window", + "worktrees": "worktrees" } } }, @@ -9495,7 +9563,24 @@ "editorFontFamily": "Editor Font Family", "editorFontFamilyDesc": "Font used by file editors and diff views. Leave empty to follow the terminal font.", "externalWorktrees": "External worktrees", - "externalWorktreesDescription": "Choose whether worktrees created outside Orca appear by default." + "externalWorktreesDescription": "Choose whether worktrees created outside Orca appear by default.", + "editorFontKw": "font", + "f96cdaf37d": "spellcheck", + "a51d23f4a1": "spell check", + "641358460a": "spelling", + "d755962089": "red underline", + "projectRuntime": "project runtime", + "runtime": "runtime", + "windowsHost": "windows host", + "wsl": "wsl", + "distro": "distro", + "execution": "execution", + "externalKeyword": "external", + "visibility": "visibility", + "sidebar": "sidebar", + "867dddea41": "pinned", + "5250cf0e48": "pin", + "afa37a34e1": "close" } }, "git": { @@ -9549,7 +9634,8 @@ "upstream": "upstream", "localChanges": "local changes", "originMaster": "origin/master", - "committedChanges": "committed changes" + "committedChanges": "committed changes", + "diffBase": "diff base" } }, "input": { @@ -9744,7 +9830,13 @@ "1de96ec8a6": "Show Orca Mobile Button", "682293cadf": "Show the Orca Mobile button at the top of the left sidebar.", "e4f4daea0e": "relay", - "5d5af8e041": "iphone" + "5d5af8e041": "iphone", + "74618577c7": "mobile", + "5e5b8878bf": "phone", + "5bff6a2ef0": "sidebar", + "6cf5f54ce1": "button", + "648eeada79": "hide", + "ac79fe4a04": "show" } } }, @@ -9987,7 +10079,25 @@ "projectRuntime": "Project Runtime", "projectRuntimeDescription": "Choose whether this project runs on Windows or WSL.", "externalWorktrees": "External worktrees", - "externalWorktreesDescription": "Override whether worktrees created outside Orca appear for this project." + "externalWorktreesDescription": "Override whether worktrees created outside Orca appear for this project.", + "waitForSetupBeforeAgent": "wait for setup before starting agent", + "external": "external", + "visibility": "visibility", + "sidebar": "sidebar", + "fork": "fork", + "upstream": "upstream", + "syncFork": "sync fork", + "fastForward": "fast-forward", + "behindUpstream": "behind upstream", + "origin": "origin", + "defaultBranch": "default branch", + "runtime": "runtime", + "execution": "execution", + "windowsHost": "windows host", + "wsl": "wsl", + "distro": "distro", + "agentRuntime": "agent runtime", + "skillRuntime": "skill runtime" } }, "runtime": { @@ -10096,7 +10206,9 @@ "c38c18be15": "selection", "797fdfe4ca": "select", "603818e8d8": "Automatically copy terminal selections to the clipboard as soon as a selection is made.", - "3bdc84f059": "Copy on Select" + "3bdc84f059": "Copy on Select", + "zellij": "zellij", + "grok": "grok" } }, "search": { @@ -10290,7 +10402,22 @@ "title": "Theme Mode", "keyword_target": "target", "keyword_editing": "editing" - } + }, + "39ea7c0d28": "terminal", + "scroll": "scroll", + "scrolling": "scrolling", + "speed": "speed", + "wheel": "wheel", + "trackpad": "trackpad", + "tui": "tui", + "a0c44061ee": "confirm", + "close_terminal": "close", + "running": "running", + "command": "command", + "agent": "agent", + "process": "process", + "prompt": "prompt", + "stop": "stop" }, "windows": { "search": { @@ -10770,7 +10897,12 @@ "ephemeralVms": { "search": { "description": "Learn how repo-owned recipes give each workspace its own on-demand, disposable environment.", - "cloudVmTitle": "Cloud VM" + "cloudVmTitle": "Cloud VM", + "keywordVm": "vm", + "keywordSandbox": "sandbox", + "keywordCloud": "cloud", + "keywordRecipe": "recipe", + "keywordEphemeral": "ephemeral" } }, "EphemeralVmsPane": { @@ -10828,7 +10960,12 @@ }, "search": { "title": "Linear", - "description": "Linear skill status, usage examples, and links to Task Sources setup." + "description": "Linear skill status, usage examples, and links to Task Sources setup.", + "linear": "linear", + "tickets": "tickets", + "issues": "issues", + "skill": "skill", + "orcaLinear": "orca-linear" } } } @@ -11427,7 +11564,15 @@ "allowPublishingWebDescription": "Desktop only. Open Settings → Artifacts on the host device to change this setting.", "allowPublishingDescription": "Publish HTML and Markdown files as links anyone with the URL can open. Existing links remain until you delete them from Artifacts.", "howToDescriptionDisabled": "Enable artifact sharing above to publish HTML or Markdown files as public links.", - "allowPublishingSearchDescription": "Allow Orca to publish HTML and Markdown files as public links." + "allowPublishingSearchDescription": "Allow Orca to publish HTML and Markdown files as public links.", + "keywordArtifacts": "artifacts", + "keywordShare": "share", + "keywordPublish": "publish", + "keywordPublic": "public", + "keywordPermission": "permission", + "keywordHtml": "HTML", + "keywordMarkdown": "Markdown", + "keywordUpload": "upload" }, "orcaAccount": { "connected": "Connected", @@ -11449,7 +11594,14 @@ "relayTitle": "Orca Relay", "relayDescription": "Connect Orca Mobile to this desktop across cellular or any Wi-Fi.", "skillsTitle": "Skill sharing", - "skillsDescription": "Share one skill or a whole set behind an unlisted link, and install them on any machine you use." + "skillsDescription": "Share one skill or a whole set behind an unlisted link, and install them on any machine you use.", + "keywordAccount": "account", + "keywordLogin": "login", + "keywordLogout": "logout", + "keywordSignIn": "sign in", + "keywordSignOut": "sign out", + "keywordRelay": "relay", + "keywordCloud": "cloud" }, "automations": { "showButton": "Show Automations Button", @@ -11465,7 +11617,11 @@ "openAutomations": "Open Automations", "openAutomationsDescription": "Create schedules and inspect recent runs.", "title": "Automations", - "description": "Schedule agent work and choose whether Automations appears in the sidebar." + "description": "Schedule agent work and choose whether Automations appears in the sidebar.", + "keywordAutomations": "automations", + "keywordSchedule": "schedule", + "keywordAgent": "agent", + "keywordRuns": "runs" }, "AgentAwakeSetting": { "on": "On", @@ -11513,7 +11669,13 @@ "unshare": "Unshare", "showButton": "Show Skills button", "showButtonDescription": "Show the Skills shortcut in the sidebar.", - "manageInSkills": "Manage in Skills" + "manageInSkills": "Manage in Skills", + "keywordSkills": "skills", + "keywordShare": "share", + "keywordBundle": "bundle", + "keywordLink": "link", + "keywordUnlisted": "unlisted", + "keywordRevoke": "revoke" }, "bitbucket": { "credentials": {