Skip to content

feat(i18n): add Russian UI language - #34717

Merged
OrcaWin merged 8 commits into
mainfrom
OrcaWin/i18n-lang-ru
Oct 28, 2026
Merged

OrcaWin merged 8 commits into
mainfrom
OrcaWin/i18n-lang-ru

Conversation

@OrcaWin

@OrcaWin OrcaWin commented Oct 28, 2026 •

Copy link
Copy Markdown
Collaborator
Files Added Deleted Net
Test 6 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​78 $\color{#cf222e}{\Huge{\mathbf{−}}}$​3 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​75
Prod 20 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​20860 $\color{#cf222e}{\Huge{\mathbf{−}}}$​53 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​20807

Adds Russian (ru) as a built-in UI language, using the community catalog from #33370 by @gentslava.

Supersedes #33370. Also covers the request in #16736.

What changed

  • Registration (mirrors fr/pt): UI_LANGUAGE_RUSSIAN in src/shared/ui-language.ts; ru in SUPPORTED_UI_LOCALES and resolveUiLocale (src/shared/ui-locale.ts); the picker choice and native fallback label Русский (supported-languages.ts); the renderer lazy catalog URL (i18n.ts); the main-process lazy loader (main-i18n.ts); Appearance search keywords (Русский, Язык); and settings.appearance.language.russian in all 8 catalogs.
  • Catalog: ru.json comes from feat(i18n): add complete Russian UI locale and contextual plural grammar #33370, checked against the current en.json:
  • Verifier: verify-localization-catalog.mjs now accepts _few/_many (and other CLDR forms the locale actually uses) as long as English has a matching _other. It checks their placeholders against that _other. There is a test for this.
  • Docs: the settings.mdx language list now includes Russian, and config/i18n-russian.md is the Russian style and workflow guide. It is trimmed to the tooling that exists on main.
  • apply-translation-delta.mjs accepts ru.

Not carried over from #33370

#33370 also rewrote about 60 source files for whole-sentence English grammar and plural handling, and added large source-grammar and daily-flow test fixtures. Most of those files now conflict with main (25 files), and #34693, now merged (translate() resolves _one/_other through CLDR), covers the plural mechanism. This PR does not change plural resolution. Those source-copy fixes can come back as separate, focused PRs.

Remaining

650 English keys plus 50 Russian-only plural forms (_few/_many) still have no translation and fall back to English. They will be filled in a follow-up.

Mobile has no i18n, so nothing changes there. Plugin language packs use synthetic resource ids, so a ru-RU pack does not collide with the built-in ru. Older clients and servers normalize an unknown ru setting to system, the same way they handle fr and pt.

Co-authored-by: Vyacheslav Scherbinin gentslava@mail.ru

Register `ru` as a built-in UI language using the catalog from #33370,
reconciled against current en.json: keys pruned from English were dropped,
stale translations whose English source changed were removed, and the
catalog verifier now accepts CLDR few/many forms for an existing `_other`
family.

Co-authored-by: Vyacheslav Scherbinin <gentslava@mail.ru>
@OrcaWin
OrcaWin requested a review from brennanb2025 as a code owner October 28, 2026 04:18
Main now interpolates the count in English _one strings (#34693), so the
literal-1 Russian forms no longer match their source.
@coderabbitai

coderabbitai Bot commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 11 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used all 10 included reviews currently available.

Learn how review limits work.

Review configuration:

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 5581c59e-29a0-4fea-bee8-137b29819d42
Commits

Reviewing files that changed from the base of the PR and between 5a42f03 and 92d5297.

Files selected for processing: 26
  • config/i18n-russian.md
  • config/scripts/apply-translation-delta.mjs
  • config/scripts/verify-localization-catalog.mjs
  • config/scripts/verify-localization-catalog.test.mjs
  • docs/site/content/docs/settings.mdx
  • src/main/i18n/main-i18n-lazy-locale.test.ts
  • src/main/i18n/main-i18n.ts
  • src/renderer/src/components/onboarding/OnboardingLanguageSwitcher.test.tsx
  • src/renderer/src/components/settings/appearance-search.ts
  • src/renderer/src/i18n/i18n.ts
  • src/renderer/src/i18n/lazy-locale.test.ts
  • src/renderer/src/i18n/locales/en.json
  • src/renderer/src/i18n/locales/es.json
  • src/renderer/src/i18n/locales/fr.json
  • src/renderer/src/i18n/locales/ja.json
  • src/renderer/src/i18n/locales/ko.json
  • src/renderer/src/i18n/locales/pt.json
  • src/renderer/src/i18n/locales/ru.json
  • src/renderer/src/i18n/locales/zh-Hant.json
  • src/renderer/src/i18n/locales/zh.json
  • src/renderer/src/i18n/supported-languages.ts
  • src/shared/i18n-plural-family.ts
  • src/shared/ui-language.test.ts
  • src/shared/ui-language.ts
  • src/shared/ui-locale.test.ts
  • src/shared/ui-locale.ts

No actionable comments were generated in the recent review.

Recent review info
Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 012e513b-442a-4ed3-b65a-9dff72864270
Commits

Reviewing files that changed from the base of the PR and between 24a1f3c and 5a42f03.

Files selected for processing: 6
  • config/scripts/apply-translation-delta.mjs
  • src/main/i18n/main-i18n-lazy-locale.test.ts
  • src/main/i18n/main-i18n.ts
  • src/renderer/src/i18n/i18n.ts
  • src/renderer/src/i18n/locales/ru.json
  • src/shared/i18n-plural-family.ts
Files skipped from review as they are similar to previous changes: 1
  • src/renderer/src/i18n/locales/ru.json

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 0 remain after this review.

Walkthrough

Russian is added as a built-in UI language and supported locale. The main and renderer localization paths include the Russian catalog, and language choices, labels, and search terms include Russian. Tests cover locale detection, language selection, and Russian translations. Catalog parity validation now accepts supported locale-specific plural forms when the corresponding English plural family exists and checks interpolation variables against the resolved English key.

Priority: Normal

Merge Risk: Low · previous review 5a42f

The current catalog is unaffected, but future translation updates could produce blank text despite the documented validation. This is mergeable with follow-up.

Pre-merge checks: Passed 3 · Failed 2

Failed Failed checks: 2 warnings

Check name Status Explanation Resolution
Description check Warning The description explains the implementation in detail, but it omits most required template sections, including ELI5, Why, Visual Proof or an N/A explanation, Testing checkboxes and steps, AI Disclosur… Complete the required template sections. Add a plain-language ELI5 summary, explain why this approach was selected, provide before-and-after visual proof or state N/A with a reason, document testing and platforms, complete the AI Disclosure…
Docstring Coverage Warning Docstring coverage is 33.33% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff with cyclomatic complexity of at least 2. Documenta… Write docstrings for the functions missing them to satisfy the coverage threshold.
Passed Passed checks: 3 passed
Check name Status Explanation
Title check Passed The title clearly and concisely identifies the primary change: adding Russian as a built-in UI language.
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Full details: Description check

Explanation

The description explains the implementation in detail, but it omits most required template sections, including ELI5, Why, Visual Proof or an N/A explanation, Testing checkboxes and steps, AI Disclosure, Review, Agent skill upstream boundary, Notes, and Checklist.

Resolution

Complete the required template sections. Add a plain-language ELI5 summary, explain why this approach was selected, provide before-and-after visual proof or state N/A with a reason, document testing and platforms, complete the AI Disclosure section when applicable, address review and upstream-boundary sections, add compatibility notes, and complete the checklist.

Full details: Docstring Coverage

Explanation

Docstring coverage is 33.33% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff with cyclomatic complexity of at least 2. Documentation-only edits and deletions within surviving functions are included; unchanged diff context and fully deleted functions are excluded. Analyzed 6 functions across 5 files. (1 skipped: 1 unsupported.)

Resolution

Write docstrings for the functions missing them to satisfy the coverage threshold.

Finishing Touches: 💡 2
📝 Generate docstrings: 💡
  • Commit to this branch
  • Create a new PR
⚔️ Resolve merge conflicts: 💡
  • Resolve merge conflict in branch OrcaWin/i18n-lang-ru
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to GitHub limitations.

⚠️ Outside diff range comments (1)

Minor · Accept Russian-only plural forms in translation deltas. · apply-translation-delta.mjs:60

config/scripts/apply-translation-delta.mjs:60
🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

Accept Russian-only plural forms in translation deltas.

getEn requires an exact English key. A valid images_few entry therefore fails when English has only images_one and images_other, even though the verifier accepts it. The PR reports 50 missing Russian-only forms. Resolve these entries against the English _other key using the same locale-category rules as the verifier.


Review info
Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 589893cf-7b7b-4599-9ff6-f9e28a9532d4
Commits

Reviewing files that changed from the base of the PR and between b413170 and 4da50e2.

Files selected for processing: 24
  • config/i18n-russian.md
  • config/scripts/apply-translation-delta.mjs
  • config/scripts/verify-localization-catalog.mjs
  • config/scripts/verify-localization-catalog.test.mjs
  • docs/site/content/docs/settings.mdx
  • src/main/i18n/main-i18n-lazy-locale.test.ts
  • src/main/i18n/main-i18n.ts
  • src/renderer/src/components/onboarding/OnboardingLanguageSwitcher.test.tsx
  • src/renderer/src/components/settings/appearance-search.ts
  • src/renderer/src/i18n/i18n.ts
  • src/renderer/src/i18n/lazy-locale.test.ts
  • src/renderer/src/i18n/locales/en.json
  • src/renderer/src/i18n/locales/es.json
  • src/renderer/src/i18n/locales/fr.json
  • src/renderer/src/i18n/locales/ja.json
  • src/renderer/src/i18n/locales/ko.json
  • src/renderer/src/i18n/locales/pt.json
  • src/renderer/src/i18n/locales/ru.json
  • src/renderer/src/i18n/locales/zh.json
  • src/renderer/src/i18n/supported-languages.ts
  • src/shared/ui-language.test.ts
  • src/shared/ui-language.ts
  • src/shared/ui-locale.test.ts
  • src/shared/ui-locale.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 2 remain after this review.

Comment thread config/i18n-russian.md

## Translation workflow

Keep inline English defaults and `en.json` synchronized with the current source. Run `pnpm run sync:localization-catalog` to add missing literal defaults and `pnpm run sync:localization-runtime-catalog` to regenerate the English boot subset. Apply reviewed translations with `node config/scripts/apply-translation-delta.mjs <delta.json>`, which rejects empty values and changed placeholders.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor · Functional Correctness · Quick win

Reject empty values before claiming the script rejects them.

The script accepts an empty value when the English entry has no placeholders. For example, browser.loadFailure.blockedDescription is missing from ru.json and has no placeholders. An empty delta for it can be written to the catalog, and the renderer treats it as a valid translation instead of falling back to English. Add an empty-value check to the script. (raw.githubusercontent.com)

Translate the 650 remaining English keys and the few/many plural forms for
every count family, and document the Russian glossary and style conventions.
Fix mistranslations and grammar flagged in a full-catalog review, and align
terminology with the glossary: рабочее дерево for worktree, рабочее
пространство for workspace, пул-реквест and файлы cookie.
@OrcaWin

OrcaWin commented Oct 28, 2026

Copy link
Copy Markdown
Collaborator Author

Maintainer edits on top of the Russian locale:

  • Catalog completed: translated the 650 remaining English keys and added the _few/_many forms for every count family. ru.json now covers 16,277 of 16,277 English keys.
  • Glossary: added a 70-term glossary and style conventions to config/i18n-russian.md: «вы», infinitive buttons, sentence case, «ёлочки», ё. It covers рабочее пространство, рабочее дерево, ветка, коммит, пул-реквест and similar terms.
  • Full-catalog review: every Russian entry got a machine-assisted translation review, and each corrected string was checked against the English source. 207 entries were corrected: 131 fixed wrong meanings (for example "Open" had been translated as the state «Открыта», and some strings described the wrong subject or a different feature), and 76 fixed grammar or terminology.
  • Terminology consistency: 189 strings now use the glossary terms. «рабочая копия» became «рабочее дерево» for worktree and «рабочая область» became «рабочее пространство» for workspace, with gender agreement fixed. «Pull request» became «пул-реквест» and «cookies» became «файлы cookie». "Checkout" keeps «рабочая копия».
  • Merged the latest main.

Validation: verify:localization-catalogs, verify:localization-extraction, verify:localization-coverage, verify:localization-runtime-catalog, tc:web, tc:node and the targeted i18n, settings and onboarding tests (22 files, 181 tests) all pass.

…lign ru terminology

translateMain now resolves literal _one/_other keys through the CLDR plural
family like translate(), so native dialogs pick Russian few/many forms. The
plural helpers move to src/shared for reuse. apply-translation-delta accepts
locale-only plural categories sourced from English _other. ru.json follows the
glossary for account/session/prompt and uses a single ellipsis character.
# Conflicts:
#	docs/site/content/docs/settings.mdx
#	src/main/i18n/main-i18n.ts
#	src/renderer/src/components/onboarding/OnboardingLanguageSwitcher.test.tsx
#	src/renderer/src/i18n/i18n.ts
#	src/renderer/src/i18n/lazy-locale.test.ts
#	src/shared/ui-locale.test.ts
#	src/shared/ui-locale.ts
@OrcaWin
OrcaWin merged commit 52a43ed into main Oct 28, 2026
55 checks passed
tomarai85 added a commit to tomarai85/orca that referenced this pull request Oct 28, 2026
Drop TabGroupDropOverlay.paneColumnLabel from the ru, tr and zh-Hant
catalogs main added (stablyai#29795, stablyai#34717, stablyai#34718). This PR removes the
string and its seven other translations, and the catalog check fails
on a key that en.json no longer has.
smwbev added a commit to smwbev/orca-russian that referenced this pull request Oct 29, 2026
Orca v1.4.244 ships Russian built in (stablyai/orca#34717), so this is
the pack's last release. Both READMEs now say so and point to
Settings → Appearance → Language → Русский.

v1.4.244 is cut from main after #35365, so 908 strings from the
twenty-four drafts that waited for it are released, with 142 plural
forms: the rest of the source control dropdown, WSL projects moving to
their host, Linear and Jira errors, SSH, workspace and host status, the
Google cookie cleanup, editor conflicts, and more. 36 strings follow
rewritten English. 89 strings and 54 plural forms leave the pack because
v1.4.244 removed them, among them the forms that #34693 made
unreachable.

stablyai/orca#22056 removed the catalog keys no code read, so
tools/unread-catalog-keys.json is empty. Plural forms render since
v1.4.243 (#12505); the READMEs, the glossary and the tools now say so.

Pack 16,476 plus 331 plural forms, 18,958 entries; coverage of the
strings Orca reads that a pack may translate is 99.9%.
smwbev added a commit to smwbev/orca-plugins that referenced this pull request Oct 29, 2026
Orca 1.4.244 ships Russian built in (stablyai/orca#34717), so the pack is no longer maintained. The entry stays so that installed copies get the last release and its notice.
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.

1 participant