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.
This commit is contained in:
openhands committed 2026-08-24 18:39:21 +02:00
1 parent 3a292a44f1
commit 4a95b53b02
1 file changed
+45
@@ -177,9 +177,38 @@ export function StudioClient({
...ALL_LANGS,
]);
const [langPickerOpen, setLangPickerOpen] = useState(false);
const [buildingLanguages, setBuildingLanguages] = useState(false);
const [globalTranslate, setGlobalTranslate] =
useState<boolean>(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({
</div>
</PopoverContent>
</Popover>
<Button
variant="outline"
size="sm"
className="h-8 gap-1.5"
disabled={buildingLanguages}
onClick={buildAllLanguages}
title="Vertaal de hele catalogus in alle talen (achteraf)"
>
{buildingLanguages ? (
<Loader2 size={13} className="animate-spin" />
) : (
<Globe size={13} />
)}
Alles vertalen
</Button>
</div>
<div className="flex-1" />