Skip to main content

SvelteKit i18n: Uluslararasılaştırma kurulum rehberi

Sıfırdan çok dilli bir uygulamaya: SvelteKit uygulamanızda ICU ileti formatı, yerel ayara dayalı yönlendirme ve akıllı yedek zincirleriyle svelte-i18n'i kurun.

1

svelte-i18n'i yükleyin

svelte-i18n, Svelte ve SvelteKit için standart uluslararasılaştırma kütüphanesidir. Kutudan çıktığı hâliyle tepkisel store'lar, ICU MessageFormat desteği ve gecikmeli yerel ayar yükleme özellikleri sunar.

svelte-i18n, çoğullar ve değişkenler için FormatJS/react-intl ile aynı standart olan ICU MessageFormat'ı kullanır. React'ten geçiş yapıyorsanız ileti söz dizimi size tanıdık gelecektir.
Terminal
npm install svelte-i18n
2

svelte-i18n'i yapılandırın

Yerel ayarlarınızı gecikmeli yüklenen import işlevleriyle kaydeden bir i18n yapılandırma dosyası oluşturun. svelte-i18n, bir yerel ayarın iletilerini yalnızca o yerel ayar etkinleştirildiğinde getirir.

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
});
Herhangi bir bileşen oluşturulmadan önce i18n yapılandırma dosyanızı +layout.svelte içine import etmelisiniz. Çeviriler 'nav.home' gibi ham anahtarlar gösteriyorsa yapılandırma yeterince erken import edilmemiştir.

SvelteKit düzeniyle entegrasyon

i18n yapılandırmanızı kök düzene import edin ve oluşturma işlemini $isLoading store'u ile koruyun. Bu, yerel ayar verileri eşzamansız olarak yüklenirken çevrilmemiş anahtarların kısa süreliğine görünmesini önler.

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}

SvelteKit'te yerel ayara dayalı yönlendirme

/en/about ve /de/about gibi SEO dostu URL'ler için bir [lang] rota parametresi kullanın. Düzenin load işlevinde URL parametresine göre svelte-i18n yerel ayarını belirleyin.

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}

Çeviri dosyası formatı

Her yerel ayar için bir JSON dosyası oluşturun. svelte-i18n; iç içe anahtarları ve çoğullar, değişkenler ve select ifadeleri için ICU MessageFormat söz dizimini destekler.

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}}"
  }
}
Anahtarları göründükleri yere göre değil tanımladıkları şeye göre adlandırın: 'homepageCartLabel' yerine 'cart.itemCount' daha uygundur. Anahtarlar arayüz yeniden tasarımlarından etkilenmemelidir.
3

Çevirileri bileşenlerde kullanın

$_ store'unu (veya $format'ı) svelte-i18n'den import edin ve Svelte şablonlarınızda kullanın. Store tepkiseldir; yerel ayar değiştiğinde tüm çevrilmiş dizeler otomatik olarak güncellenir.

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>
$_ bir Svelte store'udur; şablonlarda $ ön ekini kullanmalısınız. Dolar işareti olmadan _('key') yazmak çevrilmiş dizeyi değil store nesnesini döndürür.

Dil değiştirme

$locale store'una bağlanan bir dil seçici oluşturun. Değer değiştiğinde svelte-i18n yeni yerel ayarın iletilerini yükler ve tüm çevrilmiş dizeleri tepkisel olarak günceller.

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

Çoğulları ICU MessageFormat ile yönetin

svelte-i18n, çoğullaştırma için tüm CLDR çoğul kategorilerini yöneten uluslararası standart ICU MessageFormat'ı kullanır. Arapçada 6 biçim, Rusçada 4 biçim ve Japoncada 1 biçim vardır. Hedef dillerinizin gerektirdiği biçimleri tanımladığınızda svelte-i18n doğru olanı otomatik olarak seçer.

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 {#個のアイテム}}"
}
Bileşenlerinizde tekil/çoğul mantığını hiçbir zaman doğrudan kodlamayın. Fransızca gibi diller 0'ı tekil kabul eder. Arapça, Rusça ve Lehçe İngilizcede bulunmayan çoğul biçimlerine sahiptir. Bu işi ICU çoğul söz dizimine bırakın.

