В системе i18next обработка отсутствующих переводов основана на механизме цепочек резервных языков (fallback languages). При обращении к ключу перевода библиотека последовательно проходит по заранее заданному списку языков, пока не найдёт первое подходящее значение. Такой подход позволяет поддерживать частичную локализацию без необходимости полного покрытия всех языков.
При вызове перевода учитывается текущий язык (lng). Если
ключ отсутствует, выполняется переход к следующему языку из
fallback-цепочки, заданной через fallbackLng.
Типичный порядок разрешения:
lng)fallbackLng в заданном порядкеdev или
en)Параметр fallbackLng задаёт последовательность языков,
которые используются при отсутствии перевода.
import i18n from 'i18next';
i18n.init({
lng: 'ru',
fallbackLng: 'en',
resources: {
en: {
translation: {
title: "Title"
}
}
}
});
При отсутствии ключа в ru поиск продолжается в
en.
Fallback может быть задан как массив, формируя явную цепочку приоритетов:
i18n.init({
lng: 'uk',
fallbackLng: ['uk', 'ru', 'en']
});
Механизм обработки:
uk)ru)en)Такая структура используется для регионов с близкими языками или частично перекрывающимися словарями.
Поддерживается настройка fallback на уровне отдельных языков:
i18n.init({
lng: 'de-CH',
fallbackLng: {
'de-CH': ['de-DE', 'de', 'en'],
'de': ['en'],
'default': ['en']
}
});
Такой подход позволяет учитывать диалекты и региональные вариации. Например, швейцарский немецкий может сначала искать переводы в стандартном немецком, а затем в английском.
i18next автоматически учитывает языковые коды с регионами:
en-USen-GBpt-BRpt-PTЕсли перевод для en-US отсутствует, возможна деградация
к en, если включена соответствующая логика fallback:
i18n.init({
lng: 'en-US',
fallbackLng: 'en'
});
Поведение зависит от настроек load и
nonExplicitSupportedLngs.
Параметр load определяет, как интерпретируются языковые
коды:
all — загрузка всех вариантовcurrentOnly — только точный языкlanguageOnly — игнорирование регионовi18n.init({
load: 'languageOnly',
fallbackLng: 'en'
});
При languageOnly en-US автоматически
сводится к en, что уменьшает количество уровней
fallback.
Если ключ отсутствует во всех fallback-языках, применяется одна из стратегий:
nulli18n.init({
returnNull: false,
returnEmptyString: false
});
Комбинация этих параметров влияет на итоговое поведение цепочки fallback.
i18next поддерживает namespaces, и fallback может учитывать структуру ресурсов:
i18n.init({
ns: ['common', 'home'],
defaultNS: 'common',
fallbackLng: ['en']
});
Если ключ отсутствует в текущем namespace, поиск продолжается:
При сложных конфигурациях применяется комбинированный порядок:
Пример структуры ресурсов:
resources: {
en: {
common: { ok: "OK" },
home: { title: "Home" }
},
ru: {
common: { ok: "ОК" }
}
}
При запросе home.title в ru:
ru/home/title → отсутствуетen/home/title → найденоFallback-цепочка может изменяться во время выполнения:
i18n.changeLanguage('fr');
i18n.options.fallbackLng = ['fr', 'en'];
Такой подход используется в сценариях:
При использовании вложенных структур:
resources: {
en: {
translation: {
user: {
profile: {
title: "Profile"
}
}
}
}
}
Fallback применяется на уровне полного ключа. Частичное совпадение не
считается успешным результатом. Если user.profile.title
отсутствует, происходит переход к следующему языку целиком.
Fallback влияет только на выбор перевода, но не на обработку интерполяции:
{
greeting: "Hello {{name}}"
}
Если ключ найден в fallback-языке, интерполяция выполняется после выбора строки, независимо от языка-источника.
Контекстные ключи учитываются в цепочке так же, как обычные:
keykey_malekey_femaleПри отсутствии контекстной формы поиск продолжается в fallback-языках, включая те же контекстные варианты.
В сложных системах возможны вложенные цепочки:
fallbackLng: [
'uk',
'ru',
'pl',
'en'
]
При этом каждая ветка проверяется полностью до перехода к следующей. Это создаёт линейную деградацию качества перевода:
Эффективность fallback зависит от:
Слишком длинные цепочки увеличивают количество проверок при каждом обращении к переводу. Поэтому часто используются компактные конфигурации:
fallbackLng: ['en']
или ограниченные региональные цепочки:
fallbackLng: ['de', 'en']
При использовании i18next-browser-languagedetector
итоговый язык может определяться автоматически, после чего применяется
fallback:
После определения lng активируется стандартная цепочка
fallbackLng, что создаёт многоуровневую систему выбора
локали.
При использовании backend-лоадеров переводы могут кэшироваться. В этом случае fallback происходит:
Если язык уже загружен, fallback ограничивается локальной структурой ресурсов без дополнительных сетевых запросов.
Для анализа fallback-цепочек используется debug-режим:
i18n.init({
debug: true
});
В логах фиксируются:
Это позволяет выявлять неполные переводы и избыточные цепочки поиска.
При отключении fallback:
i18n.init({
fallbackLng: false
});
перевод выполняется строго в рамках текущего языка. Отсутствующие ключи не компенсируются другими локалями, что приводит к возврату ключей или пустых значений в зависимости от настроек.