Механизм смены языка в i18next строится вокруг динамического изменения активного языка контекста интернационализации и автоматического обновления всех связанных переводов. Система изначально проектируется так, чтобы язык мог изменяться в рантайме без перезагрузки приложения и без повторной инициализации всего i18n-слоя.
Ключевая идея заключается в том, что текущее языковое состояние
хранится внутри экземпляра i18next и влияет на результат функции
t().
Активный язык — это значение, которое определяет, какой набор переводов будет использоваться при вызове функций интернационализации.
Внутри i18next он задаётся через параметр lng.
i18next.init({
lng: 'en',
resources: {
en: {
translation: {
hello: "Hello"
}
},
ru: {
translation: {
hello: "Привет"
}
}
}
});
В этом случае язык en становится активным, и вызов:
i18next.t('hello');
вернёт "Hello".
Основной метод смены языка — changeLanguage. Он изменяет
активный язык и запускает процесс обновления всех подписчиков.
i18next.changeLanguage('ru');
После выполнения:
i18next.t('hello'); // "Привет"
Метод возвращает Promise, что позволяет обрабатывать момент завершения переключения:
i18next.changeLanguage('ru').then(() => {
console.log('Язык переключён');
});
Переключение языка в i18next часто связано с загрузкой ресурсов с сервера. Поэтому операция может включать асинхронные шаги:
i18next.changeLanguage('de').then(() => {
console.log(i18next.t('hello'));
});
Если используется backend-загрузка переводов, задержка может быть связана именно с сетью.
Текущее состояние языка доступно через метод:
i18next.language;
или:
i18next.resolvedLanguage;
Разница заключается в том, что language отражает
установленное значение, а resolvedLanguage — фактически
применённый язык после всех fallback-правил.
Если выбранный язык недоступен, система автоматически использует fallback:
i18next.init({
lng: 'ru',
fallbackLng: 'en',
resources: {
en: {
translation: {
hello: "Hello"
}
}
}
});
В этом случае:
i18next.changeLanguage('fr');
i18next.t('hello'); // "Hello"
Fallback является важной частью архитектуры i18next, так как предотвращает появление «пустых» интерфейсов.
Помимо changeLanguage, язык можно задать напрямую:
i18next.init({
lng: 'ru'
});
Однако в отличие от changeLanguage, этот способ не
инициирует динамическое обновление интерфейса в уже запущенном
приложении.
Система событий позволяет реагировать на переключение языка:
i18next.on('languageChanged', (lng) => {
console.log('Новый язык:', lng);
});
Это особенно важно для UI-слоёв, которые должны реагировать на изменение переводов без ручного обновления.
Внутри i18next события используются как основной механизм синхронизации состояния.
После смены языка библиотека не просто меняет строку состояния. Она инициирует цепочку обновлений:
lngВ React-экосистемах это обычно реализуется через обёртки над i18next, но сам механизм заложен на уровне ядра.
Язык можно временно переопределить прямо в вызове t:
i18next.t('hello', { lng: 'en' });
i18next.t('hello', { lng: 'ru' });
Это позволяет получать перевод без изменения глобального состояния.
В i18next это используется для:
Переключение языка влияет не только на строки, но и на форматирование значений:
i18next.init({
lng: 'ru',
resources: {
ru: {
translation: {
price: "Цена: {{value}} ₽"
}
},
en: {
translation: {
price: "Price: ${{value}}"
}
}
}
});
После переключения:
i18next.changeLanguage('en');
i18next.t('price', { value: 10 });
Результат изменится автоматически в соответствии с новым языковым контекстом.
В реальных приложениях i18next активно использует кэш ресурсов. Это снижает стоимость повторного переключения языка.
Основные оптимизации:
При использовании backend-модуля переключение языка может инициировать загрузку:
i18next.changeLanguage('es');
Если испанский язык не загружен, происходит запрос ресурсов, после чего язык активируется.
Этот процесс позволяет масштабировать мультиязычность без увеличения размера бандла.
Типичная практика — сохранение выбранного языка:
i18next.on('languageChanged', (lng) => {
localStorage.setItem('lang', lng);
});
И восстановление:
i18next.init({
lng: localStorage.getItem('lang') || 'en'
});
Таким образом, состояние языка становится устойчивым между сессиями.
При частых вызовах:
i18next.changeLanguage('ru');
i18next.changeLanguage('en');
i18next.changeLanguage('de');
система:
Это предотвращает гонки состояний и неконсистентность UI в i18next.
Переключение языка обычно становится частью глобального состояния приложения. Оно влияет на:
i18next предоставляет единый механизм управления этим состоянием, что позволяет избегать разрозненных решений в разных слоях системы.