🌰 vue-i18n 通过key值查询对应语言

工作中运营部门的语言包管理后台导出JOSN格式是 { 数字:翻译的字段 } 展现在页面中,不知所云,后期维护起来完全不知道这是个什么东西,所以就用key值看查询对应的value,再反过来用value查出对应的字段进行展示

🍩 对应的json文件

// zh-cn.json
{
"24013":"使用 vue-i18n",
"24014":"引入依赖",
"24015":"导出依赖",
.....
}
// en.json
{
"24013":"Use vue-i18n",
"24014":"import dependencies",
"24015":"export dependencies",
.....
}

🍪 v2中使用

/*
main.js
*/
import Vue from 'vue'
import VueI18n from 'vue-i18n'
import findKey from 'lodash/findKey.js'
// 在 VueI18n 原型链上面添加 translation 转换的方法
VueI18n.prototype.translation = function (value) {
const zh = require('~/zh-cn.json')
const val = findKey(zh, function (o) {
return o == value
})
if (!val) {
return value + '(未翻译)'
}
return this.$t(val)
}
const i18n = new VueI18n({
locale: "zh-cn", // 定义默认语言为中文
messages: {
"zh-cn": require("../zh-cn.json"),
en: require("../en.json"),
// .....
},
});
Vue.prototype.$v = i18n.translation;
Vue.use(VueI18n)
/*
xxx.vue
*/
<template> {{ $v('引入依赖') }} </template>
// 如果该字段json文件中没有就会渲染成 ------ 引入依赖(未翻译)

🎂 v3中使用

/*
utlis/i18n.ts
*/
import { createI18n } from 'vue-i18n'
// vite 动态引入所有语言
const files = import.meta.globEager('../public/lang/**.json') // 同步引入
let messages: any = {}
for (const key in files) {
messages[key.split('_')[1].split('.')[0].toLowerCase()] = files[key].default
}
const language = (navigator.language || 'en').toLocaleLowerCase() // 获取浏览器的语言
const i18n: any = createI18n({
legacy: false,
locale: localStorage.getItem('langCode') || language.split('-')[0] || 'en', // 从缓存里拿,没有就用浏览器语言
messages,
})
export default i18n
/*
utlis/utlis.ts
*/
import findKey from 'lodash/findKey.js'
import i18n from './i18n'
// 配置全局公共方法使用
const langTranslation = (value: any) => {
const module = import.meta.globEager(`../public/lang/TXT_zh-CN.json`)
const val = findKey(module['../public/lang/TXT_zh-CN.json'].default, function (o: any) {
// if (o == value) console.log('o', o)
return o == value
})
// console.log('val: ', val)
if (!val) {
return value + '(未翻译)'
}
return i18n.global.tm(val)
}
export default {
install: (app: any) => {
app.config.globalProperties.vvv = langTranslation
},
}
/*
main.ts
*/
import { createApp } from 'vue'
import commonFun from './utlis/utlis'
import i18n from './utlis/i18n'
const app = createApp(App)
app.use(i18n).use(commonFun)

🥧 nuxt 中使用

/*
plugins/utlis.js
*/
import Vue from 'vue'
import findKey from 'lodash/findKey.js'
import VueI18n from 'vue-i18n'
Vue.use(VueI18n)
VueI18n.prototype.translation = function (value) {
const zh = require('~/zh-cn.json')
const val = findKey(zh, function (o) {
return o == value
})
if (!val) {
return value + '(未翻译)'
}
return this.$t(val)
}
export default ({ app, store, $axios, $cookies }) => {
app.i18n = new VueI18n({
silentTranslationWarn: true,
locale: store.state.LanguageCode,
fallbackLocale: 'en',
messages: {
'zh-cn': require('~/zh-cn.json'),
ar: require('~/ar.json'),
en: require('~/en.json'),
de: require('~/de.json'),
}
})
Vue.prototype.$v = app.i18n.translation
}
/*
nuxt.confog.js
*/
plugins: [
'~/plugins/utlis.js',
],