Stellen Sie Ihre Frage und erhalten Sie einen Resümee des Dokuments, indem Sie diese Seite und den AI-Anbieter Ihrer Wahl referenzieren
Versionshistorie
- "Initiale Version"v9.5.1026.9.2026
Der Inhalt dieser Seite wurde mit einer KI übersetzt.
Den englischen Originaltext ansehenWenn Sie eine Idee haben, um diese Dokumentation zu verbessern, zögern Sie bitte nicht, durch das Einreichen eines Pull-Requests auf GitHub beizutragen.
GitHub-Link zur DokumentationMarkdown des Dokuments in die Zwischenablage kopieren
Wie Sie Ihre Next.js-Anwendung mit Lingui im Jahr 2026 internationalisieren
Inhaltsverzeichnis
Was ist Lingui?
Lingui ist eine i18n-Bibliothek, die auf Makros und Nachrichtenextraktion aufbaut. Sie schreiben den Quelltext direkt in Ihre Komponenten ( t`Hello` , <Trans>Hello</Trans>), lingui extract sammelt alle Nachrichten in Katalogen (standardmäßig PO-Dateien), und ein Loader kompiliert sie zu kompaktem JavaScript. Nachrichten verwenden das ICU MessageFormat, und Lingui unterstützt React Server Components im App Router.
Dieser Leitfaden richtet Lingui in einem Next.js 16 App Router Projekt ein, mit:
- Makros kompiliert durch SWC, damit Turbopack seine Geschwindigkeit behält.
- Server- und Client-Komponenten, die dieselbe
Trans- unduseLingui-API nutzen. - Locale-Routing über
proxy.ts:/aboutfür die Standardsprache,/fr/aboutfür die anderen sowie Spracherkennung beim ersten Besuch. - Statisches Rendering für jedes Locale mit
generateStaticParams. - Vollständiges mehrsprachiges SEO: übersetztes
generateMetadata, Canonical,hreflangmitx-default, Open Graph Locales, JSON-LD,sitemap.ts,robots.tsund lokalisierte 404-Seiten.
Suchen Sie nach einer anderen Bibliothek? Lesen Sie die next-intl Anleitung, die next-i18next Anleitung oder die Next.js + Intlayer Anleitung.
Nutzen Sie TanStack Start? Siehe die TanStack Start + Lingui Anleitung. Bibliotheken vergleichen? Lesen Sie Lingui vs Intlayer und next-i18next vs next-intl vs Intlayer.
Was der Benchmark über Lingui auf Next.js aussagt
Der i18n-Benchmark führt dieselbe Next.js-App mit 10 Seiten und 10 Locales mit jeder gängigen Bibliothek aus und misst, was der Browser tatsächlich herunterlädt.
Dynamisches JSON-Laden
Lädt Übersetzungen während der Laufzeit verzögert
Gescoptes JSON (Namespacing)
Übersetzungs-Namespaces pro Seite
I18n Performance-Benchmark
Was ist diese Metrik?
Die gesamte gzip-komprimierte Größe des Internationalisierungs-Bibliothekspakets. Es enthält nur den Provider und die Inhaltsabruflogik nach Tree-Shaking und Minimierung.
Warum ist das wichtig?
Eine kleinere Bibliotheksgröße reduziert die anfängliche JavaScript-Nutzlast, was zu schnelleren Download- und Ausführungszeiten auf dem Client führt.
Ansehen als
Wichtige Kennzahlen für @lingui/core@6.6.0 auf Next.js 16, gemessen am 26.09.2026 (gzip):
Tabelle in einem Modal öffnen, um alle Daten übersichtlich anzuzeigen
| Setup | Bibliotheksgröße | JS pro Seite | Leak anderer Locales | Leak anderer Seiten |
|---|---|---|---|---|
| Kein i18n (Basis-App) | - | 141.0 KB | 0% | 0% |
| Lingui, ein Katalog pro Locale | 72.1 KB | 145.4 KB | 2.8% | 89.9% |
@intlayer/lingui (Compat) | 10.7 KB | 221.6 KB | 50% | 90% |
next-intlayer (natives Intlayer) | 4.9 KB | 141.5 KB | 0% | 0% |
Wichtige Erkenntnisse:
- Ein einzelner Katalog pro Locale überträgt dennoch Nachrichten anderer Seiten an den Client-Provider. Behalten Sie so viel Text wie möglich in Server Components, die gerendertes HTML und keine Kataloge ausliefern.
- Die Lingui-Runtime wiegt ~72 KB gzip. Der
@intlayer/lingui-Compat-Adapter reduziert die Runtime auf ~11 KB, aber in diesem Benchmark überträgt das Next.js-Compat-Setup immer noch ganze Kataloge an die Seite. Die nativenext-intlayer-API ist das Setup, das bei der Größe der Basis-App bleibt.
Vollständige Daten ansehen: Next.js-Benchmark-Bericht und das Benchmark-Repository.
Funktionsvergleich auf Next.js
Wie Lingui im Vergleich zu next-intl und Intlayer bei den Funktionen abschneidet, die ein Next.js App Router Projekt typischerweise benötigt:
Tabelle in einem Modal öffnen, um alle Daten übersichtlich anzuzeigen
| Funktion | next-intlayer (Intlayer) | Lingui | next-intl |
|---|---|---|---|
| Übersetzungen nah an Komponenten | ✅ Inhalte direkt bei jeder Komponente platziert | ⚠️ Quelltext in Komponenten, Kataloge zentralisiert | ❌ Zentralisiertes JSON |
| TypeScript-Integration | ✅ Automatisch generierte strikte Typen | ⚠️ Makros typisiert, Nachrichtenkataloge nicht | ✅ Gut, über AppConfig-Erweiterung |
| Erkennung fehlender Übersetzungen | ✅ TypeScript-Fehler und Warnungen zur Build-Zeit | ⚠️ Laufzeit-Fallback auf den Quelltext | ⚠️ Laufzeit-Fallback |
| Reichhaltige Inhalte (JSX, Markdown) | ✅ Direkte Unterstützung | ✅ JSX innerhalb von <Trans>, kein Markdown | ⚠️ Tags über t.rich, kein Markdown |
| KI-Übersetzung | ✅ Eigener Provider und API-Schlüssel, mit App-Kontext | ❌ Nein | ❌ Nein |
| Visueller Editor / CMS | ✅ Lokaler visueller Editor + optionales CMS | ❌ Über externe Plattformen | ❌ Über externe Plattformen |
| Lokalisiertes Routing | ✅ Integriert | ❌ Eigenes proxy.ts schreiben | ✅ Integriertes [locale]-Segment |
| Pluralisierung | ✅ Aufzählungsbasiert | ✅ ICU, <Plural>-Makro | ✅ ICU |
| Inhaltsformate | ✅ .ts, .tsx, .js, .json, .md, .yaml | ✅ PO, JSON, CSV | ✅ .json, .js, .ts |
| ICU MessageFormat | ✅ Über format: "icu" | ✅ Nativ | ✅ Nativ |
| SEO-Hilfen (hreflang, Sitemap) | ✅ Hilfen für Metadaten, Sitemap und robots.txt | ❌ Manuell | ✅ Gut |
| Server Components | ✅ Direkter Zugriff in jeder Server Component | ⚠️ setI18n in jedem Layout und jeder Seite | ⚠️ await getTranslations() pro Komponente |
| Tree-Shaking pro Komponente | ✅ Zur Build-Zeit (Babel / SWC) | ⚠️ Ein Katalog pro Locale, seitenbasierter Extractor ist experimentell | ⚠️ Manuell mit pick() pro Route |
| Runtime-Größe (gzip, Benchmark) | 4.9 KB | 72.1 KB | 14.7 KB |
| Fehlende Übersetzungen in CI | ✅ npx intlayer test | ✅ lingui compile --strict | ⚠️ Nicht integriert |
| Ökosystem / Community | ⚠️ Kleiner, wächst schnell | ✅ Ausgereift | ✅ Groß |
Die Runtime-Größen stammen aus dem Next.js-Benchmark. Für einen ausführlichen Vergleich lesen Sie Lingui vs Intlayer.
Weitere Next.js-Anleitungen: next-intl, next-i18next und Intlayer.
Praktiken, die Sie befolgen sollten
- Setzen Sie
langunddirauf<html>im[locale]-Layout. - Bevorzugen Sie Server Components für Texte: Sie rendern HTML auf dem Server und benötigen den Katalog nicht auf dem Client.
- Rufen Sie
initLingui(locale)in jedem Layout und jeder Seite auf. Layouts werden bei der Navigation nicht neu gerendert, daher kann sich eine Seite nicht darauf verlassen, dass ihr Layout das Locale gesetzt hat. - Verwenden Sie eine eindeutige URL pro Locale und rendern Sie jedes Locale mit
generateStaticParamsvor. - Übersetzen Sie Ihre Metadaten in
generateMetadata, inklusivecanonical,hreflangundx-default. - Generieren Sie eine mehrsprachige Sitemap und robots.txt mit den Konventionen
sitemap.tsundrobots.ts. - Verwenden Sie echte Links für den Sprachwechsler, damit Crawler jede Sprache entdecken können.
- Führen Sie
lingui extractin CI aus, damit keine neuen Nachrichten unübersetzt ausgeliefert werden.
Siehe unseren Leitfaden zu Internationalisierung und SEO, den hreflang-Leitfaden und den Next.js Multilingual SEO-Vergleich.
Schritt-für-Schritt-Anleitung zur Einrichtung von Lingui in einer Next.js-Anwendung
Hier ist die Projektstruktur, die wir erstellen werden:
Kopieren Sie den Code in die Zwischenablage
Abhängigkeiten installieren
bashCode kopierenKopieren Sie den Code in die Zwischenablage
- @lingui/core / @lingui/react: Runtime,
I18nProvider,setI18nfür Server Components und die Makros (@lingui/core/macro,@lingui/react/macro). - @lingui/swc-plugin: Kompiliert die Makros innerhalb der Next.js SWC-Pipeline.
- @lingui/loader: Kompiliert
.po-Kataloge beim Importieren, sodasslingui compilenicht erforderlich ist. - @lingui/cli:
lingui extractzum Sammeln von Nachrichten in Katalogen.
@lingui/swc-pluginist ein WebAssembly-Plugin, das an die SWC-Version von Next.js gebunden ist. Wenn der Build nach einem Next.js-Upgrade fehlschlägt, aktualisieren Sie das Plugin auf die in der README als kompatibel aufgeführte Version.- @lingui/core / @lingui/react: Runtime,
Zentralisieren Sie Ihre Locale-Konfiguration
Eine einzige Datei definiert Locales und URL-Hilfsfunktionen. Routing, Metadaten, Sitemap und Lingui lesen alle daraus.
src/i18n/config.tsCode kopierenKopieren Sie den Code in die Zwischenablage
Lingui und Next.js konfigurieren
lingui.config.tsCode kopierenKopieren Sie den Code in die Zwischenablage
Das SWC-Plugin kompiliert die Makros und der Loader kompiliert
.po-Dateien sowohl für Turbopack (Standard in Next.js 16) als auch für webpack:next.config.tsCode kopierenKopieren Sie den Code in die Zwischenablage
Fügen Sie die Extraktionsskripte hinzu:
package.jsonCode kopierenKopieren Sie den Code in die Zwischenablage
Kataloge laden und Server-Instanzen erstellen
Server Components haben keinen React-Kontext, daher stellt Lingui
setI18nbereit, um die Instanz für den aktuellen Rendervorgang zu registrieren. Dieses Modul lädt jeden Katalog einmal pro Serverprozess und erstellt eineI18n-Instanz pro Locale. Es istserver-only: Kataloge anderer Locales gelangen niemals in das Client-Bundle.src/i18n/appRouterI18n.tsCode kopierenKopieren Sie den Code in die Zwischenablage
src/i18n/initLingui.tsCode kopierenKopieren Sie den Code in die Zwischenablage
Damit TypeScript den
.po-Import akzeptiert, deklarieren Sie das Modul einmal:src/i18n/po.d.tsCode kopierenKopieren Sie den Code in die Zwischenablage
Client-Provider erstellen
Client Components lesen Übersetzungen aus einem React-Kontext. Der Provider erhält den Katalog des aktiven Locales vom Server-Layout und erstellt seine eigene Instanz einmalig.
src/components/LinguiClientProvider.tsxCode kopierenKopieren Sie den Code in die Zwischenablage
Dynamische Locale-Routen definieren
Das
[locale]-Segment enthält das Root-Layout.generateStaticParamsrendert jedes Locale zur Build-Zeit vor, unddynamicParams = falsegibt für jedes andere Präfix einen 404-Fehler zurück.src/app/[locale]/layout.tsxCode kopierenKopieren Sie den Code in die Zwischenablage
Der Client-Provider erhält den gesamten Katalog des aktiven Locales. Dies ist das, was der Benchmark als "Leak anderer Seiten" misst. Das Belassen von Texten in Server Components begrenzt das, was der Client tatsächlich benötigt. Für große Anwendungen teilt Linguis experimenteller seitenbasierter Extractor (
experimental.extractorinlingui.config.ts) Kataloge nach Einstiegspunkt auf.Übersetzungen in Server Components verwenden
Server Components verwenden dieselben Makros wie Client Components.
initLinguimuss auch auf der Seite ausgeführt werden, da ein Layout beim Navigieren zwischen seinen Seiten nicht neu gerendert wird.src/app/[locale]/about/page.tsxCode kopierenKopieren Sie den Code in die Zwischenablage
Übersetzungen in Client Components verwenden
Client Components verwenden dieselben Importe. Die Makros lesen die Instanz aus dem
LinguiClientProvider.src/components/Counter.tsxCode kopierenKopieren Sie den Code in die Zwischenablage
Nachrichten extrahieren und übersetzen
Führen Sie die Extraktion aus. Lingui schreibt jede in
srcgefundene Nachricht in den Katalog des jeweiligen Locales:bashCode kopierenKopieren Sie den Code in die Zwischenablage
Übersetzen Sie anschließend den
msgstrjedes Eintrags:src/locales/fr/messages.poCode kopierenKopieren Sie den Code in die Zwischenablage
src/locales/es/messages.poCode kopierenKopieren Sie den Code in die Zwischenablage
<0>-Platzhalter halten die JSX-Elemente eines<Trans>an ihrer Stelle, sodass Übersetzer sie verschieben können, ohne das Markup zu verändern.Proxy für Locale-Routing einrichten
OptionalNext.js 16 hat
middleware.tsinproxy.tsumbenannt. Der Proxy implementiert die Strategie des bedarfsweisen Präfixes ("as-needed"):/fr/aboutwird unverändert ausgeliefert;/en/aboutleitet auf/aboutweiter, sodass das Standard-Locale eine einzige URL besitzt;/aboutwird intern auf/en/aboutumgeschrieben, ohne die sichtbare URL zu verändern;- ein erster Besuch auf
/leitet zur bevorzugten Sprache weiter (zuerst Cookie, dannAccept-Language).
src/i18n/negotiateLocale.tsCode kopierenKopieren Sie den Code in die Zwischenablage
src/proxy.tsCode kopierenKopieren Sie den Code in die Zwischenablage
Sprache Ihrer Inhalte wechseln
OptionalusePathnamegibt die vom Browser gesehene URL zurück (/aboutoder/fr/about). Entfernen Sie das Locale-Präfix und erstellen Sie dann den Link für jede Sprache. Der Umschalter rendert echte Links, damit Crawler jede Sprachversion erreichen können, und das Cookie speichert die explizite Auswahl.src/components/LocaleSwitcher.tsxCode kopierenKopieren Sie den Code in die Zwischenablage
Lokalisierte Link-Komponente erstellen
Optionalsrc/components/LocalizedLink.tsxCode kopierenKopieren Sie den Code in die Zwischenablage
Dies funktioniert auch in Server Components, da es innerhalb von
LinguiClientProvidergerendert wird:tsxCode kopierenKopieren Sie den Code in die Zwischenablage
Metadaten internationalisieren
OptionalJede Sprachversion kann eigenständig ranken, vorausgesetzt jede Seite stellt folgendes bereit:
- einen übersetzten
titleund eine übersetztedescription; - eine kanonische URL (Canonical), die auf sich selbst verweist;
- einen
hreflang-Alternate pro Locale sowiex-default; - Open Graph
locale,alternateLocaleundurl; - JSON-LD mit
inLanguage.
generateMetadataläuft außerhalb des React-Baums und verwendet daher die Server-Instanz direkt mit demmsg-Makro:src/i18n/metadata.tsCode kopierenKopieren Sie den Code in die Zwischenablage
src/app/[locale]/about/page.tsxCode kopierenKopieren Sie den Code in die Zwischenablage
JSON-LD wird von der Seite selbst gerendert. Seitendateien dürfen nur Next.js-Felder exportieren, daher sollte die Komponente in einer eigenen Datei verbleiben:
src/components/WebPageJsonLd.tsxCode kopierenKopieren Sie den Code in die Zwischenablage
src/app/[locale]/about/page.tsxCode kopierenKopieren Sie den Code in die Zwischenablage
- einen übersetzten
Sitemap internationalisieren
OptionalDie
sitemap.ts-Konvention unterstütztalternates.languages, was Next.js alsxhtml:link-Alternates rendert. Listen Sie jede URL jedes Locales auf:src/app/sitemap.tsCode kopierenKopieren Sie den Code in die Zwischenablage
robots.txt internationalisieren
OptionalPrivate Routen existieren in jeder Sprache, daher muss
disallowjeden lokalisierten Pfad abdecken:src/app/robots.tsCode kopierenKopieren Sie den Code in die Zwischenablage
Lokalisierte 404-Seiten handhaben
Optionalnot-found.tsxwird innerhalb des[locale]-Layouts gerendert und hat somit Zugriff auf den Client-Provider. Die Catch-All-Route leitet unbekannte Pfade innerhalb eines Locales dorthin weiter. Next.js fügt 404-Antworten automatischnoindexhinzu.src/app/[locale]/not-found.tsxCode kopierenKopieren Sie den Code in die Zwischenablage
src/app/[locale]/[...rest]/page.tsxCode kopierenKopieren Sie den Code in die Zwischenablage
Auf das Locale in Server Actions zugreifen
OptionalServer Actions empfangen keine Routenparameter. Der zuverlässigste Ansatz besteht darin, das Locale zusammen mit dem Formular von der Seite zu senden, die es kennt:
src/app/[locale]/contact/page.tsxCode kopierenKopieren Sie den Code in die Zwischenablage
src/app/actions/sendContactMessage.tsCode kopierenKopieren Sie den Code in die Zwischenablage
Makros behalten, Runtime mit Intlayer reduzieren
OptionalDer
@intlayer/linguiCompat-Adapter lässt Ihren Quellcode unberührt: Makros kompilieren wie gewohnt, und die resultierenden Aufrufe voni18n._(),useLingui()und<Trans>werden über Intlayer-Wörterbücher bedient. Im Next.js-Benchmark sinkt die Runtime von ~72.1 KB auf ~10.7 KB gzip.Unter Next.js wird der Adapter eingebunden, indem
@lingui/coreund@lingui/reactinnext.config.ts(sowohl für webpack als auch für Turbopack) auf@intlayer/linguialiasiert werden und die Konfiguration mitwithIntlayerausnext-intlayer/serverumschlossen wird. Behalten Sie@lingui/swc-plugin, damit die Makros weiterhin zuerst kompiliert werden. Die vollständige Konfiguration finden Sie im Lingui Compat Leitfaden.Wie die Benchmark-Tabelle zeigt, reduziert der Adapter die Runtime, aber unter Next.js noch nicht den an jede Seite ausgelieferten Katalog. Er eignet sich am besten als Migrationsbrücke: Sobald er läuft, können Sie Komponenten schrittweise auf die native
useIntlayer-API umstellen, die nur die Inhalte ausliefert, die jede Komponente tatsächlich rendert. Siehe die Next.js + Intlayer Anleitung, Lingui vs @intlayer/lingui und alle Compat-Adapter.Übersetzungen mit Intlayer automatisieren
OptionalLingui extrahiert Nachrichten, aber das manuelle Ausfüllen von Dutzenden von Katalogen nimmt die meiste Zeit in Anspruch. Intlayer ist kostenlos und Open Source, und seine Tools arbeiten Hand in Hand mit Lingui:
- Übersetzen mit KI unter Verwendung Ihres eigenen API-Schlüssels und Anbieters. Siehe Auto-Fill und das CLI.
- Behalten Sie Ihre PO-Dateien als zentrale Quelle mit dem Sync PO Plugin.
- Testen Sie fehlende Übersetzungen in CI. Siehe Übersetzungen testen.
- Auditieren Sie Ihre bereitgestellte Website auf fehlende
hreflang-Tags, falsche Canonicals und Locale-Leaks mit dem Scan-Befehl.
Häufig gestellte Fragen
Ja. @lingui/react unterstützt React Server Components. Server Components registrieren die Instanz mit setI18n aus @lingui/react/server, Client Components lesen sie aus I18nProvider, und beide verwenden dieselben Trans- und useLingui-Makros.
Server Components haben keinen Kontext, daher wird die Instanz pro Rendervorgang registriert. Layouts bleiben über Navigationen hinweg erhalten und werden nicht neu gerendert, sodass sich eine Seite nicht darauf verlassen kann, dass ihr Layout das Locale gesetzt hat. Der Aufruf von initLingui(locale) am Anfang jedes Layouts und jeder Seite hält sie unabhängig.
Verwenden Sie @lingui/swc-plugin. Es erhält die SWC-Pipeline und Turbopack. Das Hinzufügen einer Babel-Konfiguration deaktiviert SWC in Next.js und verlangsamt Builds. Die einzige Voraussetzung ist, dass die Plugin-Version mit der SWC-Version Ihres Next.js-Releases kompatibel bleibt.
Holen Sie sich die Server-Instanz mit getI18nInstance(locale) und übersetzen Sie Deskriptoren, die mit dem msg-Makro deklariert wurden: i18n._(msg`About us`). Geben Sie alternates.canonical, alternates.languages mit x-default und openGraph.locale zurück. Schritt 13 stellt eine wiederverwendbare Hilfsfunktion bereit.
Der Benchmark misst ~72 KB gzip für die Runtime. Mit einem Katalog pro Locale wiegen Seiten ~145 KB im Vergleich zu 141 KB ohne i18n, aber jede Seite erhält über den Client-Provider weiterhin die Nachrichten anderer Seiten.
Lingui eignet sich für Teams, die Quelltexte gerne direkt in Komponenten schreiben und mit PO-Dateien sowie Übersetzern arbeiten. next-intl eignet sich für Teams, die JSON-Kataloge und eine eng in Next.js integrierte t("key")-API bevorzugen. next-i18next bringt das Plugin-Ökosystem von i18next mit. Siehe next-i18next vs next-intl vs Intlayer und den Next.js-Benchmark.
Kommentare
Noch keine Kommentare. Seien Sie der Erste, der seine Gedanken teilt.
