Files
2026-06-19 18:45:55 +08:00

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,
};