需求

项目为多页应用,包含产品a、b、c、d、e,每个产品都有自己的翻译文件。
一次加载所有翻译文件是极度不合理的。于是考虑动态加载。

实现

参考官方文档:延迟加载翻译

项目结构


├── dist // 静态资源输出目录

├── src
│   ├── assets
│   ├── components
│   ├── lang // 语言翻译文件
│   ├── a
│   ├── en_US.js
│   └── zh_CN.js
│   ├── b
│   ├── en_US.js
│   └── zh_CN.js
│   ├── c
│   ├── en_US.js
│   └── zh_CN.js
│   ├── d
│   ├── en_US.js
│   └── zh_CN.js
│   ├── e
│   ├── en_US.js
│   └── zh_CN.js
│   ├── pages
│   ├── a
│   ├── b
│   ├── c
│   ├── d
│   ├── e
│   ├── utils
│   ├── i18n.js
│   ├── ...

i18n.js

import Vue from 'vue'
import VueI18n from 'vue-i18n' import ElementLocale from 'element-ui/lib/locale'
import enLocale from 'element-ui/lib/locale/lang/en'
import zhLocale from 'element-ui/lib/locale/lang/zh-CN' // LANG:全局变量,从cookie中获取的当前语言版本,'zh_CN'、'en_US'
// IS_INTL:全局变量,是否为国际版
import { LANG, IS_INTL } from '@/constant' Vue.use(VueI18n) const i18n = new VueI18n({
silentTranslationWarn: true
})
// 这里需要覆盖Element本地化函数,不然会冲突
ElementLocale.i18n((key, value) => i18n.t(key, value))
export default i18n /**
* 更改vueI18n实例
* @param lang 'zh_CN'、'en_US'
*/
function setI18nLang (lang) {
i18n.locale = lang
// axios.defaults.headers.common['Accept-Language'] = lang
document.querySelector('html').setAttribute('lang', lang)
return lang
} /**
* 动态加载语言
* @param path 当前路径(对应lang下文件夹名)
*/
const _LANGS = ['zh_CN', 'en_US']
const ELEMENT_LANG = {
zh_CN: zhLocale,
en_US: enLocale
}
let loadedLanguages = [] export function loadLanguageAsync (path) {
// lang目前是从cookie中获取,所以没有作为参数传递,此处lang也可作为变量传递 // 如果cookie中没有获取到语言项,国际版默认初始化为英文
const lang = LANG || (IS_INTL ? 'en_US' : 'zh_CN') if (!path || !_LANGS.includes(lang)) return if (i18n.locale !== lang) {
if (!loadedLanguages.includes(lang)) {
// 文件大时可拆分打包,目前项目中翻译文件均为4、5K左右,就没拆
// return import(/* webpackChunkName: "lang-[request]" */ `@/lang/${path}/${lang}`).then(msgs => {
return import(`@/lang/${path}/${lang}`).then(msgs => {
const _temp = Object.assign(msgs.default, ELEMENT_LANG[lang])
i18n.setLocaleMessage(lang, _temp)
loadedLanguages.push(lang)
return setI18nLang(lang)
})
}
return Promise.resolve(setI18nLang(lang))
}
return Promise.resolve(lang)
}

main.js

import Vue from 'vue'
import App from './label.vue'
import store from './store/index'
import router from './router/index' import i18n, { loadLanguageAsync } from '@/utils/i18n'
import '@label/plugins/element-ui'
import '@/assets/styles/common.less'
import AppComponents from '@label/components/index' // 注册全局组件 Vue.config.productionTip = false
Vue.use(AppComponents) // a页
loadLanguageAsync('a').then(_ => {
new Vue({
i18n,
store,
router,
render: h => h(App)
}).$mount('#app')
})

切换语言组件

主要操作:切换时setCookie后重刷页面
原因:本来直接调用loadLanguageAsync是可以正常重刷语言包的,但是这里由于页面某些显示内容是来源于后端接口的,还是得重新请求,所以重刷了整页

setCookie('jd.erp.lang', lang || 'en_US', 1, { path: '/', domain: CUR_HOST_SUFFIX })
window.history.go(0)

组件内容如下:

// langs.vue
<template>
<el-dropdown
class="icon-info icon-langs"
@command="changeLang"
>
<img :src="imgSrc">
<el-dropdown-menu slot="dropdown">
<el-dropdown-item
v-for="item in langs"
:key="item.value"
:command="item.value"
:disabled="item.value === locale"
>
{{ item.label }}
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template> <script>
import { LANG, CUR_HOST_SUFFIX } from '@/constant'
import { setCookie } from '@/utils/utils' export default {
name: 'langs',
data () {
return {
imgSrc: require('@label/assets/icons/header-langs.svg'),
locale: LANG,
langs: [
{ label: '中文', value: 'zh_CN' },
{ label: 'English', value: 'en_US' }
]
}
},
methods: {
changeLang (lang) {
this.locale = lang
setCookie('jd.erp.lang', lang || 'en_US', 1, { path: '/', domain: CUR_HOST_SUFFIX })
window.history.go(0)
}
}
}
</script>
 

