- Add product search screen (/products/search) as primary add flow; "Add" button on products list opens search, manual entry remains as fallback - Add to shelf bottom sheet with AnimatedSwitcher success view (green checkmark) and SnackBar confirmation on the search screen via onAdded callback - Manual add (AddProductScreen) shows SnackBar on success before popping back - Extend AddProductScreen with optional nutrition fields (calories, protein, fat, carbs, fiber); auto-fills from catalog selection and auto-expands section - Auto-upsert catalog product on backend when nutrition data is provided without a primary_product_id, linking the user product to the catalog - Add fiber_per_100g field to CatalogProduct model and CreateRequest - Add 16 new L10n keys across all 12 locales (addProduct, addManually, searchProducts, quantity, storageDays, addToShelf, nutritionOptional, calories, protein, fat, carbs, fiber, productAddedToShelf, etc.) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
204 lines
7.1 KiB
Plaintext
204 lines
7.1 KiB
Plaintext
{
|
|
"@@locale": "de",
|
|
"appTitle": "FoodAI",
|
|
"greetingMorning": "Guten Morgen",
|
|
"greetingAfternoon": "Guten Tag",
|
|
"greetingEvening": "Guten Abend",
|
|
"caloriesUnit": "kcal",
|
|
"gramsUnit": "g",
|
|
"goalLabel": "Ziel:",
|
|
"consumed": "Verzehrt",
|
|
"remaining": "Verbleibend",
|
|
"exceeded": "Überschritten",
|
|
"proteinLabel": "Protein",
|
|
"fatLabel": "Fett",
|
|
"carbsLabel": "Kohlenhydrate",
|
|
"today": "Heute",
|
|
"yesterday": "Gestern",
|
|
"mealsSection": "Mahlzeiten",
|
|
"addDish": "Gericht hinzufügen",
|
|
"scanDish": "Scannen",
|
|
"menu": "Menü",
|
|
"dishHistory": "Gerichtverlauf",
|
|
"recommendCook": "Wir empfehlen zu kochen",
|
|
"camera": "Kamera",
|
|
"gallery": "Galerie",
|
|
"analyzingPhoto": "Foto wird analysiert...",
|
|
"inQueue": "Sie sind in der Warteschlange",
|
|
"queuePosition": "Position {position}",
|
|
"@queuePosition": {
|
|
"placeholders": {
|
|
"position": {
|
|
"type": "int"
|
|
}
|
|
}
|
|
},
|
|
"processing": "Verarbeitung...",
|
|
"upgradePrompt": "Warteschlange überspringen? Upgrade →",
|
|
"recognitionFailed": "Erkennung fehlgeschlagen. Erneut versuchen.",
|
|
"dishRecognition": "Gerichterkennung",
|
|
"all": "Alle",
|
|
"dishRecognized": "Gericht erkannt",
|
|
"recognizing": "Wird erkannt…",
|
|
"recognitionError": "Erkennungsfehler",
|
|
"dishResultTitle": "Gericht erkannt",
|
|
"selectDish": "Gericht auswählen",
|
|
"dishNotRecognized": "Gericht nicht erkannt",
|
|
"tryAgain": "Erneut versuchen",
|
|
"nutritionApproximate": "Nährwerte sind ungefähr — aus dem Foto geschätzt.",
|
|
"portion": "Portion",
|
|
"mealType": "Mahlzeittyp",
|
|
"dateLabel": "Datum",
|
|
"addToJournal": "Zum Tagebuch hinzufügen",
|
|
"addFailed": "Hinzufügen fehlgeschlagen. Erneut versuchen.",
|
|
"historyTitle": "Erkennungsverlauf",
|
|
"historyLoadError": "Verlauf konnte nicht geladen werden",
|
|
"retry": "Wiederholen",
|
|
"noHistory": "Noch keine Erkennungen",
|
|
"profileTitle": "Profil",
|
|
"edit": "Bearbeiten",
|
|
"bodyParams": "KÖRPERPARAMETER",
|
|
"goalActivity": "ZIEL & AKTIVITÄT",
|
|
"nutrition": "ERNÄHRUNG",
|
|
"settings": "EINSTELLUNGEN",
|
|
"height": "Größe",
|
|
"weight": "Gewicht",
|
|
"age": "Alter",
|
|
"gender": "Geschlecht",
|
|
"genderMale": "Männlich",
|
|
"genderFemale": "Weiblich",
|
|
"goalLoss": "Gewichtsverlust",
|
|
"goalMaintain": "Gewicht halten",
|
|
"goalGain": "Muskelaufbau",
|
|
"activityLow": "Niedrig",
|
|
"activityMedium": "Mittel",
|
|
"activityHigh": "Hoch",
|
|
"calorieGoal": "Kalorienziel",
|
|
"mealTypes": "Mahlzeittypen",
|
|
"formulaNote": "Berechnet mit der Mifflin-St Jeor Formel",
|
|
"language": "Sprache",
|
|
"notSet": "Nicht festgelegt",
|
|
"calorieHint": "Körperparameter eingeben, um das Kalorienziel zu berechnen",
|
|
"logout": "Abmelden",
|
|
"editProfile": "Profil bearbeiten",
|
|
"cancel": "Abbrechen",
|
|
"save": "Speichern",
|
|
"nameLabel": "Name",
|
|
"heightCm": "Größe (cm)",
|
|
"weightKg": "Gewicht (kg)",
|
|
"birthDate": "Geburtsdatum",
|
|
"nameRequired": "Name eingeben",
|
|
"profileUpdated": "Profil aktualisiert",
|
|
"profileSaveFailed": "Speichern fehlgeschlagen",
|
|
"mealTypeBreakfast": "Frühstück",
|
|
"mealTypeSecondBreakfast": "Zweites Frühstück",
|
|
"mealTypeLunch": "Mittagessen",
|
|
"mealTypeAfternoonSnack": "Nachmittagssnack",
|
|
"mealTypeDinner": "Abendessen",
|
|
"mealTypeSnack": "Snack",
|
|
"navHome": "Startseite",
|
|
"navProducts": "Produkte",
|
|
"navRecipes": "Rezepte",
|
|
"addFromReceiptOrPhoto": "Aus Kassenbon oder Foto hinzufügen",
|
|
"chooseMethod": "Methode wählen",
|
|
"photoReceipt": "Kassenbon fotografieren",
|
|
"photoReceiptSubtitle": "Alle Produkte vom Kassenbon erkennen",
|
|
"photoProducts": "Produkte fotografieren",
|
|
"photoProductsSubtitle": "Kühlschrank, Tisch, Regal — bis zu 3 Fotos",
|
|
"addPackagedFood": "Verpacktes Lebensmittel hinzufügen",
|
|
"scanBarcode": "Barcode scannen",
|
|
"portionWeightG": "Portionsgewicht (g)",
|
|
"productNotFound": "Produkt nicht gefunden",
|
|
"enterManually": "Manuell eingeben",
|
|
"perHundredG": "pro 100 g",
|
|
"searchFoodHint": "Produkte und Gerichte suchen...",
|
|
"recentlyUsedLabel": "Zuletzt verwendet",
|
|
"productsSection": "Produkte",
|
|
"dishesSection": "Gerichte",
|
|
"noResultsForQuery": "Keine Ergebnisse für \"{query}\"",
|
|
"@noResultsForQuery": {
|
|
"placeholders": {
|
|
"query": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"servingsLabel": "Portionen",
|
|
"addToDiary": "Zum Tagebuch hinzufügen",
|
|
"scanDishPhoto": "Foto scannen",
|
|
"planningForDate": "",
|
|
"@planningForDate": {
|
|
"placeholders": {
|
|
"date": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"markAsEaten": "Als gegessen markieren",
|
|
"plannedMealLabel": "Geplant",
|
|
"generateWeekLabel": "Woche planen",
|
|
"generateWeekSubtitle": "KI erstellt einen Menüplan mit Frühstück, Mittagessen und Abendessen für die ganze Woche",
|
|
"generatingMenu": "Menü wird erstellt...",
|
|
"dayPlannedLabel": "Tag geplant",
|
|
"planMenuButton": "Mahlzeiten planen",
|
|
"planMenuTitle": "Was planen?",
|
|
"planOptionSingleMeal": "Einzelne Mahlzeit",
|
|
"planOptionSingleMealDesc": "Tag und Mahlzeittyp wählen",
|
|
"planOptionDay": "Ein Tag",
|
|
"planOptionDayDesc": "Alle Mahlzeiten für einen Tag",
|
|
"planOptionDays": "Mehrere Tage",
|
|
"planOptionDaysDesc": "Zeitraum anpassen",
|
|
"planOptionWeek": "Eine Woche",
|
|
"planOptionWeekDesc": "7 Tage auf einmal",
|
|
"planSelectDate": "Datum wählen",
|
|
"planSelectMealType": "Mahlzeittyp",
|
|
"planSelectRange": "Zeitraum wählen",
|
|
"planGenerateButton": "Planen",
|
|
"planGenerating": "Plan wird erstellt…",
|
|
"planSuccess": "Menü geplant!",
|
|
"planProductsTitle": "Zutaten für den Speiseplan",
|
|
"planProductsSubtitle": "Die KI berücksichtigt die ausgewählten Produkte bei der Rezeptgenerierung",
|
|
"planProductsEmpty": "Keine Produkte hinzugefügt",
|
|
"planProductsEmptyMessage": "Füge Produkte hinzu, die du zu Hause hast — die KI schlägt Rezepte aus deinen Vorräten vor",
|
|
"planProductsAddProducts": "Produkte hinzufügen",
|
|
"planProductsContinue": "Weiter",
|
|
"planProductsSkip": "Produktauswahl überspringen",
|
|
"planProductsSkipNoProducts": "Ohne Produkte planen",
|
|
"planProductsSelectAll": "Alle auswählen",
|
|
"planProductsDeselectAll": "Alle abwählen",
|
|
"recentScans": "Letzte Scans",
|
|
"seeAllScans": "Alle",
|
|
"productJobHistoryTitle": "Scan-Verlauf",
|
|
"jobTypeReceipt": "Kassenbon",
|
|
"jobTypeProducts": "Produkte",
|
|
"scanSubmitting": "Wird gesendet...",
|
|
"processingProducts": "Verarbeitung...",
|
|
"clearAllProducts": "Alles löschen",
|
|
"clearAllConfirmTitle": "Alle Produkte löschen?",
|
|
"clearAllConfirmMessage": "Alle Produkte werden dauerhaft gelöscht.",
|
|
"addManually": "Manuell",
|
|
"scan": "Scannen",
|
|
"addProduct": "Hinzufügen",
|
|
"searchProducts": "Produkte suchen",
|
|
"searchProductsHint": "Produktname eingeben oder manuell hinzufügen",
|
|
"noSearchResults": "Keine Ergebnisse für \"{query}\"",
|
|
"@noSearchResults": {
|
|
"placeholders": {
|
|
"query": {
|
|
"type": "String"
|
|
}
|
|
}
|
|
},
|
|
"quantity": "Menge",
|
|
"storageDays": "Lagertage",
|
|
"addToShelf": "Zum Vorrat hinzufügen",
|
|
"errorGeneric": "Etwas ist schiefgelaufen",
|
|
"nutritionOptional": "Nährwerte pro 100g (optional)",
|
|
"calories": "Kalorien",
|
|
"protein": "Eiweiß",
|
|
"fat": "Fett",
|
|
"carbs": "Kohlenhydrate",
|
|
"fiber": "Ballaststoffe",
|
|
"productAddedToShelf": "Zum Vorrat hinzugefügt"
|
|
}
|