Overview
LibreChat uses i18next for internationalization with a strict workflow to maintain translation quality across 40+ languages. Key Rules:- All user-facing text must use
useLocalize() - Only update English keys in
client/src/locales/en/translation.json - Other languages are automated externally
- Use semantic key prefixes
i18n Setup
Fromclient/src/locales/i18n.ts:1:
Using Localization
useLocalize Hook
Fromclient/src/hooks/useLocalize.ts:1:
TranslationKeystype ensures only valid keys are used- TypeScript will error on non-existent keys
Basic Usage
String Interpolation
Fromclient/src/components/Agents/AgentCard.tsx:109:
Pluralization
Translation Key Naming
Semantic Prefixes
From AGENTS.md andclient/src/locales/en/translation.json:1:
Examples from translation.json
Naming Best Practices
Adding New Translations
1. Add to English Translation File
File:client/src/locales/en/translation.json
2. Use in Component
3. Translation Process
DO:- Add new keys to
client/src/locales/en/translation.json - Use descriptive, semantic key names
- Include context in key names when needed
- Test that keys display correctly
- Manually edit other language files (they’re automated)
- Use generic key names like
text1,label2 - Hard-code English text in components
- Skip localization for any user-facing text
Accessibility with i18n
Fromclient/src/components/Agents/AgentCard.tsx:57:
Language Selection
Language is stored in Jotai/Recoil state and persisted to localStorage. Fromclient/src/store/language.ts:1:
Language Switcher Component
RTL Support
Fromclient/src/locales/i18n.ts:98:
RTL Languages
RTL (Right-to-Left) languages supported:- Arabic (ar)
- Hebrew (he)
- Persian/Farsi (fa)
- Uyghur (ug)
Handling RTL in Components
Common Patterns
Conditional Text
Lists with Localization
Dynamic Translation Keys
client/src/components/Agents/AgentCard.tsx:22:
Testing Translations
1. Check for Missing Keys
2. Test with Different Languages
Workflow Summary
From AGENTS.md:- Identify user-facing text in your component
- Create semantic keys with appropriate prefix in
client/src/locales/en/translation.json - Use
useLocalize()hook in component - Replace hard-coded text with
localize('key') - Test that text displays correctly
- Submit PR - automated translation happens externally
Supported Languages
Fromclient/src/locales/:
- Arabic (ar)
- Bosnian (bs)
- Catalan (ca)
- Czech (cs)
- Chinese Simplified (zh-Hans)
- Chinese Traditional (zh-Hant)
- Danish (da)
- Dutch (nl)
- English (en)
- Estonian (et)
- Finnish (fi)
- French (fr)
- German (de)
- Hebrew (he)
- Hungarian (hu)
- Icelandic (is)
- Indonesian (id)
- Italian (it)
- Japanese (ja)
- Korean (ko)
- Lithuanian (lt)
- Latvian (lv)
- Norwegian Bokmål (nb)
- Norwegian Nynorsk (nn)
- Persian (fa)
- Polish (pl)
- Portuguese Brazilian (pt-BR)
- Portuguese (pt-PT)
- Russian (ru)
- Slovak (sk)
- Slovenian (sl)
- Spanish (es)
- Swedish (sv)
- Thai (th)
- Tibetan (bo)
- Turkish (tr)
- Ukrainian (uk)
- Uyghur (ug)
- Vietnamese (vi)
Next Steps
- Components - Component architecture and patterns
- State Management - Managing language state
- Data Provider - API integration for translated content