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

@ -1787,6 +1787,36 @@
"planStepsDone": "{total, plural, =1{{done} von 1 Schritt} other{{done} von {total} Schritten}}",
"planNothing": "Gerade steht nichts an.",
"planLearningPaths": "Lernpfade",
"examPrepare": "Auf eine Prüfung vorbereiten",
"examPrepareHint": "Wähle, was sie abdeckt und wann sie ist, und bekomme ein Tempo, das dich hinbringt.",
"examChange": "Prüfung ändern",
"examDaysLeft": "{count, plural, =0{Heute, {date}} =1{Morgen, {date}} other{In {count} Tagen, {date}}}",
"examPast": "Sie war am {date}",
"examPlanGone": "Diesen Prüfungsplan gibt es nicht mehr",
"examCardsStarted": "{total, plural, =1{{started} von 1 Karteikarte begonnen} other{{started} von {total} Karteikarten begonnen}}",
"examPagesRead": "{total, plural, =1{{read} von 1 Seite gelesen} other{{read} von {total} Seiten gelesen}}",
"examPaceTitle": "Dein Tempo",
"examPaceNew": "{count, plural, =1{1 neue Karteikarte am Tag} other{{count} neue Karteikarten am Tag}}",
"examPaceSteps": "{count, plural, =1{1 Schritt pro Woche} other{{count} Schritte pro Woche}}",
"examPacePages": "{count, plural, =1{1 Seite am Tag} other{{count} Seiten am Tag}}",
"examPaceDone": "Alles Neue ist gelernt: bis zur Prüfung wiederholen.",
"examStudy": "Für die Prüfung lernen",
"examSheetHelp": "Wähle, was die Prüfung abdeckt und wann sie ist. Alles Neue wird dann so verteilt, dass es eine Woche vorher gelernt ist und die letzte Woche zum Wiederholen bleibt. Das Datum siehst nur du.",
"examDate": "Prüfungsdatum",
"examSheetPlans": "Prüfungspläne dieses Lernsets",
"examSheetFromTags": "Aus den Stufen-Tags",
"examSheetNoPlans": "Noch keine Prüfungspläne. Erstelle einen aus den Themen und Tags dieses Lernsets.",
"examRemove": "Nicht mehr vorbereiten",
"examPlanTopicCount": "{count, plural, =1{1 Thema} other{{count} Themen}}",
"examPlanNew": "Neuer Prüfungsplan",
"examPlanEdit": "Prüfungsplan bearbeiten",
"examPlanHelp": "Ein Prüfungsplan nennt, was eine Prüfung abdeckt: ganze Themen mit ihren Karteikarten, Lernpfaden und PDFs, und Karteikarten mit bestimmten Tags. Er wird mit dem Lernset veröffentlicht.",
"examPlanName": "Name",
"examPlanNameHint": "z. B. Abschlussprüfung",
"examPlanTopics": "Themen, die sie ganz abdeckt",
"examPlanTags": "Karteikarten mit diesen Tags",
"examPlanEmpty": "Dieses Lernset hat noch keine Themen oder Karteikarten mit Tags zur Auswahl.",
"examPlanDelete": "Plan löschen",
"jellyfinTitle": "Jellyfin",
"jellyfinSubtitle": "Schau Serien und Filme und hör Musik von deinem eigenen Jellyfin-Server und lerne die Wörter ihrer Untertitel und Liedtexte. Angemeldet bietet „Material hinzufügen“ eines Lernsets „Aus Jellyfin“ an.",
"jellyfinPrivacy": "Die Adresse deines Servers und deine Anmeldung bleiben auf diesem Gerät, und was du mit einem Lernset verbindest, folgt dir als IDs, nie als Titel. Um die Wörter einer Zeile zu finden, fragt die App die Instanz nach ihrem Text; sie antwortet und speichert ihn nicht. Wörter, die du hinzufügst, bekommen Tags, wo du ihnen begegnet bist, gespeichert mit deinen Karteikarten wie jeder Tag.",