Спросите свой вопрос и получите сводку документа, используя эту страницу и выбранного вами поставщика AI
Содержимое этой страницы было переведено с помощью ИИ.
Смотреть последнюю версию оригинального контента на английскомЕсли у вас есть идея по улучшению этой документации, не стесняйтесь внести свой вклад, подав запрос на вытягивание на GitHub.
Ссылка на документацию GitHubКопировать Markdown документа в буфер обмена
Как выбрать подходящую библиотеку i18n для Svelte
В Svelte нет встроенных инструментов для i18n: ни $t, ни примитива локали, ни формата сообщений. Любой вариант это стороннее решение. При этом экосистема Svelte продвинулась в compile-time i18n дальше остальных, поэтому кандидаты различаются между собой сильнее, чем в React или Vue.
В этом руководстве собраны вопросы, на которые нужно ответить в первую очередь, а затем ответы сопоставляются с svelte-i18n, Paraglide, typesafe-i18n, wuchale и Intlayer, как для связки Vite + Svelte, так и для SvelteKit.

Table of Contents
Шесть вопросов перед сравнением библиотек
- Vite SPA или SvelteKit? В SPA модуль-уровневый store работает корректно: одна вкладка, один пользователь, одна локаль. В SvelteKit тот же синглтон разделяется между параллельными запросами на сервере, из-за чего запрос B может отрендериться на языке запроса A. Библиотека либо предоставляет решение per-request (context,
locals), либо оставляет эту задачу вам. - Кто пишет переводы? Разработчики, TMS, агентство с ICU-строками или AI-pipeline.
svelte-i18nработает с ICU. Paraglide иtypesafe-i18nиспользуют собственный синтаксис. Выбирайте под формат поставщика. - Сколько локалей и страниц? Две локали и пять страниц позволяют загружать все сразу. Десять локалей и сорок маршрутов уже нет, и разница между runtime-каталогами и скомпилированными сообщениями становится ключевым фактором накладных расходов.
- Нужна ли типизация ключей?
$_("cart.totl")вsvelte-i18nприведет к ошибке во время выполнения. Compile-time библиотеки делают такую опечатку ошибкой типов на этапе компиляции. - Svelte 4 stores или Svelte 5 runes? Runes меняют синтаксис состояния локали, но не проблему совместного использования данных. Однако
$stateв файле.tsкомпилируется в обычную переменную, поэтому runtime библиотеки должен поддерживать runes, если вы используете Svelte 5. - Готовы ли вы хранить сгенерированные файлы в репозитории? Paraglide и
typesafe-i18nгенерируют файлы JavaScript или TypeScript прямо в исходный код. Для одних команд это приемлемо, у других вызывает merge conflicts в каждой параллельной ветке.
Запишите ответы. Все последующие разделы опираются на них.
Общая картина
i18n в Svelte появился позже, чем в React или Vue, и сразу перешел к волне решений времени компиляции.

JSON-каталоги, ICU парсится в браузере через intl-messageformat, локаль хранится в stores уровня модуля ($locale, $_). Самое популярное и хорошо документированное решение, но интеграцию с SSR приходится настраивать самостоятельно.
Генератор отслеживает каталоги и создает типизированные аксессоры ($LL.cart.total()). Продуманная модель, сгенерированные файлы в репозитории, однако активность разработки в последнее время снизилась.
Paraglide компилирует каждое сообщение в отдельную экспортируемую функцию, благодаря чему bundler удаляет через tree-shaking неиспользуемые на маршруте строки. wuchale извлекает строки из разметки при сборке. Intlayer декларирует контент рядом с компонентом, генерируя типы и словари для каждого компонента отдельно.
В статье об истории i18n в JavaScript подробно рассматривается каждая волна.
Главное решение: где хранится контент и когда он загружается
Два архитектурных выбора объясняют большую часть разницы в размере bundle между решениями:
- Централизованный или изолированный контент. Один файл
locales/en.jsonна все приложение или отдельные объявления для каждого компонента. - Статический или динамический импорт. Загрузка всего сразу при старте или получение активной локали (и в идеале активного маршрута) по требованию.
На графике показана расчетная нагрузка для приложения от 1 до 10 страниц с переводом на 1–10 локалей при объеме текста около 30 КБ на страницу.

