https://github.com/intlify/vue-i18n-next
安装
yarn add vue-i18n
// 或者
src 下添加 lang 文件夹
zh_CN.ts,项目简单的话每种语言的文本都放在一个文件即可,项目比较复杂可以考虑每种语言一个文件夹,下面再划分模块。
export default {
fields: {
title: '系统名称',
status: '状态',
remark: '备注'
},
actions: {
confirm: '确定',
cancel: '取消',
create: '新建',
upload: '上传',
return: '返回',
esc: '退出',
clone: '克隆',
remarks: '备注',
submit: '提交',
check: '查看',
download: '下载',
config: '配置',
delete: '删除',
all: '全部',
login: '登录',
next: '下一步',
prev: '上一步',
start: '开始',
pause: '暂停',
fail: '失败',
edit: '编辑'
},
status: {
fail: '失败',
waitingStart: '待开始',
process: '进行中',
finished: '已完成'
},
message: {
serverError: '服务器错误',
tokenInvalid: '登录凭证失效',
timeout: '请求超时',
clientError: '请求错误',
networkError: '网络错误',
required: '必填项。'
},
// 登录页
login: {
inputLoginAccount: '请输入登录账号',
inputLoginPwd: '请输入密码'
},
// 错误页面
error: {
notFound: '抱歉,您访问的页面不存在! '
}
}
en_US.ts
export default {
fields: {},
actions: {
login: 'login'
},
status: {},
message: {},
login: {},
error: {}
}
index.ts,导出一个挂载 i18n 的方法
import type { App } from 'vue'
import { createI18n } from 'vue-i18n'
import zh_CN from './zh_CN'
import en_US from './en_US'
export const i18nInstance = createI18n({
locale: 'zh_CN',
legacy: false, // you must set `false`, to use Composition API
messages: {
zh_CN,
en_US
}
})
export default async function setupI18n(app: App<Element>) {
app.use(i18nInstance)
}
main.ts
// ...
import setupI18n from './lang'
// ...
// ...
// 多语言配置
setupI18n(app)
// ...
添加 hooks
vue-i18n 提供了一个钩子函数 useI18n(),暴露出 locale 属性用于切换语言,t 属性来使用多语言。
将 useI18n().t 重命名为 $t ,其他属性直接返回。
import { useI18n } from 'vue-i18n'
export const $t = (key: string) => key
export default function () {
const i18n = useI18n()
return {
...i18n,
$t: i18n.t
}
}
// ...
import useI18n from './useI18n'
// ...
export {
// ...
useI18n
// ...
}
使用
简单尝试
<template>
<div :class="prefixCls">
<a-space>
<a-button type="primary">{{ $t('actions.login') }}</a-button>
<a-button type="primary" @click="setLocale">切换</a-button>
</a-space>
</div>
</template>
<script setup lang="ts">
import { usePrefix, useI18n } from '@/hooks'
const { prefixCls } = usePrefix('login')
const { $t, locale } = useI18n()
// vue-i18n 提供了一个钩子函数 useI18n(),暴露出locale属性用于切换语言
console.log('🚀 ~ file: Index.vue ~ line 14 ~ locale', locale)
const setLocale = () => {
locale.value = locale.value == 'en_US' ? 'zh_CN' : 'en_US'
}
</script>
<style scoped lang="less">
@prefix-cls: ~'login';
.@{prefix-cls} {
position: relative;
display: flex;
align-items: center;
justify-content: center;
width: 100vw;
height: 100vh;
}
</style>
存入 localStroge
把当前语言环境记录到localStorage中,用户刷新页面时根据 localStorage 渲染当前页面的文本
控制台报警问题
vite.config.ts 中 alias 配置添加:
// 处理 vue-i18n 的控制台警告信息
{
find: 'vue-i18n',
replacement: 'vue-i18n/dist/vue-i18n.cjs.js'
},