diff --git a/apps/mana/apps/web/src/lib/modules/comic/components/CharacterPicker.svelte b/apps/mana/apps/web/src/lib/modules/comic/components/CharacterPicker.svelte
index e128b9462..9049db14f 100644
--- a/apps/mana/apps/web/src/lib/modules/comic/components/CharacterPicker.svelte
+++ b/apps/mana/apps/web/src/lib/modules/comic/components/CharacterPicker.svelte
@@ -18,6 +18,7 @@
import { useAllGarments } from '$lib/modules/wardrobe/queries';
import { garmentPhotoUrl } from '$lib/modules/wardrobe/api/media-url';
import type { Garment } from '$lib/modules/wardrobe/types';
+ import { _ } from 'svelte-i18n';
interface Props {
value: string[];
@@ -108,33 +109,30 @@
- Protagonist
+ {$_('comic.picker.section_title')}
- Dein Gesicht ist Pflicht. Body-Ref und bis zu {MAX_GARMENTS} Kostüm-Fotos sind optional — klicke
- ein Bild oder das ✕, um es wieder zu entfernen.
+ {$_('comic.picker.section_hint', { values: { max: MAX_GARMENTS } })}
-
+
{#if face?.publicUrl}
- Pflicht
+ {$_('comic.picker.face_required_badge')}
{:else}
@@ -142,10 +140,12 @@
class="flex h-20 w-20 flex-col items-center justify-center gap-1 rounded-md border border-dashed border-border bg-muted/50 text-[10px] text-muted-foreground"
>
-
Face fehlt
+
{$_('comic.picker.face_missing')}
{/if}
-
Face
+
{$_('comic.picker.face_label')}
+ {@html $_('comic.picker.garment_picker_empty_html')}
{:else}
@@ -307,14 +309,13 @@
{#if !hasFace}
- Kein Gesichtsbild in diesem Space. Lade eins in
-
Profil → Bilder
- hoch — ohne Face-Ref kein Comic.
+
+ {@html $_('comic.picker.no_face_alert_html')}
{:else if !hasBody}
- Tipp: Ein Body-Ref hilft, wenn der Comic Ganzkörper-Panels zeigen
- soll.
+
+ {$_('comic.picker.body_tip')}
{/if}
diff --git a/apps/mana/apps/web/src/lib/modules/comic/views/DetailCharacterView.svelte b/apps/mana/apps/web/src/lib/modules/comic/views/DetailCharacterView.svelte
index ae7744b33..805e85ae8 100644
--- a/apps/mana/apps/web/src/lib/modules/comic/views/DetailCharacterView.svelte
+++ b/apps/mana/apps/web/src/lib/modules/comic/views/DetailCharacterView.svelte
@@ -8,9 +8,9 @@
import { ArrowLeft, Archive, Heart, Plus, Sparkle, Trash } from '@mana/shared-icons';
import { comicCharactersStore } from '../stores/characters.svelte';
import { useCharacter } from '../queries';
- import { STYLE_LABELS } from '../constants';
import VariantTile from '../components/VariantTile.svelte';
import CharacterBuilder from '../components/CharacterBuilder.svelte';
+ import { _ } from 'svelte-i18n';
interface Props {
id: string;
@@ -36,7 +36,14 @@
async function handleDelete() {
if (!character) return;
- if (!confirm(`Character "${character.name}" wirklich löschen?`)) return;
+ if (
+ !confirm(
+ $_('comic.character_detail.confirm_delete_character', {
+ values: { name: character.name },
+ })
+ )
+ )
+ return;
await comicCharactersStore.deleteCharacter(character.id);
await goto('/comic/character');
}
@@ -48,12 +55,7 @@
async function handleRemove(variantId: string) {
if (!character) return;
- if (
- !confirm(
- 'Variante aus dem Character entfernen? Das Bild bleibt in deiner Picture-Galerie und kann dort gelöscht werden.'
- )
- )
- return;
+ if (!confirm($_('comic.character_detail.confirm_remove_variant'))) return;
await comicCharactersStore.removeVariant(character.id, variantId);
}
@@ -63,20 +65,24 @@
-
Comic · Characters
+
{$_('comic.character_detail.breadcrumb')}
{#if !character}
{#if character$.loading}
-
Lädt…
+
{$_('comic.character_detail.loading')}
{:else}
-
Character nicht gefunden.
-
Gelöscht oder in einem anderen Space.
+
+ {$_('comic.character_detail.not_found')}
+
+
+ {$_('comic.character_detail.not_found_hint')}
+
{/if}
{:else}
@@ -87,15 +93,20 @@
{character.name}
- {STYLE_LABELS[character.style].de}
+ {$_('comic.styles.' + character.style)}
- {character.variantMediaIds.length}
- {character.variantMediaIds.length === 1 ? 'Variante' : 'Varianten'}
+ {character.variantMediaIds.length === 1
+ ? $_('comic.character_detail.variant_one', {
+ values: { n: character.variantMediaIds.length },
+ })
+ : $_('comic.character_detail.variant_other', {
+ values: { n: character.variantMediaIds.length },
+ })}
{#if !character.pinnedVariantId && character.variantMediaIds.length > 0}
Pin offen {$_('comic.character_detail.pin_open')}
{/if}
@@ -103,8 +114,12 @@
- Prompt-Add:
+ {$_('comic.character_detail.prompt_add_label')}
{character.addPrompt}
{/if}
@@ -129,7 +144,7 @@
- Varianten
+ {$_('comic.character_detail.section_variants')}
{#if !showBuilder && !character.isArchived}
- Mehr Varianten
+ {$_('comic.character_detail.action_more_variants')}
{/if}
@@ -147,10 +162,12 @@
-
Noch keine Varianten.
+
+ {$_('comic.character_detail.empty_variants_title')}
+
- Klick oben rechts auf + Mehr Varianten , um die
- ersten 4 zu generieren.
+
+ {@html $_('comic.character_detail.empty_variants_hint_html')}
{:else}
@@ -190,7 +207,9 @@
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"
>
- {character.isArchived ? 'Wieder aktiv' : 'Archivieren'}
+ {character.isArchived
+ ? $_('comic.character_detail.unarchive')
+ : $_('comic.character_detail.archive')}
- Löschen
+ {$_('comic.character_detail.delete')}
@@ -206,8 +225,8 @@
- Archivierter Character — keine Variant-Generierung möglich,
- bis wieder aktiviert.
+
+ {$_('comic.character_detail.archived_hint')}
{/if}
{/if}
diff --git a/apps/mana/apps/web/src/lib/modules/quiz/PlayView.svelte b/apps/mana/apps/web/src/lib/modules/quiz/PlayView.svelte
index add3aee9e..959736793 100644
--- a/apps/mana/apps/web/src/lib/modules/quiz/PlayView.svelte
+++ b/apps/mana/apps/web/src/lib/modules/quiz/PlayView.svelte
@@ -8,6 +8,7 @@
import { attemptsStore } from './stores/attempts.svelte';
import type { AttemptAnswer } from './types';
import { ArrowLeft, Check, X } from '@mana/shared-icons';
+ import { _ } from 'svelte-i18n';
interface Props {
quizId: string;
@@ -108,8 +109,9 @@
{#if !quiz}
-
Quiz nicht gefunden.
+
{$_('quiz.play_view.empty_quiz')}
{:else if total === 0}
-
Dieses Quiz hat noch keine Fragen.
+
{$_('quiz.play_view.empty_no_questions')}
{:else if finished}
{scorePct}%
- {correctCount} von {total} richtig
+ {$_('quiz.play_view.score_summary', {
+ values: { correct: correctCount, total },
+ })}
{#each questions as q, i (q.id)}
@@ -142,15 +148,18 @@
{#if q.type === 'text'}
- Deine Antwort: {ans?.textAnswer || '—'}
+ {$_('quiz.play_view.review_your_answer')}{ans?.textAnswer || $_('quiz.play_view.placeholder_review_dash')}
{#if !ans?.correct}
- Richtig: {q.options[0]?.text}
+
+ {$_('quiz.play_view.review_correct')}{q.options[0]?.text}
+
{/if}
{:else}
- Richtig:
-
+ {$_('quiz.play_view.review_correct')}
{q.options
.filter((o) => o.isCorrect)
.map((o) => o.text)
@@ -162,8 +171,10 @@
{/each}
- goto('/quiz')}>Zurück zur Liste
- Nochmal spielen
+ goto('/quiz')}
+ >{$_('quiz.play_view.action_back_to_list')}
+ {$_('quiz.play_view.action_replay')}
{:else if current}
@@ -176,14 +187,16 @@
type="text"
bind:value={textInput}
disabled={revealed}
- placeholder="Deine Antwort"
+ placeholder={$_('quiz.play_view.placeholder_text_answer')}
/>
{#if revealed}
{#if answers.at(-1)?.correct}
- Richtig!
+
+ {$_('quiz.play_view.feedback_correct')}
{:else}
- Richtige Antwort:
+
+ {$_('quiz.play_view.feedback_incorrect_label')}
{current.options[0]?.text}
{/if}
@@ -221,11 +234,13 @@
{#if !revealed}
- Antwort prüfen
+ {$_('quiz.play_view.action_check')}
{:else}
- {currentIndex + 1 >= total ? 'Ergebnis ansehen' : 'Weiter'}
+ {currentIndex + 1 >= total
+ ? $_('quiz.play_view.action_view_result')
+ : $_('quiz.play_view.action_next')}
{/if}
diff --git a/scripts/i18n-hardcoded-baseline.json b/scripts/i18n-hardcoded-baseline.json
index cb7491e35..10667e865 100644
--- a/scripts/i18n-hardcoded-baseline.json
+++ b/scripts/i18n-hardcoded-baseline.json
@@ -74,7 +74,6 @@
"apps/mana/apps/web/src/lib/modules/comic/components/BatchPanelEditor.svelte": 2,
"apps/mana/apps/web/src/lib/modules/comic/components/CharacterBuilder.svelte": 4,
"apps/mana/apps/web/src/lib/modules/comic/components/CharacterCard.svelte": 1,
- "apps/mana/apps/web/src/lib/modules/comic/components/CharacterPicker.svelte": 6,
"apps/mana/apps/web/src/lib/modules/comic/components/CharacterRefPicker.svelte": 2,
"apps/mana/apps/web/src/lib/modules/comic/components/PanelEditor.svelte": 3,
"apps/mana/apps/web/src/lib/modules/comic/components/PanelModelPicker.svelte": 1,
@@ -86,7 +85,6 @@
"apps/mana/apps/web/src/lib/modules/comic/components/VariantTile.svelte": 1,
"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/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,
@@ -150,7 +148,6 @@
"apps/mana/apps/web/src/lib/modules/questions/ListView.svelte": 1,
"apps/mana/apps/web/src/lib/modules/questions/views/DetailView.svelte": 6,
"apps/mana/apps/web/src/lib/modules/quiz/ListView.svelte": 5,
- "apps/mana/apps/web/src/lib/modules/quiz/PlayView.svelte": 6,
"apps/mana/apps/web/src/lib/modules/quotes/views/DetailView.svelte": 2,
"apps/mana/apps/web/src/lib/modules/research-lab/components/CompareColumn.svelte": 2,
"apps/mana/apps/web/src/lib/modules/research-lab/ListView.svelte": 4,
diff --git a/scripts/i18n-missing-baseline.json b/scripts/i18n-missing-baseline.json
index 218f64be2..630752d2c 100644
--- a/scripts/i18n-missing-baseline.json
+++ b/scripts/i18n-missing-baseline.json
@@ -8,6 +8,7 @@
"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/DetailCharacterView.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,