feat(app): learning paths in the studyset screen: worked through and written

- A Paths tab before Flashcards and Notes: each path with its title and
  secondary title, dimmed once completed; Edit, Reset progress (with an
  undo) and Delete (with an undo) behind its options. The studyset opens
  on its paths while one is unfinished, on its flashcards otherwise.
- "Create a path" in Add material asks for the titles in a sheet and
  opens the new path to write; "Import a path (JSON)" reads a file in
  the import format, says what came in and how many blocks were left out
  (images and animations: the app never fetches from the web).
- The player: one step at a time at reading width, a bar of the steps
  above, Back and "Check answers" / "Continue" / "Finish" below. It
  opens at the first unfinished step; an exercise passes only once
  answered right, as often as it takes; after a check, only the
  learner's own picks are marked, with the author's feedback; sources
  behind a chip; a finish screen leading to the next path. Words and
  items are dragged into place, or tapped into place for phones.
- Writing: the path's screen (titles, description, tags, steps added by
  kind, reordered, deleted with an undo) and the step's (title, text
  with the format bar, its kind's exercise, feedback for right and
  wrong in the whole window, sources). The step saves on what it
  started from, as notes do, read-only while devices disagree until a
  version is kept.
- The library and the topics count paths; steps done count on the
  dashboard, for the streak and the activity.
