import { Application, Router } from "https://deno.land/x/oak@v12.1.0/mod.ts"; import * as path from "https://deno.land/std@0.178.0/path/mod.ts"; const PORT = 1421; const __dirname = path.dirname(path.fromFileUrl(import.meta.url)); const app = new Application(); const router = new Router(); const keys: Set = new Set(); async function updateFile() { delayId = null; for (const lng of ["en", "zh-CN"]) { const translationPath = path.join( __dirname, `../src/i18n/translation/${lng}.json`, ); let translations: Record = {}; try { translations = JSON.parse(await Deno.readTextFile(translationPath)); } catch (error) {} const toAdd = [...keys].filter((k) => !Object.keys(translations).includes(k) ); translations = Object.fromEntries( [ ...Object.entries(translations), ...toAdd .map((i) => [i, i] as const), ] .sort(([a], [b]) => a.localeCompare(b)), ); console.log("Add keys:", toAdd, "for", lng); await Deno.writeTextFile( translationPath, JSON.stringify(translations, null, 2), ); } keys.clear(); } let delayId: number | null = null; router.post("/locales/add/:lng/:ns", async (context) => { try { // ns, lng is ignored const body: Record = await context.request.body({ type: "json", }).value; for (const key of Object.keys(body)) { keys.add(key); } if (delayId !== null) { clearTimeout(delayId); } delayId = setTimeout(updateFile, 1000); context.response.status = 200; context.response.body = { message: "Translation added." }; } catch (error) { context.response.status = 500; context.response.body = { message: error.message }; } }); app.use(router.routes()); app.use(router.allowedMethods()); console.log(`Listening on port ${PORT}...`); await app.listen({ port: PORT });