2024-11-01 10:53:51 +08:00

176 lines
5.1 KiB
JavaScript
Vendored

const utils = require('./utils')
const languageList = utils.languageList
const languageName = utils.getLanguage()
const languageCache = new Map();
const languageRegex = [];
if (typeof window.LANGUAGE_DATA === "undefined") {
window.LANGUAGE_DATA = {}
}
/**
* 初始化语言,需在加载完语言文件后调用
*/
function initLanguage() {
if (typeof window.LANGUAGE_DATA === "undefined" || typeof window.LANGUAGE_DATA["key"] === "undefined") {
return
}
const keys = window.LANGUAGE_DATA['key'] || []
delete window.LANGUAGE_DATA['key'];
//
keys.forEach((key, index) => {
if (/\(%[TM]\d+\)/.test(key)) {
// 处理复杂的键值
const _m = {};
const translation = {
key: new RegExp("^" + utils.replaceEscape(key) + "$"),
}
for (let language in window.LANGUAGE_DATA) {
if (typeof languageList[language] === "undefined") {
continue
}
translation[language] = window.LANGUAGE_DATA[language][index]
?.replace(/\(%([TM])(\d+)\)/g, function (_, type, index) {
if (type === 'M') {
_m[index] = index;
}
return "$" + index;
});
}
translation._m = Object.keys(_m);
languageRegex.push(translation)
} else {
// 缓存简单的键值
for (let language in window.LANGUAGE_DATA) {
if (typeof languageList[language] === "undefined") {
continue
}
const result = window.LANGUAGE_DATA[language][index] || key
languageCache.set(`${key}-${language}`, result);
}
}
})
}
/**
* 添加语言数据
* @param data
*/
function addLanguage(data) {
if (!$A.isArray(data)) {
return
}
data.forEach(item => {
const {key, general} = item
if (!key) {
return
}
if (general) {
for (let language in window.LANGUAGE_DATA) {
if (typeof languageList[language] === "undefined") {
continue
}
languageCache.set(`${key}-${language}`, general);
}
}
for (let language in item) {
if (language === 'key' || language === 'general') {
continue
}
languageCache.set(`${key}-${language}`, item[language]);
}
})
}
/**
* 设置语言
* @param language
* @param silence
*/
function setLanguage(language, silence = false) {
if (language === undefined) {
return
}
if (silence) {
utils.saveLanguage(language);
(async () => {
await $A.IDBDel("callAt")
$A.reloadUrl()
})()
} else {
$A.modalConfirm({
content: '切换语言需要刷新后生效,是否确定刷新?',
cancelText: '取消',
okText: '确定',
onOk: () => setLanguage(language, true)
})
}
}
/**
* 获取最新语言
*/
function getLanguage() {
return utils.getLanguage();
}
/**
* 转换语言
* @param inputString
* @returns {string|*}
*/
function switchLanguage(inputString) {
if (typeof arguments[1] !== "undefined") {
inputString = utils.replaceArgumentsLanguage(inputString, arguments)
}
if (typeof inputString !== "string" || !inputString) {
return inputString
}
// 读取缓存
const cacheKey = `${inputString}-${languageName}`;
if (languageCache.has(cacheKey)) {
return languageCache.get(cacheKey);
}
// 正则匹配
for (const translation of languageRegex) {
const { key, _m } = translation;
const match = key.exec(inputString);
if (match && translation[languageName]) {
const result = translation[languageName].replace(/\$(\d+)/g, (_, index) => {
if (_m.includes(index)) {
return switchLanguage(match[index]);
}
return match[index] || '';
});
languageCache.set(cacheKey, result);
return result;
}
}
// 开发模式下,未翻译的文本自动添加到语言文件
if (window.systemInfo.debug === "yes") {
setTimeout(_ => {
try {
let cacheKey = '__language:Undefined__'
let languageTmp = JSON.parse(window.localStorage.getItem(cacheKey) || '[]')
if (!$A.isArray(languageTmp)) {
languageTmp = []
}
if (languageTmp.findIndex(item => item == inputString) === -1) {
languageTmp.push(inputString)
window.localStorage.setItem(cacheKey, JSON.stringify(languageTmp))
}
} catch (e) { }
}, 10)
}
// 未匹配返回原始字符串
languageCache.set(cacheKey, inputString);
return inputString;
}
export {languageName, languageList, addLanguage, setLanguage, initLanguage, getLanguage, switchLanguage}