234 lines
8.4 KiB
JavaScript
Vendored
234 lines
8.4 KiB
JavaScript
Vendored
const languageTypeLists = {
|
||
"EN": "English",
|
||
"KM": "ភាសាខ្មែរ",
|
||
"TH": "ภาษาไทย",
|
||
"KO": "한국어",
|
||
"JA": "日本語",
|
||
"CN": "中文-简体",
|
||
"TC": "中文-繁體",
|
||
};
|
||
const languageCachesObjects = {};
|
||
const languageListenerObjects = [];
|
||
|
||
export default {
|
||
install(Vue) {
|
||
Vue.mixin({
|
||
data() {
|
||
return {
|
||
languageInit: false,
|
||
languageData: [],
|
||
languageType: window.localStorage['__language:type__'] || this.__getNavigatorLanguage(),
|
||
languageList: languageTypeLists,
|
||
}
|
||
},
|
||
|
||
watch: {
|
||
languageType: {
|
||
handler(type) {
|
||
if (type && typeof this.initLanguage === "function") {
|
||
this.initLanguage();
|
||
}
|
||
},
|
||
immediate: true
|
||
},
|
||
},
|
||
|
||
methods: {
|
||
/**
|
||
* 获取浏览器默认语言
|
||
* @returns {string}
|
||
* @private
|
||
*/
|
||
__getNavigatorLanguage() {
|
||
let lang = 'EN';
|
||
let navLang = (navigator.language || navigator.userLanguage + "").toUpperCase();
|
||
switch (navLang) {
|
||
case "EN":
|
||
case "KM":
|
||
case "TH":
|
||
case "KO":
|
||
case "JA":
|
||
lang = navLang
|
||
break;
|
||
case "ZH-CN":
|
||
case "ZH":
|
||
lang = 'CN'
|
||
break;
|
||
case "ZH-TW":
|
||
case "ZH-HK":
|
||
lang = 'TC'
|
||
break;
|
||
}
|
||
return window.localStorage['__language:type__'] = lang;
|
||
},
|
||
|
||
/**
|
||
* 初始化语言数据
|
||
* @private
|
||
*/
|
||
__initLanguageData() {
|
||
if (this.languageInit === false) {
|
||
this.languageInit = true;
|
||
//
|
||
this.addLanguageData(require("../../../lang/language.js").default);
|
||
//
|
||
languageListenerObjects.push((lang) => {
|
||
this.languageType = lang;
|
||
});
|
||
}
|
||
},
|
||
|
||
/**
|
||
* 是否数组
|
||
* @param obj
|
||
* @returns {boolean}
|
||
* @private
|
||
*/
|
||
__isArray(obj) {
|
||
return typeof (obj) == "object" && Object.prototype.toString.call(obj).toLowerCase() == '[object array]' && typeof obj.length == "number";
|
||
},
|
||
|
||
/**
|
||
* 监听语言变化
|
||
* @param callback
|
||
*/
|
||
setLanguageListener(callback) {
|
||
if (typeof callback === 'function') {
|
||
languageListenerObjects.push((lang) => {
|
||
callback(lang);
|
||
});
|
||
}
|
||
},
|
||
|
||
/**
|
||
* 语言包数据
|
||
* @param data
|
||
*/
|
||
addLanguageData(data) {
|
||
if (!this.__isArray(data)) {
|
||
return;
|
||
}
|
||
this.__initLanguageData();
|
||
this.languageData.push(...data);
|
||
},
|
||
|
||
/**
|
||
* 变化语言
|
||
* @param language
|
||
*/
|
||
setLanguage(language) {
|
||
this.__initLanguageData();
|
||
setTimeout(() => {
|
||
window.localStorage['__language:type__'] = language;
|
||
languageListenerObjects.forEach((call) => {
|
||
if (typeof call === 'function') {
|
||
call(language);
|
||
}
|
||
});
|
||
}, 10)
|
||
},
|
||
|
||
/**
|
||
* 获取语言
|
||
* @returns {*}
|
||
*/
|
||
getLanguage() {
|
||
this.__initLanguageData();
|
||
return this.languageType;
|
||
},
|
||
|
||
/**
|
||
* 替换%遍历
|
||
* @param text
|
||
* @param objects
|
||
*/
|
||
replaceArgumentsLanguage(text, objects) {
|
||
let j = 1;
|
||
while (text.indexOf("%") !== -1) {
|
||
if (typeof objects[j] === "object") {
|
||
text = text.replace("%", "");
|
||
} else {
|
||
text = text.replace("%", objects[j]);
|
||
}
|
||
j++;
|
||
}
|
||
return text;
|
||
},
|
||
|
||
/**
|
||
* 译文转义
|
||
* @param val
|
||
* @returns {string|*}
|
||
*/
|
||
replaceEscape(val) {
|
||
if (!val || val == '') {
|
||
return '';
|
||
}
|
||
return val.replace(/%/g, '%').replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
|
||
},
|
||
|
||
/**
|
||
* 显示语言
|
||
* @return {string}
|
||
*/
|
||
$L(text) {
|
||
if (typeof arguments[1] !== "undefined") {
|
||
return this.$L(this.replaceArgumentsLanguage(text, arguments));
|
||
}
|
||
if (typeof text !== "string" || !text) {
|
||
return text;
|
||
}
|
||
this.__initLanguageData();
|
||
//
|
||
if (typeof languageCachesObjects[text] === "undefined") {
|
||
let tmpRege = null;
|
||
let tmpData = this.languageData.find((obj) => {
|
||
return Object.values(obj).find((val) => {
|
||
tmpRege = new RegExp("^" + this.replaceEscape(val).replace(/%/g, "(.*?)") + "$", "g");
|
||
return !!text.match(tmpRege);
|
||
})
|
||
});
|
||
languageCachesObjects[text] = {
|
||
rege: tmpRege,
|
||
data: tmpData,
|
||
};
|
||
}
|
||
const {rege, data} = languageCachesObjects[text];
|
||
if (data
|
||
&& typeof data === "object"
|
||
&& typeof data[this.languageType] !== "undefined"
|
||
&& data[this.languageType]) {
|
||
let index = 0;
|
||
let value = data[this.languageType];
|
||
value = value.replace(/%/g, function () {
|
||
return "$" + (++index);
|
||
});
|
||
return text.replace(rege, value);
|
||
}
|
||
//
|
||
if (this.languageType == "CN") {
|
||
try {
|
||
let key = '__language:Undefined__';
|
||
let languageTmp = JSON.parse(window.localStorage[key] || '[]');
|
||
if (!this.__isArray(languageTmp)) {
|
||
languageTmp = [];
|
||
}
|
||
let tmpRege = null;
|
||
let tmpData = languageTmp.find((val) => {
|
||
tmpRege = new RegExp("^" + val.replace(/%/g, "(.*?)") + "$", "g");
|
||
return !!text.match(tmpRege);
|
||
});
|
||
if (!tmpData) {
|
||
languageTmp.push(text);
|
||
window.localStorage[key] = JSON.stringify(languageTmp);
|
||
}
|
||
} catch (e) { }
|
||
}
|
||
//
|
||
return text;
|
||
}
|
||
}
|
||
});
|
||
}
|
||
}
|