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": "Adicionar",
"common.back": "Voltar",
"common.cancel": "Cancelar",
"common.remove": "Remover",
"common.all": "Todos",
"auth.tagline": "Menos desperdício, menos stress, mais dinheiro na carteira",
"auth.passwordMin8": "A palavra-passe tem de ter pelo menos 8 caracteres.",
"auth.passwordMismatch": "As palavras-passe não coincidem.",
"auth.repeatPassword": "Repetir palavra-passe",
"plan.swapDish": "Trocar prato",
"scan.maxTitle": "Concluído",
"scan.maxBody": "Máximo de {max} fotos nesta digitalização a analisar.",
"scan.photoTaken": "Foto {count} tirada",
"scan.multiAngleHint": "Podes tirar mais ângulos do mesmo sítio a app lista cada artigo uma vez. Cada foto conta como uma digitalização.",
"scan.takeAnother": "Tirar mais uma",
"scan.analyzeCount": "Analisar ({count})",
"scan.tips.merge": "Frigorífico/congelador/despensa: tira várias fotos na mesma digitalização a app junta os duplicados.",
"cooking.timerHint": "Tempo aproximado para o passo usa o temporizador do teu telemóvel.",
"kitchen.deleteConfirm": "Remover os artigos selecionados de {label}?",
"kitchen.scopeSearch": "a pesquisa",
"kitchen.scopeAll": "todo o inventário",
"kitchen.scopeSelection": "a seleção",
"kitchen.searchPlaceholder": "Pesquisar artigo…",
"kitchen.clearList": "Esvaziar lista",
"kitchen.empty": "Não há artigos para mostrar. Digitaliza ou adiciona artigos.",
"kitchen.pastBefore": "validade",
"memory.trainingNote": "A memória pessoal nunca é usada como dados de treino sem consentimento em separado.",
"recipe.source": "Fonte: {name}",
"recipes.sub.bread": "Pão",
"recipes.sub.bun": "Pãezinhos",
"recipes.sub.pie": "Tarte",
"recipes.sub.cake": "Bolos e tortas",
"recipes.sub.cookie": "Bolachas",
"recipes.searchPlaceholder": "Pesquisar receitas…",
"recipes.emptyCategory": "Ainda não há receitas nesta categoria aparecem à medida que o catálogo cresce.",
"savedRecipes.searchPlaceholder": "Pesquisar nas tuas receitas guardadas",
"savedRecipes.empty": "Ainda não tens receitas guardadas. Toca em ☆ Guardar numa receita e aparece aqui.",
"savedRecipes.emptySearch": "Nenhuma receita guardada corresponde à tua pesquisa.",
"shopping.removeConfirm": "Remover o artigo da lista?",
"swap.addTitle": "Adicionar refeição",
"swap.swapTitle": "Trocar refeição",
"swap.chooseFor": "Escolhe um prato para {meal} ou pesquisa qualquer prato.",
"swap.chooseOther": "Escolhe outro prato para {meal} ou pesquisa qualquer prato.",
"swap.mealLunch": "o almoço",
"swap.mealBreakfast": "o pequeno-almoço",
"swap.mealDinner": "o jantar",
"swap.searchPlaceholder": "Pesquisar em todas as receitas …",
"swap.showingResults": "A mostrar resultados para ”{query}”.",
"swap.clearHint": "Limpa a caixa de pesquisa e pesquisa sem texto para voltares a ver as sugestões.",
"errors.uploadTimeout": "O carregamento demorou demasiado tempo verifica a ligação e tenta novamente.",
"common.done": "Concluído",
"common.error": "Algo correu mal. Tente novamente.",
"common.estimate": "Estimativa",