Skip to main content

SvelteKit i18n: internacionalizācijas iestatīšanas ceļvedis

No nulles līdz vairākām valodām: iestatiet svelte-i18n SvelteKit lietotnē ar ICU ziņojumu formātu, uz lokalizācijām balstītu maršrutēšanu un viedām atkāpšanās ķēdēm.

1

Instalēt svelte-i18n

svelte-i18n ir standarta internacionalizācijas bibliotēka Svelte un SvelteKit. Tā uzreiz nodrošina reaktīvas krātuves, ICU MessageFormat atbalstu un slinku lokalizāciju ielādi.

svelte-i18n daudzskaitlim un mainīgajiem izmanto ICU MessageFormat — to pašu standartu, ko FormatJS/react-intl. Ja pārejat no React, ziņojumu sintakse būs pazīstama.
Terminal
npm install svelte-i18n
2

Konfigurēt svelte-i18n

Izveidojiet i18n konfigurācijas failu, kas reģistrē lokalizācijas ar slinki ielādējamām importēšanas funkcijām. svelte-i18n iegūs lokalizācijas ziņojumus tikai tad, kad tā tiks aktivizēta.

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
});
i18n konfigurācijas fails jāimportē +layout.svelte pirms jebkura komponenta atveides. Ja tulkojumos tiek rādītas neapstrādātas atslēgas, piemēram, „nav.home“, konfigurācija nav importēta pietiekami agri.

SvelteKit izkārtojuma integrācija

Importējiet i18n konfigurāciju saknes izkārtojumā un aizsargājiet atveidi ar krātuvi $isLoading. Tas novērš īslaicīgu netulkotu atslēgu parādīšanos, kamēr lokalizācijas dati tiek ielādēti asinhroni.

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}

Uz lokalizācijām balstīta maršrutēšana SvelteKit

SEO draudzīgiem URL, piemēram, /en/about un /de/about, izmantojiet maršruta parametru [lang]. Iestatiet svelte-i18n lokalizāciju izkārtojuma funkcijā load pēc URL parametra.

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}

Tulkošanas faila formāts

Izveidojiet vienu JSON failu katrai lokalizācijai. svelte-i18n atbalsta ligzdotas atslēgas un ICU MessageFormat sintaksi daudzskaitlim, mainīgajiem un izvēles izteiksmēm.

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}}"
  }
}
Nosauciet atslēgas pēc tā, ko tās apraksta, nevis kur tās parādās: „cart.itemCount“ ir labāks par „homepageCartLabel“. Atslēgām jāiztur UI pārveide.
3

Izmantot tulkojumus komponentos

Importējiet krātuvi $_ (vai $format) no svelte-i18n un izmantojiet to Svelte veidnēs. Krātuve ir reaktīva: mainoties lokalizācijai, visas tulkotās virknes tiek atjauninātas automātiski.

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>
$_ ir Svelte krātuve, tādēļ veidnēs jāizmanto prefikss $. Rakstot _('key') bez dolārzīmes, tiek atgriezts krātuves objekts, nevis tulkotā virkne.

Valodas pārslēgšana

Izveidojiet valodas atlasītāju, kas saistīts ar krātuvi $locale. Mainoties vērtībai, svelte-i18n ielādē jaunās lokalizācijas ziņojumus un reaktīvi atjaunina visas tulkotās virknes.

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

Apstrādāt daudzskaitli ar ICU MessageFormat

svelte-i18n daudzskaitlim izmanto ICU MessageFormat — starptautisku standartu, kas apstrādā visas CLDR daudzskaitļa kategorijas. Arābu valodā ir 6 formas, krievu — 4, japāņu — 1. Definējiet mērķa valodām vajadzīgās formas, un svelte-i18n automātiski izvēlēsies pareizo.

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 {#個のアイテム}}"
}
Nekad komponentos tieši neierakstiet vienskaitļa un daudzskaitļa loģiku. Tādas valodas kā franču uzskata 0 par vienskaitli. Arābu, krievu un poļu valodā ir daudzskaitļa formas, kuru angļu valodā nav. Ļaujiet tās apstrādāt ICU daudzskaitļa sintaksei.