svelte-i18n по умолчанию находится в верхнем левом углу: вызов register("fr", () => import("./fr.json")) обеспечивает динамическую загрузку для каждой локали, но каталог локали представляет собой единый объект, поэтому при его загрузке подтягиваются тексты всех страниц. Paraglide представляет собой интересный случай: поскольку каждое сообщение является отдельным экспортом, tree-shaking автоматически разделяет страницы, и бенчмарк Svelte подтверждает эффективность на Vite + Svelte (в бенчмарках React и Next.js этого не происходило). Intlayer достигает аналогичных показателей за счет объявлений на уровне компонентов.
Если в вопросе 3 вы указали «много страниц», уделите этому разделу больше внимания, чем предпочтениям в API. В статье о колокации против централизованного i18n подробно описана сторона поддержки этого компромисса.
Кандидаты
Размеры библиотек взяты из бенчмарка Svelte: store плюс аксессор в пустом компоненте после сборки, tree-shaking и минификации в приложении на 10 страниц и 10 локалей. Объем контента измеряется отдельно.
Открыть таблицу в модальном окне для четкого просмотра всех данных
| Библиотека | Где хранятся сообщения | Состояние локали | Типы ключей | Формат сообщений | Разделение по маршрутам | Размер библиотеки |
|---|---|---|---|---|---|---|
svelte-i18n | JSON-каталоги по локалям | Svelte store на уровне модуля | Ручные union-типы | ICU | Нет | ~16.6 kB |
typesafe-i18n | Сгенерированные TS-модули | Адаптер store | Сгенерированные | Собственный | Частично | Маленький |
| Paraglide | Проект inlang, компилируемый в функции | Чтение при вызове из cookie, URL/storage | Сгенерированные | Собственный | Да, через tree-shaking | Почти нулевой |
wuchale | Извлечение из разметки при build | Store | N/A (без ключей) | Собственный | Да | Маленький |
| Intlayer | .content.ts рядом с компонентом | Context плюс store, поддержка runes | Автоматически | Хелперы | Да, на уровне компонента | Базовый |
Цифры отражают состояние на момент тестирования версий бенчмарка. Проверьте показатели на собственном приложении перед принятием решения исключительно по размеру.
Почти нулевой размер Paraglide обусловлен его архитектурой: runtime генерируется прямо в репозиторий. Для работы Intlayer требуется vite-intlayer, поэтому он не может работать без шага build.
Сопоставление требований с библиотекой
svelte-i18n. Это самый документированный вариант, $_ лаконично смотрится в разметке, а связка register и waitLocale() решает задачу ленивой загрузки локалей. Обязательно блокируйте первый рендер через isLoading, иначе возникнет мигание необработанных ключей. Если в будущем планируется серверный рендеринг, поместите локаль в context Svelte с самого начала вместо store уровня модуля: сейчас это не требует усилий, но защитит от трудноуловимых ошибок в production.
В этом случае решающим фактором становится проблема разделения состояния. svelte-i18n работает в SvelteKit, но логику per-request (hooks.server.ts, locals, load, затем setContext) приходится реализовывать вручную, где легко допустить ошибку. Paraglide предлагает готовую интеграцию со SvelteKit, которая берет на себя роутинг и считывает локаль при каждом вызове, избегая синглтонов. Intlayer передает локаль из данных load в context. В статье об i18n в SvelteKit подробно разобран выбор между [[lang]] и reroute, с которым стоит определиться до выбора библиотеки.
svelte-i18n нативно поддерживает ICU через intl-messageformat, что позволяет подключать его к большинству поставщиков напрямую. Paraglide и typesafe-i18n используют собственный синтаксис и требуют конвертации. В Intlayer поддержка ICU частичная, поэтому если вы уже получаете строки в ICU, это может стать блокирующим фактором.
Решения времени компиляции. Tree-shaking в Paraglide отлично работает на связке Vite + Svelte, а размер библиотеки почти нулевой. Словари на уровне компонентов в Intlayer дают схожий результат без необходимости коммитить сгенерированные файлы в репозиторий. svelte-i18n поставляет парсер ICU вместе со всем каталогом, занимая в бенчмарке примерно в 4.5 раза больше места, чем svelte-intlayer, еще до добавления контента.
Любой вариант, кроме базовой конфигурации svelte-i18n, где единственной типизацией является созданный вручную union-тип, быстро рассинхронизирующийся с JSON. typesafe-i18n, Paraglide и Intlayer генерируют типы напрямую из контента. Перед выбором typesafe-i18n обратите внимание на активность репозитория. В статье об обнаружении пропущенных переводов сравнивается, какие ошибки выявляет каждая библиотека на этапе сборки.
Это исключает Paraglide и typesafe-i18n. svelte-i18n и Intlayer хранят результаты работы в node_modules или директории сборки. В Intlayer файлы .content.ts являются исходным кодом, а скомпилированные словари и типы находятся в папке .intlayer/, которая добавляется в .gitignore.
В таком случае в централизованном JSON больше нет практической необходимости. Колокация контента в сочетании с CLI для заполнения недостающих локалей оказывается быстрее. Команда fill в Intlayer работает с вашими API-ключами (OpenAI, Anthropic, Mistral, Gemini) и переводит только то, что изменилось. Экосистема inlang у Paraglide предлагает облачные аналоги с собственными тарифами.
Недостатки библиотек
svelte-i18n: самая тяжелая библиотека из представленных, нет типизации ключей, нет разделения по маршрутам, а store уровня модуля приводит к утечкам состояния между запросами на SvelteKit, если не настроить context вручную.typesafe-i18n: требует отдельного процесса watcher, генерирует файлы в репозитории, а разработка проекта в последнее время практически не ведется.- Paraglide: сгенерированные файлы коммитятся в репозиторий и пересоздаются перед каждым push, что приводит к merge conflicts в параллельных ветках; локаль считывается из cookie или storage при каждом вызове сообщения, а не берется из store, создавая дополнительную нагрузку при смене языка.
wuchale: интересная идея извлечения строк, но проект находится на ранней стадии. В бенчмарке React возникли проблемы с реактивностью, потребовавшие принудительного ререндера провайдера, а документация пока минимальна.- Intlayer: требует обязательного плагина сборки, меньшая экосистема, частичная поддержка ICU и распределение контента по проекту, из-за чего для экспорта единого JSON переводчику нужны дополнительные инструменты.
Примеры кода
Один и тот же компонент корзины с заголовком и формой множественного числа, реализованный на каждом из кандидатов. Главные различия заключаются не в разметке, а в том, где хранится контент, как устроено состояние локали и что доступно проверке типов.
Копировать код в буфер обмена
Копировать код в буфер обмена
ICU через intl-messageformat, локаль в store уровня модуля. $_ принимает любую строку, а типизация ограничивается написанным вручную union-типом.
Копировать код в буфер обмена
Копировать код в буфер обмена
Каждое сообщение представляет собой сгенерированную типизированную функцию, которая исключается при tree-shaking, если не используется. Папка paraglide/ генерируется прямо в репозитории, а локаль считывается при каждом вызове, а не из store.
Копировать код в буфер обмена
Копировать код в буфер обмена
Типизированные аксессоры, генерируемые фоновым процессом. Модель надежна, но сгенерированные файлы сохраняются в репозитории, а активность проекта заметно снизилась.
Копировать код в буфер обмена
Копировать код в буфер обмена
Все локали хранятся в одном файле рядом с компонентом. useIntlayer возвращает readable store со стандартной автоподпиской $content, а локаль сохраняется в context (безопасно для SSR), а не в синглтоне модуля.
Уже используете svelte-i18n? Адаптер совместимости @intlayer/svelte-i18n создает алиас пакета на уровне bundler, сохраняя работоспособность $_, $date, $number и плоских ключей, пока Intlayer управляет контентом.
Перед принятием окончательного решения
Таблица возможностей показывает текущее состояние библиотеки. Следующие критерии помогут понять, каково будет поддерживать ее в долгосрочной перспективе.
Проверьте активность репозитория.
Обратите внимание на коммиты, скорость ответов в issues и дату последнего минорного релиза. Качественная архитектура без активного мейнтейнера со временем неизбежно потребует миграции.
Не выбирайте исключительно по числу загрузок в npm.
Самая скачиваемая библиотека это та, которая появилась первой, а не та, которая лучше всего подходит для Svelte в 2026 году. Количество загрузок отражает историю, а не актуальность.

