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": "↺ 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",