feat(i18n): add Russian (ru) locale for desktop app - #41677
Conversation
- Add ru.ts with full Russian translation (~850 strings, 29 sections) - Add 'ru' to Locale type in types.ts - Add Russian to LOCALE_OPTIONS and LOCALE_ALIASES in languages.ts - Register ru translation in catalog.ts Covers all UI sections: common, boot, notifications, titlebar, keybinds, language, settings, skills, agents, commandCenter, messaging, profiles, cron, artifacts, sidebar, composer, updates, install, onboarding, modelPicker, modelVisibility, shell, rightSidebar, preview, assistant, prompts, desktop, errors, ui. Related: NousResearch#40347
tonydwb
left a comment
There was a problem hiding this comment.
Code Review Summary
Verdict: Approved
Pure documentation addition, no code changes. Large locale catalog is appropriate for an i18n data file; no security, naming, or correctness concerns.
Reviewed by Hermes Agent
|
Hi! I independently submitted a Russian locale PR (#46634, marked as duplicate of this one). My translation was done on the latest main (commit 6cb88a0, June 14 2026), so it covers new strings added after this PR was opened — particularly in messaging, updates, install, and shell sections. It also has more complete pluralization for Russian (which has 3 plural forms: 1, 2-4, 5+). If it would help, feel free to cherry-pick any missing strings from my ru.ts: Happy to consolidate into this PR if that's preferred. Thanks for the work on this! |
|
Thanks for pushing the Russian Desktop locale work. I audited the current RU Desktop PR cluster and I agree this PR is the right canonical place to consolidate the effort, rather than opening another duplicate PR. I checked this branch against current Verification:
Suggested technical path:
Suggested Russian copy polish before merge:
Happy to help with a native Russian technical editorial pass or provide a focused patch if you or the maintainers want to consolidate the branch here. |
|
@DrMaks22 The missing keys you identified (notifications.native, shell.statusbar, etc.) are all present in my translation (#46634), since it was done against the current main (commit 6cb88a0, June 14 2026) — after those sections were added to en.ts. It also uses defineLocale() throughout, so any future keys added to en.ts will automatically fall back to English without breaking the build. If it helps move things forward, the up-to-date ru.ts is here: Happy to open a fresh PR based on this file if that's easier than rebasing #41677. |
|
Rechecked the current RU Desktop localization cluster and kept this path duplicate-free: instead of opening another upstream PR, I prepared a focused helper patch against this canonical branch: What the helper patch does:
Verification on the helper branch:
If the author/maintainers still want #41677 to remain the canonical focused RU Desktop PR, this helper should be safe to merge into the branch for a stronger native Russian technical pass. |
|
Thanks for the review and the plural-handling patch — good catch on the 11–14 exception. I've refreshed #46634: rebased onto current main, added proper Russian pluralization (shared Since both #41677 and #46634 cover the same ground, it'd be cleanest to land one. #46634 is now fully current against main and test-clean — happy to have it be the canonical RU Desktop PR, or to fold my plural/terminology work into whichever branch the maintainers prefer. Let me know which way you'd like to consolidate. |
|
Thanks, @Anatoly17. I rechecked the refreshed #46634 at Verification on the refreshed branch:
I agree that only one RU Desktop PR should land. Since #46634 is now current-main, That patch only touches user-facing RU copy ( From my side, either consolidation route is fine: land #46634 with that small polish, or fold the same current-main/plural/editorial work back into #41677. The important thing is to keep one focused, test-clean RU Desktop PR rather than adding another duplicate. |
|
Merged your polish patch into #46634 — Anatoly17#1 ( Rechecked on the merged branch:
So #46634 now carries the current-main rebase, the shared plural helper, and your editorial polish — one focused, test-clean RU Desktop PR. Thanks for the review and the collaboration, @DrMaks22. Over to the maintainers on which PR to land — happy for #46634 to be the canonical RU Desktop PR, and equally fine to fold the same commits into #41677 if that's preferred. Either way, one PR. |
teknium1
left a comment
There was a problem hiding this comment.
Thanks for the substantial Russian Desktop translation work. The feature is still needed on current main, but this branch needs reconciliation with the current i18n contract before it can be safely salvaged.
Problems
apps/desktop/src/i18n/ru.ts:5declaresru: Translations, while currentTranslationsrequires keys absent from this branch, includingcommon.expandandcommon.formatJson(apps/desktop/src/i18n/types.ts:73-75) andboot.errors.gatewayConnectionLost(apps/desktop/src/i18n/types.ts:124). The current branch therefore cannot typecheck as-is.- The diff changes no test files. The existing behavior suites in
apps/desktop/src/i18n/languages.test.ts,context.test.tsx, andruntime.test.tsneed Russian alias, persistence, and fallback coverage.
Suggested changes
- Reconcile the locale with current
en.ts/types.tsand usedefineLocale()(apps/desktop/src/i18n/define-locale.ts:39-40) so intentionally untranslated new strings fall back to English. - Add focused behavior tests for
ru,ru-RU, andru_ru, plus persisted language selection and runtime fallback.
Automated hermes-sweeper review.
|
|
||
| import type { Translations } from './types' | ||
|
|
||
| export const ru: Translations = { |
There was a problem hiding this comment.
This complete Translations object is stale against current main: Translations now requires keys such as common.expand, common.formatJson (types.ts:73-75), and boot.errors.gatewayConnectionLost (types.ts:124) that are absent here. Reconcile this file with current en.ts/types.ts; using defineLocale() can preserve English fallback for intentionally untranslated current and future keys.
|
Hi @DrawusMas @DrMaks22 — triage pointed my #66833 here as the canonical RU thread, so sharing some data so we can consolidate on the most complete path rather than run parallel PRs. I maintain a complete Russian locale (timoncool/hermes-ru-locale) and just refreshed it against current
For reference, this branch is currently ~825 keys behind current I'd rather consolidate than keep a duplicate. Happy to do whichever is easiest for you:
No ego on the mechanism — I just want the most complete, current RU to land. 🙂 |
|
Following @timoncool's consolidation proposal above, I did not open another upstream RU Desktop PR. Instead, I prepared a focused helper directly against the complete #66833 branch: The helper folds in the professional Russian editorial work, correct 11-14 plural handling, canonical settings field copy, and behavior tests requested by the sweeper reviews. Its branch has explicit I also validated the complete series on current This gives maintainers a concrete duplicate-free consolidation path: merge the helper into #66833, rebase it onto current main with the one billing key, then select that single complete RU Desktop PR and close the older duplicates. |
|
Consolidation update for the canonical RU thread: the complete current-main candidate is now #72250. It preserves the original Git authorship from the #66833 consolidation path, includes the native editorial/plural/test work discussed here, and is cleanly rebased onto current To avoid further duplicate review, #72250 is intended as the single current RU Desktop merge candidate. The older stale RU branches can be closed once maintainers confirm that direction. |
Summary
Adds full Russian (ru) locale support to the Hermes Desktop app.
Changes
apps/desktop/src/i18n/ru.ts— Complete Russian translation covering ~850 strings across all 29 UI sectionsapps/desktop/src/i18n/types.ts— Added'ru'to theLocaleunion typeapps/desktop/src/i18n/languages.ts— Added Russian toLOCALE_OPTIONS(name: Русский, englishName: Russian) andLOCALE_ALIASES(ru, ru-ru, ru_ru)apps/desktop/src/i18n/catalog.ts— Registeredrutranslation moduleCoverage
All UI sections translated:
Testing
npx tsc --noEmitpasses with no errors.Closes #40347