vue3多语言国际化i18n
安装 npm install vue-i18n@next
如果需要路由控制npm install vue-router@4
先在src目录下创建locales目录存放翻译文件
可以使用子对象,用来区分不同vue组件或某个栏目的内容,例如我写了三条翻译,分别在App.vue,Index.vue,Ceshi.vue中使用。
crc/locales/en.json:
{
"app": {
"hello": "hello world"
},
"index": {
"h1": "this index"
},
"ceshi": {
"h1": "this ceshi"
}
}
再创建一个中文翻译src/locales/zh-Hans.json:
{
"app": {
"hello": "你好,世界"
},
"index": {
"h1": "这是首页"
},
"ceshi": {
"h1": "这是测试"
}
}
然后创建一个i18n.js:
import { createI18n } from 'vue-i18n';
import en from './locales/en.json';
import zh_Hans from './locales/zh-Hans.json';
//实例化i18n
const i18n = createI18n({
legacy: false,
globalInjection: true, // 全局注入
locale: 'en', // 使用语言,这里无效,因为在路由守卫中使用url控制,要改变语言就是改变这里
messages: {
en,
'zh-Hans': zh_Hans, //因为js不能使用-符号,所以用别名引入
}
});
//导出实例
export default i18n;
然后我希望使用路由控制语言,创建router.js:
import { createRouter,createWebHistory } from "vue-router";
import i18n from './i18n'; //引入i18n.js
import Index from "./Index.vue"; //这是导入的两个页面
import Ceshi from "./Ceshi.vue"; //这是导入的两个页面
const routes = [ //指定路由
{path:"/:locale",component:Index}, //中间的:locale就是语言变量
{path:"/:locale/ceshi",component:Ceshi},
]
const router = createRouter({ //创建路由
history: createWebHistory(), //路由模式
routes, //路由,由之前的数组变量作为参数
})
//路由守卫,获取url中的locale参数,然后设置i18n的locale
router.beforeEach((to, from, next) => {
//得到路由的locale参数
const locale = to.params.locale;
//如果不是数组中的语言则跳转到默认语言url
if (!['en', 'zh-Hans'].includes(locale)) return next('/en');
//如果locale不是url指定的语言则修正
if (i18n.global.locale.value !== locale) {
i18n.global.locale.value = locale
}
document.documentElement.lang = locale; // 更改<html lang=>的值,方便浏览器识别语言
next(); //继续后面的操作
});
export default router; //导出router
在main.js中使用这两个实例:
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'; //引入router.js
import i18n from './i18n'; //引入i18n.js
const app = createApp(App);
app.use(router); //使用router
app.use(i18n); //使用i18n
app.mount('#app');
接下来使用翻译的方法:
App.vue
<template>
<div>
<h1>{{ $t('app.hello') }}</h1>
<router-view></router-view>
</div>
</template>
{{ $t('app.hello') }} 就是访问翻译文件中的app的子对象hello,这样它会自动翻译成指定的文字