Персонализация переводов

i18next изначально проектируется как система, в которой строка перевода не является статической сущностью, а формируется динамически на основе контекста выполнения: языка, параметров пользователя, окружения и переданных переменных. Персонализация переводов в таком подходе строится вокруг механизма интерполяции, контекстных ключей, правил плюрализации и расширяемых форматтеров.

Персонализация начинается с выбора языка и набора ресурсов. Базовый параметр lng определяет активную локаль, но в реальных приложениях он редко является единственным фактором.

i18next.init({
  lng: 'ru',
  fallbackLng: 'en',
  resources: {
    ru: {
      translation: {
        greeting: "Привет, {{name}}"
      }
    }
  }
});

Значение {{name}} не является фиксированным текстом — оно заменяется в момент выполнения, что позволяет адаптировать сообщение под конкретного пользователя без изменения словаря переводов.

Интерполяция как механизм подстановки данных

Интерполяция в i18next работает как слой динамической сборки строки. Она позволяет внедрять любые значения: строки, числа, даты, вычисленные параметры.

i18next.t('greeting', { name: 'Алексей' });

Персонализация расширяется за счёт передачи комплексных объектов:

i18next.t('profile', {
  name: 'Ирина',
  age: 28,
  city: 'Алматы'
});
{
  "profile": "{{name}}, {{age}} лет, {{city}}"
}

Ключевой принцип заключается в том, что перевод отделён от данных, а данные поступают из внешнего контекста приложения.

Контекстные ключи и вариативность строк

Одним из инструментов персонализации является контекст (context). Он позволяет изменять перевод в зависимости от дополнительных параметров, не создавая отдельные ключи вручную для каждой ситуации.

i18next.t('friend', { context: 'male' });
i18next.t('friend', { context: 'female' });

Ресурсы:

{
  "friend_male": "друг",
  "friend_female": "подруга"
}

Контекст становится способом моделирования грамматических и смысловых различий, особенно в языках с выраженной родовой системой.

Плюрализация и зависимость от числовых параметров

Персонализация текста часто связана с количеством объектов. В i18next это реализуется через встроенные правила плюрализации, зависящие от языка.

i18next.t('messages', { count: 1 });
i18next.t('messages', { count: 5 });
{
  "messages_one": "1 сообщение",
  "messages_few": "{{count}} сообщения",
  "messages_many": "{{count}} сообщений"
}

Система автоматически выбирает правильную форму, опираясь на локальные правила языка, что позволяет избежать ручного управления грамматикой в коде.

Пользовательские данные как источник динамики

Персонализация выходит за рамки простых подстановок, когда перевод зависит от профиля пользователя. Обычно это реализуется через передачу глобального контекста или через обёртки над t.

const user = {
  premium: true,
  name: 'Данияр'
};

i18next.t(user.premium ? 'welcome_premium' : 'welcome_basic', {
  name: user.name
});

Такой подход позволяет менять не только текст, но и тональность сообщений, уровень детализации и структуру ответа.

Форматирование чисел, дат и единиц измерения

Персонализация включает локализованное форматирование значений. Вместо ручной обработки применяются встроенные или подключаемые форматтеры.

i18next.t('balance', {
  amount: 12345.67,
  formatParams: {
    amount: {
      minimumFractionDigits: 2
    }
  }
});

Часто используется интеграция с Intl API:

new Intl.NumberFormat('ru-RU').format(12345.67);

Таким образом, один и тот же перевод может выглядеть по-разному в зависимости от региональных стандартов отображения данных.

Нестинг и составные переводы

Персонализация усиливается через вложенные ключи, когда один перевод включает другой:

{
  "user": {
    "status": "Статус: {{- status}}"
  },
  "status_active": "активен"
}
i18next.t('user.status', {
  status: i18next.t('status_active')
});

Такой механизм позволяет строить составные сообщения без дублирования текста.

Условная логика внутри переводов

Хотя i18next не является шаблонизатором общего назначения, простая условная логика реализуется через выбор ключей и параметры.

i18next.t('access', { role: 'admin' });
{
  "access_admin": "Полный доступ",
  "access_user": "Ограниченный доступ"
}

Подобный подход переносит логику выбора текста из кода в слой локализации, что упрощает централизованное управление текстами.

Динамическое переключение языка

Персонализация тесно связана с возможностью смены языка без перезагрузки логики приложения.

i18next.changeLanguage('en');

После смены языка все вызовы t начинают использовать новый набор ресурсов, что позволяет адаптировать интерфейс под пользователя в реальном времени.

Хранение пользовательских предпочтений

Часто язык и настройки персонализации извлекаются из persistent storage или профиля пользователя.

i18next.init({
  lng: localStorage.getItem('lng') || 'ru'
});

Это создаёт непрерывность пользовательского опыта между сессиями.

Постобработка переводов

Для сложных сценариев применяется postProcessor, который изменяет итоговую строку после интерполяции.

i18next.t('message', {
  postProcess: 'uppercase'
});

Постобработка позволяет внедрять правила форматирования, маскирования данных или адаптации стиля текста без изменения исходных ресурсов.

Расширяемые форматтеры

Система форматирования позволяет подключать собственные функции преобразования значений.

i18next.services.formatter.add('currency', (value, lng) => {
  return new Intl.NumberFormat(lng, {
    style: 'currency',
    currency: 'KZT'
  }).format(value);
});
i18next.t('price', { price: 1000, format: 'currency' });

Это превращает перевод в гибкую систему представления данных, где текст и форматирование работают совместно.

Разделение ресурсов и персонализированные namespace

Персонализация масштабируется через разделение переводов по областям:

i18next.init({
  ns: ['common', 'dashboard', 'profile'],
  defaultNS: 'common'
});

Разные части приложения могут использовать собственные словари, что позволяет адаптировать интерфейс под разные сценарии использования одного и того же пользователя.

Динамическая генерация ключей

В некоторых архитектурах ключи формируются на основе состояния приложения:

const key = `error_${error.code}`;
i18next.t(key);

Это переносит ответственность за выбор текста на комбинацию бизнес-логики и локализационного слоя, обеспечивая более тонкую персонализацию сообщений об ошибках и событиях.