SpaceNinjaServer/static/webui/translations/update-translations.ts

109 lines
3.8 KiB
TypeScript
Raw Normal View History

2025-02-05 14:49:30 +01:00
import { logger } from "@/src/utils/logger";
import fs from "fs";
import path from "path";
import prettier from "prettier";
const languageList = ["de", "es", "fr", "it", "ja", "ko", "pl", "pt", "ru", "tr", "uk", "zh", "tc", "th"];
const baseLangFile = "./static/webui/translations/en.json";
const oldLangFile = "./static/webui/translations/old_en.json";
function mergeTranslations(source: Record<string, unknown>, target: Record<string, unknown>) {
Object.keys(source).forEach(key => {
if (typeof source[key] === "object" && source[key] !== null) {
if (!target[key] || typeof target[key] !== "object") {
target[key] = {};
}
mergeTranslations(source[key] as Record<string, unknown>, target[key] as Record<string, unknown>);
} else if (!(key in target)) {
target[key] = "";
}
});
}
function compareAndUpdateTranslations(
newData: Record<string, unknown>,
oldData: Record<string, unknown>,
langData: Record<string, unknown>
): boolean {
let updated = false;
Object.keys(newData).forEach(key => {
const newValue = newData[key];
const oldValue = oldData[key];
if (typeof newValue === "object" && newValue !== null) {
if (typeof oldValue !== "object" || oldValue === null) {
langData[key] = { ...newValue };
updated = true;
} else {
const isSubUpdated = compareAndUpdateTranslations(
newValue as Record<string, unknown>,
oldValue as Record<string, unknown>,
langData[key] as Record<string, unknown>
);
if (isSubUpdated) {
updated = true;
}
}
} else {
if (newValue !== oldValue) {
langData[key] = newValue;
updated = true;
}
}
});
return updated;
}
async function processTranslations() {
let enData: Record<string, unknown>;
let oldEnData: Record<string, unknown> = {};
try {
enData = JSON.parse(fs.readFileSync(baseLangFile, "utf-8"));
oldEnData = fs.existsSync(oldLangFile) ? JSON.parse(fs.readFileSync(oldLangFile, "utf-8")) : {};
} catch (error) {
logger.error("Error reading base or old language files:", error);
process.exit(1);
}
for (const lang of languageList) {
const langFile = `./static/webui/translations/${lang}.json`;
const langPath = path.resolve(langFile);
if (!fs.existsSync(langPath)) {
logger.warn(`File ${langFile} not found! Creating a new one.`);
fs.writeFileSync(langPath, JSON.stringify({}, null, 2), "utf-8");
}
try {
const langData: Record<string, unknown> = JSON.parse(fs.readFileSync(langPath, "utf-8"));
const originalLangDataStr = JSON.stringify(langData);
compareAndUpdateTranslations(enData, oldEnData, langData);
mergeTranslations(enData, langData);
const newLangDataStr = JSON.stringify(langData);
if (originalLangDataStr !== newLangDataStr) {
const formattedLangData = await prettier.format(newLangDataStr, { parser: "json" });
fs.writeFileSync(langPath, formattedLangData, "utf-8");
logger.info(`Updated: ${langFile}`);
}
} catch (error) {
logger.error(`Error processing ${langFile}:`, error);
}
}
const formattedEnData = await prettier.format(JSON.stringify(enData), {
parser: "json"
});
fs.writeFileSync(oldLangFile, formattedEnData, "utf-8");
logger.info("Updated old_en.json with the latest translations.");
process.exit(0);
}
processTranslations();