Skip to main content

SvelteKit i18n: príručka nastavenia internacionalizácie

Od nuly k viacjazyčnej aplikácii: nastavte svelte-i18n vo svojej aplikácii SvelteKit s formátom správ ICU, smerovaním podľa lokalizácie a inteligentnými reťazcami náhrad.

1

Nainštalujte svelte-i18n

svelte-i18n je štandardná internacionalizačná knižnica pre Svelte a SvelteKit. Hneď po inštalácii ponúka reaktívne úložiská, podporu ICU MessageFormat a načítavanie lokalizácií na požiadanie.

svelte-i18n používa ICU MessageFormat pre tvary množného čísla a premenné – rovnaký štandard ako FormatJS/react-intl. Ak prechádzate z React, syntax správ Vám bude známa.
Terminal
npm install svelte-i18n
2

Nakonfigurujte svelte-i18n

Vytvorte konfiguračný súbor i18n, ktorý zaregistruje Vaše lokalizácie pomocou importných funkcií načítavaných na požiadanie. svelte-i18n načíta správy lokalizácie až pri jej aktivácii.

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
});
Konfiguračný súbor i18n musíte importovať v +layout.svelte skôr, než sa vykreslí ktorýkoľvek komponent. Ak preklady zobrazujú nespracované kľúče, ako je 'nav.home', konfigurácia sa neimportovala dostatočne skoro.

Integrácia rozloženia SvelteKit

Importujte konfiguráciu i18n v koreňovom rozložení a vykresľovanie podmieňte úložiskom $isLoading. Zabránite tak bliknutiu nepreložených kľúčov počas asynchrónneho načítavania údajov lokalizácie.

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}

Smerovanie podľa lokalizácie v SvelteKit

Pre adresy URL vhodné pre SEO, ako sú /en/about a /de/about, použite parameter trasy [lang]. Lokalizáciu svelte-i18n nastavte vo funkcii load rozloženia podľa parametra URL.

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}

Formát prekladových súborov

Vytvorte jeden súbor JSON pre každú lokalizáciu. svelte-i18n podporuje vnorené kľúče a syntax ICU MessageFormat pre tvary množného čísla, premenné a výrazy select.

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}}"
  }
}
Kľúče pomenúvajte podľa toho, čo opisujú, nie podľa miesta zobrazenia: 'cart.itemCount' je lepšie než 'homepageCartLabel'. Kľúče by mali prežiť zmeny návrhu rozhrania.
3

Používajte preklady v komponentoch

Importujte úložisko $_ (alebo $format) zo svelte-i18n a používajte ho vo svojich šablónach Svelte. Úložisko je reaktívne – po zmene lokalizácie sa všetky preložené reťazce automaticky aktualizujú.

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>
$_ je úložisko Svelte – v šablónach musíte použiť predponu $. Zápis _('key') bez znaku dolára vráti objekt úložiska, nie preložený reťazec.

Prepínanie jazykov

Vytvorte výber jazyka prepojený s úložiskom $locale. Po zmene hodnoty načíta svelte-i18n správy novej lokalizácie a reaktívne aktualizuje všetky preložené reťazce.

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

Spracujte tvary množného čísla pomocou ICU MessageFormat

svelte-i18n používa na tvary množného čísla ICU MessageFormat – medzinárodný štandard, ktorý spracúva všetky kategórie množného čísla CLDR. Arabčina má 6 tvarov, ruština 4 a japončina 1. Definujte tvary potrebné pre Vaše cieľové jazyky a svelte-i18n automaticky vyberie ten správny.

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 {#個のアイテム}}"
}
Nikdy v komponentoch pevne nezapisujte logiku jednotného a množného čísla. Jazyky ako francúzština považujú 0 za jednotné číslo. Arabčina, ruština a poľština majú tvary množného čísla, ktoré angličtina nemá. Nechajte ich spracovať syntaxou množného čísla ICU.

Inteligentné náhradné lokalizácie pomocou svelte-i18n-locale-chain

Keď chýba kľúč, svelte-i18n prejde priamo na fallbackLocale – bez medzikroku. Používateľ pt-BR tak namiesto úplne vhodného prekladu pt-PT uvidí angličtinu. svelte-i18n-locale-chain to rieši inteligentnými reťazcami náhrad, ktoré hĺbkovo zlučujú správy z regionálnych variantov.

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 interne spravuje celé načítavanie správ. Nepoužívajte spolu s ním funkciu register() zo svelte-i18n – initLocaleChain rieši registráciu, načítavanie aj hĺbkové zlučovanie.

Automatizujte preklady

Po dokončení nastavenia i18n preložte svoje lokalizačné súbory pomocou AI. Vo svojom IDE požiadajte asistenta AI o preklad zdrojového súboru alebo použite CLI i18n Agent vo svojej pipeline CI/CD.

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
Prekladajte prírastkovo – po pridaní nových kľúčov do zdrojového súboru preložte iba rozdiel namiesto opätovného generovania všetkých súborov. Zachováte tak preklady skontrolované človekom.

Automatizujte kvalitu prekladu

Pomocou i18n-validate odhaľte chýbajúce kľúče a poškodené zástupné symboly ešte pred vydaním. Kým dorazia skutočné preklady, otestujte svoje rozhranie pseudoprekladmi pomocou i18n-pseudo.

Bežné nástrahy

Pretekanie lokalizácie pri SSR v SvelteKit

Úložiská svelte-i18n sú singletony. Pri SSR v SvelteKit zdieľajú súbežné požiadavky rovnaké úložisko – lokalizácia jedného používateľa tak môže preniknúť do odpovede iného. Riešenie: zavolajte locale.set() v hooku handle alebo vo funkcii load rozloženia, aby každá požiadavka získala správny kontext lokalizácie.

Používanie register() so svelte-i18n-locale-chain

Ak používate svelte-i18n-locale-chain, nepoužívajte funkciu register() zo svelte-i18n. initLocaleChain interne rieši celé načítavanie správ. Kombinácia oboch spôsobuje duplicitné alebo konfliktné načítavanie správ.

Chyby syntaxe ICU zlyhávajú bez hlásenia

Nespárovaná zložená zátvorka alebo chýbajúca kategória množného čísla v reťazcoch ICU MessageFormat spôsobí zlyhanie bez hlásenia – namiesto formátovaného výstupu sa zobrazí nespracovaný reťazec správy. Syntax ICU overujte vo svojej pipeline CI.

Bliknutie nepreloženého obsahu

Ak komponenty vykreslíte pred dokončením načítavania prekladov, používatelia uvidia nespracované kľúče. Rozloženie podmieňte pomocou {#if $isLoading}...{:else}...{/if}, aby sa až do pripravenia správ zobrazoval stav načítavania.

Odporúčaná štruktúra súborov

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

Vyskúšajte i18n Agent teraz

Potiahnite súbor na preklad sem

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

alebo kliknite a vyberte súbor

Cieľové jazyky

Bez registrácieOkamžitý odhad

Náhradná lokalizácia pomocou svelte-i18n-locale-chain

Keď v regionálnej lokalizácii, ako je pt-BR, chýba prekladový kľúč, svelte-i18n prejde priamo na predvolenú lokalizáciu namiesto toho, aby najprv skontroloval nadradenú lokalizáciu 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',
});

Úplný zoznam podporovaných frameworkov a 75 vstavaných reťazcov nájdete v našej príručke k náhradným lokalizáciám. Learn more →

Často kladené otázky