Skip to main content

SvelteKit i18n: vodnik za nastavitev internacionalizacije

Od začetka do večjezične aplikacije: nastavite svelte-i18n v svoji aplikaciji SvelteKit z obliko sporočil ICU, usmerjanjem glede na področne nastavitve in pametnimi verigami nadomestnih področnih nastavitev.

1

Namestite svelte-i18n

svelte-i18n je standardna knjižnica za internacionalizacijo ogrodij Svelte in SvelteKit. Že privzeto zagotavlja odzivne shrambe, podporo za ICU MessageFormat in zakasnjeno nalaganje področnih nastavitev.

svelte-i18n uporablja ICU MessageFormat za množinske oblike in spremenljivke — isti standard, kot ga uporabljata FormatJS/react-intl. Če prihajate iz okolja React, Vam bo skladnja sporočil znana.
Terminal
npm install svelte-i18n
2

Nastavite svelte-i18n

Ustvarite konfiguracijsko datoteko i18n, ki registrira Vaše področne nastavitve s funkcijami za zakasnjeni uvoz. svelte-i18n pridobi sporočila za posamezne področne nastavitve šele, ko so te aktivirane.

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
});
Konfiguracijsko datoteko i18n morate uvoziti v +layout.svelte, preden se izriše katera koli komponenta. Če so namesto prevodov prikazani neobdelani ključi, kot je 'nav.home', konfiguracija ni bila uvožena dovolj zgodaj.

Integracija z razporeditvijo SvelteKit

Uvozite konfiguracijo i18n v korensko razporeditev in izrisovanje pogojite s shrambo $isLoading. Tako preprečite kratkotrajen prikaz neprevedenih ključev med asinhronim nalaganjem podatkov področnih nastavitev.

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}

Usmerjanje glede na področne nastavitve v SvelteKit

Za naslove URL, prijazne iskalnikom, kot sta /en/about in /de/about, uporabite parameter poti [lang]. Področne nastavitve svelte-i18n določite v funkciji load razporeditve glede na parameter naslova 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}

Oblika prevodnih datotek

Za vsake področne nastavitve ustvarite eno datoteko JSON. svelte-i18n podpira ugnezdene ključe in skladnjo ICU MessageFormat za množinske oblike, spremenljivke in izraze 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}}"
  }
}
Ključe poimenujte glede na to, kaj opisujejo, in ne glede na mesto prikaza: 'cart.itemCount' je ustreznejši kot 'homepageCartLabel'. Ključi naj ostanejo uporabni tudi po prenovi uporabniškega vmesnika.
3

Uporabite prevode v komponentah

Uvozite shrambo $_ (ali $format) iz svelte-i18n in jo uporabite v predlogah Svelte. Shramba je odzivna — ko se področne nastavitve spremenijo, se vsi prevedeni nizi samodejno posodobijo.

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 shramba Svelte — v predlogah morate uporabiti predpono $. Zapis _('key') brez znaka za dolar vrne predmet shrambe in ne prevedenega niza.

Preklapljanje med jeziki

Izdelajte izbirnik jezika, povezan s shrambo $locale. Ko se vrednost spremeni, svelte-i18n naloži sporočila za nove področne nastavitve in odzivno posodobi vse prevedene nize.

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

Obravnavajte množinske oblike z ICU MessageFormat

svelte-i18n za množinske oblike uporablja ICU MessageFormat — mednarodni standard, ki podpira vse množinske kategorije CLDR. Arabščina ima 6 oblik, ruščina 4, japonščina pa 1. Določite oblike, ki jih potrebujejo Vaši ciljni jeziki, svelte-i18n pa samodejno izbere pravilno.

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 {#個のアイテム}}"
}
Logike za ednino in množino nikoli ne zapisujte neposredno v komponente. Jeziki, kot je francoščina, število 0 obravnavajo kot ednino. Arabščina, ruščina in poljščina imajo množinske oblike, ki jih angleščina nima. Njihovo izbiro prepustite množinski skladnji ICU.

