perf: 优化国际化

This commit is contained in:
kuaifan 2022-07-16 19:23:12 +08:00
parent c7dafa6199
commit d565501e04

View File

@ -95,6 +95,31 @@ export default {
return typeof (obj) == "object" && Object.prototype.toString.call(obj).toLowerCase() == '[object array]' && typeof obj.length == "number"; 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 * @param callback
@ -190,37 +215,38 @@ export default {
} }
this.__initLanguageData(); this.__initLanguageData();
// //
if (typeof languageCachesObjects[text] === "undefined") { const ascii = this.__convertAscii(text)
if (typeof languageCachesObjects[ascii] === "undefined") {
let tmpKey = null;
let tmpRege = null; let tmpRege = null;
let tmpData = this.languageData.find((obj) => { let tmpData = this.languageData.find((obj) => {
if (typeof obj._ !== "undefined") { tmpKey = obj._ || obj.CN
tmpRege = new RegExp("^" + this.replaceEscape(obj._).replace(/%/g, "(.*?)") + "$", "g"); if (String(tmpKey).indexOf("%")) {
tmpRege = new RegExp("^" + this.replaceEscape(tmpKey).replace(/%/g, "(.*?)") + "$", "g");
return !!text.match(tmpRege); return !!text.match(tmpRege);
} else {
return text == tmpKey
} }
return Object.values(obj).find((val) => {
tmpRege = new RegExp("^" + this.replaceEscape(val).replace(/%/g, "(.*?)") + "$", "g");
return !!text.match(tmpRege);
})
}); });
languageCachesObjects[text] = { languageCachesObjects[ascii] = {rege: tmpRege, data: tmpData};
rege: tmpRege,
data: tmpData,
};
} }
const {rege, data} = languageCachesObjects[text]; const {rege, data} = languageCachesObjects[ascii];
if (data if (data) {
&& typeof data === "object"
&& typeof data[this.languageType] !== "undefined"
&& data[this.languageType]) {
let index = 0;
let value = data[this.languageType]; let value = data[this.languageType];
if (value) {
if (rege === null) {
return value
}
let index = 0;
value = value.replace(/%/g, function () { value = value.replace(/%/g, function () {
return "$" + (++index); return "$" + (++index);
}); });
return text.replace(rege, value); return text.replace(rege, value);
} }
}
// //
if (this.languageType == "CN") { if (this.languageType == "CN") {
setTimeout(_ => {
try { try {
let key = '__language:Undefined__'; let key = '__language:Undefined__';
let languageTmp = JSON.parse(window.localStorage[key] || '[]'); let languageTmp = JSON.parse(window.localStorage[key] || '[]');
@ -237,6 +263,7 @@ export default {
window.localStorage[key] = JSON.stringify(languageTmp); window.localStorage[key] = JSON.stringify(languageTmp);
} }
} catch (e) { } } catch (e) { }
}, 10)
} }
// //
return text; return text;