{ "app": { "name": "EverShelf", "loading": "Laden..." }, "nav": { "title": "EverShelf", "home": "Home", "inventory": "Vorrat", "recipes": "Rezepte", "shopping": "Einkauf", "log": "Verlauf", "settings": "Einstellungen" }, "btn": { "back": "← Zurück", "save": "💾 Speichern", "cancel": "✕ Abbrechen", "close": "Schließen", "add": "✅ Hinzufügen", "delete": "Löschen", "edit": "✏️ Bearbeiten", "use": "Verwenden", "edit_item": "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", "yes_short": "Ja", "no_short": "Nein" }, "form": { "select_placeholder": "-- Auswählen --" }, "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", "millilitres": "Milliliter", "from": "von" }, "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": "Verbrauch zur Prüfung", "banner_prediction_hint": "Die Verbrauchsschätzung passt sich aktuellen Daten an: bitte nur die aktuelle Menge bestätigen.", "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_finished": "Habe ich verbraucht!", "banner_expired_action_throw": "Habe ich weggeworfen", "banner_expired_action_edit": "Datum korrigieren", "banner_expired_action_modify": "Bearbeiten", "banner_expired_action_vacuum": "Vakuumieren", "banner_anomaly_action_edit": "Bestand korrigieren", "banner_anomaly_action_dismiss": "Menge ist korrekt", "banner_no_expiry_title": "Ablaufdatum fehlt: {name}", "banner_no_expiry_detail": "Dieses Produkt hat kein Ablaufdatum. Möchten Sie eines hinzufügen oder bestätigen, dass es nicht verfällt?", "banner_no_expiry_action_set": "Ablaufdatum setzen", "banner_no_expiry_action_dismiss": "Läuft nicht ab ✓", "banner_no_expiry_toast_dismissed": "Als 'läuft nicht ab' markiert", "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": "frühere Schätzung: {expected} {unit}{time}; aktuelle Menge: {actual} {unit}.", "banner_prediction_less": "Schätzung: {expected} {unit}{time}; aktuelle Menge: {actual} {unit}. Wenn sich dein Verbrauch geändert hat, aktualisiert sich die Prognose automatisch.", "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 {inv_qty} {unit} 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 {qty}.", "banner_opened_detail": "{when} in {location} · du hast noch {qty}.", "banner_explain_title": "Gemini um eine Erklärung bitten", "banner_explain_btn": "Erklären", "banner_analyzing": "🤖 Analysiere…" }, "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.
Scanne ein Produkt, um es hinzuzufügen!", "empty_db": "Keine Produkte in der Datenbank.
Scanne ein Produkt, um loszulegen!", "qty_trace": "< 1" }, "scan": { "title": "Scannen", "mode_shopping": "🛒 Einkaufsmodus", "mode_shopping_end": "✅ Einkauf beenden", "spesa_btn": "🛒 Einkauf", "zoom": "Zoom", "tab_barcode": "Barcode", "tab_name": "Name", "tab_ai": "KI", "recents_label": "Zuletzt", "torch_hint": "Taschenlampe", "torch_on": "Taschenlampe an", "torch_off": "Taschenlampe aus", "torch_unavailable": "Taschenlampe auf diesem Gerät nicht verfügbar", "flip_hint": "Kamera wechseln", "flip_front": "Frontkamera", "flip_back": "Rückkamera", "num_ocr_btn": "🔢 Zahlen mit KI lesen", "num_ocr_searching": "Suche Barcode mit KI...", "num_ocr_found": "Code gefunden: {code}", "num_ocr_not_found": "Kein Barcode im Bild gefunden", "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", "stock_in_pantry": "Bereits im Vorrat:", "status_ready": "Kamera auf Barcode richten", "status_scanning": "Scanne...", "status_partial": "Erkannt: {code} — prüfe...", "status_invalid": "Ungültig: {code} — versuche erneut", "status_confirmed": "Bestätigt!", "status_parallel": "Kombinierter Scan aktiv..." }, "action": { "title": "Was möchtest du tun?", "add_btn": "📥 HINZUFÜGEN", "add_sub": "in Vorrat/Kühlschrank", "use_btn": "VERWENDEN", "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…", "create_recipe_btn": "Rezept", "related_stock_title": "Auch zuhause" }, "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)", "history_badge_tip": "Durchschnitt aus {n} früheren Einträgen", "vacuum_question": "Vakuumiert?", "vacuum_saved": "🔒 Als vakuumiert gespeichert" }, "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}!", "expiry_warning_opened": "⚠️ Die{loc} ist seit {when} geöffnet — zuerst verwenden!", "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 heute ab", "when_tomorrow": "läuft morgen ab", "when_days": "läuft in {n} Tagen 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!", "use_all_confirm_title": "✅ Alles aufbrauchen", "use_all_confirm_msg": "Bestätige, dass du das Produkt vollständig aufgebraucht hast:", "use_all_confirm_btn": "✅ Ja, aufgebraucht", "throw_all_confirm_title": "🗑️ Alles entsorgen", "throw_all_confirm_msg": "Möchtest du wirklich das gesamte Produkt entsorgen?", "throw_all_confirm_btn": "🗑️ Ja, entsorgen" }, "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", "unknown_product": "Unbekanntes Produkt", "edit_name_brand": "Name/Marke bearbeiten", "weight_label": "Gewicht", "origin_label": "Herkunft", "labels_label": "Etiketten", "select_variant": "Genaue Variante auswählen oder KI-Daten nutzen:" }, "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", "regen_choice_title": "Was möchtest du mit diesem Rezept machen?", "regen_replace": "🔄 Neues generieren (dieses verwerfen)", "regen_save_new": "💾 Im Archiv speichern & neues generieren", "close_btn": "✅ Schließen", "ingredients_title": "🧾 Zutaten", "tools_title": "Benötigte Geräte", "steps_title": "👨‍🍳 Zubereitung", "no_steps": "Keine Zubereitungsschritte verfügbar", "generate_error": "Fehler bei der Generierung", "stream_interrupted": "Generierung unterbrochen (unvollstaendige Antwort vom Server). Protokolle pruefen oder erneut versuchen.", "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", "favorite": "Zu Favoriten hinzufügen", "unfavorite": "Aus Favoriten entfernen", "adjust_persons": "Personen" }, "shopping": { "title": "🛒 Einkaufsliste", "bring_loading": "Verbindung zu Bring!...", "bring_not_configured": "Bring! ist nicht konfiguriert. Füge E-Mail und Passwort in den Einstellungen 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.
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", "suggest_buy": "🛒 Kaufen: {qty} {unit}", "suggest_buy_approx": "🛒 Mindestens: {qty} {unit}", "suggest_buy_tip": "Empfohlene Menge basierend auf dem Verbrauch der letzten 14 Tage", "suggest_buy_approx_tip": "Mindestschätzung basierend auf Verbrauch (nächste Packungsgröße kaufen)", "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: {name}{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", "btn_fetch_prices": "Preise suchen", "price_total_label": "💰 Geschätzter Gesamtpreis:", "price_loading": "Preise werden gesucht…", "price_not_found": "Preis n/v", "suggest_loading": "Analyse läuft...", "suggest_error": "Fehler bei der Vorschlagserstellung", "priority_high": "Hoch", "priority_medium": "Mittel", "priority_low": "Niedrig", "smart_last_update": "Aktualisiert {time}", "names_already_updated": "Alle Namen sind bereits aktuell", "pantry_hint": "Bereits zuhause: {qty}" }, "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.\nFüge GEMINI_API_KEY in der .env Datei auf dem Server hinzu.", "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", "recipe_prefix": "Rezept" }, "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?", "transfer_to_recipes": "Zu Rezepten hinzufügen", "transferring": "Übertrage...", "transferred": "Zu Rezepten hinzugefügt!", "open_recipe": "Rezept öffnen", "quick_recipe_prompt": "Schlage mir ein schnelles Rezept FÜR EINE PERSON vor, das die Produkte mit dem nächsten Ablaufdatum verwendet! Ignoriere Tiefkühlprodukte, konzentriere dich auf Kühlschrank und Vorratsschrank." }, "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": "Usa", "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", "step_fallback": "Schritt {n}", "zerowaste_label": "♻️ Abfall", "zerowaste_tip_title": "Zero-Waste-Tipp" }, "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" }, "price": { "title": "💰 Preisschätzung (KI)", "hint": "Zeigt geschätzte Kosten pro Produkt in der Einkaufsliste mithilfe von KI an.", "enabled_label": "Preisschätzung aktivieren", "country_label": "🌍 Referenzland", "currency_label": "💱 Währung", "update_label": "🔄 Preise aktualisieren alle", "update_suffix": "Monate" }, "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", "reset_btn": "↺ Standard wiederherstellen" }, "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", "token_title": "🔑 Einstellungs-Token", "token_label": "Zugriffstoken", "token_hint": "Falls `SETTINGS_TOKEN` in der Server-`.env` konfiguriert ist, gib hier den Token ein, bevor du die Einstellungen speicherst. Leer lassen, wenn nicht konfiguriert.", "token_placeholder": "(leer = kein Schutz)", "token_required_hint": "🔒 Dieser Server benötigt einen Token zum Speichern der Einstellungen.", "cert_instructions": "Anleitung für Chrome (Android):
1. Zertifikat oben herunterladen
2. Gehe zu Einstellungen → Sicherheit & Datenschutz → Weitere Sicherheitseinstellungen → Vom Gerätespeicher installieren
3. Wähle die heruntergeladene EverShelf_CA.crt Datei
4. Wähle \"CA\" und bestätige
5. Chrome neu starten

Anleitung für Chrome (PC):
1. Zertifikat oben herunterladen
2. Gehe zu chrome://settings/certificates (oder Einstellungen → Datenschutz und Sicherheit → Sicherheit → Zertifikate verwalten)
3. Tab \"Zertifizierungsstellen\" → Importieren → Datei auswählen
4. Häkchen bei \"Dieser Zertifizierungsstelle für die Identifikation von Webseiten vertrauen\"
5. Chrome neu starten" }, "tts": { "title": "🔊 Sprache & TTS", "hint": "Sprachsynthese über externe REST-API konfigurieren. Rezeptschritte und abgelaufene Timer werden an den Endpunkt gesendet.", "enabled": "✅ TTS aktivieren", "engine_label": "⚙️ TTS-Engine", "engine_browser": "🔇 Browser (offline, keine Konfiguration erforderlich)", "engine_server": "🌐 Externer Server (Home Assistant, REST API...)", "voice_label": "🗣️ Stimme", "rate_label": "⚡ Geschwindigkeit", "pitch_label": "🎵 Tonhöhe", "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_sound_btn": "🔔 Klangtest ausführen", "test_btn": "🔊 Testansage senden", "voices_loading": "Stimmen werden geladen…", "voice_not_supported": "Stimme vom Browser nicht unterstützt", "voices_none": "Keine Stimmen auf diesem Gerät verfügbar", "voices_hint": "Verfügbare Stimmen hängen vom Betriebssystem und Browser ab. Auf macOS/iOS ist die Stimme Paola (Italienisch) verfügbar. Drücken Sie ↺ wenn die Liste nicht lädt.", "url_missing": "⚠️ Endpunkt-URL fehlt.", "test_sending": "⏳ Wird gesendet…", "test_ok": "✅ Antwort {code} — prüfe ob der Lautsprecher gesprochen hat.", "heard_question": "Hast du die Stimme gehört?", "heard_yes": "Ja, ich habe es gehört", "heard_no": "Nein, ich habe nichts gehört", "test_ok_kiosk": "TTS funktioniert.", "test_fail_steps": "Prüfe: 1) Medienvolume ist nicht 0; 2) Google Text-to-Speech installiert und aktualisiert; 3) Deutsches Sprachpaket in den Android TTS-Einstellungen heruntergeladen." }, "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.", "timeout_1": "1 Minute", "timeout_2": "2 Minuten", "timeout_5": "5 Minuten", "timeout_10": "10 Minuten", "timeout_15": "15 Minuten", "timeout_30": "30 Minuten", "timeout_60": "1 Stunde", "start_after": "⏱️ Starten nach" }, "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", "live_weight": "Echtzeit-Gewicht", "auto_reconnect": "🔁 Verbindung: automatisch", "kiosk_title": "📡 BLE-Waage im Kiosk integriert", "kiosk_hint": "Die Waage wird direkt vom internen BLE-Gateway des Kiosks verwaltet. Um ein neues Gerät zu koppeln, verwende den Konfigurationsassistenten.", "kiosk_reconfigure": "🔄 BLE-Waage neu konfigurieren", "ble_protocols": "

