feat(vocab): refine vocabulary label logic in VocabLessonView
All checks were successful
Deploy to production / deploy (push) Successful in 2m48s

- Introduced computed properties for current vocabulary preparation labels, enhancing clarity and localization.
- Updated label handling to dynamically adjust based on the context of target and gloss items, improving user experience.
- Enhanced the logic for determining when to swap labels, ensuring accurate representation of vocabulary items for better learning outcomes.
This commit is contained in:
Torsten Schulz (local)
2026-04-07 10:22:36 +02:00
parent 8f6f06caf0
commit e649236e39

View File

@@ -126,11 +126,11 @@
</p> </p>
<div class="vocab-prep-card"> <div class="vocab-prep-card">
<div class="vocab-prep-card__row"> <div class="vocab-prep-card__row">
<span class="vocab-prep-card__label">{{ prepTargetLabel }}</span> <span class="vocab-prep-card__label">{{ currentPrepTopLabel }}</span>
<div class="vocab-prep-card__target">{{ currentPrepItem.target }}</div> <div class="vocab-prep-card__target">{{ currentPrepItem.target }}</div>
</div> </div>
<div class="vocab-prep-card__row"> <div class="vocab-prep-card__row">
<span class="vocab-prep-card__label">{{ prepGlossLabel }}</span> <span class="vocab-prep-card__label">{{ currentPrepBottomLabel }}</span>
<div class="vocab-prep-card__gloss">{{ currentPrepItem.gloss || '—' }}</div> <div class="vocab-prep-card__gloss">{{ currentPrepItem.gloss || '—' }}</div>
</div> </div>
</div> </div>
@@ -1309,6 +1309,12 @@ export default {
|| this.$t('socialnetwork.vocab.courses.vocabPrepGlossLabel') || this.$t('socialnetwork.vocab.courses.vocabPrepGlossLabel')
).toUpperCase(); ).toUpperCase();
}, },
currentPrepTopLabel() {
return this._prepRowLabelFor('target');
},
currentPrepBottomLabel() {
return this._prepRowLabelFor('gloss');
},
prepItems() { prepItems() {
// Vorbereitung nur mit echten Paaren (Zielsprache + Übersetzung), // Vorbereitung nur mit echten Paaren (Zielsprache + Übersetzung),
// damit weder leere Gloss-Zeilen noch übergroße Listen entstehen. // damit weder leere Gloss-Zeilen noch übergroße Listen entstehen.
@@ -1812,6 +1818,33 @@ export default {
} }
return { target: s, gloss: '' }; return { target: s, gloss: '' };
}, },
_prepRowLabelFor(side = 'target') {
const item = this.currentPrepItem;
if (!item) {
return side === 'target' ? this.prepTargetLabel : this.prepGlossLabel;
}
const nativeHints = new Set(
(this.importantVocab || [])
.map((x) => this.normalizeLessonVocabTerm(x?.learning))
.filter(Boolean)
);
const targetHints = new Set(
(this.importantVocab || [])
.map((x) => this.normalizeLessonVocabTerm(x?.reference))
.filter(Boolean)
);
const targetNorm = this.normalizeLessonVocabTerm(item.target);
const glossNorm = this.normalizeLessonVocabTerm(item.gloss);
const targetLooksNative = nativeHints.has(targetNorm) && !targetHints.has(targetNorm);
const glossLooksTarget = targetHints.has(glossNorm) && !nativeHints.has(glossNorm);
const targetLooksTarget = targetHints.has(targetNorm) && !nativeHints.has(targetNorm);
const glossLooksNative = nativeHints.has(glossNorm) && !targetHints.has(glossNorm);
const shouldSwapLabels = targetLooksNative && glossLooksTarget && !(targetLooksTarget && glossLooksNative);
if (shouldSwapLabels) {
return side === 'target' ? this.prepGlossLabel : this.prepTargetLabel;
}
return side === 'target' ? this.prepTargetLabel : this.prepGlossLabel;
},
corePatternToDisplayString(p) { corePatternToDisplayString(p) {
const n = this.normalizeCorePatternEntry(p); const n = this.normalizeCorePatternEntry(p);
if (!n) return ''; if (!n) return '';