Pametne nadomestne področne nastavitve s svelte-i18n-locale-chain

Ko ključ manjka, svelte-i18n preide neposredno na fallbackLocale — vmesnih nadomestnih področnih nastavitev ni. Uporabniku z nastavitvijo pt-BR se zato namesto povsem ustreznih prevodov pt-PT prikaže angleščina. svelte-i18n-locale-chain to odpravi s pametnimi verigami nadomestnih področnih nastavitev, ki globoko združujejo sporočila regionalnih različic.

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 interno upravlja celotno nalaganje sporočil. Ob njem ne uporabljajte funkcije register() iz svelte-i18n — initLocaleChain poskrbi za registracijo, nalaganje in globoko združevanje.

Avtomatizirajte prevajanje

Ko je nastavitev i18n končana, svoje datoteke področnih nastavitev prevedite z umetno inteligenco. V svojem razvojnem okolju prosite pomočnika z umetno inteligenco, naj prevede izvorno datoteko, ali pa v postopku CI/CD uporabite orodje 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
Prevajajte postopoma — ko v izvorno datoteko dodate nove ključe, prevedite samo razlike, namesto da znova ustvarite vse datoteke. Tako ohranite prevode, ki jih je že pregledal človek.

Avtomatizirajte preverjanje kakovosti prevodov

Z orodjem i18n-validate odkrijte manjkajoče ključe in poškodovane ograde, preden dosežejo produkcijo. Z orodjem i18n-pseudo preizkusite svoj uporabniški vmesnik s psevdoprevodi, še preden prispejo pravi prevodi.

Pogoste pasti

Uhajanje področnih nastavitev med zahtevami SSR v SvelteKit

Shrambe svelte-i18n so enojčki. Pri strežniškem izrisovanju SvelteKit sočasne zahteve uporabljajo isto shrambo, zato lahko področne nastavitve enega uporabnika preidejo v odgovor drugega. Rešitev: pokličite locale.set() v prestrezniku handle ali funkciji load razporeditve, da vsaka zahteva dobi pravilen kontekst področnih nastavitev.

Uporaba register() s svelte-i18n-locale-chain

Če uporabljate svelte-i18n-locale-chain, ne uporabljajte funkcije register() iz svelte-i18n. initLocaleChain interno poskrbi za celotno nalaganje sporočil. Sočasna uporaba obeh povzroči podvojeno ali nasprotujoče si nalaganje sporočil.

Napake v skladnji ICU ostanejo neopažene

Neujemajoč se zaviti oklepaj ali manjkajoča množinska kategorija v nizih ICU MessageFormat povzroči neopazno napako — namesto oblikovanega rezultata se prikaže neobdelani niz sporočila. Skladnjo ICU preverjajte v postopku CI.

Kratkotrajen prikaz neprevedene vsebine

Če komponente izrišete, preden se prevodi naložijo, uporabniki vidijo neobdelane ključe. Razporeditev pogojite z {#if $isLoading}...{:else}...{/if}, da je prikazano stanje nalaganja, dokler sporočila niso pripravljena.

Priporočena struktura datotek

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

Preizkusite i18n Agent zdaj

Spustite prevajalsko datoteko sem

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

ali kliknite za izbiro

Ciljni jeziki

Registracija ni potrebnaTakojšnja ocena

Nadomestne področne nastavitve s svelte-i18n-locale-chain

Ko v regionalnih področnih nastavitvah, kot je pt-BR, manjka prevodni ključ, svelte-i18n takoj preide na privzete področne nastavitve, namesto da bi najprej preveril nadrejene področne nastavitve 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',
});

Celoten seznam podprtih ogrodij in 75 vgrajenih verig najdete v našem vodniku po nadomestnih področnih nastavitvah. Learn more →

Pogosta vprašanja