Svelte-i18n-Bibliotheken im Vergleich (2026)
Für Svelte und SvelteKit gibt es mehrere i18n-Bibliotheken, und sie unterscheiden sich in echten Punkten: Stores oder Runes, Laufzeit-Lookup oder kompilierte Funktionen, ICU oder MessageFormat 2. Diese Seite vergleicht svelte-dialect mit svelte-i18n, Sveltia I18n, sveltekit-i18n, Paraglide JS, typesafe-i18n und wuchale.
Die Seite stammt vom Autor von svelte-dialect. Alle Aussagen über die anderen Bibliotheken stammen aus deren aktuellen READMEs, Docs und npm-Seiten (siehe Quellen). Was sich nicht bestätigen ließ, haben wir weggelassen.
Für eine neue SvelteKit-App fängst du am besten mit Paraglide JS an: Es ist ein offizielles sv-Add-on, kompiliert Nachrichten zu tree-shakebaren Funktionen und bekommt oft neue Releases. Die anderen Bibliotheken lohnen sich, wenn eine ihrer Stärken zu deinem Projekt passt, wie unten beschrieben.
Wie sie aufgebaut sind #
| Bibliothek | Svelte-API | Nachrichtenformat | Typsicherheit | Bundle |
|---|---|---|---|---|
| svelte-dialect | Svelte-API:Svelte 5. Die Locale ist eine Rune, t() eine normale Funktion. | Nachrichtenformat:Nur MessageFormat 2. | Typsicherheit:Eine CLI erzeugt eine Schlüssel-Union und Parametertypen. Beliebige Strings lassen sich weiterhin kompilieren. | Bundle:Laufzeit. Nachrichten werden im Browser geparst, Tree-Shaking pro Nachricht gibt es nicht. |
| svelte-i18n | Svelte-API:Stores ($_, $locale). Der Peer-Bereich umfasst Svelte 3, 4 und 5. | Nachrichtenformat:ICU MessageFormat über formatjs. | Typsicherheit:Schlüssel sind normale Strings. Typisierung von Schlüsseln beschreiben die Docs nicht. | Bundle:Laufzeit, mit intl-messageformat als Abhängigkeit. |
| Sveltia I18n | Svelte-API:Svelte 5. locale ist ein reaktives Objekt und t() eine normale Funktion, mit den Funktionsnamen von svelte-i18n. | Nachrichtenformat:Nur MessageFormat 2, über messageformat. | Typsicherheit:Keys sind einfache Strings. Das README beschreibt keine Typisierung der Keys. | Bundle:Laufzeit, mit messageformat als einziger Abhängigkeit. |
| sveltekit-i18n | Svelte-API:Nur Svelte 5. Eine reaktive Instanz mit t(), $t-Stores über eine Erweiterung. | Nachrichtenformat:Standardmäßig Curly. ICU-, MF2- und i18next-Parser sind eigene Pakete. | Typsicherheit:Das Vite-Plugin typegen schreibt ein Schema für typisierte Schlüssel und Parameter. | Bundle:Laufzeit. Loader lassen sich auf eine Route beschränken. |
| Paraglide JS | Svelte-API:Normale Nachrichtenfunktionen wie m.greeting({ name }). Beim Sprachwechsel wird das Dokument neu geladen. | Nachrichtenformat:Standardmäßig das Inlang-Format, mit Markup und Selektoren im MF2-Stil. ICU 1 und i18next über Plugins. | Typsicherheit:Der Compiler erzeugt typisierte Nachrichtenfunktionen, ein falscher Schlüssel oder Parameter lässt sich nicht kompilieren. | Bundle:Kompiliert und pro Nachricht tree-geshaket. Laut eigenem Benchmark bis zu 70 % kleiner als Laufzeit-Bibliotheken. |
| typesafe-i18n | Svelte-API:Generierte Svelte-Stores ($LL). | Nachrichtenformat:Eigene Syntax: {name}, {{one|many}}, Switch-Case. | Typsicherheit:Ein Generator schreibt Typen aus der Basis-Locale. Für reines JavaScript funktioniert JSDoc. | Bundle:Laufzeit von etwa 1 kB, laut README. |
| wuchale | Svelte-API:Svelte-5-Adapter. Der kompilierte Code nutzt $derived. | Nachrichtenformat:Gettext-PO-Kataloge. Plurale über einen plural()-Helfer. | Typsicherheit:Keine Schlüssel: Der Quelltext ist der Schlüssel, also gibt es nichts zu typisieren. | Bundle:Kompiliert. Kataloge sind einfache Arrays ohne Schlüssel. |
Server, Routing und Pflege #
| Bibliothek | Spracherkennung und URLs | Lazy Loading | Rich Text | Letztes Release |
|---|---|---|---|---|
| svelte-dialect | Spracherkennung und URLs:Cookie, Accept-Language oder URL-Präfix (routing: true, kein [locale]-Ordner). Pro Anfrage isoliert. | Lazy Loading:Pro Namespace: Chunks per dynamischem Import, fetch oder Remote Functions. | Rich Text:MF2-Markup, von Rich über Snippets gerendert. | Letztes Release:0.1.0. Das Projekt begann im Juli 2026. Ein Community-Add-on für sv (npx sv add svelte-dialect). |
| svelte-i18n | Spracherkennung und URLs:Die SvelteKit-Anleitung liest Accept-Language in handle und setzt einen globalen Store. URL-Routing steht nicht in den Docs. | Lazy Loading:register(locale, loader) lädt jeweils eine Locale. | Rich Text:In den Docs nicht beschrieben. | Letztes Release:4.0.1, Oktober 2024. |
| Sveltia I18n | Spracherkennung und URLs:getLocaleFrom*-Helfer für Browser, Pfad oder Query. Die Locale ist ein einziger Wert auf Modulebene, deshalb nennt das README SSR unter Last unsicher und empfiehlt, sie im Browser zu bestimmen. | Lazy Loading:register(locale, loader) lädt jeweils eine Locale. | Rich Text:Im README nicht beschrieben. | Letztes Release:1.5.0, Oktober 2026. Erstmals veröffentlicht im April 2026. |
| sveltekit-i18n | Spracherkennung und URLs:Eine Instanz pro Anfrage: preferredLocale, dann Accept-Language, dann der Standard. Locales in der URL zeigen Beispiel-Apps. | Lazy Loading:Loader pro Route oder Namespace, auch aus einer API. | Rich Text:Das Paket extension-html liefert eine T-Komponente. | Letztes Release:3.4.1, Oktober 2026. Zwischen Juli 2023 und September 2026 gab es kein Release. |
| Paraglide JS | Spracherkennung und URLs:Middleware mit Strategien: url, cookie, localStorage, Browsersprache. Lokalisierte URLs sind eingebaut. | Lazy Loading:Jede Nachricht enthält alle Locales. Aufteilung pro Locale ist experimentell. | Rich Text:{#link}…{/link}-Markup, gerendert mit Snippets aus @inlang/paraglide-js-svelte. | Letztes Release:2.29.0, Oktober 2026. Ein offizielles sv-Add-on. |
| typesafe-i18n | Spracherkennung und URLs:Locale-Detektoren für Browser und Server. Im README steht kein URL-Routing. | Lazy Loading:Optionales asynchrones Laden von Locales, dazu Namespaces. | Rich Text:Im README nicht beschrieben. | Letztes Release:5.27.1, Februar 2026. |
| wuchale | Spracherkennung und URLs:runWithLocale isoliert Anfragen, die Locale lieferst du selbst. URL-Muster werden übersetzt und lokalisiert. | Lazy Loading:Bausteine für jede Strategie. Der Server lädt beim Start alle Kataloge. | Rich Text:Verschachteltes Markup in Komponenten wird ohne zusätzliche Syntax extrahiert. | Letztes Release:0.26.7, September 2026. Vor 1.0. |
svelte-dialect #
Eine Svelte-5-Bibliothek auf Basis von MessageFormat 2. Die Locale ist eine Rune, SvelteKit-Routing und Spracherkennung sind eingebaut, und in reinem Svelte läuft sie auch ohne Kit.
Nimm sie, wenn du MessageFormat 2 willst und Seiten, die der Server in der Sprache jedes Besuchers rendert, die Sprache in der URL ohne [locale]-Routenordner und typisierte Keys.
Such woanders, wenn du jahrelangen Produktiveinsatz, Tree-Shaking pro Nachricht oder ein ausgereiftes Ökosystem um die Bibliothek brauchst. Sie ist jung (0.1.x) und klein, parst Nachrichten zur Laufzeit, und MF2 ist den meisten Übersetzern noch neu.
svelte-i18n #
Store-basiert, ICU-Nachrichten über formatjs und ein Wörterbuch pro Locale. Version 4.0.1 erschien im Oktober 2024, und laut README wartet ein Umbau von einem Singleton auf Instanzen auf Zeit und Priorität.
Nimm sie, wenn du sie schon einsetzt und sie funktioniert, wenn deine Übersetzer und Tools ICU erwarten oder wenn deine Codebasis noch Svelte 3, 4 und 5 mischt. Für die Vorschau von Nachrichten verweisen die Docs auf die VS-Code-Erweiterung i18n-ally.
Such woanders, wenn du Runes, typisierte Schlüssel oder ein auf SvelteKit zugeschnittenes SSR willst. Das README von sveltekit-i18n warnt, dass eine Instanz auf Modulebene auf dem Server von gleichzeitigen Anfragen geteilt wird, und die SvelteKit-Anleitung von svelte-i18n setzt die Locale in handle auf einem globalen Store. Teste deshalb gleichzeitige Anfragen in verschiedenen Sprachen, bevor du dich darauf verlässt.
Sveltia I18n #
Eine Neufassung von svelte-i18n mit Runes vom Team hinter Sveltia CMS: dieselben Funktionsnamen, MessageFormat 2 statt ICU, und die Locale hält auch <html lang dir> aktuell. Sveltia CMS und Sveltia UI laufen damit produktiv.
Nimm sie, wenn du von svelte-i18n wegwillst und MF2 hinter der API haben möchtest, die du schon kennst, oder wenn die App im Browser rendert (eine SPA oder adapter-static mit Locale-Wahl auf dem Client).
Such woanders, wenn der Server Seiten in der Sprache des Besuchers rendert: Auf dem Server teilen sich alle Requests die Locale, und das README (Issue #2) empfiehlt stattdessen die Erkennung im Client. URL-Routing und typisierte Keys zeigt die Doku ebenfalls nicht.
sveltekit-i18n #
Im September 2026 als 3.x neu geschrieben, nachdem es seit Juli 2023 kein Release gab, und seitdem schnell unterwegs: 3.4.1 erschien am 7. Oktober. Erfordert Svelte 5, liefert eine reaktive Instanz pro Anfrage, lädt Übersetzungen pro Route und hat ein Plugin für typisierte Schlüssel.
Nimm sie, wenn du Laden pro Route, typisierte Schlüssel über typegen oder die Wahl der Nachrichtensyntax willst. Vom Umfang her liegt sie svelte-dialect am nächsten und hat das größere Erweiterungssystem.
Such woanders, wenn du eine lange Historie brauchst: Die 3.x-Linie ist etwa einen Monat alt. Locales in der URL zeigen Beispiel-Apps, es gibt dafür keine einzelne Option, und für den MF2-Parser baust du direkt auf dem Basispaket statt auf dem Hauptpaket auf.
Paraglide JS #
Compiler zuerst. Nachrichten werden zu typisierten Funktionen, und dein Bundler wirft weg, was du nie aufrufst. Es ist eines der offiziellen sv-Add-ons (npx sv add paraglide), Version 2.29.0 erschien am 15. Oktober 2026.
Nimm sie, wenn die Bundle-Größe zählt, wenn du Compile-Fehler bei falschen Schlüsseln und Parametern willst oder wenn dir die Integration der Svelte CLI zusagt. Lokalisierte URLs und anfragebezogenes SSR sind eingebaut, und sie läuft auch außerhalb von Svelte, falls du weitere Frontends hast.
Such woanders, wenn die meisten Übersetzungen erst zur Laufzeit bekannt sind, etwa Schlüssel aus einem CMS oder einer Datenbank (laut FAQ passt dann eher eine Laufzeit-Bibliothek). Ein Sprachwechsel lädt das Dokument neu, statt eine Rune zu aktualisieren, und Lazy Loading pro Locale ist noch experimentell.
typesafe-i18n #
Eigene Nachrichtensyntax, ein Generator, der Typen aus deiner Basis-Locale schreibt, und Svelte-Stores über $LL. Version 5.27.1 erschien im Februar 2026, das erste Release seit August 2023, und das Repository liegt jetzt in der Organisation codingcommons.
Nimm sie, wenn Typsicherheit auf einer sehr kleinen Laufzeit Vorrang hat und du eine Bibliothek für Frontend, Backend und API-Code willst. Der Generator deckt typisierte Schlüssel und Parameter ab, und JSDoc bringt das auch in reines JavaScript.
Such woanders, wenn du Runes, ein Standardformat, das Übersetzungstools importieren, oder eingebautes URL-Routing willst. Releases sind selten: 5.26.2 im August 2023, dann 5.27.1 im Februar 2026.
wuchale #
Ein anderer Ansatz: keine Schlüssel und keine t()-Aufrufe. Beim Build liest sie das einfache Markup deiner Komponenten, extrahiert den Text in PO-Dateien und ersetzt ihn durch Zugriffe per Index auf kompilierte Arrays. Der Svelte-5-Adapter steht bei 0.26.7, veröffentlicht im September 2026.
Nimm sie, wenn du i18n in eine bestehende App einbauen willst, ohne Komponenten umzuschreiben, wenn du gettext-PO-Dateien willst, die Weblate oder Crowdin lesen, oder wenn du übersetzte URL-Pfade wie /about zu /es/acerca-de brauchst.
Such woanders, wenn du explizite typisierte Schlüssel willst, die hier bewusst fehlen, oder eine 1.0-API. Auch bei SSR bleibt die Spracherkennung dir überlassen: Das Beispiel in den Docs liest die Locale aus einem Suchparameter.
i18next #
i18next ist eine allgemeine Laufzeit-Bibliothek, keine speziell für Svelte. Version 26.4.7 erschien am 16. Oktober 2026, während der Svelte-Wrapper svelte-i18next zuletzt im Oktober 2023 veröffentlicht wurde.
Nimm sie, wenn dieselben Übersetzungsdateien auch React-, Node- oder Mobile-Apps bedienen müssen. Für den Erhalt deiner Dateien brauchst du den Wrapper nicht: Paraglide liest i18next-Dateien über ein Plugin, sveltekit-i18n hat einen i18next-Parser, und der Befehl migrate von svelte-dialect wandelt {{name}}-Interpolation und Plural-Suffixe in MF2 um.
Quellen #
Geprüft im Oktober 2026. Versionsnummern und Release-Daten stammen zu diesem Zeitpunkt aus der npm-Registry.
- svelte-dialect: github.com/krowten/svelte-dialect#readme
- svelte-i18n: github.com/kaisermann/svelte-i18n,github.com/kaisermann/svelte-i18n/blob/main/docs/Svelte-Kit.md,www.npmjs.com/package/svelte-i18n
- Sveltia I18n: github.com/sveltia/sveltia-i18n,github.com/sveltia/sveltia-i18n/issues/2,www.npmjs.com/package/@sveltia/i18n
- sveltekit-i18n: github.com/sveltekit-i18n/lib,www.npmjs.com/package/sveltekit-i18n
- Paraglide JS: paraglidejs.com/sveltekit,paraglidejs.com/basics,paraglidejs.com/markup,paraglidejs.com/comparison,svelte.dev/docs/cli/sv-add,github.com/opral/paraglide-js,www.npmjs.com/package/@inlang/paraglide-js
- typesafe-i18n: github.com/codingcommons/typesafe-i18n,github.com/codingcommons/typesafe-i18n/tree/main/packages/adapter-svelte,www.npmjs.com/package/typesafe-i18n
- wuchale: wuchale.dev/intro/why,wuchale.dev/adapters/svelte,wuchale.dev/guides/urls,wuchale.dev/guides/loading,github.com/wuchalejs/wuchale,www.npmjs.com/package/wuchale
- i18next: www.npmjs.com/package/i18next,www.npmjs.com/package/svelte-i18next