feat: add "Vertaal alles" button to translate the whole catalog on demand
CI / check (push) Successful in 32s
CI / release (push) Skipped
CI / deploy (push) Successful in 1m0s

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" />