diff --git a/backend/scripts/apply-bisaya-course-refresh.js b/backend/scripts/apply-bisaya-course-refresh.js index 5e38589..87e8847 100644 --- a/backend/scripts/apply-bisaya-course-refresh.js +++ b/backend/scripts/apply-bisaya-course-refresh.js @@ -224,6 +224,59 @@ const LESSON_DIDACTICS = { ], practicalTasks: [{ title: 'Küchenrunde', text: 'Zeige nacheinander auf sieben Lebensmittel oder stelle sie dir vor und sprich jedes Wort laut aus.' }] }, + 'Haus & Familie': { + learningGoals: [ + 'Wichtige Wörter für Haus, Räume und Familie zuordnen und aussprechen.', + 'Mit „Naa … sa …“ sagen, wo sich jemand oder etwas im Haus befindet.', + 'Kurze Sätze über Zuhause und Familie verstehen und nachsprechen.' + ], + corePatterns: [ + { target: 'Balay', gloss: 'Haus' }, + { target: 'Kwarto', gloss: 'Zimmer' }, + { target: 'Kusina', gloss: 'Küche' }, + { target: 'Sala', gloss: 'Wohnzimmer' }, + { target: 'Banyo', gloss: 'Badezimmer' }, + { target: 'Pultahan', gloss: 'Tür' }, + { target: 'Bintana', gloss: 'Fenster' }, + { target: 'Atop', gloss: 'Dach' }, + { target: 'Pamilya', gloss: 'Familie' }, + { target: 'Among pamilya', gloss: 'unsere Familie' }, + { target: 'Naa ko sa balay.', gloss: 'Ich bin zu Hause.' }, + { target: 'Naa sila sa kusina.', gloss: 'Sie sind in der Küche.' }, + { target: 'Asa ang kusina?', gloss: 'Wo ist die Küche?' }, + { target: 'Ang among balay.', gloss: 'Unser Haus.' } + ], + grammarFocus: [ + { + title: 'Naa … sa … für Ort', + text: '„Naa“ drückt aus, dass jemand oder etwas irgendwo ist; „sa“ verbindet mit dem Ort.', + example: 'Naa ko sa balay. Naa sila sa kusina.' + }, + { + title: 'among = unser (Plural inklusiv)', + text: '„Among“ passt zu „wir/unsere“ im Sinne von Familie oder Gruppe.', + example: 'Among pamilya. Ang among balay.' + } + ], + speakingPrompts: [ + { + title: 'Räume benennen', + prompt: 'Nenne Küche, Wohnzimmer und Badezimmer auf Bisaya.', + cue: 'Kusina, sala, banyo.' + }, + { + title: 'Wer ist wo?', + prompt: 'Sage, dass du zu Hause bist, und frage, wo die Küche ist.', + cue: 'Naa ko sa balay. Asa ang kusina?' + } + ], + practicalTasks: [ + { + title: 'Rundgang', + text: 'Geh in Gedanken durch dein Zuhause und benenne jeden Raum laut auf Bisaya.' + } + ] + }, 'Zeitformen - Grundlagen': { learningGoals: [ 'Ni- und Mo- als einfache Zeitmarker unterscheiden.', diff --git a/backend/scripts/create-bisaya-course-content.js b/backend/scripts/create-bisaya-course-content.js index c3a098c..734ab76 100644 --- a/backend/scripts/create-bisaya-course-content.js +++ b/backend/scripts/create-bisaya-course-content.js @@ -1131,74 +1131,137 @@ const BISAYA_EXERCISES = { }) ], - // Lektion: Haus & Familie (Balay, Kwarto, Kusina, Pamilya) + // Lektion: Haus & Familie (Haus, Räume, Familie, typische Kurzsätze) 'Haus & Familie': [ { - exerciseTypeId: 2, // multiple_choice - title: 'Wie sagt man "Haus" auf Bisaya?', + exerciseTypeId: 2, + title: '„Haus“ auf Bisaya', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', - question: 'Wie sagt man "Haus" auf Bisaya?', + question: 'Wie sagt man „Haus“ auf Bisaya?', options: ['Balay', 'Kwarto', 'Kusina', 'Pamilya'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, - explanation: '"Balay" bedeutet "Haus" auf Bisaya.' + explanation: '„Balay“ ist das gängige Wort für Haus.' }, { - exerciseTypeId: 2, // multiple_choice - title: 'Wie sagt man "Zimmer" auf Bisaya?', + exerciseTypeId: 2, + title: '„Zimmer“ auf Bisaya', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', - question: 'Wie sagt man "Zimmer" auf Bisaya?', - options: ['Kwarto', 'Balay', 'Kusina', 'Pamilya'] + question: 'Wie sagt man „Zimmer“ auf Bisaya?', + options: ['Kwarto', 'Balay', 'Kusina', 'Sala'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, - explanation: '"Kwarto" bedeutet "Zimmer" (Raum/Schlafzimmer).' + explanation: '„Kwarto“ bezeichnet ein Zimmer (oft Schlafzimmer).' }, { - exerciseTypeId: 2, // multiple_choice - title: 'Wie sagt man "Küche" auf Bisaya?', + exerciseTypeId: 2, + title: '„Küche“ auf Bisaya', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', - question: 'Wie sagt man "Küche" auf Bisaya?', - options: ['Kusina', 'Balay', 'Kwarto', 'Pamilya'] + question: 'Wie sagt man „Küche“ auf Bisaya?', + options: ['Kusina', 'Sala', 'Banyo', 'Kwarto'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, - explanation: '"Kusina" bedeutet "Küche".' + explanation: '„Kusina“ kommt aus dem Spanischen und ist überall verbreitet.' }, { - exerciseTypeId: 2, // multiple_choice - title: 'Wie sagt man "Familie" auf Bisaya?', + exerciseTypeId: 2, + title: '„Wohnzimmer“ auf Bisaya', + instruction: 'Wähle die übliche Bezeichnung.', + questionData: { + type: 'multiple_choice', + question: 'Wie sagt man oft „Wohnzimmer“?', + options: ['Sala', 'Kwarto', 'Kusina', 'Banyo'] + }, + answerData: { type: 'multiple_choice', correctAnswer: 0 }, + explanation: '„Sala“ ist das übliche Wort für das Wohnzimmer.' + }, + { + exerciseTypeId: 2, + title: '„Badezimmer“ auf Bisaya', instruction: 'Wähle die richtige Übersetzung.', questionData: { type: 'multiple_choice', - question: 'Wie sagt man "Familie" auf Bisaya?', - options: ['Pamilya', 'Balay', 'Kwarto', 'Kusina'] + question: 'Wie sagt man „Badezimmer“?', + options: ['Banyo', 'Kusina', 'Sala', 'Atop'] }, answerData: { type: 'multiple_choice', correctAnswer: 0 }, - explanation: '"Pamilya" bedeutet "Familie".' + explanation: '„Banyo“ wird für Bad/Badezimmer verwendet.' }, { - exerciseTypeId: 1, // gap_fill - title: 'Haus & Räume vervollständigen', - instruction: 'Fülle die Lücken mit den richtigen Bisaya-Wörtern.', + exerciseTypeId: 2, + title: '„Tür“ und „Fenster“', + instruction: 'Ordne die Bedeutung zu.', + questionData: { + type: 'multiple_choice', + question: 'Welches Wort bedeutet „Tür“?', + options: ['Pultahan', 'Bintana', 'Atop', 'Balay'] + }, + answerData: { type: 'multiple_choice', correctAnswer: 0 }, + explanation: '„Pultahan“ = Tür; „Bintana“ = Fenster; „Atop“ = Dach.' + }, + { + exerciseTypeId: 2, + title: 'Frage nach dem Ort', + instruction: 'Wähle die passende deutsche Bedeutung.', + questionData: { + type: 'multiple_choice', + question: 'Was bedeutet „Asa ang kusina?"?', + options: ['Wo ist die Küche?', 'Wo ist das Bad?', 'Wo ist Papa?', 'Was isst du?'] + }, + answerData: { type: 'multiple_choice', correctAnswer: 0 }, + explanation: '„Asa“ fragt nach dem Ort; „ang kusina“ = die Küche.' + }, + { + exerciseTypeId: 2, + title: '„Familie“ und „unsere Familie“', + instruction: 'Wähle die richtige Form.', + questionData: { + type: 'multiple_choice', + question: 'Wie sagt man „unsere Familie“?', + options: ['Among pamilya', 'Akoang pamilya', 'Imong pamilya', 'Iyang pamilya'] + }, + answerData: { type: 'multiple_choice', correctAnswer: 0 }, + explanation: '„Among“ = unser (inklusiv wir); passt gut zur Familie.' + }, + { + exerciseTypeId: 1, + title: 'Haus und Räume – Lücken', + instruction: 'Fülle die Lücken (exakt wie in der Lektion).', questionData: { type: 'gap_fill', - text: '{gap} (Haus) | {gap} (Zimmer) | {gap} (Küche) | {gap} (Familie)', - gaps: 4 + text: '{gap} (Haus) | {gap} (Zimmer) | {gap} (Küche) | {gap} (Wohnzimmer) | {gap} (Badezimmer) | {gap} (Familie)', + gaps: 6 }, answerData: { type: 'gap_fill', - answers: ['Balay', 'Kwarto', 'Kusina', 'Pamilya'] + answers: ['Balay', 'Kwarto', 'Kusina', 'Sala', 'Banyo', 'Pamilya'] }, - explanation: 'Balay = Haus, Kwarto = Zimmer, Kusina = Küche, Pamilya = Familie.' + explanation: 'Die sechs Wörter bilden den Kernwortschatz dieser Lektion.' }, { - exerciseTypeId: 4, // transformation - title: 'Haus-Satz übersetzen', + exerciseTypeId: 1, + title: 'Zu Hause sein', + instruction: 'Ergänze das passende Wort.', + questionData: { + type: 'gap_fill', + text: 'Naa ko sa {gap}. (Ich bin zu Hause.)', + gaps: 1 + }, + answerData: { + type: 'gap_fill', + answers: ['balay'] + }, + explanation: '„Naa ko sa balay.“ = Ich bin zu Hause.' + }, + { + exerciseTypeId: 4, + title: 'Haus mit zwei Zimmern', instruction: 'Übersetze den Satz ins Bisaya.', questionData: { type: 'transformation', @@ -1211,8 +1274,53 @@ const BISAYA_EXERCISES = { correct: 'Ang among balay kay naay duha ka kwarto', alternatives: ['Among balay naay duha ka kwarto', 'Ang among balay adunay duha ka kwarto'] }, - explanation: '"Balay" = Haus, "kwarto" = Zimmer, "duha ka" = zwei (Stück).' - } + explanation: '„Among balay“ = unser Haus; „duha ka kwarto“ = zwei Zimmer.' + }, + { + exerciseTypeId: 4, + title: 'In der Küche', + instruction: 'Übersetze den Satz ins Bisaya.', + questionData: { + type: 'transformation', + text: 'Sie sind in der Küche.', + sourceLanguage: 'Deutsch', + targetLanguage: 'Bisaya' + }, + answerData: { + type: 'transformation', + correct: 'Naa sila sa kusina', + alternatives: ['Naa sila sa kusina.', 'naa sila sa kusina'] + }, + explanation: '„Naa sila sa …“ = Sie sind in/am …' + }, + withTypeName('dialog_completion', { + title: 'Nach der Küche fragen', + instruction: 'Ergänze die passende Antwort.', + questionData: { + type: 'dialog_completion', + question: 'Welche Antwort passt?', + dialog: ['A: Asa ang kusina?', 'B: ...'] + }, + answerData: { + modelAnswer: 'Didto sa luyo.', + correct: ['Didto sa luyo.', 'Naa didto.', 'Tua didto sa kusina.', 'Naa siya sa kusina.'] + }, + explanation: 'Kurze Wegzeiger wie „Didto sa luyo.“ (dort hinten) oder direkt „Naa siya sa kusina.“' + }), + withTypeName('situational_response', { + title: 'Zu Hause kurz beschreiben', + instruction: 'Antworte in einem kurzen Satz auf Bisaya.', + questionData: { + type: 'situational_response', + question: 'Jemand fragt, wo du bist. Sage, dass du zu Hause bist.', + keywords: ['naa', 'balay'] + }, + answerData: { + modelAnswer: 'Naa ko sa balay.', + keywords: ['naa', 'balay'] + }, + explanation: '„Naa ko sa balay.“ ist die natürliche Kurzantwort.' + }) ], // Lektion 14: Ort & Richtung (Asa, dinhi, didto, padulong) diff --git a/backend/scripts/create-bisaya-course.js b/backend/scripts/create-bisaya-course.js index f3aa7c6..1552457 100755 --- a/backend/scripts/create-bisaya-course.js +++ b/backend/scripts/create-bisaya-course.js @@ -383,6 +383,59 @@ const LESSON_DIDACTICS = { } ] }, + 'Haus & Familie': { + learningGoals: [ + 'Wichtige Wörter für Haus, Räume und Familie zuordnen und aussprechen.', + 'Mit „Naa … sa …“ sagen, wo sich jemand oder etwas im Haus befindet.', + 'Kurze Sätze über Zuhause und Familie verstehen und nachsprechen.' + ], + corePatterns: [ + { target: 'Balay', gloss: 'Haus' }, + { target: 'Kwarto', gloss: 'Zimmer' }, + { target: 'Kusina', gloss: 'Küche' }, + { target: 'Sala', gloss: 'Wohnzimmer' }, + { target: 'Banyo', gloss: 'Badezimmer' }, + { target: 'Pultahan', gloss: 'Tür' }, + { target: 'Bintana', gloss: 'Fenster' }, + { target: 'Atop', gloss: 'Dach' }, + { target: 'Pamilya', gloss: 'Familie' }, + { target: 'Among pamilya', gloss: 'unsere Familie' }, + { target: 'Naa ko sa balay.', gloss: 'Ich bin zu Hause.' }, + { target: 'Naa sila sa kusina.', gloss: 'Sie sind in der Küche.' }, + { target: 'Asa ang kusina?', gloss: 'Wo ist die Küche?' }, + { target: 'Ang among balay.', gloss: 'Unser Haus.' } + ], + grammarFocus: [ + { + title: 'Naa … sa … für Ort', + text: '„Naa“ drückt aus, dass jemand oder etwas irgendwo ist; „sa“ verbindet mit dem Ort.', + example: 'Naa ko sa balay. Naa sila sa kusina.' + }, + { + title: 'among = unser (Plural inklusiv)', + text: '„Among“ passt zu „wir/unsere“ im Sinne von Familie oder Gruppe.', + example: 'Among pamilya. Ang among balay.' + } + ], + speakingPrompts: [ + { + title: 'Räume benennen', + prompt: 'Nenne Küche, Wohnzimmer und Badezimmer auf Bisaya.', + cue: 'Kusina, sala, banyo.' + }, + { + title: 'Wer ist wo?', + prompt: 'Sage, dass du zu Hause bist, und frage, wo die Küche ist.', + cue: 'Naa ko sa balay. Asa ang kusina?' + } + ], + practicalTasks: [ + { + title: 'Rundgang', + text: 'Geh in Gedanken durch dein Zuhause und benenne jeden Raum laut auf Bisaya.' + } + ] + }, 'Zeitformen - Grundlagen': { learningGoals: [ 'Ni- und Mo- als einfache Zeitmarker unterscheiden.', @@ -513,8 +566,8 @@ const LESSONS = [ cultural: 'Alltagsgespräche sind wichtig für echte Kommunikation.' }, { week: 2, day: 1, num: 12, type: 'vocab', title: 'Haus & Familie', - desc: 'Balay, Kwarto, Kusina, Pamilya', - targetMin: 20, targetScore: 85, review: true, + desc: 'Haus, Räume, Familie: Balay, kwarto, kusina, sala, banyo, pamilya', + targetMin: 22, targetScore: 85, review: true, cultural: null }, { week: 2, day: 2, num: 13, type: 'conversation', title: 'Alltagsgespräche - Teil 2', diff --git a/backend/scripts/create-language-courses.js b/backend/scripts/create-language-courses.js index 54e472c..52df94b 100755 --- a/backend/scripts/create-language-courses.js +++ b/backend/scripts/create-language-courses.js @@ -80,8 +80,8 @@ const LESSON_TEMPLATE = [ cultural: 'Alltagsgespräche sind wichtig für echte Kommunikation.' }, { week: 2, day: 1, num: 12, type: 'vocab', title: 'Haus & Familie', - desc: 'Wörter für Haus, Zimmer, Familie', - targetMin: 20, targetScore: 85, review: true, + desc: 'Haus, Räume, Familie: Balay, kwarto, kusina, sala, banyo, pamilya', + targetMin: 22, targetScore: 85, review: true, cultural: null }, { week: 2, day: 2, num: 13, type: 'conversation', title: 'Alltagsgespräche - Teil 2', diff --git a/frontend/src/i18n/locales/ceb/socialnetwork.json b/frontend/src/i18n/locales/ceb/socialnetwork.json index c9adc73..d677351 100644 --- a/frontend/src/i18n/locales/ceb/socialnetwork.json +++ b/frontend/src/i18n/locales/ceb/socialnetwork.json @@ -567,6 +567,9 @@ "exerciseReinforcementStay": "Stay sa ang test", "exerciseReinforcementGoPracticeAck": "Read, go aron praktis", "exerciseReinforcementStayAck": "Read, stay sa ang test", + "exerciseExamFailedTitle": "Wala naabot ang minimum nga score", + "exerciseExamFailedBody": "Naayo ka ug {score}% (kinahanglan: {target}%). Padayon pag-praktis sa learning section. Human sa {count} pa nga trainer questions ma-unlock na usab ang chapter test — sugdan nimo pag-usab ang tanan nga pangutana gikan sa sinugdanan.", + "exerciseExamFailedOk": "Okay", "exerciseStatusOpen": "Ablihi", "exerciseStatusCorrect": "Done", "exerciseStatusRetry": "Try again", diff --git a/frontend/src/i18n/locales/de/socialnetwork.json b/frontend/src/i18n/locales/de/socialnetwork.json index 2090e92..4157489 100644 --- a/frontend/src/i18n/locales/de/socialnetwork.json +++ b/frontend/src/i18n/locales/de/socialnetwork.json @@ -525,6 +525,9 @@ "exerciseReinforcementStay": "Bei der Prüfung bleiben", "exerciseReinforcementGoPracticeAck": "Gelesen, zum Üben wechseln", "exerciseReinforcementStayAck": "Gelesen, bei der Prüfung bleiben", + "exerciseExamFailedTitle": "Mindestziel nicht erreicht", + "exerciseExamFailedBody": "Du hast {score}% der Fragen richtig beantwortet (Mindestziel: {target}%). Bitte übe weiter im Lernbereich. Nach {count} weiteren Trainerfragen ist die Kapitel-Prüfung wieder freigeschaltet – dann beginnst du mit allen Fragen von vorn.", + "exerciseExamFailedOk": "Verstanden", "exerciseStatusOpen": "Offen", "exerciseStatusCorrect": "Erledigt", "exerciseStatusRetry": "Nochmal prüfen", diff --git a/frontend/src/i18n/locales/en/socialnetwork.json b/frontend/src/i18n/locales/en/socialnetwork.json index de19961..8342b41 100644 --- a/frontend/src/i18n/locales/en/socialnetwork.json +++ b/frontend/src/i18n/locales/en/socialnetwork.json @@ -525,6 +525,9 @@ "exerciseReinforcementStay": "Stay on the test", "exerciseReinforcementGoPracticeAck": "Read, go to practice", "exerciseReinforcementStayAck": "Read, stay on the test", + "exerciseExamFailedTitle": "Minimum score not reached", + "exerciseExamFailedBody": "You scored {score}% correct (required: {target}%). Keep practicing in the learning section. After {count} more trainer questions the chapter test unlocks again—you will then retake all questions from the start.", + "exerciseExamFailedOk": "OK", "exerciseStatusOpen": "Open", "exerciseStatusCorrect": "Done", "exerciseStatusRetry": "Try again", diff --git a/frontend/src/i18n/locales/es/socialnetwork.json b/frontend/src/i18n/locales/es/socialnetwork.json index 92e0fca..e21efb6 100644 --- a/frontend/src/i18n/locales/es/socialnetwork.json +++ b/frontend/src/i18n/locales/es/socialnetwork.json @@ -523,6 +523,9 @@ "exerciseReinforcementStay": "Seguir en la prueba", "exerciseReinforcementGoPracticeAck": "Leído, ir a practicar", "exerciseReinforcementStayAck": "Leído, seguir en la prueba", + "exerciseExamFailedTitle": "No alcanzaste la puntuación mínima", + "exerciseExamFailedBody": "Has acertado el {score}% (mínimo: {target}%). Sigue practicando en el área de aprendizaje. Tras {count} preguntas más del entrenador se desbloqueará de nuevo el test del capítulo y repetirás todas las preguntas desde el principio.", + "exerciseExamFailedOk": "Entendido", "exerciseStatusOpen": "Pendiente", "exerciseStatusCorrect": "Hecha", "exerciseStatusRetry": "Revisar otra vez", diff --git a/frontend/src/i18n/locales/fr/socialnetwork.json b/frontend/src/i18n/locales/fr/socialnetwork.json index 0e3e316..bcdde32 100644 --- a/frontend/src/i18n/locales/fr/socialnetwork.json +++ b/frontend/src/i18n/locales/fr/socialnetwork.json @@ -523,6 +523,9 @@ "exerciseReinforcementStay": "Restez avec l'examen", "exerciseReinforcementGoPracticeAck": "Lisez, passez à la pratique", "exerciseReinforcementStayAck": "Lisez, restez avec l'examen", + "exerciseExamFailedTitle": "Score minimum non atteint", + "exerciseExamFailedBody": "Vous avez {score}% de bonnes réponses (minimum : {target}%). Continuez à vous entraîner dans la partie apprentissage. Après {count} questions supplémentaires dans l'entraîneur, le test du chapitre se débloque à nouveau et vous reprendrez toutes les questions depuis le début.", + "exerciseExamFailedOk": "Compris", "exerciseStatusOpen": "Ouvrir", "exerciseStatusCorrect": "Complété", "exerciseStatusRetry": "Revérifier", diff --git a/frontend/src/views/social/VocabLessonView.vue b/frontend/src/views/social/VocabLessonView.vue index 8079608..523577d 100644 --- a/frontend/src/views/social/VocabLessonView.vue +++ b/frontend/src/views/social/VocabLessonView.vue @@ -924,6 +924,28 @@ + + +