Архитектура загрузки переводов в i18next строится вокруг гибкой системы источников ресурсов и правил их разрешения. В отличие от статических решений, i18next допускает динамическую подгрузку переводов через HTTP, файловые системы (в Node.js), кастомные backend-плагины и собственные обработчики запросов. Центральное место занимает конфигурация путей (loadPath) и endpoints, определяющих, откуда и каким образом будут получены языковые ресурсы.
i18next разделяет процесс получения переводов на несколько уровней:
Ключевым элементом выступает backend-слой, который отвечает за взаимодействие с источником данных.
Наиболее распространённый сценарий — использование HTTP backend через
i18next-http-backend. В этом случае конфигурация путей
задаётся через шаблон loadPath.
import i18next from "i18next";
import HttpBackend from "i18next-http-backend";
i18next
.use(HttpBackend)
.init({
lng: "en",
fallbackLng: "ru",
ns: ["common", "auth"],
defaultNS: "common",
backend: {
loadPath: "/locales/{{lng}}/{{ns}}.json"
}
});
В строке пути используются переменные:
{{lng}} — код языка (en, ru, de){{ns}} — namespace (common, auth, dashboard){{nsSeparator}} и {{keySeparator}}
применяются в специфических сценарияхqueryStringParametersПример итогового запроса:
/locales/ru/common.json
/locales/en/auth.json
При работе через HTTP backend endpoint определяется как базовый URL,
к которому добавляется loadPath. В ряде архитектур
используется разделение:
backend: {
loadPath: "https://cdn.example.com/i18n/{{lng}}/{{ns}}.json"
}
Здесь endpoint фактически встроен в путь, что делает конфигурацию простой, но менее гибкой.
В более сложных системах endpoint отделяется от логики формирования пути.
const API_BASE = "https://api.example.com";
backend: {
loadPath: `${API_BASE}/translations/{{lng}}/{{ns}}`,
addPath: `${API_BASE}/translations`,
allowMultiLoading: true
}
loadPath — получение переводовaddPath — отправка новых ключей (в системах с
динамической локализацией)read и write endpoints в кастомных
backend-плагинахДля контроля над endpoint-запросами используется функция
requestOptions.
backend: {
loadPath: "/api/i18n/{{lng}}/{{ns}}",
requestOptions: {
method: "GET",
credentials: "include",
headers: {
"Authorization": "Bearer TOKEN",
"Content-Type": "application/json"
}
}
}
Такая конфигурация позволяет интегрировать i18next с защищёнными API, где endpoint требует авторизации.
В некоторых архитектурах переводимые ресурсы не хранятся в статических JSON-файлах, а генерируются динамически через API.
backend: {
loadPath: "/api/translations",
queryStringParams: {
lang: "{{lng}}",
namespace: "{{ns}}",
version: "1.0"
}
}
Фактический endpoint будет выглядеть так:
/api/translations?lang=ru&namespace=common&version=1.0
В продакшн-архитектурах часто применяется каскадная схема:
Пример конфигурации с fallback:
backend: {
loadPath: [
"https://cdn.example.com/i18n/{{lng}}/{{ns}}.json",
"https://api.example.com/i18n/{{lng}}/{{ns}}"
]
}
Если первый endpoint недоступен, выполняется переход ко второму.
i18next не реализует кэш самостоятельно, но работает в связке с backend-слоем или браузерным кэшем.
backend: {
loadPath: "/locales/{{lng}}/{{ns}}.json",
allowMultiLoading: true,
crossDomain: true
}
Влияние на endpoint:
crossDomain: true активирует CORS-запросыallowMultiLoading уменьшает количество обращений к
endpoint за счёт пакетной загрузки namespacesДля управления изменениями переводов применяется версионирование URL.
backend: {
loadPath: "/i18n/v2/{{lng}}/{{ns}}.json"
}
или через query:
/i18n/{{lng}}/{{ns}}.json?v=2
Версионирование обеспечивает:
В некоторых системах endpoint вычисляется программно.
backend: {
loadPath: (lng, ns) => {
if (lng === "ru") {
return `/ru-api/${ns}`;
}
return `/global-api/${lng}/${ns}`;
}
}
Такая схема используется при:
Namespaces напрямую влияют на структуру endpoint-запросов. При использовании нескольких namespaces i18next формирует отдельные обращения или агрегирует их.
ns: ["common", "dashboard", "errors"],
defaultNS: "common"
Запросы к endpoint:
/locales/ru/common.json
/locales/ru/dashboard.json
/locales/ru/errors.json
или при мультизагрузке:
/locales/ru/{common,dashboard,errors}.json
При недоступности endpoint применяется fallback-цепочка:
i18next.init({
fallbackLng: "en",
saveMissing: false
});
Если endpoint возвращает ошибку:
i18next переключается на резервный язык без прерывания работы приложения.
При работе с внешними endpoint важно учитывать:
Пример безопасной конфигурации:
backend: {
loadPath: "/api/i18n/{{lng}}/{{ns}}",
requestOptions: {
credentials: "same-origin",
headers: {
"X-Requested-With": "XMLHttpRequest"
}
}
}
Использование CDN меняет роль endpoint с динамического API на статический ресурсный слой.
backend: {
loadPath: "https://cdn.static-i18n.com/{{lng}}/{{ns}}.json"
}
Особенности:
При сложных приложениях endpoint может быть распределён между несколькими провайдерами:
Логика объединения:
backend: {
loadPath: [
"/api/user-translations/{{lng}}/{{ns}}",
"/cdn/system/{{lng}}/{{ns}}.json"
]
}
Результат объединяется в единый ресурсный объект, где приоритет зависит от порядка загрузки.