Проверка полноты переводов в i18next опирается на механизм сопоставления ключей переводов между исходным языком и целевыми локалями, а также на инструменты обнаружения отсутствующих ресурсов во время выполнения и сборки. В основе лежит концепция ресурсных словарей, где каждая языковая версия представляет собой набор namespace-структур с ключами и значениями.
Переводы в i18next организуются по следующей схеме:
en, ru,
de)common, auth,
validation)button.save,
error.required)Полнота переводов определяется наличием всех ключей, которые используются в коде приложения, во всех целевых языках и namespace.
{
"common": {
"button.save": "Save",
"button.cancel": "Cancel"
}
}
Отсутствие любого ключа в конкретной локали приводит к срабатыванию fallback-логики или возврату ключа как строки, что используется как основной индикатор неполноты.
t и fallback-цепочкуФункция t выполняет поиск ключа в следующем порядке:
Если ключ отсутствует во всех уровнях, он считается непереведённым.
i18next.t('common.button.save')
Поведение при отсутствии зависит от конфигурации:
returnKeyIfNotFound: true — возвращается ключfallbackLng — используется язык-запасparseMissingKeyHandler — обработка отсутствующих
ключейВключение режима debug позволяет фиксировать все случаи
отсутствующих переводов:
i18next.init({
debug: true,
fallbackLng: 'en'
});
При обращении к несуществующему ключу система выводит предупреждения в консоль. Это один из базовых способов выявления неполноты на этапе разработки.
missingKeyHandlerОдним из ключевых механизмов контроля является обработчик отсутствующих ключей:
i18next.init({
missingKeyHandler: function(lng, ns, key, fallbackValue) {
console.warn('Missing translation:', { lng, ns, key });
}
});
Этот механизм позволяет:
saveMissing и серверная фиксация пробеловПри включении saveMissing i18next автоматически
отправляет отсутствующие ключи в backend:
i18next.init({
saveMissing: true,
backend: {
loadPath: '/locales/{{lng}}/{{ns}}.json'
}
});
Сценарий работы:
missingKeyHandlerЭто позволяет строить динамическую систему обнаружения неполных переводов в реальном времени.
existsМетод exists позволяет явно проверять наличие ключа:
i18next.exists('common.button.save', { lng: 'ru' });
Возвращает:
true — ключ присутствуетfalse — ключ отсутствуетЭтот метод используется для:
i18next хранит переводы в resourceStore, который можно
использовать для аудита полноты:
const store = i18next.services.resourceStore.data;
Структура:
{
ru: {
common: {
"button.save": "Сохранить"
}
},
en: {
common: {
"button.save": "Save"
}
}
}
Сравнение ключей между языками позволяет выявить:
Часто используется проверка на уровне namespace:
const enKeys = Object.keys(i18next.getResourceBundle('en', 'common'));
const ruKeys = Object.keys(i18next.getResourceBundle('ru', 'common'));
const missing = enKeys.filter(k => !ruKeys.includes(k));
Этот подход позволяет получить список недостающих переводов для конкретного языка.
i18next поддерживает вложенные структуры:
{
"error": {
"required": "Field is required"
}
}
При использовании keySeparator: '.' ключи
интерпретируются как:
error.required
Проверка полноты должна учитывать:
keySeparatornsSeparatorВ экосистеме используются инструменты статического анализа:
Пример логики парсинга:
t('...') из кодаИнструментальные решения часто используют анализ AST для извлечения ключей:
Это позволяет выявить:
Множественные формы добавляют дополнительный слой проверки:
{
"item": "{{count}} item",
"item_plural": "{{count}} items"
}
Отсутствие хотя бы одной формы считается неполнотой.
Проверка должна учитывать:
pluralsingularzero формы (в некоторых языках)Ключи с интерполяцией требуют дополнительной проверки структуры:
{
"welcome": "Hello {{name}}"
}
Неполные переводы могут проявляться как:
Сравнение выполняется по шаблону:
{{...}}Автоматизированные тесты часто используют стратегию обхода всех ключей:
const resources = i18next.getDataByLanguage('ru');
Object.keys(resources.common).forEach(key => {
if (!i18next.exists(key, { lng: 'ru' })) {
throw new Error(`Missing translation: ${key}`);
}
});
Такой подход позволяет интегрировать проверку в CI-пайплайны.
Fallback поведение часто маскирует отсутствие переводов. Поэтому анализ включает:
Если язык запроса не совпадает с языком результата — перевод считается неполным.
Полноценный аудит обычно включает:
Результатом становится карта покрытия:
ru: 92%
en: 100%
de: 78%
Основные источники ошибок:
t(getKey()))Эти случаи требуют дополнительного статического или runtime-логирования, поскольку простое сравнение ресурсов не выявляет всех пробелов.