diff --git a/src/routes/+error.svelte b/src/routes/+error.svelte
index 52312a0..4d00b13 100644
--- a/src/routes/+error.svelte
+++ b/src/routes/+error.svelte
@@ -10,36 +10,45 @@
let session = $derived($page.data?.session);
let user = $derived(session?.user);
- // Get Bible quote from SSR via handleError hook
+ // Get Bible quote and language from SSR via handleError hook
let bibleQuote = $derived($page.error?.bibleQuote);
+ let isEnglish = $derived($page.error?.lang === 'en');
function getErrorTitle(status) {
+ if (isEnglish) {
+ switch (status) {
+ case 401: return 'Login Required';
+ case 403: return 'Access Denied';
+ case 404: return 'Page Not Found';
+ case 500: return 'Server Error';
+ default: return 'Error';
+ }
+ }
switch (status) {
- case 401:
- return 'Anmeldung erforderlich';
- case 403:
- return 'Zugriff verweigert';
- case 404:
- return 'Seite nicht gefunden';
- case 500:
- return 'Serverfehler';
- default:
- return 'Fehler';
+ case 401: return 'Anmeldung erforderlich';
+ case 403: return 'Zugriff verweigert';
+ case 404: return 'Seite nicht gefunden';
+ case 500: return 'Serverfehler';
+ default: return 'Fehler';
}
}
function getErrorDescription(status) {
+ if (isEnglish) {
+ switch (status) {
+ case 401: return 'You must be logged in to access this page.';
+ case 403: return 'You do not have permission for this area.';
+ case 404: return 'The requested page could not be found.';
+ case 500: return 'An unexpected error occurred. Please try again later.';
+ default: return 'An unexpected error occurred.';
+ }
+ }
switch (status) {
- case 401:
- return 'Du musst angemeldet sein, um auf diese Seite zugreifen zu können.';
- case 403:
- return 'Du hast keine Berechtigung für diesen Bereich.';
- case 404:
- return 'Die angeforderte Seite konnte nicht gefunden werden.';
- case 500:
- return 'Es ist ein unerwarteter Fehler aufgetreten. Bitte versuche es später erneut.';
- default:
- return 'Es ist ein unerwarteter Fehler aufgetreten.';
+ case 401: return 'Du musst angemeldet sein, um auf diese Seite zugreifen zu können.';
+ case 403: return 'Du hast keine Berechtigung für diesen Bereich.';
+ case 404: return 'Die angeforderte Seite konnte nicht gefunden werden.';
+ case 500: return 'Es ist ein unerwarteter Fehler aufgetreten. Bitte versuche es später erneut.';
+ default: return 'Es ist ein unerwarteter Fehler aufgetreten.';
}
}
@@ -96,7 +105,7 @@
- Fehler {status}
+ {isEnglish ? 'Error' : 'Fehler'} {status}
- „{bibleQuote.text}"
+ {isEnglish ? '"' : '„'}{bibleQuote.text}{isEnglish ? '"' : '"'}
— {bibleQuote.reference}
diff --git a/src/routes/[faithLang=faithLang]/[rosary=rosaryLang]/+page.server.ts b/src/routes/[faithLang=faithLang]/[rosary=rosaryLang]/+page.server.ts
index d2aca80..cd9ed89 100644
--- a/src/routes/[faithLang=faithLang]/[rosary=rosaryLang]/+page.server.ts
+++ b/src/routes/[faithLang=faithLang]/[rosary=rosaryLang]/+page.server.ts
@@ -1,4 +1,4 @@
-import { mysteryVerseData } from '$lib/data/mysteryVerseData';
+import { mysteryVerseDataDe, mysteryVerseDataEn } from '$lib/data/mysteryVerseData';
import type { PageServerLoad } from './$types';
interface StreakData {
@@ -36,7 +36,7 @@ function getMysteryForWeekday(date: Date, includeLuminous: boolean): string {
}
}
-export const load: PageServerLoad = async ({ url, fetch, locals }) => {
+export const load: PageServerLoad = async ({ url, fetch, locals, params }) => {
const session = await locals.auth();
// Read toggle/mystery state from URL search params (for no-JS progressive enhancement)
@@ -76,7 +76,7 @@ export const load: PageServerLoad = async ({ url, fetch, locals }) => {
}
return {
- mysteryDescriptions: mysteryVerseData,
+ mysteryDescriptions: params.faithLang === 'faith' ? mysteryVerseDataEn : mysteryVerseDataDe,
streakData,
initialMystery,
todaysMystery,
diff --git a/src/routes/[faithLang=faithLang]/[rosary=rosaryLang]/+page.svelte b/src/routes/[faithLang=faithLang]/[rosary=rosaryLang]/+page.svelte
index 48c6144..7012368 100644
--- a/src/routes/[faithLang=faithLang]/[rosary=rosaryLang]/+page.svelte
+++ b/src/routes/[faithLang=faithLang]/[rosary=rosaryLang]/+page.svelte
@@ -1884,5 +1884,5 @@ h1 {
{#if showModal}
- showModal = false} />
+ showModal = false} />
{/if}
diff --git a/src/routes/api/glaube/bibel/[reference]/+server.ts b/src/routes/api/[faithLang=faithLang]/bibel/[reference]/+server.ts
similarity index 70%
rename from src/routes/api/glaube/bibel/[reference]/+server.ts
rename to src/routes/api/[faithLang=faithLang]/bibel/[reference]/+server.ts
index c1d60dd..965bfa8 100644
--- a/src/routes/api/glaube/bibel/[reference]/+server.ts
+++ b/src/routes/api/[faithLang=faithLang]/bibel/[reference]/+server.ts
@@ -1,6 +1,12 @@
import { json, error } from '@sveltejs/kit';
import type { RequestHandler } from './$types';
import { lookupReference } from '$lib/server/bible';
+import { resolve } from 'path';
+
+const tsvFiles: Record = {
+ glaube: 'static/allioli.tsv',
+ faith: 'static/drb.tsv'
+};
export const GET: RequestHandler = async ({ params }) => {
const reference = params.reference;
@@ -9,8 +15,10 @@ export const GET: RequestHandler = async ({ params }) => {
return error(400, 'Missing reference parameter');
}
+ const tsvPath = resolve(tsvFiles[params.faithLang]);
+
try {
- const result = lookupReference(reference);
+ const result = lookupReference(reference, tsvPath);
if (!result) {
return error(404, 'No verses found for the given reference');
diff --git a/src/routes/api/glaube/bibel/zufallszitat/+server.ts b/src/routes/api/[faithLang=faithLang]/bibel/zufallszitat/+server.ts
similarity index 69%
rename from src/routes/api/glaube/bibel/zufallszitat/+server.ts
rename to src/routes/api/[faithLang=faithLang]/bibel/zufallszitat/+server.ts
index 83a16c2..554f3af 100644
--- a/src/routes/api/glaube/bibel/zufallszitat/+server.ts
+++ b/src/routes/api/[faithLang=faithLang]/bibel/zufallszitat/+server.ts
@@ -1,5 +1,6 @@
import { json, error } from '@sveltejs/kit';
import type { RequestHandler } from './$types';
+import { resolve } from 'path';
interface BibleVerse {
bookName: string;
@@ -10,23 +11,27 @@ interface BibleVerse {
text: string;
}
-// Cache for parsed verses to avoid reading file repeatedly
-let cachedVerses: BibleVerse[] | null = null;
+const tsvFiles: Record = {
+ glaube: '/allioli.tsv',
+ faith: '/drb.tsv'
+};
-async function loadVerses(fetch: typeof globalThis.fetch): Promise {
- if (cachedVerses) {
- return cachedVerses;
- }
+// Cache for parsed verses per language
+const versesCache = new Map();
+
+async function loadVerses(fetch: typeof globalThis.fetch, tsvFile: string): Promise {
+ const cached = versesCache.get(tsvFile);
+ if (cached) return cached;
try {
- const response = await fetch('/allioli.tsv');
+ const response = await fetch(tsvFile);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const content = await response.text();
const lines = content.trim().split('\n');
- cachedVerses = lines.map(line => {
+ const verses = lines.map(line => {
const [bookName, abbreviation, bookNumber, chapter, verseNumber, text] = line.split('\t');
return {
bookName,
@@ -38,7 +43,8 @@ async function loadVerses(fetch: typeof globalThis.fetch): Promise
};
});
- return cachedVerses;
+ versesCache.set(tsvFile, verses);
+ return verses;
} catch (err) {
console.error('Error loading Bible verses:', err);
throw new Error('Failed to load Bible verses');
@@ -54,9 +60,11 @@ function formatVerse(verse: BibleVerse): string {
return `${verse.bookName} ${verse.chapter}:${verse.verseNumber}`;
}
-export const GET: RequestHandler = async ({ fetch }) => {
+export const GET: RequestHandler = async ({ fetch, params }) => {
+ const tsvFile = tsvFiles[params.faithLang];
+
try {
- const verses = await loadVerses(fetch);
+ const verses = await loadVerses(fetch, tsvFile);
const randomVerse = getRandomVerse(verses);
return json({