В системах интернационализации на базе i18next механизм fallback-языков определяет поведение приложения в ситуации, когда перевод отсутствует в текущей локали. Вместо «пустого» результата система последовательно переходит к альтернативным языкам, пока не найдёт подходящее значение.
Ключевая идея fallback-стратегии заключается в формировании упорядоченной цепочки языков, где каждый следующий язык выступает резервным источником переводов.
Параметр fallbackLng задаёт основной механизм
резервирования языков. Он может быть строкой, массивом или функцией.
import i18next from 'i18next';
i18next.init({
lng: 'ru',
fallbackLng: 'en',
resources: {
en: {
translation: {
greeting: "Hello"
}
},
ru: {
translation: {
greeting: "Привет"
}
}
}
});
Если ключ отсутствует в ru, система обратится к
en.
fallbackLng: ['uk', 'pl', 'en']
При отсутствии перевода поиск выполняется последовательно:
Порядок имеет критическое значение: первый найденный перевод останавливает дальнейший поиск.
fallbackLng: {
'ru-KG': ['ru', 'en'],
'default': ['en']
}
Здесь используется иерархия региональных вариантов. Например,
ru-KG сначала ищет перевод в киргизском варианте русского,
затем в общем русском, затем в английском.
i18next автоматически нормализует языковые коды, используя стандарты BCP 47.
Примеры цепочек:
ru-RU → ru → enpt-BR → pt → enzh-Hant-TW → zh-Hant → zh →
enЭта иерархия позволяет покрывать широкий спектр локалей без дублирования ресурсов.
Помимо языков, fallback применяется и к namespace (пространствам переводов).
i18next.init({
ns: ['common', 'home', 'errors'],
defaultNS: 'common',
fallbackNS: ['common', 'errors']
});
Если ключ отсутствует в текущем namespace:
commonerrorsЭто особенно важно в модульных приложениях, где переводы разделены по функциональным областям.
defaultNS задаёт основной namespace, используемый при
отсутствии явного указания.
defaultNS: 'common'
Если ключ запрашивается без namespace:
i18next.t('submit')
поиск выполняется сначала в common, затем в
fallbackNS.
Если перевод не найден ни в одном языке и namespace, поведение зависит от конфигурации:
По умолчанию возвращается сам ключ:
missing_key → "missing_key"
returnNulli18next.init({
returnNull: true
});
В этом режиме вместо строки возвращается null.
returnEmptyStringreturnEmptyString: false
Пустые строки считаются отсутствием перевода и активируют fallback.
Можно явно задавать языки для поиска:
i18next.t('welcome', {
lng: 'fr',
fallbackLng: ['en', 'de']
});
Это позволяет переопределять глобальную стратегию для отдельных вызовов.
Механизм множественных форм также участвует в fallback-цепочке.
Пример:
{
"apple_one": "яблоко",
"apple_other": "яблок"
}
Если форма отсутствует в текущем языке, система ищет её в fallback-языке. При этом учитывается CLDR-логика plural rules, а не только наличие ключа.
При использовании language detector
(i18next-browser-languagedetector), цепочка формируется
динамически:
i18next.init({
detection: {
order: ['querystring', 'cookie', 'localStorage', 'navigator']
},
fallbackLng: 'en'
});
Если ни один источник не дал переводимого языка, активируется fallback.
Fallback работает после этапа разрешения интерполяции.
{
welcome: "Hello {{name}}"
}
Если ключ найден только в fallback-языке, интерполяция выполняется уже на его основе.
В реальных проектах часто встречается ситуация неполного покрытия переводов.
ru: {
translation: {
login: "Войти"
}
}
en: {
translation: {
login: "Login",
logout: "Logout"
}
}
При запросе:
i18next.t('logout')
результат берётся из en, так как в ru ключ
отсутствует.
fallbackLng: (code) => {
if (code.startsWith('ru')) return ['ru', 'en'];
return ['en'];
}
Функция позволяет динамически вычислять цепочку языков на основе входного кода, окружения или бизнес-логики.
i18next.init({
fallbackLng: false
});
В этом режиме отсутствует резервная логика: если ключ не найден, возвращается fallback-результат по правилам missing key handling.
Полная последовательность разрешения ключа в i18next:
Эта цепочка обеспечивает предсказуемость даже в сложных мульти-язычных конфигурациях.
После первого разрешения ключа результат кэшируется. Это означает, что:
При динамической загрузке переводов:
i18next.loadNamespaces('dashboard');
fallback может временно активироваться до завершения загрузки namespace. Это приводит к промежуточным состояниям, где часть ключей берётся из fallback-языка.
В сложных приложениях fallback может сочетаться:
Все уровни работают независимо, но в рамках одной общей стратегии разрешения значения.
{
keySeparator: '.'
}
Если ключ auth.login.title отсутствует в текущем языке,
система попытается найти его в fallback-языке с тем же путём доступа к
структуре объекта ресурсов.
Если ресурс существует, но значение равно undefined или
null, оно трактуется как отсутствие перевода и инициирует
fallback-поиск. Это важное отличие от пустой строки, которая может
интерпретироваться в зависимости от returnEmptyString.