From 442b2a3145f6a4244d190de67b774c912cd5fbdf Mon Sep 17 00:00:00 2001 From: Alexander Bocken Date: Fri, 26 Dec 2025 21:35:59 +0100 Subject: [PATCH] add bilingual labels to recipe components and fix language switcher - Translate hardcoded German terms in IngredientsPage and InstructionsPage - Migrate both components to Svelte 5 runes (, , ) - Fix language switcher to use correct short names via shared store - Add recipeTranslationStore for recipe-specific language switching --- src/lib/components/IngredientsPage.svelte | 35 +++++++++++++-------- src/lib/components/InstructionsPage.svelte | 28 ++++++++++++----- src/lib/components/UserHeader.svelte | 16 +++++++++- src/lib/stores/recipeTranslation.ts | 9 ++++++ src/routes/[recipeLang]/[name]/+page.svelte | 16 ++++++++++ 5 files changed, 82 insertions(+), 22 deletions(-) create mode 100644 src/lib/stores/recipeTranslation.ts diff --git a/src/lib/components/IngredientsPage.svelte b/src/lib/components/IngredientsPage.svelte index 4de5a28..e8c1050 100644 --- a/src/lib/components/IngredientsPage.svelte +++ b/src/lib/components/IngredientsPage.svelte @@ -4,13 +4,20 @@ import { onNavigate } from "$app/navigation"; import { browser } from '$app/environment'; import { page } from '$app/stores'; import HefeSwapper from './HefeSwapper.svelte'; -export let data -let multiplier = data.multiplier || 1; + +let { data } = $props(); +let multiplier = $state(data.multiplier || 1); + +const isEnglish = $derived(data.lang === 'en'); +const labels = $derived({ + portions: isEnglish ? 'Portions:' : 'Portionen:', + adjustAmount: isEnglish ? 'Adjust Amount:' : 'Menge anpassen:', + ingredients: isEnglish ? 'Ingredients' : 'Zutaten' +}); // Calculate yeast IDs for each yeast ingredient -let yeastIds = {}; -$: { - yeastIds = {}; +const yeastIds = $derived.by(() => { + const ids = {}; let yeastCounter = 0; if (data.ingredients) { for (let listIndex = 0; listIndex < data.ingredients.length; listIndex++) { @@ -18,17 +25,19 @@ $: { if (list.list) { for (let ingredientIndex = 0; ingredientIndex < list.list.length; ingredientIndex++) { const ingredient = list.list[ingredientIndex]; - if (ingredient.name === "Frischhefe" || ingredient.name === "Trockenhefe") { - yeastIds[`${listIndex}-${ingredientIndex}`] = yeastCounter++; + if (ingredient.name === "Frischhefe" || ingredient.name === "Trockenhefe" || + ingredient.name === "Fresh Yeast" || ingredient.name === "Dry Yeast") { + ids[`${listIndex}-${ingredientIndex}`] = yeastCounter++; } } } } } -} + return ids; +}); // Get all current URL parameters to preserve state in multiplier forms -$: currentParams = browser ? new URLSearchParams(window.location.search) : $page.url.searchParams; +const currentParams = $derived(browser ? new URLSearchParams(window.location.search) : $page.url.searchParams); // Progressive enhancement - use JS if available onMount(() => { @@ -318,11 +327,11 @@ span {#if data.ingredients}
{#if data.portions} -

Portionen:

+

{labels.portions}

{@html convertFloatsToFractions(multiplyFirstAndSecondNumbers(data.portions, multiplier))} {/if} -

Menge anpassen:

+

{labels.adjustAmount}

@@ -389,7 +398,7 @@ span
-

Zutaten

+

{labels.ingredients}

{#each data.ingredients as list, listIndex} {#if list.name}

{list.name}

@@ -399,7 +408,7 @@ span
{@html adjust_amount(item.amount, multiplier)} {item.unit}
{@html item.name.replace("{{multiplier}}", isNaN(parseFloat(item.amount)) ? multiplier : multiplier * parseFloat(item.amount))} - {#if item.name === "Frischhefe" || item.name === "Trockenhefe"} + {#if item.name === "Frischhefe" || item.name === "Trockenhefe" || item.name === "Fresh Yeast" || item.name === "Dry Yeast"} {@const yeastId = yeastIds[`${listIndex}-${ingredientIndex}`] ?? 0} {/if} diff --git a/src/lib/components/InstructionsPage.svelte b/src/lib/components/InstructionsPage.svelte index 806069a..f29076a 100644 --- a/src/lib/components/InstructionsPage.svelte +++ b/src/lib/components/InstructionsPage.svelte @@ -1,5 +1,17 @@