-
{user.name}
-
({user.nickname})
-
+
diff --git a/src/routes/(main)/+page.svelte b/src/routes/(main)/+page.svelte
index f5d71bc..f81a8c9 100644
--- a/src/routes/(main)/+page.svelte
+++ b/src/routes/(main)/+page.svelte
@@ -1,7 +1,20 @@
+
+ {labels.metaTitle}
+
+
+
+
+
+
+
+
{labels.title}
+
{labels.subheading}
+
+
+
+
+{#each data.season as recipe}
+
+{/each}
+
+
+{#each categories as category}
+
+ {#each data.all_brief.filter(recipe => recipe.category == category) as recipe}
+
+ {/each}
+
+{/each}
+{#if !isEnglish}
+
+{/if}
diff --git a/src/routes/rezepte/[name]/+page.server.ts b/src/routes/[recipeLang]/[name]/+page.server.ts
similarity index 100%
rename from src/routes/rezepte/[name]/+page.server.ts
rename to src/routes/[recipeLang]/[name]/+page.server.ts
diff --git a/src/routes/recipes/[name]/+page.svelte b/src/routes/[recipeLang]/[name]/+page.svelte
similarity index 77%
rename from src/routes/recipes/[name]/+page.svelte
rename to src/routes/[recipeLang]/[name]/+page.svelte
index ae5628a..d6d52bb 100644
--- a/src/routes/recipes/[name]/+page.svelte
+++ b/src/routes/[recipeLang]/[name]/+page.svelte
@@ -15,12 +15,18 @@
import FavoriteButton from '$lib/components/FavoriteButton.svelte';
import RecipeLanguageSwitcher from '$lib/components/RecipeLanguageSwitcher.svelte';
- export let data: PageData;
+ let { data }: { data: PageData } = $props();
+
+ const isEnglish = $derived(data.lang === 'en');
// Use German short_name for images (they're the same for both languages)
- let hero_img_src = "https://bocken.org/static/rezepte/full/" + data.germanShortName + ".webp?v=" + data.dateModified
- let placeholder_src = "https://bocken.org/static/rezepte/placeholder/" + data.germanShortName + ".webp?v=" + data.dateModified
- export let months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
+ const imageShortName = $derived(data.germanShortName || data.short_name);
+ const hero_img_src = $derived("https://bocken.org/static/rezepte/full/" + imageShortName + ".webp?v=" + data.dateModified);
+ const placeholder_src = $derived("https://bocken.org/static/rezepte/placeholder/" + imageShortName + ".webp?v=" + data.dateModified);
+
+ const months = $derived(isEnglish
+ ? ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
+ : ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]);
function season_intervals() {
let interval_arr = []
@@ -54,17 +60,9 @@
return interval_arr
}
- export let season_iv = season_intervals();
+ const season_iv = $derived(season_intervals());
- afterNavigate(() => {
- hero_img_src = "https://bocken.org/static/rezepte/full/" + data.germanShortName + ".webp"
- placeholder_src = "https://bocken.org/static/rezepte/placeholder/" + data.germanShortName + ".webp"
- season_iv = season_intervals();
- })
- let display_date = new Date(data.dateCreated);
- if (data.updatedAt){
- display_date = new Date(data.updatedAt);
- }
+ const display_date = $derived(data.updatedAt ? new Date(data.updatedAt) : new Date(data.dateCreated));
const options = {
day: '2-digit',
month: 'short',
@@ -72,7 +70,14 @@
hour: '2-digit',
minute: '2-digit',
};
- const formatted_display_date = display_date.toLocaleDateString('en-US', options)
+ const formatted_display_date = $derived(display_date.toLocaleDateString(isEnglish ? 'en-US' : 'de-DE', options));
+
+ const labels = $derived({
+ season: isEnglish ? 'Season:' : 'Saison:',
+ keywords: isEnglish ? 'Keywords:' : 'Stichwörter:',
+ lastModified: isEnglish ? 'Last modified:' : 'Letzte Änderung:',
+ title: isEnglish ? "Bocken's Recipes" : "Bocken'sche Rezepte"
+ });
- {stripHtmlTags(data.name)} - Bocken's Recipes
+ {stripHtmlTags(data.name)} - {labels.title}
-
-
+
+
{@html ``}
-
+ {#if isEnglish || data.hasEnglishTranslation}
+
+ {/if}
-
-
-
{data.category}
-
{data.icon}
+
{data.category}
+
{data.icon}
{@html data.name}
{#if data.description && ! data.preamble}
{data.description}
@@ -305,9 +305,9 @@ h4{
{@html data.preamble}
{/if}
-
Keywords:
+
{labels.keywords}
@@ -345,7 +345,7 @@ h4{
{@html data.addendum}
{/if}
- Last modified: {formatted_display_date}
+ {labels.lastModified} {formatted_display_date}
diff --git a/src/routes/rezepte/[name]/+page.ts b/src/routes/[recipeLang]/[name]/+page.ts
similarity index 79%
rename from src/routes/rezepte/[name]/+page.ts
rename to src/routes/[recipeLang]/[name]/+page.ts
index 1d52f90..00cd380 100644
--- a/src/routes/rezepte/[name]/+page.ts
+++ b/src/routes/[recipeLang]/[name]/+page.ts
@@ -2,12 +2,15 @@ import { error } from "@sveltejs/kit";
import { generateRecipeJsonLd } from '$lib/js/recipeJsonLd';
export async function load({ fetch, params, url}) {
- const res = await fetch(`/api/rezepte/items/${params.name}`);
+ const isEnglish = params.recipeLang === 'recipes';
+ const apiBase = isEnglish ? '/api/recipes' : '/api/rezepte';
+
+ const res = await fetch(`${apiBase}/items/${params.name}`);
let item = await res.json();
if(!res.ok){
throw error(res.status, item.message)
}
-
+
// Check if this recipe is favorited by the user
let isFavorite = false;
try {
@@ -35,23 +38,26 @@ export async function load({ fetch, params, url}) {
for (let ingredientIndex = 0; ingredientIndex < list.list.length; ingredientIndex++) {
const ingredient = list.list[ingredientIndex];
- // Check if this is a yeast ingredient
- if (ingredient.name === "Frischhefe" || ingredient.name === "Trockenhefe") {
+ // Check if this is a yeast ingredient (both German and English names)
+ const isFreshYeast = ingredient.name === "Frischhefe" || ingredient.name === "Fresh Yeast";
+ const isDryYeast = ingredient.name === "Trockenhefe" || ingredient.name === "Dry Yeast";
+
+ if (isFreshYeast || isDryYeast) {
// Check if this yeast should be toggled
const yeastParam = `y${yeastCounter}`;
const isToggled = url.searchParams.has(yeastParam);
-
+
if (isToggled) {
// Perform yeast conversion from original recipe data
const originalName = ingredient.name;
const originalAmount = parseFloat(ingredient.amount);
const originalUnit = ingredient.unit;
-
+
let newName: string, newAmount: string, newUnit: string;
-
- if (originalName === "Frischhefe") {
+
+ if (isFreshYeast) {
// Convert fresh yeast to dry yeast
- newName = "Trockenhefe";
+ newName = isEnglish ? "Dry Yeast" : "Trockenhefe";
if (originalUnit === "Prise") {
// "1 Prise Frischhefe" → "1 Prise Trockenhefe"
@@ -66,9 +72,9 @@ export async function load({ fetch, params, url}) {
newAmount = (originalAmount / 3).toString();
newUnit = "g";
}
- } else if (originalName === "Trockenhefe") {
+ } else if (isDryYeast) {
// Convert dry yeast to fresh yeast
- newName = "Frischhefe";
+ newName = isEnglish ? "Fresh Yeast" : "Frischhefe";
if (originalUnit === "Prise") {
// "1 Prise Trockenhefe" → "1 g Frischhefe"
@@ -105,9 +111,11 @@ export async function load({ fetch, params, url}) {
// Generate JSON-LD server-side
const recipeJsonLd = generateRecipeJsonLd(item);
- // Check if English translation exists
- const hasEnglishTranslation = !!(item.translations?.en?.short_name);
- const englishShortName = item.translations?.en?.short_name || '';
+ // For German page: check if English translation exists
+ // For English page: germanShortName is already in item (from API)
+ const hasEnglishTranslation = !isEnglish && !!(item.translations?.en?.short_name);
+ const englishShortName = !isEnglish ? (item.translations?.en?.short_name || '') : '';
+ const germanShortName = isEnglish ? (item.germanShortName || '') : item.short_name;
return {
...item,
@@ -116,5 +124,6 @@ export async function load({ fetch, params, url}) {
recipeJsonLd,
hasEnglishTranslation,
englishShortName,
+ germanShortName,
};
}
diff --git a/src/routes/[recipeLang]/add/+page.server.ts b/src/routes/[recipeLang]/add/+page.server.ts
new file mode 100644
index 0000000..25fa1d1
--- /dev/null
+++ b/src/routes/[recipeLang]/add/+page.server.ts
@@ -0,0 +1,13 @@
+import { redirect } from "@sveltejs/kit";
+
+export async function load({locals, params}) {
+ // Add is German-only - redirect to German version
+ if (params.recipeLang === 'recipes') {
+ throw redirect(301, '/rezepte/add');
+ }
+
+ const session = await locals.auth();
+ return {
+ user: session?.user
+ };
+};
diff --git a/src/routes/rezepte/add/+page.svelte b/src/routes/[recipeLang]/add/+page.svelte
similarity index 100%
rename from src/routes/rezepte/add/+page.svelte
rename to src/routes/[recipeLang]/add/+page.svelte
diff --git a/src/routes/rezepte/category/+page.svelte b/src/routes/[recipeLang]/category/+page.svelte
similarity index 59%
rename from src/routes/rezepte/category/+page.svelte
rename to src/routes/[recipeLang]/category/+page.svelte
index ced3168..5bf5280 100644
--- a/src/routes/rezepte/category/+page.svelte
+++ b/src/routes/[recipeLang]/category/+page.svelte
@@ -1,9 +1,14 @@
-