mirror of
https://github.com/Sendouc/sendou.ink.git
synced 2026-04-18 21:20:55 -05:00
* 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
79 lines
1.8 KiB
TypeScript
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();
|