vuejs3 I18n 和组合 API

Tar*_*n34 3 javascript internationalization i18next vue.js vuejs3

我现在正在 vueJS 中做一个前端界面,并且目前正在使用 vuejs 3 和 i18n。i18n 的实现按正常方式工作得很好,但是当我想将它与组合 API 一起使用时,就会出现问题。

所以我做了什么。我的 main.js 看起来像这样:

const i18n = createI18n({
    messages: {
        en: en,
        fr: fr
    },
    fallbackLocale: 'en',
    locale: localStorage.Language || navigator.language.split('-')[0] || 'en',
})
const app = createApp(App)


app.use(router)
app.use(i18n)

app.mount('#app')
Run Code Online (Sandbox Code Playgroud)

我在文档中看到要使用组合API,我必须添加legacy:false,所以我这样做了。然后我的 $t 就不再起作用了。我进一步查看文档并到达了我迷失的地方。文档说要使用这个:

const app = Vue.createApp({
  setup() {
    const { t } = VueI18n.useI18n() // call `useI18n`, and spread `t` from  `useI18n` returning
    return { t } // return render context that included `t`
  }
})
Run Code Online (Sandbox Code Playgroud)

我的问题是我的 createApp 已经像这样使用:

const app = createApp(App)
Run Code Online (Sandbox Code Playgroud)

这是 Vuejs 的默认实现。我尝试修改它,在应用程序之后添加设置,之前,删除应用程序没有任何效果,我认为我做了越来越多的愚蠢的事情。

有谁知道如何让 i18n 与组合 API 一起使用吗?最终目标基本上是使用组合 API 制作的组件 switchLanguage 来访问 $i18n (以获取一些信息并管理我的语言切换)

预先感谢您提供的帮助。

And*_*hiu 6

您已经i18n在您的应用程序上实例化了main.js. 这是重要的一点。

文档中提供的示例不一定必须在内部定义的实例上完成createApp。它可以在任何组件中工作,只要你已经实例化了 i18nmain.(js|ts)

这适用于任何组件(无论您需要什么t):

import { useI18n } from "vue-i18n";

export default defineComponent({
  setup() {
    const { t } = useI18n();
    // you can now use t('some.text.to.be.translated')
    // t('some.text.to.be.pluralized', { n: 1 }, 1);

    return {
      // expose `t` to <template>:
      t, 
    }
  },
  // if you want it inside any method, computed or hook
  // in case you still use Options API
  computed() {
    someTranslatedText() {
      return useI18n().t('translate.me');
    }
  },
  methods: {
    methodNeedingTranslation() {
      const { t } = useI18n();
      // do stuff with `t`
    }
  }
})
Run Code Online (Sandbox Code Playgroud)

旁注:所有$tc复数)功能已移至t.

如果您要升级现有应用程序并且不想遍历模板并将$t和 的所有实例替换$tct

setup: () => ({ 
  $t: useI18n().t
  $tc: useI18n().t 
})
Run Code Online (Sandbox Code Playgroud)

要使$t$tc在任何组件中可用<template>,而不必在<script>(或<script setup>) 中导入+公开它们:

import { useI18n } from "vue-i18n";

export default defineComponent({
  setup() {
    const { t } = useI18n();
    // you can now use t('some.text.to.be.translated')
    // t('some.text.to.be.pluralized', { n: 1 }, 1);

    return {
      // expose `t` to <template>:
      t, 
    }
  },
  // if you want it inside any method, computed or hook
  // in case you still use Options API
  computed() {
    someTranslatedText() {
      return useI18n().t('translate.me');
    }
  },
  methods: {
    methodNeedingTranslation() {
      const { t } = useI18n();
      // do stuff with `t`
    }
  }
})
Run Code Online (Sandbox Code Playgroud)
  • 如果您仍然需要它们<script>,请从 导入'vue-i18n',如上所示。
  • $tcVue3 中不再使用。如果您的模板来自 Vue2,最好将所有$tc的替换为$t. useI18n().t或者,如果您不想触及模板,则可以分配给两者:
setup: () => ({ 
  $t: useI18n().t
  $tc: useI18n().t 
})
Run Code Online (Sandbox Code Playgroud)