基于组件的本地化

通常语言环境信息 (例如:localemessages 等) 会被设置为 VueI18n 实例的构造函数选项,并且该实例会被作为 i18n 选项设置在 Vue 的根实例上。

因此你可以全局地在 Vue 的根实例以及任何被组合的组件中使用 $t 或者 $tc 进行翻译。当然面向 Vue 组件的设计,你也可以更方便的分别控制每个组件的语言环境信息。

基于组件的本地化示例:

  1. // 为 Vue 的根实例设置语言环境信息
  2. const i18n = new VueI18n({
  3. locale: 'ja',
  4. messages: {
  5. en: {
  6. message: {
  7. hello: 'hello world',
  8. greeting: 'good morning'
  9. }
  10. },
  11. ja: {
  12. message: {
  13. hello: 'こんにちは、世界',
  14. greeting: 'おはようございます'
  15. }
  16. }
  17. }
  18. })
  19. // 定义组件
  20. const Component1 = {
  21. template: `
  22. <div class="container">
  23. <p>Component1 locale messages: {{ $t("message.hello") }}</p>
  24. <p>Fallback global locale messages: {{ $t("message.greeting") }}</p>
  25. </div>`,
  26. i18n: { // `i18n` 选项,为组件设置语言环境信息
  27. messages: {
  28. en: { message: { hello: 'hello component1' } },
  29. ja: { message: { hello: 'こんにちは、component1' } }
  30. }
  31. }
  32. }
  33. new Vue({
  34. i18n,
  35. components: {
  36. Component1
  37. }
  38. }).$mount('#app')

模板:

  1. <div id="app">
  2. <p>{{ $t("message.hello") }}</p>
  3. <component1></component1>
  4. </div>

输出如下:

  1. <div id="app">
  2. <p>こんにちは、世界</p>
  3. <div class="container">
  4. <p>Component1 locale messages: こんにちは、component1</p>
  5. <p>Fallback global locale messages: おはようございます</p>
  6. </div>
  7. </div>

在上面的例子中,如果组件没有语言环境信息,它将回退到全局定义的本地化信息。组件使用根实例中设置的语言 (在上面的例子中:locale: 'ja')。

注意,在默认情况下,回退到根语言环境会在控制台中生成两个警告:

[vue-i18n] Value of key 'message.greeting' is not a string!
[vue-i18n] Fall back to translate the keypath 'message.greeting' with root locale.

为避免以上警告 (同时保留那些完全没有翻译给定关键字的警告) 需初始化 VueI18n 实例时设置 silentFallbackWarn:true

如果你希望在组件语言环境中进行本地化,可以在 i18n 选项中用 sync: falselocale

函数式组件的翻译

使用函数式组件时,所有数据 (包括 prop、子内容、插槽、父级内容等) 都通过包含属性的 context 传递,并且它无法识别 this 的范围,因此在函数式组件上使用 vue-i18n 时,你必须将 $t 称为 parent.$t,请查看以下示例:

...
<div>
  <a
    href="#"
    target="_blank"
    rel="noopener noreferrer">
    <img src="" :alt="parent.$t('message.hello')">
  </a>
</div>
...