vuejs3 I18n 和组合 API
vuejs3 I18n and composition API
我现在正在用 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')
我在the documentation中看到要使用组合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`
}
})
我的问题是我的 createApp 已经被这样使用了:
const app = createApp(App)
这是 Vuejs 的默认实现。
我试着修改它,在 App 之后添加设置,之前,删除 App 没有任何效果,我认为我做了越来越多的愚蠢事情。
有没有人知道如何使 i18n 与组合 API 一起工作?最后的 objective 基本上是在组件 switchLanguage 中,由组合 API 组成,可以访问 $i18n(获取一些信息并管理我的语言切换)
在此先感谢您提供的帮助。
您已经在 main.js
中在您的应用中实例化了 i18n
。这是重要的一点。
文档中提供的示例不一定必须在 createApp
中定义的实例上完成。它适用于任何组件,只要您在 main.(js|ts)
上实例化了 i18n
这将适用于任何组件(任何你需要的地方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`
}
}
})
旁注:所有 $tc
(pluralization) 功能已移至 t
。
如果您要升级现有应用程序并且不想通过模板将 $t
和 $tc
的所有实例替换为 t
:
setup: () => ({
$t: useI18n().t
$tc: useI18n().t
})
我现在正在用 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')
我在the documentation中看到要使用组合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`
}
})
我的问题是我的 createApp 已经被这样使用了:
const app = createApp(App)
这是 Vuejs 的默认实现。 我试着修改它,在 App 之后添加设置,之前,删除 App 没有任何效果,我认为我做了越来越多的愚蠢事情。
有没有人知道如何使 i18n 与组合 API 一起工作?最后的 objective 基本上是在组件 switchLanguage 中,由组合 API 组成,可以访问 $i18n(获取一些信息并管理我的语言切换)
在此先感谢您提供的帮助。
您已经在 main.js
中在您的应用中实例化了 i18n
。这是重要的一点。
文档中提供的示例不一定必须在 createApp
中定义的实例上完成。它适用于任何组件,只要您在 main.(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`
}
}
})
旁注:所有 $tc
(pluralization) 功能已移至 t
。
如果您要升级现有应用程序并且不想通过模板将 $t
和 $tc
的所有实例替换为 t
:
setup: () => ({
$t: useI18n().t
$tc: useI18n().t
})