feat(studyset): prepare for an exam, with plans, a date and the pace to it

A studyset plans for exams: each plan names what an exam covers, the
topics it takes whole (with their flashcards, learning paths and PDFs)
and the tags whose flashcards it takes from anywhere in the studyset.
The author's plans are published with the studyset (payload schema 7,
`examPlans`); copying a release and taking a newer one point their
topics at the copy's own studysets. Plans are also offered from level
tags: JLPT N5 to N1, HSK 1 to 7-9 and KRDict's levels, each taking the
levels below it, as the exams do.

The person chooses a plan and the exam's day (`exam`), which stays
theirs: the server leaves it out of a release, as a PDF's deadline.
The study plan then shows the days left, how many of the plan's
flashcards were started, its paths' steps done and its PDFs' pages
read, and the pace that gets everything new learnt a week before the
exam (by the exam when two weeks or fewer are left): new flashcards a
day, steps a week, pages a day. Study for the exam studies only what
the plan covers, its new cards at that pace (counted as the day began)
and every review due.

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-14 14:26:08 +02:00
commit dd6c567ad0
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -2111,6 +2111,44 @@
"@planStepsDone": {"placeholders": {"done": {"type": "int"}, "total": {"type": "int"}}},
"planNothing": "Nothing due right now.",
"planLearningPaths": "Learning paths",
"examPrepare": "Prepare for an exam",
"examPrepareHint": "Choose what it covers and its date, and get a pace that gets you there.",
"examChange": "Change the exam",
"examDaysLeft": "{count, plural, =0{Today, {date}} =1{Tomorrow, {date}} other{In {count} days, {date}}}",
"@examDaysLeft": {"placeholders": {"count": {"type": "int"}, "date": {"type": "String"}}},
"examPast": "It was on {date}",
"@examPast": {"placeholders": {"date": {"type": "String"}}},
"examPlanGone": "This exam plan is gone",
"examCardsStarted": "{total, plural, =1{{started} of 1 flashcard started} other{{started} of {total} flashcards started}}",
"@examCardsStarted": {"placeholders": {"started": {"type": "int"}, "total": {"type": "int"}}},
"examPagesRead": "{total, plural, =1{{read} of 1 page read} other{{read} of {total} pages read}}",
"@examPagesRead": {"placeholders": {"read": {"type": "int"}, "total": {"type": "int"}}},
"examPaceTitle": "Your pace",
"examPaceNew": "{count, plural, =1{1 new flashcard a day} other{{count} new flashcards a day}}",
"@examPaceNew": {"placeholders": {"count": {"type": "int"}}},
"examPaceSteps": "{count, plural, =1{1 step a week} other{{count} steps a week}}",
"@examPaceSteps": {"placeholders": {"count": {"type": "int"}}},
"examPacePages": "{count, plural, =1{1 page a day} other{{count} pages a day}}",
"@examPacePages": {"placeholders": {"count": {"type": "int"}}},
"examPaceDone": "Everything new is learnt: review until the exam.",
"examStudy": "Study for the exam",
"examSheetHelp": "Choose what the exam covers and when it is. Everything new is then spread so that it is learnt a week before, leaving the last week for reviews. Only you see the date.",
"examDate": "Exam date",
"examSheetPlans": "This studyset’s exam plans",
"examSheetFromTags": "From the level tags",
"examSheetNoPlans": "No exam plans yet. Make one from this studyset’s topics and tags.",
"examRemove": "Stop preparing",
"examPlanTopicCount": "{count, plural, =1{1 topic} other{{count} topics}}",
"@examPlanTopicCount": {"placeholders": {"count": {"type": "int"}}},
"examPlanNew": "New exam plan",
"examPlanEdit": "Edit exam plan",
"examPlanHelp": "An exam plan names what an exam covers: whole topics, with their flashcards, learning paths and PDFs, and flashcards with certain tags. It is published with the studyset.",
"examPlanName": "Name",
"examPlanNameHint": "e.g. Final exam",
"examPlanTopics": "Topics it covers whole",
"examPlanTags": "Flashcards with these tags",
"examPlanEmpty": "This studyset has no topics or tagged flashcards to choose from yet.",
"examPlanDelete": "Delete plan",
"jellyfinTitle": "Jellyfin",
"jellyfinSubtitle": "Watch shows and films and listen to music from your own Jellyfin server, and learn the words of their subtitles and lyrics. Signed in, a studyset's Add material offers From Jellyfin.",
"jellyfinPrivacy": "Your server's address and your sign-in stay on this device, and what you tie to a studyset follows you as ids, never titles. To find the words of a line, the app asks the instance about its text, which it answers and doesn't keep. Words you add are tagged with where you met them, kept with your flashcards like any tag.",