39 lines
1.3 KiB
JavaScript
39 lines
1.3 KiB
JavaScript
import { readFileSync } from "node:fs";
|
|
|
|
const settings = JSON.parse(
|
|
readFileSync(new URL("../project.inlang/settings.json", import.meta.url)),
|
|
);
|
|
const baseMessages = readMessages(settings.baseLocale);
|
|
const baseKeys = Object.keys(baseMessages).filter((key) => key !== "$schema");
|
|
|
|
for (const locale of settings.locales) {
|
|
const messages = readMessages(locale);
|
|
const keys = Object.keys(messages).filter((key) => key !== "$schema");
|
|
const missing = baseKeys.filter((key) => !(key in messages));
|
|
const extra = keys.filter((key) => !(key in baseMessages));
|
|
const blank = keys.filter(
|
|
(key) => typeof messages[key] !== "string" || messages[key].trim() === "",
|
|
);
|
|
|
|
if (missing.length || extra.length || blank.length) {
|
|
throw new Error(
|
|
[
|
|
`${locale} catalog does not match ${settings.baseLocale}.`,
|
|
missing.length ? `Missing: ${missing.join(", ")}` : "",
|
|
extra.length ? `Extra: ${extra.join(", ")}` : "",
|
|
blank.length ? `Blank: ${blank.join(", ")}` : "",
|
|
]
|
|
.filter(Boolean)
|
|
.join("\n"),
|
|
);
|
|
}
|
|
}
|
|
|
|
function readMessages(locale) {
|
|
return JSON.parse(
|
|
readFileSync(new URL(`../messages/${locale}.json`, import.meta.url)),
|
|
);
|
|
}
|
|
|
|
console.log(`Validated ${settings.locales.length} localization catalogs.`);
|