53 lines
1.6 KiB
JavaScript
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");
|