diff --git a/backend/controllers/adminController.js b/backend/controllers/adminController.js
index f6919cf..b7d821b 100644
--- a/backend/controllers/adminController.js
+++ b/backend/controllers/adminController.js
@@ -16,6 +16,7 @@ class AdminController {
this.adminForceFalukantPregnancy = this.adminForceFalukantPregnancy.bind(this);
this.adminClearFalukantPregnancy = this.adminClearFalukantPregnancy.bind(this);
this.adminForceFalukantBirth = this.adminForceFalukantBirth.bind(this);
+ this.adminGetPotentialFathersForCharacter = this.adminGetPotentialFathersForCharacter.bind(this);
this.getFalukantUserBranches = this.getFalukantUserBranches.bind(this);
this.updateFalukantStock = this.updateFalukantStock.bind(this);
this.addFalukantStock = this.addFalukantStock.bind(this);
@@ -390,6 +391,18 @@ class AdminController {
}
}
+ async adminGetPotentialFathersForCharacter(req, res) {
+ try {
+ const { userid: userId } = req.headers;
+ const { characterId } = req.params;
+ const response = await AdminService.adminGetPotentialFathersForCharacter(userId, characterId);
+ res.status(200).json(response);
+ } catch (error) {
+ console.log(error);
+ res.status(400).json({ error: error.message });
+ }
+ }
+
async adminClearFalukantPregnancy(req, res) {
try {
const { userid: userId } = req.headers;
diff --git a/backend/migrations/20260331000000-add-vocab-lesson-phase1-fields.cjs b/backend/migrations/20260331000000-add-vocab-lesson-phase1-fields.cjs
new file mode 100644
index 0000000..d64531c
--- /dev/null
+++ b/backend/migrations/20260331000000-add-vocab-lesson-phase1-fields.cjs
@@ -0,0 +1,44 @@
+'use strict';
+
+module.exports = {
+ async up(queryInterface, Sequelize) {
+ await queryInterface.sequelize.query(`
+ ALTER TABLE community.vocab_course_lesson
+ ADD COLUMN IF NOT EXISTS didactic_mode TEXT,
+ ADD COLUMN IF NOT EXISTS phase_label TEXT,
+ ADD COLUMN IF NOT EXISTS block_number INTEGER,
+ ADD COLUMN IF NOT EXISTS difficulty_weight INTEGER,
+ ADD COLUMN IF NOT EXISTS new_unit_target INTEGER,
+ ADD COLUMN IF NOT EXISTS review_weight INTEGER,
+ ADD COLUMN IF NOT EXISTS is_intensive_review BOOLEAN NOT NULL DEFAULT FALSE;
+
+ COMMENT ON COLUMN community.vocab_course_lesson.didactic_mode IS
+ 'Didaktischer Modus der Lektion, z.B. core_input, guided_dialogue, intensive_review oder checkpoint.';
+ COMMENT ON COLUMN community.vocab_course_lesson.phase_label IS
+ 'Übergeordnete Lernphase, z.B. quickstart, daily_life oder stabilization.';
+ COMMENT ON COLUMN community.vocab_course_lesson.block_number IS
+ 'Inhaltlicher Block für Konsolidierungs- und Wiederholungswellen.';
+ COMMENT ON COLUMN community.vocab_course_lesson.difficulty_weight IS
+ 'Grobe relative Schwierigkeit der Lektion von leicht bis schwer.';
+ COMMENT ON COLUMN community.vocab_course_lesson.new_unit_target IS
+ 'Empfohlene Zahl neuer Spracheinheiten in dieser Lektion.';
+ COMMENT ON COLUMN community.vocab_course_lesson.review_weight IS
+ 'Wie stark Wiederholung in dieser Lektion dominieren soll, typischerweise 0 bis 100.';
+ COMMENT ON COLUMN community.vocab_course_lesson.is_intensive_review IS
+ 'Markiert Lektionen, die als intensive Wiederholungsphase gedacht sind.';
+ `);
+ },
+
+ async down(queryInterface, Sequelize) {
+ await queryInterface.sequelize.query(`
+ ALTER TABLE community.vocab_course_lesson
+ DROP COLUMN IF EXISTS is_intensive_review,
+ DROP COLUMN IF EXISTS review_weight,
+ DROP COLUMN IF EXISTS new_unit_target,
+ DROP COLUMN IF EXISTS difficulty_weight,
+ DROP COLUMN IF EXISTS block_number,
+ DROP COLUMN IF EXISTS phase_label,
+ DROP COLUMN IF EXISTS didactic_mode;
+ `);
+ }
+};
diff --git a/backend/models/community/vocab_course_lesson.js b/backend/models/community/vocab_course_lesson.js
index 62df690..e06b7a8 100644
--- a/backend/models/community/vocab_course_lesson.js
+++ b/backend/models/community/vocab_course_lesson.js
@@ -48,6 +48,42 @@ VocabCourseLesson.init({
defaultValue: 'vocab',
field: 'lesson_type'
},
+ didacticMode: {
+ type: DataTypes.TEXT,
+ allowNull: true,
+ field: 'didactic_mode'
+ },
+ phaseLabel: {
+ type: DataTypes.TEXT,
+ allowNull: true,
+ field: 'phase_label'
+ },
+ blockNumber: {
+ type: DataTypes.INTEGER,
+ allowNull: true,
+ field: 'block_number'
+ },
+ difficultyWeight: {
+ type: DataTypes.INTEGER,
+ allowNull: true,
+ field: 'difficulty_weight'
+ },
+ newUnitTarget: {
+ type: DataTypes.INTEGER,
+ allowNull: true,
+ field: 'new_unit_target'
+ },
+ reviewWeight: {
+ type: DataTypes.INTEGER,
+ allowNull: true,
+ field: 'review_weight'
+ },
+ isIntensiveReview: {
+ type: DataTypes.BOOLEAN,
+ allowNull: false,
+ defaultValue: false,
+ field: 'is_intensive_review'
+ },
audioUrl: {
type: DataTypes.TEXT,
allowNull: true,
diff --git a/backend/routers/adminRouter.js b/backend/routers/adminRouter.js
index a8bdec9..5a7a25b 100644
--- a/backend/routers/adminRouter.js
+++ b/backend/routers/adminRouter.js
@@ -43,6 +43,7 @@ router.post('/contacts/answer', authenticate, adminController.answerContact);
router.post('/falukant/searchuser', authenticate, adminController.searchUser);
router.get('/falukant/getuser/:id', authenticate, adminController.getFalukantUserById);
router.post('/falukant/edituser', authenticate, adminController.changeFalukantUser);
+router.get('/falukant/character/:characterId/potential-fathers', authenticate, adminController.adminGetPotentialFathersForCharacter);
router.post('/falukant/character/force-pregnancy', authenticate, adminController.adminForceFalukantPregnancy);
router.post('/falukant/character/clear-pregnancy', authenticate, adminController.adminClearFalukantPregnancy);
router.post('/falukant/character/force-birth', authenticate, adminController.adminForceFalukantBirth);
diff --git a/backend/scripts/add-bisaya-week1-lessons.js b/backend/scripts/add-bisaya-week1-lessons.js
index 6288709..bb05344 100644
--- a/backend/scripts/add-bisaya-week1-lessons.js
+++ b/backend/scripts/add-bisaya-week1-lessons.js
@@ -9,6 +9,7 @@
import { sequelize } from '../utils/sequelize.js';
import VocabCourseLesson from '../models/community/vocab_course_lesson.js';
+import { getBisayaLessonPedagogy } from './bisaya-course-phase2-pedagogy.js';
const LESSONS_TO_ADD = [
{
@@ -98,6 +99,8 @@ async function addBisayaWeek1Lessons() {
continue;
}
+ const pedagogy = getBisayaLessonPedagogy(lessonData.lessonNumber) || {};
+
await VocabCourseLesson.create({
courseId: course.id,
chapterId: null,
@@ -113,7 +116,14 @@ async function addBisayaWeek1Lessons() {
speakingPrompts: lessonData.speakingPrompts || [],
targetMinutes: lessonData.targetMinutes,
targetScorePercent: lessonData.targetScorePercent,
- requiresReview: lessonData.requiresReview
+ requiresReview: lessonData.requiresReview,
+ didacticMode: pedagogy.didacticMode || null,
+ phaseLabel: pedagogy.phaseLabel || null,
+ blockNumber: pedagogy.blockNumber ?? null,
+ difficultyWeight: pedagogy.difficultyWeight ?? null,
+ newUnitTarget: pedagogy.newUnitTarget ?? null,
+ reviewWeight: pedagogy.reviewWeight ?? null,
+ isIntensiveReview: Boolean(pedagogy.isIntensiveReview)
});
console.log(` ✅ Lektion ${lessonData.lessonNumber}: "${lessonData.title}" hinzugefügt`);
diff --git a/backend/scripts/apply-bisaya-course-refresh.js b/backend/scripts/apply-bisaya-course-refresh.js
index 099d2a6..8cad4ce 100644
--- a/backend/scripts/apply-bisaya-course-refresh.js
+++ b/backend/scripts/apply-bisaya-course-refresh.js
@@ -12,6 +12,7 @@ import VocabGrammarExercise from '../models/community/vocab_grammar_exercise.js'
import VocabCourseProgress from '../models/community/vocab_course_progress.js';
import VocabGrammarExerciseProgress from '../models/community/vocab_grammar_exercise_progress.js';
import { Op } from 'sequelize';
+import { getBisayaLessonPedagogy } from './bisaya-course-phase2-pedagogy.js';
const LESSON_DIDACTICS = {
'Begrüßungen & Höflichkeit': {
@@ -171,14 +172,23 @@ async function applyBisayaCourseRefresh() {
for (const lesson of lessons) {
const didactics = LESSON_DIDACTICS[lesson.title];
- if (!didactics) continue;
+ const pedagogy = getBisayaLessonPedagogy(lesson.lessonNumber);
+ if (!didactics && !pedagogy) continue;
+ const normalizedDidactics = didactics || {};
await lesson.update({
- learningGoals: didactics.learningGoals || [],
- corePatterns: didactics.corePatterns || [],
- grammarFocus: didactics.grammarFocus || [],
- speakingPrompts: didactics.speakingPrompts || [],
- practicalTasks: didactics.practicalTasks || []
+ learningGoals: normalizedDidactics.learningGoals || [],
+ corePatterns: normalizedDidactics.corePatterns || [],
+ grammarFocus: normalizedDidactics.grammarFocus || [],
+ speakingPrompts: normalizedDidactics.speakingPrompts || [],
+ practicalTasks: normalizedDidactics.practicalTasks || [],
+ didacticMode: pedagogy?.didacticMode || null,
+ phaseLabel: pedagogy?.phaseLabel || null,
+ blockNumber: pedagogy?.blockNumber ?? null,
+ difficultyWeight: pedagogy?.difficultyWeight ?? null,
+ newUnitTarget: pedagogy?.newUnitTarget ?? null,
+ reviewWeight: pedagogy?.reviewWeight ?? null,
+ isIntensiveReview: Boolean(pedagogy?.isIntensiveReview)
});
updatedLessons++;
}
diff --git a/backend/scripts/bisaya-course-phase2-pedagogy.js b/backend/scripts/bisaya-course-phase2-pedagogy.js
new file mode 100644
index 0000000..a782211
--- /dev/null
+++ b/backend/scripts/bisaya-course-phase2-pedagogy.js
@@ -0,0 +1,156 @@
+export const BISAYA_LESSON_PEDAGOGY = {
+ 1: { phaseLabel: 'quickstart', blockNumber: 1, didacticMode: 'guided_dialogue', difficultyWeight: 2, newUnitTarget: 5, reviewWeight: 15, isIntensiveReview: false },
+ 2: { phaseLabel: 'quickstart', blockNumber: 1, didacticMode: 'core_input', difficultyWeight: 3, newUnitTarget: 8, reviewWeight: 20, isIntensiveReview: false },
+ 3: { phaseLabel: 'quickstart', blockNumber: 1, didacticMode: 'core_input', difficultyWeight: 2, newUnitTarget: 7, reviewWeight: 20, isIntensiveReview: false },
+ 4: { phaseLabel: 'quickstart', blockNumber: 1, didacticMode: 'guided_dialogue', difficultyWeight: 3, newUnitTarget: 5, reviewWeight: 25, isIntensiveReview: false },
+ 5: { phaseLabel: 'quickstart', blockNumber: 1, didacticMode: 'guided_dialogue', difficultyWeight: 3, newUnitTarget: 4, reviewWeight: 25, isIntensiveReview: false },
+ 6: { phaseLabel: 'quickstart', blockNumber: 1, didacticMode: 'core_input', difficultyWeight: 3, newUnitTarget: 7, reviewWeight: 25, isIntensiveReview: false },
+ 7: { phaseLabel: 'quickstart', blockNumber: 1, didacticMode: 'guided_dialogue', difficultyWeight: 3, newUnitTarget: 5, reviewWeight: 30, isIntensiveReview: false },
+ 8: { phaseLabel: 'quickstart', blockNumber: 1, didacticMode: 'core_input', difficultyWeight: 2, newUnitTarget: 6, reviewWeight: 30, isIntensiveReview: false },
+ 9: { phaseLabel: 'quickstart', blockNumber: 1, didacticMode: 'intensive_review', difficultyWeight: 3, newUnitTarget: 0, reviewWeight: 90, isIntensiveReview: true },
+ 10: { phaseLabel: 'quickstart', blockNumber: 1, didacticMode: 'checkpoint', difficultyWeight: 3, newUnitTarget: 0, reviewWeight: 95, isIntensiveReview: false },
+ 11: { phaseLabel: 'quickstart', blockNumber: 2, didacticMode: 'guided_dialogue', difficultyWeight: 3, newUnitTarget: 5, reviewWeight: 25, isIntensiveReview: false },
+ 12: { phaseLabel: 'quickstart', blockNumber: 2, didacticMode: 'core_input', difficultyWeight: 2, newUnitTarget: 7, reviewWeight: 25, isIntensiveReview: false },
+ 13: { phaseLabel: 'quickstart', blockNumber: 2, didacticMode: 'guided_dialogue', difficultyWeight: 3, newUnitTarget: 5, reviewWeight: 30, isIntensiveReview: false },
+ 14: { phaseLabel: 'quickstart', blockNumber: 2, didacticMode: 'core_input', difficultyWeight: 3, newUnitTarget: 6, reviewWeight: 30, isIntensiveReview: false },
+ 15: { phaseLabel: 'quickstart', blockNumber: 2, didacticMode: 'pattern_drill', difficultyWeight: 4, newUnitTarget: 4, reviewWeight: 40, isIntensiveReview: false },
+ 16: { phaseLabel: 'quickstart', blockNumber: 2, didacticMode: 'core_input', difficultyWeight: 3, newUnitTarget: 6, reviewWeight: 35, isIntensiveReview: false },
+ 17: { phaseLabel: 'quickstart', blockNumber: 2, didacticMode: 'guided_dialogue', difficultyWeight: 4, newUnitTarget: 5, reviewWeight: 35, isIntensiveReview: false },
+ 18: { phaseLabel: 'quickstart', blockNumber: 2, didacticMode: 'core_input', difficultyWeight: 4, newUnitTarget: 7, reviewWeight: 35, isIntensiveReview: false },
+ 19: { phaseLabel: 'quickstart', blockNumber: 2, didacticMode: 'intensive_review', difficultyWeight: 4, newUnitTarget: 0, reviewWeight: 92, isIntensiveReview: true },
+ 20: { phaseLabel: 'quickstart', blockNumber: 2, didacticMode: 'checkpoint', difficultyWeight: 4, newUnitTarget: 0, reviewWeight: 96, isIntensiveReview: false },
+ 21: { phaseLabel: 'daily_life', blockNumber: 3, didacticMode: 'guided_dialogue', difficultyWeight: 3, newUnitTarget: 5, reviewWeight: 35, isIntensiveReview: false },
+ 22: { phaseLabel: 'daily_life', blockNumber: 3, didacticMode: 'core_input', difficultyWeight: 3, newUnitTarget: 7, reviewWeight: 35, isIntensiveReview: false },
+ 23: { phaseLabel: 'daily_life', blockNumber: 3, didacticMode: 'guided_dialogue', difficultyWeight: 4, newUnitTarget: 5, reviewWeight: 40, isIntensiveReview: false },
+ 24: { phaseLabel: 'daily_life', blockNumber: 3, didacticMode: 'core_input', difficultyWeight: 4, newUnitTarget: 6, reviewWeight: 40, isIntensiveReview: false },
+ 25: { phaseLabel: 'daily_life', blockNumber: 3, didacticMode: 'pattern_drill', difficultyWeight: 4, newUnitTarget: 4, reviewWeight: 45, isIntensiveReview: false },
+ 26: { phaseLabel: 'daily_life', blockNumber: 3, didacticMode: 'guided_dialogue', difficultyWeight: 4, newUnitTarget: 5, reviewWeight: 45, isIntensiveReview: false },
+ 27: { phaseLabel: 'daily_life', blockNumber: 3, didacticMode: 'guided_dialogue', difficultyWeight: 3, newUnitTarget: 5, reviewWeight: 40, isIntensiveReview: false },
+ 28: { phaseLabel: 'daily_life', blockNumber: 3, didacticMode: 'core_input', difficultyWeight: 3, newUnitTarget: 6, reviewWeight: 40, isIntensiveReview: false },
+ 29: { phaseLabel: 'daily_life', blockNumber: 3, didacticMode: 'intensive_review', difficultyWeight: 4, newUnitTarget: 0, reviewWeight: 94, isIntensiveReview: true },
+ 30: { phaseLabel: 'daily_life', blockNumber: 3, didacticMode: 'checkpoint', difficultyWeight: 4, newUnitTarget: 0, reviewWeight: 97, isIntensiveReview: false },
+ 31: { phaseLabel: 'stabilization', blockNumber: 4, didacticMode: 'real_life_scenario', difficultyWeight: 4, newUnitTarget: 4, reviewWeight: 55, isIntensiveReview: false },
+ 32: { phaseLabel: 'stabilization', blockNumber: 4, didacticMode: 'intensive_review', difficultyWeight: 4, newUnitTarget: 0, reviewWeight: 95, isIntensiveReview: true },
+ 33: { phaseLabel: 'stabilization', blockNumber: 4, didacticMode: 'real_life_scenario', difficultyWeight: 4, newUnitTarget: 4, reviewWeight: 60, isIntensiveReview: false },
+ 34: { phaseLabel: 'stabilization', blockNumber: 4, didacticMode: 'intensive_review', difficultyWeight: 4, newUnitTarget: 0, reviewWeight: 95, isIntensiveReview: true },
+ 35: { phaseLabel: 'stabilization', blockNumber: 4, didacticMode: 'real_life_scenario', difficultyWeight: 5, newUnitTarget: 3, reviewWeight: 65, isIntensiveReview: false },
+ 36: { phaseLabel: 'stabilization', blockNumber: 4, didacticMode: 'intensive_review', difficultyWeight: 5, newUnitTarget: 0, reviewWeight: 98, isIntensiveReview: true },
+ 37: { phaseLabel: 'stabilization', blockNumber: 4, didacticMode: 'real_life_scenario', difficultyWeight: 5, newUnitTarget: 3, reviewWeight: 70, isIntensiveReview: false },
+ 38: { phaseLabel: 'stabilization', blockNumber: 4, didacticMode: 'checkpoint', difficultyWeight: 5, newUnitTarget: 0, reviewWeight: 99, isIntensiveReview: false },
+ 39: { phaseLabel: 'stabilization', blockNumber: 4, didacticMode: 'checkpoint', difficultyWeight: 5, newUnitTarget: 0, reviewWeight: 100, isIntensiveReview: false },
+ 40: { phaseLabel: 'stabilization', blockNumber: 4, didacticMode: 'real_life_scenario', difficultyWeight: 2, newUnitTarget: 2, reviewWeight: 50, isIntensiveReview: false },
+ 41: { phaseLabel: 'daily_life', blockNumber: 5, didacticMode: 'guided_dialogue', difficultyWeight: 3, newUnitTarget: 5, reviewWeight: 40, isIntensiveReview: false },
+ 42: { phaseLabel: 'daily_life', blockNumber: 5, didacticMode: 'core_input', difficultyWeight: 3, newUnitTarget: 6, reviewWeight: 40, isIntensiveReview: false },
+ 43: { phaseLabel: 'daily_life', blockNumber: 5, didacticMode: 'pattern_drill', difficultyWeight: 4, newUnitTarget: 4, reviewWeight: 45, isIntensiveReview: false },
+ 44: { phaseLabel: 'daily_life', blockNumber: 5, didacticMode: 'guided_dialogue', difficultyWeight: 3, newUnitTarget: 5, reviewWeight: 45, isIntensiveReview: false },
+ 45: { phaseLabel: 'daily_life', blockNumber: 5, didacticMode: 'intensive_review', difficultyWeight: 4, newUnitTarget: 0, reviewWeight: 95, isIntensiveReview: true },
+ 46: { phaseLabel: 'daily_life', blockNumber: 5, didacticMode: 'intensive_review', difficultyWeight: 3, newUnitTarget: 0, reviewWeight: 90, isIntensiveReview: true },
+ 47: { phaseLabel: 'daily_life', blockNumber: 5, didacticMode: 'guided_dialogue', difficultyWeight: 4, newUnitTarget: 5, reviewWeight: 45, isIntensiveReview: false },
+ 48: { phaseLabel: 'daily_life', blockNumber: 5, didacticMode: 'core_input', difficultyWeight: 3, newUnitTarget: 6, reviewWeight: 45, isIntensiveReview: false },
+ 49: { phaseLabel: 'daily_life', blockNumber: 5, didacticMode: 'intensive_review', difficultyWeight: 4, newUnitTarget: 0, reviewWeight: 96, isIntensiveReview: true },
+ 50: { phaseLabel: 'daily_life', blockNumber: 5, didacticMode: 'checkpoint', difficultyWeight: 4, newUnitTarget: 0, reviewWeight: 97, isIntensiveReview: false },
+ 51: { phaseLabel: 'stabilization', blockNumber: 6, didacticMode: 'guided_dialogue', difficultyWeight: 4, newUnitTarget: 5, reviewWeight: 50, isIntensiveReview: false },
+ 52: { phaseLabel: 'stabilization', blockNumber: 6, didacticMode: 'core_input', difficultyWeight: 3, newUnitTarget: 6, reviewWeight: 50, isIntensiveReview: false },
+ 53: { phaseLabel: 'stabilization', blockNumber: 6, didacticMode: 'guided_dialogue', difficultyWeight: 4, newUnitTarget: 5, reviewWeight: 55, isIntensiveReview: false },
+ 54: { phaseLabel: 'stabilization', blockNumber: 6, didacticMode: 'core_input', difficultyWeight: 3, newUnitTarget: 6, reviewWeight: 55, isIntensiveReview: false },
+ 55: { phaseLabel: 'stabilization', blockNumber: 6, didacticMode: 'real_life_scenario', difficultyWeight: 5, newUnitTarget: 3, reviewWeight: 65, isIntensiveReview: false },
+ 56: { phaseLabel: 'stabilization', blockNumber: 6, didacticMode: 'intensive_review', difficultyWeight: 5, newUnitTarget: 0, reviewWeight: 98, isIntensiveReview: true },
+ 57: { phaseLabel: 'stabilization', blockNumber: 6, didacticMode: 'real_life_scenario', difficultyWeight: 5, newUnitTarget: 3, reviewWeight: 70, isIntensiveReview: false },
+ 58: { phaseLabel: 'stabilization', blockNumber: 6, didacticMode: 'checkpoint', difficultyWeight: 5, newUnitTarget: 0, reviewWeight: 99, isIntensiveReview: false },
+ 59: { phaseLabel: 'stabilization', blockNumber: 6, didacticMode: 'checkpoint', difficultyWeight: 5, newUnitTarget: 0, reviewWeight: 100, isIntensiveReview: false },
+ 60: { phaseLabel: 'stabilization', blockNumber: 6, didacticMode: 'real_life_scenario', difficultyWeight: 2, newUnitTarget: 2, reviewWeight: 60, isIntensiveReview: false },
+ 61: { phaseLabel: 'daily_life', blockNumber: 7, didacticMode: 'guided_dialogue', difficultyWeight: 3, newUnitTarget: 5, reviewWeight: 45, isIntensiveReview: false },
+ 62: { phaseLabel: 'daily_life', blockNumber: 7, didacticMode: 'core_input', difficultyWeight: 3, newUnitTarget: 6, reviewWeight: 45, isIntensiveReview: false },
+ 63: { phaseLabel: 'daily_life', blockNumber: 7, didacticMode: 'pattern_drill', difficultyWeight: 4, newUnitTarget: 4, reviewWeight: 50, isIntensiveReview: false },
+ 64: { phaseLabel: 'daily_life', blockNumber: 7, didacticMode: 'guided_dialogue', difficultyWeight: 3, newUnitTarget: 5, reviewWeight: 50, isIntensiveReview: false },
+ 65: { phaseLabel: 'daily_life', blockNumber: 7, didacticMode: 'intensive_review', difficultyWeight: 4, newUnitTarget: 0, reviewWeight: 95, isIntensiveReview: true },
+ 66: { phaseLabel: 'daily_life', blockNumber: 7, didacticMode: 'intensive_review', difficultyWeight: 3, newUnitTarget: 0, reviewWeight: 92, isIntensiveReview: true },
+ 67: { phaseLabel: 'daily_life', blockNumber: 7, didacticMode: 'guided_dialogue', difficultyWeight: 3, newUnitTarget: 5, reviewWeight: 50, isIntensiveReview: false },
+ 68: { phaseLabel: 'daily_life', blockNumber: 7, didacticMode: 'core_input', difficultyWeight: 3, newUnitTarget: 6, reviewWeight: 50, isIntensiveReview: false },
+ 69: { phaseLabel: 'daily_life', blockNumber: 7, didacticMode: 'intensive_review', difficultyWeight: 4, newUnitTarget: 0, reviewWeight: 96, isIntensiveReview: true },
+ 70: { phaseLabel: 'daily_life', blockNumber: 7, didacticMode: 'checkpoint', difficultyWeight: 4, newUnitTarget: 0, reviewWeight: 97, isIntensiveReview: false },
+ 71: { phaseLabel: 'daily_life', blockNumber: 8, didacticMode: 'guided_dialogue', difficultyWeight: 4, newUnitTarget: 5, reviewWeight: 50, isIntensiveReview: false },
+ 72: { phaseLabel: 'daily_life', blockNumber: 8, didacticMode: 'core_input', difficultyWeight: 3, newUnitTarget: 6, reviewWeight: 50, isIntensiveReview: false },
+ 73: { phaseLabel: 'daily_life', blockNumber: 8, didacticMode: 'pattern_drill', difficultyWeight: 4, newUnitTarget: 4, reviewWeight: 55, isIntensiveReview: false },
+ 74: { phaseLabel: 'daily_life', blockNumber: 8, didacticMode: 'guided_dialogue', difficultyWeight: 4, newUnitTarget: 5, reviewWeight: 55, isIntensiveReview: false },
+ 75: { phaseLabel: 'daily_life', blockNumber: 8, didacticMode: 'intensive_review', difficultyWeight: 4, newUnitTarget: 0, reviewWeight: 95, isIntensiveReview: true },
+ 76: { phaseLabel: 'daily_life', blockNumber: 8, didacticMode: 'intensive_review', difficultyWeight: 3, newUnitTarget: 0, reviewWeight: 92, isIntensiveReview: true },
+ 77: { phaseLabel: 'daily_life', blockNumber: 8, didacticMode: 'guided_dialogue', difficultyWeight: 3, newUnitTarget: 5, reviewWeight: 55, isIntensiveReview: false },
+ 78: { phaseLabel: 'daily_life', blockNumber: 8, didacticMode: 'core_input', difficultyWeight: 3, newUnitTarget: 6, reviewWeight: 55, isIntensiveReview: false },
+ 79: { phaseLabel: 'daily_life', blockNumber: 8, didacticMode: 'intensive_review', difficultyWeight: 4, newUnitTarget: 0, reviewWeight: 96, isIntensiveReview: true },
+ 80: { phaseLabel: 'daily_life', blockNumber: 8, didacticMode: 'checkpoint', difficultyWeight: 4, newUnitTarget: 0, reviewWeight: 97, isIntensiveReview: false },
+ 81: { phaseLabel: 'daily_life', blockNumber: 9, didacticMode: 'guided_dialogue', difficultyWeight: 4, newUnitTarget: 5, reviewWeight: 50, isIntensiveReview: false },
+ 82: { phaseLabel: 'daily_life', blockNumber: 9, didacticMode: 'core_input', difficultyWeight: 3, newUnitTarget: 6, reviewWeight: 50, isIntensiveReview: false },
+ 83: { phaseLabel: 'daily_life', blockNumber: 9, didacticMode: 'pattern_drill', difficultyWeight: 4, newUnitTarget: 4, reviewWeight: 55, isIntensiveReview: false },
+ 84: { phaseLabel: 'daily_life', blockNumber: 9, didacticMode: 'guided_dialogue', difficultyWeight: 4, newUnitTarget: 5, reviewWeight: 55, isIntensiveReview: false },
+ 85: { phaseLabel: 'daily_life', blockNumber: 9, didacticMode: 'intensive_review', difficultyWeight: 4, newUnitTarget: 0, reviewWeight: 95, isIntensiveReview: true },
+ 86: { phaseLabel: 'daily_life', blockNumber: 9, didacticMode: 'intensive_review', difficultyWeight: 3, newUnitTarget: 0, reviewWeight: 92, isIntensiveReview: true },
+ 87: { phaseLabel: 'daily_life', blockNumber: 9, didacticMode: 'guided_dialogue', difficultyWeight: 4, newUnitTarget: 5, reviewWeight: 55, isIntensiveReview: false },
+ 88: { phaseLabel: 'daily_life', blockNumber: 9, didacticMode: 'core_input', difficultyWeight: 3, newUnitTarget: 6, reviewWeight: 55, isIntensiveReview: false },
+ 89: { phaseLabel: 'daily_life', blockNumber: 9, didacticMode: 'intensive_review', difficultyWeight: 4, newUnitTarget: 0, reviewWeight: 96, isIntensiveReview: true },
+ 90: { phaseLabel: 'daily_life', blockNumber: 9, didacticMode: 'checkpoint', difficultyWeight: 4, newUnitTarget: 0, reviewWeight: 97, isIntensiveReview: false },
+ 91: { phaseLabel: 'daily_life', blockNumber: 10, didacticMode: 'guided_dialogue', difficultyWeight: 3, newUnitTarget: 5, reviewWeight: 50, isIntensiveReview: false },
+ 92: { phaseLabel: 'daily_life', blockNumber: 10, didacticMode: 'core_input', difficultyWeight: 3, newUnitTarget: 6, reviewWeight: 50, isIntensiveReview: false },
+ 93: { phaseLabel: 'daily_life', blockNumber: 10, didacticMode: 'pattern_drill', difficultyWeight: 4, newUnitTarget: 4, reviewWeight: 55, isIntensiveReview: false },
+ 94: { phaseLabel: 'daily_life', blockNumber: 10, didacticMode: 'guided_dialogue', difficultyWeight: 3, newUnitTarget: 5, reviewWeight: 55, isIntensiveReview: false },
+ 95: { phaseLabel: 'daily_life', blockNumber: 10, didacticMode: 'intensive_review', difficultyWeight: 4, newUnitTarget: 0, reviewWeight: 95, isIntensiveReview: true },
+ 96: { phaseLabel: 'daily_life', blockNumber: 10, didacticMode: 'intensive_review', difficultyWeight: 3, newUnitTarget: 0, reviewWeight: 92, isIntensiveReview: true },
+ 97: { phaseLabel: 'daily_life', blockNumber: 10, didacticMode: 'guided_dialogue', difficultyWeight: 4, newUnitTarget: 5, reviewWeight: 55, isIntensiveReview: false },
+ 98: { phaseLabel: 'daily_life', blockNumber: 10, didacticMode: 'core_input', difficultyWeight: 3, newUnitTarget: 6, reviewWeight: 55, isIntensiveReview: false },
+ 99: { phaseLabel: 'daily_life', blockNumber: 10, didacticMode: 'intensive_review', difficultyWeight: 4, newUnitTarget: 0, reviewWeight: 96, isIntensiveReview: true },
+ 100: { phaseLabel: 'daily_life', blockNumber: 10, didacticMode: 'checkpoint', difficultyWeight: 4, newUnitTarget: 0, reviewWeight: 97, isIntensiveReview: false },
+ 101: { phaseLabel: 'stabilization', blockNumber: 11, didacticMode: 'guided_dialogue', difficultyWeight: 4, newUnitTarget: 5, reviewWeight: 60, isIntensiveReview: false },
+ 102: { phaseLabel: 'stabilization', blockNumber: 11, didacticMode: 'core_input', difficultyWeight: 3, newUnitTarget: 6, reviewWeight: 60, isIntensiveReview: false },
+ 103: { phaseLabel: 'stabilization', blockNumber: 11, didacticMode: 'pattern_drill', difficultyWeight: 4, newUnitTarget: 4, reviewWeight: 65, isIntensiveReview: false },
+ 104: { phaseLabel: 'stabilization', blockNumber: 11, didacticMode: 'guided_dialogue', difficultyWeight: 4, newUnitTarget: 5, reviewWeight: 65, isIntensiveReview: false },
+ 105: { phaseLabel: 'stabilization', blockNumber: 11, didacticMode: 'intensive_review', difficultyWeight: 5, newUnitTarget: 0, reviewWeight: 97, isIntensiveReview: true },
+ 106: { phaseLabel: 'stabilization', blockNumber: 11, didacticMode: 'intensive_review', difficultyWeight: 4, newUnitTarget: 0, reviewWeight: 94, isIntensiveReview: true },
+ 107: { phaseLabel: 'stabilization', blockNumber: 11, didacticMode: 'guided_dialogue', difficultyWeight: 4, newUnitTarget: 5, reviewWeight: 65, isIntensiveReview: false },
+ 108: { phaseLabel: 'stabilization', blockNumber: 11, didacticMode: 'core_input', difficultyWeight: 3, newUnitTarget: 6, reviewWeight: 65, isIntensiveReview: false },
+ 109: { phaseLabel: 'stabilization', blockNumber: 11, didacticMode: 'intensive_review', difficultyWeight: 5, newUnitTarget: 0, reviewWeight: 98, isIntensiveReview: true },
+ 110: { phaseLabel: 'stabilization', blockNumber: 11, didacticMode: 'checkpoint', difficultyWeight: 5, newUnitTarget: 0, reviewWeight: 99, isIntensiveReview: false },
+ 111: { phaseLabel: 'stabilization', blockNumber: 12, didacticMode: 'real_life_scenario', difficultyWeight: 5, newUnitTarget: 3, reviewWeight: 70, isIntensiveReview: false },
+ 112: { phaseLabel: 'stabilization', blockNumber: 12, didacticMode: 'intensive_review', difficultyWeight: 4, newUnitTarget: 0, reviewWeight: 95, isIntensiveReview: true },
+ 113: { phaseLabel: 'stabilization', blockNumber: 12, didacticMode: 'real_life_scenario', difficultyWeight: 5, newUnitTarget: 3, reviewWeight: 72, isIntensiveReview: false },
+ 114: { phaseLabel: 'stabilization', blockNumber: 12, didacticMode: 'pattern_drill', difficultyWeight: 5, newUnitTarget: 2, reviewWeight: 80, isIntensiveReview: false },
+ 115: { phaseLabel: 'stabilization', blockNumber: 12, didacticMode: 'intensive_review', difficultyWeight: 5, newUnitTarget: 0, reviewWeight: 99, isIntensiveReview: true },
+ 116: { phaseLabel: 'stabilization', blockNumber: 12, didacticMode: 'intensive_review', difficultyWeight: 4, newUnitTarget: 0, reviewWeight: 96, isIntensiveReview: true },
+ 117: { phaseLabel: 'stabilization', blockNumber: 12, didacticMode: 'real_life_scenario', difficultyWeight: 5, newUnitTarget: 3, reviewWeight: 75, isIntensiveReview: false },
+ 118: { phaseLabel: 'stabilization', blockNumber: 12, didacticMode: 'checkpoint', difficultyWeight: 5, newUnitTarget: 0, reviewWeight: 99, isIntensiveReview: false },
+ 119: { phaseLabel: 'stabilization', blockNumber: 12, didacticMode: 'checkpoint', difficultyWeight: 5, newUnitTarget: 0, reviewWeight: 100, isIntensiveReview: false },
+ 120: { phaseLabel: 'stabilization', blockNumber: 12, didacticMode: 'real_life_scenario', difficultyWeight: 2, newUnitTarget: 2, reviewWeight: 65, isIntensiveReview: false },
+ 121: { phaseLabel: 'stabilization', blockNumber: 13, didacticMode: 'real_life_scenario', difficultyWeight: 5, newUnitTarget: 3, reviewWeight: 72, isIntensiveReview: false },
+ 122: { phaseLabel: 'stabilization', blockNumber: 13, didacticMode: 'intensive_review', difficultyWeight: 4, newUnitTarget: 0, reviewWeight: 94, isIntensiveReview: true },
+ 123: { phaseLabel: 'stabilization', blockNumber: 13, didacticMode: 'pattern_drill', difficultyWeight: 5, newUnitTarget: 2, reviewWeight: 82, isIntensiveReview: false },
+ 124: { phaseLabel: 'stabilization', blockNumber: 13, didacticMode: 'real_life_scenario', difficultyWeight: 5, newUnitTarget: 3, reviewWeight: 74, isIntensiveReview: false },
+ 125: { phaseLabel: 'stabilization', blockNumber: 13, didacticMode: 'intensive_review', difficultyWeight: 5, newUnitTarget: 0, reviewWeight: 98, isIntensiveReview: true },
+ 126: { phaseLabel: 'stabilization', blockNumber: 13, didacticMode: 'intensive_review', difficultyWeight: 4, newUnitTarget: 0, reviewWeight: 95, isIntensiveReview: true },
+ 127: { phaseLabel: 'stabilization', blockNumber: 13, didacticMode: 'real_life_scenario', difficultyWeight: 5, newUnitTarget: 3, reviewWeight: 75, isIntensiveReview: false },
+ 128: { phaseLabel: 'stabilization', blockNumber: 13, didacticMode: 'intensive_review', difficultyWeight: 4, newUnitTarget: 0, reviewWeight: 95, isIntensiveReview: true },
+ 129: { phaseLabel: 'stabilization', blockNumber: 13, didacticMode: 'intensive_review', difficultyWeight: 5, newUnitTarget: 0, reviewWeight: 99, isIntensiveReview: true },
+ 130: { phaseLabel: 'stabilization', blockNumber: 13, didacticMode: 'checkpoint', difficultyWeight: 5, newUnitTarget: 0, reviewWeight: 99, isIntensiveReview: false },
+ 131: { phaseLabel: 'stabilization', blockNumber: 14, didacticMode: 'real_life_scenario', difficultyWeight: 5, newUnitTarget: 3, reviewWeight: 74, isIntensiveReview: false },
+ 132: { phaseLabel: 'stabilization', blockNumber: 14, didacticMode: 'intensive_review', difficultyWeight: 4, newUnitTarget: 0, reviewWeight: 94, isIntensiveReview: true },
+ 133: { phaseLabel: 'stabilization', blockNumber: 14, didacticMode: 'pattern_drill', difficultyWeight: 5, newUnitTarget: 2, reviewWeight: 84, isIntensiveReview: false },
+ 134: { phaseLabel: 'stabilization', blockNumber: 14, didacticMode: 'real_life_scenario', difficultyWeight: 5, newUnitTarget: 3, reviewWeight: 76, isIntensiveReview: false },
+ 135: { phaseLabel: 'stabilization', blockNumber: 14, didacticMode: 'intensive_review', difficultyWeight: 5, newUnitTarget: 0, reviewWeight: 98, isIntensiveReview: true },
+ 136: { phaseLabel: 'stabilization', blockNumber: 14, didacticMode: 'intensive_review', difficultyWeight: 4, newUnitTarget: 0, reviewWeight: 95, isIntensiveReview: true },
+ 137: { phaseLabel: 'stabilization', blockNumber: 14, didacticMode: 'real_life_scenario', difficultyWeight: 5, newUnitTarget: 3, reviewWeight: 78, isIntensiveReview: false },
+ 138: { phaseLabel: 'stabilization', blockNumber: 14, didacticMode: 'intensive_review', difficultyWeight: 4, newUnitTarget: 0, reviewWeight: 95, isIntensiveReview: true },
+ 139: { phaseLabel: 'stabilization', blockNumber: 14, didacticMode: 'intensive_review', difficultyWeight: 5, newUnitTarget: 0, reviewWeight: 99, isIntensiveReview: true },
+ 140: { phaseLabel: 'stabilization', blockNumber: 14, didacticMode: 'checkpoint', difficultyWeight: 5, newUnitTarget: 0, reviewWeight: 99, isIntensiveReview: false },
+ 141: { phaseLabel: 'stabilization', blockNumber: 15, didacticMode: 'intensive_review', difficultyWeight: 5, newUnitTarget: 0, reviewWeight: 99, isIntensiveReview: true },
+ 142: { phaseLabel: 'stabilization', blockNumber: 15, didacticMode: 'intensive_review', difficultyWeight: 5, newUnitTarget: 0, reviewWeight: 99, isIntensiveReview: true },
+ 143: { phaseLabel: 'stabilization', blockNumber: 15, didacticMode: 'pattern_drill', difficultyWeight: 5, newUnitTarget: 1, reviewWeight: 88, isIntensiveReview: false },
+ 144: { phaseLabel: 'stabilization', blockNumber: 15, didacticMode: 'real_life_scenario', difficultyWeight: 5, newUnitTarget: 2, reviewWeight: 80, isIntensiveReview: false },
+ 145: { phaseLabel: 'stabilization', blockNumber: 15, didacticMode: 'intensive_review', difficultyWeight: 5, newUnitTarget: 0, reviewWeight: 100, isIntensiveReview: true },
+ 146: { phaseLabel: 'stabilization', blockNumber: 15, didacticMode: 'intensive_review', difficultyWeight: 5, newUnitTarget: 0, reviewWeight: 100, isIntensiveReview: true },
+ 147: { phaseLabel: 'stabilization', blockNumber: 15, didacticMode: 'real_life_scenario', difficultyWeight: 5, newUnitTarget: 2, reviewWeight: 82, isIntensiveReview: false },
+ 148: { phaseLabel: 'stabilization', blockNumber: 15, didacticMode: 'checkpoint', difficultyWeight: 5, newUnitTarget: 0, reviewWeight: 100, isIntensiveReview: false },
+ 149: { phaseLabel: 'stabilization', blockNumber: 15, didacticMode: 'checkpoint', difficultyWeight: 5, newUnitTarget: 0, reviewWeight: 100, isIntensiveReview: false },
+ 150: { phaseLabel: 'stabilization', blockNumber: 15, didacticMode: 'real_life_scenario', difficultyWeight: 2, newUnitTarget: 1, reviewWeight: 70, isIntensiveReview: false }
+};
+
+export function getBisayaLessonPedagogy(lessonNumber) {
+ return BISAYA_LESSON_PEDAGOGY[Number(lessonNumber)] || null;
+}
diff --git a/backend/scripts/bisaya-course-phase3-extension.js b/backend/scripts/bisaya-course-phase3-extension.js
new file mode 100644
index 0000000..8a8003b
--- /dev/null
+++ b/backend/scripts/bisaya-course-phase3-extension.js
@@ -0,0 +1,254 @@
+export const BISAYA_PHASE3_DIDACTICS = {
+ 'Besuch & Gastfreundschaft': {
+ learningGoals: [
+ 'Einfache Besuchssituationen sprachlich eröffnen.',
+ 'Gäste begrüßen und höflich ins Haus bitten.',
+ 'Kurze Standardformeln für Einladung und Reaktion verwenden.'
+ ],
+ corePatterns: ['Sulod lang.', 'Lingkod sa.', 'Gimingaw mi nimo.', 'Salamat sa pag-anhi.'],
+ speakingPrompts: [
+ {
+ title: 'Gast begrüßen',
+ prompt: 'Begrüße einen Gast, bitte ihn herein und biete einen Sitzplatz an.',
+ cue: 'Maayong adlaw. Sulod lang. Lingkod sa.'
+ }
+ ],
+ practicalTasks: [
+ {
+ title: 'Mini-Rollenspiel',
+ text: 'Spiele den Moment nach, wenn ein Familienmitglied zu Besuch kommt.'
+ }
+ ]
+ },
+ 'Besuch & Haushalt': {
+ learningGoals: [
+ 'Wichtige Wörter rund um Besuch und Haushalt erkennen.',
+ 'Einfache Dinge im Haus benennen.',
+ 'Wortschatz aus Woche 1 und 2 mit neuen Besuchssituationen verbinden.'
+ ],
+ corePatterns: ['bisita', 'balay', 'lamisa', 'lingkuranan']
+ },
+ 'Fragen im Alltag vertiefen': {
+ learningGoals: [
+ 'Fragen mit mehr Varianten bilden.',
+ 'Rückfragen höflich wiederholen.',
+ 'Zwischen Frage, Bitte und Bestätigung sicher wechseln.'
+ ],
+ corePatterns: ['Asa ka padulong?', 'Unsa imong buhaton?', 'Pwede mangutana?', 'Palihug ka mubalik?'],
+ grammarFocus: [
+ {
+ title: 'Frageketten',
+ text: 'Im Alltag werden oft zwei kurze Fragen nacheinander gestellt statt eines langen Satzes.',
+ example: 'Asa ka padulong? Unsa imong buhaton didto?'
+ }
+ ],
+ speakingPrompts: [
+ {
+ title: 'Nachfragen',
+ prompt: 'Frage nach Ziel, Zeit und Vorhaben einer Person.',
+ cue: 'Asa ka padulong? Kanus-a ka moadto?'
+ }
+ ]
+ },
+ 'Termine & Verabredungen': {
+ learningGoals: [
+ 'Einfache Treffen verabreden.',
+ 'Zeitangaben und Zusagen kombinieren.',
+ 'Kurze Planungsdialoge laut üben.'
+ ],
+ corePatterns: ['Magkita ta ugma.', 'Unsa orasa?', 'Pwede ko karon.', 'Sige, kita ta.'],
+ speakingPrompts: [
+ {
+ title: 'Treffen planen',
+ prompt: 'Vereinbare ein Treffen für morgen und frage nach der Uhrzeit.',
+ cue: 'Magkita ta ugma. Unsa orasa?'
+ }
+ ]
+ },
+ 'Woche 5 - Intensivwiederholung I': {
+ learningGoals: [
+ 'Muster aus Familie, Fürsorge, Zeit und Besuch zusammen abrufen.',
+ 'Zwischen alten und neuen Themen schneller wechseln.',
+ 'Mehrere Mini-Szenen ohne deutsche Stütze lösen.'
+ ],
+ corePatterns: ['Kumusta ka?', 'Nikaon na ka?', 'Magkita ta ugma.', 'Sulod lang.']
+ },
+ 'Spiralwiederholung - Familie & Fürsorge': {
+ learningGoals: [
+ 'Frühe Familien- und Fürsorgemuster aktiv festigen.',
+ 'Bekannte Wörter in neuen Dialogen wiedererkennen.',
+ 'Von Einzelwörtern zu flüssigen Alltagsformeln übergehen.'
+ ],
+ corePatterns: ['Nanay', 'Tatay', 'Palangga taka.', 'Nikaon na ka?']
+ },
+ 'Gesundheit im Alltag': {
+ learningGoals: [
+ 'Einfache Beschwerden und Fürsorge im Gespräch ausdrücken.',
+ 'Nach dem Befinden fragen und Hilfe anbieten.',
+ 'Kurze Gesundheitsdialoge in der Familie üben.'
+ ],
+ corePatterns: ['Sakit imong ulo?', 'Niinom ka og tambal?', 'Magpahuway sa.', 'Maayo ra ko.'],
+ speakingPrompts: [
+ {
+ title: 'Nach dem Befinden fragen',
+ prompt: 'Frage nach Schmerzen und biete Ruhe oder Medizin an.',
+ cue: 'Sakit imong ulo? Magpahuway sa.'
+ }
+ ]
+ },
+ 'Medikamente & Beschwerden': {
+ learningGoals: [
+ 'Wichtige Wörter zu Schmerzen und Medizin erkennen.',
+ 'Zwischen Körperteil, Symptom und Hilfe unterscheiden.',
+ 'Gesundheitswortschatz mit Fürsorge verbinden.'
+ ],
+ corePatterns: ['tambal', 'ubo', 'hilanat', 'kasakit']
+ },
+ 'Woche 5 - Intensivwiederholung II': {
+ learningGoals: [
+ 'Gesundheit, Fragen, Besuch und Organisation gemischt trainieren.',
+ 'Wackelige Muster noch einmal unter Zeitdruck abrufen.',
+ 'Sprechtempo und Reaktionssicherheit erhöhen.'
+ ],
+ corePatterns: ['Pwede mangutana?', 'Magkita ta.', 'Niinom ka og tambal?', 'Salamat sa pag-anhi.']
+ },
+ 'Woche 5 - Checkpoint': {
+ learningGoals: [
+ 'Die wichtigsten Inhalte von Woche 5 abrufen.',
+ 'Sicherheit bei Alltags- und Besuchsdialogen prüfen.',
+ 'Stärken und Lücken vor Woche 6 sichtbar machen.'
+ ],
+ corePatterns: ['Sulod lang.', 'Unsa orasa?', 'Magpahuway sa.', 'Palihug ka mubalik?']
+ },
+ 'Unterwegs & Transport': {
+ learningGoals: [
+ 'Unterwegs nach Weg, Fahrt und Ziel fragen.',
+ 'Kurze Transportsituationen bewältigen.',
+ 'Richtungen und Verkehrswörter im Kontext nutzen.'
+ ],
+ corePatterns: ['Asa ang sakayan?', 'Moadto ko sa lungsod.', 'Hunong lang dinhi.', 'Pila ang plite?'],
+ speakingPrompts: [
+ {
+ title: 'Transport fragen',
+ prompt: 'Frage nach Haltestelle, Preis und Zielort.',
+ cue: 'Asa ang sakayan? Pila ang plite?'
+ }
+ ]
+ },
+ 'Wege & Verkehr': {
+ learningGoals: [
+ 'Weg- und Verkehrswortschatz ausbauen.',
+ 'Transportwörter mit Richtungen verbinden.',
+ 'Häufige Reise- und Bewegungsverben wiederholen.'
+ ],
+ corePatterns: ['sakyanan', 'dalan', 'hunong', 'biyahe']
+ },
+ 'Arbeit & Aufgaben': {
+ learningGoals: [
+ 'Über einfache Tätigkeiten und Pflichten sprechen.',
+ 'Arbeit, Haushalt und Tagesaufgaben benennen.',
+ 'Kurze Aussagen über To-dos machen.'
+ ],
+ corePatterns: ['Naa koy trabaho karon.', 'Aduna koy buhaton.', 'Human na ko.', 'Tabang ta.'],
+ speakingPrompts: [
+ {
+ title: 'Tagesaufgaben',
+ prompt: 'Erkläre kurz, was du heute noch erledigen musst.',
+ cue: 'Aduna koy buhaton karon. Human na ko unya.'
+ }
+ ]
+ },
+ 'Tätigkeiten & Organisation': {
+ learningGoals: [
+ 'Wörter für Aufgaben, Arbeit und Organisation erkennen.',
+ 'Bekannte Verben in neue Alltagssituationen übertragen.',
+ 'Kurze Planungs- und Erledigungssätze vorbereiten.'
+ ],
+ corePatterns: ['trabaho', 'buluhaton', 'lista', 'tabang']
+ },
+ 'Freies Gespräch - Familie & Alltag': {
+ learningGoals: [
+ 'Frühere Themen ohne enge Führung kombinieren.',
+ 'Längere Alltagsantworten aufbauen.',
+ 'Im freien Sprechen bei bekannten Themen stabil bleiben.'
+ ],
+ corePatterns: ['Maayo ra.', 'Naa mi sa balay.', 'Magkita mi unya.', 'Gimingaw ko nimo.'],
+ speakingPrompts: [
+ {
+ title: 'Alltagsgespräch',
+ prompt: 'Erzähle kurz von Familie, Tagesplan und aktuellem Befinden.',
+ cue: 'Naa mi sa balay. Maayo ra ko. Aduna koy buhaton unya.'
+ }
+ ]
+ },
+ 'Spiralwiederholung - Wochen 1 bis 4': {
+ learningGoals: [
+ 'Frühe Kursinhalte blockübergreifend wiederholen.',
+ 'Ähnliche Muster sauber unterscheiden.',
+ 'Vor dem Schnellstart-Abschluss zentrale Formen stabilisieren.'
+ ],
+ corePatterns: ['Kumusta ka?', 'Tagpila ni?', 'Ni-kaon ko.', 'Nalipay ko.']
+ },
+ 'Konflikte & Missverständnisse': {
+ learningGoals: [
+ 'Missverständnisse höflich ansprechen.',
+ 'Um Wiederholung oder langsamere Erklärung bitten.',
+ 'Kleine Konflikte sprachlich entschärfen.'
+ ],
+ corePatterns: ['Wala ko kasabot.', 'Hinay-hinay lang.', 'Pwede nato istoryahan?', 'Pasayloa ko.'],
+ speakingPrompts: [
+ {
+ title: 'Missverständnis lösen',
+ prompt: 'Bitte um Wiederholung und entschuldige dich höflich.',
+ cue: 'Wala ko kasabot. Palihug ka mubalik. Pasayloa ko.'
+ }
+ ]
+ },
+ 'Abschlusstest - Schnellstart': {
+ learningGoals: [
+ 'Wichtige Wörter aus dem gesamten Schnellstart sicher abrufen.',
+ 'Zwischen ähnlichen Antworten sauber unterscheiden.',
+ 'Den aktiven Grundwortschatz stabilisieren.'
+ ],
+ corePatterns: ['Kumusta', 'bisita', 'tambal', 'plite']
+ },
+ 'Abschlussprüfung - Schnellstart': {
+ learningGoals: [
+ 'Den 6-Wochen-Schnellstart in gemischten Aufgaben überprüfen.',
+ 'Abruf, Musterverständnis und situative Anwendung kombinieren.',
+ 'Die Grundlage für die Alltagsphase absichern.'
+ ],
+ corePatterns: ['Sulod lang.', 'Magkita ta ugma.', 'Niinom ka og tambal?', 'Asa ang sakayan?']
+ },
+ 'Kulturelle Vertiefung im Familienalltag': {
+ learningGoals: [
+ 'Sprachgebrauch und Familienkultur besser einordnen.',
+ 'Höflichkeit, Nähe und indirekte Kommunikation bewusster wahrnehmen.',
+ 'Kulturelle Unterschiede mit dem gelernten Sprachmaterial verknüpfen.'
+ ],
+ corePatterns: ['pakikisama', 'respeto', 'amping', 'palihug']
+ }
+};
+
+export const BISAYA_PHASE3_LESSONS = [
+ { week: 5, day: 1, num: 41, type: 'conversation', title: 'Besuch & Gastfreundschaft', desc: 'Besuch empfangen, hereinbitten und freundlich reagieren', targetMin: 18, targetScore: 80, review: false, cultural: 'Gastfreundschaft ist im philippinischen Familienalltag zentral.' },
+ { week: 5, day: 1, num: 42, type: 'vocab', title: 'Besuch & Haushalt', desc: 'Wichtige Wörter für Besuch, Haus und gemeinsame Zeit', targetMin: 18, targetScore: 85, review: true, cultural: null },
+ { week: 5, day: 2, num: 43, type: 'grammar', title: 'Fragen im Alltag vertiefen', desc: 'Rückfragen, Folgefragen und höfliches Nachhaken', targetMin: 22, targetScore: 78, review: true, cultural: null },
+ { week: 5, day: 2, num: 44, type: 'conversation', title: 'Termine & Verabredungen', desc: 'Treffen planen und Uhrzeiten absprechen', targetMin: 18, targetScore: 80, review: false, cultural: null },
+ { week: 5, day: 3, num: 45, type: 'review', title: 'Woche 5 - Intensivwiederholung I', desc: 'Erste große Wiederholung zu Besuch, Alltag und Fürsorge', targetMin: 28, targetScore: 80, review: false, cultural: null },
+ { week: 5, day: 3, num: 46, type: 'vocab', title: 'Spiralwiederholung - Familie & Fürsorge', desc: 'Alte Kernmuster gezielt wiederholen und festigen', targetMin: 20, targetScore: 85, review: true, cultural: null },
+ { week: 5, day: 4, num: 47, type: 'conversation', title: 'Gesundheit im Alltag', desc: 'Nach Beschwerden fragen und Hilfe anbieten', targetMin: 18, targetScore: 80, review: false, cultural: null },
+ { week: 5, day: 4, num: 48, type: 'vocab', title: 'Medikamente & Beschwerden', desc: 'Schmerz, Medizin und Fürsorgewortschatz', targetMin: 18, targetScore: 85, review: true, cultural: null },
+ { week: 5, day: 5, num: 49, type: 'review', title: 'Woche 5 - Intensivwiederholung II', desc: 'Große Mischwiederholung mit Fokus auf Abruf und Tempo', targetMin: 28, targetScore: 80, review: false, cultural: null },
+ { week: 5, day: 5, num: 50, type: 'vocab', title: 'Woche 5 - Checkpoint', desc: 'Checkpoint zu den Inhalten von Woche 5', targetMin: 16, targetScore: 82, review: true, cultural: null },
+ { week: 6, day: 1, num: 51, type: 'conversation', title: 'Unterwegs & Transport', desc: 'Nach Weg, Fahrt, Preis und Ziel fragen', targetMin: 18, targetScore: 80, review: false, cultural: null },
+ { week: 6, day: 1, num: 52, type: 'vocab', title: 'Wege & Verkehr', desc: 'Verkehrs- und Bewegungswortschatz für den Alltag', targetMin: 18, targetScore: 85, review: true, cultural: null },
+ { week: 6, day: 2, num: 53, type: 'conversation', title: 'Arbeit & Aufgaben', desc: 'Über Pflichten, Arbeit und Erledigungen sprechen', targetMin: 18, targetScore: 80, review: false, cultural: null },
+ { week: 6, day: 2, num: 54, type: 'vocab', title: 'Tätigkeiten & Organisation', desc: 'Verben und Wörter für Aufgaben, Listen und Hilfe', targetMin: 18, targetScore: 85, review: true, cultural: null },
+ { week: 6, day: 3, num: 55, type: 'conversation', title: 'Freies Gespräch - Familie & Alltag', desc: 'Freier sprechen über Familie, Zuhause und Tagesablauf', targetMin: 22, targetScore: 78, review: false, cultural: null },
+ { week: 6, day: 3, num: 56, type: 'review', title: 'Spiralwiederholung - Wochen 1 bis 4', desc: 'Frühere Inhalte blockübergreifend wiederholen', targetMin: 28, targetScore: 82, review: false, cultural: null },
+ { week: 6, day: 4, num: 57, type: 'conversation', title: 'Konflikte & Missverständnisse', desc: 'Höflich um Wiederholung bitten und Missverständnisse klären', targetMin: 20, targetScore: 80, review: false, cultural: 'Ruhiger, indirekter Umgang hilft in heiklen Gesprächen.' },
+ { week: 6, day: 4, num: 58, type: 'vocab', title: 'Abschlusstest - Schnellstart', desc: 'Finaler Wortschatztest über den 6-Wochen-Schnellstart', targetMin: 18, targetScore: 82, review: true, cultural: null },
+ { week: 6, day: 5, num: 59, type: 'review', title: 'Abschlussprüfung - Schnellstart', desc: 'Große Abschlussprüfung mit gemischten Inhalten', targetMin: 30, targetScore: 82, review: false, cultural: 'Die Abschlussphase prüft vor allem sichere Alltagsfähigkeit.' },
+ { week: 6, day: 5, num: 60, type: 'culture', title: 'Kulturelle Vertiefung im Familienalltag', desc: 'Vertiefe wichtige kulturelle Muster für Sprache und Familienalltag', targetMin: 16, targetScore: 0, review: false, cultural: 'Sprache, Respekt und Familienrollen sind eng miteinander verbunden.' }
+];
diff --git a/backend/scripts/bisaya-course-phase4-extension.js b/backend/scripts/bisaya-course-phase4-extension.js
new file mode 100644
index 0000000..a16d921
--- /dev/null
+++ b/backend/scripts/bisaya-course-phase4-extension.js
@@ -0,0 +1,594 @@
+export const BISAYA_PHASE4_DIDACTICS = {
+ 'Kinder im Alltag': {
+ learningGoals: [
+ 'Über Kinder im Familienalltag sprechen.',
+ 'Einfache Fragen zu Hunger, Müdigkeit und Schule stellen.',
+ 'Kurze Fürsorge-Dialoge mit Kindern laut üben.'
+ ],
+ corePatterns: ['Nikaon na ang bata?', 'Asa ang bata?', 'Kapoy na ka?', 'Andam na ka sa eskwela?'],
+ speakingPrompts: [
+ {
+ title: 'Mit Kind sprechen',
+ prompt: 'Frage ein Kind nach Essen, Müdigkeit und Schule.',
+ cue: 'Nikaon na ka? Kapoy na ka?'
+ }
+ ]
+ },
+ 'Schule & Betreuung': {
+ learningGoals: [
+ 'Wichtige Wörter zu Schule und Betreuung erkennen.',
+ 'Über Tasche, Hefte, Lehrkraft und Unterricht sprechen.',
+ 'Kinder- und Schulwortschatz mit Familienalltag verbinden.'
+ ],
+ corePatterns: ['eskwela', 'maestra', 'bag', 'leksyon']
+ },
+ 'Fragen an Kinder vereinfachen': {
+ learningGoals: [
+ 'Kurze, einfache Fragen für Kinder bilden.',
+ 'Aufforderungen und Fragen freundlich unterscheiden.',
+ 'Kindgerechte Alltagsmuster wiederholt anwenden.'
+ ],
+ corePatterns: ['Unsa ni?', 'Asa imong bag?', 'Andam na ka?', 'Ali diri.'],
+ grammarFocus: [
+ {
+ title: 'Kurze Fragen',
+ text: 'Mit Kindern funktionieren kurze, klare Fragen oft besser als lange Sätze.',
+ example: 'Asa imong bag? Andam na ka?'
+ }
+ ]
+ },
+ 'Hausaufgaben & Routine': {
+ learningGoals: [
+ 'Über Lernen, Hausaufgaben und Routine sprechen.',
+ 'Einfachen Tagesablauf mit Schule und Zuhause verbinden.',
+ 'Kurze Organisationsgespräche führen.'
+ ],
+ corePatterns: ['Naa kay assignment?', 'Human na ka?', 'Magtuon ta.', 'Sunod, matulog na.']
+ },
+ 'Woche 7 - Intensivwiederholung I': {
+ learningGoals: [
+ 'Kinder-, Familien- und Routinemuster gemeinsam abrufen.',
+ 'Frühere Fürsorgeformen mit Schulalltag verbinden.',
+ 'Schneller zwischen Themen wechseln.'
+ ],
+ corePatterns: ['Nikaon na ka?', 'Asa ang bata?', 'Magtuon ta.', 'Palihug lingkod.']
+ },
+ 'Spiralwiederholung - Familie, Kinder & Fürsorge': {
+ learningGoals: [
+ 'Familien- und Kindermuster spiralig wiederholen.',
+ 'Bekannte Kernwörter schneller abrufen.',
+ 'Alte Inhalte in neuen Situationen festigen.'
+ ],
+ corePatterns: ['Nanay', 'Tatay', 'bata', 'eskwela']
+ },
+ 'Spielen & Freizeit': {
+ learningGoals: [
+ 'Über Spiel, Freizeit und kurze Aktivitäten sprechen.',
+ 'Kinder zu Spiel und Pause begleiten.',
+ 'Leichte Alltagsdialoge mit Bewegung verbinden.'
+ ],
+ corePatterns: ['Magdula ta.', 'Ganahan ka modula?', 'Lingaw ka?', 'Human na ang duwa.']
+ },
+ 'Spielsachen & Aktivitäten': {
+ learningGoals: [
+ 'Wortschatz für Spiel und Freizeit ausbauen.',
+ 'Aktivitäten benennen und vergleichen.',
+ 'Kinderalltag mit neuen Nomen anreichern.'
+ ],
+ corePatterns: ['duwa', 'bola', 'libro', 'kanta']
+ },
+ 'Woche 7 - Intensivwiederholung II': {
+ learningGoals: [
+ 'Kinder-, Spiel- und Schulmuster unter Zeitdruck abrufen.',
+ 'Schwierige Formen gezielt wiederholen.',
+ 'Mehr Sicherheit in Alltagsszenen mit Kindern gewinnen.'
+ ],
+ corePatterns: ['Andam na ka?', 'Magdula ta.', 'Human na ka?', 'Asa imong bag?']
+ },
+ 'Woche 7 - Checkpoint': {
+ learningGoals: [
+ 'Die wichtigsten Inhalte der Kinder- und Schulwoche überprüfen.',
+ 'Abruf und Anwendung im Familienalltag testen.',
+ 'Lücken vor Woche 8 sichtbar machen.'
+ ],
+ corePatterns: ['eskwela', 'assignment', 'bata', 'magdula']
+ },
+ 'Arzt & Termin': {
+ learningGoals: [
+ 'Arzttermine sprachlich vorbereiten.',
+ 'Über Beschwerden, Termin und Wartezeit sprechen.',
+ 'Einfache Gesundheitsgespräche strukturieren.'
+ ],
+ corePatterns: ['Adto ta sa doktor.', 'Naa moy appointment?', 'Unsay gibati nimo?', 'Maghulat ta.']
+ },
+ 'Apotheke & Medikamente': {
+ learningGoals: [
+ 'Wortschatz aus Apotheke und Medizin sicher erkennen.',
+ 'Zwischen Medikament, Rezept und Dosierung unterscheiden.',
+ 'Gesundheitswortschatz in Erledigungen einordnen.'
+ ],
+ corePatterns: ['tambal', 'botika', 'reseta', 'dose']
+ },
+ 'Beschwerden genauer beschreiben': {
+ learningGoals: [
+ 'Beschwerden konkreter benennen.',
+ 'Zwischen leicht, stark und wiederkehrend unterscheiden.',
+ 'Fragen und Antworten zu Schmerzen vertiefen.'
+ ],
+ corePatterns: ['Sakit kaayo.', 'Gamaya ra ang sakit.', 'Nagsugod ganiha.', 'Mas maayo na karon.'],
+ grammarFocus: [
+ {
+ title: 'Beschwerden abstufen',
+ text: 'Im Alltag helfen kurze Verstärker und Zeitangaben, um Schmerzen genauer zu beschreiben.',
+ example: 'Sakit kaayo. Nagsugod ganiha.'
+ }
+ ]
+ },
+ 'Notfälle & Hilfe': {
+ learningGoals: [
+ 'In einfachen Notlagen Hilfe rufen und organisieren.',
+ 'Klare, kurze Anweisungen geben.',
+ 'Grundmuster für schnelle Reaktion beherrschen.'
+ ],
+ corePatterns: ['Tabang!', 'Tawag ug doktor.', 'Dali lang.', 'Asa ang tambal?']
+ },
+ 'Woche 8 - Intensivwiederholung I': {
+ learningGoals: [
+ 'Arzt-, Apotheke- und Hilfemuster gebündelt wiederholen.',
+ 'Beschwerden schneller abrufen und zuordnen.',
+ 'Gesundheitskommunikation stabilisieren.'
+ ],
+ corePatterns: ['doktor', 'tambal', 'tabang', 'sakit kaayo']
+ },
+ 'Spiralwiederholung - Gesundheit': {
+ learningGoals: [
+ 'Frühere Fürsorge- und Gesundheitsmuster zusammenführen.',
+ 'Bekannte Wörter in neuen Gesundheitsdialogen wiederholen.',
+ 'Gesundheitswortschatz langfristig verankern.'
+ ],
+ corePatterns: ['Nikaon na ka?', 'Magpahuway sa.', 'doktor', 'tambal']
+ },
+ 'Essen, Ruhe & Genesung': {
+ learningGoals: [
+ 'Über Ruhe, Essen und Erholung bei Krankheit sprechen.',
+ 'Kurze Pflegegespräche im Familienalltag führen.',
+ 'Fürsorge und Gesundheit verbinden.'
+ ],
+ corePatterns: ['Magpahuway sa.', 'Mokaon sa ka.', 'Uminom og tubig.', 'Mas maayo na ka?']
+ },
+ 'Körper, Symptome & Pflege': {
+ learningGoals: [
+ 'Körperteile, Symptome und Pflegewörter ausbauen.',
+ 'Zwischen Ort und Art einer Beschwerde unterscheiden.',
+ 'Pflegealltag mit konkreterem Wortschatz stützen.'
+ ],
+ corePatterns: ['ulo', 'tiyan', 'hilanat', 'alaga']
+ },
+ 'Woche 8 - Intensivwiederholung II': {
+ learningGoals: [
+ 'Gesundheitswortschatz in Mischsituationen wiederholen.',
+ 'Fragen, Antworten und Reaktionen zügig abrufen.',
+ 'Vor dem Wochenabschluss Sicherheit erhöhen.'
+ ],
+ corePatterns: ['Mas maayo na ka?', 'Adto ta sa doktor.', 'Uminom og tubig.', 'Tabang!']
+ },
+ 'Woche 8 - Checkpoint': {
+ learningGoals: [
+ 'Die Gesundheitswoche diagnostisch abschließen.',
+ 'Abruf, Verständnis und situative Anwendung prüfen.',
+ 'Stärken und Lücken für Woche 9 festhalten.'
+ ],
+ corePatterns: ['doktor', 'botika', 'hilanat', 'tabang']
+ },
+ 'Einkaufen vertiefen': {
+ learningGoals: [
+ 'Komplexere Einkaufssituationen meistern.',
+ 'Zwischen Auswahl, Menge und Preis sicher wechseln.',
+ 'Kürzere und längere Kaufdialoge kombinieren.'
+ ],
+ corePatterns: ['Pila ni tanan?', 'Pwede tulo kabuok?', 'Naa moy mas barato?', 'Kuhaon na nako.']
+ },
+ 'Markt & Mengen': {
+ learningGoals: [
+ 'Mengen- und Marktwortschatz ausbauen.',
+ 'Zwischen Stück, Kilo und Portion unterscheiden.',
+ 'Preise und Mengen natürlicher kombinieren.'
+ ],
+ corePatterns: ['kilo', 'buok', 'merkado', 'sobra']
+ },
+ 'Wünsche, Bedarf und Bitte': {
+ learningGoals: [
+ 'Wünsche höflich formulieren.',
+ 'Bedarf, Bitte und Auswahl sprachlich unterscheiden.',
+ 'Kauf- und Alltagsbitten variieren.'
+ ],
+ corePatterns: ['Gusto ko ani.', 'Kinahanglan nako ni.', 'Pwede palihug?', 'Mas maayo ni para nako.'],
+ grammarFocus: [
+ {
+ title: 'Wunsch vs. Bedarf',
+ text: 'Mit "gusto" und "kinahanglan" lassen sich Wunsch und Notwendigkeit klar unterscheiden.',
+ example: 'Gusto ko ani. Kinahanglan nako ni.'
+ }
+ ]
+ },
+ 'Behördengänge & Formulare': {
+ learningGoals: [
+ 'Einfache Behördensituationen sprachlich vorbereiten.',
+ 'Nach Formularen, Schaltern und Terminen fragen.',
+ 'Erledigungssprache über den Einkauf hinaus ausbauen.'
+ ],
+ corePatterns: ['Asa ang porma?', 'Asa ko mulinya?', 'Naa koy appointment.', 'Unsa ang sunod?']
+ },
+ 'Woche 9 - Intensivwiederholung I': {
+ learningGoals: [
+ 'Einkaufs- und Erledigungsmuster zusammen wiederholen.',
+ 'Mengen, Preise und Bitten schneller abrufen.',
+ 'Alltagsorganisation sprachlich absichern.'
+ ],
+ corePatterns: ['Pila ni tanan?', 'Kinahanglan nako ni.', 'Asa ang porma?', 'Pwede palihug?']
+ },
+ 'Spiralwiederholung - Preise & Erledigungen': {
+ learningGoals: [
+ 'Preis- und Erledigungsmuster blockübergreifend verknüpfen.',
+ 'Alte und neue Einkaufsformen sauber unterscheiden.',
+ 'Häufige Alltagsfragen festigen.'
+ ],
+ corePatterns: ['Tagpila ni?', 'Pila ni tanan?', 'appointment', 'linya']
+ },
+ 'Bank, Geld & Bezahlen': {
+ learningGoals: [
+ 'Über Bargeld, Wechselgeld und Bezahlen sprechen.',
+ 'Einfache Geldsituationen im Alltag bewältigen.',
+ 'Einkauf und Finanzalltag verbinden.'
+ ],
+ corePatterns: ['Mubayad ko.', 'Naa kay sinsilyo?', 'Wala koy sukli.', 'Asa ang ATM?']
+ },
+ 'Dokumente & Termine': {
+ learningGoals: [
+ 'Wichtige Wörter für Dokumente und Termine lernen.',
+ 'Papierkram und Terminorganisation sprachlich stützen.',
+ 'Erledigungssituationen besser strukturieren.'
+ ],
+ corePatterns: ['ID', 'papel', 'appointment', 'resibo']
+ },
+ 'Woche 9 - Intensivwiederholung II': {
+ learningGoals: [
+ 'Erledigungen, Bezahlen und Behördensprache verdichten.',
+ 'Fehleranfällige Muster gezielt festigen.',
+ 'Vor dem Checkpoint die Abrufsicherheit erhöhen.'
+ ],
+ corePatterns: ['Mubayad ko.', 'Wala koy sukli.', 'Asa ko mulinya?', 'Naa koy appointment.']
+ },
+ 'Woche 9 - Checkpoint': {
+ learningGoals: [
+ 'Die wichtigsten Inhalte rund um Erledigungen überprüfen.',
+ 'Sprachliche Sicherheit bei Kauf, Formular und Termin messen.',
+ 'Übergang zur Sozialphase vorbereiten.'
+ ],
+ corePatterns: ['merkado', 'ATM', 'resibo', 'porma']
+ },
+ 'Nachbarschaft & Besuche': {
+ learningGoals: [
+ 'Über Nachbarn, Besuche und kurze Begegnungen sprechen.',
+ 'Freundliche Alltagsgespräche im Umfeld führen.',
+ 'Soziale Nähe sprachlich ausdrücken.'
+ ],
+ corePatterns: ['Kumusta mo?', 'Niadto mi sa silingan.', 'Moadto ko didto unya.', 'Bisita mo unya.']
+ },
+ 'Hilfe & Unterstützung': {
+ learningGoals: [
+ 'Um Hilfe bitten und Hilfe anbieten.',
+ 'Unterstützung im Alltag sprachlich strukturieren.',
+ 'Kurze soziale Hilfsdialoge üben.'
+ ],
+ corePatterns: ['Pwede ka motabang?', 'Tabangan tika.', 'Salamat sa tabang.', 'Kinahanglan ko og tabang.']
+ },
+ 'Höflich reagieren und ablehnen': {
+ learningGoals: [
+ 'Höflich zusagen, verschieben oder ablehnen.',
+ 'Soziale Reaktionen natürlicher gestalten.',
+ 'Hilfe und Einladungen fein abstufen.'
+ ],
+ corePatterns: ['Sige lang.', 'Dili lang sa karon.', 'Sunod na lang.', 'Salamat pero dili ko mahimo.'],
+ grammarFocus: [
+ {
+ title: 'Sanft ablehnen',
+ text: 'Im Alltag klingt eine weiche Ablehnung oft natürlicher als ein direktes Nein.',
+ example: 'Dili lang sa karon. Sunod na lang.'
+ }
+ ]
+ },
+ 'Feste & Einladungen': {
+ learningGoals: [
+ 'Über Feiern und Einladungen sprechen.',
+ 'Einladungen aussprechen, annehmen oder verschieben.',
+ 'Soziale Ereignisse sprachlich einordnen.'
+ ],
+ corePatterns: ['Aduna moy handa?', 'Moadto ka sa pista?', 'Giinvite tika.', 'Magkita ta didto.']
+ },
+ 'Woche 10 - Intensivwiederholung I': {
+ learningGoals: [
+ 'Soziale Muster mit Hilfe, Besuch und Einladung bündeln.',
+ 'Schneller auf soziale Situationen reagieren.',
+ 'Höfliche Ablehnung und Zusage wiederholen.'
+ ],
+ corePatterns: ['Pwede ka motabang?', 'Bisita mo unya.', 'Sunod na lang.', 'Giinvite tika.']
+ },
+ 'Spiralwiederholung - Soziale Situationen': {
+ learningGoals: [
+ 'Mehrere Sozialthemen gemischt wiederholen.',
+ 'Hilfe, Besuch und Fürsorge verbinden.',
+ 'Reaktionssicherheit im Gespräch erhöhen.'
+ ],
+ corePatterns: ['tabang', 'bisita', 'amping', 'sunod na lang']
+ },
+ 'Konflikte ruhig lösen': {
+ learningGoals: [
+ 'Kleine Spannungen ruhig ansprechen.',
+ 'Missverständnisse sozial abfedern.',
+ 'Bitten, Erklärung und Entschuldigung kombinieren.'
+ ],
+ corePatterns: ['Pwede nato istoryahan?', 'Pasayloa ko.', 'Dili mao ang akong pasabot.', 'Sabta lang ko.']
+ },
+ 'Gefühle im Gespräch vertiefen': {
+ learningGoals: [
+ 'Gefühle sozial differenzierter ausdrücken.',
+ 'Auf Sorge, Enttäuschung oder Freude reagieren.',
+ 'Emotionen mit Beziehungssprache verbinden.'
+ ],
+ corePatterns: ['Naguol ko.', 'Nalipay ko.', 'Nasayod ko sa imong gibati.', 'Salamat sa pagsabot.']
+ },
+ 'Woche 10 - Intensivwiederholung II': {
+ learningGoals: [
+ 'Soziale und emotionale Gesprächsmuster verdichten.',
+ 'Höflich reagieren, helfen und erklären trainieren.',
+ 'Vor dem Wochenabschluss Sicherheit erhöhen.'
+ ],
+ corePatterns: ['Pasayloa ko.', 'Tabangan tika.', 'Nalipay ko.', 'Sunod na lang.']
+ },
+ 'Woche 10 - Checkpoint': {
+ learningGoals: [
+ 'Die Sozialwoche abschließen.',
+ 'Hilfe, Einladung, Ablehnung und Emotionen gemischt prüfen.',
+ 'Stabilität für die Schlussmodule vorbereiten.'
+ ],
+ corePatterns: ['giinvite', 'tabang', 'pasayloa', 'nalipay']
+ },
+ 'Zuhause organisieren': {
+ learningGoals: [
+ 'Haushalt, Ordnung und Aufgaben zuhause besprechen.',
+ 'Kurze Organisationsgespräche führen.',
+ 'Familienalltag mit Haushaltssprache stützen.'
+ ],
+ corePatterns: ['Ato ning limpyohan.', 'Asa nato ibutang?', 'Humanon nato karon.', 'Ayaw kalimot.']
+ },
+ 'Haushalt & Reparaturen': {
+ learningGoals: [
+ 'Wörter zu Haushalt und kleinen Reparaturen lernen.',
+ 'Kaputte Dinge und Lösungen benennen.',
+ 'Haus- und Alltagswortschatz erweitern.'
+ ],
+ corePatterns: ['limpyo', 'guba', 'ayo', 'susi']
+ },
+ 'Vergangenes und Pläne im Alltag': {
+ learningGoals: [
+ 'Vergangenes und Bevorstehendes im Alltag flüssiger ausdrücken.',
+ 'Ni- und Mo-/Mag- in Routinen wiederholen.',
+ 'Kurze Erzähl- und Planungssequenzen verbinden.'
+ ],
+ corePatterns: ['Nihapit ko ganiha.', 'Moadto ko unya.', 'Nahuman na namo.', 'Magluto mi ugma.'],
+ grammarFocus: [
+ {
+ title: 'Alltagspläne verbinden',
+ text: 'In Alltagserzählungen wechseln Vergangenheit und Plan oft direkt nacheinander.',
+ example: 'Nihapit ko ganiha. Moadto ko unya.'
+ }
+ ]
+ },
+ 'Arbeit, Schule und Termine verbinden': {
+ learningGoals: [
+ 'Mehrere Tagesbereiche in einem Gespräch kombinieren.',
+ 'Arbeit, Schule und Termine als Ablauf beschreiben.',
+ 'Längere Alltagsketten sprachlich organisieren.'
+ ],
+ corePatterns: ['Una, moadto ko sa trabaho.', 'Pagkahuman, kuhaon nako ang bata.', 'Aduna mi appointment unya.', 'Busy kaayo ang adlaw.']
+ },
+ 'Woche 11 - Intensivwiederholung I': {
+ learningGoals: [
+ 'Haushalt, Planung und Alltagslogistik zusammen wiederholen.',
+ 'Mehrschrittige Tagesabläufe stabilisieren.',
+ 'Organisation natürlicher versprachlichen.'
+ ],
+ corePatterns: ['Asa nato ibutang?', 'Moadto ko unya.', 'Aduna mi appointment.', 'Busy kaayo ang adlaw.']
+ },
+ 'Spiralwiederholung - Alltagsmodule': {
+ learningGoals: [
+ 'Module 6 bis 10 zusammenziehen.',
+ 'Thematische Übergänge zwischen Familie, Gesundheit, Erledigungen und Sozialem üben.',
+ 'Den aktiven Alltagswortschatz stabilisieren.'
+ ],
+ corePatterns: ['bata', 'doktor', 'ATM', 'tabang']
+ },
+ 'Unterwegs im Familienalltag': {
+ learningGoals: [
+ 'Transport, Termine und Familie in einer Situation verbinden.',
+ 'Unterwegs spontan reagieren.',
+ 'Alltagswege mit Personen und Aufgaben koppeln.'
+ ],
+ corePatterns: ['Kuhaon nako sila.', 'Moadto mi sa lungsod.', 'Asa ta manaog?', 'Dali lang, hapit na ta.']
+ },
+ 'Nachbarschaft & Orte': {
+ learningGoals: [
+ 'Wichtige Orte im Wohnumfeld beschreiben.',
+ 'Nachbarschaftswortschatz mit Bewegung und Besuch verknüpfen.',
+ 'Alltagswege präziser benennen.'
+ ],
+ corePatterns: ['silingan', 'merkado', 'eskwelahan', 'botika']
+ },
+ 'Woche 11 - Intensivwiederholung II': {
+ learningGoals: [
+ 'Die Alltagsmodule vor der Schlussphase verdichten.',
+ 'Schwache Bereiche gezielt wiederholen.',
+ 'Sicherheit im größeren Alltagskontext erhöhen.'
+ ],
+ corePatterns: ['kuhaon nako sila.', 'Ato ning limpyohan.', 'Aduna mi appointment.', 'Pwede ka motabang?']
+ },
+ 'Woche 11 - Checkpoint': {
+ learningGoals: [
+ 'Den Übergang zur großen Integrationswoche absichern.',
+ 'Vernetztes Alltagsverständnis messen.',
+ 'Restliche Lücken vor Woche 12 sichtbar machen.'
+ ],
+ corePatterns: ['limpyo', 'appointment', 'silingan', 'busy']
+ },
+ 'Freies Gespräch - Alltag I': {
+ learningGoals: [
+ 'Längere Alltagsgespräche freier führen.',
+ 'Mehrere Themen in einer Antwort verbinden.',
+ 'Mit wenig Stütze sprachlich handlungsfähig bleiben.'
+ ],
+ corePatterns: ['Maayo ra ang adlaw.', 'Daghan kog buhaton.', 'Moadto pa ko unya.', 'Human na mi sa balay.']
+ },
+ 'Mischtraining - Kernwortschatz': {
+ learningGoals: [
+ 'Den Kernwortschatz quer über alle Module wiederholen.',
+ 'Ähnliche Wörter sicher unterscheiden.',
+ 'Abrufgeschwindigkeit erhöhen.'
+ ],
+ corePatterns: ['palihug', 'tabang', 'tambal', 'resibo']
+ },
+ 'Freies Gespräch - Alltag II': {
+ learningGoals: [
+ 'Freies Sprechen unter leichtem Druck fortsetzen.',
+ 'Alltagserzählung, Fürsorge und Organisation kombinieren.',
+ 'Längere Reaktionen mit mehr Eigenproduktion wagen.'
+ ],
+ corePatterns: ['Gikapoy ko pero okay ra.', 'Naa pa koy lakaw.', 'Magkita mi unya.', 'Nasabtan na nako.']
+ },
+ 'Wiederholung schwieriger Muster': {
+ learningGoals: [
+ 'Fehleranfällige Strukturen gezielt wiederholen.',
+ 'Verwechslungen bei Zeit, Bitte und Reaktion reduzieren.',
+ 'Vor der Schlussprüfung Stabilität erhöhen.'
+ ],
+ corePatterns: ['Niadto ko.', 'Moadto ko.', 'Palihug ka mubalik.', 'Dili lang sa karon.'],
+ grammarFocus: [
+ {
+ title: 'Schwierige Kontraste',
+ text: 'Kurzformen, Zeitmarker und höfliche Reaktionen werden leicht verwechselt und sollten direkt kontrastiert werden.',
+ example: 'Niadto ko ganiha. Moadto ko ugma.'
+ }
+ ]
+ },
+ 'Großes Alltagsreview I': {
+ learningGoals: [
+ 'Den Alltagswortschatz großflächig abrufen.',
+ 'Mehrere Themenblöcke in gemischter Form wiederholen.',
+ 'Auf die Schlussaufgaben vorbereiten.'
+ ],
+ corePatterns: ['doktor', 'merkado', 'tabang', 'eskwela']
+ },
+ 'Fehlerschwerpunkte Alltag': {
+ learningGoals: [
+ 'Typische Fehlercluster gezielt trainieren.',
+ 'Unsichere Antworten in stabilere Muster überführen.',
+ 'Schwächen vor dem Abschluss konzentriert bearbeiten.'
+ ],
+ corePatterns: ['salamat', 'palihug', 'appointment', 'mas maayo']
+ },
+ 'Rollenspiele - echte Situationen': {
+ learningGoals: [
+ 'Mehrere reale Alltagsszenen zusammenhängend durchspielen.',
+ 'Mit spontanen Situationen flexibler umgehen.',
+ 'Alltagsfähigkeit vor dem Abschluss verdichten.'
+ ],
+ corePatterns: ['Pwede ka motabang?', 'Asa ang sakayan?', 'Adto ta sa doktor.', 'Kuhaon nako ang bata.']
+ },
+ 'Abschlusstest - Alltagspfad': {
+ learningGoals: [
+ 'Den Wortschatz des Alltagskurses diagnostisch überprüfen.',
+ 'Ähnliche Bedeutungen und Wortfelder sauber trennen.',
+ 'Die aktive Basis für die Stabilisierungsphase absichern.'
+ ],
+ corePatterns: ['silingan', 'resibo', 'guba', 'eskwelahan']
+ },
+ 'Abschlussprüfung - Alltagsphase': {
+ learningGoals: [
+ 'Den 3-Monats-Alltagspfad gemischt überprüfen.',
+ 'Abruf, Dialogfähigkeit und situative Flexibilität kombinieren.',
+ 'Die Grundlage für Phase 5 sichern.'
+ ],
+ corePatterns: ['Moadto mi sa lungsod.', 'Aduna mi appointment.', 'Pasayloa ko.', 'Ato ning limpyohan.']
+ },
+ 'Kultur, Höflichkeit & Familienleben vertiefen': {
+ learningGoals: [
+ 'Höflichkeit, indirekte Kommunikation und Familienrollen tiefer verstehen.',
+ 'Sprachmuster kulturell besser einordnen.',
+ 'Den Übergang zur Stabilisierungsphase kulturell absichern.'
+ ],
+ corePatterns: ['respeto', 'pakikisama', 'palihug', 'amping']
+ }
+};
+
+export const BISAYA_PHASE4_LESSONS = [
+ { week: 7, day: 1, num: 61, type: 'conversation', title: 'Kinder im Alltag', desc: 'Mit Kindern sprechen und Fürsorge im Alltag ausdrücken', targetMin: 18, targetScore: 80, review: false, cultural: null },
+ { week: 7, day: 1, num: 62, type: 'vocab', title: 'Schule & Betreuung', desc: 'Wortschatz für Schule, Tasche, Unterricht und Betreuung', targetMin: 18, targetScore: 85, review: true, cultural: null },
+ { week: 7, day: 2, num: 63, type: 'grammar', title: 'Fragen an Kinder vereinfachen', desc: 'Kurze, klare Fragen für Kinder und Betreuungssituationen', targetMin: 20, targetScore: 78, review: true, cultural: null },
+ { week: 7, day: 2, num: 64, type: 'conversation', title: 'Hausaufgaben & Routine', desc: 'Über Schule, Lernen und Routinen zuhause sprechen', targetMin: 18, targetScore: 80, review: false, cultural: null },
+ { week: 7, day: 3, num: 65, type: 'review', title: 'Woche 7 - Intensivwiederholung I', desc: 'Kinder, Schule und Familienroutine intensiv wiederholen', targetMin: 28, targetScore: 80, review: false, cultural: null },
+ { week: 7, day: 3, num: 66, type: 'vocab', title: 'Spiralwiederholung - Familie, Kinder & Fürsorge', desc: 'Frühe Kernmuster mit Kinderalltag verbinden', targetMin: 20, targetScore: 85, review: true, cultural: null },
+ { week: 7, day: 4, num: 67, type: 'conversation', title: 'Spielen & Freizeit', desc: 'Mit Kindern über Spiel, Pause und Freizeit sprechen', targetMin: 18, targetScore: 80, review: false, cultural: null },
+ { week: 7, day: 4, num: 68, type: 'vocab', title: 'Spielsachen & Aktivitäten', desc: 'Spiel- und Freizeitwortschatz für Familienalltag', targetMin: 18, targetScore: 85, review: true, cultural: null },
+ { week: 7, day: 5, num: 69, type: 'review', title: 'Woche 7 - Intensivwiederholung II', desc: 'Große Mischwiederholung zur Kinder- und Schulwoche', targetMin: 28, targetScore: 80, review: false, cultural: null },
+ { week: 7, day: 5, num: 70, type: 'vocab', title: 'Woche 7 - Checkpoint', desc: 'Checkpoint zu Familie, Kindern und Schule', targetMin: 16, targetScore: 82, review: true, cultural: null },
+ { week: 8, day: 1, num: 71, type: 'conversation', title: 'Arzt & Termin', desc: 'Arzttermine vereinbaren und Gesundheitsfragen stellen', targetMin: 18, targetScore: 80, review: false, cultural: null },
+ { week: 8, day: 1, num: 72, type: 'vocab', title: 'Apotheke & Medikamente', desc: 'Wichtiger Wortschatz für Apotheke und Medizin', targetMin: 18, targetScore: 85, review: true, cultural: null },
+ { week: 8, day: 2, num: 73, type: 'grammar', title: 'Beschwerden genauer beschreiben', desc: 'Schmerz, Verlauf und Stärke konkreter ausdrücken', targetMin: 20, targetScore: 78, review: true, cultural: null },
+ { week: 8, day: 2, num: 74, type: 'conversation', title: 'Notfälle & Hilfe', desc: 'In einfachen Notfällen Hilfe holen und reagieren', targetMin: 18, targetScore: 80, review: false, cultural: null },
+ { week: 8, day: 3, num: 75, type: 'review', title: 'Woche 8 - Intensivwiederholung I', desc: 'Gesundheit, Arzt und Hilfe intensiv wiederholen', targetMin: 28, targetScore: 80, review: false, cultural: null },
+ { week: 8, day: 3, num: 76, type: 'vocab', title: 'Spiralwiederholung - Gesundheit', desc: 'Frühere Fürsorge mit Gesundheit und Pflege verbinden', targetMin: 20, targetScore: 85, review: true, cultural: null },
+ { week: 8, day: 4, num: 77, type: 'conversation', title: 'Essen, Ruhe & Genesung', desc: 'Pflege, Ruhe und Essen bei Krankheit besprechen', targetMin: 18, targetScore: 80, review: false, cultural: null },
+ { week: 8, day: 4, num: 78, type: 'vocab', title: 'Körper, Symptome & Pflege', desc: 'Körper- und Pflegewortschatz ausbauen', targetMin: 18, targetScore: 85, review: true, cultural: null },
+ { week: 8, day: 5, num: 79, type: 'review', title: 'Woche 8 - Intensivwiederholung II', desc: 'Große Mischwiederholung zu Gesundheit und Hilfe', targetMin: 28, targetScore: 80, review: false, cultural: null },
+ { week: 8, day: 5, num: 80, type: 'vocab', title: 'Woche 8 - Checkpoint', desc: 'Checkpoint zu Arzt, Apotheke und Pflege', targetMin: 16, targetScore: 82, review: true, cultural: null },
+ { week: 9, day: 1, num: 81, type: 'conversation', title: 'Einkaufen vertiefen', desc: 'Komplexere Einkaufs- und Auswahlgespräche führen', targetMin: 18, targetScore: 80, review: false, cultural: null },
+ { week: 9, day: 1, num: 82, type: 'vocab', title: 'Markt & Mengen', desc: 'Wortschatz für Markt, Mengen und Auswahl', targetMin: 18, targetScore: 85, review: true, cultural: null },
+ { week: 9, day: 2, num: 83, type: 'grammar', title: 'Wünsche, Bedarf und Bitte', desc: 'Wunsch, Notwendigkeit und höfliche Bitte unterscheiden', targetMin: 20, targetScore: 78, review: true, cultural: null },
+ { week: 9, day: 2, num: 84, type: 'conversation', title: 'Behördengänge & Formulare', desc: 'Nach Formularen, Schaltern und Terminen fragen', targetMin: 18, targetScore: 80, review: false, cultural: null },
+ { week: 9, day: 3, num: 85, type: 'review', title: 'Woche 9 - Intensivwiederholung I', desc: 'Einkaufen und Erledigungen intensiv wiederholen', targetMin: 28, targetScore: 80, review: false, cultural: null },
+ { week: 9, day: 3, num: 86, type: 'vocab', title: 'Spiralwiederholung - Preise & Erledigungen', desc: 'Preis- und Erledigungsmuster spiralig festigen', targetMin: 20, targetScore: 85, review: true, cultural: null },
+ { week: 9, day: 4, num: 87, type: 'conversation', title: 'Bank, Geld & Bezahlen', desc: 'Über Bezahlen, Wechselgeld und Geldsituationen sprechen', targetMin: 18, targetScore: 80, review: false, cultural: null },
+ { week: 9, day: 4, num: 88, type: 'vocab', title: 'Dokumente & Termine', desc: 'Papierkram, Termine und Dokumente benennen', targetMin: 18, targetScore: 85, review: true, cultural: null },
+ { week: 9, day: 5, num: 89, type: 'review', title: 'Woche 9 - Intensivwiederholung II', desc: 'Große Mischwiederholung zu Geld, Formularen und Terminen', targetMin: 28, targetScore: 80, review: false, cultural: null },
+ { week: 9, day: 5, num: 90, type: 'vocab', title: 'Woche 9 - Checkpoint', desc: 'Checkpoint zu Einkauf, Bezahlen und Erledigungen', targetMin: 16, targetScore: 82, review: true, cultural: null },
+ { week: 10, day: 1, num: 91, type: 'conversation', title: 'Nachbarschaft & Besuche', desc: 'Mit Nachbarn sprechen und Besuche im Umfeld einordnen', targetMin: 18, targetScore: 80, review: false, cultural: null },
+ { week: 10, day: 1, num: 92, type: 'vocab', title: 'Hilfe & Unterstützung', desc: 'Wortschatz für Hilfe, Unterstützung und soziale Nähe', targetMin: 18, targetScore: 85, review: true, cultural: null },
+ { week: 10, day: 2, num: 93, type: 'grammar', title: 'Höflich reagieren und ablehnen', desc: 'Einladungen, Hilfe und Vorschläge fein abstufen', targetMin: 20, targetScore: 78, review: true, cultural: null },
+ { week: 10, day: 2, num: 94, type: 'conversation', title: 'Feste & Einladungen', desc: 'Über Feste, Besuche und Einladungen sprechen', targetMin: 18, targetScore: 80, review: false, cultural: null },
+ { week: 10, day: 3, num: 95, type: 'review', title: 'Woche 10 - Intensivwiederholung I', desc: 'Soziale Situationen und Hilfe intensiv wiederholen', targetMin: 28, targetScore: 80, review: false, cultural: null },
+ { week: 10, day: 3, num: 96, type: 'vocab', title: 'Spiralwiederholung - Soziale Situationen', desc: 'Besuche, Hilfe und Reaktionen blockübergreifend festigen', targetMin: 20, targetScore: 85, review: true, cultural: null },
+ { week: 10, day: 4, num: 97, type: 'conversation', title: 'Konflikte ruhig lösen', desc: 'Missverständnisse ansprechen und Spannungen abfedern', targetMin: 18, targetScore: 80, review: false, cultural: null },
+ { week: 10, day: 4, num: 98, type: 'vocab', title: 'Gefühle im Gespräch vertiefen', desc: 'Emotionen in sozialen Gesprächen genauer ausdrücken', targetMin: 18, targetScore: 85, review: true, cultural: null },
+ { week: 10, day: 5, num: 99, type: 'review', title: 'Woche 10 - Intensivwiederholung II', desc: 'Große Mischwiederholung zu sozialen Situationen und Emotionen', targetMin: 28, targetScore: 80, review: false, cultural: null },
+ { week: 10, day: 5, num: 100, type: 'vocab', title: 'Woche 10 - Checkpoint', desc: 'Checkpoint zu Hilfe, Besuchen und Gefühlen', targetMin: 16, targetScore: 82, review: true, cultural: null },
+ { week: 11, day: 1, num: 101, type: 'conversation', title: 'Zuhause organisieren', desc: 'Ordnung, Haushalt und kleine Aufgaben zuhause besprechen', targetMin: 18, targetScore: 80, review: false, cultural: null },
+ { week: 11, day: 1, num: 102, type: 'vocab', title: 'Haushalt & Reparaturen', desc: 'Wörter für Haushalt, Ordnung und kleine Reparaturen', targetMin: 18, targetScore: 85, review: true, cultural: null },
+ { week: 11, day: 2, num: 103, type: 'grammar', title: 'Vergangenes und Pläne im Alltag', desc: 'Vergangenheit und kommende Schritte in Routinen verbinden', targetMin: 20, targetScore: 78, review: true, cultural: null },
+ { week: 11, day: 2, num: 104, type: 'conversation', title: 'Arbeit, Schule und Termine verbinden', desc: 'Mehrere Alltagsbereiche in einer Erzählung kombinieren', targetMin: 18, targetScore: 80, review: false, cultural: null },
+ { week: 11, day: 3, num: 105, type: 'review', title: 'Woche 11 - Intensivwiederholung I', desc: 'Haushalt, Planung und Alltagslogistik intensiv wiederholen', targetMin: 28, targetScore: 80, review: false, cultural: null },
+ { week: 11, day: 3, num: 106, type: 'vocab', title: 'Spiralwiederholung - Alltagsmodule', desc: 'Module 6 bis 10 zusammenziehen und wiederholen', targetMin: 20, targetScore: 85, review: true, cultural: null },
+ { week: 11, day: 4, num: 107, type: 'conversation', title: 'Unterwegs im Familienalltag', desc: 'Familie, Wege und Termine im Alltag verbinden', targetMin: 18, targetScore: 80, review: false, cultural: null },
+ { week: 11, day: 4, num: 108, type: 'vocab', title: 'Nachbarschaft & Orte', desc: 'Wichtige Orte und Nachbarschaftswortschatz vertiefen', targetMin: 18, targetScore: 85, review: true, cultural: null },
+ { week: 11, day: 5, num: 109, type: 'review', title: 'Woche 11 - Intensivwiederholung II', desc: 'Große Mischwiederholung zu Organisation und Familienlogistik', targetMin: 28, targetScore: 80, review: false, cultural: null },
+ { week: 11, day: 5, num: 110, type: 'vocab', title: 'Woche 11 - Checkpoint', desc: 'Checkpoint zu Organisation, Haushalt und Alltagslogistik', targetMin: 16, targetScore: 82, review: true, cultural: null },
+ { week: 12, day: 1, num: 111, type: 'conversation', title: 'Freies Gespräch - Alltag I', desc: 'Längere Alltagsgespräche freier und stabiler führen', targetMin: 22, targetScore: 78, review: false, cultural: null },
+ { week: 12, day: 1, num: 112, type: 'vocab', title: 'Mischtraining - Kernwortschatz', desc: 'Kernwortschatz aus allen Modulen gemischt trainieren', targetMin: 20, targetScore: 85, review: true, cultural: null },
+ { week: 12, day: 2, num: 113, type: 'conversation', title: 'Freies Gespräch - Alltag II', desc: 'Freies Sprechen mit mehr eigener Produktion vertiefen', targetMin: 22, targetScore: 78, review: false, cultural: null },
+ { week: 12, day: 2, num: 114, type: 'grammar', title: 'Wiederholung schwieriger Muster', desc: 'Zeit, Bitte und Reaktion kontrastiv wiederholen', targetMin: 20, targetScore: 78, review: true, cultural: null },
+ { week: 12, day: 3, num: 115, type: 'review', title: 'Großes Alltagsreview I', desc: 'Große Wiederholung aller Alltagsmodule', targetMin: 30, targetScore: 82, review: false, cultural: null },
+ { week: 12, day: 3, num: 116, type: 'vocab', title: 'Fehlerschwerpunkte Alltag', desc: 'Typische Fehlercluster gezielt wiederholen', targetMin: 20, targetScore: 85, review: true, cultural: null },
+ { week: 12, day: 4, num: 117, type: 'conversation', title: 'Rollenspiele - echte Situationen', desc: 'Mehrere reale Alltagsszenen in Rollenspielen üben', targetMin: 24, targetScore: 78, review: false, cultural: null },
+ { week: 12, day: 4, num: 118, type: 'vocab', title: 'Abschlusstest - Alltagspfad', desc: 'Finaler Wortschatztest über den 3-Monats-Alltagspfad', targetMin: 20, targetScore: 82, review: true, cultural: null },
+ { week: 12, day: 5, num: 119, type: 'review', title: 'Abschlussprüfung - Alltagsphase', desc: 'Große Abschlussprüfung zum 3-Monats-Alltagspfad', targetMin: 30, targetScore: 82, review: false, cultural: null },
+ { week: 12, day: 5, num: 120, type: 'culture', title: 'Kultur, Höflichkeit & Familienleben vertiefen', desc: 'Kulturelle Muster für Sprache und Familienalltag weiter vertiefen', targetMin: 16, targetScore: 0, review: false, cultural: 'Die Alltagsphase endet mit einem stärkeren kulturellen Verständnis für Höflichkeit, Familie und indirekte Kommunikation.' }
+];
diff --git a/backend/scripts/bisaya-course-phase5-extension.js b/backend/scripts/bisaya-course-phase5-extension.js
new file mode 100644
index 0000000..3af222d
--- /dev/null
+++ b/backend/scripts/bisaya-course-phase5-extension.js
@@ -0,0 +1,274 @@
+export const BISAYA_PHASE5_DIDACTICS = {
+ 'Dialogtag - Familie & Planung': {
+ learningGoals: [
+ 'Mehrere Familienthemen in längeren Dialogen verbinden.',
+ 'Planung, Fürsorge und Organisation ohne enge Stütze kombinieren.',
+ 'Sprechfluss über mehrere Züge stabil halten.'
+ ],
+ corePatterns: ['Unsa atong plano karon?', 'Kuhaon nato ang bata unya.', 'Nikaon na ba silang tanan?', 'Pagkahuman, mouli ta.']
+ },
+ 'Mischtraining - Familie, Gesundheit, Alltag': {
+ learningGoals: [
+ 'Kernwortschatz aus mehreren Modulen gemischt abrufen.',
+ 'Zwischen ähnlichen Alltagssituationen schneller unterscheiden.',
+ 'Stabile Wiedererkennung in gemischten Aufgaben sichern.'
+ ],
+ corePatterns: ['tambal', 'eskwela', 'merkado', 'silingan']
+ },
+ 'Fehlertraining - häufige Verwechslungen I': {
+ learningGoals: [
+ 'Typische Verwechslungen bei Zeit, Bitte und Reaktion reduzieren.',
+ 'Kontrastpaare aktiv gegeneinander trainieren.',
+ 'Unsichere Routinemuster gezielt festigen.'
+ ],
+ corePatterns: ['Niadto ko.', 'Moadto ko.', 'Palihug.', 'Pasayloa ko.'],
+ grammarFocus: [
+ {
+ title: 'Kontrasttraining',
+ text: 'Ähnliche Alltagsformen werden in der Stabilisierung bewusst direkt gegenübergestellt.',
+ example: 'Niadto ko ganiha. Moadto ko ugma.'
+ }
+ ]
+ },
+ 'Rollenspiel - Schule, Arzt, Besuch': {
+ learningGoals: [
+ 'Mehrere reale Situationen in längeren Rollenspielen verbinden.',
+ 'Schnell zwischen Schule, Arzt und Familienbesuch wechseln.',
+ 'Sprachliche Flexibilität im Alltag ausbauen.'
+ ],
+ corePatterns: ['Andam na ka sa eskwela?', 'Adto ta sa doktor.', 'Sulod lang.', 'Maghulat ta gamay.']
+ },
+ 'Stabilisierungsblock 1 - Intensiv I': {
+ learningGoals: [
+ 'Zentrale Schnellstart- und Alltagsmuster in einem engen Block wiederholen.',
+ 'Abrufgeschwindigkeit und Reaktionssicherheit erhöhen.',
+ 'Schwache Felder sichtbar machen.'
+ ],
+ corePatterns: ['Kumusta ka?', 'Nikaon na ka?', 'Asa ang sakayan?', 'Pwede ka motabang?']
+ },
+ 'Fehlerschwerpunkte - Familie & Fürsorge': {
+ learningGoals: [
+ 'Fehler bei Familien- und Fürsorgemustern gezielt abbauen.',
+ 'Nahe Bedeutungen in stabilere Antworten überführen.',
+ 'Häufige Stolperstellen transparent machen.'
+ ],
+ corePatterns: ['Palangga taka.', 'Mingaw ko nimo.', 'Magpahuway sa.', 'Andam na ka?']
+ },
+ 'Freies Erzählen - Mein Alltag': {
+ learningGoals: [
+ 'Den eigenen Alltag zusammenhängend erzählen.',
+ 'Mehrere Tagesbereiche in einer freien Antwort verbinden.',
+ 'Mit weniger Stütze längere Produktion halten.'
+ ],
+ corePatterns: ['Sa buntag...', 'Pagkahuman...', 'Sa hapon...', 'Sa gabii...']
+ },
+ 'Mischtraining - Reale Situationen I': {
+ learningGoals: [
+ 'Reale Alltagssituationen ohne Themenblockgrenzen mischen.',
+ 'Abruf in wechselnden Kontexten stabilisieren.',
+ 'Transfer über Modulgrenzen hinweg trainieren.'
+ ],
+ corePatterns: ['appointment', 'tabang', 'resibo', 'amping']
+ },
+ 'Stabilisierungsblock 1 - Intensiv II': {
+ learningGoals: [
+ 'Fehlercluster und Mischtraining verdichten.',
+ 'Aufgaben schneller und sicherer lösen.',
+ 'Vor dem Checkpoint Stabilität erhöhen.'
+ ],
+ corePatterns: ['Pasayloa ko.', 'Dili lang sa karon.', 'Mubayad ko.', 'Mas maayo na ka?']
+ },
+ 'Stabilisierungsblock 1 - Checkpoint': {
+ learningGoals: [
+ 'Den ersten Stabilisierungsschritt diagnostisch abschließen.',
+ 'Langzeitabruf, Transfer und Fehlerrisiken messen.',
+ 'Die zweite Stabilisierungsschleife vorbereiten.'
+ ],
+ corePatterns: ['appointment', 'palihug', 'silingan', 'eskwela']
+ },
+ 'Dialogtag - Organisation & Wege': {
+ learningGoals: [
+ 'Organisation, Termine und Wege in längeren Dialogen verbinden.',
+ 'Planung über mehrere Schritte sprachlich strukturieren.',
+ 'Reaktionsfähigkeit in logistischer Alltagssprache stärken.'
+ ],
+ corePatterns: ['Una moadto ko didto.', 'Pagkahuman, mubalik ko diri.', 'Asa ta manaog?', 'Unsa ang sunod?']
+ },
+ 'Mischtraining - Gesundheit, Schule, Erledigungen': {
+ learningGoals: [
+ 'Drei große Themenblöcke gemischt wiederholen.',
+ 'Kontextwechsel in Aufgaben trainieren.',
+ 'Langsamere Vergessenskurven abfangen.'
+ ],
+ corePatterns: ['doktor', 'assignment', 'resibo', 'botika']
+ },
+ 'Fehlertraining - häufige Verwechslungen II': {
+ learningGoals: [
+ 'Zweite Runde der häufigsten Verwechslungen gezielt trainieren.',
+ 'Schwierige Antworten über Kontrast und Wiederholung stabilisieren.',
+ 'Präzisere Produktion fördern.'
+ ],
+ corePatterns: ['Gusto ko.', 'Kinahanglan nako.', 'Sunod na lang.', 'Dili mao ang akong pasabot.']
+ },
+ 'Rollenspiel - Konflikt und Hilfe': {
+ learningGoals: [
+ 'Konflikt, Hilfe und Erklärung in Rollenspielen zusammenführen.',
+ 'Höflichkeit unter Druck bewahren.',
+ 'Soziale Reparaturmuster festigen.'
+ ],
+ corePatterns: ['Pwede nato istoryahan?', 'Tabangan tika.', 'Pasayloa ko.', 'Sabta lang ko.']
+ },
+ 'Stabilisierungsblock 2 - Intensiv I': {
+ learningGoals: [
+ 'Schwierige Alltagsblöcke nochmals verdichtet wiederholen.',
+ 'Langzeitabruf gezielt trainieren.',
+ 'Vor dem Schlussabschnitt Fehlerquellen reduzieren.'
+ ],
+ corePatterns: ['Kinahanglan nako ni.', 'Adto ta sa doktor.', 'Giinvite tika.', 'Ato ning limpyohan.']
+ },
+ 'Fehlerschwerpunkte - Termine, Zeit, Reaktion': {
+ learningGoals: [
+ 'Termine, Zeitbezüge und Reaktionen enger kontrastieren.',
+ 'Fehleranfällige Übergänge abbauen.',
+ 'Bessere Sicherheit in Planungsdialogen aufbauen.'
+ ],
+ corePatterns: ['ugma', 'ganiha', 'unya', 'sunod na lang']
+ },
+ 'Freies Erzählen - Familie, Sorgen, Pläne': {
+ learningGoals: [
+ 'Familiensituation, Sorgen und Zukunftsplan zusammenhängend erzählen.',
+ 'Emotion, Organisation und Hilfe verbinden.',
+ 'Freie Produktion vertiefen.'
+ ],
+ corePatterns: ['Naguol ko gamay.', 'Pero okay ra.', 'Aduna koy plano unya.', 'Tabangan mi nila.']
+ },
+ 'Mischtraining - Reale Situationen II': {
+ learningGoals: [
+ 'Eine zweite große Mischrunde mit neuen Kombinationen durchführen.',
+ 'Transfer über die ganze Alltagsphase absichern.',
+ 'Robustheit bei ungeordnetem Themenwechsel erhöhen.'
+ ],
+ corePatterns: ['doktor', 'ATM', 'duwa', 'linya']
+ },
+ 'Stabilisierungsblock 2 - Intensiv II': {
+ learningGoals: [
+ 'Die zweite Stabilisierungsschleife verdichten.',
+ 'Restliche Schwächen noch einmal fokussieren.',
+ 'Vor dem Gesamtabschluss maximale Sicherheit aufbauen.'
+ ],
+ corePatterns: ['Palihug ka mubalik.', 'Moadto ko unya.', 'Salamat sa tabang.', 'Asa ang porma?']
+ },
+ 'Stabilisierungsblock 2 - Checkpoint': {
+ learningGoals: [
+ 'Die zweite Stabilisierungsrunde abschließen.',
+ 'Diagnostisch prüfen, welche Langzeitmuster noch wackeln.',
+ 'Den Schlussblock vorbereiten.'
+ ],
+ corePatterns: ['porma', 'sukli', 'pasayloa', 'amping']
+ },
+ 'Großes Mischreview I': {
+ learningGoals: [
+ 'Den gesamten bisherigen Kurs breit wiederholen.',
+ 'Thematische Grenzen in der Wiederholung auflösen.',
+ 'Schnelles, flexibles Abrufen vorbereiten.'
+ ],
+ corePatterns: ['bata', 'doktor', 'merkado', 'tabang']
+ },
+ 'Großes Mischreview II': {
+ learningGoals: [
+ 'Eine zweite große Mischrunde mit höherer Dichte trainieren.',
+ 'Ähnliche Muster unter Zeitdruck stabilisieren.',
+ 'Abschlussreife aufbauen.'
+ ],
+ corePatterns: ['appointment', 'resibo', 'palihug', 'silingan']
+ },
+ 'Fehlertraining - letzte Schwächen': {
+ learningGoals: [
+ 'Die letzten wackeligen Muster gezielt bearbeiten.',
+ 'Unsichere Antworten in belastbare Routinen überführen.',
+ 'Vor dem Abschluss die Fehlerquote senken.'
+ ],
+ corePatterns: ['Niadto ko.', 'Moadto ko.', 'Dili lang sa karon.', 'Mas maayo na ka?']
+ },
+ 'Freies Sprechen - Alltag ohne Stütze': {
+ learningGoals: [
+ 'Alltagsgespräche mit minimaler Hilfe frei führen.',
+ 'Eigenständige Produktion gegenüber Wiedererkennung priorisieren.',
+ 'Selbstsicherheit in längeren Antworten ausbauen.'
+ ],
+ corePatterns: ['Sa tinuod...', 'Kasagaran...', 'Usahay...', 'Apan...']
+ },
+ 'Langzeitreview - Intensiv I': {
+ learningGoals: [
+ 'Früh gelernte Inhalte gezielt gegen Vergessen absichern.',
+ 'Langfristige Wiederaufnahme trainieren.',
+ 'Kernmuster mit hoher Alltagsrelevanz stabil halten.'
+ ],
+ corePatterns: ['Kumusta ka?', 'Salamat.', 'Nikaon na ka?', 'Tagpila ni?']
+ },
+ 'Langzeitreview - Intensiv II': {
+ learningGoals: [
+ 'Zweite Langzeitwiederholung mit Schwerpunkt auf Transfer.',
+ 'Frühe und späte Inhalte gemeinsam verankern.',
+ 'Vergessene Muster reaktivieren.'
+ ],
+ corePatterns: ['doktor', 'eskwela', 'tabang', 'resibo']
+ },
+ 'Abschlusstest - Stabilisierung': {
+ learningGoals: [
+ 'Den gesamten Stabilisierungspfad diagnostisch überprüfen.',
+ 'Wortschatz, Muster und Kontrastpaare testen.',
+ 'Die Abschlussprüfung vorbereiten.'
+ ],
+ corePatterns: ['appointment', 'amping', 'sukli', 'palangga']
+ },
+ 'Abschlussprüfung - Gesamtpfad': {
+ learningGoals: [
+ 'Den gesamten Bisaya-Pfad bis zur Stabilisierungsphase abschließen.',
+ 'Abruf, freie Produktion und Alltagstransfer kombinieren.',
+ 'Das Fundament für späteres Langzeitlernen sichern.'
+ ],
+ corePatterns: ['Moadto mi sa lungsod.', 'Aduna mi appointment.', 'Pasayloa ko.', 'Tabangan tika.']
+ },
+ 'Kultur, Familie & Sprache langfristig': {
+ learningGoals: [
+ 'Sprachgebrauch, Höflichkeit und Familienrollen langfristig reflektieren.',
+ 'Kulturelle Muster mit stabilem Sprachwissen verbinden.',
+ 'Den Übergang in offenes Weiterlernen begleiten.'
+ ],
+ corePatterns: ['respeto', 'pakikisama', 'amping', 'palihug']
+ }
+};
+
+export const BISAYA_PHASE5_LESSONS = [
+ { week: 13, day: 1, num: 121, type: 'conversation', title: 'Dialogtag - Familie & Planung', desc: 'Längere Dialoge zu Familie, Planung und Fürsorge', targetMin: 22, targetScore: 78, review: false, cultural: null },
+ { week: 13, day: 1, num: 122, type: 'vocab', title: 'Mischtraining - Familie, Gesundheit, Alltag', desc: 'Gemischter Wortschatz aus zentralen Alltagsfeldern', targetMin: 20, targetScore: 85, review: true, cultural: null },
+ { week: 13, day: 2, num: 123, type: 'grammar', title: 'Fehlertraining - häufige Verwechslungen I', desc: 'Kontrasttraining für typische Zeit- und Reaktionsfehler', targetMin: 20, targetScore: 78, review: true, cultural: null },
+ { week: 13, day: 2, num: 124, type: 'conversation', title: 'Rollenspiel - Schule, Arzt, Besuch', desc: 'Mehrere reale Situationen in Rollenspielen verbinden', targetMin: 22, targetScore: 78, review: false, cultural: null },
+ { week: 13, day: 3, num: 125, type: 'review', title: 'Stabilisierungsblock 1 - Intensiv I', desc: 'Erste große Stabilisierungsschleife', targetMin: 30, targetScore: 82, review: false, cultural: null },
+ { week: 13, day: 3, num: 126, type: 'vocab', title: 'Fehlerschwerpunkte - Familie & Fürsorge', desc: 'Gezieltes Fehlertraining zu Nähe und Fürsorge', targetMin: 20, targetScore: 85, review: true, cultural: null },
+ { week: 13, day: 4, num: 127, type: 'conversation', title: 'Freies Erzählen - Mein Alltag', desc: 'Den eigenen Alltag freier und länger erzählen', targetMin: 24, targetScore: 78, review: false, cultural: null },
+ { week: 13, day: 4, num: 128, type: 'vocab', title: 'Mischtraining - Reale Situationen I', desc: 'Gemischtes Training realer Alltagssituationen', targetMin: 20, targetScore: 85, review: true, cultural: null },
+ { week: 13, day: 5, num: 129, type: 'review', title: 'Stabilisierungsblock 1 - Intensiv II', desc: 'Zweite verdichtete Wiederholung im ersten Stabilisierungsschritt', targetMin: 30, targetScore: 82, review: false, cultural: null },
+ { week: 13, day: 5, num: 130, type: 'vocab', title: 'Stabilisierungsblock 1 - Checkpoint', desc: 'Checkpoint zum ersten Stabilisierungsschritt', targetMin: 18, targetScore: 84, review: true, cultural: null },
+ { week: 14, day: 1, num: 131, type: 'conversation', title: 'Dialogtag - Organisation & Wege', desc: 'Planung, Wege und Termine in längeren Dialogen verbinden', targetMin: 22, targetScore: 78, review: false, cultural: null },
+ { week: 14, day: 1, num: 132, type: 'vocab', title: 'Mischtraining - Gesundheit, Schule, Erledigungen', desc: 'Gemischter Wortschatz aus drei großen Themenblöcken', targetMin: 20, targetScore: 85, review: true, cultural: null },
+ { week: 14, day: 2, num: 133, type: 'grammar', title: 'Fehlertraining - häufige Verwechslungen II', desc: 'Zweite Runde Kontrasttraining für schwierige Alltagsmuster', targetMin: 20, targetScore: 78, review: true, cultural: null },
+ { week: 14, day: 2, num: 134, type: 'conversation', title: 'Rollenspiel - Konflikt und Hilfe', desc: 'Konflikt, Hilfe und Erklärung in Rollenspielen zusammenführen', targetMin: 22, targetScore: 78, review: false, cultural: null },
+ { week: 14, day: 3, num: 135, type: 'review', title: 'Stabilisierungsblock 2 - Intensiv I', desc: 'Erste verdichtete Wiederholung im zweiten Stabilisierungsschritt', targetMin: 30, targetScore: 82, review: false, cultural: null },
+ { week: 14, day: 3, num: 136, type: 'vocab', title: 'Fehlerschwerpunkte - Termine, Zeit, Reaktion', desc: 'Gezieltes Fehlertraining zu Zeit, Reaktion und Terminmustern', targetMin: 20, targetScore: 85, review: true, cultural: null },
+ { week: 14, day: 4, num: 137, type: 'conversation', title: 'Freies Erzählen - Familie, Sorgen, Pläne', desc: 'Familie, Sorgen und Zukunftspläne frei verbinden', targetMin: 24, targetScore: 78, review: false, cultural: null },
+ { week: 14, day: 4, num: 138, type: 'vocab', title: 'Mischtraining - Reale Situationen II', desc: 'Zweite große Mischrunde realer Alltagssituationen', targetMin: 20, targetScore: 85, review: true, cultural: null },
+ { week: 14, day: 5, num: 139, type: 'review', title: 'Stabilisierungsblock 2 - Intensiv II', desc: 'Zweite verdichtete Wiederholung im zweiten Stabilisierungsschritt', targetMin: 30, targetScore: 82, review: false, cultural: null },
+ { week: 14, day: 5, num: 140, type: 'vocab', title: 'Stabilisierungsblock 2 - Checkpoint', desc: 'Checkpoint zum zweiten Stabilisierungsschritt', targetMin: 18, targetScore: 84, review: true, cultural: null },
+ { week: 15, day: 1, num: 141, type: 'review', title: 'Großes Mischreview I', desc: 'Große blockübergreifende Wiederholung des Gesamtpfads', targetMin: 30, targetScore: 82, review: false, cultural: null },
+ { week: 15, day: 1, num: 142, type: 'vocab', title: 'Großes Mischreview II', desc: 'Zweite große Mischrunde mit höherer Dichte', targetMin: 20, targetScore: 85, review: true, cultural: null },
+ { week: 15, day: 2, num: 143, type: 'grammar', title: 'Fehlertraining - letzte Schwächen', desc: 'Letzte typische Fehler vor dem Gesamtabschluss bearbeiten', targetMin: 20, targetScore: 78, review: true, cultural: null },
+ { week: 15, day: 2, num: 144, type: 'conversation', title: 'Freies Sprechen - Alltag ohne Stütze', desc: 'Alltagsgespräche mit minimaler Hilfe frei führen', targetMin: 24, targetScore: 78, review: false, cultural: null },
+ { week: 15, day: 3, num: 145, type: 'review', title: 'Langzeitreview - Intensiv I', desc: 'Frühe Inhalte gezielt gegen Vergessen absichern', targetMin: 30, targetScore: 82, review: false, cultural: null },
+ { week: 15, day: 3, num: 146, type: 'vocab', title: 'Langzeitreview - Intensiv II', desc: 'Frühe und späte Inhalte gemeinsam reaktivieren', targetMin: 20, targetScore: 85, review: true, cultural: null },
+ { week: 15, day: 4, num: 147, type: 'conversation', title: 'Rollenspiele - echte Situationen', desc: 'Mehrere reale Alltagsszenen in längeren Rollenspielen üben', targetMin: 24, targetScore: 78, review: false, cultural: null },
+ { week: 15, day: 4, num: 148, type: 'vocab', title: 'Abschlusstest - Stabilisierung', desc: 'Finaler Test über den Stabilisierungspfad', targetMin: 20, targetScore: 84, review: true, cultural: null },
+ { week: 15, day: 5, num: 149, type: 'review', title: 'Abschlussprüfung - Gesamtpfad', desc: 'Große Abschlussprüfung über den gesamten Bisaya-Pfad', targetMin: 32, targetScore: 84, review: false, cultural: null },
+ { week: 15, day: 5, num: 150, type: 'culture', title: 'Kultur, Familie & Sprache langfristig', desc: 'Kultur, Familie und Höflichkeit langfristig einordnen', targetMin: 16, targetScore: 0, review: false, cultural: 'Die Stabilisierung endet mit einem bewussten Blick auf Sprache, Familie und kulturelle Langzeitmuster.' }
+];
diff --git a/backend/scripts/create-bisaya-course-content.js b/backend/scripts/create-bisaya-course-content.js
index b4b8294..0cdab3e 100644
--- a/backend/scripts/create-bisaya-course-content.js
+++ b/backend/scripts/create-bisaya-course-content.js
@@ -13,6 +13,9 @@ 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 {
@@ -21,6 +24,356 @@ function withTypeName(exerciseTypeName, exercise) {
};
}
+const GENERATED_BISAYA_DIDACTICS = {
+ ...BISAYA_PHASE3_DIDACTICS,
+ ...BISAYA_PHASE4_DIDACTICS,
+ ...BISAYA_PHASE5_DIDACTICS
+};
+
+const GENERIC_DISTRACTOR_PATTERNS = Array.from(new Set(
+ Object.values(GENERATED_BISAYA_DIDACTICS)
+ .flatMap((entry) => Array.isArray(entry?.corePatterns) ? entry.corePatterns : [])
+ .map((pattern) => String(pattern || '').trim())
+ .filter(Boolean)
+)).slice(0, 200);
+
+function normalizeText(value) {
+ return String(value || '')
+ .trim()
+ .replace(/\s+/g, ' ');
+}
+
+function simpleHash(value) {
+ return Array.from(String(value || '')).reduce((sum, char) => sum + char.charCodeAt(0), 0);
+}
+
+function rotateArray(values, offset) {
+ if (!Array.isArray(values) || values.length === 0) return [];
+ const normalizedOffset = ((offset % values.length) + values.length) % values.length;
+ return values.slice(normalizedOffset).concat(values.slice(0, normalizedOffset));
+}
+
+function getLessonDidactics(lesson) {
+ const staticDidactics = GENERATED_BISAYA_DIDACTICS[lesson.title] || {};
+ const learningGoals = Array.isArray(lesson.learningGoals) ? lesson.learningGoals : (staticDidactics.learningGoals || []);
+ const corePatterns = Array.isArray(lesson.corePatterns) ? lesson.corePatterns : (staticDidactics.corePatterns || []);
+ const grammarFocus = Array.isArray(lesson.grammarFocus) ? lesson.grammarFocus : (staticDidactics.grammarFocus || []);
+ const speakingPrompts = Array.isArray(lesson.speakingPrompts) ? lesson.speakingPrompts : (staticDidactics.speakingPrompts || []);
+ const practicalTasks = Array.isArray(lesson.practicalTasks) ? lesson.practicalTasks : (staticDidactics.practicalTasks || []);
+
+ return {
+ learningGoals,
+ corePatterns: corePatterns.map((entry) => normalizeText(entry)).filter(Boolean),
+ grammarFocus,
+ speakingPrompts,
+ practicalTasks
+ };
+}
+
+function getScenarioPrompt(lesson, didactics) {
+ const speakingPrompt = Array.isArray(didactics.speakingPrompts) ? didactics.speakingPrompts[0] : null;
+ const practicalTask = Array.isArray(didactics.practicalTasks) ? didactics.practicalTasks[0] : null;
+
+ if (speakingPrompt?.prompt) return speakingPrompt.prompt;
+ if (practicalTask?.text) return practicalTask.text;
+ if (lesson.description) return lesson.description;
+ return `Reagiere passend in einer Situation aus der Lektion "${lesson.title}".`;
+}
+
+function getChoiceQuestion(lesson, didactics) {
+ const scenarioPrompt = getScenarioPrompt(lesson, didactics);
+
+ switch (lesson.lessonType) {
+ case 'conversation':
+ return `${scenarioPrompt} Welche Bisaya-Formulierung passt am besten?`;
+ case 'grammar':
+ return `Welche Formulierung passt als kurze Alltagsstruktur zu "${lesson.title}"?`;
+ case 'review':
+ return `Welche Formulierung solltest du aus "${lesson.title}" sicher wiedererkennen?`;
+ case 'culture':
+ return `Welcher Ausdruck gehört am ehesten zum kulturellen Schwerpunkt "${lesson.title}"?`;
+ case 'vocab':
+ default:
+ return `Welcher Ausdruck gehört thematisch zu "${lesson.title}"?`;
+ }
+}
+
+function pickDistractors(pattern, allPatterns, count) {
+ return allPatterns
+ .filter((entry) => entry !== pattern)
+ .slice(0, count);
+}
+
+function buildChoiceExercise(lesson, didactics, pattern, allPatterns, variant = 0) {
+ const distractors = pickDistractors(pattern, allPatterns, 3);
+ if (distractors.length < 3) return null;
+
+ const seed = simpleHash(`${lesson.title}:${pattern}:${variant}`);
+ const options = rotateArray([pattern, ...distractors], seed % 4);
+ const correctAnswer = options.indexOf(pattern);
+
+ return {
+ exerciseTypeId: 2,
+ title: `${lesson.title}: Passende Formulierung wählen`,
+ instruction: 'Wähle die natürlichste Formulierung für die Situation oder den Schwerpunkt der Lektion.',
+ questionData: {
+ type: 'multiple_choice',
+ question: getChoiceQuestion(lesson, didactics),
+ options
+ },
+ answerData: {
+ type: 'multiple_choice',
+ correctAnswer
+ },
+ explanation: `"${pattern}" ist ein zentrales Muster dieser Lektion.`
+ };
+}
+
+function pickGapTarget(pattern) {
+ const tokens = normalizeText(pattern)
+ .split(' ')
+ .map((token) => token.trim())
+ .filter(Boolean);
+
+ const candidates = tokens
+ .map((token, index) => ({ token, index, score: token.replace(/[.,?!]/g, '').length }))
+ .filter(({ token }) => token.replace(/[.,?!]/g, '').length >= 4);
+
+ if (candidates.length === 0) {
+ return null;
+ }
+
+ candidates.sort((left, right) => right.score - left.score);
+ return candidates[0];
+}
+
+function buildGapExercise(lessonTitle, pattern) {
+ const gapTarget = pickGapTarget(pattern);
+ if (!gapTarget) return null;
+
+ const tokens = normalizeText(pattern).split(' ');
+ tokens[gapTarget.index] = '{gap}';
+
+ return {
+ exerciseTypeId: 1,
+ title: `${lessonTitle}: Muster vervollständigen`,
+ instruction: 'Fülle die Lücke mit dem passenden Bisaya-Ausdruck.',
+ questionData: {
+ type: 'gap_fill',
+ text: tokens.join(' '),
+ gaps: 1
+ },
+ answerData: {
+ type: 'gap_fill',
+ answers: [gapTarget.token.replace(/[.,?!]/g, '')]
+ },
+ explanation: `Das Kernmuster lautet: "${pattern}".`
+ };
+}
+
+function buildContextGapExercise(lesson, didactics, pattern) {
+ const gapExercise = buildGapExercise(lesson.title, pattern);
+ if (!gapExercise) return null;
+
+ return {
+ ...gapExercise,
+ title: `${lesson.title}: Kernmuster ergänzen`,
+ instruction: `Vervollständige die Formulierung passend zur Situation: ${getScenarioPrompt(lesson, didactics)}`
+ };
+}
+
+function buildSentenceExercise(lessonTitle, pattern) {
+ const tokens = normalizeText(pattern)
+ .replace(/[?!]/g, '')
+ .split(' ')
+ .filter(Boolean);
+
+ if (tokens.length < 2) return null;
+
+ return {
+ exerciseTypeId: 3,
+ title: `${lessonTitle}: Satzmuster bauen`,
+ instruction: 'Ordne die Wörter zu einem korrekten Bisaya-Satz.',
+ questionData: {
+ type: 'sentence_building',
+ question: `Baue das Kernmuster aus der Lektion "${lessonTitle}".`,
+ tokens
+ },
+ answerData: {
+ correct: [normalizeText(pattern)]
+ },
+ explanation: `Dieses Kernmuster gehört zur Lektion "${lessonTitle}".`
+ };
+}
+
+function buildTaskSentenceExercise(lesson, didactics, pattern) {
+ const sentenceExercise = buildSentenceExercise(lesson.title, pattern);
+ if (!sentenceExercise) return null;
+
+ const practicalTask = Array.isArray(didactics.practicalTasks) ? didactics.practicalTasks[0] : null;
+
+ return {
+ ...sentenceExercise,
+ title: `${lesson.title}: Satz aus dem Alltag bauen`,
+ instruction: practicalTask?.text
+ ? `Baue die passende Formulierung für diese Aufgabe: ${practicalTask.text}`
+ : 'Ordne die Wörter zu einem natürlichen Bisaya-Satz aus dem Alltag.'
+ };
+}
+
+function buildSpeakingExercise(lessonTitle, didactics, fallbackPattern) {
+ const speakingPrompt = Array.isArray(didactics.speakingPrompts) ? didactics.speakingPrompts[0] : null;
+ const expectedText = normalizeText(speakingPrompt?.cue || fallbackPattern);
+ if (!expectedText) return null;
+
+ const keywords = expectedText
+ .toLowerCase()
+ .replace(/[.,?!]/g, '')
+ .split(' ')
+ .filter((token) => token.length >= 4)
+ .slice(0, 4);
+
+ return {
+ exerciseTypeId: 8,
+ title: `${lessonTitle}: Laut sprechen`,
+ instruction: 'Sprich das zentrale Muster oder den Dialog frei nach.',
+ questionData: {
+ type: 'speaking_from_memory',
+ question: speakingPrompt?.prompt || `Sprich ein zentrales Muster aus der Lektion "${lessonTitle}".`,
+ expectedText,
+ keywords
+ },
+ answerData: {
+ type: 'speaking_from_memory'
+ },
+ explanation: 'Wichtig sind hier ein flüssiger Abruf und die zentralen Schlüsselwörter.'
+ };
+}
+
+function buildReviewChoiceExercise(lesson, didactics, pattern, allPatterns) {
+ const choiceExercise = buildChoiceExercise(lesson, didactics, pattern, allPatterns, 1);
+ if (!choiceExercise) return null;
+
+ return {
+ ...choiceExercise,
+ title: `${lesson.title}: Sicheren Abruf prüfen`,
+ instruction: 'Wähle die Formulierung, die du aus dem aktiven Wiederholungsblock sicher können solltest.'
+ };
+}
+
+function buildCultureExercise(lesson, didactics, pattern, allPatterns) {
+ const distractors = pickDistractors(pattern, allPatterns, 3);
+ if (distractors.length < 3) return null;
+
+ const culturalNote = normalizeText(lesson.culturalNotes || '');
+ const options = rotateArray([pattern, ...distractors], simpleHash(`${lesson.title}:culture`) % 4);
+
+ return {
+ exerciseTypeId: 2,
+ title: `${lesson.title}: Ausdruck kulturell einordnen`,
+ instruction: 'Ordne den Ausdruck dem kulturellen Schwerpunkt der Lektion zu.',
+ questionData: {
+ type: 'multiple_choice',
+ question: culturalNote
+ ? `${culturalNote} Welcher Ausdruck passt dazu besonders gut?`
+ : `Welcher Ausdruck gehört besonders gut zum Schwerpunkt "${lesson.title}"?`,
+ options
+ },
+ answerData: {
+ type: 'multiple_choice',
+ correctAnswer: options.indexOf(pattern)
+ },
+ explanation: `Der Ausdruck "${pattern}" gehört eng zum kulturellen Schwerpunkt dieser Lektion.`
+ };
+}
+
+function buildSituationalExercise(lessonTitle, didactics, fallbackPattern) {
+ const speakingPrompt = Array.isArray(didactics.speakingPrompts) ? didactics.speakingPrompts[0] : null;
+ const modelAnswer = normalizeText(speakingPrompt?.cue || fallbackPattern);
+ if (!modelAnswer) return null;
+
+ const keywords = modelAnswer
+ .toLowerCase()
+ .replace(/[.,?!]/g, '')
+ .split(' ')
+ .filter((token) => token.length >= 4)
+ .slice(0, 4);
+
+ return withTypeName('situational_response', {
+ title: `${lessonTitle}: Situativ reagieren`,
+ instruction: 'Antworte kurz und passend auf die Situation.',
+ questionData: {
+ type: 'situational_response',
+ question: speakingPrompt?.prompt || `Reagiere passend mit einem Ausdruck aus der Lektion "${lessonTitle}".`,
+ keywords
+ },
+ answerData: {
+ modelAnswer,
+ keywords
+ },
+ explanation: `Das Kernmuster "${modelAnswer}" passt natürlich zu dieser Situation.`
+ });
+}
+
+function generateExercisesFromDidactics(lesson) {
+ const didactics = getLessonDidactics(lesson);
+ const corePatterns = didactics.corePatterns;
+
+ if (corePatterns.length === 0) {
+ return [];
+ }
+
+ const patternA = corePatterns[0];
+ const patternB = corePatterns[1] || corePatterns[0];
+ const lessonPool = Array.from(new Set([
+ ...corePatterns,
+ ...GENERIC_DISTRACTOR_PATTERNS
+ ]));
+ let generated = [];
+
+ if (lesson.lessonType === 'conversation') {
+ generated = [
+ buildChoiceExercise(lesson, didactics, patternA, lessonPool, 0),
+ buildContextGapExercise(lesson, didactics, patternA),
+ buildTaskSentenceExercise(lesson, didactics, patternB),
+ buildSituationalExercise(lesson.title, didactics, patternA),
+ buildSpeakingExercise(lesson.title, didactics, patternB)
+ ];
+ } else if (lesson.lessonType === 'grammar') {
+ generated = [
+ buildChoiceExercise(lesson, didactics, patternA, lessonPool, 0),
+ buildChoiceExercise(lesson, didactics, patternB, lessonPool, 1),
+ buildContextGapExercise(lesson, didactics, patternA),
+ buildTaskSentenceExercise(lesson, didactics, patternB),
+ buildSpeakingExercise(lesson.title, didactics, patternA)
+ ];
+ } else if (lesson.lessonType === 'review' || lesson.didacticMode === 'intensive_review') {
+ generated = [
+ buildReviewChoiceExercise(lesson, didactics, patternA, lessonPool),
+ buildReviewChoiceExercise(lesson, didactics, patternB, lessonPool),
+ buildContextGapExercise(lesson, didactics, patternA),
+ buildTaskSentenceExercise(lesson, didactics, patternB),
+ buildSituationalExercise(lesson.title, didactics, patternA),
+ buildSpeakingExercise(lesson.title, didactics, patternB)
+ ];
+ } else if (lesson.lessonType === 'culture') {
+ generated = [
+ buildCultureExercise(lesson, didactics, patternA, lessonPool),
+ buildContextGapExercise(lesson, didactics, patternA),
+ buildSpeakingExercise(lesson.title, didactics, patternB)
+ ];
+ } else {
+ generated = [
+ buildChoiceExercise(lesson, didactics, patternA, lessonPool, 0),
+ buildChoiceExercise(lesson, didactics, patternB, lessonPool, 1),
+ buildContextGapExercise(lesson, didactics, patternA),
+ buildTaskSentenceExercise(lesson, didactics, patternB)
+ ];
+ }
+
+ return generated.filter(Boolean);
+}
+
// Bisaya-spezifische Übungen basierend auf Lektionsthemen
const BISAYA_EXERCISES = {
// Lektion 1: Begrüßungen & Höflichkeit
@@ -1489,7 +1842,8 @@ async function findOrCreateSystemUser() {
return systemUser;
}
-function getExercisesForLesson(lessonTitle) {
+function getExercisesForLesson(lesson) {
+ const lessonTitle = lesson.title;
// Suche nach exaktem Titel
if (BISAYA_EXERCISES[lessonTitle]) {
return BISAYA_EXERCISES[lessonTitle];
@@ -1501,9 +1855,8 @@ function getExercisesForLesson(lessonTitle) {
return exercises;
}
}
-
- // Keine Übungen für unbekannte Lektionen (statt Dummy-Übungen)
- return [];
+
+ return generateExercisesFromDidactics(lesson);
}
async function createBisayaCourseContent() {
@@ -1550,7 +1903,7 @@ async function createBisayaCourseContent() {
console.log(` ${lessons.length} Lektionen gefunden\n`);
for (const lesson of lessons) {
- const exercises = getExercisesForLesson(lesson.title);
+ const exercises = getExercisesForLesson(lesson);
if (exercises.length === 0) {
const existingCount = await VocabGrammarExercise.count({ where: { lessonId: lesson.id } });
if (existingCount > 0) {
diff --git a/backend/scripts/create-bisaya-course.js b/backend/scripts/create-bisaya-course.js
index bc596be..9c8154c 100755
--- a/backend/scripts/create-bisaya-course.js
+++ b/backend/scripts/create-bisaya-course.js
@@ -1,6 +1,6 @@
#!/usr/bin/env node
/**
- * Script zum Erstellen eines vollständigen 4-Wochen Bisaya-Kurses
+ * Script zum Erstellen eines vollständigen 6-Wochen Bisaya-Kurses
*
* Verwendung:
* node backend/scripts/create-bisaya-course.js
{{ $t('admin.falukant.edituser.pregnancy.fatherHintList') }}
+{{ $t('admin.falukant.edituser.pregnancy.fatherHintManual') }}
+{{ $t('admin.falukant.edituser.pregnancy.dueDaysHint') }}
+