Repository navigation
feat(i18n): add Russian UI language - #34717
Conversation
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>
Main now interpolates the count in English _one strings (#34693), so the literal-1 Russian forms no longer match their source.
|
Warning Review limit reachedYou'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. View limit details
No actionable comments were generated in the recent review.
|
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to GitHub limitations.

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 winAccept Russian-only plural forms in translation deltas.
getEnrequires an exact English key. A validimages_fewentry therefore fails when English has onlyimages_oneandimages_other, even though the verifier accepts it. The PR reports 50 missing Russian-only forms. Resolve these entries against the English_otherkey 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
Files selected for processing: 24-
config/i18n-russian.mdconfig/scripts/apply-translation-delta.mjsconfig/scripts/verify-localization-catalog.mjsconfig/scripts/verify-localization-catalog.test.mjsdocs/site/content/docs/settings.mdxsrc/main/i18n/main-i18n-lazy-locale.test.tssrc/main/i18n/main-i18n.tssrc/renderer/src/components/onboarding/OnboardingLanguageSwitcher.test.tsxsrc/renderer/src/components/settings/appearance-search.tssrc/renderer/src/i18n/i18n.tssrc/renderer/src/i18n/lazy-locale.test.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/pt.jsonsrc/renderer/src/i18n/locales/ru.jsonsrc/renderer/src/i18n/locales/zh.jsonsrc/renderer/src/i18n/supported-languages.tssrc/shared/ui-language.test.tssrc/shared/ui-language.tssrc/shared/ui-locale.test.tssrc/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.
-
|
|
||
| ## 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. |
There was a problem hiding this comment.
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.
|
Maintainer edits on top of the Russian locale:
Validation: |
…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
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.
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%.
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.
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
UI_LANGUAGE_RUSSIANinsrc/shared/ui-language.ts;ruinSUPPORTED_UI_LOCALESandresolveUiLocale(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 (Русский,Язык); andsettings.appearance.language.russianin all 8 catalogs.ru.jsoncomes from feat(i18n): add complete Russian UI locale and contextual plural grammar #33370, checked against the currenten.json:_oneforms that hard-coded "1", which English now interpolates since fix(i18n): resolve count strings with each language's plural rules #34693._few/_manyforms are kept for every English_one/_otherfamily.verify-localization-catalog.mjsnow 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.settings.mdxlanguage list now includes Russian, andconfig/i18n-russian.mdis the Russian style and workflow guide. It is trimmed to the tooling that exists on main.apply-translation-delta.mjsacceptsru.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/_otherthrough 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-RUpack does not collide with the built-inru. Older clients and servers normalize an unknownrusetting tosystem, the same way they handle fr and pt.Co-authored-by: Vyacheslav Scherbinin gentslava@mail.ru