Files
lst/scripts/translateScript.js

89 lines
2.8 KiB
JavaScript

// scripts/sync-translations.js
import fs from "fs";
import path from "path";
const locales = ["en", "es", "de"];
const docsDir = path.join(process.cwd(), "../lstDocs/docs"); // canonical English docs
const i18nDir = path.join(process.cwd(), "../lstDocs/i18n"); // output localized docs
const langDir = path.join(process.cwd(), "../lang"); // json translations
// load translations
const translations = {};
for (const locale of locales) {
const filePath = path.join(langDir, `${locale}.json`);
translations[locale] = JSON.parse(fs.readFileSync(filePath, "utf8"));
}
// lookup helper with English fallback
function t(key, locale) {
return translations[locale][key] || translations["en"][key] || key;
}
// copy directory recursively
function copyDir(src, dest) {
if (!fs.existsSync(src)) return;
fs.mkdirSync(dest, { recursive: true });
for (const item of fs.readdirSync(src)) {
const s = path.join(src, item);
const d = path.join(dest, item);
const stat = fs.statSync(s);
if (stat.isDirectory()) copyDir(s, d);
else fs.copyFileSync(s, d);
}
}
// recursive doc processor
function processDir(srcDir, relDir = "") {
for (const item of fs.readdirSync(srcDir, { withFileTypes: true })) {
const srcPath = path.join(srcDir, item.name);
const relPath = path.join(relDir, item.name);
if (item.isDirectory()) {
processDir(srcPath, relPath);
continue;
}
if (item.isFile() && item.name.endsWith(".md")) {
const baseContent = fs.readFileSync(srcPath, "utf8");
for (const locale of locales) {
// replace keys with translations
const localizedContent = baseContent.replace(
/([a-z]+(\.[a-z]+)+)/g,
(match) => t(match, locale)
);
// output directory preserves structure
const outDir = path.join(
i18nDir,
locale,
"docusaurus-plugin-content-docs/current",
relDir
);
fs.mkdirSync(outDir, { recursive: true });
const outFile = path.join(outDir, item.name);
fs.writeFileSync(outFile, localizedContent, "utf8");
}
}
// if there's an "img" folder alongside docs, copy it once for each locale
if (item.isDirectory() && item.name === "img") {
for (const locale of locales) {
const outDir = path.join(
i18nDir,
locale,
"docusaurus-plugin-content-docs/current",
relDir,
"img"
);
copyDir(srcPath, outDir);
}
}
}
}
// run
processDir(docsDir);