GitHub
09/08/2026, 6:32 AMnodesTable,
dashboardExt, queriesPage, noCode, enrollPage, …) plus a
shared commonExt namespace for repeated strings (Refresh, Clear
filters, Rows per page, status enums, expiration options). Two unused
leftover namespaces were removed.
• 13 complete catalogs — 671 keys each for
en/es/fr/de/pt/ca/it/nl/ja/ko/zh/pl/ru, written in full with ICU
plurals (Russian and Polish use complete one/few/many/other
categories) and interpolated values. The typed key contract and the
catalog-parity test enforce completeness: a missing key in any
language fails tsc and the test suite.
• Refactors required by translation: hooks added to ~30
sub-components (tables, modals, badge helpers); loop variables
shadowing the i18n t function renamed (alerts tabs, enrollment
platform tabs, provider type lookups); status-tab label arrays
converted to functions of t.
Validation
• npm run check — clean (0 errors)
• npm test — 362/362 passed, including 13-language catalog parity
• 4 test assertions updated where localized text changed accessible
names (tab selectors by role, column-header scoping)
• npm run build — 12 lazy locale chunks (9.7–11.6 KB gz each),
English bundled in the main chunk; no other bundle changes
Security/operational impact
Frontend-only; no backend, auth, or API contract changes. Self-hosted
chunks respect the existing CSP.
Status
The frontend is now fully multilingual end-to-end: infrastructure,
chrome, navigation, login, command palette, page titles, time/number/
date formatting, and all feature-page content across 13 languages.
Follow-up (optional, separate PR): backend PreferredLanguage column
for cross-device sync.
jmpsec/osctrlGitHub
09/08/2026, 6:41 AM