Viedas lokalizāciju atkāpšanās ķēdes ar svelte-i18n-locale-chain

Ja trūkst atslēgas, svelte-i18n uzreiz atkāpjas uz fallbackLocale — starpposma atkāpšanās nav. pt-BR lietotājs labu pt-PT tulkojumu vietā redz angļu valodu. svelte-i18n-locale-chain to novērš ar viedām atkāpšanās ķēdēm, kas dziļi sapludina reģionālo variantu ziņojumus.

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 visu ziņojumu ielādi pārvalda iekšēji. Neizmantojiet svelte-i18n funkciju register() līdztekus tam — initLocaleChain apstrādā reģistrēšanu, ielādi un dziļo sapludināšanu.

Automatizēt tulkošanu

Kad i18n iestatīšana ir pabeigta, tulkojiet lokalizācijas failus ar MI. IDE lūdziet MI asistentam iztulkot avota failu vai CI/CD konveijerā izmantojiet 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
Tulkojiet pakāpeniski — pievienojot avota failam jaunas atslēgas, tulkojiet tikai izmaiņas, nevis ģenerējiet visus failus no jauna. Tā saglabāsiet cilvēku pārskatītos tulkojumus.

Automatizēt tulkojumu kvalitāti

Ar i18n-validate pirms izlaišanas atrodiet trūkstošās atslēgas un bojātos vietturus. Kamēr īstie tulkojumi vēl nav gatavi, pārbaudiet UI ar i18n-pseudo pseidotulkojumiem.

Biežākās kļūdas

SSR lokalizācijas pārklāšanās SvelteKit

svelte-i18n krātuves ir vienobjekti. SvelteKit SSR vidē vienlaicīgi pieprasījumi koplieto vienu krātuvi, tādēļ viena lietotāja lokalizācija var nonākt cita atbildē. Risinājums: izsauciet locale.set() āķī handle vai izkārtojuma funkcijā load, lai katrs pieprasījums saņemtu pareizo lokalizācijas kontekstu.

register() lietošana ar svelte-i18n-locale-chain

Ja izmantojat svelte-i18n-locale-chain, neizmantojiet svelte-i18n funkciju register(). initLocaleChain visu ziņojumu ielādi pārvalda iekšēji. Abu sajaucot, ziņojumi tiek ielādēti divreiz vai rodas konflikti.

ICU sintakses kļūdas notiek klusām

Neatbilstoša figūriekava vai trūkstoša daudzskaitļa kategorija ICU MessageFormat virknēs izraisa klusu kļūmi — formatētas izvades vietā tiek rādīta neapstrādāta ziņojuma virkne. Validējiet ICU sintaksi CI konveijerā.

Īslaicīgi parādās netulkots saturs

Ja komponentus atveidojat, pirms tulkojumi ir ielādēti, lietotāji redz neapstrādātas atslēgas. Aizsargājiet izkārtojumu ar {#if $isLoading}...{:else}...{/if}, lai līdz ziņojumu gatavībai rādītu ielādes stāvokli.

Ieteicamā failu struktūra

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

Izmēģiniet i18n Agent tūlīt

Nometiet tulkošanas failu šeit

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

vai noklikšķiniet, lai izvēlētos

Mērķa valodas

Reģistrācija nav vajadzīgaTūlītēja tāme

Lokalizācijas atkāpšanās ar svelte-i18n-locale-chain

Ja reģionālajā lokalizācijā, piemēram, pt-BR, trūkst tulkojuma atslēgas, svelte-i18n uzreiz pāriet uz noklusējuma lokalizāciju, nevis vispirms pārbauda vecāklokalizāciju 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',
});

Pilnu atbalstīto sistēmu sarakstu un 75 iebūvētās ķēdes skatiet mūsu lokalizāciju atkāpšanās ceļvedī. Learn more →

Bieži uzdotie jautājumi