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": "Dodaj",
"common.back": "Wstecz",
"common.cancel": "Anuluj",
"common.remove": "Usuń",
"common.all": "Wszystkie",
"auth.tagline": "Mniej marnowania, mniej stresu, więcej w portfelu",
"auth.passwordMin8": "Hasło musi mieć co najmniej 8 znaków.",
"auth.passwordMismatch": "Hasła nie są zgodne.",
"auth.repeatPassword": "Powtórz hasło",
"plan.swapDish": "Zmień danie",
"scan.maxTitle": "Gotowe",
"scan.maxBody": "Maks. {max} zdjęć w tym skanowaniu analizuję.",
"scan.photoTaken": "Zrobiono zdjęcie {count}",
"scan.multiAngleHint": "Zrób więcej ujęć tego samego miejsca aplikacja wymieni każdy produkt tylko raz. Każde zdjęcie liczy się jako skanowanie.",
"scan.takeAnother": "Zrób kolejne",
"scan.analyzeCount": "Analizuj ({count})",
"scan.tips.merge": "Lodówka/zamrażarka/spiżarnia: zrób kilka zdjęć w jednym skanowaniu aplikacja połączy duplikaty.",
"cooking.timerHint": "Przybliżony czas etapu użyj minutnika w telefonie.",
"kitchen.deleteConfirm": "Usunąć wybrane produkty z {label}?",
"kitchen.scopeSearch": "wyszukiwania",
"kitchen.scopeAll": "całego zapasu",
"kitchen.scopeSelection": "zaznaczenia",
"kitchen.searchPlaceholder": "Szukaj produktu…",
"kitchen.clearList": "Wyczyść listę",
"kitchen.empty": "Brak produktów do wyświetlenia. Zeskanuj lub dodaj produkty.",
"kitchen.pastBefore": "najlepiej spożyć przed",
"memory.trainingNote": "Pamięć osobista nigdy nie jest wykorzystywana jako dane treningowe bez osobnej zgody.",
"recipe.source": "Źródło: {name}",
"recipes.sub.bread": "Chleb",
"recipes.sub.bun": "Bułki",
"recipes.sub.pie": "Tarta",
"recipes.sub.cake": "Torty i ciasta",
"recipes.sub.cookie": "Ciasteczka",
"recipes.searchPlaceholder": "Szukaj przepisu…",
"recipes.emptyCategory": "Na razie brak przepisów w tej kategorii pojawią się, gdy katalog się powiększy.",
"savedRecipes.searchPlaceholder": "Szukaj wśród zapisanych przepisów",
"savedRecipes.empty": "Nie masz jeszcze zapisanych przepisów. Naciśnij ☆ Zapisz przy przepisie, a pojawi się tutaj.",
"savedRecipes.emptySearch": "Żaden zapisany przepis nie pasuje do wyszukiwania.",
"shopping.removeConfirm": "Usunąć produkt z listy?",
"swap.addTitle": "Dodaj posiłek",
"swap.swapTitle": "Zmień posiłek",
"swap.chooseFor": "Wybierz danie na {meal} lub wyszukaj dowolne danie.",
"swap.chooseOther": "Wybierz inne danie na {meal} lub wyszukaj dowolne danie.",
"swap.mealLunch": "obiad",
"swap.mealBreakfast": "śniadanie",
"swap.mealDinner": "kolację",
"swap.searchPlaceholder": "Szukaj wśród wszystkich przepisów …",
"swap.showingResults": "Pokazuję wyniki dla ”{query}”.",
"swap.clearHint": "Wyczyść pole wyszukiwania i wyszukaj pustą frazę, aby znów zobaczyć propozycje.",
"errors.uploadTimeout": "Przesyłanie trwało zbyt długo sprawdź połączenie sieciowe i spróbuj ponownie.",
"common.done": "Gotowe",
"common.error": "Coś poszło nie tak. Spróbuj ponownie.",
"common.estimate": "Szacunek",