Automatisch-übersetzen-Button nur bei konfiguriertem DEEPL_API_KEY
Statt den Button immer anzuzeigen und erst nach Klick auf die fehlende Konfiguration hinzuweisen, wird er serverseitig anhand von process.env.DEEPL_API_KEY ein-/ausgeblendet (Gerichte, Allergene, Zusatzstoffe). Die dadurch überflüssige "translateUnavailable"- Meldung wurde aus allen drei Sprachen entfernt.
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import DishManager from "@/components/DishManager";
|
||||
|
||||
export default function GerichtePage() {
|
||||
return <DishManager />;
|
||||
return <DishManager translateEnabled={!!process.env.DEEPL_API_KEY} />;
|
||||
}
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
import CodeListManager from "@/components/CodeListManager";
|
||||
|
||||
export default function KennzeichnungPage() {
|
||||
const translateEnabled = !!process.env.DEEPL_API_KEY;
|
||||
return (
|
||||
<div className="grid gap-6 lg:grid-cols-2">
|
||||
<CodeListManager table="allergens" />
|
||||
<CodeListManager table="additives" />
|
||||
<CodeListManager table="allergens" translateEnabled={translateEnabled} />
|
||||
<CodeListManager table="additives" translateEnabled={translateEnabled} />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -12,8 +12,10 @@ import { useDict, useLocale } from "@/components/i18n/LocaleProvider";
|
||||
|
||||
export default function CodeListManager({
|
||||
table,
|
||||
translateEnabled,
|
||||
}: {
|
||||
table: "allergens" | "additives";
|
||||
translateEnabled: boolean;
|
||||
}) {
|
||||
const supabase = useMemo(() => createClient(), []);
|
||||
const dict = useDict();
|
||||
@@ -34,9 +36,9 @@ export default function CodeListManager({
|
||||
namePl: string;
|
||||
} | null>(null);
|
||||
const [error, setError] = useState<string | null>(null);
|
||||
const [translateState, setTranslateState] = useState<
|
||||
"idle" | "busy" | "done" | "unavailable"
|
||||
>("idle");
|
||||
const [translateState, setTranslateState] = useState<"idle" | "busy" | "done">(
|
||||
"idle"
|
||||
);
|
||||
|
||||
const load = useCallback(async () => {
|
||||
const { data, error } = await supabase.from(table).select("*").order("sort");
|
||||
@@ -115,10 +117,6 @@ export default function CodeListManager({
|
||||
});
|
||||
const data = await res.json();
|
||||
if (!res.ok) throw new Error(data?.error ?? `Fehler (${res.status})`);
|
||||
if (data.configured === false) {
|
||||
setTranslateState("unavailable");
|
||||
return;
|
||||
}
|
||||
setEditing((prev) =>
|
||||
prev ? { ...prev, nameEn: data.en ?? prev.nameEn, namePl: data.pl ?? prev.namePl } : prev
|
||||
);
|
||||
@@ -191,6 +189,7 @@ export default function CodeListManager({
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
{translateEnabled && (
|
||||
<div>
|
||||
<button
|
||||
type="button"
|
||||
@@ -207,12 +206,8 @@ export default function CodeListManager({
|
||||
{dict.dishManager.translated}
|
||||
</span>
|
||||
)}
|
||||
{translateState === "unavailable" && (
|
||||
<span className="ml-2 text-sm text-gray-500">
|
||||
{dict.dishManager.translateUnavailable}
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
<div className="flex gap-2">
|
||||
<button type="submit" className="btn btn-add">
|
||||
{dict.common.save}
|
||||
|
||||
+10
-13
@@ -29,7 +29,11 @@ const EMPTY_FORM: DishForm = {
|
||||
additives: [],
|
||||
};
|
||||
|
||||
export default function DishManager() {
|
||||
export default function DishManager({
|
||||
translateEnabled,
|
||||
}: {
|
||||
translateEnabled: boolean;
|
||||
}) {
|
||||
const supabase = useMemo(() => createClient(), []);
|
||||
const dict = useDict();
|
||||
const locale = useLocale();
|
||||
@@ -42,9 +46,9 @@ export default function DishManager() {
|
||||
const [selected, setSelected] = useState<Set<string>>(new Set());
|
||||
const [bulkBusy, setBulkBusy] = useState(false);
|
||||
const [search, setSearch] = useState("");
|
||||
const [translateState, setTranslateState] = useState<
|
||||
"idle" | "busy" | "done" | "unavailable"
|
||||
>("idle");
|
||||
const [translateState, setTranslateState] = useState<"idle" | "busy" | "done">(
|
||||
"idle"
|
||||
);
|
||||
|
||||
// Live-Suche: filtert die Liste bereits während des Tippens
|
||||
const visible = useMemo(() => {
|
||||
@@ -199,10 +203,6 @@ export default function DishManager() {
|
||||
});
|
||||
const data = await res.json();
|
||||
if (!res.ok) throw new Error(data?.error ?? `Fehler (${res.status})`);
|
||||
if (data.configured === false) {
|
||||
setTranslateState("unavailable");
|
||||
return;
|
||||
}
|
||||
setForm((prev) =>
|
||||
prev ? { ...prev, nameEn: data.en ?? prev.nameEn, namePl: data.pl ?? prev.namePl } : prev
|
||||
);
|
||||
@@ -296,6 +296,7 @@ export default function DishManager() {
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
{translateEnabled && (
|
||||
<div>
|
||||
<button
|
||||
type="button"
|
||||
@@ -312,12 +313,8 @@ export default function DishManager() {
|
||||
{dict.dishManager.translated}
|
||||
</span>
|
||||
)}
|
||||
{translateState === "unavailable" && (
|
||||
<span className="ml-2 text-sm text-gray-500">
|
||||
{dict.dishManager.translateUnavailable}
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
|
||||
<ChipPicker
|
||||
label={dict.codeList.allergensTitle}
|
||||
|
||||
@@ -88,8 +88,6 @@ const de = {
|
||||
autoTranslate: "Automatisch übersetzen",
|
||||
translating: "Übersetze…",
|
||||
translated: "Übersetzt.",
|
||||
translateUnavailable:
|
||||
"Automatische Übersetzung ist nicht eingerichtet. Bitte Englisch/Polnisch manuell ausfüllen.",
|
||||
priceLabel: "Preis in €",
|
||||
pricePlaceholder: "3,50",
|
||||
searchPlaceholder: "Gericht suchen…",
|
||||
@@ -346,8 +344,6 @@ const en: Dict = {
|
||||
autoTranslate: "Auto-translate",
|
||||
translating: "Translating…",
|
||||
translated: "Translated.",
|
||||
translateUnavailable:
|
||||
"Automatic translation is not set up. Please fill in English/Polish manually.",
|
||||
priceLabel: "Price in €",
|
||||
pricePlaceholder: "3.50",
|
||||
searchPlaceholder: "Search dishes…",
|
||||
@@ -602,8 +598,6 @@ const pl: Dict = {
|
||||
autoTranslate: "Przetłumacz automatycznie",
|
||||
translating: "Tłumaczenie…",
|
||||
translated: "Przetłumaczono.",
|
||||
translateUnavailable:
|
||||
"Automatyczne tłumaczenie nie jest skonfigurowane. Wypełnij angielski/polski ręcznie.",
|
||||
priceLabel: "Cena w €",
|
||||
pricePlaceholder: "3,50",
|
||||
searchPlaceholder: "Szukaj dania…",
|
||||
|
||||
Reference in New Issue
Block a user