Skip to content

feat(i18n): Add Russian localization (ru) - #998

Merged
Rinat S (rsolmano) merged 4 commits into
JetBrains:mainfrom
arhipov-om:add-ui-localization
Oct 30, 2026
Merged

Rinat S (rsolmano) merged 4 commits into
JetBrains:mainfrom
arhipov-om:add-ui-localization

Conversation

@arhipov-om

@arhipov-om Arhipov Oleg (arhipov-om) commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

Problem

ThinkRail's bundled UI did not include Russian, so Russian-speaking users had to use another interface language or maintain a local catalog.

Approach

Add Russian as a bundled locale, using en.json as the source inventory. Preserve interpolation placeholders, indexed markup, technical literals, and Russian CLDR plural categories.

Changes

  • Register the Russian catalog in the locale package.
  • Add translations for all 2,630 English catalog keys and _few / _many forms for Russian plural families.
  • Update the locale specification and README to document Russian support and catalog coverage.
  • Rebased onto main at df7cb6d2: translated the 40 keys added there (in-app survey, survey invitation, Settings → Feedback, persisted resource history) and dropped the 14 keys main removed (user-interview prompt, old resources dock/inspector strings).
  • Address both review threads: retain the actual count in Russian _one read-range and idle-day messages, and correctly describe Central's signed-out state.

Screenshots

Same scenario and viewport (1440×1000, DPR 1, dark theme), with browser locale ru-RU and the default System preference. Before is the actual base build at 940d15ca (English fallback); After is the branch build at 86cc143c (bundled Russian). These are isolated fixture data, not a real account. PNGs live on a review-only assets ref and do not enter the PR file tree.

Scenario Before After
Project Home Project Home before Russian support Project Home in Russian
Language settings Language settings before Russian support Built-in Russian and automatic system selection
Central signed out Central signed-out state in English Corrected Central signed-out state in Russian

Testing

  • bun run lint → passed; Biome reports the existing design-audit/buttons.html size warning (1.5 MiB).
  • bun run typecheck → 25 tasks passed.
  • bun test packages/locales → 51 passed.
  • bun scripts/check-catalog.ts → passed.
  • bun run test → 24/25 workspace tasks passed. The server task reported 2,030 passed, 4 skipped, 1 failed: packages/server/src/terminal/terminalManager.test.ts — “closing a tab removes it and reports closed”. That server file is unchanged by this PR.
  • bun test ./.thinkrail/context/ru-review.test.ts packages/locales → 61 passed: the 51 locale tests plus 10 temporary regression probes against the real i18next runtime (including 1/21/31/101 and the signed-out wording). The temporary probe does not ship.
  • bun run check:i18n → 9 passed; checker OK.
  • bun run e2e → completed: 659 passed, 5 failed out of 664. No tests were skipped, weakened, or changed to obtain this result.
    • model-picker.spec.ts:53: expected provider-group header is hidden behind All models.
    • 00-jbcentral-lifecycle.spec.ts:181: expected one model row, received two.
    • 00-jbcentral.spec.ts:237: strict locator matched Recent and All-model rows.
    • chat-scroll-stream-mount.spec.ts:113: two oldest-first tab-return viewport cases failed the stream-edge timing assertion.
  • Focused comparison of those five cases on the actual base 940d15ca → 4 passed, 1 failed (the same model-picker failure). On the final branch, the same five cases plus both language-settings tests → 6 passed, 1 failed (again model-picker). The other four full-suite failures did not reproduce in either isolated serial selection; their cause is not established. The relevant tests, picker, and scrolling code are unchanged from the base.
  • Before/after capture probes → 1 passed on base and 1 passed on final; the final probe also asserts automatic Russian selection and the corrected signed-out text.
Focused serial comparison commands

Run on base and final respectively, after building that revision:

THINKRAIL_E2E_SKIP_BUILD=1 bun run e2e:serial e2e/model-picker.spec.ts e2e/00-jbcentral-lifecycle.spec.ts e2e/00-jbcentral.spec.ts e2e/chat-scroll-stream-mount.spec.ts --grep 'the composer pill stars a favorite|Central is uninstalled while connected|disconnect removes Central from new chats|a tab-return streaming chat stays visible in oldest-first order' --retries=0

THINKRAIL_E2E_SKIP_BUILD=1 bun run e2e:serial e2e/language-settings.spec.ts e2e/model-picker.spec.ts e2e/00-jbcentral-lifecycle.spec.ts e2e/00-jbcentral.spec.ts e2e/chat-scroll-stream-mount.spec.ts --grep 'a local language file|switching language re-renders|the composer pill stars a favorite|Central is uninstalled while connected|disconnect removes Central from new chats|a tab-return streaming chat stays visible in oldest-first order' --retries=0
  • After the rebase onto df7cb6d2: bun test packages/locales → 51 passed; bun scripts/check-catalog.ts → OK; bun run check:i18n → OK; bun run lint → passed (same design-audit/buttons.html size warning); bun run typecheck → 25 tasks passed; bun run e2e e2e/language-settings.spec.ts e2e/feedback.spec.ts → 9 passed. The full e2e suite and screenshots were not re-run after the rebase.

Related issues

No related issue is linked.

Checklist

  • Fast gates pass: bun run lint, bun run typecheck, bun run test
  • E2E suite passes for app-affecting changes (bun run e2e, or bun run e2e:full when touching agent behavior)
  • Before/after screenshots are included for frontend changes, or marked not applicable
  • Relevant SPEC.md / top-level specs updated to reflect any boundary, contract, or behavior change
  • I have read the Contributing guide and agree to the Code of Conduct

@jetbrains-air jetbrains-air 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.

Approved — ready to merge.

Comment thread packages/locales/ru.json Resolved
Comment thread packages/locales/ru.json Resolved

@jetbrains-air jetbrains-air 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.

Approved — ready to merge.

@jetbrains-air jetbrains-air 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.

Approved — ready to merge.

Comment thread packages/locales/ru.json Resolved
Comment thread packages/locales/ru.json Resolved

@rsolmano Rinat S (rsolmano) left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Rebased onto main and filled the 40 keys added there (survey, feedback settings, resource history); addressed the two open review threads and fixed six more mistranslated or truncated strings (untranslated transcript labels, plan-session placeholders missing the Enter/Shift+Enter hint, the review empty state and send tooltip). Locale tests, check:i18n, lint, typecheck, and the language-settings + feedback e2e specs pass. Thanks for the translation!

@jetbrains-air jetbrains-air 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.

Approved — ready to merge.

@rsolmano
Rinat S (rsolmano) added this pull request to the merge queue Oct 30, 2026
Merged via the queue into JetBrains:main with commit bc1d252 Oct 30, 2026
11 checks passed
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.

2 participants