feat: add full Russian (ru-RU) localization - #605
Conversation
…8n.js only The locale translation belongs in static/i18n.js (ru: block) — that is correct and untouched. Source files must stay in English so they work for all users regardless of locale setting. Files reverted to English originals: - static/boot.js: workspace panel titles, composer placeholder, profile label - static/sessions.js: Cyrillic variable names (startOfСегодня→startOfToday, startOfВчера→startOfYesterday), all hardcoded Russian strings in session actions, project picker, toast messages - static/ui.js: context window labels, update banner, model chip fallback, refresh/update strings - static/messages.js: context strings sent to agent (Workspace:, Model:, Files:) - static/panels.js: error message - static/index.html: restored to master — all Russian title/placeholder/label attributes reverted to English; Russian language option added correctly via the i18n.js _label field (no HTML change needed); legitimate data-i18n attribute additions preserved Test fixes: - tests/test_sprint9.py: update /static/ → static/ assertions (relative paths from PR #588 subpath mount support) - tests/test_onboarding_static.py: same relative path fix - tests/test_russian_locale.py: fix login_title assertion to match actual translation in i18n.js (Вход not Войти)
Independent End-to-End Review — PR #605First-pass review (no prior reviewer comments). TL;DRCode looks clean, tests pass — but the branch needs a rebase to resolve conflicts in 3 files before it can merge. Tagged Code overviewSubstantial localization PR — adds a full Russian (ru-RU) locale to
Review observationsStrengths:
Coordination concerns (3 file conflicts with current master):
These should be straightforward to resolve — the PR adds a new language entry to Tests ✅
Security audit ✅Pure data addition to a JS object. No new endpoints, no user input handling, no XSS surface. The translation strings render through the existing RecommendationHold for rebase, then merge. The
Happy to push a rebase commit if you want me to take a stab at it — let me know if that's helpful or if you'd rather coordinate with the other in-flight PRs first. |
|
Thank you for the detailed review. Understood regarding the 3 conflicting files. Since the PR is currently on hold and there are overlapping changes in master, I will wait for the coordination window to clear before doing a clean rebase. I can rebase and push an updated branch once the related work lands, or earlier if you prefer. |
Second-pass Independent Review — PR #605Thank you @DrMaks22 for the original Russian localization work, and thanks for the iteration cleaning up hardcoded strings. This is a substantial contribution — covering the translatable surface in one PR is a lot of painstaking work, and it's appreciated. VerdictApproved on content. Still blocked on rebase. Translation quality and i18n plumbing are solid — only outstanding item is the stale branch against current master (now at v0.50.90). What's goodTranslation quality (structural read):
Pluralization done right:
Locale registration — fully data-driven:
Test infrastructure upgrades are a nice lift:
Source-file cleanliness:
Security audit ✅
Tests ✅
Still blocked — rebase conflictsTried a rebase locally against current
I did not push a rebase — given the back-and-forth above about waiting for the coordination window, and that this is tagged Next steps
Thank you again @DrMaks22 — once the rebase lands, Russian-speaking users will have a fully localized WebUI. Excellent work. |
Full Russian locale — 389/389 English keys, Slavic plural forms, native Cyrillic. Rebased from PR #605 with rebase artifacts fixed. Login page Russian added to api/routes.py. Credits: @DrMaks22 (translation), @renheqiang (PR #605 author). Co-authored-by: DrMaks22 <DrMaks22@users.noreply.github.com> Co-authored-by: renheqiang <renheqiang@users.noreply.github.com>
Full Russian locale — 389/389 English keys, Slavic plural forms, native Cyrillic. Rebased from PR nesquena#605 with rebase artifacts fixed. Login page Russian added to api/routes.py. Credits: @DrMaks22 (translation), @renheqiang (PR nesquena#605 author). Co-authored-by: DrMaks22 <DrMaks22@users.noreply.github.com> Co-authored-by: renheqiang <renheqiang@users.noreply.github.com>
Full Russian locale — 389/389 English keys, Slavic plural forms, native Cyrillic. Rebased from PR nesquena#605 with rebase artifacts fixed. Login page Russian added to api/routes.py. Credits: @DrMaks22 (translation), @renheqiang (PR nesquena#605 author). Co-authored-by: DrMaks22 <DrMaks22@users.noreply.github.com> Co-authored-by: renheqiang <renheqiang@users.noreply.github.com>
Full Russian (ru-RU) localization for Hermes WebUI.
All credit to @DrMaks22 for the original implementation — this PR contains their complete Russian locale work with fixes applied to keep source files in English.
What's included
static/i18n.js: Fullru:locale block with all keys translated to Russian (correct — locale data lives here)api/routes.py: Russian login page locale strings (correct — server-side login page rendering)tests/test_russian_locale.py: Full test suite for the Russian localetests/test_login_locale.py: Russian login page testtests/test_provider_mismatch.py,tests/test_sprint36.py: Updated to count locales dynamicallyFixes applied during review
Source files were cleaned to remove hardcoded Russian strings that belonged in
i18n.js:static/sessions.js: Cyrillic JS variable names (startOfСегодня→startOfToday,startOfВчера→startOfYesterday) and all hardcoded Russian in session menus, project picker, pin/unpin, toast messagesstatic/boot.js: Workspace panel titles, composer placeholder, profile labelstatic/ui.js: Context window labels, update banner, model chip, refresh/update stringsstatic/messages.js: Context strings sent to agent (must stay in English)static/panels.js: Error messagestatic/index.html: Restored to current master (branch was based on older version; Russian title/placeholder/label attributes reverted;data-i18nattribute additions preserved)tests/test_sprint9.py+tests/test_onboarding_static.py: Updated path assertions from/static/tostatic/(PR feat: support subpath mount via reverse proxy (Tailscale Serve, nginx, etc) #588 made paths relative)tests/test_russian_locale.py: Fixedlogin_titleassertion to match actual translationTests
1214 passed, 0 failed.