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,53 +215,55 @@ 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];
value = value.replace(/%/g, function () { if (value) {
return "$" + (++index); if (rege === null) {
}); return value
return text.replace(rege, value); }
let index = 0;
value = value.replace(/%/g, function () {
return "$" + (++index);
});
return text.replace(rege, value);
}
} }
// //
if (this.languageType == "CN") { if (this.languageType == "CN") {
try { setTimeout(_ => {
let key = '__language:Undefined__'; try {
let languageTmp = JSON.parse(window.localStorage[key] || '[]'); let key = '__language:Undefined__';
if (!this.__isArray(languageTmp)) { let languageTmp = JSON.parse(window.localStorage[key] || '[]');
languageTmp = []; if (!this.__isArray(languageTmp)) {
} languageTmp = [];
let tmpRege = null; }
let tmpData = languageTmp.find((val) => { let tmpRege = null;
tmpRege = new RegExp("^" + val.replace(/%/g, "(.*?)") + "$", "g"); let tmpData = languageTmp.find((val) => {
return !!text.match(tmpRege); tmpRege = new RegExp("^" + val.replace(/%/g, "(.*?)") + "$", "g");
}); return !!text.match(tmpRege);
if (!tmpData) { });
languageTmp.push(text); if (!tmpData) {
window.localStorage[key] = JSON.stringify(languageTmp); languageTmp.push(text);
} window.localStorage[key] = JSON.stringify(languageTmp);
} catch (e) { } }
} catch (e) { }
}, 10)
} }
// //
return text; return text;