В экосистеме i18next механизм определения языка строится на концепции language detector plugins, которые отвечают за извлечение предпочтительного языка пользователя из различных источников окружения. Эти плагины формируют цепочку проверки, где каждый источник данных рассматривается в заданном порядке приоритета, а первый найденный валидный язык становится активным.
Система детекции языка в i18next основана на модульной архитектуре, где логика извлечения языка вынесена в отдельные плагины. Основной движок i18next не фиксирует способ определения языка, а лишь взаимодействует с детекторами через унифицированный интерфейс.
Каждый language detector реализует набор стандартных методов:
detect() — возвращает язык или массив языковcacheUserLanguage() — сохраняет выбранный язык в
хранилище (если поддерживается)Такая структура позволяет комбинировать различные стратегии обнаружения языка без изменения ядра библиотеки.
Механизм определения языка основан на последовательной проверке источников:
<html lang="">)Каждый источник проверяется в заданном порядке. Как только обнаруживается валидное значение, цепочка прерывается.
Ключевой параметр конфигурации:
detection: {
order: ['querystring', 'cookie', 'localStorage', 'navigator', 'htmlTag']
}
Наиболее распространённый детектор в клиентской среде —
i18next-browser-languagedetector. Он объединяет несколько
стратегий извлечения языка из браузера и обеспечивает гибкую
конфигурацию источников.
import i18next from 'i18next';
import LanguageDetector from 'i18next-browser-languagedetector';
i18next
.use(LanguageDetector)
.init({
detection: {
order: ['querystring', 'cookie', 'localStorage', 'navigator', 'htmlTag'],
caches: ['localStorage', 'cookie']
}
});
Извлечение языка из URL-параметра:
https://example.com?lng=ru
Настройка ключа параметра:
detection: {
lookupQuerystring: 'lng'
}
Язык сохраняется и читается из cookie-хранилища:
detection: {
lookupCookie: 'i18next'
}
Дополнительно задаются параметры cookie:
detection: {
cookieMinutes: 10080,
cookieDomain: 'example.com'
}
Использование браузерных хранилищ:
detection: {
lookupLocalStorage: 'i18nextLng',
lookupSessionStorage: 'i18nextLng'
}
Кэширование языка позволяет сохранять выбор пользователя между сессиями.
Использование системного языка браузера:
detection: {
order: ['navigator']
}
Данные берутся из:
navigator.languagenavigator.languagesИзвлечение языка из атрибута документа:
<html lang="ru">
detection: {
lookupFromPathIndex: 0
}
После определения языка система может сохранить его в один или
несколько persistence-слоёв. Это управляется параметром
caches.
detection: {
caches: ['localStorage', 'cookie']
}
Поддерживаемые стратегии:
Механизм кэширования активируется через
cacheUserLanguage() в детекторе.
Детекторы могут быть реализованы вручную при необходимости нестандартной логики.
const customDetector = {
name: 'customDetector',
lookup(options) {
return window.customLang || null;
},
cacheUserLanguage(lng, options) {
window.customLang = lng;
}
};
Подключение:
i18next
.use(customDetector)
.init({
detection: {
order: ['customDetector']
}
});
В серверной среде используется i18next-http-middleware,
где источником данных выступают HTTP-заголовки.
Основной механизм — заголовок:
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Конфигурация:
middleware.handle(i18next, {
order: ['header', 'querystring', 'cookie'],
lookupHeader: 'accept-language'
});
Алгоритм учитывает приоритеты языков, заданные клиентом через q-values.
Если несколько источников возвращают разные значения, применяется
стратегия первого совпадения согласно order.
Пример:
order: ['querystring', 'cookie', 'localStorage']
При наличии:
?lng=enrukzРезультатом будет en.
Детекторы возвращают языки в различных форматах:
enen-USru-RUi18next выполняет нормализацию:
en-US → en)Если ни один детектор не вернул поддерживаемый язык, применяется fallback:
i18next.init({
fallbackLng: 'en'
});
Fallback активируется после завершения цепочки detection и проверки доступных ресурсов.
Механизм детекции может быть полностью отключён:
i18next.init({
detection: false
});
В таком случае язык задаётся явно через lng:
i18next.init({
lng: 'ru'
});
Некоторые источники возвращают массив языков, например
navigator.languages:
['ru-RU', 'ru', 'en-US']
В этом случае используется первый поддерживаемый язык из списка.
Язык извлекается из URL:
/ru/home
/en/home
detection: {
lookupFromPathIndex: 0
}
ru.example.com
en.example.com
detection: {
lookupFromSubdomainIndex: 0
}
Результат детекции напрямую влияет на выбор ресурса перевода:
resources: {
en: { translation: {} },
ru: { translation: {} }
}
Определённый язык связывается с соответствующим namespace, после чего происходит загрузка переводов.
В одностраничных приложениях детекция выполняется один раз при инициализации, однако изменение URL или состояния приложения может требовать ручного обновления языка:
i18next.changeLanguage('ru');
При этом детекторы могут быть повторно вызваны только при явной переинициализации.
Language detector plugins являются частью более широкой системы middleware i18next. Они могут взаимодействовать с:
Порядок выполнения критичен: детекция происходит до загрузки ресурсов переводов.
В средах без браузерных API:
navigator недоступенlocalStorage может отсутствоватьВ таких случаях детекторы автоматически пропускаются, переходя к следующим источникам в цепочке.