ローカルスコープベースのローカライズ
i18n コンポーネントオプション
'スコープとロケールの変更' において、Vue I18n には2つのスコープコンセプト、グローバルスコープとローカルスコープがあります。
一般的に、ロケール情報(例:locale、messagesなど)は createI18n のオプションとして設定され、app.use で設定(インストール)されます。要するに、グローバルスコープの翻訳関数 $t を使用してそれらをローカライズします。
場合によっては、ローカルメッセージのリソースを管理しながらコンポーネントごとにローカライズすることが必要になることがあります。この場合、グローバルスコープではなく、コンポーネントの i18n コンポーネントオプションを使用して各ローカルスコープをローカライズすることが有効です。
以下の例は、ローカルスコープベースのローカライズのものです:
import { createApp } from 'vue'
import { createI18n } from 'vue-i18n'
// グローバルスコープで使用されるロケール情報をオプションとして設定
const i18n = createI18n({
locale: 'ja',
messages: {
en: {
message: {
hello: 'hello world',
greeting: 'good morning, world!'
}
},
ja: {
message: {
hello: 'こんにちは、世界',
greeting: 'おはよう、世界!'
}
}
}
})
// コンポーネントを定義
const Component1 = {
template: `
<div id="component">
<h1>Component1</h1>
<p>Component1 locale messages: {{ $t("message.hello") }}</p>
<p>Fallback global locale messages: {{ $t("message.greeting") }}</p>
</div>
`,
i18n: {
messages: {
en: { message: { hello: 'hello component1' } },
ja: { message: { hello: 'こんにちは、component1' } }
}
}
}
const app = createApp({
components: { Component1 }
})
app.use(i18n)
app.mount('#app')テンプレート:
<div id="app">
<h1>Root</h1>
<p>{{ $t("message.hello") }}</p>
<Component1 />
</div>以下の出力を参照ください:
<div id="app">
<h1>Root</h1>
<p>こんにちは、世界</p>
<div class="component">
<p>Component1 locale messages: こんにちは、component1</p>
<p>Fallback global locale messages: おはよう、世界!</p>
</div>
</div>上記の例のように、コンポーネントにロケールメッセージがない場合は、グローバルスコープにフォールバックします。こちらで説明したように、ローカルスコープの locale はグローバルスコープから継承されるため、コンポーネントはグローバルスコープで設定された言語を使用します(上記の例では:locale: 'ja')
また、こちらで説明したように、デフォルトではグローバルスコープへのフォールバックにより、コンソールに2つの警告が表示されることに注意してください:
[intlify] Not found 'message.greeting' key in 'ja' locale messages.
[intlify] Fall back to translate 'message.greeting' with root locale.コンポーネントロケールを使用してローカライズしたい場合は、i18n コンポーネントオプションの sync: false と locale を使用できます。
コンポーネント向け共有ロケールメッセージ
特定のコンポーネントに対して、グローバルスコープのロケールメッセージからのフォールバックではなく、共有ロケールメッセージをインポートしたいことがあるかもしれません(たとえば、特定機能の共通メッセージなど)。
i18n の sharedMessages オプションを使用できます。
共通ロケールメッセージの例:
export default {
en: {
buttons: {
save: "Save",
// ...
}
},
ja: {
buttons: {
save: "保存",
// ...
}
}
}コンポーネント:
import commonMessage from './locales/common' // 共通ロケールメッセージをインポートするする
export default {
name: 'ServiceModal',
template: `
<div class="modal">
<div class="body">
<p>This is good service</p>
</div>
<div class="footer">
<button type="button">{{ $t('buttons.save') }}</button>
</div>
</div>
`,
i18n: {
messages: { ... },
sharedMessages: commonMessages
}
}sharedMessages オプションが messages オプションと一緒に指定された場合、これらのメッセージはターゲットコンポーネントの VueI18n インスタンスのロケールメッセージにマージされます。