#!/usr/bin/env node /** * Script zum Erstellen von sprachspezifischem Content für Bisaya-Kurse * * Verwendung: * node backend/scripts/create-bisaya-course-content.js * * Erstellt Grammatik-Übungen für alle Lektionen in Bisaya-Kursen basierend auf dem Thema der Lektion. */ import { sequelize } from '../utils/sequelize.js'; import VocabCourseLesson from '../models/community/vocab_course_lesson.js'; import VocabGrammarExercise from '../models/community/vocab_grammar_exercise.js'; import VocabCourse from '../models/community/vocab_course.js'; import User from '../models/community/user.js'; import { BISAYA_PHASE3_DIDACTICS } from './bisaya-course-phase3-extension.js'; import { BISAYA_PHASE4_DIDACTICS } from './bisaya-course-phase4-extension.js'; import { BISAYA_PHASE5_DIDACTICS } from './bisaya-course-phase5-extension.js'; function withTypeName(exerciseTypeName, exercise) { return { ...exercise, exerciseTypeName }; } const GENERATED_BISAYA_DIDACTICS = { ...BISAYA_PHASE3_DIDACTICS, ...BISAYA_PHASE4_DIDACTICS, ...BISAYA_PHASE5_DIDACTICS }; const GENERIC_DISTRACTOR_PATTERNS = Array.from(new Set( Object.values(GENERATED_BISAYA_DIDACTICS) .flatMap((entry) => Array.isArray(entry?.corePatterns) ? entry.corePatterns : []) .map((pattern) => String(pattern || '').trim()) .filter(Boolean) )).slice(0, 200); function normalizeText(value) { return String(value || '') .trim() .replace(/\s+/g, ' '); } function simpleHash(value) { return Array.from(String(value || '')).reduce((sum, char) => sum + char.charCodeAt(0), 0); } function rotateArray(values, offset) { if (!Array.isArray(values) || values.length === 0) return []; const normalizedOffset = ((offset % values.length) + values.length) % values.length; return values.slice(normalizedOffset).concat(values.slice(0, normalizedOffset)); } function getLessonDidactics(lesson) { const staticDidactics = GENERATED_BISAYA_DIDACTICS[lesson.title] || {}; const learningGoals = Array.isArray(lesson.learningGoals) ? lesson.learningGoals : (staticDidactics.learningGoals || []); const corePatterns = Array.isArray(lesson.corePatterns) ? lesson.corePatterns : (staticDidactics.corePatterns || []); const grammarFocus = Array.isArray(lesson.grammarFocus) ? lesson.grammarFocus : (staticDidactics.grammarFocus || []); const speakingPrompts = Array.isArray(lesson.speakingPrompts) ? lesson.speakingPrompts : (staticDidactics.speakingPrompts || []); const practicalTasks = Array.isArray(lesson.practicalTasks) ? lesson.practicalTasks : (staticDidactics.practicalTasks || []); return { learningGoals, corePatterns: corePatterns.map((entry) => normalizeText(entry)).filter(Boolean), grammarFocus, speakingPrompts, practicalTasks }; } function getScenarioPrompt(lesson, didactics) { const speakingPrompt = Array.isArray(didactics.speakingPrompts) ? didactics.speakingPrompts[0] : null; const practicalTask = Array.isArray(didactics.practicalTasks) ? didactics.practicalTasks[0] : null; if (speakingPrompt?.prompt) return speakingPrompt.prompt; if (practicalTask?.text) return practicalTask.text; if (lesson.description) return lesson.description; return `Reagiere passend in einer Situation aus der Lektion "${lesson.title}".`; } function getChoiceQuestion(lesson, didactics) { const scenarioPrompt = getScenarioPrompt(lesson, didactics); switch (lesson.lessonType) { case 'conversation': return `${scenarioPrompt} Welche Bisaya-Formulierung passt am besten?`; case 'grammar': return `Welche Formulierung passt als kurze Alltagsstruktur zu "${lesson.title}"?`; case 'review': return `Welche Formulierung solltest du aus "${lesson.title}" sicher wiedererkennen?`; case 'culture': return `Welcher Ausdruck gehört am ehesten zum kulturellen Schwerpunkt "${lesson.title}"?`; case 'vocab': default: return `Welcher Ausdruck gehört thematisch zu "${lesson.title}"?`; } } function pickDistractors(pattern, allPatterns, count) { return allPatterns .filter((entry) => entry !== pattern) .slice(0, count); } function buildChoiceExercise(lesson, didactics, pattern, allPatterns, variant = 0) { const distractors = pickDistractors(pattern, allPatterns, 3); if (distractors.length < 3) return null; const seed = simpleHash(`${lesson.title}:${pattern}:${variant}`); const options = rotateArray([pattern, ...distractors], seed % 4); const correctAnswer = options.indexOf(pattern); return { exerciseTypeId: 2, title: `${lesson.title}: Passende Formulierung wählen`, instruction: 'Wähle die natürlichste Formulierung für die Situation oder den Schwerpunkt der Lektion.', questionData: { type: 'multiple_choice', question: getChoiceQuestion(lesson, didactics), options }, answerData: { type: 'multiple_choice', correctAnswer }, explanation: `"${pattern}" ist ein zentrales Muster dieser Lektion.` }; } function pickGapTarget(pattern) { const tokens = normalizeText(pattern) .split(' ') .map((token) => token.trim()) .filter(Boolean); const candidates = tokens .map((token, index) => ({ token, index, score: token.replace(/[.,?!]/g, '').length })) .filter(({ token }) => token.replace(/[.,?!]/g, '').length >= 4); if (candidates.length === 0) { return null; } candidates.sort((left, right) => right.score - left.score); return candidates[0]; } function buildGapExercise(lessonTitle, pattern) { const gapTarget = pickGapTarget(pattern); if (!gapTarget) return null; const tokens = normalizeText(pattern).split(' '); tokens[gapTarget.index] = '{gap}'; return { exerciseTypeId: 1, title: `${lessonTitle}: Muster vervollständigen`, instruction: 'Fülle die Lücke mit dem passenden Bisaya-Ausdruck.', questionData: { type: 'gap_fill', text: tokens.join(' '), gaps: 1 }, answerData: { type: 'gap_fill', answers: [gapTarget.token.replace(/[.,?!]/g, '')] }, explanation: `Das Kernmuster lautet: "${pattern}".` }; } function buildContextGapExercise(lesson, didactics, pattern) { const gapExercise = buildGapExercise(lesson.title, pattern); if (!gapExercise) return null; return { ...gapExercise, title: `${lesson.title}: Kernmuster ergänzen`, instruction: `Vervollständige die Formulierung passend zur Situation: ${getScenarioPrompt(lesson, didactics)}` }; } function buildSentenceExercise(lessonTitle, pattern) { const tokens = normalizeText(pattern) .replace(/[?!]/g, '') .split(' ') .filter(Boolean); if (tokens.length < 2) return null; return { exerciseTypeId: 3, title: `${lessonTitle}: Satzmuster bauen`, instruction: 'Ordne die Wörter zu einem korrekten Bisaya-Satz.', questionData: { type: 'sentence_building', question: `Baue das Kernmuster aus der Lektion "${lessonTitle}".`, tokens }, answerData: { correct: [normalizeText(pattern)] }, explanation: `Dieses Kernmuster gehört zur Lektion "${lessonTitle}".` }; } function buildTaskSentenceExercise(lesson, didactics, pattern) { const sentenceExercise = buildSentenceExercise(lesson.title, pattern); if (!sentenceExercise) return null; const practicalTask = Array.isArray(didactics.practicalTasks) ? didactics.practicalTasks[0] : null; return { ...sentenceExercise, title: `${lesson.title}: Satz aus dem Alltag bauen`, instruction: practicalTask?.text ? `Baue die passende Formulierung für diese Aufgabe: ${practicalTask.text}` : 'Ordne die Wörter zu einem natürlichen Bisaya-Satz aus dem Alltag.' }; } function buildSpeakingExercise(lessonTitle, didactics, fallbackPattern) { const speakingPrompt = Array.isArray(didactics.speakingPrompts) ? didactics.speakingPrompts[0] : null; const expectedText = normalizeText(speakingPrompt?.cue || fallbackPattern); if (!expectedText) return null; const keywords = expectedText .toLowerCase() .replace(/[.,?!]/g, '') .split(' ') .filter((token) => token.length >= 4) .slice(0, 4); return { exerciseTypeId: 8, title: `${lessonTitle}: Laut sprechen`, instruction: 'Sprich das zentrale Muster oder den Dialog frei nach.', questionData: { type: 'speaking_from_memory', question: speakingPrompt?.prompt || `Sprich ein zentrales Muster aus der Lektion "${lessonTitle}".`, expectedText, keywords }, answerData: { type: 'speaking_from_memory' }, explanation: 'Wichtig sind hier ein flüssiger Abruf und die zentralen Schlüsselwörter.' }; } function buildReviewChoiceExercise(lesson, didactics, pattern, allPatterns) { const choiceExercise = buildChoiceExercise(lesson, didactics, pattern, allPatterns, 1); if (!choiceExercise) return null; return { ...choiceExercise, title: `${lesson.title}: Sicheren Abruf prüfen`, instruction: 'Wähle die Formulierung, die du aus dem aktiven Wiederholungsblock sicher können solltest.' }; } function buildCultureExercise(lesson, didactics, pattern, allPatterns) { const distractors = pickDistractors(pattern, allPatterns, 3); if (distractors.length < 3) return null; const culturalNote = normalizeText(lesson.culturalNotes || ''); const options = rotateArray([pattern, ...distractors], simpleHash(`${lesson.title}:culture`) % 4); return { exerciseTypeId: 2, title: `${lesson.title}: Ausdruck kulturell einordnen`, instruction: 'Ordne den Ausdruck dem kulturellen Schwerpunkt der Lektion zu.', questionData: { type: 'multiple_choice', question: culturalNote ? `${culturalNote} Welcher Ausdruck passt dazu besonders gut?` : `Welcher Ausdruck gehört besonders gut zum Schwerpunkt "${lesson.title}"?`, options }, answerData: { type: 'multiple_choice', correctAnswer: options.indexOf(pattern) }, explanation: `Der Ausdruck "${pattern}" gehört eng zum kulturellen Schwerpunkt dieser Lektion.` }; } function buildSituationalExercise(lessonTitle, didactics, fallbackPattern) { const speakingPrompt = Array.isArray(didactics.speakingPrompts) ? didactics.speakingPrompts[0] : null; const modelAnswer = normalizeText(speakingPrompt?.cue || fallbackPattern); if (!modelAnswer) return null; const keywords = modelAnswer .toLowerCase() .replace(/[.,?!]/g, '') .split(' ') .filter((token) => token.length >= 4) .slice(0, 4); return withTypeName('situational_response', { title: `${lessonTitle}: Situativ reagieren`, instruction: 'Antworte kurz und passend auf die Situation.', questionData: { type: 'situational_response', question: speakingPrompt?.prompt || `Reagiere passend mit einem Ausdruck aus der Lektion "${lessonTitle}".`, keywords }, answerData: { modelAnswer, keywords }, explanation: `Das Kernmuster "${modelAnswer}" passt natürlich zu dieser Situation.` }); } function generateExercisesFromDidactics(lesson) { const didactics = getLessonDidactics(lesson); const corePatterns = didactics.corePatterns; if (corePatterns.length === 0) { return []; } const patternA = corePatterns[0]; const patternB = corePatterns[1] || corePatterns[0]; const lessonPool = Array.from(new Set([ ...corePatterns, ...GENERIC_DISTRACTOR_PATTERNS ])); let generated = []; if (lesson.lessonType === 'conversation') { generated = [ buildChoiceExercise(lesson, didactics, patternA, lessonPool, 0), buildContextGapExercise(lesson, didactics, patternA), buildTaskSentenceExercise(lesson, didactics, patternB), buildSituationalExercise(lesson.title, didactics, patternA), buildSpeakingExercise(lesson.title, didactics, patternB) ]; } else if (lesson.lessonType === 'grammar') { generated = [ buildChoiceExercise(lesson, didactics, patternA, lessonPool, 0), buildChoiceExercise(lesson, didactics, patternB, lessonPool, 1), buildContextGapExercise(lesson, didactics, patternA), buildTaskSentenceExercise(lesson, didactics, patternB), buildSpeakingExercise(lesson.title, didactics, patternA) ]; } else if (lesson.lessonType === 'review' || lesson.didacticMode === 'intensive_review') { generated = [ buildReviewChoiceExercise(lesson, didactics, patternA, lessonPool), buildReviewChoiceExercise(lesson, didactics, patternB, lessonPool), buildContextGapExercise(lesson, didactics, patternA), buildTaskSentenceExercise(lesson, didactics, patternB), buildSituationalExercise(lesson.title, didactics, patternA), buildSpeakingExercise(lesson.title, didactics, patternB) ]; } else if (lesson.lessonType === 'culture') { generated = [ buildCultureExercise(lesson, didactics, patternA, lessonPool), buildContextGapExercise(lesson, didactics, patternA), buildSpeakingExercise(lesson.title, didactics, patternB) ]; } else { generated = [ buildChoiceExercise(lesson, didactics, patternA, lessonPool, 0), buildChoiceExercise(lesson, didactics, patternB, lessonPool, 1), buildContextGapExercise(lesson, didactics, patternA), buildTaskSentenceExercise(lesson, didactics, patternB) ]; } return generated.filter(Boolean); } // Bisaya-spezifische Übungen basierend auf Lektionsthemen const BISAYA_EXERCISES = { // Lektion 1: Begrüßungen & Höflichkeit 'Begrüßungen & Höflichkeit': [ { exerciseTypeId: 2, // multiple_choice title: 'Wie sagt man "Wie geht es dir?" auf Bisaya?', instruction: 'Wähle die richtige Begrüßung aus.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Wie geht es dir?" auf Bisaya?', options: ['Kumusta ka?', 'Maayo', 'Salamat', 'Palihug'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Kumusta ka?" ist die Standard-Begrüßung auf Bisaya, ähnlich wie "Wie geht es dir?"' }, { exerciseTypeId: 1, // gap_fill title: 'Begrüßungen vervollständigen', instruction: 'Fülle die Lücken mit den richtigen Bisaya-Wörtern.', questionData: { type: 'gap_fill', text: 'Kumusta ka? Maayo {gap} (ich). Salamat.', gaps: 1 }, answerData: { type: 'gap_fill', answers: ['ko'] }, explanation: '"Maayo ko" bedeutet "Mir geht es gut". "ko" ist "ich" auf Bisaya.' }, { exerciseTypeId: 2, // multiple_choice title: 'Was bedeutet "Salamat"?', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet "Salamat"?', options: ['Danke', 'Bitte', 'Entschuldigung', 'Auf Wiedersehen'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Salamat" bedeutet "Danke" auf Bisaya.' }, { exerciseTypeId: 2, title: 'Tagesgruß erkennen', instruction: 'Wähle den passenden Gruß für den Morgen.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Guten Morgen" auf Bisaya?', options: ['Maayong buntag', 'Maayong gabii', 'Amping', 'Babay'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Maayong buntag" ist die übliche Form für "Guten Morgen".' }, { exerciseTypeId: 2, title: 'Abendgruß erkennen', instruction: 'Wähle den passenden Gruß für den Abend.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Guten Abend" auf Bisaya?', options: ['Maayong gabii', 'Maayong buntag', 'Amping', 'Salamat'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Maayong gabii" ist der normale Abendgruß.' }, { exerciseTypeId: 2, title: 'Gute Nacht zuordnen', instruction: 'Wähle die passendste Formulierung für den Schlafensmoment.', questionData: { type: 'multiple_choice', question: 'Welche Formulierung passt am besten zu "Gute Nacht"?', options: ['Maayong gabii, matulog na ta.', 'Kumusta ka?', 'Pila ang plite?', 'Tabangan tika.'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: 'Diese Form verbindet den Abendgruß direkt mit dem Schlafengehen.' }, { exerciseTypeId: 2, title: 'Schlaf gut erkennen', instruction: 'Wähle die passende Fürsorgeformel für die Nacht.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Schlaf gut" auf Bisaya?', options: ['Katulog og maayo.', 'Amping.', 'Maayo ko.', 'Babay.'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Katulog og maayo." bedeutet sinngemäß "Schlaf gut."' }, { exerciseTypeId: 2, title: 'Verabschiedung erkennen', instruction: 'Wähle die passende Verabschiedung aus.', questionData: { type: 'multiple_choice', question: 'Was bedeutet "Amping"?', options: ['Pass auf dich auf', 'Guten Morgen', 'Danke', 'Bitte'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Amping" benutzt man beim Abschied im Sinn von "Pass auf dich auf".' }, { exerciseTypeId: 2, title: 'Abschiedsform erkennen', instruction: 'Wähle die richtige Bedeutung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet "Babay"?', options: ['Tschüss', 'Auf Wiedersehen', 'Wie geht es dir?', 'Guten Tag'] }, answerData: { type: 'multiple_choice', // Beide gelten als richtig (Lehnwort von „bye-bye“) correctAnswer: [0, 1] }, explanation: '"Babay" ist eine einfache Verabschiedung — vergleichbar mit „Tschüss“ oder „Auf Wiedersehen“.' }, withTypeName('dialog_completion', { title: 'Begrüßungsdialog ergänzen', instruction: 'Ergänze die passende Antwort im Mini-Dialog.', questionData: { type: 'dialog_completion', question: 'Welche Antwort passt auf die Begrüßung?', dialog: ['A: Kumusta ka?', 'B: ...'] }, answerData: { modelAnswer: 'Maayo ko, salamat.', correct: ['Maayo ko, salamat.', 'Maayo ko. Salamat.'] }, explanation: 'Eine typische kurze Antwort ist "Maayo ko, salamat."' }), withTypeName('dialog_completion', { title: 'Verabschiedungsdialog ergänzen', instruction: 'Ergänze die passende Verabschiedung.', questionData: { type: 'dialog_completion', question: 'Wie endet der kurze Dialog natürlich?', dialog: ['A: Sige, mauna ko.', 'B: ...'] }, answerData: { modelAnswer: 'Babay, amping.', correct: ['Babay, amping.', 'Amping.', 'Babay. Amping.'] }, explanation: '"Babay" und "Amping" sind typische kurze Abschiedsformen.' }), { exerciseTypeId: 8, title: 'Begrüßung frei sprechen', instruction: 'Sprich eine kurze Begrüßung mit Frage und Antwort frei nach.', questionData: { type: 'speaking_from_memory', question: 'Begrüße eine Person und antworte kurz auf "Kumusta ka?".', expectedText: 'Kumusta ka? Maayo ko, salamat.', keywords: ['kumusta', 'maayo', 'salamat'] }, answerData: { type: 'speaking_from_memory' }, explanation: 'Wichtig sind hier die Schlüsselwörter für Begrüßung, Antwort und Höflichkeit.' }, { exerciseTypeId: 8, title: 'Gruß und Abschied laut sprechen', instruction: 'Sprich einen Tagesgruß und eine kurze Verabschiedung laut.', questionData: { type: 'speaking_from_memory', question: 'Sprich: "Guten Morgen" und verabschiede dich danach kurz.', expectedText: 'Maayong buntag. Babay, amping.', keywords: ['maayong', 'buntag', 'babay', 'amping'] }, answerData: { type: 'speaking_from_memory' }, explanation: 'Die Übung verbindet Begrüßung und Verabschiedung in einem kurzen Alltagspfad.' }, { exerciseTypeId: 8, title: 'Abendgruß und Schlafwunsch sprechen', instruction: 'Sprich einen Abendgruß und einen Schlafwunsch laut.', questionData: { type: 'speaking_from_memory', question: 'Sprich: "Guten Abend. Schlaf gut."', expectedText: 'Maayong gabii. Katulog og maayo.', keywords: ['maayong', 'gabii', 'katulog', 'maayo'] }, answerData: { type: 'speaking_from_memory' }, explanation: 'Die Übung verankert die Abend- und Schlafensformeln für den Familienalltag.' } ], // Lektion 3: Familienwörter 'Familienwörter': [ { exerciseTypeId: 2, // multiple_choice title: 'Wie sagt man "Mutter" auf Bisaya?', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Mutter" auf Bisaya?', options: ['Nanay', 'Tatay', 'Kuya', 'Ate'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Nanay" bedeutet "Mutter" auf Bisaya. "Mama" wird auch verwendet.' }, { exerciseTypeId: 2, // multiple_choice title: 'Wie sagt man "Vater" auf Bisaya?', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Vater" auf Bisaya?', options: ['Tatay', 'Nanay', 'Kuya', 'Ate'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Tatay" bedeutet "Vater" auf Bisaya. "Papa" wird auch verwendet.' }, { exerciseTypeId: 2, // multiple_choice title: 'Wie sagt man "älterer Bruder" auf Bisaya?', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "älterer Bruder" auf Bisaya?', options: ['Kuya', 'Ate', 'Nanay', 'Tatay'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Kuya" bedeutet "älterer Bruder" auf Bisaya. Wird auch für respektvolle Anrede von älteren Männern verwendet.' }, { exerciseTypeId: 2, // multiple_choice title: 'Wie sagt man "ältere Schwester" auf Bisaya?', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "ältere Schwester" auf Bisaya?', options: ['Ate', 'Kuya', 'Nanay', 'Tatay'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Ate" bedeutet "ältere Schwester" auf Bisaya. Wird auch für respektvolle Anrede von älteren Frauen verwendet.' }, { exerciseTypeId: 2, // multiple_choice title: 'Wie sagt man "Großmutter" auf Bisaya?', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Großmutter" auf Bisaya?', options: ['Lola', 'Lolo', 'Nanay', 'Tatay'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Lola" bedeutet "Großmutter" auf Bisaya.' }, { exerciseTypeId: 2, // multiple_choice title: 'Wie sagt man "Großvater" auf Bisaya?', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Großvater" auf Bisaya?', options: ['Lolo', 'Lola', 'Nanay', 'Tatay'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Lolo" bedeutet "Großvater" auf Bisaya.' }, { exerciseTypeId: 1, // gap_fill title: 'Familienwörter vervollständigen', instruction: 'Fülle die Lücken mit den richtigen Bisaya-Familienwörtern.', questionData: { type: 'gap_fill', text: '{gap} (Mutter) | {gap} (Vater) | {gap} (älterer Bruder) | {gap} (ältere Schwester) | {gap} (Großmutter) | {gap} (Großvater)', gaps: 6 }, answerData: { type: 'gap_fill', answers: ['Nanay', 'Tatay', 'Kuya', 'Ate', 'Lola', 'Lolo'] }, explanation: 'Nanay = Mutter, Tatay = Vater, Kuya = älterer Bruder, Ate = ältere Schwester, Lola = Großmutter, Lolo = Großvater.' }, { exerciseTypeId: 4, // transformation title: 'Familienwörter übersetzen', instruction: 'Übersetze das Familienwort ins Bisaya.', questionData: { type: 'transformation', text: 'Mutter', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Nanay', alternatives: ['Mama', 'Nanay', 'Inahan'] }, explanation: '"Nanay" oder "Mama" bedeutet "Mutter" auf Bisaya.' }, { exerciseTypeId: 3, title: 'Familiensatz bauen', instruction: 'Bilde aus den Wörtern einen kurzen Satz.', questionData: { type: 'sentence_building', question: 'Baue einen Satz: "Das ist meine Mutter."', tokens: ['Si', 'Nanay', 'nako', 'ni'] }, answerData: { correct: ['Si Nanay nako ni.', 'Si Nanay ni nako.'] }, explanation: 'Mit "Si Nanay nako ni." stellst du deine Mutter kurz vor.' }, withTypeName('situational_response', { title: 'Familie vorstellen', instruction: 'Antworte kurz auf die Situation.', questionData: { type: 'situational_response', question: 'Jemand fragt dich nach deiner Familie. Stelle kurz Mutter und älteren Bruder vor.', keywords: ['nanay', 'kuya'] }, answerData: { modelAnswer: 'Si Nanay ug si Kuya.', keywords: ['nanay', 'kuya'] }, explanation: 'Für diese Aufgabe reichen kurze, klare Familiennennungen.' }) ], 'Essen & Fürsorge': [ { exerciseTypeId: 2, title: 'Fürsorgefrage verstehen', instruction: 'Wähle die richtige Bedeutung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet "Nikaon na ka?"?', options: ['Hast du schon gegessen?', 'Bist du müde?', 'Kommst du nach Hause?', 'Möchtest du Wasser?'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Nikaon na ka?" ist eine sehr fürsorgliche Alltagsfrage.' }, { exerciseTypeId: 1, title: 'Essensdialog ergänzen', instruction: 'Fülle die Lücken mit den passenden Wörtern.', questionData: { type: 'gap_fill', text: 'Nikaon {gap} ka? {gap} ta!', gaps: 2 }, answerData: { answers: ['na', 'Kaon'] }, explanation: '"na" markiert hier den bereits eingetretenen Zustand; "Kaon ta!" heißt "Lass uns essen!".' }, withTypeName('dialog_completion', { title: 'Einladung zum Essen ergänzen', instruction: 'Ergänze die passende Antwort.', questionData: { type: 'dialog_completion', question: 'Welche Antwort passt auf die Einladung?', dialog: ['A: Kaon ta!', 'B: ...'] }, answerData: { modelAnswer: 'Oo, gusto ko.', correct: ['Oo, gusto ko.', 'Oo, mokaon ko.'] }, explanation: 'Eine natürliche kurze Reaktion ist "Oo, gusto ko."' }), withTypeName('situational_response', { title: 'Fürsorglich reagieren', instruction: 'Reagiere passend auf die Situation.', questionData: { type: 'situational_response', question: 'Jemand sieht hungrig aus. Frage fürsorglich nach und biete Essen an.', keywords: ['nikaon', 'kaon'] }, answerData: { modelAnswer: 'Nikaon na ka? Kaon ta.', keywords: ['nikaon', 'kaon'] }, explanation: 'Die Übung trainiert einen sehr typischen fürsorglichen Mini-Dialog.' }) ], // Lektion: Haus & Familie (Balay, Kwarto, Kusina, Pamilya) 'Haus & Familie': [ { exerciseTypeId: 2, // multiple_choice title: 'Wie sagt man "Haus" auf Bisaya?', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Haus" auf Bisaya?', options: ['Balay', 'Kwarto', 'Kusina', 'Pamilya'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Balay" bedeutet "Haus" auf Bisaya.' }, { exerciseTypeId: 2, // multiple_choice title: 'Wie sagt man "Zimmer" auf Bisaya?', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Zimmer" auf Bisaya?', options: ['Kwarto', 'Balay', 'Kusina', 'Pamilya'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Kwarto" bedeutet "Zimmer" (Raum/Schlafzimmer).' }, { exerciseTypeId: 2, // multiple_choice title: 'Wie sagt man "Küche" auf Bisaya?', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Küche" auf Bisaya?', options: ['Kusina', 'Balay', 'Kwarto', 'Pamilya'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Kusina" bedeutet "Küche".' }, { exerciseTypeId: 2, // multiple_choice title: 'Wie sagt man "Familie" auf Bisaya?', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Familie" auf Bisaya?', options: ['Pamilya', 'Balay', 'Kwarto', 'Kusina'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Pamilya" bedeutet "Familie".' }, { exerciseTypeId: 1, // gap_fill title: 'Haus & Räume vervollständigen', instruction: 'Fülle die Lücken mit den richtigen Bisaya-Wörtern.', questionData: { type: 'gap_fill', text: '{gap} (Haus) | {gap} (Zimmer) | {gap} (Küche) | {gap} (Familie)', gaps: 4 }, answerData: { type: 'gap_fill', answers: ['Balay', 'Kwarto', 'Kusina', 'Pamilya'] }, explanation: 'Balay = Haus, Kwarto = Zimmer, Kusina = Küche, Pamilya = Familie.' }, { exerciseTypeId: 4, // transformation title: 'Haus-Satz übersetzen', instruction: 'Übersetze den Satz ins Bisaya.', questionData: { type: 'transformation', text: 'Unser Haus hat zwei Zimmer', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Ang among balay kay naay duha ka kwarto', alternatives: ['Among balay naay duha ka kwarto', 'Ang among balay adunay duha ka kwarto'] }, explanation: '"Balay" = Haus, "kwarto" = Zimmer, "duha ka" = zwei (Stück).' } ], // Lektion 14: Ort & Richtung (Asa, dinhi, didto, padulong) 'Ort & Richtung': [ { exerciseTypeId: 2, // multiple_choice title: 'Was bedeutet \"Asa\"?', instruction: 'Wähle die richtige Bedeutung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet \"Asa\" auf Bisaya?', options: ['Wo / Wohin', 'Hier', 'Dort', 'Warum'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '\"Asa\" bedeutet \"Wo\" oder je nach Kontext \"Wohin\".' }, { exerciseTypeId: 2, // multiple_choice title: 'Was bedeutet \"dinhi\"?', instruction: 'Wähle die richtige Bedeutung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet \"dinhi\" auf Bisaya?', options: ['Hier', 'Dort', 'Drinnen', 'Draußen'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '\"dinhi\" bedeutet \"hier\".' }, { exerciseTypeId: 2, // multiple_choice title: 'Was bedeutet \"didto\"?', instruction: 'Wähle die richtige Bedeutung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet \"didto\" auf Bisaya?', options: ['Dort', 'Hier', 'Oben', 'Unten'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '\"didto\" bedeutet \"dort\" (an einem entfernten Ort).' }, { exerciseTypeId: 2, // multiple_choice title: 'Was bedeutet \"padulong\"?', instruction: 'Wähle die richtige Bedeutung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet \"padulong\" auf Bisaya?', options: ['Unterwegs nach / auf dem Weg zu', 'Ankommen', 'Abfahren', 'Zurückkommen'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '\"padulong\" beschreibt eine Bewegung in Richtung eines Zieles.' }, { exerciseTypeId: 1, // gap_fill title: 'Ort-Wörter einsetzen', instruction: 'Fülle die Lücken mit den richtigen Ort-Wörtern.', questionData: { type: 'gap_fill', text: '{gap} ka? (Wo bist du?) | Naa ko {gap}. (Ich bin hier.) | Adto ta {gap}. (Lass uns dorthin gehen.)', gaps: 3 }, answerData: { type: 'gap_fill', answers: ['Asa', 'dinhi', 'didto'] }, explanation: 'Asa = wo, dinhi = hier, didto = dort.' }, { exerciseTypeId: 1, // gap_fill title: 'Richtungen beschreiben', instruction: 'Fülle die Lücken mit den richtigen Bisaya-Wörtern.', questionData: { type: 'gap_fill', text: '{gap} ko sa merkado. (Ich gehe zum Markt.) | {gap} ta didto. (Lass uns dorthin gehen.)', gaps: 2 }, answerData: { type: 'gap_fill', answers: ['Padulong', 'Padulong'] }, explanation: '\"Padulong\" beschreibt, dass man unterwegs zu einem Ziel ist.' }, { exerciseTypeId: 4, // transformation title: 'Frage nach dem Ort übersetzen', instruction: 'Übersetze den Satz ins Bisaya.', questionData: { type: 'transformation', text: 'Wo ist die Kirche?', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Asa ang simbahan?', alternatives: ['Asa dapit ang simbahan?', 'Asa man ang simbahan?'] }, explanation: '\"simbahan\" = Kirche, \"Asa ang ...?\" = Wo ist ...?' } ], // Lektion 15: Zeitformen - Grundlagen 'Zeitformen - Grundlagen': [ { exerciseTypeId: 4, // transformation title: 'Vergangenheit verstehen', instruction: 'Was bedeutet "Ni-kaon ko"?', questionData: { type: 'transformation', text: 'Ni-kaon ko', sourceLanguage: 'Bisaya', targetLanguage: 'Deutsch' }, answerData: { type: 'transformation', correct: 'Ich habe gegessen', alternatives: ['I ate', 'I have eaten'] }, explanation: 'Das Präfix "Ni-" zeigt die Vergangenheit an. "Ni-kaon ko" bedeutet "Ich habe gegessen".' }, { exerciseTypeId: 4, // transformation title: 'Zukunft verstehen', instruction: 'Was bedeutet "Mo-kaon ko"?', questionData: { type: 'transformation', text: 'Mo-kaon ko', sourceLanguage: 'Bisaya', targetLanguage: 'Deutsch' }, answerData: { type: 'transformation', correct: 'Ich werde essen', alternatives: ['I will eat', 'I am going to eat'] }, explanation: 'Das Präfix "Mo-" zeigt die Zukunft an. "Mo-kaon ko" bedeutet "Ich werde essen".' }, { exerciseTypeId: 1, // gap_fill title: 'Zeitformen erkennen', instruction: 'Setze die richtigen Präfixe ein.', questionData: { type: 'gap_fill', text: '{gap}-kaon ko (Vergangenheit) | {gap}-kaon ko (Zukunft)', gaps: 2 }, answerData: { type: 'gap_fill', answers: ['Ni', 'Mo'] }, explanation: 'Ni- für Vergangenheit, Mo- für Zukunft.' }, withTypeName('pattern_drill', { title: 'Zeitmuster anwenden', instruction: 'Bilde mit demselben Muster einen Zukunftssatz.', questionData: { type: 'pattern_drill', question: 'Verwende das Muster für "gehen".', pattern: 'Mo- + Verb + ko' }, answerData: { modelAnswer: 'Mo-adto ko.', correct: ['Mo-adto ko.', 'Moadto ko.'] }, explanation: 'Mit "Mo-" kannst du ein einfaches Zukunftsmuster bilden.' }), { exerciseTypeId: 3, title: 'Vergangenheit und Zukunft bauen', instruction: 'Schreibe beide Formen nacheinander auf.', questionData: { type: 'sentence_building', question: 'Formuliere: "Ich habe gegessen. Ich werde essen."', tokens: ['Ni-kaon', 'ko', 'Mo-kaon', 'ko'] }, answerData: { correct: ['Ni-kaon ko. Mo-kaon ko.', 'Nikaon ko. Mokaon ko.'] }, explanation: 'Die Übung trainiert den direkten Wechsel zwischen den beiden Zeitmarkern.' } ], // Lektion 25: Höflichkeitsformen 'Höflichkeitsformen': [ { exerciseTypeId: 2, // multiple_choice title: 'Wie sagt man "Bitte langsam"?', instruction: 'Wähle die höfliche Form aus.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Bitte langsam" auf Bisaya?', options: ['Hinay-hinay lang', 'Palihug', 'Salamat', 'Maayo'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Hinay-hinay lang" bedeutet "Bitte langsam" und ist sehr höflich.' }, { exerciseTypeId: 1, // gap_fill title: 'Höfliche Sätze vervollständigen', instruction: 'Fülle die Lücken mit höflichen Wörtern.', questionData: { type: 'gap_fill', text: '{gap} lang (Bitte langsam), wala ko kasabot. {gap} ka mubalik? (Bitte wiederholen)', gaps: 2 }, answerData: { type: 'gap_fill', answers: ['Hinay-hinay', 'Palihug'] }, explanation: '"Hinay-hinay lang" = "Bitte langsam", "Palihug" = "Bitte".' }, { exerciseTypeId: 2, // multiple_choice title: 'Was bedeutet "Palihug"?', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet "Palihug"?', options: ['Bitte', 'Danke', 'Entschuldigung', 'Gern geschehen'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Palihug" bedeutet "Bitte" auf Bisaya und wird für höfliche Bitten verwendet.' } ], // Lektion: Überlebenssätze 'Überlebenssätze': [ { exerciseTypeId: 2, // multiple_choice title: 'Wie sagt man "Ich verstehe nicht"?', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Ich verstehe nicht" auf Bisaya?', options: ['Wala ko kasabot', 'Palihug', 'Salamat', 'Maayo'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Wala ko kasabot" bedeutet "Ich verstehe nicht" - sehr wichtig für Anfänger!' }, { exerciseTypeId: 2, // multiple_choice title: 'Wie sagt man "Kannst du das wiederholen?"?', instruction: 'Wähle die richtige Bitte aus.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Kannst du das wiederholen?" auf Bisaya?', options: ['Palihug ka mubalik?', 'Salamat', 'Maayo', 'Kumusta ka?'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Palihug ka mubalik?" bedeutet "Bitte kannst du wiederholen?" - essentiell für das Lernen!' }, { exerciseTypeId: 1, // gap_fill title: 'Überlebenssätze vervollständigen', instruction: 'Fülle die Lücken mit den richtigen Bisaya-Wörtern.', questionData: { type: 'gap_fill', text: '{gap} ko kasabot (Ich verstehe nicht). {gap} ka mubalik? (Bitte wiederholen) {gap} lang (Bitte langsam).', gaps: 3 }, answerData: { type: 'gap_fill', answers: ['Wala', 'Palihug', 'Hinay-hinay'] }, explanation: '"Wala ko kasabot" = "Ich verstehe nicht", "Palihug ka mubalik?" = "Bitte wiederholen", "Hinay-hinay lang" = "Bitte langsam".' }, { exerciseTypeId: 2, // multiple_choice title: 'Wie sagt man "Wo ist...?"?', instruction: 'Wähle die richtige Frage aus.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Wo ist die Toilette?" auf Bisaya?', options: ['Asa ang CR?', 'Kumusta ka?', 'Salamat', 'Maayo'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Asa ang CR?" bedeutet "Wo ist die Toilette?" - "Asa" = "Wo", "CR" = "Comfort Room" (Toilette).' }, { exerciseTypeId: 2, // multiple_choice title: 'Wie sagt man "Wie viel kostet das?"?', instruction: 'Wähle die richtige Frage aus.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Wie viel kostet das?" auf Bisaya?', options: ['Tagpila ni?', 'Asa ni?', 'Unsa ni?', 'Kinsa ni?'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Tagpila ni?" bedeutet "Wie viel kostet das?" - sehr nützlich beim Einkaufen!' }, { exerciseTypeId: 1, // gap_fill title: 'Wichtige Fragen bilden', instruction: 'Fülle die Lücken mit den richtigen Fragewörtern.', questionData: { type: 'gap_fill', text: '{gap} ang CR? (Wo ist die Toilette?) | {gap} ni? (Wie viel kostet das?) | {gap} ni? (Was ist das?)', gaps: 3 }, answerData: { type: 'gap_fill', answers: ['Asa', 'Tagpila', 'Unsa'] }, explanation: '"Asa" = "Wo", "Tagpila" = "Wie viel", "Unsa" = "Was".' }, { exerciseTypeId: 2, // multiple_choice title: 'Wie sagt man "Entschuldigung"?', instruction: 'Wähle die richtige Entschuldigung aus.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Entschuldigung" auf Bisaya?', options: ['Pasensya', 'Salamat', 'Palihug', 'Maayo'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Pasensya" bedeutet "Entschuldigung" oder "Entschuldige bitte" - wichtig für höfliche Kommunikation.' }, { exerciseTypeId: 4, // transformation title: 'Überlebenssätze übersetzen', instruction: 'Übersetze den Satz ins Bisaya.', questionData: { type: 'transformation', text: 'Ich spreche kein Bisaya', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Dili ko mag-Bisaya', alternatives: ['Wala ko mag-Bisaya', 'Dili ko makasabot Bisaya'] }, explanation: '"Dili ko mag-Bisaya" bedeutet "Ich spreche kein Bisaya" - nützlich, um zu erklären, dass du noch lernst.' } ], // Auch für "Überlebenssätze - Teil 1" und "Überlebenssätze - Teil 2" 'Überlebenssätze - Teil 1': [ { exerciseTypeId: 2, // multiple_choice title: 'Wie sagt man "Ich verstehe nicht"?', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Ich verstehe nicht" auf Bisaya?', options: ['Wala ko kasabot', 'Palihug', 'Salamat', 'Maayo'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Wala ko kasabot" bedeutet "Ich verstehe nicht" - sehr wichtig für Anfänger!' }, { exerciseTypeId: 2, // multiple_choice title: 'Wie sagt man "Kannst du das wiederholen?"?', instruction: 'Wähle die richtige Bitte aus.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Kannst du das wiederholen?" auf Bisaya?', options: ['Palihug ka mubalik?', 'Salamat', 'Maayo', 'Kumusta ka?'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Palihug ka mubalik?" bedeutet "Bitte kannst du wiederholen?" - essentiell für das Lernen!' }, { exerciseTypeId: 2, // multiple_choice title: 'Wie sagt man "Wo ist...?"?', instruction: 'Wähle die richtige Frage aus.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Wo ist die Toilette?" auf Bisaya?', options: ['Asa ang CR?', 'Kumusta ka?', 'Salamat', 'Maayo'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Asa ang CR?" bedeutet "Wo ist die Toilette?" - "Asa" = "Wo", "CR" = "Comfort Room" (Toilette).' }, { exerciseTypeId: 1, // gap_fill title: 'Überlebenssätze vervollständigen', instruction: 'Fülle die Lücken mit den richtigen Bisaya-Wörtern.', questionData: { type: 'gap_fill', text: '{gap} ko kasabot (Ich verstehe nicht). {gap} ka mubalik? (Bitte wiederholen)', gaps: 2 }, answerData: { type: 'gap_fill', answers: ['Wala', 'Palihug'] }, explanation: '"Wala ko kasabot" = "Ich verstehe nicht", "Palihug ka mubalik?" = "Bitte wiederholen".' } ], 'Überlebenssätze - Teil 2': [ { exerciseTypeId: 2, // multiple_choice title: 'Wie sagt man "Wie viel kostet das?"?', instruction: 'Wähle die richtige Frage aus.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Wie viel kostet das?" auf Bisaya?', options: ['Tagpila ni?', 'Asa ni?', 'Unsa ni?', 'Kinsa ni?'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Tagpila ni?" bedeutet "Wie viel kostet das?" - sehr nützlich beim Einkaufen!' }, { exerciseTypeId: 2, // multiple_choice title: 'Wie sagt man "Entschuldigung"?', instruction: 'Wähle die richtige Entschuldigung aus.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Entschuldigung" auf Bisaya?', options: ['Pasensya', 'Salamat', 'Palihug', 'Maayo'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Pasensya" bedeutet "Entschuldigung" oder "Entschuldige bitte" - wichtig für höfliche Kommunikation.' }, { exerciseTypeId: 1, // gap_fill title: 'Wichtige Fragen bilden', instruction: 'Fülle die Lücken mit den richtigen Fragewörtern.', questionData: { type: 'gap_fill', text: '{gap} ni? (Wie viel kostet das?) | {gap} ni? (Was ist das?) | {gap} lang (Bitte langsam)', gaps: 3 }, answerData: { type: 'gap_fill', answers: ['Tagpila', 'Unsa', 'Hinay-hinay'] }, explanation: '"Tagpila" = "Wie viel", "Unsa" = "Was", "Hinay-hinay lang" = "Bitte langsam".' }, { exerciseTypeId: 4, // transformation title: 'Überlebenssätze übersetzen', instruction: 'Übersetze den Satz ins Bisaya.', questionData: { type: 'transformation', text: 'Ich spreche kein Bisaya', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Dili ko mag-Bisaya', alternatives: ['Wala ko mag-Bisaya', 'Dili ko makasabot Bisaya'] }, explanation: '"Dili ko mag-Bisaya" bedeutet "Ich spreche kein Bisaya" - nützlich, um zu erklären, dass du noch lernst.' } ], // Lektion 11: Alltagsgespräche - Teil 1 (~20–30 Min Übungsmaterial) 'Alltagsgespräche - Teil 1': [ { exerciseTypeId: 2, // multiple_choice title: 'Wie sagt man "Wie war dein Tag?"?', instruction: 'Wähle die richtige Frage aus.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Wie war dein Tag?" auf Bisaya?', options: ['Kumusta ang imong adlaw?', 'Kumusta ka?', 'Unsa ni?', 'Asa ka?'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Kumusta ang imong adlaw?" bedeutet "Wie war dein Tag?" - typische Alltagsfrage.' }, { exerciseTypeId: 2, // multiple_choice title: 'Wie sagt man "Was machst du?"?', instruction: 'Wähle die richtige Frage aus.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Was machst du?" auf Bisaya?', options: ['Unsa imong ginabuhat?', 'Kumusta ka?', 'Asa ka?', 'Tagpila ni?'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Unsa imong ginabuhat?" bedeutet "Was machst du?" - "Unsa" = was, "ginabuhat" = machst.' }, { exerciseTypeId: 2, // multiple_choice title: 'Was bedeutet "Maayo ra"?', instruction: 'Wähle die richtige Bedeutung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet "Maayo ra"?', options: ['Es geht (so lala)', 'Sehr gut', 'Schlecht', 'Danke'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Maayo ra" bedeutet "Es geht" oder "So lala" - typische Antwort auf "Wie geht es dir?"' }, { exerciseTypeId: 2, // multiple_choice title: 'Was bedeutet "Nagtrabaho ko"?', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet "Nagtrabaho ko"?', options: ['Ich arbeite', 'Ich habe gegessen', 'Ich schlafe', 'Ich gehe'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Nagtrabaho ko" bedeutet "Ich arbeite" - "trabaho" = Arbeit.' }, { exerciseTypeId: 2, // multiple_choice title: 'Was bedeutet "Busy ko"?', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet "Busy ko"?', options: ['Ich bin beschäftigt', 'Ich bin müde', 'Ich bin glücklich', 'Ich schlafe'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Busy ko" bedeutet "Ich bin beschäftigt" - "busy" wurde aus dem Englischen übernommen.' }, { exerciseTypeId: 2, // multiple_choice title: 'Was bedeutet "Kapoy ko"?', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet "Kapoy ko"?', options: ['Ich bin müde', 'Ich bin beschäftigt', 'Ich bin krank', 'Ich bin glücklich'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Kapoy ko" bedeutet "Ich bin müde" - "kapoy" = müde.' }, { exerciseTypeId: 2, // multiple_choice title: 'Was bedeutet "Nagpahuway ko"?', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet "Nagpahuway ko"?', options: ['Ich ruhe mich aus', 'Ich arbeite', 'Ich schlafe', 'Ich esse'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Nagpahuway ko" bedeutet "Ich ruhe mich aus" - "pahuway" = Ruhe.' }, { exerciseTypeId: 2, // multiple_choice title: 'Wie sagt man "Wie heißt du?"?', instruction: 'Wähle die richtige Frage aus.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Wie heißt du?" auf Bisaya?', options: ['Unsa imong ngalan?', 'Kumusta ka?', 'Kinsa ka?', 'Asa ka?'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Unsa imong ngalan?" bedeutet "Wie heißt du?" - "ngalan" = Name.' }, { exerciseTypeId: 2, // multiple_choice title: 'Was bedeutet "Kinsa ka?"?', instruction: 'Wähle die richtige Bedeutung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet "Kinsa ka?"?', options: ['Wer bist du?', 'Wo bist du?', 'Was machst du?', 'Wie geht es dir?'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Kinsa ka?" bedeutet "Wer bist du?" - "kinsa" = wer.' }, { exerciseTypeId: 2, // multiple_choice title: 'Was bedeutet "Nalipay ko"?', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet "Nalipay ko"?', options: ['Ich bin glücklich', 'Ich bin traurig', 'Ich bin müde', 'Ich bin krank'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Nalipay ko" bedeutet "Ich bin glücklich" - "lipay" = glücklich.' }, { exerciseTypeId: 2, // multiple_choice title: 'Was bedeutet "Naa koy trabaho"?', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet "Naa koy trabaho"?', options: ['Ich habe Arbeit', 'Ich habe keine Arbeit', 'Ich arbeite', 'Ich ruhe mich aus'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Naa koy trabaho" bedeutet "Ich habe Arbeit" - "naa" = haben, "trabaho" = Arbeit.' }, { exerciseTypeId: 2, // multiple_choice title: 'Was bedeutet "Wala koy trabaho"?', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet "Wala koy trabaho"?', options: ['Ich habe keine Arbeit', 'Ich habe Arbeit', 'Ich arbeite', 'Ich bin müde'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Wala koy trabaho" bedeutet "Ich habe keine Arbeit" - "wala" = nicht haben.' }, { exerciseTypeId: 1, // gap_fill title: 'Alltagsgespräch vervollständigen', instruction: 'Fülle die Lücken mit den richtigen Bisaya-Wörtern.', questionData: { type: 'gap_fill', text: 'Kumusta ang imong {gap}? (Wie war dein Tag?) - Maayo {gap}. (Es geht.)', gaps: 2 }, answerData: { type: 'gap_fill', answers: ['adlaw', 'ra'] }, explanation: '"adlaw" = Tag, "Maayo ra" = Es geht.' }, { exerciseTypeId: 1, // gap_fill title: 'Antworten auf Alltagsfragen', instruction: 'Fülle die Lücken mit den richtigen Bisaya-Wörtern.', questionData: { type: 'gap_fill', text: 'Unsa imong ginabuhat? (Was machst du?) - {gap} ko. (Ich arbeite.) | Kapoy {gap}. (Ich bin müde.)', gaps: 2 }, answerData: { type: 'gap_fill', answers: ['Nagtrabaho', 'ko'] }, explanation: '"Nagtrabaho ko" = Ich arbeite, "Kapoy ko" = Ich bin müde.' }, { exerciseTypeId: 4, // transformation title: 'Alltagssatz übersetzen', instruction: 'Übersetze den Satz ins Bisaya.', questionData: { type: 'transformation', text: 'Ich bin glücklich', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Nalipay ko', alternatives: ['Malipayon ko', 'Nalipay ako'] }, explanation: '"Nalipay ko" bedeutet "Ich bin glücklich" auf Bisaya.' } ], // Lektion 13: Alltagsgespräche - Teil 2 'Alltagsgespräche - Teil 2': [ { exerciseTypeId: 2, // multiple_choice title: 'Wie sagt man "Wohin gehst du?"?', instruction: 'Wähle die richtige Frage aus.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Wohin gehst du?" auf Bisaya?', options: ['Asa ka padulong?', 'Kumusta ka?', 'Unsa imong ginabuhat?', 'Tagpila ni?'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Asa ka padulong?" bedeutet "Wohin gehst du?" - "Asa" = wo/wohin, "padulong" = unterwegs nach.' }, { exerciseTypeId: 2, // multiple_choice title: 'Wie sagt man "Was ist dein Plan?"?', instruction: 'Wähle die richtige Frage aus.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Was ist dein Plan?" auf Bisaya?', options: ['Unsa imong plano?', 'Asa ka padulong?', 'Unsa imong ngalan?', 'Kinsa ka?'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Unsa imong plano?" bedeutet "Was ist dein Plan?" - "plano" = Plan.' }, { exerciseTypeId: 2, // multiple_choice title: 'Was bedeutet "Moadto ko sa balay"?', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet "Moadto ko sa balay"?', options: ['Ich gehe nach Hause', 'Ich gehe zur Arbeit', 'Ich gehe in die Schule', 'Ich gehe in die Kirche'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Moadto ko sa balay" bedeutet "Ich gehe nach Hause" - "balay" = Haus.' }, { exerciseTypeId: 2, // multiple_choice title: 'Was bedeutet "Moadto ko sa merkado"?', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet "Moadto ko sa merkado"?', options: ['Ich gehe zum Markt', 'Ich gehe nach Hause', 'Ich gehe in die Kirche', 'Ich gehe ins Krankenhaus'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Moadto ko sa merkado" bedeutet "Ich gehe zum Markt" - "merkado" = Markt.' }, { exerciseTypeId: 1, // gap_fill title: 'Fragen zum Weg vervollständigen', instruction: 'Fülle die Lücken mit den richtigen Bisaya-Wörtern.', questionData: { type: 'gap_fill', text: '{gap} ka padulong? (Wohin gehst du?) | {gap} imong plano? (Was ist dein Plan?)', gaps: 2 }, answerData: { type: 'gap_fill', answers: ['Asa', 'Unsa'] }, explanation: '"Asa" = wo/wohin, "Unsa" = was.' }, { exerciseTypeId: 1, // gap_fill title: 'Antworten auf Weg-Fragen', instruction: 'Fülle die Lücken mit den richtigen Bisaya-Wörtern.', questionData: { type: 'gap_fill', text: 'Moadto ko sa {gap}. (Ich gehe nach Hause.) | Moadto ko sa {gap}. (Ich gehe zum Markt.)', gaps: 2 }, answerData: { type: 'gap_fill', answers: ['balay', 'merkado'] }, explanation: '"balay" = Haus, "merkado" = Markt.' }, { exerciseTypeId: 4, // transformation title: 'Weg-Satz übersetzen 1', instruction: 'Übersetze den Satz ins Bisaya.', questionData: { type: 'transformation', text: 'Ich gehe nach Hause', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Moadto ko sa balay', alternatives: ['Mo-uli ko', 'Moadto ko sa among balay'] }, explanation: '"Moadto ko sa balay" und "Mo-uli ko" können beide "Ich gehe nach Hause" bedeuten.' }, { exerciseTypeId: 4, // transformation title: 'Weg-Satz übersetzen 2', instruction: 'Übersetze den Satz ins Bisaya.', questionData: { type: 'transformation', text: 'Ich gehe in die Kirche', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Moadto ko sa simbahan', alternatives: ['Adto ko sa simbahan', 'Moadto ko sa among simbahan'] }, explanation: '"simbahan" = Kirche.' } ], // Woche 1 - Wiederholung (Lektion 9) 'Woche 1 - Wiederholung': [ { exerciseTypeId: 2, // multiple_choice title: 'Wiederholung: Wie sagt man "Wie geht es dir?"?', instruction: 'Wähle die richtige Begrüßung aus.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Wie geht es dir?" auf Bisaya?', options: ['Kumusta ka?', 'Maayo', 'Salamat', 'Palihug'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Kumusta ka?" ist die Standard-Begrüßung auf Bisaya.' }, { exerciseTypeId: 2, // multiple_choice title: 'Wiederholung: Wie sagt man "Mutter" auf Bisaya?', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Mutter" auf Bisaya?', options: ['Nanay', 'Tatay', 'Kuya', 'Ate'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Nanay" bedeutet "Mutter" auf Bisaya.' }, { exerciseTypeId: 2, // multiple_choice title: 'Wiederholung: Was bedeutet "Palangga taka"?', instruction: 'Wähle die richtige Bedeutung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet "Palangga taka"?', options: ['Ich hab dich lieb', 'Danke', 'Guten Tag', 'Auf Wiedersehen'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Palangga taka" bedeutet "Ich hab dich lieb" - wärmer als "I love you" im Familienkontext.' }, { exerciseTypeId: 2, // multiple_choice title: 'Wiederholung: Was fragt man mit "Nikaon ka?"?', instruction: 'Wähle die richtige Bedeutung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet "Nikaon ka?"?', options: ['Hast du schon gegessen?', 'Wie geht es dir?', 'Danke', 'Bitte'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Nikaon ka?" bedeutet "Hast du schon gegessen?" - typisch fürsorglich auf den Philippinen.' }, { exerciseTypeId: 2, // multiple_choice title: 'Wiederholung: Wie sagt man "Ich verstehe nicht"?', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "Ich verstehe nicht" auf Bisaya?', options: ['Wala ko kasabot', 'Salamat', 'Maayo', 'Palihug'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Wala ko kasabot" bedeutet "Ich verstehe nicht".' }, { exerciseTypeId: 3, title: 'Woche 1: Minisatz bauen', instruction: 'Schreibe eine kurze Sequenz aus Begrüßung und Fürsorge.', questionData: { type: 'sentence_building', question: 'Baue: "Wie geht es dir? Hast du schon gegessen?"', tokens: ['Kumusta', 'ka', 'Nikaon', 'na', 'ka'] }, answerData: { correct: ['Kumusta ka? Nikaon na ka?', 'Kumusta ka. Nikaon na ka?'] }, explanation: 'Hier kombinierst du zwei wichtige Muster aus Woche 1.' }, withTypeName('dialog_completion', { title: 'Woche 1: Dialog ergänzen', instruction: 'Ergänze die passende liebevolle Reaktion.', questionData: { type: 'dialog_completion', question: 'Welche Antwort passt?', dialog: ['A: Mingaw ko nimo.', 'B: ...'] }, answerData: { modelAnswer: 'Palangga taka.', correct: ['Palangga taka.'] }, explanation: 'Die Kombination klingt im Familienkontext warm und natürlich.' }) ], // Woche 1 - Vokabeltest (Lektion 10) 'Woche 1 - Vokabeltest': [ { exerciseTypeId: 2, // multiple_choice title: 'Vokabeltest: Kumusta', instruction: 'Was bedeutet "Kumusta"?', questionData: { type: 'multiple_choice', question: 'Was bedeutet "Kumusta"?', options: ['Wie geht es dir?', 'Danke', 'Bitte', 'Auf Wiedersehen'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Kumusta" kommt von spanisch "¿Cómo está?" - "Wie geht es dir?"' }, { exerciseTypeId: 2, // multiple_choice title: 'Vokabeltest: Lola', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet "Lola"?', options: ['Großmutter', 'Großvater', 'Mutter', 'Vater'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Lola" = Großmutter, "Lolo" = Großvater.' }, { exerciseTypeId: 2, // multiple_choice title: 'Vokabeltest: Salamat', instruction: 'Wähle die richtige Bedeutung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet "Salamat"?', options: ['Danke', 'Bitte', 'Entschuldigung', 'Gern geschehen'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Salamat" bedeutet "Danke".' }, { exerciseTypeId: 2, // multiple_choice title: 'Vokabeltest: Lami', instruction: 'Was bedeutet "Lami"?', questionData: { type: 'multiple_choice', question: 'Was bedeutet "Lami"?', options: ['Lecker', 'Viel', 'Gut', 'Schnell'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Lami" bedeutet "lecker" oder "schmackhaft" - wichtig beim Essen!' }, { exerciseTypeId: 2, // multiple_choice title: 'Vokabeltest: Mingaw ko nimo', instruction: 'Wähle die richtige Bedeutung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet "Mingaw ko nimo"?', options: ['Ich vermisse dich', 'Ich freue mich', 'Ich mag dich', 'Ich liebe dich'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Mingaw ko nimo" bedeutet "Ich vermisse dich".' }, withTypeName('situational_response', { title: 'Woche 1: Situative Kurzantwort', instruction: 'Reagiere passend auf die Situation.', questionData: { type: 'situational_response', question: 'Jemand fragt: "Kumusta ka?" Antworte kurz und höflich.', keywords: ['maayo', 'salamat'] }, answerData: { modelAnswer: 'Maayo ko, salamat.', keywords: ['maayo', 'salamat'] }, explanation: 'Eine kurze höfliche Antwort reicht hier völlig aus.' }) ], 'Besuch & Gastfreundschaft': [ { exerciseTypeId: 2, title: 'Gast hereinbitten', instruction: 'Wähle die natürlichste Formulierung, um einen Gast hereinzubitten.', questionData: { type: 'multiple_choice', question: 'Ein Familiengast steht vor der Tür. Was sagst du zuerst?', options: ['Sulod lang.', 'Magpahuway sa.', 'Pila ang plite?', 'Asa ang sakayan?'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Sulod lang." bedeutet sinngemäß "Komm einfach rein."' }, { exerciseTypeId: 1, title: 'Gast setzen lassen', instruction: 'Fülle die Lücke mit der passenden Einladung aus.', questionData: { type: 'gap_fill', text: 'Sulod lang. {gap} sa.', gaps: 1 }, answerData: { type: 'gap_fill', answers: ['Lingkod'] }, explanation: '"Lingkod sa." bedeutet "Setz dich erst einmal."' }, withTypeName('situational_response', { title: 'Gast begrüßen und platzieren', instruction: 'Reagiere kurz und passend.', questionData: { type: 'situational_response', question: 'Begrüße einen Gast, bitte ihn herein und biete einen Sitzplatz an.', keywords: ['sulod', 'lingkod'] }, answerData: { modelAnswer: 'Maayong adlaw. Sulod lang. Lingkod sa.', keywords: ['sulod', 'lingkod'] }, explanation: 'Das ist ein kompaktes, sehr natürliches Besuchsmuster.' }) ], 'Gesundheit im Alltag': [ { exerciseTypeId: 2, title: 'Nach Beschwerden fragen', instruction: 'Wähle die passendste Frage bei Kopfweh.', questionData: { type: 'multiple_choice', question: 'Jemand wirkt krank. Wie fragst du nach Kopfweh?', options: ['Sakit imong ulo?', 'Asa ang merkado?', 'Naa kay assignment?', 'Mubayad ko.'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Sakit imong ulo?" fragt direkt nach Kopfschmerzen.' }, { exerciseTypeId: 1, title: 'Fürsorge bei Krankheit', instruction: 'Fülle die Lücke mit der passenden Fürsorgeformel.', questionData: { type: 'gap_fill', text: 'Sakit imong ulo? {gap} sa.', gaps: 1 }, answerData: { type: 'gap_fill', answers: ['Magpahuway'] }, explanation: '"Magpahuway sa." heißt "Ruh dich erst einmal aus."' }, withTypeName('situational_response', { title: 'Kranke Person versorgen', instruction: 'Antworte kurz und fürsorglich.', questionData: { type: 'situational_response', question: 'Frage nach Schmerzen und biete Ruhe an.', keywords: ['sakit', 'magpahuway'] }, answerData: { modelAnswer: 'Sakit imong ulo? Magpahuway sa.', keywords: ['sakit', 'magpahuway'] }, explanation: 'Das Muster verbindet Frage und Fürsorge in einer natürlichen Miniszene.' }) ], 'Unterwegs & Transport': [ { exerciseTypeId: 2, title: 'Nach der Haltestelle fragen', instruction: 'Wähle die passende Transportfrage.', questionData: { type: 'multiple_choice', question: 'Du willst wissen, wo du ein Fahrzeug bekommst. Was fragst du?', options: ['Asa ang sakayan?', 'Sulod lang.', 'Nikaon na ka?', 'Unsay gibati nimo?'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"sakayan" meint den Ort oder das Fahrzeug zum Einsteigen.' }, { exerciseTypeId: 1, title: 'Fahrtpreis ergänzen', instruction: 'Fülle die Lücke mit dem passenden Wort.', questionData: { type: 'gap_fill', text: 'Pila ang {gap}?', gaps: 1 }, answerData: { type: 'gap_fill', answers: ['plite'] }, explanation: '"plite" ist der Fahrpreis.' }, withTypeName('situational_response', { title: 'Transport klären', instruction: 'Reagiere mit zwei kurzen Fragen.', questionData: { type: 'situational_response', question: 'Frage nach Haltestelle und Fahrpreis.', keywords: ['sakayan', 'plite'] }, answerData: { modelAnswer: 'Asa ang sakayan? Pila ang plite?', keywords: ['sakayan', 'plite'] }, explanation: 'Das ist ein typischer Minidialog für Alltag und Transport.' }) ], 'Kinder im Alltag': [ { exerciseTypeId: 2, title: 'Kind nach Essen fragen', instruction: 'Wähle die natürlichste Frage an ein Kind.', questionData: { type: 'multiple_choice', question: 'Wie fragst du ein Kind, ob es schon gegessen hat?', options: ['Nikaon na ang bata?', 'Pila ni tanan?', 'Asa ang porma?', 'Mubayad ko.'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: 'Hier wird gezielt das Muster für das Kind im Alltag geübt.' }, { exerciseTypeId: 1, title: 'Schulfrage ergänzen', instruction: 'Fülle die Lücke mit dem passenden Schulwort.', questionData: { type: 'gap_fill', text: 'Andam na ka sa {gap}?', gaps: 1 }, answerData: { type: 'gap_fill', answers: ['eskwela'] }, explanation: '"eskwela" bedeutet Schule.' }, withTypeName('situational_response', { title: 'Kind für Schule vorbereiten', instruction: 'Reagiere fürsorglich und kurz.', questionData: { type: 'situational_response', question: 'Frage nach Essen und ob das Kind bereit für die Schule ist.', keywords: ['nikaon', 'eskwela'] }, answerData: { modelAnswer: 'Nikaon na ka? Andam na ka sa eskwela?', keywords: ['nikaon', 'eskwela'] }, explanation: 'Das verbindet Fürsorge und Schulroutine in einem kompakten Muster.' }) ], 'Arzt & Termin': [ { exerciseTypeId: 2, title: 'Zum Arzt gehen', instruction: 'Wähle die passende Arztformulierung.', questionData: { type: 'multiple_choice', question: 'Wie sagst du: "Wir gehen zum Arzt"?', options: ['Adto ta sa doktor.', 'Giinvite tika.', 'Bisita mo unya.', 'Magdula ta.'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Adto ta sa doktor." ist die direkte, alltagstaugliche Form.' }, { exerciseTypeId: 1, title: 'Terminfrage ergänzen', instruction: 'Fülle die Lücke mit dem passenden Fremdwort.', questionData: { type: 'gap_fill', text: 'Naa moy {gap}?', gaps: 1 }, answerData: { type: 'gap_fill', answers: ['appointment'] }, explanation: '"appointment" wird im Alltag oft direkt verwendet.' }, withTypeName('situational_response', { title: 'Arzttermin vorbereiten', instruction: 'Antworte in zwei kurzen Sätzen.', questionData: { type: 'situational_response', question: 'Sage, dass ihr zum Arzt geht, und frage nach dem Termin.', keywords: ['doktor', 'appointment'] }, answerData: { modelAnswer: 'Adto ta sa doktor. Naa moy appointment?', keywords: ['doktor', 'appointment'] }, explanation: 'Das Muster verbindet Weg zum Arzt und Terminorganisation.' }) ], 'Dialogtag - Familie & Planung': [ { exerciseTypeId: 2, title: 'Tagesplan eröffnen', instruction: 'Wähle die Formulierung, mit der du die Tagesplanung eröffnest.', questionData: { type: 'multiple_choice', question: 'Wie fragst du in der Familie nach dem Plan für heute?', options: ['Unsa atong plano karon?', 'Asa ang ATM?', 'Pila ang plite?', 'Salamat sa pag-anhi.'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: 'Damit eröffnest du einen Familien- oder Organisationsdialog sehr natürlich.' }, { exerciseTypeId: 1, title: 'Kind abholen ergänzen', instruction: 'Fülle die Lücke mit dem passenden Verb aus.', questionData: { type: 'gap_fill', text: '{gap} nato ang bata unya.', gaps: 1 }, answerData: { type: 'gap_fill', answers: ['Kuhaon'] }, explanation: '"Kuhaon nato" meint hier "wir holen ... später ab".' }, withTypeName('situational_response', { title: 'Familie planen', instruction: 'Reagiere in zwei bis drei kurzen Sätzen.', questionData: { type: 'situational_response', question: 'Frage nach dem Plan für heute, sage, dass ihr das Kind später abholt, und kündige an, danach heimzugehen.', keywords: ['plano', 'bata', 'mouli'] }, answerData: { modelAnswer: 'Unsa atong plano karon? Kuhaon nato ang bata unya. Pagkahuman, mouli ta.', keywords: ['plano', 'bata', 'mouli'] }, explanation: 'Das ist ein typisches zusammenhängendes Planungsmuster aus der Stabilisierungsphase.' }) ], 'Fehlertraining - häufige Verwechslungen I': [ { exerciseTypeId: 2, title: 'Vergangenheit oder Zukunft', instruction: 'Wähle die Formulierung für "Ich bin hingegangen".', questionData: { type: 'multiple_choice', question: 'Welche Form passt zur Vergangenheit?', options: ['Niadto ko.', 'Moadto ko.', 'Palihug.', 'Pasayloa ko.'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Niadto ko." bezieht sich auf Vergangenes, "Moadto ko." auf Zukünftiges.' }, { exerciseTypeId: 2, title: 'Bitte oder Entschuldigung', instruction: 'Wähle die Formulierung für eine Bitte.', questionData: { type: 'multiple_choice', question: 'Welche Form bedeutet "Bitte"?', options: ['Palihug.', 'Pasayloa ko.', 'Niadto ko.', 'Moadto ko.'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Palihug." ist die Bitte, "Pasayloa ko." die Entschuldigung.' }, withTypeName('situational_response', { title: 'Bitte und Entschuldigung trennen', instruction: 'Antworte mit Bitte und Entschuldigung in der richtigen Reihenfolge.', questionData: { type: 'situational_response', question: 'Bitte zuerst höflich um Wiederholung und entschuldige dich danach.', keywords: ['palihug', 'pasayloa'] }, answerData: { modelAnswer: 'Palihug ka mubalik. Pasayloa ko.', keywords: ['palihug', 'pasayloa'] }, explanation: 'Das Fehlertraining soll genau solche nahen Alltagsformen sauber trennen.' }) ], 'Abschlussprüfung - Gesamtpfad': [ { exerciseTypeId: 2, title: 'Gesamtpfad: Alltagssituation erkennen', instruction: 'Wähle die passendste Reaktion.', questionData: { type: 'multiple_choice', question: 'Ihr müsst in die Stadt, habt einen Termin und jemand braucht Hilfe. Welche Formulierung passt am besten?', options: ['Aduna mi appointment. Tabangan tika.', 'Sulod lang. Lingkod sa.', 'Magdula ta. Lingaw ka?', 'Palangga taka. Gimingaw ko nimo.'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: 'Die Abschlussprüfung mischt bewusst mehrere Alltagsfelder.' }, { exerciseTypeId: 1, title: 'Gesamtpfad: Kernmuster vervollständigen', instruction: 'Fülle beide Lücken mit den passenden Wörtern.', questionData: { type: 'gap_fill', text: 'Moadto mi sa {gap}. Aduna mi {gap}.', gaps: 2 }, answerData: { type: 'gap_fill', answers: ['lungsod', 'appointment'] }, explanation: 'Das verbindet Weg, Ort und Terminorganisation.' }, withTypeName('situational_response', { title: 'Gesamtpfad: Kompakte Abschlussreaktion', instruction: 'Reagiere in drei kurzen Sätzen.', questionData: { type: 'situational_response', question: 'Sage, dass ihr in die Stadt fahrt, einen Termin habt und du helfen wirst.', keywords: ['lungsod', 'appointment', 'tabangan'] }, answerData: { modelAnswer: 'Moadto mi sa lungsod. Aduna mi appointment. Tabangan tika.', keywords: ['lungsod', 'appointment', 'tabangan'] }, explanation: 'Die Abschlussprüfung bündelt Weg, Organisation und Hilfe in einer letzten Miniszene.' }) ], 'Einkaufen vertiefen': [ { exerciseTypeId: 2, title: 'Gesamtpreis erfragen', instruction: 'Wähle die passendste Einkaufsfrage.', questionData: { type: 'multiple_choice', question: 'Du hast mehrere Dinge ausgesucht. Wie fragst du nach dem Gesamtpreis?', options: ['Pila ni tanan?', 'Kapoy na ka?', 'Asa ang bata?', 'Tabangan tika.'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Pila ni tanan?" fragt nach dem Gesamtpreis.' }, { exerciseTypeId: 1, title: 'Menge ergänzen', instruction: 'Fülle die Lücke mit dem passenden Mengenwort.', questionData: { type: 'gap_fill', text: 'Pwede tulo ka{gap}?', gaps: 1 }, answerData: { type: 'gap_fill', answers: ['buok'] }, explanation: '"buok" wird für zählbare Einzelstücke verwendet.' }, withTypeName('situational_response', { title: 'Einkauf abschließen', instruction: 'Reagiere passend beim Bezahlen.', questionData: { type: 'situational_response', question: 'Frage nach dem Gesamtpreis und sage dann, dass du es nimmst.', keywords: ['tanan', 'kuhaon'] }, answerData: { modelAnswer: 'Pila ni tanan? Kuhaon na nako.', keywords: ['tanan', 'kuhaon'] }, explanation: 'Das ist ein sehr alltagsnaher Miniabschluss beim Einkaufen.' }) ], 'Nachbarschaft & Besuche': [ { exerciseTypeId: 2, title: 'Bei Nachbarn vorbeischauen', instruction: 'Wähle die passendste Aussage für einen Besuch bei Nachbarn.', questionData: { type: 'multiple_choice', question: 'Wie sagst du: "Wir waren bei den Nachbarn"?', options: ['Niadto mi sa silingan.', 'Adto ta sa doktor.', 'Magdula ta.', 'Naa koy assignment.'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"silingan" bedeutet Nachbar oder Nachbarschaft.' }, { exerciseTypeId: 1, title: 'Einladung in die Nachbarschaft', instruction: 'Fülle die Lücke mit dem passenden Besuchswort.', questionData: { type: 'gap_fill', text: '{gap} mo unya.', gaps: 1 }, answerData: { type: 'gap_fill', answers: ['Bisita'] }, explanation: '"Bisita mo unya." lädt zu einem späteren Besuch ein.' }, withTypeName('situational_response', { title: 'Nachbarschaftsbesuch ankündigen', instruction: 'Reagiere in zwei kurzen Sätzen.', questionData: { type: 'situational_response', question: 'Sag, dass ihr bei den Nachbarn wart und dass sie später zu Besuch kommen können.', keywords: ['silingan', 'bisita'] }, answerData: { modelAnswer: 'Niadto mi sa silingan. Bisita mo unya.', keywords: ['silingan', 'bisita'] }, explanation: 'Das verbindet Begegnung und Einladung in einem natürlichen Nachbarschaftskontext.' }) ], 'Rollenspiel - Konflikt und Hilfe': [ { exerciseTypeId: 2, title: 'Konflikt ruhig eröffnen', instruction: 'Wähle die höflichste Eröffnung für ein schwieriges Gespräch.', questionData: { type: 'multiple_choice', question: 'Wie leitest du ein Konfliktgespräch ruhig ein?', options: ['Pwede nato istoryahan?', 'Pila ni tanan?', 'Sulod lang.', 'Nikaon na ka?'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Pwede nato istoryahan?" ist weich und gesprächsorientiert.' }, { exerciseTypeId: 1, title: 'Hilfe ergänzen', instruction: 'Fülle die Lücke mit der passenden Hilfeformel.', questionData: { type: 'gap_fill', text: '{gap} tika.', gaps: 1 }, answerData: { type: 'gap_fill', answers: ['Tabangan'] }, explanation: '"Tabangan tika." bedeutet "Ich helfe dir."' }, withTypeName('situational_response', { title: 'Konflikt und Hilfe verbinden', instruction: 'Reagiere kurz, höflich und lösungsorientiert.', questionData: { type: 'situational_response', question: 'Bitte darum, das Problem zu besprechen, und biete anschließend Hilfe an.', keywords: ['istoryahan', 'tabangan'] }, answerData: { modelAnswer: 'Pwede nato istoryahan? Tabangan tika.', keywords: ['istoryahan', 'tabangan'] }, explanation: 'Das Rollenspiel verbindet Deeskalation und konkrete Hilfe.' }) ], 'Freies Sprechen - Alltag ohne Stütze': [ { exerciseTypeId: 2, title: 'Freies Sprechen strukturieren', instruction: 'Wähle den Ausdruck, mit dem du eine freie Aussage natürlich einleitest.', questionData: { type: 'multiple_choice', question: 'Welche Form passt gut als Einleitung für freies Sprechen?', options: ['Sa tinuod...', 'Pila ang plite?', 'Asa ang sakayan?', 'Sulod lang.'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Sa tinuod..." eignet sich gut, um frei in eine Aussage hineinzukommen.' }, { exerciseTypeId: 3, title: 'Freie Aussage bauen', instruction: 'Ordne die Wörter zu einer typischen Einleitung für eine freie Alltagsaussage.', questionData: { type: 'sentence_building', question: 'Baue: "Meistens..."', tokens: ['Kasagaran'] }, answerData: { correct: ['Kasagaran...'] }, explanation: 'Diese Einleitungen helfen, im freien Sprechen in Gang zu kommen.' }, { title: 'Alltag frei erzählen', instruction: 'Sprich ohne deutsche Stütze eine kurze freie Alltagsaussage.', exerciseTypeId: 8, questionData: { type: 'speaking_from_memory', question: 'Erzähle kurz frei über deinen Alltag und nutze mindestens zwei dieser Einleitungen: Sa tinuod, Kasagaran, Usahay, Apan.', expectedText: 'Sa tinuod... Kasagaran... Usahay... Apan...', keywords: ['tinuod', 'kasagaran', 'usahay', 'apan'] }, answerData: { type: 'speaking_from_memory' }, explanation: 'Hier geht es nicht mehr um perfekte Vorgabe, sondern um flüssige eigene Produktion.' } ], 'Langzeitreview - Intensiv I': [ { exerciseTypeId: 2, title: 'Frühe Muster reaktivieren', instruction: 'Wähle den Ausdruck, der sicher im Langzeitgedächtnis sitzen sollte.', questionData: { type: 'multiple_choice', question: 'Welches frühe Fürsorgemuster musst du sofort wiedererkennen?', options: ['Nikaon na ka?', 'Asa ang porma?', 'Naa moy appointment?', 'Mubayad ko.'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: 'Das Langzeitreview holt sehr frühe Kernmuster bewusst wieder nach vorn.' }, { exerciseTypeId: 1, title: 'Frühe Preisfrage ergänzen', instruction: 'Fülle die Lücke mit dem passenden frühen Kernwort.', questionData: { type: 'gap_fill', text: '{gap} ni?', gaps: 1 }, answerData: { type: 'gap_fill', answers: ['Tagpila'] }, explanation: '"Tagpila ni?" gehört zu den wichtigsten frühen Alltagsfragen.' }, withTypeName('situational_response', { title: 'Frühe Routinen bündeln', instruction: 'Reagiere mit zwei sehr frühen Kernmustern.', questionData: { type: 'situational_response', question: 'Begrüße jemanden kurz und frage dann, ob die Person schon gegessen hat.', keywords: ['kumusta', 'nikaon'] }, answerData: { modelAnswer: 'Kumusta ka? Nikaon na ka?', keywords: ['kumusta', 'nikaon'] }, explanation: 'Das reviewt ganz bewusst sehr frühe, sehr wichtige Sozialmuster.' }) ], 'Langzeitreview - Intensiv II': [ { exerciseTypeId: 2, title: 'Frühe und späte Themen mischen', instruction: 'Wähle den Ausdruck, der zum Reaktivieren späterer Alltagsfelder gehört.', questionData: { type: 'multiple_choice', question: 'Welcher Ausdruck gehört klar zu Schule, Gesundheit oder Erledigungen?', options: ['resibo', 'Kumusta ka?', 'Palangga taka.', 'Sulod lang.'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"resibo" steht hier für spätere Erledigungs- und Alltagsblöcke.' }, { exerciseTypeId: 1, title: 'Gesundheit reaktivieren', instruction: 'Fülle die Lücke mit dem passenden Wort aus dem Gesundheitsbereich.', questionData: { type: 'gap_fill', text: 'Adto ta sa {gap}.', gaps: 1 }, answerData: { type: 'gap_fill', answers: ['doktor'] }, explanation: 'Auch späte Alltagsfelder sollen im Langzeitreview schnell wieder greifbar sein.' }, withTypeName('situational_response', { title: 'Späte Themen bündeln', instruction: 'Reagiere mit zwei kurzen Sätzen.', questionData: { type: 'situational_response', question: 'Sage, dass ihr zum Arzt geht, und erwähne danach ein Dokument oder einen Beleg.', keywords: ['doktor', 'resibo'] }, answerData: { modelAnswer: 'Adto ta sa doktor. Naa ko resibo.', keywords: ['doktor', 'resibo'] }, explanation: 'Das Langzeitreview mischt bewusst entfernte Themenfelder in einer kurzen Reaktion.' }) ], 'Hilfe & Unterstützung': [ { exerciseTypeId: 2, title: 'Um Hilfe bitten', instruction: 'Wähle die passendste Bitte um Unterstützung.', questionData: { type: 'multiple_choice', question: 'Wie fragst du höflich, ob dir jemand helfen kann?', options: ['Pwede ka motabang?', 'Asa ang sakayan?', 'Naa moy appointment?', 'Sulod lang.'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Pwede ka motabang?" ist eine direkte, natürliche Hilfsbitte.' }, { exerciseTypeId: 1, title: 'Hilfe anbieten ergänzen', instruction: 'Fülle die Lücke mit der passenden Hilfsformel.', questionData: { type: 'gap_fill', text: '{gap} tika.', gaps: 1 }, answerData: { type: 'gap_fill', answers: ['Tabangan'] }, explanation: '"Tabangan tika." bedeutet "Ich helfe dir."' }, withTypeName('situational_response', { title: 'Hilfe erfragen und anbieten', instruction: 'Reagiere in zwei kurzen Sätzen.', questionData: { type: 'situational_response', question: 'Bitte erst um Hilfe und bedanke dich danach kurz für die Unterstützung.', keywords: ['tabang', 'salamat'] }, answerData: { modelAnswer: 'Pwede ka motabang? Salamat sa tabang.', keywords: ['tabang', 'salamat'] }, explanation: 'Die Lektion verbindet Bitte und soziale Reaktion zu einem natürlichen Miniablauf.' }) ], 'Höflich reagieren und ablehnen': [ { exerciseTypeId: 2, title: 'Sanft ablehnen', instruction: 'Wähle die höflichste weiche Absage.', questionData: { type: 'multiple_choice', question: 'Wie lehnst du etwas freundlich und nicht zu direkt ab?', options: ['Dili lang sa karon.', 'Tabang!', 'Nikaon na ka?', 'Mubayad ko.'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Dili lang sa karon." klingt deutlich weicher als ein hartes Nein.' }, { exerciseTypeId: 1, title: 'Später statt jetzt', instruction: 'Fülle die Lücke mit der passenden weichen Reaktion.', questionData: { type: 'gap_fill', text: '{gap} na lang.', gaps: 1 }, answerData: { type: 'gap_fill', answers: ['Sunod'] }, explanation: '"Sunod na lang." verschiebt höflich auf später.' }, withTypeName('situational_response', { title: 'Höflich verschieben', instruction: 'Reagiere freundlich und weich.', questionData: { type: 'situational_response', question: 'Lehne eine Einladung höflich für heute ab und verschiebe sie auf später.', keywords: ['dili', 'sunod'] }, answerData: { modelAnswer: 'Dili lang sa karon. Sunod na lang.', keywords: ['dili', 'sunod'] }, explanation: 'Das ist genau die weiche soziale Reaktionsform dieser Lektion.' }) ], 'Feste & Einladungen': [ { exerciseTypeId: 2, title: 'Zur Feier einladen', instruction: 'Wähle die passende Einladungsformel.', questionData: { type: 'multiple_choice', question: 'Wie sagst du: "Ich lade dich ein"?', options: ['Giinvite tika.', 'Adto ta sa doktor.', 'Kapoy na ka?', 'Asa imong bag?'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Giinvite tika." ist eine alltagsnahe Einladungsform.' }, { exerciseTypeId: 1, title: 'Zur Fiesta fragen', instruction: 'Fülle die Lücke mit dem passenden Wort.', questionData: { type: 'gap_fill', text: 'Moadto ka sa {gap}?', gaps: 1 }, answerData: { type: 'gap_fill', answers: ['pista'] }, explanation: '"pista" steht hier für Feier oder Fiesta.' }, withTypeName('situational_response', { title: 'Einladung und Treffpunkt', instruction: 'Reagiere in zwei kurzen Sätzen.', questionData: { type: 'situational_response', question: 'Lade jemanden ein und sage, dass ihr euch dort trefft.', keywords: ['invite', 'didto'] }, answerData: { modelAnswer: 'Giinvite tika. Magkita ta didto.', keywords: ['invite', 'didto'] }, explanation: 'Die Lektion verbindet Einladung und Verabredung in einer natürlichen Sozialszene.' }) ], 'Freies Erzählen - Mein Alltag': [ { exerciseTypeId: 2, title: 'Tagesablauf einleiten', instruction: 'Wähle die passendste Einleitung für einen Tagesablauf.', questionData: { type: 'multiple_choice', question: 'Welche Formulierung passt gut als Start in einen erzählten Tagesablauf?', options: ['Sa buntag...', 'Pila ni tanan?', 'Asa ang porma?', 'Sulod lang.'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Sa buntag..." eröffnet natürlich einen erzählten Tagesabschnitt.' }, { exerciseTypeId: 1, title: 'Tagesabschnitt ergänzen', instruction: 'Fülle die Lücke mit dem passenden Zeitabschnitt.', questionData: { type: 'gap_fill', text: 'Sa {gap}...', gaps: 1 }, answerData: { type: 'gap_fill', answers: ['hapon'] }, explanation: '"Sa hapon..." ist eine häufige Einleitung für den Nachmittag.' }, { exerciseTypeId: 8, title: 'Eigenen Alltag erzählen', instruction: 'Sprich frei über deinen Tagesablauf.', questionData: { type: 'speaking_from_memory', question: 'Erzähle kurz, was du morgens, nachmittags und abends machst.', expectedText: 'Sa buntag... Sa hapon... Sa gabii...', keywords: ['buntag', 'hapon', 'gabii'] }, answerData: { type: 'speaking_from_memory' }, explanation: 'Hier steht die freie, zusammenhängende Produktion im Vordergrund.' } ], 'Freies Erzählen - Familie, Sorgen, Pläne': [ { exerciseTypeId: 2, title: 'Sorge ausdrücken', instruction: 'Wähle die Formulierung, mit der du eine leichte Sorge ausdrückst.', questionData: { type: 'multiple_choice', question: 'Wie sagst du natürlich: "Ich bin etwas besorgt"?', options: ['Naguol ko gamay.', 'Mubayad ko.', 'Sulod lang.', 'Tagpila ni?'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Naguol ko gamay." drückt eine leichte Sorge oder Niedergeschlagenheit aus.' }, { exerciseTypeId: 1, title: 'Plan ergänzen', instruction: 'Fülle die Lücke mit dem passenden Planungswort.', questionData: { type: 'gap_fill', text: 'Aduna koy {gap} unya.', gaps: 1 }, answerData: { type: 'gap_fill', answers: ['plano'] }, explanation: '"plano" ist hier das Schlüsselwort für einen bevorstehenden Plan.' }, { exerciseTypeId: 8, title: 'Familie, Sorge und Plan frei verbinden', instruction: 'Sprich frei in mehreren kurzen Sätzen.', questionData: { type: 'speaking_from_memory', question: 'Erzähle kurz von Familie, einer Sorge und einem Plan für später.', expectedText: 'Naguol ko gamay. Pero okay ra. Aduna koy plano unya.', keywords: ['naguol', 'okay', 'plano'] }, answerData: { type: 'speaking_from_memory' }, explanation: 'Diese Lektion trainiert freie Verbindung von Gefühl, Familie und Planung.' } ], 'Kultur, Familie & Sprache langfristig': [ { exerciseTypeId: 2, title: 'Kulturellen Kernbegriff erkennen', instruction: 'Wähle den Ausdruck, der stark mit respektvollem Umgang verbunden ist.', questionData: { type: 'multiple_choice', question: 'Welcher Ausdruck gehört besonders zum kulturellen Schwerpunkt von Respekt und Rücksicht?', options: ['respeto', 'plite', 'resibo', 'assignment'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"respeto" steht direkt für Respekt im sozialen Umgang.' }, { exerciseTypeId: 2, title: 'Familienkultur und Sprache', instruction: 'Wähle den Ausdruck, der besonders mit sozialem Miteinander verbunden ist.', questionData: { type: 'multiple_choice', question: 'Welcher Begriff verweist besonders auf gemeinschaftliches Mitziehen und gutes Miteinander?', options: ['pakikisama', 'doktor', 'ATM', 'sukli'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"pakikisama" ist ein zentraler kultureller Begriff für harmonisches Miteinander.' }, { exerciseTypeId: 8, title: 'Kulturelle Schlüsselwörter laut festigen', instruction: 'Sprich die kulturellen Schlüsselwörter laut und bewusst.', questionData: { type: 'speaking_from_memory', question: 'Sprich die Wörter respeto, pakikisama, amping und palihug laut und deutlich.', expectedText: 'respeto pakikisama amping palihug', keywords: ['respeto', 'pakikisama', 'amping', 'palihug'] }, answerData: { type: 'speaking_from_memory' }, explanation: 'Die Schlusslektion verankert kulturelle Schlüsselwörter bewusst als Langzeitmarker.' } ] }; async function resolveExerciseTypeId(exercise) { if (exercise.exerciseTypeId) { return exercise.exerciseTypeId; } const trimmedName = exercise.exerciseTypeName != null && exercise.exerciseTypeName !== '' ? String(exercise.exerciseTypeName).trim() : ''; if (!trimmedName) { throw new Error(`Kein exerciseTypeId oder exerciseTypeName für Übung "${exercise.title || 'unbenannt'}" definiert`); } const [type] = await sequelize.query( `SELECT id FROM community.vocab_grammar_exercise_type WHERE name = :name LIMIT 1`, { replacements: { name: trimmedName }, type: sequelize.QueryTypes.SELECT } ); if (!type) { throw new Error(`Übungstyp "${trimmedName}" nicht gefunden`); } return Number(type.id); } async function findOrCreateSystemUser() { let systemUser = await User.findOne({ where: { username: 'system' } }); if (!systemUser) { systemUser = await User.findOne({ where: { username: 'admin' } }); } if (!systemUser) { console.error('❌ System-Benutzer nicht gefunden.'); throw new Error('System user not found'); } return systemUser; } function getExercisesForLesson(lesson) { const lessonTitle = lesson.title; // Suche nach exaktem Titel if (BISAYA_EXERCISES[lessonTitle]) { return BISAYA_EXERCISES[lessonTitle]; } // Fallback: Suche nach Teilstring for (const [key, exercises] of Object.entries(BISAYA_EXERCISES)) { if (lessonTitle.includes(key) || key.includes(lessonTitle)) { return exercises; } } return generateExercisesFromDidactics(lesson); } async function createBisayaCourseContent() { await sequelize.authenticate(); console.log('Datenbankverbindung erfolgreich hergestellt.\n'); const systemUser = await findOrCreateSystemUser(); console.log(`Verwende System-Benutzer: ${systemUser.username} (ID: ${systemUser.id})\n`); // Finde alle Bisaya-Kurse const [bisayaLanguage] = await sequelize.query( `SELECT id FROM community.vocab_language WHERE name = 'Bisaya' LIMIT 1`, { type: sequelize.QueryTypes.SELECT } ); if (!bisayaLanguage) { console.error('❌ Bisaya-Sprache nicht gefunden.'); return; } const courses = await sequelize.query( `SELECT id, title, owner_user_id AS "ownerUserId" FROM community.vocab_course WHERE language_id = :languageId`, { replacements: { languageId: bisayaLanguage.id }, type: sequelize.QueryTypes.SELECT } ); console.log(`Gefunden: ${courses.length} Bisaya-Kurse\n`); let totalExercisesAdded = 0; let totalLessonsProcessed = 0; for (const course of courses) { console.log(`📚 Kurs: ${course.title} (ID: ${course.id})`); const lessons = await VocabCourseLesson.findAll({ where: { courseId: course.id }, order: [['lessonNumber', 'ASC']] }); console.log(` ${lessons.length} Lektionen gefunden\n`); for (const lesson of lessons) { const exercises = getExercisesForLesson(lesson); if (exercises.length === 0) { const existingCount = await VocabGrammarExercise.count({ where: { lessonId: lesson.id } }); if (existingCount > 0) { console.log(` ⏭️ Lektion ${lesson.lessonNumber}: "${lesson.title}" - bereits ${existingCount} Übung(en) vorhanden`); } else { console.log(` ⚠️ Lektion ${lesson.lessonNumber}: "${lesson.title}" - keine Übungen definiert`); } continue; } // Lektionen mit Platzhalter-Ersetzung: alte Übungen entfernen und durch echte ersetzen const replacePlaceholders = [ 'Woche 1 - Wiederholung', 'Woche 1 - Vokabeltest', 'Begrüßungen & Höflichkeit', 'Familienwörter', 'Essen & Fürsorge', 'Alltagsgespräche - Teil 1', 'Alltagsgespräche - Teil 2', 'Haus & Familie', 'Ort & Richtung', 'Zeitformen - Grundlagen' ].includes(lesson.title); const existingCount = await VocabGrammarExercise.count({ where: { lessonId: lesson.id } }); if (existingCount > 0 && !replacePlaceholders) { console.log(` ⏭️ Lektion ${lesson.lessonNumber}: "${lesson.title}" - bereits ${existingCount} Übung(en) vorhanden`); continue; } if (replacePlaceholders && existingCount > 0) { const deleted = await VocabGrammarExercise.destroy({ where: { lessonId: lesson.id } }); console.log(` 🗑️ Lektion ${lesson.lessonNumber}: "${lesson.title}" - ${deleted} Platzhalter entfernt`); } // Erstelle Übungen let exerciseNumber = 1; for (const exerciseData of exercises) { const exerciseTypeId = await resolveExerciseTypeId(exerciseData); await VocabGrammarExercise.create({ lessonId: lesson.id, exerciseTypeId, exerciseNumber: exerciseNumber++, title: exerciseData.title, instruction: exerciseData.instruction, questionData: JSON.stringify(exerciseData.questionData), answerData: JSON.stringify(exerciseData.answerData), explanation: exerciseData.explanation, createdByUserId: course.ownerUserId || systemUser.id }); totalExercisesAdded++; } console.log(` ✅ Lektion ${lesson.lessonNumber}: "${lesson.title}" - ${exercises.length} Übung(en) erstellt`); totalLessonsProcessed++; } console.log(''); } console.log(`\n🎉 Zusammenfassung:`); console.log(` ${totalLessonsProcessed} Lektionen bearbeitet`); console.log(` ${totalExercisesAdded} Grammatik-Übungen erstellt`); } createBisayaCourseContent() .then(() => { sequelize.close(); process.exit(0); }) .catch((error) => { console.error('❌ Fehler:', error); sequelize.close(); process.exit(1); });