feat(app): cite sources in APA, MLA or Chicago, and give studysets a bibliography

A source is now shared by learning paths and studysets (core/citation/):
authors as full names, year, title, what it is a part of, publisher,
ISBN, link, and a citation kept as a file brought it. formatCitation
cites it in APA 7, MLA 9 or Chicago 18: it inverts and abbreviates
names itself (particles, suffixes, names written as already cited stay),
sets a work of its own in italics and a part of something apart from
the whole, and writes a missing year as "n.d." in APA and Chicago.

- Settings: a Citations card per device, with a preview and a link to
  the style's own guide.
- Studysets: a Bibliography button opens the works cited, to read and,
  behind its pencil, to change (studyset schema 4).
- Steps: sources edited through the same sheet, opened from an
  "N sources" button in the runner (step schema 2; schema 1 reads on).
- Path import: steps' sources, text kept as written, the old format's
  "citation" read as what a source is part of.

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-07 17:07:04 +02:00
commit 65976ae63a
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -57,6 +57,8 @@
"studysetStar": "Star",
"studysetUnstar": "Unstar",
"studysetOptions": "Options",
"studysetBibliography": "Bibliography",
"studysetBibliographyIntro": "Works cited across this studyset, in the citation style chosen in Settings.",
"studysetMenuEdit": "Edit",
"studysetMenuArchive": "Archive",
"studysetMenuUnarchive": "Unarchive",
@ -140,15 +142,41 @@
"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"}}},
"sources": "Sources",
"sourcesCount": "{count, plural, =1{1 source} other{{count} sources}}",
"@sourcesCount": {"placeholders": {"count": {"type": "int"}}},
"sourcesNone": "No sources cited yet.",
"sourcesEdit": "Edit sources",
"sourcesEditDone": "Done editing",
"sourceAdd": "Add a source",
"sourceEdit": "Edit source",
"sourceRemove": "Remove source",
"sourceRemoved": "Source removed",
"sourceSheetAdd": "Add",
"sourceAuthors": "Authors",
"sourceAuthorsHint": "Full names, one per line, e.g. Mark A. McDaniel",
"sourceYear": "Year",
"sourceYearHint": "e.g. 2014",
"sourceTitle": "Title",
"sourceTitleHint": "Title of the work",
"sourceContainer": "Published in",
"sourceContainerHint": "Journal, book or website it is part of, with pages",
"sourceContainerHelper": "Leave empty for a work of its own, such as a book.",
"sourcePublisher": "Publisher",
"sourcePublisherHint": "e.g. Belknap Press",
"sourceIsbn": "ISBN",
"sourceIsbnHint": "e.g. 978-0-674-72901-8",
"sourceUrl": "Link",
"sourceUrlHint": "https://…",
"sourceImportedAs": "Imported as: {citation}",
"@sourceImportedAs": {"placeholders": {"citation": {"type": "String"}}},
"sourceIsbnLine": "ISBN: {isbn}",
"@sourceIsbnLine": {"placeholders": {"isbn": {"type": "String"}}},
"sourceAvailableAt": "Available at:",
"sourceEmpty": "Empty reference",
"sourceDiscardTitle": "Discard changes?",
"sourceDiscardMessage": "What you typed for this source will be lost.",
"sourceDiscardConfirm": "Discard",
"stepConflict": "This step was changed differently on another device. Keep one version to go on writing.",
"stepFieldTitle": "Title",
"stepFieldBody": "Text",
@ -276,6 +304,14 @@
"settingsAppearanceDark": "Dark",
"settingsLanguage": "Language",
"settingsLanguageDevice": "Device language",
"settingsCitations": "Citations",
"settingsCitationsDescription": "How sources and studysets' bibliographies are cited on this device. Type authors' full names: each style abbreviates and orders them itself.",
"settingsCitationStyle": "Style",
"settingsCitationStyleApa": "APA (7th edition)",
"settingsCitationStyleMla": "MLA (9th edition)",
"settingsCitationStyleChicago": "Chicago (18th edition)",
"settingsCitationPreview": "Preview",
"settingsCitationGuide": "Official guide",
"settingsVersion": "Version {version} (build {build})",
"@settingsVersion": {"placeholders": {"version": {"type": "String"}, "build": {"type": "String"}}},
"syncTitle": "Sync",
@ -1034,6 +1070,7 @@
"@pathImportTooFew": {"placeholders": {"detail": {"type": "String"}}},
"pathImportMalformedNumber": "a malformed number.",
"pathImportTitleNotText": "a title must be text.",
"pathImportMalformedSource": "a source must be an object or text, and its parts text.",
"pomodoroTopBarHint": "The timer can count down in GNOME's top bar, with its buttons, once the AppIndicator extension is on.",
"pomodoroTopBarSetUp": "Set up",
"pomodoroTopBarDismiss": "Don't suggest again"