Задайте питання та отримайте підсумок документа, вказавши цю сторінку та обраного вами постачальника штучного інтелекту
Історія версій
- "Початкова версія"v9.5.1026.09.2026
Вміст цієї сторінки перекладено за допомогою штучного інтелекту.
Переглянути останню версію оригінального вмісту англійськоюЯкщо у вас є ідея щодо покращення цієї документації, будь ласка, долучіться, надіславши pull request на GitHub.
Посилання на документацію на GitHubСкопіювати документацію у форматі Markdown в буфер обміну
Як інтернаціоналізувати ваш додаток Next.js за допомогою Lingui у 2026 році
Зміст
Що таке Lingui?
Lingui - це бібліотека i18n, побудована навколо макросів та вилучення повідомлень. Ви пишете вихідний текст у своїх компонентах ( 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, виміряні 2026-09-26 (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 та попередження під час збірки | ⚠️ Fallback під час виконання на вихідний текст | ⚠️ Fallback під час виконання |
| Багатий контент (JSX, Markdown) | ✅ Пряма підтримка | ✅ JSX всередині <Trans>, без Markdown | ⚠️ Теги через t.rich, без Markdown |
| AI-переклад | ✅ Власний провайдер та API-ключ з контекстом додатка | ❌ Немає | ❌ Немає |
| Візуальний редактор / CMS | ✅ Локальний візуальний редактор + опціональна CMS | ❌ Через сторонні платформи | ❌ Через сторонні платформи |
| Локалізована маршрутизація | ✅ Вбудована | ❌ Потрібно писати власний proxy.ts | ✅ Вбудований сегмент [locale] |
| Плюралізація | ✅ На основі перелічення (enumeration) | ✅ ICU, макрос <Plural> | ✅ ICU |
| Формати контенту | ✅ .ts, .tsx, .js, .json, .md, .yaml | ✅ PO, JSON, CSV | ✅ .json, .js, .ts |
| ICU MessageFormat | ✅ Через format: "icu" | ✅ Нативно | ✅ Нативно |
| SEO-помічники (hreflang, sitemap) | ✅ Помічники для metadata, sitemap та robots.txt | ❌ Вручну | ✅ Добре |
| Server Components | ✅ Прямий доступ у будь-якому Server Component | ⚠️ setI18n у кожному макеті та на кожній сторінці | ⚠️ 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>у макеті[locale]. - Надавайте перевагу Server Components для тексту: вони рендерять HTML на сервері та не потребують каталогу на клієнті.
- Викликайте
initLingui(locale)у кожному макеті та на кожній сторінці. Макети не перерендериваються під час навігації, тому сторінка не може покладатися на те, що її макет встановив локаль. - Зберігайте один 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. Провайдер отримує каталог активної локалі від серверного макета та створює власний екземпляр один раз.
src/components/LinguiClientProvider.tsxКопіювати кодСкопіюйте код у буфер обміну
Визначте динамічні маршрути локалей
Сегмент
[locale]містить кореневий макет.generateStaticParamsпопередньо рендерить кожну локаль під час збірки, аdynamicParams = falseповертає 404 для будь-якого іншого префікса.src/app/[locale]/layout.tsxКопіювати кодСкопіюйте код у буфер обміну
Клієнтський провайдер отримує весь каталог активної локалі. Це те, що бенчмарк вимірює як "витік інших сторінок". Збереження тексту в Server Components обмежує те, що насправді потрібно клієнту. Для великих додатків експериментальний екстрактор Lingui на сторінку (
experimental.extractorуlingui.config.ts) розділяє каталоги за точками входу.Використовуйте переклади в Server Components
Server Components використовують ті самі макроси, що й Client Components.
initLinguiповинен запускатися і на сторінці, оскільки макет не перерендеривається під час переходу між своїми сторінками.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. Proxy реалізує стратегію префікса за потребою ("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Копіювати кодСкопіюйте код у буфер обміну
Створіть компонент LocalizedLink
Необов'язковоsrc/components/LocalizedLink.tsxКопіювати кодСкопіюйте код у буфер обміну
Це працює також із Server Components, оскільки рендериться всередині
LinguiClientProvider:tsxКопіювати кодСкопіюйте код у буфер обміну
Інтернаціоналізуйте ваші метадані
Необов'язковоКожна мовна версія може ранжуватися окремо, за умови, що кожна сторінка містить:
- перекладені
titleтаdescription; - canonical URL, що вказує на саму себе;
- один альтернативний
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рендериться всередині макета[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 адаптер підключається через створення аліасів
@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, неправильних canonical та витоків локалей за допомогою команди scan.
Часті запитання
Так. @lingui/react підтримує React Server Components. Server Components реєструють екземпляр за допомогою setI18n з @lingui/react/server, Client Components зчитують його з I18nProvider, і обидва типи компонентів використовують однакові макроси Trans та useLingui.
У Server Components немає контексту, тому екземпляр реєструється для кожного рендерингу окремо. Макети зберігаються під час навігації та не перерендериваються, тому сторінка не може покладатися на те, що її макет встановить локаль. Виклик initLingui(locale) на початку кожного макета та кожної сторінки забезпечує їхню незалежність.
Використовуйте @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.
Коментарі
Поки що немає коментарів. Будьте першим, хто поділиться своїми думками.
