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
- Add the missing
ruentries toLOCALES.ruinstatic/i18n.js. - Introduce new keys in
enfor B and C, and wire the call sites throught()/data-i18n._sessionSourceLabelalready interpolates{0}elsewhere, sot('sessions_source_webui', n)fits the existing pattern. <option>elements supportdata-i18n(verified:applyLocaleToDOMstampstextContenton 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.
Source: nesquena/hermes-webui