feat: erweitere Vokabelkurs mit neuen Zahlen und verbessere Sichtbarkeit der Zahlenreihen
All checks were successful
Deploy to production / deploy (push) Successful in 2m30s

This commit is contained in:
Torsten Schulz (local)
2026-05-27 14:11:55 +02:00
parent cf007ffa51
commit e21949affb
3 changed files with 46 additions and 9 deletions

View File

@@ -31,6 +31,7 @@ jobs:
git diff --name-only "$BASE" "$HEAD" > changed-files.txt
cat changed-files.txt
COMMIT_MESSAGE="$(git log -1 --pretty=%B "$HEAD" || true)"
COURSE_SCRIPT_PATTERN='^backend/scripts/.*(bisaya|course|didactics|vocab)'
if echo "$COMMIT_MESSAGE" | grep -qi '\[force-deploy\]'; then
echo "force_deploy=true" >> "$GITHUB_OUTPUT"
@@ -44,23 +45,30 @@ jobs:
echo "changed=false" >> "$GITHUB_OUTPUT"
fi
if grep -E "$COURSE_SCRIPT_PATTERN" changed-files.txt >/dev/null; then
echo "course_scripts_changed=true" >> "$GITHUB_OUTPUT"
else
echo "course_scripts_changed=false" >> "$GITHUB_OUTPUT"
fi
if grep -E '^frontend/' changed-files.txt >/dev/null; then
echo "frontend_changed=true" >> "$GITHUB_OUTPUT"
else
echo "frontend_changed=false" >> "$GITHUB_OUTPUT"
fi
# Auch Kurs-/Didaktik-Scripts muessen vor dem Sync auf dem Server
# vorliegen; sie sind keine rein externen Datenartefakte.
if grep -E '^backend/' changed-files.txt >/dev/null; then
# Kurs-/Didaktik-Scripts werden vor dem Sync separat uebertragen.
# Fuer sie sind npm ci, Migrationen und ein Backend-Restart nicht noetig.
if grep -E '^backend/' changed-files.txt \
| grep -Ev "$COURSE_SCRIPT_PATTERN" >/dev/null; then
echo "backend_app_changed=true" >> "$GITHUB_OUTPUT"
else
echo "backend_app_changed=false" >> "$GITHUB_OUTPUT"
fi
# App-Code-Änderungen, die einen echten Deploy benötigen
# Backend-Sync-Scripts müssen vor ihrem Einsatz deployed werden.
if grep -E '^(frontend/|backend/)' changed-files.txt >/dev/null; then
if grep -E '^(frontend/|backend/)' changed-files.txt \
| grep -Ev "$COURSE_SCRIPT_PATTERN" >/dev/null; then
echo "app_changed=true" >> "$GITHUB_OUTPUT"
else
echo "app_changed=false" >> "$GITHUB_OUTPUT"
@@ -82,6 +90,17 @@ jobs:
"${{ secrets.PROD_USER }}@${{ secrets.PROD_HOST }}" \
"echo SSH OK"
- name: Deploy vocab course scripts without app rebuild
if: steps.vocab_course_changes.outputs.course_scripts_changed == 'true' && steps.vocab_course_changes.outputs.backend_app_changed != 'true' && steps.vocab_course_changes.outputs.force_deploy != 'true'
shell: bash
run: |
set -euo pipefail
tar -czf - backend/scripts \
| ssh -i ~/.ssh/id_ed25519 \
-p "${{ secrets.PROD_PORT }}" \
"${{ secrets.PROD_USER }}@${{ secrets.PROD_HOST }}" \
"sudo -n -u yourpart tar -xzf - -C /opt/yourpart"
- name: Run deployment script
if: steps.vocab_course_changes.outputs.app_changed == 'true' || steps.vocab_course_changes.outputs.force_deploy == 'true'
run: |

View File

