mirror of
https://github.com/kuaifan/dootask.git
synced 2026-01-16 12:08:12 +00:00
276 lines
10 KiB
JavaScript
Vendored
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;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|