Stellen Sie Ihre Frage und erhalten Sie einen Resümee des Dokuments, indem Sie diese Seite und den AI-Anbieter Ihrer Wahl referenzieren
Versionshistorie
- "Initialversion"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 Paraglide JS internationalisieren
Inhaltsverzeichnis
Was ist Paraglide JS?
Paraglide JS (von inlang) ist eine compilerbasierte i18n-Bibliothek. Anstatt eine Runtime auszuliefern, die Schlüssel in einem JSON-Objekt nachschlägt, kompiliert sie jede Nachricht in eine typisierte JavaScript-Funktion (m.about_title()). Ungenutzte Nachrichten können vom Bundler entfernt werden, und ein Tippfehler in einem Schlüssel führt zu einem Compile-Fehler.
Paraglide ist der i18n-Ansatz, der in den offiziellen TanStack Router-Beispielen verwendet wird, und lässt sich über drei Komponenten in TanStack Start integrieren:
- ein Vite-Plugin, das Nachrichten und die Runtime nach
src/paraglidekompiliert; - eine Server-Middleware, die das Gebietsschema (Locale) jeder Anfrage auflöst;
- ein Router-Rewrite, der lokalisierte URLs (
/fr/about) auf Ihren Routenbaum (/about) abbildet, sodass Sie kein$locale-Segment benötigen.
Dieser Leitfaden richtet alle drei Komponenten ein und deckt anschließend alles ab, was Paraglide Ihnen überlässt: lang und dir, Sprachwechsler, übersetzte Metadaten, canonical, hreflang mit x-default, Open Graph, JSON-LD, Sitemap, robots.txt, Pre-Rendering und lokalisierte 404-Seiten.
Suchen Sie nach einem anderen Stack? Schauen Sie sich den TanStack Start + use-intl-Leitfaden, den TanStack Start + Lingui-Leitfaden oder den TanStack Start + Intlayer-Leitfaden an.
Sie möchten die beiden compilerbasierten Ansätze vergleichen? Lesen Sie Ist Intlayer schlanker als Paraglide?.
Was der Benchmark über Paraglide auf TanStack Start aussagt
Der i18n-Benchmark führt dieselbe TanStack Start-App mit 10 Seiten und 10 Sprachen mit jeder großen 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 @inlang/paraglide-js@2.15.1, gemessen am 26.09.2026 (gzip):
Tabelle in einem Modal öffnen, um alle Daten übersichtlich anzuzeigen
| Setup | Bibliotheksgröße | JS pro Seite | Fremdsprachen-Leak | Fremdseiten-Leak | Seitenladezeit |
|---|---|---|---|---|---|
| Kein i18n (Basis-App) | - | 111.0 KB | 0% | 0% | 15.7 ms |
| Paraglide JS | 1.8 KB | 125.1 KB | 49.7% | 0% | 22.1 ms |
react-intlayer | 4.5 KB | 126.8 KB | 0% | 0% | 14.8 ms |
use-intl | 75.9 KB | 128.7 KB | 0% | 0% | 17.4 ms |
| Lingui | 56.7 KB | 120.2 KB | 8.6% | 0% | 21.9 ms |
Die wichtigsten Erkenntnisse:
- Die Runtime ist winzig und Seiten leaken nicht. Die Runtime wird für Ihre Konfiguration generiert und Nachrichten werden dort importiert, wo sie verwendet werden.
- Sprachen leaken. Jede Nachrichtenfunktion enthält alle Sprachen, sodass etwa die Hälfte der an eine Seite ausgelieferten übersetzten Strings in Sprachen vorliegt, die der Besucher nicht verwendet. Je mehr Sprachen Sie hinzufügen, desto größer wird dieser Anteil.
- Die Seitenladezeit ist die langsamste der Gruppe, unter anderem weil das Gebietsschema bei jedem Aufruf über Strategien aufgelöst wird, anstatt aus einem React-Kontext gelesen zu werden.
Alle Daten im Detail: TanStack Start Benchmark-Bericht und das Benchmark-Repository.
Funktionsvergleich auf TanStack Start
Wie sich Paraglide JS im Vergleich zu anderen häufig auf TanStack Start verwendeten Bibliotheken schlägt:
Tabelle in einem Modal öffnen, um alle Daten übersichtlich anzuzeigen
| Funktion | react-intlayer (Intlayer) | use-intl | Paraglide JS | Lingui |
|---|---|---|---|---|
| Übersetzungen nah an Komponenten | ✅ Co-located | ❌ Zentralisiertes JSON | ❌ Eine JSON-Datei pro Sprache | ⚠️ Quelltext in Komponenten |
| TypeScript-Integration | ✅ Automatisch generierte Typen | ✅ Über AppConfig | ✅ Typisierte Nachrichtenfunktionen | ⚠️ Nur Makros |
| Erkennung fehlender Übersetzungen | ✅ Typfehler und Build-Warnungen | ⚠️ Runtime-Fallback | ⚠️ Fällt auf Basissprache zurück | ⚠️ Fällt auf Quelltext zurück |
| Rich Content (JSX, Markdown) | ✅ Direkte Unterstützung | ⚠️ Tags über t.rich | ⚠️ Zeichenketten (Strings) | ✅ JSX innerhalb von <Trans> |
| Lokalisiertes Routing | ✅ Integriert | ❌ Manuell {-$locale} | ✅ urlPatterns + Router-Rewrite | ❌ Manuell {-$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 | ⚠️ Apps des inlang-Ökosystems | ❌ Externe Plattformen |
| SEO-Hilfen (hreflang, Sitemap) | ✅ Integriert | ❌ Manuell | ⚠️ Lokalisierte URLs, Rest manuell | ❌ Manuell |
| Runtime-Größe (gzip, Benchmark) | 4.5 KB | 75.9 KB | 1.8 KB | 56.7 KB |
| Leak, bestes Setup (Sprache / 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 |
Die Zahlen zu Runtime-Größe und Leak stammen aus dem TanStack Start Benchmark. Der Leak wird anhand des besten Setups der jeweiligen Bibliothek gemessen.
Weitere TanStack Start-Leitfäden: Lingui, use-intl und Intlayer.
Praktiken, die Sie befolgen sollten
- Setzen Sie
langunddirim<html>-Tag serverseitig basierend auf dem aufgelösten Gebietsschema. - Behalten Sie eine URL pro Sprache bei mit einer Präfix-Strategie (
/fr/about), damit jede Sprachversion indexierbar ist. - Setzen Sie
urlan die erste Stelle Ihrer Locale-Strategie, damit die URL die Source of Truth ist und Crawler genau die angeforderte Seite erhalten. - Verwenden Sie flache, beschreibende Nachrichtenschlüssel (
about_title), die sich sauber auf Funktionsnamen abbilden lassen. - Commiten Sie Ihre
messages/*.json, nicht den generierten Ordnersrc/paraglide, um Merge-Konflikte bei generierten Dateien zu vermeiden. - Übersetzen Sie Ihre Metadaten und deklarieren Sie
canonical,hreflangundx-defaultauf jeder Seite. - Generieren Sie eine mehrsprachige Sitemap und robots.txt und rendern Sie jedes Gebietsschema vorab (Pre-Rendering).
- Verwenden Sie echte Links für den Sprachwechsler, damit Crawler jede Sprache entdecken können.
Siehe auch unseren Leitfaden zu Internationalisierung und SEO und den hreflang-Leitfaden.
Schritt-für-Schritt-Anleitung zur Einrichtung von Paraglide JS in einer TanStack Start-Anwendung
Hier ist die Projektstruktur, die wir erstellen werden:
Kopieren Sie den Code in die Zwischenablage
Beachten Sie, dass es keinen $locale-Ordner gibt: Das Router-Rewrite entfernt das Präfix vor dem Routen-Matching.
Abhängigkeiten installieren
Beginnen Sie mit einem TanStack Start-Projekt und initialisieren Sie anschließend Paraglide. Der Init-Befehl erstellt
project.inlang/settings.json, eine erstemessages/en.jsonund installiert das Paket.bashCode kopierenKopieren Sie den Code in die Zwischenablage
- @inlang/paraglide-js: Der Compiler und sein Vite-Plugin. Es muss kein Runtime-Paket installiert werden: Die Runtime wird direkt in Ihr Projekt generiert.
Sprachen konfigurieren
project.inlang/settings.jsonist die zentrale Source of Truth für Sprachen. Das Message-Format-Plugin liest eine JSON-Datei pro Sprache.project.inlang/settings.jsonCode kopierenKopieren Sie den Code in die Zwischenablage
Vite-Plugin und URL-Strategie konfigurieren
Das Plugin kompiliert Nachrichten bei jeder Änderung. Drei Optionen sind für TanStack Start wichtig:
strategy: Die geordnete Liste der Quellen, aus denen das Gebietsschema ausgelesen wird.urlan erster Stelle macht die URL zur Source of Truth.cookieundpreferredLanguagewerden von der Middleware verwendet, wenn die URL keine Entscheidung liefert.urlPatterns: Wie ein Gebietsschema auf eine URL abgebildet wird. Nicht-Standard-Sprachen werden zuerst aufgeführt, da das erste passende Muster greift. Hier bleibt die Standardsprache ohne Präfix (/about), während andere Sprachen ein Präfix erhalten (/fr/about).outputStructure: "message-modules": Ein Modul pro Nachricht, wodurch der Bundler Nachrichten entfernen kann, die eine Seite nicht importiert.
vite.config.tsCode kopierenKopieren Sie den Code in die Zwischenablage
Fügen Sie den generierten Ordner zu
.gitignorehinzu. Er wird beidevundbuildautomatisch neu erstellt:.gitignoreCode kopierenKopieren Sie den Code in die Zwischenablage
Übersetzungsdateien erstellen
Jeder Schlüssel wird zu einer Funktion, die aus
src/paraglide/messagesexportiert wird. Flache, in snake_case gehaltene Schlüssel ergeben die saubersten Funktionsnamen. Variablen verwenden{name}-Platzhalter.messages/en.jsonCode kopierenKopieren Sie den Code in die Zwischenablage
messages/fr.jsonCode kopierenKopieren Sie den Code in die Zwischenablage
Plurale verwenden die Varianten-Syntax des inlang-Nachrichtenformats:
messages/en.jsonCode kopierenKopieren Sie den Code in die Zwischenablage
Server-Middleware hinzufügen
Die Middleware löst das Gebietsschema jeder Anfrage anhand Ihrer Strategie auf und stellt es
getLocale()für das gesamte Server-Rendering über einenAsyncLocalStorage-Scope zur Verfügung. Dadurch sind gleichzeitige Anfragen in unterschiedlichen Sprachen threadsicher.In TanStack Start umschließen Sie den Standard-Servereintrag:
src/server.tsCode kopierenKopieren Sie den Code in die Zwischenablage
Lokalisierte URLs im Router umschreiben
Die
rewrite-Option von TanStack Router übersetzt URLs an den Schnittstellen des Routers:- Eingabe (Input):
/fr/aboutwird vor dem Routing-Matching zu/aboutdelokalisiert, sodass eine einzigeabout.tsx-Route alle Sprachen bedient; - Ausgabe (Output): Jedes generierte
href(Links, Weiterleitungen, Navigation) wird für das aktive Gebietsschema lokalisiert, sodass<Link to="/about">auf einer französischen Seite/fr/aboutausgibt.
src/router.tsxCode kopierenKopieren Sie den Code in die Zwischenablage
Da Links durch das Rewrite automatisch lokalisiert werden, benötigen Sie keine eigene
LocalizedLink-Komponente: Verwenden Sie wie gewohnt dieLink-Komponente von TanStack Router.- Eingabe (Input):
Root-Dokument erstellen
getLocale()gibt auf dem Server das von der Middleware aufgelöste Gebietsschema und im Browser das Gebietsschema aus der URL zurück, sodasslangunddirim Server-HTML und nach der Hydratisierung identisch sind.src/i18n/config.tsCode kopierenKopieren Sie den Code in die Zwischenablage
src/routes/__root.tsxCode kopierenKopieren Sie den Code in die Zwischenablage
Übersetzungen in Ihren Seiten nutzen
Nachrichten sind einfache Funktionen: Importieren Sie
m, rufen Sie die Funktion auf und übergeben Sie Variablen als Objekt. Alles ist vollständig typisiert, einschließlich der Variablen.src/routes/index.tsxCode kopierenKopieren Sie den Code in die Zwischenablage
src/routes/about.tsxCode kopierenKopieren Sie den Code in die Zwischenablage
Eine Nachrichtenfunktion akzeptiert auch ein explizites Gebietsschema:
m.about_title({}, { locale: "fr" }). Dies ist nützlich in Server-Code, der eine andere Sprache als die der Anfrage rendert, wie beispielsweise bei E-Mails.Sprache Ihres Inhalts ändern
OptionalRendern Sie den Sprachwechsler mit
localizeHrefals Links, damit Crawler jede Sprache entdecken können.setLocalespeichert die Auswahl im Cookie und lädt die Seite in der neuen Sprache neu: Ein vollständiges Neuladen ist das vorgesehene Verhalten von Paraglide, da Nachrichtenfunktionen das Gebietsschema bei jedem Aufruf auslesen, anstatt einen React-State zu abonnieren.src/components/LocaleSwitcher.tsxCode kopierenKopieren Sie den Code in die Zwischenablage
Metadaten internationalisieren
OptionalJede Sprachversion kann separat ranken, vorausgesetzt, jede Seite stellt Folgendes bereit:
- einen übersetzten
<title>und eine übersetztedescription; - eine kanonische URL (Canonical), die auf sich selbst verweist;
- ein
hreflang-Alternate pro Sprache plusx-default; - Open Graph
og:locale,og:locale:alternateundog:url; - JSON-LD mit
inLanguage.
Das
localizeUrlvon Paraglide erstellt die alternativen URLs aus IhrenurlPatterns, sodass sie niemals vom tatsächlichen Routing abweichen können:src/i18n/seo.tsCode kopierenKopieren Sie den Code in die Zwischenablage
- einen übersetzten
Sitemap internationalisieren
OptionalEine mehrsprachige Sitemap listet jede URL jeder Sprache auf, und jeder Eintrag deklariert alle seine Alternativen mit
xhtml:link:src/routes/sitemap[.]xml.tsCode kopierenKopieren Sie den Code in die Zwischenablage
robots.txt internationalisieren
OptionalGeschützte oder private Routen existieren in jeder Sprache, daher müssen
Disallow-Regeln jeden lokalisierten Pfad abdecken. Entfernen Siepublic/robots.txt, falls der Starter eine erstellt hat, und stellen Sie sie stattdessen über eine Route bereit:src/routes/robots[.]txt.tsCode kopierenKopieren Sie den Code in die Zwischenablage
Jede Sprache vorab rendern (Pre-Rendering)
OptionalGeben Sie den lokalisierten Pfad jeder Seite an, damit TanStack Start alle Sprachversionen vorab rendert.
localizeHrefist generierter Code ohne Browser-Abhängigkeit, sodass er invite.config.tsausgeführt werden kann – die Datei existiert jedoch erst nach einer ersten Kompilierung. Das manuelle Auflisten der Pfade wie unten umgeht dieses Reihenfolgeproblem:vite.config.tsCode kopierenKopieren Sie den Code in die Zwischenablage
Da der Sprachwechsler echte Links rendert, entdeckt
crawlLinks: trueauch Seiten, die Sie möglicherweise vergessen haben aufzulisten.Lokalisierte 404-Seiten verwalten
OptionalMit dem Rewrite wird
/fr/does-not-existals/does-not-existgematcht, undgetLocale()liefert weiterhinfrzurück, sodass dienotFoundComponentaus Schritt 7 auf Französisch gerendert wird. Eine Catch-All-Route stellt sicher, dass auch tiefe Pfade diese erreichen. Markieren Sie die Seite mitnoindex: React 19 verschiebt das<meta>automatisch in den<head>.src/components/NotFound.tsxCode kopierenKopieren Sie den Code in die Zwischenablage
src/routes/$.tsxCode kopierenKopieren Sie den Code in die Zwischenablage
Auf das Gebietsschema in Serverfunktionen zugreifen
OptionalServerfunktionen laufen innerhalb des Paraglide-Middleware-Scopes, sodass
getLocale()auch dort funktioniert:src/server/sendWelcomeEmail.tsCode kopierenKopieren Sie den Code in die Zwischenablage
Mit Intlayer vergleichen
OptionalEs gibt keinen direkten Drop-in-Adapter von Paraglide zu Intlayer, da beide demselben Grundgedanken folgen: Inhalte zur Build-Zeit kompilieren und so wenig Runtime wie möglich ausliefern. Die Unterschiede liegen darin, was den Browser erreicht und wie Inhalte organisiert sind:
- Sprachen: Intlayer lädt dynamische Wörterbücher pro Sprache (0% Sprach-Leak im Benchmark), während jede Paraglide-Nachrichtenfunktion alle Sprachen enthält (49.7%).
- Inhaltsorganisation: Inhalte können in
.content.ts-Dateien direkt neben jeder Komponente oder in zentralen Dateien liegen. Siehe Komponentenbasierte vs. zentralisierte i18n. - Sprachwechsel: Inhalte werden aus einem React-Kontext gelesen, sodass der Wechsel der Sprache ohne Neuladen neu rendert.
- Generierter Code: In
srcwird nichts generiert, sodass vor einem Commit nichts neu generiert werden muss.
Wenn Sie von einer anderen Bibliothek als Paraglide kommen, behalten die Kompatibilitäts-Adapter die API von
use-intl,next-intl,react-i18next,react-intloder Lingui bei und tauschen nur die Runtime aus.Siehe Ist Intlayer schlanker als Paraglide? und den Intlayer TanStack Start-Leitfaden.
Übersetzungen mit Intlayer automatisieren
OptionalParaglide rendert Übersetzungen, hilft Ihnen jedoch nicht dabei, sie zu erstellen. Intlayer ist kostenlos und Open Source, und seine Werkzeuge helfen selbst in einem Paraglide-Projekt:
- Mit KI übersetzen unter Verwendung Ihres eigenen API-Schlüssels und Anbieters. Siehe Auto Fill und das CLI.
- Behalten Sie Ihre JSON-Dateien als Source of Truth mit dem Sync-JSON-Plugin.
- Fehlende Übersetzungen testen in der CI. Siehe Übersetzungen testen.
- Bereitgestellte Website scannen nach fehlenden
hreflang-Tags, fehlerhaften Canonicals und Sprach-Leaks mit dem Scan-Befehl.
Häufig gestellte Fragen
Es ist eine solide Wahl: Es wird in den offiziellen TanStack Router-Beispielen verwendet, hat die kleinste Runtime im Benchmark (~1.8 KB gzip) und Nachrichten sind vollständig typisiert. Die Kompromisse bestehen darin, dass jede Nachrichtenfunktion alle Sprachen enthält, wodurch etwa die Hälfte der übersetzten Strings an Besucher anderer Sprachen gelangt, und dass ein Sprachwechsel die Seite neu lädt.
Nein. Der Router-rewrite entfernt das Sprachpräfix vor dem Routen-Matching und fügt es generierten Links wieder hinzu, sodass eine einzige Datei about.tsx die Pfade /about, /fr/about und /es/about bedient.
Nachrichtenfunktionen lesen das Gebietsschema beim Aufruf aus; sie abonnieren keinen React-State. setLocale lädt die Seite daher standardmäßig neu, damit jede Nachricht in der neuen Sprache neu gerendert wird. Sie können { reload: false } übergeben, müssen dann jedoch das Neu-Rendern des Baums selbst verwalten.
Es ist besser, dies nicht zu tun. Der Ordner wird bei jedem dev und build neu generiert, und das Commiten führt zu Merge-Konflikten bei generierten Dateien. Commiten Sie stattdessen messages/*.json und project.inlang/settings.json.
Verwenden Sie localizeUrl, um in head() der Route eine absolute URL pro Sprache zu erstellen, und fügen Sie ein x-default hinzu, das auf die Basissprache verweist. Schritt 10 bietet eine wiederverwendbare Hilfsfunktion und Schritt 11 fügt dieselben Alternativen zur Sitemap hinzu.
Ungenutzte Nachrichten werden entfernt, wenn Sie outputStructure: "message-modules" verwenden, sodass Inhalte anderer Seiten nicht leaken. Ungenutzte Sprachen werden jedoch nicht entfernt: Jede Nachrichtenfunktion enthält jede Übersetzung, weshalb der Benchmark einen Sprach-Leak von 49.7% misst.
Kommentare
Noch keine Kommentare. Seien Sie der Erste, der seine Gedanken teilt.
