FAS 1b: Progressive onboarding (3-layer flow)
- Add PROGRESSIVE_ONBOARDING feature flag to KNOWN_FLAGS - Add onboarding_step column to users table (a/b/c) - New backend endpoints: - GET /v1/onboarding/status – check current step + feature flag - POST /v1/onboarding/quick-start – complete Step A (goal + precision) - POST /v1/onboarding/complete-b – complete Step B (diet, allergens, household) - POST /v1/onboarding/complete-c – complete Step C (health profile) - POST /v1/onboarding/skip – GDPR-friendly skip - Refactor mobile onboarding screen into 3 progressive layers - Update auth store with onboardingStep state - Update tab layout to only block on Step A - Update registration to set onboardingStep='a' - Add i18n keys for Step B/C titles across all 12 locales - Add Zod validation schemas (quickStartInputSchema, onboardingStatusSchema) - Add tests for validation and feature flag - Preserve existing /v1/me/onboarding for backward compatibility - Migration: 0004_progressive_onboarding.sql
This commit is contained in:
@@ -1,339 +1,343 @@
|
||||
{
|
||||
"common.loading": "Wird geladen …",
|
||||
"auth.backToLogin": "Zurück zur Anmeldung",
|
||||
"auth.displayName": "Wie sollen wir dich nennen?",
|
||||
"auth.email": "E-Mail",
|
||||
"auth.forgotBody": "Gib deine E-Mail-Adresse ein – wir senden einen Link, falls das Konto existiert.",
|
||||
"auth.forgotLink": "Passwort vergessen?",
|
||||
"auth.forgotSentBody": "Falls die Adresse ein Konto hat, haben wir einen 30 Minuten gültigen Link gesendet. Öffne ihn auf diesem Gerät.",
|
||||
"auth.forgotSentTitle": "Prüfe dein Postfach",
|
||||
"auth.forgotSubmit": "Link senden",
|
||||
"auth.forgotTitle": "Passwort zurücksetzen",
|
||||
"auth.hasAccount": "Schon ein Konto? Anmelden",
|
||||
"auth.login": "Anmelden",
|
||||
"auth.newPassword": "Neues Passwort (mind. 10 Zeichen)",
|
||||
"auth.noAccount": "Neu hier? Konto erstellen",
|
||||
"auth.password": "Passwort",
|
||||
"auth.register": "Konto erstellen",
|
||||
"auth.resetBody": "Der Link ist 30 Minuten gültig und nur einmal verwendbar. Alle Geräte werden abgemeldet.",
|
||||
"auth.resetDoneBody": "Dein Passwort wurde geändert. Melde dich mit dem neuen an.",
|
||||
"auth.resetDoneTitle": "Fertig!",
|
||||
"auth.resetSubmit": "Passwort ändern",
|
||||
"auth.resetTitle": "Neues Passwort wählen",
|
||||
"auth.resetTokenPlaceholder": "Code aus der E-Mail einfügen",
|
||||
"auth.trialNote": "7 Tage voller Zugriff – ohne Karte.",
|
||||
"auth.verifyDoneBody": "Danke! Dein Konto ist jetzt verifiziert.",
|
||||
"auth.verifyDoneTitle": "E-Mail bestätigt",
|
||||
"auth.verifyFailedBody": "Der Link ist ungültig oder abgelaufen. Fordere im Profil einen neuen an.",
|
||||
"auth.verifyFailedTitle": "Der Link hat nicht funktioniert",
|
||||
"barcode.addPrompt": "Zum Vorrat hinzufügen?",
|
||||
"barcode.aim": "Richte die Kamera auf den Barcode",
|
||||
"barcode.allowCamera": "Kamera erlauben",
|
||||
"barcode.cameraBody": "{brand} benötigt die Kamera, um Barcodes zu scannen.",
|
||||
"barcode.cameraTitle": "Kamera erforderlich",
|
||||
"barcode.kcalPer100": "{kcal} kcal/100 g",
|
||||
"barcode.needHousehold": "Du brauchst zuerst einen Haushalt.",
|
||||
"barcode.noLocation": "Kein Lagerort gefunden.",
|
||||
"barcode.noNutrition": "Keine Nährwertdaten",
|
||||
"barcode.photoPackage": "Verpackung fotografieren",
|
||||
"barcode.unknownBody": "Dieses Produkt ist noch nicht in der Datenbank. Fotografiere Vorderseite und Nährwerttabelle, dann fügen wir es hinzu.",
|
||||
"barcode.unknownTitle": "Unbekanntes Produkt",
|
||||
"common.add": "Hinzufügen",
|
||||
"common.back": "Zurück",
|
||||
"common.cancel": "Abbrechen",
|
||||
"common.done": "Fertig",
|
||||
"common.error": "Etwas ist schiefgelaufen. Bitte erneut versuchen.",
|
||||
"common.estimate": "Schätzung",
|
||||
"common.loading": "Wird geladen …",
|
||||
"common.next": "Weiter",
|
||||
"common.off": "Aus",
|
||||
"common.offline": "Offline – zuletzt geladene Daten",
|
||||
"common.on": "An",
|
||||
"common.oops": "Hoppla",
|
||||
"common.remove": "Entfernen",
|
||||
"common.retry": "Erneut versuchen",
|
||||
"common.save": "Speichern",
|
||||
"common.cancel": "Abbrechen",
|
||||
"common.next": "Weiter",
|
||||
"common.back": "Zurück",
|
||||
"common.done": "Fertig",
|
||||
"common.skip": "Überspringen",
|
||||
"common.offline": "Offline – zuletzt geladene Daten",
|
||||
"common.estimate": "Schätzung",
|
||||
"tabs.whatToEat": "Was essen wir?",
|
||||
"tabs.scan": "Scannen",
|
||||
"tabs.myDay": "Mein Tag",
|
||||
"tabs.home": "Zuhause",
|
||||
"auth.login": "Anmelden",
|
||||
"auth.register": "Konto erstellen",
|
||||
"auth.email": "E-Mail",
|
||||
"auth.password": "Passwort",
|
||||
"auth.displayName": "Wie sollen wir dich nennen?",
|
||||
"auth.noAccount": "Neu hier? Konto erstellen",
|
||||
"auth.hasAccount": "Schon ein Konto? Anmelden",
|
||||
"auth.trialNote": "7 Tage voller Zugriff – ohne Karte.",
|
||||
"auth.forgotLink": "Passwort vergessen?",
|
||||
"auth.forgotTitle": "Passwort zurücksetzen",
|
||||
"auth.forgotBody": "Gib deine E-Mail-Adresse ein – wir senden einen Link, falls das Konto existiert.",
|
||||
"auth.forgotSubmit": "Link senden",
|
||||
"auth.forgotSentTitle": "Prüfe dein Postfach",
|
||||
"auth.forgotSentBody": "Falls die Adresse ein Konto hat, haben wir einen 30 Minuten gültigen Link gesendet. Öffne ihn auf diesem Gerät.",
|
||||
"auth.backToLogin": "Zurück zur Anmeldung",
|
||||
"auth.resetTitle": "Neues Passwort wählen",
|
||||
"auth.resetBody": "Der Link ist 30 Minuten gültig und nur einmal verwendbar. Alle Geräte werden abgemeldet.",
|
||||
"auth.resetTokenPlaceholder": "Code aus der E-Mail einfügen",
|
||||
"auth.newPassword": "Neues Passwort (mind. 10 Zeichen)",
|
||||
"auth.resetSubmit": "Passwort ändern",
|
||||
"auth.resetDoneTitle": "Fertig!",
|
||||
"auth.resetDoneBody": "Dein Passwort wurde geändert. Melde dich mit dem neuen an.",
|
||||
"auth.verifyDoneTitle": "E-Mail bestätigt",
|
||||
"auth.verifyDoneBody": "Danke! Dein Konto ist jetzt verifiziert.",
|
||||
"auth.verifyFailedTitle": "Der Link hat nicht funktioniert",
|
||||
"auth.verifyFailedBody": "Der Link ist ungültig oder abgelaufen. Fordere im Profil einen neuen an.",
|
||||
"onboarding.title": "Erzähl uns etwas über dich",
|
||||
"onboarding.subtitle": "Alles ist optional und jederzeit änderbar. Je mehr du ausfüllst, desto besser die Vorschläge.",
|
||||
"onboarding.goal": "Was ist dein wichtigstes Ziel?",
|
||||
"onboarding.diet": "Wie isst du?",
|
||||
"common.undo": "Rückgängig",
|
||||
"cooked.deductPantry": "Zutaten vom Vorrat abziehen",
|
||||
"cooked.deductPantryNote": "Zutaten werden nach dem Prinzip zuerst-ablaufend-zuerst vom Vorrat abgezogen.",
|
||||
"cooked.mealBoxes": "Portionen für Meal-Prep-Boxen",
|
||||
"cooked.portionsCooked": "Gekochte Portionen",
|
||||
"cooked.rate": "Bewerten",
|
||||
"cooked.title": "Wie ist es gelaufen?",
|
||||
"cooked.whoAte": "Wer hat gegessen?",
|
||||
"cooking.finish": "Fertig – Mahlzeit erfassen",
|
||||
"cooking.keepAwake": "Der Bildschirm bleibt beim Kochen an",
|
||||
"cooking.scale": "Portionen",
|
||||
"cooking.step": "Schritt {current} von {total}",
|
||||
"cooking.timer": "Timer starten",
|
||||
"cooking.timerDone": "Fertig!",
|
||||
"cooking.timerRunning": "{time} übrig",
|
||||
"home.budget": "Essensbudget",
|
||||
"home.emptyInventory": "Der Vorrat ist leer. Scanne den Kühlschrank oder füge manuell hinzu.",
|
||||
"home.expired": "Abgelaufen",
|
||||
"home.expiresIn_one": "Noch 1 Tag",
|
||||
"home.expiresIn_other": "Noch {days} Tage",
|
||||
"home.expiresToday": "Läuft heute ab",
|
||||
"home.household": "Haushalt",
|
||||
"home.inventory": "Vorrat",
|
||||
"home.mealBoxes": "Meal-Prep-Boxen",
|
||||
"home.moreItems_one": "+ 1 weiterer …",
|
||||
"home.moreItems_other": "+ {count} weitere …",
|
||||
"home.pastBestBefore": "MHD überschritten – erst riechen und probieren",
|
||||
"home.shopping": "Einkaufsliste",
|
||||
"home.thisWeek": "Diese Woche",
|
||||
"home.title": "Zuhause",
|
||||
"home.useSoon": "Bald verbrauchen",
|
||||
"home.useSoonHint": "Das Mindesthaltbarkeitsdatum ist eine Qualitätsgrenze – erst riechen, ansehen und probieren, bevor etwas weggeworfen wird. Das Verbrauchsdatum dagegen gilt strikt.",
|
||||
"home.waste": "Lebensmittelabfall",
|
||||
"home.wasteWeek": "Lebensmittelabfall diese Woche",
|
||||
"household.empty": "Du hast noch keinen Haushalt. Lege einen im Onboarding an oder tritt per Code bei.",
|
||||
"household.invite": "Einladen mit Code: {code}",
|
||||
"household.locations": "Lagerorte",
|
||||
"household.members": "Mitglieder",
|
||||
"household.portionFactor": "×{factor} Portion",
|
||||
"household.private": "Privat pro Person: Ziele, Allergien, Gesundheitsdaten und Essenshistorie.",
|
||||
"household.role.adult": "Erwachsener",
|
||||
"household.role.child": "Kind",
|
||||
"household.role.member": "Mitglied",
|
||||
"household.role.owner": "Inhaber",
|
||||
"household.shareCode": "Teile den Code mit der Familie – dann teilt ihr Vorrat, Liste und Plan.",
|
||||
"household.shared": "Im Haushalt geteilt: Vorrat, Einkaufsliste, Wochenplan, Boxen und Budget.",
|
||||
"logmeal.manualTitle": "Manuell",
|
||||
"logmeal.mealTypeTitle": "Mahlzeitentyp",
|
||||
"logmeal.photoTip": "Tipp: Fotografiere den Teller unter Scannen – die App schätzt für dich, du bestätigst immer.",
|
||||
"logmeal.proteinPlaceholder": "Protein (g)",
|
||||
"logmeal.quickSubtitle": "Übernimmt dieselben Nährwerte wie beim letzten Mal.",
|
||||
"logmeal.quickTitle": "Schnell erneut loggen",
|
||||
"logmeal.validationBody": "Für manuelles Loggen sind Name und Kalorien nötig.",
|
||||
"logmeal.validationTitle": "Angaben fehlen",
|
||||
"logmeal.whatPlaceholder": "Was hast du gegessen?",
|
||||
"mealbox.eat": "Jetzt essen",
|
||||
"mealbox.eatBy": "Verzehren bis {date}",
|
||||
"mealbox.empty": "Gerade keine Boxen. Beim Kochen kannst du hier Portionen aufheben.",
|
||||
"mealbox.enjoyBody": "Die Portion wurde in Mein Tag geloggt.",
|
||||
"mealbox.enjoyTitle": "Guten Appetit!",
|
||||
"mealbox.guidanceNote": "Die empfohlene Frist ist eine Orientierung – verlass dich auf Geruch und Geschmack.",
|
||||
"mealbox.portionsLeft_one": "Noch 1 Portion",
|
||||
"mealbox.portionsLeft_other": "Noch {count} Portionen",
|
||||
"mealbox.title": "Meal-Prep-Boxen",
|
||||
"memory.delete": "Löschen",
|
||||
"memory.deleteAll": "Gesamtes Gedächtnis löschen",
|
||||
"memory.deleteAllTitle": "Gesamtes Gedächtnis löschen?",
|
||||
"memory.empty": "{brand} hat noch nichts über dich gelernt.",
|
||||
"memory.irreversible": "Das lässt sich nicht rückgängig machen.",
|
||||
"memory.origin.ai_inferred": "KI-Annahme",
|
||||
"memory.origin.observed": "Beobachtetes Muster",
|
||||
"memory.origin.user_stated": "Von dir erzählt",
|
||||
"memory.pause": "Pausieren",
|
||||
"memory.paused": "Pausiert",
|
||||
"memory.resume": "Fortsetzen",
|
||||
"memory.subtitle": "Volle Transparenz. Korrigiere Fehler, pausiere oder lösche – dein Gedächtnis gehört dir.",
|
||||
"memory.title": "Was {brand} über mich weiß",
|
||||
"memory.verified": "Bestätigt",
|
||||
"memory.verify": "Stimmt",
|
||||
"myday.calories": "Kalorien",
|
||||
"myday.carbs": "Kohlenhydrate",
|
||||
"myday.estimateNote": "Werte mit ~ sind Schätzungen, die du anpassen kannst.",
|
||||
"myday.estimateRange": "{min}–{max} kcal, wahrscheinlich {kcal}",
|
||||
"myday.fat": "Fett",
|
||||
"myday.fiber": "Ballaststoffe",
|
||||
"myday.kcalProtein": "{kcal} kcal · {protein} g Protein",
|
||||
"myday.logMeal": "Mahlzeit erfassen",
|
||||
"myday.mealType.breakfast": "Frühstück",
|
||||
"myday.mealType.dessert": "Nachtisch",
|
||||
"myday.mealType.dinner": "Abendessen",
|
||||
"myday.mealType.lunch": "Mittagessen",
|
||||
"myday.mealType.snack": "Snack",
|
||||
"myday.noMeals": "Heute noch keine Mahlzeiten erfasst.",
|
||||
"myday.over": "{kcal} kcal über dem Ziel",
|
||||
"myday.overRecommended": "Über der Empfehlung",
|
||||
"myday.protein": "Eiweiß",
|
||||
"myday.remaining": "{kcal} kcal übrig",
|
||||
"myday.salt": "Salz",
|
||||
"myday.targetsNote": "Ziele sind Orientierung, keine medizinische Beratung.",
|
||||
"myday.title": "Mein Tag",
|
||||
"myday.todaysMeals": "Heutige Mahlzeiten",
|
||||
"onboarding.allergen.crustaceans": "Krebstiere",
|
||||
"onboarding.allergen.eggs": "Eier",
|
||||
"onboarding.allergen.fish": "Fisch",
|
||||
"onboarding.allergen.gluten": "Gluten",
|
||||
"onboarding.allergen.milk": "Milch/Laktose",
|
||||
"onboarding.allergen.peanuts": "Erdnüsse",
|
||||
"onboarding.allergen.sesame": "Sesam",
|
||||
"onboarding.allergen.soy": "Soja",
|
||||
"onboarding.allergen.tree_nuts": "Schalenfrüchte",
|
||||
"onboarding.allergies": "Allergien und Unverträglichkeiten",
|
||||
"onboarding.allergyNote": "Der Allergiefilter ist immer strikt – Gerichte mit deinen Allergenen werden nie angezeigt.",
|
||||
"onboarding.birthYearPlaceholder": "Geburtsjahr",
|
||||
"onboarding.bodyTitle": "Für persönliche Kalorienziele (optional)",
|
||||
"onboarding.diet": "Wie isst du?",
|
||||
"onboarding.diet.flexitarian": "Flexitarier",
|
||||
"onboarding.diet.omnivore": "Allesesser",
|
||||
"onboarding.diet.pescatarian": "Pescetarier",
|
||||
"onboarding.diet.vegan": "Veganer",
|
||||
"onboarding.diet.vegetarian": "Vegetarier",
|
||||
"onboarding.goal": "Was ist dein wichtigstes Ziel?",
|
||||
"onboarding.goal.build_muscle": "Muskeln aufbauen",
|
||||
"onboarding.goal.cook_more": "Öfter selbst kochen",
|
||||
"onboarding.goal.less_waste": "Weniger wegwerfen",
|
||||
"onboarding.goal.lose_weight": "Abnehmen",
|
||||
"onboarding.goal.lower_cost": "Weniger für Essen ausgeben",
|
||||
"onboarding.goal.maintain_weight": "Gewicht halten",
|
||||
"onboarding.goal.more_protein": "Mehr Protein essen",
|
||||
"onboarding.heightPlaceholder": "Größe (cm)",
|
||||
"onboarding.household": "Dein Haushalt",
|
||||
"onboarding.householdCreate": "Haushalt erstellen",
|
||||
"onboarding.householdDefaultName": "Zuhause",
|
||||
"onboarding.householdJoin": "Mit Code beitreten",
|
||||
"onboarding.householdName": "Name des Haushalts",
|
||||
"onboarding.inviteCode": "Einladungscode",
|
||||
"onboarding.mode": "Wie genau möchtest du es?",
|
||||
"onboarding.modeSimple": "Einfacher Modus",
|
||||
"onboarding.modeSimpleDesc": "Essen fotografieren, Schätzungen akzeptieren, kein Aufwand.",
|
||||
"onboarding.modeExact": "Exakter Modus",
|
||||
"onboarding.modeExactDesc": "Essen wiegen, Gramm eingeben, volle Kontrolle über die Zahlen.",
|
||||
"onboarding.modesCombine": "Die Modi lassen sich kombinieren – im Alltag einfach, exakt wenn du willst.",
|
||||
"onboarding.modeSimple": "Einfacher Modus",
|
||||
"onboarding.modeSimpleDesc": "Essen fotografieren, Schätzungen akzeptieren, kein Aufwand.",
|
||||
"onboarding.notMedical": "{brand} bietet Orientierung – keine medizinische Beratung.",
|
||||
"wte.title": "Was essen wir?",
|
||||
"wte.subtitle": "Basierend auf dem, was ihr zuhause habt, was bald verbraucht werden sollte und was ihr mögt.",
|
||||
"wte.cravingPlaceholder": "Ich habe Lust auf … (z. B. cremig, asiatisch, unter 500 kcal)",
|
||||
"wte.mealBoxFirst": "Fertiges Essen zuhause",
|
||||
"wte.whyTitle": "Warum dieser Vorschlag?",
|
||||
"wte.coverage": "{pct} % zuhause",
|
||||
"wte.missing": "Fehlt: {items}",
|
||||
"wte.empty": "Noch keine Vorschläge – fülle den Vorrat oder lockere die Filter.",
|
||||
"wte.refresh": "Neue Vorschläge",
|
||||
"scan.title": "Scannen",
|
||||
"scan.subtitle": "Fülle deinen Vorrat oder erfasse eine Mahlzeit mit der Kamera.",
|
||||
"scan.fridge": "Kühlschrank",
|
||||
"scan.freezer": "Gefrierschrank",
|
||||
"scan.pantry": "Vorratsschrank",
|
||||
"scan.ingredients": "Zutaten",
|
||||
"scan.plate": "Teller",
|
||||
"scan.receipt": "Kassenbon",
|
||||
"scan.barcode": "Barcode",
|
||||
"scan.expiry": "Mindesthaltbarkeitsdatum",
|
||||
"scan.nutrition": "Nährwertangaben",
|
||||
"scan.takePhoto": "Foto aufnehmen",
|
||||
"scan.tips.title": "So gelingt die Analyse am besten",
|
||||
"scan.tips.overview": "Beginne mit einem Übersichtsfoto",
|
||||
"scan.tips.shelf": "Fotografiere Fach für Fach",
|
||||
"scan.tips.light": "Vermeide Dunkelheit und Schatten",
|
||||
"scan.tips.move": "Rücke verdeckte Produkte frei",
|
||||
"scan.analyzing": "Analyse läuft …",
|
||||
"scan.quotaLeft_one": "1 KI-Scan diesen Monat übrig",
|
||||
"scan.quotaLeft_other": "{count} KI-Scans diesen Monat übrig",
|
||||
"scan.review.title": "Ergebnis prüfen",
|
||||
"scan.review.subtitle": "Die KI ist manchmal unsicher – du entscheidest. Bearbeite, entferne oder ergänze vor dem Speichern.",
|
||||
"scan.review.uncertain": "Unsicher – bitte prüfen",
|
||||
"scan.review.approveAll": "In den Vorrat speichern",
|
||||
"scan.review.rejected": "Entfernt",
|
||||
"scan.failed": "Analyse fehlgeschlagen. Erneut versuchen oder manuell erfassen.",
|
||||
"myday.title": "Mein Tag",
|
||||
"myday.calories": "Kalorien",
|
||||
"myday.protein": "Eiweiß",
|
||||
"myday.carbs": "Kohlenhydrate",
|
||||
"myday.fat": "Fett",
|
||||
"myday.fiber": "Ballaststoffe",
|
||||
"myday.salt": "Salz",
|
||||
"myday.remaining": "{kcal} kcal übrig",
|
||||
"myday.over": "{kcal} kcal über dem Ziel",
|
||||
"myday.logMeal": "Mahlzeit erfassen",
|
||||
"myday.noMeals": "Heute noch keine Mahlzeiten erfasst.",
|
||||
"myday.estimateNote": "Werte mit ~ sind Schätzungen, die du anpassen kannst.",
|
||||
"myday.targetsNote": "Ziele sind Orientierung, keine medizinische Beratung.",
|
||||
"home.title": "Zuhause",
|
||||
"home.inventory": "Vorrat",
|
||||
"home.useSoon": "Bald verbrauchen",
|
||||
"home.mealBoxes": "Meal-Prep-Boxen",
|
||||
"home.shopping": "Einkaufsliste",
|
||||
"home.budget": "Essensbudget",
|
||||
"home.household": "Haushalt",
|
||||
"home.waste": "Lebensmittelabfall",
|
||||
"home.emptyInventory": "Der Vorrat ist leer. Scanne den Kühlschrank oder füge manuell hinzu.",
|
||||
"home.expiresIn_one": "Noch 1 Tag",
|
||||
"home.expiresIn_other": "Noch {days} Tage",
|
||||
"home.expiresToday": "Läuft heute ab",
|
||||
"home.expired": "Abgelaufen",
|
||||
"home.pastBestBefore": "MHD überschritten – erst riechen und probieren",
|
||||
"onboarding.stepBSubtitle": "Passe dein Profil für bessere Vorschläge an.",
|
||||
"onboarding.stepBTitle": "Einrichtung fortsetzen",
|
||||
"onboarding.stepCSubtitle": "Optional – wird für persönliche Kalorienziele verwendet.",
|
||||
"onboarding.stepCTitle": "Dein Gesundheitsprofil",
|
||||
"onboarding.subtitle": "Alles ist optional und jederzeit änderbar. Je mehr du ausfüllst, desto besser die Vorschläge.",
|
||||
"onboarding.title": "Erzähl uns etwas über dich",
|
||||
"onboarding.weightPlaceholder": "Gewicht (kg)",
|
||||
"paywall.choose": "Wählen",
|
||||
"paywall.fairUse": "Fair-Use-Kontingent für KI-Scans inklusive.",
|
||||
"paywall.family": "Family · bis zu 6 Personen",
|
||||
"paywall.freeNote": "Gratis: 10 KI-Scans/Monat, manueller Vorrat, gespeicherte Rezepte und einfaches Tracking.",
|
||||
"paywall.household": "Household · bis zu 3 Personen",
|
||||
"paywall.large": "Large Household · bis zu 12 Personen",
|
||||
"paywall.perMonth": "{price}/Monat",
|
||||
"paywall.popular": "Am beliebtesten",
|
||||
"paywall.restore": "Käufe wiederherstellen",
|
||||
"paywall.soonBody": "Käufe laufen über App Store/Google Play, sobald die Store-Integration aktiviert ist (Phase 7). Das Backend ist bereits fertig.",
|
||||
"paywall.soonTitle": "Bald!",
|
||||
"paywall.subtitle": "Das Food-Betriebssystem für den ganzen Haushalt: unbegrenzter Vorrat, Wochenplan und Teilen.",
|
||||
"paywall.title": "{brand} Premium",
|
||||
"paywall.trialActive_one": "Noch 1 Tag Testzeitraum",
|
||||
"paywall.trialActive_other": "Noch {days} Tage Testzeitraum",
|
||||
"profile.aiScansUsed": "KI-Scans: {used} / {total} diesen Monat",
|
||||
"profile.consent.anonymized_improvement": "Anonymisierte Verbesserung der KI",
|
||||
"profile.consent.health_integration": "Gesundheitsdaten (Apple Health / Health Connect)",
|
||||
"profile.consent.image_training": "Meine Bilder dürfen fürs Training genutzt werden",
|
||||
"profile.consent.location_weather": "Standort für wetterbasierte Vorschläge",
|
||||
"profile.consent.personalization": "Persönliche Funktionen (Gedächtnis & Geschmacksprofil)",
|
||||
"profile.consent.product_analytics": "Produktanalyse",
|
||||
"profile.consent.push_notifications": "Push-Benachrichtigungen",
|
||||
"profile.consents": "Einwilligungen & Daten",
|
||||
"profile.consentsNote": "Die Einwilligungen sind getrennt – persönliche Funktionen erfordern nie eine Trainings-Einwilligung.",
|
||||
"profile.deleteAccount": "Konto löschen",
|
||||
"profile.deleteBody": "Alle deine Daten werden gemäß DSGVO dauerhaft gelöscht.",
|
||||
"profile.deleteTitle": "Konto löschen?",
|
||||
"profile.emailUnverified": "E-Mail-Adresse nicht bestätigt",
|
||||
"profile.export": "Meine Daten exportieren",
|
||||
"profile.goals": "Ziele & Ernährung",
|
||||
"profile.language": "Sprache",
|
||||
"profile.language.da": "Dansk",
|
||||
"profile.language.de": "Deutsch",
|
||||
"profile.language.en": "English",
|
||||
"profile.language.es": "Español",
|
||||
"profile.language.fi": "Suomi",
|
||||
"profile.language.fr": "Français",
|
||||
"profile.language.it": "Italiano",
|
||||
"profile.language.nb": "Norsk",
|
||||
"profile.language.nl": "Nederlands",
|
||||
"profile.language.pl": "Polski",
|
||||
"profile.language.pt": "Português",
|
||||
"profile.language.sv": "Svenska",
|
||||
"profile.logout": "Abmelden",
|
||||
"profile.memory": "Was {brand} über mich weiß",
|
||||
"profile.memorySubtitle": "Sieh, korrigiere, pausiere oder lösche, was die Plattform gelernt hat.",
|
||||
"profile.modeLabel": "Modus:",
|
||||
"profile.resendVerification": "Bestätigungsmail erneut senden",
|
||||
"profile.subscription": "Abo",
|
||||
"profile.title": "Profil",
|
||||
"profile.verificationSent": "Gesendet! Prüfe dein Postfach.",
|
||||
"recipe.avgRating": "Schnitt {avg} bei {count} Bewertungen",
|
||||
"recipe.cook": "Jetzt kochen",
|
||||
"recipe.cost": "ca. {amount}/Portion",
|
||||
"recipe.iCookedThis": "Habe ich gekocht",
|
||||
"recipe.ingredients": "Zutaten",
|
||||
"recipe.notSafe": "Passt nicht zu deinen Ernährungseinstellungen",
|
||||
"recipe.perPortion": "pro Portion",
|
||||
"recipe.portions_one": "1 Portion",
|
||||
"recipe.portions_other": "{count} Portionen",
|
||||
"recipe.time": "{min} Min.",
|
||||
"recipe.perPortion": "pro Portion",
|
||||
"recipe.ingredients": "Zutaten",
|
||||
"recipe.save": "Speichern",
|
||||
"recipe.saved": "Gespeichert",
|
||||
"recipe.steps": "Zubereitung",
|
||||
"recipe.cook": "Jetzt kochen",
|
||||
"recipe.notSafe": "Passt nicht zu deinen Ernährungseinstellungen",
|
||||
"recipe.substitutions": "Ersetzen",
|
||||
"recipe.iCookedThis": "Habe ich gekocht",
|
||||
"recipe.cost": "ca. {amount}/Portion",
|
||||
"cooking.step": "Schritt {current} von {total}",
|
||||
"cooking.timer": "Timer starten",
|
||||
"cooking.timerRunning": "{time} übrig",
|
||||
"cooking.finish": "Fertig – Mahlzeit erfassen",
|
||||
"cooking.scale": "Portionen",
|
||||
"cooking.keepAwake": "Der Bildschirm bleibt beim Kochen an",
|
||||
"cooked.title": "Wie ist es gelaufen?",
|
||||
"cooked.portionsCooked": "Gekochte Portionen",
|
||||
"cooked.whoAte": "Wer hat gegessen?",
|
||||
"cooked.mealBoxes": "Portionen für Meal-Prep-Boxen",
|
||||
"cooked.deductPantry": "Zutaten vom Vorrat abziehen",
|
||||
"cooked.rate": "Bewerten",
|
||||
"shopping.title": "Einkaufsliste",
|
||||
"recipe.time": "{min} Min.",
|
||||
"scan.analyzing": "Analyse läuft …",
|
||||
"scan.barcode": "Barcode",
|
||||
"scan.expiry": "Mindesthaltbarkeitsdatum",
|
||||
"scan.failed": "Analyse fehlgeschlagen. Erneut versuchen oder manuell erfassen.",
|
||||
"scan.freezer": "Gefrierschrank",
|
||||
"scan.fridge": "Kühlschrank",
|
||||
"scan.ingredients": "Zutaten",
|
||||
"scan.nutrition": "Nährwertangaben",
|
||||
"scan.pantry": "Vorratsschrank",
|
||||
"scan.plate": "Teller",
|
||||
"scan.quotaLeft_one": "1 KI-Scan diesen Monat übrig",
|
||||
"scan.quotaLeft_other": "{count} KI-Scans diesen Monat übrig",
|
||||
"scan.receipt": "Kassenbon",
|
||||
"scan.review.addItem": "+ Artikel hinzufügen",
|
||||
"scan.review.approveAll": "In den Vorrat speichern",
|
||||
"scan.review.bestBeforeNote": "Qualitätsdatum – oft ist das Lebensmittel danach noch gut. Erst riechen und probieren.",
|
||||
"scan.review.dateKindBestBefore": "Mindesthaltbarkeit (MHD)",
|
||||
"scan.review.dateKindUseBy": "Verbrauchsdatum",
|
||||
"scan.review.datePlaceholder": "JJJJ-MM-TT (optional)",
|
||||
"scan.review.itemPlaceholder": "Artikel",
|
||||
"scan.review.quantityPlaceholder": "Menge",
|
||||
"scan.review.rejected": "Entfernt",
|
||||
"scan.review.subtitle": "Die KI ist manchmal unsicher – du entscheidest. Bearbeite, entferne oder ergänze vor dem Speichern.",
|
||||
"scan.review.title": "Ergebnis prüfen",
|
||||
"scan.review.uncertain": "Unsicher – bitte prüfen",
|
||||
"scan.review.unitPlaceholder": "Einheit (g, l, Stk. …)",
|
||||
"scan.review.unknownItem": "Unbekannter Artikel",
|
||||
"scan.review.useByNote": "Sicherheitsdatum – danach nicht mehr essen.",
|
||||
"scan.subtitle": "Fülle deinen Vorrat oder erfasse eine Mahlzeit mit der Kamera.",
|
||||
"scan.takePhoto": "Foto aufnehmen",
|
||||
"scan.tips.light": "Vermeide Dunkelheit und Schatten",
|
||||
"scan.tips.move": "Rücke verdeckte Produkte frei",
|
||||
"scan.tips.overview": "Beginne mit einem Übersichtsfoto",
|
||||
"scan.tips.shelf": "Fotografiere Fach für Fach",
|
||||
"scan.tips.title": "So gelingt die Analyse am besten",
|
||||
"scan.title": "Scannen",
|
||||
"shopping.addPlaceholder": "Artikel hinzufügen …",
|
||||
"shopping.complete": "Einkauf abschließen",
|
||||
"shopping.completedBody_one": "1 Artikel wurde in den Vorrat übernommen.",
|
||||
"shopping.completedBody_other": "{count} Artikel wurden in den Vorrat übernommen.",
|
||||
"shopping.completedTitle": "Fertig!",
|
||||
"shopping.completeNote": "Abgehakte Artikel wandern in den Vorrat.",
|
||||
"shopping.empty": "Die Liste ist leer.",
|
||||
"shopping.estimated": "ca. {amount}",
|
||||
"shopping.estimatedTotal": "Geschätzte Summe: ca. {amount}",
|
||||
"mealbox.title": "Meal-Prep-Boxen",
|
||||
"mealbox.eatBy": "Verzehren bis {date}",
|
||||
"mealbox.portionsLeft_one": "Noch 1 Portion",
|
||||
"mealbox.portionsLeft_other": "Noch {count} Portionen",
|
||||
"mealbox.eat": "Jetzt essen",
|
||||
"mealbox.empty": "Gerade keine Boxen. Beim Kochen kannst du hier Portionen aufheben.",
|
||||
"household.members": "Mitglieder",
|
||||
"household.invite": "Einladen mit Code: {code}",
|
||||
"household.shared": "Im Haushalt geteilt: Vorrat, Einkaufsliste, Wochenplan, Boxen und Budget.",
|
||||
"household.private": "Privat pro Person: Ziele, Allergien, Gesundheitsdaten und Essenshistorie.",
|
||||
"memory.title": "Was {brand} über mich weiß",
|
||||
"memory.subtitle": "Volle Transparenz. Korrigiere Fehler, pausiere oder lösche – dein Gedächtnis gehört dir.",
|
||||
"memory.paused": "Pausiert",
|
||||
"memory.verify": "Stimmt",
|
||||
"memory.pause": "Pausieren",
|
||||
"memory.delete": "Löschen",
|
||||
"memory.deleteAll": "Gesamtes Gedächtnis löschen",
|
||||
"memory.empty": "{brand} hat noch nichts über dich gelernt.",
|
||||
"memory.origin.user_stated": "Von dir erzählt",
|
||||
"memory.origin.observed": "Beobachtetes Muster",
|
||||
"memory.origin.ai_inferred": "KI-Annahme",
|
||||
"paywall.title": "{brand} Premium",
|
||||
"paywall.subtitle": "Das Food-Betriebssystem für den ganzen Haushalt: unbegrenzter Vorrat, Wochenplan und Teilen.",
|
||||
"paywall.trialActive_one": "Noch 1 Tag Testzeitraum",
|
||||
"paywall.trialActive_other": "Noch {days} Tage Testzeitraum",
|
||||
"paywall.household": "Household · bis zu 3 Personen",
|
||||
"paywall.family": "Family · bis zu 6 Personen",
|
||||
"paywall.large": "Large Household · bis zu 12 Personen",
|
||||
"paywall.perMonth": "{price}/Monat",
|
||||
"paywall.fairUse": "Fair-Use-Kontingent für KI-Scans inklusive.",
|
||||
"paywall.restore": "Käufe wiederherstellen",
|
||||
"paywall.freeNote": "Gratis: 10 KI-Scans/Monat, manueller Vorrat, gespeicherte Rezepte und einfaches Tracking.",
|
||||
"profile.title": "Profil",
|
||||
"profile.goals": "Ziele & Ernährung",
|
||||
"profile.consents": "Einwilligungen & Daten",
|
||||
"profile.memory": "Was {brand} über mich weiß",
|
||||
"profile.subscription": "Abo",
|
||||
"profile.logout": "Abmelden",
|
||||
"profile.export": "Meine Daten exportieren",
|
||||
"profile.deleteAccount": "Konto löschen",
|
||||
"profile.language": "Sprache",
|
||||
"profile.language.sv": "Svenska",
|
||||
"profile.language.en": "English",
|
||||
"profile.emailUnverified": "E-Mail-Adresse nicht bestätigt",
|
||||
"profile.resendVerification": "Bestätigungsmail erneut senden",
|
||||
"profile.verificationSent": "Gesendet! Prüfe dein Postfach.",
|
||||
"profile.language.es": "Español",
|
||||
"profile.language.it": "Italiano",
|
||||
"profile.language.de": "Deutsch",
|
||||
"profile.language.fr": "Français",
|
||||
"profile.language.da": "Dansk",
|
||||
"profile.language.nb": "Norsk",
|
||||
"profile.language.fi": "Suomi",
|
||||
"profile.language.nl": "Nederlands",
|
||||
"profile.language.pl": "Polski",
|
||||
"profile.language.pt": "Português",
|
||||
"common.oops": "Hoppla",
|
||||
"common.undo": "Rückgängig",
|
||||
"common.remove": "Entfernen",
|
||||
"common.add": "Hinzufügen",
|
||||
"common.on": "An",
|
||||
"common.off": "Aus",
|
||||
"home.thisWeek": "Diese Woche",
|
||||
"home.wasteWeek": "Lebensmittelabfall diese Woche",
|
||||
"home.useSoonHint": "Das Mindesthaltbarkeitsdatum ist eine Qualitätsgrenze – erst riechen, ansehen und probieren, bevor etwas weggeworfen wird. Das Verbrauchsdatum dagegen gilt strikt.",
|
||||
"scan.review.itemPlaceholder": "Artikel",
|
||||
"scan.review.quantityPlaceholder": "Menge",
|
||||
"scan.review.unitPlaceholder": "Einheit (g, l, Stk. …)",
|
||||
"scan.review.datePlaceholder": "JJJJ-MM-TT (optional)",
|
||||
"scan.review.dateKindBestBefore": "Mindesthaltbarkeit (MHD)",
|
||||
"scan.review.dateKindUseBy": "Verbrauchsdatum",
|
||||
"scan.review.bestBeforeNote": "Qualitätsdatum – oft ist das Lebensmittel danach noch gut. Erst riechen und probieren.",
|
||||
"scan.review.useByNote": "Sicherheitsdatum – danach nicht mehr essen.",
|
||||
"scan.review.addItem": "+ Artikel hinzufügen",
|
||||
"scan.review.unknownItem": "Unbekannter Artikel",
|
||||
"barcode.aim": "Richte die Kamera auf den Barcode",
|
||||
"barcode.addPrompt": "Zum Vorrat hinzufügen?",
|
||||
"barcode.kcalPer100": "{kcal} kcal/100 g",
|
||||
"barcode.noNutrition": "Keine Nährwertdaten",
|
||||
"barcode.unknownTitle": "Unbekanntes Produkt",
|
||||
"barcode.unknownBody": "Dieses Produkt ist noch nicht in der Datenbank. Fotografiere Vorderseite und Nährwerttabelle, dann fügen wir es hinzu.",
|
||||
"barcode.photoPackage": "Verpackung fotografieren",
|
||||
"barcode.needHousehold": "Du brauchst zuerst einen Haushalt.",
|
||||
"barcode.noLocation": "Kein Lagerort gefunden.",
|
||||
"barcode.cameraTitle": "Kamera erforderlich",
|
||||
"barcode.cameraBody": "{brand} benötigt die Kamera, um Barcodes zu scannen.",
|
||||
"barcode.allowCamera": "Kamera erlauben",
|
||||
"onboarding.goal.lose_weight": "Abnehmen",
|
||||
"onboarding.goal.build_muscle": "Muskeln aufbauen",
|
||||
"onboarding.goal.maintain_weight": "Gewicht halten",
|
||||
"onboarding.goal.more_protein": "Mehr Protein essen",
|
||||
"onboarding.goal.less_waste": "Weniger wegwerfen",
|
||||
"onboarding.goal.lower_cost": "Weniger für Essen ausgeben",
|
||||
"onboarding.goal.cook_more": "Öfter selbst kochen",
|
||||
"onboarding.diet.omnivore": "Allesesser",
|
||||
"onboarding.diet.flexitarian": "Flexitarier",
|
||||
"onboarding.diet.pescatarian": "Pescetarier",
|
||||
"onboarding.diet.vegetarian": "Vegetarier",
|
||||
"onboarding.diet.vegan": "Veganer",
|
||||
"onboarding.allergen.gluten": "Gluten",
|
||||
"onboarding.allergen.milk": "Milch/Laktose",
|
||||
"onboarding.allergen.eggs": "Eier",
|
||||
"onboarding.allergen.tree_nuts": "Schalenfrüchte",
|
||||
"onboarding.allergen.peanuts": "Erdnüsse",
|
||||
"onboarding.allergen.fish": "Fisch",
|
||||
"onboarding.allergen.crustaceans": "Krebstiere",
|
||||
"onboarding.allergen.soy": "Soja",
|
||||
"onboarding.allergen.sesame": "Sesam",
|
||||
"onboarding.bodyTitle": "Für persönliche Kalorienziele (optional)",
|
||||
"onboarding.weightPlaceholder": "Gewicht (kg)",
|
||||
"onboarding.heightPlaceholder": "Größe (cm)",
|
||||
"onboarding.birthYearPlaceholder": "Geburtsjahr",
|
||||
"onboarding.householdDefaultName": "Zuhause",
|
||||
"onboarding.modesCombine": "Die Modi lassen sich kombinieren – im Alltag einfach, exakt wenn du willst.",
|
||||
"myday.mealType.breakfast": "Frühstück",
|
||||
"myday.mealType.lunch": "Mittagessen",
|
||||
"myday.mealType.dinner": "Abendessen",
|
||||
"myday.mealType.snack": "Snack",
|
||||
"myday.mealType.dessert": "Nachtisch",
|
||||
"myday.overRecommended": "Über der Empfehlung",
|
||||
"myday.todaysMeals": "Heutige Mahlzeiten",
|
||||
"myday.estimateRange": "{min}–{max} kcal, wahrscheinlich {kcal}",
|
||||
"myday.kcalProtein": "{kcal} kcal · {protein} g Protein",
|
||||
"logmeal.mealTypeTitle": "Mahlzeitentyp",
|
||||
"logmeal.quickTitle": "Schnell erneut loggen",
|
||||
"logmeal.quickSubtitle": "Übernimmt dieselben Nährwerte wie beim letzten Mal.",
|
||||
"logmeal.manualTitle": "Manuell",
|
||||
"logmeal.whatPlaceholder": "Was hast du gegessen?",
|
||||
"logmeal.proteinPlaceholder": "Protein (g)",
|
||||
"logmeal.validationTitle": "Angaben fehlen",
|
||||
"logmeal.validationBody": "Für manuelles Loggen sind Name und Kalorien nötig.",
|
||||
"logmeal.photoTip": "Tipp: Fotografiere den Teller unter Scannen – die App schätzt für dich, du bestätigst immer.",
|
||||
"shopping.section.frukt_gront": "Obst & Gemüse",
|
||||
"shopping.section.brod": "Brot",
|
||||
"shopping.section.mejeri": "Molkereiprodukte",
|
||||
"shopping.section.kott_fagel": "Fleisch & Geflügel",
|
||||
"shopping.section.fisk": "Fisch",
|
||||
"shopping.section.chark": "Wurstwaren",
|
||||
"shopping.section.frys": "Tiefkühl",
|
||||
"shopping.section.skafferi": "Vorratsschrank",
|
||||
"shopping.section.konserver": "Konserven",
|
||||
"shopping.section.kryddor_bak": "Gewürze & Backen",
|
||||
"shopping.section.dryck": "Getränke",
|
||||
"shopping.section.snacks": "Snacks",
|
||||
"shopping.section.fisk": "Fisch",
|
||||
"shopping.section.frukt_gront": "Obst & Gemüse",
|
||||
"shopping.section.frys": "Tiefkühl",
|
||||
"shopping.section.hygien_ovrigt": "Sonstiges",
|
||||
"shopping.completedTitle": "Fertig!",
|
||||
"household.role.owner": "Inhaber",
|
||||
"household.role.adult": "Erwachsener",
|
||||
"household.role.member": "Mitglied",
|
||||
"household.role.child": "Kind",
|
||||
"household.empty": "Du hast noch keinen Haushalt. Lege einen im Onboarding an oder tritt per Code bei.",
|
||||
"household.shareCode": "Teile den Code mit der Familie – dann teilt ihr Vorrat, Liste und Plan.",
|
||||
"household.locations": "Lagerorte",
|
||||
"household.portionFactor": "×{factor} Portion",
|
||||
"mealbox.enjoyTitle": "Guten Appetit!",
|
||||
"mealbox.enjoyBody": "Die Portion wurde in Mein Tag geloggt.",
|
||||
"mealbox.guidanceNote": "Die empfohlene Frist ist eine Orientierung – verlass dich auf Geruch und Geschmack.",
|
||||
"paywall.soonTitle": "Bald!",
|
||||
"paywall.soonBody": "Käufe laufen über App Store/Google Play, sobald die Store-Integration aktiviert ist (Phase 7). Das Backend ist bereits fertig.",
|
||||
"paywall.popular": "Am beliebtesten",
|
||||
"paywall.choose": "Wählen",
|
||||
"recipe.saved": "Gespeichert",
|
||||
"recipe.save": "Speichern",
|
||||
"recipe.avgRating": "Schnitt {avg} bei {count} Bewertungen",
|
||||
"memory.verified": "Bestätigt",
|
||||
"memory.resume": "Fortsetzen",
|
||||
"memory.deleteAllTitle": "Gesamtes Gedächtnis löschen?",
|
||||
"memory.irreversible": "Das lässt sich nicht rückgängig machen.",
|
||||
"profile.consent.personalization": "Persönliche Funktionen (Gedächtnis & Geschmacksprofil)",
|
||||
"profile.consent.anonymized_improvement": "Anonymisierte Verbesserung der KI",
|
||||
"profile.consent.image_training": "Meine Bilder dürfen fürs Training genutzt werden",
|
||||
"profile.consent.health_integration": "Gesundheitsdaten (Apple Health / Health Connect)",
|
||||
"profile.consent.location_weather": "Standort für wetterbasierte Vorschläge",
|
||||
"profile.consent.push_notifications": "Push-Benachrichtigungen",
|
||||
"profile.modeLabel": "Modus:",
|
||||
"profile.memorySubtitle": "Sieh, korrigiere, pausiere oder lösche, was die Plattform gelernt hat.",
|
||||
"profile.consentsNote": "Die Einwilligungen sind getrennt – persönliche Funktionen erfordern nie eine Trainings-Einwilligung.",
|
||||
"profile.aiScansUsed": "KI-Scans: {used} / {total} diesen Monat",
|
||||
"profile.deleteTitle": "Konto löschen?",
|
||||
"profile.deleteBody": "Alle deine Daten werden gemäß DSGVO dauerhaft gelöscht.",
|
||||
"cooking.timerDone": "Fertig!",
|
||||
"cooked.deductPantryNote": "Zutaten werden nach dem Prinzip zuerst-ablaufend-zuerst vom Vorrat abgezogen.",
|
||||
"home.moreItems_one": "+ 1 weiterer …",
|
||||
"home.moreItems_other": "+ {count} weitere …",
|
||||
"shopping.completedBody_one": "1 Artikel wurde in den Vorrat übernommen.",
|
||||
"shopping.completedBody_other": "{count} Artikel wurden in den Vorrat übernommen.",
|
||||
"profile.consent.product_analytics": "Produktanalyse"
|
||||
"shopping.section.konserver": "Konserven",
|
||||
"shopping.section.kott_fagel": "Fleisch & Geflügel",
|
||||
"shopping.section.kryddor_bak": "Gewürze & Backen",
|
||||
"shopping.section.mejeri": "Molkereiprodukte",
|
||||
"shopping.section.skafferi": "Vorratsschrank",
|
||||
"shopping.section.snacks": "Snacks",
|
||||
"shopping.title": "Einkaufsliste",
|
||||
"tabs.home": "Zuhause",
|
||||
"tabs.myDay": "Mein Tag",
|
||||
"tabs.scan": "Scannen",
|
||||
"tabs.whatToEat": "Was essen wir?",
|
||||
"wte.coverage": "{pct} % zuhause",
|
||||
"wte.cravingPlaceholder": "Ich habe Lust auf … (z. B. cremig, asiatisch, unter 500 kcal)",
|
||||
"wte.empty": "Noch keine Vorschläge – fülle den Vorrat oder lockere die Filter.",
|
||||
"wte.mealBoxFirst": "Fertiges Essen zuhause",
|
||||
"wte.missing": "Fehlt: {items}",
|
||||
"wte.refresh": "Neue Vorschläge",
|
||||
"wte.subtitle": "Basierend auf dem, was ihr zuhause habt, was bald verbraucht werden sollte und was ihr mögt.",
|
||||
"wte.title": "Was essen wir?",
|
||||
"wte.whyTitle": "Warum dieser Vorschlag?"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user