@@ -845,6 +845,7 @@ const BISAYA_DIDACTICS_24_43_BASE = {
const NUMBERS_DIDACTIC = {
learningGoals: [
'Zahlen bis 20 sicher abrufen.',
'Zusammengesetzte Zahlen wie 21 und 25 nach einem Muster bilden.',
'Runde Zahlen (30,40,..90,100) erkennen und nutzen.',
'Große Zahlen (200, 1000, 2000) in Preisen und Mengen verstehen.'
],
@@ -853,16 +854,23 @@ const NUMBERS_DIDACTIC = {
{ 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' },
{ target: 'Kaluhaan ug usa', gloss: 'einundzwanzig' }, { target: 'Kaluhaan ug lima', gloss: 'fünfundzwanzig' }, { target: 'Kaluhaan ug siyam', gloss: 'neunundzwanzig' },
{ target: 'Katloan ug usa', gloss: 'einunddreißig' }, { target: 'Katloan ug lima', gloss: 'fünfunddreißig' }, { target: 'Kalim-an ug walo', gloss: 'achtundfünfzig' },
{ target: 'Traysenta', gloss: 'dreißig' }, { target: 'Kwarenta', gloss: 'vierzig' }, { target: 'Singkwenta', gloss: 'fünfzig' }, { target: 'Sesenta', gloss: 'sechzig' }, { target: 'Setenta', gloss: 'siebzig' },
{ target: 'Otsenta', gloss: 'achtzig' }, { target: 'Nobenta', gloss: 'neunzig' }, { target: 'Usa ka gatos', gloss: 'einhundert' }, { target: 'Duha ka gatos', gloss: 'zweihundert' },
{ target: 'Usa ka libo', gloss: 'tausend' }, { target: 'Duha ka libo', gloss: 'zweitausend' }
],
grammarFocus: [
{ title: '11 bis 19', text: 'Bei der nativen Bildung steht zuerst zehn und danach mit „ug“ die Einerzahl.', example: 'Napulo ug usa = elf; Napulo ug lima = fünfzehn.' },
{ title: 'Zahlen über 20', text: 'Dasselbe Muster funktioniert mit höheren Zehnern: Zehner + „ug“ + Einer. Bei Preisen hört man zusätzlich oft spanisch geprägte Kurzformen wie „baynte“.', example: 'Kaluhaan ug lima = fünfundzwanzig; Baynte = zwanzig.' }
],
speakingPrompts: [
{ title: 'Zähle bis 20', prompt: 'Zähle laut von Usa bis Baynte.' },
{ title: 'Preisangaben', prompt: 'Nenne Preise mit Zahlwörtern, z.B. Singkwenta, Usa ka gatos oder Duha ka libo.' }
{ title: 'Zusammengesetzte Zahlen', prompt: 'Nenne 21, 25, 29, 31, 35 und 58 mit dem Muster Zehner + ug + Einer.', cue: 'Kaluhaan ug usa. Kaluhaan ug lima. Katloan ug usa.' },
{ title: 'Preisangaben', prompt: 'Nenne Preise mit Zahlwörtern, z.B. Kaluhaan ug lima, Singkwenta, Usa ka gatos oder Duha ka libo.' }
],
practicalTasks: [
{ title: 'Zähllektionen', text: 'Mindestens einmal pro Woche eine 35 Minuten Zählübung: 120, dann runde Zahlen.' }
{ title: 'Zähllektionen', text: 'Mindestens einmal pro Woche eine 35 Minuten Zählübung: 120, dann 21, 25, 29 und runde Zahlen.' }
]
};
BISAYA_DIDACTICS_24_43_BASE['Zahlen & Zählen (Woche 3)'] = mergeDidactics({}, NUMBERS_DIDACTIC);

View File

@@ -1742,8 +1742,18 @@ export default {
pushUnique(item?.reference, item?.learning);
});
// Begrenzen, damit die Vorbereitungsrunde kompakt bleibt
return out.slice(0, 30);
// Zahlenreihen muessen vollstaendig sichtbar bleiben: Ein pauschales
// Limit wuerde bei gemischten Checkpoints die Beispiele 11-19 und
// zusammengesetzte Zahlen wie 21/25 abschneiden.
const numberGlosses = new Set([
'eins', 'zwei', 'drei', 'vier', 'fünf', 'sechs', 'sieben', 'acht', 'neun', 'zehn',
'elf', 'zwölf', 'dreizehn', 'vierzehn', 'fünfzehn', 'sechzehn', 'siebzehn',
'achtzehn', 'neunzehn', 'zwanzig', 'einundzwanzig', 'fünfundzwanzig'
]);
const numberPatternCount = this.normalizedCorePatterns.filter((pattern) =>
numberGlosses.has(String(pattern?.gloss || '').trim().toLowerCase())
).length;
return numberPatternCount >= 10 ? out : out.slice(0, 30);
},
currentPrepItem() {
return this.prepItems[this.lessonPrepIndex] || null;