Skip to main content

SvelteKit-i18n: Leitfaden zur Einrichtung der Internationalisierung

Von null bis mehrsprachig: Richten Sie svelte-i18n in Ihrer SvelteKit-App mit ICU-Nachrichtenformat, Locale-basiertem Routing und intelligenten Fallback-Ketten ein.

1

svelte-i18n installieren

svelte-i18n ist die Standardbibliothek zur Internationalisierung für Svelte und SvelteKit. Sie bietet reaktive Stores, Unterstützung für ICU MessageFormat und verzögertes Laden von Locales.

svelte-i18n verwendet ICU MessageFormat für Pluralformen und Variablen – denselben Standard wie FormatJS/react-intl. Wenn Sie von React kommen, wird Ihnen die Nachrichtensyntax vertraut sein.
Terminal
npm install svelte-i18n
2

svelte-i18n konfigurieren

Erstellen Sie eine i18n-Konfigurationsdatei, die Ihre Locales mit verzögert geladenen Importfunktionen registriert. svelte-i18n ruft die Nachrichten einer Locale erst ab, wenn diese aktiviert wird.

src/lib/i18n.ts
// src/lib/i18n.ts
import { register, init, getLocaleFromNavigator } from 'svelte-i18n';

// Register locale loaders (lazy-loaded)
register('en', () => import('../locales/en.json'));
register('de', () => import('../locales/de.json'));
register('ja', () => import('../locales/ja.json'));
register('es', () => import('../locales/es.json'));

init({
  fallbackLocale: 'en',
  initialLocale: getLocaleFromNavigator(),  // Auto-detect browser language
});
Sie müssen Ihre i18n-Konfigurationsdatei in +layout.svelte importieren, bevor eine Komponente gerendert wird. Zeigen Übersetzungen unverarbeitete Schlüssel wie „nav.home“, wurde die Konfiguration nicht früh genug importiert.

SvelteKit-Layout-Integration

Importieren Sie Ihre i18n-Konfiguration im Stammlayout und schützen Sie das Rendering mit dem Store $isLoading. Dadurch blitzen keine nicht übersetzten Schlüssel auf, während Locale-Daten asynchron geladen werden.

src/routes/+layout.svelte
<!-- src/routes/+layout.svelte -->
<script>
  // Import i18n config — must run before any component renders
  import '../lib/i18n';
  import { isLoading } from 'svelte-i18n';
</script>

{#if $isLoading}
  <p>Loading translations...</p>
{:else}
  <slot />
{/if}

Locale-basiertes Routing in SvelteKit

Verwenden Sie für SEO-freundliche URLs wie /en/about und /de/about einen Routenparameter [lang]. Setzen Sie die svelte-i18n-Locale in der load-Funktion des Layouts anhand des URL-Parameters.

SvelteKit locale routing
// src/routes/[lang]/+layout.ts
import { locale } from 'svelte-i18n';

export function load({ params }) {
  // Set the active locale from the URL parameter
  locale.set(params.lang);
  return {};
}

// src/routes/[lang]/+layout.svelte
<script>
  import '../../lib/i18n';
  import { isLoading } from 'svelte-i18n';
</script>

{#if $isLoading}
  <p>Loading...</p>
{:else}
  <slot />
{/if}

Format der Übersetzungsdateien

Erstellen Sie eine JSON-Datei pro Locale. svelte-i18n unterstützt verschachtelte Schlüssel und die ICU-MessageFormat-Syntax für Pluralformen, Variablen und Auswahlausdrücke.

Translation files
// src/locales/en.json
{
  "nav": {
    "home": "Home",
    "about": "About",
    "settings": "Settings"
  },
  "greeting": "Hello, {name}!",
  "cart": {
    "itemCount": "{count, plural, one {# item} other {# items}}"
  }
}

// src/locales/de.json
{
  "nav": {
    "home": "Startseite",
    "about": "Uber uns",
    "settings": "Einstellungen"
  },
  "greeting": "Hallo, {name}!",
  "cart": {
    "itemCount": "{count, plural, one {# Artikel} other {# Artikel}}"
  }
}
Benennen Sie Schlüssel nach ihrer Bedeutung und nicht nach ihrer Position: „cart.itemCount“ ist besser als „homepageCartLabel“. Schlüssel sollten eine Neugestaltung der Benutzeroberfläche überdauern.
3

Übersetzungen in Komponenten verwenden

Importieren Sie den Store $_ (oder $format) aus svelte-i18n und verwenden Sie ihn in Ihren Svelte-Vorlagen. Der Store ist reaktiv: Bei einem Locale-Wechsel werden alle übersetzten Zeichenfolgen automatisch aktualisiert.

Component.svelte
<script>
  import { _ } from 'svelte-i18n';
</script>

<h1>{$_('greeting', { values: { name: 'World' } })}</h1>

<nav>
  <a href="/">{$_('nav.home')}</a>
  <a href="/about">{$_('nav.about')}</a>
</nav>
Formatting helpers
<script>
  import { _, date, number, time } from 'svelte-i18n';
</script>

<!-- Simple string -->
<p>{$_('greeting', { values: { name: userName } })}</p>

<!-- ICU plurals — handled automatically -->
<p>{$_('cart.itemCount', { values: { count: 3 } })}</p>

<!-- Date formatting -->
<p>{$date(new Date(), { format: 'long' })}</p>

<!-- Number formatting -->
<p>{$number(1999.99, { style: 'currency', currency: 'USD' })}</p>
$_ ist ein Svelte-Store – Sie müssen in Vorlagen das Präfix $ verwenden. _('key') ohne Dollarzeichen gibt das Store-Objekt statt der übersetzten Zeichenfolge zurück.

Sprachwechsel

Erstellen Sie eine Sprachauswahl, die an den Store $locale gebunden ist. Wenn sich der Wert ändert, lädt svelte-i18n die Nachrichten der neuen Locale und aktualisiert reaktiv alle übersetzten Zeichenfolgen.

LanguageSwitcher.svelte
<script>
  import { locale, locales } from 'svelte-i18n';

  const LANGUAGE_NAMES = {
    en: 'English',
    de: 'Deutsch',
    ja: '日本語',
    es: 'Espanol',
  };
</script>

<select bind:value={$locale}>
  {#each $locales as loc}
    <option value={loc}>{LANGUAGE_NAMES[loc] ?? loc}</option>
  {/each}
</select>
4

Pluralformen mit ICU MessageFormat verarbeiten

svelte-i18n verwendet ICU MessageFormat für Pluralformen – den internationalen Standard, der alle CLDR-Pluralkategorien verarbeitet. Arabisch hat sechs Formen, Russisch vier und Japanisch eine. Definieren Sie die von Ihren Zielsprachen benötigten Formen; svelte-i18n wählt automatisch die richtige aus.

ICU plural forms by language
// svelte-i18n uses ICU MessageFormat for plurals
// English:
{
  "items": "{count, plural, one {# item} other {# items}}"
}

// Arabic (6 forms):
{
  "items": "{count, plural, zero {no items} one {item} two {two items} few {# items} many {# items} other {# items}}"
}

// Japanese (1 form):
{
  "items": "{count, plural, other {#個のアイテム}}"
}
Codieren Sie Singular-/Plurallogik niemals fest in Ihren Komponenten. Sprachen wie Französisch behandeln 0 als Singular. Arabisch, Russisch und Polnisch besitzen Pluralformen, die es im Englischen nicht gibt. Überlassen Sie dies der ICU-Pluralsyntax.

Intelligente Locale-Fallbacks mit svelte-i18n-locale-chain

svelte-i18n wechselt bei einem fehlenden Schlüssel direkt zu fallbackLocale – einen Zwischen-Fallback gibt es nicht. Eine Person mit pt-BR sieht Englisch statt vollständig geeigneter pt-PT-Übersetzungen. svelte-i18n-locale-chain behebt dies mit intelligenten Fallback-Ketten, die Nachrichten regionaler Varianten rekursiv zusammenführen.

Terminal
npm install svelte-i18n-locale-chain svelte-i18n
src/lib/i18n.ts
// src/lib/i18n.ts
import { initLocaleChain, setLocale } from 'svelte-i18n-locale-chain';

// Replace svelte-i18n's init + register with initLocaleChain
await initLocaleChain({
  loadMessages: (locale) =>
    import(`../locales/${locale}.json`).then(m => m.default),
  defaultLocale: 'en',
  initialLocale: 'pt-BR',
});

// Later, to change locale:
await setLocale('fr-CA');
// fr-CA user sees: fr-CA messages -> fr messages -> en messages
// No missing keys — deep-merged automatically
svelte-i18n-locale-chain verwaltet das gesamte Laden von Nachrichten intern. Verwenden Sie nicht gleichzeitig die Funktion register() von svelte-i18n – initLocaleChain übernimmt Registrierung, Laden und rekursives Zusammenführen.

Übersetzungen automatisieren

Wenn Ihre i18n-Einrichtung abgeschlossen ist, übersetzen Sie Ihre Locale-Dateien mit KI. Bitten Sie Ihren KI-Assistenten in Ihrer IDE, Ihre Ausgangsdatei zu übersetzen, oder verwenden Sie die CLI von i18n Agent in Ihrer CI/CD-Pipeline.

Terminal
# In your IDE, ask your AI assistant:
> Translate src/locales/en.json to German, Japanese, and Spanish

✓ de.json created (1.2s)
✓ ja.json created (1.5s)
✓ es.json created (1.1s)

# Or use the CLI in CI/CD:
npx i18n-agent translate src/locales/en.json --lang de,ja,es
Übersetzen Sie schrittweise: Wenn Sie Ihrer Ausgangsdatei neue Schlüssel hinzufügen, übersetzen Sie nur die Änderungen, statt alle Dateien neu zu erzeugen. So bleiben von Menschen geprüfte Übersetzungen erhalten.

Übersetzungsqualität automatisieren

Erkennen Sie mit i18n-validate fehlende Schlüssel und beschädigte Platzhalter vor der Veröffentlichung. Testen Sie Ihre Benutzeroberfläche mit i18n-pseudo und Pseudoübersetzungen, bevor echte Übersetzungen vorliegen.

Häufige Fallstricke

Locale-Zustand tritt zwischen SvelteKit-SSR-Anfragen über

svelte-i18n-Stores sind Singletons. Bei SvelteKit-SSR teilen sich gleichzeitige Anfragen denselben Store, sodass die Locale einer Person in die Antwort einer anderen gelangen kann. Lösung: Rufen Sie locale.set() im handle-Hook oder in der load-Funktion des Layouts auf, damit jede Anfrage den richtigen Locale-Kontext erhält.

register() mit svelte-i18n-locale-chain verwenden

Verwenden Sie die Funktion register() von svelte-i18n nicht, wenn Sie svelte-i18n-locale-chain einsetzen. initLocaleChain übernimmt intern das gesamte Laden von Nachrichten. Eine Kombination führt zu doppeltem oder widersprüchlichem Laden.

ICU-Syntaxfehler bleiben unbemerkt

Eine nicht passende Klammer oder fehlende Pluralkategorie in ICU-MessageFormat-Zeichenfolgen verursacht unbemerkte Fehler: Statt der formatierten Ausgabe wird die unverarbeitete Nachrichtenzeichenfolge angezeigt. Validieren Sie die ICU-Syntax in Ihrer CI-Pipeline.

Nicht übersetzte Inhalte blitzen auf

Wenn Sie Komponenten rendern, bevor die Übersetzungen vollständig geladen sind, sehen Personen unverarbeitete Schlüssel. Schützen Sie Ihr Layout mit {#if $isLoading}...{:else}...{/if}, um bis zur Verfügbarkeit der Nachrichten einen Ladezustand anzuzeigen.

Empfohlene Dateistruktur

Project Structure
my-sveltekit-app/
├── src/
│   ├── lib/
│   │   └── i18n.ts              # i18n configuration
│   ├── locales/
│   │   ├── en.json              # Source language
│   │   ├── de.json              # German
│   │   ├── ja.json              # Japanese
│   │   └── es.json              # Spanish
│   └── routes/
│       ├── +layout.svelte       # Import i18n, guard isLoading
│       ├── +page.svelte
│       └── [lang]/              # Optional: locale-based routing
│           ├── +layout.ts       # Set locale from URL param
│           ├── +layout.svelte
│           └── +page.svelte
├── svelte.config.js
└── package.json

i18n Agent jetzt testen

Legen Sie Ihre Übersetzungsdatei hier ab

JSON, YAML, PO, XML, CSV, Markdown, Properties

oder zum Auswählen klicken

Zielsprachen

Keine Registrierung erforderlichSofortiges Angebot

Locale-Fallback mit svelte-i18n-locale-chain

Fehlt ein Übersetzungsschlüssel in einer regionalen Locale wie pt-BR, wechselt svelte-i18n direkt zur Standard-Locale, statt zuerst die übergeordnete Locale pt zu prüfen.

Terminal
npm install svelte-i18n-locale-chain
Configuration
import { initLocaleChain } from 'svelte-i18n-locale-chain';

initLocaleChain({
  fallbacks: {
    'pt-BR': ['pt', 'en'],
    'zh-Hant-HK': ['zh-Hant', 'zh', 'en'],
  },
  defaultLocale: 'en',
});

In unserem Leitfaden zu Locale-Fallbacks finden Sie die vollständige Liste unterstützter Frameworks und 75 integrierter Ketten. Learn more →

Häufig gestellte Fragen