Skip to main content

SvelteKit i18n: guide för internationaliseringskonfiguration

Från noll till flerspråkig app: konfigurera svelte-i18n i din SvelteKit-app med ICU-meddelandeformat, språkbaserad routning och smarta reservkedjor.

1

Installera svelte-i18n

svelte-i18n är standardbiblioteket för internationalisering i Svelte och SvelteKit. Det erbjuder reaktiva stores, stöd för ICU MessageFormat och lazy loading av språk direkt från start.

svelte-i18n använder ICU MessageFormat för pluralformer och variabler – samma standard som FormatJS/react-intl. Om du kommer från React känner du igen meddelandesyntaxen.
Terminal
npm install svelte-i18n
2

Konfigurera svelte-i18n

Skapa en i18n-konfigurationsfil som registrerar dina språk med importfunktioner för lazy loading. svelte-i18n hämtar ett språks meddelanden först när språket aktiveras.

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
});
Du måste importera i18n-konfigurationsfilen i +layout.svelte innan någon komponent renderas. Om översättningar visas som obearbetade nycklar, exempelvis 'nav.home', importerades konfigurationen inte tillräckligt tidigt.

Integrera SvelteKit-layouten

Importera i18n-konfigurationen i rotlayouten och villkora renderingen med $isLoading-store. Det förhindrar att oöversatta nycklar blinkar till medan språkdata läses in asynkront.

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}

Språkbaserad routning i SvelteKit

Använd en [lang]-ruttparameter för SEO-vänliga webbadresser som /en/about och /de/about. Ange svelte-i18n-språket i layoutens load-funktion utifrån URL-parametern.

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}

Översättningsfilernas format

Skapa en JSON-fil per språkvariant. svelte-i18n stöder nästlade nycklar och ICU MessageFormat-syntax för pluralformer, variabler och select-uttryck.

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}}"
  }
}
Namnge nycklar efter vad de beskriver, inte var de visas: 'cart.itemCount' är bättre än 'homepageCartLabel'. Nycklarna bör kunna behållas när gränssnittet görs om.
3

Använd översättningar i komponenter

Importera storen $_ (eller $format) från svelte-i18n och använd den i dina Svelte-mallar. Storen är reaktiv – när språkvarianten ändras uppdateras alla översatta strängar automatiskt.

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>
$_ är en Svelte-store – du måste använda prefixet $ i mallar. Om du skriver _('key') utan dollartecknet returneras store-objektet, inte den översatta strängen.

Byta språk

Skapa en språkväljare som binder till $locale-store. När värdet ändras läser svelte-i18n in det nya språkets meddelanden och uppdaterar alla översatta strängar reaktivt.

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

Hantera pluralformer med ICU MessageFormat

svelte-i18n använder ICU MessageFormat för pluralformer – den internationella standarden som hanterar alla CLDR-pluralkategorier. Arabiska har 6 former, ryska har 4 och japanska har 1. Definiera de former som målspråken behöver så väljer svelte-i18n automatiskt rätt form.

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 {#個のアイテム}}"
}
Hårdkoda aldrig logik för singular och plural i komponenterna. Språk som franska behandlar 0 som singular. Arabiska, ryska och polska har pluralformer som inte finns på engelska. Låt ICU:s pluralsyntax hantera detta.

Smarta språkreservkedjor med svelte-i18n-locale-chain

svelte-i18n går direkt till fallbackLocale när en nyckel saknas – det finns inget mellanliggande reservspråk. En användare med pt-BR ser då engelska trots att det finns en bra översättning för pt-PT. svelte-i18n-locale-chain löser detta med smarta reservkedjor som djupsammanfogar meddelanden från regionala varianter.

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 hanterar all meddelandeinläsning internt. Använd inte svelte-i18n-funktionen register() tillsammans med det – initLocaleChain hanterar registrering, inläsning och djupsammanfogning.

Automatisera översättningar

När i18n-konfigurationen är klar kan du översätta språkfilerna med AI. Be din AI-assistent i IDE:n att översätta källfilen eller använd i18n Agent CLI i din 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
Översätt stegvis – när du lägger till nya nycklar i källfilen översätter du bara skillnaden i stället för att generera om alla filer. Då bevaras översättningar som har granskats av människor.

Automatisera kvalitetskontrollen av översättningar

Upptäck saknade nycklar och trasiga platshållare med i18n-validate innan de når produktion. Testa gränssnittet med pseudoöversättningar via i18n-pseudo innan de riktiga översättningarna är klara.

Vanliga fallgropar

Språkdata läcker mellan SSR-anrop i SvelteKit

svelte-i18n-stores är singletonobjekt. Vid SSR i SvelteKit delar samtidiga anrop samma store, så en användares språkvariant kan läcka in i en annan användares svar. Lösning: anropa locale.set() i handle-hooken eller layoutens load-funktion så att varje anrop får rätt språkkontext.

Använda register() med svelte-i18n-locale-chain

Använd inte svelte-i18n-funktionen register() om du använder svelte-i18n-locale-chain. initLocaleChain hanterar all meddelandeinläsning internt. Om båda används blir meddelandeinläsningen duplicerad eller motstridig.

Fel i ICU-syntaxen ger inget felmeddelande

En felmatchad klammerparentes eller saknad pluralkategori i ICU MessageFormat-strängar orsakar fel utan varning – den obearbetade meddelandesträngen visas i stället för det formaterade resultatet. Validera ICU-syntaxen i din CI-pipeline.

Oöversatt innehåll blinkar till

Om du renderar komponenter innan översättningarna har lästs in ser användarna obearbetade nycklar. Villkora layouten med {#if $isLoading}...{:else}...{/if} för att visa ett laddningstillstånd tills meddelandena är klara.

Rekommenderad filstruktur

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

Prova i18n Agent nu

Släpp din översättningsfil här

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

eller klicka för att välja en fil

Målspråk

Ingen registrering krävsPrisuppskattning direkt

Språkreserv med svelte-i18n-locale-chain

När en översättningsnyckel saknas i en regional språkvariant som pt-BR går svelte-i18n direkt till standardspråket i stället för att först kontrollera det överordnade språket pt.

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',
});

I vår guide om språkreserver hittar du hela listan över ramverk som stöds och 75 inbyggda kedjor. Learn more →

Vanliga frågor