feat(cms): implement multi-language support across frontend and admin UI

This commit is contained in:
Your Name committed 2026-06-14 09:00:57 -04:00
1 parent 730e2a7b48
commit eac45dd4a7
62 files changed
+1377 -5116

No files matched your search

+46
View File
@@ -108,4 +108,50 @@ export const articlesRoute = new Elysia({ prefix: "/articles" })
set.status = 500;
return { error: "Failed to delete article" };
}
})
.patch("/:id/translations", async ({ params, body, set }) => {
const id = Number(params.id);
if (isNaN(id)) {
set.status = 400;
return { error: "Invalid article ID" };
}
const payload = body as any;
const results: any[] = [];
const LANGS = ['th', 'en', 'ja', 'zh', 'vi', 'ko'];
for (const lang of LANGS) {
const title = typeof payload.title === 'string' ? (lang === 'th' ? payload.title : null) : payload.title?.[lang];
const content = typeof payload.content === 'string' ? (lang === 'th' ? payload.content : null) : payload.content?.[lang];
if (!title && !content) continue;
const existing = await prisma.articleTranslation.findUnique({
where: { articleId_langCode: { articleId: id, langCode: lang } }
});
const updateData: any = {};
if (title) updateData.title = title;
if (content) updateData.content = content;
if (existing) {
const updated = await prisma.articleTranslation.update({
where: { id: existing.id },
data: updateData
});
results.push(updated);
} else {
const created = await prisma.articleTranslation.create({
data: { articleId: id, langCode: lang, ...updateData }
});
results.push(created);
}
}
const updated = await prisma.article.findUnique({
where: { id },
include: { translations: true }
});
return { success: true, translations: results, article: updated };
});