В основе работы i18next лежит внутреннее хранилище ресурсов — ResourceStore, представляющее собой структуру в памяти, где организованы все загруженные переводы. Данные хранятся в виде:
Такое представление позволяет выполнять быстрый доступ к строкам без повторных сетевых запросов и без обращения к файловой системе.
Ключевая особенность этого слоя заключается в том, что он является первичным кэшем. Любая загруженная локализация остаётся в памяти до перезагрузки страницы или перезапуска процесса Node.js.
При стандартной инициализации:
t('key') выполняется поиск в
ResourceStoreТаким образом, повторное использование переводов внутри одного сеанса происходит мгновенно.
i18next не ограничивается только памятью. Основной механизм масштабируемого кэширования реализуется через backend-плагины.
При использовании HTTP-загрузчика переводов
(i18next-http-backend) запросы к JSON-файлам проходят через
стандартный механизм fetch/XHR, а значит могут использовать:
Cache-Control,
ETag)Типичная схема:
/locales/en/translation.jsonДополнительно можно управлять поведением через:
requestOptions.cache (для fetch)Пример логики конфигурации:
i18next
.use(Backend)
.init({
backend: {
loadPath: '/locales/{{lng}}/{{ns}}.json',
requestOptions: {
cache: 'default'
}
}
});
Для браузерных приложений часто применяется долговременное хранение
переводов в localStorage. Это снижает количество сетевых
запросов при повторных посещениях.
Существует специализированный backend:
Его принцип работы:
Структура хранения обычно включает:
Это позволяет реализовать простую TTL-логику.
Кэш переводов требует контроля актуальности, поскольку обновления интерфейса могут ломать согласованность текстов.
Часто используется подход:
Пример логики:
storedVersion !== currentVersion → кэш
инвалидируетсяnow - storedTimestamp > TTL → повторная
загрузкаЭто особенно важно в SPA и PWA, где приложение может работать неделями без перезагрузки.
Для сложных приложений применяется комбинация источников через:
Он позволяет выстроить цепочку:
Схема работы:
Такой подход минимизирует задержки и снижает нагрузку на сервер.
В серверных приложениях на Node.js используется файловый backend:
Хотя файловая система сама по себе не является кэшем, на практике реализуются дополнительные оптимизации:
Типичная оптимизация:
i18next поддерживает стратегию lazy-loading переводов, при которой:
Это приводит к естественному кэшированию:
Особенно эффективно в приложениях с множеством языков, где полный набор переводов слишком велик для предварительной загрузки.
Ключевая проблема любых систем локализации — обновление переводов без конфликтов с уже закэшированными версиями.
Используются несколько подходов:
URL включает версию:
/locales/en/translation.v2.json
Изменение версии автоматически обходится без очистки клиентских кэшей.
Добавление параметров запроса:
/locales/en/translation.json?v=12345
Часто используется hash сборки.
i18next позволяет вручную сбрасывать ресурсы:
reloadResourcesЭто используется при runtime-обновлениях интерфейса.
В PWA-приложениях кэширование переводов может быть вынесено на уровень service worker:
/locales/*Поток обработки:
Это снижает задержки до нуля при повторных открытиях приложения.
Хотя интерполяция ({{value}}) не влияет напрямую на
хранение переводов, она важна для понимания стабильности кэша:
Это позволяет хранить минимальный объём ресурсов без дублирования строк.
При масштабных проектах критично контролировать размер локализаций:
common, auth,
dashboard)partialBundledLanguagesКаждый namespace фактически становится отдельной единицей кэширования, что снижает нагрузку на память и сеть.
При повторном вызове i18next.init:
В SPA это позволяет сохранять переводы между переходами по роутам без повторной загрузки.
Эффективная работа системы зависит от согласованности трёх уровней:
Нарушение синхронизации приводит к типичным проблемам:
Для устранения таких ситуаций используется: