-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
148 lines (145 loc) · 4.51 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/**
* i18n多语言模块 ,基于vue-i18n,提供多语言解决方案
* 并且每个页面中可以自行设置个性化i18n属性语言包
* {
* dir:"i18n", // 全局语言包的自动加载目录,内部文件名则为语言包名 [lang].json.
* locale:'zh', // 默认的语言
* fallbackLocale:'zh', // 找不到语言包的回滚语言
* silentFallbackWarn:true, // 静默回滚错误
*/
import VueI18n from 'vue-i18n'
const langsImporter = import.meta.glob("@/<%=(option.dir||'i18n')%>/*.json")
// console.log(langsImporter)
// i18n操作类
class LocaleOperator{
constructor(options){
this.dymicImporters = {}
for(var k in langsImporter){
const regs = k.match(/\W([a-zA-Z]+\w+)\.json$/i)
if(regs&®s.length>1){
const lang = regs[1]
this.dymicImporters[lang] = [langsImporter[k]]
}
}
this.langs = Object.keys(this.dymicImporters)
this.langsLoaded = []
this.i18n = new VueI18n(options)
this.localeKey = '__locale'
}
// 获取当前语言
getLocale(){
let locale = this.i18n.locale
if(window&&window.localStorage){
const localLang = localStorage.getItem(this.localeKey)
if(localLang && locale!=localLang){
locale = localLang
}
}
return locale
}
// 设置当前语言
setLocale(lang){
if(window&&window.localStorage){
localStorage.setItem(this.localeKey,lang)
document.querySelector('html').setAttribute('lang', lang)
}
this.i18n.locale = lang
// console.log(lang,this.i18n.getLocaleMessage(lang))
return lang
}
// 加载语言包
loadLocaleMessage(lang){
// 不包含语言包
if(!lang || !this.langs.includes(lang)){
console.error('[@vitescv/i18n] '+lang+' is not exited!')
return Promise.resolve(false)
}
// 已加载
if(this.langsLoaded.includes(lang)){
return Promise.resolve(this.setLocale(lang))
}
// // 现有相同
// if(this.i18n.locale === lang){
// return Promise.resolve(this.setLocale(lang))
// }
// 尚未加载
return Promise.all(this.dymicImporters[lang].map(importer=>{
if(typeof importer == 'function'){
importer = importer()
}
if(importer instanceof Promise){
return importer.then(m=>{
return m.default?m.default.__esModule?m.default.default:m.default:m
}).catch(e=>{
console.error('[@vitescv/i18n] '+e.message)
return false
})
}
return importer
}))
.then((messages)=>{
messages.forEach(message=>{
this.i18n.mergeLocaleMessage(lang,message)
// this.i18n.setLocaleMessage(lang, message)
})
this.langsLoaded.push(lang)
return this.setLocale(lang)
}).catch(e=>{
console.error(e)
})
}
}
export default async function(option,Context){
Context.Vue.use(VueI18n)
if(!option||!option.locale){
console.error("[@vitescv/i18n] the locale option is required!")
return false
}
option = Object.assign({
silentFallbackWarn:false,
messages:{}
},option)
// 初始化
const localeOperator = new LocaleOperator(option)
// 注入Context语言包加载语言包方法给第三方
Context.I18n = {
// 增加语言包对应的加载方法或者数据
setLocaleMessage(lang,importer){
if(localeOperator.langs.includes(lang)){
localeOperator.dymicImporters[lang].push(importer)
}
},
// setLocaleMessage的批量方法,importers为lang和importer的映射对象
setLocaleMessages(importers){
for (const lang in importers) {
this.setLocaleMessage(lang,importers[lang])
}
},
// 获取支持的语言包列表
langs:localeOperator.langs,
// i18n实例
i18n:localeOperator.i18n,
}
Context.hook("APP:INIT",function(options) {
Object.assign(options,{
i18n:localeOperator.i18n,
mixin:{
watch: {
'$i18n.locale'(newValue,oldValue) {
localeOperator.loadLocaleMessage(newValue)
}
}
}
})
})
Context.hook("APP:CREATED",function(){
// 初始化默认语言
const locale = localeOperator.getLocale()
localeOperator.loadLocaleMessage(locale)
localeOperator.setLocale(locale)
// 注册router钩子函数来判断语言
Context.router.beforeEach((to,from,next)=>{
localeOperator.loadLocaleMessage(localeOperator.i18n.locale).then(next())
})
})
}