В i18next отсутствие ключа не является исключением исполнения, а обрабатывается как часть нормального потока разрешения строки перевода. Основная логика построена вокруг цепочки: поиск в текущем языке → поиск в fallback-языках → применение стратегий возврата значения.
Если ключ не найден ни в одном из доступных ресурсов, результат определяется набором конфигурационных параметров и поведением внутренних обработчиков.
Ключевой принцип: отсутствие перевода не ломает выполнение, а возвращает предсказуемое значение (ключ, fallback или пользовательское значение).
При вызове t('some.key') происходит последовательный
поиск:
ru)common)fallbackLng)Если совпадений нет, активируется механизм обработки отсутствующего ключа.
Параметр fallbackLng определяет языки, которые
используются при отсутствии перевода.
Типичный сценарий:
ruenПри отсутствии ключа в ru система автоматически
обращается к en.
Пример конфигурации:
i18n.init({
lng: 'ru',
fallbackLng: 'en'
});
Поддерживается каскадная стратегия:
fallbackLng: ['uk', 'ru', 'en']
Порядок строго детерминирован: uk → ru → en → ключ
Это позволяет выстраивать иерархию языков, где базовый язык содержит полный набор переводов.
Если ключ отсутствует во всех языках, применяется один из режимов:
"some.missing.key")nulldefaultValueКонтролируется следующими настройками:
i18n.init({
returnNull: false,
returnEmptyString: false
});
true → возвращается nullfalse → происходит дальнейшая обработка fallback или
возврат ключаОпределяет, допускается ли пустая строка как валидный результат.
defaultValue позволяет задать резервное значение на
уровне вызова:
t('button.save', { defaultValue: 'Save' })
При отсутствии перевода возвращается Save.
Характеристика стратегии:
В сложных интерфейсах используется как слой безопасности поверх fallbackLng.
Механизм missingKeyHandler позволяет перехватывать
события отсутствующих переводов.
i18n.init({
missingKeyHandler: (lng, ns, key, fallbackValue) => {
// логирование или отправка в систему мониторинга
}
});
Типичные сценарии использования:
Поведение не влияет на возвращаемый результат напрямую, но используется как побочный канал контроля качества переводов.
Параметр saveMissing активирует автоматическую отправку
отсутствующих ключей в backend:
i18n.init({
saveMissing: true
});
При каждом отсутствии ключа происходит:
Это формирует динамический словарь недостающих переводов.
i18next активно использует пространства имён
(namespace), и отсутствие ключа может быть связано не с
отсутствием перевода, а с отсутствием загрузки namespace.
Пример:
t('auth:login.title')
Если namespace auth не загружен:
Проверка доступности:
i18n.hasResourceBundle('ru', 'auth')
Отсутствие ключа может компенсироваться во время выполнения:
i18n.addResource('ru', 'common', 'button.save', 'Сохранить');
или пакетно:
i18n.addResourceBundle('ru', 'common', {
button: {
save: 'Сохранить'
}
});
Это позволяет устранять отсутствующие ключи без перезагрузки приложения.
Поведение при отсутствии ключей часто разделяется по средам.
debug: truei18n.init({
debug: true
});
fallbackLngsaveMissing (в некоторых системах)Цель: минимизация визуальных артефактов и контроль качества переводов.
Обобщённая цепочка выглядит следующим образом:
defaultValuereturnEmptyStringreturnNullСтратегия отсутствующих ключей зависит от конфигурации разделителей:
i18n.init({
keySeparator: '.',
nsSeparator: ':'
});
При отключении разделителя (keySeparator: false)
структура ключа становится плоской, что влияет на вероятность «ложного
отсутствия» перевода.
Отсутствие ключа может касаться не всей записи, а конкретной формы:
Пример:
t('item', { count: 5 })
Если отсутствует форма item_plural, применяется:
Даже при наличии ключа возможна неполнота данных:
t('welcome', { name: undefined })
Стратегии обработки:
defaultValueНастройка:
interpolation: {
skipOnVariables: false
}
При returnObjects: true:
t('form', { returnObjects: true })
Если часть структуры отсутствует:
В системах с высокой динамикой данных применяется комбинация стратегий:
fallbackLng как основной слойdefaultValue для критичных элементов интерфейсаmissingKeyHandler для мониторингаsaveMissing для накопления недостающих ключейdebug в среде разработкиЭто формирует устойчивую модель, в которой отсутствие перевода не влияет на работоспособность интерфейса, но фиксируется как событие качества данных.
При использовании backend-подгрузки:
t() после загрузки может вернуть
корректное значениеКонтроль состояния переводов:
i18n.hasResourceBundle(lng, ns)
i18n.getResourceBundle(lng, ns)
Позволяет реализовывать стратегию:
Система обработки отсутствующих переводов в i18next строится как многоуровневый конвейер:
defaultValueТакая архитектура позволяет поддерживать предсказуемость интерфейса при неполных переводах и одновременно сохранять контроль над качеством локализации на уровне данных.