c9a859463c
- index.html: new Generali tab (first, active) with Language/Currency/ Theme/Screensaver/ZeroWaste/Export; old tab-language removed; screensaver timeout select uses form-input style; asset v=20260518a - app.js: auto theme = time-based (20:00-07:00 dark, not system pref); removed matchMedia listener; added 5min setInterval for auto re-check; removed Bring! token row from Info tab (internal implementation detail) - api/index.php: gemini_usage - removed all cache-estimation code; month/year_stats from ai_usage.json only - data/ai_usage.json: data-driven baseline estimate for 2026-05: ~4.4M in + ~1.3M out from 8374 inferred historical calls (102 recipes, 555 price lookups, getStats loop pre-fix, smart cron runs, etc.) = ~EUR 1.32 at 2.5-flash rates; new calls tracked precisely from now - translations: settings.tab_general added; theme.auto updated to 'Automatico (orario)' / 'Automatic (time of day)' / 'Automatisch (Tageszeit)'
1284 lines
61 KiB
JSON
1284 lines
61 KiB
JSON
{
|
||
"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 <strong>{inv_qty} {unit}</strong> im Bestand, aber die gebuchten Abgänge übersteigen die Eingänge — der Anfangsbestand wurde wahrscheinlich nie als \"Eingang\" erfasst. Bitte korrigiere die Menge oder trage die fehlenden Eingänge nach.",
|
||
"banner_anomaly_ghost_title": "weniger Bestand als erwartet",
|
||
"banner_anomaly_ghost_detail": "Laut Buchungen solltest du {expected_qty} {unit} von {name} haben, aber der Bestand zeigt nur {inv_qty} {unit}. Hast du etwas ohne Buchung entnommen?",
|
||
"consumed": "Verbraucht: {n} ({pct}%)",
|
||
"wasted": "Weggeworfen: {n} ({pct}%)",
|
||
"more_opened": "und {n} weitere geöffnet...",
|
||
"banner_expired_detail": "{when} · du hast noch <strong>{qty}</strong>.",
|
||
"banner_opened_detail": "{when} in {location} · du hast noch <strong>{qty}</strong>.",
|
||
"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.<br>Scanne ein Produkt, um es hinzuzufügen!",
|
||
"empty_db": "Keine Produkte in der Datenbank.<br>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"
|
||
},
|
||
"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"
|
||
},
|
||
"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 <strong>heute</strong> ab",
|
||
"when_tomorrow": "läuft <strong>morgen</strong> ab",
|
||
"when_days": "läuft in <strong>{n} Tagen</strong> ab",
|
||
"toast_used": "📤 {qty} von {name} verwendet",
|
||
"toast_bring": "🛒 Produkt aufgebraucht → zu Bring! hinzugefügt",
|
||
"toast_opened_finished": "🔓 Geöffnete Packung von {name} aufgebraucht!",
|
||
"disambiguation_hint": "Was meinst du mit \"alles aufgebraucht\"?",
|
||
"disambiguation_all": "🗑️ ALLES verbraucht ({qty})",
|
||
"error_exceeds_stock": "⚠️ Du kannst nicht mehr verwenden als du verfügbar hast!",
|
||
"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",
|
||
"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",
|
||
"persons_short": "Pers.",
|
||
"use_ingredient_title": "Zutat verwenden",
|
||
"recipe_qty_label": "Rezept",
|
||
"from_where_label": "Von wo?",
|
||
"amount_label": "Wie viel",
|
||
"use_amount_btn": "Diese Menge verwenden",
|
||
"use_all_btn": "ALLES verwenden / Aufgebraucht",
|
||
"packs_label": "Packungen",
|
||
"quantity_in_total": "Menge in {unit} (gesamt: {total})",
|
||
"packs_of_have": "Packungen à {size} (du hast {count} Pack.)",
|
||
"scale_wait_stable": "10s stabiles Gewicht für Auto-Ausfüllen abwarten…",
|
||
"ingredient_scaled_toast": "📦 Zutat vom Vorrat abgezogen!",
|
||
"finished_added_bring_toast": "🛒 Produkt aufgebraucht → zu Bring! hinzugefügt!",
|
||
"load_error": "Fehler beim Laden"
|
||
},
|
||
"shopping": {
|
||
"title": "🛒 Einkaufsliste",
|
||
"bring_loading": "Verbindung zu Bring!...",
|
||
"bring_not_configured": "Bring! ist nicht konfiguriert. Füge E-Mail und Passwort in den <a href='#' onclick=\"showPage('settings');return false;\">Einstellungen</a> hinzu.",
|
||
"tab_to_buy": "🛍️ Zu kaufen",
|
||
"tab_forecast": "🧠 Vorhersage",
|
||
"total_label": "💰 Geschätzter Gesamtbetrag",
|
||
"section_to_buy": "🛍️ Zu kaufen",
|
||
"suggestions_title": "💡 KI-Vorschläge",
|
||
"suggestions_add": "✅ Ausgewählte zu Bring! hinzufügen",
|
||
"search_prices": "🔍 Alle Preise suchen",
|
||
"suggest_btn": "Einkaufsvorschläge",
|
||
"smart_title": "🧠 Intelligente Vorhersagen",
|
||
"smart_empty": "Keine Vorhersagen verfügbar.<br>Füge Produkte zur Vorratskammer hinzu, um intelligente Vorhersagen zu erhalten.",
|
||
"smart_filter_all": "Alle",
|
||
"smart_filter_critical": "🔴 Dringend",
|
||
"smart_filter_high": "🟠 Bald",
|
||
"smart_filter_medium": "🟡 Planen",
|
||
"smart_filter_low": "🟢 Vorhersage",
|
||
"smart_add": "🛒 Ausgewählte zu Bring! hinzufügen",
|
||
"empty": "Einkaufsliste leer!\nNutze den Button unten, um Vorschläge zu generieren.",
|
||
"already_in_list": "🛒 \"{name}\" ist bereits in der Einkaufsliste",
|
||
"already_in_list_short": "ℹ️ Bereits in der Einkaufsliste",
|
||
"add_prompt": "Möchtest du es zur Einkaufsliste hinzufügen?",
|
||
"smart_already": "📊 Intelligenter Einkauf sagt bereits {name} voraus",
|
||
"all_searched": "Alle Produkte wurden bereits gesucht. Nutze 🔄 für einzelne Suchen.",
|
||
"search_complete": "Suche abgeschlossen: {count} Produkte",
|
||
"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: <strong>{name}</strong>{urgency}.",
|
||
"item_removed": "✅ {name} von der Liste entfernt!",
|
||
"urgency_spec_critical": "⚡ Dringend",
|
||
"urgency_spec_high": "🟠 Bald",
|
||
"bring_add_n": "{n} zu Bring! hinzufügen",
|
||
"bring_add_selected": "Ausgewählte zu Bring! hinzufügen",
|
||
"bring_adding": "Wird hinzugefügt...",
|
||
"bring_added_one": "1 Produkt zu Bring! hinzugefügt",
|
||
"bring_added_many": "{n} Produkte zu Bring! hinzugefügt",
|
||
"bring_skipped": "({n} bereits in Liste)",
|
||
"force_sync": "Bring!-Synchronisierung erzwingen",
|
||
"scan_target_label": "Du suchst",
|
||
"scan_target_found": "Gefunden! Aus Liste entfernen",
|
||
"bring_add_one": "1 Produkt zu Bring! hinzufügen",
|
||
"bring_add_many": "{n} Produkte zu Bring! hinzufügen",
|
||
"syncing": "Synchronisiere…",
|
||
"sync_done": "Synchronisierung abgeschlossen",
|
||
"price_searching": "Suche...",
|
||
"search_action": "Suchen",
|
||
"open_action": "Öffnen",
|
||
"not_found": "Nicht gefunden",
|
||
"search_price": "Preis suchen",
|
||
"tap_to_scan": "Zum Scannen tippen",
|
||
"tag_title": "Tag",
|
||
"remove_title": "Entfernen",
|
||
"found_count": "{found}/{total} Produkte gefunden",
|
||
"savings_offers": "· 🏷️ Du sparst €{amount} mit Angeboten",
|
||
"searching_progress": "Suche {current}/{total}...",
|
||
"remove_error": "Fehler beim Entfernen",
|
||
"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"
|
||
},
|
||
"ai": {
|
||
"title": "🤖 KI-Identifikation",
|
||
"capture": "📸 Foto aufnehmen",
|
||
"retake": "🔄 Neu aufnehmen",
|
||
"hint": "Mache ein Foto des Produkts und die KI versucht es zu identifizieren",
|
||
"identifying": "🤖 Identifiziere Produkt...",
|
||
"no_api_key": "⚠️ Gemini API-Schlüssel nicht konfiguriert.\n<small>Füge GEMINI_API_KEY in der .env Datei auf dem Server hinzu.</small>",
|
||
"fields_filled": "✅ Felder von KI ausgefüllt",
|
||
"use_data": "✅ KI-Daten verwenden",
|
||
"use_data_no_barcode": "✅ KI-Daten verwenden (ohne Barcode)"
|
||
},
|
||
"log": {
|
||
"title": "📒 Verlauf",
|
||
"type_added": "Hinzugefügt",
|
||
"type_waste": "Entsorgt",
|
||
"type_used": "Verwendet",
|
||
"type_bring": "Zu Bring! hinzugefügt",
|
||
"undone_badge": "Rückgängig",
|
||
"undo_title": "Diese Operation rückgängig machen",
|
||
"load_error": "Fehler beim Laden des Verlaufs",
|
||
"empty": "Keine Operationen aufgezeichnet.",
|
||
"undo_action_remove": "Entfernen von",
|
||
"undo_action_restore": "Wiederherstellen von",
|
||
"undo_confirm": "Vorgang rückgängig machen?\n→ {action} {name}",
|
||
"undo_success": "↩ Vorgang rückgängig gemacht für {name}",
|
||
"already_undone": "Vorgang bereits rückgängig gemacht",
|
||
"too_old": "Vorgänge älter als 24 Stunden können nicht rückgängig gemacht werden",
|
||
"undo_error": "Fehler beim Rückgängigmachen",
|
||
"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": "<strong>Anleitung für Chrome (Android):</strong><br>1. Zertifikat oben herunterladen<br>2. Gehe zu <em>Einstellungen → Sicherheit & Datenschutz → Weitere Sicherheitseinstellungen → Vom Gerätespeicher installieren</em><br>3. Wähle die heruntergeladene <em>EverShelf_CA.crt</em> Datei<br>4. Wähle \"CA\" und bestätige<br>5. Chrome neu starten<br><br><strong>Anleitung für Chrome (PC):</strong><br>1. Zertifikat oben herunterladen<br>2. Gehe zu <em>chrome://settings/certificates</em> (oder Einstellungen → Datenschutz und Sicherheit → Sicherheit → Zertifikate verwalten)<br>3. Tab \"Zertifizierungsstellen\" → Importieren → Datei auswählen<br>4. Häkchen bei \"Dieser Zertifizierungsstelle für die Identifikation von Webseiten vertrauen\"<br>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_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."
|
||
},
|
||
"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": "<p style=\"margin:0 0 6px;font-weight:600\">🔌 Unterstützte BLE-Protokolle:</p><ul style=\"margin:0 0 0 16px;padding:0;font-size:0.8rem\"><li>Bluetooth SIG Weight Scale (0x181D)</li><li>Bluetooth SIG Body Composition (0x181B) — Gewicht, Fett, BMI</li><li>Xiaomi Mi Body Composition Scale 2</li><li>Generisch — automatische Heuristik für 100+ Modelle</li></ul>"
|
||
},
|
||
"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"
|
||
},
|
||
"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"
|
||
},
|
||
"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"
|
||
},
|
||
"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.<br>Du kannst den Barcode manuell eingeben oder die KI-Identifikation verwenden.",
|
||
"no_barcode": "Kein Barcode",
|
||
"save_new_btn": "🆕 Keines davon — als neu speichern"
|
||
},
|
||
"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"
|
||
},
|
||
"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: <strong>{latest}</strong> (installiert: {current})",
|
||
"up_to_date": "✅ Du bist auf dem neuesten Stand — Version <strong>{v}</strong>",
|
||
"too_old": "⚠️ Der installierte Kiosk ist zu alt für die automatische Update-Prüfung.<br>Drücke den Knopf unten, um die neue Version direkt herunterzuladen.",
|
||
"manual_install": "⚠️ Dieser Kiosk unterstützt keine automatische Installation.<br><strong>Manuelle Vorgehensweise:</strong><br>1. Kiosk verlassen (✕ oben links)<br>2. EverShelf Kiosk App deinstallieren<br>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"
|
||
}
|
||
} |