В браузерной среде выбор языка интерфейса строится вокруг доступных данных окружения и стратегии приоритетов, заданной конфигурацией интернационализации. В случае i18next ключевая роль отводится механизму определения языка (language detection), который формирует начальное значение текущей локали до загрузки ресурсов переводов.
Браузер предоставляет несколько стандартных способов получения предпочтений пользователя:
navigator.language — основной язык интерфейса
браузераnavigator.languages — массив предпочтительных языков в
порядке приоритетаdocument.documentElement.lang — значение атрибута
lang у HTML-документаКаждый источник отражает отдельный уровень контекста: системные настройки, пользовательский выбор внутри приложения или маршрутизации.
В рамках i18next эти источники не используются напрямую «вручную» в коде приложения — вместо этого применяется модуль детекции языка.
Для браузера стандартным решением выступает плагин i18next-browser-languagedetector, который интегрируется в систему и автоматизирует выбор языка.
Принцип работы основан на последовательности проверки источников:
?lng=ru)<html lang="...">)Порядок задаётся явно в конфигурации и является определяющим фактором.
Основная настройка выглядит следующим образом:
i18n.use(LanguageDetector).init({
detection: {
order: [
'querystring',
'cookie',
'localStorage',
'navigator',
'htmlTag',
'path',
'subdomain'
]
}
});
Каждый элемент массива представляет стратегию извлечения языка. При первом успешном совпадении цепочка прерывается.
Источник navigator считается базовым, но имеет
ограничения:
navigator.language)ru-RU,
en-US)Если доступен navigator.languages, используется первый
элемент массива, так как он отражает приоритет языков.
Пример:
navigator.languages = ['ru-RU', 'en-US', 'en'];
В этом случае будет выбран ru-RU, если он поддерживается
ресурсами переводов.
После определения язык проходит нормализацию:
ru-RU →
ru)Если точное совпадение отсутствует, используется стратегия fallback:
fallbackLng: 'en'
или массив:
fallbackLng: ['en', 'de']
Fallback активируется, если:
При наличии нескольких источников возможны конфликты. Например:
en-USrudeВ этом случае выбор определяется порядком order. Если
первым стоит cookie, итоговым языком будет ru, даже при
наличии navigator.language.
Таким образом, детектор реализует строгую систему приоритетов, а не «усреднение» значений.
После определения язык может сохраняться обратно в один из источников:
detection: {
order: ['localStorage', 'navigator'],
caches: ['localStorage', 'cookie']
}
Опция caches фиксирует выбранный язык, чтобы при
следующем заходе логика детекции не повторялась полностью.
Типичные варианты:
localStorage — для SPA-приложенийcookie — для серверной синхронизацииИсточник htmlTag использует:
<html lang="ru">
Этот способ часто применяется как резервный механизм, когда JavaScript ещё не выполнил детекцию. Он также влияет на SEO и доступность, но в логике i18next выступает лишь как один из факторов.
Два распространённых варианта:
/home?lng=ru
/ru/home
ru.example.com
Каждый вариант требует настройки соответствующего детектора. Они используются в системах с мультиязычной маршрутизацией, где язык является частью URL-структуры.
import i18n from 'i18next';
import LanguageDetector from 'i18next-browser-languagedetector';
i18n
.use(LanguageDetector)
.init({
fallbackLng: 'en',
detection: {
order: [
'querystring',
'cookie',
'localStorage',
'navigator',
'htmlTag',
'path',
'subdomain'
],
caches: ['localStorage']
}
});
Если детектор возвращает язык, отсутствующий в ресурсах:
fr-CA →
fr)Это позволяет корректно обрабатывать региональные варианты без дублирования переводов.
В одностраничных приложениях изменение языка может происходить динамически:
i18n.changeLanguage()При этом повторная детекция обычно отключается, чтобы не перезаписывать пользовательский выбор.
Внутри i18next детектор языка выполняет функцию начального состояния системы. Он определяет контекст до загрузки переводов и влияет на:
Корректная настройка источников и их приоритета определяет предсказуемость поведения интерфейса в разных браузерах и окружениях.