Repository navigation
feat(i18n): refresh Turkish localization and verify Windows UI - #31316
trugurpala wants to merge 14 commits into
Conversation
Adds docs/readme/README.tr.md and wires the Türkçe link into the language switcher on README.md and every other translated README.
Adds tr.json (full catalog coverage) and wires Turkish in as a selectable UI language: shared ui-language/ui-locale types, the renderer and main process lazy locale loaders, the settings language picker, and native Electron menu labels (Edit/View/Window/App menu roles that previously had no label override and fell back to Electron's own untranslated default). Also fixes several renderer strings that interpolated a raw, untranslated English word into an otherwise-translated template (floating terminal toggle tooltip, worktree/dashboard child-agent disclosure labels, PR viewed-file checkbox, and the Landing screen's create/navigate shortcut hints), and localizes the Keyboard Shortcuts settings pane (shortcut titles, group headers, and status filters), which previously rendered entirely in English regardless of the active UI language.
The keybinding conflict message and the parse-error/unavailable messages in ShortcutsPane still built their text from raw English template literals even after the shortcut titles they reference were translated, so a Turkish user hit a mixed-language error. Extracts the three messages into shortcut-error-messages.ts and routes them through translate().
The blocking-conflict message in ShortcutsPane.saveBindings was already localized, but the sibling per-row conflict warning built in buildShortcutDefinitionCatalog (surfaced as inline row warnings via buildShortcutRowVisibility) still built its text from the raw English definition title and a hardcoded "conflicts with" template, so a conflicting shortcut showed a localized error only when it blocked saving, and an English warning on the row otherwise. Routes it through the same translateKeybindingTitle/getBindingConflictMessage helpers. Also fixes a stale comment in i18n.ts referencing "the other four locales" now that there are six non-English catalogs.
buildAgentTabKeybindingDefinitions() generates one definition per installed TUI agent (id `tab.newAgent.<agent>`, group 'Agents'), so they have no fixed slot in the static per-id keybinding titles catalog and always rendered in English regardless of the active UI language. Their title only varies by the agent's own (never-translated) display name, so translateKeybindingTitle now detects that id shape and interpolates the name into a single translated sentence instead, and 'Agents' is added to the group-title catalog map. Adds keybinding-catalog-labels.test.ts covering both the static and dynamic title paths and the group lookup.
No behavior change. Adds brief doc comments to the exported functions introduced or touched in this PR's i18n work that lacked one.
Continue the Turkish work by merttopuz and mehmetefeaytas, preserving their commits. Sync current catalogs, fix localized shortcut search and native menu fallbacks, and add Windows Electron coverage.
|
I compared the Windows failures with the pre-contribution upstream base before marking this ready for review.
All 590 failing test identities and all 57 file statuses match. There are zero PR-only failures in this observed set. This is a completed rerun of the failures observed in the earlier interrupted full-suite run, not a full-repository pass. The messages include 532 Windows locked-file cleanup failures, 30 missing POSIX-shell failures and 2 file-symlink privilege failures. The remaining 26 also reproduce on the base and include other cleanup/expectation errors; I am not claiming that all of them are environment-only. I also reran the localization/menu/Settings-search/dashboard selection: 23 files passed, 256 tests passed, 1 skipped, zero failed. No product source, test expectation, skip, lockfile or permission was changed to obtain these results. Existing lint/typecheck/build evidence still refers to the unchanged published source tree. GitHub CI remains pending maintainer approval. Reproduction method and complete per-file resultsThe baseline was exported with PR:
Fresh passing localization selection: |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info
📝 Walkthrough
Priority: ➖ Normal Merge Risk: ⚪ Minimal · up to
|
Add concise JSDoc to the 27 undocumented named functions touched by the Turkish localization PR. Preserve existing runtime behavior and prior contributor credits. Verified: local AST coverage 37/37, identical comment-free emitted code for all 18 changed files, formatting/lint/max-lines checks, and 256 focused tests passed with 1 skipped.
|
Addressed the docstring coverage warning in c45f1f3. Added or converted 27 concise JSDoc blocks across 18 files. A local TypeScript AST audit of the named functions touched by this PR now finds 37/37 documented, up from 10/37. This is a local measurement; CodeRabbit still needs to recalculate its own result. Validation on Windows:
The existing full-suite and untested-platform limitations still apply; no new CI pass is claimed. |
|
@coderabbitai review Please recheck the latest head c45f1f3, including Docstring Coverage. The updated report shows 78.57% across 42 functions. Could you list the remaining undocumented functions with file paths so I can address the precise gaps? My local audit covers 37 named functions and therefore does not reproduce your full denominator. |
|
|
@coderabbitai full review Please rerun against c45f1f3 and identify the remaining undocumented functions behind the 78.57% Docstring Coverage result, with file paths. The incremental review command reported this commit was already reviewed. |
✅ Action performedFull review finished. |
There was a problem hiding this comment.
Actionable comments posted: 1
ℹ️ Review info
⚙️ Run configuration
- Configuration used: Repository UI
- Review profile: CHILL
- Plan: Advanced
- Run ID:
59c83c76-cec4-4ba9-86f3-68f4fd6a9eed
📒 Files selected for processing: 51
README.mdconfig/scripts/locale-translation-policy.mjsdocs/readme/README.es.mddocs/readme/README.fr.mddocs/readme/README.ja.mddocs/readme/README.ko.mddocs/readme/README.pt.mddocs/readme/README.tr.mddocs/readme/README.zh-CN.mdsrc/main/i18n/main-i18n-lazy-locale.test.tssrc/main/i18n/main-i18n.tssrc/main/menu/app-menu-quit-item.tssrc/main/menu/app-menu-window.tssrc/main/menu/build-native-role-menu-items.tssrc/main/menu/native-role-label.tssrc/main/menu/register-app-menu.test.tssrc/main/menu/register-app-menu.tssrc/renderer/src/components/Landing.tsxsrc/renderer/src/components/dashboard/DashboardAgentChildDisclosure.test.tsxsrc/renderer/src/components/dashboard/DashboardAgentChildDisclosure.tsxsrc/renderer/src/components/floating-terminal/FloatingTerminalToggleButton.tsxsrc/renderer/src/components/github/PRViewedCheckbox.tsxsrc/renderer/src/components/settings/ShortcutCommandBlock.tsxsrc/renderer/src/components/settings/ShortcutFilterRail.tsxsrc/renderer/src/components/settings/ShortcutRowsList.tsxsrc/renderer/src/components/settings/ShortcutsPane.tsxsrc/renderer/src/components/settings/settings-search.tssrc/renderer/src/components/settings/shortcut-definition-catalog.tssrc/renderer/src/components/settings/shortcut-error-messages.tssrc/renderer/src/components/settings/shortcuts-localization.test.tssrc/renderer/src/components/settings/shortcuts-search.tssrc/renderer/src/components/sidebar/ImportedWorktreesVisibilityLine.tsxsrc/renderer/src/i18n/I18nProvider.tsxsrc/renderer/src/i18n/en-runtime-required.jsonsrc/renderer/src/i18n/i18n.tssrc/renderer/src/i18n/keybinding-catalog-labels.test.tssrc/renderer/src/i18n/keybinding-catalog-labels.tssrc/renderer/src/i18n/locales/en.jsonsrc/renderer/src/i18n/locales/es.jsonsrc/renderer/src/i18n/locales/fr.jsonsrc/renderer/src/i18n/locales/ja.jsonsrc/renderer/src/i18n/locales/ko.jsonsrc/renderer/src/i18n/locales/tr.jsonsrc/renderer/src/i18n/locales/zh.jsonsrc/renderer/src/i18n/supported-languages.tssrc/renderer/src/i18n/turkish-catalog-regression.test.tssrc/shared/ui-language.test.tssrc/shared/ui-language.tssrc/shared/ui-locale.test.tssrc/shared/ui-locale.tstests/e2e/turkish-localization.spec.ts
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 8 remain after this review.
|
@coderabbitai Could you provide the exact nine function names and file paths counted as undocumented in the 33/42 Docstring Coverage result for c45f1f3? The full review retained 78.57% but did not list them. In particular, does the coverage parser recognize JSDoc above a const arrow-function declaration, or must it be attached directly to the arrow initializer? I am checking the locale-loader arrows and localized catalog factory as well. Please explain the existing coverage result; no extra full review is needed yet. |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -uo pipefail
git rev-parse HEAD
git show -s --format='%H %s' c45f1f3ee9eb42c935edc65b3dd5c09af48d6c19
gh api --paginate repos/stablyai/orca/issues/31316/comments --jq '.[] | select(.body | test("Docstring|docstring|33/42|78.57")) | {id,html_url,body}'
gh api --paginate repos/stablyai/orca/pulls/31316/reviews --jq '.[] | select(.body | test("Docstring|docstring|33/42|78.57")) | {id,html_url,commit_id,body}'
fd -i 'localized.*catalog|catalog.*localized|docstring'
ast-grep outline src/main/i18n/main-i18n.ts
ast-grep outline src/renderer/src/i18n/i18n.tsLength of output: 17278 🤖 web_search executed:
Length of output: 2897 🏁 Script executed: #!/bin/bash
set -uo pipefail
ast-grep outline src/renderer/src/i18n/localized-catalog.ts --items all
sed -n '1,155p' src/main/i18n/main-i18n.ts
sed -n '1,165p' src/renderer/src/i18n/i18n.ts
sed -n '1,180p' src/renderer/src/i18n/localized-catalog.ts
gh api --paginate repos/stablyai/orca/pulls/31316/comments --jq '.[] | select(.body | test("docstring|Docstring|coverage|initializer|arrow")) | {path,line,body,html_url}'
gh api repos/stablyai/orca/commits/c45f1f3ee9eb42c935edc65b3dd5c09af48d6c19/check-runs --jq '.check_runs[] | {name,conclusion,output,details_url}'Length of output: 12776 🤖 web_search executed:
Length of output: 292
What the existing result establishesThe published report states:
These totals do not identify which functions the parser counted. They also do not explain the difference from your 37-function audit. I cannot label nine source functions as the reported gaps without the underlying parser results. JSDoc placement on arrow functionsJSDoc above a /** Load the Turkish catalog on demand. */
const loadTurkishCatalog = () => import('./locales/tr.json')However, I could not verify whether CodeRabbit’s coverage parser recognizes that placement or requires a comment immediately before the arrow initializer. The available public documentation does not establish that behavior. I should not recommend moving comments based on an unverified parser assumption. Source checks at
|
| Source | Observation |
|---|---|
src/main/i18n/main-i18n.ts |
LAZY_LOCALE_LOADERS.tr is an arrow function without its own JSDoc. |
src/renderer/src/i18n/i18n.ts |
NON_DEFAULT_LOCALE_LOADERS.tr is an arrow function without its own JSDoc. |
src/renderer/src/i18n/localized-catalog.ts |
createLocalizedCatalog is a function declaration without JSDoc. Its returned anonymous arrow also has no JSDoc. |
These are source observations, not a reconstruction of the nine reported gaps. Their presence does not prove that the coverage check included them.
Verification of the exact nine functions remains inconclusive. The next useful check is to obtain the existing run’s per-function diagnostics through CodeRabbit support, with the PR URL and commit SHA. Please retry that lookup through support rather than changing comment placement to satisfy an unexplained count. I have not triggered another review.
You are interacting with an AI system.
|
@coderabbitai review Updated in 58e39fb:
Fresh Windows validation: 23 test files passed; 256 tests passed, 1 skipped, zero failed. Formatting, scoped lint, max-lines ratchet and whitespace checks passed. All seven changed TypeScript files have identical emitted non-comment tokens to c45f1f3; formatter indentation accounts for the larger-looking diff. This is documentation-only. The existing full-suite/platform limitations and maintainer-approval requirement for CI still apply. |
|
@coderabbitai full review |
✅ Action performedFull review finished. |
|
@coderabbitai review Follow-up in 733dd58: the previous inline-arrow JSDoc placement still produced a coverage warning, so the nine locale/shortcut helpers now use named function declarations with conventional JSDoc. The related Settings search entry API is documented as well. This commit is a behavior-preserving refactor, not comment-only. Dynamic imports remain lazy, catalog caching stays in createLocalizedCatalog, and effect cleanup retains the same callback reference. The converted bodies and parameters were compared against c45f1f3, accounting for explicit returns replacing expression bodies. Fresh Windows validation on this exact source:
Please verify Docstring Coverage for the new head. Existing full-suite/platform limitations and pending maintainer approval for CI remain unchanged. |
There was a problem hiding this comment.
Actionable comments posted: 1
ℹ️ Review info
⚙️ Run configuration
- Configuration used: Repository UI
- Review profile: CHILL
- Plan: Advanced
- Run ID:
34846262-5c93-4266-ac5d-d0248cb05019
📒 Files selected for processing: 51
README.mdconfig/scripts/locale-translation-policy.mjsdocs/readme/README.es.mddocs/readme/README.fr.mddocs/readme/README.ja.mddocs/readme/README.ko.mddocs/readme/README.pt.mddocs/readme/README.tr.mddocs/readme/README.zh-CN.mdsrc/main/i18n/main-i18n-lazy-locale.test.tssrc/main/i18n/main-i18n.tssrc/main/menu/app-menu-quit-item.tssrc/main/menu/app-menu-window.tssrc/main/menu/build-native-role-menu-items.tssrc/main/menu/native-role-label.tssrc/main/menu/register-app-menu.test.tssrc/main/menu/register-app-menu.tssrc/renderer/src/components/Landing.tsxsrc/renderer/src/components/dashboard/DashboardAgentChildDisclosure.test.tsxsrc/renderer/src/components/dashboard/DashboardAgentChildDisclosure.tsxsrc/renderer/src/components/floating-terminal/FloatingTerminalToggleButton.tsxsrc/renderer/src/components/github/PRViewedCheckbox.tsxsrc/renderer/src/components/settings/ShortcutCommandBlock.tsxsrc/renderer/src/components/settings/ShortcutFilterRail.tsxsrc/renderer/src/components/settings/ShortcutRowsList.tsxsrc/renderer/src/components/settings/ShortcutsPane.tsxsrc/renderer/src/components/settings/settings-search.tssrc/renderer/src/components/settings/shortcut-definition-catalog.tssrc/renderer/src/components/settings/shortcut-error-messages.tssrc/renderer/src/components/settings/shortcuts-localization.test.tssrc/renderer/src/components/settings/shortcuts-search.tssrc/renderer/src/components/sidebar/ImportedWorktreesVisibilityLine.tsxsrc/renderer/src/i18n/I18nProvider.tsxsrc/renderer/src/i18n/en-runtime-required.jsonsrc/renderer/src/i18n/i18n.tssrc/renderer/src/i18n/keybinding-catalog-labels.test.tssrc/renderer/src/i18n/keybinding-catalog-labels.tssrc/renderer/src/i18n/locales/en.jsonsrc/renderer/src/i18n/locales/es.jsonsrc/renderer/src/i18n/locales/fr.jsonsrc/renderer/src/i18n/locales/ja.jsonsrc/renderer/src/i18n/locales/ko.jsonsrc/renderer/src/i18n/locales/tr.jsonsrc/renderer/src/i18n/locales/zh.jsonsrc/renderer/src/i18n/supported-languages.tssrc/renderer/src/i18n/turkish-catalog-regression.test.tssrc/shared/ui-language.test.tssrc/shared/ui-language.tssrc/shared/ui-locale.test.tssrc/shared/ui-locale.tstests/e2e/turkish-localization.spec.ts
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 6 remain after this review.
|
|
@coderabbitai review The previous request was cancelled with “Head commit changed” while I addressed your README terminology finding. All fixes are now on bb3348d. Please review this stable head, including the documented function declarations in 733dd58 and the README terminology fix in bb3348d. Validation is recorded above; no further commits are being pushed while this review runs. |
|
|
* feat(i18n): add Turkish UI language Register Turkish (tr) as a built-in UI language alongside en, zh, ko, ja, es, fr and pt: language setting, system-locale detection, renderer and main-process lazy catalogs, Settings picker label in every catalog, Settings search keyword, onboarding picker, docs, README link and a Turkish style glossary (config/i18n-turkish.md). tr.json comes from the community Turkish catalog (#22200, refreshed in #31316), reconciled with the current en.json: keys retired from en.json, entries whose English source changed since the refresh, and entries with placeholder mismatches are dropped and fall back to English until the next translation pass. Supersedes #31316. Co-authored-by: Uğur Pala <mail@ugurpala.com> Co-authored-by: mert <mmerttpz@gmail.com> Co-authored-by: Mehmet Efe Aytaş <mehmetefeaytas@icloud.com> * feat(i18n): complete Turkish catalog Translate the 1,432 keys tr.json was missing, restore the count placeholder in six Turkish singular forms, and order the catalog like en.json. * fix(i18n): apply Turkish translation review Correct 32 mistranslations (wrong meaning, translated command names and example paths, swapped placeholders) and 525 glossary and grammar issues that two independent review passes both flagged. * fix(i18n): Turkish review fixes and dotted-I settings search Fold U+0307 from lowercased Turkish İ so settings search matches plain-i queries, fix sampled Turkish meaning/terminology issues, and align the glossary casing rule with the catalog. --------- Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> Co-authored-by: Uğur Pala <mail@ugurpala.com> Co-authored-by: mert <mmerttpz@gmail.com> Co-authored-by: Mehmet Efe Aytaş <mehmetefeaytas@icloud.com>
|
Thanks @trugurpala — Turkish (Türkçe) is now a built-in UI language via #34718, built on your catalog and README from this PR. The remaining strings were filled in and reviewed, and identifier casing was made locale-independent in #34709 so Turkish dotted/dotless i no longer breaks ID matching. Closing in favor of that PR. Wording fixes are very welcome as follow-ups against |
ELI5
This picks up the existing Turkish translation and fills in the strings added since then. It also fixes a practical problem: when a command is shown in Turkish, searching for its Turkish name should find it. “Dosyaya Git” and “ileri” now do.
What Changed
Thanks to @merttopuz for the original locale and README in #22200, and @mehmetefeaytas for the catalog refresh. Their nine commits and authorship are preserved. My part here is refreshing the catalog, fixing localized search and menus, and checking the result on Windows.
ae58ca06d675396ca9e958d144607e2195c6fd95. Add 1,801 missing entries, refresh 56 changed-source translations and remove 228 retired entries. Add the current Chat shortcut/group: 16,846/16,846 catalog keys, no missing keys or placeholder mismatches.@means referencing a file, not uploading an attachment.Why
The existing Turkish branches predate new screens and currently conflict with main. Updating that work retains its authorship while closing current catalog gaps. Localized command names also need to be searchable; explicitly labeling native menu roles must not turn other supported languages back into English.
This branch is offered as an updated continuation; maintainers can choose how to integrate it with #22200.
Linked Issue
Fixes #22228
Visual Proof
Original feature before/after evidence is preserved in @merttopuz's screenshots.
The screenshots below were captured from the real Windows Electron E2E runs and visually inspected. The English/Turkish comparison uses the same build at 1024×768, before and after changing language; it is not a separately built upstream baseline. Long labels retain the existing ellipsis behavior, and the narrow shortcut layout uses vertical scrolling.
Turkish shortcut search: “ileri” — 1280×800. Both matching forward-navigation commands are shown.
Turkish shortcut search: “incel” — 1024×768, scrolled. Both matching review commands are shown in the narrow layout.
All four images are attached to GitHub; no screenshot files were added to the source tree. Full-suite and CI limitations remain documented below.
Testing
Actual UI interactions were automated with Playwright against a real Windows Electron process, followed by visual inspection of the screenshots. No manual foreground desktop test is claimed.
Passed locally on Windows, Node 24.19.0, pnpm 12.14.0, Electron 43.7.8 and pinned Bun 1.4.3:
ileri/incelsearch, globalDosyaya Git, Ctrl hints, translated native roles and zero visible test windows.ORCA_BACKGROUND_LAUNCH=1was used throughout.pnpm lintandpnpm typecheck; main-process type checking repeated after the last menu fix. Existing documentation-site warnings remain, with no lint errors. Pre-commit lint, React checks and formatting passed.Coverage limits: native macOS/Linux GUI, live SSH and mobile-device flows were not run. macOS/Linux menu flags are exercised by unit tests, which is not native OS execution. The earlier screenshots precede only the final composer-hint wording correction; that text is not visible in those screens. Full-repository commands were attempted in the checklist verification below; targeted-test results must not be read as a full-suite pass.
Catalog coverage is not a claim of perfect linguistic quality. A final contextual language sample covered 302 entries, including all 56 changed-source translations; it found and corrected the file-mention hint. The 1,801 added entries were also reviewed for terminology, placeholders, markup and inline command syntax.
Separate Windows installation check — October 21, 2026
I also set up commit
32503650d42ce7ba19552f8523d954817a95aa71in a separate local folder and profile, alongside the existing Orca installation.app.asarhashes were unchanged.For reproducibility: these E2E runs used the existing test cases and fixtures with a local config that skips the global build step, because the app had already been built separately. The standalone copy also uses a local bootstrap wrapper to isolate Electron's Windows paths. Those installation-only changes are not part of this PR, and the translation sources were unchanged.
This was a source build whose package version is 1.4.214, tested alongside the installed 1.4.235 release. It is not a signed installer or a rebase onto that newer release. These additional checks did not exercise signed-in agent workflows or the full repository test/release-packaging suites.
Checklist verification — October 21, 2026
Rechecked the published source tree
0b3c0410c06ac0cf81754e03f9e5a06518019641(PR head32503650d42ce7ba19552f8523d954817a95aa71). No product sources or lockfiles were changed during this verification.pnpm lintpnpm typecheckpnpm buildcommand.pnpm buildpnpm test/bin/shis absent. The 57 observed failing files were subsequently compared with the upstream base; see the review-readiness follow-up below.The first build attempt found the missing separate
mobile/install; it was installed withpnpm install --frozen-lockfile. The next attempt reached the Windows native stage and found Cargo missing. Rust 1.99.1 was installed in an isolated local tooling directory, and the entire build command was then rerun successfully. Bun 1.4.3 and Cargo were made available on that command's PATH.Reproduction of one full-suite blocker:
The POSIX integration test, its relevant remote-launch/snapshot modules and the test runtime configuration are unchanged from the upstream base. This establishes the environment cause of this reproduced failure; it does not establish the causes of every other full-suite failure. I have not weakened, removed or marked failing tests as skipped to make the checklist green.
Review evidence: Turkish search regression tests, native-menu fallback, paste and platform tests, catalog regression tests, and real Windows E2E cases. The patch adds no runtime dependency, credential, permission, IPC channel or protocol field. Remote/mobile compatibility review is a source review; native macOS/Linux, live SSH and mobile-device execution remain untested.
Review-readiness follow-up — October 21, 2026
The 57 files observed failing in the interrupted full-suite run were rerun to completion on both this PR and the pre-contribution upstream base
ae58ca06d675396ca9e958d144607e2195c6fd95. Both runs returned 1,760 passed, 590 failed, 6 skipped. All 590 failing test identities and all 57 file statuses match; there are zero PR-only failures in this observed set. Complete reproduction method and per-file comparison.A fresh localization/menu/Settings-search/dashboard selection passed: 23 files, 256 tests passed, 1 skipped, zero failed. This is a separate explicitly listed selection from the earlier 258-test run. The published source tree is unchanged; no tests were weakened or skipped to make this result green.
The observed failures therefore do not prevent review of this localization contribution. The full-suite checkbox remains open, and a CI pass still requires maintainer-approved workflows. This comparison is not a full-repository pass and does not classify every base failure as environment-only.
AI Disclosure
OpenAI Codex (GPT-6) substantially assisted with translation, conflict resolution, implementation, review and automated verification. The original contributors' authorship is retained. Further Turkish-language review is welcome.
Review
Agent skill upstream boundary
Notes
Original MIT license and Copyright (c) 2026 Lovecast Inc. remain unchanged.
Author: @trugurpala (GitHub). X/Twitter handle not supplied.
Checklist
pnpm lint,pnpm typecheckandpnpm buildpassed locally; command results and environment setup documented abovepnpm testpasses: observed Windows failures also reproduce on the upstream base; GitHub CI awaits maintainer approval