import { getCurrentInstance } from 'vue' import { createI18n } from 'vue-i18n' // 本地语言包 import zhCN from '@/lang/zh-cn' import zhTW from '@/lang/zh-tw' import enUS from '@/lang/en-us' import viVN from '@/lang/vi-vn' import huHU from '@/lang/hu-hu' import { getLanguage } from '@/utils/auth' const localMessageMap = { //本地语言包映射关系 'zh-cn': { ...zhCN }, 'zh-tw': { ...zhTW }, 'en-us': { ...enUS }, 'vi-vn': { ...viVN }, 'hu-hu': { ...huHU }, } const localMessageKeys = Object.keys(localMessageMap) const setLocalMessage = (system: string) => { const packages = {} localMessageKeys.forEach((i: string) => { if (system) { packages[i] = { [system]: localMessageMap[i] } } else { packages[i] = localMessageMap[i] } }) return packages } const setReverseLang = (ZhCN: Record) => { //根据原中文包对象创建映射关系,实现中文反转译 const keysMapping = {} const compositeKeys = (Obj: Record, prevKeys?: string) => { const Str = prevKeys || '' if (Obj && typeof Obj === 'object') Object.keys(Obj).forEach((i: string) => { const Value = Obj[i] if (Value && typeof Value === 'string') { keysMapping[Value] = Str + i } if (Value && typeof Value === 'object' && !Array.isArray(Value) && i) { compositeKeys(Value, Str + i + '.') } }) } compositeKeys(ZhCN) return keysMapping } /** * * @param system 系统名称,用于隔离外部的语言包内容,反之覆盖掉,非必填 * @param i18n 已生成的多语言实例,非必填, * @returns */ export const initLang = (system?: string, i18n?: any) => { let reverseData = {} const localMessanges = setLocalMessage(system) const I18n = createI18n({ locale: i18n?.global?.locale || getLanguage() || 'zh-cn', //当前语言环境 fallbackLocale: 'zh-cn', //预制语言环境,当locale获取不到时 messages: localMessanges, silentTranslationWarn: true //避免一些警告 (同时保留那些完全没有翻译给定关键字的警告) }) const { mergeLocaleMessage } = I18n.global || {} if (mergeLocaleMessage) { localMessageKeys.forEach((i: string) => { const outMessages = i18n?.global?.messages || {} if(localMessanges && outMessages[i]){ mergeLocaleMessage(i, outMessages[i]) } }) } const { getLocaleMessage } = I18n?.global || {} if (getLocaleMessage) { reverseData = setReverseLang( getLocaleMessage('zh-cn') ) } /** * 重写$t 使用规则 本系统注册的语言包 路径不变, * 如果是引用外部系统的语言内容,比如001 使用 bootstrap基座的语言包,直接用路径时用不了的(系统与系统之间由各自的system的key值做了隔离) * 更推荐使用系统中文反转译的方式 比如 组件内直接使用 $t('多语言') 就可以实现'多语言'这个词的多语言切换,路径只适用于本系统的语言使用 **/ const Translate = (...arg: any[])=>{ const args = [...arg] const arg0 = args[0] if (arg0 && reverseData[arg0]) { args[0] = reverseData[arg0] }else{ const prefix = `${system}.` if(system && arg0.indexOf(prefix) !== 0){ args[0] = prefix + arg0 } } return I18n?.global?.t?.call( I18n, ...args ) } return { instance: I18n, install(app:any){ app.use(I18n) const Properties = app.config?.globalProperties Properties.$t = Translate Properties.$i18n = I18n.global Properties.I18n = I18n } } }