Element + Vue I18n动态import加载国际化语言包翻译文件
需求
项目为多页应用,包含产品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加载国际化语言包翻译文件的更多相关文章
- #iOS问题记录#动态Html加载本地CSS和JS文件
所谓动态Html,指代码中组合生成的html字符串: 若需要加载本地CSS,图片,JS文件,则, 1,需要文件的全路径: 2,需要"file:///"标志: 例如: //获取文件全 ...
- 动态的加载显示oracle警告日志文件内容
Last login: Fri Jan 25 00:37:47 2019 from oracle [root@oracle ~]# su - oracle [oracle@oracle ~]$ sql ...
- Vue 动态图片加载路径问题和解决方法
最近在做一个树形结构的组件,使用了Vue和element UI中el-tree组件.因为树中每个节点都需要显示一个图标图片,并且需要根据后台传入的数据类型动态地显示,所以图片的路径需要动态地加载.下面 ...
- 深入浅出的webpack4构建工具---webpack+vue+router 按需加载页面(十五)
1. 为什么需要按需加载? 对于vue单页应用来讲,我们常见的做法把页面上所有的代码都打包到一个bundle.js文件内,但是随着项目越来越大,文件越来越多的情况下,那么bundle.js文件也会越来 ...
- Vue代码分割懒加载的实现方法
什么是懒加载 懒加载也叫延迟加载,即在需要的时候进行加载,随用随载. 为什么需要懒加载 在单页应用中,如果没有应用懒加载,运用webpack打包后的文件将会异常的大,造成进入首页时,需要加载的内容过多 ...
- Vue中图片的加载方式
一.前言 VUE项目中图片的加载是必须的,那么vue中图片的加载方式有哪些呢,今天博主就抽点时间来为大家大概地捋一捋. 二.图片的加载方法 1.在本地加载图片(静态加载) 图片存放assets文件夹中 ...
- Java_动态重新加载Class总结
在此记载Java动态重新加载Class的点点滴滴,实现之前也在网上看了很多文章,但发现不是很清晰,后来发现总结,看源码实现还是最靠谱. 直接上代码: package com.lkb.autoCode. ...
- 使用javassist运行时动态重新加载java类及其他替换选择
在不少的情况下,我们需要对生产中的系统进行问题排查,但是又不能重启应用,java应用不同于数据库的存储过程,至少到目前为止,还不能原生的支持随时进行编译替换,从这种角度来说,数据库比java的动态性要 ...
- vue使用nprogress页面加载进度条
vue使用nprogress页面加载进度条 NProgress是页面跳转是出现在浏览器顶部的进度条 官网:http://ricostacruz.com/nprogress/ github:https: ...
随机推荐
- kubernetes V1.16 Ingress-nginx部署
Ingress 在Kubernetes中,服务和Pod的IP地址仅可以在集群网络内部使用,对于集群外的应用是不可见的.为了使外部的应用能够访问集群内的服务,在Kubernetes中可以通过NodePo ...
- Django:RestFramework之-------分页
9.分页操作 分页,看第n页,每页显示n条数据 分页,在n个位置,向后查看n条数据. 加密分页,上一页和下一页 1.基于PageNumberPagination分页 1.路由: url(r'^(?P& ...
- vue.js 如何加载本地json文件
在项目开发的过程中,因为无法和后台的数据做交互,所以我们可以自建一个假数据文件(如data.json)到项目文件夹中,这样我们就可以模仿后台的数据进行开发.但是,如何在一个vue.js 项目中引入本地 ...
- Java 之 lambda 表达式
一.函数式编程思想概述 在数学中,函数就是有输入量.输出量的一套计算方案,就是“拿什么东西做什么事情”.相对而言,面向对象过分强调“必须通过对象的形式来做事情”,而函数式思想则尽量忽略面向对象的复杂语 ...
- odex vdex art区别
一.vdexpackage 直接转化的 可执行二进制码 文件:1.第一次开机就会生成在/system/app/<packagename>/oat/下:2.在系统运行过程中,虚拟机将其 从 ...
- Prometheus学习笔记(3)什么是node_exporter???
目录 Node_exporter安装配置启动 Node_exporter安装配置启动 node_exporter安装在被监控端,安装方式也比较简单,直接下载解压安装即可,默认启动后监听9100端口. ...
- 手写神经网络Python深度学习
import numpy import scipy.special import matplotlib.pyplot as plt import scipy.misc import glob impo ...
- 【异常】ERROR in ch.qos.logback.core.joran.spi.Interpreter@159:22 - no applicable action for [charset], current ElementPath is [[configuration][appender][encoder][charset]]
一.异常信息 Exception in thread "restartedMain" java.lang.reflect.InvocationTargetException at ...
- 10 分钟上手 Vim,常用命令大盘点
传闻有 180 万的程序员不知道如何退出 Vim 编辑器,真的有这么困难吗?下面给大家整理了一份 Vim 常用命令,让你 10 分钟快速上手 Vim,溜得飞起! 以下命令请在普通模式执行 1.移动光标 ...
- 常用Windows命令、常用 Cmd命令(补充)
常用的Windows 命令使用能够提升工作效率以及快捷处理事项. 下面为平时常用的Windows 命令/cmd 命令. 一.以下命令无需打开cmd 窗口即可操作(输入完毕 打个 回车,即可执行). 1 ...