From 84bc904775b13e5ecd4e34e3208b127dc8421263 Mon Sep 17 00:00:00 2001 From: Till JS Date: Mon, 27 Apr 2026 12:42:11 +0200 Subject: [PATCH] =?UTF-8?q?i18n(quiz):=20translate=20EditView=20via=20$=5F?= =?UTF-8?q?()=20=E2=80=94=20header,=20meta=20inputs,=20question=20list,=20?= =?UTF-8?q?new-question=20form?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Header: back-button aria + "Quiz" label, Spielen play button - Empty: "Quiz nicht gefunden." - Meta-section: Titel/Beschreibung/Kategorie/Tags placeholders, Sichtbarkeit row label, untitled fallback - Question list: "Fragen ({n})" heading, empty state, type-pill, edit/delete title+aria, "Frage löschen?" confirm - Question types routed through $_('quiz.question_types.' + q.type); QUESTION_TYPE_LABELS constant kept in types.ts for non-Svelte callers - New-question section: edit/new heading, cancel button, type select (4 options), question/correct-answer/expected-input fields, options-label (multi/single variant), correct-toggle title+aria, "Antwort {n}" placeholder, remove aria, "Antwort hinzufügen", explanation field, save/add submit button - truefalse default options ("Wahr"/"Falsch") now i18n'd Baselines: hardcoded 1218 → 1205 (13 cleared); missing-keys baseline +1 (quiz.question_types.* dynamic key). Co-Authored-By: Claude Opus 4.7 (1M context) --- .../web/src/lib/modules/quiz/EditView.svelte | 106 +++++++++++------- scripts/i18n-hardcoded-baseline.json | 1 - scripts/i18n-missing-baseline.json | 1 + 3 files changed, 64 insertions(+), 44 deletions(-) diff --git a/apps/mana/apps/web/src/lib/modules/quiz/EditView.svelte b/apps/mana/apps/web/src/lib/modules/quiz/EditView.svelte index a53145d6a..80b80bdb9 100644 --- a/apps/mana/apps/web/src/lib/modules/quiz/EditView.svelte +++ b/apps/mana/apps/web/src/lib/modules/quiz/EditView.svelte @@ -6,10 +6,10 @@ import { goto } from '$app/navigation'; import { useQuiz, useQuestions, blankOption } from './queries'; import { quizzesStore } from './stores/quizzes.svelte'; - import { QUESTION_TYPE_LABELS } from './types'; import type { QuestionType, QuestionOption, QuizQuestion } from './types'; import { ArrowLeft, Plus, Trash, Check, Play, PencilSimple, X } from '@mana/shared-icons'; import { VisibilityPicker, type VisibilityLevel } from '@mana/shared-privacy'; + import { _ } from 'svelte-i18n'; interface Props { quizId: string; @@ -42,7 +42,7 @@ async function saveMeta() { if (!quiz) return; await quizzesStore.updateQuiz(quiz.id, { - title: metaTitle.trim() || 'Unbenannt', + title: metaTitle.trim() || $_('quiz.edit_view.untitled_fallback'), description: metaDescription.trim() || null, category: metaCategory.trim() || null, tags: metaTags @@ -71,8 +71,8 @@ function defaultOptions(type: QuestionType): QuestionOption[] { if (type === 'truefalse') { return [ - { id: 't', text: 'Wahr', isCorrect: true }, - { id: 'f', text: 'Falsch', isCorrect: false }, + { id: 't', text: $_('quiz.edit_view.truefalse_true'), isCorrect: true }, + { id: 'f', text: $_('quiz.edit_view.truefalse_false'), isCorrect: false }, ]; } if (type === 'text') return []; @@ -166,7 +166,7 @@ } async function deleteQuestion(id: string) { - if (!confirm('Frage löschen?')) return; + if (!confirm($_('quiz.edit_view.confirm_delete_question'))) return; await quizzesStore.deleteQuestion(id); } @@ -181,8 +181,9 @@
- {#if quiz} {/if}
{#if !quiz} -

Quiz nicht gefunden.

+

{$_('quiz.edit_view.empty_quiz')}

{:else}
@@ -219,18 +221,18 @@ type="text" bind:value={metaCategory} onblur={saveMeta} - placeholder="Kategorie" + placeholder={$_('quiz.edit_view.placeholder_category')} />
- Sichtbarkeit + {$_('quiz.edit_view.label_visibility')}
-

Fragen ({questions.length})

+

{$_('quiz.edit_view.section_questions', { values: { n: questions.length } })}

{#if questions.length === 0} -

Noch keine Fragen — füge unten eine hinzu.

+

{$_('quiz.edit_view.empty_questions')}

{:else}
    {#each questions as q, i (q.id)}
  1. {i + 1} - {QUESTION_TYPE_LABELS[q.type]} + {$_('quiz.question_types.' + q.type)} {/if}
    {#if newType === 'text'} {:else}
    - Antworten {newType === 'multi' ? '(mehrere richtig möglich)' : '(eine richtig)'} + {newType === 'multi' + ? $_('quiz.edit_view.options_label_multi') + : $_('quiz.edit_view.options_label_single')} {#each newOptions as opt, i (opt.id)}
    {/if}
    {/if}
diff --git a/scripts/i18n-hardcoded-baseline.json b/scripts/i18n-hardcoded-baseline.json index 71552c8c8..dd610f43f 100644 --- a/scripts/i18n-hardcoded-baseline.json +++ b/scripts/i18n-hardcoded-baseline.json @@ -170,7 +170,6 @@ "apps/mana/apps/web/src/lib/modules/profile/MeImagesView.svelte": 2, "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/EditView.svelte": 13, "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, diff --git a/scripts/i18n-missing-baseline.json b/scripts/i18n-missing-baseline.json index d3803708e..c49243b78 100644 --- a/scripts/i18n-missing-baseline.json +++ b/scripts/i18n-missing-baseline.json @@ -15,6 +15,7 @@ "apps/mana/apps/web/src/lib/modules/library/views/DetailView.svelte": 3, "apps/mana/apps/web/src/lib/modules/period/ListView.svelte": 1, "apps/mana/apps/web/src/lib/modules/plants/ListView.svelte": 5, + "apps/mana/apps/web/src/lib/modules/quiz/EditView.svelte": 1, "apps/mana/apps/web/src/lib/modules/quotes/components/QuoteCard.svelte": 4, "apps/mana/apps/web/src/lib/modules/recipes/ListView.svelte": 1, "apps/mana/apps/web/src/lib/modules/times/components/EntryForm.svelte": 6,