Спросите свой вопрос и получите сводку документа, используя эту страницу и выбранного вами поставщика AI
История версий
- "Начальная версия"v9.5.1026.09.2026
Содержимое этой страницы было переведено с помощью ИИ.
Смотреть последнюю версию оригинального контента на английскомЕсли у вас есть идея по улучшению этой документации, не стесняйтесь внести свой вклад, подав запрос на вытягивание на GitHub.
Ссылка на документацию GitHubКопировать Markdown документа в буфер обмена
Как интернационализировать приложение Next.js с помощью Lingui в 2026 году
Содержание
Что такое Lingui?
Lingui - это библиотека i18n, построенная вокруг макросов и извлечения сообщений (message extraction). Вы пишете исходный текст прямо в компонентах ( t`Hello` , <Trans>Hello</Trans>), команда lingui extract собирает все сообщения в каталоги (по умолчанию PO-файлы), а загрузчик компилирует их в компактный JavaScript. Сообщения используют ICU MessageFormat, и Lingui поддерживает React Server Components в App Router.
В этом руководстве настраивается Lingui в проекте с Next.js 16 App Router, включая:
- Макросы, скомпилированные с помощью SWC, благодаря чему сохраняется скорость работы Turbopack.
- Server и Client Components, использующие единый API
TransиuseLingui. - Локализованную маршрутизацию через
proxy.ts:/aboutдля локали по умолчанию,/fr/aboutдля остальных языков, а также определение языка при первом посещении. - Статический рендеринг всех локалей с помощью
generateStaticParams. - Полное многоязычное SEO: переведенные
generateMetadata, canonical,hreflangсx-default, локали Open Graph, JSON-LD,sitemap.ts,robots.tsи локализованные страницы 404.
Ищете другую библиотеку? Ознакомьтесь с руководством по next-intl, руководством по next-i18next или руководством по Next.js + Intlayer.
Используете TanStack Start? Смотрите руководство по TanStack Start + Lingui. Сравниваете библиотеки? Читайте Lingui против Intlayer и next-i18next против next-intl против Intlayer.
Что говорит бенчмарк о Lingui в Next.js
Бенчмарк i18n запускает одно и то же приложение Next.js на 10 страниц и 10 локалей с каждой популярной библиотекой и измеряет фактический объем загружаемых браузером данных.
Динамическая загрузка JSON
Ленивая загрузка переводов во время выполнения
Ограниченный JSON (пространства имен)
Пространства имен перевода для каждой страницы
Бенчмарк производительности I18n
Что это за метрика?
Общий размер пакета библиотеки интернационализации в формате gzip. Он включает в себя только провайдер и логику извлечения контента после tree-shaking и минификации.
Почему это важно?
Меньший размер библиотеки снижает начальную загрузку JavaScript, что ускоряет загрузку и выполнение кода на клиенте.
Вид
Ключевые показатели для @lingui/core@6.6.0 на Next.js 16, измеренные 26.09.2026 (gzip):
Открыть таблицу в модальном окне для четкого просмотра всех данных
| Конфигурация | Размер библиотеки | JS на страницу | Утечка других локалей | Утечка других страниц |
|---|---|---|---|---|
| Без i18n (базовое приложение) | - | 141.0 KB | 0% | 0% |
| Lingui, один каталог на локаль | 72.1 KB | 145.4 KB | 2.8% | 89.9% |
@intlayer/lingui (совместимость) | 10.7 KB | 221.6 KB | 50% | 90% |
next-intlayer (нативный Intlayer) | 4.9 KB | 141.5 KB | 0% | 0% |
Главные выводы:
- Один каталог на локаль по-прежнему приводит к утечке сообщений других страниц в клиентский провайдер. Оставляйте как можно больше текста в Server Components, которые отправляют готовый HTML, а не каталоги.
- Размер рантайма Lingui составляет ~72 KB gzip. Адаптер совместимости
@intlayer/linguiуменьшает рантайм до ~11 KB, но в этом бенчмарке настройка совместимости Next.js все еще отправляет целые каталоги на страницу. Только нативный APInext-intlayerсохраняет размер на уровне базового приложения.
Смотрите полные данные: отчет о бенчмарке Next.js и репозиторий бенчмарка.
Сравнение возможностей в Next.js
Сравнение Lingui с next-intl и Intlayer по функциям, которые обычно требуются в проекте Next.js App Router:
Открыть таблицу в модальном окне для четкого просмотра всех данных
| Возможность | next-intlayer (Intlayer) | Lingui | next-intl |
|---|---|---|---|
| Переводы рядом с компонентами | ✅ Контент расположен рядом с компонентом | ⚠️ Исходный текст в компонентах, каталоги централизованы | ❌ Централизованный JSON |
| Интеграция с TypeScript | ✅ Автоматически генерируемые строгие типы | ⚠️ Макросы типизированы, каталоги сообщений нет | ✅ Хорошая, через расширение AppConfig |
| Поиск отсутствующих переводов | ✅ Ошибки TypeScript и предупреждения при сборке | ⚠️ Рантайм-фоллбэк на исходный текст | ⚠️ Рантайм-фоллбэк |
| Форматированный контент (JSX, MD) | ✅ Прямая поддержка | ✅ JSX внутри <Trans>, без Markdown | ⚠️ Теги через t.rich, без Markdown |
| AI-перевод | ✅ Собственный провайдер и API-ключ с контекстом | ❌ Нет | ❌ Нет |
| Визуальный редактор / CMS | ✅ Локальный визуальный редактор + опциональная CMS | ❌ Через внешние платформы | ❌ Через внешние платформы |
| Локализованная маршрутизация | ✅ Встроенная | ❌ Написание собственного proxy.ts | ✅ Встроенный сегмент [locale] |
| Плюрализация | ✅ На основе перечислений | ✅ ICU, макрос <Plural> | ✅ ICU |
| Форматы контента | ✅ .ts, .tsx, .js, .json, .md, .yaml | ✅ PO, JSON, CSV | ✅ .json, .js, .ts |
| ICU MessageFormat | ✅ Через format: "icu" | ✅ Нативный | ✅ Нативный |
| SEO-хелперы (hreflang, sitemap) | ✅ Хелперы для метаданных, sitemap и robots.txt | ❌ Вручную | ✅ Хорошие |
| Server Components | ✅ Прямой доступ в любом Server Component | ⚠️ setI18n в каждом layout и page | ⚠️ await getTranslations() на компонент |
| Tree-shaking по компонентам | ✅ Во время сборки (Babel / SWC) | ⚠️ Один каталог на локаль, экстрактор по страницам эксп. | ⚠️ Вручную через pick() для маршрута |
| Размер рантайма (gzip, бенчмарк) | 4.9 KB | 72.1 KB | 14.7 KB |
| Проверка переводов в CI | ✅ npx intlayer test | ✅ lingui compile --strict | ⚠️ Не встроено |
| Экосистема / сообщество | ⚠️ Меньше, быстро растет | ✅ Зрелая | ✅ Большая |
Размеры рантайма взяты из бенчмарка Next.js. Для подробного анализа читайте Lingui против Intlayer.
Другие руководства по Next.js: next-intl, next-i18next и Intlayer.
Рекомендуемые практики
- Устанавливайте
langиdirдля<html>в layout сегмента[locale]. - Отдавайте предпочтение Server Components для отображения текста: они рендерят HTML на сервере и не требуют отправки каталогов на клиент.
- Вызывайте
initLingui(locale)в каждом layout и page. Layout не рендерятся повторно при навигации, поэтому страница не может рассчитывать на то, что layout уже установил локаль. - Сохраняйте один URL на локаль и выполняйте предварительный рендеринг каждой локали с помощью
generateStaticParams. - Переводите метаданные в
generateMetadata, включаяcanonical,hreflangиx-default. - Генерируйте многоязычные sitemap и robots.txt с помощью соглашений
sitemap.tsиrobots.ts. - Используйте настоящие ссылки для переключателя языков, чтобы поисковые роботы могли обнаружить все языковые версии.
- Запускайте
lingui extractв CI, чтобы ни одно новое сообщение не попало в продакшн непереведенным.
Ознакомьтесь с нашим руководством по интернационализации и SEO, руководством по hreflang и сравнением многоязычного SEO в Next.js.
Пошаговое руководство по настройке Lingui в приложении Next.js
Ниже представлена структура проекта, которую мы создадим:
Копировать код в буфер обмена
Установка зависимостей
bashКопировать кодКопировать код в буфер обмена
- @lingui/core / @lingui/react: рантайм,
I18nProvider,setI18nдля Server Components и макросы (@lingui/core/macro,@lingui/react/macro). - @lingui/swc-plugin: компилирует макросы внутри конвейера SWC Next.js.
- @lingui/loader: компилирует
.poкаталоги при импорте, устраняя необходимость в отдельной командеlingui compile. - @lingui/cli: команда
lingui extractдля сбора сообщений в каталоги.
@lingui/swc-pluginпредставляет собой WebAssembly-плагин, привязанный к версии SWC в Next.js. Если сборка завершается с ошибкой после обновления Next.js, обновите плагин до версии, указанной как совместимая в его README.- @lingui/core / @lingui/react: рантайм,
Централизация конфигурации локалей
Единый файл определяет локали и хелперы URL. Маршрутизация, метаданные, sitemap и Lingui считывают данные из него.
src/i18n/config.tsКопировать кодКопировать код в буфер обмена
Настройка Lingui и Next.js
lingui.config.tsКопировать кодКопировать код в буфер обмена
SWC-плагин компилирует макросы, а загрузчик компилирует
.poфайлы как для Turbopack (по умолчанию в Next.js 16), так и для webpack:next.config.tsКопировать кодКопировать код в буфер обмена
Добавьте скрипты для извлечения сообщений:
package.jsonКопировать кодКопировать код в буфер обмена
Загрузка каталогов и создание экземпляров на сервере
Server Components не имеют контекста React, поэтому Lingui предоставляет
setI18nдля регистрации экземпляра на время текущего рендера. Этот модуль загружает каждый каталог один раз на процесс сервера и создает один экземплярI18nдля каждой локали. Он помечен какserver-only: каталоги других локалей никогда не попадут в клиентский бандл.src/i18n/appRouterI18n.tsКопировать кодКопировать код в буфер обмена
src/i18n/initLingui.tsКопировать кодКопировать код в буфер обмена
Чтобы TypeScript корректно обрабатывал импорт
.poфайлов, добавьте объявление модуля:src/i18n/po.d.tsКопировать кодКопировать код в буфер обмена
Создание клиентского провайдера
Client Components считывают переводы из контекста React. Провайдер получает каталог активной локали из серверного layout и создает собственный экземпляр один раз.
src/components/LinguiClientProvider.tsxКопировать кодКопировать код в буфер обмена
Определение динамических маршрутов локалей
Сегмент
[locale]содержит корневой layout.generateStaticParamsвыполняет предварительный рендеринг каждой локали во время сборки, а параметрdynamicParams = falseвозвращает 404 для любого другого префикса.src/app/[locale]/layout.tsxКопировать кодКопировать код в буфер обмена
Клиентский провайдер получает весь каталог активной локали. Это именно то, что бенчмарк фиксирует как "утечку других страниц". Размещение текста в Server Components минимизирует объем данных, необходимых клиенту. Для крупных приложений экспериментальный экстрактор страниц Lingui (
experimental.extractorвlingui.config.ts) разделяет каталоги по точкам входа.Использование переводов в Server Components
Server Components используют те же макросы, что и Client Components. Вызов
initLinguiдолжен выполняться и на самой странице, поскольку layout не рендерится повторно при переходе между страницами внутри него.src/app/[locale]/about/page.tsxКопировать кодКопировать код в буфер обмена
Использование переводов в Client Components
Client Components используют те же импорты. Макросы считывают экземпляр из
LinguiClientProvider.src/components/Counter.tsxКопировать кодКопировать код в буфер обмена
Извлечение и перевод сообщений
Запустите команду извлечения. Lingui запишет каждое сообщение, найденное в директории
src, в каталог каждой локали:bashКопировать кодКопировать код в буфер обмена
Затем переведите поле
msgstrдля каждой записи:src/locales/fr/messages.poКопировать кодКопировать код в буфер обмена
src/locales/es/messages.poКопировать кодКопировать код в буфер обмена
Плейсхолдеры вида
<0>сохраняют позиции JSX-элементов внутри<Trans>, позволяя переводчикам перемещать их без изменения разметки.Настройка Proxy для локализованной маршрутизации
НеобязательноВ Next.js 16 файл
middleware.tsбыл переименован вproxy.ts. Прокси реализует стратегию префиксов "по необходимости" (as-needed):/fr/aboutотдается напрямую;/en/aboutперенаправляет на/about, благодаря чему локаль по умолчанию имеет единственный URL;/aboutвнутренне переписывается (rewrite) в/en/aboutбез изменения URL в адресной строке;- первое посещение
/перенаправляет на предпочитаемый язык пользователя (сначала проверяется cookie, затем заголовокAccept-Language).
src/i18n/negotiateLocale.tsКопировать кодКопировать код в буфер обмена
src/proxy.tsКопировать кодКопировать код в буфер обмена
Смена языка контента
НеобязательноХук
usePathnameвозвращает URL, отображаемый в браузере (/aboutили/fr/about). Удалите локаль из пути, затем сформируйте ссылку для каждого языка. Переключатель отображает реальные ссылки, чтобы поисковые роботы могли обойти каждую языковую версию, а cookie сохраняет явный выбор пользователя.src/components/LocaleSwitcher.tsxКопировать кодКопировать код в буфер обмена
Создание компонента локализованной ссылки
Необязательноsrc/components/LocalizedLink.tsxКопировать кодКопировать код в буфер обмена
Компонент работает и в Server Components, поскольку рендерится внутри
LinguiClientProvider:tsxКопировать кодКопировать код в буфер обмена
Интернационализация метаданных
НеобязательноКаждая языковая версия может успешно ранжироваться независимо при условии, что каждая страница предоставляет:
- переведенные
titleиdescription; - канонический URL (
canonical), указывающий на саму страницу; - один альтернативный
hreflangна каждую локаль, а такжеx-default; - теги Open Graph:
locale,alternateLocaleиurl; - разметку JSON-LD с атрибутом
inLanguage.
Функция
generateMetadataвыполняется вне дерева компонентов React, поэтому она напрямую использует серверный экземпляр с макросомmsg:src/i18n/metadata.tsКопировать кодКопировать код в буфер обмена
src/app/[locale]/about/page.tsxКопировать кодКопировать код в буфер обмена
Разметка JSON-LD рендерится самой страницей. Файлы страниц могут экспортировать только стандартные поля Next.js, поэтому вынесите компонент в отдельный файл:
src/components/WebPageJsonLd.tsxКопировать кодКопировать код в буфер обмена
src/app/[locale]/about/page.tsxКопировать кодКопировать код в буфер обмена
- переведенные
Интернационализация sitemap
НеобязательноСоглашение
sitemap.tsподдерживает свойствоalternates.languages, которое Next.js преобразует в тегиxhtml:link. Перечислите каждый URL для каждой локали:src/app/sitemap.tsКопировать кодКопировать код в буфер обмена
Интернационализация robots.txt
НеобязательноПриватные маршруты существуют на каждом языке, поэтому директива
disallowдолжна охватывать все локализованные пути:src/app/robots.tsКопировать кодКопировать код в буфер обмена
Обработка локализованных страниц 404
НеобязательноФайл
not-found.tsxрендерится внутри layout[locale], благодаря чему он имеет доступ к клиентскому провайдеру. Catch-all маршрут перенаправляет неизвестные пути внутри локали на него. Next.js автоматически добавляетnoindexк ответам 404.src/app/[locale]/not-found.tsxКопировать кодКопировать код в буфер обмена
src/app/[locale]/[...rest]/page.tsxКопировать кодКопировать код в буфер обмена
Доступ к локали в Server Actions
НеобязательноServer Actions не получают параметры маршрута автоматически. Наиболее надежный подход - передавать локаль вместе с формой из страницы, которой она известна:
src/app/[locale]/contact/page.tsxКопировать кодКопировать код в буфер обмена
src/app/actions/sendContactMessage.tsКопировать кодКопировать код в буфер обмена
Сохранение макросов и сокращение рантайма с Intlayer
НеобязательноАдаптер совместимости
@intlayer/linguiпозволяет оставить исходный код без изменений: макросы компилируются как и раньше, а вызовыi18n._(),useLingui()и<Trans>обслуживаются словарями Intlayer. В бенчмарке Next.js размер рантайма снижается с ~72.1 KB до ~10.7 KB gzip.В Next.js адаптер подключается путем создания псевдонимов (alias)
@lingui/coreи@lingui/reactна@intlayer/linguiвnext.config.ts(как для webpack, так и для Turbopack), а также оборачиванием конфигурации в функциюwithIntlayerизnext-intlayer/server. Сохраните@lingui/swc-plugin, чтобы макросы продолжали компилироваться первыми. Полная конфигурация описана в руководстве по совместимости с Lingui.Как видно из таблицы бенчмарка, адаптер уменьшает размер рантайма, но пока не исключает передачу каталогов на страницу в Next.js. Его лучше всего использовать как мост для плавной миграции: после его запуска вы можете постепенно переводить компоненты на нативный API
useIntlayer, который отправляет только тот контент, который фактически рендерится компонентом. Смотрите руководство по Next.js + Intlayer, Lingui против @intlayer/lingui и все адаптеры совместимости.Автоматизация переводов с помощью Intlayer
НеобязательноLingui извлекает сообщения, но заполнение десятков каталогов вручную отнимает больше всего времени. Intlayer является бесплатным решением с открытым исходным кодом, и его инструменты отлично работают в связке с Lingui:
- Перевод с помощью AI с использованием вашего собственного API-ключа и провайдера. Смотрите автозаполнение и CLI.
- Использование ваших PO-файлов как основного источника истины с помощью плагина синхронизации PO.
- Тестирование отсутствующих переводов в CI. Смотрите тестирование переводов.
- Аудит развернутого сайта на предмет отсутствующих
hreflang, некорректных канонических URL и утечек локалей с помощью команды scan.
Часто задаваемые вопросы
Да. @lingui/react поддерживает React Server Components. Server Components регистрируют экземпляр с помощью setI18n из @lingui/react/server, Client Components считывают его из I18nProvider, и оба типа компонентов используют одинаковые макросы Trans и useLingui.
Server Components не имеют контекста React, поэтому экземпляр регистрируется для каждого рендера отдельно. Layout сохраняются между переходами по страницам и не рендерятся заново, поэтому страница не может полагаться на то, что layout установил локаль. Вызов initLingui(locale) в начале каждого layout и page обеспечивает их независимость.
Используйте @lingui/swc-plugin. Это сохраняет конвейер компиляции SWC и работу Turbopack. Добавление конфигурации Babel отключает SWC в Next.js и существенно замедляет сборку. Единственное требование - поддерживать версию плагина, совместимую с версией SWC в вашем релизе Next.js.
Получите серверный экземпляр через getI18nInstance(locale) и переведите дескрипторы, объявленные с помощью макроса msg: i18n._(msg`About us`). Возвращайте alternates.canonical, alternates.languages с x-default и openGraph.locale. В шаге 13 представлен готовый хелпер.
Бенчмарк показывает размер рантайма около ~72 KB gzip. При использовании одного каталога на локаль страницы весят ~145 KB по сравнению со 141 KB без i18n, однако каждая страница все еще получает сообщения других страниц через клиентский провайдер.
Lingui подходит командам, которые предпочитают писать исходный текст прямо в компонентах и работать с PO-файлами и профессиональными переводчиками. next-intl подходит тем, кто предпочитает каталоги JSON и API вида t("key"), тесно интегрированный с Next.js. next-i18next предоставляет экосистему плагинов i18next. Смотрите next-i18next против next-intl против Intlayer и бенчмарк Next.js.
Комментарии
Пока нет комментариев. Будьте первым, кто поделится своими мыслями.
