Инспектирование загруженных языков

В i18next состояние загруженных языков отражается через несколько внутренних и публичных механизмов, главным из которых является массив i18n.languages. Он формируется после инициализации и обновляется при смене языка или загрузке новых ресурсов.

import i18n from 'i18next';

console.log(i18n.languages);

В типичной конфигурации массив может содержать:

  • основной язык интерфейса
  • fallback-языки
  • региональные вариации (например, en-US, en)

Важно учитывать, что порядок элементов имеет значение: поиск перевода выполняется последовательно по массиву, пока не будет найдено совпадение.


Текущий язык и резолвинг языка

Состояние активного языка хранится отдельно от списка загруженных языков:

console.log(i18n.language);
console.log(i18n.resolvedLanguage);

Различие между ними принципиально:

  • language — язык, который был установлен вручную или через changeLanguage
  • resolvedLanguage — итоговый язык после применения детекции и fallback-цепочки

Пример ситуации:

i18n.init({
  lng: 'ru-RU',
  fallbackLng: 'en'
});

После инициализации возможна нормализация:

  • language: ru-RU
  • resolvedLanguage: ru

Внутреннее хранилище ресурсов

Основная структура, содержащая загруженные переводы:

i18n.services.resourceStore.data

Она организована по схеме:

resourceStore.data = {
  lng: {
    namespace: {
      key: value
    }
  }
}

Пример доступа:

const store = i18n.services.resourceStore.data;

console.log(store.ru.translation);
console.log(store.en.common);

Каждый уровень структуры играет роль:

  • язык (ru, en)
  • namespace (translation, common, errors)
  • ключи перевода

Проверка наличия языка

Перед использованием языка часто требуется проверить, загружен ли он полностью:

const hasRussian = i18n.hasResourceBundle('ru', 'translation');
console.log(hasRussian);

Метод проверяет наличие namespace для конкретного языка в resourceStore.

Дополнительная проверка:

const exists = i18n.exists('some.key');

Однако exists проверяет ключи переводов, а не сам факт загрузки языка.


Инспекция namespace

Namespace — базовая единица загрузки в системе интернационализации i18next.

Проверка загруженных namespace:

console.log(i18n.options.ns);

Активные namespace можно получить через:

console.log(i18n.options.defaultNS);

Для проверки конкретного namespace используется:

i18n.hasLoadedNamespace('translation');

Это особенно важно при ленивой загрузке:

await i18n.loadNamespaces('common');

Отслеживание загрузки языков

Механизм событий позволяет наблюдать за процессом загрузки:

i18n.on('loaded', (loaded) => {
  console.log('Загруженные ресурсы:', loaded);
});

Также полезны события:

  • initialized
  • languageChanged
  • loaded
  • failedLoading

Пример контроля загрузки:

i18n.on('failedLoading', (lng, ns, msg) => {
  console.error(lng, ns, msg);
});

Проверка состояния через backend

Если используется backend-плагин, загрузка языков зависит от асинхронных запросов:

i18n.init({
  backend: {
    loadPath: '/locales/{{lng}}/{{ns}}.json'
  }
});

Проверка завершения загрузки:

i18n.loadNamespaces('translation').then(() => {
  console.log('Namespace загружен');
});

Инспекция через getDataByLanguage

Более прямой доступ к данным:

const ruData = i18n.getDataByLanguage('ru');
console.log(ruData);

Результат включает все namespace для указанного языка.

Структура полезна для:

  • диагностики загрузки
  • отладки fallback-логики
  • проверки целостности переводов

Отладочный режим и визуальный контроль

Включение debug-режима раскрывает процесс загрузки языков:

i18n.init({
  debug: true
});

В консоли отображаются:

  • загружаемые языки
  • выбранные fallback
  • пропущенные ключи
  • состояние backend-запросов

Проверка доступных языков

Список поддерживаемых языков обычно задаётся явно:

i18n.init({
  supportedLngs: ['en', 'ru', 'de']
});

Доступ к ним:

console.log(i18n.options.supportedLngs);

Это не тождественно загруженным языкам — различие важно:

  • supportedLngs — конфигурация
  • languages — runtime-состояние

Управление загрузкой языков

Языки могут подгружаться динамически:

await i18n.loadLanguages(['ru', 'en']);

Или переключаться:

await i18n.changeLanguage('ru');

После смены языка обновляются:

  • i18n.language
  • i18n.languages
  • активные namespace
  • кэш перевода

Проверка целостности загруженных данных

Для диагностики используется обход resourceStore:

function inspectStore(i18n) {
  const data = i18n.services.resourceStore.data;

  Object.keys(data).forEach(lng => {
    Object.keys(data[lng]).forEach(ns => {
      console.log(lng, ns, Object.keys(data[lng][ns]).length);
    });
  });
}

inspectStore(i18n);

Такая проверка выявляет:

  • пустые namespace
  • частично загруженные языки
  • несоответствие структуры

Синхронизация состояния загрузки

При асинхронной загрузке возможны состояния гонки. Для их отслеживания используется комбинация событий и проверок:

let isReady = false;

i18n.on('initialized', () => {
  isReady = true;
});

i18n.on('loaded', () => {
  console.log('Ресурсы обновлены');
});

Проверка fallback-цепочек

Fallback-языки участвуют в инспекции загруженных данных:

i18n.init({
  fallbackLng: ['en', 'de']
});

Текущая цепочка:

console.log(i18n.languages);

Пример результата:

['ru', 'en', 'de']

Поиск перевода выполняется строго по этому порядку, что напрямую влияет на результат t().