Спросите свой вопрос и получите сводку документа, используя эту страницу и выбранного вами поставщика AI
Содержимое этой страницы было переведено с помощью ИИ.
Смотреть последнюю версию оригинального контента на английскомЕсли у вас есть идея по улучшению этой документации, не стесняйтесь внести свой вклад, подав запрос на вытягивание на GitHub.
Ссылка на документацию GitHubКопировать Markdown документа в буфер обмена
i18next против Intlayer | Бенчмарк интернационализации (i18n) для React и Next.js
i18next - самый распространенный i18n-фреймворк в экосистеме JavaScript. Через react-i18next и next-i18next он используется в огромном количестве приложений на React и Next.js. Intlayer представляет собой альтернативу на основе компилятора с изолированной областью видимости для каждого компонента.
В этой статье они сравниваются на основе реальных замеров, а не списков возможностей. Данные взяты из Benchmark Bloom - открытого набора тестов, собирающего одно и то же приложение на каждой библиотеке и фиксирующего то, что браузер фактически загружает по сети.
tl;dr:i18nextоказался самым тяжелым runtime в бенчмарке: +77 KB gzip на страницу в Next.js при базовой конфигурации, +22 KB после полной оптимизации пространств имен и ленивой загрузки. Intlayer добавляет всего +0.3 KB. Каждая конфигурацияi18next, кроме полностью изолированной (scoped), отдает ~90% строк с посторонних страниц; Intlayer отдает 0% по умолчанию. Переключение языка с динамической подгрузкой через бэкенд заняло 123-185 ms вreact-i18nextпротив 3-4 ms в Intlayer. Адаптер@intlayer/next-i18nextсохраняет APIi18nextи продемонстрировал результат 150.7 KB на страницу против 218.5 KB в оригинале.
Вкратце
- i18next / react-i18next / next-i18next - Зрелый, богатый плагинами, независимый от фреймворка инструмент. Пространства имен, детекторы языка, бэкенды, ICU через плагины, компонент
<Trans>для сложной разметки. Контент хранится централизованно вlocales/{lng}/{ns}.json. Мощный, однако каждая оптимизация (разделение пространств имен, постраничная загрузка, типобезопасность) требует ручной настройки и поддержки. - Intlayer - Модель с упором на компоненты. Словари
.content.tsрасполагаются рядом с компонентом, для которого предназначены. Компилятор во время сборки выполняет tree-shaking и загружает их лениво для каждого компонента и языка. Строгие типы TypeScript формируются автоматически, а пропущенные переводы вызывают ошибки сборки. Включает middleware, SEO-утилиты, визуальный редактор / CMS и перевод с помощью ИИ.
Открыть таблицу в модальном окне для четкого просмотра всех данных
Значки обновляются автоматически. Показатели со временем меняются.
Сравнение возможностей
Открыть таблицу в модальном окне для четкого просмотра всех данных
| Возможность | Intlayer (react-intlayer / next-intlayer) | i18next (react-i18next / next-i18next) |
|---|---|---|
| Переводы рядом с компонентами | ✅ Да, .content.ts располагается рядом с компонентом | ❌ Нет, централизованно в locales/{lng}/{ns}.json |
| Интеграция с TypeScript | ✅ Строгие типы создаются автоматически из контента | ⚠️ Базовая; требует расширения CustomTypeOptions и описания ресурсов |
| Поиск пропущенных переводов | ✅ Ошибка TypeScript + ошибка/предупреждение при сборке | ⚠️ Заглушка в runtime (saveMissing, возврат ключа) |
| Сложный контент (JSX / Markdown) | ✅ Прямая поддержка | ⚠️ <Trans> с числовыми индексами |
| Поддержка ICU | ⚠️ В разработке | ⚠️ Через плагин (i18next-icu) |
| Плюрализация | ✅ Шаблоны на основе перечислений | ✅ Суффиксы _one / _other (Intl.PluralRules) |
| Форматирование (даты, числа, валюты) | ✅ useNumber, useDate, ... (встроенный Intl) | ⚠️ Форматировщики интерполяции или ручной вызов Intl.* |
| Локализованная маршрутизация и middleware | ✅ Встроенный прокси/middleware, getMultilingualUrls | ⚠️ Не входит в ядро; сторонние библиотеки или собственный код |
| SEO-утилиты (hreflang, sitemap, robots) | ✅ Встроенные помощники | ❌ Вручную |
| Синхронные серверные компоненты | ✅ useIntlayer из next-intlayer/server доступен в любом серверном компоненте | ⚠️ getFixedT на странице и проброс t через props |
| Tree-shaking (только нужный контент) | ✅ Для каждого компонента и языка, автоматически компилятором | ⚠️ Вручную: namespaces + список ns на страницу + бэкенд |
| Lazy loading | ✅ importMode: 'dynamic' (одна строка конфигурации) | ✅ Через плагины бэкенда (i18next-resources-to-backend, i18next-http-backend) |
| Очистка неиспользуемого контента | ✅ Лишние словари отсекаются на этапе сборки | ❌ Не предусмотрено |
| Проверка пропущенных строк (CLI / CI) | ✅ npx intlayer content test | ⚠️ i18next-parser / сторонние утилиты |
| Перевод с помощью ИИ | ✅ Встроен, использует ваши собственные API-ключи | ❌ Нет (Locize - отдельный платный сервис) |
| Визуальный редактор / CMS | ✅ Бесплатный Visual Editor + опциональная CMS | ❌ Нет (Locize / внешние системы) |
| Сервер MCP и навыки агентов (Agent Skills) | ✅ Да | ❌ Нет |
| Экосистема и сообщество | ⚠️ Моложе, но быстро развивается | ✅ Самое масштабное и проверенное временем |
Бенчмарк
Что измерялось
Набор тестов Benchmark Bloom собирает одно и то же приложение с каждой библиотекой: 10 страниц (главная, о нас, блог, вакансии, контакты, FAQ, цены, продукты, настройки, команда), 10 языков (en, fr, es, de, it, pt, zh, ja, ko, ru), одинаковые компоненты и идентичный контент. Страницы замеряются на en и fr. Каждая библиотека тестируется в рамках четырех стратегий загрузки:
Открыть таблицу в модальном окне для четкого просмотра всех данных
| Стратегия | Описание | Где применяется |
|---|---|---|
| static | Все языки и страницы упакованы вместе (resources встроены в init()) | Быстрые прототипы, код от ИИ |
| dynamic | Только активный язык загружается через бэкенд, но все пространства имен сразу | Большинство проектов |
| scoped-static | Одно пространство имен на маршрут, все упакованы заранее | Редко |
| scoped-dynamic | Одно пространство имен на маршрут + ленивая загрузка бэкенда. Только текущая страница и язык | Проекты со строгим лимитом производительности |
У Intlayer нет варианта "scoped": компилятор изолирует контент для каждого компонента автоматически, поэтому строки static и dynamic уже оптимизированы.
Для каждой сборки замеряются:
- Lib size: gzip-размер пустого компонента, импортирующего только библиотеку i18n. Постоянный вес runtime.
- Page JS: средний объем JavaScript gzip, скачиваемый на страницу, по всем страницам и языкам.
- Locale leak %: доля переведенных строк в JS, относящихся к языку, который пользователь не просматривает.
- Page leak %: доля строк в JS, относящихся к страницам, на которых пользователь не находится.
- Component avg: средний размер gzip каждого компонента, скомпилированного изолированно.
- E2E reactivity: реальное время между выбором нового языка и обновлением
html[lang]в DOM (Playwright, 5 итераций). - Hydration: длительность этапа гидратации React.
Приведенные данные получены в прогоне от 2026-09-12 с версиямиnext-i18next16.3.0,react-i18next17.0.13 иintlayer9.5.1. Тестовое приложение намеренно компактно (несколько десятков строк на язык), поэтому проценты утечек отражают тенденцию: они увеличиваются с ростом контента, тогда как вес runtime остается неизменным.
Результаты на Next.js (next-i18next)
Открыть таблицу в модальном окне для четкого просмотра всех данных
| Библиотека | Стратегия | Lib size (gz) | Page JS avg (gz) | Locale leak | Page leak | Component avg (gz) | E2E-реактивность | Гидратация |
|---|---|---|---|---|---|---|---|---|
| base (без i18n) | - | 0.0 KB | 141.0 KB | 0.0% | 0.0% | 0.9 KB | 13.4 ms | 11.8 ms |
next-i18next | static | 19.7 KB | 218.5 KB | 0.0% | 89.8% | 78.5 KB | 16.4 ms | 15.6 ms |
next-i18next | dynamic | 19.7 KB | 169.5 KB | 50.0% | 89.8% | 26.1 KB | 15.4 ms | 27.7 ms |
next-i18next | scoped-static | 19.7 KB | 220.1 KB | 0.0% | 89.8% | 78.9 KB | 16.4 ms | 14.7 ms |
next-i18next | scoped-dynamic | 19.7 KB | 163.4 KB | 0.0% | 0.0% | 27.1 KB | 15.9 ms | 15.1 ms |
next-intlayer | static | 5.5 KB | 141.3 KB | 0.0% | 0.0% | 8.5 KB | 15.5 ms | 16.9 ms |
next-intlayer | dynamic | 5.5 KB | 141.3 KB | 0.0% | 0.0% | 6.9 KB | 15.3 ms | 15.9 ms |
@intlayer/next-i18next (compat) | static | 9.4 KB | 150.7 KB | 0.0% | 0.0% | 9.7 KB | 10.7 ms | 11.3 ms |
@intlayer/next-i18next (compat) | dynamic | 9.4 KB | 150.7 KB | 0.0% | 0.0% | 9.7 KB | 11.9 ms | 10.6 ms |
Как читать результаты
- Вес runtime. Ядро
i18nextвместе сreact-i18next- самый объемный runtime в тесте: 19.7 KB gzip для пустого компонента против 5.5 KB уnext-intlayer. - Базовая конфигурация обходится дорого. Встраивание
resourcesвinit()дает 218.5 KB на страницу, что на +77.5 KB больше базового приложения. Каждая страница загружает все пространства имен. - Оптимизация требует значительных усилий. Подключение бэкенда (
dynamic) экономит 49 KB, но по-прежнему оставляет 90% утечки строк других страниц, причем в этой конфигурации половина строк принадлежит не тому языку. Добавление разделения пространств имен по маршрутам (scoped-dynamic) позволяет достичь 0% утечки при весе 163.4 KB, что все равно на +22.4 KB на страницу больше, чем у Intlayer (141.3 KB), не требовавшего никакой ручной настройки. - Размер компонентов. Компонент с вызовом
useTranslation()компилируется в 26-79 KB; тот же компонент сuseIntlayer()весит 6.9 KB. - Гидратация возрастает до 27.7 ms в варианте
dynamic: экземпляр i18next инициализируется и запрашивает бэкенд на стороне клиента до того, как React завершит гидратацию.
Результаты на TanStack Start (react-i18next)
То же приложение на TanStack Start со стандартным react-i18next, что исключает специфику Next.js из сравнения.
Открыть таблицу в модальном окне для четкого просмотра всех данных
| Библиотека | Стратегия | Lib size (gz) | Page JS avg (gz) | Locale leak | Page leak | Component avg (gz) | E2E-реактивность | Гидратация |
|---|---|---|---|---|---|---|---|---|
| base (без i18n) | - | 0.0 KB | 111.0 KB | 0.0% | 0.0% | 0.7 KB | 8.1 ms | 21.6 ms |
react-i18next | static | 18.4 KB | 180.3 KB | 50.0% | 89.8% | 24.3 KB | 12.9 ms | 85.1 ms |
react-i18next | dynamic | 18.4 KB | 136.4 KB | 23.1% | 89.8% | 24.8 KB | 123.1 ms | 32.9 ms |
react-i18next | scoped-static | 18.4 KB | 184.2 KB | 50.7% | 89.8% | 25.3 KB | 185.1 ms | 25.2 ms |
react-i18next | scoped-dynamic | 18.4 KB | 127.2 KB | 0.0% | 0.0% | 26.7 KB | 17.6 ms | 11.3 ms |
intlayer | static | 5.0 KB | 125.8 KB | 50.0% | 0.0% | 8.1 KB | 3.2 ms | 11.5 ms |
intlayer | dynamic | 5.0 KB | 118.6 KB | 0.0% | 0.0% | 6.3 KB | 3.6 ms | 14.1 ms |
Как читать результаты
- Неоптимизированное приложение на
react-i18nextотдает на +69 KB на страницу больше базы, а гидратация занимает 85 ms (в 4 раза дольше), поскольку дерево ресурсов полностью анализируется и регистрируется на клиенте до первичного рендера. - Смена языка подчеркивает задержку ленивой загрузки. Если ресурсы загружаются по запросу, смена языка влечет сетевой запрос до обновления
html[lang]: 123 ms вdynamic, 185 ms вscoped-static. Intlayer обновляет DOM за 3-4 ms в обоих режимах: переключение выполняется мгновенно и не блокируется сетью. - Полностью оптимизированный вариант
scoped-dynamicдостигает 0% утечки при весе 127.2 KB, что все еще на +8.6 KB больше строкиdynamicу Intlayer, при этом потребовав маппинга маршрутов к пространствам имен, бэкенда ресурсов и оберток Suspense. - Строка
staticу Intlayer уже дает 0% утечки страниц, так как в сборку входят только словари, импортированные компонентами этой страницы. ВключениеimportMode: 'dynamic'устраняет и утечку языков. - Размер компонентов: 24-27 KB на компонент в
react-i18nextпротив 6-8 KB в Intlayer.useTranslation()связывает каждый компонент с глобальным экземпляром i18next.
Причина различий: глобальный экземпляр против скомпилированных словарей
i18next был создан в 2012 году как runtime: глобальный объект содержит хранилище ресурсов, плагины расширяют его возможности, а t() ищет ключи при рендере. Это обеспечивает гибкость (любой фреймворк, бэкенд и формат), но ведет к утяжелению:
Копировать код в буфер обмена
Экземпляр не может знать заранее, какие ключи понадобятся компоненту, поэтому держит в памяти все загруженные пространства имен. Оптимизация означает, что вы делите каталоги, вы перечисляете пространства имен для каждой страницы и вы вручную обновляете этот список при перемещении компонентов. Как отмечено в заметках бенчмарка: "поддерживать типобезопасность и точно знать, какое пространство имен подключить к странице - это сущий кошмар".
Intlayer отказывается от глобального экземпляра. Контент объявляется рядом с компонентом, а компилятор строит граф зависимостей при сборке:
Копировать код в буфер обмена
@intlayer/swc / @intlayer/babel видит, какой компонент импортирует конкретный словарь, упаковывает только его, исключительно для активной локали, и удаляет неиспользуемое. Модель "scoped-dynamic" становится прямым следствием сборки, а не обременительным регламентом команды.
Чтобы повторить показатели строкиdynamic, укажитеdictionary.importMode: 'dynamic'вintlayer.config.ts. Подробнее читайте в документации по оптимизации bundle.
Опыт разработчика
Настройка
next-i18next (App Router)
Копировать код в буфер обмена
Дополнительно требуется клиентский I18nProvider, воссоздающий экземпляр с теми же параметрами, generateStaticParams и список namespaces на каждой странице.
Intlayer
Копировать код в буфер обмена
Копировать код в буфер обмена
Клиентский компонент
react-i18next
Копировать код в буфер обмена
Копировать код в буфер обмена
Страница, отображающая этот компонент, обязана загрузить пространство именabout, аt("counter.label")будет обычной строкой без строгой типизации, если не дополнить интерфейсCustomTypeOptions.
Intlayer
Копировать код в буфер обмена
Копировать код в буфер обмена
label и increment строго типизированы: опечатка в имени вызовет ошибку TypeScript, а отсутствие французского текста остановит сборку.
Синхронный серверный компонент
next-i18next
Копировать код в буфер обмена
Страница вызывает i18n.getFixedT(locale, "about") и пробрасывает t и locale вниз через props.
Intlayer
Копировать код в буфер обмена
Сохраните API i18next, получите производительность Intlayer
Вам не нужно переписывать компоненты, чтобы получить показатели из бенчмарка выше. @intlayer/i18next, @intlayer/react-i18next и @intlayer/next-i18next являются готовыми адаптерами: useTranslation, t(), <Trans>, {{interpolation}}, формы множественного числа _one / _other, суффиксы контекста и returnObjects продолжают работать, получая данные из скомпилированных словарей Intlayer.
Копировать код в буфер обмена
Копировать код в буфер обмена
В бенчмарке адаптерная версия того же приложения Next.js уменьшилась с 218.5 KB до 150.7 KB на страницу, с 78.5 KB до 9.7 KB на компонент, утечка упала с ~90% до 0%, а гидратация ускорилась с 15.6 ms до 11.3 ms при полностью неизменном коде компонентов. Ваши существующие файлы locales/{lng}/{ns}.json могут оставаться источником данных через плагин синхронизации JSON.
Смотрите руководства по миграции: i18next, react-i18next, next-i18next.
Что и когда выбирать?
- Выбирайте i18next, если вам необходима его экосистема плагинов (детекторы, бэкенды, ICU, Locize), вы локализуете решения вне React (сервисы Node, чистый JS, другие фреймворки), у команды уже есть практический опыт или переводческая платформа ожидает формат
locales/{lng}/{ns}.json. Заложите время на организацию пространств имен, настройку бэкенда и ручную поддержку карты маршрутов, если важна скорость. - Выбирайте Intlayer, если вам нужны контент внутри компонентов, строгий TypeScript, ошибки сборки при нехватке строк, автоматический tree-shaking и lazy loading, мгновенное переключение языка, синхронные серверные компоненты и встроенные редакционные инструменты (Visual Editor, CMS, перевод через ИИ, сервер MCP). Идеально подходит для модульных кодовых баз и дизайн-систем.
- Выбирайте адаптеры
@intlayer/*-i18next, если вы уже используете i18next и хотите получить экономию в размере бандла и прирост скорости без масштабного рефакторинга.
Похожие сравнения
- next-intl против Intlayer (тот же бенчмарк)
- Lingui против Intlayer (тот же бенчмарк)
- vue-i18n против Intlayer: бенчмарк (тот же бенчмарк)
- next-i18next против next-intl и Intlayer
- react-i18next против react-intl и Intlayer
- Устарел ли i18next?
Звезды на GitHub
Звезды на GitHub наглядно демонстрируют популярность проекта, доверие разработчиков и перспективы его развития. Хотя они не являются прямой оценкой качества кода, они показывают заинтересованность сообщества и готовность к внедрению.
Заключение
i18next по праву занял лидирующие позиции: он поддерживается на любых платформах, располагает плагинами под любые сценарии и развивается более десяти лет. Бенчмарк наглядно раскрывает цену архитектуры, завязанной на runtime. Типичная сборка большинства команд добавляет +70-77 KB gzip на страницу, передает ~90% контента с других страниц, а смена языка с ленивой загрузкой занимает свыше 100 ms. Добиться 0% утечки возможно, однако это требует бэкенда, ручной разбивки на namespaces по маршрутам, и все равно оставляет вес на +9-22 KB больше, чем у Intlayer.
Intlayer переносит всю эту нагрузку на компилятор. Словари для компонентов, ленивая подгрузка по языкам и удаление неиспользуемых текстов являются прямым результатом сборки. На том же приложении: +0.3 KB на страницу, 0% утечек, компоненты в 3-10 раз меньше, а язык переключается за 3-4 ms.
Все исходные замеры, тестовые приложения и скрипты опубликованы в репозитории Benchmark Bloom. Запустите их и убедитесь сами.
Подробности смотрите в материале 'Почему Intlayer?'.
Комментарии
Пока нет комментариев. Будьте первым, кто поделится своими мыслями.
