sendou.ink/scripts/generate-resources-file.ts
Kalle 700a309e7f
Migrate Node -> Bun (#1827)
* Initial

* Faster user page

* Remove redundant function

* Favorite badge sorting

* Upgrade deps

* Simplify entry.server

* Bun tests initial

* Update package.json npm -> bun

* Update README

* Type safe translations again

* Don't load streams info for finalized tournaments

* Translations as an object

* More unit test work

* Convert match.server.test

* test

* test

* test

* test

* test

* test

* test

* test

* test

* test

* test

* test

* test

* test

* test

* test

* test

* Test & all done

* Working cf

* Bun GA try

* No cache

* spacing

* spacing 2

* Add SQL logging

* Remove NR

* Hmm

* Hmm 2

* Interesting

* SKALOP_SYSTEM_MESSAGE_URL

* .

* .

* ?

* .

* ?

* Server.ts adjust

* Downgrade Tldraw

* E2E test fix

* Fix lint
2024-08-11 16:09:41 +03:00

79 lines
1.8 KiB
TypeScript

import { Glob, pathToFileURL } from "bun";
import camelCase from "just-camel-case";
import { capitalize } from "~/utils/strings";
const glob = new Glob("locales/*/*.json");
const targetPath = pathToFileURL("./app/modules/i18n/resources.server.ts");
function main() {
const record: Record<string, string[]> = {};
const lines: string[] = [
"// This file is generated by scripts/generate-resources-file.ts",
"\n",
];
for (const file of glob.scanSync(".")) {
const [, lang, namespace] = file.replace(".json", "").split("/");
if (!record[lang]) {
record[lang] = [];
}
record[lang].push(namespace);
}
lines.push(...imports(record));
lines.push("\n");
lines.push("export const resources = {", ...resourcesObject(record), "};");
lines.push("\n");
lines.push("export type Namespace = keyof typeof resources.en;");
Bun.write(targetPath, lines.join("\n"));
}
function imports(record: Record<string, string[]>) {
const lines: string[] = [];
for (const lang in record) {
const namespaces = record[lang];
const imports = namespaces.map(
(namespace) =>
`import ${namespaceLangToLocalVar(lang, namespace)} from "../../../locales/${lang}/${namespace}.json";`,
);
lines.push(...imports);
}
return lines;
}
function namespaceLangToLocalVar(lang: string, namespace: string) {
const base = camelCase(namespace);
if (lang === "en") return base;
return `${base}${capitalize(camelCase(lang))}`;
}
function resourcesObject(record: Record<string, string[]>) {
const lines: string[] = [];
for (const lang in record) {
const namespaces = record[lang];
lines.push(
` "${lang}": {`,
...namespaces.map(
(namespace) =>
`${namespace.includes("-") ? `"${namespace}"` : namespace}: ${namespaceLangToLocalVar(lang, namespace)},`,
),
" },",
);
}
return lines;
}
main();