feat(app): study sessions in rounds, by card type, cramming and reversed

A session studies a round of up to the settings' cards per round. In
spaced repetition a card leaves the round once it is a day or more away,
one rated lower comes back when due; cramming walks every card once,
round after round, its reviews moving no schedule, with going back and
on. Asking the back first (a toggle in the header, saved in the
settings) asks front/back and vocabulary cards their back, on their own
schedule. Each type studies its way: a word shows its reading and
meanings, a multiple-choice card is picked and checked, a matching card
sorted by dragging or tapping and checked; then the person rates (Bad,
OK, Good, Perfect, each with when the card comes back). Progress shows
as pills, or a tally bar while cramming; a round ends with how it went.
The session settings gain the mode, cards per round, new cards per day
and the order.

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-01 19:29:21 +02:00
commit 46855ab251
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -1414,6 +1414,252 @@ abstract class AppLocalizations {
/// **'Changed on two devices'**
String get cardTileConflict;
/// No description provided for @studyClose.
///
/// In en, this message translates to:
/// **'Close session'**
String get studyClose;
/// No description provided for @studyBackFirstOn.
///
/// In en, this message translates to:
/// **'Showing the back of cards first: tap to revert'**
String get studyBackFirstOn;
/// No description provided for @studyBackFirstOff.
///
/// In en, this message translates to:
/// **'Show the back of cards first'**
String get studyBackFirstOff;
/// No description provided for @studyShowAnswer.
///
/// In en, this message translates to:
/// **'Show answer'**
String get studyShowAnswer;
/// No description provided for @studyCheck.
///
/// In en, this message translates to:
/// **'Check'**
String get studyCheck;
/// No description provided for @studyRatingBad.
///
/// In en, this message translates to:
/// **'Bad'**
String get studyRatingBad;
/// No description provided for @studyRatingOk.
///
/// In en, this message translates to:
/// **'OK'**
String get studyRatingOk;
/// No description provided for @studyRatingGood.
///
/// In en, this message translates to:
/// **'Good'**
String get studyRatingGood;
/// No description provided for @studyRatingPerfect.
///
/// In en, this message translates to:
/// **'Perfect'**
String get studyRatingPerfect;
/// No description provided for @studyNothingTitle.
///
/// In en, this message translates to:
/// **'Nothing to study right now'**
String get studyNothingTitle;
/// No description provided for @studyNothingBody.
///
/// In en, this message translates to:
/// **'Come back later when more cards are due.'**
String get studyNothingBody;
/// No description provided for @studyNextDue.
///
/// In en, this message translates to:
/// **'The next card is due in {interval}.'**
String studyNextDue(String interval);
/// No description provided for @studyDone.
///
/// In en, this message translates to:
/// **'Done'**
String get studyDone;
/// No description provided for @studyRoundDone.
///
/// In en, this message translates to:
/// **'Round complete'**
String get studyRoundDone;
/// No description provided for @studyContinue.
///
/// In en, this message translates to:
/// **'Continue learning'**
String get studyContinue;
/// No description provided for @studyPrevious.
///
/// In en, this message translates to:
/// **'Previous card'**
String get studyPrevious;
/// No description provided for @studyNext.
///
/// In en, this message translates to:
/// **'Next card'**
String get studyNext;
/// No description provided for @studyReading.
///
/// In en, this message translates to:
/// **'Reading'**
String get studyReading;
/// No description provided for @studyMeanings.
///
/// In en, this message translates to:
/// **'Meanings'**
String get studyMeanings;
/// No description provided for @studyPlaceItems.
///
/// In en, this message translates to:
/// **'Drag each item onto its category, or tap an item and then a category.'**
String get studyPlaceItems;
/// No description provided for @studyMinutes.
///
/// In en, this message translates to:
/// **'{count} min'**
String studyMinutes(int count);
/// No description provided for @studyHours.
///
/// In en, this message translates to:
/// **'{count} h'**
String studyHours(int count);
/// No description provided for @studyDays.
///
/// In en, this message translates to:
/// **'{count, plural, =1{1 day} other{{count} days}}'**
String studyDays(int count);
/// No description provided for @studyMonths.
///
/// In en, this message translates to:
/// **'{count, plural, =1{1 month} other{{count} months}}'**
String studyMonths(int count);
/// No description provided for @studyYears.
///
/// In en, this message translates to:
/// **'{count, plural, =1{1 year} other{{count} years}}'**
String studyYears(int count);
/// No description provided for @studyFilteredBy.
///
/// In en, this message translates to:
/// **'{count, plural, =1{Narrowed to 1 tag} other{Narrowed to {count} tags}}'**
String studyFilteredBy(int count);
/// No description provided for @studySettingsCardsPerRound.
///
/// In en, this message translates to:
/// **'Cards per round'**
String get studySettingsCardsPerRound;
/// No description provided for @studySettingsNewPerDay.
///
/// In en, this message translates to:
/// **'New cards per day'**
String get studySettingsNewPerDay;
/// No description provided for @studySettingsNewPerDayHint.
///
/// In en, this message translates to:
/// **'How many never-studied cards each studyset starts a day. Due reviews are never limited.'**
String get studySettingsNewPerDayHint;
/// No description provided for @studySettingsUnlimited.
///
/// In en, this message translates to:
/// **'Unlimited'**
String get studySettingsUnlimited;
/// No description provided for @studySettingsSortBy.
///
/// In en, this message translates to:
/// **'Sort by'**
String get studySettingsSortBy;
/// No description provided for @studySettingsLearnMode.
///
/// In en, this message translates to:
/// **'Learn mode'**
String get studySettingsLearnMode;
/// No description provided for @studyModeSpaced.
///
/// In en, this message translates to:
/// **'Spaced repetition'**
String get studyModeSpaced;
/// No description provided for @studyModeSpacedHint.
///
/// In en, this message translates to:
/// **'Due cards on their schedules; ratings move them.'**
String get studyModeSpacedHint;
/// No description provided for @studyModeCram.
///
/// In en, this message translates to:
/// **'Cram'**
String get studyModeCram;
/// No description provided for @studyModeCramHint.
///
/// In en, this message translates to:
/// **'Walk every card without touching the schedules.'**
String get studyModeCramHint;
/// No description provided for @studySortOldestFirst.
///
/// In en, this message translates to:
/// **'Oldest first'**
String get studySortOldestFirst;
/// No description provided for @studySortRandom.
///
/// In en, this message translates to:
/// **'Random'**
String get studySortRandom;
/// No description provided for @studySortNewestFirst.
///
/// In en, this message translates to:
/// **'Newest first'**
String get studySortNewestFirst;
/// No description provided for @studyFewer.
///
/// In en, this message translates to:
/// **'Fewer'**
String get studyFewer;
/// No description provided for @studyMore.
///
/// In en, this message translates to:
/// **'More'**
String get studyMore;
/// No description provided for @commonCancel.
///
/// In en, this message translates to: