webui/scripts/generate-locales.js

53 lines
1.6 KiB
JavaScript

// scripts/generate-locales.js
const fs = require("fs");
const path = require("path");
const localesDir = path.join(__dirname, "../public/locales");
const outputFile = path.join(__dirname, "../src/i18n/generatedLocales.ts");
// Discover locale folders
const rawLocales = fs
.readdirSync(localesDir)
.filter((name) => fs.statSync(path.join(localesDir, name)).isDirectory());
// Normalise folder names (e.g., en_GB → en-GB)
const locales = rawLocales.map((l) => l.replace("_", "-"));
// Sort by locale code
locales.sort((a, b) => a.localeCompare(b));
// Base locales (no hyphen)
const baseLocales = locales.filter((l) => !l.includes("-"));
// Only region-specific locales (those with a hyphen)
const availableLocales = locales.filter((l) => l.includes("-"));
// Fallback map: region -> base (and default to en)
const fallbackLng = locales.reduce((acc, locale) => {
if (locale.includes("-")) {
const base = locale.split("-")[0];
if (baseLocales.includes(base)) {
acc[locale] = base === "en" ? ["en"] : [base, "en"];
} else {
acc[locale] = ["en"];
}
}
return acc;
}, {});
// Generate TS file
const ts = `
// AUTO-GENERATED FILE — DO NOT EDIT MANUALLY
export const availableLocales = ${JSON.stringify(availableLocales, null, 2)} as const;
export const baseLocales = ${JSON.stringify(baseLocales, null, 2)} as const;
export const fallbackLng = ${JSON.stringify(fallbackLng, null, 2)} as const;
export type Locale = typeof availableLocales[number];
`;
fs.writeFileSync(outputFile, ts);
console.log("Generated generatedLocales.ts");