From 63b9ff46843c68ef73644ad8d72d425096158223 Mon Sep 17 00:00:00 2001 From: Till JS Date: Mon, 27 Apr 2026 18:17:08 +0200 Subject: [PATCH] i18n(comic+guides+cards): translate 3 detail/progress views via $_() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - comic/views/DetailView: route through comic.detail.* + dynamic comic.styles.; drop unused STYLE_LABELS import - guides/views/DetailView: route through guides.detail.* + dynamic guides.categories. / guides.difficulties.; drop unused DIFFICULTY_LABELS + Section type - cards/progress/+page: route through cards.progress.* (also fixes pre-existing typos "Fallig"/"Ubersicht"/"Lernsitzungen" via proper translations across all 5 locales) Baseline 961 → 940 (-21). --- .../lib/modules/comic/views/DetailView.svelte | 71 ++++++++++--------- .../modules/guides/views/DetailView.svelte | 70 ++++++++++++------ .../routes/(app)/cards/progress/+page.svelte | 21 +++--- scripts/i18n-hardcoded-baseline.json | 3 - scripts/i18n-missing-baseline.json | 2 + 5 files changed, 99 insertions(+), 68 deletions(-) diff --git a/apps/mana/apps/web/src/lib/modules/comic/views/DetailView.svelte b/apps/mana/apps/web/src/lib/modules/comic/views/DetailView.svelte index 956fc25c7..bb9fa473c 100644 --- a/apps/mana/apps/web/src/lib/modules/comic/views/DetailView.svelte +++ b/apps/mana/apps/web/src/lib/modules/comic/views/DetailView.svelte @@ -15,12 +15,12 @@ import { comicStoriesTable } from '../collections'; import { comicStoriesStore } from '../stores/stories.svelte'; import { useStory } from '../queries'; - import { STYLE_LABELS } from '../constants'; import PanelStrip from '../components/PanelStrip.svelte'; import PanelEditor from '../components/PanelEditor.svelte'; import BatchPanelEditor from '../components/BatchPanelEditor.svelte'; import StoryboardSuggester from '../components/StoryboardSuggester.svelte'; import { encryptRecord } from '$lib/data/crypto'; + import { _ } from 'svelte-i18n'; import type { ComicPanelMeta, LocalComicStory } from '../types'; interface Props { @@ -48,7 +48,8 @@ async function handleDelete() { if (!story) return; - if (!confirm(`Story "${story.title}" wirklich löschen?`)) return; + if (!confirm($_('comic.detail.confirm_delete_story', { values: { title: story.title } }))) + return; await comicStoriesStore.deleteStory(story.id); await goto('/comic'); } @@ -65,12 +66,7 @@ */ async function handleRemovePanel(panelId: string) { if (!story) return; - if ( - !confirm( - 'Panel aus der Story entfernen? Das Bild bleibt in deiner Picture-Galerie und kann dort gelöscht werden.' - ) - ) - return; + if (!confirm($_('comic.detail.confirm_remove_panel'))) return; const existing = await comicStoriesTable.get(story.id); if (!existing) return; @@ -91,20 +87,20 @@ - Comics + {$_('comic.detail.breadcrumb')} {#if !story} {#if story$.loading} -

Lädt…

+

{$_('comic.detail.loading')}

{:else}
-

Story nicht gefunden.

-

Gelöscht oder in einem anderen Space.

+

{$_('comic.detail.not_found')}

+

{$_('comic.detail.not_found_hint')}

{/if} {:else} @@ -115,18 +111,23 @@

{story.title}

- {STYLE_LABELS[story.style].de} + {$_('comic.styles.' + story.style)} - {story.panelImageIds.length} - {story.panelImageIds.length === 1 ? 'Panel' : 'Panels'} + {story.panelImageIds.length === 1 + ? $_('comic.detail.panel_one', { values: { n: story.panelImageIds.length } }) + : $_('comic.detail.panel_other', { values: { n: story.panelImageIds.length } })} {#if story.characterMediaIds.length > 0} · - {story.characterMediaIds.length} Referenz{story.characterMediaIds.length === 1 - ? '' - : 'en'} + {story.characterMediaIds.length === 1 + ? $_('comic.detail.reference_one', { + values: { n: story.characterMediaIds.length }, + }) + : $_('comic.detail.reference_other', { + values: { n: story.characterMediaIds.length }, + })} {/if}
@@ -140,8 +141,12 @@ {/if} @@ -230,7 +237,7 @@ class="flex flex-1 items-center justify-center gap-2 rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground transition-colors hover:bg-muted" > - {story.isArchived ? 'Wieder aktiv' : 'Archivieren'} + {story.isArchived ? $_('comic.detail.unarchive') : $_('comic.detail.archive')} @@ -246,8 +253,8 @@

- Archivierte Story — keine Panel-Generierung möglich, bis - wieder aktiviert. + + {$_('comic.detail.archived_hint')}

{/if} {/if} diff --git a/apps/mana/apps/web/src/lib/modules/guides/views/DetailView.svelte b/apps/mana/apps/web/src/lib/modules/guides/views/DetailView.svelte index 47c08be4f..d1a406b01 100644 --- a/apps/mana/apps/web/src/lib/modules/guides/views/DetailView.svelte +++ b/apps/mana/apps/web/src/lib/modules/guides/views/DetailView.svelte @@ -8,8 +8,9 @@ import type { ViewProps } from '$lib/app-registry'; import { useGuide, useSections, useSteps, useLatestRun, getStepProgress } from '../queries'; import { guidesStore } from '../stores/guides.svelte'; - import { GUIDE_CATEGORIES, DIFFICULTY_LABELS } from '../types'; - import type { Step, Section } from '../types'; + import { GUIDE_CATEGORIES } from '../types'; + import type { Step } from '../types'; + import { _ } from 'svelte-i18n'; let { navigate, goBack, params }: ViewProps = $props(); let guideId = $derived((params.guideId as string) ?? ''); @@ -84,7 +85,8 @@ async function handleDelete() { if (!guide) return; - if (!confirm(`Guide "${guide.title}" wirklich löschen?`)) return; + if (!confirm($_('guides.detail.confirm_delete_guide', { values: { title: guide.title } }))) + return; await guidesStore.deleteGuide(guide.id); goBack(); } @@ -115,26 +117,40 @@ {#if !guide} -
Lade Guide...
+
{$_('guides.detail.loading')}
{:else}
- - + +
{#if editing}
- -
- - + +
{:else} @@ -142,9 +158,11 @@ {@const catInfo = GUIDE_CATEGORIES[guide.category]}
- {catInfo.label} - {DIFFICULTY_LABELS[guide.difficulty]} - {guide.estimatedMinutes} min + {$_('guides.categories.' + guide.category)} + {$_('guides.difficulties.' + guide.difficulty)} + + {$_('guides.detail.minutes', { values: { n: guide.estimatedMinutes } })} +

{guide.title}

{guide.description}

@@ -157,9 +175,11 @@
{#if isComplete} - Abgeschlossen + {$_('guides.detail.completed')} {:else} - {run.completedStepIds.length} / {steps.length} Schritte + {$_('guides.detail.steps_progress', { + values: { done: run.completedStepIds.length, total: steps.length }, + })} {/if} {progress}% @@ -171,11 +191,15 @@ >
{#if isComplete} - + {/if}
{:else if steps.length > 0} - + {/if} @@ -218,7 +242,7 @@ e.key === 'Enter' && addStep(section.id)} /> @@ -234,7 +258,7 @@ newStepTitle = ''; }} > - + Schritt + {$_('guides.detail.add_step')} {/if} @@ -273,7 +297,7 @@ e.key === 'Enter' && addSection()} /> @@ -289,7 +313,7 @@ newSectionTitle = ''; }} > - + Abschnitt + {$_('guides.detail.add_section')} {/if} @@ -308,7 +332,7 @@ e.key === 'Enter' && addStep(null)} /> diff --git a/apps/mana/apps/web/src/routes/(app)/cards/progress/+page.svelte b/apps/mana/apps/web/src/routes/(app)/cards/progress/+page.svelte index 2dab311a4..ccaa516df 100644 --- a/apps/mana/apps/web/src/routes/(app)/cards/progress/+page.svelte +++ b/apps/mana/apps/web/src/routes/(app)/cards/progress/+page.svelte @@ -4,6 +4,7 @@ import { ChartBar } from '@mana/shared-icons'; import type { Deck } from '$lib/modules/cards/types'; import { RoutePage } from '$lib/components/shell'; + import { _ } from 'svelte-i18n'; // Get live query data from layout context const allDecks: { readonly value: Deck[] } = getContext('cardDecks'); @@ -13,29 +14,29 @@ - Fortschritt - Cards - Mana + {$_('cards.progress.page_title_html')}
-

Fortschritt

-

Verfolge deinen Lernfortschritt

+

{$_('cards.progress.heading')}

+

{$_('cards.progress.subtitle')}

{decks.length}
-
Decks
+
{$_('cards.progress.stat_decks')}
{totalCards}
-
Karten gesamt
+
{$_('cards.progress.stat_total_cards')}
0
-
Fallig zur Wiederholung
+
{$_('cards.progress.stat_due')}
@@ -44,14 +45,14 @@

- Decks Ubersicht + {$_('cards.progress.section_overview')}

{#if decks.length === 0}
🎯
-

Noch keine Lernsitzungen.

-

Erstelle ein Deck und beginne zu lernen!

+

{$_('cards.progress.empty_title')}

+

{$_('cards.progress.empty_hint')}

{:else}
@@ -62,7 +63,7 @@
{deck.title}
- {deck.cardCount || 0} Karten + {$_('cards.progress.deck_cards', { values: { n: deck.cardCount || 0 } })}
diff --git a/scripts/i18n-hardcoded-baseline.json b/scripts/i18n-hardcoded-baseline.json index 9992a20a7..d58796609 100644 --- a/scripts/i18n-hardcoded-baseline.json +++ b/scripts/i18n-hardcoded-baseline.json @@ -88,7 +88,6 @@ "apps/mana/apps/web/src/lib/modules/comic/ListView.svelte": 1, "apps/mana/apps/web/src/lib/modules/comic/views/CharactersView.svelte": 1, "apps/mana/apps/web/src/lib/modules/comic/views/DetailCharacterView.svelte": 6, - "apps/mana/apps/web/src/lib/modules/comic/views/DetailView.svelte": 7, "apps/mana/apps/web/src/lib/modules/comic/views/ListView.svelte": 2, "apps/mana/apps/web/src/lib/modules/community/components/ItemCard.svelte": 1, "apps/mana/apps/web/src/lib/modules/community/views/DetailView.svelte": 1, @@ -115,7 +114,6 @@ "apps/mana/apps/web/src/lib/modules/finance/ListView.svelte": 6, "apps/mana/apps/web/src/lib/modules/goals/ListView.svelte": 1, "apps/mana/apps/web/src/lib/modules/guides/ListView.svelte": 1, - "apps/mana/apps/web/src/lib/modules/guides/views/DetailView.svelte": 7, "apps/mana/apps/web/src/lib/modules/habits/components/HabitDetail.svelte": 5, "apps/mana/apps/web/src/lib/modules/habits/components/HabitForm.svelte": 3, "apps/mana/apps/web/src/lib/modules/habits/ListView.svelte": 5, @@ -211,7 +209,6 @@ "apps/mana/apps/web/src/routes/(app)/cards/decks/[id]/+page.svelte": 6, "apps/mana/apps/web/src/routes/(app)/cards/decks/+page.svelte": 3, "apps/mana/apps/web/src/routes/(app)/cards/explore/+page.svelte": 1, - "apps/mana/apps/web/src/routes/(app)/cards/progress/+page.svelte": 7, "apps/mana/apps/web/src/routes/(app)/chat/+page.svelte": 2, "apps/mana/apps/web/src/routes/(app)/chat/archive/+page.svelte": 2, "apps/mana/apps/web/src/routes/(app)/chat/templates/+page.svelte": 6, diff --git a/scripts/i18n-missing-baseline.json b/scripts/i18n-missing-baseline.json index a6e3aa944..b749044b4 100644 --- a/scripts/i18n-missing-baseline.json +++ b/scripts/i18n-missing-baseline.json @@ -8,10 +8,12 @@ "apps/mana/apps/web/src/lib/modules/ai-workbench/ListView.svelte": 1, "apps/mana/apps/web/src/lib/modules/broadcast/ListView.svelte": 1, "apps/mana/apps/web/src/lib/modules/broadcast/views/DetailView.svelte": 1, + "apps/mana/apps/web/src/lib/modules/comic/views/DetailView.svelte": 1, "apps/mana/apps/web/src/lib/modules/credits/ListView.svelte": 1, "apps/mana/apps/web/src/lib/modules/dreams/ListView.svelte": 1, "apps/mana/apps/web/src/lib/modules/dreams/views/SymbolDetailView.svelte": 1, "apps/mana/apps/web/src/lib/modules/firsts/ListView.svelte": 2, + "apps/mana/apps/web/src/lib/modules/guides/views/DetailView.svelte": 2, "apps/mana/apps/web/src/lib/modules/invoices/components/StatusBadge.svelte": 1, "apps/mana/apps/web/src/lib/modules/invoices/constants.ts": 1, "apps/mana/apps/web/src/lib/modules/invoices/ListView.svelte": 1,