В режиме разработки поведение i18next ориентировано на максимальную прозрачность работы системы интернационализации, диагностику ошибок и быстрый цикл внесения изменений. Основная цель — выявление проблем с ключами, переводами и конфигурацией до попадания кода в продакшн.
Ключевая особенность — включение расширенной диагностики через
параметр debug.
import i18n from "i18next";
i18n.init({
debug: true,
fallbackLng: "en",
interpolation: {
escapeValue: false
}
});
При debug: true библиотека начинает активно
логировать:
В разработке отсутствующие ключи не должны оставаться незамеченными. Типичное поведение:
saveMissing для сбора недостающих
переводов.i18n.init({
debug: true,
saveMissing: true,
missingKeyHandler: (lng, ns, key) => {
console.warn(`Missing key: ${key} [${lng}:${ns}]`);
}
});
В таком режиме система может использоваться как инструмент аудита локализации, позволяя выявлять «дыры» в переводах прямо во время разработки интерфейса.
В режиме разработки часто отключается агрессивное кэширование. Это позволяет мгновенно видеть изменения в JSON-файлах переводов.
Типичная конфигурация backend:
import Backend from "i18next-http-backend";
i18n.use(Backend).init({
debug: true,
backend: {
loadPath: "/locales/{{lng}}/{{ns}}.json",
requestOptions: {
cache: "no-store"
}
}
});
Основная цель — гарантировать, что каждый запрос переводов отражает текущее состояние файлов.
В режиме разработки интерполяция часто настраивается более мягко, чтобы ошибки не блокировали интерфейс:
interpolation: {
escapeValue: false,
skipOnVariables: false
}
При этом удобно включать логирование некорректных данных, например
undefined или null в шаблонах.
Продакшн-режим i18next ориентирован на производительность, минимизацию размера бандла и предсказуемость поведения. Основная цель — исключить лишние вычисления и логирование, сохранив стабильную работу переводов.
Главное правило — отсутствие диагностического шума:
i18n.init({
debug: false,
fallbackLng: "en"
});
Выключение debug существенно снижает нагрузку на консоль
и ускоряет выполнение, особенно в больших приложениях с множеством
переводов.
В продакшне критично минимизировать количество запросов и размер загружаемых файлов.
Часто используются:
backend: {
loadPath: "https://cdn.example.com/locales/{{lng}}/{{ns}}.json",
crossDomain: true,
withCredentials: false
}
В продакшне включается кэширование переводов, чтобы исключить повторные загрузки:
Cache-Control);Дополнительно может использоваться
i18next-chained-backend, где сначала проверяется кэш, затем
сеть.
Часто режимы переключаются автоматически через переменную окружения:
i18n.init({
debug: process.env.NODE_ENV !== "production",
saveMissing: process.env.NODE_ENV !== "production"
});
Такой подход обеспечивает синхронизацию поведения с общими практиками сборки (Webpack, Vite, Next.js).
В продакшне важен контроль за размером бандла. i18next поддерживает модульную архитектуру, что позволяет:
Пример ленивой загрузки:
i18n.loadNamespaces(["common", "auth"]);
В сочетании с code splitting это снижает первоначальную нагрузку на приложение.
Хотя продакшн-режим предполагает минимизацию логов, иногда включают ограниченную диагностику:
i18n.init({
debug: false,
saveMissing: true,
missingKeyHandler: (lng, ns, key) => {
fetch("/log-missing-key", {
method: "POST",
body: JSON.stringify({ lng, ns, key })
});
}
});
В обоих режимах сохраняется логика fallback, но в продакшне она должна быть стабильной и предсказуемой.
fallbackLng: ["en", "ru"]
Разница заключается в том, что в разработке fallback сопровождается предупреждениями, а в продакшне — нет.
Практика разделения конфигураций позволяет избежать смешения режимов:
const isDev = process.env.NODE_ENV !== "production";
export const i18nConfig = {
debug: isDev,
fallbackLng: "en",
saveMissing: isDev,
backend: {
loadPath: isDev
? "/locales/{{lng}}/{{ns}}.json"
: "https://cdn.example.com/locales/{{lng}}/{{ns}}.json"
}
};
Использование CDN является стандартной практикой:
При этом важно поддерживать версионирование:
/locales/v3/en/common.json
Это предотвращает проблемы с кэшированием при обновлении переводов.
Разработка:
Продакшн:
В продакшне критично исключать XSS-риски. i18next использует
экранирование значений интерполяции по умолчанию, но при
escapeValue: false ответственность переносится на
разработчика.
interpolation: {
escapeValue: true
}
В продакшне часто предпочтительно включать экранирование, особенно при работе с пользовательскими данными.
Разделение режимов фактически формирует два разных уровня работы:
При этом архитектура i18next позволяет использовать единый код с переключаемыми конфигурациями, не требующими дублирования логики перевода.