Zadaj pytanie i otrzymaj streszczenie dokumentu, odwołując się do tej strony i wybranego dostawcy AI
Historia wersji
- "Wersja początkowa"v9.5.1026.09.2026
Treść tej strony została przetłumaczona przy użyciu sztucznej inteligencji.
Zobacz ostatnią wersję oryginalnej treści w języku angielskimJeśli masz pomysł na ulepszenie tej dokumentacji, zachęcamy do przesłania pull requesta na GitHubie.
Link do dokumentacji na GitHubieKopiuj dokument Markdown do schowka
Jak przeprowadzić internacjonalizację aplikacji Next.js za pomocą Lingui w 2026 roku
Spis treści
Czym jest Lingui?
Lingui to biblioteka i18n zbudowana wokół makr oraz ekstrakcji komunikatów. Tekst źródłowy piszesz bezpośrednio w komponentach ( t`Hello` , <Trans>Hello</Trans>), polecenie lingui extract zbiera wszystkie komunikaty do katalogów (domyślnie plików PO), a loader kompiluje je do zwartego kodu JavaScript. Komunikaty korzystają z formatu ICU MessageFormat, a Lingui wspiera React Server Components w App Routerze.
Ten przewodnik przedstawia konfigurację Lingui w projekcie Next.js 16 App Router z:
- Makrami kompilowanymi przez SWC, dzięki czemu Turbopack zachowuje swoją szybkość.
- Komponentami serwerowymi i klienckimi współdzielącymi to samo API
TransorazuseLingui. - Routingiem według locale przez
proxy.ts:/aboutdla domyślnego języka,/fr/aboutdla pozostałych oraz wykrywaniem języka przy pierwszej wizycie. - Statycznym renderowaniem każdego języka za pomocą
generateStaticParams. - Kompletnym wielojęzycznym SEO: przetłumaczonym
generateMetadata, canonical,hreflangzx-default, Open Graph locales, JSON-LD,sitemap.ts,robots.tsoraz zlokalizowanymi stronami 404.
Szukasz innej biblioteki? Zobacz przewodnik po next-intl, przewodnik po next-i18next lub przewodnik Next.js + Intlayer.
Używasz TanStack Start? Zobacz przewodnik TanStack Start + Lingui. Porównujesz biblioteki? Przeczytaj Lingui vs Intlayer oraz next-i18next vs next-intl vs Intlayer.
Co benchmark mówi o Lingui w Next.js
Benchmark i18n uruchamia tę samą 10-stronicową, 10-języczną aplikację Next.js z każdą główną biblioteką i mierzy, co przeglądarka faktycznie pobiera.
Dynamiczne ładowanie JSON
Wczytuje tłumaczenia leniwie w czasie wykonywania
Ograniczony JSON (przestrzenie nazw)
Przestrzenie nazw tłumaczeń na stronę
Benchmark wydajności I18n
Czym jest ta metryka?
Całkowity skompresowany przez gzip rozmiar pakietu biblioteki umiędzynarodowienia. Obejmuje tylko dostawcę i logikę pobierania treści po tree-shakingu i minifikacji.
Dlaczego to jest ważne?
Mniejszy rozmiar biblioteki zmniejsza obciążenie u klienta.
Zobacz jako
Główne liczby dla @lingui/core@6.6.0 w Next.js 16, zmierzone w dniu 2026-09-26 (gzip):
Otwórz tabelę w oknie modalnym, aby wyraźnie zobaczyć całą zawartość
| Konfiguracja | Rozmiar biblioteki | JS na stronę | Wyciek innych języków | Wyciek innych stron |
|---|---|---|---|---|
| Brak i18n (aplikacja bazowa) | - | 141.0 KB | 0% | 0% |
| Lingui, jeden katalog na locale | 72.1 KB | 145.4 KB | 2.8% | 89.9% |
@intlayer/lingui (kompatybilność) | 10.7 KB | 221.6 KB | 50% | 90% |
next-intlayer (natywny Intlayer) | 4.9 KB | 141.5 KB | 0% | 0% |
Wnioski:
- Pojedynczy katalog na locale wciąż powoduje wyciek komunikatów z innych stron do providera klienta. Trzymaj jak najwięcej tekstu w Server Components, które przesyłają wyrenderowany HTML, a nie katalogi.
- Środowisko uruchomieniowe Lingui waży ~72 KB gzip. Adapter kompatybilności
@intlayer/linguizmniejsza runtime do ~11 KB, ale w tym benchmarku konfiguracja kompatybilności Next.js nadal przesyła całe katalogi do strony. Natywne APInext-intlayerto konfiguracja, która zachowuje rozmiar aplikacji bazowej.
Zobacz pełne dane: raport z benchmarku Next.js oraz repozytorium benchmarku.
Porównanie funkcji w Next.js
Jak Lingui wypada w porównaniu z next-intl i Intlayer pod względem funkcji, których zwykle wymaga projekt Next.js App Router:
Otwórz tabelę w oknie modalnym, aby wyraźnie zobaczyć całą zawartość
| Funkcja | next-intlayer (Intlayer) | Lingui | next-intl |
|---|---|---|---|
| Tłumaczenia blisko komponentów | ✅ Treści kolokowane z każdym komponentem | ⚠️ Tekst źródłowy w komponentach, katalogi scentralizowane | ❌ Scentralizowany JSON |
| Integracja z TypeScript | ✅ Automatycznie generowane ścisłe typy | ⚠️ Makra typowane, katalogi komunikatów nie | ✅ Dobre, przez rozszerzenie AppConfig |
| Wykrywanie brakujących tłumaczeń | ✅ Błędy TypeScript i ostrzeżenia podczas budowy | ⚠️ Runtime fallback do tekstu źródłowego | ⚠️ Runtime fallback |
| Treści sformatowane (JSX, Markdown) | ✅ Bezpośrednie wsparcie | ✅ JSX wewnątrz <Trans>, brak Markdown | ⚠️ Tagi przez t.rich, brak Markdown |
| Tłumaczenie AI | ✅ Własny dostawca i klucz API, z kontekstem aplikacji | ❌ Brak | ❌ Brak |
| Edytor wizualny / CMS | ✅ Lokalny edytor wizualny + opcjonalny CMS | ❌ Przez platformy zewnętrzne | ❌ Przez platformy zewnętrzne |
| Zlokalizowany routing | ✅ Wbudowany | ❌ Wymaga napisania własnego proxy.ts | ✅ Wbudowany segment [locale] |
| Liczba mnoga (Pluralizacja) | ✅ Oparta na wyliczeniach | ✅ ICU, makro <Plural> | ✅ ICU |
| Formaty treści | ✅ .ts, .tsx, .js, .json, .md, .yaml | ✅ PO, JSON, CSV | ✅ .json, .js, .ts |
| ICU MessageFormat | ✅ Przez format: "icu" | ✅ Natywnie | ✅ Natywnie |
| Pomocnicy SEO (hreflang, sitemap) | ✅ Pomocnicy dla metadata, sitemap i robots.txt | ❌ Ręcznie | ✅ Dobre |
| Server Components | ✅ Bezpośredni dostęp w każdym Server Component | ⚠️ setI18n w każdym układzie i na każdej stronie | ⚠️ await getTranslations() na komponent |
| Tree-shaking per komponent | ✅ W czasie budowy (Babel / SWC) | ⚠️ Jeden katalog na locale, ekstraktor per strona eksperymentalny | ⚠️ Ręcznie, z pick() na trasę |
| Rozmiar runtime (gzip, benchmark) | 4.9 KB | 72.1 KB | 14.7 KB |
| Brakujące tłumaczenia w CI | ✅ npx intlayer test | ✅ lingui compile --strict | ⚠️ Brak wbudowanego rozwiązania |
| Ekosystem / społeczność | ⚠️ Mniejsza, szybko rosnąca | ✅ Dojrzały | ✅ Duży |
Rozmiary runtime pochodzą z benchmarku Next.js. Szczegółowe omówienie znajdziesz w artykule Lingui vs Intlayer.
Inne poradniki dla Next.js: next-intl, next-i18next oraz Intlayer.
Praktyki, których powinieneś przestrzegać
- Ustaw
langidirw tagu<html>w układzie[locale]. - Preferuj Server Components dla tekstu: renderują HTML na serwerze i nie wymagają przesyłania katalogu do klienta.
- Wywołuj
initLingui(locale)w każdym układzie i na każdej stronie. Układy nie renderują się ponownie podczas nawigacji, więc strona nie może polegać na tym, że jej układ ustawił locale. - Utrzymuj jeden adres URL na locale i wstępnie renderuj każdy język za pomocą
generateStaticParams. - Tłumacz swoje metadane w
generateMetadata, uwzględniająccanonical,hreflangorazx-default. - Generuj wielojęzyczną mapę witryny i robots.txt zgodnie z konwencjami
sitemap.tsirobots.ts. - Używaj rzeczywistych linków w przełączniku języków, aby roboty indeksujące mogły odkryć każdą wersję językową.
- Uruchamiaj
lingui extractw CI, aby żaden nowy komunikat nie trafił do wdrożenia bez tłumaczenia.
Zobacz nasz przewodnik po internacjonalizacji i SEO, przewodnik po hreflang oraz porównanie wielojęzycznego SEO w Next.js.
Przewodnik krok po kroku po konfiguracji Lingui w aplikacji Next.js
Oto struktura projektu, którą utworzymy:
Skopiuj kod do schowka
Zainstaluj zależności
bashKopiuj kodSkopiuj kod do schowka
- @lingui/core / @lingui/react: runtime,
I18nProvider,setI18ndla Server Components oraz makra (@lingui/core/macro,@lingui/react/macro). - @lingui/swc-plugin: kompiluje makra wewnątrz potoku SWC w Next.js.
- @lingui/loader: kompiluje katalogi
.popodczas importu, dzięki czemulingui compilenie jest wymagane. - @lingui/cli:
lingui extractdo zbierania komunikatów do katalogów.
@lingui/swc-pluginto wtyczka WebAssembly powiązana z wersją SWC używaną przez Next.js. Jeśli budowanie zakończy się niepowodzeniem po aktualizacji Next.js, zaktualizuj wtyczkę do wersji wymienionej jako kompatybilna w jej pliku README.- @lingui/core / @lingui/react: runtime,
Scentralizuj konfigurację locale
Pojedynczy plik definiuje języki i pomocników URL. Routing, metadane, sitemap oraz Lingui odczytują dane z tego pliku.
src/i18n/config.tsKopiuj kodSkopiuj kod do schowka
Skonfiguruj Lingui i Next.js
lingui.config.tsKopiuj kodSkopiuj kod do schowka
Wtyczka SWC kompiluje makra, a loader kompiluje pliki
.po, zarówno dla Turbopacka (domyślnego w Next.js 16), jak i webpacka:next.config.tsKopiuj kodSkopiuj kod do schowka
Dodaj skrypty ekstrakcji:
package.jsonKopiuj kodSkopiuj kod do schowka
Załaduj katalogi i utwórz instancje serwera
Server Components nie posiadają kontekstu React, dlatego Lingui dostarcza funkcję
setI18ndo rejestracji instancji dla bieżącego renderowania. Ten moduł ładuje każdy katalog jeden raz na proces serwera i tworzy jedną instancjęI18nna locale. Jest oznaczony jakoserver-only: katalogi innych języków nigdy nie trafiają do pakietu klienta.src/i18n/appRouterI18n.tsKopiuj kodSkopiuj kod do schowka
src/i18n/initLingui.tsKopiuj kodSkopiuj kod do schowka
Aby TypeScript akceptował import plików
.po, zadeklaruj moduł jeden raz:src/i18n/po.d.tsKopiuj kodSkopiuj kod do schowka
Utwórz Client Provider
Client Components odczytują tłumaczenia z kontekstu React. Provider otrzymuje katalog aktywnego języka z układu serwerowego i tworzy własną instancję jednorazowo.
src/components/LinguiClientProvider.tsxKopiuj kodSkopiuj kod do schowka
Zdefiniuj dynamiczne trasy locale
Segment
[locale]zawiera układ główny (root layout).generateStaticParamswstępnie renderuje każdy język podczas budowania, adynamicParams = falsezwraca błąd 404 dla każdego innego prefiksu.src/app/[locale]/layout.tsxKopiuj kodSkopiuj kod do schowka
Provider klienta otrzymuje cały katalog aktywnego języka. To jest to, co benchmark mierzy jako "wyciek innych stron" (other-page leak). Pozostawianie tekstu w Server Components ogranicza to, czego klient rzeczywiście potrzebuje. W przypadku dużych aplikacji eksperymentalny ekstraktor Lingui per strona (
experimental.extractorwlingui.config.ts) dzieli katalogi według punktów wejścia.Wykorzystaj tłumaczenia w Server Components
Server Components używają tych samych makr co Client Components. Funkcja
initLinguimusi zostać uruchomiona również na stronie, ponieważ układ nie jest renderowany ponownie podczas nawigacji między jego stronami.src/app/[locale]/about/page.tsxKopiuj kodSkopiuj kod do schowka
Wykorzystaj tłumaczenia w Client Components
Client Components korzystają z tych samych importów. Makra odczytują instancję z
LinguiClientProvider.src/components/Counter.tsxKopiuj kodSkopiuj kod do schowka
Wyodrębnij i przetłumacz swoje komunikaty
Uruchom ekstrakcję. Lingui zapisze każdy komunikat znaleziony w katalogu
srcdo katalogu każdego języka:bashKopiuj kodSkopiuj kod do schowka
Następnie przetłumacz pole
msgstrkażdego wpisu:src/locales/fr/messages.poKopiuj kodSkopiuj kod do schowka
src/locales/es/messages.poKopiuj kodSkopiuj kod do schowka
Symbole zastępcze
<0>zachowują elementy JSX wewnątrz<Trans>, dzięki czemu tłumacze mogą zmieniać ich kolejność bez ingerencji w znaczniki.Skonfiguruj Proxy dla routingu locale
OpcjonalneW Next.js 16 zmieniono nazwę pliku
middleware.tsnaproxy.ts. Proxy wdraża strategię prefiksów "w razie potrzeby" (as-needed):/fr/aboutjest serwowane bez zmian;/en/aboutprzekierowuje do/about, dzięki czemu domyślny język posiada pojedynczy adres URL;/aboutjest przepisywane wewnętrznie (rewrite) na/en/about, bez zmiany widocznego adresu URL;- pierwsza wizyta na
/przekierowuje do preferowanego języka (najpierw plik cookie, następnieAccept-Language).
src/i18n/negotiateLocale.tsKopiuj kodSkopiuj kod do schowka
src/proxy.tsKopiuj kodSkopiuj kod do schowka
Zmień język swoich treści
OpcjonalneusePathnamezwraca adres URL widziany przez przeglądarkę (/aboutlub/fr/about). Usuń locale ze ścieżki, a następnie zbuduj link dla każdego języka. Przełącznik renderuje rzeczywiste linki, dzięki czemu roboty indeksujące mogą dotrzeć do każdej wersji językowej, a plik cookie zapamiętuje wyraźny wybór użytkownika.src/components/LocaleSwitcher.tsxKopiuj kodSkopiuj kod do schowka
Zbuduj zlokalizowany komponent Link
Opcjonalnesrc/components/LocalizedLink.tsxKopiuj kodSkopiuj kod do schowka
Działa to również w Server Components, ponieważ komponent jest renderowany wewnątrz
LinguiClientProvider:tsxKopiuj kodSkopiuj kod do schowka
Internacjonalizuj swoje metadane
OpcjonalneKażda wersja językowa może pozycjonować się niezależnie, pod warunkiem, że każda strona udostępnia:
- przetłumaczony
titleorazdescription; - kanoniczny URL (
canonical) wskazujący na samą siebie; - po jednym odpowiedniku
hreflangna locale, plusx-default; - Open Graph
locale,alternateLocaleorazurl; - JSON-LD z polem
inLanguage.
Funkcja
generateMetadatadziała poza drzewem React, dlatego używa instancji serwerowej bezpośrednio z makremmsg:src/i18n/metadata.tsKopiuj kodSkopiuj kod do schowka
src/app/[locale]/about/page.tsxKopiuj kodSkopiuj kod do schowka
JSON-LD jest renderowany bezpośrednio przez samą stronę. Pliki stron mogą eksportować tylko pola Next.js, dlatego zachowaj komponent w osobnym pliku:
src/components/WebPageJsonLd.tsxKopiuj kodSkopiuj kod do schowka
src/app/[locale]/about/page.tsxKopiuj kodSkopiuj kod do schowka
- przetłumaczony
Internacjonalizuj swoją mapę witryny
OpcjonalneKonwencja
sitemap.tsobsługujealternates.languages, co Next.js renderuje jako odpowiednikixhtml:link. Wymień każdy adres URL dla każdego języka:src/app/sitemap.tsKopiuj kodSkopiuj kod do schowka
Internacjonalizuj swój plik robots.txt
OpcjonalnePrywatne trasy istnieją w każdym języku, więc reguła
disallowmusi obejmować każdą zlokalizowaną ścieżkę:src/app/robots.tsKopiuj kodSkopiuj kod do schowka
Obsłuż zlokalizowane strony 404
OpcjonalnePlik
not-found.tsxrenderuje się wewnątrz układu[locale], dzięki czemu ma dostęp do providera klienta. Trasa catch-all przekierowuje do niego nieznane ścieżki w ramach danego locale. Next.js automatycznie dodaje nagłóweknoindexdo odpowiedzi 404.src/app/[locale]/not-found.tsxKopiuj kodSkopiuj kod do schowka
src/app/[locale]/[...rest]/page.tsxKopiuj kodSkopiuj kod do schowka
Uzyskaj dostęp do locale w Server Actions
OpcjonalneServer Actions nie otrzymują parametrów trasy. Najbardziej niezawodnym podejściem jest przesłanie locale wraz z formularzem ze strony, która je zna:
src/app/[locale]/contact/page.tsxKopiuj kodSkopiuj kod do schowka
src/app/actions/sendContactMessage.tsKopiuj kodSkopiuj kod do schowka
Zachowaj swoje makra, zredukuj runtime dzięki Intlayer
OpcjonalneAdapter kompatybilności
@intlayer/linguipozwala zachować kod źródłowy bez zmian: makra kompilują się jak wcześniej, a wynikowe wywołaniai18n._(),useLingui()oraz<Trans>są obsługiwane przez słowniki Intlayer. W benchmarku Next.js rozmiar runtime spada z ~72.1 KB do ~10.7 KB gzip.W Next.js adapter konfiguruje się, tworząc aliasy
@lingui/corei@lingui/reactna@intlayer/linguiwnext.config.ts(dla webpacka i Turbopacka) oraz owijając konfigurację za pomocąwithIntlayerznext-intlayer/server. Zachowaj@lingui/swc-plugin, aby makra były najpierw kompilowane. Pełna konfiguracja znajduje się w przewodniku po kompatybilności z Lingui.Jak pokazuje tabela benchmarku, adapter zmniejsza rozmiar środowiska uruchomieniowego, ale w Next.js nie eliminuje jeszcze przesyłania całego katalogu do każdej strony. Najlepiej sprawdza się jako pomost migracyjny: po jego uruchomieniu możesz stopniowo przenosić komponenty do natywnego API
useIntlayer, które przesyła tylko te treści, które renderuje dany komponent. Zobacz przewodnik Next.js + Intlayer, Lingui vs @intlayer/lingui oraz wszystkie adaptery kompatybilności.Zautomatyzuj swoje tłumaczenia za pomocą Intlayer
OpcjonalneLingui wyodrębnia komunikaty, ale ręczne wypełnianie dziesiątek katalogów zajmuje najwięcej czasu. Intlayer jest darmowy i open source, a jego narzędzia współpracują z Lingui:
- Tłumacz za pomocą AI, korzystając z własnego klucza API i dostawcy. Zobacz auto fill oraz CLI.
- Zachowaj pliki PO jako źródło prawdy dzięki wtyczce sync PO.
- Testuj brakujące tłumaczenia w procesach CI. Zobacz testowanie tłumaczeń.
- Audytuj wdrożoną stronę pod kątem brakujących tagów
hreflang, błędnych adresów kanonicznych i wycieków językowych za pomocą polecenia scan.
Często zadawane pytania
Tak. @lingui/react obsługuje React Server Components. Server Components rejestrują instancję za pomocą setI18n z @lingui/react/server, Client Components odczytują ją z I18nProvider, a oba typy komponentów używają tych samych makr Trans i useLingui.
Server Components nie posiadają kontekstu React, dlatego instancja jest rejestrowana na czas pojedynczego renderowania. Układy (layouts) są zachowywane podczas nawigacji i nie renderują się ponownie, więc strona nie może polegać na tym, że jej układ ustawił locale. Wywołanie initLingui(locale) na początku każdego układu i każdej strony zapewnia ich niezależność.
Używaj @lingui/swc-plugin. Zachowuje to potok SWC oraz Turbopack. Dodanie konfiguracji Babel wyłącza SWC w Next.js i spowalnia proces budowania. Jedynym wymogiem jest utrzymanie wersji wtyczki kompatybilnej z wersją SWC Twojego wydania Next.js.
Pobierz instancję serwera za pomocą getI18nInstance(locale) i przetłumacz deskryptory zadeklarowane za pomocą makra msg: i18n._(msg`About us`). Zwróć alternates.canonical, alternates.languages z x-default oraz openGraph.locale. Krok 13 zawiera pomocniczą funkcję wielokrotnego użytku.
Benchmark wskazuje około 72 KB gzip dla środowiska uruchomieniowego. Przy jednym katalogu na locale strony ważą ~145 KB w porównaniu do 141 KB bez i18n, lecz każda strona nadal otrzymuje komunikaty z innych stron za pośrednictwem providera klienta.
Lingui jest idealny dla zespołów, które preferują pisanie tekstu źródłowego w komponentach i pracę z plikami PO oraz tłumaczami. next-intl sprawdza się w zespołach wolących katalogi JSON i API t("key") ściśle zintegrowane z Next.js. next-i18next oferuje bogaty ekosystem wtyczek i18next. Zobacz next-i18next vs next-intl vs Intlayer oraz benchmark Next.js.
Komentarze
Nie ma jeszcze komentarzy. Bądź pierwszą osobą, która podzieli się swoimi przemyśleniami.
