Files
food-ai/client/lib/l10n/app_it.arb
dbastrikin 5c5ed25e5b feat: improved receipt recognition, batch product add, and scan UX
- Rewrite receipt OCR prompt: completes truncated names, preserves fat%
  and flavour attributes, extracts weight/volume from line, infers
  typical package sizes for solid goods with quantity_confidence field
- Add quantity_confidence to RecognizedItem, EnrichedItem, and
  ProductJobResultItem; propagate through item enricher and worker
- Replace per-item create loop with single POST /user-products/batch call
  from RecognitionConfirmScreen
- Rebuild RecognitionConfirmScreen: amber qty border for low
  quantity_confidence, tappable product name → catalog picker,
  sort items by confidence, full L10n (no hardcoded strings)
- Add timestamps (HH:mm / d MMM HH:mm) to recent scan chips
- Show close-app hint on ProductJobWatchScreen (queued + processing)
- Refresh recentProductJobsProvider on watch screen init so new job
  appears without a manual pull-to-refresh
- App-level WidgetsBindingObserver refreshes product and dish job lists
  on resume, fixing stale lists after background/foreground transitions
- Add 9 new L10n keys across all 12 locales

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 23:09:57 +02:00

236 lines
8.0 KiB
Plaintext

{
"@@locale": "it",
"appTitle": "FoodAI",
"greetingMorning": "Buongiorno",
"greetingAfternoon": "Buon pomeriggio",
"greetingEvening": "Buonasera",
"caloriesUnit": "kcal",
"gramsUnit": "g",
"goalLabel": "obiettivo:",
"consumed": "Consumato",
"remaining": "Rimanente",
"exceeded": "Superato",
"proteinLabel": "Proteine",
"fatLabel": "Grassi",
"carbsLabel": "Carboidrati",
"today": "Oggi",
"yesterday": "Ieri",
"mealsSection": "Pasti",
"addDish": "Aggiungi piatto",
"scanDish": "Scansiona",
"menu": "Menu",
"dishHistory": "Cronologia piatti",
"recommendCook": "Consigliamo di cucinare",
"camera": "Fotocamera",
"gallery": "Galleria",
"analyzingPhoto": "Analisi foto in corso...",
"inQueue": "Sei in coda",
"queuePosition": "Posizione {position}",
"@queuePosition": {
"placeholders": {
"position": {
"type": "int"
}
}
},
"processing": "Elaborazione...",
"upgradePrompt": "Salta la coda? Aggiorna →",
"recognitionFailed": "Riconoscimento fallito. Riprova.",
"dishRecognition": "Riconoscimento piatti",
"all": "Tutti",
"dishRecognized": "Piatto riconosciuto",
"recognizing": "Riconoscimento in corso…",
"recognitionError": "Errore di riconoscimento",
"dishResultTitle": "Piatto riconosciuto",
"selectDish": "Seleziona un piatto",
"dishNotRecognized": "Piatto non riconosciuto",
"tryAgain": "Riprova",
"nutritionApproximate": "I valori nutrizionali sono approssimativi — stimati dalla foto.",
"portion": "Porzione",
"mealType": "Tipo di pasto",
"dateLabel": "Data",
"addToJournal": "Aggiungi al diario",
"addFailed": "Aggiunta fallita. Riprova.",
"historyTitle": "Cronologia riconoscimenti",
"historyLoadError": "Impossibile caricare la cronologia",
"retry": "Riprova",
"noHistory": "Nessun riconoscimento ancora",
"profileTitle": "Profilo",
"edit": "Modifica",
"bodyParams": "PARAMETRI CORPOREI",
"goalActivity": "OBIETTIVO & ATTIVITÀ",
"nutrition": "NUTRIZIONE",
"settings": "IMPOSTAZIONI",
"height": "Altezza",
"weight": "Peso",
"age": "Età",
"gender": "Sesso",
"genderMale": "Maschio",
"genderFemale": "Femmina",
"goalLoss": "Perdita di peso",
"goalMaintain": "Mantenimento",
"goalGain": "Aumento muscolare",
"activityLow": "Bassa",
"activityMedium": "Media",
"activityHigh": "Alta",
"calorieGoal": "Obiettivo calorico",
"mealTypes": "Tipi di pasto",
"formulaNote": "Calcolato con la formula di Mifflin-St Jeor",
"language": "Lingua",
"notSet": "Non impostato",
"calorieHint": "Inserisci i parametri corporei per calcolare l'obiettivo calorico",
"logout": "Disconnetti",
"editProfile": "Modifica profilo",
"cancel": "Annulla",
"save": "Salva",
"nameLabel": "Nome",
"heightCm": "Altezza (cm)",
"weightKg": "Peso (kg)",
"birthDate": "Data di nascita",
"nameRequired": "Inserisci il nome",
"profileUpdated": "Profilo aggiornato",
"profileSaveFailed": "Salvataggio fallito",
"mealTypeBreakfast": "Colazione",
"mealTypeSecondBreakfast": "Seconda colazione",
"mealTypeLunch": "Pranzo",
"mealTypeAfternoonSnack": "Merenda",
"mealTypeDinner": "Cena",
"mealTypeSnack": "Spuntino",
"navHome": "Home",
"navProducts": "Prodotti",
"navRecipes": "Ricette",
"addFromReceiptOrPhoto": "Aggiungi da scontrino o foto",
"scanScreenTitle": "Scansiona & Riconosci",
"barcodeScanSubtitle": "Trova un prodotto tramite il codice a barre",
"chooseMethod": "Scegli il metodo",
"photoReceipt": "Fotografa scontrino",
"photoReceiptSubtitle": "Riconosciamo tutti i prodotti dallo scontrino",
"photoProducts": "Fotografa i prodotti",
"photoProductsSubtitle": "Frigo, tavolo, scaffale — fino a 3 foto",
"addPackagedFood": "Aggiungi alimento confezionato",
"scanBarcode": "Scansiona codice a barre",
"portionWeightG": "Peso della porzione (g)",
"productNotFound": "Prodotto non trovato",
"enterManually": "Inserisci manualmente",
"perHundredG": "per 100 g",
"searchFoodHint": "Cerca prodotti e piatti...",
"recentlyUsedLabel": "Usati di recente",
"productsSection": "Prodotti",
"dishesSection": "Piatti",
"noResultsForQuery": "Nessun risultato per \"{query}\"",
"@noResultsForQuery": {
"placeholders": {
"query": {
"type": "String"
}
}
},
"servingsLabel": "Porzioni",
"addToDiary": "Aggiungi al diario",
"scanDishPhoto": "Scansiona foto",
"planningForDate": "",
"@planningForDate": {
"placeholders": {
"date": {
"type": "String"
}
}
},
"markAsEaten": "Segna come mangiato",
"plannedMealLabel": "Pianificato",
"generateWeekLabel": "Pianifica la settimana",
"generateWeekSubtitle": "L'AI creerà un menu con colazione, pranzo e cena per tutta la settimana",
"generatingMenu": "Generazione menu...",
"dayPlannedLabel": "Giorno pianificato",
"planMenuButton": "Pianifica i pasti",
"planMenuTitle": "Cosa pianificare?",
"planOptionSingleMeal": "Un pasto",
"planOptionSingleMealDesc": "Scegli giorno e tipo di pasto",
"planOptionDay": "Un giorno",
"planOptionDayDesc": "Tutti i pasti di un giorno",
"planOptionDays": "Più giorni",
"planOptionDaysDesc": "Personalizza il periodo",
"planOptionWeek": "Una settimana",
"planOptionWeekDesc": "7 giorni in una volta",
"planSelectDate": "Seleziona data",
"planSelectMealType": "Tipo di pasto",
"planSelectRange": "Seleziona periodo",
"planGenerateButton": "Pianifica",
"planGenerating": "Generazione piano…",
"planSuccess": "Menu pianificato!",
"planProductsTitle": "Prodotti per il menu",
"planProductsSubtitle": "L'AI terrà conto dei prodotti selezionati nella generazione delle ricette",
"planProductsEmpty": "Nessun prodotto aggiunto",
"planProductsEmptyMessage": "Aggiungi prodotti che hai in casa — l'AI suggerirà ricette con quello che hai già",
"planProductsAddProducts": "Aggiungi prodotti",
"planProductsContinue": "Continua",
"planProductsSkip": "Salta la selezione dei prodotti",
"planProductsSkipNoProducts": "Pianifica senza prodotti",
"planProductsSelectAll": "Seleziona tutto",
"planProductsDeselectAll": "Deseleziona tutto",
"recentScans": "Scansioni recenti",
"seeAllScans": "Vedi tutto",
"productJobHistoryTitle": "Cronologia scansioni",
"jobTypeReceipt": "Scontrino",
"jobTypeProducts": "Prodotti",
"scanSubmitting": "Invio...",
"processingProducts": "Elaborazione...",
"clearAllProducts": "Cancella tutto",
"clearAllConfirmTitle": "Cancellare tutti i prodotti?",
"clearAllConfirmMessage": "Tutti i prodotti verranno eliminati definitivamente.",
"addManually": "Manualmente",
"scan": "Scansiona",
"addProduct": "Aggiungi",
"searchProducts": "Cerca prodotti",
"searchProductsHint": "Digita il nome del prodotto o aggiungi manualmente",
"noSearchResults": "Nessun risultato per \"{query}\"",
"@noSearchResults": {
"placeholders": {
"query": {
"type": "String"
}
}
},
"quantity": "Quantità",
"storageDays": "Giorni di conservazione",
"addToShelf": "Aggiungi alla dispensa",
"errorGeneric": "Qualcosa è andato storto",
"nutritionOptional": "Valori nutrizionali per 100g (opzionale)",
"calories": "Calorie",
"protein": "Proteine",
"fat": "Grassi",
"carbs": "Carboidrati",
"fiber": "Fibre",
"productAddedToShelf": "Aggiunto alla dispensa",
"recognitionFoundProducts": "Trovati {count} prodotti",
"@recognitionFoundProducts": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"recognitionAddAll": "Aggiungi tutto",
"recognitionAddToStock": "Aggiungi alla dispensa",
"recognitionAdded": "Aggiunti {count} prodotti",
"@recognitionAdded": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"recognitionProductsFailed": "Impossibile aggiungere i prodotti",
"recognitionEmpty": "Nessun prodotto trovato",
"recognitionConfidence": "{percent}% di certezza",
"@recognitionConfidence": {
"placeholders": {
"percent": {
"type": "int"
}
}
},
"recognitionReplaceProduct": "Sostituisci prodotto",
"scanJobCloseHint": "Puoi chiudere l'app — questa scansione apparirà in Scansioni recenti nella schermata Prodotti"
}