
Vue i18n:使用 vue-i18n 的國際化完整設定
從安裝到生產環境:透過 Composition API 設定 vue-i18n、使用 CLDR 規則處理複數、使用元件插值,並新增智能語系回退鏈。
安裝 vue-i18n
vue-i18n 是 Vue.js 的官方國際化外掛程式。它提供回應式翻譯、ICU 風格複數、元件插值、日期時間和數字格式化,並同時支援 Options API 和 Composition API。
npm install vue-i18n@9設定 vue-i18n
使用 createI18n() 建立 i18n 實例,並將其註冊為 Vue 外掛程式。定義語系訊息、設定預設語系並設定回退語系。vue-i18n 同時支援 legacy(Options API)和 composition(Composition API)模式。
// src/i18n.ts
import { createI18n } from 'vue-i18n'
import en from './locales/en.json'
import de from './locales/de.json'
const i18n = createI18n({
legacy: false, // Use Composition API mode
locale: 'en', // Default locale
fallbackLocale: 'en', // Fallback locale
messages: { en, de },
})
export default i18n// src/main.ts
import { createApp } from 'vue'
import App from './App.vue'
import i18n from './i18n'
const app = createApp(App)
app.use(i18n)
app.mount('#app')在範本中使用翻譯
vue-i18n 在範本中提供 $t() 函式(Options API),並透過 useI18n() 提供 t() 函式(Composition API)。兩者都接收翻譯鍵以及用於插值的可選命名參數或列表參數。
// src/locales/en.json
{
"nav": {
"home": "Home",
"about": "About",
"settings": "Settings"
},
"greeting": "Hello, {name}!",
"cart": {
"itemCount": "no items | one item | {count} items"
}
}
// src/locales/de.json
{
"nav": {
"home": "Startseite",
"about": "Über uns",
"settings": "Einstellungen"
},
"greeting": "Hallo, {name}!",
"cart": {
"itemCount": "keine Artikel | ein Artikel | {count} Artikel"
}
}處理複數
vue-i18n 透過豎線分隔的形式和 $tc() 函式(legacy),或帶 count 參數的 t()(Composition API)支援複數。在語系訊息中使用豎線分隔符定義複數形式:'沒有項目 | 一個項目 | {count} 個項目'。
<template>
<div>
<!-- Simple translation -->
<h1>{{ $t('nav.home') }}</h1>
<!-- With variables -->
<p>{{ $t('greeting', { name: userName }) }}</p>
<!-- In attributes -->
<input :placeholder="$t('nav.settings')" />
<!-- Composition API -->
<p>{{ greeting }}</p>
</div>
</template>
<script setup lang="ts">
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
const userName = 'Alice'
const greeting = t('greeting', { name: userName })
</script>新增語系回退鏈
vue-i18n 內建的 fallbackLocale 僅支援扁平回退語系列表,不支援針對每個語系的鏈。缺少某個鍵時,pt-BR 使用者會回退到英語,而不是 pt-PT。vue-i18n-locale-chain 新增可設定的深度合併鏈,使地區使用者始終看到最接近的可用翻譯。
<template>
<div>
<!-- Pipe-separated plurals -->
<p>{{ $t('cart.itemCount', count) }}</p>
<!-- Named plurals (recommended for complex languages) -->
<p>{{ $t('orders', { n: orderCount }) }}</p>
</div>
</template>
<!-- In your locale file: -->
<!-- "orders": "{n} order | {n} orders" -->自動翻譯
設定 vue-i18n 後,使用 AI 翻譯語系 JSON 檔案。從 IDE 讓 AI 助手翻譯來源檔案,或將翻譯整合到 CI/CD 管線,實現完全自動化的在地化。
<template>
<select v-model="locale">
<option v-for="lang in availableLocales" :key="lang" :value="lang">
{{ lang }}
</option>
</select>
</template>
<script setup lang="ts">
import { useI18n } from 'vue-i18n'
const { locale, availableLocales } = useI18n()
</script>// src/i18n.ts
import { createI18n } from 'vue-i18n'
const i18n = createI18n({
legacy: false,
locale: 'en',
fallbackLocale: 'en',
messages: {},
})
export async function loadLocale(locale: string) {
const messages = await import(`./locales/${locale}.json`)
i18n.global.setLocaleMessage(locale, messages.default)
i18n.global.locale.value = locale
}
export default i18n語系回退鏈設定
為每個語系設定回退鏈,使地區使用者看到最接近的可用翻譯,而不是直接跳到英語。vue-i18n 支援使用物件形式的 fallbackLocale 為每個語系定義回退鏈。
// src/i18n.ts
import { createI18n } from 'vue-i18n'
const i18n = createI18n({
legacy: false,
locale: 'pt-BR',
fallbackLocale: {
'pt-BR': ['pt', 'en'],
'zh-Hant-TW': ['zh-Hant', 'zh', 'en'],
'es-419': ['es', 'en'],
default: ['en'],
},
messages: {
en: { /* ... */ },
pt: { /* ... */ },
'pt-BR': { /* ... */ },
},
})常見問題
混用 Legacy 與 Composition API 模式
對翻譯字串使用 v-html
區域使用者看到英語而非父語言
立即試用 i18n Agent
將翻譯檔案拖放到此處
JSON, YAML, PO, XML, CSV, Markdown, Properties
或點擊選擇檔案
目標語言