feat(bisaya-course): expand 'Haus & Familie' lesson with new vocabulary and exercises
All checks were successful
Deploy to production / deploy (push) Successful in 2m52s
All checks were successful
Deploy to production / deploy (push) Successful in 2m52s
- Added comprehensive learning goals, core patterns, grammar focus, speaking prompts, and practical tasks for the 'Haus & Familie' lesson, enhancing the curriculum for better language acquisition. - Updated exercise content to include multiple-choice questions and gap-fill tasks related to household vocabulary, improving user engagement and learning outcomes. - Enhanced localization for the lesson description and vocabulary, ensuring clarity and consistency across the learning platform.
This commit is contained in:
@@ -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.' }]
|
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': {
|
'Zeitformen - Grundlagen': {
|
||||||
learningGoals: [
|
learningGoals: [
|
||||||
'Ni- und Mo- als einfache Zeitmarker unterscheiden.',
|
'Ni- und Mo- als einfache Zeitmarker unterscheiden.',
|
||||||
|
|||||||
@@ -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': [
|
'Haus & Familie': [
|
||||||
{
|
{
|
||||||
exerciseTypeId: 2, // multiple_choice
|
exerciseTypeId: 2,
|
||||||
title: 'Wie sagt man "Haus" auf Bisaya?',
|
title: '„Haus“ auf Bisaya',
|
||||||
instruction: 'Wähle die richtige Übersetzung.',
|
instruction: 'Wähle die richtige Übersetzung.',
|
||||||
questionData: {
|
questionData: {
|
||||||
type: 'multiple_choice',
|
type: 'multiple_choice',
|
||||||
question: 'Wie sagt man "Haus" auf Bisaya?',
|
question: 'Wie sagt man „Haus“ auf Bisaya?',
|
||||||
options: ['Balay', 'Kwarto', 'Kusina', 'Pamilya']
|
options: ['Balay', 'Kwarto', 'Kusina', 'Pamilya']
|
||||||
},
|
},
|
||||||
answerData: { type: 'multiple_choice', correctAnswer: 0 },
|
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
|
exerciseTypeId: 2,
|
||||||
title: 'Wie sagt man "Zimmer" auf Bisaya?',
|
title: '„Zimmer“ auf Bisaya',
|
||||||
instruction: 'Wähle die richtige Übersetzung.',
|
instruction: 'Wähle die richtige Übersetzung.',
|
||||||
questionData: {
|
questionData: {
|
||||||
type: 'multiple_choice',
|
type: 'multiple_choice',
|
||||||
question: 'Wie sagt man "Zimmer" auf Bisaya?',
|
question: 'Wie sagt man „Zimmer“ auf Bisaya?',
|
||||||
options: ['Kwarto', 'Balay', 'Kusina', 'Pamilya']
|
options: ['Kwarto', 'Balay', 'Kusina', 'Sala']
|
||||||
},
|
},
|
||||||
answerData: { type: 'multiple_choice', correctAnswer: 0 },
|
answerData: { type: 'multiple_choice', correctAnswer: 0 },
|
||||||
explanation: '"Kwarto" bedeutet "Zimmer" (Raum/Schlafzimmer).'
|
explanation: '„Kwarto“ bezeichnet ein Zimmer (oft Schlafzimmer).'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
exerciseTypeId: 2, // multiple_choice
|
exerciseTypeId: 2,
|
||||||
title: 'Wie sagt man "Küche" auf Bisaya?',
|
title: '„Küche“ auf Bisaya',
|
||||||
instruction: 'Wähle die richtige Übersetzung.',
|
instruction: 'Wähle die richtige Übersetzung.',
|
||||||
questionData: {
|
questionData: {
|
||||||
type: 'multiple_choice',
|
type: 'multiple_choice',
|
||||||
question: 'Wie sagt man "Küche" auf Bisaya?',
|
question: 'Wie sagt man „Küche“ auf Bisaya?',
|
||||||
options: ['Kusina', 'Balay', 'Kwarto', 'Pamilya']
|
options: ['Kusina', 'Sala', 'Banyo', 'Kwarto']
|
||||||
},
|
},
|
||||||
answerData: { type: 'multiple_choice', correctAnswer: 0 },
|
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
|
exerciseTypeId: 2,
|
||||||
title: 'Wie sagt man "Familie" auf Bisaya?',
|
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.',
|
instruction: 'Wähle die richtige Übersetzung.',
|
||||||
questionData: {
|
questionData: {
|
||||||
type: 'multiple_choice',
|
type: 'multiple_choice',
|
||||||
question: 'Wie sagt man "Familie" auf Bisaya?',
|
question: 'Wie sagt man „Badezimmer“?',
|
||||||
options: ['Pamilya', 'Balay', 'Kwarto', 'Kusina']
|
options: ['Banyo', 'Kusina', 'Sala', 'Atop']
|
||||||
},
|
},
|
||||||
answerData: { type: 'multiple_choice', correctAnswer: 0 },
|
answerData: { type: 'multiple_choice', correctAnswer: 0 },
|
||||||
explanation: '"Pamilya" bedeutet "Familie".'
|
explanation: '„Banyo“ wird für Bad/Badezimmer verwendet.'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
exerciseTypeId: 1, // gap_fill
|
exerciseTypeId: 2,
|
||||||
title: 'Haus & Räume vervollständigen',
|
title: '„Tür“ und „Fenster“',
|
||||||
instruction: 'Fülle die Lücken mit den richtigen Bisaya-Wörtern.',
|
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: {
|
questionData: {
|
||||||
type: 'gap_fill',
|
type: 'gap_fill',
|
||||||
text: '{gap} (Haus) | {gap} (Zimmer) | {gap} (Küche) | {gap} (Familie)',
|
text: '{gap} (Haus) | {gap} (Zimmer) | {gap} (Küche) | {gap} (Wohnzimmer) | {gap} (Badezimmer) | {gap} (Familie)',
|
||||||
gaps: 4
|
gaps: 6
|
||||||
},
|
},
|
||||||
answerData: {
|
answerData: {
|
||||||
type: 'gap_fill',
|
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
|
exerciseTypeId: 1,
|
||||||
title: 'Haus-Satz übersetzen',
|
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.',
|
instruction: 'Übersetze den Satz ins Bisaya.',
|
||||||
questionData: {
|
questionData: {
|
||||||
type: 'transformation',
|
type: 'transformation',
|
||||||
@@ -1211,8 +1274,53 @@ const BISAYA_EXERCISES = {
|
|||||||
correct: 'Ang among balay kay naay duha ka kwarto',
|
correct: 'Ang among balay kay naay duha ka kwarto',
|
||||||
alternatives: ['Among balay naay duha ka kwarto', 'Ang among balay adunay 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)
|
// Lektion 14: Ort & Richtung (Asa, dinhi, didto, padulong)
|
||||||
|
|||||||
@@ -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': {
|
'Zeitformen - Grundlagen': {
|
||||||
learningGoals: [
|
learningGoals: [
|
||||||
'Ni- und Mo- als einfache Zeitmarker unterscheiden.',
|
'Ni- und Mo- als einfache Zeitmarker unterscheiden.',
|
||||||
@@ -513,8 +566,8 @@ const LESSONS = [
|
|||||||
cultural: 'Alltagsgespräche sind wichtig für echte Kommunikation.' },
|
cultural: 'Alltagsgespräche sind wichtig für echte Kommunikation.' },
|
||||||
|
|
||||||
{ week: 2, day: 1, num: 12, type: 'vocab', title: 'Haus & Familie',
|
{ week: 2, day: 1, num: 12, type: 'vocab', title: 'Haus & Familie',
|
||||||
desc: 'Balay, Kwarto, Kusina, Pamilya',
|
desc: 'Haus, Räume, Familie: Balay, kwarto, kusina, sala, banyo, pamilya',
|
||||||
targetMin: 20, targetScore: 85, review: true,
|
targetMin: 22, targetScore: 85, review: true,
|
||||||
cultural: null },
|
cultural: null },
|
||||||
|
|
||||||
{ week: 2, day: 2, num: 13, type: 'conversation', title: 'Alltagsgespräche - Teil 2',
|
{ week: 2, day: 2, num: 13, type: 'conversation', title: 'Alltagsgespräche - Teil 2',
|
||||||
|
|||||||
@@ -80,8 +80,8 @@ const LESSON_TEMPLATE = [
|
|||||||
cultural: 'Alltagsgespräche sind wichtig für echte Kommunikation.' },
|
cultural: 'Alltagsgespräche sind wichtig für echte Kommunikation.' },
|
||||||
|
|
||||||
{ week: 2, day: 1, num: 12, type: 'vocab', title: 'Haus & Familie',
|
{ week: 2, day: 1, num: 12, type: 'vocab', title: 'Haus & Familie',
|
||||||
desc: 'Wörter für Haus, Zimmer, Familie',
|
desc: 'Haus, Räume, Familie: Balay, kwarto, kusina, sala, banyo, pamilya',
|
||||||
targetMin: 20, targetScore: 85, review: true,
|
targetMin: 22, targetScore: 85, review: true,
|
||||||
cultural: null },
|
cultural: null },
|
||||||
|
|
||||||
{ week: 2, day: 2, num: 13, type: 'conversation', title: 'Alltagsgespräche - Teil 2',
|
{ week: 2, day: 2, num: 13, type: 'conversation', title: 'Alltagsgespräche - Teil 2',
|
||||||
|
|||||||
@@ -567,6 +567,9 @@
|
|||||||
"exerciseReinforcementStay": "Stay sa ang test",
|
"exerciseReinforcementStay": "Stay sa ang test",
|
||||||
"exerciseReinforcementGoPracticeAck": "Read, go aron praktis",
|
"exerciseReinforcementGoPracticeAck": "Read, go aron praktis",
|
||||||
"exerciseReinforcementStayAck": "Read, stay sa ang test",
|
"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",
|
"exerciseStatusOpen": "Ablihi",
|
||||||
"exerciseStatusCorrect": "Done",
|
"exerciseStatusCorrect": "Done",
|
||||||
"exerciseStatusRetry": "Try again",
|
"exerciseStatusRetry": "Try again",
|
||||||
|
|||||||
@@ -525,6 +525,9 @@
|
|||||||
"exerciseReinforcementStay": "Bei der Prüfung bleiben",
|
"exerciseReinforcementStay": "Bei der Prüfung bleiben",
|
||||||
"exerciseReinforcementGoPracticeAck": "Gelesen, zum Üben wechseln",
|
"exerciseReinforcementGoPracticeAck": "Gelesen, zum Üben wechseln",
|
||||||
"exerciseReinforcementStayAck": "Gelesen, bei der Prüfung bleiben",
|
"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",
|
"exerciseStatusOpen": "Offen",
|
||||||
"exerciseStatusCorrect": "Erledigt",
|
"exerciseStatusCorrect": "Erledigt",
|
||||||
"exerciseStatusRetry": "Nochmal prüfen",
|
"exerciseStatusRetry": "Nochmal prüfen",
|
||||||
|
|||||||
@@ -525,6 +525,9 @@
|
|||||||
"exerciseReinforcementStay": "Stay on the test",
|
"exerciseReinforcementStay": "Stay on the test",
|
||||||
"exerciseReinforcementGoPracticeAck": "Read, go to practice",
|
"exerciseReinforcementGoPracticeAck": "Read, go to practice",
|
||||||
"exerciseReinforcementStayAck": "Read, stay on the test",
|
"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",
|
"exerciseStatusOpen": "Open",
|
||||||
"exerciseStatusCorrect": "Done",
|
"exerciseStatusCorrect": "Done",
|
||||||
"exerciseStatusRetry": "Try again",
|
"exerciseStatusRetry": "Try again",
|
||||||
|
|||||||
@@ -523,6 +523,9 @@
|
|||||||
"exerciseReinforcementStay": "Seguir en la prueba",
|
"exerciseReinforcementStay": "Seguir en la prueba",
|
||||||
"exerciseReinforcementGoPracticeAck": "Leído, ir a practicar",
|
"exerciseReinforcementGoPracticeAck": "Leído, ir a practicar",
|
||||||
"exerciseReinforcementStayAck": "Leído, seguir en la prueba",
|
"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",
|
"exerciseStatusOpen": "Pendiente",
|
||||||
"exerciseStatusCorrect": "Hecha",
|
"exerciseStatusCorrect": "Hecha",
|
||||||
"exerciseStatusRetry": "Revisar otra vez",
|
"exerciseStatusRetry": "Revisar otra vez",
|
||||||
|
|||||||
@@ -523,6 +523,9 @@
|
|||||||
"exerciseReinforcementStay": "Restez avec l'examen",
|
"exerciseReinforcementStay": "Restez avec l'examen",
|
||||||
"exerciseReinforcementGoPracticeAck": "Lisez, passez à la pratique",
|
"exerciseReinforcementGoPracticeAck": "Lisez, passez à la pratique",
|
||||||
"exerciseReinforcementStayAck": "Lisez, restez avec l'examen",
|
"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",
|
"exerciseStatusOpen": "Ouvrir",
|
||||||
"exerciseStatusCorrect": "Complété",
|
"exerciseStatusCorrect": "Complété",
|
||||||
"exerciseStatusRetry": "Revérifier",
|
"exerciseStatusRetry": "Revérifier",
|
||||||
|
|||||||
@@ -924,6 +924,28 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Kapitel-Prüfung: Mindestziel am Ende nicht erreicht -->
|
||||||
|
<div v-if="showChapterExamFailedDialog" class="dialog-overlay" @click.self="closeChapterExamFailedDialog">
|
||||||
|
<div class="dialog" style="width: 440px; height: auto;">
|
||||||
|
<div class="dialog-header">
|
||||||
|
<span class="dialog-title">{{ $t('socialnetwork.vocab.courses.exerciseExamFailedTitle') }}</span>
|
||||||
|
<span class="dialog-close" @click="closeChapterExamFailedDialog">✖</span>
|
||||||
|
</div>
|
||||||
|
<div class="dialog-body">
|
||||||
|
<p>{{ $t('socialnetwork.vocab.courses.exerciseExamFailedBody', {
|
||||||
|
score: chapterExamFailedScore,
|
||||||
|
target: exerciseTargetScore,
|
||||||
|
count: exerciseRetryUnlockAttempts
|
||||||
|
}) }}</p>
|
||||||
|
</div>
|
||||||
|
<div class="dialog-footer">
|
||||||
|
<button type="button" class="dialog-button dialog-button--primary" @click="closeChapterExamFailedDialog">
|
||||||
|
{{ $t('socialnetwork.vocab.courses.exerciseExamFailedOk') }}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@@ -1008,6 +1030,8 @@ export default {
|
|||||||
exerciseReinforcementPrepMode: false,
|
exerciseReinforcementPrepMode: false,
|
||||||
exerciseReinforcementCorrectAnswer: '',
|
exerciseReinforcementCorrectAnswer: '',
|
||||||
exerciseReinforcementMessage: '',
|
exerciseReinforcementMessage: '',
|
||||||
|
showChapterExamFailedDialog: false,
|
||||||
|
chapterExamFailedScore: 0,
|
||||||
/** Index in scrambledChapterExamExercises bei Ein-Frage-Ansicht */
|
/** Index in scrambledChapterExamExercises bei Ein-Frage-Ansicht */
|
||||||
exerciseSequentialIndex: 0,
|
exerciseSequentialIndex: 0,
|
||||||
/** Aus vorherigen Lektionen (MC-Optionen nach Fragentyp Ziel-/Muttersprache) */
|
/** Aus vorherigen Lektionen (MC-Optionen nach Fragentyp Ziel-/Muttersprache) */
|
||||||
@@ -1151,7 +1175,7 @@ export default {
|
|||||||
if (!list.length) return false;
|
if (!list.length) return false;
|
||||||
const ex = list[this.exerciseSequentialIndex];
|
const ex = list[this.exerciseSequentialIndex];
|
||||||
if (!ex) return false;
|
if (!ex) return false;
|
||||||
return Boolean(this.exerciseResults[ex.id]?.correct) && this.exerciseSequentialIndex < list.length - 1;
|
return Boolean(this.exerciseResults[ex.id]) && this.exerciseSequentialIndex < list.length - 1;
|
||||||
},
|
},
|
||||||
exerciseRetryUnlockAttempts() {
|
exerciseRetryUnlockAttempts() {
|
||||||
return Math.min(8, Math.max(2, Math.ceil(this.trainerNewFocusTarget * 0.25)));
|
return Math.min(8, Math.max(2, Math.ceil(this.trainerNewFocusTarget * 0.25)));
|
||||||
@@ -1938,6 +1962,66 @@ export default {
|
|||||||
this.exerciseReinforcementCorrectAnswer = '';
|
this.exerciseReinforcementCorrectAnswer = '';
|
||||||
this.exerciseReinforcementMessage = '';
|
this.exerciseReinforcementMessage = '';
|
||||||
},
|
},
|
||||||
|
closeChapterExamFailedDialog() {
|
||||||
|
this.showChapterExamFailedDialog = false;
|
||||||
|
},
|
||||||
|
clearChapterExamAttemptState() {
|
||||||
|
const all = this.effectiveExercises;
|
||||||
|
if (!all.length) return;
|
||||||
|
const results = { ...this.exerciseResults };
|
||||||
|
const answers = { ...this.exerciseAnswers };
|
||||||
|
all.forEach((e) => {
|
||||||
|
delete results[e.id];
|
||||||
|
delete answers[e.id];
|
||||||
|
});
|
||||||
|
this.exerciseResults = results;
|
||||||
|
this.exerciseAnswers = answers;
|
||||||
|
this.exerciseSequentialIndex = 0;
|
||||||
|
this.buildMcRandomizedOptions();
|
||||||
|
},
|
||||||
|
handleChapterExamFailed(score) {
|
||||||
|
this.exerciseRetryPending = true;
|
||||||
|
this.exerciseRetryPendingSinceAttempts = this.vocabTrainerTotalAttempts;
|
||||||
|
this.clearChapterExamAttemptState();
|
||||||
|
this.chapterExamFailedScore = score;
|
||||||
|
this.showChapterExamFailedDialog = true;
|
||||||
|
this.activeTab = 'learn';
|
||||||
|
this.$nextTick(() => {
|
||||||
|
const scrollEl = document.querySelector('.app-content__scroll.contentscroll');
|
||||||
|
if (scrollEl) scrollEl.scrollTop = 0;
|
||||||
|
else window.scrollTo(0, 0);
|
||||||
|
});
|
||||||
|
this.persistLessonState();
|
||||||
|
},
|
||||||
|
finalizeChapterExamIfComplete() {
|
||||||
|
const allExercises = this.effectiveExercises;
|
||||||
|
if (!this.lesson || !allExercises.length) return;
|
||||||
|
const allAnswered = allExercises.every((exercise) => Boolean(this.exerciseResults[exercise.id]));
|
||||||
|
if (!allAnswered) return;
|
||||||
|
|
||||||
|
const correctExercises = allExercises.filter((exercise) => this.exerciseResults[exercise.id]?.correct).length;
|
||||||
|
const score = Math.round((correctExercises / allExercises.length) * 100);
|
||||||
|
const target = this.exerciseTargetScore;
|
||||||
|
|
||||||
|
if (score >= target && !this.exerciseNeedsReinforcement) {
|
||||||
|
void this.checkLessonCompletion();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.handleChapterExamFailed(score);
|
||||||
|
},
|
||||||
|
afterChapterExamAnswerSubmitted(exerciseId) {
|
||||||
|
this.$nextTick(() => {
|
||||||
|
if (this.sequentialPanelActive) {
|
||||||
|
const list = this.scrambledChapterExamExercises;
|
||||||
|
const idx = list.findIndex((e) => e.id === exerciseId);
|
||||||
|
if (idx >= 0 && idx < list.length - 1 && this.exerciseResults[exerciseId]) {
|
||||||
|
this.exerciseSequentialIndex = idx + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.persistLessonState();
|
||||||
|
this.finalizeChapterExamIfComplete();
|
||||||
|
});
|
||||||
|
},
|
||||||
advancePrepPass() {
|
advancePrepPass() {
|
||||||
if (this.lessonPrepStage >= 2 || this.prepItems.length === 0) {
|
if (this.lessonPrepStage >= 2 || this.prepItems.length === 0) {
|
||||||
return;
|
return;
|
||||||
@@ -2630,28 +2714,15 @@ export default {
|
|||||||
this.exerciseReinforcementPrepMode = true;
|
this.exerciseReinforcementPrepMode = true;
|
||||||
this.exerciseReinforcementCorrectAnswer = correctText;
|
this.exerciseReinforcementCorrectAnswer = correctText;
|
||||||
this.exerciseReinforcementMessage = this.$t('socialnetwork.vocab.courses.exercisePrepReinforcementHint');
|
this.exerciseReinforcementMessage = this.$t('socialnetwork.vocab.courses.exercisePrepReinforcementHint');
|
||||||
} else {
|
this.showExerciseReinforcementDialog = true;
|
||||||
this.exerciseReinforcementPrepMode = false;
|
return;
|
||||||
this.exerciseReinforcementCorrectAnswer = correctText;
|
|
||||||
this.exerciseReinforcementMessage = this.$t('socialnetwork.vocab.courses.exerciseReinforcementHint', {
|
|
||||||
count: this.exerciseRetryUnlockAttempts
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
this.showExerciseReinforcementDialog = true;
|
// Kapitel-Prüfung: Lösung inline anzeigen, ohne Sofort-Dialog; nach letzter Frage ggf. Übung + Neustart
|
||||||
|
this.afterChapterExamAnswerSubmitted(exerciseId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Nächste Frage im Einzel-Panel / Abschluss prüfen
|
this.afterChapterExamAnswerSubmitted(exerciseId);
|
||||||
this.$nextTick(() => {
|
|
||||||
if (this.sequentialPanelActive) {
|
|
||||||
const list = this.scrambledChapterExamExercises;
|
|
||||||
const idx = list.findIndex((e) => e.id === exerciseId);
|
|
||||||
if (idx >= 0 && idx < list.length - 1) {
|
|
||||||
this.exerciseSequentialIndex = idx + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.checkLessonCompletion();
|
|
||||||
});
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('Fehler beim Prüfen der Antwort:', e);
|
console.error('Fehler beim Prüfen der Antwort:', e);
|
||||||
this.showErrorDialog = true;
|
this.showErrorDialog = true;
|
||||||
|
|||||||
Reference in New Issue
Block a user