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:
dadaloop82
2026-06-06 09:38:05 +00:00
parent 7eda4a5eb9
commit 34dcb05c05
19 changed files with 3370 additions and 558 deletions
+38 -7
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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",