В основе работы i18next лежит принцип ключевой адресации строк. Любой текст в интерфейсе представляется как уникальный ключ, который сопоставляется с набором переводов в ресурсных файлах.
Структура ресурсов:
{
"header": {
"title": "Главная",
"subtitle": "Панель управления"
}
}
Вызов:
i18next.t('header.title');
Ключевая директива здесь — t() как функция разрешения ключа. Она выполняет не просто поиск строки, а полноценное построение локализованного значения с учётом контекста, параметров и языка.
Интерполяция позволяет внедрять динамические данные в переводимые строки без конкатенации.
Шаблон:
{
"welcome_user": "Добро пожаловать, {{name}}"
}
Использование:
i18next.t('welcome_user', { name: 'Алексей' });
Механизм интерполяции выполняется на уровне движка перевода и поддерживает:
Дополнительно доступна защита от XSS через экранирование значений.
Система множественных форм является одной из ключевых директив локализации.
Структура:
{
"item": "{{count}} элемент",
"item_plural": "{{count}} элементов"
}
Вызов:
i18next.t('item', { count: 5 });
Механизм автоматически выбирает нужную форму на основе правил языка. Для языков со сложной морфологией используется расширенная система категорий (zero, one, few, many).
Контекст позволяет уточнять перевод в зависимости от дополнительного параметра.
Пример ресурса:
{
"button": "Кнопка",
"button_male": "Мужская кнопка",
"button_female": "Женская кнопка"
}
Использование:
i18next.t('button', { context: 'male' });
Контекст формирует модифицированный ключ, не изменяя исходную структуру данных. Это позволяет масштабировать словари без дублирования логики.
Нестинг используется для включения одной локализованной строки в другую.
Пример:
{
"error": "Ошибка: $t(common.network)"
}
Общий словарь:
{
"common": {
"network": "Проблема сети"
}
}
Результат:
i18next.t('error');
Механизм nesting обеспечивает:
Форматирование применяется для чисел, дат и валют через постпроцессоры или внешние модули.
Пример числового форматирования:
i18next.t('price', {
val: 2500,
formatParams: {
val: {
currency: 'KZT'
}
}
});
Ресурс:
{
"price": "Цена: {{val, currency}}"
}
Форматирование реализуется через расширяемые функции, подключаемые к pipeline обработки перевода.
Fallback-механизм определяет поведение при отсутствии ключа в текущей локали.
Конфигурация:
i18next.init({
fallbackLng: 'en'
});
Алгоритм:
Эта директива обеспечивает устойчивость интерфейса при неполных переводах.
Namespaces позволяют логически разделять переводы по модулям приложения.
Структура:
i18next.init({
ns: ['common', 'dashboard', 'auth'],
defaultNS: 'common'
});
Использование:
i18next.t('login.title', { ns: 'auth' });
Преимущества:
Система определения языка может работать через плагины детектирования:
Конфигурация:
i18next.init({
detection: {
order: ['cookie', 'localStorage', 'navigator']
}
});
Директива определяет приоритет источников языка и влияет на выбор активной локали.
PostProcessor позволяет модифицировать итоговую строку после выполнения всех операций перевода.
Пример регистрации:
i18next.use({
type: 'postProcessor',
process(value) {
return value.toUpperCase();
}
});
Использование:
i18next.t('welcome', { postProcess: 'uppercase' });
Механизм используется для:
Загрузка переводов осуществляется через backend-плагины.
Пример:
import Backend from 'i18next-http-backend';
i18next.use(Backend).init({
backend: {
loadPath: '/locales/{{lng}}/{{ns}}.json'
}
});
Эта директива определяет стратегию получения переводов:
i18next поддерживает динамическое добавление переводов:
i18next.addResourceBundle('ru', 'common', {
new_key: 'Новое значение'
});
Также возможно полное обновление:
i18next.reloadResources();
Эта директива используется в системах с горячей локализацией без перезагрузки приложения.
При наличии конфликтующих ключей используется цепочка разрешения:
Эта система формирует предсказуемую модель выбора строки при неоднозначных запросах.
По умолчанию интерполяция экранирует HTML-символы:
i18next.t('text', { value: '<script>' });
Настройка:
i18next.init({
interpolation: {
escapeValue: true
}
});
При необходимости работы с HTML экранирование может быть отключено, но это переносит ответственность за безопасность на уровень приложения.
Поддержка глубоких структур позволяет формировать иерархии переводов:
{
"profile": {
"settings": {
"title": "Настройки профиля"
}
}
}
Доступ:
i18next.t('profile.settings.title');
Такая модель снижает когнитивную нагрузку при масштабировании словарей и обеспечивает естественную группировку интерфейсных элементов.