feat(jellyfin): the words' panel unfolds senses, shows progress, filters

The panel beside the video lists each entry's senses one to a line, as
Jisho does (and as every dictionary list in the app now does), folded
to two lines; an entry unfolds over the list, not in it, after a moment
under the pointer or on a tap, in the video's colour, so nothing moves
under the pointer and words of many senses (上げる has 25) crowd out
nothing. Each entry links to the word on Jisho.org, opened only when
tapped. A word the studyset holds shows how far its card is learnt:
New, Learning, Due, or Learned with when it comes again. The video's
words go through a filter in place of New only: new to the studyset,
held or all, JLPT levels, and word classes. The dictionary's sources
stay in the panel's lower right corner, and the player's controls hide
after 2 seconds rather than 3.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-13 18:43:06 +02:00
commit fbe53c3441
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -10593,6 +10593,114 @@ abstract class AppLocalizations {
/// **'End'**
String get watchKeyEnd;
/// No description provided for @watchProgressNew.
///
/// In en, this message translates to:
/// **'New'**
String get watchProgressNew;
/// No description provided for @watchProgressLearning.
///
/// In en, this message translates to:
/// **'Learning'**
String get watchProgressLearning;
/// No description provided for @watchProgressDue.
///
/// In en, this message translates to:
/// **'Due'**
String get watchProgressDue;
/// No description provided for @watchProgressLearned.
///
/// In en, this message translates to:
/// **'Learned · {days, plural, =0{again today} =1{again tomorrow} other{again in {days} days}}'**
String watchProgressLearned(int days);
/// No description provided for @watchJisho.
///
/// In en, this message translates to:
/// **'Look up on Jisho'**
String get watchJisho;
/// No description provided for @watchFilter.
///
/// In en, this message translates to:
/// **'Filter the words'**
String get watchFilter;
/// No description provided for @watchFilterFresh.
///
/// In en, this message translates to:
/// **'New words'**
String get watchFilterFresh;
/// No description provided for @watchFilterHeld.
///
/// In en, this message translates to:
/// **'Words in the studyset'**
String get watchFilterHeld;
/// No description provided for @watchFilterAll.
///
/// In en, this message translates to:
/// **'All words'**
String get watchFilterAll;
/// No description provided for @watchFilterNoLevel.
///
/// In en, this message translates to:
/// **'No JLPT level'**
String get watchFilterNoLevel;
/// No description provided for @watchFilterClass.
///
/// In en, this message translates to:
/// **'Word class'**
String get watchFilterClass;
/// No description provided for @watchFilterEmpty.
///
/// In en, this message translates to:
/// **'No words of this video match the filter.'**
String get watchFilterEmpty;
/// No description provided for @watchClassNoun.
///
/// In en, this message translates to:
/// **'Nouns'**
String get watchClassNoun;
/// No description provided for @watchClassVerb.
///
/// In en, this message translates to:
/// **'Verbs'**
String get watchClassVerb;
/// No description provided for @watchClassAdjective.
///
/// In en, this message translates to:
/// **'Adjectives'**
String get watchClassAdjective;
/// No description provided for @watchClassAdverb.
///
/// In en, this message translates to:
/// **'Adverbs'**
String get watchClassAdverb;
/// No description provided for @watchClassExpression.
///
/// In en, this message translates to:
/// **'Expressions'**
String get watchClassExpression;
/// No description provided for @watchClassOther.
///
/// In en, this message translates to:
/// **'Others'**
String get watchClassOther;
/// No description provided for @watchNone.
///
/// In en, this message translates to:
@ -10635,12 +10743,6 @@ abstract class AppLocalizations {
/// **'Words in this video'**
String get watchWordsTitle;
/// No description provided for @watchWordsNewOnly.
///
/// In en, this message translates to:
/// **'New only'**
String get watchWordsNewOnly;
/// No description provided for @watchWordsFinding.
///
/// In en, this message translates to: