feat: banner alerts, consumption predictions, scale improvements, kiosk app
- Banner notification system: suspicious quantities + consumption prediction alerts - Consumption predictions API: tracks 90-day usage patterns, flags >30% deviations - Scale stability timeout: 5s → 10s, auto-confirm remains 5s - Scale integration in edit form: weigh button with inline live display - Banner edit/weigh actions open edit form directly with scale activation - Cooking mode: Italian aliases + stem-prefix matching for ingredients - Recipe regeneration: tracks rejected ingredients for diversity - Settings migration: localStorage → .env server-side storage - Expiry priority: mandatory ≤3 days, recommended ≤7 days in recipes - Scale bug fixes: clear stale weight, double-submit guard, cap deduction - Android kiosk app (evershelf-kiosk): WebView + embedded BLE scale gateway - Version bump to 1.4.0
This commit is contained in:
+465
-449
@@ -1,462 +1,478 @@
|
||||
{
|
||||
"app": {
|
||||
"name": "EverShelf",
|
||||
"loading": "Laden..."
|
||||
},
|
||||
"nav": {
|
||||
"title": "🏠 EverShelf",
|
||||
"home": "Home",
|
||||
"inventory": "Vorrat",
|
||||
"recipes": "Rezepte",
|
||||
"shopping": "Einkauf",
|
||||
"log": "Log"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"inventory": {
|
||||
"title": "Vorrat",
|
||||
"filter_all": "Alle",
|
||||
"search_placeholder": "🔍 Produkt suchen...",
|
||||
"empty": "Keine Produkte hier.\nScanne ein Produkt, um es hinzuzufügen!",
|
||||
"no_items_found": "Keine Bestandseinträge gefunden"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"use": {
|
||||
"title": "Verwenden / Verbrauchen",
|
||||
"location_label": "📍 Woher?",
|
||||
"quantity_label": "Wie viel hast du benutzt?",
|
||||
"partial_hint": "Oder genaue Menge angeben:",
|
||||
"use_all": "🗑️ ALLES verwendet / Aufgebraucht",
|
||||
"submit": "📤 Diese Menge verwenden",
|
||||
"available": "📦 Verfügbar:",
|
||||
"not_in_inventory": "⚠️ Produkt nicht im Bestand.",
|
||||
"expiry_warning": "⚠️ Verwende zuerst die{loc}, die am {date} abläuft — {when}!"
|
||||
},
|
||||
"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…"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"shopping": {
|
||||
"title": "🛒 Einkaufsliste",
|
||||
"bring_loading": "Verbindung zu Bring!...",
|
||||
"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"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"log": {
|
||||
"title": "📒 Operationslog"
|
||||
},
|
||||
"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..."
|
||||
},
|
||||
"cooking": {
|
||||
"close": "Schließen",
|
||||
"tts_btn": "Vorlesen",
|
||||
"restart": "↺ Neustart",
|
||||
"replay": "🔊 Nochmal",
|
||||
"timer": "⏱️ {time} · Timer",
|
||||
"prev": "◀ Zurück",
|
||||
"next": "Weiter ▶"
|
||||
},
|
||||
"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"
|
||||
"app": {
|
||||
"name": "EverShelf",
|
||||
"loading": "Laden..."
|
||||
},
|
||||
"bring": {
|
||||
"title": "🛒 Bring! Einkaufsliste",
|
||||
"hint": "Zugangsdaten für die Bring! Einkaufslisten-Integration.",
|
||||
"email_label": "📧 Bring! E-Mail",
|
||||
"password_label": "🔒 Bring! Passwort"
|
||||
"nav": {
|
||||
"title": "🏠 EverShelf",
|
||||
"home": "Home",
|
||||
"inventory": "Vorrat",
|
||||
"recipes": "Rezepte",
|
||||
"shopping": "Einkauf",
|
||||
"log": "Log"
|
||||
},
|
||||
"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..."
|
||||
"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"
|
||||
},
|
||||
"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"
|
||||
"locations": {
|
||||
"dispensa": "Vorratskammer",
|
||||
"frigo": "Kühlschrank",
|
||||
"freezer": "Gefrierschrank",
|
||||
"altro": "Sonstiges"
|
||||
},
|
||||
"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"
|
||||
"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 --"
|
||||
},
|
||||
"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"
|
||||
"units": {
|
||||
"pz": "Stk",
|
||||
"conf": "Pkg",
|
||||
"g": "g",
|
||||
"ml": "ml",
|
||||
"pieces": "Stück",
|
||||
"grams": "Gramm",
|
||||
"box": "Packung",
|
||||
"boxes": "Packungen"
|
||||
},
|
||||
"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"
|
||||
"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"
|
||||
},
|
||||
"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"
|
||||
"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_edit": "Bearbeiten",
|
||||
"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": "Menge bestätigen",
|
||||
"banner_prediction_action_weigh": "Mit Waage wiegen",
|
||||
"banner_prediction_action_edit": "Korrigieren"
|
||||
},
|
||||
"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"
|
||||
"inventory": {
|
||||
"title": "Vorrat",
|
||||
"filter_all": "Alle",
|
||||
"search_placeholder": "🔍 Produkt suchen...",
|
||||
"empty": "Keine Produkte hier.\nScanne ein Produkt, um es hinzuzufügen!",
|
||||
"no_items_found": "Keine Bestandseinträge gefunden"
|
||||
},
|
||||
"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."
|
||||
"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"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"use": {
|
||||
"title": "Verwenden / Verbrauchen",
|
||||
"location_label": "📍 Woher?",
|
||||
"quantity_label": "Wie viel hast du benutzt?",
|
||||
"partial_hint": "Oder genaue Menge angeben:",
|
||||
"use_all": "🗑️ ALLES verwendet / Aufgebraucht",
|
||||
"submit": "📤 Diese Menge verwenden",
|
||||
"available": "📦 Verfügbar:",
|
||||
"not_in_inventory": "⚠️ Produkt nicht im Bestand.",
|
||||
"expiry_warning": "⚠️ Verwende zuerst die{loc}, die am {date} abläuft — {when}!"
|
||||
},
|
||||
"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…"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"shopping": {
|
||||
"title": "🛒 Einkaufsliste",
|
||||
"bring_loading": "Verbindung zu Bring!...",
|
||||
"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"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"log": {
|
||||
"title": "📒 Operationslog"
|
||||
},
|
||||
"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..."
|
||||
},
|
||||
"cooking": {
|
||||
"close": "Schließen",
|
||||
"tts_btn": "Vorlesen",
|
||||
"restart": "↺ Neustart",
|
||||
"replay": "🔊 Nochmal",
|
||||
"timer": "⏱️ {time} · Timer",
|
||||
"prev": "◀ Zurück",
|
||||
"next": "Weiter ▶"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"status": {
|
||||
"ok": "OK",
|
||||
"check": "Prüfen",
|
||||
"discard": "Entsorgen"
|
||||
},
|
||||
"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",
|
||||
"appliance_added": "Gerät hinzugefügt",
|
||||
"item_added": "{name} hinzugefügt"
|
||||
},
|
||||
"error": {
|
||||
"generic": "Fehler",
|
||||
"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",
|
||||
"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"
|
||||
},
|
||||
"confirm": {
|
||||
"remove_item": "Möchtest du dieses Produkt wirklich aus dem Bestand entfernen?"
|
||||
},
|
||||
"edit": {
|
||||
"title": "{name} bearbeiten"
|
||||
},
|
||||
"screensaver": {
|
||||
"recipe_btn": "Rezepte",
|
||||
"scan_btn": "Produkt scannen"
|
||||
},
|
||||
"days": {
|
||||
"mon": "Montag",
|
||||
"tue": "Dienstag",
|
||||
"wed": "Mittwoch",
|
||||
"thu": "Donnerstag",
|
||||
"fri": "Freitag",
|
||||
"sat": "Samstag",
|
||||
"sun": "Sonntag"
|
||||
},
|
||||
"meal_types": {
|
||||
"lunch": "Mittagessen",
|
||||
"dinner": "Abendessen"
|
||||
},
|
||||
"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"
|
||||
"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)"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"status": {
|
||||
"ok": "OK",
|
||||
"check": "Prüfen",
|
||||
"discard": "Entsorgen"
|
||||
},
|
||||
"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",
|
||||
"appliance_added": "Gerät hinzugefügt",
|
||||
"item_added": "{name} hinzugefügt"
|
||||
},
|
||||
"error": {
|
||||
"generic": "Fehler",
|
||||
"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",
|
||||
"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"
|
||||
},
|
||||
"confirm": {
|
||||
"remove_item": "Möchtest du dieses Produkt wirklich aus dem Bestand entfernen?"
|
||||
},
|
||||
"edit": {
|
||||
"title": "{name} bearbeiten"
|
||||
},
|
||||
"screensaver": {
|
||||
"recipe_btn": "Rezepte",
|
||||
"scan_btn": "Produkt scannen"
|
||||
},
|
||||
"days": {
|
||||
"mon": "Montag",
|
||||
"tue": "Dienstag",
|
||||
"wed": "Mittwoch",
|
||||
"thu": "Donnerstag",
|
||||
"fri": "Freitag",
|
||||
"sat": "Samstag",
|
||||
"sun": "Sonntag"
|
||||
},
|
||||
"meal_types": {
|
||||
"lunch": "Mittagessen",
|
||||
"dinner": "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"
|
||||
}
|
||||
}
|
||||
"prediction": {
|
||||
"expected_qty": "Erwartet: {expected} {unit}",
|
||||
"actual_qty": "Aktuell: {actual} {unit}",
|
||||
"check_suggestion": "Überprüfe oder wiege die Restmenge"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user