#13622: feat(i18n): add complete multi-language support (EN, TR, FR, DE)
app: web-ui
stale
Cluster:
Multilingual Support Enhancements
## Summary
This PR adds a comprehensive internationalization (i18n) system to the Control UI, enabling full multi-language support with four languages: **English**, **Turkish**, **French**, and **German**.
## Changes
### New Files
- `ui/src/ui/i18n.ts` — Core i18n module with `t()` translation function, locale detection, and reactive locale switching
- `ui/src/ui/locales/en.json` — English locale (905 keys)
- `ui/src/ui/locales/tr.json` — Turkish locale (905 keys)
- `ui/src/ui/locales/fr.json` — French locale (905 keys)
- `ui/src/ui/locales/de.json` — German locale (905 keys)
### Modified Files (40+)
All user-facing hardcoded strings have been replaced with `t()` calls across views, controllers, and chat components:
- Navigation, tabs, subtitles
- Overview, Chat, Channels, Sessions, Usage, Config, Debug, Logs
- Agents, Skills, Nodes, Cron Jobs
- Error messages, confirmation dialogs, tooltips, placeholders
- Config section labels and descriptions (27 sections)
## i18n Architecture
```
i18n.ts
├── t(key, params?) — Translate with dot-notation keys and {{interpolation}}
├── setLocale(locale) — Switch language reactively
├── getLocale() — Get current locale
├── detectBrowserLocale() — Auto-detect from navigator.language
├── LOCALE_REGISTRY — Available locales with native labels
└── BUNDLES — Lazy-flattened nested JSON bundles
```
**Adding a new language** is straightforward:
1. Create `locales/<code>.json` with the same key structure
2. Import and register in `i18n.ts`
## Translation Quality
- All translations are done from English with accurate, context-appropriate wording
- Technical terms remain consistent across platforms (Gateway, Token, Cron, etc.)
- Interpolation parameters (`{{count}}`, `{{value}}`, `{type}`) are preserved
- No ambiguity — natural, professional expressions in each language
## Verification
- **Build**: ✅ 133 modules, 0 errors
- **Key count**: 905 keys × 4 languages = 3,620 total translations
- **Coverage**: All user-facing UI strings (340+ replacements in 40+ files)
## Screenshots
The language selector appears in the Settings section, allowing users to switch between EN, TR, FR, DE at runtime.
<!-- greptile_comment -->
<h2>Greptile Overview</h2>
<h3>Greptile Summary</h3>
This PR introduces a lightweight i18n layer for the Control UI (`ui/src/ui/i18n.ts`) with JSON bundles for EN/TR/FR/DE and updates many views/controllers to replace hardcoded strings with `t(...)` calls. Navigation/tab labels were refactored to be translated dynamically via `getTabGroups()`, and a language selector was added to the sidebar with locale persisted in UI settings.
Key behavioral changes: locale is initialized on connect (saved locale or `navigator.language`), and locale changes trigger UI re-render via a listener.
<h3>Confidence Score: 3/5</h3>
- Moderate risk to merge due to runtime i18n/state issues.
- The overall i18n integration looks consistent, but there are a few concrete runtime issues: module-level translated constants won’t update on locale changes, nav group collapse state is keyed by translated labels (breaking persistence across languages), and a locale-change listener is registered without cleanup (can leak on reconnect/remount). These should be fixed before merging to avoid user-visible regressions.
- ui/src/ui/chat/copy-as-markdown.ts, ui/src/ui/app-render.ts, ui/src/ui/app-lifecycle.ts
<!-- greptile_other_comments_section -->
<sub>(2/5) Greptile learns from your feedback when you react with thumbs up/down!</sub>
<!-- /greptile_comment -->
Most Similar PRs
#10657: feat(ui): add i18n support with English, Chinese, and Portuguese
by SalimBinYousuf1 · 2026-02-06
87.7%
#22165: feat(i18n): translate hardcoded button labels to all 4 locales
by NikolaVujovic1988 · 2026-02-20
84.3%
#9490: Add Internationalization (i18n) Support
by luuman · 2026-02-05
84.0%
#10275: feat: add multiligual support for UI
by fmyuan2000 · 2026-02-06
83.3%
#10586: feat: Add Chinese (zh-CN) localization support
by Maxsong-0 · 2026-02-06
82.8%
#22332: i18n: add Korean (ko-KR) locale support
by arusia88 · 2026-02-21
81.3%
#22570: feat(i18n): add Korean (ko) locale to Control UI
by hoonsikim · 2026-02-21
81.0%
#21617: feat(i18n): added korean locale
by Jaejuna · 2026-02-20
79.9%
#8544: feat(i18n): add Japanese translation support with glossary and lang...
by dai · 2026-02-04
78.8%
#21988: feat(i18n): added Thai (th) locale
by samithiwat · 2026-02-20
78.0%