Element + Vue I18n动态import加载国际化语言包翻译文件的更多相关文章

  1. #iOS问题记录#动态Html加载本地CSS和JS文件

    所谓动态Html,指代码中组合生成的html字符串: 若需要加载本地CSS,图片,JS文件,则, 1,需要文件的全路径: 2,需要"file:///"标志: 例如: //获取文件全 ...

  2. 动态的加载显示oracle警告日志文件内容

    Last login: Fri Jan 25 00:37:47 2019 from oracle [root@oracle ~]# su - oracle [oracle@oracle ~]$ sql ...

  3. Vue 动态图片加载路径问题和解决方法

    最近在做一个树形结构的组件,使用了Vue和element UI中el-tree组件.因为树中每个节点都需要显示一个图标图片,并且需要根据后台传入的数据类型动态地显示,所以图片的路径需要动态地加载.下面 ...

  4. 深入浅出的webpack4构建工具---webpack+vue+router 按需加载页面(十五)

    1. 为什么需要按需加载? 对于vue单页应用来讲,我们常见的做法把页面上所有的代码都打包到一个bundle.js文件内,但是随着项目越来越大,文件越来越多的情况下,那么bundle.js文件也会越来 ...

  5. Vue代码分割懒加载的实现方法

    什么是懒加载 懒加载也叫延迟加载,即在需要的时候进行加载,随用随载. 为什么需要懒加载 在单页应用中,如果没有应用懒加载,运用webpack打包后的文件将会异常的大,造成进入首页时,需要加载的内容过多 ...

  6. Vue中图片的加载方式

    一.前言 VUE项目中图片的加载是必须的,那么vue中图片的加载方式有哪些呢,今天博主就抽点时间来为大家大概地捋一捋. 二.图片的加载方法 1.在本地加载图片(静态加载) 图片存放assets文件夹中 ...

  7. Java_动态重新加载Class总结

    在此记载Java动态重新加载Class的点点滴滴,实现之前也在网上看了很多文章,但发现不是很清晰,后来发现总结,看源码实现还是最靠谱. 直接上代码: package com.lkb.autoCode. ...

  8. 使用javassist运行时动态重新加载java类及其他替换选择

    在不少的情况下,我们需要对生产中的系统进行问题排查,但是又不能重启应用,java应用不同于数据库的存储过程,至少到目前为止,还不能原生的支持随时进行编译替换,从这种角度来说,数据库比java的动态性要 ...

  9. vue使用nprogress页面加载进度条

    vue使用nprogress页面加载进度条 NProgress是页面跳转是出现在浏览器顶部的进度条 官网:http://ricostacruz.com/nprogress/ github:https: ...

随机推荐

  1. 【解决】Pod 状态一直 Terminating,Need to kill Pod

    偶然查看服务时发现有个单副本的 pod 一直处于Terminating状态,已达 8 天之久,且手动删除删除不掉 [appuser@lyj 2019-09-20 14:35:36 ~]$ kubect ...

  2. Socket网络编程-SocketServer

    Socket网络编程-SocketServer 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.SocketServer概述 socket编程过于底层,编程虽然有套路,但是想要写 ...

  3. Codeforces Round #601 (Div. 2) E2. Send Boxes to Alice (Hard Version)

    Codeforces Round #601 (Div. 2) E2. Send Boxes to Alice (Hard Version) N个盒子,每个盒子有a[i]块巧克力,每次操作可以将盒子中的 ...

  4. Mock Server之接口信息从DB获取

    上一篇,写了Mock Server的基础实现与被测系统的对接 当我们mock的接口信息.返回值等时不时维护时,都要在代码中编辑,那体验就不太好了,如果这些可以直接在浏览器编辑就好了. 因此对后端部分做 ...

  5. 前端重定向,index.html文件被浏览器缓存,导致整个应用都是旧的

    解决方法:https://github.com/ant-design/ant-design-pro/issues/1365#issuecomment-384496088

  6. hive Hive 2.0函数大全(中文版)(转)

    转自:https://www.cnblogs.com/MOBIN/p/5618747.html#1 摘要 Hive内部提供了很多函数给开发者使用,包括数学函数,类型转换函数,条件函数,字符函数,聚合函 ...

  7. HelloPlatform

    #include <stdio.h> int main() { #if _PLATFORM_ == _PLATFORM_TRU64 printf("Hello _PLATFORM ...

  8. 重构之字段改名 UML行为图 用例图 时序图&协作图 状态图&活动图 依恋情结

    简单的使用一下字段改名 为什么使用字段改名: ​ 你在一个软件上做的工作越多,对这个软件的数据的理解就越深刻,你需要把这些理解融入到代码中.利用名字的解释作用,让代码更容易被理解. 如何找到该变量的所 ...

  9. http协议 | http缓存

    缓存控制 1.禁止进行缓存:缓存中不得存储任何关于客户端请求和服务端响应的内容.每次由客户端发起的请求都会下载完整的响应内容. Cache-Control: no-store Cache-Contro ...

  10. Brief Introduction to SDK – JRE – JVM – JIT

    Brief Introduction to SDK – JRE – JVM – JIT SDK This is complete collection of Java stuff, as it has ...