Files
EverShelf/translations/de.json
T
dadaloop82 bff22d43b4 fix(i18n): translate antiwaste title in IT/DE + use quantity validation
- translations: antiwaste.title = 'Rapporto Anti-Spreco' (IT), 'Anti-Verschwendungs-Bericht' (DE)
- translations: add use.error_exceeds_stock in IT/EN/DE
- submitUse(): block submit if qty > available at selected location + shake animation
- adjustUseQty(): cap '+' button at max available at selected location (incl. sub-unit mode)
- style.css: add @keyframes inputShake + .input-shake class

Bump app.js cache buster to v=20260504c
2026-05-04 16:56:37 +00:00

902 lines
44 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"app": {
"name": "EverShelf",
"loading": "Laden..."
},
"nav": {
"title": "🏠 EverShelf",
"home": "Home",
"inventory": "Vorrat",
"recipes": "Rezepte",
"shopping": "Einkauf",
"log": "Verlauf"
},
"btn": {
"back": "← Zurück",
"save": "💾 Speichern",
"cancel": "✕ Abbrechen",
"close": "Schließen",
"add": "✅ Hinzufügen",
"delete": "Löschen",
"edit": "✏️ Bearbeiten",
"search": "🔍 Suchen",
"go": "✅ Los",
"toggle_password": "👁️ Anzeigen/Ausblenden",
"load_more": "Mehr laden...",
"save_config": "💾 Konfiguration speichern",
"save_product": "💾 Produkt speichern",
"restart": "↺ Neustart",
"reset_default": "↺ Standard wiederherstellen",
"save_info": "💾 Info speichern",
"retry": "🔄 Erneut versuchen"
},
"locations": {
"dispensa": "Vorratskammer",
"frigo": "Kühlschrank",
"freezer": "Gefrierschrank",
"altro": "Sonstiges"
},
"categories": {
"latticini": "Milchprodukte",
"carne": "Fleisch",
"pesce": "Fisch",
"frutta": "Obst",
"verdura": "Gemüse",
"pasta": "Pasta & Reis",
"pane": "Brot & Backwaren",
"surgelati": "Tiefkühl",
"bevande": "Getränke",
"condimenti": "Gewürze",
"snack": "Snacks & Süßes",
"conserve": "Konserven",
"cereali": "Getreide & Hülsenfrüchte",
"igiene": "Hygiene",
"pulizia": "Reinigung",
"altro": "Sonstiges",
"select": "-- Auswählen --"
},
"units": {
"pz": "Stk",
"conf": "Pkg",
"g": "g",
"ml": "ml",
"pieces": "Stück",
"grams": "Gramm",
"box": "Packung",
"boxes": "Packungen"
},
"shopping_sections": {
"frutta_verdura": "Obst & Gemüse",
"carne_pesce": "Fleisch & Fisch",
"latticini": "Milchprodukte & Frisches",
"pane_dolci": "Brot & Süßes",
"pasta": "Pasta & Getreide",
"conserve": "Konserven & Soßen",
"surgelati": "Tiefkühl",
"bevande": "Getränke",
"pulizia_igiene": "Reinigung & Hygiene",
"altro": "Sonstiges"
},
"dashboard": {
"expired_title": "🚫 Abgelaufen",
"expiring_title": "⏰ Bald ablaufend",
"stats_period": "📊 Letzte 30 Tage",
"opened_title": "📦 Geöffnete Produkte",
"review_title": "🔍 Zu prüfen",
"review_hint": "Mengen, die ungewöhnlich erscheinen. Bestätigen oder ändern.",
"quick_recipe": "🍳 Schnelles Rezept mit ablaufenden Produkten",
"banner_review_title": "Ungewöhnliche Menge",
"banner_review_action_ok": "Ist korrekt",
"banner_review_action_finish": "🗑️ Alles aufgebraucht",
"banner_review_action_edit": "Korrigieren",
"banner_review_action_weigh": "Wiegen",
"banner_review_dismiss": "Ignorieren",
"banner_prediction_title": "Ungewöhnlicher Verbrauch",
"banner_prediction_hint": "Laut Vorhersage stimmt diese Menge nicht mit dem erwarteten Verbrauch überein.",
"banner_prediction_action_confirm": "{qty} {unit} bestätigen",
"banner_prediction_action_weigh": "Jetzt wiegen",
"banner_prediction_action_edit": "Menge aktualisieren",
"banner_expired_title": "Abgelaufenes Produkt",
"banner_expired_today": "Heute abgelaufen",
"banner_expired_days": "Seit {days} Tagen abgelaufen",
"banner_expired_action_use": "Trotzdem verwenden",
"banner_expired_action_throw": "Habe ich weggeworfen",
"banner_expired_action_edit": "Datum korrigieren",
"banner_anomaly_action_edit": "Bestand korrigieren",
"banner_anomaly_action_dismiss": "Menge ist korrekt",
"banner_expiring_title": "Bald ablaufend",
"banner_expiring_today": "Läuft heute ab!",
"banner_expiring_tomorrow": "Läuft morgen ab",
"banner_expiring_days": "Läuft in {days} Tagen ab",
"banner_expiring_action_use": "Jetzt verwenden",
"banner_finished_title": "aufgebraucht?",
"banner_finished_detail": "Ich habe vermerkt, dass {name} auf null gesunken ist. Ist es wirklich leer, oder hast du noch welches?",
"banner_finished_action_yes": "Ja, aufgebraucht",
"banner_finished_action_no": "Nein, ich habe noch welches",
"banner_review_unusual_pkg_title": "Ungewöhnliche Packungsgröße",
"banner_review_unusual_pkg_detail": "Du hast eine Packung von {qty} {unit} eingestellt — die Größe scheint sehr groß. Überprüfe ob es korrekt ist.",
"banner_review_low_qty_title": "Sehr geringe Menge",
"banner_review_low_qty_detail": "Du hast nur {qty} im Bestand — das scheint sehr wenig, möglicherweise ein Eingabefehler. Bestätige wenn korrekt.",
"banner_review_high_qty_title": "Ungewöhnlich hohe Menge",
"banner_review_high_qty_detail": "Du hast {qty} im Bestand — die Zahl scheint sehr hoch. Bestätige wenn korrekt oder korrigiere.",
"banner_prediction_rate_day": "Durchschnitt ~{n} {unit}/Tag",
"banner_prediction_rate_week": "Durchschnitt ~{n} {unit}/Woche",
"banner_prediction_days_ago": "Vor {n} Tagen aufgefüllt",
"banner_prediction_more": "Ich erwartete {expected} {unit}{time}, du hast aber {actual} {unit}. Hast du Bestand ohne Buchung hinzugefügt?",
"banner_prediction_less": "Ich erwartete {expected} {unit}{time}, du hast aber nur {actual} {unit}. Hast du mehr als üblich verbraucht?",
"banner_finished_zero": "Bestand zeigt null, aber gespeicherte Buchungen deuten an, dass es nicht leer sein sollte.",
"banner_finished_expected": "Laut Aufzeichnungen solltest du noch {qty} {unit} haben.",
"banner_finished_check": "Kannst du nachschauen?",
"banner_anomaly_phantom_title": "mehr Bestand als erwartet",
"banner_anomaly_phantom_detail": "Bestand zeigt {inv_qty} {unit}, aber laut Buchungen solltest du nur {expected_qty} {unit} haben. Hast du Bestand ohne Buchung hinzugefügt?",
"banner_anomaly_untracked_title": "Anfangsbestand nicht als Eingang gebucht",
"banner_anomaly_untracked_detail": "Du hast <strong>{inv_qty} {unit}</strong> im Bestand, aber die gebuchten Abgänge übersteigen die Eingänge — der Anfangsbestand wurde wahrscheinlich nie als \"Eingang\" erfasst. Bitte korrigiere die Menge oder trage die fehlenden Eingänge nach."
,
"banner_anomaly_ghost_title": "weniger Bestand als erwartet",
"banner_anomaly_ghost_detail": "Laut Buchungen solltest du {expected_qty} {unit} von {name} haben, aber der Bestand zeigt nur {inv_qty} {unit}. Hast du etwas ohne Buchung entnommen?",
"consumed": "Verbraucht: {n} ({pct}%)",
"wasted": "Weggeworfen: {n} ({pct}%)",
"more_opened": "und {n} weitere geöffnet...",
"banner_expired_detail": "{when} · du hast noch <strong>{qty}</strong>."
},
"inventory": {
"title": "Vorrat",
"filter_all": "Alle",
"search_placeholder": "🔍 Produkt suchen...",
"recent_title": "🕐 Zuletzt verwendet",
"popular_title": "⭐ Meistverwendet",
"empty": "Keine Produkte hier.\nScanne ein Produkt, um es hinzuzufügen!",
"no_items_found": "Keine Bestandseinträge gefunden",
"qty_remainder_suffix": "übrig",
"vacuum_badge": "🫙 Vakuumiert",
"opened_badge": "📭 Geöffnet",
"label_expiry": "📅 Ablaufdatum",
"label_storage": "🫙 Aufbewahrung",
"label_status": "📭 Status",
"opened_since": "Geöffnet seit {date}",
"label_position": "📍 Standort",
"label_quantity": "📦 Menge",
"label_added": "📅 Hinzugefügt",
"empty_text": "Keine Produkte hier.<br>Scanne ein Produkt, um es hinzuzufügen!",
"empty_db": "Keine Produkte in der Datenbank.<br>Scanne ein Produkt, um loszulegen!"
},
"scan": {
"title": "Produkt scannen",
"mode_shopping": "🛒 Einkaufsmodus",
"mode_shopping_end": "✅ Einkauf beenden",
"zoom": "Zoom",
"barcode_placeholder": "Barcode eingeben...",
"quick_name_divider": "oder Name eingeben",
"quick_name_placeholder": "z.B.: Äpfel, Zucchini, Brot...",
"manual_entry": "✏️ Manuelle Eingabe",
"ai_identify": "🤖 Mit KI identifizieren",
"hint": "Barcode scannen, Produktname eingeben oder KI zur Identifikation nutzen",
"debug_toggle": "🐛 Debug Log",
"barcode_acquired": "🔖 Barcode gescannt: {code}",
"scan_barcode": "🔖 Barcode scannen",
"create_named": "{name} erstellen",
"new_without_barcode": "Neues Produkt ohne Barcode"
},
"action": {
"title": "Was möchtest du tun?",
"add_btn": "📥 HINZUFÜGEN",
"add_sub": "in Vorrat/Kühlschrank",
"use_btn": "📤 VERWENDEN / VERBRAUCHEN",
"use_sub": "aus Vorrat/Kühlschrank",
"have_title": "📦 Schon auf Lager!",
"add_more_sub": "weitere Menge",
"use_qty_sub": "wie viel verwendet",
"throw_btn": "🗑️ ENTSORGEN",
"throw_sub": "wegwerfen",
"edit_sub": "Ablauf, Ort…"
},
"add": {
"title": "Zum Vorrat hinzufügen",
"location_label": "📍 Wohin?",
"quantity_label": "📦 Menge",
"conf_size_label": "📦 Jede Packung enthält:",
"conf_size_placeholder": "z.B. 300",
"vacuum_label": "🫙 Vakuumiert",
"vacuum_hint": "Ablaufdatum wird automatisch verlängert",
"submit": "✅ Hinzufügen",
"purchase_type_label": "🛒 Dieses Produkt ist...",
"new_btn": "🆕 Gerade gekauft",
"existing_btn": "📦 Hatte ich schon",
"remaining_label": "📦 Verbleibende Menge",
"remaining_hint": "Ungefähr wie viel ist noch übrig?",
"remaining_full": "🟢 Voll",
"remaining_half": "🟠 Halb",
"estimated_expiry": "Geschätzte Haltbarkeit:",
"suffix_freezer": "(Tiefkühler)",
"suffix_vacuum": "(vakuumversiegelt)",
"hint_modify": "📝 Du kannst das Datum ändern oder mit der Kamera scannen",
"scan_expiry_title": "📷 Ablaufdatum scannen",
"product_added": "✅ {name} hinzugefügt!{qty}",
"suffix_freezer_vacuum": "(Tiefkühler + vakuumversiegelt)"
},
"use": {
"title": "Verwenden / Verbrauchen",
"location_label": "📍 Woher?",
"quantity_label": "Wie viel hast du benutzt?",
"change": "ändern",
"partial_hint": "Oder genaue Menge angeben:",
"partial_piece_hint": "Hast du nur einen Teil verwendet?",
"piece": "Stück",
"one_whole": "1 ganzes",
"use_all": "🗑️ ALLES verwendet / Aufgebraucht",
"submit": "📤 Diese Menge verwenden",
"available": "📦 Verfügbar:",
"opened_badge": "GEOEFFNET",
"not_in_inventory": "⚠️ Produkt nicht im Bestand.",
"expiry_warning": "⚠️ Verwende zuerst die{loc}, die am {date} abläuft — {when}!",
"throw_title": "🗑️ Produkt entsorgen",
"throw_all": "🗑️ ALLES entsorgen ({qty})",
"throw_qty_label": "Wie viel wegwerfen?",
"throw_qty_hint": "oder Menge angeben:",
"throw_partial_btn": "🗑️ Diese Menge entsorgen",
"when_expired": "seit {n} Tagen abgelaufen",
"when_today": "läuft <strong>heute</strong> ab",
"when_tomorrow": "läuft <strong>morgen</strong> ab",
"when_days": "läuft in <strong>{n} Tagen</strong> ab",
"toast_used": "📤 {qty} von {name} verwendet",
"toast_bring": "🛒 Produkt aufgebraucht → zu Bring! hinzugefügt",
"toast_opened_finished": "🔓 Geöffnete Packung von {name} aufgebraucht!",
"disambiguation_hint": "Was meinst du mit \"alles aufgebraucht\"?",
"disambiguation_all": "🗑️ ALLES verbraucht ({qty})",
"error_exceeds_stock": "⚠️ Du kannst nicht mehr verwenden als du verfügbar hast!"
},
"product": {
"title_new": "Neues Produkt",
"title_edit": "Produkt bearbeiten",
"ai_fill": "📷 Foto machen und mit KI identifizieren",
"ai_fill_hint": "KI füllt die Produktfelder automatisch aus",
"name_label": "🏷️ Produktname *",
"name_placeholder": "z.B.: Vollmilch, Penne Nudeln...",
"brand_label": "🏢 Marke",
"brand_placeholder": "z.B.: Barilla, Müller, Knorr...",
"category_label": "📂 Kategorie",
"unit_label": "📏 Maßeinheit",
"default_qty_label": "🔢 Standardmenge",
"conf_size_label": "📦 Jede Packung enthält:",
"conf_size_placeholder": "z.B. 300",
"notes_label": "📝 Notizen",
"notes_placeholder": "z.B.: laktosefrei, bio, nach dem Öffnen im Kühlschrank aufbewahren...",
"barcode_label": "🔖 Barcode",
"barcode_placeholder": "Barcode (falls vorhanden)",
"barcode_hint": "⚠️ Barcode hinzufügen, damit du beim nächsten Einkauf nur scannen musst!",
"submit": "💾 Produkt speichern",
"name_required": "Produktname eingeben",
"conf_size_required": "Packungsinhalt angeben",
"expiry_estimated": "Geschätztes Ablaufdatum:",
"scan_expiry": "Ablaufdatum scannen",
"expiry_hint": "📝 Du kannst das Datum ändern oder mit der Kamera scannen",
"add_batch": "📦 + Charge mit anderem Ablaufdatum",
"package_info": "📦 Packung: {info}",
"edit_catalog": "⚙️ Produktinfo bearbeiten (Name, Marke, Kategorie…)",
"not_recognized": "⚠️ Produkt nicht erkannt",
"edit_info": "✏️ Informationen bearbeiten",
"modify_details": "BEARBEITEN\nAblauf, Ort…",
"already_in_pantry": "📋 Bereits im Vorratsschrank",
"no_barcode": "Kein Barcode"
},
"products": {
"title": "📦 Alle Produkte",
"search_placeholder": "🔍 Produkt suchen...",
"empty": "Keine Produkte in der Datenbank.\nScanne ein Produkt zum Starten!",
"no_category": "Keine Produkte in dieser Kategorie"
},
"recipes": {
"title": "🍳 Rezepte",
"generate": "✨ Neues Rezept generieren",
"archive_empty": "Keine Rezepte gespeichert. Erstelle dein erstes Rezept!",
"dialog_title": "🍳 Rezept",
"dialog_desc": "Ich erstelle ein gesundes Rezept mit Zutaten aus dem Vorrat und priorisiere Produkte mit nahendem Ablaufdatum.",
"meal_label": "🕐 Für welche Mahlzeit?",
"persons_label": "👥 Für wie viele Personen?",
"meal_type_label": "🎯 Art der Mahlzeit",
"opt_fast": "⚡ Schnelle Mahlzeit",
"opt_light": "🥗 Kleiner Hunger",
"opt_expiry": "⏰ Ablaufdaten priorisieren",
"opt_healthy": "💚 Extra gesund",
"opt_opened": "📦 Geöffnete Produkte priorisieren",
"opt_zero_waste": "♻️ Zero Waste",
"generate_btn": "✨ Rezept generieren",
"loading_msg": "Rezept wird vorbereitet...",
"start_cooking": "👨‍🍳 Kochmodus",
"regenerate": "🔄 Noch eins generieren",
"close_btn": "✅ Schließen",
"ingredients_title": "🧾 Zutaten",
"steps_title": "👨‍🍳 Zubereitung",
"no_steps": "Keine Zubereitungsschritte verfügbar",
"generate_error": "Fehler bei der Generierung",
"persons_short": "Pers.",
"use_ingredient_title": "Zutat verwenden",
"recipe_qty_label": "Rezept",
"from_where_label": "Von wo?",
"amount_label": "Wie viel",
"use_amount_btn": "Diese Menge verwenden",
"use_all_btn": "ALLES verwenden / Aufgebraucht",
"packs_label": "Packungen",
"quantity_in_total": "Menge in {unit} (gesamt: {total})",
"packs_of_have": "Packungen à {size} (du hast {count} Pack.)",
"scale_wait_stable": "10s stabiles Gewicht für Auto-Ausfüllen abwarten…",
"ingredient_scaled_toast": "📦 Zutat vom Vorrat abgezogen!",
"finished_added_bring_toast": "🛒 Produkt aufgebraucht → zu Bring! hinzugefügt!",
"load_error": "Fehler beim Laden"
},
"shopping": {
"title": "🛒 Einkaufsliste",
"bring_loading": "Verbindung zu Bring!...",
"bring_not_configured": "Bring! ist nicht konfiguriert. Füge E-Mail und Passwort in den <a href='#' onclick=\"showPage('settings');return false;\">Einstellungen</a> hinzu.",
"tab_to_buy": "🛍️ Zu kaufen",
"tab_forecast": "🧠 Vorhersage",
"total_label": "💰 Geschätzter Gesamtbetrag",
"section_to_buy": "🛍️ Zu kaufen",
"suggestions_title": "💡 KI-Vorschläge",
"suggestions_add": "✅ Ausgewählte zu Bring! hinzufügen",
"search_prices": "🔍 Alle Preise suchen",
"suggest_btn": "🤖 Einkaufsvorschläge",
"smart_title": "🧠 Intelligente Vorhersagen",
"smart_empty": "Keine Vorhersagen verfügbar.<br>Füge Produkte zur Vorratskammer hinzu, um intelligente Vorhersagen zu erhalten.",
"smart_filter_all": "Alle",
"smart_filter_critical": "🔴 Dringend",
"smart_filter_high": "🟠 Bald",
"smart_filter_medium": "🟡 Planen",
"smart_filter_low": "🟢 Vorhersage",
"smart_add": "🛒 Ausgewählte zu Bring! hinzufügen",
"empty": "Einkaufsliste leer!\nNutze den Button unten, um Vorschläge zu generieren.",
"already_in_list": "🛒 \"{name}\" ist bereits in der Einkaufsliste",
"already_in_list_short": "️ Bereits in der Einkaufsliste",
"add_prompt": "Möchtest du es zur Einkaufsliste hinzufügen?",
"smart_already": "📊 Intelligenter Einkauf sagt bereits {name} voraus",
"all_searched": "Alle Produkte wurden bereits gesucht. Nutze 🔄 für einzelne Suchen.",
"search_complete": "Suche abgeschlossen: {count} Produkte",
"removed_sufficient": "🧹 {removed} Produkt(e) mit ausreichendem Bestand von der Liste entfernt",
"bring_badge": "🛒 Schon auf Bring!",
"add_urgent_toast": "🔴 {n} dringende(s) Produkt(e) automatisch zu Bring! hinzugefügt",
"migration_done": "✅ {migrated} aktualisiert, {skipped} bereits ok",
"added_to_bring": "🛒 {n} Produkte zu Bring! hinzugefügt",
"added_to_bring_skip": "{n} bereits vorhanden",
"all_on_bring": "Alle Produkte waren bereits auf Bring!",
"freq_high": "📈 Häufig",
"freq_regular": "📊 Regelmäßig",
"freq_occasional": "📉 Gelegentlich",
"out_of_stock": "Ausverkauft",
"scan_toast": "📷 Scannen: {name}",
"empty_category": "Keine Produkte in dieser Kategorie",
"session_empty": "🛒 Noch keine Produkte",
"urgency_critical": "Dringend",
"urgency_high": "Bald",
"urgency_medium": "Planen",
"urgency_low": "Vorschau",
"urgency_medium_short": "Mittel",
"urgency_low_short": "Ok",
"tag_urgent": "🔴 Dringend",
"tag_priority": "⭐ Priorität",
"tag_check": "✅ Prüfen",
"smart_already_predicted": "📊 Einkauf wird bereits vorhergesagt: <strong>{name}</strong>{urgency}.",
"item_removed": "✅ {name} von der Liste entfernt!",
"urgency_spec_critical": "⚡ Dringend",
"urgency_spec_high": "🟠 Bald",
"bring_add_n": "{n} zu Bring! hinzufügen",
"bring_add_selected": "Ausgewählte zu Bring! hinzufügen",
"bring_adding": "Wird hinzugefügt...",
"bring_added_one": "1 Produkt zu Bring! hinzugefügt",
"bring_added_many": "{n} Produkte zu Bring! hinzugefügt",
"bring_skipped": "({n} bereits in Liste)",
"force_sync": "Bring!-Synchronisierung erzwingen",
"scan_target_label": "Du suchst",
"scan_target_found": "Gefunden! Aus Liste entfernen",
"bring_add_one": "1 Produkt zu Bring! hinzufügen",
"bring_add_many": "{n} Produkte zu Bring! hinzufügen",
"syncing": "Synchronisiere…",
"sync_done": "Synchronisierung abgeschlossen",
"price_searching": "Suche...",
"search_action": "Suchen",
"open_action": "Öffnen",
"not_found": "Nicht gefunden",
"search_price": "Preis suchen",
"tap_to_scan": "Zum Scannen tippen",
"tag_title": "Tag",
"remove_title": "Entfernen",
"found_count": "{found}/{total} Produkte gefunden",
"savings_offers": "· 🏷️ Du sparst €{amount} mit Angeboten",
"searching_progress": "Suche {current}/{total}...",
"remove_error": "Fehler beim Entfernen",
"suggest_loading": "Analyse läuft...",
"suggest_error": "Fehler bei der Vorschlagserstellung",
"priority_high": "Hoch",
"priority_medium": "Mittel",
"priority_low": "Niedrig"
},
"ai": {
"title": "🤖 KI-Identifikation",
"capture": "📸 Foto aufnehmen",
"retake": "🔄 Neu aufnehmen",
"hint": "Mache ein Foto des Produkts und die KI versucht es zu identifizieren",
"identifying": "🤖 Identifiziere Produkt...",
"no_api_key": "⚠️ Gemini API-Schlüssel nicht konfiguriert.\n<small>Füge GEMINI_API_KEY in der .env Datei auf dem Server hinzu.</small>",
"fields_filled": "✅ Felder von KI ausgefüllt",
"use_data": "✅ KI-Daten verwenden",
"use_data_no_barcode": "✅ KI-Daten verwenden (ohne Barcode)"
},
"log": {
"title": " Verlauf",
"type_added": "Hinzugefügt",
"type_waste": "Entsorgt",
"type_used": "Verwendet",
"type_bring": "Zu Bring! hinzugefügt",
"undone_badge": "Rückgängig",
"undo_title": "Diese Operation rückgängig machen",
"load_error": "Fehler beim Laden des Verlaufs",
"empty": "Keine Operationen aufgezeichnet.",
"undo_action_remove": "Entfernen von",
"undo_action_restore": "Wiederherstellen von",
"undo_confirm": "Vorgang rückgängig machen?\n→ {action} {name}",
"undo_success": "↩ Vorgang rückgängig gemacht für {name}",
"already_undone": "Vorgang bereits rückgängig gemacht",
"too_old": "Vorgänge älter als 24 Stunden können nicht rückgängig gemacht werden",
"undo_error": "Fehler beim Rückgängigmachen"
},
"chat": {
"title": "Gemini Chef",
"welcome": "Hallo! Ich bin dein Küchenassistent",
"welcome_desc": "Frag mich, dir einen Saft, einen Snack, ein schnelles Gericht zu machen... Ich kenne deinen Vorrat, deine Geräte und deine Vorlieben!",
"suggestion_snack": "🍿 Schneller Snack",
"suggestion_juice": "🥤 Saft/Smoothie",
"suggestion_light": "🥗 Etwas Leichtes",
"suggestion_expiry": "⏰ Ablaufende nutzen",
"clear": "Neues Gespräch",
"placeholder": "Frag etwas...",
"cleared": "Chat geleert",
"suggestion_snack_text": "Was kann ich als schnellen Snack machen?",
"suggestion_juice_text": "Mach mir einen Saft oder Smoothie mit dem was ich habe",
"suggestion_light_text": "Ich habe Hunger, möchte aber etwas Leichtes",
"suggestion_expiry_text": "Was läuft bald ab und wie kann ich es verwenden?"
},
"cooking": {
"close": "Schließen",
"tts_btn": "Vorlesen",
"restart": "↺ Neustart",
"replay": "🔊 Nochmal",
"timer": "⏱️ {time} · Timer",
"prev": "◀ Zurück",
"next": "Weiter ▶",
"ingredient_used": "✔️ Abgezogen",
"ingredient_use_btn": "📦 Verwenden",
"ingredient_deduct_title": "Von Vorrat abziehen",
"timer_expired_tts": "Timer {label} abgelaufen!",
"timer_warning_tts": "Achtung! {label}: noch 10 Sekunden!",
"recipe_done_tts": "Rezept abgeschlossen! Guten Appetit!",
"expires_chip": "läuft ab {date}",
"finish": "✅ Fertig"
},
"settings": {
"title": "⚙️ Einstellungen",
"tab_api": "API Keys",
"tab_bring": "Bring!",
"tab_recipe": "Rezepte",
"tab_mealplan": "Wochenplan",
"tab_appliances": "Geräte",
"tab_spesa": "Online-Einkauf",
"tab_camera": "Kamera",
"tab_security": "Sicherheit",
"tab_tts": "Sprache (TTS)",
"tab_language": "Sprache",
"tab_scale": "Smart-Waage",
"gemini": {
"title": "🤖 Google Gemini AI",
"hint": "API-Schlüssel für Produkterkennung, Ablaufdaten und Rezepte.",
"key_label": "Gemini API Key"
},
"bring": {
"title": "🛒 Bring! Einkaufsliste",
"hint": "Zugangsdaten für die Bring! Einkaufslisten-Integration.",
"email_label": "📧 Bring! E-Mail",
"password_label": "🔒 Bring! Passwort"
},
"recipe": {
"title": "🍳 Rezept-Einstellungen",
"hint": "Konfiguriere die Standardoptionen für die Rezeptgenerierung.",
"persons_label": "👥 Standard-Portionen",
"options_label": "🎯 Standard-Rezeptoptionen",
"fast": "⚡ Schnelles Gericht",
"light": "🥗 Leichte Mahlzeit",
"expiry": "⏰ Ablauf-Priorität",
"healthy": "💚 Extra Gesund",
"opened": "📦 Offene Produkte zuerst",
"zerowaste": "♻️ Keine Verschwendung",
"dietary_label": "🚫 Unverträglichkeiten / Einschränkungen",
"dietary_placeholder": "z.B.: glutenfrei, laktosefrei, vegetarisch..."
},
"mealplan": {
"title": "📅 Wöchentlicher Essensplan",
"hint": "Lege die Mahlzeitenart für jeden Tag fest. Wird als Leitfaden bei der Rezeptgenerierung verwendet.",
"enabled": "✅ Wöchentlichen Essensplan aktivieren",
"legend": "🌤️ = Mittagessen · 🌙 = Abendessen · Tippe auf ein Badge, um es zu ändern.",
"types_title": "📋 Verfügbare Typen"
},
"appliances": {
"title": "🔌 Verfügbare Geräte",
"hint": "Gib an, welche Geräte du hast. Sie werden bei der Rezeptgenerierung berücksichtigt.",
"new_placeholder": "z.B.: Brotbackmaschine, Thermomix, Heißluftfritteuse...",
"quick_title": "Schnell hinzufügen:",
"oven": "🔥 Backofen",
"microwave": "📡 Mikrowelle",
"air_fryer": "🍟 Heißluftfritteuse",
"bread_maker": "🍞 Brotbackmaschine",
"bimby": "🤖 Thermomix/Cookeo",
"mixer": "🌀 Küchenmaschine",
"steamer": "♨️ Dampfgarer",
"pressure_cooker": "🫕 Schnellkochtopf",
"toaster": "🍞 Toaster",
"blender": "🍹 Mixer",
"empty": "Keine Geräte hinzugefügt"
},
"spesa": {
"title": "🛍️ Online-Einkauf",
"hint": "Online-Einkaufsanbieter konfigurieren.",
"provider_label": "🏪 Anbieter",
"email_label": "📧 E-Mail",
"password_label": "🔒 Passwort",
"login_btn": "🔐 Anmelden",
"ai_prompt_label": "🤖 KI-Produktauswahl Prompt",
"ai_prompt_placeholder": "Anweisungen für die KI bei der Auswahl zwischen mehreren Produkten...",
"ai_prompt_hint": "Die KI verwendet diesen Prompt zur Auswahl des passendsten Produkts. Leer lassen für Standardverhalten.",
"configure_first": "Konfiguriere zuerst den Online-Einkauf in den Einstellungen",
"missing_credentials": "E-Mail und Passwort eingeben",
"login_in_progress": "Anmeldung läuft...",
"login_error_prefix": "Fehler:",
"login_network_error_prefix": "Netzwerkfehler:",
"login_success_default": "Anmeldung erfolgreich!",
"result_name_label": "Name",
"result_card_label": "Karte",
"result_pickup_label": "Abholpunkt",
"result_points_label": "Treuepunkte",
"connected_relogin": "✅ Verbunden — Erneut anmelden",
"connected_as": "Verbunden als {name}"
},
"camera": {
"title": "📷 Kamera",
"hint": "Wähle die Kamera für Barcode-Scanning und KI-Identifikation.",
"device_label": "📸 Standardkamera",
"back": "📱 Rückkamera (Standard)",
"front": "🤳 Frontkamera",
"devices_hint": "Bei mehreren Kameras kannst du nach Freigabe der Berechtigungen eine bestimmte aus der Liste oben wählen.",
"detect_btn": "🔄 Kameras erkennen"
},
"security": {
"title": "🔒 HTTPS-Zertifikat",
"hint": "Wenn der Browser den Fehler \"Verbindung nicht sicher\" (ERR_CERT_AUTHORITY_INVALID) zeigt, installiere das CA-Zertifikat auf dem Gerät.",
"download_btn": "📥 CA-Zertifikat herunterladen"
},
"tts": {
"title": "🔊 Sprache & TTS",
"hint": "Sprachsynthese über externe REST-API konfigurieren. Rezeptschritte und abgelaufene Timer werden an den Endpunkt gesendet.",
"enabled": "✅ TTS aktivieren",
"url_label": "🌐 Endpunkt-URL",
"method_label": "📡 HTTP-Methode",
"auth_label": "🔐 Authentifizierung",
"auth_bearer": "Bearer Token",
"auth_custom": "Benutzerdefinierter Header",
"auth_none": "Keine",
"token_label": "🔑 Bearer Token",
"custom_header_name": "📋 Header-Name",
"custom_header_value": "📋 Header-Wert",
"content_type_label": "📄 Content-Type",
"payload_key_label": "🗝️ Textfeld im Payload",
"payload_key_hint": "Name des JSON-Feldes für den zu lesenden Text (z.B.: message, text).",
"extra_fields_label": " Zusätzliche Felder (JSON)",
"extra_fields_placeholder": "{\"entity_id\": \"media_player.living_room\"}",
"extra_fields_hint": "Zusätzliche Felder im Payload, im JSON-Format. Leer lassen wenn nicht benötigt.",
"test_btn": "🔊 Testansage senden"
},
"language": {
"title": "🌐 Sprache",
"hint": "Wähle die Sprache der Benutzeroberfläche.",
"label": "🌐 Sprache",
"restart_notice": "Die Seite wird neu geladen, um die neue Sprache anzuwenden."
},
"screensaver": {
"label": "Bildschirmschoner aktivieren",
"card_title": "🌙 Bildschirmschoner",
"card_hint": "Zeigt nach 5 Minuten Inaktivität eine Uhr mit nützlichen Fakten. Standardmäßig deaktiviert."
},
"scale": {
"title": "⚖️ Smart-Waage",
"hint": "Verbinde eine Bluetooth-Waage über das Android-Gateway, um das Gewicht automatisch auszulesen.",
"tab": "Smart-Waage",
"enabled": "✅ Smart-Waage aktivieren",
"url_label": "🌐 WebSocket-Gateway-URL",
"url_placeholder": "ws://192.168.1.x:8765",
"url_hint": "URL der Android-App (gleiches WLAN). z.B.:",
"test_btn": "🔗 Verbindung testen",
"download_btn": "📥 Android-Gateway herunterladen (APK)",
"download_hint": "Android-App als Brücke zwischen BLE-Waage und EverShelf.",
"download_sub": "Quellcode: evershelf-scale-gateway/ im Projektstamm"
},
"kiosk": {
"hint": "Verwandeln Sie ein Android-Tablet in ein EverShelf-Panel mit integriertem BLE-Waagen-Gateway.",
"download_btn": "📥 EverShelf Kiosk herunterladen (APK)",
"download_sub": "Vollbild-Kioskmodus + integriertes Waagen-Gateway. Quellcode: evershelf-kiosk/"
},
"saved": "✅ Konfiguration gespeichert!",
"saved_local": "✅ Konfiguration lokal gespeichert",
"saved_local_error": "⚠️ Lokal gespeichert, Serverfehler: {error}"
},
"expiry": {
"today": "HEUTE",
"tomorrow": "Morgen",
"days": "{days} Tage",
"expired_days": "Seit {days}T",
"expired_yesterday": "Seit gestern",
"expired_today": "Heute",
"badge_today": "⚠️ Läuft heute ab!",
"badge_tomorrow": "⏰ Morgen",
"badge_tomorrow_long": "⏰ Läuft morgen ab",
"badge_days": "⏰ {n} Tage",
"badge_expired_ago": "⚠️ Seit {n}T abgel.",
"badge_expired": "⛔ Abgelaufen!",
"badge_stable": "✅ Stabil",
"badge_expiring_short": "⏰ Läuft in {n}T ab",
"badge_ok_still": "✅ Noch {n}T",
"badge_expires_red": "🔴 In {n}T",
"badge_expires_yellow": "🟡 In {n}T",
"badge_expired_bare": "⚠️ Abgelaufen",
"badge_expires_warn": "⚠️ In {n}T",
"badge_days_left": "⏳ ~{n}T übrig",
"days_approx": "~{n} Tage",
"weeks_approx": "~{n} Wochen",
"months_approx": "~{n} Monate",
"years_approx": "~{n} Jahre",
"expired_today_long": "Heute abgelaufen",
"expired_ago_long": "Seit {n} Tagen abgelaufen",
"expired_suffix": "— Abgelaufen!",
"expired_suffix_ok": "— Abgelaufen (noch ok)",
"expired_suffix_warning": "— Abgelaufen (erst prüfen)",
"days_compact": "{n}T"
},
"status": {
"ok": "OK",
"check": "Prüfen",
"discard": "Entsorgen",
"tip_freezer_ok": "Im Gefrierschrank: noch sicher (~{n}T Puffer)",
"tip_freezer_check": "Seit langem im Gefrierschrank, könnte an Qualität verloren haben. Bald verbrauchen",
"tip_freezer_danger": "Zu lange im Gefrierschrank, Gefrierbrand- und Qualitätsverlust-Risiko",
"tip_highRisk_check": "Kürzlich abgelaufen, Geruch und Aussehen vor dem Verzehr prüfen",
"tip_highRisk_danger": "Verderbliches Produkt abgelaufen: aus Sicherheitsgründen entsorgen",
"tip_medRisk_check1": "Aussehen und Geruch vor dem Verzehr prüfen",
"tip_medRisk_check2": "Schon eine Weile abgelaufen, vor dem Verzehr gut prüfen",
"tip_medRisk_danger": "Zu lange seit dem Ablaufdatum, lieber entsorgen",
"tip_lowRisk_ok": "Haltbares Produkt, noch sicher zu verzehren",
"tip_lowRisk_check": "Seit über einem Monat abgelaufen, Verpackungsintegrität prüfen",
"tip_lowRisk_danger": "Zu lange abgelaufen, besser kein Risiko eingehen"
},
"toast": {
"product_saved": "Produkt gespeichert!",
"product_created": "Produkt erstellt!",
"product_updated": "✅ Produkt aktualisiert!",
"product_removed": "Produkt entfernt",
"updated": "Aktualisiert!",
"quantity_confirmed": "✓ Menge bestätigt",
"added_to_inventory": "✅ {name} hinzugefügt!",
"removed_from_list": "✅ {name} von der Liste entfernt!",
"removed_from_list_short": "Von der Liste entfernt",
"added_to_shopping": "🛒 Zur Einkaufsliste hinzugefügt!",
"removed_from_shopping": "🛒 Von der Einkaufsliste entfernt",
"finished_to_bring": "🛒 Produkt aufgebraucht → zu Bring! hinzugefügt",
"thrown_away": "🗑️ {name} weggeworfen!",
"thrown_away_partial": "🗑️ {qty} {unit} von {name} weggeworfen",
"product_finished_confirmed": "✅ Entfernt — wieder hinzufügen, wenn du nachkaufst",
"appliance_added": "Gerät hinzugefügt",
"item_added": "{name} hinzugefügt"
},
"antiwaste": {
"title": "🌱 Anti-Verschwendungs-Bericht",
"grade_label": "Note",
"you": "Du",
"avg_label": "Ø",
"better": "🎉 Du verlierst {diff}% weniger als der {country}!",
"worse": "⚠️ Du verlierst mehr als der {country}. Verbesserungspotenzial!",
"on_par": "→ Du liegst beim {country}. Du kannst noch besser werden!",
"saved_money": "~{amount}/Monat gespart",
"saved_meals": "~{n} Mahlzeiten gerettet",
"saved_co2": "{n} kg CO₂ eingespart",
"trend_title": "Trend (letzte 3 Monate)",
"months_ago_2": "-60 Tage",
"months_ago_1": "-30 Tage",
"this_month": "Jetzt",
"country_it": "ital. Durchschnitt",
"country_de": "dt. Durchschnitt",
"country_en": "US-Durchschnitt",
"source": "Quellen: REDUCE, Eurostat, USDA 2021",
"live_on": "Live-Daten",
"live_off": "Offline",
"meals": "Mahlzeiten",
"annual_info": "📅 Du ~{you} kg/Jahr · Ø ~{avg} kg/Jahr",
"badge_rate": "Verlustquote",
"badge_saved_money": "gespart vs Ø",
"badge_wasted": "verloren",
"badge_better": "weniger als Ø"
},
"error": {
"generic": "Fehler",
"network": "Netzwerkfehler",
"no_api_key": "API-Schluessel in den Einstellungen konfigurieren",
"loading": "Fehler beim Laden des Produkts",
"not_found": "Produkt nicht gefunden",
"not_found_manual": "Produkt nicht gefunden. Manuell eingeben.",
"search": "Suchfehler. Nochmal versuchen.",
"search_short": "Suchfehler",
"save": "Fehler beim Speichern",
"connection": "Verbindungsfehler",
"camera": "Kamera nicht verfügbar",
"bring_add": "Fehler beim Hinzufügen zu Bring!",
"bring_connection": "Bring! Verbindungsfehler",
"identification": "Identifikationsfehler",
"ai_quota": "KI-Kontingent erschöpft. Bitte in ein paar Minuten erneut versuchen.",
"barcode_empty": "Barcode eingeben",
"barcode_format": "Barcode darf nur Zahlen enthalten (4-14 Ziffern)",
"min_chars": "Mindestens 2 Zeichen eingeben",
"not_in_inventory": "Produkt nicht im Bestand",
"appliance_exists": "Gerät bereits vorhanden",
"already_exists": "Bereits vorhanden",
"network_retry": "Verbindungsfehler. Erneut versuchen.",
"select_items": "Wähle mindestens ein Produkt aus"
},
"confirm": {
"remove_item": "Möchtest du dieses Produkt wirklich aus dem Bestand entfernen?",
"kiosk_exit": "Kioskmodus verlassen?"
},
"edit": {
"title": "{name} bearbeiten",
"unknown_hint": "Produktname und Informationen eingeben",
"label_name": "🏷️ Produktname"
},
"screensaver": {
"recipe_btn": "Rezepte",
"scan_btn": "Produkt scannen"
},
"days": {
"mon": "Montag",
"tue": "Dienstag",
"wed": "Mittwoch",
"thu": "Donnerstag",
"fri": "Freitag",
"sat": "Samstag",
"sun": "Sonntag",
"mon_short": "Mo",
"tue_short": "Di",
"wed_short": "Mi",
"thu_short": "Do",
"fri_short": "Fr",
"sat_short": "Sa",
"sun_short": "So"
},
"meal_types": {
"lunch": "Mittagessen",
"dinner": "Abendessen",
"colazione": "Frühstück",
"merenda": "Nachmittagssnack",
"dolce": "Dessert",
"succo": "Fruchtsaft",
"pranzo": "Mittagessen",
"cena": "Abendessen"
},
"scale": {
"status_connected": "Waage verbunden",
"status_searching": "Gateway verbunden, warte auf Waage…",
"status_disconnected": "Waagen-Gateway nicht erreichbar",
"status_error": "Verbindungsfehler zum Gateway",
"not_connected": "Waagen-Gateway nicht verbunden",
"read_btn": "⚖️ Von Waage lesen",
"reading_title": "Waage lesen",
"place_on_scale": "Produkt auf die Waage legen…",
"waiting_stable": "Das Gewicht wird automatisch erfasst, wenn die Messung stabil ist.",
"no_url": "Gateway-URL eingeben",
"testing": "⏳ Verbindung wird getestet…",
"connected_ok": "Gateway-Verbindung erfolgreich!",
"timeout": "Timeout: keine Antwort vom Gateway",
"error_connect": "Verbindung zum Gateway nicht möglich",
"tab": "Smart-Waage",
"low_weight": "Gewicht < 10 g · manuell eingeben\n(Auto-Erkennung erfordert mind. 10 g)",
"density_hint": "(Dichte {density} g/ml)",
"ml_hint": "(wird in ml umgerechnet)",
"weight_detected": "Gewicht erkannt — 10s Stabilität abwarten…",
"weight_too_low": "Gewicht zu niedrig — warten…",
"stable": "✓ Stabil",
"auto_confirm": "✅ {val} {unit} — Auto-Bestätigung in 5s (tippen zum Abbrechen)",
"cancelled_replace": "Abgebrochen — lege die Zutat wieder auf die Waage, um fortzufahren"
},
"prediction": {
"expected_qty": "Erwartet: {expected} {unit}",
"actual_qty": "Aktuell: {actual} {unit}",
"check_suggestion": "Überprüfe oder wiege die Restmenge"
},
"date": {
"today": "📅 Heute",
"yesterday": "📅 Gestern"
},
"scanner": {
"title_barcode": "🔖 Barcode scannen",
"barcode_hint": "Produktbarcode einrahmen",
"barcode_manual_placeholder": "Oder manuell eingeben...",
"barcode_use_btn": "✅ Diesen Code verwenden",
"ai_identifying": "🤖 Produkt wird erkannt...",
"ai_analyzing": "🤖 KI-Analyse läuft...",
"product_label_hint": "Produktetikett einrahmen",
"expiry_label_hint": "Ablaufdatum auf dem Produkt einrahmen",
"capture_btn": "📸 Aufnehmen",
"capture_photo_btn": "📸 Foto aufnehmen",
"retake_btn": "🔄 Erneut aufnehmen",
"camera_error_hint": "Stelle sicher, dass du HTTPS verwendest und Kameraberechtigungen erteilt hast.<br>Du kannst den Barcode manuell eingeben oder die KI-Identifikation verwenden.",
"no_barcode": "Kein Barcode"
},
"lowstock": {
"title": "⚠️ Wird knapp!",
"message": "{name} wird knapp — nur noch {qty} übrig.",
"question": "Möchtest du es zur Einkaufsliste hinzufügen?",
"yes": "🛒 Ja, zu Bring! hinzufügen",
"no": "Nein, passt für jetzt"
},
"move": {
"title": "📦 Den Rest bewegen?",
"question": "Möchtest du {thing} von {name} an einen anderen Ort bewegen?",
"question_short": "Möchtest du {thing} an einen anderen Ort bewegen?",
"thing_opened": "die offene Packung",
"thing_rest": "den Rest",
"stay_btn": "Nein, bleibt in {location}",
"moved_toast": "📦 Offene Packung bewegt nach {location}",
"vacuum_restore": "🫙 Vakuum wiederherstellen"
},
"nova": {
"1": "Unverarbeitet",
"2": "Kulinarische Zutat",
"3": "Verarbeitet",
"4": "Hochverarbeitet"
},
"meal_plan_types": {
"pasta": "Pasta",
"riso": "Reis",
"carne": "Fleisch",
"pesce": "Fisch",
"legumi": "Hülsenfrüchte",
"uova": "Eier",
"formaggio": "Käse",
"pizza": "Pizza",
"affettati": "Aufschnitt",
"verdure": "Gemüse",
"zuppa": "Suppe",
"insalata": "Salat",
"pane": "Brot/Sandwich",
"dolce": "Dessert",
"libero": "Frei"
},
"meal_sub": {
"dolce_torta": "Kuchen",
"dolce_crema": "Creme / Pudding",
"dolce_crumble": "Crumble / Tarte",
"dolce_biscotti": "Kekse / Gebäck",
"dolce_frutta": "Fruchtdessert",
"succo_dolce": "Süß / Fruchtig",
"succo_energizzante": "Energetisierend",
"succo_detox": "Detox / Grün",
"succo_rinfrescante": "Erfrischend",
"succo_vitaminico": "Vitamin / Zitrus"
},
"meal_plan": {
"reset_success": "Wochenplan zurückgesetzt",
"suggested_by": "vom Wochenplan vorgeschlagen"
},
"kiosk_session": {
"first_item": "Erstes Produkt: {name}!",
"items_two_four": "{n} Artikel — Trägheit überwinden 🚀",
"items_five_nine": "{n} Artikel — super Tempo! 💪",
"items_ten_twenty": "{n} Artikel — fast Rekord 🏆",
"items_twenty_plus": "{n} Artikel — epischer Einkauf! 🛒🔥",
"duplicates_one": "1 Duplikat (gleiches Produkt zweimal)",
"duplicates_many": "{n} Duplikate (mehrfach genommen)",
"top_category": "Top-Kategorie: {cat} ({count}×)",
"items_fallback": "{n} Artikel hinzugefügt"
}
}