Mehrsprachige Oberfläche + lokalisierte Gericht-/Bereichsnamen

Alle Seiten und Komponenten (öffentliche Speisekarte, Login, Kantinen-
und Admin-Bereich, eigenes Konto) verwenden jetzt die Wörterbücher aus
lib/i18n statt fest codierter deutscher Texte. Gerichte/Bereiche/
Allergene/Zusatzstoffe zeigen den Namen zur aktuell gewählten Sprache;
Gerichte- und Kennzeichnungs-Formulare bekommen Englisch-/Polnisch-
Felder mit Übersetzen-Button (siehe vorherigen Commit). Datumsformat-
ierung (formatDateLong) nimmt jetzt ein locale-Argument statt fix
'de-DE'.
This commit is contained in:
2026-07-18 02:08:03 +02:00
parent 30a02ba7b7
commit a6165de10c
14 changed files with 586 additions and 328 deletions
+9 -3
View File
@@ -1,6 +1,8 @@
"use client";
import type { CodeItem } from "@/lib/types";
import { localized } from "@/lib/types";
import { useDict, useLocale } from "@/components/i18n/LocaleProvider";
export default function ChipPicker({
items,
@@ -13,15 +15,19 @@ export default function ChipPicker({
onToggle: (code: string) => void;
label: string;
}) {
const dict = useDict();
const locale = useLocale();
return (
<div>
<label className="label">{label}</label>
{items.length === 0 ? (
<p className="text-sm text-gray-400">Keine Einträge vorhanden.</p>
<p className="text-sm text-gray-400">{dict.codeList.empty}</p>
) : (
<div className="flex flex-wrap gap-1.5">
{items.map((item) => {
const active = selected.includes(item.code);
const name = localized(item, locale);
return (
<button
key={item.code}
@@ -29,9 +35,9 @@ export default function ChipPicker({
onClick={() => onToggle(item.code)}
className={`chip ${active ? "chip-active" : ""}`}
aria-pressed={active}
title={item.name}
title={name}
>
<span className="font-semibold">{item.code}</span> {item.name}
<span className="font-semibold">{item.code}</span> {name}
</button>
);
})}