i18next после инициализации формирует внутренний кэш загруженных
переводов в памяти приложения. Все ресурсы, полученные через backend
(HTTP, файловую систему или пользовательский загрузчик), сохраняются в
структуре store.
Ключевая особенность этого механизма — отсутствие повторных запросов к источнику при повторном обращении к одной и той же локали и namespace.
Основные свойства поведения:
ресурсы хранятся в оперативной памяти до перезагрузки страницы или перезапуска Node.js-процесса
повторный вызов t() не инициирует повторную загрузку
переводов
данные группируются по:
lng)ns)Пример структуры хранения:
i18next.services.resourceStore.data = {
en: {
translation: {
hello: "Hello"
}
},
ru: {
translation: {
hello: "Привет"
}
}
}
Кеш в памяти не имеет встроенного TTL и очищается только вручную или при уничтожении экземпляра i18next.
При использовании i18next-http-backend ключевую роль
играет механизм загрузки переводов по HTTP. Он опирается на стандартное
кеширование браузера и сетевого уровня.
Базовая конфигурация:
import Backend from 'i18next-http-backend';
i18next.use(Backend).init({
backend: {
loadPath: '/locales/{{lng}}/{{ns}}.json'
}
});
Кеширование контролируется заголовками HTTP:
Cache-ControlETagLast-ModifiedЕсли сервер возвращает корректные заголовки, браузер:
Это снижает нагрузку на backend без участия i18next.
i18next-http-backend предоставляет дополнительные
параметры, влияющие на повторное получение данных.
requestOptionsПозволяет управлять HTTP-запросами, включая заголовки кеширования:
backend: {
loadPath: '/locales/{{lng}}/{{ns}}.json',
requestOptions: {
cache: 'force-cache'
}
}
Использование зависит от окружения (fetch или xhr).
allowMultiLoadingХотя напрямую не является кешем, влияет на количество запросов:
backend: {
allowMultiLoading: true,
loadPath: '/locales/{{lng}}/all.json'
}
Позволяет загружать несколько namespace за один запрос, уменьшая вероятность повторных сетевых обращений.
Стандартный i18next не хранит переводы в persistent storage, но
существует подход через localStorage-backend.
Пример использования i18next-localstorage-backend:
import LocalStorageBackend from 'i18next-localstorage-backend';
i18next.use(LocalStorageBackend).init({
backend: {
expirationTime: 7 * 24 * 60 * 60 * 1000,
defaultVersion: '1.0',
versions: {
en: '1.0',
ru: '1.0'
}
}
});
expirationTimeОпределяет время жизни кеша в миллисекундах.
versionsИспользуется для инвалидации кеша при изменении переводов.
Плагин i18next-browser-languagedetector также использует
кеширование, но другого типа — сохранение выбранного языка.
Основные опции:
import LanguageDetector from 'i18next-browser-languagedetector';
i18next.use(LanguageDetector).init({
detection: {
caches: ['localStorage', 'cookie']
}
});
cachesОпределяет, куда сохраняется выбранный язык:
localStoragecookiesessionStorageЭто не кеш переводов, но влияет на повторную инициализацию языка.
i18next использует внутреннюю защиту от дублей запросов.
При одновременной загрузке одного и того же ресурса:
Это предотвращает:
i18next-chained-backend позволяет комбинировать
несколько источников с приоритетами, например:
import ChainedBackend from 'i18next-chained-backend';
import HttpBackend from 'i18next-http-backend';
import LocalStorageBackend from 'i18next-localstorage-backend';
i18next.use(ChainedBackend).init({
backend: {
backends: [
LocalStorageBackend,
HttpBackend
],
backendOptions: [
{
expirationTime: 24 * 60 * 60 * 1000
},
{
loadPath: '/locales/{{lng}}/{{ns}}.json'
}
]
}
});
Инвалидация происходит по нескольким сценариям:
versions: {
ru: '2.0'
}
Любое изменение версии приводит к игнорированию старых данных.
expirationTime: 86400000
После истечения времени данные считаются устаревшими.
Возможна через API браузера:
localStorage.removeItem('i18next_res_en_translation')
Очистка происходит автоматически при перезагрузке приложения.
На кеширование напрямую влияет стратегия load.
load: 'all'Загружаются все варианты языка:
i18next.init({
load: 'all'
});
load: 'currentOnly'Загружается только текущая локаль:
load: 'languageOnly'Игнорируются региональные вариации:
en-US → enОпция preload позволяет заранее заполнить кеш:
i18next.init({
preload: ['en', 'ru']
});
Эффект:
При включении saveMissing создаётся дополнительный поток
данных, который может влиять на кеширование состояния:
i18next.init({
saveMissing: true
});
Хотя это не кеш переводов, а механизм отправки отсутствующих ключей, он влияет на:
В серверном окружении кеширование имеет особенности:
Для оптимизации применяются:
Практически используемые схемы:
Кеширование напрямую влияет на:
t()Наиболее критичный слой — сетевой, поэтому основная оптимизация достигается через: