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:
@@ -11,6 +11,8 @@ import {
|
||||
import { errors, parse } from "../lib/errors.js";
|
||||
import { emitEvent, requireActiveHousehold, requireMembership } from "../lib/helpers.js";
|
||||
import { requireFeature } from "../lib/entitlements.js";
|
||||
import { resolveRecipeTitles } from "../lib/contentLanguage.js";
|
||||
import { loadLocalePreferences } from "../lib/localeContext.js";
|
||||
|
||||
/**
|
||||
* Veckoplanering (spec §25). Planen genereras asynkront av workern
|
||||
@@ -33,15 +35,30 @@ export async function planningRoutes(app: FastifyInstance) {
|
||||
.orderBy(desc(schema.weekPlans.weekStartDate), desc(schema.weekPlans.createdAt))
|
||||
.limit(8);
|
||||
|
||||
const result = [];
|
||||
const plansWithEntries = [];
|
||||
for (const plan of plans) {
|
||||
const entries = await app.db
|
||||
.select()
|
||||
.from(schema.weekPlanEntries)
|
||||
.where(eq(schema.weekPlanEntries.weekPlanId, plan.id))
|
||||
.orderBy(schema.weekPlanEntries.date, schema.weekPlanEntries.sortOrder);
|
||||
result.push({ ...plan, entries });
|
||||
plansWithEntries.push({ plan, entries });
|
||||
}
|
||||
const languageTag = (await loadLocalePreferences(app.db, req.userId)).languageTag;
|
||||
const titleMap = await resolveRecipeTitles(
|
||||
app.db,
|
||||
plansWithEntries.flatMap((p) =>
|
||||
p.entries.map((e) => e.recipeId).filter((id): id is string => id != null),
|
||||
),
|
||||
languageTag,
|
||||
);
|
||||
const result = plansWithEntries.map(({ plan, entries }) => ({
|
||||
...plan,
|
||||
entries: entries.map((e) => ({
|
||||
...e,
|
||||
title: e.recipeId ? (titleMap.get(e.recipeId) ?? e.titleSv) : e.titleSv,
|
||||
})),
|
||||
}));
|
||||
return { plans: result };
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user