i18n vue+element ui 国际化
项目结构:
前端vue+element ui
后端java springboot
国际化方案:
前端项目都安装i18n:
npm i vue-i18n –save
都做前端国际化,后端不做国际化,只对异常定义好返回码
前端项目:
定义i18n文件夹
定义:i18n/langs文件夹
定义如下目录结构
示例:en.js,其他文件类似
const en = { index: 'index', language: { zh: 'Chines', en: 'English', zw: 'Traditional Chinese' }, login: { username: 'username', password: 'password', captcha: 'captcha', login: 'login', selectLanguage: 'Select language', moreAbout: 'Learn more about services', forgetPassword: 'Forget password', message: { username: 'User name cannot be empty', password: 'Password cannot be empty', captcha: 'Verification code cannot be empty' } }, sys: { menu: { esg_index_HongKong: 'Hong Kong Stock Exchange', analysis: 'Kpi Analysis', cal_manager: 'KPI计算管理-en', analysis_export_kpi: 'KPI导出-en', analysis_export_report: '报告导出-en', cal_schedule: '计算任务管理-en', communicate_importantrecog: '重要性识别-en', dashboard_Old: 'Dashboard-Old-en', esg_index: 'esg index', fillProgress: '填报进度-en', job_email_schedule: '邮件任务管理-en', job_schedule: '填报任务管理-en', kpi_apporove: 'kpi approval', kpi_fill: 'kpi reporting', progress: 'Progress display', quanyiren: 'Stakeholder communication', showDashboard: 'Dashboard-en', sys_approve_manager: '审批管理-en', sys_dashboard_manager: 'Dashboard管理-en', sys_dept: '部门管理-en', sys_dict: '字典管理-en', sys_kpi_analysis_manage: 'KPI分析管理-Old', sys_email_account: '发件人管理-en', email_management: '邮件管理-en', sys_file_export_manage: '附件导出-en', sys_fill_kpi_manager: '填报管理-en', sys_fiscal: '财年管理-en', sys_information_manager: '通知管理-en', sys_kpi_manager: 'KPI管理-en', sys_log: '系统日志-en', sys_manager: 'system management', sys_menu: '菜单管理-en', sys_role: '角色管理-en', sys_unit_conversion: '单位换算管理-en', sys_unit_type_manager: '单位管理-en', sys_user: '用户管理-en', send_email: '发件管理-en' } }, role: { inputPh: 'role name', bt: { query: 'query', add: 'add', batchDelete: 'batch delete', delete: 'delete', update: 'update' }, th: { roleName: 'role name', remark: 'remark', createTime: 'create time', handler: 'handler' }, sysAdmin: { roleName: 'administrator', remark: 'administrator' }, settingUser: { roleName: 'Staffing', remark: 'Staffing' }, adminUser: { roleName: 'admin', remark: 'Group head' }, approverUser: { roleName: 'Approver', remark: 'Approver' }, fillUser: { roleName: 'Filled by', remark: 'Filled by' } }, prop: { inputPh: 'Please enter the information to query', bt: { query: 'query', add: 'add', batchDelete: 'batch delete', delete: 'delete', update: 'update', setting: 'setting' }, th: { number: 'number', propId: 'Dictionary coding', propName: 'Dictionary type', memo: 'Explain', handler: 'Handler' } }, dept: { inputPh: 'Please enter the dept', bt: { directSub: 'Show only immediate sub dept', query: 'query', expandAll: 'expand all', closeAll: 'close all', add: 'add', batchDelete: 'batch delete', importTemplate: 'Import template', batchImport: 'Batch import', delete: 'delete', update: 'update', }, th: { number: 'number', name: 'dept name', parentName: 'parent name', handler: 'Handler' } } } export default en
和main.js平级目录新建 i18n.js
import Vue from 'vue' import VueI18n from 'vue-i18n' // 引入各个语言配置文件 import localeZh from '../i18n/langs/zh' import elementZh from 'element-ui/lib/locale/lang/zh-CN' import zh_levelsubject from "../i18n/langs/zh_LevelSubject" import localeEn from '../i18n/langs/en' import elementEn from 'element-ui/lib/locale/lang/en' import en_levelsubject from "../i18n/langs/en_LevelSubject" import localeZw from '../i18n/langs/zw' import elementZw from 'element-ui/lib/locale/lang/zh-TW' import zw_levelsubject from "../i18n/langs/zw_LevelSubject" Vue.use(VueI18n) // 创建vue-i18n实例i18n const i18n = new VueI18n({ // 设置默认语言 locale: 'zh', // 语言标识 // 添加多语言(每一个语言标示对应一个语言文件) messages: { zh: { ...localeZh, ...elementZh, ...zh_levelsubject }, en: { ...localeEn, ...elementEn, ...en_levelsubject }, zw: { ...localeZw, ...elementZw, ...zw_levelsubject } } }) // 暴露i18n export default i18n
修改main.js
// 新增 import i18n from './i18n' Vue.use(Element, { //.... // 新增 i18n: (key, value) => i18n.t(key, value) }) new Vue({ // 新增 i18n })
修改login.vue
![]()
$t开头的占位服务与en.js等定义的key对应 |
![]()
|
表头需要自定国际化,参考en.js定义的key
Element默认提示信息映入element ui国际化js
详见: i18n.js
切换语言代码:
<el-form-item> <el-select v-model="dataForm.language" style="width: 180px" :placeholder="$t('login.selectLanguage')" @change="handleSetLanguage"> <el-option v-for="item in options" :key="item.code" :label=$t(item.name) :value="item.code"> </el-option> </el-select> </el-form-item>
data() { return { options: [{ code: 'zh', name: 'language.zh' }, { code: 'en', name: 'language.en' }, { code: 'zw', name: 'language.zw' }], dataForm: { userName: '', password: '', uuid: '', language: this.$cookie.get('language') === 'undefine' ? 'zh' : this.$cookie.get('language'), captcha: '' },
methods: { handleSetLanguage() { this.$cookie.set('language', this.dataForm.language) this.$i18n.locale = this.dataForm.language },
后端表里的只如果想要用前端国际化,就需要再后端数据表上新增一列key
返回response中包含此key
前端遍历数据处理如下:
如果只需对标里的某一个字段国际化,只需$t('langKey')
2. 前端只做web元素国际化,后端给冬天数据国际化后端可以引入i18n,配置对应语言的翻译文件key,返回前天时遍历取值
3. 前端只做web元素国际化,后台不同语言的值放在不同的表中,表名区分,里面字段一模一样,但是字段的值不一样,存储的是对应语言的值
npm i vue-i18n –save