feat(vocab): update course today plan localization and UI logic
All checks were successful
Deploy to production / deploy (push) Successful in 2m49s
All checks were successful
Deploy to production / deploy (push) Successful in 2m49s
- Added new localization strings for scenarios with no due reviews in German, English, and Spanish, enhancing user guidance. - Updated VocabCourseView to conditionally display the appropriate introduction message based on the presence of due reviews, improving clarity in the course flow.
This commit is contained in:
@@ -670,8 +670,18 @@
|
||||
"courseFlowEyebrow": "Tagesfluss",
|
||||
"courseFlowTitle": "Heute sinnvoll weitermachen",
|
||||
"courseFlowIntro": "Zuerst die Tagesempfehlung mit konkreter Reihenfolge. Darunter die vier Bereiche: fällige Kurz-Wiederholung, aktueller Block, Intensivphase, freie Vertiefung.",
|
||||
"quickReviewTitle": "Kurz-Wiederholung",
|
||||
"quickReviewIntro": "Kurze Session mit {count} Begriffen. Nach Abschluss wird die geplante Wiederholung als erledigt markiert.",
|
||||
"quickReviewDoneTitle": "Geschafft",
|
||||
"quickReviewDoneScore": "Richtig: {correct} / {total}",
|
||||
"quickReviewBackToCourse": "Zurück zum Kurs",
|
||||
"quickReviewProgress": "Begriff {current} von {total}",
|
||||
"quickReviewPromptMeaning": "Was bedeutet \"{term}\"?",
|
||||
"quickReviewPromptTarget": "Tippe auf Zielsprache: \"{term}\"",
|
||||
"quickReviewAcknowledge": "Gelesen, weiter",
|
||||
"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.",
|
||||
"courseTodayPlanIntroNoDueReview": "Heute ist keine Kurz-Wiederholung fällig. Starte mit den offenen Lektionen im aktuellen Block und nimm danach ggf. die Intensivphase mit. Kurz-Wiederholungen erscheinen automatisch wieder nach dem 1/3/7-Tage-Rhythmus.",
|
||||
"courseTodayPlanStepReviewDue": "Jetzt kurz wiederholen",
|
||||
"courseTodayPlanStepBlock": "Weiter im aktuellen Block",
|
||||
"courseTodayPlanStepIntensive": "Intensive Wiederholung",
|
||||
|
||||
@@ -670,8 +670,18 @@
|
||||
"courseFlowEyebrow": "Daily flow",
|
||||
"courseFlowTitle": "Best next step for today",
|
||||
"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.",
|
||||
"quickReviewTitle": "Quick Review",
|
||||
"quickReviewIntro": "Short session with {count} terms. After completion, the scheduled review is marked as done.",
|
||||
"quickReviewDoneTitle": "Done",
|
||||
"quickReviewDoneScore": "Correct: {correct} / {total}",
|
||||
"quickReviewBackToCourse": "Back to course",
|
||||
"quickReviewProgress": "Term {current} of {total}",
|
||||
"quickReviewPromptMeaning": "What does \"{term}\" mean?",
|
||||
"quickReviewPromptTarget": "Type in target language: \"{term}\"",
|
||||
"quickReviewAcknowledge": "Read, continue",
|
||||
"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.",
|
||||
"courseTodayPlanIntroNoDueReview": "No quick review is due today. Start with the open lessons in your current block, then do intensive review if shown. Quick reviews reappear automatically on the 1/3/7-day rhythm.",
|
||||
"courseTodayPlanStepReviewDue": "Quick review now",
|
||||
"courseTodayPlanStepBlock": "Continue in your current block",
|
||||
"courseTodayPlanStepIntensive": "Intensive review",
|
||||
|
||||
@@ -668,8 +668,18 @@
|
||||
"courseFlowEyebrow": "Flujo del día",
|
||||
"courseFlowTitle": "La mejor continuación para hoy",
|
||||
"courseFlowIntro": "Primero la sugerencia del día con orden concreto. Debajo, las cuatro zonas: repaso breve pendiente, bloque actual, fase intensiva, práctica libre.",
|
||||
"quickReviewTitle": "Repaso breve",
|
||||
"quickReviewIntro": "Sesión corta con {count} términos. Al terminar, el repaso programado se marca como completado.",
|
||||
"quickReviewDoneTitle": "Completado",
|
||||
"quickReviewDoneScore": "Correctas: {correct} / {total}",
|
||||
"quickReviewBackToCourse": "Volver al curso",
|
||||
"quickReviewProgress": "Término {current} de {total}",
|
||||
"quickReviewPromptMeaning": "¿Qué significa \"{term}\"?",
|
||||
"quickReviewPromptTarget": "Escribe en la lengua meta: \"{term}\"",
|
||||
"quickReviewAcknowledge": "Leído, continuar",
|
||||
"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.",
|
||||
"courseTodayPlanIntroNoDueReview": "Hoy no hay repaso breve pendiente. Empieza con las lecciones abiertas de tu bloque actual y luego haz la fase intensiva si aparece. Los repasos breves vuelven automáticamente con el ritmo de 1/3/7 días.",
|
||||
"courseTodayPlanStepReviewDue": "Repaso breve ahora",
|
||||
"courseTodayPlanStepBlock": "Seguir en el bloque actual",
|
||||
"courseTodayPlanStepIntensive": "Repaso intensivo",
|
||||
|
||||
@@ -53,7 +53,11 @@
|
||||
|
||||
<div v-if="todayRecommendedSteps.length > 0" class="course-today-plan">
|
||||
<h4 class="course-today-plan__title">{{ $t('socialnetwork.vocab.courses.courseTodayPlanTitle') }}</h4>
|
||||
<p class="course-today-plan__intro">{{ $t('socialnetwork.vocab.courses.courseTodayPlanIntro') }}</p>
|
||||
<p class="course-today-plan__intro">
|
||||
{{ dueReviewLessons.length > 0
|
||||
? $t('socialnetwork.vocab.courses.courseTodayPlanIntro')
|
||||
: $t('socialnetwork.vocab.courses.courseTodayPlanIntroNoDueReview') }}
|
||||
</p>
|
||||
<ol class="course-today-plan__list">
|
||||
<li v-for="(step, idx) in todayRecommendedSteps" :key="`${step.type}-${step.lesson.id}-${idx}`" class="course-today-plan__item">
|
||||
<div class="course-today-plan__item-main">
|
||||
@@ -73,7 +77,7 @@
|
||||
</div>
|
||||
|
||||
<div class="course-flow__grid">
|
||||
<article class="course-flow-card">
|
||||
<article v-if="dueReviewLessons.length > 0" class="course-flow-card">
|
||||
<div class="course-flow-card__top">
|
||||
<span class="course-flow-card__badge course-flow-card__badge--review">1</span>
|
||||
<div>
|
||||
@@ -93,12 +97,11 @@
|
||||
<span>{{ formatReviewDue(getLessonProgress(lesson.id, lesson)?.reviewNextDueAt) }}</span>
|
||||
</button>
|
||||
</div>
|
||||
<p v-else class="course-flow-card__empty">{{ $t('socialnetwork.vocab.courses.courseFlowReviewEmpty') }}</p>
|
||||
</article>
|
||||
|
||||
<article class="course-flow-card">
|
||||
<div class="course-flow-card__top">
|
||||
<span class="course-flow-card__badge course-flow-card__badge--block">2</span>
|
||||
<span class="course-flow-card__badge course-flow-card__badge--block">{{ dueReviewLessons.length > 0 ? 2 : 1 }}</span>
|
||||
<div>
|
||||
<h4>{{ $t('socialnetwork.vocab.courses.courseFlowBlockTitle') }}</h4>
|
||||
<p>{{ $t('socialnetwork.vocab.courses.courseFlowBlockDescription') }}</p>
|
||||
@@ -121,7 +124,7 @@
|
||||
|
||||
<article class="course-flow-card">
|
||||
<div class="course-flow-card__top">
|
||||
<span class="course-flow-card__badge course-flow-card__badge--intensive">3</span>
|
||||
<span class="course-flow-card__badge course-flow-card__badge--intensive">{{ dueReviewLessons.length > 0 ? 3 : 2 }}</span>
|
||||
<div>
|
||||
<h4>{{ $t('socialnetwork.vocab.courses.courseFlowIntensiveTitle') }}</h4>
|
||||
<p>{{ $t('socialnetwork.vocab.courses.courseFlowIntensiveDescription') }}</p>
|
||||
@@ -142,7 +145,7 @@
|
||||
|
||||
<article class="course-flow-card">
|
||||
<div class="course-flow-card__top">
|
||||
<span class="course-flow-card__badge course-flow-card__badge--practice">4</span>
|
||||
<span class="course-flow-card__badge course-flow-card__badge--practice">{{ dueReviewLessons.length > 0 ? 4 : 3 }}</span>
|
||||
<div>
|
||||
<h4>{{ $t('socialnetwork.vocab.courses.courseFlowPracticeTitle') }}</h4>
|
||||
<p>{{ $t('socialnetwork.vocab.courses.courseFlowPracticeDescription') }}</p>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<section class="surface-card review-header">
|
||||
<button type="button" class="button-secondary" @click="backToCourse">{{ $t('general.back') }}</button>
|
||||
<div>
|
||||
<h2>Kurz-Wiederholung</h2>
|
||||
<h2>{{ $t('socialnetwork.vocab.courses.quickReviewTitle') }}</h2>
|
||||
<p v-if="lesson">{{ lesson.title }} (#{{ lesson.lessonNumber }})</p>
|
||||
</div>
|
||||
</section>
|
||||
@@ -12,17 +12,17 @@
|
||||
<section v-else-if="!lesson" class="surface-card review-state">{{ $t('socialnetwork.vocab.notFound') }}</section>
|
||||
<section v-else class="surface-card review-body">
|
||||
<p class="review-intro">
|
||||
Kurze Session mit {{ reviewQueue.length }} Begriffen. Nach Abschluss wird die geplante Wiederholung als erledigt markiert.
|
||||
{{ $t('socialnetwork.vocab.courses.quickReviewIntro', { count: reviewQueue.length }) }}
|
||||
</p>
|
||||
|
||||
<div v-if="reviewDone" class="review-done">
|
||||
<h3>Geschafft</h3>
|
||||
<p>Richtig: {{ correctCount }} / {{ reviewQueue.length }}</p>
|
||||
<button type="button" @click="backToCourse">Zurück zum Kurs</button>
|
||||
<h3>{{ $t('socialnetwork.vocab.courses.quickReviewDoneTitle') }}</h3>
|
||||
<p>{{ $t('socialnetwork.vocab.courses.quickReviewDoneScore', { correct: correctCount, total: reviewQueue.length }) }}</p>
|
||||
<button type="button" @click="backToCourse">{{ $t('socialnetwork.vocab.courses.quickReviewBackToCourse') }}</button>
|
||||
</div>
|
||||
|
||||
<div v-else-if="currentItem" class="review-card">
|
||||
<p class="review-progress">Begriff {{ currentIndex + 1 }} von {{ reviewQueue.length }}</p>
|
||||
<p class="review-progress">{{ $t('socialnetwork.vocab.courses.quickReviewProgress', { current: currentIndex + 1, total: reviewQueue.length }) }}</p>
|
||||
<p class="review-question">{{ currentPrompt }}</p>
|
||||
|
||||
<div v-if="mode === 'multiple_choice'" class="review-options">
|
||||
@@ -55,7 +55,7 @@
|
||||
class="button-secondary"
|
||||
@click="advanceAfterFeedback"
|
||||
>
|
||||
Gelesen, weiter
|
||||
{{ $t('socialnetwork.vocab.courses.quickReviewAcknowledge') }}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@@ -101,8 +101,8 @@ export default {
|
||||
currentPrompt() {
|
||||
if (!this.currentItem) return '';
|
||||
return this.mode === 'multiple_choice'
|
||||
? `Was bedeutet "${this.currentItem.target}"?`
|
||||
: `Tippe auf Zielsprache: "${this.currentItem.gloss}"`;
|
||||
? this.$t('socialnetwork.vocab.courses.quickReviewPromptMeaning', { term: this.currentItem.target })
|
||||
: this.$t('socialnetwork.vocab.courses.quickReviewPromptTarget', { term: this.currentItem.gloss });
|
||||
},
|
||||
submitDisabled() {
|
||||
if (!this.currentItem) return true;
|
||||
|
||||
Reference in New Issue
Block a user