Skip to main content

SvelteKit i18n: Panduan Persediaan Pengantarabangsaan

Daripada sifar hingga berbilang bahasa: sediakan svelte-i18n dalam aplikasi SvelteKit dengan format mesej ICU, penghalaan berasaskan bahasa, dan rantaian sandaran pintar.

1

Pasang svelte-i18n

svelte-i18n ialah pustaka pengantarabangsaan standard untuk Svelte dan SvelteKit. Pustaka ini menyediakan gedung reaktif, sokongan ICU MessageFormat, dan pemuatan bahasa secara malas terus daripada pakej.

svelte-i18n menggunakan ICU MessageFormat untuk bentuk jamak dan pemboleh ubah—standard yang sama dengan FormatJS/react-intl. Jika anda berasal daripada React, sintaks mesejnya akan terasa biasa.
Terminal
npm install svelte-i18n
2

Konfigurasikan svelte-i18n

Cipta fail konfigurasi i18n yang mendaftarkan bahasa dengan fungsi import yang dimuatkan secara malas. svelte-i18n hanya akan mengambil mesej sesuatu bahasa apabila bahasa tersebut diaktifkan.

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
});
Anda perlu mengimport fail konfigurasi i18n dalam +layout.svelte sebelum sebarang komponen dipaparkan. Jika terjemahan memaparkan kekunci mentah seperti 'nav.home', konfigurasi tidak diimport cukup awal.

Penyepaduan Layout SvelteKit

Import konfigurasi i18n dalam root layout dan lindungi pemaparan dengan gedung $isLoading. Ini mencegah kekunci belum diterjemahkan berkelip semasa data bahasa dimuatkan secara tidak segerak.

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}

Penghalaan Berasaskan Bahasa dalam SvelteKit

Untuk URL mesra SEO seperti /en/about dan /de/about, gunakan parameter laluan [lang]. Tetapkan bahasa svelte-i18n dalam fungsi load layout berdasarkan parameter 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}

Format Fail Terjemahan

Cipta satu fail JSON bagi setiap bahasa. svelte-i18n menyokong kekunci tersarang dan sintaks ICU MessageFormat untuk bentuk jamak, pemboleh ubah, dan ungkapan 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}}"
  }
}
Namakan kekunci berdasarkan perkara yang diterangkannya, bukan tempat ia muncul: 'cart.itemCount' lebih baik daripada 'homepageCartLabel'. Kekunci sepatutnya kekal selepas UI direka semula.
3

Gunakan Terjemahan dalam Komponen

Import gedung $_ (atau $format) daripada svelte-i18n dan gunakannya dalam templat Svelte. Gedung ini reaktif—apabila bahasa berubah, semua rentetan terjemahan dikemas kini secara automatik.

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>
$_ ialah gedung Svelte—anda perlu menggunakan awalan $ dalam templat. Menulis _('key') tanpa tanda dolar mengembalikan objek gedung, bukan rentetan terjemahan.

Penukaran Bahasa

Bina pemilih bahasa yang terikat pada gedung $locale. Apabila nilai berubah, svelte-i18n memuatkan mesej bahasa baharu dan mengemas kini semua rentetan terjemahan secara reaktif.

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

Kendalikan Bentuk Jamak dengan ICU MessageFormat

svelte-i18n menggunakan ICU MessageFormat untuk bentuk jamak—standard antarabangsa yang mengendalikan semua kategori bentuk jamak CLDR. Bahasa Arab mempunyai 6 bentuk, Rusia 4, dan Jepun 1. Takrifkan bentuk yang diperlukan bahasa sasaran dan svelte-i18n akan memilih bentuk yang betul secara automatik.

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 {#個のアイテム}}"
}
Jangan sekali-kali mengkod keras logik tunggal/jamak dalam komponen. Bahasa seperti Perancis menganggap 0 sebagai tunggal. Arab, Rusia, dan Poland mempunyai bentuk jamak yang tiada dalam bahasa Inggeris. Biarkan sintaks bentuk jamak ICU mengendalikannya.

Sandaran Bahasa Pintar dengan svelte-i18n-locale-chain

svelte-i18n terus beralih kepada fallbackLocale apabila kekunci hilang—tiada sandaran perantaraan. Pengguna pt-BR melihat bahasa Inggeris, bukan terjemahan pt-PT yang masih sesuai. svelte-i18n-locale-chain membaikinya dengan rantaian sandaran pintar yang menggabungkan mesej secara mendalam daripada varian serantau.

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 mengurus semua pemuatan mesej secara dalaman. Jangan gunakan fungsi register() svelte-i18n bersamanya—initLocaleChain mengendalikan pendaftaran, pemuatan, dan penggabungan mendalam.

Automatikkan Terjemahan

Selepas persediaan i18n selesai, terjemah fail bahasa dengan AI. Dalam IDE, minta pembantu AI menterjemah fail sumber atau gunakan CLI i18n Agent dalam saluran 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
Terjemah secara berperingkat—apabila menambahkan kekunci baharu pada fail sumber, terjemah hanya perbezaannya dan bukannya menjana semula semua fail. Ini mengekalkan terjemahan yang telah disemak manusia.

Automatikkan Kualiti Terjemahan

Kesan kekunci hilang dan ruang letak rosak sebelum dikeluarkan dengan i18n-validate. Uji UI dengan terjemahan pseudo menggunakan i18n-pseudo sebelum terjemahan sebenar tersedia.

Kesilapan Umum

Kebocoran Bahasa SSR dalam SvelteKit

Gedung svelte-i18n ialah singleton. Dalam SSR SvelteKit, permintaan serentak menggunakan gedung yang sama—bahasa seorang pengguna boleh bocor ke respons pengguna lain. Penyelesaian: panggil locale.set() dalam cangkuk handle atau fungsi load layout supaya setiap permintaan mendapat konteks bahasa yang betul.

Menggunakan register() dengan svelte-i18n-locale-chain

Jangan gunakan fungsi register() svelte-i18n jika anda menggunakan svelte-i18n-locale-chain. initLocaleChain mengendalikan semua pemuatan mesej secara dalaman. Mencampurkan kedua-duanya menyebabkan pemuatan mesej pendua atau bercanggah.

Ralat Sintaks ICU Gagal Tanpa Mesej

Kurungan keriting tidak sepadan atau kategori bentuk jamak yang hilang dalam rentetan ICU MessageFormat menyebabkan kegagalan tanpa mesej—rentetan mesej mentah dipaparkan dan bukannya output berformat. Sahkan sintaks ICU dalam saluran CI.

Kandungan Belum Diterjemahkan Berkelip

Jika komponen dipaparkan sebelum terjemahan selesai dimuatkan, pengguna akan melihat kekunci mentah. Lindungi layout dengan {#if $isLoading}...{:else}...{/if} untuk memaparkan keadaan pemuatan sehingga mesej siap.

Struktur Fail yang Disyorkan

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

Cuba i18n Agent Sekarang

Lepaskan fail terjemahan anda di sini

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

atau klik untuk semak imbas

Bahasa sasaran

Tidak perlu mendaftarAnggaran serta-merta

Sandaran Bahasa dengan svelte-i18n-locale-chain

Apabila kekunci terjemahan tiada dalam bahasa serantau seperti pt-BR, svelte-i18n terus beralih kepada bahasa lalai dan bukannya memeriksa bahasa induk pt terlebih dahulu.

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',
});

Lihat Panduan Sandaran Bahasa kami untuk senarai lengkap rangka kerja yang disokong dan 75 rantaian terbina dalam. Learn more →

Soalan Lazim