Skip to content

feat(i18n): add complete Russian desktop locale - #72250

Open
DrMaks22 wants to merge 12 commits into
NousResearch:mainfrom
DrMaks22:codex/ru-desktop-canonical
Open

feat(i18n): add complete Russian desktop locale#72250
DrMaks22 wants to merge 12 commits into
NousResearch:mainfrom
DrMaks22:codex/ru-desktop-canonical

Conversation

@DrMaks22

Copy link
Copy Markdown

Summary

  • consolidate the complete Russian Desktop locale from feat(i18n): add Russian (ru) desktop locale #66833 onto current main, preserving the original Git authorship
  • provide a professional native Russian editorial pass across the full Desktop catalog
  • keep all current English catalog entries explicitly covered (2526/2526 leaf entries), with a parity regression test
  • use correct Russian plural rules, including the 11–14 and 111–114 exceptions
  • register ru, ru-RU, and ru_ru, and cover locale selection, persistence, runtime lookup, fallback, settings field copy, and tool-title behavior

Scope

This is a focused RU Desktop PR: 9 files under apps/desktop/src/i18n/ and the adjacent Russian settings field-copy catalog. It does not mix in generic hard-coded-surface wiring, runtime, CLI, docs, or unrelated application changes.

The branch is the current-main continuation of #66833 rather than a separate translation effort. Commits by @timoncool and @Anatoly17 retain their original authorship, followed by the Russian editorial and validation commits from @DrMaks22.

Translation quality

  • user-facing prompt is consistently rendered as запрос; architectural uses remain technical where appropriate
  • system prompt, checkpoint, terminal backend, skill, raw data, and related terms follow the shared Russian product glossary
  • commands, environment variables, paths, provider/model IDs, product names, and API identifiers remain unchanged
  • three independent editorial/accuracy passes found no P0 issues; all identified P1 wording, behavior, and plural issues were resolved
  • settings field copy is complete: 97/97 labels and 41/41 descriptions

Validation

  • npm run typecheck --workspace apps/desktop
  • npm run lint --workspace apps/desktop (0 errors)
  • targeted i18n suite: 5 files / 47 tests passed
  • full UI suite: 278 files / 2371 tests passed / 1 skipped
  • Electron suite: 65 files / 744 tests passed / 2 skipped
  • npm run build --workspace apps/desktop
  • git diff --check

The full UI suite was run serially with a temporary Node local-storage file because Node 26 otherwise exposes an environment-level localStorage race across Vitest workers:

NODE_OPTIONS=--localstorage-file=/private/tmp/hermes-vitest-localstorage-final \
  npm run test:ui --workspace apps/desktop -- --maxWorkers=1

Once this lands, the stale RU-only candidates can be closed in favor of this current, complete branch. If the generic multi-language wiring from another PR is selected separately, this catalog should remain the Russian source so Desktop does not regress to a partial or mechanically generated translation.

@DrMaks22

Copy link
Copy Markdown
Author

@teknium1 @alt-glitch, when bandwidth allows, could you review #72250 as the consolidated current-main RU Desktop candidate?

It directly resolves the prior sweeper findings from the RU PR cluster: complete visible coverage, correct 11–14 plural handling, behavior tests, current-main reconciliation, and a native technical editorial pass. The PR is focused, mergeable, build-clean, and the full Desktop UI/Electron suites pass.

If the locale-neutral wiring from #71573 is preferred first, this PR can still remain the canonical reviewed Russian catalog and receive only the newly landed keys afterward. Otherwise, #72250 is ready to merge as-is.

