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 TanStack Start-Anwendung 2026 mit Lingui 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 jede Nachricht in Katalogen (standardmäßig PO-Dateien), Übersetzer befüllen diese und das Vite-Plugin kompiliert sie zu kompaktem JavaScript. Nachrichten nutzen das ICU MessageFormat, sodass Pluralformen und Selects unterstützt werden.
TanStack Start enthält von Haus aus keine i18n-Schicht, daher bindet diese Anleitung Lingui von Grund auf ein:
- Durch Babel kompilierte Makros über
@rolldown/plugin-babel(erforderlich bei@vitejs/plugin-reactv6 und Vite 8). - Locale-Routing mit einem optionalen
{-$locale}-Segment (/about,/fr/about). - Ein Katalog pro Locale, geladen bei Bedarf, und eine
I18n-Instanz pro Rendervorgang, damit gleichzeitige SSR-Anfragen niemals ein Locale teilen. - Vollständiges mehrsprachiges SEO: übersetzter
<title>und Beschreibung, kanonische URL,hreflangmitx-default, Open-Graph-Locales, JSON-LD, Sitemap,robots.txt, Pre-Rendering und lokalisierte 404-Seiten.
Suchen Sie nach einem anderen Stack? Lesen Sie den TanStack Start + use-intl Leitfaden, den TanStack Start + Paraglide Leitfaden oder den TanStack Start + Intlayer Leitfaden.
Nutzen Sie Next.js? Lesen Sie den Next.js + Lingui Leitfaden. Vergleichen Sie Bibliotheken? Lesen Sie Lingui vs. Intlayer.
Was der Benchmark über Lingui auf TanStack Start aussagt
Der i18n-Benchmark führt dieselbe TanStack Start-App mit 10 Seiten und 10 Sprachen mit jeder wichtigen 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, 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) | - | 111.0 KB | 0% | 0% |
| Lingui (Setup dieser Anleitung) | 56.7 KB | 115.2 KB | 9.3% | 0% |
@intlayer/lingui (Kompatibilität) | 9.8 KB | 136.7 KB | 9.9% | 0% |
react-intlayer (natives Intlayer) | 4.5 KB | 126.8 KB | 0% | 0% |
Die wichtigsten Erkenntnisse:
- Laden Sie einen Katalog pro Locale bei Bedarf. Dadurch bleibt die Seitengröße nahe an der Basis-App.
- Die Laufzeit bleibt schwer (~57 KB gzip). Der
@intlayer/lingui-Kompatibilitätsadapter (Schritt 16) behält Ihre Makros bei und reduziert sie auf ~10 KB.
Vollständige Daten finden Sie im TanStack Start Benchmark-Bericht und im Benchmark-Repository.
Funktionsvergleich auf TanStack Start
Wie Lingui im Vergleich zu anderen gängigen Bibliotheken auf TanStack Start abschneidet:
Tabelle in einem Modal öffnen, um alle Daten übersichtlich anzuzeigen
| Funktion | react-intlayer (Intlayer) | use-intl | Paraglide JS | Lingui |
|---|---|---|---|---|
| Übersetzungen nahe an Komponenten | ✅ Ko-lokalisiert | ❌ Zentrales JSON | ❌ Eine JSON-Datei pro Locale | ⚠️ Quelltext in Komponenten |
| TypeScript-Integration | ✅ Automatisch generierte Typen | ✅ Über AppConfig | ✅ Typisierte Nachrichtenfunktionen | ⚠️ Nur Makros |
| Erkennung fehlender Übersetzungen | ✅ Typfehler und Build-Warnungen | ⚠️ Laufzeit-Fallback | ⚠️ Fällt auf Basis-Locale zurück | ⚠️ Fällt auf Quelltext zurück |
| Rich Content (JSX, Markdown) | ✅ Direkte Unterstützung | ⚠️ Tags über t.rich | ⚠️ Zeichenketten | ✅ JSX innerhalb von <Trans> |
| Lokalisiertes Routing | ✅ Integriert | ❌ Manuelles {-$locale} | ✅ urlPatterns + Router-Rewrite | ❌ Manuelles {-$locale} |
| Sprachwechsel ohne Neuladen | ✅ Ja | ✅ Ja | ❌ Vollständiger Seiten-Reload | ✅ Ja |
| Pluralisierung | ✅ Aufzählungsbasiert | ✅ ICU | ✅ Varianten | ✅ ICU |
| ICU MessageFormat | ✅ Über format: "icu" | ✅ Nativ | ⚠️ Über ein inlang-Plugin | ✅ Nativ |
| Inhaltsformate | ✅ .ts, .json, .md, .yaml... | ⚠️ .json | ⚠️ inlang JSON | ✅ PO, JSON, CSV |
| KI-Übersetzung | ✅ Eigener Anbieter und Schlüssel | ❌ Nein | ❌ Nein | ❌ Nein |
| Visueller Editor / CMS | ✅ Lokaler Editor + optionales CMS | ❌ Externe Plattformen | ⚠️ inlang-Ökosystem-Apps | ❌ Externe Plattformen |
| SEO-Helfer (hreflang, Sitemap) | ✅ Integriert | ❌ Manuell | ⚠️ Lokalisierte URLs, Rest manuell | ❌ Manuell |
| Laufzeitgröße (gzip, Benchmark) | 4.5 KB | 75.9 KB | 1.8 KB | 56.7 KB |
| Leak, bestes Setup (Locale / Seite) | 0% / 0% | 0% / 0% | 49.7% / 0% | 8.6% / 0% |
| Fehlende Übersetzungen in CI | ✅ npx intlayer test | ⚠️ Nicht integriert | ⚠️ Nicht integriert | ✅ lingui compile --strict |
Laufzeitgröße und Leak-Werte stammen aus dem TanStack Start Benchmark. Der Leak wird anhand des besten Setups der jeweiligen Bibliothek gemessen.
Weitere TanStack Start-Leitfäden: use-intl, Paraglide JS und Intlayer.
Best Practices, die Sie befolgen sollten
- Setzen Sie
langunddirauf<html>basierend auf dem Routen-Locale, damit sie im Server-HTML korrekt sind. - Behalten Sie eine URL pro Locale bei mit einem Präfix, damit jede Sprachversion indexierbar ist.
- Erstellen Sie eine
I18n-Instanz pro Locale, mutieren Sie während SSR niemals eine globale Instanz: Zwei gleichzeitige Anfragen würden sonst gegenseitig das Locale überschreiben. - Laden Sie nur den aktiven Katalog, importieren Sie niemals alle Kataloge im Client-Code.
- Wählen Sie einen Makro-Stil (
useLingui+tin Komponenten,msgfür Lazy Descriptors) und bleiben Sie dabei. Das Mischen vont,i18n._,i18n.tund<Trans>erschwert die Lesbarkeit für Menschen und KI-Assistenten. - Führen Sie
lingui extractin CI aus, damit eine neue Nachricht niemals unübersetzt ausgeliefert wird. - Übersetzen Sie Ihre Metadaten und deklarieren Sie
canonical,hreflangundx-defaultauf jeder Seite. - Generieren Sie eine mehrsprachige Sitemap und robots.txt und führen Sie Pre-Rendering für jedes Locale durch.
- Verwenden Sie echte Links für den Sprachwechsler, damit Webcrawler alle Sprachen finden können.
Siehe auch unseren Leitfaden zu Internationalisierung und SEO und den hreflang-Leitfaden.
Schritt-für-Schritt-Anleitung zur Einrichtung von Lingui in einer TanStack Start-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: Laufzeit,
I18nProviderund die Makros (@lingui/core/macro,@lingui/react/macro). - @lingui/cli:
lingui extract, um Nachrichten in Katalogen zu sammeln. - @lingui/vite-plugin: kompiliert
.po-Kataloge beim Import, sodasslingui compilenicht erforderlich ist. - @lingui/babel-plugin-lingui-macro + @rolldown/plugin-babel: transformieren die Makros zur Build-Zeit.
- @lingui/core / @lingui/react: Laufzeit,
Zentralisieren Sie Ihre Locale-Konfiguration
Das Standard-Locale bleibt ohne Präfix (
/about), andere Locales erhalten ein Präfix (/fr/about).src/i18n/config.tsCode kopierenKopieren Sie den Code in die Zwischenablage
Lingui konfigurieren
Die Lingui-Konfiguration verwendet dieselbe Locale-Liste wieder, sodass die Kataloge, der Router und die Sitemap stets synchron bleiben.
lingui.config.tsCode kopierenKopieren Sie den Code in die Zwischenablage
Fügen Sie die Extraktions-Skripte hinzu:
package.jsonCode kopierenKopieren Sie den Code in die Zwischenablage
i18n:checkschlägt in der CI fehl, wenn eine Komponente eine Nachricht enthält, die nicht extrahiert und committet wurde.Vite konfigurieren
Mit
@vitejs/plugin-reactv6 ist Babel nicht mehr integriert.@rolldown/plugin-babelführt das Lingui-Makro-Plugin aus, undlinguiTransformerBabelPresetverarbeitet nur Dateien, die ein Makro importieren, was Builds schnell hält.vite.config.tsCode kopierenKopieren Sie den Code in die Zwischenablage
Kataloge pro Locale laden
Das Template-Literal in
import()sorgt dafür, dass Vite einen Chunk pro Katalog erzeugt, und das Lingui-Plugin kompiliert die.po-Datei hinein. Ein französischsprachiger Besucher lädt ausschließlich den französischen Katalog herunter.Die kompilierten Nachrichten sind reine Daten, sodass sie von einem Routen-Loader zurückgegeben, in das HTML serialisiert und bei der Hydratisierung wiederverwendet werden können.
src/i18n/lingui.tsCode kopierenKopieren Sie den Code in die Zwischenablage
Damit TypeScript den
.po-Import akzeptiert, deklarieren Sie das Modul einmalig:src/i18n/po.d.tsCode kopierenKopieren Sie den Code in die Zwischenablage
Das Root-Dokument erstellen
Die Root-Route liest den optionalen Locale-Parameter, um
langunddirauf dem serverseitig gerenderten<html>festzulegen.src/routes/__root.tsxCode kopierenKopieren Sie den Code in die Zwischenablage
Die Locale-Layout-Route erstellen
Der Ordner
{-$locale}erstellt ein optionales Pfadsegment:/aboutund/fr/aboutpassen beide zu/{-$locale}/about. Das Layout weist unbekannte Präfixe ab, lädt den Katalog des aktuellen Locales und stellt eine dedizierteI18n-Instanz bereit.src/routes/{-$locale}/route.tsxCode kopierenKopieren Sie den Code in die Zwischenablage
Übersetzungen in Ihren Seiten nutzen
Schreiben Sie den Quelltext direkt in die Komponente. Die Makros wandeln ihn zur Build-Zeit in Nachrichten-IDs um und
lingui extracterfasst ihn.<Trans>für JSX-Inhalte, einschließlich verschachtelter Elemente;useLingui().tfür Zeichenketten (Attribute, Props);<Plural>für ICU-Pluralformen.
src/routes/{-$locale}/about.tsxCode kopierenKopieren Sie den Code in die Zwischenablage
Der dynamische
import()eines Katalogs wird vom Modulsystem zwischengespeichert, sodass der Aufruf vonloadI18nin mehreren Loadern den Katalog nicht mehrfach herunterlädt.Nachrichten extrahieren und übersetzen
Führen Sie die Extraktion aus. Lingui schreibt jede Nachricht in den jeweiligen Sprachkatalog:
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
Standardmäßig sind Nachrichten-IDs Hashes des Quelltexts: Durch das Ändern des englischen Textes entsteht eine neue Nachricht. Verwenden Sie explizite IDs (
<Trans id="about.title">About us</Trans>) für Texte, die sich häufig ändern.Eine lokalisierte Link-Komponente erstellen
OptionalJede Route befindet sich unter
{-$locale}, daher müssen Links den aktuellen Locale-Parameter beibehalten.src/components/LocalizedLink.tsxCode kopierenKopieren Sie den Code in die Zwischenablage
Sprache des Inhalts wechseln
OptionalRendern Sie den Sprachwechsler als Links, damit Suchmaschinen-Crawler jede Sprachversion finden können.
to="."behält die aktuelle Seite bei und ersetzt den Locale-Parameter. Der Loader des Locale-Layouts ruft daraufhin den neuen Katalog ab.src/components/LocaleSwitcher.tsxCode kopierenKopieren Sie den Code in die Zwischenablage
Metadaten internationalisieren
OptionalJede Sprachversion kann separat ranken, vorausgesetzt, jede Seite stellt einen übersetzten
<title>und eine übersetzte Beschreibung, eine selbstreferenzierende Canonical-URL, einhreflangpro Locale plusx-default, Open-Graph-Locales und JSON-LD mitinLanguagebereit. Die Metadaten werden im Loader übersetzt (Schritt 8), und dieser Helfer baut den Rest auf:src/i18n/seo.tsCode kopierenKopieren Sie den Code in die Zwischenablage
Sitemap und robots.txt internationalisieren
OptionalDie Sitemap listet jede URL jedes Locales auf, wobei jeder Eintrag alle seine Alternativen mit
xhtml:linkdeklariert. Die Dateirobots.txtblockiert private Routen in jeder Sprache und verweist auf die Sitemap. Entfernen Siepublic/robots.txt, falls das Starter-Template eine solche Datei erstellt hat.src/routes/sitemap[.]xml.tsCode kopierenKopieren Sie den Code in die Zwischenablage
src/routes/robots[.]txt.tsCode kopierenKopieren Sie den Code in die Zwischenablage
Pre-Rendering für jedes Locale durchführen
OptionalListen Sie alle lokalisierten Pfade auf, damit TanStack Start beim Build alle Sprachversionen vorrendert:
vite.config.tsCode kopierenKopieren Sie den Code in die Zwischenablage
Erstbesucher weiterleiten und 404-Seiten handhaben
OptionalEine Request-Middleware leitet Besucher, die auf
/landen, zu ihrer bevorzugten Sprache weiter (zuerst Cookie, dannAccept-Language). Deep-Links werden niemals umgeleitet, sodass Crawler und geteilte URLs stets genau die angeforderte Seite erhalten.src/i18n/negotiateLocale.tsCode kopierenKopieren Sie den Code in die Zwischenablage
src/start.tsCode kopierenKopieren Sie den Code in die Zwischenablage
Für 404-Seiten rendert eine Catch-All-Route die lokalisierte
notFoundComponentdes Layouts. Markieren Sie sie mitnoindex: React 19 verschiebt das<meta>automatisch in den<head>.src/components/NotFound.tsxCode kopierenKopieren Sie den Code in die Zwischenablage
src/routes/{-$locale}/$.tsxCode kopierenKopieren Sie den Code in die Zwischenablage
Makros beibehalten, Laufzeit mit Intlayer reduzieren
OptionalDer Kompatibilitätsadapter
@intlayer/linguilässt Ihren Quellcode unverändert: Die Makros werden exakt wie zuvor kompiliert, und die resultierenden Aufrufe voni18n._(),useLingui()und<Trans>werden von kompilierten Intlayer-Wörterbüchern bedient. Im Benchmark sinkt die Laufzeitgröße von ~56.7 KB auf ~9.8 KB gzip.bashCode kopierenKopieren Sie den Code in die Zwischenablage
Fügen Sie das Plugin nach der Makro-Transformation ein, sodass es
@lingui/coreund@lingui/reactauf den Adapter umleitet:vite.config.tsCode kopierenKopieren Sie den Code in die Zwischenablage
Kataloge werden mit dem JSON-Sync-Plugin (JSON-Kataloge) oder dem PO-Sync-Plugin (PO-Kataloge) synchronisiert. Die vollständige Einrichtung finden Sie im Lingui-Kompatibilitätsleitfaden und einen direkten Vergleich in Lingui vs. @intlayer/lingui.
Übersetzungen mit Intlayer automatisieren
OptionalLingui extrahiert Nachrichten, aber das manuelle Ausfüllen von Dutzenden Katalogen nimmt die meiste Zeit in Anspruch. Intlayer ist kostenlos und Open Source, und seine Tools arbeiten nahtlos mit Lingui zusammen:
- Mit KI übersetzen unter Verwendung Ihres eigenen API-Schlüssels und Anbieters. Siehe Auto-Fill und das CLI.
- PO-Dateien beibehalten als Source of Truth mit dem PO-Sync-Plugin.
- Fehlende Übersetzungen in CI testen. Siehe Übersetzungen testen.
- Bereitgestellte Website auditieren auf fehlende
hreflang-Tags, falsche Canonicals und Sprachlecks mit dem Scan-Befehl.
Häufig gestellte Fragen
Ja. Lingui hat keine dedizierte TanStack Start-Integration, aber sein Vite-Plugin und das Babel-Makro-Plugin funktionieren unverändert. Die beiden entscheidenden Punkte sind die Ausführung der Makros über @rolldown/plugin-babel (Vite 8 und @vitejs/plugin-react v6 enthalten Babel nicht mehr) und die Erstellung einer I18n-Instanz pro Locale anstelle der Aktivierung einer globalen Instanz während SSR.
Auf dem Server verarbeitet ein einzelner Prozess viele Anfragen gleichzeitig. Der Aufruf von i18n.activate("fr") auf einem geteilten Objekt würde die Sprache einer parallel auf Englisch gerenderten Anfrage ändern. setupI18n erstellt eine isolierte Instanz pro Locale, was sicher ist.
Nein. @lingui/vite-plugin kompiliert .po-Kataloge direkt beim Importieren. Sie führen lediglich lingui extract aus, um neue Nachrichten zu sammeln.
Deklarieren Sie sie mit dem msg-Makro und übersetzen Sie sie im Routen-Loader mit i18n._(msg`...`). Der Loader gibt einfache Zeichenketten zurück, sodass head() synchron bleibt und die Werte für die Hydratisierung serialisiert werden. Schritt 8 und Schritt 12 zeigen die vollständige Einrichtung.
Der Benchmark misst ~56.7 KB gzip für die Laufzeit. Wenn ein Katalog pro Locale bei Bedarf geladen wird, wiegen Seiten ~115 KB gegenüber 111 KB ohne i18n. Das statische Importieren aller Kataloge erhöht das Gewicht auf ~152 KB.
Ja. Der Adapter @intlayer/lingui behält die Makros bei und tauscht die Laufzeit aus. Anschließend können Sie Komponenten schrittweise auf useIntlayer umstellen. Siehe auch die Kompatibilitätsadapter.
Kommentare
Noch keine Kommentare. Seien Sie der Erste, der seine Gedanken teilt.
