项目中使用了 Vuetify 这个 UI 库,现在要加上多国语言功能,踩了几个坑记录下。
使用Vuetify内置i18n
Vuetify 的国际化文档链接
初始化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| import Vue from 'vue' import Vuetify from 'vuetify/lib' Vue.use(Vuetify)
import zhHans from 'vuetify/es5/locale/zh-Hans' import ja from 'vuetify/es5/locale/ja'
const vuetify = new Vuetify({ lang: { current: 'zhHans', locales: { zhHans, ja }, }, }) const app = new Vue({ vuetify }).$mount("#app");
|
使用 t 函数
1
| <div class="my-component">{{ $vuetify.lang.t("$vuetify.hello") }}</div>
|
切换语言
1 2
| this.$vuetify.lang.current = "zhHans"
|
使用 Vuetify 整合 Vue-i18n
Vue-i18n 的官方文档链接
Vuetify 内置国际化功能比较简陋,官方也推荐使用整合的方式,后续添加自定义的国际化文本也更方便些。
初始化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| import Vue from 'vue' import Vuetify from 'vuetify/lib' import VueI18n from 'vue-i18n'
Vue.use(Vuetify) Vue.use(VueI18n)
import zhHans from 'vuetify/es5/locale/zh-Hans' import ja from 'vuetify/es5/locale/ja'
const zhHansUser = { ...zhHans, hello: "你好", $vuetify: { hello: "你好", } } const jaUser = { ...ja, hello: "こんにちは", $vuetify: { hello: "こんにちは", } }
const i18n = new VueI18n({ locale: "zhHans", messages: { zhHans: zhHansUser, ja: jaUser } });
const vuetify = new Vuetify({ lang: { t: (key, ...params) => i18n.t(key, params), }, }) const app = new Vue({ vuetify, i18n }).$mount("#app");
|
使用 t 函数
1 2 3 4 5 6
| <div class="my-component">{{ $t("hello") }}</div> <div class="my-component">{{ $t("$vuetify.hello") }}</div>
<div class="my-component">{{ $vuetify.lang.t("$vuetify.hello") }}</div>
|
切换语言
1 2
| this.$i18n.locale = "zhHans"
|
总结
Vuetify
自带了一套国际化配置,但实现的 t
函数的功能相对简陋,所以实际项目中更适合加入 Vue-i18n
整合使用。
Vuetify
国际化文本都放在 $vuetify
这个命名空间下。
- 整合
Vue-i18n
后,实际上就是使用 Vue-i18n
来实现国际化,把 Vuetify
的文本导入并且托管了 Vuetify
的 t
函数。