diff --git a/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb index 683f19c6..03243ab2 100644 --- a/lib/l10n/app_ar.arb +++ b/lib/l10n/app_ar.arb @@ -397,7 +397,7 @@ "description": "Text for registration button" }, "fiber": "الألياف", - "@fibres": {}, + "@fiber": {}, "aboutDescription": "شكرًا لاستخدامك وقر! وقر مشروع تعاوني مفتوح المصدر، تم إنشاؤه بواسطة عشّاق اللياقة البدنية من جميع أنحاء العالم.", "@aboutDescription": { "description": "Text in the about dialog" diff --git a/lib/l10n/app_ca.arb b/lib/l10n/app_ca.arb index 1fc1ec96..52f3ab30 100644 --- a/lib/l10n/app_ca.arb +++ b/lib/l10n/app_ca.arb @@ -473,7 +473,7 @@ "description": "Message shown when the user has no logged weight entries" }, "fiber": "Fibra", - "@fibres": {}, + "@fiber": {}, "sodium": "Sodi", "@sodium": {}, "delete": "Esborra", diff --git a/lib/l10n/app_cs.arb b/lib/l10n/app_cs.arb index bc2f880e..18028d6c 100644 --- a/lib/l10n/app_cs.arb +++ b/lib/l10n/app_cs.arb @@ -113,7 +113,7 @@ "@save": {}, "addIngredient": "Přidat přísadu", "@addIngredient": {}, - "logIngredient": "Uložit do výživového deníku", + "logIngredient": "Zaznamenat ingredienci do nutričního diáře", "@logIngredient": {}, "searchIngredient": "Hledat přísadu", "@searchIngredient": { @@ -376,7 +376,7 @@ "@supersetWith": { "description": "Text used between exercise cards when adding a new set. Translate as something like 'in a superset with'" }, - "logMeal": "Zaznamenat toto jídlo", + "logMeal": "Zaznamenat do nutričního diáře", "@logMeal": {}, "muscles": "Svaly", "@muscles": { @@ -901,5 +901,9 @@ "goalMacro": "Makro cíle", "@goalMacro": { "description": "The goal for macronutrients" - } + }, + "ingredientLogged": "Ingredience zaznamenána do diáře", + "@ingredientLogged": {}, + "selectMealToLog": "Vyberte jídlo k záznamu do diáře", + "@selectMealToLog": {} } diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 72a84e47..f4b0f721 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -61,7 +61,7 @@ "sodium": "Natrium", "@sodium": {}, "fiber": "Ballaststoff", - "@fibres": {}, + "@fiber": {}, "saturatedFat": "Gesättigte Fettsäuren", "@saturatedFat": {}, "fat": "Fett", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 6e3e9cb2..46844990 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -122,6 +122,7 @@ "@searchExercise": { "description": "Label on set form. Selected exercises are added to the set" }, + "noIngredientsDefined": "No ingredients defined yet", "noMatchingExerciseFound": "No matching exercises found", "@noMatchingExerciseFound": { "description": "Message returned if no exercises match the searched string" diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index caddc23f..2aa12455 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -131,7 +131,7 @@ "sodium": "Sodio", "@sodium": {}, "fiber": "Fibra", - "@fibres": {}, + "@fiber": {}, "saturatedFat": "Grasas saturadas", "@saturatedFat": {}, "fat": "Grasas", diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index f020564f..b5a6f1e4 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -70,7 +70,7 @@ "sodium": "Sodium", "@sodium": {}, "fiber": "fiber", - "@fibres": {}, + "@fiber": {}, "saturatedFat": "Graisses saturées", "@saturatedFat": {}, "fat": "Graisses", diff --git a/lib/l10n/app_he.arb b/lib/l10n/app_he.arb index fd236ff4..73485f55 100644 --- a/lib/l10n/app_he.arb +++ b/lib/l10n/app_he.arb @@ -276,7 +276,7 @@ "saturatedFat": "שומן רווי", "@saturatedFat": {}, "fiber": "סיבים", - "@fibres": {}, + "@fiber": {}, "sodium": "נתרן", "@sodium": {}, "amount": "כמות", diff --git a/lib/l10n/app_hi.arb b/lib/l10n/app_hi.arb index 373fbf5c..82c656a9 100644 --- a/lib/l10n/app_hi.arb +++ b/lib/l10n/app_hi.arb @@ -24,154 +24,305 @@ "description": "Error message when the user enters an invalid URL, e.g. in the login form" }, "usernameValidChars": "एक उपयोगकर्ता नाम में केवल अक्षर, अंक और वर्ण @, +, ., - और _ हो सकते हैं।", + "@usernameValidChars": {}, "passwordsDontMatch": "पासवर्ड मेल नहीं खाता", + "@passwordsDontMatch": {}, "passwordTooShort": "पासवर्ड कम से कम 6 अक्षर होना चाहिए", + "@passwordTooShort": {}, "password": "पासवर्ड", + "@password": {}, "confirmPassword": "पासवर्ड की पुष्टि करें", + "@confirmPassword": {}, "invalidEmail": "कृपया एक वैलिड ईमेल दीजिये", + "@invalidEmail": {}, "email": "ईमेल", + "@email": {}, "username": "उपयोगकर्ता नाम", + "@username": {}, "customServerUrl": "कस्टम सर्वर URL wger के लिए", + "@customServerUrl": {}, "customServerHint": "अपने स्वयं के सर्वर का पता दर्ज करें, अन्यथा डिफ़ॉल्ट का उपयोग किया जाएगा", + "@customServerHint": {}, "reset": "रीसेट", + "@reset": {}, "registerInstead": "इसके बजाय रजिस्टर करें", + "@registerInstead": {}, "loginInstead": "इसके बजाय लॉग इन करें", + "@loginInstead": {}, "labelWorkoutPlans": "कसरत की योजनाएं", + "@labelWorkoutPlans": {}, "labelBottomNavWorkout": "कसरत", + "@labelBottomNavWorkout": {}, "labelBottomNavNutrition": "पोषण", + "@labelBottomNavNutrition": {}, "labelWorkoutLogs": "प्रशिक्षण लॉग", + "@labelWorkoutLogs": {}, "labelWorkoutPlan": "कसरत योजना", + "@labelWorkoutPlan": {}, "labelDashboard": "डैशबोर्ड", + "@labelDashboard": {}, "successfullyDeleted": "हटाया गया", + "@successfullyDeleted": {}, "successfullySaved": "सहेजा गया", + "@successfullySaved": {}, "exercise": "व्यायाम", + "@exercise": {}, "searchExercise": "जोड़ने के लिए व्यायाम खोजें", + "@searchExercise": {}, "supersetWith": "सुपरसेट के साथ", + "@supersetWith": {}, "equipment": "उपकरण", + "@equipment": {}, "muscles": "मांसपेशियों", + "@muscles": {}, "musclesSecondary": "माध्यमिक मांसपेशियां", + "@musclesSecondary": {}, "category": "श्रेणी", + "@category": {}, "newWorkout": "नई कसरत योजना", + "@newWorkout": {}, "noWorkoutPlans": "आपकी कोई कसरत योजना नहीं है", + "@noWorkoutPlans": {}, "repetitions": "दोहराव", + "@repetitions": {}, "reps": "रेप्स", + "@reps": {}, "rir": "RiR", + "@rir": {}, "rirNotUsed": "RiR उपयोग नहीं किया गया", + "@rirNotUsed": {}, "weightUnit": "वजन इकाई", + "@weightUnit": {}, "repetitionUnit": "दोहराव इकाई", + "@repetitionUnit": {}, "set": "सेट", + "@set": {}, "dayDescriptionHelp": "इस दिन क्या किया जाता है (जैसे 'पुल डे') या शरीर के किन अंगों को प्रशिक्षित किया जाता है (जैसे 'छाती और कंधे') का विवरण", + "@dayDescriptionHelp": {}, "setNr": "सेट {nr}", + "@setNr": {}, "sameRepetitions": "यदि आप सभी सेटों के लिए समान दोहराव और वजन करते हैं तो आप केवल एक पंक्ति भर सकते हैं। उदाहरण के लिए, 4 सेटों के लिए, दोहराव के लिए केवल 10 दर्ज करें, यह स्वचालित रूप से \"4 x 10\" हो जाता है।", + "@sameRepetitions": {}, "comment": "टिप्पणी", + "@comment": {}, "impression": "प्रभाव जमाना", + "@impression": {}, "notes": "टिप्पणियाँ", + "@notes": {}, "workoutSession": "कसरत सत्र", + "@workoutSession": {}, "newDay": "नया दिन", + "@newDay": {}, "newSet": "नया सेट", + "@newSet": {}, "selectExercises": "यदि आप एक सुपरसेट करना चाहते हैं तो आप कई अभ्यास खोज सकते हैं, उन्हें एक साथ समूहीकृत किया जाएगा", + "@selectExercises": {}, "gymMode": "जिम मोड", + "@gymMode": {}, "plateCalculator": "प्लेट्स", + "@plateCalculator": {}, "plateCalculatorNotDivisible": "उपलब्ध प्लेटों के साथ वजन तक पहुंचना संभव नहीं है", + "@plateCalculatorNotDivisible": {}, "pause": "रोकें", + "@pause": {}, "jumpTo": "यहां जाएं", + "@jumpTo": {}, "todaysWorkout": "आज आपका वर्कआउट", + "@todaysWorkout": {}, "logHelpEntries": "यदि एक ही दिन में एक से अधिक प्रविष्टियाँ समान संख्या में दोहराव के साथ होती हैं, लेकिन अलग-अलग भार होते हैं, तो केवल उच्च भार वाली प्रविष्टि को आरेख में दिखाया जाता है।", + "@logHelpEntries": {}, "logHelpEntriesUnits": "ध्यान दें कि केवल वज़न इकाई (किलो या एलबी) और दोहराव वाली प्रविष्टियां चार्ट की जाती हैं, अन्य संयोजन जैसे समय या विफलता को यहां अनदेखा किया जाता है।", + "@logHelpEntriesUnits": {}, "description": "विवरण", + "@description": {}, "name": "नाम", + "@name": {}, "save": "सेव", + "@save": {}, "addSet": "सेट जोड़ें", + "@addSet": {}, "addMeal": "खाना जोड़ें", + "@addMeal": {}, "mealLogged": "भोजन डायरी में दर्ज", + "@mealLogged": {}, "logMeal": "इस भोजन को दर्ज करें", + "@logMeal": {}, "addIngredient": "सामग्री जोड़ें", + "@addIngredient": {}, "logIngredient": "पोषण डायरी में सहेजें", + "@logIngredient": {}, "searchIngredient": "सामग्री खोजें", + "@searchIngredient": {}, "nutritionalPlan": "पोषण योजना", + "@nutritionalPlan": {}, "nutritionalDiary": "पोषण डायरी", + "@nutritionalDiary": {}, "nutritionalPlans": "पोषण योजनाएं", + "@nutritionalPlans": {}, "noNutritionalPlans": "आपके पास कोई पोषण योजना नहीं है", + "@noNutritionalPlans": {}, "anErrorOccurred": "कुछ गड़बड़ी हुई!", + "@anErrorOccurred": {}, "weight": "वजन", + "@weight": {}, "measurement": "माप", + "@measurement": {}, "measurements": "मापन", + "@measurements": {}, "measurementCategoriesHelpText": "मापन श्रेणी, जैसे 'बाइसेप्स' या 'बॉडी फैट'", + "@measurementCategoriesHelpText": {}, "measurementEntriesHelpText": "'सेमी' या '%' जैसी श्रेणी को मापने के लिए इस्तेमाल की जाने वाली इकाई", + "@measurementEntriesHelpText": {}, "date": "दिनांक", + "@date": {}, "value": "मान", + "@value": {}, "start": "शुरु", + "@start": {}, "time": "समय", + "@time": {}, "timeStart": "शुरु समय", + "@timeStart": {}, "timeEnd": "अंत समय", + "@timeEnd": {}, "timeStartAhead": "प्रारंभ समय समाप्ति समय से आगे का नहीं हो सकता", + "@timeStartAhead": {}, "ingredient": "सामग्री", + "@ingredient": {}, "energy": "ऊर्जा", + "@energy": {}, "energyShort": "E", + "@energyShort": {}, "kcal": "किलो कैलोरी", + "@kcal": {}, "macronutrients": "मैक्रोन्ट्रीय प्रयोग", + "@macronutrients": {}, "planned": "की योजना बनाई", + "@planned": {}, "logged": "की योजना की दर्ज हुई", + "@logged": {}, "weekAverage": "7 दिन का औसत", + "@weekAverage": {}, "difference": "अंतर", + "@difference": {}, "percentEnergy": "ऊर्जा का प्रतिशत", + "@percentEnergy": {}, "gPerBodyKg": "ग्राम प्रति शरीर किलो", + "@gPerBodyKg": {}, "total": "कुल", + "@total": {}, "kJ": "kJ", + "@kJ": {}, "g": "ग्राम", + "@g": {}, "protein": "प्रोटीन", + "@protein": {}, "proteinShort": "P", + "@proteinShort": {}, "carbohydrates": "कार्बोहाइड्रेट्स", + "@carbohydrates": {}, "carbohydratesShort": "C", + "@carbohydratesShort": {}, "sugars": "शुगर्स", + "@sugars": {}, "fat": "चर्बी", + "@fat": {}, "fatShort": "F", + "@fatShort": {}, "saturatedFat": "संतृप्त चर्बी", + "@saturatedFat": {}, "fiber": "रेशा", + "@fiber": {}, "sodium": "सोड़ियम", + "@sodium": {}, "amount": "मात्रा", + "@amount": {}, "unit": "इकाई", + "@unit": {}, "newEntry": "नया प्रविष्टि", + "@newEntry": {}, "noWeightEntries": "आपके पास कोई वजन प्रविष्टि नहीं है", + "@noWeightEntries": {}, "edit": "संपादित करें", + "@edit": {}, "loadingText": "लोड हो रहा है...", + "@loadingText": {}, "delete": "हटाएं", + "@delete": {}, "confirmDelete": "क्या आप वाकई '{toDelete}' को हटाना चाहते हैं?", + "@confirmDelete": {}, "newNutritionalPlan": "नई पोषण योजना", + "@newNutritionalPlan": {}, "toggleDetails": "विवरण टॉगल करें", + "@toggleDetails": {}, "goToDetailPage": "विवरण पेज पर जाएं", + "@goToDetailPage": {}, "aboutDescription": "Wger का उपयोग करने के लिए धन्यवाद! Wger एक सहयोगी ओपन सोर्स प्रोजेक्ट है, जिसे दुनिया भर के फिटनेस उत्साही लोगों द्वारा बनाया गया है।", + "@aboutDescription": {}, "aboutSourceTitle": "सोर्स कोड", + "@aboutSourceTitle": {}, "aboutSourceText": "इस एप्लिकेशन का स्रोत कोड और इसके सर्वर को Github पर प्राप्त करें", + "@aboutSourceText": {}, "aboutBugsTitle": "कोई समस्या या विचार है?", + "@aboutBugsTitle": {}, "aboutBugsText": "अगर किसी चीज़ ने अपेक्षा के अनुरूप व्यवहार नहीं किया या कोई ऐसी विशेषता है जो आपको याद आ रही है तो संपर्क करें।", + "@aboutBugsText": {}, "aboutContactUsTitle": "संपर्क करें", + "@aboutContactUsTitle": {}, "aboutContactUsText": "यदि आप हमारे साथ चैट करना चाहते हैं, तो Discord सर्वर पर आएं और संपर्क करें", + "@aboutContactUsText": {}, "aboutTranslationTitle": "अनुवाद", + "@aboutTranslationTitle": {}, "aboutTranslationText": "इस एप्लिकेशन का वेबलेट पर अनुवाद किया गया है। अगर आप भी मदद करना चाहते हैं, तो लिंक पर क्लिक करें और अनुवाद करना शुरू करें।", + "@aboutTranslationText": {}, "calendar": "कैलेंडर", + "@calendar": {}, "enterRepetitionsOrWeight": "कृपया इनमें से कम से कम एक सेट के लिए दोहराव या वजन भरें", + "@enterRepetitionsOrWeight": {}, "enterValue": "कृपया मान दर्ज करें", + "@enterValue": {}, "selectExercise": "कृपया एक पाठ्यक्रम का चयन करें", + "@selectExercise": {}, "enterCharacters": "कृपया {min} और {max} वर्णों के बीच दर्ज करें", + "@enterCharacters": {}, "nrOfSets": "प्रति व्यायाम सेट: {nrOfSets}", + "@nrOfSets": {}, "setUnitsAndRir": "इकाइयाँ सेट करें और RiR", + "@setUnitsAndRir": {}, "enterValidNumber": "कृपया वैध संख्या दर्ज करें", + "@enterValidNumber": {}, "selectIngredient": "कृपया एक सामग्री का चयन करें", + "@selectIngredient": {}, "recentlyUsedIngredients": "हाल ही में उपयोग की गई सामग्री", + "@recentlyUsedIngredients": {}, "selectImage": "कृपया एक चित्र का चयन करें", + "@selectImage": {}, "optionsLabel": "विकल्प", + "@optionsLabel": {}, "takePicture": "चित्र लें", + "@takePicture": {}, "chooseFromLibrary": "लाइब्रेरी से चुनें", + "@chooseFromLibrary": {}, "gallery": "ग्यालरी", + "@gallery": {}, "addImage": "चित्र जोड़ें", + "@addImage": {}, "dataCopied": "डेटा की प्रतिलिपि बना दिया गया है", + "@dataCopied": {}, "appUpdateTitle": "एप्लिकेशन अपडेट की जरूरत है", + "@appUpdateTitle": {}, "appUpdateContent": "ऐप का यह संस्करण सर्वर के अनुकूल नहीं है, कृपया अपना एप्लिकेशन अपडेट करें।", + "@appUpdateContent": {}, "productFound": "उत्पाद मिला", + "@productFound": {}, "productFoundDescription": "बारकोड इस उत्पाद से मेल खाता है: {productName}। क्या आप जारी रखना चाहते हैं?", + "@productFoundDescription": {}, "productNotFound": "उत्पाद नहीं मिला", + "@productNotFound": {}, "productNotFoundDescription": "स्कैन किए गए बारकोड {barcode} वाला उत्पाद wger डेटाबेस में नहीं मिला", + "@productNotFoundDescription": {}, "scanBarcode": "बारकोड स्कैन करें", - "close": "बंद करें" + "@scanBarcode": {}, + "close": "बंद करें", + "@close": {} } diff --git a/lib/l10n/app_hr.arb b/lib/l10n/app_hr.arb index 301f8128..a6fa7620 100644 --- a/lib/l10n/app_hr.arb +++ b/lib/l10n/app_hr.arb @@ -317,7 +317,7 @@ }, "addIngredient": "Dodaj sastojak", "@addIngredient": {}, - "logMeal": "Zapiši ovaj obrok", + "logMeal": "Zapiši obrok u dnevnik prehrane", "@logMeal": {}, "value": "Vrijednost", "@value": { @@ -515,7 +515,7 @@ "@recentlyUsedIngredients": { "description": "A message when a user adds a new ingredient to a meal." }, - "logIngredient": "Spremi u dnevnik prehrane", + "logIngredient": "Zapiši sastojak u dnevnik prehrane", "@logIngredient": {}, "searchIngredient": "Traži sastojak", "@searchIngredient": { @@ -901,5 +901,9 @@ "goalMacro": "Ciljevi za makronutrijente", "@goalMacro": { "description": "The goal for macronutrients" - } + }, + "selectMealToLog": "Odaberi obrok za zapis u dnevnik", + "@selectMealToLog": {}, + "ingredientLogged": "Sastojak je upisan u dnevnik", + "@ingredientLogged": {} } diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index 1519544f..caa66dba 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -371,7 +371,7 @@ "saturatedFat": "Saturated fat", "@saturatedFat": {}, "fiber": "Fibre", - "@fibres": {}, + "@fiber": {}, "sodium": "Sodium", "@sodium": {}, "amount": "Amount", diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index e0cfca80..ea8f4f00 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -64,7 +64,7 @@ "sodium": "Sodio", "@sodium": {}, "fiber": "Fibre", - "@fibres": {}, + "@fiber": {}, "saturatedFat": "Grassi saturi", "@saturatedFat": {}, "fat": "Grassi", diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index 18f1432b..5f7d730b 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -370,7 +370,7 @@ "saturatedFat": "Saturated fat", "@saturatedFat": {}, "fiber": "Fibre", - "@fibres": {}, + "@fiber": {}, "sodium": "Sodium", "@sodium": {}, "amount": "Amount", diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb index f1568233..621e5ba9 100644 --- a/lib/l10n/app_pl.arb +++ b/lib/l10n/app_pl.arb @@ -415,7 +415,7 @@ "saturatedFat": "Tłuszcz nasycony", "@saturatedFat": {}, "fiber": "Błonnik", - "@fibres": {}, + "@fiber": {}, "sodium": "Sód", "@sodium": {}, "amount": "Ilość", diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index a041343b..01b38822 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -180,7 +180,7 @@ "description": "The first letter or short name of the word 'Carbohydrates', used in overviews" }, "fiber": "Fibra", - "@fibres": {}, + "@fiber": {}, "sodium": "Sódio", "@sodium": {}, "amount": "Quantidade", diff --git a/lib/l10n/app_pt_BR.arb b/lib/l10n/app_pt_BR.arb index 85baca65..67e55732 100644 --- a/lib/l10n/app_pt_BR.arb +++ b/lib/l10n/app_pt_BR.arb @@ -272,7 +272,7 @@ "difference": "Diferença", "@difference": {}, "fiber": "Fibra", - "@fibres": {}, + "@fiber": {}, "aboutDescription": "Obrigado por usar o Wger! Wger é um projeto colaborativo de código aberto, feito por entusiastas do fitness de todo o mundo.", "@aboutDescription": { "description": "Text in the about dialog" diff --git a/lib/l10n/app_tr.arb b/lib/l10n/app_tr.arb index d0868215..6357c039 100644 --- a/lib/l10n/app_tr.arb +++ b/lib/l10n/app_tr.arb @@ -205,7 +205,7 @@ "@plateCalculator": { "description": "Label used for the plate calculator in the gym mode" }, - "logIngredient": "Beslenme günlüğüne kaydet", + "logIngredient": "Malzemeyi beslenme günlüğüne kaydet", "@logIngredient": {}, "comment": "Yorum", "@comment": { @@ -257,7 +257,7 @@ "@addMeal": {}, "mealLogged": "Yemek günlüğe kaydedildi", "@mealLogged": {}, - "logMeal": "Bu yemeği kaydet", + "logMeal": "Yemeği beslenme günlüğüne kaydet", "@logMeal": {}, "addIngredient": "Malzeme ekle", "@addIngredient": {}, @@ -841,5 +841,9 @@ "deficit": "eksiklik", "@deficit": { "description": "Caloric deficit (either planned or unplanned)" - } + }, + "ingredientLogged": "Malzeme günlüğe kaydedildi", + "@ingredientLogged": {}, + "selectMealToLog": "Günlüğe kaydetmek için bir yemek seçin", + "@selectMealToLog": {} } diff --git a/lib/l10n/app_uk.arb b/lib/l10n/app_uk.arb index 58f2ef86..def766b3 100644 --- a/lib/l10n/app_uk.arb +++ b/lib/l10n/app_uk.arb @@ -402,7 +402,7 @@ "saturatedFat": "Насичені жири", "@saturatedFat": {}, "fiber": "Волокна", - "@fibres": {}, + "@fiber": {}, "sodium": "Натрій", "@sodium": {}, "amount": "Сума", diff --git a/lib/screens/log_meal_screen.dart b/lib/screens/log_meal_screen.dart index cfae7e50..48134f62 100644 --- a/lib/screens/log_meal_screen.dart +++ b/lib/screens/log_meal_screen.dart @@ -22,7 +22,7 @@ import 'package:provider/provider.dart'; import 'package:wger/models/nutrition/meal.dart'; import 'package:wger/providers/nutrition.dart'; import 'package:wger/widgets/nutrition/meal.dart'; -import 'package:wger/widgets/nutrition/widgets.dart'; +import 'package:wger/widgets/nutrition/nutrition_tiles.dart'; class LogMealArguments { final Meal meal; @@ -51,7 +51,7 @@ class _LogMealScreenState extends State { return Scaffold( appBar: AppBar( - title: Text('Log meal to diary'), + title: Text(AppLocalizations.of(context).logMeal), ), body: Consumer( builder: (context, nutritionProvider, child) => SingleChildScrollView( @@ -64,13 +64,13 @@ class _LogMealScreenState extends State { children: [ Text(meal.name, style: Theme.of(context).textTheme.headlineSmall), if (meal.mealItems.isEmpty) - const ListTile(title: Text('No ingredients defined yet')) + ListTile(title: Text(AppLocalizations.of(context).noIngredientsDefined)) else Column( children: [ - const NutritionDiaryheader(), - ...meal.mealItems - .map((item) => MealItemWidget(item, viewMode.withAllDetails, false)), + const DiaryheaderTile(), + ...meal.mealItems.map( + (item) => MealItemEditableFullTile(item, viewMode.withAllDetails, false)), const SizedBox(height: 32), Text( 'Portion: ${portionPct.round()} %', diff --git a/lib/theme/theme.dart b/lib/theme/theme.dart index 66eae3ee..9ca29196 100644 --- a/lib/theme/theme.dart +++ b/lib/theme/theme.dart @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import 'dart:ui'; import 'package:flex_color_scheme/flex_color_scheme.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/core/core.dart b/lib/widgets/core/core.dart index 6430f5b6..cf4ee9ef 100644 --- a/lib/widgets/core/core.dart +++ b/lib/widgets/core/core.dart @@ -21,10 +21,12 @@ import 'package:flutter/material.dart'; class MutedText extends StatelessWidget { final String _text; final TextAlign textAlign; + final TextOverflow? overflow; const MutedText( this._text, { this.textAlign = TextAlign.left, + this.overflow, }); @override @@ -33,6 +35,7 @@ class MutedText extends StatelessWidget { _text, style: TextStyle(color: Theme.of(context).colorScheme.outline), textAlign: textAlign, + overflow: overflow, ); } } diff --git a/lib/widgets/nutrition/forms.dart b/lib/widgets/nutrition/forms.dart index 4bafbe2d..806c9d4f 100644 --- a/lib/widgets/nutrition/forms.dart +++ b/lib/widgets/nutrition/forms.dart @@ -31,6 +31,7 @@ import 'package:wger/models/nutrition/nutritional_plan.dart'; import 'package:wger/providers/nutrition.dart'; import 'package:wger/screens/nutritional_plan_screen.dart'; import 'package:wger/widgets/nutrition/helpers.dart'; +import 'package:wger/widgets/nutrition/nutrition_tiles.dart'; import 'package:wger/widgets/nutrition/widgets.dart'; class MealForm extends StatelessWidget { @@ -341,7 +342,7 @@ class IngredientFormState extends State { builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) { _mealItem.ingredient = snapshot.data!; - return MealItemTile( + return MealItemValuesTile( ingredient: _mealItem.ingredient, nutritionalValues: _mealItem.nutritionalValues, ); diff --git a/lib/widgets/nutrition/helpers.dart b/lib/widgets/nutrition/helpers.dart index 766386b1..39ac478c 100644 --- a/lib/widgets/nutrition/helpers.dart +++ b/lib/widgets/nutrition/helpers.dart @@ -19,28 +19,59 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:wger/models/nutrition/meal.dart'; import 'package:wger/models/nutrition/nutritional_values.dart'; import 'package:wger/widgets/core/core.dart'; -List getMutedNutritionalValues(NutritionalValues values, BuildContext context) => [ - MutedText( - AppLocalizations.of(context).kcalValue(values.energy.toStringAsFixed(0)), - textAlign: TextAlign.right, - ), - MutedText( - AppLocalizations.of(context).gValue(values.protein.toStringAsFixed(0)), - textAlign: TextAlign.right, - ), - MutedText( - AppLocalizations.of(context).gValue(values.carbohydrates.toStringAsFixed(0)), - textAlign: TextAlign.right, - ), - MutedText( - AppLocalizations.of(context).gValue(values.fat.toStringAsFixed(0)), - textAlign: TextAlign.right, - ), +List getNutritionColumnNames(BuildContext context) => [ + AppLocalizations.of(context).energy, + AppLocalizations.of(context).protein, + AppLocalizations.of(context).carbohydrates, + AppLocalizations.of(context).fat, ]; +List getNutritionalValues(NutritionalValues values, BuildContext context) => [ + AppLocalizations.of(context).kcalValue(values.energy.toStringAsFixed(0)), + AppLocalizations.of(context).gValue(values.protein.toStringAsFixed(0)), + AppLocalizations.of(context).gValue(values.carbohydrates.toStringAsFixed(0)), + AppLocalizations.of(context).gValue(values.fat.toStringAsFixed(0)), + ]; + +List getNutritionColumnFlexes(BuildContext context) { + return getNutritionColumnNames(context).map((e) { + final l = e.characters.length; + // if the word is really small (e.g. "fat"), + // we still want to have a minimum value to keep some spacing, + // especially because column values might become like "123 g" + return (l <= 3) ? 4 : l; + }).toList(); +} + +List muted(List children) => children + .map((e) => MutedText( + e, + textAlign: TextAlign.right, + overflow: TextOverflow.ellipsis, + )) + .toList(); + +// return a row of elements in the standard macros spacing +Row getNutritionRow(BuildContext context, List children) { + return Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: children.indexed + .map( + (e) => Flexible( + fit: FlexFit.tight, + flex: getNutritionColumnFlexes(context)[e.$1], + child: e.$2, + ), + ) + .toList(), + ); +} + String getShortNutritionValues(NutritionalValues values, BuildContext context) { final loc = AppLocalizations.of(context); final e = '${loc.energyShort} ${loc.kcalValue(values.energy.toStringAsFixed(0))}'; @@ -49,3 +80,18 @@ String getShortNutritionValues(NutritionalValues values, BuildContext context) { final f = '${loc.fatShort} ${loc.gValue(values.fat.toStringAsFixed(0))}'; return '$e / $p / $c / $f'; } + +String getKcalConsumed(Meal meal, BuildContext context) { + final consumed = + meal.diaryEntriesToday.map((e) => e.nutritionalValues.energy).fold(0.0, (a, b) => a + b); + return AppLocalizations.of(context).kcalValue(consumed.toStringAsFixed(0)); +} + +String getKcalConsumedVsPlanned(Meal meal, BuildContext context) { + final planned = meal.plannedNutritionalValues.energy; + final consumed = + meal.diaryEntriesToday.map((e) => e.nutritionalValues.energy).fold(0.0, (a, b) => a + b); + final loc = AppLocalizations.of(context); + + return '${consumed.toStringAsFixed(0)} / ${planned.toStringAsFixed(0)} ${loc.kcal}'; +} diff --git a/lib/widgets/nutrition/meal.dart b/lib/widgets/nutrition/meal.dart index 1e7abb3d..98c467b2 100644 --- a/lib/widgets/nutrition/meal.dart +++ b/lib/widgets/nutrition/meal.dart @@ -21,7 +21,6 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_svg_icons/flutter_svg_icons.dart'; import 'package:provider/provider.dart'; import 'package:wger/helpers/consts.dart'; -import 'package:wger/models/nutrition/log.dart'; import 'package:wger/models/nutrition/meal.dart'; import 'package:wger/models/nutrition/meal_item.dart'; import 'package:wger/providers/nutrition.dart'; @@ -30,6 +29,8 @@ import 'package:wger/screens/log_meal_screen.dart'; import 'package:wger/widgets/nutrition/charts.dart'; import 'package:wger/widgets/nutrition/forms.dart'; import 'package:wger/widgets/nutrition/helpers.dart'; +import 'package:wger/widgets/nutrition/nutrition_tile.dart'; +import 'package:wger/widgets/nutrition/nutrition_tiles.dart'; import 'package:wger/widgets/nutrition/widgets.dart'; enum viewMode { @@ -157,15 +158,33 @@ class _MealWidgetState extends State { )), if (_viewMode == viewMode.withIngredients || _viewMode == viewMode.withAllDetails) const Divider(), - if (_viewMode == viewMode.withAllDetails) const NutritionDiaryheader(), + if (_viewMode == viewMode.withIngredients || _viewMode == viewMode.withAllDetails) + const DiaryheaderTile(), if (_viewMode == viewMode.withIngredients || _viewMode == viewMode.withAllDetails) if (widget._meal.mealItems.isEmpty && widget._meal.isRealMeal) - const ListTile(title: Text('No ingredients defined yet')) + NutritionTile( + title: Text( + AppLocalizations.of(context).noIngredientsDefined, + textAlign: TextAlign.left, + )) else - ...widget._meal.mealItems.map((item) => MealItemWidget(item, _viewMode, _editing)), + ...widget._meal.mealItems + .map((item) => MealItemEditableFullTile(item, _viewMode, _editing)), + if (_viewMode == viewMode.withIngredients || _viewMode == viewMode.withAllDetails) + const Divider(), + if (_viewMode == viewMode.withIngredients || _viewMode == viewMode.withAllDetails) + NutritionTile( + vPadding: 0, + leading: const Text('total'), + title: getNutritionRow( + context, + muted(getNutritionalValues(widget._meal.plannedNutritionalValues, context)), + ), + ), if (_viewMode == viewMode.withAllDetails) Column( children: [ + const Divider(), Center( child: Text( AppLocalizations.of(context).loggedToday, @@ -181,7 +200,7 @@ class _MealWidgetState extends State { padding: const EdgeInsets.all(8.0), child: Column( children: [ - NutritionDiaryEntry(diaryEntry: item), + DiaryEntryTile(diaryEntry: item), ], ), )), @@ -194,12 +213,13 @@ class _MealWidgetState extends State { } } -class MealItemWidget extends StatelessWidget { +/// An editable NutritionTile showing the avatar, name, nutritional values +class MealItemEditableFullTile extends StatelessWidget { final bool _editing; final viewMode _viewMode; final MealItem _item; - const MealItemWidget(this._item, this._viewMode, this._editing); + const MealItemEditableFullTile(this._item, this._viewMode, this._editing); @override Widget build(BuildContext context) { @@ -213,22 +233,24 @@ class MealItemWidget extends StatelessWidget { final String unit = AppLocalizations.of(context).g; final values = _item.nutritionalValues; - return ListTile( + return NutritionTile( leading: IngredientAvatar(ingredient: _item.ingredient), - title: Text( - '${_item.amount.toStringAsFixed(0)}$unit ${_item.ingredient.name}', - overflow: TextOverflow.ellipsis, - ), - subtitle: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + title: Row( mainAxisSize: MainAxisSize.max, children: [ - if (_viewMode == viewMode.withAllDetails) ...getMutedNutritionalValues(values, context) + Text( + '${_item.amount.toStringAsFixed(0)}$unit ${_item.ingredient.name}', + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.left, + ), ], ), + subtitle: (_viewMode != viewMode.withAllDetails && !_editing) + ? null + : getNutritionRow(context, muted(getNutritionalValues(values, context))), trailing: _editing ? IconButton( - icon: const Icon(Icons.delete), + icon: const Icon(Icons.delete, size: ICON_SIZE_SMALL), tooltip: AppLocalizations.of(context).delete, iconSize: ICON_SIZE_SMALL, onPressed: () { @@ -250,38 +272,6 @@ class MealItemWidget extends StatelessWidget { } } -class LogDiaryItemWidget extends StatelessWidget { - final Log _item; - - const LogDiaryItemWidget(this._item); - - @override - Widget build(BuildContext context) { - // TODO(x): add real support for weight units - /* - String unit = _item.weightUnitId == null - ? AppLocalizations.of(context).g - : _item.weightUnitObj!.weightUnit.name; - - */ - final String unit = AppLocalizations.of(context).g; - final values = _item.nutritionalValues; - - return ListTile( - leading: IngredientAvatar(ingredient: _item.ingredient), - title: Text( - '${_item.amount.toStringAsFixed(0)}$unit ${_item.ingredient.name}', - overflow: TextOverflow.ellipsis, - ), - subtitle: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - mainAxisSize: MainAxisSize.max, - children: [...getMutedNutritionalValues(values, context)], - ), - ); - } -} - class MealHeader extends StatelessWidget { final Meal _meal; final bool _editing; @@ -318,14 +308,25 @@ class MealHeader extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - ((_meal.time != null) ? '${_meal.time!.format(context)} ' : '') + _meal.name, - style: Theme.of(context).textTheme.titleMedium, + _meal.name, + style: Theme.of(context).textTheme.titleLarge, + ), + Row( + children: [ + if (_meal.time != null) + Text( + _meal.time!.format(context), + style: Theme.of(context).textTheme.titleSmall, + ), + if (_meal.time != null) const SizedBox(width: 12), + Text( + _meal.isRealMeal + ? getKcalConsumedVsPlanned(_meal, context) + : getKcalConsumed(_meal, context), + style: Theme.of(context).textTheme.titleSmall, + ), + ], ), - if (_meal.isRealMeal) - Text( - getShortNutritionValues(_meal.plannedNutritionalValues, context), - style: Theme.of(context).textTheme.titleSmall, - ), ], )), ]), diff --git a/lib/widgets/nutrition/nutrition_tile.dart b/lib/widgets/nutrition/nutrition_tile.dart new file mode 100644 index 00000000..4e1cc5b4 --- /dev/null +++ b/lib/widgets/nutrition/nutrition_tile.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; + +/// NutritionTile is similar to a non-interactive ListTile, +/// but uses a fixed, easy to understand layout. +class NutritionTile extends StatelessWidget { + final Widget? leading; // always constrained to 40px wide + final double vPadding; + final Widget? title; + final Widget? subtitle; + final Widget? trailing; // always constrained to 20px wide + + const NutritionTile({ + this.leading, + this.title, + this.subtitle, + this.trailing, + this.vPadding = 8, + }); + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.symmetric(horizontal: 8.0, vertical: vPadding), + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + ConstrainedBox( + constraints: const BoxConstraints(minWidth: 40, maxWidth: 40), + child: leading ?? const SizedBox(width: 40), + ), + const SizedBox(width: 8), + Expanded( + child: Column( + children: [ + if (title != null) title!, + if (subtitle != null) subtitle!, + ], + ), + ), + const SizedBox(width: 8), + ConstrainedBox( + constraints: const BoxConstraints(minWidth: 20, maxWidth: 20), + child: trailing ?? const SizedBox(width: 20), + ), + ], + ), + ); + } +} diff --git a/lib/widgets/nutrition/nutrition_tiles.dart b/lib/widgets/nutrition/nutrition_tiles.dart new file mode 100644 index 00000000..8bd1bcb1 --- /dev/null +++ b/lib/widgets/nutrition/nutrition_tiles.dart @@ -0,0 +1,85 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:intl/intl.dart'; +import 'package:provider/provider.dart'; +import 'package:wger/helpers/consts.dart'; +import 'package:wger/models/nutrition/ingredient.dart'; +import 'package:wger/models/nutrition/log.dart'; +import 'package:wger/models/nutrition/nutritional_plan.dart'; +import 'package:wger/models/nutrition/nutritional_values.dart'; +import 'package:wger/providers/nutrition.dart'; +import 'package:wger/widgets/nutrition/helpers.dart'; +import 'package:wger/widgets/nutrition/nutrition_tile.dart'; +import 'package:wger/widgets/nutrition/widgets.dart'; + +/// a NutritionTitle showing an ingredient, with its +/// avatar and nutritional values +class MealItemValuesTile extends StatelessWidget { + final Ingredient ingredient; + final NutritionalValues nutritionalValues; + + const MealItemValuesTile({ + super.key, + required this.ingredient, + required this.nutritionalValues, + }); + + @override + Widget build(BuildContext context) { + return NutritionTile( + leading: IngredientAvatar(ingredient: ingredient), + title: Text(getShortNutritionValues(nutritionalValues, context)), + ); + } +} + +/// a NutritionTitle showing the header for the diary +class DiaryheaderTile extends StatelessWidget { + final Widget? leading; + + const DiaryheaderTile({this.leading}); + + @override + Widget build(BuildContext context) { + return NutritionTile(title: getNutritionRow(context, muted(getNutritionColumnNames(context)))); + } +} + +/// a NutritionTitle showing diary entries +class DiaryEntryTile extends StatelessWidget { + const DiaryEntryTile({ + super.key, + required this.diaryEntry, + this.nutritionalPlan, + }); + + final Log diaryEntry; + final NutritionalPlan? nutritionalPlan; + + @override + Widget build(BuildContext context) { + return NutritionTile( + leading: Text( + DateFormat.Hm(Localizations.localeOf(context).languageCode).format(diaryEntry.datetime), + style: const TextStyle(fontWeight: FontWeight.bold), + ), + title: Text( + '${AppLocalizations.of(context).gValue(diaryEntry.amount.toStringAsFixed(0))} ${diaryEntry.ingredient.name}', + overflow: TextOverflow.ellipsis, + ), + subtitle: getNutritionRow( + context, muted(getNutritionalValues(diaryEntry.nutritionalValues, context))), + trailing: (nutritionalPlan == null) + ? null + : IconButton( + tooltip: AppLocalizations.of(context).delete, + onPressed: () { + Provider.of(context, listen: false) + .deleteLog(diaryEntry.id!, nutritionalPlan!.id!); + }, + icon: const Icon(Icons.delete_outline), + iconSize: ICON_SIZE_SMALL, + ), + ); + } +} diff --git a/lib/widgets/nutrition/nutritional_diary_detail.dart b/lib/widgets/nutrition/nutritional_diary_detail.dart index 8f2b5366..93a9ae20 100644 --- a/lib/widgets/nutrition/nutritional_diary_detail.dart +++ b/lib/widgets/nutrition/nutritional_diary_detail.dart @@ -21,7 +21,7 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:wger/models/nutrition/nutritional_plan.dart'; import 'package:wger/models/nutrition/nutritional_values.dart'; import 'package:wger/widgets/nutrition/charts.dart'; -import 'package:wger/widgets/nutrition/widgets.dart'; +import 'package:wger/widgets/nutrition/nutrition_tiles.dart'; class NutritionalDiaryDetailWidget extends StatelessWidget { final NutritionalPlan _nutritionalPlan; @@ -60,15 +60,10 @@ class NutritionalDiaryDetailWidget extends StatelessWidget { ), ), const SizedBox(height: 15), - const NutritionDiaryheader(), - ...logs.map((e) => Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - children: [ - NutritionDiaryEntry(diaryEntry: e, nutritionalPlan: _nutritionalPlan), - ], - ), - )), + const DiaryheaderTile(), + ...logs.map( + (e) => DiaryEntryTile(diaryEntry: e, nutritionalPlan: _nutritionalPlan), + ), ], ); } diff --git a/lib/widgets/nutrition/widgets.dart b/lib/widgets/nutrition/widgets.dart index 460c15a7..695d202e 100644 --- a/lib/widgets/nutrition/widgets.dart +++ b/lib/widgets/nutrition/widgets.dart @@ -22,7 +22,6 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_typeahead/flutter_typeahead.dart'; import 'package:flutter_zxing/flutter_zxing.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import 'package:wger/helpers/consts.dart'; import 'package:wger/helpers/misc.dart'; @@ -30,12 +29,9 @@ import 'package:wger/helpers/platform.dart'; import 'package:wger/helpers/ui.dart'; import 'package:wger/models/exercises/ingredient_api.dart'; import 'package:wger/models/nutrition/ingredient.dart'; -import 'package:wger/models/nutrition/log.dart'; -import 'package:wger/models/nutrition/nutritional_plan.dart'; -import 'package:wger/models/nutrition/nutritional_values.dart'; import 'package:wger/providers/nutrition.dart'; import 'package:wger/widgets/core/core.dart'; -import 'package:wger/widgets/nutrition/helpers.dart'; +import 'package:wger/widgets/nutrition/nutrition_tiles.dart'; class ScanReader extends StatelessWidget { @override @@ -214,7 +210,7 @@ class _IngredientTypeaheadState extends State { mainAxisSize: MainAxisSize.min, children: [ Text(AppLocalizations.of(context).productFoundDescription(result.name)), - MealItemTile( + MealItemValuesTile( ingredient: result, nutritionalValues: result.nutritionalValues, ), @@ -272,92 +268,6 @@ class _IngredientTypeaheadState extends State { } } -class NutritionDiaryheader extends StatelessWidget { - final Widget? leading; - - const NutritionDiaryheader({this.leading}); - - @override - Widget build(BuildContext context) { - return ListTile( - leading: leading ?? - const CircleIconAvatar( - Icon(Icons.image, color: Colors.transparent), - color: Colors.transparent, - ), - subtitle: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - mainAxisSize: MainAxisSize.max, - children: [ - AppLocalizations.of(context).energy, - AppLocalizations.of(context).protein, - AppLocalizations.of(context).carbohydrates, - AppLocalizations.of(context).fat - ] - .map((e) => MutedText( - e, - textAlign: TextAlign.right, - )) - .toList(), - ), - ); - } -} - -class NutritionDiaryEntry extends StatelessWidget { - const NutritionDiaryEntry({ - super.key, - required this.diaryEntry, - this.nutritionalPlan, - }); - - final Log diaryEntry; - final NutritionalPlan? nutritionalPlan; - - @override - Widget build(BuildContext context) { - return Row( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - DateFormat.Hm(Localizations.localeOf(context).languageCode).format(diaryEntry.datetime), - style: const TextStyle(fontWeight: FontWeight.bold), - ), - const SizedBox(width: 8), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - '${AppLocalizations.of(context).gValue(diaryEntry.amount.toStringAsFixed(0))} ${diaryEntry.ingredient.name}', - overflow: TextOverflow.ellipsis, - ), - const SizedBox(height: 4), - Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - ...getMutedNutritionalValues(diaryEntry.nutritionalValues, context), - ], - ), - const SizedBox(height: 12), - ], - ), - ), - if (nutritionalPlan != null) - IconButton( - tooltip: AppLocalizations.of(context).delete, - onPressed: () { - Provider.of(context, listen: false) - .deleteLog(diaryEntry.id!, nutritionalPlan!.id!); - }, - icon: const Icon(Icons.delete_outline)), - ], - ); - } -} - class IngredientAvatar extends StatelessWidget { final Ingredient ingredient; @@ -377,23 +287,3 @@ class IngredientAvatar extends StatelessWidget { : const CircleIconAvatar(Icon(Icons.image, color: Colors.grey)); } } - -class MealItemTile extends StatelessWidget { - final Ingredient ingredient; - final NutritionalValues nutritionalValues; - - const MealItemTile({ - super.key, - required this.ingredient, - required this.nutritionalValues, - }); - - @override - Widget build(BuildContext context) { - return ListTile( - leading: IngredientAvatar(ingredient: ingredient), - title: Text(getShortNutritionValues(nutritionalValues, context)), - // subtitle: Text(ingredient.id.toString()), - ); - } -} diff --git a/test/nutrition/goldens/nutritional_plan_1_default_view.png b/test/nutrition/goldens/nutritional_plan_1_default_view.png index 602ace19..ded36538 100644 Binary files a/test/nutrition/goldens/nutritional_plan_1_default_view.png and b/test/nutrition/goldens/nutritional_plan_1_default_view.png differ diff --git a/test/nutrition/goldens/nutritional_plan_2_one_meal_with_ingredients.png b/test/nutrition/goldens/nutritional_plan_2_one_meal_with_ingredients.png index dfc53dbb..05e88d1f 100644 Binary files a/test/nutrition/goldens/nutritional_plan_2_one_meal_with_ingredients.png and b/test/nutrition/goldens/nutritional_plan_2_one_meal_with_ingredients.png differ diff --git a/test/nutrition/goldens/nutritional_plan_3_both_meals_with_ingredients.png b/test/nutrition/goldens/nutritional_plan_3_both_meals_with_ingredients.png index 40fb714f..3605db47 100644 Binary files a/test/nutrition/goldens/nutritional_plan_3_both_meals_with_ingredients.png and b/test/nutrition/goldens/nutritional_plan_3_both_meals_with_ingredients.png differ