2.3 KiB
2.3 KiB
Internationalization (i18n)
Multi-language UI and content generation.
Supported Languages
| Code | Language | Native Name | Flag | Message File |
|---|---|---|---|---|
en |
English | English | 🇺🇸 | messages/en.json |
es |
Spanish | Español | 🇪🇸 | messages/es.json |
zh |
Chinese (Simplified) | 中文 | 🇨🇳 | messages/zh.json |
ja |
Japanese | 日本語 | 🇯🇵 | messages/ja.json |
pt |
Portuguese (Brazilian) | Português | 🇧🇷 | messages/pt-BR.json |
Source of truth:
apps/frontend/i18n/config.ts(locales,localeNames,localeFlags). Noteptloads frommessages/pt-BR.json(imported asptinapps/frontend/lib/i18n/messages.ts).
Two Language Settings
- UI Language - Interface text (buttons, labels, navigation)
- Content Language - LLM-generated content (resumes, cover letters)
Both are configured independently in the Settings page.
How It Works
- UI translations: Simple JSON import approach, no external dependencies
- Content generation: Backend receives language, passes to LLM prompts via
{output_language} - Existing content in database remains in original language
Key Files
| File | Purpose |
|---|---|
apps/frontend/messages/*.json |
UI translation files (en, es, zh, ja, pt-BR) |
apps/frontend/lib/i18n/translations.ts |
useTranslations hook |
apps/frontend/lib/context/language-context.tsx |
LanguageProvider (UI + content) |
apps/backend/app/prompts/templates.py |
LLM prompts with {output_language} |
Using Translations
import { useTranslations } from '@/lib/i18n';
const { t } = useTranslations();
<button>{t('common.save')}</button>
Storage
| Key | Purpose |
|---|---|
resume_matcher_ui_language |
UI language (localStorage only) |
resume_matcher_content_language |
Content language (localStorage + backend) |
Adding a New Language
- Create
apps/frontend/messages/{code}.jsonwith all translations - Add locale to
apps/frontend/i18n/config.ts - Add language name to
apps/backend/app/prompts/templates.py - Update
SUPPORTED_LANGUAGESin backend config router
Related Docs
- i18n-preparation.md - Detailed extraction plan