i18n: Russian (ru) locale missing translations for ~15 settings keys; several user-facing strings hardcoded outside i18n

Author: YularzhiCreated Sep 15, 2026Updated Sep 17, 2026
Labelsbuguxsprint-candidate

Summary

Using the WebUI in Russian (ru locale), the vast majority of the UI is translated, but a noticeable set of strings still renders in English either because the key exists only in LOCALES.en (no ru entry) or because the string is hardcoded in index.html / static/*.js and never routed through t().

I collected them while using the app; local translations + a patch file exist and I am willing to contribute a PR.

Concrete list

A. Key exists, but ru falls back to English

Key Current EN text (shown in RU)
settings_label_transparent_stream_event_timestamps Show Transparent Stream event timestamps
settings_desc_transparent_stream_event_timestamps Keeps the response footer time visible while hiding the per-event timestamp chips.
profile_concept_title Profiles vs workspaces
profile_concept_subtitle Use profiles for how the agent works; use workspaces for what files it works on.
profile_concept_desc_profiles / _desc_workspaces / _desc_together / _example / _label_together / _label_example (long settings panel copy)

B. Hardcoded in JS (no key at all)

Location String
static/sessions.js:2558 `CLI sessions (${n})` / `WebUI sessions (${n})` — sidebar source tab labels
static/panels.js:5284 'Project Context' label, 'No project context file found for this workspace.'
static/panels.js:9894 'No manifest extensions are installed in the configured bundle.'
static/panels.js:10021+ (sidecars) Loopback sidecars card title/meta, Origin / Health path / Health URL / Proxy / Proxy path / consent buttons, proxy-warning text
static/panels.js:10147+ (diagnostics card) «Extension runtime», «Copy diagnostics», all diag row labels (Extension dir configured/valid, Manifest configured/loaded/status, entry/script/stylesheet/sidecar counts, Installed manifest extensions, Final script/stylesheet/loopback counts, User-disabled), «Installed manifest extensions» card, «Final public asset URLs», «Scripts»/«Stylesheets», «Sanitized warnings» + meta, None, No warnings., extension_state_unknown_ids_hint text
sidebar project chips (static/sessions.js:7818/7827) «All», «Unassigned» + tooltip

C. Hardcoded in static/index.html (no data-i18n attribute)

Line Element
~235 <select id="kanbanBulkStatus"> options: «Status», «Ready», «Blocked», «Done», «Archived» + aria-label="Bulk status"
~283 Insights period options: «7 days», «30 days», «90 days», «365 days»
1507 Extensions settings meta: «Browse, install, and manage WebUI extensions.»
1531 «Loading installed extensions…»
1537 «Copy diagnostics» button
1540-1546 Trust model label + explanation block
1196-1198 Send-key
1257 TTS voice default option: «Default system voice»
static/panels.js:9634 (also index.html:1257) TTS «Default system voice»

Suggested fix

  1. Add the missing ru entries to LOCALES.ru in static/i18n.js.
  2. Introduce new keys in en for B and C, and wire the call sites through t() / data-i18n. _sessionSourceLabel already interpolates {0} elsewhere, so t('sessions_source_webui', n) fits the existing pattern.
  3. <option> elements support data-i18n (verified: applyLocaleToDOM stamps textContent on any element) — same mechanism as the other selects that already work.

I have working local translations for all of the above and a patch set against current tree (~40 key changes); happy to split this into a levelling PR (ru keys) + a hooking PR (hardcoded call sites) if preferred.