| name | i18n-localization |
| description | Internationalization and localization patterns. Detecting hardcoded strings, managing translations, locale files, RTL support. |
| allowed-tools | Read, Glob, Grep |
i18n & Localization
Internationalization (i18n) and Localization (L10n) best practices.
1. Core Concepts
| Term | Meaning |
|---|
| i18n | Internationalization - making app translatable |
| L10n | Localization - actual translations |
| Locale | Language + Region (en-US, tr-TR) |
| RTL | Right-to-left languages (Arabic, Hebrew) |
2. When to Use i18n
| Project Type | i18n Needed? |
|---|
| Public web app | โ
Yes |
| SaaS product | โ
Yes |
| Internal tool | โ ๏ธ Maybe |
| Single-region app | โ ๏ธ Consider future |
| Personal project | โ Optional |
3. Implementation Patterns
React (react-i18next)
import { useTranslation } from "react-i18next";
function Welcome() {
const { t } = useTranslation();
return <h1>{t("welcome.title")}</h1>;
}
Next.js (next-intl)
import { useTranslations } from "next-intl";
export default function Page() {
const t = useTranslations("Home");
return <h1>{t("title")}</h1>;
}
Python (gettext)
from gettext import gettext as _
print(_("Welcome to our app"))
4. File Structure
locales/
โโโ en/
โ โโโ common.json
โ โโโ auth.json
โ โโโ errors.json
โโโ tr/
โ โโโ common.json
โ โโโ auth.json
โ โโโ errors.json
โโโ ar/ # RTL
โโโ ...
5. Best Practices
DO โ
- Use translation keys, not raw text
- Namespace translations by feature
- Support pluralization
- Handle date/number formats per locale
- Plan for RTL from the start
- Use ICU message format for complex strings
DON'T โ
- Hardcode strings in components
- Concatenate translated strings
- Assume text length (German is 30% longer)
- Forget about RTL layout
- Mix languages in same file
6. Common Issues
| Issue | Solution |
|---|
| Missing translation | Fallback to default language |
| Hardcoded strings | Use linter/checker script |
| Date format | Use Intl.DateTimeFormat |
| Number format | Use Intl.NumberFormat |
| Pluralization | Use ICU message format |
7. RTL Support
.container {
margin-inline-start: 1rem;
padding-inline-end: 1rem;
}
[dir="rtl"] .icon {
transform: scaleX(-1);
}
8. Checklist
Before shipping:
Script
| Script | Purpose | Command |
|---|
scripts/i18n_checker.py | Detect hardcoded strings & missing translations | python scripts/i18n_checker.py <project_path> |