🔌 Unterstützte BLE-Protokolle:

" }, "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/", "native_title": "Kiosk-Konfiguration", "native_hint": "Server-URL, BLE-Waage, Bildschirmschoner und Einrichtungsassistent.", "native_btn": "Kiosk-Konfiguration öffnen", "native_tap_hint": "Zahnrad oben rechts antippen", "native_update_hint": "Kiosk-App aktualisieren, um diese Funktion zu nutzen", "update_title": "Kiosk-Aktualisierung", "check_updates_btn": "🔍 Nach Updates suchen", "needs_update": "⚠️ Das installierte Kiosk unterstützt diese Funktion nicht. Aktualisiere die Kiosk-App, um sie zu aktivieren." }, "saved": "✅ Konfiguration gespeichert!", "saved_local": "✅ Konfiguration lokal gespeichert", "saved_local_error": "⚠️ Lokal gespeichert, Serverfehler: {error}", "theme": { "title": "🌙 Erscheinungsbild", "hint": "Wähle das Interface-Design.", "label": "🌙 Design", "off": "☀️ Hell", "on": "🌙 Dunkel", "auto": "🔄 Automatisch (Tageszeit)" }, "zerowaste": { "card_title": "♻️ Zero-Waste-Tipps", "card_hint": "Zeige während des Kochens Tipps zur Wiederverwendung von Abfällen (Schalen, Kochwasser usw.). Standardmäßig deaktiviert.", "label": "Tipps beim Kochen anzeigen" }, "backup": { "tab": "Backup", "local_title": "Lokales Backup", "local_hint": "Täglicher Datenbank-Snapshot. Konfiguriere, wie viele Tage Backups aufbewahrt werden.", "enabled": "Tägliches automatisches Backup aktivieren", "retention_days": "Aufbewahrung (Tage)", "retention_info": "Backups werden aufbewahrt für", "backup_now": "Jetzt sichern", "backing_up": "Sicherung läuft…", "backed_up": "Sicherung abgeschlossen", "backup_error": "Sicherungsfehler", "last_backup": "Letztes Backup", "no_backup_yet": "Noch kein Backup erstellt", "list_empty": "Keine Backups verfügbar", "restore_btn": "Wiederherstellen", "restore_confirm": "Backup wiederherstellen", "delete_btn": "Löschen", "delete_confirm": "Backup löschen", "gdrive_title": "Google Drive", "gdrive_hint": "Backups automatisch via OAuth 2.0 auf Google Drive hochladen. Keine externen Bibliotheken erforderlich.", "gdrive_enabled": "Google Drive Backup aktivieren", "gdrive_folder_id": "Drive-Ordner-ID", "gdrive_folder_id_hint": "Kopiere die ID aus der Drive-Ordner-URL: …/folders/ID", "gdrive_retention_days": "Drive-Aufbewahrung (Tage, 0=alles behalten)", "gdrive_test": "Verbindung testen", "gdrive_ok": "Verbindung erfolgreich!", "gdrive_error": "Verbindung fehlgeschlagen", "gdrive_push_now": "Jetzt auf Drive hochladen", "gdrive_pushing": "Wird hochgeladen…", "gdrive_pushed": "Auf Drive hochgeladen", "gdrive_wizard_hint": "Optional: täglich automatisch via OAuth 2.0 auf Google Drive sichern.", "gdrive_skip": "Überspringen — später in Einstellungen konfigurieren", "gdrive_client_id": "Client-ID", "gdrive_client_secret": "Client-Secret", "gdrive_redirect_uri_hint": "Füge http://localhost als autorisierten Weiterleitungs-URI in der Google Cloud Console hinzu. Funktioniert auf jedem Server, auch ohne öffentliche Domain.", "gdrive_code_title": "Autorisierungs-URL oder Code einfügen", "gdrive_code_hint": "Nach der Autorisierung öffnet der Browser http://localhost und zeigt möglicherweise einen Verbindungsfehler — das ist normal. Kopiere die URL aus der Adressleiste (z.B. http://localhost/?code=4%2F0A...) und füge sie hier ein.", "gdrive_code_submit": "Bestätigen", "gdrive_code_empty": "Bitte zuerst die URL oder den Autorisierungscode einfügen", "gdrive_redirect_uri_label": "Redirect-URI (in Google Cloud Console eintragen):", "gdrive_oauth_authorize": "Mit Google autorisieren", "gdrive_oauth_authorized": "Autorisiert", "gdrive_oauth_not_authorized": "Noch nicht autorisiert", "gdrive_oauth_window_opened": "Browserfenster geöffnet — autorisieren und zurückkehren", "gdrive_oauth_how_to": "OAuth 2.0 einrichten (Schritt für Schritt)", "gdrive_oauth_steps": "
  • Gehe zu console.cloud.google.com und wähle dein Projekt
  • Aktiviere die Google Drive API: APIs & Dienste → APIs aktivieren → Google Drive API
  • Gehe zu APIs & Dienste → Anmeldedaten → Anmeldedaten erstellen → OAuth-Client-ID
  • Anwendungstyp: Webanwendung; füge die unten angezeigte URL als Autorisierter Weiterleitungs-URI hinzu
  • Kopiere Client-ID und Client-Secret in die Felder oben und speichere
  • Klicke auf Mit Google autorisieren: melde dich an und erteile den Zugriff
  • Das Fenster schließt sich automatisch und Backups sind bereit
  • " }, "info": { "tab": "Info", "ai_title": "Gemini AI — Token-Nutzung", "ai_hint": "Monatlicher Verbrauch und geschätzte Kosten für den aktuellen API-Schlüssel.", "loading": "Laden…", "total_tokens": "Token gesamt", "est_cost": "Gesch. Kosten", "input_tok": "Eingabe-Token", "output_tok": "Ausgabe-Token", "ai_calls": "Aufrufe", "by_action": "Aufschlüsselung nach Funktion", "by_model": "Aufschlüsselung nach Modell", "pricing_note": "Gemini Referenzpreise: 2.5-flash $0.15/M in · $0.60/M out — 2.0-flash $0.10/M in · $0.40/M out.", "system_title": "System", "db_size": "Datenbank", "log_size": "Protokolle", "log_level": "Log-Level", "ai_overview": "KI-Nutzungsübersicht, Inventar und Systemstatus", "calls_unit": "Aufrufe", "inv_title": "Inventar", "inv_active": "Aktiv", "inv_products": "Produkte gesamt", "inv_expiring": "Ablaufend (7T)", "inv_expired": "Abgelaufen", "inv_finished": "Leer", "act_title": "Monatliche Aktivität", "act_tx_month": "Bewegungen", "act_restock": "Einkäufe", "act_use": "Verbrauch", "act_new_products": "Neue Produkte", "act_tx_year": "Jährl. Bewegungen", "price_cache": "Preiscache", "cache_entries": "Produkte", "last_backup": "Letztes Backup", "bring_days": "Token läuft in {n} Tagen ab", "bring_expired": "Token abgelaufen", "year_label": "Jahr {year}", "currency_title": "Währung", "currency_hint": "Die Währung, die für alle Kosten und Preise in der App verwendet wird." }, "tab_general": "Allgemein", "shopping": { "tab": "Einkaufsliste", "title": "Einkaufsliste", "hint": "Konfiguriere die integrierte Einkaufsliste oder verbinde Bring!.", "enable_label": "Einkaufsliste aktivieren", "mode_label": "Anbieter", "mode_internal": "Intern (ohne Bring!)", "mode_bring": "Bring! (externe App)", "bring_section_title": "Bring!-Konfiguration", "ai_section_title": "KI-Unterstützung", "smart_suggestions_label": "KI-Vorschläge", "forecast_label": "Prognose für bald leere Produkte", "auto_add_label": "Automatisch hinzufügen wenn", "auto_add_suffix": "im Lager verbleibend (0 = nur wenn leer)" }, "ha": { "tab": "Home Assistant", "title": "Home Assistant", "hint": "Verbinde EverShelf mit Home Assistant für Automationen, Push-Benachrichtigungen und REST-Sensoren.", "enabled": "Home Assistant-Integration aktivieren", "connection_title": "Verbindung", "url_label": "Home Assistant URL", "url_placeholder": "http://192.168.1.50:8123", "url_hint": "Basis-URL deiner Home Assistant-Instanz (z.B. http://homeassistant.local:8123).", "token_label": "Long-Lived Access Token", "token_hint": "Erstelle unter HA-Profil → Sicherheit → Langlebige Zugangstoken.", "token_placeholder": "eyJhbGci...", "token_saved": "Token gespeichert (aus Sicherheitsgründen verborgen)", "test_btn": "Verbindung testen", "test_ok": "Verbunden mit {version}", "test_fail": "Verbindung fehlgeschlagen: {error}", "test_bad_token": "HA erreichbar, aber Token ist ungültig", "testing": "Teste…", "error_no_url": "Bitte zuerst die Home Assistant URL eingeben.", "tts_title": "TTS auf Smart Speaker", "tts_hint": "Rezeptschritte auf einem Home Assistant Media Player vorlesen.", "tts_entity_label": "Media Player Entity ID", "tts_entity_placeholder": "media_player.wohnzimmer", "tts_entity_hint": "Entity-ID des HA-Media-Players. Zu finden unter HA: Entwicklertools → Zustände.", "tts_platform_label": "TTS-Plattform", "tts_platform_speak": "tts.speak (empfohlen)", "tts_platform_notify": "notify.* (Benachrichtigungsdienst)", "tts_apply_btn": "HA-Voreinstellung auf TTS-Tab anwenden", "tts_apply_hint": "Füllt den TTS-Tab mit der Home Assistant URL und dem Token aus.", "tts_preset_applied": "HA-Voreinstellung auf TTS-Tab angewendet.", "webhook_title": "Webhook-Automationen", "webhook_hint": "Sende Daten an Home Assistant, wenn Ereignisse in der Vorratskammer auftreten.", "webhook_id_label": "Webhook-ID", "webhook_id_placeholder": "evershelf_webhook_abc123", "webhook_id_hint": "ID des in HA erstellten Webhooks. Kopiere aus: HA → Einstellungen → Automationen → Erstellen → Webhook-Auslöser.", "webhook_events_label": "Benachrichtige bei diesen Ereignissen", "event_expiry": "Ablaufende Produkte (täglich)", "event_shopping": "Artikel zur Einkaufsliste hinzugefügt", "event_stock": "Lagerbestand aktualisiert", "expiry_days_label": "Ablaufwarnung im Voraus (Tage)", "expiry_days_hint": "Sende die Ablaufwarnung N Tage vor dem Ablaufdatum.", "webhook_help": "In HA: Einstellungen → Automationen → Automation erstellen → Auslöser: Webhook → ID kopieren.", "notify_title": "Push-Benachrichtigungen", "notify_hint": "Sende Push-Benachrichtigungen über einen Home Assistant notify-Dienst.", "notify_service_label": "Notify-Dienst", "notify_service_placeholder": "notify.mobile_app_mein_handy", "notify_service_hint": "Name des HA-notify-Dienstes (z.B. notify.mobile_app_phone). Leer lassen zum Deaktivieren.", "sensor_title": "REST-Sensoren", "sensor_hint": "Zur configuration.yaml hinzufügen, um EverShelf-Sensoren in Home Assistant zu erstellen.", "sensor_copy_btn": "YAML kopieren", "sensor_copied": "YAML in die Zwischenablage kopiert!", "save_btn": "HA-Einstellungen speichern", "ha_hint": "Wenn du Home Assistant verwendest, nutze den Home Assistant-Tab für TTS, Webhooks und Sensoren." } }, "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)", "opened_ago_long": "Seit {n} Tagen geöffnet", "opened_today_long": "Heute geöffnet", "opened_suffix": "— Zu lange geöffnet!", "opened_suffix_ok": "— Geöffnet (noch ok)", "opened_suffix_warning": "— Geöffnet (erst prüfen)", "days_compact": "{n}T", "badge_check_soon": "Bald prüfen" }, "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", "finished_all": "📤 {name} aufgebraucht!", "vacuum_sealed": "{name} als vakuumversiegelt gespeichert", "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", "server_offline": "Serververbindung unterbrochen", "server_restored": "Serververbindung wiederhergestellt", "server_retry": "Erneut versuchen", "unknown": "Unbekannter Fehler", "prefix": "Fehler", "no_inventory_entry": "Kein Inventareintrag gefunden", "offline_title": "Keine Verbindung", "offline_subtitle": "Die App kann den Server nicht erreichen. Überprüfe deine WLAN-Verbindung.", "offline_checking": "Verbindung prüfen…", "offline_restored": "Verbindung wiederhergestellt!", "offline_continue": "Im Offline-Modus fortfahren", "offline_reading_cache": "Lese aus lokalem Cache", "offline_ops_pending": "{n} Aktionen ausstehend", "offline_synced": "{n} Aktionen synchronisiert", "offline_ai_disabled": "Offline nicht verfügbar", "offline_cache_ready": "Offline — {n} Produkte im Cache" }, "confirm": { "remove_item": "Möchtest du dieses Produkt wirklich aus dem Bestand entfernen?", "kiosk_exit": "Kioskmodus verlassen?", "cancel": "Abbrechen", "proceed": "Bestätigen" }, "location": { "dispensa": "Vorratskammer", "frigo": "Kühlschrank", "freezer": "Gefrierschrank" }, "edit": { "title": "{name} bearbeiten", "unknown_hint": "Produktname und Informationen eingeben", "label_name": "🏷️ Produktname", "choose_location_title": "Welchen Ort?", "choose_location_hint": "Wähle den zu bearbeitenden Ort:" }, "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.
    Du kannst den Barcode manuell eingeben oder die KI-Identifikation verwenden.", "no_barcode": "Kein Barcode", "save_new_btn": "🆕 Keines davon — als neu speichern", "expiry_found": "Datum gefunden", "expiry_read_fail": "Datum konnte nicht gelesen werden.", "expiry_raw_label": "Erkannt" }, "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", "vacuum_seal_rest": "Rest vakuumieren" }, "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", "not_available": "nicht im Vorrat verfügbar", "suggested_by": "vom Wochenplan vorgeschlagen" }, "nutrition": { "title": "🥗 Ernährungsanalyse", "score_excellent": "😄 Ausgezeichnet", "score_good": "🙂 Gut", "score_improve": "😬 Verbesserbar", "label_health": "🌿 Gesundheit", "label_variety": "🎨 Vielfalt", "label_fresh": "❄️ Frisch", "source": "Basierend auf {n} Produkten in deiner Vorratskammer · EverShelf", "products_count": "Produkte", "today_title": "🥗 Deine Vorratskammer heute", "products_n": "{n} Produkte", "macros_title": "Geschätzte Makronährstoffe", "macros_proteins": "Proteine", "macros_carbs": "Kohlenhydrate", "macros_fat": "Fett", "macros_fiber": "Ballaststoffe", "macros_source": "Schätzung basierend auf {n} Vorratsprodukten" }, "facts": { "greeting_morning": "Guten Morgen", "greeting_afternoon": "Guten Tag", "greeting_evening": "Guten Abend", "pantry_waiting": "{greeting}! Deine Vorratskammer wartet.", "expired_one": "Du hast 1 abgelaufenes Produkt in der Vorratskammer. Bitte überprüfen!", "expired_many": "Du hast {n} abgelaufene Produkte in der Vorratskammer. Bitte überprüfen!", "expired_list": "Abgelaufene Produkte: {names}", "expired_list_more": "und {n} weitere", "freezer_expired_ok": "{name} ist abgelaufen, aber im Gefrierschrank könnte es noch gut sein! Überprüfe es.", "freezer_expired_old": "{name} im Gefrierschrank ist zu lange abgelaufen. Besser wegwerfen.", "fridge_expired_one": "Du hast 1 abgelaufenes Produkt im Kühlschrank!", "fridge_expired_many": "Du hast {n} abgelaufene Produkte im Kühlschrank!", "expiring_today": "{name} läuft heute ab! Sofort verbrauchen.", "expiring_tomorrow": "{name} läuft morgen ab. Denk daran!", "expiring_days": "{name} läuft in {days} Tagen ab.", "expiring_many": "Du hast {n} Produkte, die bald ablaufen.", "expiring_this_week": "{n} Produkte laufen diese Woche ab. Plane deine Mahlzeiten entsprechend!", "expiring_item_loc": "{name} ({loc}) läuft in {days} {dayslabel} ab.", "expiring_this_month": "{n} Produkte laufen diesen Monat ab.", "shopping_add": "Zur Liste: {names} 🛒", "shopping_more": "und {n} weitere", "shopping_empty": "Einkaufsliste leer. Alles aufgefüllt! ✅", "in_fridge": "Im Kühlschrank: {name}.", "in_freezer": "Im Gefrierschrank: {name}. Vergiss es nicht!", "top_category": "Häufigste Kategorie: {icon} {cat} mit {n} Produkten.", "cat_meat": "Du hast {n} Fleischprodukte. 🥩", "cat_dairy": "Du hast {n} Milchprodukte zu Hause. 🥛", "cat_veggies": "Du hast {n} Gemüsesorten. Super für die Gesundheit! 🥬", "cat_fruit": "Du hast {n} Obstsorten. 🍎", "cat_drinks": "Du hast {n} Getränke verfügbar. 🥤", "cat_frozen": "Du hast {n} Tiefkühlprodukte. ❄️", "cat_pasta": "Du hast {n} Nudelsorten. 🍝 Wie wäre es mit einer Carbonara?", "cat_canned": "Du hast {n} Konserven in der Vorratskammer. 🥫", "cat_snacks": "Du hast {n} Snacks. Widerstand leisten! 🍪", "cat_condiments": "Du hast {n} Gewürze zur Verfügung. 🧂", "item_random": "Wusstest du? Du hast {name} in {loc}.", "item_qty": "{name}: du hast {qty}.", "no_expiry_count": "{n} Produkte haben kein Ablaufdatum.", "furthest_expiry": "Das Produkt mit dem spätesten Ablaufdatum ist {name}: {months} Monate.", "high_qty": "Du hast einen guten Vorrat von {name}: {qty}!", "low_qty_item": "{name} geht zur Neige. Auf die Einkaufsliste?", "low_qty_count": "{n} Produkte sind fast aufgebraucht.", "morning_bread": "Guten Morgen! Du hast Brot für das Frühstück. 🍞", "morning_milk": "Gibt es Milch im Kühlschrank für den Cappuccino? ☕🥛", "morning_fruit": "Guten Morgen! Frisches Obst ist ein guter Start. 🍎", "noon_pasta": "Mittagszeit… Wie wäre es mit Pasta? 🍝", "noon_salad": "Ein frischer Salat zum Mittagessen? Du hast {n} Gemüsesorten! 🥗", "evening_meat": "Zum Abendessen könntest du das Fleisch verwenden. 🥩", "evening_fish": "Wie wäre es mit Fisch zum Abendessen? 🐟", "evening_expiring": "Du hast {n} Produkte, die diese Woche ablaufen — heute Abend verwenden!", "night_reminder": "Gute Nacht! Denk morgen daran zu verwenden: {names}.", "weekly_balance": "Wochenbilanz: +{in} hinzugefügt, −{out} verbraucht.", "weekly_added": "Du hast diese Woche {n} Produkte hinzugefügt.", "weekly_consumed": "Du hast diese Woche {n} Produkte verbraucht. Gut gemacht!", "tip_freezer": "💡 Tiefkühlprodukte halten viel länger als das Ablaufdatum.", "tip_bread": "💡 Gefrorenes Brot behält seinen Duft wochenlang.", "tip_fifo": "💡 Um Verschwendung zu vermeiden, zuerst Produkte mit nahem Ablaufdatum verwenden (FIFO).", "tip_meat": "💡 Fleisch im Gefrierschrank hält bis zu 6 Monate problemlos.", "tip_no_refreeze": "💡 Niemals ein aufgetautes Lebensmittel wieder einfrieren. Sofort zubereiten!", "tip_fridge": "💡 Ein ordentlicher Kühlschrank spart Zeit und Geld.", "tip_canned": "💡 Geöffnete Konserven in den Kühlschrank und in wenigen Tagen verbrauchen.", "top_brand": "Die häufigste Marke in deiner Vorratskammer ist {brand} mit {n} Produkten.", "combo_pasta": "Du hast Pasta und Gewürze: bereit für ein Erstgericht! 🍝", "combo_sandwich": "Brot und Fleisch: ein schnelles Sandwich ist immer eine gute Idee! 🥪", "combo_balanced": "Gemüse und Fleisch: du hast alles für eine ausgewogene Mahlzeit! 🥗🥩", "pantry_empty": "Die Vorratskammer ist leer! Zeit zum Einkaufen. 🛒", "pantry_empty_scan": "Keine Produkte erfasst. Scanne etwas um zu beginnen!", "location_distribution": "Verteilung: {parts}", "day": "Tag", "days": "Tage" }, "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" }, "kiosk": { "check_btn": "🔍 Nach Updates suchen", "checking": "⏳ Prüfe…", "error_check": "Fehler bei der Update-Prüfung", "error_start_install": "Fehler beim Starten der Installation", "version_installed": "Installiert: {v}", "update_available": "⬆️ Neue Version verfügbar: {latest} (installiert: {current})", "up_to_date": "✅ Du bist auf dem neuesten Stand — Version {v}", "too_old": "⚠️ Der installierte Kiosk ist zu alt für die automatische Update-Prüfung.
    Drücke den Knopf unten, um die neue Version direkt herunterzuladen.", "manual_install": "⚠️ Dieser Kiosk unterstützt keine automatische Installation.
    Manuelle Vorgehensweise:
    1. Kiosk verlassen (✕ oben links)
    2. EverShelf Kiosk App deinstallieren
    3. Neue APK von GitHub herunterladen und installieren:", "starting_download": "⏳ Download startet…", "install_btn": "⬇️ Update installieren", "exit_title": "Kiosk beenden", "refresh_title": "Seite aktualisieren" }, "update": { "new_version": "Neue Version", "btn": "Aktualisieren" }, "gemini": { "chat_title": "Mit Gemini chatten", "not_configured": "🤖 Gemini nicht konfiguriert — GEMINI_API_KEY in den Einstellungen setzen" }, "appliances": { "empty": "Kein Haushaltsgerät hinzugefügt" }, "about": { "title": "Über", "version": "Version", "report_bug": "Fehler melden", "report_bug_hint": "Etwas funktioniert nicht? Sende uns direkt aus der App eine Meldung.", "report_bug_modal_title": "Fehler melden", "report_type_bug": "Fehler", "report_type_feature": "Funktion", "report_type_question": "Frage", "report_field_title": "Titel", "report_field_title_ph": "Kurze Beschreibung des Problems", "report_field_desc": "Beschreibung", "report_field_desc_ph": "Problem detailliert beschreiben…", "report_field_steps": "Schritte zum Reproduzieren (optional)", "report_field_steps_ph": "1. Gehe zu…\n2. Tippe auf…\n3. Fehler erscheint…", "report_auto_info": "Automatisch beigefügt: Version {version}, Sprache {lang}.", "report_send_btn": "Bericht senden", "report_bug_sending": "Wird gesendet…", "report_bug_sent": "Bericht gesendet — danke!", "report_bug_error": "Bericht konnte nicht gesendet werden. Verbindung prüfen.", "changelog": "Changelog", "github": "GitHub-Repository" }, "export": { "title": "Inventar exportieren", "hint": "Lade das aktuelle Inventar als CSV herunter oder öffne die druckfertige Version (PDF).", "btn_csv": "CSV herunterladen", "btn_pdf": "PDF / Drucken", "btn_title": "Exportieren" }, "startup": { "connecting": "Serververbindung wird hergestellt...", "check_php_memory": "PHP-Speicher", "check_php_timeout": "PHP-Timeout", "check_php_upload": "PHP-Upload", "check_data_dir": "Datenverzeichnis", "check_rate_limits": "Rate-Limits-Verzeichnis", "check_backups": "Backup-Verzeichnis", "check_write_test": "Schreibtest", "check_disk_space": "Speicherplatz", "check_db_legacy": "Legacy-DB (dispensa.db)", "check_db_connect": "Datenbankverbindung", "check_db_tables": "Datenbanktabellen", "check_db_integrity": "Datenbankintegrität", "check_db_wal": "WAL-Modus", "check_db_size": "Datenbankgröße", "check_db_rows": "Inventardaten", "check_env": ".env-Datei", "check_gemini": "Gemini-AI-Schlüssel", "check_bring_creds": "Bring!-Anmeldedaten", "check_bring_token": "Bring!-Token", "check_tts": "Text-to-Speech-URL", "check_scale": "Waagen-Gateway", "check_curl_ssl": "cURL-SSL", "check_internet": "Internetverbindung", "fresh_install": "Neuinstallation", "warnings_found": "Warnungen", "all_ok": "System OK", "critical_error_short": "Kritischer Fehler", "critical_error": "Kritischer Fehler: Die App kann nicht gestartet werden. Prüfe die Serverlogs.", "critical_error_intro": "Die App kann aufgrund folgender Probleme nicht gestartet werden:", "error_network": "Server nicht erreichbar.", "error_network_detail": "Der Browser kann den PHP-Server nicht erreichen.\n\nMögliche Ursachen:\n• Apache/PHP-Server läuft nicht\n• Netzwerk- oder Firewall-Problem\n• Falsche App-URL\n\nBitte Server starten und erneut versuchen.", "retry": "Erneut versuchen", "syncing_local": "Lokale Daten synchronisieren...", "sync_done": "Lokale Daten aktualisiert" }, "stats_monthly": { "title": "Monatsstatistik", "consumed": "Produkte verbraucht", "trend_up": "+{pct}% vs. {prev}", "trend_down": "-{pct}% vs. {prev}", "trend_same": "gleiches Tempo wie letzten Monat", "added": "hinzugefügt", "wasted": "verschwendet", "top_used": "meistbenutzt", "top_cats": "Hauptkategorien", "source": "Transaktionsverlauf · aktueller Monat" } }