Improve scan flow, AI UX, expiry history, and shopping sync.
Manual AI identification replaces auto-fallback; add duplicate-add guard, AI product match UI, ZBar/Tesseract offline scanning, expiry averages from last 3 insertions, family sibling hints, and missing i18n keys. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+38
-7
@@ -32,6 +32,7 @@
|
||||
"reset_default": "↺ Standard wiederherstellen",
|
||||
"save_info": "💾 Info speichern",
|
||||
"retry": "🔄 Erneut versuchen",
|
||||
"next": "Weiter →",
|
||||
"yes_short": "Ja",
|
||||
"no_short": "Nein"
|
||||
},
|
||||
@@ -199,6 +200,7 @@
|
||||
"mode_shopping": "🛒 Einkaufsmodus",
|
||||
"mode_shopping_end": "✅ Einkauf beenden",
|
||||
"spesa_btn": "🛒 Einkauf",
|
||||
"spesa_camera_hint": "Barcode mit der Kamera erfassen. Kein Barcode? Tippe unten auf «Mit KI erkennen».",
|
||||
"zoom": "Zoom",
|
||||
"tab_barcode": "Barcode",
|
||||
"tab_name": "Name",
|
||||
@@ -234,21 +236,36 @@
|
||||
"status_confirmed": "Bestätigt!",
|
||||
"status_parallel": "Kombinierter Scan aktiv...",
|
||||
"status_ocr_searching": "Ich lese die Barcode-Ziffern...",
|
||||
"status_digit_ocr": "Lese Ziffern unter dem Barcode...",
|
||||
"status_ai_visual_searching": "Jetzt versuche ich, das Produkt zu erkennen...",
|
||||
"method_ai_ocr": "Gemini OCR",
|
||||
"method_ai_vision": "Gemini Vision",
|
||||
"method_local_ocr": "Ziffern-OCR",
|
||||
"method_zbar": "ZBar",
|
||||
"local_ocr_found": "Code aus Ziffern: {code}",
|
||||
"ai_fallback_searching": "KI identifiziert Produkt...",
|
||||
"ai_fallback_found": "Produkt von KI erkannt",
|
||||
"ai_fallback_not_found": "KI: Produkt nicht erkannt",
|
||||
"ai_fallback_exhausted": "KI: Produkt nicht erkannt — Barcode erneut scannen",
|
||||
"ai_overlay_label": "Gemini Vision",
|
||||
"ai_overlay_msg": "Gemini Vision analysiert das Produkt...",
|
||||
"ai_retry_btn": "Mit KI erneut versuchen",
|
||||
"ai_manual_btn": "🤖 Mit KI erkennen",
|
||||
"ai_not_recognized": "KI: Produkt nicht erkannt. Erneut versuchen oder manuell eingeben.",
|
||||
"ai_match_title": "Produkt von KI erkannt",
|
||||
"ai_match_subtitle": "Waehle ein vorhandenes Produkt oder fuege das erkannte hinzu.",
|
||||
"ai_match_existing": "Mogliche Treffer in der Vorratskammer",
|
||||
"ai_match_none": "Keine ahnlichen Produkte in der Vorratskammer gefunden.",
|
||||
"ai_match_use_btn": "Dieses nutzen",
|
||||
"ai_match_add_btn": "\"{name}\" hinzufugen",
|
||||
"ai_match_existing": "Aktuell in der Vorratskammer",
|
||||
"ai_match_finished": "Aufgebraucht / leer",
|
||||
"ai_match_catalog": "Im Katalog (ohne Bestand)",
|
||||
"ai_match_finished_badge": "aufgebraucht",
|
||||
"ai_match_finished_hint": "Produkt aufgebraucht — Menge auffüllen",
|
||||
"ai_match_merged_existing": "Mit vorhandenem Katalogprodukt verknüpft",
|
||||
"ai_match_none": "Keine ähnlichen Produkte — du kannst ein neues anlegen.",
|
||||
"ai_match_use_btn": "Nutzen",
|
||||
"ai_match_create_btn": "➕ Neu anlegen: {name}",
|
||||
"ai_match_add_btn": "{name} hinzufugen",
|
||||
"ai_match_action_hint": "Tippe auf den gruenen Button, um dieses Produkt hinzuzufuegen",
|
||||
"ai_match_or_similar": "Oder waehle ein aehnliches Produkt:",
|
||||
"ai_detected_label": "KI erkannt",
|
||||
"mode_shopping_activated": "🛒 Einkaufsmodus aktiviert!"
|
||||
},
|
||||
@@ -289,8 +306,9 @@
|
||||
"hint_modify": "📝 Du kannst das Datum ändern oder mit der Kamera scannen",
|
||||
"scan_expiry_title": "📷 Ablaufdatum scannen",
|
||||
"product_added": "✅ {name} hinzugefügt!{qty}",
|
||||
"duplicate_recent_confirm": "Du hast «{name}» gerade hinzugefuegt ({when}).\n\nDie Menge ist bereits {total}.\n\nUm {qty} erhoehen?",
|
||||
"suffix_freezer_vacuum": "(Tiefkühler + vakuumversiegelt)",
|
||||
"history_badge_tip": "Durchschnitt aus {n} früheren Einträgen",
|
||||
"history_badge_tip": "Durchschnitt der letzten {n} Einträge — wird bei jedem Kauf aktualisiert",
|
||||
"vacuum_question": "Vakuumiert?",
|
||||
"vacuum_saved": "🔒 Als vakuumiert gespeichert"
|
||||
},
|
||||
@@ -343,6 +361,8 @@
|
||||
"name_label": "🏷️ Produktname *",
|
||||
"name_placeholder": "z.B.: Vollmilch, Penne Nudeln...",
|
||||
"brand_label": "🏢 Marke",
|
||||
"allergens_label": "Allergene:",
|
||||
"ingredients_summary": "📋 Zutaten",
|
||||
"brand_placeholder": "z.B.: Barilla, Müller, Knorr...",
|
||||
"category_label": "📂 Kategorie",
|
||||
"unit_label": "📏 Maßeinheit",
|
||||
@@ -375,7 +395,7 @@
|
||||
"labels_label": "Etiketten",
|
||||
"select_variant": "Genaue Variante auswählen oder KI-Daten nutzen:",
|
||||
"history_badge": "📊 Verlauf",
|
||||
"from_history": " (aus Verlauf)"
|
||||
"from_history": " (Ø letzte 3)"
|
||||
},
|
||||
"products": {
|
||||
"title": "📦 Alle Produkte",
|
||||
@@ -499,6 +519,16 @@
|
||||
"item_removed": "✅ {name} von der Liste entfernt!",
|
||||
"urgency_spec_critical": "⚡ Dringend",
|
||||
"urgency_spec_high": "🟠 Bald",
|
||||
"urgency_spec_medium": "🟡 Bald",
|
||||
"urgency_spec_low": "🔵 Prognose",
|
||||
"family_sibling_title": "Ähnlich in {location}",
|
||||
"family_sibling_location": "Standort: {location}",
|
||||
"family_sibling_qty": "Menge: {qty}",
|
||||
"family_sibling_purchased": "Gekauft am {date}",
|
||||
"family_sibling_question": "Ist die Menge noch korrekt?",
|
||||
"family_sibling_prompt": "Du hast auch {name}: {qty} auf Lager. Menge bestätigen?",
|
||||
"family_sibling_yes": "Ja, passt",
|
||||
"family_sibling_no": "Nein, aktualisieren",
|
||||
"bring_add_n": "{n} zu Bring! hinzufügen",
|
||||
"bring_add_selected": "Ausgewählte zu Bring! hinzufügen",
|
||||
"bring_adding": "Wird hinzugefügt...",
|
||||
@@ -715,7 +745,8 @@
|
||||
"devices_hint": "Bei mehreren Kameras kannst du nach Freigabe der Berechtigungen eine bestimmte aus der Liste oben wählen.",
|
||||
"detect_btn": "🔄 Kameras erkennen",
|
||||
"ai_fallback_label": "KI-Bilderkennung (5s Fallback)",
|
||||
"ai_fallback_hint": "Wird kein Barcode innerhalb von 5 Sekunden gelesen, wird automatisch ein Bild an die KI zur visuellen Produktidentifizierung gesendet. Erfordert konfiguriertes Gemini."
|
||||
"ai_fallback_hint": "Wird kein Barcode innerhalb von 5 Sekunden gelesen, wird automatisch ein Bild an die KI zur visuellen Produktidentifizierung gesendet. Erfordert konfiguriertes Gemini.",
|
||||
"ai_manual_hint": "Wenn der Barcode nicht lesbar ist, nutze den Button «Mit KI erkennen» unter der Kamera. Erfordert konfiguriertes Gemini."
|
||||
},
|
||||
"security": {
|
||||
"title": "🔒 HTTPS-Zertifikat",
|
||||
|
||||
+38
-7
@@ -32,6 +32,7 @@
|
||||
"reset_default": "↺ Reset to default",
|
||||
"save_info": "💾 Save information",
|
||||
"retry": "🔄 Retry",
|
||||
"next": "Next →",
|
||||
"yes_short": "Yes",
|
||||
"no_short": "No"
|
||||
},
|
||||
@@ -199,6 +200,7 @@
|
||||
"mode_shopping": "🛒 Shopping Mode",
|
||||
"mode_shopping_end": "✅ End shopping",
|
||||
"spesa_btn": "🛒 Shopping",
|
||||
"spesa_camera_hint": "Point the camera at the barcode. No barcode? Tap «Identify with AI» below.",
|
||||
"zoom": "Zoom",
|
||||
"tab_barcode": "Barcode",
|
||||
"tab_name": "Name",
|
||||
@@ -234,21 +236,36 @@
|
||||
"status_confirmed": "Confirmed!",
|
||||
"status_parallel": "Using combined scan methods...",
|
||||
"status_ocr_searching": "Reading the barcode digits...",
|
||||
"status_digit_ocr": "Reading numbers below the barcode...",
|
||||
"status_ai_visual_searching": "Now trying to recognize the product...",
|
||||
"method_ai_ocr": "Gemini OCR",
|
||||
"method_ai_vision": "Gemini Vision",
|
||||
"method_local_ocr": "Digit OCR",
|
||||
"method_zbar": "ZBar",
|
||||
"local_ocr_found": "Code from digits: {code}",
|
||||
"ai_fallback_searching": "AI identifying product...",
|
||||
"ai_fallback_found": "Product identified by AI",
|
||||
"ai_fallback_not_found": "AI: product not recognized",
|
||||
"ai_fallback_exhausted": "AI: product not recognized — try scanning the barcode",
|
||||
"ai_overlay_label": "Gemini Vision",
|
||||
"ai_overlay_msg": "Gemini Vision is analyzing the product...",
|
||||
"ai_retry_btn": "Retry with AI",
|
||||
"ai_manual_btn": "🤖 Identify with AI",
|
||||
"ai_not_recognized": "AI could not recognize the product. Try again or add manually.",
|
||||
"ai_match_title": "Product recognized by AI",
|
||||
"ai_match_subtitle": "Choose an existing pantry item or add the detected one.",
|
||||
"ai_match_existing": "Possible pantry matches",
|
||||
"ai_match_none": "No similar pantry products found.",
|
||||
"ai_match_use_btn": "Use this",
|
||||
"ai_match_add_btn": "Add \"{name}\"",
|
||||
"ai_match_existing": "Currently in pantry",
|
||||
"ai_match_finished": "Finished / depleted",
|
||||
"ai_match_catalog": "In catalog (no stock)",
|
||||
"ai_match_finished_badge": "depleted",
|
||||
"ai_match_finished_hint": "Finished product — restock the quantity",
|
||||
"ai_match_merged_existing": "Linked to an existing catalog product",
|
||||
"ai_match_none": "No similar products found — you can create a new one.",
|
||||
"ai_match_use_btn": "Use",
|
||||
"ai_match_create_btn": "➕ Create new: {name}",
|
||||
"ai_match_add_btn": "Add {name}",
|
||||
"ai_match_action_hint": "Tap the green button to add this product",
|
||||
"ai_match_or_similar": "Or pick a similar product:",
|
||||
"ai_detected_label": "AI detected",
|
||||
"mode_shopping_activated": "🛒 Shopping mode activated!"
|
||||
},
|
||||
@@ -289,8 +306,9 @@
|
||||
"hint_modify": "📝 You can change the date or scan it with the camera",
|
||||
"scan_expiry_title": "📷 Scan Expiry Date",
|
||||
"product_added": "✅ {name} added!{qty}",
|
||||
"duplicate_recent_confirm": "You just added \"{name}\" ({when}).\n\nQuantity is already {total}.\n\nIncrease it by {qty}?",
|
||||
"suffix_freezer_vacuum": "(freezer + vacuum sealed)",
|
||||
"history_badge_tip": "Average from {n} previous entries",
|
||||
"history_badge_tip": "Average of the last {n} entries — updates with each new purchase",
|
||||
"vacuum_question": "Vacuum sealed?",
|
||||
"vacuum_saved": "🔒 Vacuum sealed!"
|
||||
},
|
||||
@@ -343,6 +361,8 @@
|
||||
"name_label": "🏷️ Product Name *",
|
||||
"name_placeholder": "E.g.: Whole milk, Penne pasta...",
|
||||
"brand_label": "🏢 Brand",
|
||||
"allergens_label": "Allergens:",
|
||||
"ingredients_summary": "📋 Ingredients",
|
||||
"brand_placeholder": "E.g.: Barilla, Granarolo, Mutti...",
|
||||
"category_label": "📂 Category",
|
||||
"unit_label": "📏 Unit of measure",
|
||||
@@ -375,7 +395,7 @@
|
||||
"labels_label": "Labels",
|
||||
"select_variant": "Select the exact variant or use AI data:",
|
||||
"history_badge": "📊 history",
|
||||
"from_history": " (from history)"
|
||||
"from_history": " (last 3 avg)"
|
||||
},
|
||||
"products": {
|
||||
"title": "📦 All Products",
|
||||
@@ -499,6 +519,16 @@
|
||||
"item_removed": "✅ {name} removed from list!",
|
||||
"urgency_spec_critical": "⚡ Urgent",
|
||||
"urgency_spec_high": "🟠 Soon",
|
||||
"urgency_spec_medium": "🟡 Soon",
|
||||
"urgency_spec_low": "🔵 Forecast",
|
||||
"family_sibling_title": "Similar in {location}",
|
||||
"family_sibling_location": "Location: {location}",
|
||||
"family_sibling_qty": "Quantity: {qty}",
|
||||
"family_sibling_purchased": "Purchased on {date}",
|
||||
"family_sibling_question": "Is the quantity still correct?",
|
||||
"family_sibling_prompt": "You also have {name}: {qty} in stock. Confirm the quantity?",
|
||||
"family_sibling_yes": "Yes, all good",
|
||||
"family_sibling_no": "No, update",
|
||||
"bring_add_n": "Add {n} to Bring!",
|
||||
"bring_add_selected": "Add selected to Bring!",
|
||||
"bring_adding": "Adding...",
|
||||
@@ -715,7 +745,8 @@
|
||||
"devices_hint": "If you have multiple cameras, you can select a specific one from the list above after granting permissions.",
|
||||
"detect_btn": "🔄 Detect cameras",
|
||||
"ai_fallback_label": "AI visual identification (5s fallback)",
|
||||
"ai_fallback_hint": "If no barcode is read within 5 seconds, a frame is automatically sent to AI to visually identify the product. Requires Gemini configured."
|
||||
"ai_fallback_hint": "If no barcode is read within 5 seconds, a frame is automatically sent to AI to visually identify the product. Requires Gemini configured.",
|
||||
"ai_manual_hint": "If the barcode cannot be read, use the «Identify with AI» button below the camera. Requires Gemini configured."
|
||||
},
|
||||
"security": {
|
||||
"title": "🔒 HTTPS Certificate",
|
||||
|
||||
+38
-7
@@ -32,6 +32,7 @@
|
||||
"reset_default": "↺ Restablecer valores por defecto",
|
||||
"save_info": "💾 Guardar información",
|
||||
"retry": "🔄 Reintentar",
|
||||
"next": "Siguiente →",
|
||||
"yes_short": "Sí",
|
||||
"no_short": "No"
|
||||
},
|
||||
@@ -199,6 +200,7 @@
|
||||
"mode_shopping": "🛒 Modo compras",
|
||||
"mode_shopping_end": "✅ Finalizar compras",
|
||||
"spesa_btn": "🛒 Compras",
|
||||
"spesa_camera_hint": "Enfoca el código con la cámara. ¿Sin código? Pulsa «Identificar con IA» abajo.",
|
||||
"zoom": "Zoom",
|
||||
"tab_barcode": "Código de barras",
|
||||
"tab_name": "Nombre",
|
||||
@@ -233,21 +235,36 @@
|
||||
"status_confirmed": "Confirmado!",
|
||||
"status_parallel": "Escaneo combinado activo...",
|
||||
"status_ocr_searching": "Estoy leyendo los números del código de barras...",
|
||||
"status_digit_ocr": "Leyendo los números bajo el código...",
|
||||
"status_ai_visual_searching": "Ahora intento reconocer el producto...",
|
||||
"method_ai_ocr": "Gemini OCR",
|
||||
"method_ai_vision": "Gemini Vision",
|
||||
"method_local_ocr": "OCR números",
|
||||
"method_zbar": "ZBar",
|
||||
"local_ocr_found": "Código desde los números: {code}",
|
||||
"ai_fallback_searching": "Identificación de IA en curso...",
|
||||
"ai_fallback_found": "Producto identificado por IA",
|
||||
"ai_fallback_not_found": "IA: producto no reconocido",
|
||||
"ai_fallback_exhausted": "IA: producto no reconocido — prueba a escanear el código",
|
||||
"ai_overlay_label": "Gemini Vision",
|
||||
"ai_overlay_msg": "Gemini Vision está analizando el producto...",
|
||||
"ai_retry_btn": "Reintentar con IA",
|
||||
"ai_manual_btn": "🤖 Identificar con IA",
|
||||
"ai_not_recognized": "IA: producto no reconocido. Reintenta o añádelo manualmente.",
|
||||
"ai_match_title": "Producto reconocido por IA",
|
||||
"ai_match_subtitle": "Elige un producto ya en despensa o agrega el detectado.",
|
||||
"ai_match_existing": "Posibles coincidencias en despensa",
|
||||
"ai_match_none": "No se encontraron productos similares en despensa.",
|
||||
"ai_match_use_btn": "Usar este",
|
||||
"ai_match_add_btn": "Agregar \"{name}\"",
|
||||
"ai_match_existing": "Actualmente en despensa",
|
||||
"ai_match_finished": "Agotados / terminados",
|
||||
"ai_match_catalog": "En catálogo (sin stock)",
|
||||
"ai_match_finished_badge": "agotado",
|
||||
"ai_match_finished_hint": "Producto agotado — repón la cantidad",
|
||||
"ai_match_merged_existing": "Vinculado a un producto existente del catálogo",
|
||||
"ai_match_none": "Sin productos similares — puedes crear uno nuevo.",
|
||||
"ai_match_use_btn": "Usar",
|
||||
"ai_match_create_btn": "➕ Crear nuevo: {name}",
|
||||
"ai_match_add_btn": "Agregar {name}",
|
||||
"ai_match_action_hint": "Toca el boton verde para agregar este producto",
|
||||
"ai_match_or_similar": "O elige un producto similar:",
|
||||
"ai_detected_label": "IA detecto",
|
||||
"stock_in_pantry": "Ya en despensa:",
|
||||
"mode_shopping_activated": "🛒 ¡Modo compras activado!"
|
||||
@@ -289,8 +306,9 @@
|
||||
"hint_modify": "📝 Puedes cambiar la fecha o escanearla con la cámara",
|
||||
"scan_expiry_title": "📷 Escanear fecha de caducidad",
|
||||
"product_added": "✅ ¡{name} añadido!{qty}",
|
||||
"duplicate_recent_confirm": "Acabas de añadir «{name}» ({when}).\n\nLa cantidad ya es {total}.\n\n¿Aumentarla en {qty}?",
|
||||
"suffix_freezer_vacuum": "(congelador + al vacío)",
|
||||
"history_badge_tip": "Media de {n} entradas anteriores",
|
||||
"history_badge_tip": "Media de los últimos {n} registros — se actualiza con cada compra",
|
||||
"vacuum_question": "¿Al vacío?",
|
||||
"vacuum_saved": "🔒 ¡Al vacío!"
|
||||
},
|
||||
@@ -343,6 +361,8 @@
|
||||
"name_label": "🏷️ Nombre del producto *",
|
||||
"name_placeholder": "Ej.: Leche entera, Pasta penne...",
|
||||
"brand_label": "🏢 Marca",
|
||||
"allergens_label": "Alérgenos:",
|
||||
"ingredients_summary": "📋 Ingredientes",
|
||||
"brand_placeholder": "Ej.: Barilla, Danone, Heinz...",
|
||||
"category_label": "📂 Categoría",
|
||||
"unit_label": "📏 Unidad de medida",
|
||||
@@ -375,7 +395,7 @@
|
||||
"labels_label": "Etiquetas",
|
||||
"select_variant": "Selecciona la variante exacta o usa los datos de IA:",
|
||||
"history_badge": "📊 historial",
|
||||
"from_history": " (del historial)"
|
||||
"from_history": " (media últimos 3)"
|
||||
},
|
||||
"products": {
|
||||
"title": "📦 Todos los productos",
|
||||
@@ -499,6 +519,16 @@
|
||||
"item_removed": "✅ ¡{name} eliminado de la lista!",
|
||||
"urgency_spec_critical": "⚡ Urgente",
|
||||
"urgency_spec_high": "🟠 Pronto",
|
||||
"urgency_spec_medium": "🟡 Pronto",
|
||||
"urgency_spec_low": "🔵 Previsión",
|
||||
"family_sibling_title": "Similar en {location}",
|
||||
"family_sibling_location": "Ubicación: {location}",
|
||||
"family_sibling_qty": "Cantidad: {qty}",
|
||||
"family_sibling_purchased": "Comprado el {date}",
|
||||
"family_sibling_question": "¿La cantidad sigue siendo correcta?",
|
||||
"family_sibling_prompt": "También tienes {name}: {qty} en stock. ¿Confirmas la cantidad?",
|
||||
"family_sibling_yes": "Sí, correcto",
|
||||
"family_sibling_no": "No, actualizar",
|
||||
"bring_add_n": "Añadir {n} a Bring!",
|
||||
"bring_add_selected": "Añadir selección a Bring!",
|
||||
"bring_adding": "Añadiendo...",
|
||||
@@ -715,7 +745,8 @@
|
||||
"devices_hint": "Si tienes varias cámaras, puedes seleccionar una específica de la lista de arriba tras conceder los permisos.",
|
||||
"detect_btn": "🔄 Detectar cámaras",
|
||||
"ai_fallback_label": "Identificación visual IA (repuesto 5s)",
|
||||
"ai_fallback_hint": "Si no se lee ningún código de barras en 5 segundos, se envía automáticamente un fotograma a la IA para identificar el producto visualmente. Requiere Gemini configurado."
|
||||
"ai_fallback_hint": "Si no se lee ningún código de barras en 5 segundos, se envía automáticamente un fotograma a la IA para identificar el producto visualmente. Requiere Gemini configurado.",
|
||||
"ai_manual_hint": "Si el código no se lee, usa el botón «Identificar con IA» debajo de la cámara. Requiere Gemini configurado."
|
||||
},
|
||||
"security": {
|
||||
"title": "🔒 Certificado HTTPS",
|
||||
|
||||
+38
-7
@@ -32,6 +32,7 @@
|
||||
"reset_default": "↺ Rétablir les valeurs par défaut",
|
||||
"save_info": "💾 Enregistrer les informations",
|
||||
"retry": "🔄 Réessayer",
|
||||
"next": "Suivant →",
|
||||
"yes_short": "Oui",
|
||||
"no_short": "Non"
|
||||
},
|
||||
@@ -199,6 +200,7 @@
|
||||
"mode_shopping": "🛒 Mode courses",
|
||||
"mode_shopping_end": "✅ Terminer les courses",
|
||||
"spesa_btn": "🛒 Courses",
|
||||
"spesa_camera_hint": "Visez le code-barres avec la caméra. Pas de code ? Appuyez sur « Identifier avec l'IA » ci-dessous.",
|
||||
"zoom": "Zoom",
|
||||
"tab_barcode": "Code-barres",
|
||||
"tab_name": "Nom",
|
||||
@@ -233,21 +235,36 @@
|
||||
"status_confirmed": "Confirmé !",
|
||||
"status_parallel": "Scan combiné actif...",
|
||||
"status_ocr_searching": "Je lis les chiffres du code-barres...",
|
||||
"status_digit_ocr": "Lecture des chiffres sous le code-barres...",
|
||||
"status_ai_visual_searching": "J'essaie maintenant de reconnaître le produit...",
|
||||
"method_ai_ocr": "Gemini OCR",
|
||||
"method_ai_vision": "Gemini Vision",
|
||||
"method_local_ocr": "OCR chiffres",
|
||||
"method_zbar": "ZBar",
|
||||
"local_ocr_found": "Code depuis les chiffres : {code}",
|
||||
"ai_fallback_searching": "Identification IA en cours...",
|
||||
"ai_fallback_found": "Produit identifié par l'IA",
|
||||
"ai_fallback_not_found": "IA : produit non reconnu",
|
||||
"ai_fallback_exhausted": "IA : produit non reconnu — réessayez avec le code-barres",
|
||||
"ai_overlay_label": "Gemini Vision",
|
||||
"ai_overlay_msg": "Gemini Vision analyse le produit...",
|
||||
"ai_retry_btn": "Reessayer avec l'IA",
|
||||
"ai_manual_btn": "🤖 Identifier avec l'IA",
|
||||
"ai_not_recognized": "IA : produit non reconnu. Réessayez ou saisissez-le manuellement.",
|
||||
"ai_match_title": "Produit reconnu par l'IA",
|
||||
"ai_match_subtitle": "Choisissez un produit deja en stock ou ajoutez celui detecte.",
|
||||
"ai_match_existing": "Correspondances possibles dans le stock",
|
||||
"ai_match_none": "Aucun produit similaire trouve dans le stock.",
|
||||
"ai_match_use_btn": "Utiliser celui-ci",
|
||||
"ai_match_add_btn": "Ajouter \"{name}\"",
|
||||
"ai_match_existing": "Actuellement en stock",
|
||||
"ai_match_finished": "Terminés / épuisés",
|
||||
"ai_match_catalog": "Au catalogue (sans stock)",
|
||||
"ai_match_finished_badge": "épuisé",
|
||||
"ai_match_finished_hint": "Produit terminé — réapprovisionner la quantité",
|
||||
"ai_match_merged_existing": "Lié à un produit déjà au catalogue",
|
||||
"ai_match_none": "Aucun produit similaire — vous pouvez en créer un nouveau.",
|
||||
"ai_match_use_btn": "Utiliser",
|
||||
"ai_match_create_btn": "➕ Créer nouveau : {name}",
|
||||
"ai_match_add_btn": "Ajouter {name}",
|
||||
"ai_match_action_hint": "Appuyez sur le bouton vert pour ajouter ce produit",
|
||||
"ai_match_or_similar": "Ou choisissez un produit similaire :",
|
||||
"ai_detected_label": "IA a detecte",
|
||||
"stock_in_pantry": "Déjà à la maison :",
|
||||
"mode_shopping_activated": "🛒 Mode courses activé !"
|
||||
@@ -289,8 +306,9 @@
|
||||
"hint_modify": "📝 Vous pouvez modifier la date ou la scanner avec la caméra",
|
||||
"scan_expiry_title": "📷 Scanner la date de péremption",
|
||||
"product_added": "✅ {name} ajouté !{qty}",
|
||||
"duplicate_recent_confirm": "Vous venez d'ajouter « {name} » ({when}).\n\nLa quantité est déjà {total}.\n\nL'augmenter de {qty} ?",
|
||||
"suffix_freezer_vacuum": "(congélateur + sous vide)",
|
||||
"history_badge_tip": "Moyenne de {n} entrées précédentes",
|
||||
"history_badge_tip": "Moyenne des {n} derniers ajouts — mise à jour à chaque achat",
|
||||
"vacuum_question": "Sous vide ?",
|
||||
"vacuum_saved": "🔒 Sous vide !"
|
||||
},
|
||||
@@ -343,6 +361,8 @@
|
||||
"name_label": "🏷️ Nom du produit *",
|
||||
"name_placeholder": "Ex. : Lait entier, Pâtes penne...",
|
||||
"brand_label": "🏢 Marque",
|
||||
"allergens_label": "Allergènes :",
|
||||
"ingredients_summary": "📋 Ingrédients",
|
||||
"brand_placeholder": "Ex. : Barilla, Danone, Heinz...",
|
||||
"category_label": "📂 Catégorie",
|
||||
"unit_label": "📏 Unité de mesure",
|
||||
@@ -375,7 +395,7 @@
|
||||
"labels_label": "Labels",
|
||||
"select_variant": "Sélectionnez la variante exacte ou utilisez les données IA :",
|
||||
"history_badge": "📊 historique",
|
||||
"from_history": " (historique)"
|
||||
"from_history": " (moy. 3 derniers)"
|
||||
},
|
||||
"products": {
|
||||
"title": "📦 Tous les produits",
|
||||
@@ -499,6 +519,16 @@
|
||||
"item_removed": "✅ {name} retiré de la liste !",
|
||||
"urgency_spec_critical": "⚡ Urgent",
|
||||
"urgency_spec_high": "🟠 Bientôt",
|
||||
"urgency_spec_medium": "🟡 Bientôt",
|
||||
"urgency_spec_low": "🔵 Prévision",
|
||||
"family_sibling_title": "Similaire dans {location}",
|
||||
"family_sibling_location": "Emplacement : {location}",
|
||||
"family_sibling_qty": "Quantité : {qty}",
|
||||
"family_sibling_purchased": "Acheté le {date}",
|
||||
"family_sibling_question": "La quantité est-elle encore correcte ?",
|
||||
"family_sibling_prompt": "Tu as aussi {name} : {qty} en stock. Confirmer la quantité ?",
|
||||
"family_sibling_yes": "Oui, c'est bon",
|
||||
"family_sibling_no": "Non, mettre à jour",
|
||||
"bring_add_n": "Ajouter {n} à Bring !",
|
||||
"bring_add_selected": "Ajouter la sélection à Bring !",
|
||||
"bring_adding": "Ajout en cours...",
|
||||
@@ -715,7 +745,8 @@
|
||||
"devices_hint": "Si vous avez plusieurs caméras, vous pouvez en sélectionner une dans la liste ci-dessus après avoir accordé les permissions.",
|
||||
"detect_btn": "🔄 Détecter les caméras",
|
||||
"ai_fallback_label": "Identification visuelle IA (repli 5s)",
|
||||
"ai_fallback_hint": "Si aucun code-barres n'est lu en 5 secondes, une image est automatiquement envoyée à l'IA pour identifier visuellement le produit. Nécessite Gemini configuré."
|
||||
"ai_fallback_hint": "Si aucun code-barres n'est lu en 5 secondes, une image est automatiquement envoyée à l'IA pour identifier visuellement le produit. Nécessite Gemini configuré.",
|
||||
"ai_manual_hint": "Si le code-barres ne se lit pas, utilisez le bouton « Identifier avec l'IA » sous la caméra. Nécessite Gemini configuré."
|
||||
},
|
||||
"security": {
|
||||
"title": "🔒 Certificat HTTPS",
|
||||
|
||||
+39
-8
@@ -32,6 +32,7 @@
|
||||
"reset_default": "↺ Ripristina default",
|
||||
"save_info": "💾 Salva informazioni",
|
||||
"retry": "🔄 Riprova",
|
||||
"next": "Avanti →",
|
||||
"yes_short": "Sì",
|
||||
"no_short": "No"
|
||||
},
|
||||
@@ -199,6 +200,7 @@
|
||||
"mode_shopping": "🛒 Modalità Spesa",
|
||||
"mode_shopping_end": "✅ Fine spesa",
|
||||
"spesa_btn": "🛒 Spesa",
|
||||
"spesa_camera_hint": "Inquadra il codice con la telecamera. Senza barcode? Premi «Identifica con AI» sotto.",
|
||||
"zoom": "Zoom",
|
||||
"tab_barcode": "Barcode",
|
||||
"tab_name": "Nome",
|
||||
@@ -234,21 +236,36 @@
|
||||
"status_confirmed": "Confermato!",
|
||||
"status_parallel": "Doppia scansione attiva...",
|
||||
"status_ocr_searching": "Sto leggendo i numeri del codice a barre...",
|
||||
"status_digit_ocr": "Leggo i numeri sotto il codice...",
|
||||
"status_ai_visual_searching": "Ora provo a riconoscere il prodotto...",
|
||||
"method_ai_ocr": "Gemini OCR",
|
||||
"method_ai_vision": "Gemini Vision",
|
||||
"method_local_ocr": "OCR numeri",
|
||||
"method_zbar": "ZBar",
|
||||
"local_ocr_found": "Codice dai numeri: {code}",
|
||||
"ai_fallback_searching": "Identificazione AI in corso...",
|
||||
"ai_fallback_found": "Prodotto identificato dall'AI",
|
||||
"ai_fallback_not_found": "AI: prodotto non riconosciuto",
|
||||
"ai_fallback_exhausted": "AI: prodotto non riconosciuto — riprova con il barcode",
|
||||
"ai_overlay_label": "Gemini Vision",
|
||||
"ai_overlay_msg": "Gemini Vision sta analizzando il prodotto...",
|
||||
"ai_retry_btn": "Riprova con AI",
|
||||
"ai_manual_btn": "🤖 Identifica con AI",
|
||||
"ai_not_recognized": "AI: prodotto non riconosciuto. Riprova o inserisci manualmente.",
|
||||
"ai_match_title": "Prodotto riconosciuto con AI",
|
||||
"ai_match_subtitle": "Scegli se usare un prodotto gia presente oppure aggiungere quello rilevato.",
|
||||
"ai_match_existing": "Possibili corrispondenze in dispensa",
|
||||
"ai_match_none": "Nessun prodotto simile trovato in dispensa.",
|
||||
"ai_match_use_btn": "Usa questo",
|
||||
"ai_match_add_btn": "Aggiungi \"{name}\"",
|
||||
"ai_match_subtitle": "Scegli un prodotto esistente o creane uno nuovo con il nome rilevato.",
|
||||
"ai_match_existing": "In dispensa adesso",
|
||||
"ai_match_finished": "Finiti / esauriti",
|
||||
"ai_match_catalog": "Nel catalogo (senza scorte)",
|
||||
"ai_match_finished_badge": "esaurito",
|
||||
"ai_match_finished_hint": "Prodotto finito — reintegra la quantità",
|
||||
"ai_match_merged_existing": "Collegato a un prodotto già presente nel catalogo",
|
||||
"ai_match_none": "Nessun prodotto simile trovato — puoi crearne uno nuovo.",
|
||||
"ai_match_use_btn": "Usa",
|
||||
"ai_match_create_btn": "➕ Crea nuovo: {name}",
|
||||
"ai_match_add_btn": "Aggiungi {name}",
|
||||
"ai_match_action_hint": "Tocca il pulsante verde per aggiungere questo prodotto",
|
||||
"ai_match_or_similar": "Oppure scegli un prodotto simile:",
|
||||
"ai_detected_label": "AI ha trovato",
|
||||
"mode_shopping_activated": "🛒 Modalità Spesa attivata!"
|
||||
},
|
||||
@@ -289,8 +306,9 @@
|
||||
"hint_modify": "📝 Puoi modificare la data o scansionarla con la fotocamera",
|
||||
"scan_expiry_title": "📷 Scansiona Data Scadenza",
|
||||
"product_added": "✅ {name} aggiunto!{qty}",
|
||||
"duplicate_recent_confirm": "Hai appena aggiunto «{name}» ({when}).\n\nLa quantità è già {total}.\n\nVuoi aumentarla di {qty}?",
|
||||
"suffix_freezer_vacuum": "(freezer + sotto vuoto)",
|
||||
"history_badge_tip": "Media da {n} inserimenti precedenti",
|
||||
"history_badge_tip": "Media degli ultimi {n} inserimenti — si aggiorna ad ogni nuovo acquisto",
|
||||
"vacuum_question": "Messo sotto vuoto?",
|
||||
"vacuum_saved": "🔒 Sotto vuoto registrato"
|
||||
},
|
||||
@@ -343,6 +361,8 @@
|
||||
"name_label": "🏷️ Nome Prodotto *",
|
||||
"name_placeholder": "Es: Latte intero, Pasta penne rigate...",
|
||||
"brand_label": "🏢 Marca",
|
||||
"allergens_label": "Allergeni:",
|
||||
"ingredients_summary": "📋 Ingredienti",
|
||||
"brand_placeholder": "Es: Barilla, Granarolo, Mutti...",
|
||||
"category_label": "📂 Categoria",
|
||||
"unit_label": "📏 Unità di misura",
|
||||
@@ -375,7 +395,7 @@
|
||||
"labels_label": "Etichette",
|
||||
"select_variant": "Seleziona la variante esatta o usa i dati AI:",
|
||||
"history_badge": "📊 storico",
|
||||
"from_history": " (da storico)"
|
||||
"from_history": " (media ultimi 3)"
|
||||
},
|
||||
"products": {
|
||||
"title": "📦 Tutti i Prodotti",
|
||||
@@ -499,6 +519,16 @@
|
||||
"item_removed": "✅ {name} rimosso dalla lista!",
|
||||
"urgency_spec_critical": "⚡ Urgente",
|
||||
"urgency_spec_high": "🟠 Presto",
|
||||
"urgency_spec_medium": "🟡 A breve",
|
||||
"urgency_spec_low": "🔵 Previsione",
|
||||
"family_sibling_title": "Simile in {location}",
|
||||
"family_sibling_location": "Si trova in: {location}",
|
||||
"family_sibling_qty": "Quantità: {qty}",
|
||||
"family_sibling_purchased": "Acquistato il {date}",
|
||||
"family_sibling_question": "La quantità è ancora corretta?",
|
||||
"family_sibling_prompt": "Hai anche {name}: ne hai {qty} in dispensa. Confermi la quantità?",
|
||||
"family_sibling_yes": "Sì, tutto ok",
|
||||
"family_sibling_no": "No, aggiorna",
|
||||
"bring_add_n": "Aggiungi {n} a Bring!",
|
||||
"bring_add_selected": "Aggiungi selezionati a Bring!",
|
||||
"bring_adding": "Aggiunta in corso...",
|
||||
@@ -715,7 +745,8 @@
|
||||
"devices_hint": "Se hai più fotocamere, puoi selezionarne una specifica dall'elenco sopra dopo aver concesso i permessi.",
|
||||
"detect_btn": "🔄 Rileva fotocamere",
|
||||
"ai_fallback_label": "Identificazione visiva AI (fallback 5s)",
|
||||
"ai_fallback_hint": "Se il codice a barre non viene letto entro 5 secondi, un fotogramma viene inviato automaticamente all'AI per identificare il prodotto visivamente. Richiede Gemini configurato."
|
||||
"ai_fallback_hint": "Se il codice a barre non viene letto entro 5 secondi, un fotogramma viene inviato automaticamente all'AI per identificare il prodotto visivamente. Richiede Gemini configurato.",
|
||||
"ai_manual_hint": "Se il barcode non si legge, usa il pulsante «Identifica con AI» sotto la fotocamera. Richiede Gemini configurato."
|
||||
},
|
||||
"security": {
|
||||
"title": "🔒 Certificato HTTPS",
|
||||
|
||||
Reference in New Issue
Block a user