#!/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 }; function normalizeText(value) { return String(value || '') .trim() .replace(/\s+/g, ' '); } function countWords(value) { return normalizeText(value).split(' ').filter(Boolean).length; } function collectExerciseAuditWarnings(lessonTitle, exerciseData, exerciseNumber) { const warnings = []; const questionData = exerciseData?.questionData || {}; const answerData = exerciseData?.answerData || {}; if (questionData.type !== 'gap_fill') return warnings; const text = String(questionData.text || ''); const answers = Array.isArray(answerData.answers) ? answerData.answers : []; if (!text || !answers.length) return warnings; const hints = []; const hintRegex = /\(([^)]+)\)/g; let match = hintRegex.exec(text); while (match) { hints.push(normalizeText(match[1])); match = hintRegex.exec(text); } for (let i = 0; i < Math.min(answers.length, hints.length); i += 1) { const answer = normalizeText(answers[i]); const hint = hints[i]; if (!answer || !hint) continue; const answerWords = countWords(answer); const hintWords = countWords(hint); if (answerWords <= 2 && hintWords >= 4) { warnings.push( `[${lessonTitle} #${exerciseNumber}] Gap-Fill-Hinweis wirkt zu lang für eine Kurzantwort: "${answer}" <-> "${hint}"` ); } } return warnings; } function buildCorePatternGlossLookup(didactics) { const map = new Map(); const patterns = Array.isArray(didactics?.corePatterns) ? didactics.corePatterns : []; patterns.forEach((entry) => { const normalized = normalizeCorePatternEntry(entry); if (!normalized?.target || !normalized?.gloss) return; map.set(normalized.target.toLowerCase(), normalized.gloss); }); return map; } function phraseWordCount(value) { return countWords(value); } function isPhraseLike(value) { return phraseWordCount(value) >= 2; } function normalizeQuotedPrompt(value) { return normalizeText(String(value || '').replace(/[„“"']/g, '')); } function firstQuotedContent(value) { const text = String(value || ''); const doubleQuote = text.match(/"([^"]+)"/); if (doubleQuote?.[1]) return normalizeText(doubleQuote[1]); const deQuote = text.match(/„([^“]+)“/); if (deQuote?.[1]) return normalizeText(deQuote[1]); const singleQuote = text.match(/'([^']+)'/); if (singleQuote?.[1]) return normalizeText(singleQuote[1]); return ''; } function addUniquePattern(out, seen, target, gloss) { const t = normalizeText(target); const g = normalizeText(gloss); if (!t || !g) return; if (!isPhraseLike(t)) return; const key = `${t.toLowerCase()}|${g.toLowerCase()}`; if (seen.has(key)) return; seen.add(key); out.push({ target: t, gloss: g }); } function extractPairsFromGapFill(questionData, answerData, out, seen) { const text = String(questionData?.text || ''); const answers = Array.isArray(answerData?.answers) ? answerData.answers : []; if (!text || answers.length === 0) return; const hints = []; const hintRegex = /\(([^)]+)\)/g; let match = hintRegex.exec(text); while (match) { hints.push(normalizeText(match[1])); match = hintRegex.exec(text); } for (let i = 0; i < Math.min(answers.length, hints.length); i += 1) { addUniquePattern(out, seen, answers[i], hints[i]); } } function extractPairsFromTransformation(questionData, answerData, out, seen) { const src = normalizeText(questionData?.text || ''); const trg = normalizeText(answerData?.correct || ''); if (!src || !trg) return; const sourceLanguage = normalizeText(questionData?.sourceLanguage || '').toLowerCase(); const targetLanguage = normalizeText(questionData?.targetLanguage || '').toLowerCase(); if (sourceLanguage === 'deutsch' || targetLanguage === 'bisaya') { addUniquePattern(out, seen, trg, src); return; } addUniquePattern(out, seen, src, trg); } function extractPairsFromMultipleChoice(questionData, answerData, out, seen) { const question = normalizeText(questionData?.question || ''); const options = Array.isArray(questionData?.options) ? questionData.options : []; const index = Number(answerData?.correctAnswer); const correct = normalizeText(options[index] || ''); if (!question || !correct) return; const quoted = firstQuotedContent(question); const lower = question.toLowerCase(); if (!quoted) return; if (lower.startsWith('was bedeutet')) { addUniquePattern(out, seen, quoted, correct); return; } if (lower.startsWith('wie sagt man')) { addUniquePattern(out, seen, correct, normalizeQuotedPrompt(quoted)); } } function deriveLessonCorePatternsFromExercises(exercises) { const out = []; const seen = new Set(); (Array.isArray(exercises) ? exercises : []).forEach((exercise) => { const questionData = exercise?.questionData || {}; const answerData = exercise?.answerData || {}; const type = String(questionData?.type || ''); if (type === 'gap_fill') { extractPairsFromGapFill(questionData, answerData, out, seen); } else if (type === 'transformation') { extractPairsFromTransformation(questionData, answerData, out, seen); } else if (type === 'multiple_choice') { extractPairsFromMultipleChoice(questionData, answerData, out, seen); } }); return out; } function mergeCorePatternsForLesson(didactics, exerciseDerived, minCount = 8) { const out = []; const seen = new Set(); const basePatterns = Array.isArray(didactics?.corePatterns) ? didactics.corePatterns : []; basePatterns.forEach((entry) => { const normalized = normalizeCorePatternEntry(entry); if (!normalized?.target || !normalized?.gloss) return; addUniquePattern(out, seen, normalized.target, normalized.gloss); }); exerciseDerived.forEach((entry) => { addUniquePattern(out, seen, entry?.target, entry?.gloss); }); if (out.length >= minCount) return out; return out; } function normalizeGrammarFocusEntry(entry) { if (!entry || typeof entry !== 'object') return null; const title = normalizeText(entry.title || ''); const text = normalizeText(entry.text || ''); const example = normalizeText(entry.example || ''); if (!title || !text) return null; return { title, text, ...(example ? { example } : {}) }; } function buildGrammarCurriculumFocus(lesson) { const lessonNumber = Number(lesson?.lessonNumber || 0); const title = normalizeText(lesson?.title || '').toLowerCase(); const out = []; if (lessonNumber >= 1 && lessonNumber <= 10) { out.push({ title: 'Kernaussage + Ergänzung', text: 'Im Alltag funktionieren kurze Muster am besten: Aussage zuerst, dann Ort/Zeit/Detail.', example: 'Naa ko sa balay. / Moadto ko unya.' }); } if (lessonNumber >= 11 && lessonNumber <= 20) { out.push({ title: 'Präsens, Vergangenheit, Zukunft', text: 'In diesem Kurs arbeitest du mit klaren Zeitmarkern: Gegenwart über Kontext oder nag-/ga-, Vergangenheit oft mit ni-, Zukunft mit mo-.', example: 'Nagkaon ko. / Ni-kaon ko. / Mo-kaon ko.' }); } if (title.includes('zeitformen')) { out.push( { title: 'Vergangenheit mit ni-', text: 'ni- markiert häufig abgeschlossene Handlungen in der Vergangenheit.', example: 'Ni-adto ko. (Ich bin gegangen.)' }, { title: 'Zukunft/Absicht mit mo-', text: 'mo- markiert häufig Zukünftiges oder eine geplante Handlung.', example: 'Mo-adto ko. (Ich werde gehen.)' } ); } if (lessonNumber >= 21) { out.push({ title: 'Aspekt statt starrer Zeiten', text: 'Bisaya nutzt im Alltag oft Aspektmarker und Kontext statt fixer Tempusformen. Zeitwörter wie karon, ganiha, ugma helfen bei der Einordnung.', example: 'Niadto ko ganiha. / Moadto ko ugma.' }); } return out.map((entry) => normalizeGrammarFocusEntry(entry)).filter(Boolean); } function mergeGrammarFocusForLesson(existingFocus, curriculumFocus) { const out = []; const seen = new Set(); const pushUnique = (entry) => { const normalized = normalizeGrammarFocusEntry(entry); if (!normalized) return; const key = `${normalized.title.toLowerCase()}|${normalized.text.toLowerCase()}`; if (seen.has(key)) return; seen.add(key); out.push(normalized); }; (Array.isArray(existingFocus) ? existingFocus : []).forEach(pushUnique); (Array.isArray(curriculumFocus) ? curriculumFocus : []).forEach(pushUnique); return out; } function buildZeitformenDrills(lessonTitle) { return [ { exerciseTypeName: 'transformation', title: `${lessonTitle}: Vergangenheit bilden`, instruction: 'Übersetze den Satz ins Bisaya.', questionData: { type: 'transformation', text: 'Ich bin zum Markt gegangen.', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Ni-adto ko sa merkado.', alternatives: ['Niadto ko sa merkado.', 'Niadto ko sa merkado.'] }, explanation: 'Vergangenheit wird hier mit ni- markiert.' }, { exerciseTypeName: 'transformation', title: `${lessonTitle}: Zukunft bilden`, instruction: 'Übersetze den Satz ins Bisaya.', questionData: { type: 'transformation', text: 'Ich werde morgen nach Hause gehen.', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Mo-adto ko sa balay ugma.', alternatives: ['Moadto ko sa balay ugma.', 'Mo uli ko ugma.'] }, explanation: 'Zukünftiges wird hier mit mo- plus Zeitwort (ugma) markiert.' } ]; } function sanitizeGapFillHintText(lessonTitle, text, answers, glossLookup) { const source = String(text || ''); const normalizedAnswers = Array.isArray(answers) ? answers.map((answer) => normalizeText(answer)) : []; if (!source || normalizedAnswers.length === 0) { return { text: source, fixes: [], warnings: [] }; } const hintRegex = /\(([^)]+)\)/g; let hintIndex = 0; const fixes = []; const warnings = []; const rebuilt = source.replace(hintRegex, (full, inner) => { const answer = normalizedAnswers[hintIndex] || ''; const hint = normalizeText(inner); hintIndex += 1; if (!answer || !hint) return full; const answerWords = countWords(answer); const hintWords = countWords(hint); if (!(answerWords <= 2 && hintWords >= 4)) { return full; } const mappedGloss = normalizeText(glossLookup.get(answer.toLowerCase()) || ''); if (mappedGloss && countWords(mappedGloss) <= 3) { fixes.push(`[${lessonTitle}] "${answer}": "${hint}" -> "${mappedGloss}"`); return `(${mappedGloss})`; } warnings.push( `[${lessonTitle}] Keine sichere Gloss für "${answer}" gefunden; langer Hinweis bleibt: "${hint}"` ); return full; }); return { text: rebuilt, fixes, warnings }; } function sanitizeExerciseForConsistency(lesson, exerciseData, didactics) { const exercise = { ...exerciseData }; const questionData = { ...(exerciseData?.questionData || {}) }; const answerData = { ...(exerciseData?.answerData || {}) }; const fixes = []; const warnings = []; if (questionData.type === 'gap_fill') { const glossLookup = buildCorePatternGlossLookup(didactics); const sanitized = sanitizeGapFillHintText( lesson.title, questionData.text, Array.isArray(answerData.answers) ? answerData.answers : [], glossLookup ); if (sanitized.text !== questionData.text) { questionData.text = sanitized.text; fixes.push(...sanitized.fixes); } warnings.push(...sanitized.warnings); } exercise.questionData = questionData; exercise.answerData = answerData; return { exercise, fixes, warnings }; } function normalizeCorePatternEntry(entry) { if (entry === null || entry === undefined || entry === '') { return null; } if (typeof entry === 'object' && !Array.isArray(entry)) { const target = normalizeText(entry.target ?? entry.ceb ?? entry.phrase ?? ''); const gloss = normalizeText(entry.gloss ?? entry.de ?? entry.translation ?? ''); if (!target) return null; return { target, gloss }; } const s = normalizeText(entry); if (!s) return null; const pipe = s.indexOf('|'); if (pipe !== -1) { const target = normalizeText(s.slice(0, pipe)); const gloss = normalizeText(s.slice(pipe + 1)); if (!target) return null; return { target, gloss }; } return { target: s, gloss: '' }; } function corePatternTarget(entry) { const n = normalizeCorePatternEntry(entry); return n ? n.target : ''; } const GENERIC_DISTRACTOR_PATTERNS = Array.from(new Set( Object.values(GENERATED_BISAYA_DIDACTICS) .flatMap((entry) => Array.isArray(entry?.corePatterns) ? entry.corePatterns : []) .map((pattern) => corePatternTarget(pattern)) .filter(Boolean) )).slice(0, 200); 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) => normalizeCorePatternEntry(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 = corePatternTarget(corePatterns[0]); const patternB = corePatternTarget(corePatterns[1] || corePatterns[0]); const lessonPool = Array.from(new Set([ ...corePatterns.map((p) => corePatternTarget(p)), ...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) ]; if (String(lesson.title || '').toLowerCase().includes('zeitformen')) { generated.push(...buildZeitformenDrills(lesson.title)); } } 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: 'Müdigkeit erkennen', instruction: 'Wähle die passende Frage vor dem Schlafengehen.', questionData: { type: 'multiple_choice', question: 'Wie fragst du: "Bist du schon müde?"', options: ['Kapoy na ka?', 'Kumusta ka?', 'Asa ang sakayan?', 'Tagpila ni?'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Kapoy na ka?" ist eine natürliche Frage in der Abendroutine.' }, { exerciseTypeId: 1, title: 'Schlafensroutine ergänzen', instruction: 'Fülle die Lücken mit den passenden Wörtern.', questionData: { type: 'gap_fill', text: '{gap} na ta. Inom sa og {gap}.', gaps: 2 }, answerData: { type: 'gap_fill', answers: ['Matulog', 'tubig'] }, explanation: '"Matulog na ta." und "Inom sa og tubig." ergeben zusammen eine sehr alltagsnahe Schlafensroutine.' }, { exerciseTypeId: 2, title: 'Licht aus erkennen', instruction: 'Wähle die passende Abendaufforderung.', questionData: { type: 'multiple_choice', question: 'Wie sagst du: "Mach das Licht aus"?', options: ['Patya ang suga.', 'Kumusta ka?', 'Mubayad ko.', 'Asa ang merkado?'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Patya ang suga." ist eine typische kurze Abendaufforderung.' }, { exerciseTypeId: 2, title: 'Zudecken und Schlafwunsch', instruction: 'Wähle die passende warme Abendformel.', questionData: { type: 'multiple_choice', question: 'Welche Formulierung passt am besten zu "Deck dich zu und träum schön"?', options: ['Tabuni ang imong kaugalingon. Damgo og nindot.', 'Tagpila ni? Salamat.', 'Asa ang sakayan? Amping.', 'Kumusta ka? Maayo ko.'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: 'Diese Kombination klingt sehr familientypisch und warm.' }, { 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.' }, { exerciseTypeId: 8, title: 'Kurze Schlafensroutine sprechen', instruction: 'Sprich eine kleine Abendroutine laut.', questionData: { type: 'speaking_from_memory', question: 'Sprich: "Bist du müde? Lass uns schlafen gehen. Trink erst etwas Wasser."', expectedText: 'Kapoy na ka? Matulog na ta. Inom sa og tubig.', keywords: ['kapoy', 'matulog', 'tubig'] }, answerData: { type: 'speaking_from_memory' }, explanation: 'So wird aus Einzelwörtern eine kleine familiennahe Abendsequenz.' }, { exerciseTypeId: 8, title: 'Abendsequenz mit morgen sprechen', instruction: 'Sprich eine warme Schlusssequenz für den Abend laut.', questionData: { type: 'speaking_from_memory', question: 'Sprich: "Mach das Licht aus. Deck dich zu. Bis morgen. Träum was Schönes."', expectedText: 'Patya ang suga. Tabuni ang imong kaugalingon. Ugma nasad. Damgo og nindot.', keywords: ['suga', 'tabuni', 'ugma', 'damgo'] }, answerData: { type: 'speaking_from_memory' }, explanation: 'Die Übung verbindet mehrere kleine Familienformeln zu einer natürlichen Abendsequenz.' } ], // 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 "jüngerer Bruder" auf Bisaya?', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "jüngerer Bruder" auf Bisaya?', options: ['Dodong', 'Inday', 'Kuya', 'Ate'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Dodong" ist die gängige Bisaya-Bezeichnung für einen jüngeren Bruder (von älteren Geschwistern aus gesehen).' }, { exerciseTypeId: 2, // multiple_choice title: 'Wie sagt man "jüngere Schwester" auf Bisaya?', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Wie sagt man "jüngere Schwester" auf Bisaya?', options: ['Inday', 'Dodong', 'Ate', 'Kuya'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '"Inday" ist die gängige Bisaya-Bezeichnung für eine jüngere Schwester (von älteren Geschwistern aus gesehen).' }, { 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} (jüngerer Bruder) | {gap} (jüngere Schwester) | {gap} (Großmutter) | {gap} (Großvater)', gaps: 8 }, answerData: { type: 'gap_fill', answers: ['Nanay', 'Tatay', 'Kuya', 'Ate', 'Dodong', 'Inday', 'Lola', 'Lolo'] }, explanation: 'Nanay = Mutter, Tatay = Vater, Kuya = älterer Bruder, Ate = ältere Schwester, Dodong = jüngerer Bruder, Inday = jüngere 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.' }) ], 'Familie - Verwandte & Stieffamilie': [ { exerciseTypeId: 2, title: 'Onkel auf Bisaya', instruction: 'Wähle die übliche Bisaya-Bezeichnung.', questionData: { type: 'multiple_choice', question: 'Wie sagt man „Onkel“ in dieser Lektion?', options: ['Tito', 'Tatay', 'Kuya', 'Lolo'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Tito“ ist die gängige, spanisch geprägte Form für Onkel und wird oft auch respektvoll für nahe Bekannte genutzt.' }, { exerciseTypeId: 2, title: 'Tante auf Bisaya', instruction: 'Wähle die übliche Bisaya-Bezeichnung.', questionData: { type: 'multiple_choice', question: 'Wie sagt man „Tante“ in dieser Lektion?', options: ['Tita', 'Nanay', 'Ate', 'Lola'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Tita“ ist die gängige Form für Tante.' }, { exerciseTypeId: 2, title: 'Enkelsohn präzisieren', instruction: 'Wähle die präzise Form mit Geschlecht.', questionData: { type: 'multiple_choice', question: 'Wie sagt man „Enkelsohn“ klar und eindeutig?', options: ['Apo nga lalaki', 'Apo nga babaye', 'Pamangkin nga lalaki', 'Primo'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Apo“ allein ist mehrdeutig; mit nga lalaki / nga babaye meint man Enkelsohn bzw. Enkelin.' }, { exerciseTypeId: 2, title: 'Nichte benennen', instruction: 'Wähle die passende Form.', questionData: { type: 'multiple_choice', question: 'Wie sagt man „Nichte“?', options: ['Pamangkin nga babaye', 'Pamangkin nga lalaki', 'Prima', 'Inday'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Pamangkin nga babaye“ = Nichte; „Pamangkin nga lalaki“ = Neffe.' }, { exerciseTypeId: 2, title: 'Cousin und Cousine', instruction: 'Ordne die weibliche Form.', questionData: { type: 'multiple_choice', question: 'Welches Wort passt zu „Cousine“?', options: ['Prima', 'Primo', 'Tita', 'Ate'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Primo“ = Cousin (männlich), „Prima“ = Cousine – gängige Lehnformen.' }, { exerciseTypeId: 2, title: 'Stiefvater', instruction: 'Wähle die im Kurs geübte Umschreibung.', questionData: { type: 'multiple_choice', question: 'Welche Form nutzt du für „Stiefvater“?', options: ['Ikaduha nga Tatay', 'Tatay sa lain', 'Lolo', 'Kuya'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Ikaduha nga Tatay“ (wörtlich zweiter Vater) ist eine verständliche, alltagstaugliche Umschreibung.' }, { exerciseTypeId: 2, title: 'Stiefmutter', instruction: 'Wähle die passende Umschreibung.', questionData: { type: 'multiple_choice', question: 'Welche Form passt zu „Stiefmutter“?', options: ['Ikaduha nga Nanay', 'Nanay', 'Tita', 'Ate'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Ikaduha nga Nanay“ entspricht der gleichen Logik wie beim Stiefvater.' }, { exerciseTypeId: 1, title: 'Verwandtschaft – erste Reihe', instruction: 'Fülle die Lücken (exakt wie in der Lektion).', questionData: { type: 'gap_fill', text: '{gap} (Onkel) | {gap} (Tante) | {gap} (Cousin) | {gap} (Cousine)', gaps: 4 }, answerData: { type: 'gap_fill', answers: ['Tito', 'Tita', 'Primo', 'Prima'] }, explanation: 'Tito/Tita und Primo/Prima sind die Kernpaare für die erweiterte Verwandtschaft.' }, { exerciseTypeId: 1, title: 'Enkel und Pamangkin', instruction: 'Fülle die Lücken mit den Geschlechtsformen.', questionData: { type: 'gap_fill', text: '{gap} (Enkelsohn) | {gap} (Enkelin) | {gap} (Neffe) | {gap} (Nichte)', gaps: 4 }, answerData: { type: 'gap_fill', answers: ['Apo nga lalaki', 'Apo nga babaye', 'Pamangkin nga lalaki', 'Pamangkin nga babaye'] }, explanation: 'Mit nga lalaki / nga babaye unterscheidest du bei Apo und Pamangkin das Geschlecht klar.' }, { exerciseTypeId: 1, title: 'Stieffamilie ergänzen', instruction: 'Fülle die Lücken.', questionData: { type: 'gap_fill', text: '{gap} (Stiefvater) | {gap} (Stiefmutter) | {gap} (Stiefsohn) | {gap} (Stieftochter)', gaps: 4 }, answerData: { type: 'gap_fill', answers: [ 'Ikaduha nga Tatay', 'Ikaduha nga Nanay', 'Anak sa ikaduha nga Tatay', 'Anak sa ikaduha nga Nanay' ] }, explanation: 'Stieffamilie wird oft mit Ikaduha nga … und anak sa … beschrieben statt mit einem einzigen Wort wie im Deutschen.' }, { exerciseTypeId: 4, title: 'Stiefvater übersetzen', instruction: 'Übersetze ins Bisaya (Form aus der Lektion).', questionData: { type: 'transformation', text: 'Stiefvater', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Ikaduha nga Tatay', alternatives: ['Ikaduha nga Tatay', 'ikaduha nga tatay'] }, explanation: 'Die Groß-/Kleinschreibung ist in der Bewertung oft tolerant; Inhalt zählt.' }, { exerciseTypeId: 3, title: 'Onkel vorstellen', instruction: 'Ordne die Wörter zu einem kurzen Satz.', questionData: { type: 'sentence_building', question: 'Baue: „Das ist mein Onkel.“', tokens: ['Si', 'Tito', 'nako', 'ni'] }, answerData: { correct: ['Si Tito nako ni.', 'Si Tito ni nako.'] }, explanation: 'Gleiches Muster wie bei Nanay: Si … nako ni.' }, withTypeName('situational_response', { title: 'Stieffamilie kurz erklären', instruction: 'Antworte kurz auf Bisaya.', questionData: { type: 'situational_response', question: 'Jemand fragt, wer der Mann neben deiner Mutter ist – es ist dein Stiefvater. Antworte in einem kurzen Satz.', keywords: ['ikaduha', 'tatay'] }, answerData: { modelAnswer: 'Ikaduha nga Tatay nako.', keywords: ['ikaduha', 'tatay'] }, explanation: '„Ikaduha nga Tatay nako.“ ist eine klare, höfliche Kurzantwort.' }) ], '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.' }), { exerciseTypeId: 2, title: '„Sehr lecker" erkennen', instruction: 'Wähle die passende Bedeutung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet „lami kaayo"?', options: ['Sehr lecker', 'Zu salzig', 'Zu kalt', 'Noch nicht fertig'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Lami kaayo" drückt aus, dass das Essen sehr gut schmeckt.' }, { exerciseTypeId: 4, title: 'Dank für das Essen', instruction: 'Übersetze ins Bisaya.', questionData: { type: 'transformation', text: 'Danke für das Essen', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Salamat sa pagkaon', alternatives: ['Salamat sa kaon', 'Daghang salamat sa pagkaon'] }, explanation: '„Salamat sa pagkaon" ist eine natürliche Danksagung nach dem Essen.' } ], // Lektion: Haus & Familie (Haus, Räume, Familie, typische Kurzsätze) 'Haus & Familie': [ { exerciseTypeId: 2, title: '„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“ ist das gängige Wort für Haus.' }, { exerciseTypeId: 2, title: '„Zimmer“ auf Bisaya', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Wie sagt man „Zimmer“ auf Bisaya?', options: ['Kwarto', 'Balay', 'Kusina', 'Sala'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Kwarto“ bezeichnet ein Zimmer (oft Schlafzimmer).' }, { exerciseTypeId: 2, title: '„Küche“ auf Bisaya', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Wie sagt man „Küche“ auf Bisaya?', options: ['Kusina', 'Sala', 'Banyo', 'Kwarto'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Kusina“ kommt aus dem Spanischen und ist überall verbreitet.' }, { exerciseTypeId: 2, title: '„Wohnzimmer“ auf Bisaya', instruction: 'Wähle die übliche Bezeichnung.', questionData: { type: 'multiple_choice', question: 'Wie sagt man oft „Wohnzimmer“?', options: ['Sala', 'Kwarto', 'Kusina', 'Banyo'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Sala“ ist das übliche Wort für das Wohnzimmer.' }, { exerciseTypeId: 2, title: '„Badezimmer“ auf Bisaya', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Wie sagt man „Badezimmer“?', options: ['Banyo', 'Kusina', 'Sala', 'Atop'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Banyo“ wird für Bad/Badezimmer verwendet.' }, { exerciseTypeId: 2, title: '„Tür“ und „Fenster“', instruction: 'Ordne die Bedeutung zu.', questionData: { type: 'multiple_choice', question: 'Welches Wort bedeutet „Tür“?', options: ['Pultahan', 'Bintana', 'Atop', 'Balay'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Pultahan“ = Tür; „Bintana“ = Fenster; „Atop“ = Dach.' }, { exerciseTypeId: 2, title: 'Frage nach dem Ort', instruction: 'Wähle die passende deutsche Bedeutung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet „Asa ang kusina?"?', options: ['Wo ist die Küche?', 'Wo ist das Bad?', 'Wo ist Papa?', 'Was isst du?'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Asa“ fragt nach dem Ort; „ang kusina“ = die Küche.' }, { exerciseTypeId: 2, title: '„Familie“ und „unsere Familie“', instruction: 'Wähle die richtige Form.', questionData: { type: 'multiple_choice', question: 'Wie sagt man „unsere Familie“?', options: ['Among pamilya', 'Akoang pamilya', 'Imong pamilya', 'Iyang pamilya'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Among“ = unser (inklusiv wir); passt gut zur Familie.' }, { exerciseTypeId: 1, title: 'Haus und Räume – Lücken', instruction: 'Fülle die Lücken (exakt wie in der Lektion).', questionData: { type: 'gap_fill', text: '{gap} (Haus) | {gap} (Zimmer) | {gap} (Küche) | {gap} (Wohnzimmer) | {gap} (Badezimmer) | {gap} (Familie)', gaps: 6 }, answerData: { type: 'gap_fill', answers: ['Balay', 'Kwarto', 'Kusina', 'Sala', 'Banyo', 'Pamilya'] }, explanation: 'Die sechs Wörter bilden den Kernwortschatz dieser Lektion.' }, { exerciseTypeId: 1, title: 'Zu Hause sein', instruction: 'Ergänze das passende Wort.', questionData: { type: 'gap_fill', text: 'Naa ko sa {gap}. (Ich bin zu Hause.)', gaps: 1 }, answerData: { type: 'gap_fill', answers: ['balay'] }, explanation: '„Naa ko sa balay.“ = Ich bin zu Hause.' }, { exerciseTypeId: 4, title: 'Unser Haus benennen', instruction: 'Übersetze den kurzen Satz ins Bisaya (nur Wortschatz und Muster aus dieser Lektion).', questionData: { type: 'transformation', text: 'Unser Haus.', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Ang among balay', alternatives: ['Among balay.', 'Ang among balay.'] }, explanation: '„Ang among balay.“ = unser Haus; „among“ (inklusiv) und „balay“ sind die Lernziele dieser Einheit.' }, { exerciseTypeId: 4, title: 'In der Küche', instruction: 'Übersetze den Satz ins Bisaya.', questionData: { type: 'transformation', text: 'Sie sind in der Küche.', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Naa sila sa kusina', alternatives: ['Naa sila sa kusina.', 'naa sila sa kusina'] }, explanation: '„Naa sila sa …“ = Sie sind in/am …' }, withTypeName('dialog_completion', { title: 'Nach der Küche fragen', instruction: 'Ergänze die passende Antwort (Ortsangaben wie didto/luyo kommen in der nächsten Lektion).', questionData: { type: 'dialog_completion', question: 'Welche Antwort passt?', dialog: ['A: Asa ang kusina?', 'B: ...'] }, answerData: { modelAnswer: 'Naa sila sa kusina.', correct: [ 'Naa sila sa kusina.', 'Naa siya sa kusina.', 'Naa ko sa kusina.', 'Sa kusina.' ] }, explanation: 'Mit „Naa … sa kusina“ kannst du sagen, wo sich jemand befindet – dasselbe Muster wie „Naa sila sa kusina.“ in der Lektion.' }), withTypeName('situational_response', { title: 'Zu Hause kurz beschreiben', instruction: 'Antworte in einem kurzen Satz auf Bisaya.', questionData: { type: 'situational_response', question: 'Jemand fragt, wo du bist. Sage, dass du zu Hause bist.', keywords: ['naa', 'balay'] }, answerData: { modelAnswer: 'Naa ko sa balay.', keywords: ['naa', 'balay'] }, explanation: '„Naa ko sa balay.“ ist die natürliche Kurzantwort.' }) ], // 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.' }, { exerciseTypeId: 2, title: 'Ni- oder Mo- wählen', instruction: 'Wähle das Präfix für die Zukunft.', questionData: { type: 'multiple_choice', question: 'Welches Präfix steht typischerweise für die Zukunft?', options: ['Mo-', 'Ni-', 'Ka-', 'Gi-'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Mo-" markiert Zukunft, „Ni-" markiert Vergangenheit.' } ], // 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.' }, { exerciseTypeId: 4, title: '„Danke" auf Bisaya', instruction: 'Übersetze ins Bisaya.', questionData: { type: 'transformation', text: 'Danke', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Salamat', alternatives: ['Daghang salamat', 'Salamat kaayo'] }, explanation: '„Salamat" ist die grundlegende Danksagung.' }, withTypeName('dialog_completion', { title: 'Höflich nach Wiederholung fragen', instruction: 'Ergänze die passende Bitte.', questionData: { type: 'dialog_completion', question: 'Welche Antwort passt, wenn du etwas nicht verstanden hast?', dialog: ['A: Wala ko kasabot.', 'B: ...'] }, answerData: { modelAnswer: 'Palihug ka mubalik.', correct: ['Palihug ka mubalik.', 'Palihug balika.'] }, explanation: 'Nach „Wala ko kasabot" folgt oft eine höfliche Bitte um Wiederholung.' }), withTypeName('situational_response', { title: 'Höflich um langsames Sprechen bitten', instruction: 'Reagiere kurz und höflich.', questionData: { type: 'situational_response', question: 'Bitte jemanden, etwas langsamer zu sprechen, weil du nur wenig verstehst.', keywords: ['hinay', 'kasabot'] }, answerData: { modelAnswer: 'Hinay-hinay lang. Wala ko kasabot tanan.', keywords: ['hinay', 'kasabot'] }, explanation: '„Hinay-hinay lang" kombiniert mit Verständnisproblem ist sehr alltagstauglich.' }) ], // 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".' }, { exerciseTypeId: 4, title: '„Wo ist die Toilette?" übersetzen', instruction: 'Übersetze ins Bisaya.', questionData: { type: 'transformation', text: 'Wo ist die Toilette?', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Asa ang CR?', alternatives: ['Asa ang banyo?', 'Asa dapit ang CR?'] }, explanation: '„Asa ang CR?" ist die gängige Kurzform für die Toilette.' }, withTypeName('dialog_completion', { title: 'Verständnisproblem klären', instruction: 'Ergänze die höfliche Bitte.', questionData: { type: 'dialog_completion', question: 'Was sagst du, wenn du nichts verstanden hast?', dialog: ['A: Kumusta ka?', 'B: Wala ko kasabot. ...'] }, answerData: { modelAnswer: 'Palihug ka mubalik.', correct: ['Palihug ka mubalik.', 'Palihug balika.'] }, explanation: 'Nach dem Verständnisproblem folgt oft eine Bitte um Wiederholung.' }) ], 'Ü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.' }, { exerciseTypeId: 2, title: '„Entschuldigung" erkennen', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet „Pasensya"?', options: ['Entschuldigung / Geduld bitte', 'Danke', 'Bitte', 'Guten Tag'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Pasensya" nutzt man für Entschuldigung oder um Geduld zu bitten.' }, withTypeName('pattern_drill', { title: 'Preisfrage bilden', instruction: 'Bilde die übliche Kurzfrage nach dem Preis.', questionData: { type: 'pattern_drill', question: 'Verwende „Tagpila" für dieses Ding vor dir.', pattern: 'Tagpila + ni?' }, answerData: { modelAnswer: 'Tagpila ni?', correct: ['Tagpila ni?', 'Tagpila man ni?'] }, explanation: '„Tagpila ni?" ist die Standard-Preisfrage für ein konkretes Objekt.' }) ], // 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? (wo/wohin) | {gap} imong plano? (was)', 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}. (Haus) | Moadto ko sa {gap}. (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 später zum Markt', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Moadto ko sa merkado unya', alternatives: ['Adto ko sa merkado unya', 'Moadto ko sa merkado karon'] }, explanation: '"Moadto ko sa merkado unya" passt zum in dieser Lektion eingeführten Alltagswortschatz rund um Wege und Markt.' } ], // 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.' }), { exerciseTypeId: 2, title: '„Komm rein" auf Bisaya', instruction: 'Wähle die passende Formulierung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet „Sulod lang"?', options: ['Komm (einfach) rein', 'Geh nach Hause', 'Warte draußen', 'Wir gehen essen'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Sulod lang" lädt den Gast ein, hereinzukommen.' }, { exerciseTypeId: 4, title: 'Einladung übersetzen', instruction: 'Übersetze ins Bisaya.', questionData: { type: 'transformation', text: 'Setz dich.', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Lingkod sa.', alternatives: ['Lingkod lang.', 'Palihug lingkod.'] }, explanation: '„Lingkod sa." ist eine häufige, kurze Aufforderung zum Hinsetzen.' }, withTypeName('dialog_completion', { title: 'Besuch höflich aufnehmen', instruction: 'Ergänze die passende Begrüßung.', questionData: { type: 'dialog_completion', question: 'Was sagst du zuerst, wenn jemand ankommt?', dialog: ['A: Maayong adlaw!', 'B: ...'] }, answerData: { modelAnswer: 'Sulod lang.', correct: ['Sulod lang.', 'Sulod lang diri.'] }, explanation: 'Nach der Begrüßung folgt oft die Einladung hereinzukommen.' }) ], '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.' }), { exerciseTypeId: 2, title: 'Kopfschmerz erkennen', instruction: 'Wähle die richtige Bedeutung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet „sakit imong ulo"?', options: ['Hast du Kopfschmerzen?', 'Hast du Hunger?', 'Bist du müde?', 'Hast du Zeit?'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Ulo" ist der Kopf; die Frage zielt auf Kopfschmerzen.' }, { exerciseTypeId: 4, title: 'Ruhe empfehlen', instruction: 'Übersetze ins Bisaya.', questionData: { type: 'transformation', text: 'Ruh dich aus.', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Magpahuway sa.', alternatives: ['Pahuway sa una.', 'Magpahuway una.'] }, explanation: '„Magpahuway sa." ist eine häufige Fürsorgeformel bei Krankheit.' }, withTypeName('dialog_completion', { title: 'Fürsorge anbieten', instruction: 'Ergänze die passende Reaktion.', questionData: { type: 'dialog_completion', question: 'Jemand sagt, dass ihm schwindelig ist. Was antwortest du?', dialog: ['A: Sakit akong ulo.', 'B: ...'] }, answerData: { modelAnswer: 'Magpahuway sa.', correct: ['Magpahuway sa.', 'Magpahuway sa una.'] }, explanation: 'Ruhe anzubieten passt oft als erste fürsorgliche Reaktion.' }) ], '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.' }), { exerciseTypeId: 2, title: 'Fahrpreis', instruction: 'Wähle die richtige Bedeutung.', questionData: { type: 'multiple_choice', question: 'Was fragst du mit „Pila ang plite"?', options: ['Wie viel kostet die Fahrt?', 'Wo fährt der Bus?', 'Wann kommt er?', 'Ist das der richtige Bus?'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Plite" bezeichnet hier den Fahrpreis.' }, { exerciseTypeId: 4, title: 'Haltestelle fragen', instruction: 'Übersetze ins Bisaya.', questionData: { type: 'transformation', text: 'Wo ist die Haltestelle?', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Asa ang sakayan?', alternatives: ['Asa dapit ang sakayan?', 'Asa man ang sakayan?'] }, explanation: '„Asa ang sakayan?" fragt nach dem Ort zum Einsteigen.' }, withTypeName('dialog_completion', { title: 'Fahrt klären', instruction: 'Ergänze die zweite Frage.', questionData: { type: 'dialog_completion', question: 'Du stehst am Straßenrand. Was fragst du als Nächstes?', dialog: ['A: Asa ang sakayan?', 'B: ...'] }, answerData: { modelAnswer: 'Pila ang plite?', correct: ['Pila ang plite?', 'Tagpila ang plite?'] }, explanation: 'Oft folgt nach der Richtungsfrage die Preisfrage.' }) ], '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.' }), { exerciseTypeId: 2, title: 'Schule auf Bisaya', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet „eskwela"?', options: ['Schule', 'Spielplatz', 'Arzt', 'Hausaufgabe'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Eskwela" ist das geläufige Wort für Schule.' }, { exerciseTypeId: 4, title: 'Bereit für die Schule', instruction: 'Übersetze ins Bisaya.', questionData: { type: 'transformation', text: 'Bist du bereit für die Schule?', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Andam na ka sa eskwela?', alternatives: ['Ready na ka sa eskwela?', 'Andam ka na sa eskwela?'] }, explanation: '„Andam na ka sa eskwela?" ist eine typische Eltern-Frage.' }, withTypeName('dialog_completion', { title: 'Kind morgens ansprechen', instruction: 'Ergänze die nächste Frage.', questionData: { type: 'dialog_completion', question: 'Das Kind hat gefrühstückt. Was fragst du dann?', dialog: ['A: Nikaon na ka?', 'B: ...'] }, answerData: { modelAnswer: 'Andam na ka sa eskwela?', correct: ['Andam na ka sa eskwela?', 'Andam ka na sa eskwela?'] }, explanation: 'Essen und Schulbereitschaft werden oft in einem Rutsch abgefragt.' }) ], '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.' }), { exerciseTypeId: 2, title: 'Arztbesuch', instruction: 'Wähle die passende Formulierung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet „Adto ta sa doktor"?', options: ['Wir gehen zum Arzt.', 'Wir gehen einkaufen.', 'Wir gehen schlafen.', 'Wir gehen spielen.'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Doktor" wird im Alltag oft für Arzt oder Praxis verwendet.' }, { exerciseTypeId: 4, title: 'Termin erfragen', instruction: 'Übersetze ins Bisaya.', questionData: { type: 'transformation', text: 'Habt ihr einen Termin?', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Naa moy appointment?', alternatives: ['Naa mo appointment?', 'Aduna moy appointment?'] }, explanation: '„Appointment" wird im Cebuano oft direkt übernommen.' }, withTypeName('dialog_completion', { title: 'Vor der Praxis', instruction: 'Ergänze die zweite Frage.', questionData: { type: 'dialog_completion', question: 'Ihr seid angekommen. Was fragst du als Nächstes?', dialog: ['A: Adto ta sa doktor.', 'B: ...'] }, answerData: { modelAnswer: 'Naa moy appointment?', correct: ['Naa moy appointment?', 'Naa mo appointment?'] }, explanation: 'Ort und Termin gehören im Arztalltag zusammen.' }) ], '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.' }), { exerciseTypeId: 2, title: 'Plan für heute', instruction: 'Wähle die richtige Bedeutung.', questionData: { type: 'multiple_choice', question: 'Was fragst du mit „Unsa atong plano karon"?', options: ['Was ist unser Plan für heute?', 'Wo ist das Kind?', 'Wann ist Feierabend?', 'Wer kocht?'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Karon" bezieht sich auf jetzt bzw. heute.' }, { exerciseTypeId: 4, title: 'Kind abholen', instruction: 'Übersetze ins Bisaya.', questionData: { type: 'transformation', text: 'Wir holen das Kind später ab.', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Kuhaon nato ang bata unya.', alternatives: ['Kuhaon nato ang bata.', 'Unya kuhaon nato ang bata.'] }, explanation: '„Kuhaon nato" drückt aus, dass „wir holen … ab".' }, withTypeName('dialog_completion', { title: 'Heimweg ankündigen', instruction: 'Ergänze den letzten Satz.', questionData: { type: 'dialog_completion', question: 'Der Plan steht. Was sagst du zum Schluss?', dialog: ['A: Kuhaon nato ang bata unya.', 'B: ...'] }, answerData: { modelAnswer: 'Pagkahuman, mouli ta.', correct: ['Pagkahuman, mouli ta.', 'Unya mouli ta.'] }, explanation: 'Nach dem Abholen folgt oft die Ankündigung des Heimwegs.' }) ], '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.' }), { exerciseTypeId: 2, title: 'Vergangenheit vs. Zukunft', instruction: 'Wähle die Zukunftsform.', questionData: { type: 'multiple_choice', question: 'Welcher Satz beschreibt etwas Zukünftiges?', options: ['Moadto ko unya.', 'Niadto ko gahapon.', 'Nikaon ko.', 'Nakatulog ko.'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Mo-" markiert hier die Zukunft; „Ni-" die Vergangenheit.' }, { exerciseTypeId: 4, title: 'Bitte übersetzen', instruction: 'Übersetze ins Bisaya.', questionData: { type: 'transformation', text: 'Bitte.', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Palihug.', alternatives: ['Palihug nimo.', 'Palihug ko.'] }, explanation: '„Palihug" ist die Kurzform für höfliche Bitten.' }, withTypeName('dialog_completion', { title: 'Entschuldigung nach der Bitte', instruction: 'Ergänze die zweite Äußerung.', questionData: { type: 'dialog_completion', question: 'Du hast zu schnell geantwortet. Was sagst du danach?', dialog: ['A: Palihug ka mubalik.', 'B: ...'] }, answerData: { modelAnswer: 'Pasayloa ko.', correct: ['Pasayloa ko.', 'Pasensya.'] }, explanation: 'Nach einer Bitte kann eine kurze Entschuldigung folgen.' }) ], '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.' }), { exerciseTypeId: 2, title: 'Stadt und Termin', instruction: 'Wähle die passende Kombination.', questionData: { type: 'multiple_choice', question: 'Welche Formulierung passt zu „wir fahren in die Stadt und haben einen Termin"?', options: ['Moadto mi sa lungsod. Aduna mi appointment.', 'Sulod lang. Lingkod sa.', 'Nikaon na ka? Kaon ta.', 'Asa ang CR?'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: 'Weg in die Stadt und Termin werden oft zusammen genannt.' }, { exerciseTypeId: 4, title: 'Hilfe anbieten', instruction: 'Übersetze ins Bisaya.', questionData: { type: 'transformation', text: 'Ich helfe dir.', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Tabangan tika.', alternatives: ['Tabangan ko ikaw.', 'Motabang ko nimo.'] }, explanation: '„Tabangan tika" ist eine direkte Hilfszusage.' }, withTypeName('dialog_completion', { title: 'Abschluss im Gesamtpfad', instruction: 'Ergänze die Hilfszusage.', questionData: { type: 'dialog_completion', question: 'Jemand ist überfordert. Was sagst du?', dialog: ['A: Aduna mi appointment.', 'B: ...'] }, answerData: { modelAnswer: 'Tabangan tika.', correct: ['Tabangan tika.', 'Motabang ko nimo.'] }, explanation: 'Hilfe rundet viele gemischte Alltagsszenen ab.' }) ], '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.' }), { exerciseTypeId: 2, title: 'Gesamtpreis', instruction: 'Wähle die richtige Frage.', questionData: { type: 'multiple_choice', question: 'Wofür steht „Pila ni tanan"?', options: ['Wie viel kostet alles zusammen?', 'Wo ist die Kasse?', 'Haben Sie Wechselgeld?', 'Ist das frisch?'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Tanan" meint hier alles bzw. den Gesamtbetrag.' }, { exerciseTypeId: 4, title: 'Stückzahl nennen', instruction: 'Übersetze ins Bisaya.', questionData: { type: 'transformation', text: 'Drei Stück, bitte.', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Tulo ka buok, palihug.', alternatives: ['Tulo ka buok.', 'Tulo lang, palihug.'] }, explanation: '„Buok" zählt einzelne Stücke.' }, withTypeName('dialog_completion', { title: 'Kauf abschließen', instruction: 'Ergänze die Entscheidung.', questionData: { type: 'dialog_completion', question: 'Der Preis passt. Was sagst du?', dialog: ['A: Pila ni tanan?', 'B: ...'] }, answerData: { modelAnswer: 'Kuhaon na nako.', correct: ['Kuhaon na nako.', 'Kuhaon nako ni.'] }, explanation: '„Kuhaon na nako" signalisiert, dass du es nimmst.' }) ], '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.' }), { exerciseTypeId: 2, title: 'Nachbar', instruction: 'Wähle die richtige Bedeutung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet „silingan"?', options: ['Nachbar / Nachbarschaft', 'Geschäft', 'Polizei', 'Schule'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Silingan" bezeichnet die Nachbarschaft oder den Nachbarn.' }, { exerciseTypeId: 4, title: 'Besuch einladen', instruction: 'Übersetze ins Bisaya.', questionData: { type: 'transformation', text: 'Komm später zu Besuch.', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Bisita mo unya.', alternatives: ['Bisita lang mo unya.', 'Adto ka unya bisita.'] }, explanation: '„Bisita mo unya" lädt zu einem späteren Besuch ein.' }, withTypeName('dialog_completion', { title: 'Nach dem Besuch', instruction: 'Ergänze die Einladung.', questionData: { type: 'dialog_completion', question: 'Ihr seid bei den Nachbarn gewesen. Was sagt ihr zum Abschied?', dialog: ['A: Niadto mi sa silingan.', 'B: ...'] }, answerData: { modelAnswer: 'Bisita mo unya.', correct: ['Bisita mo unya.', 'Balik mo unya bisita.'] }, explanation: 'Ein Gegenbesuch wird oft freundlich angekündigt.' }) ], '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.' }), { exerciseTypeId: 2, title: 'Gespräch eröffnen', instruction: 'Wähle die weichste Eröffnung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet „Pwede nato istoryahan"?', options: ['Können wir darüber sprechen?', 'Ich bin wütend.', 'Das interessiert mich nicht.', 'Geh weg.'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Istoryahan" leitet ein Gespräch über ein Thema ein.' }, { exerciseTypeId: 4, title: 'Hilfe zusagen', instruction: 'Übersetze ins Bisaya.', questionData: { type: 'transformation', text: 'Ich helfe dir gern.', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Tabangan tika.', alternatives: ['Motabang ko nimo.', 'Tabangan ko ikaw.'] }, explanation: 'Nach dem Gespräch kann eine klare Hilfszusage folgen.' }, withTypeName('dialog_completion', { title: 'Konflikt lösen', instruction: 'Ergänze die Hilfe.', questionData: { type: 'dialog_completion', question: 'Das Problem ist benannt. Was bietest du an?', dialog: ['A: Pwede nato istoryahan?', 'B: ...'] }, answerData: { modelAnswer: 'Tabangan tika.', correct: ['Tabangan tika.', 'Motabang ko nimo.'] }, explanation: 'Gespräch und Hilfe bilden oft eine Einheit.' }) ], '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.' }, { exerciseTypeId: 2, title: 'Einleitung „meistens"', instruction: 'Wähle die passende Bedeutung.', questionData: { type: 'multiple_choice', question: 'Was drückt „Kasagaran" aus?', options: ['Meistens / in der Regel', 'Niemals', 'Nur heute', 'Vielleicht später'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Kasagaran" strukturiert freies Erzählen zeitlich.' }, { exerciseTypeId: 1, title: 'Wahrheit einleiten', instruction: 'Fülle die Lücke mit der passenden Einleitung.', questionData: { type: 'gap_fill', text: '{gap}... naghisgot ko kanimo.', gaps: 1 }, answerData: { type: 'gap_fill', answers: ['Sa tinuod'] }, explanation: '„Sa tinuod" leitet ehrliche Aussagen ein und passt zu freiem Sprechen.' }, { exerciseTypeId: 4, title: 'Kontrast einbauen', instruction: 'Übersetze ins Bisaya.', questionData: { type: 'transformation', text: 'Aber manchmal bin ich müde.', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Apan usahay kapoy ko.', alternatives: ['Apan usahay kapoy ko gamay.', 'Apan kapoy usahay ko.'] }, explanation: '„Apan" und „usahay" verbinden Kontrast und Variation im freien Sprechen.' }, { 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.' }), { exerciseTypeId: 2, title: 'Begrüßung reaktivieren', instruction: 'Wähle die Standard-Begrüßung.', questionData: { type: 'multiple_choice', question: 'Welche Begrüßung gehört zu den frühesten Kernmustern?', options: ['Kumusta ka?', 'Pila ang plite?', 'Asa ang merkado?', 'Naa moy assignment?'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Kumusta ka?" öffnet fast jedes Gespräch.' }, { exerciseTypeId: 4, title: 'Fürsorgefrage bilden', instruction: 'Übersetze ins Bisaya.', questionData: { type: 'transformation', text: 'Hast du schon gegessen?', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Nikaon na ka?', alternatives: ['Kaon na ka?', 'Nikaon ka na?'] }, explanation: '„Nikaon na ka?" gehört zu den wichtigsten Fürsorgefragen.' }, withTypeName('dialog_completion', { title: 'Frühe Routine', instruction: 'Ergänze die zweite Frage.', questionData: { type: 'dialog_completion', question: 'Du hast jemanden begrüßt. Was kommt oft als Nächstes?', dialog: ['A: Kumusta ka?', 'B: ...'] }, answerData: { modelAnswer: 'Nikaon na ka?', correct: ['Nikaon na ka?', 'Kaon na ka?'] }, explanation: 'Begrüßung und Essensfrage sind ein klassisches Paar.' }) ], '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.' }), { exerciseTypeId: 2, title: 'Beleg und Arzt', instruction: 'Wähle die passende Bedeutung.', questionData: { type: 'multiple_choice', question: 'Was ist ein „resibo" im Alltag?', options: ['Kassenbon / Beleg', 'Rezept nur auf Deutsch', 'Arzthelfer', 'Terminbuch'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Resibo" wird oft für Quittung oder Beleg verwendet.' }, { exerciseTypeId: 4, title: 'Zum Arzt gehen', instruction: 'Übersetze ins Bisaya.', questionData: { type: 'transformation', text: 'Wir gehen zum Arzt.', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Adto ta sa doktor.', alternatives: ['Moadto mi sa doktor.', 'Adto mi sa doktor.'] }, explanation: 'Arztbesuch und Belege werden oft in einer Szene kombiniert.' }, withTypeName('dialog_completion', { title: 'Nach dem Termin', instruction: 'Ergänze den Satz zum Beleg.', questionData: { type: 'dialog_completion', question: 'Ihr wart beim Arzt. Was erwähnst du noch?', dialog: ['A: Adto ta sa doktor.', 'B: ...'] }, answerData: { modelAnswer: 'Naa ko resibo.', correct: ['Naa ko resibo.', 'Naa koy resibo.'] }, explanation: 'Beleg und Besuch gehören in vielen Alltagsszenen zusammen.' }) ], '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.' }), { exerciseTypeId: 2, title: 'Hilfe erkennen', instruction: 'Wähle die richtige Frage.', questionData: { type: 'multiple_choice', question: 'Wie fragst du: „Kannst du helfen?"', options: ['Pwede ka motabang?', 'Asa ang CR?', 'Tagpila ni?', 'Kapoy na ka?'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Motabang" gehört zum Hilfsverb „tabang".' }, { exerciseTypeId: 4, title: 'Dank für Hilfe', instruction: 'Übersetze ins Bisaya.', questionData: { type: 'transformation', text: 'Danke für die Hilfe.', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Salamat sa tabang', alternatives: ['Salamat sa imong tabang', 'Daghang salamat sa tabang'] }, explanation: '„Salamat sa tabang" schließt Hilfsszenen höflich ab.' }, withTypeName('dialog_completion', { title: 'Hilfe und Dank', instruction: 'Ergänze die Danksagung.', questionData: { type: 'dialog_completion', question: 'Jemand hat geholfen. Was sagst du?', dialog: ['A: Tabangan tika.', 'B: ...'] }, answerData: { modelAnswer: 'Salamat sa tabang.', correct: ['Salamat sa tabang.', 'Daghang salamat.'] }, explanation: 'Hilfe und Dank bilden ein festes Paar.' }) ], '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.' }), { exerciseTypeId: 2, title: '„Später" höflich', instruction: 'Wähle die richtige Bedeutung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet „Sunod na lang"?', options: ['Später eben / beim nächsten Mal', 'Niemals', 'Sofort', 'Gestern'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Sunod" verschiebt höflich auf einen späteren Zeitpunkt.' }, { exerciseTypeId: 4, title: 'Höfliche Absage', instruction: 'Übersetze ins Bisaya.', questionData: { type: 'transformation', text: 'Nicht jetzt, bitte später.', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Dili lang sa karon. Sunod na lang.', alternatives: ['Dili karon. Sunod na lang.', 'Sunod na lang.'] }, explanation: 'Weiche Absage plus Verschiebung ist sehr typisch.' }, withTypeName('dialog_completion', { title: 'Einladung weich ablehnen', instruction: 'Ergänze die Verschiebung.', questionData: { type: 'dialog_completion', question: 'Du kannst heute nicht. Was sagst du?', dialog: ['A: Dili lang sa karon.', 'B: ...'] }, answerData: { modelAnswer: 'Sunod na lang.', correct: ['Sunod na lang.', 'Sunod na lang ha.'] }, explanation: 'Nach dem weichen Nein folgt oft ein späterer Vorschlag.' }) ], '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.' }), { exerciseTypeId: 2, title: 'Einladung', instruction: 'Wähle die passende Formulierung.', questionData: { type: 'multiple_choice', question: 'Was bedeutet „Giinvite tika"?', options: ['Ich lade dich ein.', 'Ich verabschiede mich.', 'Ich bin müde.', 'Ich zahle.'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, explanation: '„Giinvite" kommt von invite und wird umgangssprachlich genutzt.' }, { exerciseTypeId: 4, title: 'Zur Fiesta', instruction: 'Übersetze ins Bisaya.', questionData: { type: 'transformation', text: 'Kommst du zur Fiesta?', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Moadto ka sa pista?', alternatives: ['Adto ka sa pista?', 'Moadto ka ug pista?'] }, explanation: '„Pista" steht für Feier oder Fest.' }, withTypeName('dialog_completion', { title: 'Treffpunkt', instruction: 'Ergänze den Ort.', questionData: { type: 'dialog_completion', question: 'Die Einladung steht. Was vereinbart ihr?', dialog: ['A: Giinvite tika.', 'B: ...'] }, answerData: { modelAnswer: 'Magkita ta didto.', correct: ['Magkita ta didto.', 'Kitakit ta didto.'] }, explanation: '„Didto" markiert den Treffpunkt.' }) ], '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: 4, title: 'Abend einleiten', instruction: 'Übersetze ins Bisaya.', questionData: { type: 'transformation', text: 'Am Abend…', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Sa gabii...', alternatives: ['Sa gabii.', 'Gabii...'] }, explanation: '„Sa gabii" strukturiert freies Erzählen am Tagesende.' }, withTypeName('dialog_completion', { title: 'Tagesablauf verknüpfen', instruction: 'Ergänze den nächsten Tagesabschnitt.', questionData: { type: 'dialog_completion', question: 'Du hast den Morgen erzählt. Was folgt oft als Nächstes?', dialog: ['A: Sa buntag...', 'B: ...'] }, answerData: { modelAnswer: 'Sa hapon...', correct: ['Sa hapon...', 'Unya sa hapon...'] }, explanation: 'Typischerweise wandert das Erzählen durch die Tageszeiten.' }), { exerciseTypeId: 3, title: 'Kurzsätze verbinden', instruction: 'Ordne die Marker zu einem kurzen Tagesabriss.', questionData: { type: 'sentence_building', question: 'Baue: Morgen, Nachmittag, Abend.', tokens: ['Sa buntag', 'Sa hapon', 'Sa gabii'] }, answerData: { correct: ['Sa buntag... Sa hapon... Sa gabii...'] }, explanation: 'Drei Zeitmarker reichen oft als Gerüst fürs freie Erzählen.' }, { 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: 4, title: 'Beruhigung ausdrücken', instruction: 'Übersetze ins Bisaya.', questionData: { type: 'transformation', text: 'Aber es ist schon okay.', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Pero okay ra.', alternatives: ['Pero okay lang.', 'Okay ra man.'] }, explanation: '„Pero okay ra" schließt Sorge und Zuversicht in einem Satz.' }, withTypeName('dialog_completion', { title: 'Sorge und Plan', instruction: 'Ergänze den Plan.', questionData: { type: 'dialog_completion', question: 'Du hast eine leichte Sorge genannt. Was kommt oft danach?', dialog: ['A: Naguol ko gamay.', 'B: ...'] }, answerData: { modelAnswer: 'Aduna koy plano unya.', correct: ['Aduna koy plano unya.', 'Naa koy plano unya.'] }, explanation: 'Nach Sorge folgt oft ein konkreter Plan.' }), { exerciseTypeId: 3, title: 'Mini-Erzählung bauen', instruction: 'Ordne zu einem kurzen emotionalen Bogen.', questionData: { type: 'sentence_building', question: 'Baue: Sorge – aber okay – Plan.', tokens: ['Naguol ko gamay.', 'Pero okay ra.', 'Aduna koy plano unya.'] }, answerData: { correct: ['Naguol ko gamay. Pero okay ra. Aduna koy plano unya.'] }, explanation: 'Dieses Muster stützt freies Erzählen über Familie und Zukunft.' }, { 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: 1, title: 'Vorsicht und Rücksicht', instruction: 'Fülle die Lücke mit dem passenden Kulturwort.', questionData: { type: 'gap_fill', text: 'Mag-{gap} ta sa pamilya.', gaps: 1 }, answerData: { type: 'gap_fill', answers: ['amping'] }, explanation: '„Mag-amping" drückt aus, vorsichtig und rücksichtsvoll mit der Familie umzugehen.' }, { exerciseTypeId: 4, title: 'Bitte auf Bisaya', instruction: 'Übersetze ins Bisaya.', questionData: { type: 'transformation', text: 'Bitte (höflich)', sourceLanguage: 'Deutsch', targetLanguage: 'Bisaya' }, answerData: { type: 'transformation', correct: 'Palihug', alternatives: ['Palihug nimo.', 'Palihug ko.'] }, explanation: '„Palihug" gehört zu respektvollem Alltagston.' }, withTypeName('situational_response', { title: 'Respekt kurz zeigen', instruction: 'Reagiere in einem kurzen Satz.', questionData: { type: 'situational_response', question: 'Danke jemandem und betone Respekt und gutes Miteinander.', keywords: ['salamat', 'respeto', 'pakikisama'] }, answerData: { modelAnswer: 'Salamat. Respeto ug pakikisama.', keywords: ['salamat', 'respeto', 'pakikisama'] }, explanation: 'Dank, Respekt und pakikisama lassen sich bewusst in einer Zeile verbinden.' }), { 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 forceRebuildAll = process.env.VOCAB_FORCE_REBUILD_ALL === '1'; 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', 'Familie - Verwandte & Stieffamilie' ].includes(lesson.title); const existingCount = await VocabGrammarExercise.count({ where: { lessonId: lesson.id } }); if (existingCount > 0 && !replacePlaceholders && !forceRebuildAll) { console.log(` ⏭️ Lektion ${lesson.lessonNumber}: "${lesson.title}" - bereits ${existingCount} Übung(en) vorhanden`); continue; } if ((replacePlaceholders || forceRebuildAll) && existingCount > 0) { const deleted = await VocabGrammarExercise.destroy({ where: { lessonId: lesson.id } }); const reason = forceRebuildAll ? 'vollständig neu aufgebaut' : 'Platzhalter entfernt'; console.log(` 🗑️ Lektion ${lesson.lessonNumber}: "${lesson.title}" - ${deleted} Übungen entfernt (${reason})`); } // Erstelle Übungen const lessonDidactics = getLessonDidactics(lesson); const mergedGrammarFocus = mergeGrammarFocusForLesson( lessonDidactics.grammarFocus, buildGrammarCurriculumFocus(lesson) ); if (mergedGrammarFocus.length > 0) { await lesson.update({ grammarFocus: mergedGrammarFocus }); } const derivedCorePatterns = deriveLessonCorePatternsFromExercises(exercises); const mergedCorePatterns = mergeCorePatternsForLesson(lessonDidactics, derivedCorePatterns, 8); if (mergedCorePatterns.length >= 8) { await lesson.update({ corePatterns: mergedCorePatterns }); if (process.env.VOCAB_STRICT_AUDIT === '1') { console.log(` ✅ [${lesson.title}] corePatterns auf ${mergedCorePatterns.length} Satzphrasen aktualisiert`); } } else if (process.env.VOCAB_STRICT_AUDIT === '1') { console.warn( ` ⚠️ [${lesson.title}] Nur ${mergedCorePatterns.length} Satzphrasen mit sicherer Gloss gefunden (Ziel: 8)` ); } let exerciseNumber = 1; for (const exerciseData of exercises) { const { exercise, fixes, warnings } = sanitizeExerciseForConsistency( lesson, exerciseData, lessonDidactics ); if (process.env.VOCAB_STRICT_AUDIT === '1') { fixes.forEach((fix) => console.log(` 🛠️ ${fix}`)); warnings.forEach((warning) => console.warn(` ⚠️ ${warning}`)); } if (process.env.VOCAB_STRICT_AUDIT === '1') { const warnings = collectExerciseAuditWarnings(lesson.title, exercise, exerciseNumber); warnings.forEach((warning) => console.warn(` ⚠️ ${warning}`)); } const exerciseTypeId = await resolveExerciseTypeId(exercise); await VocabGrammarExercise.create({ lessonId: lesson.id, exerciseTypeId, exerciseNumber: exerciseNumber++, title: exercise.title, instruction: exercise.instruction, questionData: JSON.stringify(exercise.questionData), answerData: JSON.stringify(exercise.answerData), explanation: exercise.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); });