i18n & Localization
Цели
- Единые правила для ключей, namespaces и структуры переводов.
- Предсказуемая загрузка переводов в SSR/SSG (Next.js / Astro).
- Минимум “магии”: понятные фолбэки, контроль missing keys.
- Корректные plural, интерполяция и форматирование дат/чисел/валют.
Организция ключей
MUST
- Ключи стабильные и не зависят от конкретного текста на языке.
- Формат ключей:
lowercase+ разделитель.(точка):
profile.settings.title - Не использовать пробелы, camelCase, кириллицу, длинные предложения как ключи.
SHOULD
- Ключи отражают структуру UI/домена:
common.*- общие слова/кнопкиerrors.*- ошибкиvalidation.*- сообщения валидации- feature.<name> или pages.<route> — фича/страница
Примеры
✅ Хорошо
{
"common": {
"save": "Save"
},
"profile": {
"settings": {
"title": "Settings"
}
},
"errors": {
"network_error": "Network error"
}
}
❌ Плохо
{
"Save button": "Save",
"PROFILE_SETTINGS_TITLE": "Settings",
"Настройки": "Settings"
}
Стратегии Namespace'ов
MUST
- Переводы делятся на namespaces по доменам/фичам, чтобы:
- Не раздувать один огромный словарь
- Грузить только нужное
- Избегать конфликтов ключей
Рекоменду емая схема
- common - общие слова и простые действия (ok/cancel/save)
- errors - универсальные ошибки
- validation - сообщения валидации
- feature.<name> или pages.<route> — фича/страница
Пример структуры
- common.json
- errors.json
- validation.json
- pages/settings.json (для страницы настроек)
i18n/
locales/
en/
_meta.json # мета-информация (версия, дата обновления, статус перевода)
common.json # кнопки/короткие действия/универ сальные слова
errors.json # универсальные ошибки и сетевые проблемы
validation.json # сообщения валидатора
ui.json # тексты UI-kit (пустые состояния, generic labels)
navigation.json # меню, хлебные крошки, названия разделов
pages/ # тексты страниц
home.json
settings.json
profile.json
entities/ # статусы/типы/лейблы сущностей
user.json
order.json
subscription.json
domains/ # если домен большой и живет долго
billing.json
notifications.json
analytics.json
emails/ # тексты email-шаблонов, если есть
welcome.json
password-reset.json
en.ts # сборка всех namespace'ов в один объект
es/
...
Внутри namespace ключи остаются читабельными и без избыточной глубины. Не делайте 6–7 уровней вложенности.