From 79f4dbb1011745680bc3d51afbc17a14837363d9 Mon Sep 17 00:00:00 2001 From: Alexander Bocken Date: Fri, 1 May 2026 14:03:52 +0200 Subject: [PATCH] i18n(common): bootstrap shared namespace + migrate top-level UI Add a per-locale common dictionary at src/lib/i18n/common/{de,en}.ts and the shim src/lib/js/commonI18n.ts. Migrate inline lang ternaries on the homepage (welcome/sections/links), OfflineSyncButton (all label ternaries), DatePicker (today/select date), ErrorView (Error/Fehler eyebrow), and UserHeader (login aria/title) to use the shared dict. The long marketing intro paragraphs on the homepage stay inline since they're one-shot content with no drift risk and don't benefit from per-key extraction. Bump site version to 1.57.0 (new namespace). --- package.json | 2 +- src/lib/components/DatePicker.svelte | 9 +++-- src/lib/components/ErrorView.svelte | 4 ++- src/lib/components/OfflineSyncButton.svelte | 16 +++++---- src/lib/components/UserHeader.svelte | 6 ++-- src/lib/i18n/common/de.ts | 37 +++++++++++++++++++++ src/lib/i18n/common/en.ts | 37 +++++++++++++++++++++ src/lib/js/commonI18n.ts | 19 +++++++++++ src/routes/(main)/+page.svelte | 28 ++++++++-------- 9 files changed, 131 insertions(+), 27 deletions(-) create mode 100644 src/lib/i18n/common/de.ts create mode 100644 src/lib/i18n/common/en.ts create mode 100644 src/lib/js/commonI18n.ts diff --git a/package.json b/package.json index a2884450..6e162df9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homepage", - "version": "1.56.2", + "version": "1.57.0", "private": true, "type": "module", "scripts": { diff --git a/src/lib/components/DatePicker.svelte b/src/lib/components/DatePicker.svelte index 1468969d..323cfadc 100644 --- a/src/lib/components/DatePicker.svelte +++ b/src/lib/components/DatePicker.svelte @@ -2,7 +2,10 @@ import ChevronLeft from '@lucide/svelte/icons/chevron-left'; import ChevronRight from '@lucide/svelte/icons/chevron-right'; import Calendar from '@lucide/svelte/icons/calendar'; + import { m } from '$lib/js/commonI18n'; + /** @typedef {import('$lib/js/commonI18n').CommonLang} CommonLang */ let { value = $bindable(''), lang = 'en', min = '', max = '' } = $props(); + const t = $derived(m[/** @type {CommonLang} */ (lang)]); let open = $state(false); /** @type {HTMLDivElement | null} */ @@ -35,8 +38,8 @@ const todayStr = new Date().toISOString().slice(0, 10); const displayDate = $derived.by(() => { - if (!value) return lang === 'en' ? 'Select date' : 'Datum wählen'; - if (value === todayStr) return lang === 'en' ? 'Today' : 'Heute'; + if (!value) return t.select_date; + if (value === todayStr) return t.today; const d = new Date(value + 'T12:00:00'); return d.toLocaleDateString(lang === 'de' ? 'de-DE' : 'en-US', { weekday: 'short', month: 'short', day: 'numeric' }); }); @@ -182,7 +185,7 @@ {#if value !== todayStr} {/if} diff --git a/src/lib/components/ErrorView.svelte b/src/lib/components/ErrorView.svelte index 1b1f0c11..b67f3089 100644 --- a/src/lib/components/ErrorView.svelte +++ b/src/lib/components/ErrorView.svelte @@ -5,6 +5,7 @@ import SearchX from '@lucide/svelte/icons/search-x'; import TriangleAlert from '@lucide/svelte/icons/triangle-alert'; import CircleAlert from '@lucide/svelte/icons/circle-alert'; + import { m } from '$lib/js/commonI18n'; interface BibleQuote { text: string; reference: string; @@ -43,6 +44,7 @@ } let Icon = $derived(icon ?? defaultIcon(status)); + const t = $derived(m[isEnglish ? 'en' : 'de']); let openQuote = $derived(isEnglish ? '\u201C' : '\u201E'); let closeQuote = $derived(isEnglish ? '\u201D' : '\u201C'); @@ -52,7 +54,7 @@
diff --git a/src/lib/components/OfflineSyncButton.svelte b/src/lib/components/OfflineSyncButton.svelte index 549c84d9..f65bfdc9 100644 --- a/src/lib/components/OfflineSyncButton.svelte +++ b/src/lib/components/OfflineSyncButton.svelte @@ -1,20 +1,22 @@