feat(vocab): add dashboard learning summary and related endpoints
All checks were successful
Deploy to production / deploy (push) Successful in 2m52s

- Introduced `getDashboardLearningSummary` method in `VocabService` to provide a compact overview of enrolled courses and current lessons for users.
- Updated `vocabController` to include a new route for the dashboard widget, allowing users to access their learning summary.
- Enhanced `vocabRouter` to route requests for the new dashboard widget endpoint.
- Added localization support for the new dashboard features across multiple languages, improving user engagement and accessibility.
- Updated UI components to integrate the new dashboard widget, ensuring a seamless user experience.
This commit is contained in:
Torsten Schulz (local)
2026-04-02 15:06:50 +02:00
parent 77e6f8d3e8
commit 5fcd55be43
28 changed files with 1095 additions and 39 deletions

View File

@@ -433,7 +433,28 @@
"bookmarkCandidate": "Timan-i kining kandidatura",
"voteError": "Sayop sa paghatag sa boto",
"voteAllError": "Sayop sa paghatag sa mga boto",
"applyError": "Dili mapadala ang aplikasyon."
"applyError": "Dili mapadala ang aplikasyon.",
"benefits": {
"daily_salary": "Adlaw-adlaw nga suhol (usa ra kada adlaw): mga {amount}",
"tax_exemption": "Way buhis: {regions}",
"tax_exemption_all": "Way buhis: tanang lebel sa rehiyon",
"generic": "Benepisyo ({code})"
},
"regionLevels": {
"city": "Siyudad",
"county": "County",
"shire": "Shire",
"markgrave": "Margravate",
"duchy": "Duchy",
"country": "Nasud"
},
"current": {
"benefit": "Benepisyo",
"benefit_all": "Tanang rehiyon",
"holder": "Tag-iya",
"none": "Walay karon nga posisyon.",
"termEnds": "Matapos sa"
}
},
"family": {
"title": "Pamilya",

View File

@@ -81,6 +81,16 @@
},
"falukant": {
"emptyValue": "—"
},
"vocabCourses": {
"empty": "Wala ka pa nakasulod sa bisan unsang kurso sa bokabularyo.",
"browseCourses": "Tan-awa ang mga kurso",
"unnamedCourse": "Kurso nga walay titulo",
"lessonLine": "Leksyon #{number}: {title}",
"noLessons": "Walay mga leksyon niini nga kurso.",
"allDone": "Natapos na ang tanang leksyon",
"openLesson": "Adto sa leksyon",
"openCourse": "Ablihi ang kurso"
}
},
"gender": {

View File

@@ -23,7 +23,8 @@
"news": "Balita",
"birthdays": "Mga adlawng natawhan",
"upcoming": "Umaabot nga mga appointment",
"calendar": "Kalendaryo"
"calendar": "Kalendaryo",
"vocabCourses": "Mga kurso sa pinulongan"
},
"overview": {
"activeWidgetsLabel": "Aktibong mga widget",

View File

@@ -1353,6 +1353,20 @@
"voteError": "Fehler beim Abgeben der Stimme",
"voteAllError": "Fehler beim Abgeben der Stimmen",
"applyError": "Bewerbung konnte nicht eingereicht werden.",
"benefits": {
"daily_salary": "Tagesamtshonorar (einmal pro Tag): ca. {amount}",
"tax_exemption": "Steuerbefreiung: {regions}",
"tax_exemption_all": "Steuerbefreiung: alle Regionsebenen",
"generic": "Vorteil ({code})"
},
"regionLevels": {
"city": "Stadt",
"county": "Landkreis",
"shire": "Grafschaft",
"markgrave": "Markgrafschaft",
"duchy": "Herzogtum",
"country": "Land"
},
"current": {
"office": "Amt",
"region": "Region",

View File

@@ -92,6 +92,16 @@
},
"falukant": {
"emptyValue": "—"
},
"vocabCourses": {
"empty": "Du bist derzeit in keinem Vokabelkurs eingeschrieben.",
"browseCourses": "Kurse entdecken",
"unnamedCourse": "Kurs ohne Titel",
"lessonLine": "Lektion #{number}: {title}",
"noLessons": "Noch keine Lektionen in diesem Kurs.",
"allDone": "Alle Lektionen absolviert",
"openLesson": "Zur Lektion",
"openCourse": "Zum Kurs"
}
},
"gender": {

View File

@@ -23,7 +23,8 @@
"news": "News",
"birthdays": "Geburtstage",
"upcoming": "Nächste Termine",
"calendar": "Kalender"
"calendar": "Kalender",
"vocabCourses": "Sprachkurse"
},
"overview": {
"activeWidgetsLabel": "Aktive Widgets",

View File

@@ -574,6 +574,20 @@
"voteError": "Error while submitting the vote",
"voteAllError": "Error while submitting the votes",
"applyError": "Application could not be submitted.",
"benefits": {
"daily_salary": "Daily office stipend (once per day): about {amount}",
"tax_exemption": "Tax exemption: {regions}",
"tax_exemption_all": "Tax exemption: all regional levels",
"generic": "Benefit ({code})"
},
"regionLevels": {
"city": "City",
"county": "County",
"shire": "Shire",
"markgrave": "Margravate",
"duchy": "Duchy",
"country": "Country"
},
"current": {
"office": "Office",
"region": "Region",

View File

@@ -92,6 +92,16 @@
},
"falukant": {
"emptyValue": "—"
},
"vocabCourses": {
"empty": "You are not enrolled in any vocabulary course yet.",
"browseCourses": "Browse courses",
"unnamedCourse": "Untitled course",
"lessonLine": "Lesson #{number}: {title}",
"noLessons": "No lessons in this course yet.",
"allDone": "All lessons completed",
"openLesson": "Go to lesson",
"openCourse": "Open course"
}
},
"gender": {

View File

@@ -23,7 +23,8 @@
"news": "News",
"birthdays": "Birthdays",
"upcoming": "Upcoming appointments",
"calendar": "Calendar"
"calendar": "Calendar",
"vocabCourses": "Language courses"
},
"overview": {
"activeWidgetsLabel": "Active widgets",

View File

@@ -1261,6 +1261,20 @@
"upcoming": "Cargos pendientes de (re)elección",
"elections": "Elecciones"
},
"benefits": {
"daily_salary": "Estipendio diario (una vez al día): unos {amount}",
"tax_exemption": "Exención fiscal: {regions}",
"tax_exemption_all": "Exención fiscal: todos los niveles regionales",
"generic": "Ventaja ({code})"
},
"regionLevels": {
"city": "Ciudad",
"county": "Condado",
"shire": "Condado (shire)",
"markgrave": "Margraviato",
"duchy": "Ducado",
"country": "País"
},
"current": {
"office": "Cargo",
"region": "Región",

View File

@@ -92,6 +92,16 @@
},
"falukant": {
"emptyValue": "—"
},
"vocabCourses": {
"empty": "Aún no estás inscrito en ningún curso de vocabulario.",
"browseCourses": "Ver cursos",
"unnamedCourse": "Curso sin título",
"lessonLine": "Lección n.º {number}: {title}",
"noLessons": "Este curso aún no tiene lecciones.",
"allDone": "Todas las lecciones completadas",
"openLesson": "Ir a la lección",
"openCourse": "Abrir curso"
}
},
"gender": {

View File

@@ -23,7 +23,8 @@
"news": "Noticias",
"birthdays": "Cumpleaños",
"upcoming": "Próximas citas",
"calendar": "Calendario"
"calendar": "Calendario",
"vocabCourses": "Cursos de idiomas"
},
"overview": {
"activeWidgetsLabel": "Widgets activos",