Skip to main content

SvelteKit i18n: Průvodce nastavením internacionalizace

Od nuly k vícejazyčnosti: nastavte svelte-i18n ve Vaší aplikaci SvelteKit s formátem zpráv ICU, routováním podle lokalizace a chytrými fallback řetězci.

1

Nainstalovat svelte-i18n

svelte-i18n je standardní knihovna pro internacionalizaci ve Svelte a SvelteKit. Poskytuje reaktivní storey, podporu ICU MessageFormat a lazy načítání lokalizací ihned po instalaci.

svelte-i18n používá ICU MessageFormat pro plurály a proměnné — stejný standard, který používá FormatJS/react-intl. Pokud přecházíte z Reactu, syntaxe zpráv Vám bude povědomá.
Terminal
npm install svelte-i18n
2

Nakonfigurovat svelte-i18n

Vytvořte konfigurační soubor i18n, který zaregistruje Vaše lokalizace pomocí lazy-loaded import funkcí. svelte-i18n stáhne zprávy dané lokalizace až ve chvíli, kdy je tato lokalizace aktivována.

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
});
Svůj konfigurační soubor i18n musíte importovat v +layout.svelte dříve, než se vykreslí jakákoli komponenta. Pokud se překlady zobrazují jako holé klíče, například 'nav.home', konfigurace nebyla importována dostatečně brzy.

Integrace do layoutu SvelteKit

Importujte svůj konfigurační soubor i18n v kořenovém layoutu a podmiňte vykreslování pomocí storeu $isLoading. Tím zabráníte záblesku nepřeložených klíčů při asynchronním načítání dat lokalizace.

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}

Routování podle lokalizace v SvelteKit

Pro URL vhodné pro SEO, jako /en/about a /de/about, použijte parametr routy [lang]. Nastavte lokalizaci svelte-i18n v load funkci layoutu podle parametru v 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 souborů s překlady

Vytvořte jeden JSON soubor pro každou lokalizaci. svelte-i18n podporuje vnořené klíče a syntaxi ICU MessageFormat pro plurály, proměnné a select výrazy.

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}}"
  }
}
Pojmenujte klíče podle toho, co popisují, ne podle toho, kde se zobrazují: 'cart.itemCount' je lepší než 'homepageCartLabel'. Klíče by měly přežít redesign UI.
3

Použít překlady v komponentách

Importujte store $_ (nebo $format) ze svelte-i18n a používejte jej ve svých Svelte šablonách. Store je reaktivní — když se změní lokalizace, všechny přeložené řetězce se 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 Svelte store — v šablonách musíte použít předponu $. Volání _('key') bez dolaru vrátí objekt storeu, ne přeložený řetězec.

Přepínání jazyka

Vytvořte selektor jazyka, který se váže na store $locale. Když se hodnota změní, svelte-i18n načte zprávy pro novou lokalizaci a reaktivně aktualizuje všechny přeložené řetězce.

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

Práce s plurály pomocí ICU MessageFormat

svelte-i18n používá ICU MessageFormat pro pluralizaci — mezinárodní standard, který obsluhuje všechny pluralizační kategorie CLDR. Arabština má 6 forem, ruština 4, japonština 1. Definujte formy, které Vaše cílové jazyky potřebují, a svelte-i18n automaticky vybere správnou.

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 nezakódujte logiku singuláru/plurálu přímo v komponentách. Jazyky jako francouzština považují 0 za singulár. Arabština, ruština a polština mají pluralizační formy, které angličtina nemá. Nechte to na syntaxi ICU plurálů.

Chytré fallbacky lokalizací se svelte-i18n-locale-chain

svelte-i18n při chybějícím klíči spadne rovnou na fallbackLocale — žádný mezistupeň neexistuje. Uživatel pt-BR tak uvidí angličtinu místo zcela použitelných překladů pt-PT. svelte-i18n-locale-chain to řeší chytrými fallback řetězci, které provádějí deep-merge zpráv z regionálních variant.

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 spravuje veškeré načítání zpráv interně. Nepoužívejte jej společně s funkcí register() ze svelte-i18n — initLocaleChain se postará o registraci, načítání i deep-merge.

Automatizovat překlady

Jakmile máte i18n nastavené, přeložte své soubory lokalizací pomocí AI. V IDE požádejte svého AI asistenta o překlad zdrojového souboru, nebo v CI/CD pipeline použijte i18n Agent CLI.

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
Překládejte inkrementálně — když přidáte nové klíče do zdrojového souboru, přeložte jen diff, místo abyste znovu generovali všechny soubory. Tím zachováte překlady zkontrolované člověkem.

Automatizovat kvalitu překladu

Zachyťte chybějící klíče a rozbité placeholdery dřív, než se nasadí, pomocí i18n-validate. Otestujte UI s pseudopřeklady pomocí i18n-pseudo ještě předtím, než dorazí skutečné překlady.

Běžná úskalí

Únik lokalizace v SSR v SvelteKit

Storey svelte-i18n jsou singletony. V SvelteKit SSR sdílejí souběžné požadavky stejný store — lokalizace jednoho uživatele se může „přelít“ do odpovědi jiného. Řešení: zavolejte locale.set() v hooku handle nebo v load funkci layoutu, aby každý požadavek dostal správný kontext lokalizace.

Používání register() se svelte-i18n-locale-chain

Pokud používáte svelte-i18n-locale-chain, nepoužívejte funkci register() ze svelte-i18n. initLocaleChain interně zajišťuje veškeré načítání zpráv. Kombinování obou přístupů způsobí duplicitní nebo konfliktní načítání zpráv.

Chyby syntaxe ICU tiše selžou

Nespárovaná závorka nebo chybějící pluralizační kategorie v řetězcích ICU MessageFormat způsobí tiché selhání — místo naformátovaného výstupu se zobrazí surový text zprávy. Validujte syntaxi ICU ve své CI pipeline.

Záblesk nepřeloženého obsahu

Pokud vykreslíte komponenty dřív, než se dokončí načítání překladů, uživatelé uvidí holé klíče. Podmiňte layout pomocí {#if $isLoading}...{:else}...{/if}, aby se zobrazil stav načítání, dokud nejsou zprávy připravené.

Doporučená struktura souborů

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

Vyzkoušejte i18n Agent nyní

Sem přetáhněte svůj překladový soubor

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

nebo klikněte a vyberte soubor

Cílové jazyky

Bez registraceOkamžitý odhad

Fallback lokalizací se svelte-i18n-locale-chain

Když v regionální lokalizaci, jako je pt-BR, chybí překladový klíč, svelte-i18n skočí rovnou na výchozí lokalizaci, místo aby nejdřív zkontroloval nadřazenou lokalizaci 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',
});

Podívejte se do našeho průvodce Locale Fallback, kde najdete úplný seznam podporovaných frameworků a 75 vestavěných řetězců. Learn more →

Často kladené otázky