Узнайте, кто финансирует поддержку и какую бизнес-модель использует.
Разработку svelte-i18n поддерживает Crowdin, как и next-intl с vue-i18n. За i18next стоит Locize. Tolgee, Paraglide (inlang) и Intlayer развивают собственные платформы. Поставщик, чей доход зависит от платного хостинга переводов, мало заинтересован в развитии бесплатных инструментов внутри вашего toolchain. Intlayer является единственным решением из списка, предлагающим AI-перевод через CLI с вашим собственным API-ключом и self-hosted CMS.
Готовность к работе с AI-агентами.
Агенты все еще допускают ошибки в i18n: забывают локали, придумывают несуществующие ключи и путают синтаксис сообщений. Предлагает ли библиотека Agent Skills или MCP-сервер, чтобы агент мог просматривать, заполнять и тестировать контент? Оптимизирована ли загрузка контента по умолчанию, или команде придется регулярно пересматривать namespaces и динамические импорты?
Типизация из коробки.
Речь идет не о «возможности настроить типы вручную», а о ситуации, когда неверный ключ приводит к ошибке tsc сразу после установки. Проверьте, как библиотека реагирует на несуществующий ключ и на локаль с отсутствующим переводом.
Обнаружение неиспользуемого контента.
Каталоги со временем только увеличиваются. Сборка Intlayer удаляет неиспользуемые поля и логирует их (build.purge). Paraglide решает эту задачу на уровне архитектуры: невызываемая функция сообщения удаляется при tree-shaking. Остальные инструменты оставляют очистку на усмотрение разработчика.
Удобство для разработчиков (DX).
Время от начала настройки до первой переведенной строки, наличие LSP или расширения VS Code с подсказками при наведении и переходом к объявлению, CLI для генерации, тестирования и отправки переводов, а также возможность редактирования контента специалистами без участия разработчиков (визуальный редактор или CMS) без создания pull request.
Часто задаваемые вопросы
Для SPA на Vite с небольшим объемом текстов да. Это самый документированный вариант, а совместимость с ICU важна для многих команд. Однако на SvelteKit или в проектах объемом более нескольких десятков страниц его недостатки (отсутствие типов, глобальный store, отсутствие модульности) становятся ощутимыми.
На связке Vite + Svelte да, что подтверждается результатами бенчмарка. В то же время на React с TanStack Start или Next.js в рамках того же бенчмарка эффекта достичь не удалось. Рекомендуется протестировать решение на собственном стеке, не полагаясь исключительно на сторонние тесты.
Они меняют синтаксис управления состоянием локали, но не решают проблему изоляции данных на сервере. Главное значение имеет то, поддерживает ли runtime библиотеки runes в Svelte 5 и использует ли context вместо store на уровне модуля. Проверьте оба пункта.
Косвенно. Для поисковых роботов критичны корректный роутинг, теги hreflang, атрибут <html lang> и присутствие текста в HTML, сгенерированном на сервере. Подробнее об этом читайте в руководстве по hreflang.
Полезные материалы
- Бенчмарк i18n для Svelte: размер bundle, утечки контента и скорость переключения локалей
- i18n в Svelte: stores, runes и ловушка синглтонов уровня модуля и i18n в SvelteKit: роутинг, SSR и разделяемое состояние
- Адаптер совместимости с
svelte-i18n - История i18n в JavaScript
- Компиляторы против декларативного i18n
- Колокация контента против централизованного i18n
- Как работает оптимизация bundle на этапе сборки
- Настройка i18n в приложении Vite + Svelte и в SvelteKit
- Аналогичные руководства для React, Vue и Solid
Комментарии
Пока нет комментариев. Будьте первым, кто поделится своими мыслями.