@alt-glitch alt-glitch added type/feature New feature or request P3 Low — cosmetic, nice to have comp/desktop Electron desktop app (apps/desktop/*) area/i18n Localization, locales, translations sweeper:risk-compatibility Sweeper risk: may break existing users, config, migrations, defaults, or upgrades needs-decision Awaiting maintainer decision before any implementation labels Jul 26, 2026
@DrMaks22
DrMaks22 force-pushed the codex/ru-desktop-canonical branch from f1831af to 1271e7c Compare July 27, 2026 09:16
@DrMaks22

Copy link
Copy Markdown
Author

Current-main refresh completed.

I rebased the existing contributor-preserving series onto main@d71033a40 and translated every newly added Desktop key: find-in-page, Quick Entry, artifact cards/viewer, goal states, and status-bar customization. Russian plural behavior for artifact line/version counts now has explicit 11–14 regression coverage.

Final validation on head 1271e7c42:

  • exact runtime leaf parity: 2707/2707 (en / ru);
  • Desktop typecheck passed;
  • targeted i18n: 5 files / 47 tests passed;
  • full UI: 297 files / 2547 passed / 1 skipped;
  • Electron: 68 passed / 1 skipped, 794 tests passed / 2 skipped;
  • production build passed;
  • ESLint: 0 errors (existing current-main warnings only);
  • Prettier and git diff --check passed.

The full UI run used Node 26's --no-experimental-webstorage flag so Node's experimental global storage does not mask jsdom's localStorage; the targeted i18n suite passes without that environment workaround. The PR remains focused on the same 9 RU/i18n files and is ready for maintainer review.

@DrMaks22
DrMaks22 force-pushed the codex/ru-desktop-canonical branch from 1271e7c to 2b7aa37 Compare July 28, 2026 11:21
@DrMaks22

Copy link
Copy Markdown
Author

Synced this canonical Russian Desktop PR onto current main (1dfe781edd) after the upstream Desktop i18n schema and copy changed.

What changed:

  • reconciled renamed and removed catalog fields, including the artifactPaneartifactPreview transition;
  • added professional Russian copy for the new status-bar keybind, synthetic Home project, status-bar hide action, and completed-thinking states;
  • mirrored the intentional empty native completion-notification body and the latest concise Desktop settings/status copy;
  • completed independent bilingual-accuracy and native-Russian editorial reviews, then applied all concrete P2/P3 wording findings. No P0/P1 issues remain.

Validation on the final branch:

  • runtime locale leaf parity: 2713 / 2713, with no missing or extra RU paths;
  • npm run typecheck --workspace apps/desktop — passed;
  • targeted i18n suite — 5 files / 47 tests passed;
  • full UI suite — 322 files / 2807 tests passed;
  • Electron suite — 72 passed, 1 skipped files / 833 passed, 2 skipped tests;
  • full Desktop ESLint — 0 errors (68 existing upstream warnings);
  • production Desktop build — passed;
  • Russian quality lint — 0 findings in apps/desktop/src/i18n/ru.ts;
  • git diff --check — clean.

The PR remains focused on the existing RU Desktop i18n surface. Maintainer review and merge would be welcome.

Copy link
Copy Markdown
Author

Current-main catalog refresh completed.

I rebased the consolidated RU Desktop series onto main@c55159f185 and added all 42 Desktop catalog entries introduced since the previous review, covering message reactions, project commands, wake-word state, messaging pairing/access management, attachment-size settings, backend selection, terminal actions, and memory-write status.

Quality work:

  • exact runtime leaf parity: 2755 / 2755 (en / ru);
  • two independent technical/native-Russian reviews completed and reconciled;
  • commands, paths, IDs, numbers, and interpolation placeholders preserved;
  • added explicit pairing-request plural/accessibility regression checks for 1 / 2 / 11 / 21.

Validation:

  • Desktop typecheck passed;
  • targeted i18n suite: 5 files / 47 tests passed;
  • full UI suite: 344 files / 3082 tests passed;
  • Electron suite: 74 passed, 1 skipped files / 867 passed, 2 skipped tests;
  • Desktop ESLint: 0 errors (63 existing current-main warnings);
  • production Desktop build passed;
  • Prettier and git diff --check passed;
  • Russian quality lint: 0 findings in the two changed RU/i18n files.

Two TUI-only commits landed while validation was running; after the final rebase, I reran Desktop typecheck and the targeted i18n suite successfully. The PR remains limited to the same 9 RU/i18n files and is mergeable.

@anatolijlaptev1991-ctrl

Copy link
Copy Markdown

Thank you for the excellent native-reviewed translation — we used your catalog as the primary reference for the hermes-ru npm package (v1.2.0).

What we did: compared both catalogs key-by-key (yours: 2375 keys, ours: 2291), took the best variant from each, and applied ё-fidelity corrections on top of your baseline (e.g. «подключён» instead of «подключен» in masculine short participles — ё is mandatory there per Russian orthography rules).

Full attribution is in the package: README co-authorship section and a header comment in ru.ts crediting your catalog as the base.

Also: I've starred your repos (codex-ios-swiftui-kit, doc_parser) ⭐ — would appreciate a star back on hermes-ru if you find the package useful!


Спасибо за отличный перевод — мы взяли ваш каталог как основу для npm-пакета hermes-ru (v1.2.0).

Что сделали: поэлементно сравнили оба перевода (ваш: 2375 ключей, наш: 2291), выбрали лучший вариант для каждого ключа и поверх вашей базы применили ё-корректуру (например, «подключён» вместо «подключен» в кратких причастиях мужского рода — там «ё» обязательна по правилам).

Полное указание авторства — в README пакета и в комментарии-заголовке ru.ts.

Также: я поставил ⭐ вашим репозиториям. Буду благодарен за звёздочку на hermes-ru в ответ!

@DrMaks22
DrMaks22 force-pushed the codex/ru-desktop-canonical branch from cc25c24 to a702171 Compare July 30, 2026 09:00
@DrMaks22

Copy link
Copy Markdown
Author

Thanks for flagging the remaining ё orthography issue. I audited the canonical current-main catalog directly rather than bulk-importing the external package and found three occurrences of Шлюз Hermes не подключен. All three are now corrected to Шлюз Hermes не подключён on head a70217195a, rebased onto main@dd241cf0cd.

Validation after the rebase:

  • Desktop typecheck passed;
  • targeted i18n suite: 5 files / 47 tests passed;
  • Prettier and git diff --check passed.

I appreciate the attribution. For this upstream PR, #72250 remains the reviewed source of truth at exact 2755/2755 current-main leaf parity; external package variants will be evaluated individually rather than imported wholesale.

anatolijlaptev1991-ctrl added a commit to anatolijlaptev1991-ctrl/hermes-agent that referenced this pull request Jul 30, 2026
…00% coverage

Russian locale catalog merged from two independent native-speaker sources:
- DrMaks22's hand-reviewed catalog (PR NousResearch#72250) as the primary base
- anatolijlaptev1991-ctrl's catalog with additional keys + ё-fidelity corrections

Changes:
- i18n/ru.ts: full Russian translation (defineLocale + defineFieldCopy,
  same architecture as ja.ts/ar.ts)
- i18n/types.ts: add 'ru' to Locale union type
- i18n/catalog.ts: register ru in TRANSLATIONS
- i18n/languages.ts: add 'Русский' to LOCALE_OPTIONS + locale aliases
  (ru, ru-RU, ru_ru, russian, Русский, русский)
- i18n/languages.test.ts: test cases for ru normalization

Coverage: 2755/2755 en.ts leaf keys (100%).
Locale-neutral i18n-wiring for hardcoded surfaces (MoA/Billing/Endpoints)
is tracked separately in PR NousResearch#74691.
@DrMaks22
DrMaks22 force-pushed the codex/ru-desktop-canonical branch from a702171 to 7d25624 Compare July 30, 2026 10:33
timoncool and others added 7 commits July 30, 2026 13:33
Add behavior-based coverage for the Russian locale without pinning exact
Russian wording:
- normalizeLocale / isLocale / isSupportedLocaleValue / localeConfigValue
  for `ru` and the `ru-RU` and `ru_ru` aliases
- I18nProvider restores a persisted Russian locale from display.language
  and saves the selected Russian locale back to config
- runtime translator resolves the active Russian locale and falls back to
  English when a Russian key cannot be resolved

Test-only change; no production code, ru.ts, or other translations touched.
@DrMaks22
DrMaks22 force-pushed the codex/ru-desktop-canonical branch from 7d25624 to 82fab96 Compare July 30, 2026 10:34
@DrMaks22

Copy link
Copy Markdown
Author

Current-main schema refresh completed on main@d8a9c17dae.

The latest Desktop changes altered several action-label contracts and the changed-files surface. I reconciled the Russian catalog by:

  • updating MCP, toolset, pet, webhook, project, and sidebar labels to express the requested target state instead of the ambiguous «Переключить»;
  • removing six retired zone-direction entries;
  • adding native Russian changed-files/review copy with explicit 1 / 2 / 11 / 21 plural coverage.

Validation on head 82fab96e92:

  • exact leaf parity: 2751 / 2751 (en / ru);
  • Desktop typecheck passed;
  • targeted i18n suite: 5 files / 47 tests passed;
  • full UI suite: 350 files / 3118 tests passed;
  • Desktop ESLint: 0 errors (69 current-main warnings);
  • production build passed;
  • Prettier and git diff --check passed.

The final TUI-only upstream commit landed after the full run; after the final rebase I reran Desktop typecheck and the targeted i18n suite successfully.

@anatolijlaptev1991-ctrl

Copy link
Copy Markdown

Closing #71573 — your catalog (#72250) is the stronger candidate and our ё-fidelity corrections are already incorporated there. Clean path forward.

Happy to help if any issues come up with the Russian locale going forward — whether it's reviewing new keys, testing on Windows, or anything else. Just ping me here or on the hermes-ru repo.

Wishing the PR a smooth merge 🚀

@teknium1

Copy link
Copy Markdown
Contributor

Thank you for the complete Russian Desktop locale contribution. Current main has no ru catalog entry (apps/desktop/src/i18n/catalog.ts:8-14), no Russian picker/alias support (apps/desktop/src/i18n/languages.ts:7-103), and no ru member in Locale (apps/desktop/src/i18n/types.ts:8).

The implementation follows the existing locale mechanism: defineLocale() merges typed overrides over English fallback (apps/desktop/src/i18n/define-locale.ts:39-40), while the PR registers the locale, provides Russian field copy, and adds alias, persistence, fallback, catalog-parity, and plural-form coverage. GitHub currently reports head 82fab96e927ca1ea753cf3eadc231ac2c996fa12 as mergeable.

Automated hermes-sweeper review.

@teknium1 teknium1 added the sweeper:blast-moderate Sweeper blast radius: moderate — a subsystem or single platform label Jul 30, 2026
@alt-glitch alt-glitch removed the needs-decision Awaiting maintainer decision before any implementation label Aug 1, 2026
iaendi pushed a commit to iaendi/hermes-agent that referenced this pull request Aug 3, 2026
… parallel store

P1: sync-locales.py — missing keys are now informational (fallback to en),
     exit 0 on partial catalogs instead of exit 1
P2: locales.test.ts — accept partial catalogs as valid; extra-key check
     remains but missing keys are expected
P3: Remove store/i18n.tsx, store/use-locale-sync.ts, store/i18n.test.ts —
     dead code not imported by any consumer; all store files correctly
     use @/i18n (upstream I18nProvider)
P4: Drop Russian locale (ru.json, ru.ts, KNOWN_LOCALES entry) —
     NousResearch#72250 is the complete Russian candidate; removing to avoid
     5% coverage regression on merge
@lifeFedorovAlexey

Copy link
Copy Markdown

I tested this PR against the current upstream/main and found catalog drift from the 1,276 upstream commits added since its base. The merge itself is conflict-free, but the current branch is missing 28 new translation keys and still contains four removed preview keys.

I prepared a focused refresh commit that:

  • translates all 28 current catalog additions;
  • removes the four obsolete preview.close* entries;
  • adds Russian plural coverage for zones.tabCount (1/2/5/21);
  • preserves the original PR and authorship — this is only a follow-up refresh commit.

Commit: lifeFedorovAlexey@e4973d5db

After rebasing or merging this PR onto current upstream/main, you can apply it with:

git fetch https://github.com/lifeFedorovAlexey/hermes-agent.git fix/pr-72250-russian-refresh
git cherry-pick e4973d5db

Verified on Windows against current main:

  • RED: the new plural assertion returned 1 tabs before the override was added;
  • GREEN: 46/46 targeted i18n UI tests pass;
  • Desktop TypeScript typecheck passes;
  • Desktop ESLint passes;
  • git diff --check passes.

The refresh changes only apps/desktop/src/i18n/ru.ts and ru.test.ts.

@londo161

londo161 commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

I prepared a focused native/macOS follow-up for this canonical Russian Desktop locale:

The native commit is 8182d76f8e964238931ae4ee07a02a8d093f0561 and can be merged or cherry-picked into this branch if useful.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/i18n Localization, locales, translations comp/desktop Electron desktop app (apps/desktop/*) P3 Low — cosmetic, nice to have sweeper:blast-moderate Sweeper blast radius: moderate — a subsystem or single platform sweeper:risk-compatibility Sweeper risk: may break existing users, config, migrations, defaults, or upgrades type/feature New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants