Технические требования i18n
В данном разделе описаны правила организации ключей, управления namespaces, работы с динамическим контентом и типизации.
Организация ключей
MUST
- Ключи стабильные и не зависят от конкретного текста на языке.
- Формат ключей:
lowercase+ разделитель.(точка). - Схема именования:
{feature}.{scope}.{element}. - Не использовать: пробелы,
camelCase,UPPER_CASE, кириллицу или длинные предложения в качестве ключей.
SHOULD
Ключи отражают структуру UI/домена:
common.*— общие слова/кнопки (только строки, переиспользуемые в 3+ местах).errors.*— ошибки.validation.*— сообщения валидации.feature.<name>илиpages.<route>— специфичный контент фичи или страницы.
FORBIDDEN
- Индексированные ключи:
Text_1,label_2,t100. - Неспецифичные имена:
message,value,text.
Стратегии Namespace'ов
MUST
- Переводы делятся на namespaces по доменам или фичам. Избегайте монолитного файла (например, один
en.jsonна 5000+ ключей). - Разделение необходимо для:
- Оптимизации размера bundle.
- Сохранения модульности.
- Избежания конфликтов при параллельной разработке.
Пример структуры
i18n/
locales/
en/
common.json # кнопки/короткие действия
errors.json # универсальные ошибки
validation.json # сообщения валидатора
pages/ # тексты страниц
home.json
settings.json
Плюралы и интерполяция
MUST
- Плюралы реализуются только через механизм i18n-библиотеки (ICU MessageFormat), а не через ручные
if/else. - Интерполяция: используйте именованные параметры
{{ name }}. - Запрещена конкатенация строк через
+, так как это ломает грамматику при переводе.
Rich Text
MUST: Не разбивать предложение на части в коде, если внутри есть ссылка или выделение жирным. Используйте компоненты интерполяции (например, <Trans> в react-i18next или аналоги в next-intl).
Форматирование (Dates, Numbers, Currency)
MUST
- Все даты, числа и валюты форматируются через Intl API (или обертки библиотеки i18n).
- Формат должен зависеть от текущей
locale. - Запрещено хардкодить форматы (например,
${day}.${month}.${year}).
Загрузка переводов с помощь SSG/SSR (Next.js / Astro)
Переводы должны быть доступны до рендера страницы (SSR/SSG), чтобы избежать:
- "мигания" текста
- лишних запросов с клиента
TypeScript и типизация
Для проектов на Next.js (с использованием next-intl) обязательно использование Type Augmentation для получения автокомплита ключей и проверки их существования на этапе компиляции.
// global.d.ts
import messages from '@/i18n/locales/en/common.json';
declare module 'next-intl' {
interface AppConfig {
Messages: typeof messages;
}
}