#21617: feat(i18n): added korean locale
app: web-ui
size: S
Cluster:
Internationalization Enhancements
## Summary
- Problem: Korean (ko-KR) was listed in `SUPPORTED_LOCALES` and the language selector in the UI, but no translation file existed
- Why it matters: Korean is one of the most-requested languages in #3460
- What changed: Added `ko-KR.ts` with full Korean translations; registered `ko-KR` in the `setLocale` dynamic import chain; added `koKR` display name entry to all existing locale files (en, zh-CN, zh-TW, pt-BR)
- What did NOT change: No changes to i18n architecture, translation loading mechanism, locale detection logic, or any non-i18n code
## Change Type
- [ ] Bug fix
- [x] Feature
- [ ] Refactor
- [ ] Docs
- [ ] Security hardening
- [ ] Chore/infra
## Scope
- [ ] Gateway / orchestration
- [ ] Skills / tool execution
- [ ] Auth / tokens
- [ ] Memory / storage
- [ ] Integrations
- [ ] API / contracts
- [x] UI / DX
- [ ] CI/CD / infra
## Linked Issue/PR
- Relates to #3460
- Related #18508
## User-visible / Behavior Changes
- Korean (한국어) is now available in the language selector in the Overview tab
- Users with `navigator.language` starting with `ko` will now have Korean auto-detected on first visit instead of falling back to English
## Security Impact
- New permissions/capabilities? No
- Secrets/tokens handling changed? No
- New/changed network calls? No
- Command/tool execution surface changed? No
- Data access scope changed? No
## Repro + Verification
### Environment
- OS: macOS Sequoia (Apple Silicon)
- Runtime/container: Node.js 22, pnpm
- Model/provider: N/A (UI-only changes)
- Integration/channel: Control UI
- Relevant config: N/A
### Steps
1. Open the Control UI and navigate to the Overview tab
2. Open the language selector and select 한국어
3. Verify all UI labels switch to Korean
4. Reload the page and verify Korean is restored from localStorage
### Expected
- All translated strings render in Korean
- Language preference persists across reloads
### Actual
- Confirmed above behavior
## Evidence
- [x] Failing test/log before + passing after
- [ ] Trace/log snippets
- [x] Screenshot/recording
- [ ] Perf numbers (if relevant)
- Build passes: `pnpm build` completes successfully (8241ms, 0 errors)
## Human Verification
- Verified scenarios: Build passes, all locale files have consistent `koKR` key structure, translation keys match en.ts exactly
- Edge cases checked: TypeScript enforces that ko-KR.ts has the same keys as TranslationMap — missing keys would cause a build error, so coverage is complete by construction
**Translator note:** Translations were authored by a native Korean speaker working as a localization engineer at Nexon. Technical terms (Gateway, WebSocket, Skills, CLI, Canvas, Tailscale, Cron, etc.) are intentionally kept in English per the convention established in #18508.
<img width="1429" height="775" alt="스크린샷 2026-02-20 14 00 08" src="https://github.com/user-attachments/assets/245c381a-7342-4171-94af-8041a5390b46" />
## Compatibility / Migration
- Backward compatible? Yes
- Config/env changes? No
- Migration needed? No
## Failure Recovery
- How to revert: Remove `ko-KR.ts`, revert `koKR` entries from all locale files, remove `ko-KR` branch from `setLocale`
- Files to restore: `ui/src/i18n/locales/ko-KR.ts`, `ui/src/i18n/locales/en.ts`, `zh-CN.ts`, `zh-TW.ts`, `pt-BR.ts`, `ui/src/i18n/lib/translate.ts`
## Risks and Mitigations
- Risk: Translation accuracy for technical UI strings
- Mitigation: Native speaker authorship; technical terms kept in English; community can refine via follow-up PRs
<!-- greptile_comment -->
<h3>Greptile Summary</h3>
Added complete Korean (ko-KR) locale support to the Control UI. Registered `ko-KR` in `SUPPORTED_LOCALES`, added language detection for Korean browser locales, and implemented dynamic import loading. All existing locale files updated with the `koKR` display name entry.
- Added complete Korean translation file with 100+ strings covering navigation, tabs, overview, chat, and common UI elements
- Technical terms (Gateway, WebSocket, Skills, Cron, etc.) correctly kept in English per established convention
- Translation keys match English structure exactly, ensuring type safety
- Added language selector dropdown option in Overview tab
- Auto-detection works correctly for users with Korean browser locale (`navigator.language.startsWith("ko")`)
One typo found in Korean translation that should be corrected before merge.
<h3>Confidence Score: 4/5</h3>
- This PR is safe to merge after fixing the Korean translation typo
- PR follows established i18n patterns correctly, with proper type definitions, locale registration, and dynamic imports. Structure is consistent with existing translations. One typo in Korean text prevents full confidence score, but it's a simple fix. No logical errors or architectural issues.
- ui/src/i18n/locales/ko-KR.ts requires a one-word typo fix before merge
<sub>Last reviewed commit: 8c4d504</sub>
<!-- 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
#22570: feat(i18n): add Korean (ko) locale to Control UI
by hoonsikim · 2026-02-21
92.9%
#22332: i18n: add Korean (ko-KR) locale support
by arusia88 · 2026-02-21
91.5%
#21988: feat(i18n): added Thai (th) locale
by samithiwat · 2026-02-20
81.1%
#13622: feat(i18n): add complete multi-language support (EN, TR, FR, DE)
by vaur94 · 2026-02-10
79.9%
#22165: feat(i18n): translate hardcoded button labels to all 4 locales
by NikolaVujovic1988 · 2026-02-20
78.2%
#19689: feat(i18n): added Filipino (fil) locale
by warengonzaga · 2026-02-18
77.6%
#10586: feat: Add Chinese (zh-CN) localization support
by Maxsong-0 · 2026-02-06
75.5%
#8544: feat(i18n): add Japanese translation support with glossary and lang...
by dai · 2026-02-04
75.3%
#10657: feat(ui): add i18n support with English, Chinese, and Portuguese
by SalimBinYousuf1 · 2026-02-06
74.2%
#9490: Add Internationalization (i18n) Support
by luuman · 2026-02-05
73.7%