182 lines
5.6 KiB
JavaScript

const utils = require('./utils')
const languageList = utils.languageList
const languageName = utils.getLanguage()
const languageCache = new Map();
const languageTemplateCache = new Map();
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 template = utils.normalizeArgumentsLanguage(key)
const translateArguments = new Set();
key.replace(/\(%M(\d+)\)/g, (_, index) => {
translateArguments.add(index)
})
for (let language in window.LANGUAGE_DATA) {
if (typeof languageList[language] === "undefined") {
continue
}
languageTemplateCache.set(`${template}-${language}`, {
text: window.LANGUAGE_DATA[language][index],
translateArguments,
});
}
} else {
// 缓存简单的键值
for (let language in window.LANGUAGE_DATA) {
if (typeof languageList[language] === "undefined") {
continue
}
const result = window.LANGUAGE_DATA[language][index]
if (result || utils.stripContextLanguageKey(key) === key) {
languageCache.set(`${key}-${language}`, result || key);
}
}
}
})
}
/**
* 添加语言数据
* @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.Electron?.sendMessage('recreatePreloadPool');
$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 inputString !== "string" || !inputString) {
return inputString
}
const fallbackString = utils.stripContextLanguageKey(inputString);
const lookupStrings = fallbackString === inputString ? [inputString] : [inputString, fallbackString];
if (arguments.length > 1) {
for (const lookupString of lookupStrings) {
const templateKey = `${lookupString}-${languageName}`;
const template = languageTemplateCache.get(templateKey);
if (!template?.text) {
continue;
}
return template.text.replace(/\(%[TM](\d+)\)/g, (_, index) => {
const value = utils.getArgumentLanguage(arguments[index]);
return template.translateArguments.has(index) ? switchLanguage(String(value)) : value;
});
}
inputString = utils.replaceArgumentsLanguage(fallbackString, arguments)
} else {
for (const lookupString of lookupStrings) {
const result = languageCache.get(`${lookupString}-${languageName}`);
if (result) {
return result;
}
}
inputString = fallbackString;
}
// 读取缓存
const cacheKey = `${inputString}-${languageName}`;
if (languageCache.has(cacheKey)) {
return languageCache.get(cacheKey);
}
// 开发模式下,未翻译的文本自动添加到语言文件
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}