SvelteKit i18n:國際化設定指南
從零到多語言:在 SvelteKit 應用程式中設定 svelte-i18n,使用 ICU 訊息格式、基於語言的路由和智能回退鏈。
安裝 svelte-i18n
svelte-i18n 是 Svelte 和 SvelteKit 的標準國際化庫,開箱即用地提供響應式 store、ICU MessageFormat 支援和語言延遲載入。
npm install svelte-i18n設定 svelte-i18n
建立 i18n 設定檔案,通過延遲載入的 import 函數註冊語言。svelte-i18n 只會在某種語言啟用時取得其訊息。
// 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
});SvelteKit 佈局整合
在根佈局中匯入 i18n 設定,並通過 $isLoading store 控制渲染。這樣可防止語言數據非同步載入時短暫顯示未翻譯的鍵。
<!-- 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 中基於語言的路由
若要使用 /en/about、/de/about 等有利於 SEO 的 URL,請使用 [lang] 路由參數。根據 URL 參數,在佈局的 load 函數中設定 svelte-i18n 語言。
// 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}翻譯檔案格式
為每種語言建立一個 JSON 檔案。svelte-i18n 支援嵌套鍵,以及用於複數、變數和 select 表達式的 ICU MessageFormat 語法。
// 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}}"
}
}在元件中使用譯文
從 svelte-i18n 匯入 $_ store(或 $format),並在 Svelte 範本中使用。store 具有響應性,語言變化時所有翻譯字串都會自動更新。
<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><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>語言切換
構建與 $locale store 綁定的語言選擇器。值變化時,svelte-i18n 會載入新語言的訊息,並以響應方式更新所有翻譯字串。
<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>使用 ICU MessageFormat 處理複數
svelte-i18n 使用 ICU MessageFormat 處理複數,這是覆蓋全部 CLDR 複數類別的國際標準。阿拉伯語有 6 種形式,俄語有 4 種,日語只有 1 種。定義目標語言需要的形式後,svelte-i18n 會自動選擇正確形式。
// 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 {#個のアイテム}}"
}使用 svelte-i18n-locale-chain 實現智能語言回退
缺少鍵時,svelte-i18n 會直接回退到 fallbackLocale,沒有中間回退。pt-BR 用戶會看到英語,而不是完全可用的 pt-PT 譯文。svelte-i18n-locale-chain 通過智能回退鏈深度合併區域變體訊息,從而修復此問題。
npm install svelte-i18n-locale-chain svelte-i18n// 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自動翻譯
完成 i18n 設定後,使用 AI 翻譯本地化檔案。在 IDE 中讓 AI 助手翻譯來源檔案,或在 CI/CD 管線中使用 i18n Agent CLI。
# 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自動保證翻譯質素
常見問題
SvelteKit SSR 語言狀態串擾
將 register() 與 svelte-i18n-locale-chain 一起使用
ICU 語法錯誤無提示失敗
未翻譯內容閃現
推薦的檔案結構
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
將翻譯檔案拖放到此處
JSON, YAML, PO, XML, CSV, Markdown, Properties
或點擊選擇檔案
目標語言
使用 svelte-i18n-locale-chain 實現語言回退
如果 pt-BR 等區域語言缺少翻譯鍵,svelte-i18n 會直接跳到預設語言,而不會先檢查父語言 pt。
npm install svelte-i18n-locale-chainimport { initLocaleChain } from 'svelte-i18n-locale-chain';
initLocaleChain({
fallbacks: {
'pt-BR': ['pt', 'en'],
'zh-Hant-HK': ['zh-Hant', 'zh', 'en'],
},
defaultLocale: 'en',
});查看語言回退指南,瞭解受支援框架的完整列表和 75 條內置回退鏈。 Learn more →