mirror of
https://github.com/kuaifan/dootask.git
synced 2025-12-11 18:42:54 +00:00
176 lines
5.1 KiB
JavaScript
Vendored
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}
|