项目需要支持多语言,我们需要提取出项目中使用的静态文本,使用语言包进行管理, 当切换语言设置的时候,可以自动切换整个项目的文字显示。
// npm 安装
npm install vue-i18n
// yarn 安装
yarn add vue-i18n
以 tcc-mes-web 为例子:
语言包路径:/tcc-mes-web/src/locales
目录结构:
├── locales # 国际化语言包
│ ├── lang # 语言包内容
│ │ ├── zh-CN # 中文(简体)字典
│ │ ├── zh-CN.js # 中文(简体)字典入口
│ │ ├── zh-HK # 中文(繁体)字典
│ │ ├── zh-HK.js # 中文(繁体)字典入口
│ │ ├── en-US # 英文字典
│ │ └── en-US.js # 英文字典入口
│ └── index.js # 语言包入口
└── ...
如需增加支持其它语言,在 lang 下分别新建 xx 语言目录及 xx.js 语言入口;
中文(简体):
// src/locales/lang/zh-CN.js
import antd from 'ant-design-vue/es/locale-provider/zh_CN'
import momentCN from 'moment/locale/zh-cn'
import global from './zh-CN/global'
import frame from './zh-CN/frame'
import user from './zh-CN/user'
const components = {
antLocale: antd,
momentName: 'zh-cn',
momentLocale: momentCN
}
export default {
...components,
...global,
...frame,
...user
}
// src/locales/lang/zh-CN/user.js
export default {
'user.login.login': '登录',
'user.login.tab.title.one': '中台帐号登录',
'user.login.tab.login.two': '原帐号登录',
'user.login.tab.login.three': '验证码登录',
'user.login.remember-password': '记住密码',
'user.login.forgot-password': '忘记密码',
'user.login.account.placeholder': '请输入管理员帐号或手机号',
'user.login.old-account.placeholder': '请输入原始帐号',
'user.login.password.placeholder': '请输入密码'
}
中文(繁体):
// src/locales/lang/zh-HK.js
import antd from 'ant-design-vue/es/locale-provider/zh_TW'
import momentHK from 'moment/locale/zh-hk'
import global from './zh-HK/global'
import frame from './zh-HK/frame'
import user from './zh-HK/user'
const components = {
antLocale: antd,
momentName: 'zh-hk',
momentLocale: momentHK
}
export default {
...components,
...global,
...frame,
...user
}
// src/locales/lang/zh-HK/user.js
export default {
'user.login.login': '登入',
'user.login.tab.title.one': '中台帳號登入',
'user.login.tab.login.two': '原帳號登入',
'user.login.tab.login.three': '驗證碼登入',
'user.login.remember-password': '記住密碼',
'user.login.forgot-password': '忘記密碼',
'user.login.account.placeholder': '請輸入管理員帳號或手機號',
'user.login.old-account.placeholder': '請輸入原始帳號',
'user.login.password.placeholder': '請輸入密碼'
}
英文:
// src/locales/lang/en-US.js
import antdEnUS from 'ant-design-vue/es/locale-provider/en_US'
import momentEU from 'moment/locale/eu'
import global from './en-US/global'
import frame from './en-US/frame'
import user from './en-US/user'
const components = {
antLocale: antdEnUS,
momentName: 'eu',
momentLocale: momentEU
}
export default {
...components,
...global,
...frame,
...user
}
// src/locales/lang/en-US/user.js
export default {
'user.login.login': 'Login',
'user.login.tab.title.one': 'TCC account',
'user.login.tab.login.two': 'Original account',
'user.login.tab.login.three': 'Verification Code',
'user.login.remember-password': 'Remember password',
'user.login.forgot-password': 'Forgot password',
'user.login.account.placeholder': 'Please enter your account or mobile',
'user.login.old-account.placeholder': 'Please enter your original account number',
'user.login.password.placeholder': 'Please enter your password'
}
// html 需要使用 {{}} 将 name包装起来
<template>
{{ $t(user.login.login) }}
</template>
// js
$t('name')
前端可通过携带请求头 Accept-Language:zh-CN 来指定后端需要返回的语言。
// src/utils/http/axios.js
// 添加请求拦截器
……
instance.interceptors.request.use(
config => {
const lang = Vue.ls.get(APP_LANGUAGE)
lang && (config.headers["Accept-Language"] = lang);
return config
},
……
1、基于 vue-i18n 依赖包实现国际化,更多使用细节查看官网;
2、综合管理平台需要给对应租户开通后才能使用多语言功能;