Files
yourpart3/backend/scripts/update-bisaya-didactics.js
Torsten Schulz (local) 54a77c2e08
All checks were successful
Deploy to production / deploy (push) Successful in 2m51s
feat(vocabService, VocabPracticeDialog, VocabLessonView): enhance vocabulary handling and exposure tracking
- Updated vocabService to merge extracted vocabularies and improve handling of learning and reference pairs.
- Introduced normalization and exposure tracking in VocabPracticeDialog to ensure diverse and underexposed vocabulary practice.
- Enhanced VocabLessonView with methods to identify underexposed vocabularies and adjust selection logic for improved learning outcomes.
- Implemented new constants for minimum exposure requirements to optimize vocabulary training sessions.
2026-04-17 08:58:50 +02:00

544 lines
26 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env node
/**
* Pflegt didaktische Felder in bestehenden Bisaya-Kursen nach.
*
* Verwendung:
* node backend/scripts/update-bisaya-didactics.js
*/
import { sequelize } from '../utils/sequelize.js';
import VocabCourseLesson from '../models/community/vocab_course_lesson.js';
import { getBisayaLessonPedagogy } from './bisaya-course-phase2-pedagogy.js';
import { BISAYA_DIDACTICS_FRAGMENTS } from './bisaya-course-phase1.js';
/** Alte Kurstitel → aktueller Schlüssel in LESSON_DIDACTICS (bestehende Datenbanken). */
export const LEGACY_DIDACTICS_TITLE_MAP = {
'Zahlen & Preise': 'Zahlen 120'
};
export const LESSON_DIDACTICS = {
'Begrüßungen & Höflichkeit': {
learningGoals: [
'Einfache Begrüßungen verstehen und selbst verwenden.',
'Tageszeitbezogene Grüße und einfache Verabschiedungen unterscheiden.',
'Höfliche Reaktionen wie Danke und Bitte passend einsetzen.',
'Ein kurzes Begrüßungs-Mini-Gespräch laut üben.'
],
corePatterns: [
{ target: 'Kumusta ka?', gloss: 'Wie geht es dir?' },
{ target: 'Maayong buntag.', gloss: 'Guten Morgen.' },
{ target: 'Maayong adlaw.', gloss: 'Guten Tag.' },
{ target: 'Maayong gabii.', gloss: 'Guten Abend.' },
{ target: 'Maayong gabii, matulog na ta.', gloss: 'Guten Abend, wir legen uns schlafen.' },
{ target: 'Katulog og maayo.', gloss: 'Schlaf gut.' },
{ target: 'Kapoy na ka?', gloss: 'Bist du müde?' },
{ target: 'Matulog na ta.', gloss: 'Lass uns schlafen gehen.' },
{ target: 'Inom sa og tubig.', gloss: 'Trink Wasser.' },
{ target: 'Patya ang suga.', gloss: 'Mach das Licht aus.' },
{ target: 'Tabuni ang imong kaugalingon.', gloss: 'Deck dich zu.' },
{ target: 'Ugma nasad.', gloss: 'Bis morgen wieder.' },
{ target: 'Damgo og nindot.', gloss: 'Träum schön.' },
{ target: 'Amping.', gloss: 'Pass auf dich auf.' },
{ target: 'Babay.', gloss: 'Tschüss.' },
{ target: 'Maayo ko.', gloss: 'Mir geht es gut.' },
{ target: 'Salamat.', gloss: 'Danke.' },
{ target: 'Palihug.', gloss: 'Bitte.' }
],
grammarFocus: [
{ title: 'Kurzantworten mit ko', text: 'Mit "ko" sprichst du über dich selbst: "Maayo ko."', example: 'Maayo ko. = Mir geht es gut.' },
{ title: 'Maayong + Tageszeit', text: 'Mit "Maayong" kannst du Grüße für verschiedene Tageszeiten bilden.', example: 'Maayong buntag. / Maayong gabii.' },
{ title: 'Abend und Schlafen', text: 'Im Familienalltag folgen auf einen Abendgruß oft direkte Schlafens- oder Fürsorgeformeln.', example: 'Maayong gabii. / Katulog og maayo.' },
{ title: 'Sanfte Schlafensroutine', text: 'Kurze Fragen nach Müdigkeit und kleine Aufforderungen klingen im Familienalltag natürlicher als lange Sätze.', example: 'Kapoy na ka? Matulog na ta. Inom sa og tubig.' },
{ title: 'Familiäre Abendformeln', text: 'Am Abend folgen oft sehr kurze Handlungsformeln wie Licht aus, zudecken oder ein Schlafwunsch.', example: 'Patya ang suga. Tabuni ang imong kaugalingon. Damgo og nindot.' }
],
speakingPrompts: [
{ title: 'Mini-Gespräch', prompt: 'Begrüße eine Person, frage nach dem Befinden und reagiere höflich.', cue: 'Kumusta ka? Maayo ko. Salamat.' },
{ title: 'Verabschiedung', prompt: 'Verabschiede dich kurz und wünsche, dass die andere Person auf sich aufpasst.', cue: 'Babay. Amping.' },
{ title: 'Abend und Schlaf', prompt: 'Wünsche einen guten Abend, eine gute Nacht und dass die Person gut schlafen soll.', cue: 'Maayong gabii. Katulog og maayo.' },
{ title: 'Schlafensroutine', prompt: 'Frage, ob die Person müde ist, und leite dann sanft zum Schlafengehen über.', cue: 'Kapoy na ka? Matulog na ta. Inom sa og tubig.' },
{ title: 'Vor dem Schlafen', prompt: 'Bitte darum, das Licht auszumachen, sich zuzudecken, und wünsche eine gute Nacht bis morgen.', cue: 'Patya ang suga. Tabuni ang imong kaugalingon. Ugma nasad. Damgo og nindot.' }
],
practicalTasks: [
{ title: 'Alltag', text: 'Sprich die Begrüßung dreimal laut und variiere die Antwort.' }
]
},
'Familienwörter': {
learningGoals: [
'Die wichtigsten Familienbezeichnungen sicher erkennen.',
'Familienmitglieder und Großeltern mit respektvollen Wörtern ansprechen.',
'Kurze Sätze über die eigene Familie bilden.'
],
corePatterns: [
{ target: 'Si Nanay.', gloss: 'Das ist Mama.' },
{ target: 'Si Tatay.', gloss: 'Das ist Papa.' },
{ target: 'Si Kuya nako.', gloss: 'Das ist mein älterer Bruder.' },
{ target: 'Si Ate nako.', gloss: 'Das ist meine ältere Schwester.' },
{ target: 'Si Dodong nako.', gloss: 'Das ist mein jüngerer Bruder.' },
{ target: 'Si Inday nako.', gloss: 'Das ist meine jüngere Schwester.' },
{ target: 'Si Lola nako.', gloss: 'Das ist meine Großmutter.' },
{ target: 'Si Lolo nako.', gloss: 'Das ist mein Großvater.' }
],
grammarFocus: [
{ title: 'Respekt in Familienanreden', text: 'Kuya und Ate richtest du an ältere Geschwister (oder respektvoll an andere). Dodong und Inday nutzt du für jüngere Brüder bzw. Schwestern; „Ading“ ist eine weiche Anrede an jüngere Geschwister.', example: 'Kuya, palihug. / Si Dodong nako.' },
{ title: 'si als Personenmarker', text: 'Mit "si" markierst du im einfachen Satz eine konkrete Person.', example: 'Si Nanay. Si Tatay.' }
],
speakingPrompts: [
{ title: 'Meine Familie', prompt: 'Stelle vier Familienmitglieder mit kurzen Sätzen vor.', cue: 'Si Nanay. Si Tatay. Si Kuya nako. Si Dodong nako.' }
],
practicalTasks: [
{ title: 'Familienpraxis', text: 'Nenne laut die acht Kern-Familienwörter und bilde danach drei Mini-Sätze über deine Familie.' }
]
},
'Überlebenssätze - Teil 1': {
learningGoals: [
'Zentrale Notfall- und Verständnisfragen schnell abrufen.',
'Höflich um Wiederholung, Hilfe und langsamere Sprache bitten.',
'Drei Überlebenssätze hintereinander sicher sprechen.'
],
corePatterns: [
{ target: 'Wala ko kasabot.', gloss: 'Ich verstehe nicht.' },
{ target: 'Palihug ka mubalik?', gloss: 'Kannst du das bitte wiederholen?' },
{ target: 'Asa ang CR?', gloss: 'Wo ist die Toilette?' },
{ target: 'Hinay-hinay lang.', gloss: 'Bitte langsam.' },
{ target: 'Tabangi ko, palihug.', gloss: 'Hilf mir bitte.' },
{ target: 'Unsay pasabot ani?', gloss: 'Was bedeutet das?' }
],
grammarFocus: [
{ title: 'Bitte-Formeln mit palihug', text: '"Palihug" macht Bitten höflich und taucht in vielen Überlebenssätzen auf.', example: 'Palihug ka mubalik? / Tabangi ko, palihug.' },
{ title: 'Kurze Verständnisfragen', text: 'Sehr kurze Fragen helfen dir im Alltag oft mehr als lange Sätze.', example: 'Unsay pasabot ani? Asa ang CR?' }
],
speakingPrompts: [
{ title: 'Wenn du etwas nicht verstehst', prompt: 'Sage, dass du etwas nicht verstehst, und bitte um Wiederholung.', cue: 'Wala ko kasabot. Palihug ka mubalik?' },
{ title: 'Soforthilfe', prompt: 'Bitte um Hilfe und frage dann nach der Toilette oder nach der Bedeutung eines Wortes.', cue: 'Tabangi ko, palihug. Asa ang CR?' }
],
practicalTasks: [
{ title: 'Alltagsanker', text: 'Sprich alle sechs Überlebenssätze laut durch und ordne sie drei Alltagssituationen zu.' }
]
},
'Familien-Gespräche': {
learningGoals: [
'Kurze Familiengespräche sicher verstehen.',
'Nach Familienmitgliedern fragen und einfache Antworten geben.',
'Ein Mini-Gespräch über Hunger und Zuhause nachsprechen.'
],
corePatterns: [
{ target: 'Kumusta ka, Nanay?', gloss: 'Wie geht es dir, Mama?' },
{ target: 'Asa si Tatay?', gloss: 'Wo ist Papa?' },
{ target: 'Naa siya sa balay.', gloss: 'Er ist zu Hause.' },
{ target: 'Kumusta na ang Kuya?', gloss: 'Wie geht es dem älteren Bruder?' },
{ target: 'Kumusta na ang Dodong?', gloss: 'Wie geht es dem jüngeren Bruder?' },
{ target: 'Kumusta na ang Inday?', gloss: 'Wie geht es der jüngeren Schwester?' },
{ target: 'Gutom na ko, Nanay.', gloss: 'Ich habe Hunger, Mama.' },
{ target: 'Hapit na ang pagkaon.', gloss: 'Das Essen ist fast fertig.' }
],
grammarFocus: [
{ title: 'naa für Ort und Vorhandensein', text: '"Naa" hilft dir, über Orte und Vorhandensein zu sprechen.', example: 'Naa siya sa balay.' }
],
speakingPrompts: [
{ title: 'Familien-Mini-Dialog', prompt: 'Frage nach einem Familienmitglied und reagiere dann mit einer kurzen Antwort.', cue: 'Asa si Tatay? Naa siya sa balay.' }
],
practicalTasks: [
{ title: 'Gesprächspraxis', text: 'Spiele einen kurzen Familienaustausch mit Frage, Antwort und Fürsorge nach.' }
]
},
'Haus & Familie': BISAYA_DIDACTICS_FRAGMENTS['Haus & Familie'],
'Gefühle & Zuneigung': {
learningGoals: [
'Wichtige Gefühle und Zuneigungsformeln sicher unterscheiden.',
'Freundliche Nähe und Vermissen sprachlich ausdrücken.',
'Zwischen positiven und negativen Gefühlen wechseln.'
],
corePatterns: [
{ target: 'Palangga taka.', gloss: 'Ich hab dich lieb.' },
{ target: 'Ganahan ko nimo.', gloss: 'Ich mag dich.' },
{ target: 'Gimingaw ko nimo.', gloss: 'Ich vermisse dich.' },
{ target: 'Nalipay ko.', gloss: 'Ich bin glücklich.' },
{ target: 'Nasubo ko.', gloss: 'Ich bin traurig.' },
{ target: 'Nalipay ko nga nakita ka.', gloss: 'Ich freue mich, dich zu sehen.' }
],
grammarFocus: [
{ title: 'ko für eigene Gefühle', text: 'Viele Gefühlsaussagen bauen direkt auf dem Muster "Gefühl + ko" auf.', example: 'Nalipay ko. Nasubo ko.' }
],
speakingPrompts: [
{ title: 'Gefühl ausdrücken', prompt: 'Sage, dass du jemanden magst oder vermisst, und ergänze danach ein einfaches Gefühl.', cue: 'Ganahan ko nimo. Nalipay ko.' }
],
practicalTasks: [
{ title: 'Herzsprache', text: 'Lies drei Zuneigungsformeln laut und entscheide danach: liebhaben, mögen oder vermissen?' }
]
},
'Überlebenssätze - Teil 2': {
learningGoals: [
'Weitere zentrale Alltagsfragen sicher sprechen.',
'Höflich Entschuldigung, Nachfrage und Hilfesprache verbinden.',
'Im Alltag Preise, Dinge und Sprache klar ansprechen.'
],
corePatterns: [
{ target: 'Tagpila ni?', gloss: 'Wie viel kostet das?' },
{ target: 'Unsa ni?', gloss: 'Was ist das?' },
{ target: 'Pasensya.', gloss: 'Entschuldigung.' },
{ target: 'Dili ko mag-Bisaya.', gloss: 'Ich spreche kein Bisaya.' },
{ target: 'Palihug isulat ni.', gloss: 'Bitte schreib das auf.' },
{ target: 'Nawala ko.', gloss: 'Ich habe mich verlaufen.' }
],
grammarFocus: [
{ title: 'Kurze Markt- und Orientierungssprache', text: 'Kurze Fragewörter plus ein Nomen reichen oft, um im Alltag voranzukommen.', example: 'Tagpila ni? Unsa ni?' }
],
speakingPrompts: [
{ title: 'Auf dem Markt', prompt: 'Frage nach Preis und Bedeutung eines Gegenstands und bitte dann darum, etwas aufzuschreiben.', cue: 'Tagpila ni? Unsa ni? Palihug isulat ni.' }
],
practicalTasks: [
{ title: 'Unterwegs', text: 'Sprich drei Sätze für Einkauf, Nachfrage und Orientierung laut hintereinander.' }
]
},
'Essen & Fürsorge': {
learningGoals: [
'Fürsorgliche Fragen rund ums Essen verstehen.',
'Einladungen zum Essen passend beantworten.',
'Kurze Essens-Dialoge laut üben.'
],
corePatterns: [
{ target: 'Nikaon na ka?', gloss: 'Hast du schon gegessen?' },
{ target: 'Kaon ta.', gloss: 'Lass uns essen.' },
{ target: 'Gusto ka mokaon?', gloss: 'Möchtest du essen?' },
{ target: 'Gutom na ko.', gloss: 'Ich habe Hunger.' },
{ target: 'Palihug, hatagi ko ug tubig.', gloss: 'Bitte gib mir Wasser.' },
{ target: 'Salamat sa pagkaon.', gloss: 'Danke für das Essen.' },
{ target: 'Busog na ko.', gloss: 'Ich bin satt.' },
{ target: 'Lami kaayo.', gloss: 'Sehr lecker.' }
],
grammarFocus: [
{ title: 'na als Zustandsmarker', text: '"na" markiert oft etwas, das bereits eingetreten ist oder jetzt gilt.', example: 'Nikaon na ka?' },
{ title: 'Bitten mit hatagi ko', text: 'Mit "hatagi ko" bittest du konkret darum, dass dir etwas gegeben wird.', example: 'Palihug, hatagi ko ug tubig.' }
],
speakingPrompts: [
{ title: 'Fürsorge-Dialog', prompt: 'Frage, ob jemand schon gegessen hat, und biete Essen oder Wasser an.', cue: 'Nikaon na ka? Gusto ka mokaon?' },
{ title: 'Beim Essen reagieren', prompt: 'Sage, dass du Hunger hast, bitte um Wasser und reagiere danach auf das Essen.', cue: 'Gutom na ko. Palihug, hatagi ko ug tubig. Lami kaayo.' }
],
practicalTasks: [
{ title: 'Rollenspiel', text: 'Spiele ein kurzes Gespräch zwischen Gastgeber und Gast beim Essen.' }
]
},
'Essen & Trinken': {
learningGoals: [
'Wichtige Essens- und Trinkwörter schnell erkennen.',
'Zwischen Grundnahrungsmitteln, Getränken und Beilagen unterscheiden.',
'Mit den neuen Wörtern kurze Einkaufs- oder Tischsätze bauen.'
],
corePatterns: [
{ target: 'Kan-on', gloss: 'gekochter Reis' },
{ target: 'Tubig', gloss: 'Wasser' },
{ target: 'Isda', gloss: 'Fisch' },
{ target: 'Manok', gloss: 'Huhn' },
{ target: 'Gulay', gloss: 'Gemüse' },
{ target: 'Prutas', gloss: 'Obst' },
{ target: 'Gatas', gloss: 'Milch' }
],
grammarFocus: [
{ title: 'Wortschatz statt ganzer Sätze', text: 'In dieser Lektion sammelst du bewusst Grundwörter, damit du später kurze Essenssätze daraus bauen kannst.', example: 'Kan-on. Tubig. Isda.' }
],
speakingPrompts: [
{ title: 'Auf dem Tisch', prompt: 'Nenne drei Dinge, die auf dem Tisch stehen oder die du essen und trinken möchtest.', cue: 'Kan-on, isda ug tubig.' }
],
practicalTasks: [
{ title: 'Küchenrunde', text: 'Zeige nacheinander auf sieben Lebensmittel oder stelle sie dir vor und sprich jedes Wort laut aus.' }
]
},
'Zeitformen - Grundlagen': {
learningGoals: [
'Ni- und Mo- als einfache Zeitmarker unterscheiden.',
'Kurze Sätze in Vergangenheit und Zukunft bilden.',
'Das Muster laut mit mehreren Verben wiederholen.'
],
corePatterns: ['Ni-kaon ko.', 'Mo-kaon ko.', 'Ni-adto ko.', 'Mo-adto ko.'],
grammarFocus: [
{ title: 'Zeitpräfixe', text: 'Ni- verweist auf Vergangenes, Mo- auf Zukünftiges oder Bevorstehendes.', example: 'Ni-kaon ko. / Mo-kaon ko.' }
],
speakingPrompts: [
{ title: 'Vorher und nachher', prompt: 'Sage einen Satz über etwas, das du getan hast, und einen Satz über etwas, das du tun wirst.', cue: 'Ni-kaon ko. Mo-adto ko.' }
],
practicalTasks: [
{ title: 'Mustertraining', text: 'Nimm ein Verb und sprich es einmal mit Ni- und einmal mit Mo-.' }
]
},
'Zeit & Datum': {
learningGoals: [
'Die drei wichtigsten Zeitwörter (gestern/heute/morgen) sicher erkennen.',
'Zeitmarker in kurzen Sätzen verwenden (ganiha/karon/ugma).',
'Einfache Datums-/Zeitfragen verstehen (z.B. „Unsang adlaw karon?“).'
],
corePatterns: [
{ target: 'Ganiha', gloss: 'vorhin / früher heute' },
{ target: 'Gahapon', gloss: 'gestern' },
{ target: 'Karon', gloss: 'jetzt / heute' },
{ target: 'Ugma', gloss: 'morgen' },
{ target: 'Unya', gloss: 'später' },
{ target: 'Karong adlawa', gloss: 'heute (heute am Tag)' },
{ target: 'Unsang adlaw karon?', gloss: 'Welcher Wochentag ist heute?' },
{ target: 'Alas pila na?', gloss: 'Wie spät ist es?' }
],
grammarFocus: [
{ title: 'Zeitmarker statt Zeiten', text: 'Statt viele Verbzeiten zu beugen, nutzt Cebuano oft Zeitwörter wie „karon/ugma/gahapon“ und ergänzt sie bei Bedarf.', example: 'Mo-adto ko ugma. / Ni-adto ko gahapon.' }
],
speakingPrompts: [
{ title: 'Gesternheutemorgen', prompt: 'Sprich drei Mini-Sätze: gestern, heute, morgen (du kannst immer dasselbe Verb nehmen).', cue: 'Ni-adto ko gahapon. Naa ko diri karon. Mo-adto ko ugma.' }
],
practicalTasks: [
{ title: 'Alltag einordnen', text: 'Nenne laut drei Dinge, die du heute machst, und ergänze jeweils „karon“ oder „unya“.' }
]
},
'Einkaufen & Preise': {
learningGoals: [
'Preise erfragen und auf einfache Antworten reagieren.',
'Beim Einkauf höflich nachfragen oder um einen besseren Preis bitten.',
'Einen kurzen Markt-Dialog mit Frage und Antwort führen.'
],
corePatterns: [
{ target: 'Tagpila ni?', gloss: 'Wie viel kostet das?' },
{ target: 'Mahal ba ni?', gloss: 'Ist das teuer?' },
{ target: 'Pwede barato?', gloss: 'Geht es günstiger?' },
{ target: 'Sige, paliton nako.', gloss: 'Okay, ich nehme es.' },
{ target: 'Salamat, suki.', gloss: 'Danke (vertraulich beim Händler).' },
{ target: 'Unsaon pagbayad?', gloss: 'Wie bezahle ich?' }
],
grammarFocus: [
{ title: 'Marktfragen kurz halten', text: 'Auf dem Markt funktionieren sehr kurze Fragen oft am besten.', example: 'Tagpila ni? Mahal ba ni?' }
],
speakingPrompts: [
{ title: 'Kaufgespräch', prompt: 'Frage nach dem Preis, handle kurz und entscheide dann, ob du kaufst.', cue: 'Tagpila ni? Pwede barato? Sige, paliton nako.' }
],
practicalTasks: [
{ title: 'Preisrunde', text: 'Nimm drei Gegenstände in deiner Umgebung und frage zu jedem einmal „Tagpila ni?“ laut.' }
]
},
'Zahlen 120': {
learningGoals: [
'Die Grundzahlen 110 sicher sprechen und zuordnen.',
'Zahlen bis 20 wiedererkennen und laut bilden.',
'Den Aufbau von 1119 gegenüber Zehnern unterscheiden.'
],
corePatterns: [
{ target: 'Usa', gloss: 'eins' },
{ target: 'Duha', gloss: 'zwei' },
{ target: 'Tulo', gloss: 'drei' },
{ target: 'Upat', gloss: 'vier' },
{ target: 'Lima', gloss: 'fünf' },
{ target: 'Unom', gloss: 'sechs' },
{ target: 'Pito', gloss: 'sieben' },
{ target: 'Walo', gloss: 'acht' },
{ target: 'Siyam', gloss: 'neun' },
{ target: 'Napulo', gloss: 'zehn' },
{ target: 'Napulo ug usa', gloss: 'elf' },
{ target: 'Napulo ug duha', gloss: 'zwölf' },
{ target: 'Napulo ug tulo', gloss: 'dreizehn' },
{ target: 'Napulo ug upat', gloss: 'vierzehn' },
{ target: 'Napulo ug lima', gloss: 'fünfzehn' },
{ target: 'Napulo ug unom', gloss: 'sechzehn' },
{ target: 'Napulo ug pito', gloss: 'siebzehn' },
{ target: 'Napulo ug walo', gloss: 'achtzehn' },
{ target: 'Napulo ug siyam', gloss: 'neunzehn' },
{ target: 'Baynte', gloss: 'zwanzig' }
],
speakingPrompts: [
{ title: 'Zählen', prompt: 'Zähle laut von 1 bis 10 und dann einzeln bis 20.', cue: 'Usa, duha, tulo … baynte.' }
],
practicalTasks: [
{ title: 'Zahlenkarten', text: 'Schreibe 120 auf Karten und übersetze jede Zahl ins Bisaya.' }
]
},
'Zahlen: Zehner': {
learningGoals: [
'Die runden Zehner 2090 sicher erkennen.',
'Zehner mit spanisch geprägten Formen im Alltag wiedererkennen.',
'Einfache Kombinationen mit Zehnern (z. B. Preis grob) verstehen.'
],
corePatterns: [
{ target: 'Baynte', gloss: 'zwanzig' },
{ target: 'Traysenta', gloss: 'dreißig' },
{ target: 'Kwarenta', gloss: 'vierzig' },
{ target: 'Singkwenta', gloss: 'fünfzig' },
{ target: 'Nobenta', gloss: 'neunzig' }
],
grammarFocus: [
{ title: 'Zehner im Markt', text: 'Preise werden oft mit Zehnerformen genannt.', example: 'Baynte pesos.' }
],
practicalTasks: [
{ title: 'Nur Zehner', text: 'Nenne laut nacheinander 20, 30, … 90.' }
]
},
'Zahlen: Hunderter': {
learningGoals: [
'Hunderter mit „ka gatos“ bilden.',
'Zwischen 100 und 900 unterscheiden.',
'Hunderter in groben Preisangaben erkennen.'
],
corePatterns: [
{ target: 'Usa ka gatos', gloss: 'einhundert' },
{ target: 'Duha ka gatos', gloss: 'zweihundert' },
{ target: 'Lima ka gatos', gloss: 'fünfhundert' }
],
speakingPrompts: [
{ title: 'Hunderter hören', prompt: 'Sage drei Hunderter-Beträge laut.', cue: 'Usa ka gatos. Duha ka gatos. Tulo ka gatos.' }
],
practicalTasks: [
{ title: 'Grober Preis', text: 'Übe Preise in Hunderter-Schritten zu nennen.' }
]
},
'Zahlen: Tausender': {
learningGoals: [
'Tausender mit „libo“ bilden.',
'Große Beträge grob einordnen.',
'Einfache Tausender in Kontexten wie Miete oder Gehalt erkennen.'
],
corePatterns: [
{ target: 'Usa ka libo', gloss: 'eintausend' },
{ target: 'Duha ka libo', gloss: 'zweitausend' },
{ target: 'Tulo ka libo', gloss: 'dreitausend' }
],
grammarFocus: [
{ title: 'libo', text: '„Libo“ markiert Tausender; davor steht die Anzahl.', example: 'Usa ka libo.' }
],
practicalTasks: [
{ title: 'Tausender sagen', text: 'Nenne zwei vierstellige Beträge in groben Tausender-Schritten auf Bisaya.' }
]
},
'Woche 2 - Wiederholung': {
learningGoals: [
'Die zentralen Muster von Lektion 1121 sicher wiedererkennen.',
'Orte, Zeitangaben und Preisfragen in einem Durchgang kombinieren.',
'Kurze Alltagssituationen ohne Hilfe formulieren.'
],
corePatterns: [
{ target: 'Naa ko sa balay.', gloss: 'Ich bin zu Hause.' },
{ target: 'Asa ka moadto unya?', gloss: 'Wohin gehst du später?' },
{ target: 'Mo-adto ko ugma.', gloss: 'Ich gehe morgen.' },
{ target: 'Tagpila ni?', gloss: 'Wie viel kostet das?' },
{ target: 'Baynte pesos.', gloss: 'Zwanzig Peso.' }
],
speakingPrompts: [
{ title: 'Woche-2-Mix', prompt: 'Baue einen Mini-Dialog mit Ort, Zeit und Preis.', cue: 'Asa ka moadto unya? Tagpila ni? Baynte pesos.' }
],
practicalTasks: [
{ title: 'Spiral-Wiederholung', text: 'Sprich nacheinander je einen Satz zu Ort, Zeit und Einkauf.' }
]
},
'Woche 2 - Vokabeltest': {
learningGoals: [
'Wortschatz aus Woche 2 schnell abrufen.',
'Ähnliche Zeit- und Ortswörter sicher unterscheiden.',
'Zahlen und Preisvokabeln fehlerfrei zuordnen.'
],
corePatterns: [
{ target: 'Balay', gloss: 'Haus' },
{ target: 'Kusina', gloss: 'Küche' },
{ target: 'Karon', gloss: 'heute/jetzt' },
{ target: 'Ugma', gloss: 'morgen' },
{ target: 'Tagpila ni?', gloss: 'Wie viel kostet das?' },
{ target: 'Baynte', gloss: 'zwanzig' }
],
practicalTasks: [
{ title: 'Selbsttest', text: 'Nimm zehn Wörter aus Woche 2 und übersetze sie laut in beide Richtungen.' }
]
},
'Woche 1 - Wiederholung': {
learningGoals: [
'Die Kernmuster der ersten Woche ohne Hilfe wiederholen.',
'Zwischen Begrüßung, Familie und Fürsorge schneller wechseln.',
'Eine kurze Alltagssequenz frei sprechen.'
],
corePatterns: ['Kumusta ka?', 'Palangga taka.', 'Nikaon na ka?', 'Wala ko kasabot.'],
speakingPrompts: [
{ title: 'Freie Wiederholung', prompt: 'Begrüße jemanden, drücke Zuneigung aus und frage fürsorglich nach dem Essen.', cue: 'Kumusta ka? Palangga taka. Nikaon na ka?' }
]
},
'Woche 1 - Vokabeltest': {
learningGoals: [
'Die wichtigsten Wörter der ersten Woche schnell abrufen.',
'Bedeutung und Gebrauch zentraler Wörter unterscheiden.',
'Von einzelnen Wörtern zu kurzen Sätzen übergehen.'
],
corePatterns: ['Kumusta', 'Salamat', 'Lami', 'Mingaw ko nimo']
}
};
function resolveDidacticsForLesson(lesson) {
const direct = LESSON_DIDACTICS[lesson.title];
if (direct) return direct;
const mappedTitle = LEGACY_DIDACTICS_TITLE_MAP[lesson.title];
if (mappedTitle) return LESSON_DIDACTICS[mappedTitle];
return null;
}
async function updateBisayaDidactics() {
await sequelize.authenticate();
const [bisayaLanguage] = await sequelize.query(
`SELECT id FROM community.vocab_language WHERE name = 'Bisaya' LIMIT 1`,
{ type: sequelize.QueryTypes.SELECT }
);
if (!bisayaLanguage) {
console.error('❌ Bisaya-Sprache nicht gefunden.');
return;
}
const lessonRows = await sequelize.query(
`SELECT l.id, l.lesson_number, l.title
FROM community.vocab_course_lesson l
JOIN community.vocab_course c ON c.id = l.course_id
WHERE c.language_id = :languageId
ORDER BY c.id, l.lesson_number`,
{
replacements: { languageId: bisayaLanguage.id },
type: sequelize.QueryTypes.SELECT
}
);
let updated = 0;
for (const row of lessonRows) {
const lessonLike = {
title: row.title,
lessonNumber: row.lesson_number
};
const didactics = resolveDidacticsForLesson(lessonLike);
const pedagogy = getBisayaLessonPedagogy(lessonLike.lessonNumber);
if (!didactics && !pedagogy) continue;
const patch = {};
if (didactics) {
patch.learningGoals = didactics.learningGoals || [];
patch.corePatterns = didactics.corePatterns || [];
patch.grammarFocus = didactics.grammarFocus || [];
patch.speakingPrompts = didactics.speakingPrompts || [];
patch.practicalTasks = didactics.practicalTasks || [];
}
if (pedagogy) {
patch.didacticMode = pedagogy.didacticMode || null;
patch.phaseLabel = pedagogy.phaseLabel || null;
patch.blockNumber = pedagogy.blockNumber ?? null;
patch.difficultyWeight = pedagogy.difficultyWeight ?? null;
patch.newUnitTarget = pedagogy.newUnitTarget ?? null;
patch.reviewWeight = pedagogy.reviewWeight ?? null;
patch.isIntensiveReview = Boolean(pedagogy.isIntensiveReview);
}
await VocabCourseLesson.update(patch, { where: { id: row.id } });
updated++;
console.log(`✅ Didaktik aktualisiert: Lektion ${lessonLike.lessonNumber} - ${lessonLike.title}`);
}
console.log(`\n🎉 Fertig. ${updated} Lektion(en) aktualisiert.`);
}
async function main() {
try {
await updateBisayaDidactics();
} catch (error) {
console.error('❌ Fehler:', error);
process.exitCode = 1;
} finally {
await sequelize.close();
}
process.exit(process.exitCode ?? 0);
}
main();