Skip to main content

SvelteKit i18n: vodič za postavljanje internacionalizacije

Od početka do višejezične aplikacije: postavite svelte-i18n u aplikaciji SvelteKit uz format poruka ICU, usmjeravanje prema lokalnoj postavci i pametne zamjenske lance.

1

Instalirajte svelte-i18n

svelte-i18n standardna je biblioteka za internacionalizaciju Sveltea i SvelteKita. Odmah nudi reaktivna spremišta, podršku za ICU MessageFormat i odgođeno učitavanje lokalnih postavki.

svelte-i18n za množinu i varijable upotrebljava ICU MessageFormat — isti standard kao FormatJS/react-intl. Ako prelazite s Reacta, sintaksa poruka bit će Vam poznata.
Terminal
npm install svelte-i18n
2

Konfigurirajte svelte-i18n

Izradite konfiguracijsku datoteku i18n koja registrira Vaše lokalne postavke funkcijama za odgođeni uvoz. svelte-i18n dohvatit će poruke neke postavke tek kada je aktivirate.

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
});
Konfiguracijsku datoteku i18n morate uvesti u +layout.svelte prije iscrtavanja bilo koje komponente. Ako se prijevodi prikazuju kao neobrađeni ključevi poput 'nav.home', konfiguracija nije uvezena dovoljno rano.

Integracija s rasporedom SvelteKita

Uvezite konfiguraciju i18n u korijenski raspored i spremištem $isLoading uvjetujte iscrtavanje. Time sprječavate kratkotrajni prikaz neprevedenih ključeva dok se podaci lokalne postavke učitavaju asinkrono.

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}

Usmjeravanje prema lokalnoj postavci u SvelteKitu

Za URL-ove prilagođene SEO-u, poput /en/about i /de/about, upotrijebite parametar rute [lang]. Lokalnu postavku biblioteke svelte-i18n odredite u funkciji load rasporeda prema parametru URL-a.

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 datoteka prijevoda

Izradite po jednu JSON datoteku za svaku lokalnu postavku. svelte-i18n podržava ugniježđene ključeve i sintaksu ICU MessageFormat za množinu, varijable i 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čeve imenujte prema onome što opisuju, a ne prema mjestu na kojem se pojavljuju: 'cart.itemCount' bolje je od 'homepageCartLabel'. Ključevi bi trebali ostati valjani i nakon redizajna korisničkog sučelja.
3

Upotrebljavajte prijevode u komponentama

Uvezite spremište $_ (ili $format) iz biblioteke svelte-i18n i upotrebljavajte ga u Svelte predlošcima. Spremište je reaktivno — pri promjeni lokalne postavke svi se prevedeni tekstovi automatski ažuriraju.

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>
$_ spremište je Sveltea, pa u predlošcima morate upotrebljavati prefiks $. Ako napišete _('key') bez znaka dolara, dobit ćete objekt spremišta umjesto prevedenog teksta.

Promjena jezika

Izradite birač jezika povezan sa spremištem $locale. Kada se vrijednost promijeni, svelte-i18n učitava poruke nove lokalne postavke i reaktivno ažurira sve prevedene tekstove.

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

Obradite množinu s pomoću ICU MessageFormata

svelte-i18n za množinu upotrebljava ICU MessageFormat — međunarodni standard koji obrađuje sve kategorije množine CLDR. Arapski ima 6 oblika, ruski 4, a japanski 1. Definirajte oblike koje trebaju Vaši ciljni jezici, a svelte-i18n automatski će odabrati ispravan.

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 {#個のアイテム}}"
}
Nikada nemojte izravno ugrađivati logiku jednine i množine u komponente. Jezici poput francuskog broj 0 smatraju jedninom, a arapski, ruski i poljski imaju oblike množine kojih u engleskom nema. Odabir prepustite sintaksi množine ICU.

Pametne zamjenske lokalne postavke uz svelte-i18n-locale-chain

Kada nedostaje ključ, svelte-i18n odmah prelazi na fallbackLocale — nema međukoraka. Korisnik s postavkom pt-BR vidi engleski umjesto valjanih prijevoda za pt-PT. svelte-i18n-locale-chain to rješava pametnim zamjenskim lancima koji dubinski spajaju poruke regionalnih inačica.

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 cjelokupnim učitavanjem poruka. Nemojte istodobno upotrebljavati funkciju register() biblioteke svelte-i18n — initLocaleChain obavlja registraciju, učitavanje i dubinsko spajanje.

Automatizirajte prevođenje

Nakon što dovršite postavljanje i18n-a, prevedite datoteke lokalnih postavki s pomoću AI-ja. U svojem IDE-u zatražite od AI pomoćnika da prevede izvornu datoteku ili upotrijebite i18n Agent CLI u svojem CI/CD pipelineu.

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
Prevodite postupno — kada u izvornu datoteku dodate nove ključeve, prevedite samo razliku umjesto ponovnog generiranja svih datoteka. Tako ćete sačuvati prijevode koje su pregledali ljudi.

Automatizirajte provjeru kvalitete prijevoda

Alatom i18n-validate otkrijte ključeve koji nedostaju i neispravna rezervirana mjesta prije objave. Korisničko sučelje testirajte pseudoprijevodima uz i18n-pseudo prije nego što stignu stvarni prijevodi.

Uobičajene zamke

Prelijevanje lokalne postavke između SSR zahtjeva u SvelteKitu

Spremišta svelte-i18n singleton objekti su. U SSR-u SvelteKita istodobni zahtjevi dijele isto spremište, pa se lokalna postavka jednog korisnika može preliti u odgovor drugoga. Rješenje: pozovite locale.set() u hooku handle ili funkciji load rasporeda kako bi svaki zahtjev dobio ispravan kontekst lokalne postavke.

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

Nemojte upotrebljavati funkciju register() biblioteke svelte-i18n ako upotrebljavate svelte-i18n-locale-chain. initLocaleChain interno obavlja cjelokupno učitavanje poruka. Kombiniranje tih pristupa uzrokuje dvostruko ili proturječno učitavanje poruka.

Pogreške sintakse ICU prolaze bez upozorenja

Neuparena vitičasta zagrada ili izostavljena kategorija množine u nizovima ICU MessageFormat uzrokuje tihi neuspjeh — umjesto oblikovanog rezultata prikazuje se neobrađena poruka. Provjeravajte sintaksu ICU u svojem CI pipelineu.

Kratkotrajan prikaz neprevedenog sadržaja

Ako komponente iscrtate prije dovršetka učitavanja prijevoda, korisnici će vidjeti neobrađene ključeve. Raspored zaštitite izrazom {#if $isLoading}...{:else}...{/if} kako bi prikazivao stanje učitavanja dok poruke ne budu spremne.

Preporučena struktura datoteka

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

Isprobajte i18n Agent odmah

Povucite datoteku za prijevod ovdje

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

ili kliknite za odabir

Ciljni jezici

Registracija nije potrebnaProcjena odmah

Zamjenske lokalne postavke uz svelte-i18n-locale-chain

Kada u regionalnoj lokalnoj postavci poput pt-BR nedostaje ključ prijevoda, svelte-i18n odmah prelazi na zadanu postavku umjesto da prvo provjeri nadređenu postavku 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',
});

U našem vodiču za zamjenske lokalne postavke pogledajte cjelovit popis podržanih razvojnih okvira i 75 ugrađenih lanaca. Learn more →

Često postavljana pitanja