Задайте питання та отримайте підсумок документа, вказавши цю сторінку та обраного вами постачальника штучного інтелекту
Історія версій
- "Початкова версія"v9.5.1026.09.2026
Вміст цієї сторінки перекладено за допомогою штучного інтелекту.
Переглянути останню версію оригінального вмісту англійськоюЯкщо у вас є ідея щодо покращення цієї документації, будь ласка, долучіться, надіславши pull request на GitHub.
Посилання на документацію на GitHubСкопіювати документацію у форматі Markdown в буфер обміну
Як інтернаціоналізувати ваш застосунок TanStack Start за допомогою Lingui у 2026 році
Зміст
Що таке Lingui?
Lingui - це бібліотека i18n, побудована навколо макросів та вилучення повідомлень. Ви пишете вихідний текст безпосередньо у ваших компонентах ( t`Hello` , <Trans>Hello</Trans>), lingui extract збирає кожне повідомлення у каталоги (за замовчуванням файли PO), перекладачі заповнюють їх, а плагін Vite компілює їх у компактний JavaScript. Повідомлення використовують ICU MessageFormat, тому підтримуються форми множини та селектори.
TanStack Start не містить вбудованого рівня i18n, тому цей посібник інтегрує Lingui з нуля:
- Макроси, скомпільовані Babel через
@rolldown/plugin-babel(необхідно з@vitejs/plugin-reactv6 та Vite 8). - Маршрутизація локалей з необов'язковим сегментом
{-$locale}(/about,/fr/about). - Один каталог на локаль, що завантажується за вимогою, та окремий екземпляр
I18nна кожен рендеринг, щоб одночасні SSR-запити ніколи не ділили спільну локаль. - Повне багатомовне SEO: перекладені
<title>та опис, канонічна URL-адреса,hreflangізx-default, локалі Open Graph, JSON-LD, sitemap,robots.txt, попередній рендеринг і локалізовані сторінки 404.
Шукаєте інший стек? Перегляньте посібник з TanStack Start + use-intl, посібник з TanStack Start + Paraglide або посібник з TanStack Start + Intlayer.
Використовуєте Next.js? Перегляньте посібник з Next.js + Lingui. Порівнюєте бібліотеки? Читайте Lingui проти Intlayer.
Що показує бенчмарк про Lingui на TanStack Start
Бенчмарк i18n запускає один і той самий застосунок TanStack Start на 10 сторінок і 10 локалей з усіма основними бібліотеками та вимірює, що браузер фактично завантажує.
Динамічне завантаження JSON
Ледаче завантаження перекладів під час виконання
Обмежений JSON (простори імен)
Простори імен перекладу для кожної сторінки
Бенчмарк продуктивності I18n
Що це за метрика?
Загальний стиснений у gzip розмір пакета бібліотеки інтернаціоналізації. Він включає лише провайдер та логіку отримання контенту після tree-shaking та мініфікації.
Чому це важливо?
Менший розмір бібліотеки зменшує початкове завантаження JavaScript, що призводить до швидшого завантаження та виконання на клієнті.
Перегляд як
Ключові показники для @lingui/core@6.6.0, виміряні 2026-09-26 (gzip):
Відкрийте таблицю в модальному вікні, щоб чітко переглянути всі дані
| Налаштування | Розмір бібліотеки | JS на сторінку | Витік інших локалей | Витік інших сторінок |
|---|---|---|---|---|
| Без i18n (базовий застосунок) | - | 111.0 KB | 0% | 0% |
| Lingui (налаштування цього посібника) | 56.7 KB | 115.2 KB | 9.3% | 0% |
@intlayer/lingui (сумісність) | 9.8 KB | 136.7 KB | 9.9% | 0% |
react-intlayer (нативний Intlayer) | 4.5 KB | 126.8 KB | 0% | 0% |
Головні висновки:
- Завантажуйте один каталог на локаль за вимогою. Це утримує розмір сторінок близьким до базового застосунку.
- Розмір середовища виконання залишається значним (~57 KB gzip). Адаптер сумісності
@intlayer/lingui(крок 16) зберігає ваші макроси та зменшує його до ~10 KB.
Перегляньте повні дані: звіт бенчмарка TanStack Start, а також репозиторій бенчмарка.
Порівняння можливостей на TanStack Start
Як Lingui порівнюється з іншими популярними бібліотеками для TanStack Start:
Відкрийте таблицю в модальному вікні, щоб чітко переглянути всі дані
| Можливість | react-intlayer (Intlayer) | use-intl | Paraglide JS | Lingui |
|---|---|---|---|---|
| Переклади поруч із компонентами | ✅ Співрозміщені | ❌ Централізований JSON | ❌ Один JSON-файл на локаль | ⚠️ Вихідний текст у компонентах |
| Інтеграція з TypeScript | ✅ Автозгенеровані типи | ✅ Через AppConfig | ✅ Типізовані функції повідомлень | ⚠️ Тільки макроси |
| Виявлення відсутніх перекладів | ✅ Помилки типів та попередження збірки | ⚠️ Фолбек під час виконання | ⚠️ Фолбек на базову локаль | ⚠️ Фолбек на вихідний текст |
| Збагачений контент (JSX, Markdown) | ✅ Пряма підтримка | ⚠️ Теги через t.rich | ⚠️ Рядки | ✅ JSX всередині <Trans> |
| Локалізована маршрутизація | ✅ Вбудована | ❌ Вручну {-$locale} | ✅ urlPatterns + переписування роутера | ❌ Вручну {-$locale} |
| Перемикання локалі без перезавантаження | ✅ Так | ✅ Так | ❌ Повне перезавантаження сторінки | ✅ Так |
| Форми множини | ✅ На основі перерахування | ✅ ICU | ✅ Варіанти | ✅ ICU |
| ICU MessageFormat | ✅ Через format: "icu" | ✅ Нативно | ⚠️ Через плагін inlang | ✅ Нативно |
| Формати контенту | ✅ .ts, .json, .md, .yaml... | ⚠️ .json | ⚠️ inlang JSON | ✅ PO, JSON, CSV |
| AI-переклад | ✅ Власний провайдер і ключ | ❌ Ні | ❌ Ні | ❌ Ні |
| Візуальний редактор / CMS | ✅ Локальний редактор + опціональна CMS | ❌ Зовнішні платформи | ⚠️ Застосунки екосистеми inlang | ❌ Зовнішні платформи |
| SEO-помічники (hreflang, sitemap) | ✅ Вбудовані | ❌ Вручну | ⚠️ Локалізовані URL, решта вручну | ❌ Вручну |
| Розмір runtime (gzip, бенчмарк) | 4.5 KB | 75.9 KB | 1.8 KB | 56.7 KB |
| Витік, найкраще налаштування (локаль / сторінка) | 0% / 0% | 0% / 0% | 49.7% / 0% | 8.6% / 0% |
| Відсутні переклади в CI | ✅ npx intlayer test | ⚠️ Немає вбудованого | ⚠️ Немає вбудованого | ✅ lingui compile --strict |
Показники розміру runtime та витоку взяті з бенчмарка TanStack Start. Витік вимірюється на найкращій конфігурації кожної бібліотеки.
Інші посібники з TanStack Start: use-intl, Paraglide JS та Intlayer.
Практики, яких варто дотримуватися
- Встановлюйте
langтаdirна<html>з локалі маршруту, щоб вони були коректними в серверному HTML. - Зберігайте окремий URL для кожної локалі з префіксом, щоб кожна мовна версія індексувалася.
- Створюйте один екземпляр
I18nна локаль, ніколи не змінюйте глобальний екземпляр під час SSR: два одночасні запити перезапишуть локаль один одного. - Завантажуйте лише активний каталог, ніколи не імпортуйте їх усі в клієнтському коді.
- Оберіть один стиль макросів (
useLingui+tу компонентах,msgдля відкладених дескрипторів) і дотримуйтеся його. Змішуванняt,i18n._,i18n.tта<Trans>ускладнює читання коду для людей і AI-асистентів. - Запускайте
lingui extractу CI, щоб нове повідомлення ніколи не потрапляло у реліз неперекладеним. - Перекладайте метадані та оголошуйте
canonical,hreflangіx-defaultна кожній сторінці. - Генеруйте багатомовні sitemap і robots.txt та виконуйте попередній рендеринг кожної локалі.
- Використовуйте справжні посилання для перемикача локалей, щоб пошукові роботи знаходили кожну мову.
Перегляньте наш посібник з інтернаціоналізації та SEO та посібник з hreflang.
Покроковий посібник з налаштування Lingui у застосунку TanStack Start
Ось структура проєкту, яку ми створимо:
Скопіюйте код у буфер обміну
Встановлення залежностей
bashКопіювати кодСкопіюйте код у буфер обміну
- @lingui/core / @lingui/react: runtime,
I18nProviderта макроси (@lingui/core/macro,@lingui/react/macro). - @lingui/cli:
lingui extractдля збору повідомлень у каталоги. - @lingui/vite-plugin: компілює каталоги
.poпід час імпорту, томуlingui compileне потрібен. - @lingui/babel-plugin-lingui-macro + @rolldown/plugin-babel: трансформують макроси під час збірки.
- @lingui/core / @lingui/react: runtime,
Централізація конфігурації локалей
Локаль за замовчуванням залишається без префікса (
/about), інші локалі отримують префікс (/fr/about).src/i18n/config.tsКопіювати кодСкопіюйте код у буфер обміну
Налаштування Lingui
Конфігурація Lingui повторно використовує той самий список локалей, тому каталоги, роутер і sitemap завжди узгоджені.
lingui.config.tsКопіювати кодСкопіюйте код у буфер обміну
Додайте скрипти вилучення:
package.jsonКопіювати кодСкопіюйте код у буфер обміну
i18n:checkзавершується з помилкою в CI, якщо компонент містить повідомлення, яке не було вилучено та зафіксовано в git.Налаштування Vite
З
@vitejs/plugin-reactv6 Babel більше не вбудований за замовчуванням.@rolldown/plugin-babelзапускає плагін макросів Lingui, аlinguiTransformerBabelPresetобробляє лише файли, які імпортують макрос, що зберігає високу швидкість збірки.vite.config.tsКопіювати кодСкопіюйте код у буфер обміну
Завантаження каталогів для кожної локалі
Шаблонний рядок в
import()дозволяє Vite генерувати один чанк на кожен каталог, а плагін Lingui компілює файл.poу нього. Французький відвідувач завантажує лише французький каталог.Скомпільовані повідомлення є звичайними даними, тому вони можуть повертатися завантажувачем маршруту (loader), серіалізуватися в HTML і повторно використовуватися під час гідратації.
src/i18n/lingui.tsКопіювати кодСкопіюйте код у буфер обміну
Щоб TypeScript приймав імпорт
.po, оголосіть модуль один раз:src/i18n/po.d.tsКопіювати кодСкопіюйте код у буфер обміну
Створення кореневого документа
Кореневий маршрут зчитує необов'язковий параметр локалі, щоб встановити
langтаdirна серверно відрендереному<html>.src/routes/__root.tsxКопіювати кодСкопіюйте код у буфер обміну
Створення маршруту макета локалі
Папка
{-$locale}створює необов'язковий сегмент шляху: і/about, і/fr/aboutвідповідають маршруту/{-$locale}/about. Макет відхиляє невідомі префікси, завантажує каталог поточної локалі та надає виділений екземплярI18n.src/routes/{-$locale}/route.tsxКопіювати кодСкопіюйте код у буфер обміну
Використання перекладів на ваших сторінках
Пишіть вихідний текст у компоненті. Макроси перетворюють його на ідентифікатори повідомлень під час збірки, а
lingui extractзбирає їх.<Trans>для контенту JSX, включаючи вкладені елементи;useLingui().tдля рядків (атрибути, пропси);<Plural>для форм множини ICU.
src/routes/{-$locale}/about.tsxКопіювати кодСкопіюйте код у буфер обміну
Динамічний
import()каталогу кешується системою модулів, тому викликloadI18nу кількох лоадерах не завантажує каталог двічі.Вилучення та переклад ваших повідомлень
Запустіть процес вилучення. Lingui записує кожне повідомлення у каталог кожної локалі:
bashКопіювати кодСкопіюйте код у буфер обміну
Потім перекладіть
msgstrдля кожного запису:src/locales/fr/messages.poКопіювати кодСкопіюйте код у буфер обміну
src/locales/es/messages.poКопіювати кодСкопіюйте код у буфер обміну
За замовчуванням ідентифікатори повідомлень є хешами вихідного тексту: зміна тексту англійською створює нове повідомлення. Використовуйте явні ID (
<Trans id="about.title">About us</Trans>) для текстів, які часто змінюються.Створення компонента локалізованого посилання
Необов'язковоКожен маршрут розташований під
{-$locale}, тому посилання повинні містити параметр поточної локалі.src/components/LocalizedLink.tsxКопіювати кодСкопіюйте код у буфер обміну
Зміна мови вашого контенту
Необов'язковоВідображайте перемикач у вигляді посилань, щоб пошукові роботи знаходили кожну мовну версію.
to="."зберігає поточну сторінку та замінює параметр локалі. Після цього лоадер макета локалі завантажує новий каталог.src/components/LocaleSwitcher.tsxКопіювати кодСкопіюйте код у буфер обміну
Інтернаціоналізація ваших метаданих
Необов'язковоКожна мовна версія може ранжуватися самостійно за умови, що кожна сторінка містить перекладені
<title>та опис, самопосилальне канонічне посилання, по одномуhreflangна кожну локаль плюсx-default, локалі Open Graph і JSON-LD зinLanguage. Метадані перекладаються в лоадері (крок 8), а ця допоміжна функція формує решту:src/i18n/seo.tsКопіювати кодСкопіюйте код у буфер обміну
Інтернаціоналізація sitemap та robots.txt
Необов'язковоSitemap перераховує кожен URL кожної локалі, де кожен запис оголошує всі свої альтернативні версії за допомогою
xhtml:link.robots.txtблокує приватні маршрути для кожної мови та вказує на sitemap. Видалітьpublic/robots.txt, якщо стартовий шаблон створив його.src/routes/sitemap[.]xml.tsКопіювати кодСкопіюйте код у буфер обміну
src/routes/robots[.]txt.tsКопіювати кодСкопіюйте код у буфер обміну
Попередній рендеринг кожної локалі
Необов'язковоПерерахуйте всі локалізовані шляхи, щоб TanStack Start виконав попередній рендеринг (pre-render) усіх мовних версій під час збірки:
vite.config.tsКопіювати кодСкопіюйте код у буфер обміну
Перенаправлення нових відвідувачів та обробка сторінок 404
Необов'язковоMiddleware запитів спрямовує відвідувача, який переходить на
/, на його бажану мову (спочатку cookie, потімAccept-Language). Глибокі посилання ніколи не перенаправляються, тому пошукові роботи та користувачі за спільними посиланнями завжди отримують запитану сторінку.src/i18n/negotiateLocale.tsКопіювати кодСкопіюйте код у буфер обміну
src/start.tsКопіювати кодСкопіюйте код у буфер обміну
Для сторінок 404 універсальний маршрут (catch-all) відображає локалізований
notFoundComponentмакета. Позначте його якnoindex: React 19 піднімає<meta>у<head>.src/components/NotFound.tsxКопіювати кодСкопіюйте код у буфер обміну
src/routes/{-$locale}/$.tsxКопіювати кодСкопіюйте код у буфер обміну
Збережіть ваші макроси та зменшіть розмір runtime за допомогою Intlayer
Необов'язковоАдаптер сумісності
@intlayer/linguiзалишає ваш вихідний код незмінним: макроси компілюються так само, як і раніше, а результуючі викликиi18n._(),useLingui()та<Trans>обслуговуються скомпільованими словниками Intlayer. У бенчмарку розмір runtime знижується з ~56.7 KB до ~9.8 KB gzip.bashКопіювати кодСкопіюйте код у буфер обміну
Додайте плагін після трансформації макросів, щоб він перенаправляв аліаси
@lingui/coreта@lingui/reactна адаптер:vite.config.tsКопіювати кодСкопіюйте код у буфер обміну
Каталоги синхронізуються за допомогою плагіна sync JSON (каталоги JSON) або плагіна sync PO (каталоги PO). Повні інструкції з налаштування дивіться в посібнику з сумісності Lingui, а також у порівнянні Lingui проти @intlayer/lingui.
Автоматизуйте ваші переклади за допомогою Intlayer
Необов'язковоLingui вилучає повідомлення, але ручне заповнення десятків каталогів займає найбільше часу. Intlayer є безкоштовним та open-source інструментом, і його інструментарій працює разом із Lingui:
- Перекладайте за допомогою AI, використовуючи власний API-ключ та провайдера. Дивіться автоматичне заповнення та CLI.
- Зберігайте ваші PO-файли як єдине джерело правди за допомогою плагіна sync PO.
- Тестуйте відсутні переклади в CI. Дивіться тестування перекладів.
- Проводьте аудит вашого розгорнутого сайту на наявність відсутніх
hreflang, неправильних канонічних посилань та витоків локалей за допомогою команди scan.
Часті запитання
Так. Lingui не має спеціальної інтеграції для TanStack Start, але його плагін Vite та плагін макросів Babel працюють як є. Дві важливі речі, які потрібно налаштувати: запуск макросів через @rolldown/plugin-babel (Vite 8 та @vitejs/plugin-react v6 більше не включають Babel) і створення окремого екземпляра I18n для кожної локалі замість активації глобального під час SSR.
На сервері один процес обробляє багато запитів одночасно. Виклик i18n.activate("fr") на спільному об'єкті змінив би мову запиту, який паралельно рендериться англійською. setupI18n створює ізольований екземпляр для кожної локалі, що є безпечним.
Ні. @lingui/vite-plugin компілює каталоги .po безпосередньо під час їх імпорту. Вам потрібно запускати лише lingui extract для збору нових повідомлень.
Оголосіть їх за допомогою макросу msg та перекладіть у лоадері маршруту за допомогою i18n._(msg`...`). Лоадер повертає звичайні рядки, тому head() залишається синхронним, а значення серіалізуються для гідратації. Кроки 8 та 12 демонструють повне налаштування.
Бенчмарк показує ~56.7 KB gzip для runtime. При завантаженні одного каталогу на локаль за вимогою розмір сторінок становить ~115 KB проти 111 KB без i18n. Статичний імпорт усіх каталогів збільшує його до ~152 KB.
Так. Адаптер @intlayer/lingui зберігає макроси та замінює runtime. Після цього ви можете поступово переводити компоненти на useIntlayer. Дивіться адаптери сумісності.
Коментарі
Поки що немає коментарів. Будьте першим, хто поділиться своїми думками.
