2022-07-16 22:13:57 +08:00

276 lines
10 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 === undefined) {
this.languageInit = false;
this.languageData = [];
this.languageType = window.localStorage['__language:type__'] || this.__getNavigatorLanguage();
this.languageList = languageTypeLists;
}
if (this.languageInit === false) {
this.languageInit = true;
//
this.addLanguageData(require("./language.js").default);
this.addLanguageData(window.languageData);
//
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";
},
/**
* 转换Ascii编码
* @param value
* @returns {string}
* @private
*/
__convertAscii(value) {
if (typeof value !== "string") {
value = String(value)
}
let nativecode = value.split("");
let ascii = "";
for (let i = 0; i < nativecode.length; i++) {
let code = Number(nativecode[i].charCodeAt(0));
if (code > 127) {
let charAscii = code.toString(16);
charAscii = String("0000").substring(charAscii.length, 4) + charAscii;
ascii += "\\u" + charAscii;
} else {
ascii += nativecode[i];
}
}
return ascii
},
/**
* 监听语言变化
* @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.unshift(...data);
},
/**
* 变化语言
* @param language
*/
setLanguage(language) {
if (language === undefined) {
return
}
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, '\\$&').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();
//
const ascii = this.__convertAscii(text)
if (typeof languageCachesObjects[ascii] === "undefined") {
let tmpKey = null;
let tmpRege = null;
let tmpData = this.languageData.find((obj) => {
tmpKey = `${obj._ || obj.CN}`
if (tmpKey.indexOf("(*)") === -1) {
tmpRege = null;
return text == tmpKey
} else {
tmpRege = new RegExp("^" + this.replaceEscape(tmpKey) + "$", "g");
return !!text.match(tmpRege);
}
});
languageCachesObjects[ascii] = {rege: tmpRege, data: tmpData};
}
const {rege, data} = languageCachesObjects[ascii];
if (data) {
let value = data[this.languageType];
if (value) {
if (rege === null) {
return value
}
let index = 0;
value = value.replace(/\(\*\)/g, function () {
return "$" + (++index);
});
return text.replace(rege, value);
}
}
//
if (window.systemInfo.debug === "yes") {
setTimeout(_ => {
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) { }
}, 10)
}
//
return text;
}
}
});
}
}