- The rich-text screen for a studyset's description moves to core, for
  the steps' feedback too, and gains the format bar.

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-03 09:25:08 +02:00
commit e4bfe3bdeb
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -64,6 +64,118 @@
"studysetMenuMove": "Move to…",
"studysetTabFlashcards": "Flashcards",
"studysetTabNotes": "Notes",
"studysetTabPaths": "Paths",
"studysetCreatePath": "Create a path",
"pathImportMenu": "Import a path (JSON)",
"pathImportFileType": "Learning path (JSON)",
"pathImported": "{count, plural, =1{Imported \"{title}\" with 1 step.} other{Imported \"{title}\" with {count} steps.}}",
"@pathImported": {"placeholders": {"title": {"type": "String"}, "count": {"type": "int"}}},
"pathImportSkipped": "{count, plural, =1{1 block was left out: images and animations aren't imported.} other{{count} blocks were left out: images and animations aren't imported.}}",
"@pathImportSkipped": {"placeholders": {"count": {"type": "int"}}},
"pathImportFailed": "Couldn't import this file. {reason}",
"@pathImportFailed": {"placeholders": {"reason": {"type": "String"}}},
"pathImportUnreadable": "It isn't text in UTF-8.",
"pathsEmpty": "No paths yet",
"pathsEmptyHint": "A path leads through a lesson, step by step.",
"pathOptions": "Path options",
"pathEdit": "Edit",
"pathResetProgress": "Reset progress",
"pathProgressReset": "Progress reset",
"pathDelete": "Delete",
"pathDeleteTitle": "Delete path?",
"pathDeleteMessage": "This path and its steps will be removed from the studyset. You can undo this for a few seconds.",
"pathDeleteConfirm": "Delete",
"pathDeleted": "Path deleted",
"pathCreateTitle": "New path",
"pathCreate": "Create",
"pathTitleLabel": "Title",
"pathTitleRequired": "A path needs a title.",
"pathSecondaryTitleLabel": "Secondary title",
"pathSecondaryTitleHint": "E.g. the title in the language you learn",
"pathEditTitle": "Edit path",
"pathDescription": "Description",
"pathAddDescription": "Add a description",
"pathDescriptionEditTitle": "Path description",
"pathAddTags": "Add tags",
"pathTags": "Tags",
"pathSteps": "Steps",
"pathStepsEmpty": "No steps yet",
"pathStepsEmptyHint": "Pick a step type to start writing the lesson.",
"pathAddStep": "Add step",
"pathReorder": "Reorder",
"pathReorderDone": "Done",
"pathStepDelete": "Delete step",
"pathStepDeleted": "Step deleted",
"stepUntitled": "Untitled step",
"stepKindInfo": "Info",
"stepKindSingleChoice": "Single choice",
"stepKindMultipleChoice": "Multiple choice",
"stepKindDragAndDrop": "Drag and drop",
"stepKindFillInTheBlank": "Fill in the blank",
"stepEditTitle": "Edit step",
"stepTitleHint": "Title",
"stepOptions": "Options",
"stepOptionHint": "Option {number}",
"@stepOptionHint": {"placeholders": {"number": {"type": "int"}}},
"stepAddOption": "Add option",
"stepRemoveOption": "Remove option",
"stepCorrectOption": "The right one",
"stepCorrectOptions": "Right ones",
"stepCategories": "Categories",
"stepCategoryHint": "Category {number}",
"@stepCategoryHint": {"placeholders": {"number": {"type": "int"}}},
"stepAddCategory": "Add category",
"stepRemoveCategory": "Remove category",
"stepItems": "Items",
"stepItemHint": "Item {number}",
"@stepItemHint": {"placeholders": {"number": {"type": "int"}}},
"stepAddItem": "Add item",
"stepRemoveItem": "Remove item",
"stepItemCategory": "Belongs to",
"stepPassage": "Passage",
"stepPassageHint": "Type ___ (three underscores) wherever a word should be dropped in.",
"stepBlankHint": "Word for gap {number}",
"@stepBlankHint": {"placeholders": {"number": {"type": "int"}}},
"stepIncomplete": "Not ready to answer yet: fill in every field and choose what is right.",
"stepFeedbackRight": "Feedback after a right answer",
"stepFeedbackWrong": "Feedback after a wrong answer",
"stepFeedbackNone": "None",
"stepSources": "Sources",
"stepAddSource": "Add source",
"stepRemoveSource": "Remove source",
"stepSourceAuthors": "Authors",
"stepSourceYear": "Year",
"stepSourceTitle": "Title",
"stepSourceUrl": "Link",
"stepSourcesCount": "{count, plural, =1{1 source} other{{count} sources}}",
"@stepSourcesCount": {"placeholders": {"count": {"type": "int"}}},
"stepConflict": "This step was changed differently on another device. Keep one version to go on writing.",
"stepFieldTitle": "Title",
"stepFieldBody": "Text",
"stepFieldExercise": "Exercise",
"stepFieldRightFeedback": "Feedback after a right answer",
"stepFieldWrongFeedback": "Feedback after a wrong answer",
"stepFieldSources": "Sources",
"runnerClose": "Close",
"runnerEditStep": "Edit step",
"runnerBack": "Back",
"runnerCheck": "Check answers",
"runnerContinue": "Continue",
"runnerFinish": "Finish",
"runnerRight": "Correct!",
"runnerWrong": "Not quite",
"runnerAlreadyRight": "You already answered this correctly.",
"runnerSelectAll": "Select all that apply.",
"runnerDragHint": "Drag each item into the category it belongs to, or tap it and then the category. Tap a placed item to take it back.",
"runnerBlankHint": "Drag a word into each gap, or tap it and then the gap. Tap a placed word to take it back.",
"runnerEmpty": "This path has no steps yet.",
"runnerFinished": "You finished this path",
"runnerFinishedSteps": "{count, plural, =1{1 step complete.} other{{count} steps complete.}}",
"@runnerFinishedSteps": {"placeholders": {"count": {"type": "int"}}},
"runnerNextPath": "Continue to next path",
"runnerBackToStudyset": "Back to studyset",
"studysetCountPaths": "{count, plural, =1{1 path} other{{count} paths}}",
"@studysetCountPaths": {"placeholders": {"count": {"type": "int"}}},
"studysetCreateNote": "Create a note",
"notesEmpty": "No notes yet",
"notesEmptyHint": "Notes will appear here when you add them.",
@ -126,7 +238,7 @@
"studysetReadMore": "Read more",
"studysetDescriptionTitle": "Description",
"studysetDescriptionEditTitle": "Edit description",
"studysetDescriptionSave": "Save",
"richTextSave": "Save",
"studysetSheetDescription": "Description",
"studysetSheetDescriptionAdd": "Add a description",
"studysetSheetInheritColor": "Same color as the studyset it is in",