Skip to main content

SvelteKit i18n: Panduan Penyiapan Internasionalisasi

Dari nol hingga multibahasa: siapkan svelte-i18n dalam aplikasi SvelteKit dengan format pesan ICU, perutean berbasis bahasa, dan rantai fallback cerdas.

1

Instal svelte-i18n

svelte-i18n adalah library internasionalisasi standar untuk Svelte dan SvelteKit. Library ini menyediakan store reaktif, dukungan ICU MessageFormat, dan pemuatan bahasa secara lambat langsung dari paket.

svelte-i18n menggunakan ICU MessageFormat untuk bentuk jamak dan variabel—standar yang sama dengan FormatJS/react-intl. Jika Anda berasal dari React, sintaks pesannya akan terasa familiar.
Terminal
npm install svelte-i18n
2

Konfigurasikan svelte-i18n

Buat file konfigurasi i18n yang mendaftarkan bahasa dengan fungsi impor yang dimuat lambat. svelte-i18n hanya akan mengambil pesan suatu bahasa saat 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 harus mengimpor file konfigurasi i18n di +layout.svelte sebelum komponen apa pun dirender. Jika terjemahan menampilkan kunci mentah seperti 'nav.home', konfigurasi tidak diimpor cukup awal.

Integrasi Layout SvelteKit

Impor konfigurasi i18n di root layout dan lindungi rendering dengan store $isLoading. Ini mencegah kunci belum diterjemahkan berkedip saat data bahasa dimuat secara asinkron.

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}

Perutean Berbasis Bahasa di SvelteKit

Untuk URL ramah SEO seperti /en/about dan /de/about, gunakan parameter rute [lang]. Atur 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 File Terjemahan

Buat satu file JSON untuk setiap bahasa. svelte-i18n mendukung kunci bertingkat dan sintaks ICU MessageFormat untuk bentuk jamak, variabel, dan ekspresi 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}}"
  }
}
Namai kunci berdasarkan hal yang dijelaskannya, bukan tempat tampilnya: 'cart.itemCount' lebih baik daripada 'homepageCartLabel'. Kunci seharusnya tetap bertahan setelah UI didesain ulang.
3

Gunakan Terjemahan dalam Komponen

Impor store $_ (atau $format) dari svelte-i18n dan gunakan dalam templat Svelte. Store bersifat reaktif—saat bahasa berubah, semua string terjemahan diperbarui secara otomatis.

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>
$_ adalah store Svelte—Anda harus menggunakan awalan $ dalam templat. Menulis _('key') tanpa tanda dolar mengembalikan objek store, bukan string terjemahan.

Pengalihan Bahasa

Buat pemilih bahasa yang terikat ke store $locale. Saat nilai berubah, svelte-i18n memuat pesan bahasa baru dan memperbarui semua string 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

Tangani Bentuk Jamak dengan ICU MessageFormat

svelte-i18n menggunakan ICU MessageFormat untuk bentuk jamak—standar internasional yang menangani semua kategori bentuk jamak CLDR. Bahasa Arab memiliki 6 bentuk, Rusia 4, dan Jepang 1. Tentukan bentuk yang diperlukan bahasa target dan svelte-i18n akan memilih bentuk yang benar secara otomatis.

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 pernah meng-hardcode logika tunggal/jamak dalam komponen. Bahasa seperti Prancis menganggap 0 sebagai tunggal. Arab, Rusia, dan Polski memiliki bentuk jamak yang tidak ada dalam bahasa Inggris. Biarkan sintaks bentuk jamak ICU menanganinya.

Fallback Bahasa Cerdas dengan svelte-i18n-locale-chain

svelte-i18n langsung beralih ke fallbackLocale saat kunci hilang—tidak ada fallback perantara. Pengguna pt-BR melihat bahasa Inggris, bukan terjemahan pt-PT yang masih sesuai. svelte-i18n-locale-chain memperbaikinya dengan rantai fallback cerdas yang menggabungkan pesan secara mendalam dari varian regional.

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 mengelola semua pemuatan pesan secara internal. Jangan gunakan fungsi register() svelte-i18n bersamanya—initLocaleChain menangani pendaftaran, pemuatan, dan penggabungan mendalam.

Otomatiskan Penerjemahan

Setelah penyiapan i18n selesai, terjemahkan file bahasa dengan AI. Di IDE, minta asisten AI menerjemahkan file sumber atau gunakan CLI i18n Agent di pipeline 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
Terjemahkan secara bertahap—saat menambahkan kunci baru ke file sumber, terjemahkan hanya diff, bukan membuat ulang semua file. Ini mempertahankan terjemahan yang telah ditinjau manusia.

Otomatiskan Kualitas Terjemahan

Temukan kunci hilang dan placeholder rusak sebelum dirilis dengan i18n-validate. Uji UI dengan terjemahan semu menggunakan i18n-pseudo sebelum terjemahan asli tersedia.

Kesalahan Umum

Kebocoran Bahasa SSR di SvelteKit

Store svelte-i18n adalah singleton. Dalam SSR SvelteKit, permintaan bersamaan menggunakan store yang sama—bahasa satu pengguna dapat bocor ke respons pengguna lain. Perbaikan: panggil locale.set() dalam hook handle atau fungsi load layout agar setiap permintaan mendapat konteks bahasa yang benar.

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

Jangan gunakan fungsi register() svelte-i18n jika Anda menggunakan svelte-i18n-locale-chain. initLocaleChain menangani semua pemuatan pesan secara internal. Mencampur keduanya menyebabkan pemuatan pesan duplikat atau bertentangan.

Kesalahan Sintaks ICU Gagal Tanpa Pesan

Kurung kurawal tidak cocok atau kategori bentuk jamak yang hilang dalam string ICU MessageFormat menyebabkan kegagalan tanpa pesan—string pesan mentah ditampilkan alih-alih keluaran berformat. Validasi sintaks ICU dalam pipeline CI.

Konten Belum Diterjemahkan Berkedip

Jika komponen dirender sebelum terjemahan selesai dimuat, pengguna akan melihat kunci mentah. Lindungi layout dengan {#if $isLoading}...{:else}...{/if} untuk menampilkan status pemuatan hingga pesan siap.

Struktur File yang Disarankan

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

Coba i18n Agent Sekarang

Lepaskan file terjemahan Anda di sini

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

atau klik untuk menjelajahi

Bahasa target

Tidak perlu mendaftarEstimasi instan

Fallback Bahasa dengan svelte-i18n-locale-chain

Saat kunci terjemahan tidak ada dalam bahasa regional seperti pt-BR, svelte-i18n langsung beralih ke bahasa default alih-alih 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 Fallback Bahasa kami untuk daftar lengkap framework yang didukung dan 75 rantai bawaan. Learn more →

Pertanyaan yang Sering Diajukan