From 3d2ccd620a19916e632e8faa81b86b85a889ebfd Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Thu, 2 Apr 2026 13:49:59 +0200 Subject: [PATCH] feat(localization): enhance course progress and review messaging across multiple languages - Added new confirmation titles and messages for resetting and marking lessons as complete in admin and user interfaces. - Expanded course flow and review scheduling messages to improve clarity and user guidance in Cebuano, German, Spanish, and English. - Introduced a new section in the VocabCourseView to display today's recommended steps for users, enhancing the learning experience. - Updated localization files to ensure consistent messaging and improved user engagement across all supported languages. --- frontend/src/i18n/locales/ceb/admin.json | 2 + .../src/i18n/locales/ceb/socialnetwork.json | 30 ++- frontend/src/i18n/locales/de/admin.json | 2 + .../src/i18n/locales/de/socialnetwork.json | 30 ++- frontend/src/i18n/locales/en/admin.json | 2 + .../src/i18n/locales/en/socialnetwork.json | 30 ++- frontend/src/i18n/locales/es/admin.json | 2 + .../src/i18n/locales/es/socialnetwork.json | 30 ++- frontend/src/views/admin/UsersView.vue | 31 ++- frontend/src/views/social/VocabCourseView.vue | 206 ++++++++++++++++-- 10 files changed, 311 insertions(+), 54 deletions(-) diff --git a/frontend/src/i18n/locales/ceb/admin.json b/frontend/src/i18n/locales/ceb/admin.json index 6a57e72..174f2a7 100644 --- a/frontend/src/i18n/locales/ceb/admin.json +++ b/frontend/src/i18n/locales/ceb/admin.json @@ -28,6 +28,7 @@ "selectCourse": "Kurso", "selectLesson": "Leksiyon", "reset": "I-reset ang leksiyon niining user", + "confirmTitle": "Tangtanga ang pag-uswag sa leksiyon", "confirm": "Tinuod nga tangtangon ang pag-uswag sa leksiyon nga «{lesson}» ni {username}?", "success": "Na-reset na ang pag-uswag sa leksiyon.", "error": "Dili ma-reset.", @@ -41,6 +42,7 @@ "throughLabel": "Tanang leksiyon hangtod sa numero (lakip)", "hint": "I-mark ang kulang o abli nga mga row nga nahuman, lakip ang target score ug unang review wave. Ang nahuman na dili usbon.", "submit": "I-mark nga nahuman hangtod dinhi", + "confirmTitle": "I-mark ang mga leksiyon nga nahuman", "confirm": "I-mark nga nahuman ang tanang leksiyon nga numero ≤ {n} ni {username} niining kurso?", "success": "{marked} ka leksiyon nga bag-ong gi-mark nga nahuman ({unchanged} klaro nang nahuman).", "successNone": "Walay pagbag-o: tanang leksiyon nga naapektuhan ({unchanged}) klaro nang nahuman.", diff --git a/frontend/src/i18n/locales/ceb/socialnetwork.json b/frontend/src/i18n/locales/ceb/socialnetwork.json index c26781e..5b249a5 100644 --- a/frontend/src/i18n/locales/ceb/socialnetwork.json +++ b/frontend/src/i18n/locales/ceb/socialnetwork.json @@ -304,7 +304,17 @@ "courseShareCodePlaceholder": "pananglitan abc123def456", "courseFlowEyebrow": "Agos sa adlaw", "courseFlowTitle": "Maayong ipadayon karon", - "courseFlowIntro": "Ang sunod-sunod mosunod sa konsepto: una ang angay nang balikon, dayon ang kasamtangang block, unya ang intensive phase ug sa katapusan ang libre nga pagpalalom.", + "courseFlowIntro": "Una ang gisugyot karon nga sunod-sunod sa ibabaw. Sa ubos, ang upat ka bahin: angay nga balik-balik, kasamtangang block, intensive phase, libre nga pagpalalom.", + "courseTodayPlanTitle": "Gisugyot karong adlawa", + "courseTodayPlanIntro": "Praktikal nga paagi: una ang tanan nga angay na nga mubo nga balik-balik, dayon ang abli nga mga leksiyon sa imong block, unya ang intensive kung naay ipakita. Ang mubo nga balik-balik tulo ka mubo nga petsa human mahuman ang leksiyon ( kasagaran mga 1, 3 ug 7 ka adlaw) aron mahuptan ang mga pulong.", + "courseTodayPlanStepReviewDue": "Mubo nga balik-balik karon", + "courseTodayPlanStepBlock": "Padayon sa kasamtangang block", + "courseTodayPlanStepIntensive": "Intensive nga balik-balik", + "courseTodayPlanStepContinue": "Sunod sa imong agianan sa pagkat-on", + "courseTodayPlanStepPractice": "Libre nga praktis (opsyonal)", + "courseTodayPlanOpen": "Ablihi ang leksiyon", + "courseTodayPlanTrainer": "Ablihi ang trainer", + "courseTodayPlanEmpty": "Walay gikatakda nga angay karon ug walay klaro nga sunod nga lakang sa block. Pilia ang leksiyon sa ubos o gamita ang libre nga pagpalalom sa trainer.", "courseFlowReviewStat": "Angay balikon: {count}", "courseFlowBlockStat": "Aktibong block: {block}", "courseFlowReviewTitle": "Angay nga balik-balikon", @@ -345,10 +355,20 @@ "reviewBadgeScheduleInDays": "sunod nga wave sulod sa {count} ka adlaw", "reviewBadgeScheduleToday": "gitakda ang wave karon", "reviewBadgeScheduleOverdue": "nilapas na ang wave sukad {count} ka adlaw", - "reviewStageDay1": "Adlaw 1", - "reviewStageDay3": "Adlaw 3", - "reviewStageDay7": "Adlaw 7", - "reviewStageCompleted": "Nahuman ang review", + "reviewBadgeLineAllDone": "Nahuman na ang tanang mubo nga balik-balik (3×)", + "reviewBadgeLineDue": "Mubo nga balik-balik: lakang {step} sa 3 · angay na karon", + "reviewBadgeLineScheduled": "Mubo nga balik-balik: lakang {step} sa 3 · sunod {when}", + "reviewWhenFriendlyTomorrow": "ugma", + "reviewWhenFriendlyInDays": "sulod sa {count} ka adlaw", + "reviewWhenFriendlyToday": "karon", + "reviewWhenFriendlyOverdue": "nilapas na ({count} ka adlaw ang milabay)", + "reviewWhenFriendlySoon": "dali ra", + "reviewBadgeTooltipDone": "Nahuman na nimo ang tulo nga gisugyot nga mubo nga balik-balik human niini nga leksiyon. Mahimo gihapon kang magpraktis sa trainer.", + "reviewBadgeTooltipActive": "Human sa leksiyon, gisugyot sa kurso ang tulo ka mubo nga balik-balik nga nagtika-tika mga 1, 3 ug 7 ka adlaw aron mahuptan ang mga pulong. Ang badge nagpakita kung unsang lakang (1–3) ang aktibo o kanus-a ang sunod nga petsa.", + "reviewStageDay1": "Lakang 1 sa 3 (~1 ka adlaw)", + "reviewStageDay3": "Lakang 2 sa 3 (~3 ka adlaw)", + "reviewStageDay7": "Lakang 3 sa 3 (~7 ka adlaw)", + "reviewStageCompleted": "Nahuman na ang tanang mubo nga balik-balik", "phaseQuickstart": "Paspas nga sugod", "phaseDailyLife": "Adlaw-adlaw", "phaseStabilization": "Pagpalig-on", diff --git a/frontend/src/i18n/locales/de/admin.json b/frontend/src/i18n/locales/de/admin.json index e648295..f4b3a69 100644 --- a/frontend/src/i18n/locales/de/admin.json +++ b/frontend/src/i18n/locales/de/admin.json @@ -37,6 +37,7 @@ "selectCourse": "Kurs", "selectLesson": "Lektion", "reset": "Lektion für diesen Nutzer zurücksetzen", + "confirmTitle": "Lektionsfortschritt löschen", "confirm": "Fortschritt der Lektion „{lesson}“ für {username} wirklich löschen?", "success": "Lektionsfortschritt wurde zurückgesetzt.", "error": "Zurücksetzen fehlgeschlagen.", @@ -50,6 +51,7 @@ "throughLabel": "Alle Lektionen bis Lektionsnummer (einschließlich)", "hint": "Setzt fehlende oder offene Einträge auf „abgeschlossen“, inkl. Ziel-Score und erster Review-Welle. Bereits abgeschlossene Lektionen bleiben unverändert.", "submit": "Bis hier als abgeschlossen markieren", + "confirmTitle": "Lektionen als abgeschlossen markieren", "confirm": "Alle Lektionen mit Nummer ≤ {n} für {username} in diesem Kurs als abgeschlossen markieren?", "success": "{marked} Lektion(en) neu als abgeschlossen gesetzt ({unchanged} waren bereits erledigt).", "successNone": "Keine Änderung: alle betroffenen Lektionen ({unchanged}) waren bereits abgeschlossen.", diff --git a/frontend/src/i18n/locales/de/socialnetwork.json b/frontend/src/i18n/locales/de/socialnetwork.json index 9f29ecd..b37015c 100644 --- a/frontend/src/i18n/locales/de/socialnetwork.json +++ b/frontend/src/i18n/locales/de/socialnetwork.json @@ -659,7 +659,17 @@ "courseShareCodePlaceholder": "z. B. abc123def456", "courseFlowEyebrow": "Tagesfluss", "courseFlowTitle": "Heute sinnvoll weitermachen", - "courseFlowIntro": "Die Reihenfolge folgt dem Konzept: fällige Wiederholung zuerst, dann aktueller Block, danach Intensivphase und freie Vertiefung.", + "courseFlowIntro": "Zuerst die Tagesempfehlung mit konkreter Reihenfolge. Darunter die vier Bereiche: fällige Kurz-Wiederholung, aktueller Block, Intensivphase, freie Vertiefung.", + "courseTodayPlanTitle": "Empfehlung für heute", + "courseTodayPlanIntro": "So kannst du vorgehen: zuerst alles unter „Jetzt kurz wiederholen“, dann die offenen Lektionen deines Blocks, danach ggf. die Intensivphase. Kurz-Wiederholungen sind die drei kleinen Termine nach Lektionsende (typisch nach etwa 1, 3 und 7 Tagen), damit Vokabeln hängen bleiben.", + "courseTodayPlanStepReviewDue": "Jetzt kurz wiederholen", + "courseTodayPlanStepBlock": "Weiter im aktuellen Block", + "courseTodayPlanStepIntensive": "Intensive Wiederholung", + "courseTodayPlanStepContinue": "Als Nächstes auf deinem Lernpfad", + "courseTodayPlanStepPractice": "Frei üben (optional)", + "courseTodayPlanOpen": "Lektion öffnen", + "courseTodayPlanTrainer": "Im Trainer üben", + "courseTodayPlanEmpty": "Gerade ist keine gestaffelte Wiederholung fällig und es gibt keinen klaren nächsten Block-Schritt. Wähle unten eine Lektion oder nutze die freie Vertiefung mit dem Trainer.", "courseFlowReviewStat": "Fällige Wiederholung: {count}", "courseFlowBlockStat": "Aktiver Block: {block}", "courseFlowReviewTitle": "Fällige Wiederholung", @@ -700,10 +710,20 @@ "reviewBadgeScheduleInDays": "nächste Welle in {count} Tagen", "reviewBadgeScheduleToday": "Welle heute vorgesehen", "reviewBadgeScheduleOverdue": "Welle überfällig (seit {count} Tagen)", - "reviewStageDay1": "Tag 1", - "reviewStageDay3": "Tag 3", - "reviewStageDay7": "Tag 7", - "reviewStageCompleted": "Review abgeschlossen", + "reviewBadgeLineAllDone": "Alle Kurz-Wiederholungen erledigt (3×)", + "reviewBadgeLineDue": "Kurz wiederholen: Schritt {step} von 3 · jetzt dran", + "reviewBadgeLineScheduled": "Kurz wiederholen: Schritt {step} von 3 · nächster Termin {when}", + "reviewWhenFriendlyTomorrow": "morgen", + "reviewWhenFriendlyInDays": "in {count} Tagen", + "reviewWhenFriendlyToday": "heute", + "reviewWhenFriendlyOverdue": "überfällig (vor {count} Tag(en))", + "reviewWhenFriendlySoon": "bald", + "reviewBadgeTooltipDone": "Die drei empfohlenen Kurz-Wiederholungen nach diesem Lektionsende hast du absolviert. Üben im Trainer geht trotzdem weiter.", + "reviewBadgeTooltipActive": "Nach Lektionsende empfiehlt der Kurs drei kurze Wiederholungen im Abstand von etwa 1, 3 und 7 Tagen, damit Vokabeln im Gedächtnis bleiben. Das Badge zeigt, welcher Schritt (1–3) gerade dran ist bzw. wann der nächste Termin ist.", + "reviewStageDay1": "Schritt 1 von 3 (~1 Tag)", + "reviewStageDay3": "Schritt 2 von 3 (~3 Tage)", + "reviewStageDay7": "Schritt 3 von 3 (~7 Tage)", + "reviewStageCompleted": "Alle Kurz-Wiederholungen erledigt", "phaseQuickstart": "Schnellstart", "phaseDailyLife": "Alltag", "phaseStabilization": "Stabilisierung", diff --git a/frontend/src/i18n/locales/en/admin.json b/frontend/src/i18n/locales/en/admin.json index 205721e..df70708 100644 --- a/frontend/src/i18n/locales/en/admin.json +++ b/frontend/src/i18n/locales/en/admin.json @@ -37,6 +37,7 @@ "selectCourse": "Course", "selectLesson": "Lesson", "reset": "Reset lesson for this user", + "confirmTitle": "Delete lesson progress", "confirm": "Really delete progress for lesson “{lesson}” for {username}?", "success": "Lesson progress was reset.", "error": "Reset failed.", @@ -50,6 +51,7 @@ "throughLabel": "All lessons up to and including lesson number", "hint": "Marks missing or open rows as completed, including target score and first review wave. Already completed lessons are left unchanged.", "submit": "Mark through here as completed", + "confirmTitle": "Mark lessons complete", "confirm": "Mark every lesson with number ≤ {n} for {username} in this course as completed?", "success": "{marked} lesson(s) newly marked complete ({unchanged} were already done).", "successNone": "No change: all affected lessons ({unchanged}) were already completed.", diff --git a/frontend/src/i18n/locales/en/socialnetwork.json b/frontend/src/i18n/locales/en/socialnetwork.json index d0e699e..d024f5e 100644 --- a/frontend/src/i18n/locales/en/socialnetwork.json +++ b/frontend/src/i18n/locales/en/socialnetwork.json @@ -659,7 +659,17 @@ "courseShareCodePlaceholder": "e.g. abc123def456", "courseFlowEyebrow": "Daily flow", "courseFlowTitle": "Best next step for today", - "courseFlowIntro": "The order follows the concept: due reviews first, then the current block, then intensive review, and finally free practice.", + "courseFlowIntro": "Start with today’s suggested order at the top. Below that, the four areas in detail: due quick reviews, current block, intensive review, free practice.", + "courseTodayPlanTitle": "Suggested for today", + "courseTodayPlanIntro": "Practical order: first everything that is due for a quick review, then open lessons in your current block, then intensive review if shown. Quick reviews are three short revisit dates after you finish a lesson (typically about 1, 3 and 7 days apart) so vocabulary sticks.", + "courseTodayPlanStepReviewDue": "Quick review now", + "courseTodayPlanStepBlock": "Continue in your current block", + "courseTodayPlanStepIntensive": "Intensive review", + "courseTodayPlanStepContinue": "Next on your learning path", + "courseTodayPlanStepPractice": "Free practice (optional)", + "courseTodayPlanOpen": "Open lesson", + "courseTodayPlanTrainer": "Open trainer", + "courseTodayPlanEmpty": "Nothing scheduled as due right now and no clear next block step. Pick a lesson below or use free practice with the trainer.", "courseFlowReviewStat": "Due review: {count}", "courseFlowBlockStat": "Active block: {block}", "courseFlowReviewTitle": "Due review", @@ -700,10 +710,20 @@ "reviewBadgeScheduleInDays": "next wave in {count} days", "reviewBadgeScheduleToday": "wave slated for today", "reviewBadgeScheduleOverdue": "wave overdue ({count} days)", - "reviewStageDay1": "Day 1", - "reviewStageDay3": "Day 3", - "reviewStageDay7": "Day 7", - "reviewStageCompleted": "Review completed", + "reviewBadgeLineAllDone": "All quick reviews done (3×)", + "reviewBadgeLineDue": "Quick review: step {step} of 3 · due now", + "reviewBadgeLineScheduled": "Quick review: step {step} of 3 · next on {when}", + "reviewWhenFriendlyTomorrow": "tomorrow", + "reviewWhenFriendlyInDays": "in {count} days", + "reviewWhenFriendlyToday": "today", + "reviewWhenFriendlyOverdue": "overdue ({count} day(s) ago)", + "reviewWhenFriendlySoon": "soon", + "reviewBadgeTooltipDone": "You finished the three suggested quick reviews after this lesson. You can still keep practicing in the trainer.", + "reviewBadgeTooltipActive": "After you complete a lesson, the course suggests three short reviews about 1, 3 and 7 days apart so words stay in memory. The badge shows which step (1–3) is active or when the next date is.", + "reviewStageDay1": "Step 1 of 3 (~1 day)", + "reviewStageDay3": "Step 2 of 3 (~3 days)", + "reviewStageDay7": "Step 3 of 3 (~7 days)", + "reviewStageCompleted": "All quick reviews done", "phaseQuickstart": "Quick start", "phaseDailyLife": "Daily life", "phaseStabilization": "Stabilization", diff --git a/frontend/src/i18n/locales/es/admin.json b/frontend/src/i18n/locales/es/admin.json index c6761fe..ec24f39 100644 --- a/frontend/src/i18n/locales/es/admin.json +++ b/frontend/src/i18n/locales/es/admin.json @@ -37,6 +37,7 @@ "selectCourse": "Curso", "selectLesson": "Lección", "reset": "Restablecer lección para este usuario", + "confirmTitle": "Eliminar progreso de la lección", "confirm": "¿Borrar de verdad el progreso de la lección «{lesson}» para {username}?", "success": "Se restableció el progreso de la lección.", "error": "No se pudo restablecer.", @@ -50,6 +51,7 @@ "throughLabel": "Todas las lecciones hasta el número (incluido)", "hint": "Marca filas faltantes o abiertas como completadas, con puntuación objetivo y primera ola de repaso. Las ya completadas no se cambian.", "submit": "Marcar hasta aquí como completadas", + "confirmTitle": "Marcar lecciones como completadas", "confirm": "¿Marcar todas las lecciones con número ≤ {n} para {username} en este curso como completadas?", "success": "{marked} lección(es) marcadas como completadas ({unchanged} ya estaban hechas).", "successNone": "Sin cambios: todas las lecciones afectadas ({unchanged}) ya estaban completadas.", diff --git a/frontend/src/i18n/locales/es/socialnetwork.json b/frontend/src/i18n/locales/es/socialnetwork.json index 2dbc065..21a80ab 100644 --- a/frontend/src/i18n/locales/es/socialnetwork.json +++ b/frontend/src/i18n/locales/es/socialnetwork.json @@ -657,7 +657,17 @@ "courseShareCodePlaceholder": "p. ej. abc123def456", "courseFlowEyebrow": "Flujo del día", "courseFlowTitle": "La mejor continuación para hoy", - "courseFlowIntro": "El orden sigue el concepto: primero los repasos pendientes, luego el bloque actual, después la fase intensiva y al final la práctica libre.", + "courseFlowIntro": "Primero la sugerencia del día con orden concreto. Debajo, las cuatro zonas: repaso breve pendiente, bloque actual, fase intensiva, práctica libre.", + "courseTodayPlanTitle": "Sugerencia para hoy", + "courseTodayPlanIntro": "Orden práctico: primero todo lo marcado como repaso breve pendiente, luego las lecciones abiertas de tu bloque, después la fase intensiva si aparece. Los repasos breves son tres citas cortas tras terminar una lección (típicamente aprox. 1, 3 y 7 días) para fijar vocabulario.", + "courseTodayPlanStepReviewDue": "Repaso breve ahora", + "courseTodayPlanStepBlock": "Seguir en el bloque actual", + "courseTodayPlanStepIntensive": "Repaso intensivo", + "courseTodayPlanStepContinue": "Siguiente en tu ruta", + "courseTodayPlanStepPractice": "Práctica libre (opcional)", + "courseTodayPlanOpen": "Abrir lección", + "courseTodayPlanTrainer": "Abrir entrenador", + "courseTodayPlanEmpty": "Ahora no hay repaso escalonado pendiente ni un siguiente paso claro en el bloque. Elige una lección abajo o usa la práctica libre con el entrenador.", "courseFlowReviewStat": "Repaso pendiente: {count}", "courseFlowBlockStat": "Bloque activo: {block}", "courseFlowReviewTitle": "Repaso pendiente", @@ -698,10 +708,20 @@ "reviewBadgeScheduleInDays": "siguiente ola en {count} días", "reviewBadgeScheduleToday": "ola prevista hoy", "reviewBadgeScheduleOverdue": "ola atrasada ({count} días)", - "reviewStageDay1": "Día 1", - "reviewStageDay3": "Día 3", - "reviewStageDay7": "Día 7", - "reviewStageCompleted": "Repaso completado", + "reviewBadgeLineAllDone": "Todos los repasos breves hechos (3×)", + "reviewBadgeLineDue": "Repaso breve: paso {step} de 3 · toca ahora", + "reviewBadgeLineScheduled": "Repaso breve: paso {step} de 3 · siguiente el {when}", + "reviewWhenFriendlyTomorrow": "mañana", + "reviewWhenFriendlyInDays": "en {count} días", + "reviewWhenFriendlyToday": "hoy", + "reviewWhenFriendlyOverdue": "atrasado (hace {count} día(s))", + "reviewWhenFriendlySoon": "pronto", + "reviewBadgeTooltipDone": "Completaste los tres repasos breves sugeridos tras esta lección. Puedes seguir practicando en el entrenador.", + "reviewBadgeTooltipActive": "Tras completar la lección, el curso propone tres repasos breves separados unos 1, 3 y 7 días para que el vocabulario quede fijo. La etiqueta indica qué paso (1–3) toca o cuándo es la siguiente cita.", + "reviewStageDay1": "Paso 1 de 3 (~1 día)", + "reviewStageDay3": "Paso 2 de 3 (~3 días)", + "reviewStageDay7": "Paso 3 de 3 (~7 días)", + "reviewStageCompleted": "Todos los repasos breves hechos", "phaseQuickstart": "Inicio rápido", "phaseDailyLife": "Vida diaria", "phaseStabilization": "Estabilización", diff --git a/frontend/src/views/admin/UsersView.vue b/frontend/src/views/admin/UsersView.vue index 8b48632..ee17dcf 100644 --- a/frontend/src/views/admin/UsersView.vue +++ b/frontend/src/views/admin/UsersView.vue @@ -113,6 +113,7 @@