- retry-failed-translations.ts: kör om de receptöversättningar som föll på
verifieringen (skriver ut vilka + varför, köar TRANSLATE_RECIPE på nytt).
Idempotent; kör tills listan är tom, publicera sedan.
- Kok-läget (cooking/[id].tsx) visade svensk titel + svenska ingrediensnamn fast
detalj-API:t redan levererar översatta fält. Nu title/displayName med svensk
fallback (stegen var redan översatta).
- "(valfritt)" var hårdkodat i kok-läget + recept-detaljen -> ny nyckel
recipe.optional i alla 12 språk. Vakt + typecheck gröna.
Co-Authored-By: Claude <noreply@anthropic.com>
- Säsong/högtidschippen på "Vad ska vi äta?" visade marknadens namn på svenska
även för icke-svenska språk (SE-marknadens event saknar nameLocalized). Nu
renderas de via i18n-nyckeln season.<slug> (t med defaultValue -> serverns namn
som fallback för egennamn m.m.). SE-marknadens 14 event översatta i alla 12
språk; egennamn (Navidad, Midsommar, Lucia...) behålls, beskrivande översätts
(Kräftskiva, Skolstart, Grillsäsong...).
- Kok-läget: den boxade ⏱-rutan (såg ut som en knapp/timer och kunde misstas för
en riktig timer) ersatt med en diskret rad "⏱ Ungefär {time}". Döda nycklar
cooking.timer/timerDone/timerRunning borttagna; cooking.timerHint -> approxTime.
- Städat 2 dubblettnycklar i alla 12 locale-filer (mealbox.eatBy, common.remove)
som låg kvar sedan tidigare leveranser (i18next tog sista värdet ändå).
- Vakt + typecheck gröna. 591 nycklar.
Co-Authored-By: Claude <noreply@anthropic.com>
- Svepte 51 hårdkodade strängar -> t() över konto, sök/bläddra, sparade recept,
kök, planera, skanna, byt måltid, inköp, minne, cooking, api-fel (+ locLabel/
kategorier via nycklar). 47 nya nycklar, översatta till alla 12 språk.
- NY: apps/mobile/scripts/i18n-check.mjs (i18n:check) – fäller bygget om ett språk
saknar en nyckel, en använd nyckel saknas, eller det finns hårdkodad UI-text.
Wire:ad i CI (.github/workflows/ci.yml) efter typecheck. => 'lägg till språk'
blir: kör vakten, den listar exakt vad som fattas. Aldrig mer leta för hand.
- Prettier-fixade 5 filer från tidigare leveranser så format:check blir grön.
- submit-recipe fri-text-payload + firebase dev-stubs markerade // i18n-ignore.
Co-Authored-By: Claude <noreply@anthropic.com>
- cooking-skärmen renderade instructionSv (alltid svenska) -> nu instruction ?? instructionSv
- recept-skärmens täckningskort hårdkodade svenska (Du har X% hemma, Saknar N,
Du saknar, Lägg till i inköpslistan, Tillagt) -> t()-nycklar recipe.coverage.*
- coverage.missing fick översatt displayName i API:t (annars svenska ingrediensnamn)
- 7 nya recipe.coverage.*-nycklar i alla 12 språk
- persister-cache-nyckel -> -v2 (slänger gammal helsvensk cache en gang)
Co-Authored-By: Claude <noreply@anthropic.com>
Timern (setInterval-nedrakning per steg) forsvann vid stegbyte och hade ingen
bakgrund/notis. Borttagen helt – visar nu bara stegets ungefarliga tid som text
("⏱ 5 min – anvand din telefons egen timer"). Ingen nedrakning, ingen bugg.
- Merge leftovers into existing meal_box when same recipeId + cookedAt date + frozen + available.
- Store mealBoxMutations JSONB on cooking_sessions for deterministic undo.
- Undo decrements portions/remaining, discards box at zero, appends correction ledger rows.
- Mobile: undo button in cooking/[id].tsx after-flow and meal-boxes.tsx within 24h window.
- i18n undo strings across all 12 locales; parity test green.
- 6 new integration tests: merge, no cross-date merge, frozen split, undo restore, undo discard, ledger invariant.
- Update FAS3 audit doc with 3d semantics.
Closes Fas 3d