2022-12-01 18:18:45 +08:00

225 lines
6.0 KiB
JavaScript
Vendored

import {languageDefaultData} from "./data";
let languageUtils = {
/**
* 是否数组
* @param obj
* @returns {boolean}
*/
isArray(obj) {
return typeof (obj) == "object" && Object.prototype.toString.call(obj).toLowerCase() == '[object array]' && typeof obj.length == "number";
},
/**
* 转换Ascii编码
* @param value
* @returns {string}
*/
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 text
* @param objects
* @returns {*}
*/
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, '(.*?)');
},
/**
* 获取语言
* @returns {string}
*/
getLanguage() {
if (typeof window.localStorage['__language:type__'] === "string") {
return window.localStorage['__language:type__'];
}
let lang = 'EN';
let navLang = ((window.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;
}
};
let languageInit = false;
let languageData = [];
let languageType = languageUtils.getLanguage();
let languageList = {
"EN": "English",
"KM": "ភាសាខ្មែរ",
"TH": "ภาษาไทย",
"KO": "한국어",
"JA": "日本語",
"CN": "简体中文",
"TC": "繁體中文",
};
let languageAsciis = {};
/**
* 添加语言数据
* @param data
*/
function addLanguage(data) {
if (!languageUtils.isArray(data)) {
return;
}
languageData.unshift(...data);
}
/**
* 设置语言
* @param language
*/
function setLanguage(language) {
if (language === undefined) {
return
}
$A.modalConfirm({
content: '切换语言需要刷新后生效,是否确定刷新?',
cancelText: '取消',
okText: '确定',
onOk: () => {
window.localStorage['__language:type__'] = language;
$A.reloadUrl()
}
});
}
/**
* 获取当前语言
* @returns {string}
*/
function getLanguage() {
return languageType;
}
/**
* 转换语言
* @param text
* @returns {string|*}
*/
function switchLanguage(text) {
if (typeof arguments[1] !== "undefined") {
return switchLanguage(languageUtils.replaceArgumentsLanguage(text, arguments));
}
if (typeof text !== "string" || !text) {
return text;
}
//
if (languageInit === false) {
languageInit = true;
addLanguage(languageDefaultData);
addLanguage(window.languageData);
}
//
const ascii = languageUtils.convertAscii(text)
if (typeof languageAsciis[ascii] === "undefined") {
let tmpKey = null;
let tmpRege = null;
let tmpData = languageData.find((obj) => {
tmpKey = `${obj._ || obj.CN}`
if (tmpKey.indexOf("(*)") === -1) {
tmpRege = null;
return text == tmpKey
} else {
tmpRege = new RegExp("^" + languageUtils.replaceEscape(tmpKey) + "$", "g");
return !!text.match(tmpRege);
}
});
languageAsciis[ascii] = {rege: tmpRege, data: tmpData};
}
const {rege, data} = languageAsciis[ascii];
if (data) {
let value = data[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 (!languageUtils.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;
}
export { languageType, languageList, addLanguage, setLanguage, getLanguage, switchLanguage };