From 4a95b53b0237227bde0285591d70ef2d97e311aa Mon Sep 17 00:00:00 2001 From: openhands Date: Mon, 24 Aug 2026 18:39:21 +0200 Subject: [PATCH] feat: add "Vertaal alles" button to translate the whole catalog on demand Lets admins import fast with translation disabled, then build every language for the full catalog later via the existing build-languages action. --- src/components/admin/studio/studio-client.tsx | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/components/admin/studio/studio-client.tsx b/src/components/admin/studio/studio-client.tsx index a2884330..6555d5ee 100644 --- a/src/components/admin/studio/studio-client.tsx +++ b/src/components/admin/studio/studio-client.tsx @@ -177,9 +177,38 @@ export function StudioClient({ ...ALL_LANGS, ]); const [langPickerOpen, setLangPickerOpen] = useState(false); + const [buildingLanguages, setBuildingLanguages] = useState(false); const [globalTranslate, setGlobalTranslate] = useState(defaultTranslate); + // Build every language for the whole catalog at once (used to translate + // everything after importing with translation disabled for speed). + const buildAllLanguages = async () => { + setBuildingLanguages(true); + try { + const res = await adminFetch( + "/api/admin/import/furni?action=build-languages", + ); + const data = (await res.json()) as { + languages?: Array<{ lang: string; ok: boolean }>; + error?: string; + }; + if (res.ok) { + const langs = data.languages ?? []; + const okCount = langs.filter((l) => l.ok).length; + toast.success( + `Alle talen vertaald (${okCount}/${langs.length} gelukt)`, + ); + } else { + toast.error(data.error ?? "Vertaling mislukt"); + } + } catch { + toast.error("Netwerkfout bij het vertalen van alle talen"); + } finally { + setBuildingLanguages(false); + } + }; + const toggleLang = (lang: string) => setTranslateLangs((prev) => prev.includes(lang) ? prev.filter((l) => l !== lang) : [...prev, lang], @@ -995,6 +1024,22 @@ export function StudioClient({ + +