diff --git a/CHANGELOG.md b/CHANGELOG.md index e552fc6..e03de8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ All notable changes to Epicure are documented here. This file is mirrored in-app at `/changelog` (and in the admin dashboard) via `apps/web/lib/changelog.ts` — update both together. +## 0.33.1 — 2026-07-14 17:45 + +### Fixed +- URL-imported recipes never recorded what language they were actually written in, so the Translate button couldn't tell whether translation was needed — the importer now detects the source page's language, and photo import records the language it always writes in. + ## 0.33.0 — 2026-07-14 17:35 ### Added diff --git a/apps/web/app/api/v1/ai/import-photo/route.ts b/apps/web/app/api/v1/ai/import-photo/route.ts index 8348840..60f07f1 100644 --- a/apps/web/app/api/v1/ai/import-photo/route.ts +++ b/apps/web/app/api/v1/ai/import-photo/route.ts @@ -66,6 +66,12 @@ export async function POST(req: NextRequest) { cookMins: recipe.cookMins, dietaryTags: recipe.dietaryTags ?? {}, aiGenerated: true, + // The extraction prompt always writes the recipe in the caller's own + // locale (see importFromPhoto's langInstruction) regardless of what + // language the photo/label was in — so this *is* the recipe's + // language, not a guess, and lets the Translate button correctly + // stay hidden until the user's app language changes. + language: locale, createdAt: now, updatedAt: now, }); diff --git a/apps/web/lib/ai/features/import-url.ts b/apps/web/lib/ai/features/import-url.ts index f7d12c3..2a5686e 100644 --- a/apps/web/lib/ai/features/import-url.ts +++ b/apps/web/lib/ai/features/import-url.ts @@ -6,6 +6,7 @@ import { dietaryTagsSchema, ingredientSchema, stepSchema } from "./recipe-schema const ImportedRecipeSchema = z.object({ recipeType: z.enum(["dish", "drink"]).describe("\"drink\" only for a beverage/cocktail (no cooking step) — \"dish\" for anything else, including if unsure."), + language: z.string().min(2).max(10).describe("ISO 639-1 code of the language the recipe content (title/ingredients/steps) is actually written in, e.g. \"en\", \"fr\" — the source page's language, not a language to translate into."), title: z.string(), description: z.string().optional(), baseServings: z.number().int().min(1).optional(), @@ -42,7 +43,7 @@ export async function importFromUrl(url: string, config?: AiConfig): Promise