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' });
Это превращает перевод в гибкую систему представления данных, где текст и форматирование работают совместно.
Персонализация масштабируется через разделение переводов по областям:
i18next.init({
ns: ['common', 'dashboard', 'profile'],
defaultNS: 'common'
});
Разные части приложения могут использовать собственные словари, что позволяет адаптировать интерфейс под разные сценарии использования одного и того же пользователя.
В некоторых архитектурах ключи формируются на основе состояния приложения:
const key = `error_${error.code}`;
i18next.t(key);
Это переносит ответственность за выбор текста на комбинацию бизнес-логики и локализационного слоя, обеспечивая более тонкую персонализацию сообщений об ошибках и событиях.