feat(i18n): översätt kvarvarande vyer + härda vakten (audit-backlog)

- API: översatt title/displayName/toName läggs nu bredvid Sv-fälten i favoriter,
  receptvarianter, /scaled, skapar-profiler, topplistor, memory-impact,
  substitutions — samt de denormaliserade titlarna (min dag, historik, matlådor,
  matlåde-förslag, veckoplan) via nullable recipeId med svensk fallback.
  10 endpoints, batchade resolvers (ett anrop per endpoint).
- Mobil: konsumerar de nya fälten med ?? Sv-fallback (swap-meal, sparade recept,
  varianter, min dag, logg, matlådor, veckoplan, inköpslista). Hårdkodade
  strängar -> t() (kitchen, scan-review, register, recept protein/Skapat av);
  decimalkomma -> Intl.NumberFormat. Allergen-etiketter -> t() (+5 nya nycklar).
  11 nya nycklar i alla 12 språk.
- i18n-vakt härdad: fångar nu hårdkodad svenska i prop={`...`}-mallliteraler
  (blind fläck förr). Verifierat att den fäller men inte ger falska positiv.
- whySv var redan lokaliserad (buildWhy med språktagg) - orörd.
- typecheck grönt (alla paket), vakt grön (603 nycklar).

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Claude
2026-08-21 20:07:00 +00:00
parent f71b717284
commit 18388bb31c
31 changed files with 338 additions and 66 deletions
+3 -2
View File
@@ -154,12 +154,13 @@ export default function KitchenScreen() {
<Row style={{ justifyContent: "space-between" }}>
<Small>
{visible.length} varor{selected.size > 0 ? ` · ${selected.size} valda` : ""}
{t("kitchen.itemCount", { count: visible.length })}
{selected.size > 0 ? ` · ${t("kitchen.selectedCount", { count: selected.size })}` : ""}
</Small>
<Row style={{ justifyContent: "flex-end" }}>
{selected.size > 0 && (
<Button
label={`Ta bort valda (${selected.size})`}
label={t("kitchen.removeSelected", { count: selected.size })}
variant="danger"
onPress={() => confirmDelete([...selected], t("kitchen.scopeSelection"))}
/>