Files
Cibello-app/apps/mobile/src/locales/da/common.json
T
Sven (AAMOS AI) bbe7526ef3 fix(3b): delad kompletteringsväg för legacy /cook + deterministiska cooking-assumptions
- cookRecipeInputSchema utökas med actualPortionsEaten, leftoverEstimatePortions, leftoverNote
- completeCookingSession-wrapper i apps/api/src/lib/cooking.ts hanterar summavalidering,
  persistens av svar, profiluppdateringar och analytics (started+completed) för båda vägarna
- Legacy POST /v1/recipes/:id/cook använder wrappern med emitStartedEvent
- GET /v1/recipes/:id/cooking-assumptions väljer deterministiskt bland icke-valfria ingredienser
- i18n: nyckel cooked.portionsSumExceedsPlanned i samtliga 12 lokaler + server-i18n
- Nya tester för legacy /cook och cooking-assumptions med valfri första ingrediens

Refs: steg 3b-fix, granskningsrunda 2026-08-07
2026-08-07 05:13:35 +07:00

388 lines
19 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"auth.backToLogin": "Tilbage til login",
"auth.displayName": "Hvad skal vi kalde dig?",
"auth.email": "E-mail",
"auth.forgotBody": "Indtast din e-mail, så sender vi et link, hvis kontoen findes.",
"auth.forgotLink": "Glemt adgangskode?",
"auth.forgotSentBody": "Hvis adressen har en konto, har vi sendt et link, der gælder i 30 minutter. Åbn det på denne enhed.",
"auth.forgotSentTitle": "Tjek din indbakke",
"auth.forgotSubmit": "Send link",
"auth.forgotTitle": "Nulstil adgangskode",
"auth.hasAccount": "Har du allerede en konto? Log ind",
"auth.login": "Log ind",
"auth.newPassword": "Ny adgangskode (mindst 10 tegn)",
"auth.noAccount": "Ny her? Opret en konto",
"auth.password": "Adgangskode",
"auth.register": "Opret konto",
"auth.resetBody": "Linket gælder i 30 minutter og kan kun bruges én gang. Alle enheder logges ud.",
"auth.resetDoneBody": "Din adgangskode er ændret. Log ind med den nye.",
"auth.resetDoneTitle": "Færdig!",
"auth.resetSubmit": "Skift adgangskode",
"auth.resetTitle": "Vælg en ny adgangskode",
"auth.resetTokenPlaceholder": "Indsæt koden fra e-mailen",
"auth.trialNote": "7 dages fuld adgang uden kort.",
"auth.verifyDoneBody": "Tak! Din konto er nu verificeret.",
"auth.verifyDoneTitle": "E-mail bekræftet",
"auth.verifyFailedBody": "Linket er ugyldigt eller udløbet. Anmod om et nyt fra profilen.",
"auth.verifyFailedTitle": "Linket virkede ikke",
"barcode.addPrompt": "Tilføj til madlageret?",
"barcode.aim": "Ret kameraet mod stregkoden",
"barcode.allowCamera": "Tillad kamera",
"barcode.cameraBody": "{brand} skal bruge kameraet til at scanne stregkoder.",
"barcode.cameraTitle": "Kameraet er nødvendigt",
"barcode.kcalPer100": "{kcal} kcal/100 g",
"barcode.needHousehold": "Du skal først have en husstand.",
"barcode.noLocation": "Ingen opbevaringssteder fundet.",
"barcode.noNutrition": "Ingen næringsdata",
"barcode.photoPackage": "Tag billede af emballagen",
"barcode.unknownBody": "Produktet er ikke i databasen endnu. Tag et billede af forsiden og næringsdeklarationen, så tilføjer vi det.",
"barcode.unknownTitle": "Ukendt produkt",
"common.add": "Tilføj",
"common.back": "Tilbage",
"common.cancel": "Annuller",
"common.done": "Færdig",
"common.error": "Noget gik galt. Prøv igen.",
"common.estimate": "Estimat",
"common.loading": "Indlæser …",
"common.next": "Næste",
"common.off": "Fra",
"common.offline": "Offline viser senest hentede data",
"common.on": "Til",
"common.oops": "Ups",
"common.remove": "Fjern",
"common.retry": "Prøv igen",
"common.save": "Gem",
"common.skip": "Spring over",
"common.undo": "Fortryd",
"cooked.deductPantry": "Træk ingredienser fra lageret",
"cooked.deductPantryNote": "Ingredienserne trækkes fra madlageret det, der udløber først, bruges først.",
"cooked.mealBoxes": "Portioner til madpakker",
"cooked.portionsCooked": "Portioner lavet",
"cooked.rate": "Bedøm",
"cooked.title": "Hvordan gik det?",
"cooked.actualPortionsEaten": "Hvor mange portioner spiste I?",
"cooked.actualPortionsEatenHint": "Resten bliver til rester eller madpakker.",
"cooked.leftoverEstimatePortions": "Hvor mange restportioner blev der?",
"cooked.leftoverEstimateHint": "Gemmes som madpakke, hvis du vil.",
"cooked.whoAte": "Hvem spiste?",
"cooking.finish": "Færdig registrér måltidet",
"cooking.keepAwake": "Skærmen forbliver tændt, mens du laver mad",
"cooking.scale": "Portioner",
"cooking.step": "Trin {current} af {total}",
"cooking.timer": "Start timer",
"cooking.timerDone": "Færdig!",
"cooking.timerRunning": "{time} tilbage",
"home.budget": "Madbudget",
"home.emptyInventory": "Lageret er tomt. Scan køleskabet eller tilføj varer manuelt.",
"home.expired": "Udløbet",
"home.expiresIn_one": "1 dag tilbage",
"home.expiresIn_other": "{days} dage tilbage",
"home.expiresToday": "Udløber i dag",
"home.household": "Husstand",
"home.inventory": "Madlager",
"home.mealBoxes": "Madpakker",
"home.moreItems_one": "+ 1 mere …",
"home.moreItems_other": "+ {count} flere …",
"home.pastBestBefore": "Bedst før er overskredet lugt og smag først",
"home.shopping": "Indkøbsliste",
"home.thisWeek": "Denne uge",
"home.title": "Derhjemme",
"home.useSoon": "Brug snart",
"home.useSoonHint": "Bedst før handler om kvalitet lugt, se og smag, før du smider ud. Sidste anvendelsesdato skal derimod respekteres.",
"home.waste": "Madspild",
"home.wasteWeek": "Madspild denne uge",
"household.empty": "Du har ingen husstand endnu. Opret en i onboarding, eller deltag med en kode.",
"household.invite": "Invitér med kode: {code}",
"household.locations": "Opbevaringssteder",
"household.members": "Medlemmer",
"household.portionFactor": "×{factor} portion",
"household.private": "Privat pr. person: mål, allergier, helbredsdata og måltidshistorik.",
"household.role.adult": "Voksen",
"household.role.child": "Barn",
"household.role.member": "Medlem",
"household.role.owner": "Ejer",
"household.shareCode": "Del koden med familien, så deler I madlager, liste og plan.",
"household.shared": "Deles i husstanden: madlager, indkøbsliste, ugeplan, madpakker og budget.",
"logmeal.manualTitle": "Manuelt",
"logmeal.mealTypeTitle": "Måltidstype",
"logmeal.photoTip": "Tip: tag et billede af tallerkenen under Scan, så estimerer appen for dig du bekræfter altid.",
"logmeal.proteinPlaceholder": "protein (g)",
"logmeal.quickSubtitle": "Logger de samme næringsværdier som sidst.",
"logmeal.quickTitle": "Hurtig genlogning",
"logmeal.validationBody": "Navn og kalorier kræves ved manuel logning.",
"logmeal.validationTitle": "Udfyld",
"logmeal.whatPlaceholder": "Hvad spiste du?",
"mealbox.eat": "Spis nu",
"mealbox.eatBy": "Spis senest {date}",
"mealbox.empty": "Ingen madpakker lige nu. Når du laver mad, kan du gemme portioner her.",
"mealbox.enjoyBody": "Portionen er logget i Min dag.",
"mealbox.enjoyTitle": "Velbekomme!",
"mealbox.guidanceNote": "Den anbefalede frist er vejledende stol på lugt og smag.",
"mealbox.portionsLeft_one": "1 portion tilbage",
"mealbox.portionsLeft_other": "{count} portioner tilbage",
"mealbox.title": "Madpakker",
"memory.delete": "Slet",
"memory.deleteAll": "Slet al hukommelse",
"memory.deleteAllTitle": "Slet al hukommelse?",
"memory.empty": "{brand} har ikke lært noget om dig endnu.",
"memory.irreversible": "Dette kan ikke fortrydes.",
"memory.origin.ai_inferred": "AI-antagelse",
"memory.origin.observed": "Observeret mønster",
"memory.origin.user_stated": "Du har fortalt det",
"memory.pause": "Pause",
"memory.paused": "På pause",
"memory.resume": "Genoptag",
"memory.subtitle": "Fuld indsigt. Ret fejl, sæt på pause eller slet du ejer din hukommelse.",
"memory.title": "Hvad {brand} ved om mig",
"memory.verified": "Bekræftet",
"memory.verify": "Korrekt",
"myday.calories": "Kalorier",
"myday.carbs": "Kulhydrater",
"myday.estimateNote": "Værdier med ~ er estimater, du kan justere.",
"myday.estimateRange": "{min}{max} kcal, sandsynligvis {kcal}",
"myday.fat": "Fedt",
"myday.fiber": "Fibre",
"myday.kcalProtein": "{kcal} kcal · {protein} g protein",
"myday.logMeal": "Registrér måltid",
"myday.mealType.breakfast": "Morgenmad",
"myday.mealType.dessert": "Dessert",
"myday.mealType.dinner": "Aftensmad",
"myday.mealType.lunch": "Frokost",
"myday.mealType.snack": "Mellemmåltid",
"myday.noMeals": "Ingen måltider registreret i dag.",
"myday.over": "{kcal} kcal over målet",
"myday.overRecommended": "Over det anbefalede",
"myday.protein": "Protein",
"myday.remaining": "{kcal} kcal tilbage",
"myday.salt": "Salt",
"myday.targetsNote": "Målene er vejledning, ikke lægelig rådgivning.",
"myday.title": "Min dag",
"myday.todaysMeals": "Dagens måltider",
"onboarding.allergen.crustaceans": "Skaldyr",
"onboarding.allergen.eggs": "Æg",
"onboarding.allergen.fish": "Fisk",
"onboarding.allergen.gluten": "Gluten",
"onboarding.allergen.milk": "Mælk/laktose",
"onboarding.allergen.peanuts": "Jordnødder",
"onboarding.allergen.sesame": "Sesam",
"onboarding.allergen.soy": "Soja",
"onboarding.allergen.tree_nuts": "Nødder",
"onboarding.allergies": "Allergier og intolerancer",
"onboarding.allergyNote": "Allergifiltrering er altid streng retter med dine allergener vises aldrig.",
"onboarding.birthYearPlaceholder": "Fødselsår",
"onboarding.bodyTitle": "Til personlige kaloriemål (valgfrit)",
"onboarding.diet": "Hvordan spiser du?",
"onboarding.diet.flexitarian": "Flexitar",
"onboarding.diet.omnivore": "Altædende",
"onboarding.diet.pescatarian": "Pescetar",
"onboarding.diet.vegan": "Veganer",
"onboarding.diet.vegetarian": "Vegetar",
"onboarding.goal": "Hvad er dit vigtigste mål?",
"onboarding.goal.build_muscle": "Opbygge muskler",
"onboarding.goal.cook_more": "Lave mere mad hjemme",
"onboarding.goal.less_waste": "Mindske madspild",
"onboarding.goal.lose_weight": "Tabe mig",
"onboarding.goal.lower_cost": "Bruge færre penge på mad",
"onboarding.goal.maintain_weight": "Holde vægten",
"onboarding.goal.more_protein": "Spise mere protein",
"onboarding.heightPlaceholder": "Højde (cm)",
"onboarding.household": "Din husstand",
"onboarding.householdCreate": "Opret husstand",
"onboarding.householdDefaultName": "Hjemme",
"onboarding.householdJoin": "Deltag med kode",
"onboarding.householdName": "Husstandens navn",
"onboarding.inviteCode": "Invitationskode",
"onboarding.mode": "Hvor præcis vil du være?",
"onboarding.modeExact": "Præcis tilstand",
"onboarding.modeExactDesc": "Vej maden, indtast gram, fuld kontrol over tallene.",
"onboarding.modeSimple": "Enkel tilstand",
"onboarding.modeSimpleDesc": "Tag billeder af maden, accepter estimater, minimalt besvær.",
"onboarding.modesCombine": "Tilstandene kan kombineres enkelt til hverdag, præcist når du vil.",
"onboarding.notMedical": "{brand} giver vejledning ikke lægelig rådgivning.",
"onboarding.stepBSubtitle": "Tilpas din profil for bedre forslag.",
"onboarding.stepBTitle": "Fortsæt opsætning",
"onboarding.stepCSubtitle": "Valgfrit bruges til personlige kaloriemål.",
"onboarding.stepCTitle": "Din sundhedsprofil",
"onboarding.subtitle": "Alt er frivilligt og kan ændres når som helst. Jo mere du udfylder, jo bedre forslag.",
"onboarding.title": "Fortæl os lidt om dig",
"onboarding.weightPlaceholder": "Vægt (kg)",
"paywall.choose": "Vælg",
"paywall.fairUse": "Fair use-kvote for AI-scanninger inkluderet.",
"paywall.family": "Family · op til 6 personer",
"paywall.freeNote": "Gratis: 10 AI-scanninger/md., manuelt lager, gemte opskrifter og enkel registrering.",
"paywall.household": "Household · op til 3 personer",
"paywall.large": "Large Household · op til 12 personer",
"paywall.perMonth": "{price}/md.",
"paywall.popular": "Mest populær",
"paywall.restore": "Gendan køb",
"paywall.soonBody": "Køb aktiveres via App Store/Google Play, når butiksintegrationen slås til (fase 7). Backend-flowet er allerede klar.",
"paywall.soonTitle": "Snart!",
"paywall.subtitle": "Hele husstandens mad-OS: ubegrænset lager, ugeplan og deling.",
"paywall.title": "{brand} Premium",
"paywall.trialActive_one": "1 dag tilbage af din prøveperiode",
"paywall.trialActive_other": "{days} dage tilbage af din prøveperiode",
"profile.aiScansUsed": "AI-scanninger: {used} / {total} denne måned",
"profile.consent.anonymized_improvement": "Anonymiseret forbedring af AI'en",
"profile.consent.health_integration": "Sundhedsdata (Apple Health / Health Connect)",
"profile.consent.image_training": "Mine billeder må bruges til træning",
"profile.consent.location_weather": "Placering til vejrbaserede forslag",
"profile.consent.personalization": "Personlige funktioner (hukommelse & smagsprofil)",
"profile.consent.product_analytics": "Produktanalyse",
"profile.consent.push_notifications": "Push-notifikationer",
"profile.consents": "Samtykker & data",
"profile.consentsNote": "Samtykkerne er adskilte personlige funktioner kræver aldrig træningssamtykke.",
"profile.deleteAccount": "Slet konto",
"profile.deleteBody": "Alle dine data slettes permanent i henhold til GDPR.",
"profile.deleteTitle": "Slet kontoen?",
"profile.emailUnverified": "E-mailadressen er ikke bekræftet",
"profile.export": "Eksportér mine data",
"profile.goals": "Mål & kost",
"profile.language": "Sprog",
"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": "Log ud",
"profile.memory": "Hvad {brand} ved om mig",
"profile.memorySubtitle": "Se, ret, sæt på pause eller slet det, platformen har lært.",
"profile.modeLabel": "Tilstand:",
"profile.resendVerification": "Send bekræftelsesmail igen",
"profile.subscription": "Abonnement",
"profile.title": "Profil",
"profile.verificationSent": "Sendt! Tjek din indbakke.",
"recipe.avgRating": "Gennemsnit {avg} af {count} bedømmelser",
"recipe.cook": "Lav mad nu",
"recipe.cost": "ca. {amount}/portion",
"recipe.iCookedThis": "Jeg har lavet denne",
"recipe.ingredients": "Ingredienser",
"recipe.notSafe": "Passer ikke til dine kostindstillinger",
"recipe.perPortion": "pr. portion",
"recipe.portions_one": "1 portion",
"recipe.portions_other": "{count} portioner",
"recipe.save": "Gem",
"recipe.saved": "Gemt",
"recipe.steps": "Fremgangsmåde",
"recipe.substitutions": "Erstat",
"recipe.time": "{min} min",
"scan.analyzing": "Analyserer …",
"scan.barcode": "Stregkode",
"scan.coach.body": "Tag et billede af hele hylden eller køleskabet. Hold telefonen rolig og sørg for godt lys.",
"scan.coach.button": "Forstået",
"scan.coach.tip1": "Sørg for at alle varer er synlige",
"scan.coach.tip2": "Undgå blitz og skygger",
"scan.coach.tip3": "Bekræft usikre rækker i næste trin",
"scan.coach.title": "Første scanning",
"scan.expiry": "Bedst før-dato",
"scan.failed": "Analysen mislykkedes. Prøv igen eller registrér manuelt.",
"scan.freezer": "Fryser",
"scan.fridge": "Køleskab",
"scan.ingredients": "Ingredienser",
"scan.nutrition": "Næringsdeklaration",
"scan.pantry": "Spisekammer",
"scan.plate": "Tallerken",
"scan.quotaLeft_one": "1 AI-scanning tilbage denne måned",
"scan.quotaLeft_other": "{count} AI-scanninger tilbage denne måned",
"scan.receipt": "Kvittering",
"scan.review.addItem": "+ Tilføj vare",
"scan.review.approveAll": "Gem på lageret",
"scan.review.bestBeforeNote": "Kvalitetsdato varen kan sagtens holde længere. Lugt og smag, før du smider ud.",
"scan.review.dateKindBestBefore": "Bedst før",
"scan.review.dateKindUseBy": "Sidste anvendelsesdato",
"scan.review.datePlaceholder": "ÅÅÅÅ-MM-DD (valgfrit)",
"scan.review.itemPlaceholder": "Vare",
"scan.review.quantityPlaceholder": "Mængde",
"scan.review.rejected": "Fjernet",
"scan.review.subtitle": "AI'en er nogle gange usikker du bestemmer. Ret, fjern eller tilføj, før du gemmer.",
"scan.review.title": "Gennemgå resultatet",
"scan.review.uncertain": "Usikker tjek",
"scan.review.unitPlaceholder": "Enhed (g, l, stk. …)",
"scan.review.unknownItem": "Ukendt vare",
"scan.review.useByNote": "Sikkerhedsdato spis ikke efter denne dato.",
"scan.subtitle": "Fyld madlageret eller registrér et måltid med kameraet.",
"scan.takePhoto": "Tag billede",
"scan.tips.light": "Undgå mørke og skygger",
"scan.tips.move": "Flyt varer, der skjuler hinanden",
"scan.tips.overview": "Start med et oversigtsbillede",
"scan.tips.shelf": "Fotografér hylde for hylde",
"scan.tips.title": "Sådan bliver analysen bedst",
"scan.title": "Scan",
"shopping.addPlaceholder": "Tilføj vare …",
"shopping.complete": "Afslut indkøbsturen",
"shopping.completeNote": "Afkrydsede varer lægges på madlageret.",
"shopping.completedBody_one": "1 vare blev lagt i madlageret.",
"shopping.completedBody_other": "{count} varer blev lagt i madlageret.",
"shopping.completedTitle": "Færdig!",
"shopping.empty": "Listen er tom.",
"shopping.estimated": "ca. {amount}",
"shopping.estimatedTotal": "Anslået i alt: ca. {amount}",
"shopping.section.brod": "Brød",
"shopping.section.chark": "Pålæg",
"shopping.section.dryck": "Drikkevarer",
"shopping.section.fisk": "Fisk",
"shopping.section.frukt_gront": "Frugt & grønt",
"shopping.section.frys": "Frost",
"shopping.section.hygien_ovrigt": "Andet",
"shopping.section.konserver": "Konserves",
"shopping.section.kott_fagel": "Kød & fjerkræ",
"shopping.section.kryddor_bak": "Krydderier & bagning",
"shopping.section.mejeri": "Mejeri",
"shopping.section.skafferi": "Kolonial",
"shopping.section.snacks": "Snacks",
"shopping.title": "Indkøbsliste",
"tabs.home": "Derhjemme",
"tabs.myDay": "Min dag",
"tabs.scan": "Scan",
"tabs.whatToEat": "Hvad skal vi spise?",
"wte.coverage": "{pct} % derhjemme",
"wte.cravingPlaceholder": "Jeg har lyst til … (fx cremet, asiatisk, under 500 kcal)",
"wte.empty": "Ingen forslag endnu læg lidt mad på lager eller løsn filtrene.",
"wte.mealBoxFirst": "Færdig mad derhjemme",
"wte.missing": "Mangler: {items}",
"wte.refresh": "Nye forslag",
"wte.subtitle": "Ud fra hvad I har derhjemme, hvad der snart skal bruges, og hvad I kan lide.",
"wte.title": "Hvad skal vi spise?",
"wte.whyTitle": "Hvorfor dette forslag?",
"onboarding.primaryGoal": "Primært",
"home.trustStatus.up_to_date": "Opdateret",
"home.trustStatus.needs_check": "Nogle varer skal tjekkes",
"home.trustStatus.uncertain": "Lageret er usikkert lav en hurtig tjek",
"reconciliation.title": "Hurtig lagerkontrol",
"reconciliation.subtitle": "Bekræft, hvad du har tilbage, for at få bedre forslag.",
"reconciliation.exists": "Har stadig",
"reconciliation.depleted": "Det er brugt op",
"reconciliation.uncertain": "Usikker",
"reconciliation.adjustQuantity": "Juster mængde",
"reconciliation.reason.planned_recipe": "Skal bruges snart til en opskrift",
"reconciliation.reason.expiring_soon": "Udløber snart",
"reconciliation.reason.high_value": "Høj værdi",
"reconciliation.reason.low_confidence": "Anslået mængde",
"reconciliation.reason.stale_trust": "Ikke tjekket længe",
"reconciliation.reason.likely_depleted": "Sandsynligvis snart brugt op",
"reconciliation.done": "Færdig",
"reconciliation.next": "Næste",
"reconciliation.empty": "Intet behøver kontrol lige nu. Godt arbejde!",
"reconciliation.tasteHint": "Overskredet mindstholdbarhedsdato? lugt og smag først smid aldrig mad ud unødigt.",
"scan.diff.title": "Gennemgå forskelle",
"scan.diff.subtitle": "Bekræft ændringer fra seneste scanning.",
"scan.diff.newItem": "Ny vare",
"scan.diff.quantityChanged": "Mængde ændret",
"scan.diff.moved": "Flyttet",
"scan.diff.vanished": "Mangler på billedet",
"scan.diff.unchanged": "Uændret",
"scan.diff.accept": "Bekræft",
"scan.diff.reject": "Ignorer",
"scan.diff.acceptAll": "Bekræft alle",
"scan.diff.noChanges": "Ingen forskelle fundet.",
"scan.diff.undo": "Fortryd",
"scan.diff.undoHint": "Hver ændring kan fortrydes fra varedetaljevisningen.",
"cooked.portionsSumExceedsPlanned": "Antal spiste portioner og rester må ikke overstige det samlede antal portioner."
}