147 lines
4.7 KiB
TypeScript
147 lines
4.7 KiB
TypeScript
import {Files} from "../file/main";
|
|
import {AppEnv, AppRuntime} from "../env";
|
|
import {JsonUtil, StrUtil} from "../../lib/util";
|
|
import {langMessageList} from "../../config/lang";
|
|
import {app, dialog, ipcMain} from "electron";
|
|
import {Log} from "../log/main";
|
|
import {isDev} from "../../lib/env";
|
|
import {AppsMain} from "../app/main";
|
|
|
|
const fileSyncer = {
|
|
readJson: async function (file: string) {
|
|
let filePath = [AppEnv.appRoot, file].join("/");
|
|
const sourceContent = (await Files.read(filePath)) || "{}";
|
|
return JSON.parse(sourceContent);
|
|
},
|
|
writeJson: async function (file: string, data: any, order: "key" | "value" = "key") {
|
|
let filePath = [AppEnv.appRoot, file].join("/");
|
|
let jsonString: any;
|
|
if (order === "key") {
|
|
jsonString = JsonUtil.stringifyOrdered(data);
|
|
} else {
|
|
jsonString = JsonUtil.stringifyValueOrdered(data);
|
|
}
|
|
await Files.write(filePath, jsonString);
|
|
},
|
|
};
|
|
|
|
|
|
const mergeJson = {};
|
|
let mergeJsonIgnore = false;
|
|
let autoWriteTimer = null;
|
|
|
|
const readSource = async () => {
|
|
const json = await fileSyncer.readJson("src/lang/source.json");
|
|
if (!mergeJson['source']) {
|
|
mergeJson['source'] = {};
|
|
}
|
|
for (const k in mergeJson['source']) {
|
|
if (!json[k]) {
|
|
json[k] = mergeJson['source'][k];
|
|
}
|
|
}
|
|
return json;
|
|
}
|
|
|
|
const readLang = async (name: string) => {
|
|
const jsonLang = await fileSyncer.readJson(`src/lang/${name}.json`);
|
|
if (!mergeJson[name]) {
|
|
mergeJson[name] = {};
|
|
}
|
|
for (const k in mergeJson[name]) {
|
|
if (!jsonLang[k]) {
|
|
jsonLang[k] = mergeJson[name][k];
|
|
}
|
|
}
|
|
return jsonLang;
|
|
}
|
|
|
|
const writeSourceKey = async (key: string) => {
|
|
const source = await readSource();
|
|
if (source[key]) {
|
|
return;
|
|
}
|
|
source[key] = StrUtil.hashCodeWithDuplicateCheck(key, Object.values(source));
|
|
mergeJson['source'][key] = source[key];
|
|
for (let l of langMessageList) {
|
|
const langJson = await readLang(l.name);
|
|
langJson[source[key]] = key;
|
|
mergeJson[l.name][source[key]] = key;
|
|
}
|
|
Log.info("Lang.writeSourceKey", {key, id: source[key]});
|
|
// 禁用频繁的toast提示,只在日志中记录(避免干扰用户)
|
|
// AppsMain.toast(`LangAdded: ${key}`, {status: "info", duration: 1000}).then();
|
|
if (!mergeJsonIgnore) {
|
|
autoWrite();
|
|
}
|
|
};
|
|
|
|
const autoWrite = (delay = 10000) => {
|
|
// 禁用自动写入语言键的弹窗提示(避免干扰用户)
|
|
// 直接设置为忽略模式,不再显示对话框
|
|
if (autoWriteTimer) {
|
|
clearTimeout(autoWriteTimer);
|
|
autoWriteTimer = null;
|
|
}
|
|
|
|
// 静默忽略,不显示对话框,不清空mergeJson(保留在内存中)
|
|
mergeJsonIgnore = true;
|
|
Log.info("Lang.autoWrite", {
|
|
skipped: true,
|
|
note: "自动写入对话框已禁用,语言键仅在后台记录",
|
|
keyCount: Object.keys(mergeJson['source'] || {}).length
|
|
});
|
|
|
|
// 原来的对话框逻辑已禁用,避免频繁弹窗干扰用户
|
|
}
|
|
if (isDev) {
|
|
app.on("before-quit", (e) => {
|
|
// 禁用退出时的对话框提示,允许应用正常退出
|
|
// 语言键仍然会在后台记录,但不会阻止应用退出
|
|
if (!mergeJsonIgnore) {
|
|
const hasKeys = Object.keys(mergeJson).some(k => mergeJson[k] && Object.keys(mergeJson[k]).length > 0);
|
|
if (hasKeys) {
|
|
Log.info("Lang.before-quit", {
|
|
note: "应用退出时发现未写入的语言键,已禁用对话框提示",
|
|
keyCount: Object.keys(mergeJson['source'] || {}).length
|
|
});
|
|
// 不再阻止应用退出,直接设置忽略标志
|
|
mergeJsonIgnore = true;
|
|
}
|
|
}
|
|
// 注释掉原来的阻止退出逻辑
|
|
/*
|
|
if (!mergeJsonIgnore) {
|
|
for (const k in mergeJson) {
|
|
if (mergeJson[k] && Object.keys(mergeJson[k]).length > 0) {
|
|
e.preventDefault();
|
|
autoWrite(0);
|
|
}
|
|
}
|
|
}
|
|
*/
|
|
});
|
|
}
|
|
|
|
const writeSourceKeyUse = async (key: string) => {
|
|
const json = await fileSyncer.readJson("src/lang/source-use.json");
|
|
if (!json[key]) {
|
|
json[key] = 1;
|
|
} else {
|
|
json[key]++;
|
|
}
|
|
await fileSyncer.writeJson("src/lang/source-use.json", json, "value");
|
|
};
|
|
|
|
ipcMain.handle("lang:writeSourceKey", async (_, key) => {
|
|
await writeSourceKey(key);
|
|
});
|
|
ipcMain.handle("lang:writeSourceKeyUse", async (_, key) => {
|
|
await writeSourceKeyUse(key);
|
|
});
|
|
|
|
export default {
|
|
writeSourceKey,
|
|
writeSourceKeyUse,
|
|
};
|