NEZ-1157 feat: 国际化内容改为后端控制
This commit is contained in:
@@ -1,13 +1,28 @@
|
|||||||
import Vue from 'vue'
|
import Vue from 'vue'
|
||||||
import locale from 'element-ui/lib/locale'
|
import locale from 'element-ui/lib/locale'
|
||||||
import VueI18n from 'vue-i18n'
|
import VueI18n from 'vue-i18n'
|
||||||
import messages from './language'
|
// import messages from './language'
|
||||||
Vue.use(VueI18n)
|
Vue.use(VueI18n)
|
||||||
// 从localStorage获取语言选择。
|
// 从localStorage获取语言选择。
|
||||||
const i18n = new VueI18n({
|
const i18n = new VueI18n({
|
||||||
locale: localStorage.getItem('nz-language') || 'en', // 初始未选择默认 en 英文
|
locale: localStorage.getItem('nz-language') || 'en' // 初始未选择默认 en 英文
|
||||||
messages
|
// messages
|
||||||
})
|
})
|
||||||
locale.i18n((key, value) => i18n.t(key, value)) // 兼容element
|
locale.i18n((key, value) => i18n.t(key, value)) // 兼容element
|
||||||
|
|
||||||
|
export function loadI18n (i18nData) {
|
||||||
|
if (i18nData) {
|
||||||
|
Object.keys(i18nData).forEach(lang => {
|
||||||
|
i18n.setLocaleMessage(lang, i18nData[lang])
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
i18nData = localStorage.getItem('nz-i18n-data')
|
||||||
|
if (i18nData) {
|
||||||
|
i18nData = JSON.parse(i18nData)
|
||||||
|
Object.keys(i18nData).forEach(lang => {
|
||||||
|
i18n.setLocaleMessage(lang, i18nData[lang])
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
export default i18n
|
export default i18n
|
||||||
|
|||||||
@@ -7,12 +7,12 @@
|
|||||||
<div class="login-label"></div>
|
<div class="login-label"></div>
|
||||||
<div class="login-input" v-if="!verifyShow">
|
<div class="login-input" v-if="!verifyShow">
|
||||||
<i class="nz-icon nz-icon-user"></i>
|
<i class="nz-icon nz-icon-user"></i>
|
||||||
<input id="usernameInput" v-model="loginData.username" name="userName" autocomplete="on" :placeholder="$t('login.username')" @keydown.enter="login"></input>
|
<input id="usernameInput" v-model="loginData.username" autocomplete="on" name="userName" placeholder="Username" @keydown.enter="login"></input>
|
||||||
</div>
|
</div>
|
||||||
<div class="login-label"></div>
|
<div class="login-label"></div>
|
||||||
<div class="login-input" v-if="!verifyShow">
|
<div class="login-input" v-if="!verifyShow">
|
||||||
<i class="nz-icon nz-icon-password"></i>
|
<i class="nz-icon nz-icon-password"></i>
|
||||||
<input v-model="loginData.pin" type="password" name="password" autocomplete="on" :placeholder="$t('login.pin')" @keydown.enter="login"></input>
|
<input v-model="loginData.pin" autocomplete="on" name="password" placeholder="Password" type="password" @keydown.enter="login"></input>
|
||||||
</div>
|
</div>
|
||||||
<div class="login-label" v-if="verifyShow">{{$t('login.verifyTitle')}}</div>
|
<div class="login-label" v-if="verifyShow">{{$t('login.verifyTitle')}}</div>
|
||||||
<div class="login-input" v-if="verifyShow">
|
<div class="login-input" v-if="verifyShow">
|
||||||
@@ -23,17 +23,8 @@
|
|||||||
{{$t('login.verifyContent')}}
|
{{$t('login.verifyContent')}}
|
||||||
</div>
|
</div>
|
||||||
<div class="login-foot">
|
<div class="login-foot">
|
||||||
<button v-if="!verifyShow" id="login" v-loading="loading" :class="{'nz-btn-disabled': !license.valid}" class="login-btn" @click="login">{{$t("login.login")}}</button>
|
<button v-if="!verifyShow" id="login" v-loading="loading" :class="{'nz-btn-disabled': !license.valid}" class="login-btn" @click="login">Login</button>
|
||||||
<button v-if="verifyShow" id="verify" v-loading="loading" :class="{'nz-btn-disabled': !license.valid}" class="login-btn" @click="verify">{{$t("login.verify")}}</button>
|
<button v-if="verifyShow" id="verify" v-loading="loading" :class="{'nz-btn-disabled': !license.valid}" class="login-btn" @click="verify">{{$t("login.verify")}}</button>
|
||||||
<!-- <div class="login-foot-lang" @click.stop="langListShow = !langListShow">-->
|
|
||||||
<!-- <i v-if="lang == 'en'" class="nz-icon nz-icon-lang-en"></i>-->
|
|
||||||
<!-- <i v-else-if="lang == 'cn'" class="nz-icon nz-icon-lang-zh"></i>-->
|
|
||||||
<!-- <i class="nz-icon nz-icon-arrow-down"></i>-->
|
|
||||||
<!-- </div>-->
|
|
||||||
<!-- <div class="login-foot-lang-list" v-show="langListShow">-->
|
|
||||||
<!-- <i v-if="lang != 'en'" @click="changeLang('en')" class="nz-icon nz-icon-lang-en"></i>-->
|
|
||||||
<!-- <i v-if="lang != 'cn'" @click="changeLang('cn')" class="nz-icon nz-icon-lang-zh"></i>-->
|
|
||||||
<!-- </div>-->
|
|
||||||
</div>
|
</div>
|
||||||
<div class="login-license">
|
<div class="login-license">
|
||||||
<div class="license-warn" v-if="license.warnInfo">{{license.warnInfo}}</div>
|
<div class="license-warn" v-if="license.warnInfo">{{license.warnInfo}}</div>
|
||||||
|
|||||||
@@ -37,8 +37,8 @@
|
|||||||
placeholder=""
|
placeholder=""
|
||||||
popper-class="right-box-select-top prevent-clickoutside"
|
popper-class="right-box-select-top prevent-clickoutside"
|
||||||
size="small">
|
size="small">
|
||||||
<template v-for="item in languageList">
|
<template v-for="item in langList">
|
||||||
<el-option :key="item.value" :label="item.label" :value="item.value"></el-option>
|
<el-option :key="item.value" :label="item.name" :value="item.value"></el-option>
|
||||||
</template>
|
</template>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -71,17 +71,17 @@ export default {
|
|||||||
type: Object
|
type: Object
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {},
|
computed: {
|
||||||
|
langList () {
|
||||||
|
return this.$store.getters.getLangList
|
||||||
|
}
|
||||||
|
},
|
||||||
mixins: [editRigthBox],
|
mixins: [editRigthBox],
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
url: 'sys/user/profile',
|
url: 'sys/user/profile',
|
||||||
rightBox: { profile: { show: false } },
|
rightBox: { profile: { show: false } },
|
||||||
editProfile: {},
|
editProfile: {},
|
||||||
languageList: [
|
|
||||||
{ value: 'en', label: 'English' },
|
|
||||||
{ value: 'cn', label: '简体中文' }
|
|
||||||
],
|
|
||||||
rules: {
|
rules: {
|
||||||
name: [
|
name: [
|
||||||
{ required: true, message: this.$t('validate.required'), trigger: 'blur' }
|
{ required: true, message: this.$t('validate.required'), trigger: 'blur' }
|
||||||
|
|||||||
@@ -38,12 +38,15 @@
|
|||||||
<i class="nz-icon nz-icon-language-change"></i>
|
<i class="nz-icon nz-icon-language-change"></i>
|
||||||
</div>
|
</div>
|
||||||
<el-dropdown-menu slot="dropdown" class="right-box-select-top right-public-box-dropdown-top">
|
<el-dropdown-menu slot="dropdown" class="right-box-select-top right-public-box-dropdown-top">
|
||||||
<el-dropdown-item>
|
<el-dropdown-item v-for="lang in langList" :key="lang.value">
|
||||||
|
<div :style="language === lang.value ? 'color:#f90' : ''" @click="changeLocal(lang.value)"><i :class="`nz-icon-lang-${lang.value}`" class="nz-icon"></i>{{lang.name}}</div>
|
||||||
|
</el-dropdown-item>
|
||||||
|
<!-- <el-dropdown-item>
|
||||||
<div id="header-to-english" :style="language === 'en'?'color:#f90':''" @click="changeLocal('en')"><i class="nz-icon nz-icon-lang-en"></i>English</div>
|
<div id="header-to-english" :style="language === 'en'?'color:#f90':''" @click="changeLocal('en')"><i class="nz-icon nz-icon-lang-en"></i>English</div>
|
||||||
</el-dropdown-item>
|
</el-dropdown-item>
|
||||||
<el-dropdown-item>
|
<el-dropdown-item>
|
||||||
<div id="header-to-chinese" :style="language === 'cn'?'color:#f90':''" @click="changeLocal('cn')"><i class="nz-icon nz-icon-lang-zh"></i>简体中文</div>
|
<div id="header-to-chinese" :style="language === 'cn'?'color:#f90':''" @click="changeLocal('cn')"><i class="nz-icon nz-icon-lang-zh"></i>简体中文</div>
|
||||||
</el-dropdown-item>
|
</el-dropdown-item>-->
|
||||||
</el-dropdown-menu>
|
</el-dropdown-menu>
|
||||||
</el-dropdown>
|
</el-dropdown>
|
||||||
<el-dropdown trigger="click">
|
<el-dropdown trigger="click">
|
||||||
@@ -209,6 +212,9 @@ export default {
|
|||||||
route () {
|
route () {
|
||||||
return this.$route.path
|
return this.$route.path
|
||||||
},
|
},
|
||||||
|
langList () {
|
||||||
|
return this.$store.getters.getLangList
|
||||||
|
},
|
||||||
breadcrumb () {
|
breadcrumb () {
|
||||||
if (this.$route.path === '/profile') {
|
if (this.$route.path === '/profile') {
|
||||||
return [
|
return [
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import store from './store'
|
|||||||
import { get, post } from './http'
|
import { get, post } from './http'
|
||||||
import ElementUI from 'element-ui'
|
import ElementUI from 'element-ui'
|
||||||
import Vue from 'vue'
|
import Vue from 'vue'
|
||||||
import i18n from './components/common/i18n'
|
import i18n, { loadI18n } from './components/common/i18n'
|
||||||
import VueResource from 'vue-resource'
|
import VueResource from 'vue-resource'
|
||||||
|
|
||||||
Vue.use(VueResource)
|
Vue.use(VueResource)
|
||||||
@@ -26,6 +26,15 @@ router.beforeEach((to, from, next) => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
} else if (sessionStorage.getItem('nz-token')) {
|
} else if (sessionStorage.getItem('nz-token')) {
|
||||||
|
// 从localStorage加载i18n
|
||||||
|
if (!store.getters.i18nIsReady) {
|
||||||
|
loadI18n()
|
||||||
|
const langList = localStorage.getItem('nz-language-list')
|
||||||
|
if (langList) {
|
||||||
|
store.commit('setLangList', JSON.parse(langList))
|
||||||
|
}
|
||||||
|
store.commit('i18nReady', true)
|
||||||
|
}
|
||||||
new Promise(resolve => {
|
new Promise(resolve => {
|
||||||
if (store.getters.menuList.length === 0) {
|
if (store.getters.menuList.length === 0) {
|
||||||
const configUrl = 'static/config.json?Timestamp=' + new Date().getTime()
|
const configUrl = 'static/config.json?Timestamp=' + new Date().getTime()
|
||||||
|
|||||||
@@ -35,7 +35,9 @@ const store = new Vuex.Store({
|
|||||||
showTopoScreen: false,
|
showTopoScreen: false,
|
||||||
logo: '',
|
logo: '',
|
||||||
isShrink: localStorage.getItem('nz-left-menu-shrink') == 'true',
|
isShrink: localStorage.getItem('nz-left-menu-shrink') == 'true',
|
||||||
metricsList: []
|
metricsList: [],
|
||||||
|
langList: [],
|
||||||
|
i18nReady: false
|
||||||
},
|
},
|
||||||
getters: {
|
getters: {
|
||||||
getLinkData (state) {
|
getLinkData (state) {
|
||||||
@@ -71,6 +73,12 @@ const store = new Vuex.Store({
|
|||||||
getMetricsList (state) {
|
getMetricsList (state) {
|
||||||
return state.metricsList
|
return state.metricsList
|
||||||
},
|
},
|
||||||
|
getLangList (state) {
|
||||||
|
return state.langList
|
||||||
|
},
|
||||||
|
i18nIsReady (state) {
|
||||||
|
return state.i18nReady
|
||||||
|
}
|
||||||
},
|
},
|
||||||
mutations: {
|
mutations: {
|
||||||
/* 监听对象变化,用于顶部菜单与底部内容的同步 */
|
/* 监听对象变化,用于顶部菜单与底部内容的同步 */
|
||||||
@@ -153,6 +161,12 @@ const store = new Vuex.Store({
|
|||||||
},
|
},
|
||||||
setMetricsList (state, metricsList) {
|
setMetricsList (state, metricsList) {
|
||||||
state.metricsList = [...metricsList]
|
state.metricsList = [...metricsList]
|
||||||
|
},
|
||||||
|
setLangList (state, langList) {
|
||||||
|
state.langList = langList
|
||||||
|
},
|
||||||
|
i18nReady (state, ready) {
|
||||||
|
state.i18nReady = ready
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
actions: {
|
actions: {
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
import { post, get } from '../http'
|
import { post, get } from '@/http'
|
||||||
import router from '../router'
|
import router from '../router'
|
||||||
import bus from '../libs/bus'
|
import bus from '../libs/bus'
|
||||||
import { sortByOrderNum } from '../permission'
|
import { sortByOrderNum } from '@/permission'
|
||||||
import moment from 'moment-timezone'
|
import moment from 'moment-timezone'
|
||||||
|
import i18n, { loadI18n } from '@/components/common/i18n'
|
||||||
|
|
||||||
const user = {
|
const user = {
|
||||||
state: {
|
state: {
|
||||||
@@ -74,6 +75,32 @@ const user = {
|
|||||||
localStorage.setItem('nz-user-name', userList.name)
|
localStorage.setItem('nz-user-name', userList.name)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
// 获取用户语言,存进localStorage
|
||||||
|
localStorage.setItem('nz-language', res.data.user.lang || 'en')
|
||||||
|
// 获取国际化内容
|
||||||
|
const getI18nData = new Promise(resolve => get('/sys/i18n/lang').then(response => {
|
||||||
|
if (response.code === 200) {
|
||||||
|
const i18nData = response.data
|
||||||
|
localStorage.setItem('nz-i18n-data', JSON.stringify(i18nData))
|
||||||
|
resolve(i18nData)
|
||||||
|
} else {
|
||||||
|
resolve()
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
// 获取可选语言
|
||||||
|
const getLangList = new Promise(resolve => get('/sys/dict/all?type=lang').then(response => {
|
||||||
|
if (response.code === 200) {
|
||||||
|
const langList = response.data.map(lang => ({ name: lang.name, value: lang.value }))
|
||||||
|
store.commit('setLangList', langList)
|
||||||
|
localStorage.setItem('nz-language-list', JSON.stringify(langList))
|
||||||
|
}
|
||||||
|
resolve()
|
||||||
|
}))
|
||||||
|
Promise.all([getI18nData, getLangList]).then(response => {
|
||||||
|
console.info(response)
|
||||||
|
response[0] && loadI18n(response[0])
|
||||||
|
store.commit('i18nReady', true)
|
||||||
|
})
|
||||||
},
|
},
|
||||||
logoutSuccess (store, res) {
|
logoutSuccess (store, res) {
|
||||||
sessionStorage.removeItem('nz-username')
|
sessionStorage.removeItem('nz-username')
|
||||||
|
|||||||
Reference in New Issue
Block a user