i18n(app-svep) + i18n-vakt: hela mobil-UI:t översatt + CI-vakt mot regress

- 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>
This commit is contained in:
Claude
2026-08-21 01:50:08 +00:00
parent cadaa1a41f
commit 2d59a3e636
36 changed files with 1123 additions and 288 deletions
+47
View File
@@ -51,6 +51,53 @@
"common.add": "Add",
"common.back": "Back",
"common.cancel": "Cancel",
"common.remove": "Remove",
"common.all": "All",
"auth.tagline": "Less waste, less stress, more left in your wallet",
"auth.passwordMin8": "Password must be at least 8 characters.",
"auth.passwordMismatch": "Passwords don't match.",
"auth.repeatPassword": "Repeat password",
"plan.swapDish": "Swap dish",
"scan.maxTitle": "Done",
"scan.maxBody": "Max {max} photos this scan analyzing.",
"scan.photoTaken": "Photo {count} taken",
"scan.multiAngleHint": "Feel free to take more angles of the same spot the app lists each item once. Each photo counts as one scan.",
"scan.takeAnother": "Take another",
"scan.analyzeCount": "Analyze ({count})",
"scan.tips.merge": "Fridge/freezer/pantry: take several photos in the same scan the app merges duplicates.",
"cooking.timerHint": "Approximate time for the step use your phone's own timer.",
"kitchen.deleteConfirm": "Remove selected items from {label}?",
"kitchen.scopeSearch": "the search",
"kitchen.scopeAll": "the whole inventory",
"kitchen.scopeSelection": "the selection",
"kitchen.searchPlaceholder": "Search item…",
"kitchen.clearList": "Clear list",
"kitchen.empty": "No items to show. Scan or add items.",
"kitchen.pastBefore": "best before",
"memory.trainingNote": "Personal memory is never used as training data without separate consent.",
"recipe.source": "Source: {name}",
"recipes.sub.bread": "Bread",
"recipes.sub.bun": "Buns",
"recipes.sub.pie": "Pie",
"recipes.sub.cake": "Cakes & bakes",
"recipes.sub.cookie": "Cookies",
"recipes.searchPlaceholder": "Search recipes…",
"recipes.emptyCategory": "No recipes in this category yet they'll appear as the catalog grows.",
"savedRecipes.searchPlaceholder": "Search your saved recipes",
"savedRecipes.empty": "You don't have any saved recipes yet. Tap ☆ Save on a recipe and it'll show up here.",
"savedRecipes.emptySearch": "No saved recipes match your search.",
"shopping.removeConfirm": "Remove the item from the list?",
"swap.addTitle": "Add meal",
"swap.swapTitle": "Swap meal",
"swap.chooseFor": "Choose a dish for {meal} or search for any dish.",
"swap.chooseOther": "Choose a different dish for {meal} or search for any dish.",
"swap.mealLunch": "lunch",
"swap.mealBreakfast": "breakfast",
"swap.mealDinner": "dinner",
"swap.searchPlaceholder": "Search all recipes …",
"swap.showingResults": "Showing results for ”{query}”.",
"swap.clearHint": "Clear the search box and search with it empty to see suggestions again.",
"errors.uploadTimeout": "The upload took too long check your network and try again.",
"common.done": "Done",
"common.error": "Something went wrong. Please try again.",
"common.estimate": "Estimate",