
Vue i18n:vue-i18n による国際化設定完全ガイド
インストールから本番環境まで。Composition API を使った vue-i18n の設定、CLDR 規則による複数形処理、コンポーネント補間、スマートなロケールフォールバックチェーンを解説します。
vue-i18n のインストール
vue-i18n は Vue.js 公式の国際化プラグインです。リアクティブな翻訳、ICU 形式の複数形処理、コンポーネント補間、日時・数値の書式設定を提供し、Options API と Composition API の両方に対応します。
npm install vue-i18n@9vue-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)、または件数パラメーターを渡す t()(Composition API)で複数形に対応します。ロケールメッセージでは、パイプ区切りで複数形式を定義します:'no items | one item | {count} items'。
<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
またはクリックしてファイルを選択
翻訳先言語