i18next в экосистеме Express интегрируется через промежуточный слой,
обеспечивающий автоматическое определение языка запроса, привязку
функций перевода к объекту запроса и подготовку данных для шаблонов. В
современных версиях используется пакет
i18next-http-middleware, который эволюционно заменил более
ранний i18next-express-middleware, сохранив архитектурные
принципы и расширив поддержку Node.js-сред.
Middleware для i18next в Express выполняет несколько ключевых задач в рамках одного запроса:
t к req;req, res и
i18next-инстансом;Ключевая идея: каждый HTTP-запрос получает собственный контекст локализации, изолированный от других запросов.
Перед подключением middleware создаётся и конфигурируется экземпляр i18next:
import i18next from 'i18next';
import Backend from 'i18next-fs-backend';
import middleware from 'i18next-http-middleware';
i18next
.use(Backend)
.use(middleware.LanguageDetector)
.init({
fallbackLng: 'en',
preload: ['en', 'ru'],
ns: ['common'],
defaultNS: 'common',
backend: {
loadPath: './locales/{{lng}}/{{ns}}.json'
}
});
Важные параметры конфигурации:
fallbackLng — язык, используемый при отсутствии
перевода;preload — предзагрузка доступных языков;ns — список пространств имён переводов;defaultNS — пространство имён по умолчанию;backend.loadPath — путь к JSON-файлам локалей.Middleware подключается после инициализации i18next:
import express from 'express';
const app = express();
app.use(middleware.handle(i18next));
После подключения каждый запрос получает расширенный объект
req:
req.t — функция перевода;req.language — определённый язык запроса;req.languages — список языков по приоритету;req.i18n — экземпляр i18next;res.locals.t — доступ к переводам в шаблонах.LanguageDetector внутри middleware анализирует входящий запрос по нескольким источникам:
?lng=ru);Accept-Language;Приоритет источников задаётся конфигурацией:
detection: {
order: ['querystring', 'cookie', 'header'],
caches: ['cookie']
}
Особенность: первый найденный валидный язык становится активным для запроса.
После определения языка middleware создаёт контекст:
req.t('key');
Функция t уже учитывает:
Пример использования:
app.get('/', (req, res) => {
res.send(req.t('welcome_message'));
});
Для серверного рендеринга middleware заполняет
res.locals:
app.set('view engine', 'pug');
app.get('/', (req, res) => {
res.render('index');
});
В шаблоне:
h1= t('title')
p= t('description')
Функция t автоматически доступна благодаря
res.locals.
Middleware поддерживает разделение переводов по логическим модулям:
{
"common": {
"welcome": "Добро пожаловать"
},
"auth": {
"login": "Вход"
}
}
Использование:
req.t('login', { ns: 'auth' });
Или установка namespace по умолчанию:
i18next.init({
defaultNS: 'common'
});
Middleware полностью поддерживает интерполяцию i18next:
req.t('greeting', { name: 'Alex' });
Перевод:
{
"greeting": "Привет, {{name}}"
}
Результат:
Привет, Alex
Поддерживаются:
Язык может быть изменён во время обработки запроса:
req.i18n.changeLanguage('ru');
После вызова:
req.t начинает использовать новый язык;req.language обновляется;Middleware поддерживает автоматическое сохранение языка в cookie:
detection: {
caches: ['cookie'],
cookieName: 'i18next'
}
Поведение:
С использованием i18next-fs-backend переводы загружаются
с файловой системы:
locales/
ru/
common.json
en/
common.json
Middleware автоматически:
При отсутствии перевода применяется fallback-цепочка:
Пример:
fallbackLng: 'en'
Если ключ отсутствует:
missing_key → missing_key (или значение из en)
В контексте Express ключевыми оптимизациями являются:
preload);Особенно важно:
Middleware полностью совместим с async/await:
app.get('/data', async (req, res) => {
const message = req.t('async_loaded');
res.json({ message });
});
Контекст языка сохраняется в рамках event loop и не теряется при асинхронных операциях.
Часто встречающиеся проблемы:
i18next.init;LanguageDetector;app.use;В сложных приложениях middleware интегрируется в цепочку:
app.use(express.json());
app.use(middleware.handle(i18next));
app.use(routes);
Порядок критичен:
req.t.После обработки middleware запрос содержит полный набор локализационных данных:
Этот контекст используется всеми слоями приложения: контроллерами, сервисами и шаблонами.