Состояние текущего языка является центральным элементом системы интернационализации. Оно определяет, какие переводы будут использованы при рендеринге интерфейса, какие ресурсы будут загружены и каким образом будет формироваться отображаемый текст в приложении. В i18next управление языком построено вокруг внутреннего состояния экземпляра i18n, которое может изменяться динамически и синхронизироваться с внешними источниками.
Основное свойство для получения активного языка —
i18next.language. Оно отражает текущий выбранный язык,
используемый для получения переводов.
import i18next from "i18next";
console.log(i18next.language);
Значение этого свойства зависит от нескольких факторов:
changeLanguage.Типичный формат значения:
enrudeen-USpt-BRВажно учитывать, что language может содержать как
базовый код языка, так и локализованную версию с регионом.
Свойство i18next.languages содержит массив языков в
порядке приоритета.
console.log(i18next.languages);
Пример:
["en-US", "en", "ru"]
Этот массив используется системой fallback-логики:
fallbackLng.Алгоритм поиска перевода использует этот список последовательно, пока не будет найдено совпадение ключа в ресурсах.
i18next.resolvedLanguage отражает язык, который
фактически был выбран после всех вычислений.
console.log(i18next.resolvedLanguage);
Отличие от language заключается в том, что:
language может быть исходным запросом
пользователя;resolvedLanguage — язык, реально используемый системой
после применения fallback и нормализации.Пример ситуации:
en-GB;en-GB нет;en;В этом случае:
i18next.language = "en-GB"
i18next.resolvedLanguage = "en"
При запуске экземпляра i18next язык определяется в несколько этапов:
lngfallbackLngПример инициализации:
import i18next from "i18next";
i18next.init({
lng: "ru",
fallbackLng: "en",
resources: {
ru: {
translation: {
hello: "Привет"
}
},
en: {
translation: {
hello: "Hello"
}
}
}
});
Если lng не указан, система пытается определить язык
автоматически через плагины или окружение.
В браузерной среде язык часто берётся из:
navigator.language
navigator.languages
Пример значений:
navigator.language = "ru-RU"
navigator.languages = ["ru-RU", "ru", "en-US", "en"]
i18next нормализует эти значения и сопоставляет их с доступными ресурсами.
Для автоматического определения языка используется плагин:
i18next-browser-languagedetector
Он анализирует несколько источников:
<html lang="">)Пример конфигурации:
import i18next from "i18next";
import LanguageDetector from "i18next-browser-languagedetector";
i18next
.use(LanguageDetector)
.init({
fallbackLng: "en",
detection: {
order: ["querystring", "cookie", "localStorage", "navigator", "htmlTag"],
caches: ["localStorage", "cookie"]
}
});
Система определения языка в i18next строится на строгом порядке:
changeLanguageinitfallbackLngЭтот порядок гарантирует предсказуемость поведения приложения при любых условиях.
Метод changeLanguage изменяет активный язык и обновляет
все связанные значения.
i18next.changeLanguage("ru").then(() => {
console.log(i18next.language);
});
После вызова:
language;resolvedLanguage;languageChanged.Пример подписки:
i18next.on("languageChanged", (lng) => {
console.log("Новый язык:", lng);
});
Системная модель состояния языка включает три ключевых представления:
language — текущий выбранный языкlanguages — список fallback-языковresolvedLanguage — фактически применённый языкЭта структура позволяет:
В SSR (Server-Side Rendering) определение языка не зависит от браузера. Источники могут быть:
Accept-LanguageПример:
i18next.init({
lng: request.headers["accept-language"],
fallbackLng: "en"
});
В серверной среде важно фиксировать язык до генерации HTML, поскольку изменение языка после рендера не влияет на уже сформированную разметку.
i18next автоматически приводит языковые коды к стандартному виду:
EN-us → en-USru_ru → ru-RUPT-br → pt-BRНормализация позволяет корректно сопоставлять ресурсы даже при несогласованном формате входных данных.
Если для выбранного языка отсутствуют переводы, используется цепочка fallback:
fallbackLng: ["en", "de"]
Поведение:
ru;en;de;Важно, что resolvedLanguage при этом может отличаться от
language, поскольку отражает фактически использованный язык
из цепочки.
В реальных приложениях состояние текущего языка может изменяться под влиянием:
Пример задержки обновления:
await i18next.changeLanguage("de");
console.log(i18next.t("hello"));
Если ресурсы загружаются динамически, перевод может быть доступен только после завершения загрузки.
В крупных приложениях язык часто хранится во внешнем состоянии:
i18next при этом выступает как источник истины, но состояние может дублироваться для UI-логики.
Пример синхронизации:
i18next.on("languageChanged", (lng) => {
store.dispatch({ type: "SET_LANGUAGE", payload: lng });
});
Если язык не может быть определён:
fallbackLng;В этом случае:
i18next.language // может быть undefined до инициализации
После завершения инициализации значение стабилизируется.
Состояние языка в i18next можно рассматривать как динамическую систему:
language, resolvedLanguage,
languages.Эта модель обеспечивает устойчивую работу интернационализации в различных средах исполнения и сценариях использования.