svelte-i18n-locale-chain ile akıllı yerel ayar yedekleri

svelte-i18n, bir anahtar eksik olduğunda ara bir yedek kullanmadan doğrudan fallbackLocale değerine geri döner. Bu nedenle pt-BR kullanan bir kullanıcı son derece uygun pt-PT çevirileri yerine İngilizce metinleri görür. svelte-i18n-locale-chain, bölgesel varyantlardaki iletileri derinlemesine birleştiren akıllı yedek zincirleriyle bu sorunu çözer.

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 tüm ileti yükleme işlemlerini kendi içinde yönetir. svelte-i18n'in register() işlevini onunla birlikte kullanmayın; initLocaleChain kayıt, yükleme ve derinlemesine birleştirme işlemlerini yönetir.

Çevirileri otomatikleştirin

i18n kurulumunuz tamamlandığında yerel ayar dosyalarınızı yapay zeka kullanarak çevirin. IDE'nizde yapay zeka asistanınızdan kaynak dosyanızı çevirmesini isteyin veya CI/CD işlem hattınızda i18n Agent CLI'ı kullanın.

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
Çevirileri kademeli olarak yapın: Kaynak dosyanıza yeni anahtarlar eklediğinizde tüm dosyaları yeniden oluşturmak yerine yalnızca farkı çevirin. Böylece insanlar tarafından gözden geçirilmiş çevirileri korursunuz.

Çeviri kalitesini otomatikleştirin

Eksik anahtarları ve bozuk yer tutucuları yayımlanmadan önce i18n-validate ile yakalayın. Gerçek çeviriler gelmeden önce arayüzünüzü i18n-pseudo kullanarak sözde çevirilerle test edin.

Yaygın sorunlar

SvelteKit'te SSR yerel ayar sızıntısı

svelte-i18n store'ları singleton'dır. SvelteKit SSR'de eşzamanlı istekler aynı store'u paylaşır; bir kullanıcının yerel ayarı başka bir kullanıcının yanıtına sızabilir. Çözüm: Her isteğin doğru yerel ayar bağlamını alması için handle hook'unda veya düzenin load işlevinde locale.set() çağrısını yapın.

register() işlevini svelte-i18n-locale-chain ile kullanma

svelte-i18n-locale-chain kullanıyorsanız svelte-i18n'in register() işlevini kullanmayın. initLocaleChain tüm ileti yükleme işlemlerini kendi içinde yönetir. İkisini birlikte kullanmak yinelenen veya çakışan ileti yüklemelerine yol açar.

ICU söz dizimi hataları sessizce başarısız oluyor

ICU MessageFormat dizelerindeki eşleşmeyen bir süslü parantez veya eksik çoğul kategorisi sessiz hatalara yol açar; biçimlendirilmiş çıktı yerine ham ileti dizesi gösterilir. ICU söz dizimini CI işlem hattınızda doğrulayın.

Çevrilmemiş içeriğin kısa süreliğine görünmesi

Çevirilerin yüklenmesi tamamlanmadan bileşenleri oluşturursanız kullanıcılar ham anahtarları görür. İletiler hazır olana kadar bir yükleme durumu göstermek için düzeninizi {#if $isLoading}...{:else}...{/if} ile koruyun.

Önerilen dosya yapısı

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

i18n Agent'ı şimdi deneyin

Çeviri dosyanızı buraya bırakın

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

veya göz atmak için tıklayın

Hedef diller

Kayıt gerekmezAnında fiyat tahmini

svelte-i18n-locale-chain ile yerel ayar yedeği

pt-BR gibi bölgesel bir yerel ayarda çeviri anahtarı eksik olduğunda svelte-i18n önce üst yerel ayar pt'yi kontrol etmek yerine doğrudan varsayılan yerel ayara geçer.

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

Desteklenen çerçevelerin ve 75 yerleşik zincirin tam listesi için Yerel Ayar Yedeği Rehberimize bakın. Learn more →

Sık sorulan sorular