halkyon/halkyon_learn_flutter/lib/l10n/app_en.arb

1397 lines
71 KiB
Text
Raw Normal View History

feat(app): the UI foundation: theme, tabs and routes, strings The app gets its look and navigation before more features land on them. - Theme (core/theme/): hand-written light and dark Material 3 colour schemes around cobalt and copper; ThemeExtras for the colours Material has no role for (states, the four FSRS ratings); the 20 colours a person can give content. Tests hold text to WCAG AA contrast on each palette colour and on the dark theme's primary colour and surface. - Layout and shared widgets: Material 3's window-size classes (core/layout/); SectionCard, AppLoadingIndicator, confirmDestructiveAction and FoundById (core/widget/). Lucide icons. - Navigation with go_router: four tabs (Home, Library, Explore, Profile), each keeping its own stack of screens, as a navigation rail with the app's icon from 600 dp and as a navigation bar below; choosing the open tab again returns to its first screen. A studyset's screen sits in the library; studying, cards and settings cover the tabs. - Routes carry ids: FoundById finds the item in the repository's live list, so a studyset deleted on another device, or an old link, says it no longer exists. A screen that deletes its own item keeps showing it while it closes, rather than flashing that message. - Every person gets an app of their own (PersonApp, lib/src/app/): a MaterialApp.router with its own GoRouter and PersonScope around the navigator, built by SessionGate inside the person's keyed subtree. Screens read the person's repositories wherever they are built, so the static route() helpers and the listener that closed every pushed screen on a change of person are gone: a change of person now disposes the whole router and starts again at home. - The account dialog becomes the Profile tab, with Settings (sign out, delete the account, About) behind a gear. A waiting GitHub sign-in now keeps waiting while another tab shows; a change of person still cancels it. - The new screens' strings come from Flutter's gen-l10n (English for now). The generated files are committed, left out of analysis and formatting, and written anew by `flutter pub get`, so CI's check of generated code also catches stale ones. Widget tests now start the whole app (test/support/pump_app.dart) at the screen's path and move through it as a person would, by tabs and taps. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-01 00:18:31 +02:00
{
"@@locale": "en",
"appTitle": "Halkyon Learn",
"@appTitle": {"description": "The app's name, e.g. in the window title and the rail's logo."},
"shellTabHome": "Home",
"shellTabLibrary": "Library",
"shellTabExplore": "Explore",
"shellTabProfile": "Profile",
"homeTitle": "Home",
"libraryTitle": "Library",
"libraryCreateStudyset": "Create studyset",
feat(app): the library: a grid of studyset cards, search and archive The library tab becomes a grid of studyset cards (up to 400 dp wide, all equally tall), starred ones first, and the archive as a section of its own below, closed until opened and counting what rests there. It lists the top level: studysets without a parent, those whose parent is gone, and those in a cycle (ADR 0004). Each card's progress follows the studysets and every change of a card, here or synced, and is worked out again after a study session; a slow, older working out never overwrites a newer one. - Search: a field below the app bar filters by title and secondary title, opens the archive while it finds something there, and says when nothing matches; closing it shows everything again. - Creating and editing: a sheet with the title, the secondary title (typed in capitals, as every surface shows it) and the colour, picked from the palette's twenty, whose names are localised; a new studyset is cobalt, and an existing one keeps its colour, even one only a newer app version knows, until another is picked. Create waits for a title. Closing the sheet with changes asks first. It can't be swiped away: a bottom sheet swiped away closes without asking its PopScope (Flutter issue 152120, still open), so such sheets have no drag handle and close by their close button, the back gesture or a tap beside them, which all ask. - Archiving doesn't ask, since nothing is lost; it offers to undo, as does unarchiving. Deleting asks, then deletes the studyset with its cards, each blanked first. - The create button floats in compact windows and slides away while reading onwards; from medium windows on it sits in the app bar. The old list and its title-only dialog are gone; the studyset screen's tests create studysets through the sheet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-01 00:53:51 +02:00
"libraryEmpty": "No studysets yet",
"libraryUnreadable": "Couldn't read your studysets.",
"libraryArchivedSection": "Archived",
"librarySearchTooltip": "Search",
"librarySearchHint": "Search studysets",
"librarySearchClearTooltip": "Clear query",
"librarySearchCloseTooltip": "Close search",
"librarySearchNoMatches": "No studysets match your search",
"libraryStudysetArchived": "Studyset archived",
"libraryStudysetUnarchived": "Studyset unarchived",
"libraryStudysetDeleted": "Studyset deleted",
feat(app): the library: a grid of studyset cards, search and archive The library tab becomes a grid of studyset cards (up to 400 dp wide, all equally tall), starred ones first, and the archive as a section of its own below, closed until opened and counting what rests there. It lists the top level: studysets without a parent, those whose parent is gone, and those in a cycle (ADR 0004). Each card's progress follows the studysets and every change of a card, here or synced, and is worked out again after a study session; a slow, older working out never overwrites a newer one. - Search: a field below the app bar filters by title and secondary title, opens the archive while it finds something there, and says when nothing matches; closing it shows everything again. - Creating and editing: a sheet with the title, the secondary title (typed in capitals, as every surface shows it) and the colour, picked from the palette's twenty, whose names are localised; a new studyset is cobalt, and an existing one keeps its colour, even one only a newer app version knows, until another is picked. Create waits for a title. Closing the sheet with changes asks first. It can't be swiped away: a bottom sheet swiped away closes without asking its PopScope (Flutter issue 152120, still open), so such sheets have no drag handle and close by their close button, the back gesture or a tap beside them, which all ask. - Archiving doesn't ask, since nothing is lost; it offers to undo, as does unarchiving. Deleting asks, then deletes the studyset with its cards, each blanked first. - The create button floats in compact windows and slides away while reading onwards; from medium windows on it sits in the app bar. The old list and its title-only dialog are gone; the studyset screen's tests create studysets through the sheet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-01 00:53:51 +02:00
"libraryDeleteTitle": "Delete studyset?",
feat(app): the studyset screen with its topics, the tree's own screen A studyset's screen, as decided with the tree (2026-09-30/10-01): - A breadcrumb from the library down to the studyset; its steps go up (replacing the location, so back leads further up), and steps that don't fit fold into a "…" listing them, nearest first. - From expanded windows on, two columns: the description over the topics, the flashcards beside them, Study and Add material in the app bar. Below that, the topics are in a drawer, opened from a bar at the bottom that also holds Study and Add material and slides away while reading onwards; the back button stays where a drawer would have taken its place. - The topics: "All topics" for the whole studyset, then the studysets inside it in their order, each with the study it invites, what it holds and its options (edit, delete), opening on top of this screen; a switch rearranges them by dragging; "New sub-studyset" creates one inside. - Study covers the studyset with everything inside it ("Learn 12" while something is due). Add material offers flashcards for now. - Options: Edit (the sheet, now with the description, edited in the whole window, and for a studyset inside another the colour of the one it is in, which a new one takes at first), Move to… (the tree and the top level, without the studyset itself and what is inside it), Archive or Unarchive with Undo, Delete with Undo, which closes the screen. - The description cut short when long, the whole a tap away; the licence as the last line, linking to its text where that is known. The list's bloc, scoped to a parent, lists its children, works out the studyset's own progress, creates inside it, reorders and moves. The card list leaves adding and studying to the screen. The inline editing of the title and description, and its bloc, are gone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-01 12:59:20 +02:00
"libraryDeleteMessage": "It is deleted with everything inside it and all their cards, on all your devices. You can undo this for a few seconds.",
feat(app): the library: a grid of studyset cards, search and archive The library tab becomes a grid of studyset cards (up to 400 dp wide, all equally tall), starred ones first, and the archive as a section of its own below, closed until opened and counting what rests there. It lists the top level: studysets without a parent, those whose parent is gone, and those in a cycle (ADR 0004). Each card's progress follows the studysets and every change of a card, here or synced, and is worked out again after a study session; a slow, older working out never overwrites a newer one. - Search: a field below the app bar filters by title and secondary title, opens the archive while it finds something there, and says when nothing matches; closing it shows everything again. - Creating and editing: a sheet with the title, the secondary title (typed in capitals, as every surface shows it) and the colour, picked from the palette's twenty, whose names are localised; a new studyset is cobalt, and an existing one keeps its colour, even one only a newer app version knows, until another is picked. Create waits for a title. Closing the sheet with changes asks first. It can't be swiped away: a bottom sheet swiped away closes without asking its PopScope (Flutter issue 152120, still open), so such sheets have no drag handle and close by their close button, the back gesture or a tap beside them, which all ask. - Archiving doesn't ask, since nothing is lost; it offers to undo, as does unarchiving. Deleting asks, then deletes the studyset with its cards, each blanked first. - The create button floats in compact windows and slides away while reading onwards; from medium windows on it sits in the app bar. The old list and its title-only dialog are gone; the studyset screen's tests create studysets through the sheet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-01 00:53:51 +02:00
"libraryDeleteConfirm": "Delete",
"studysetSheetCreateTitle": "Create studyset",
"studysetSheetEditTitle": "Edit studyset",
"studysetSheetCreate": "Create",
"studysetSheetSave": "Save",
"studysetSheetTitleLabel": "Title",
"studysetSheetSecondaryLabel": "Secondary title",
feat(app): Home, the Library and the studyset sheets laid out as before Home: plain cards on the surface, 16 dp apart, the goal first and the Pomodoro timer after it in a new dashboard. The streak chip sits centred in the app bar, and its sheet shows the days inside a big flame and the week as marks over the weekdays' initials, with a word on today in a box. The week names its day as "Thursday, Oct 8" and its days carry no tooltip. The heatmap scrolls its weekdays with the weeks, outlines the days to come, and names a day's activities with its date. The goal card has a ring of 5 dp, a check once met and a pencil, and its sheet saves across its width with Remove goal below. Arranging puts an eye on each widget's corner and lifts the one picked up, with a tap the hand feels; with every widget hidden, Customise brings arranging back. The stepper moves to core, where the goal's sheet takes it too. Library: the counts line includes files (PDFs); Refresh in the app bar and pulling the list down sync now; a list that can't be read offers Retry, which reads it again; the star keeps its square corners. Studyset sheet: "Title *", the secondary title explained behind a question mark, Inherit as a box beside the colour, and the description in up to three lines with a chevron. Move sheet: round marks, the studyset itself marked as current, the top level only while it is inside another, archived studysets last under their heading, the destination named in the footer, and a new studyset to move into, made only once the move is. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 11:12:23 +02:00
"studysetSheetSecondaryHelper": "Shown as a small label above the title on cards and the studyset's header. Paths use it to label tiers (Challenge, Milestone, Lesson).",
feat(app): the app speaks British and American English and German Settings offers English (UK), English (US) and Deutsch after the device's language, each named in its own language. app_en.arb, the template, is now British English (colour, centre) and the fallback for any language the app doesn't speak; app_en_US.arb overrides the five messages American English spells differently, and app_en_GB.arb is empty, there so that Material's texts and dates are British too. The German translation says "du" and keeps one set of terms throughout (Lernset, Karteikarte, Lernpfad; Anki's own Stapel and Unterstapel in the Anki import). arb_files_test checks that German has every message of the template and that every translation keeps its placeholders. resolveAppLocale picks the first language the device prefers that the app speaks, in its country's variant where there is one; other English is British, and a country alone never picks a language (Spanish in the United States isn't American English), which Flutter's own resolution would do. Both MaterialApps take material_ui's GlobalMaterialLocalizations delegates: gen-l10n's list brings flutter_localizations', which serve only package:flutter/material.dart, so material_ui's widgets found no Material texts in German and threw. The editor's own text blocks show our placeholders while empty (list item, to-do, quote, heading, and the desktop's / hint): the editor's own follow a locale of their own, process-wide, in few languages. The last texts written into widgets (the person's data failing to open, the cards failing to read, the About dialog) moved into the arb files. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 02:01:01 +02:00
"studysetSheetColor": "Colour",
feat(app): the library: a grid of studyset cards, search and archive The library tab becomes a grid of studyset cards (up to 400 dp wide, all equally tall), starred ones first, and the archive as a section of its own below, closed until opened and counting what rests there. It lists the top level: studysets without a parent, those whose parent is gone, and those in a cycle (ADR 0004). Each card's progress follows the studysets and every change of a card, here or synced, and is worked out again after a study session; a slow, older working out never overwrites a newer one. - Search: a field below the app bar filters by title and secondary title, opens the archive while it finds something there, and says when nothing matches; closing it shows everything again. - Creating and editing: a sheet with the title, the secondary title (typed in capitals, as every surface shows it) and the colour, picked from the palette's twenty, whose names are localised; a new studyset is cobalt, and an existing one keeps its colour, even one only a newer app version knows, until another is picked. Create waits for a title. Closing the sheet with changes asks first. It can't be swiped away: a bottom sheet swiped away closes without asking its PopScope (Flutter issue 152120, still open), so such sheets have no drag handle and close by their close button, the back gesture or a tap beside them, which all ask. - Archiving doesn't ask, since nothing is lost; it offers to undo, as does unarchiving. Deleting asks, then deletes the studyset with its cards, each blanked first. - The create button floats in compact windows and slides away while reading onwards; from medium windows on it sits in the app bar. The old list and its title-only dialog are gone; the studyset screen's tests create studysets through the sheet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-01 00:53:51 +02:00
"studysetSheetDiscardTitle": "Discard changes?",
"studysetSheetDiscardMessage": "You have unsaved changes to this studyset. Discard them and close the form?",
"studysetSheetDiscardConfirm": "Discard",
"paletteColorName": "{name, select, carrot{Carrot} cerise{Cerise} cobalt{Cobalt} copper{Copper} enzian{Enzian} fern{Fern} forest{Forest} ocean{Ocean} olive{Olive} pacific{Pacific} pickle{Pickle} pine{Pine} pink{Pink} plum{Plum} purple{Purple} reef{Reef} sahara{Sahara} slateblue{Slate blue} soil{Soil} strawberry{Strawberry} other{{name}}}",
"@paletteColorName": {"description": "A colour of the palette content can take, by its stored name.", "placeholders": {"name": {"type": "String"}}},
feat(app): the app speaks British and American English and German Settings offers English (UK), English (US) and Deutsch after the device's language, each named in its own language. app_en.arb, the template, is now British English (colour, centre) and the fallback for any language the app doesn't speak; app_en_US.arb overrides the five messages American English spells differently, and app_en_GB.arb is empty, there so that Material's texts and dates are British too. The German translation says "du" and keeps one set of terms throughout (Lernset, Karteikarte, Lernpfad; Anki's own Stapel and Unterstapel in the Anki import). arb_files_test checks that German has every message of the template and that every translation keeps its placeholders. resolveAppLocale picks the first language the device prefers that the app speaks, in its country's variant where there is one; other English is British, and a country alone never picks a language (Spanish in the United States isn't American English), which Flutter's own resolution would do. Both MaterialApps take material_ui's GlobalMaterialLocalizations delegates: gen-l10n's list brings flutter_localizations', which serve only package:flutter/material.dart, so material_ui's widgets found no Material texts in German and threw. The editor's own text blocks show our placeholders while empty (list item, to-do, quote, heading, and the desktop's / hint): the editor's own follow a locale of their own, process-wide, in few languages. The last texts written into widgets (the person's data failing to open, the cards failing to read, the About dialog) moved into the arb files. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 02:01:01 +02:00
"colorPickerLabel": "Colour: {color}",
feat(app): the library: a grid of studyset cards, search and archive The library tab becomes a grid of studyset cards (up to 400 dp wide, all equally tall), starred ones first, and the archive as a section of its own below, closed until opened and counting what rests there. It lists the top level: studysets without a parent, those whose parent is gone, and those in a cycle (ADR 0004). Each card's progress follows the studysets and every change of a card, here or synced, and is worked out again after a study session; a slow, older working out never overwrites a newer one. - Search: a field below the app bar filters by title and secondary title, opens the archive while it finds something there, and says when nothing matches; closing it shows everything again. - Creating and editing: a sheet with the title, the secondary title (typed in capitals, as every surface shows it) and the colour, picked from the palette's twenty, whose names are localised; a new studyset is cobalt, and an existing one keeps its colour, even one only a newer app version knows, until another is picked. Create waits for a title. Closing the sheet with changes asks first. It can't be swiped away: a bottom sheet swiped away closes without asking its PopScope (Flutter issue 152120, still open), so such sheets have no drag handle and close by their close button, the back gesture or a tap beside them, which all ask. - Archiving doesn't ask, since nothing is lost; it offers to undo, as does unarchiving. Deleting asks, then deletes the studyset with its cards, each blanked first. - The create button floats in compact windows and slides away while reading onwards; from medium windows on it sits in the app bar. The old list and its title-only dialog are gone; the studyset screen's tests create studysets through the sheet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-01 00:53:51 +02:00
"@colorPickerLabel": {"placeholders": {"color": {"type": "String"}}},
feat(app): the UI foundation: theme, tabs and routes, strings The app gets its look and navigation before more features land on them. - Theme (core/theme/): hand-written light and dark Material 3 colour schemes around cobalt and copper; ThemeExtras for the colours Material has no role for (states, the four FSRS ratings); the 20 colours a person can give content. Tests hold text to WCAG AA contrast on each palette colour and on the dark theme's primary colour and surface. - Layout and shared widgets: Material 3's window-size classes (core/layout/); SectionCard, AppLoadingIndicator, confirmDestructiveAction and FoundById (core/widget/). Lucide icons. - Navigation with go_router: four tabs (Home, Library, Explore, Profile), each keeping its own stack of screens, as a navigation rail with the app's icon from 600 dp and as a navigation bar below; choosing the open tab again returns to its first screen. A studyset's screen sits in the library; studying, cards and settings cover the tabs. - Routes carry ids: FoundById finds the item in the repository's live list, so a studyset deleted on another device, or an old link, says it no longer exists. A screen that deletes its own item keeps showing it while it closes, rather than flashing that message. - Every person gets an app of their own (PersonApp, lib/src/app/): a MaterialApp.router with its own GoRouter and PersonScope around the navigator, built by SessionGate inside the person's keyed subtree. Screens read the person's repositories wherever they are built, so the static route() helpers and the listener that closed every pushed screen on a change of person are gone: a change of person now disposes the whole router and starts again at home. - The account dialog becomes the Profile tab, with Settings (sign out, delete the account, About) behind a gear. A waiting GitHub sign-in now keeps waiting while another tab shows; a change of person still cancels it. - The new screens' strings come from Flutter's gen-l10n (English for now). The generated files are committed, left out of analysis and formatting, and written anew by `flutter pub get`, so CI's check of generated code also catches stale ones. Widget tests now start the whole app (test/support/pump_app.dart) at the screen's path and move through it as a person would, by tabs and taps. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-01 00:18:31 +02:00
"studysetCountFlashcards": "{count, plural, =1{1 flashcard} other{{count} flashcards}}",
"@studysetCountFlashcards": {"placeholders": {"count": {"type": "int"}}},
feat(app): notes in the studyset screen, written in the whole window - A Notes tab beside Flashcards lists a studyset's notes in order: the title ("Untitled note" without one) and when each was last edited ("Edited 5 minutes ago", by the calendar from yesterday on, the date after a week); Edit and Delete behind its options. Deleting asks, then offers Undo for a moment (`NoteDeletions`). With none, the tab says so. - "Create a note" in Add material opens a new note over the tabs; so does a note of the list. The note: a title, its tags once it exists, and its text at reading width; the app bar says how saving stands. - `NoteEditorBloc` saves after 5 seconds without typing, when the app goes to the background, and when the note is closed (the bloc saves as it closes, so leaving never waits, and the write outlives the screen). Each save builds on the revisions the editor started from; another device's change takes over a note with nothing unsaved, and merges with one that has. A note changed differently on two devices is read-only until the person keeps a version of each field in conflict. A new note is created by its first save, never when left blank; a note deleted elsewhere says it no longer exists. - The editor gains a format bar, docked below it while it has the focus (`RichContentEditor(formatBar: true)`): alignment, bold, italic, underline, superscript and subscript. It takes no focus, so the selection stays. Superscript and subscript are inline marks of their own, drawn by the font's raised and lowered glyphs in editors and read-only text alike. - The library's and the topics' counts include notes (a studyset with what is inside it, as for cards). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-02 22:30:53 +02:00
"studysetCountNotes": "{count, plural, =1{1 note} other{{count} notes}}",
"@studysetCountNotes": {"placeholders": {"count": {"type": "int"}}},
feat(app): Home, the Library and the studyset sheets laid out as before Home: plain cards on the surface, 16 dp apart, the goal first and the Pomodoro timer after it in a new dashboard. The streak chip sits centred in the app bar, and its sheet shows the days inside a big flame and the week as marks over the weekdays' initials, with a word on today in a box. The week names its day as "Thursday, Oct 8" and its days carry no tooltip. The heatmap scrolls its weekdays with the weeks, outlines the days to come, and names a day's activities with its date. The goal card has a ring of 5 dp, a check once met and a pencil, and its sheet saves across its width with Remove goal below. Arranging puts an eye on each widget's corner and lifts the one picked up, with a tap the hand feels; with every widget hidden, Customise brings arranging back. The stepper moves to core, where the goal's sheet takes it too. Library: the counts line includes files (PDFs); Refresh in the app bar and pulling the list down sync now; a list that can't be read offers Retry, which reads it again; the star keeps its square corners. Studyset sheet: "Title *", the secondary title explained behind a question mark, Inherit as a box beside the colour, and the description in up to three lines with a chevron. Move sheet: round marks, the studyset itself marked as current, the top level only while it is inside another, archived studysets last under their heading, the destination named in the footer, and a new studyset to move into, made only once the move is. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 11:12:23 +02:00
"studysetCountFiles": "{count, plural, =1{1 file} other{{count} files}}",
"@studysetCountFiles": {"placeholders": {"count": {"type": "int"}}},
"libraryRefresh": "Refresh",
"libraryImport": "Import",
"libraryImportAnkiHint": "Becomes a studyset of its own, from an .apkg or .colpkg file",
feat(app): Home, the Library and the studyset sheets laid out as before Home: plain cards on the surface, 16 dp apart, the goal first and the Pomodoro timer after it in a new dashboard. The streak chip sits centred in the app bar, and its sheet shows the days inside a big flame and the week as marks over the weekdays' initials, with a word on today in a box. The week names its day as "Thursday, Oct 8" and its days carry no tooltip. The heatmap scrolls its weekdays with the weeks, outlines the days to come, and names a day's activities with its date. The goal card has a ring of 5 dp, a check once met and a pencil, and its sheet saves across its width with Remove goal below. Arranging puts an eye on each widget's corner and lifts the one picked up, with a tap the hand feels; with every widget hidden, Customise brings arranging back. The stepper moves to core, where the goal's sheet takes it too. Library: the counts line includes files (PDFs); Refresh in the app bar and pulling the list down sync now; a list that can't be read offers Retry, which reads it again; the star keeps its square corners. Studyset sheet: "Title *", the secondary title explained behind a question mark, Inherit as a box beside the colour, and the description in up to three lines with a chevron. Move sheet: round marks, the studyset itself marked as current, the top level only while it is inside another, archived studysets last under their heading, the destination named in the footer, and a new studyset to move into, made only once the move is. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 11:12:23 +02:00
"libraryRetry": "Retry",
"studysetNoContent": "No content yet",
feat(app): the studyset screen laid out as before The Study pill reads "Learn 12 flashcards" in the app bar and "Learn 12" floating, "Study" with nothing due, and is off with nothing to study, saying so. With a path not finished, a chevron beside it offers to start or continue the path: a menu in the app bar, a Study mode sheet on phones. The floating bar rises above the licence line, which takes two lines at most. Add material offers a path, flashcards, a note and a PDF, in that order; imports moved to the options' Import content, which asks for a learning path or an Anki deck. The options read Edit, Move, Study options, Import content, Reset progress, Archive, Delete. The bibliography is an outlined round button above the content, and on phones at the foot of the topics. The tabs sit on a line of their own across the card, what the tab shown offers beside them: the flashcards' filter and options, and on the paths Reorder once there are two, which turns them into handles to drag. An empty tab says so in its middle; tapping the open tab again returns to its top, and pulling a tab down syncs. The breadcrumb's steps are plain links between "›", the studyset itself bold. A long description is cut at a fixed height, measured, with Read more opening it whole under the studyset's title. A studyset that no longer exists leads back to the library. The topics: All topics on the primary colour, in view also while they are rearranged; each topic with the study it invites in a round icon, what it holds ("Empty" with nothing, files counted too), and its options (now with Reset progress) behind "…" or a long press where the finger is; New sub-studyset at the foot below a line, the list with its scrollbar always shown. All topics opens Add material while nothing is due. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 11:42:50 +02:00
"studysetEmpty": "Empty",
"studysetActionReview": "Review",
"studysetActionStudy": "Study",
"studysetActionAdd": "Add content",
"studysetArchived": "Archived",
"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",
"studysetMenuDelete": "Delete",
feat(app): the studyset screen with its topics, the tree's own screen A studyset's screen, as decided with the tree (2026-09-30/10-01): - A breadcrumb from the library down to the studyset; its steps go up (replacing the location, so back leads further up), and steps that don't fit fold into a "…" listing them, nearest first. - From expanded windows on, two columns: the description over the topics, the flashcards beside them, Study and Add material in the app bar. Below that, the topics are in a drawer, opened from a bar at the bottom that also holds Study and Add material and slides away while reading onwards; the back button stays where a drawer would have taken its place. - The topics: "All topics" for the whole studyset, then the studysets inside it in their order, each with the study it invites, what it holds and its options (edit, delete), opening on top of this screen; a switch rearranges them by dragging; "New sub-studyset" creates one inside. - Study covers the studyset with everything inside it ("Learn 12" while something is due). Add material offers flashcards for now. - Options: Edit (the sheet, now with the description, edited in the whole window, and for a studyset inside another the colour of the one it is in, which a new one takes at first), Move to… (the tree and the top level, without the studyset itself and what is inside it), Archive or Unarchive with Undo, Delete with Undo, which closes the screen. - The description cut short when long, the whole a tap away; the licence as the last line, linking to its text where that is known. The list's bloc, scoped to a parent, lists its children, works out the studyset's own progress, creates inside it, reorders and moves. The card list leaves adding and studying to the screen. The inline editing of the title and description, and its bloc, are gone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-01 12:59:20 +02:00
"studysetMenuMove": "Move to…",
"studysetTabFlashcards": "Flashcards",
feat(app): notes in the studyset screen, written in the whole window - A Notes tab beside Flashcards lists a studyset's notes in order: the title ("Untitled note" without one) and when each was last edited ("Edited 5 minutes ago", by the calendar from yesterday on, the date after a week); Edit and Delete behind its options. Deleting asks, then offers Undo for a moment (`NoteDeletions`). With none, the tab says so. - "Create a note" in Add material opens a new note over the tabs; so does a note of the list. The note: a title, its tags once it exists, and its text at reading width; the app bar says how saving stands. - `NoteEditorBloc` saves after 5 seconds without typing, when the app goes to the background, and when the note is closed (the bloc saves as it closes, so leaving never waits, and the write outlives the screen). Each save builds on the revisions the editor started from; another device's change takes over a note with nothing unsaved, and merges with one that has. A note changed differently on two devices is read-only until the person keeps a version of each field in conflict. A new note is created by its first save, never when left blank; a note deleted elsewhere says it no longer exists. - The editor gains a format bar, docked below it while it has the focus (`RichContentEditor(formatBar: true)`): alignment, bold, italic, underline, superscript and subscript. It takes no focus, so the selection stays. Superscript and subscript are inline marks of their own, drawn by the font's raised and lowered glyphs in editors and read-only text alike. - The library's and the topics' counts include notes (a studyset with what is inside it, as for cards). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-02 22:30:53 +02:00
"studysetTabNotes": "Notes",
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>
2026-10-03 09:25:08 +02:00
"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. Use \"Add material → Create a path\" to write one, or \"⋮ → Import content\" to import one.",
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>
2026-10-03 09:25:08 +02:00
"pathOptions": "Path options",
"pathEdit": "Edit",
"pathResetProgress": "Reset progress",
"pathProgressReset": "Progress reset",
"pathResetTitle": "Reset progress?",
"pathResetMessage": "All your progress through this path will be cleared. You can undo this for a few seconds.",
"pathResetConfirm": "Reset",
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>
2026-10-03 09:25:08 +02:00
"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",
"pathEditTags": "Edit tags",
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>
2026-10-03 09:25:08 +02:00
"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",
"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",
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>
2026-10-03 09:25:08 +02:00
"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"}}},
feat(app): notes in the studyset screen, written in the whole window - A Notes tab beside Flashcards lists a studyset's notes in order: the title ("Untitled note" without one) and when each was last edited ("Edited 5 minutes ago", by the calendar from yesterday on, the date after a week); Edit and Delete behind its options. Deleting asks, then offers Undo for a moment (`NoteDeletions`). With none, the tab says so. - "Create a note" in Add material opens a new note over the tabs; so does a note of the list. The note: a title, its tags once it exists, and its text at reading width; the app bar says how saving stands. - `NoteEditorBloc` saves after 5 seconds without typing, when the app goes to the background, and when the note is closed (the bloc saves as it closes, so leaving never waits, and the write outlives the screen). Each save builds on the revisions the editor started from; another device's change takes over a note with nothing unsaved, and merges with one that has. A note changed differently on two devices is read-only until the person keeps a version of each field in conflict. A new note is created by its first save, never when left blank; a note deleted elsewhere says it no longer exists. - The editor gains a format bar, docked below it while it has the focus (`RichContentEditor(formatBar: true)`): alignment, bold, italic, underline, superscript and subscript. It takes no focus, so the selection stays. Superscript and subscript are inline marks of their own, drawn by the font's raised and lowered glyphs in editors and read-only text alike. - The library's and the topics' counts include notes (a studyset with what is inside it, as for cards). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-02 22:30:53 +02:00
"studysetCreateNote": "Create a note",
"notesEmpty": "No notes yet",
"notesEmptyHint": "Use \"Add material → Create a note\" to write one.",
feat(app): notes in the studyset screen, written in the whole window - A Notes tab beside Flashcards lists a studyset's notes in order: the title ("Untitled note" without one) and when each was last edited ("Edited 5 minutes ago", by the calendar from yesterday on, the date after a week); Edit and Delete behind its options. Deleting asks, then offers Undo for a moment (`NoteDeletions`). With none, the tab says so. - "Create a note" in Add material opens a new note over the tabs; so does a note of the list. The note: a title, its tags once it exists, and its text at reading width; the app bar says how saving stands. - `NoteEditorBloc` saves after 5 seconds without typing, when the app goes to the background, and when the note is closed (the bloc saves as it closes, so leaving never waits, and the write outlives the screen). Each save builds on the revisions the editor started from; another device's change takes over a note with nothing unsaved, and merges with one that has. A note changed differently on two devices is read-only until the person keeps a version of each field in conflict. A new note is created by its first save, never when left blank; a note deleted elsewhere says it no longer exists. - The editor gains a format bar, docked below it while it has the focus (`RichContentEditor(formatBar: true)`): alignment, bold, italic, underline, superscript and subscript. It takes no focus, so the selection stays. Superscript and subscript are inline marks of their own, drawn by the font's raised and lowered glyphs in editors and read-only text alike. - The library's and the topics' counts include notes (a studyset with what is inside it, as for cards). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-02 22:30:53 +02:00
"noteUntitled": "Untitled note",
"noteEdited": "Edited {when}",
"@noteEdited": {"placeholders": {"when": {"type": "String"}}},
"timeJustNow": "just now",
"timeMinutesAgo": "{count, plural, =1{1 minute ago} other{{count} minutes ago}}",
"@timeMinutesAgo": {"placeholders": {"count": {"type": "int"}}},
"timeHoursAgo": "{count, plural, =1{1 hour ago} other{{count} hours ago}}",
"@timeHoursAgo": {"placeholders": {"count": {"type": "int"}}},
"timeDaysAgo": "{count, plural, =1{yesterday} other{{count} days ago}}",
"@timeDaysAgo": {"placeholders": {"count": {"type": "int"}}},
"noteOptions": "Note options",
"noteEdit": "Edit",
"noteDelete": "Delete",
"noteDeleteTitle": "Delete note?",
"noteDeleteMessage": "This note will be removed from the studyset. You can undo this for a few seconds.",
"noteDeleteConfirm": "Delete",
"noteDeleted": "Note deleted",
"noteTitleHint": "Title",
"noteEditing": "Editing…",
"noteSaving": "Saving…",
"noteSaved": "Saved",
"noteSaveFailed": "Save failed",
"noteConflict": "This note was changed differently on another device. Keep one version to go on writing.",
"noteFieldTitle": "Title",
"noteFieldBody": "Text",
"noteKeepThis": "Keep this",
"noteAddTags": "Add tags",
"noteEditTags": "Edit tags",
feat(app): the studyset screen with its topics, the tree's own screen A studyset's screen, as decided with the tree (2026-09-30/10-01): - A breadcrumb from the library down to the studyset; its steps go up (replacing the location, so back leads further up), and steps that don't fit fold into a "…" listing them, nearest first. - From expanded windows on, two columns: the description over the topics, the flashcards beside them, Study and Add material in the app bar. Below that, the topics are in a drawer, opened from a bar at the bottom that also holds Study and Add material and slides away while reading onwards; the back button stays where a drawer would have taken its place. - The topics: "All topics" for the whole studyset, then the studysets inside it in their order, each with the study it invites, what it holds and its options (edit, delete), opening on top of this screen; a switch rearranges them by dragging; "New sub-studyset" creates one inside. - Study covers the studyset with everything inside it ("Learn 12" while something is due). Add material offers flashcards for now. - Options: Edit (the sheet, now with the description, edited in the whole window, and for a studyset inside another the colour of the one it is in, which a new one takes at first), Move to… (the tree and the top level, without the studyset itself and what is inside it), Archive or Unarchive with Undo, Delete with Undo, which closes the screen. - The description cut short when long, the whole a tap away; the licence as the last line, linking to its text where that is known. The list's bloc, scoped to a parent, lists its children, works out the studyset's own progress, creates inside it, reorders and moves. The card list leaves adding and studying to the screen. The inline editing of the title and description, and its bloc, are gone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-01 12:59:20 +02:00
"studysetFlashcardsEmpty": "No flashcards yet",
"studysetFlashcardsEmptyHint": "Use \"Add material → Create flashcards\" to write some, or \"⋮ → Import content\" to bring in an Anki deck or a list.",
feat(app): the studyset screen with its topics, the tree's own screen A studyset's screen, as decided with the tree (2026-09-30/10-01): - A breadcrumb from the library down to the studyset; its steps go up (replacing the location, so back leads further up), and steps that don't fit fold into a "…" listing them, nearest first. - From expanded windows on, two columns: the description over the topics, the flashcards beside them, Study and Add material in the app bar. Below that, the topics are in a drawer, opened from a bar at the bottom that also holds Study and Add material and slides away while reading onwards; the back button stays where a drawer would have taken its place. - The topics: "All topics" for the whole studyset, then the studysets inside it in their order, each with the study it invites, what it holds and its options (edit, delete), opening on top of this screen; a switch rearranges them by dragging; "New sub-studyset" creates one inside. - Study covers the studyset with everything inside it ("Learn 12" while something is due). Add material offers flashcards for now. - Options: Edit (the sheet, now with the description, edited in the whole window, and for a studyset inside another the colour of the one it is in, which a new one takes at first), Move to… (the tree and the top level, without the studyset itself and what is inside it), Archive or Unarchive with Undo, Delete with Undo, which closes the screen. - The description cut short when long, the whole a tap away; the licence as the last line, linking to its text where that is known. The list's bloc, scoped to a parent, lists its children, works out the studyset's own progress, creates inside it, reorders and moves. The card list leaves adding and studying to the screen. The inline editing of the title and description, and its bloc, are gone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-01 12:59:20 +02:00
"studysetAddMaterial": "Add material",
"studysetCreateFlashcards": "Create flashcards",
"studysetStudy": "Study",
"studysetLearnCount": "Learn {count}",
"@studysetLearnCount": {"placeholders": {"count": {"type": "int"}}},
feat(app): the studyset screen laid out as before The Study pill reads "Learn 12 flashcards" in the app bar and "Learn 12" floating, "Study" with nothing due, and is off with nothing to study, saying so. With a path not finished, a chevron beside it offers to start or continue the path: a menu in the app bar, a Study mode sheet on phones. The floating bar rises above the licence line, which takes two lines at most. Add material offers a path, flashcards, a note and a PDF, in that order; imports moved to the options' Import content, which asks for a learning path or an Anki deck. The options read Edit, Move, Study options, Import content, Reset progress, Archive, Delete. The bibliography is an outlined round button above the content, and on phones at the foot of the topics. The tabs sit on a line of their own across the card, what the tab shown offers beside them: the flashcards' filter and options, and on the paths Reorder once there are two, which turns them into handles to drag. An empty tab says so in its middle; tapping the open tab again returns to its top, and pulling a tab down syncs. The breadcrumb's steps are plain links between "›", the studyset itself bold. A long description is cut at a fixed height, measured, with Read more opening it whole under the studyset's title. A studyset that no longer exists leads back to the library. The topics: All topics on the primary colour, in view also while they are rearranged; each topic with the study it invites in a round icon, what it holds ("Empty" with nothing, files counted too), and its options (now with Reset progress) behind "…" or a long press where the finger is; New sub-studyset at the foot below a line, the list with its scrollbar always shown. All topics opens Add material while nothing is due. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 11:42:50 +02:00
"studysetLearnFlashcards": "{count, plural, =1{Learn 1 flashcard} other{Learn {count} flashcards}}",
"@studysetLearnFlashcards": {"placeholders": {"count": {"type": "int"}}},
"studysetNothingToStudy": "Nothing to study yet",
"studysetStudyMode": "Study mode",
"studysetStartPath": "Start: {title}",
"@studysetStartPath": {"placeholders": {"title": {"type": "String"}}},
"studysetContinuePath": "Continue: {title}",
"@studysetContinuePath": {"placeholders": {"title": {"type": "String"}}},
"studysetStartPathHint": "Begin the first step of this path.",
"studysetContinuePathHint": "Pick up the next path step where you left off.",
"studysetSpacedRepetition": "Spaced repetition",
"studysetSpacedRepetitionHint": "Review the cards that are due, scheduled by FSRS.",
"studysetImportContent": "Import content",
"studysetMenuExport": "Export content",
"exportRunning": "Exporting…",
"exportedMarkdown": "Exported as Markdown.",
"exportedZip": "{count, plural, =1{Exported as Markdown with 1 file (.zip).} other{Exported as Markdown with {count} files (.zip).}}",
"@exportedZip": {"placeholders": {"count": {"type": "int"}}},
"exportMissingFiles": "{count, plural, =1{1 file wasn't on this device and is left out.} other{{count} files weren't on this device and are left out.}}",
"@exportMissingFiles": {"placeholders": {"count": {"type": "int"}}},
"exportFailed": "Couldn't export the studyset.",
"exportQuestion": "Q",
"exportAnswer": "A",
"exportHint": "Hint",
"exportIfRight": "If right",
"exportIfWrong": "If wrong",
"exportSound": "Sound",
"exportVideo": "YouTube video",
"exportSpoiler": "Spoiler",
"exportUnavailable": "not available on this device",
feat(app): the studyset screen laid out as before The Study pill reads "Learn 12 flashcards" in the app bar and "Learn 12" floating, "Study" with nothing due, and is off with nothing to study, saying so. With a path not finished, a chevron beside it offers to start or continue the path: a menu in the app bar, a Study mode sheet on phones. The floating bar rises above the licence line, which takes two lines at most. Add material offers a path, flashcards, a note and a PDF, in that order; imports moved to the options' Import content, which asks for a learning path or an Anki deck. The options read Edit, Move, Study options, Import content, Reset progress, Archive, Delete. The bibliography is an outlined round button above the content, and on phones at the foot of the topics. The tabs sit on a line of their own across the card, what the tab shown offers beside them: the flashcards' filter and options, and on the paths Reorder once there are two, which turns them into handles to drag. An empty tab says so in its middle; tapping the open tab again returns to its top, and pulling a tab down syncs. The breadcrumb's steps are plain links between "›", the studyset itself bold. A long description is cut at a fixed height, measured, with Read more opening it whole under the studyset's title. A studyset that no longer exists leads back to the library. The topics: All topics on the primary colour, in view also while they are rearranged; each topic with the study it invites in a round icon, what it holds ("Empty" with nothing, files counted too), and its options (now with Reset progress) behind "…" or a long press where the finger is; New sub-studyset at the foot below a line, the list with its scrollbar always shown. All topics opens Add material while nothing is due. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 11:42:50 +02:00
"studysetImportPath": "Learning path",
"studysetImportPathHint": "From a Halkyon path JSON file",
"studysetImportAnki": "Anki deck",
"studysetImportAnkiHint": "From an .apkg or .colpkg file",
"studysetImportCards": "Flashcards",
"studysetImportCardsHint": "Pasted, or from a CSV or TSV file",
"cardTextImportTitle": "Import flashcards",
"cardTextImportDescription": "One card per line: its front, a separator, then its back. Each line is split at its first separator; lines without one are left out. A field in double quotes, as spreadsheets write them, may hold separators and line breaks.",
"cardTextImportHint": "Paste the cards here",
"cardTextImportLoadFile": "Load a CSV or TSV file",
"cardTextImportFileType": "CSV or TSV files",
"cardTextImportUnreadable": "This file doesn't hold text.",
"cardTextImportSeparator": "Separator",
"cardTextSeparatorTab": "Tab",
"cardTextSeparatorComma": "Comma",
"cardTextSeparatorSemicolon": "Semicolon",
"cardTextImportNone": "No cards found yet.",
"cardTextImportReady": "{count, plural, =1{1 card ready to import.} other{{count} cards ready to import.}}",
"@cardTextImportReady": {"placeholders": {"count": {"type": "int"}}},
"cardTextImportSubmit": "Import",
"cardTextImported": "{count, plural, =1{Imported 1 flashcard.} other{Imported {count} flashcards.}}",
"@cardTextImported": {"placeholders": {"count": {"type": "int"}}},
feat(app): the studyset screen laid out as before The Study pill reads "Learn 12 flashcards" in the app bar and "Learn 12" floating, "Study" with nothing due, and is off with nothing to study, saying so. With a path not finished, a chevron beside it offers to start or continue the path: a menu in the app bar, a Study mode sheet on phones. The floating bar rises above the licence line, which takes two lines at most. Add material offers a path, flashcards, a note and a PDF, in that order; imports moved to the options' Import content, which asks for a learning path or an Anki deck. The options read Edit, Move, Study options, Import content, Reset progress, Archive, Delete. The bibliography is an outlined round button above the content, and on phones at the foot of the topics. The tabs sit on a line of their own across the card, what the tab shown offers beside them: the flashcards' filter and options, and on the paths Reorder once there are two, which turns them into handles to drag. An empty tab says so in its middle; tapping the open tab again returns to its top, and pulling a tab down syncs. The breadcrumb's steps are plain links between "›", the studyset itself bold. A long description is cut at a fixed height, measured, with Read more opening it whole under the studyset's title. A studyset that no longer exists leads back to the library. The topics: All topics on the primary colour, in view also while they are rearranged; each topic with the study it invites in a round icon, what it holds ("Empty" with nothing, files counted too), and its options (now with Reset progress) behind "…" or a long press where the finger is; New sub-studyset at the foot below a line, the list with its scrollbar always shown. All topics opens Add material while nothing is due. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 11:42:50 +02:00
"studysetReorder": "Reorder",
"studysetReorderPaths": "Reorder paths",
"studysetReorderNotes": "Reorder notes",
"studysetReorderFiles": "Reorder files",
feat(app): the studyset screen laid out as before The Study pill reads "Learn 12 flashcards" in the app bar and "Learn 12" floating, "Study" with nothing due, and is off with nothing to study, saying so. With a path not finished, a chevron beside it offers to start or continue the path: a menu in the app bar, a Study mode sheet on phones. The floating bar rises above the licence line, which takes two lines at most. Add material offers a path, flashcards, a note and a PDF, in that order; imports moved to the options' Import content, which asks for a learning path or an Anki deck. The options read Edit, Move, Study options, Import content, Reset progress, Archive, Delete. The bibliography is an outlined round button above the content, and on phones at the foot of the topics. The tabs sit on a line of their own across the card, what the tab shown offers beside them: the flashcards' filter and options, and on the paths Reorder once there are two, which turns them into handles to drag. An empty tab says so in its middle; tapping the open tab again returns to its top, and pulling a tab down syncs. The breadcrumb's steps are plain links between "›", the studyset itself bold. A long description is cut at a fixed height, measured, with Read more opening it whole under the studyset's title. A studyset that no longer exists leads back to the library. The topics: All topics on the primary colour, in view also while they are rearranged; each topic with the study it invites in a round icon, what it holds ("Empty" with nothing, files counted too), and its options (now with Reset progress) behind "…" or a long press where the finger is; New sub-studyset at the foot below a line, the list with its scrollbar always shown. All topics opens Add material while nothing is due. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 11:42:50 +02:00
"studysetReorderDone": "Done",
feat(app): the studyset screen with its topics, the tree's own screen A studyset's screen, as decided with the tree (2026-09-30/10-01): - A breadcrumb from the library down to the studyset; its steps go up (replacing the location, so back leads further up), and steps that don't fit fold into a "…" listing them, nearest first. - From expanded windows on, two columns: the description over the topics, the flashcards beside them, Study and Add material in the app bar. Below that, the topics are in a drawer, opened from a bar at the bottom that also holds Study and Add material and slides away while reading onwards; the back button stays where a drawer would have taken its place. - The topics: "All topics" for the whole studyset, then the studysets inside it in their order, each with the study it invites, what it holds and its options (edit, delete), opening on top of this screen; a switch rearranges them by dragging; "New sub-studyset" creates one inside. - Study covers the studyset with everything inside it ("Learn 12" while something is due). Add material offers flashcards for now. - Options: Edit (the sheet, now with the description, edited in the whole window, and for a studyset inside another the colour of the one it is in, which a new one takes at first), Move to… (the tree and the top level, without the studyset itself and what is inside it), Archive or Unarchive with Undo, Delete with Undo, which closes the screen. - The description cut short when long, the whole a tap away; the licence as the last line, linking to its text where that is known. The list's bloc, scoped to a parent, lists its children, works out the studyset's own progress, creates inside it, reorders and moves. The card list leaves adding and studying to the screen. The inline editing of the title and description, and its bloc, are gone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-01 12:59:20 +02:00
"studysetOpenTopics": "Show topics",
"studysetTopics": "Topics",
"studysetAllTopics": "All topics",
"studysetNewSubStudyset": "New sub-studyset",
"studysetSubStudysetsEmpty": "No sub-studysets yet.",
"studysetSubStudysetsEmptyHint": "Break this studyset into milestones or lessons.",
"studysetDragToReorder": "Drag to reorder",
"studysetMoveTitle": "Move studyset to",
"studysetMoveTopLevel": "Top level",
feat(app): Home, the Library and the studyset sheets laid out as before Home: plain cards on the surface, 16 dp apart, the goal first and the Pomodoro timer after it in a new dashboard. The streak chip sits centred in the app bar, and its sheet shows the days inside a big flame and the week as marks over the weekdays' initials, with a word on today in a box. The week names its day as "Thursday, Oct 8" and its days carry no tooltip. The heatmap scrolls its weekdays with the weeks, outlines the days to come, and names a day's activities with its date. The goal card has a ring of 5 dp, a check once met and a pencil, and its sheet saves across its width with Remove goal below. Arranging puts an eye on each widget's corner and lifts the one picked up, with a tap the hand feels; with every widget hidden, Customise brings arranging back. The stepper moves to core, where the goal's sheet takes it too. Library: the counts line includes files (PDFs); Refresh in the app bar and pulling the list down sync now; a list that can't be read offers Retry, which reads it again; the star keeps its square corners. Studyset sheet: "Title *", the secondary title explained behind a question mark, Inherit as a box beside the colour, and the description in up to three lines with a chevron. Move sheet: round marks, the studyset itself marked as current, the top level only while it is inside another, archived studysets last under their heading, the destination named in the footer, and a new studyset to move into, made only once the move is. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 11:12:23 +02:00
"studysetMoveCurrent": "(current)",
"studysetMoveTopLevelRow": "Top level (no parent)",
"studysetMoveArchived": "Archived",
"studysetMoveNew": "New studyset",
"studysetMoveSelectDestination": "Select a destination",
"studysetMoveDestination": "Destination: {name}",
"@studysetMoveDestination": {"placeholders": {"name": {"type": "String"}}},
feat(app): the studyset screen with its topics, the tree's own screen A studyset's screen, as decided with the tree (2026-09-30/10-01): - A breadcrumb from the library down to the studyset; its steps go up (replacing the location, so back leads further up), and steps that don't fit fold into a "…" listing them, nearest first. - From expanded windows on, two columns: the description over the topics, the flashcards beside them, Study and Add material in the app bar. Below that, the topics are in a drawer, opened from a bar at the bottom that also holds Study and Add material and slides away while reading onwards; the back button stays where a drawer would have taken its place. - The topics: "All topics" for the whole studyset, then the studysets inside it in their order, each with the study it invites, what it holds and its options (edit, delete), opening on top of this screen; a switch rearranges them by dragging; "New sub-studyset" creates one inside. - Study covers the studyset with everything inside it ("Learn 12" while something is due). Add material offers flashcards for now. - Options: Edit (the sheet, now with the description, edited in the whole window, and for a studyset inside another the colour of the one it is in, which a new one takes at first), Move to… (the tree and the top level, without the studyset itself and what is inside it), Archive or Unarchive with Undo, Delete with Undo, which closes the screen. - The description cut short when long, the whole a tap away; the licence as the last line, linking to its text where that is known. The list's bloc, scoped to a parent, lists its children, works out the studyset's own progress, creates inside it, reorders and moves. The card list leaves adding and studying to the screen. The inline editing of the title and description, and its bloc, are gone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-01 12:59:20 +02:00
"studysetMoveConfirm": "Move",
feat(app): Home, the Library and the studyset sheets laid out as before Home: plain cards on the surface, 16 dp apart, the goal first and the Pomodoro timer after it in a new dashboard. The streak chip sits centred in the app bar, and its sheet shows the days inside a big flame and the week as marks over the weekdays' initials, with a word on today in a box. The week names its day as "Thursday, Oct 8" and its days carry no tooltip. The heatmap scrolls its weekdays with the weeks, outlines the days to come, and names a day's activities with its date. The goal card has a ring of 5 dp, a check once met and a pencil, and its sheet saves across its width with Remove goal below. Arranging puts an eye on each widget's corner and lifts the one picked up, with a tap the hand feels; with every widget hidden, Customise brings arranging back. The stepper moves to core, where the goal's sheet takes it too. Library: the counts line includes files (PDFs); Refresh in the app bar and pulling the list down sync now; a list that can't be read offers Retry, which reads it again; the star keeps its square corners. Studyset sheet: "Title *", the secondary title explained behind a question mark, Inherit as a box beside the colour, and the description in up to three lines with a chevron. Move sheet: round marks, the studyset itself marked as current, the top level only while it is inside another, archived studysets last under their heading, the destination named in the footer, and a new studyset to move into, made only once the move is. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 11:12:23 +02:00
"studysetMoveShowInside": "Show sub-studysets",
"studysetMoveHideInside": "Hide sub-studysets",
"studysetMoved": "Moved \"{title}\" to {destination}.",
"@studysetMoved": {"placeholders": {"title": {"type": "String"}, "destination": {"type": "String"}}},
feat(app): the studyset screen with its topics, the tree's own screen A studyset's screen, as decided with the tree (2026-09-30/10-01): - A breadcrumb from the library down to the studyset; its steps go up (replacing the location, so back leads further up), and steps that don't fit fold into a "…" listing them, nearest first. - From expanded windows on, two columns: the description over the topics, the flashcards beside them, Study and Add material in the app bar. Below that, the topics are in a drawer, opened from a bar at the bottom that also holds Study and Add material and slides away while reading onwards; the back button stays where a drawer would have taken its place. - The topics: "All topics" for the whole studyset, then the studysets inside it in their order, each with the study it invites, what it holds and its options (edit, delete), opening on top of this screen; a switch rearranges them by dragging; "New sub-studyset" creates one inside. - Study covers the studyset with everything inside it ("Learn 12" while something is due). Add material offers flashcards for now. - Options: Edit (the sheet, now with the description, edited in the whole window, and for a studyset inside another the colour of the one it is in, which a new one takes at first), Move to… (the tree and the top level, without the studyset itself and what is inside it), Archive or Unarchive with Undo, Delete with Undo, which closes the screen. - The description cut short when long, the whole a tap away; the licence as the last line, linking to its text where that is known. The list's bloc, scoped to a parent, lists its children, works out the studyset's own progress, creates inside it, reorders and moves. The card list leaves adding and studying to the screen. The inline editing of the title and description, and its bloc, are gone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-01 12:59:20 +02:00
"studysetReadMore": "Read more",
"studysetDescriptionTitle": "Description",
"studysetDescriptionEditTitle": "Edit description",
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>
2026-10-03 09:25:08 +02:00
"richTextSave": "Save",
feat(app): the studyset screen with its topics, the tree's own screen A studyset's screen, as decided with the tree (2026-09-30/10-01): - A breadcrumb from the library down to the studyset; its steps go up (replacing the location, so back leads further up), and steps that don't fit fold into a "…" listing them, nearest first. - From expanded windows on, two columns: the description over the topics, the flashcards beside them, Study and Add material in the app bar. Below that, the topics are in a drawer, opened from a bar at the bottom that also holds Study and Add material and slides away while reading onwards; the back button stays where a drawer would have taken its place. - The topics: "All topics" for the whole studyset, then the studysets inside it in their order, each with the study it invites, what it holds and its options (edit, delete), opening on top of this screen; a switch rearranges them by dragging; "New sub-studyset" creates one inside. - Study covers the studyset with everything inside it ("Learn 12" while something is due). Add material offers flashcards for now. - Options: Edit (the sheet, now with the description, edited in the whole window, and for a studyset inside another the colour of the one it is in, which a new one takes at first), Move to… (the tree and the top level, without the studyset itself and what is inside it), Archive or Unarchive with Undo, Delete with Undo, which closes the screen. - The description cut short when long, the whole a tap away; the licence as the last line, linking to its text where that is known. The list's bloc, scoped to a parent, lists its children, works out the studyset's own progress, creates inside it, reorders and moves. The card list leaves adding and studying to the screen. The inline editing of the title and description, and its bloc, are gone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-01 12:59:20 +02:00
"studysetSheetDescription": "Description",
feat(app): Home, the Library and the studyset sheets laid out as before Home: plain cards on the surface, 16 dp apart, the goal first and the Pomodoro timer after it in a new dashboard. The streak chip sits centred in the app bar, and its sheet shows the days inside a big flame and the week as marks over the weekdays' initials, with a word on today in a box. The week names its day as "Thursday, Oct 8" and its days carry no tooltip. The heatmap scrolls its weekdays with the weeks, outlines the days to come, and names a day's activities with its date. The goal card has a ring of 5 dp, a check once met and a pencil, and its sheet saves across its width with Remove goal below. Arranging puts an eye on each widget's corner and lifts the one picked up, with a tap the hand feels; with every widget hidden, Customise brings arranging back. The stepper moves to core, where the goal's sheet takes it too. Library: the counts line includes files (PDFs); Refresh in the app bar and pulling the list down sync now; a list that can't be read offers Retry, which reads it again; the star keeps its square corners. Studyset sheet: "Title *", the secondary title explained behind a question mark, Inherit as a box beside the colour, and the description in up to three lines with a chevron. Move sheet: round marks, the studyset itself marked as current, the top level only while it is inside another, archived studysets last under their heading, the destination named in the footer, and a new studyset to move into, made only once the move is. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 11:12:23 +02:00
"studysetSheetDescriptionAdd": "Tap to add a description",
"studysetSheetDescriptionAdded": "Description added — tap to edit",
"studysetSheetInheritColor": "Inherit",
"studysetSheetLanguages": "Languages",
"studysetSheetSetLanguages": "Set languages",
"studysetSheetLanguagesHelper": "Which language each side of the cards is in. Chinese, Japanese and Korean then show in their own character shapes.",
"studysetSheetLanguagesInherited": "Off, or with neither side set, it takes the languages of the studyset it is in.",
"studysetSheetFrontLanguage": "Front language",
"studysetSheetBackLanguage": "Back language",
"studysetSheetLanguageNotSet": "Not set",
"studysetSheetLicense": "Licence",
"studysetSheetLicenseHelp": "Help me choose",
"studysetSheetLicenseLabel": "Licence",
"studysetSheetLicenseHelper": "The terms others may use the content under, shown below the studyset with a link to them. Examples: CC-BY-4.0, CC-BY-SA-4.0, MIT, All Rights Reserved.",
"studysetSheetLicenseYear": "Year",
"studysetSheetLicenseYearHelper": "The copyright year, shown as “© 2019 Name”. Optional.",
"studysetSheetLicenseYearInvalid": "Enter a year between {min} and {max}.",
"@studysetSheetLicenseYearInvalid": {"placeholders": {"min": {"type": "int"}, "max": {"type": "int"}}},
"studysetSheetLicenseHolder": "Licence holder",
"studysetSheetLicenseHolderHelper": "Who to credit: a name or an organisation.",
"studysetSheetLicenseNewer": "{license} is an older Creative Commons licence. Its current version, {current}, may fit better.",
"@studysetSheetLicenseNewer": {"placeholders": {"license": {"type": "String"}, "current": {"type": "String"}}},
"licenseChooserTitle": "Choose a licence",
"licenseChooserSubtitle": "A few questions to find the Creative Commons licence that fits how you want your work shared.",
"licenseChooserIntroPrompt": "Do you want to keep any rights to your work?",
"licenseChooserIntroYes": "Yes, share it under a licence",
"licenseChooserIntroYesDetail": "Others must follow the conditions you choose next.",
"licenseChooserIntroNo": "No, dedicate it to the public domain",
"licenseChooserIntroNoDetail": "CC0: anyone may use it for anything, without conditions.",
"licenseChooserCommercialPrompt": "Allow others to use your work commercially?",
"licenseChooserYes": "Yes",
"licenseChooserCommercialYesDetail": "Including for profit.",
"licenseChooserNo": "No",
"licenseChooserCommercialNoDetail": "Non-commercial uses only (NC).",
"licenseChooserAdaptationsPrompt": "Allow others to adapt or build upon your work?",
"licenseChooserAdaptationsYesDetail": "Remixes and adaptations are allowed.",
"licenseChooserAdaptationsShareAlike": "Yes, if they share alike",
"licenseChooserAdaptationsShareAlikeDetail": "Adaptations carry this same licence (SA).",
"licenseChooserAdaptationsNoDetail": "Sharing only, no adaptations (ND).",
"licenseChooserBack": "Back",
"licenseChooserRecommended": "Recommended licence",
"licenseChooserUse": "Use this licence",
"licenseSummaryCc0": "Anyone may use it for anything, without conditions or credit.",
"licenseSummaryBy": "Others may share and adapt it, even commercially, as long as they credit you.",
"licenseSummaryBySa": "Others may share and adapt it, even commercially, if they credit you and license their adaptations the same way.",
"licenseSummaryByNc": "Others may share and adapt it for non-commercial purposes, with credit to you.",
"licenseSummaryByNcSa": "Others may share and adapt it non-commercially, with credit and the same licence on adaptations.",
"licenseSummaryByNd": "Others may share it, even commercially, with credit, but may not share adaptations.",
"licenseSummaryByNcNd": "Others may share it non-commercially, with credit, but may not adapt it: the strictest Creative Commons licence.",
"languageArabic": "Arabic",
"languageGerman": "German",
"languageGreek": "Greek",
"languageEnglish": "English",
"languageSpanish": "Spanish",
"languageFrench": "French",
"languageHebrew": "Hebrew",
"languageHindi": "Hindi",
"languageItalian": "Italian",
"languageJapanese": "Japanese",
"languageKorean": "Korean",
"languageDutch": "Dutch",
"languagePolish": "Polish",
"languagePortuguese": "Portuguese",
"languageRussian": "Russian",
"languageSwedish": "Swedish",
"languageThai": "Thai",
"languageTurkish": "Turkish",
"languageUkrainian": "Ukrainian",
"languageVietnamese": "Vietnamese",
"languageChineseSimplified": "Chinese (Simplified)",
"languageChineseTraditional": "Chinese (Traditional)",
feat(app): Home, the Library and the studyset sheets laid out as before Home: plain cards on the surface, 16 dp apart, the goal first and the Pomodoro timer after it in a new dashboard. The streak chip sits centred in the app bar, and its sheet shows the days inside a big flame and the week as marks over the weekdays' initials, with a word on today in a box. The week names its day as "Thursday, Oct 8" and its days carry no tooltip. The heatmap scrolls its weekdays with the weeks, outlines the days to come, and names a day's activities with its date. The goal card has a ring of 5 dp, a check once met and a pencil, and its sheet saves across its width with Remove goal below. Arranging puts an eye on each widget's corner and lifts the one picked up, with a tap the hand feels; with every widget hidden, Customise brings arranging back. The stepper moves to core, where the goal's sheet takes it too. Library: the counts line includes files (PDFs); Refresh in the app bar and pulling the list down sync now; a list that can't be read offers Retry, which reads it again; the star keeps its square corners. Studyset sheet: "Title *", the secondary title explained behind a question mark, Inherit as a box beside the colour, and the description in up to three lines with a chevron. Move sheet: round marks, the studyset itself marked as current, the top level only while it is inside another, archived studysets last under their heading, the destination named in the footer, and a new studyset to move into, made only once the move is. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 11:12:23 +02:00
"fieldRequired": "required",
feat(app): the UI foundation: theme, tabs and routes, strings The app gets its look and navigation before more features land on them. - Theme (core/theme/): hand-written light and dark Material 3 colour schemes around cobalt and copper; ThemeExtras for the colours Material has no role for (states, the four FSRS ratings); the 20 colours a person can give content. Tests hold text to WCAG AA contrast on each palette colour and on the dark theme's primary colour and surface. - Layout and shared widgets: Material 3's window-size classes (core/layout/); SectionCard, AppLoadingIndicator, confirmDestructiveAction and FoundById (core/widget/). Lucide icons. - Navigation with go_router: four tabs (Home, Library, Explore, Profile), each keeping its own stack of screens, as a navigation rail with the app's icon from 600 dp and as a navigation bar below; choosing the open tab again returns to its first screen. A studyset's screen sits in the library; studying, cards and settings cover the tabs. - Routes carry ids: FoundById finds the item in the repository's live list, so a studyset deleted on another device, or an old link, says it no longer exists. A screen that deletes its own item keeps showing it while it closes, rather than flashing that message. - Every person gets an app of their own (PersonApp, lib/src/app/): a MaterialApp.router with its own GoRouter and PersonScope around the navigator, built by SessionGate inside the person's keyed subtree. Screens read the person's repositories wherever they are built, so the static route() helpers and the listener that closed every pushed screen on a change of person are gone: a change of person now disposes the whole router and starts again at home. - The account dialog becomes the Profile tab, with Settings (sign out, delete the account, About) behind a gear. A waiting GitHub sign-in now keeps waiting while another tab shows; a change of person still cancels it. - The new screens' strings come from Flutter's gen-l10n (English for now). The generated files are committed, left out of analysis and formatting, and written anew by `flutter pub get`, so CI's check of generated code also catches stale ones. Widget tests now start the whole app (test/support/pump_app.dart) at the screen's path and move through it as a person would, by tabs and taps. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-01 00:18:31 +02:00
"exploreTitle": "Explore",
"exploreEmpty": "Studysets that others share will appear here.",
"profileTitle": "Profile",
"profileSettingsTooltip": "Settings",
"profileIdentified": "Your progress is kept with your account.",
"profileAnonymous": "Progress is saved on this device. Sign in to keep it.",
"profileSignInWithGitHub": "Sign in with GitHub",
"profileSignInFailed": "Couldn't sign in with GitHub.",
"profileContinueInBrowser": "Continue in your browser.",
"profileSwitchTitle": "Switch to your GitHub account?",
"profileSwitchMessage": "This GitHub account already has progress from another device. The studysets on this device can't be combined with it yet: if you switch, they are deleted.",
"profileSwitchStay": "Stay anonymous",
"profileSwitchConfirm": "Switch",
"settingsTitle": "Settings",
"settingsAccount": "Account",
"settingsSignOut": "Sign out",
"settingsSignOutTitle": "Sign out?",
"settingsSignOutAnonymousMessage": "This account can't be signed into again, so signing out deletes it with its progress.",
"settingsDeleteAccount": "Delete account",
"settingsDeleteTitle": "Delete your account?",
"settingsDeleteMessage": "Everything you have, your studysets, cards and reviews, is deleted on the server and on all your devices. This can't be undone.",
"settingsAbout": "About Halkyon Learn",
feat(app): the app speaks British and American English and German Settings offers English (UK), English (US) and Deutsch after the device's language, each named in its own language. app_en.arb, the template, is now British English (colour, centre) and the fallback for any language the app doesn't speak; app_en_US.arb overrides the five messages American English spells differently, and app_en_GB.arb is empty, there so that Material's texts and dates are British too. The German translation says "du" and keeps one set of terms throughout (Lernset, Karteikarte, Lernpfad; Anki's own Stapel and Unterstapel in the Anki import). arb_files_test checks that German has every message of the template and that every translation keeps its placeholders. resolveAppLocale picks the first language the device prefers that the app speaks, in its country's variant where there is one; other English is British, and a country alone never picks a language (Spanish in the United States isn't American English), which Flutter's own resolution would do. Both MaterialApps take material_ui's GlobalMaterialLocalizations delegates: gen-l10n's list brings flutter_localizations', which serve only package:flutter/material.dart, so material_ui's widgets found no Material texts in German and threw. The editor's own text blocks show our placeholders while empty (list item, to-do, quote, heading, and the desktop's / hint): the editor's own follow a locale of their own, process-wide, in few languages. The last texts written into widgets (the person's data failing to open, the cards failing to read, the About dialog) moved into the arb files. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 02:01:01 +02:00
"aboutLegalese": "Free software: the app is under the GNU Affero General Public License, version 3 or any later version, the server under the Server Side Public License, version 1.",
"aboutSourceCode": "The source of what this instance runs:",
"aboutSourceUnreachable": "Couldn't reach this instance to ask where its source is.",
"settingsAppearance": "Appearance",
"settingsAppearanceDevice": "Device theme",
"settingsAppearanceLight": "Light",
"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",
"settingsStudy": "Study",
"settingsStudyPomodoroTitle": "Show the Pomodoro timer while studying",
"settingsStudyPomodoroSubtitle": "Show the focus / break countdown inside the study session, so you can see the time left without opening the notification.",
"settingsVersion": "Version {version} (build {build})",
"@settingsVersion": {"placeholders": {"version": {"type": "String"}, "build": {"type": "String"}}},
"syncTitle": "Sync",
"syncStateSyncing": "Syncing…",
"syncStateSynced": "Everything synced",
"syncStateNotYet": "Not synced yet",
"syncStateFailing": "Sync is failing",
"syncStateMismatch": "This app can't sync with {server}",
"@syncStateMismatch": {"placeholders": {"server": {"type": "String"}}},
"syncMismatchDetail": "Update the app. If it is up to date, the server needs an update. What you do meanwhile stays on this device and syncs afterwards.",
"syncLastCompleted": "Last completed at {time}",
"@syncLastCompleted": {"placeholders": {"time": {"type": "String"}}},
"syncNoRunYet": "No sync has completed since the app started",
"syncLastFailed": "Last attempt failed at {time}",
"@syncLastFailed": {"placeholders": {"time": {"type": "String"}}},
"syncNow": "Sync now",
"syncTroubleLabel": "Sync needs attention",
"syncMismatchBanner": "This app can't sync with {server} any more. Update it to keep syncing.",
"@syncMismatchBanner": {"placeholders": {"server": {"type": "String"}}},
"syncMismatchMore": "More",
feat(app): the UI foundation: theme, tabs and routes, strings The app gets its look and navigation before more features land on them. - Theme (core/theme/): hand-written light and dark Material 3 colour schemes around cobalt and copper; ThemeExtras for the colours Material has no role for (states, the four FSRS ratings); the 20 colours a person can give content. Tests hold text to WCAG AA contrast on each palette colour and on the dark theme's primary colour and surface. - Layout and shared widgets: Material 3's window-size classes (core/layout/); SectionCard, AppLoadingIndicator, confirmDestructiveAction and FoundById (core/widget/). Lucide icons. - Navigation with go_router: four tabs (Home, Library, Explore, Profile), each keeping its own stack of screens, as a navigation rail with the app's icon from 600 dp and as a navigation bar below; choosing the open tab again returns to its first screen. A studyset's screen sits in the library; studying, cards and settings cover the tabs. - Routes carry ids: FoundById finds the item in the repository's live list, so a studyset deleted on another device, or an old link, says it no longer exists. A screen that deletes its own item keeps showing it while it closes, rather than flashing that message. - Every person gets an app of their own (PersonApp, lib/src/app/): a MaterialApp.router with its own GoRouter and PersonScope around the navigator, built by SessionGate inside the person's keyed subtree. Screens read the person's repositories wherever they are built, so the static route() helpers and the listener that closed every pushed screen on a change of person are gone: a change of person now disposes the whole router and starts again at home. - The account dialog becomes the Profile tab, with Settings (sign out, delete the account, About) behind a gear. A waiting GitHub sign-in now keeps waiting while another tab shows; a change of person still cancels it. - The new screens' strings come from Flutter's gen-l10n (English for now). The generated files are committed, left out of analysis and formatting, and written anew by `flutter pub get`, so CI's check of generated code also catches stale ones. Widget tests now start the whole app (test/support/pump_app.dart) at the screen's path and move through it as a person would, by tabs and taps. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-01 00:18:31 +02:00
"tagsReadFailed": "Couldn't read the tags.",
"notesReadFailed": "Couldn't read the notes.",
"pathsReadFailed": "Couldn't read the learning paths.",
"filesReadFailed": "Couldn't read the files.",
"tagPickerTitle": "Tags",
"tagPickerManage": "Manage tags",
"tagPickerSearchLabel": "Search or create a tag",
"tagPickerCreate": "Create \"{name}\"",
"@tagPickerCreate": {"placeholders": {"name": {"type": "String"}}},
"tagSheetCreateTitle": "Create tag",
"tagSheetEditTitle": "Edit tag",
"tagSheetNameLabel": "Name",
"tagSheetNameHelper": "Capitals don't make another tag: 'Noun' and 'noun' are one.",
"tagSheetNameExists": "The tag '{name}' exists already.",
"@tagSheetNameExists": {"placeholders": {"name": {"type": "String"}}},
"tagSheetNameMerges": "There is a tag '{name}' already: saving merges this one into it.",
"@tagSheetNameMerges": {"placeholders": {"name": {"type": "String"}}},
feat(app): the app speaks British and American English and German Settings offers English (UK), English (US) and Deutsch after the device's language, each named in its own language. app_en.arb, the template, is now British English (colour, centre) and the fallback for any language the app doesn't speak; app_en_US.arb overrides the five messages American English spells differently, and app_en_GB.arb is empty, there so that Material's texts and dates are British too. The German translation says "du" and keeps one set of terms throughout (Lernset, Karteikarte, Lernpfad; Anki's own Stapel and Unterstapel in the Anki import). arb_files_test checks that German has every message of the template and that every translation keeps its placeholders. resolveAppLocale picks the first language the device prefers that the app speaks, in its country's variant where there is one; other English is British, and a country alone never picks a language (Spanish in the United States isn't American English), which Flutter's own resolution would do. Both MaterialApps take material_ui's GlobalMaterialLocalizations delegates: gen-l10n's list brings flutter_localizations', which serve only package:flutter/material.dart, so material_ui's widgets found no Material texts in German and threw. The editor's own text blocks show our placeholders while empty (list item, to-do, quote, heading, and the desktop's / hint): the editor's own follow a locale of their own, process-wide, in few languages. The last texts written into widgets (the person's data failing to open, the cards failing to read, the About dialog) moved into the arb files. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 02:01:01 +02:00
"tagSheetColor": "Colour",
"tagSheetCreate": "Create",
"tagSheetSave": "Save",
"tagManageTitle": "Manage tags",
"tagManageEmpty": "No tags yet. Add one below.",
"tagManageAdd": "Add tag",
"tagManageRow": "{name} ({count})",
"@tagManageRow": {"description": "A tag in the list of tags, with how many flashcards have it.", "placeholders": {"name": {"type": "String"}, "count": {"type": "int"}}},
"tagManageEdit": "Edit tag",
"tagManageDelete": "Delete tag",
"tagDeleteTitle": "Delete the tag '{name}'?",
"@tagDeleteTitle": {"placeholders": {"name": {"type": "String"}}},
"tagDeleteMessage": "{count, plural, =0{It isn't on any flashcards.} =1{It is removed from 1 flashcard, on all your devices.} other{It is removed from {count} flashcards, on all your devices.}}",
"@tagDeleteMessage": {"placeholders": {"count": {"type": "int"}}},
"tagDeleteConfirm": "Delete",
"tagDeleted": "Deleted the tag '{name}'",
"@tagDeleted": {"placeholders": {"name": {"type": "String"}}},
"studySettingsTitle": "Session settings",
"studySettingsFilterByTags": "Filter by tags",
"studySettingsNoTags": "No content tags yet. Add tags to your cards to filter them here.",
"studySettingsReset": "Reset",
"studySettingsSave": "Save",
"studySettingsHeadsUpTitle": "Heads up!",
"studySettingsHeadsUpBody": "The changes you’ve made will reload the session, and you’ll lose your current progress.",
"studySettingsApplyChanges": "Apply changes",
"studySettingsPerDay": " / day",
"studySettingsMoreTags": "+{count} more",
"@studySettingsMoreTags": {"placeholders": {"count": {"type": "int"}}},
"cardTagsLabel": "Tags",
"cardTagsAdd": "Add tags",
"cardTagsEdit": "Edit tags",
"tagChipsOverflow": "+{count, plural, =1{1 tag} other{{count} tags}}",
"@tagChipsOverflow": {"placeholders": {"count": {"type": "int"}}},
"cardHints": "Hints",
"cardHint": "Hint {number}",
"@cardHint": {"placeholders": {"number": {"type": "int"}}},
"cardAddHint": "Add hint",
"cardRemoveHint": "Remove hint",
"cardExplanation": "Explanation",
"cardAddExplanation": "Add explanation",
"cardRemoveExplanation": "Remove explanation",
"cardHintsSheetTitle": "{count, plural, =1{Hint} other{Hints {count}}}",
"@cardHintsSheetTitle": {"placeholders": {"count": {"type": "int"}}},
"cardPreviousHint": "Previous hint",
"cardNextHint": "Next hint",
"cardReport": "Report",
"cardSenses": "Senses",
"cardDictionaryEntry": "Dictionary entry",
"studysetFromDictionary": "From the dictionary",
"dictionaryTitle": "Dictionary",
"dictionarySearchHint": "A word in kanji, kana or romaji, or a meaning",
"dictionaryNothingFound": "Nothing found for “{query}”.",
"@dictionaryNothingFound": {"placeholders": {"query": {"type": "String"}}},
"dictionaryUnreachable": "The dictionary can't be reached right now.",
"dictionaryRetry": "Retry",
"dictionaryAddFailed": "Couldn't add the words. Try again.",
"dictionaryMakingCards": "Making the cards…",
"dictionaryNone": "This studyset's language has no dictionary on this instance.",
"dictionaryAdd": "Add",
"dictionaryInStudyset": "In this studyset",
"dictionaryAdded": "Added “{word}”.",
"@dictionaryAdded": {"placeholders": {"word": {"type": "String"}}},
"dictionaryLevels": "Add a whole level",
"dictionaryLevelsHint": "Every word of a level becomes a flashcard, in the order of the level's list, tagged with its level and word class. Words already in this studyset are left out.",
"dictionaryLabelCommon": "Common",
"dictionaryAddLevel": "{count, plural, =1{Add 1 word} other{Add {count} words}}",
"@dictionaryAddLevel": {"placeholders": {"count": {"type": "int"}}},
"dictionaryAddingLevel": "Adding… {done} of {count}",
"@dictionaryAddingLevel": {"placeholders": {"done": {"type": "int"}, "count": {"type": "int"}}},
"dictionaryWordsAdded": "{count, plural, =0{No new words.} =1{Added 1 word.} other{Added {count} words.}}",
"@dictionaryWordsAdded": {"placeholders": {"count": {"type": "int"}}},
"dictionaryWordsSkipped": "{count, plural, =1{1 was in this studyset already.} other{{count} were in this studyset already.}}",
"@dictionaryWordsSkipped": {"placeholders": {"count": {"type": "int"}}},
"dictionaryConfirmTitle": "Add {count} words?",
"@dictionaryConfirmTitle": {"placeholders": {"count": {"type": "int"}}},
"dictionaryConfirmMessage": "Each becomes a flashcard in this studyset.",
"dictionaryConfirmAdd": "Add",
"dictionaryCredits": "Words from {sources}.",
"@dictionaryCredits": {"placeholders": {"sources": {"type": "String"}}},
"dictionaryLookUp": "Look up in the dictionary",
"aboutDictionaries": "Dictionaries on this instance",
"cardReportTitle": "Report an error",
"cardReportSubtitle": "Flag this card so you can find and fix it later.",
"cardReportTypo": "Typo",
"cardReportGrammar": "Grammar",
"cardReportContent": "Content",
"cardReportOther": "Other",
"cardReportNote": "Note",
"cardReportNoteHint": "What needs fixing?",
"cardReportSubmit": "Report",
"cardReported": "Flagged for fixing",
"cardResolveReport": "Resolve report",
"cardReportResolved": "Report resolved",
"cardBuriedBadge": "Buried",
"cardUnbury": "Unbury",
"cardTileBuried": "Flashcard buried until tomorrow",
"cardTileUnburied": "Flashcard unburied",
"cardDeleteTitle": "Delete flashcard?",
"cardDeleteMessage": "This flashcard will be removed from the studyset. You can undo this for a few seconds.",
"cardDeleted": "Flashcard deleted",
"cardFilterTooltip": "Filter",
"cardFilterTitle": "Filter",
"cardFilterTag": "Tag",
"cardFilterAllTags": "All tags",
"cardFilterNoTags": "None of these flashcards has a tag yet.",
"cardFilterClear": "Clear all",
"cardFilterApply": "Apply",
"cardFilterNothing": "No flashcards have this tag.",
feat(app): the app speaks British and American English and German Settings offers English (UK), English (US) and Deutsch after the device's language, each named in its own language. app_en.arb, the template, is now British English (colour, centre) and the fallback for any language the app doesn't speak; app_en_US.arb overrides the five messages American English spells differently, and app_en_GB.arb is empty, there so that Material's texts and dates are British too. The German translation says "du" and keeps one set of terms throughout (Lernset, Karteikarte, Lernpfad; Anki's own Stapel and Unterstapel in the Anki import). arb_files_test checks that German has every message of the template and that every translation keeps its placeholders. resolveAppLocale picks the first language the device prefers that the app speaks, in its country's variant where there is one; other English is British, and a country alone never picks a language (Spanish in the United States isn't American English), which Flutter's own resolution would do. Both MaterialApps take material_ui's GlobalMaterialLocalizations delegates: gen-l10n's list brings flutter_localizations', which serve only package:flutter/material.dart, so material_ui's widgets found no Material texts in German and threw. The editor's own text blocks show our placeholders while empty (list item, to-do, quote, heading, and the desktop's / hint): the editor's own follow a locale of their own, process-wide, in few languages. The last texts written into widgets (the person's data failing to open, the cards failing to read, the About dialog) moved into the arb files. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 02:01:01 +02:00
"cardListFailed": "Couldn't read the cards.",
"cardListMore": "More",
"cardListManageTags": "Manage tags",
"composerTitle": "Create flashcards",
"composerTitleFor": "Create flashcards for \"{title}\"",
"@composerTitleFor": {"placeholders": {"title": {"type": "String"}}},
Fix what the first Android run found The flow ran on a Pixel 9a and its emulator (2026-10-02); what it found: - The composer stayed on the card just written after "New flashcard", and on the original after "Duplicate": leaving a card changed the state before the new one was in it, so the screen took the new card for gone. It now waits for the card it asked for. - Bottom sheets reached under the status bar with the keyboard open (useSafeArea). - The field being written stayed behind the keyboard: the editor scrolls only within itself, so the card face now keeps it in view when it opens and when the keyboard rises, as a text field does. - A tap on read-only rich text put a caret in it and opened the keyboard on phones, and in the composer never opened the field. RichContentView is display only now: no selection, taps go to what surrounds it, a sound's button still plays (decided 2026-10-02). - The card types broke their names on a phone; they are choice chips that wrap (decided 2026-10-02). - The week overview marked days before the person's first activity as missed; they show nothing now. An import starts the activity too, without counting as studying (decided 2026-10-02). - A composer preview cut short gave no sign of it; it fades out over its last 32 dp, only when cut short (decided 2026-10-02). - "Isn't on this device yet" showed for any image or sound that failed; a file that is here but can't be decoded now says so, and offers no retry. - The signed-in account card was narrower than the anonymous one. - The composer's title said "Create flashcards" also when opened on a stored card; it says "Edit flashcards in …" then (decided 2026-10-02). - The Anki fixtures carry a valid PNG and a silent MP3, so they also serve to try the import by hand (decided 2026-10-02); regenerated with Anki 26.9.3. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-02 19:52:39 +02:00
"composerEditTitle": "Edit flashcards",
"composerEditTitleFor": "Edit flashcards in \"{title}\"",
"@composerEditTitleFor": {"placeholders": {"title": {"type": "String"}}},
"composerSaving": "Saving…",
"composerSaveFailed": "Save failed — retry",
"composerAllSaved": "All changes saved",
"composerNewFlashcard": "New flashcard",
"composerCollapseStack": "Collapse stack",
"composerExpandStack": "Expand stack",
"composerStatusSaving": "Saving",
"composerStatusSaved": "Saved",
"composerStatusFailed": "Save failed",
"composerSaveFailedInline": "Save failed.",
"composerRetry": "Retry",
"composerEmptyPane": "Add a flashcard to get started.",
"composerKindFlashcard": "Flashcard",
"composerKindVocabulary": "Vocabulary",
"composerKindMatching": "Matching",
"composerKindMap": "Map",
"composerLabelFront": "Front",
"composerLabelQuestion": "Question",
"composerLabelExpression": "Expression",
"composerLabelPrompt": "Prompt",
"composerLabelBack": "Back",
"composerLabelAnswers": "Answers",
"composerLabelAnswer": "Answer",
"composerPlaceholderFront": "Add question",
"composerPlaceholderExpression": "Add expression",
"composerPlaceholderPrompt": "Add prompt",
"composerAddAnswer": "Add answer",
"composerCorrectAnswer": "Correct answer",
"composerWrongAnswer": "Wrong answer",
"composerRemoveAnswer": "Remove answer",
"composerPin": "Pin {field}: keep it for the next card",
"@composerPin": {"placeholders": {"field": {"type": "String"}}},
"composerUnpin": "Unpin {field}: clear it for the next card",
"@composerUnpin": {"placeholders": {"field": {"type": "String"}}},
"composerTags": "Tags",
"composerAddTags": "Add tags",
"composerMoreActions": "More actions",
"composerDuplicate": "Duplicate",
"composerClearFields": "Clear fields",
"composerDelete": "Delete",
"composerDeleteTitle": "Delete this flashcard?",
"composerDeleteDraftMessage": "The draft will be removed from this session. It has not been saved.",
"composerDeleteSavedMessage": "The flashcard will be removed from the studyset, on all your devices.",
"composerDiscardTitle": "{count, plural, =1{Discard unsaved flashcard?} other{Discard unsaved flashcards?}}",
"@composerDiscardTitle": {"placeholders": {"count": {"type": "int"}}},
"composerDiscardMessage": "{count, plural, =1{1 flashcard hasn't been saved yet. Leaving now will discard it.} other{{count} flashcards haven't been saved yet. Leaving now will discard them.}}",
"@composerDiscardMessage": {"placeholders": {"count": {"type": "int"}}},
"composerDiscardConfirm": "Discard",
"composerConflict": "This flashcard was changed differently on two devices. Choose the version to keep of each part below.",
"composerKeepThis": "Keep this",
feat(app): notes in the studyset screen, written in the whole window - A Notes tab beside Flashcards lists a studyset's notes in order: the title ("Untitled note" without one) and when each was last edited ("Edited 5 minutes ago", by the calendar from yesterday on, the date after a week); Edit and Delete behind its options. Deleting asks, then offers Undo for a moment (`NoteDeletions`). With none, the tab says so. - "Create a note" in Add material opens a new note over the tabs; so does a note of the list. The note: a title, its tags once it exists, and its text at reading width; the app bar says how saving stands. - `NoteEditorBloc` saves after 5 seconds without typing, when the app goes to the background, and when the note is closed (the bloc saves as it closes, so leaving never waits, and the write outlives the screen). Each save builds on the revisions the editor started from; another device's change takes over a note with nothing unsaved, and merges with one that has. A note changed differently on two devices is read-only until the person keeps a version of each field in conflict. A new note is created by its first save, never when left blank; a note deleted elsewhere says it no longer exists. - The editor gains a format bar, docked below it while it has the focus (`RichContentEditor(formatBar: true)`): alignment, bold, italic, underline, superscript and subscript. It takes no focus, so the selection stays. Superscript and subscript are inline marks of their own, drawn by the font's raised and lowered glyphs in editors and read-only text alike. - The library's and the topics' counts include notes (a studyset with what is inside it, as for cards). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-02 22:30:53 +02:00
"formatAlignLeft": "Align left",
feat(app): the app speaks British and American English and German Settings offers English (UK), English (US) and Deutsch after the device's language, each named in its own language. app_en.arb, the template, is now British English (colour, centre) and the fallback for any language the app doesn't speak; app_en_US.arb overrides the five messages American English spells differently, and app_en_GB.arb is empty, there so that Material's texts and dates are British too. The German translation says "du" and keeps one set of terms throughout (Lernset, Karteikarte, Lernpfad; Anki's own Stapel and Unterstapel in the Anki import). arb_files_test checks that German has every message of the template and that every translation keeps its placeholders. resolveAppLocale picks the first language the device prefers that the app speaks, in its country's variant where there is one; other English is British, and a country alone never picks a language (Spanish in the United States isn't American English), which Flutter's own resolution would do. Both MaterialApps take material_ui's GlobalMaterialLocalizations delegates: gen-l10n's list brings flutter_localizations', which serve only package:flutter/material.dart, so material_ui's widgets found no Material texts in German and threw. The editor's own text blocks show our placeholders while empty (list item, to-do, quote, heading, and the desktop's / hint): the editor's own follow a locale of their own, process-wide, in few languages. The last texts written into widgets (the person's data failing to open, the cards failing to read, the About dialog) moved into the arb files. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 02:01:01 +02:00
"formatAlignCenter": "Centre",
feat(app): notes in the studyset screen, written in the whole window - A Notes tab beside Flashcards lists a studyset's notes in order: the title ("Untitled note" without one) and when each was last edited ("Edited 5 minutes ago", by the calendar from yesterday on, the date after a week); Edit and Delete behind its options. Deleting asks, then offers Undo for a moment (`NoteDeletions`). With none, the tab says so. - "Create a note" in Add material opens a new note over the tabs; so does a note of the list. The note: a title, its tags once it exists, and its text at reading width; the app bar says how saving stands. - `NoteEditorBloc` saves after 5 seconds without typing, when the app goes to the background, and when the note is closed (the bloc saves as it closes, so leaving never waits, and the write outlives the screen). Each save builds on the revisions the editor started from; another device's change takes over a note with nothing unsaved, and merges with one that has. A note changed differently on two devices is read-only until the person keeps a version of each field in conflict. A new note is created by its first save, never when left blank; a note deleted elsewhere says it no longer exists. - The editor gains a format bar, docked below it while it has the focus (`RichContentEditor(formatBar: true)`): alignment, bold, italic, underline, superscript and subscript. It takes no focus, so the selection stays. Superscript and subscript are inline marks of their own, drawn by the font's raised and lowered glyphs in editors and read-only text alike. - The library's and the topics' counts include notes (a studyset with what is inside it, as for cards). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-02 22:30:53 +02:00
"formatAlignRight": "Align right",
"formatBold": "Bold",
"formatItalic": "Italic",
"formatUnderline": "Underline",
"formatSuperscript": "Superscript",
"formatSubscript": "Subscript",
"formatRuby": "Furigana (a reading above the text)",
"rubyTitle": "Furigana",
"rubyReading": "Reading",
"rubyReadingHint": "In kana, e.g. かんじ",
"rubySave": "Save",
"rubyRemove": "Remove",
"vocabularyReading": "Reading",
"vocabularyReadingHint": "Kana reading",
"vocabularyMeanings": "Meanings",
"vocabularyPrimaryMeaningHint": "Primary meaning",
"vocabularyMeaningHint": "Meaning",
"vocabularyAddMeaning": "Add meaning",
"vocabularyRemoveMeaning": "Remove meaning",
"vocabularyGlossHint": "Translation",
"vocabularyAddGloss": "Add translation",
"vocabularyRemoveGloss": "Remove translation",
"vocabularyAddSense": "Add sense",
"vocabularyRemoveSense": "Remove sense",
"matchingCategories": "Categories",
"matchingCategoriesHint": "The drop-zone cards learners drag items onto. Each category needs at least one item, so a card can't have more categories than items.",
"matchingCategory": "Category {number}",
"@matchingCategory": {"placeholders": {"number": {"type": "int"}}},
"matchingAddCategory": "Add category",
"matchingAddCategoryBlocked": "Add an item first: a card can't have more categories than items",
"matchingRemoveCategory": "Remove category",
"matchingMinCategories": "At least two categories required",
"matchingItems": "Items",
"matchingItemsHint": "The draggable items. Assign every item to its correct category: an unassigned item can never be placed right.",
"matchingItem": "Item {number}",
"@matchingItem": {"placeholders": {"number": {"type": "int"}}},
"matchingAddItem": "Add item",
"matchingUnassigned": "Unassigned",
"matchingRemoveItem": "Remove item",
"matchingMinItems": "At least two items required",
"cardTileOptions": "Options",
"cardTileEdit": "Edit",
"cardTileDelete": "Delete",
"cardTileUntitled": "Untitled",
"cardTileConflict": "Changed on two devices",
"studyClose": "Close session",
"studyReviewsDueTitle": "You have reviews due",
"studyReviewsDueBody": "{reviews, plural, =1{1 card is} other{{reviews} cards are}} due for review. Learning {news, plural, =1{1 new card} other{{news} new cards}} now will add to your review load.",
"@studyReviewsDueBody": {"placeholders": {"reviews": {"type": "int"}, "news": {"type": "int"}}},
"studyReviewsDueAllTagsNote": "“Review first” studies the whole backlog across every tag — your tag filter doesn't apply until it's clear.",
"studyReviewFirst": "Review first",
"studyLearnAnyway": "Learn anyway",
"studySettingsTagFilterPausedForBacklog": "This session is clearing your review backlog across every tag, so these tags aren't narrowing it. They apply again to your next session.",
"studyBuryCard": "Bury until tomorrow",
"studyCardBuried": "Card buried until tomorrow",
"studyUndo": "Undo",
"studyLockScreen": "Lock screen",
"studyUnlock": "Unlock",
"studyTapToUnlock": "Tap to unlock",
"studyLoadFailed": "Couldn't read this session.",
"studyRatingFailed": "Couldn't keep your rating. Rate the card again.",
"studyRetry": "Retry",
"studyScopeTitle": "Study scope",
"studyScopeDescription": "This studyset has sub-studysets. Pick which cards to review.",
"studyScopeEverythingTitle": "Everything",
"studyScopeEverythingSubtitle": "This studyset and all sub-studysets",
"studyScopeSelfTitle": "This studyset only",
"studyScopeSelfSubtitle": "Skip cards in sub-studysets",
"studyBackFirstOn": "Showing the back of cards first: tap to revert",
"studyBackFirstOff": "Show the back of cards first",
"studyShowAnswer": "Show answer",
"studyCheck": "Check",
"studySelectAll": "Select all that apply",
"studySelectOne": "Select the correct answer",
"studyMatchingInstructions": "DRAG AND DROP ONTO CARDS ABOVE",
"studyMatchingAllPlaced": "All placed",
"studyMatchingDropHere": "Drop here",
"studyMapTapPrompt": "Tap a region to answer",
"studyMapSelected": "Selected: {label}",
"@studyMapSelected": {"placeholders": {"label": {"type": "String"}}},
"studyCorrect": "Correct",
"studyCorrectLabel": "Correct — {label}",
"@studyCorrectLabel": {"placeholders": {"label": {"type": "String"}}},
"studyMapAnswer": "Answer: {answer}",
"@studyMapAnswer": {"placeholders": {"answer": {"type": "String"}}},
"studyMapPickedAnswer": "You picked {picked} · Answer: {answer}",
"@studyMapPickedAnswer": {"placeholders": {"picked": {"type": "String"}, "answer": {"type": "String"}}},
"studyRatingBad": "Bad",
"studyRatingOk": "OK",
"studyRatingGood": "Good",
"studyRatingPerfect": "Perfect",
"studyNothingTitle": "Nothing to study right now",
"studyNothingBody": "Come back later when more cards are due.",
"studyNextDue": "The next card is due in {interval}.",
"@studyNextDue": {"placeholders": {"interval": {"type": "String"}}},
"studyDone": "Done",
"studySessionComplete": "Session complete",
"studyProgressReviewed": "{reviewed} / {total} reviewed",
"@studyProgressReviewed": {"placeholders": {"reviewed": {"type": "int"}, "total": {"type": "int"}}},
"studyReviewedCount": "{reviewed} reviewed",
"@studyReviewedCount": {"placeholders": {"reviewed": {"type": "int"}}},
"studyStatCards": "Cards",
"studyStatAccuracy": "Accuracy",
"studyStatTime": "Time",
"studyDurationSec": "{sec} sec",
"@studyDurationSec": {"placeholders": {"sec": {"type": "int"}}},
"studyDurationMin": "{min} min",
"@studyDurationMin": {"placeholders": {"min": {"type": "int"}}},
"studyDurationMinSec": "{min} min {sec} sec",
"@studyDurationMinSec": {"placeholders": {"min": {"type": "int"}, "sec": {"type": "int"}}},
"studyLeaveTitle": "Leave this study session?",
"studyLeaveRated": "{count, plural, =1{Your ratings so far are saved, but the last card in this round will be discarded if you leave now.} other{Your ratings so far are saved, but the {count} cards still left in this round will be discarded if you leave now.}}",
"@studyLeaveRated": {"placeholders": {"count": {"type": "int"}}},
"studyLeaveUnrated": "{count, plural, =1{You haven’t rated this card yet — leaving ends the session without recording any progress for this round.} other{You haven’t rated any of the {count} cards in this round yet — leaving ends the session without recording any progress for it.}}",
"@studyLeaveUnrated": {"placeholders": {"count": {"type": "int"}}},
"studyLeaveConfirm": "Leave",
"studyKeepStudying": "Keep studying",
"studyInMinutes": "{count, plural, =1{in 1 min} other{in {count} min}}",
"@studyInMinutes": {"placeholders": {"count": {"type": "int"}}},
"studyInHours": "{count, plural, =1{in 1 hour} other{in {count} hours}}",
"@studyInHours": {"placeholders": {"count": {"type": "int"}}},
"studyInDays": "{count, plural, =1{in 1 day} other{in {count} days}}",
"@studyInDays": {"placeholders": {"count": {"type": "int"}}},
"studyInMonths": "{count, plural, =1{in 1 month} other{in {count} months}}",
"@studyInMonths": {"placeholders": {"count": {"type": "int"}}},
"studyInYears": "{count, plural, =1{in 1 year} other{in {count} years}}",
"@studyInYears": {"placeholders": {"count": {"type": "int"}}},
"studyContinue": "Continue learning",
"studyPrevious": "Previous card",
"studySkipCard": "Skip card",
"studyMinutes": "{count} min",
"@studyMinutes": {"placeholders": {"count": {"type": "int"}}},
"studyHours": "{count} h",
"@studyHours": {"placeholders": {"count": {"type": "int"}}},
"studyDays": "{count, plural, =1{1 day} other{{count} days}}",
"@studyDays": {"placeholders": {"count": {"type": "int"}}},
"studyMonths": "{count, plural, =1{1 month} other{{count} months}}",
"@studyMonths": {"placeholders": {"count": {"type": "int"}}},
"studyYears": "{count, plural, =1{1 year} other{{count} years}}",
"@studyYears": {"placeholders": {"count": {"type": "int"}}},
"studyFilteredBy": "{count, plural, =1{Narrowed to 1 tag} other{Narrowed to {count} tags}}",
"@studyFilteredBy": {"placeholders": {"count": {"type": "int"}}},
"studySettingsCardsPerRound": "Cards per round",
"studySettingsNewPerDay": "New cards per day",
"studySettingsNewPerDayHint": "How many never-studied cards each studyset starts a day, unless its own study options say otherwise.",
"studyOptionsTitle": "Study options",
"studyOptionsDescription": "How many cards this studyset brings a day, and which come first, on every device. The studysets inside it keep their own.",
"studyOptionsReviewsPerDay": "Reviews per day",
"studyOptionsOrder": "Order",
"studyOptionsReviewsFirst": "Reviews first",
"studyOptionsMixed": "Mixed",
"studyOptionsNewFirst": "New first",
"studyOptionsReset": "Reset to defaults",
"studySettingsUnlimited": "Unlimited",
"studySettingsSortBy": "Sort by",
"studySettingsLearnMode": "Learn mode",
"studyModeSpaced": "Spaced repetition",
"studyModeSpacedHint": "Due cards on their schedules; ratings move them.",
"studyModeCram": "Cram",
"studyModeCramHint": "Walk every card without touching the schedules.",
"studySettingsVocabulary": "Vocabulary",
"studySettingsQuizMc": "Quiz with multiple choice",
"studySettingsQuizMcDescription": "Show vocabulary cards as a multiple-choice question, with wrong answers drawn from other vocabulary in this set.",
"studySettingsTypeReading": "Type the reading",
"studySettingsTypeReadingDescription": "Words with kanji ask for their reading, typed in kana; romaji turn into kana as you type.",
"studyTypedHint": "The reading, in kana or romaji",
"studyTypedRight": "Right",
"studyTypedWrong": "You typed {answer}",
"@studyTypedWrong": {"placeholders": {"answer": {"type": "String"}}},
"studyAspectMeaning": "Meaning",
"studyAspectReading": "Reading",
"studyAspectExpression": "Expression",
"studyAspectMixed": "Mixed",
"studySettingsAspectDescription": "What to recall — the meaning, the kana reading, or the expression itself (shown the meaning). Mixed varies meaning and reading per card; cards that can’t be quizzed stay a normal flip.",
"studySortOldestFirst": "Oldest first",
"studySortRandom": "Random",
"studySortNewestFirst": "Newest first",
"studyFewer": "Decrease",
"studyMore": "Increase",
"studysetMenuReset": "Reset progress",
"studysetResetTitle": "Reset progress?",
"studysetResetMessage": "Every flashcard in it, and in the studysets inside it, starts afresh as new, on all your devices. Your study history stays. You can undo this for a few seconds.",
"studysetResetConfirm": "Reset",
"studysetResetDone": "Progress reset",
"mapUnknown": "This map needs a newer version of the app.",
"mapPickRegion": "Tap the region that answers the question; pinch or scroll to zoom.",
"mapNonePicked": "No region picked yet",
"composerPlaceholderQuestion": "Add question",
"composerLabelRegion": "Answer",
"homeStreakTooltip": "Study streak",
"homeArrange": "Arrange widgets",
"homeDone": "Done",
"homeDragToReorder": "Drag to reorder",
"homeShowWidget": "Show {label}",
"@homeShowWidget": {"placeholders": {"label": {"type": "String"}}},
"homeHideWidget": "Hide {label}",
"@homeHideWidget": {"placeholders": {"label": {"type": "String"}}},
"homeAllHidden": "All widgets are hidden",
feat(app): Home, the Library and the studyset sheets laid out as before Home: plain cards on the surface, 16 dp apart, the goal first and the Pomodoro timer after it in a new dashboard. The streak chip sits centred in the app bar, and its sheet shows the days inside a big flame and the week as marks over the weekdays' initials, with a word on today in a box. The week names its day as "Thursday, Oct 8" and its days carry no tooltip. The heatmap scrolls its weekdays with the weeks, outlines the days to come, and names a day's activities with its date. The goal card has a ring of 5 dp, a check once met and a pencil, and its sheet saves across its width with Remove goal below. Arranging puts an eye on each widget's corner and lifts the one picked up, with a tap the hand feels; with every widget hidden, Customise brings arranging back. The stepper moves to core, where the goal's sheet takes it too. Library: the counts line includes files (PDFs); Refresh in the app bar and pulling the list down sync now; a list that can't be read offers Retry, which reads it again; the star keeps its square corners. Studyset sheet: "Title *", the secondary title explained behind a question mark, Inherit as a box beside the colour, and the description in up to three lines with a chevron. Move sheet: round marks, the studyset itself marked as current, the top level only while it is inside another, archived studysets last under their heading, the destination named in the footer, and a new studyset to move into, made only once the move is. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 11:12:23 +02:00
"homeAllHiddenBody": "Bring some back to fill your dashboard.",
"homeCustomise": "Customise",
"homeWidgetGoal": "Daily goal",
"homeWidgetWeek": "Week overview",
"homeWidgetActivity": "Activity heatmap",
"homeActivityTitle": "Your activity",
"streakDays": "{count, plural, =1{1 day streak} other{{count} day streak}}",
"streakStart": "Study today to start your streak.",
"streakGrow": "Keep it going: study at least once a day to grow your streak.",
"streakFirstDay": "Review some cards today to light the first day.",
"streakComeBack": "Come back tomorrow to keep your streak.",
"streakKeepAlive": "Study today to keep your streak alive.",
"goalEditTitle": "Edit study goal",
"goalSetTitle": "Set a study goal",
"goalDescriptionDaily": "Review a number of flashcards each day. Every card you rate counts.",
"goalDescriptionWeekly": "Review a number of flashcards each week, from Monday. Every card you rate counts.",
"goalPeriod": "Period",
"goalPerDay": "Per day",
"goalPerWeek": "Per week",
"goalCardsPerDay": "Cards per day",
"goalCardsPerWeek": "Cards per week",
"goalSave": "Save goal",
"goalRemove": "Remove goal",
"goalEmptySubtitle": "Review a set number of cards each day or week.",
"goalDailyHeadline": "Daily goal",
"goalWeeklyHeadline": "Weekly goal",
"goalProgressToday": "{reviewed} of {target} cards today",
"@goalProgressToday": {"placeholders": {"reviewed": {"type": "int"}, "target": {"type": "int"}}},
"goalProgressThisWeek": "{reviewed} of {target} cards this week",
"@goalProgressThisWeek": {"placeholders": {"reviewed": {"type": "int"}, "target": {"type": "int"}}},
"goalMet": "Goal met: nice work!",
"goalRemaining": "{count} to go",
"@goalRemaining": {"placeholders": {"count": {"type": "int"}}},
"weekToday": "Today",
"weekPreviousDay": "Previous day",
"weekNextDay": "Next day",
"weekRestDay": "Rest day",
"heatmapLess": "Less",
"heatmapMore": "More",
"heatmapTotal": "{count, plural, =1{1 activity in the last year} other{{count} activities in the last year}}",
"@heatmapTotal": {"placeholders": {"count": {"type": "int"}}},
feat(app): Home, the Library and the studyset sheets laid out as before Home: plain cards on the surface, 16 dp apart, the goal first and the Pomodoro timer after it in a new dashboard. The streak chip sits centred in the app bar, and its sheet shows the days inside a big flame and the week as marks over the weekdays' initials, with a word on today in a box. The week names its day as "Thursday, Oct 8" and its days carry no tooltip. The heatmap scrolls its weekdays with the weeks, outlines the days to come, and names a day's activities with its date. The goal card has a ring of 5 dp, a check once met and a pencil, and its sheet saves across its width with Remove goal below. Arranging puts an eye on each widget's corner and lifts the one picked up, with a tap the hand feels; with every widget hidden, Customise brings arranging back. The stepper moves to core, where the goal's sheet takes it too. Library: the counts line includes files (PDFs); Refresh in the app bar and pulling the list down sync now; a list that can't be read offers Retry, which reads it again; the star keeps its square corners. Studyset sheet: "Title *", the secondary title explained behind a question mark, Inherit as a box beside the colour, and the description in up to three lines with a chevron. Move sheet: round marks, the studyset itself marked as current, the top level only while it is inside another, archived studysets last under their heading, the destination named in the footer, and a new studyset to move into, made only once the move is. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 11:12:23 +02:00
"heatmapDay": "{count, plural, =1{1 activity} other{{count} activities}} · {date}",
"@heatmapDay": {"placeholders": {"count": {"type": "int"}, "date": {"type": "String"}}},
feat(app): the UI foundation: theme, tabs and routes, strings The app gets its look and navigation before more features land on them. - Theme (core/theme/): hand-written light and dark Material 3 colour schemes around cobalt and copper; ThemeExtras for the colours Material has no role for (states, the four FSRS ratings); the 20 colours a person can give content. Tests hold text to WCAG AA contrast on each palette colour and on the dark theme's primary colour and surface. - Layout and shared widgets: Material 3's window-size classes (core/layout/); SectionCard, AppLoadingIndicator, confirmDestructiveAction and FoundById (core/widget/). Lucide icons. - Navigation with go_router: four tabs (Home, Library, Explore, Profile), each keeping its own stack of screens, as a navigation rail with the app's icon from 600 dp and as a navigation bar below; choosing the open tab again returns to its first screen. A studyset's screen sits in the library; studying, cards and settings cover the tabs. - Routes carry ids: FoundById finds the item in the repository's live list, so a studyset deleted on another device, or an old link, says it no longer exists. A screen that deletes its own item keeps showing it while it closes, rather than flashing that message. - Every person gets an app of their own (PersonApp, lib/src/app/): a MaterialApp.router with its own GoRouter and PersonScope around the navigator, built by SessionGate inside the person's keyed subtree. Screens read the person's repositories wherever they are built, so the static route() helpers and the listener that closed every pushed screen on a change of person are gone: a change of person now disposes the whole router and starts again at home. - The account dialog becomes the Profile tab, with Settings (sign out, delete the account, About) behind a gear. A waiting GitHub sign-in now keeps waiting while another tab shows; a change of person still cancels it. - The new screens' strings come from Flutter's gen-l10n (English for now). The generated files are committed, left out of analysis and formatting, and written anew by `flutter pub get`, so CI's check of generated code also catches stale ones. Widget tests now start the whole app (test/support/pump_app.dart) at the screen's path and move through it as a person would, by tabs and taps. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-01 00:18:31 +02:00
"commonCancel": "Cancel",
feat(app): editor blocks: callout, spoiler, formulas, files, video, study button Blocks beyond the editor's own, each built once for editor and view: - callout: eight kinds in theme colours, kind, title and "folded at first" from its header; written in place, left with Enter on its empty last line; never inside another - spoiler: written in plain sight, hidden behind Reveal read-only - formula on its own line, written on its own screen with a preview and snippet buttons, and formulas within a line (Σ in the format bar); set by flutter_math_fork behind MathView, LaTeX's numbered environments read as their aligned forms - image and sound picked from the device, kept as synced files - YouTube video from its link, with its start and a caption: a card until played, nothing fetched before; played in place where a web view exists (youtube_player_iframe, privacy-enhanced), else opened in the browser, behind YoutubeVideos in Dependencies - study button: a studyset, a tag or all cards, with or without its topics, back first; its StudyFocus rides on the study route and narrows that session only - tables, already in the editor, now insertable everywhere An Insert button opens on the format bar, so blocks can be inserted on phones too; the desktop's / menu lists the same blocks, translated. Card faces now dock the format bar while written, so cards get blocks and formatting on phones as well. The blocks are listed in EditorBlocks: the core's, plus the features' through EditorBlocksScope. Blocks of a type the app doesn't know say they need a newer version and stay as they are, so formatVersion stays 1. Their types and keys are in content_blocks.dart, which RichContent reads: a block's text counts as text, and a video or study button isn't blank. The path import now makes formulas real ones. integration_test/youtube_player_test.dart plays a real video through the app's player on a device, which no widget test can: YouTube refuses embeds that don't say where they are embedded. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-03 12:20:41 +02:00
"commonSave": "Save",
feat(app): the UI foundation: theme, tabs and routes, strings The app gets its look and navigation before more features land on them. - Theme (core/theme/): hand-written light and dark Material 3 colour schemes around cobalt and copper; ThemeExtras for the colours Material has no role for (states, the four FSRS ratings); the 20 colours a person can give content. Tests hold text to WCAG AA contrast on each palette colour and on the dark theme's primary colour and surface. - Layout and shared widgets: Material 3's window-size classes (core/layout/); SectionCard, AppLoadingIndicator, confirmDestructiveAction and FoundById (core/widget/). Lucide icons. - Navigation with go_router: four tabs (Home, Library, Explore, Profile), each keeping its own stack of screens, as a navigation rail with the app's icon from 600 dp and as a navigation bar below; choosing the open tab again returns to its first screen. A studyset's screen sits in the library; studying, cards and settings cover the tabs. - Routes carry ids: FoundById finds the item in the repository's live list, so a studyset deleted on another device, or an old link, says it no longer exists. A screen that deletes its own item keeps showing it while it closes, rather than flashing that message. - Every person gets an app of their own (PersonApp, lib/src/app/): a MaterialApp.router with its own GoRouter and PersonScope around the navigator, built by SessionGate inside the person's keyed subtree. Screens read the person's repositories wherever they are built, so the static route() helpers and the listener that closed every pushed screen on a change of person are gone: a change of person now disposes the whole router and starts again at home. - The account dialog becomes the Profile tab, with Settings (sign out, delete the account, About) behind a gear. A waiting GitHub sign-in now keeps waiting while another tab shows; a change of person still cancels it. - The new screens' strings come from Flutter's gen-l10n (English for now). The generated files are committed, left out of analysis and formatting, and written anew by `flutter pub get`, so CI's check of generated code also catches stale ones. Widget tests now start the whole app (test/support/pump_app.dart) at the screen's path and move through it as a person would, by tabs and taps. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-01 00:18:31 +02:00
"commonClose": "Close",
"commonUndo": "Undo",
"moreInfo": "More info",
"moreInfoCreated": "Created",
"moreInfoModified": "Last modified",
"moreInfoItemId": "Item ID",
"moreInfoStudysetId": "Studyset ID",
"moreInfoPdfId": "PDF source ID",
"moreInfoParentId": "Parent ID",
"moreInfoFile": "File",
"moreInfoReviews": "Reviews",
"moreInfoReviewCount": "Review count",
"moreInfoLastReviewed": "Last reviewed",
"moreInfoCopy": "Copy",
"copiedToClipboard": "Copied to clipboard",
feat(app): the UI foundation: theme, tabs and routes, strings The app gets its look and navigation before more features land on them. - Theme (core/theme/): hand-written light and dark Material 3 colour schemes around cobalt and copper; ThemeExtras for the colours Material has no role for (states, the four FSRS ratings); the 20 colours a person can give content. Tests hold text to WCAG AA contrast on each palette colour and on the dark theme's primary colour and surface. - Layout and shared widgets: Material 3's window-size classes (core/layout/); SectionCard, AppLoadingIndicator, confirmDestructiveAction and FoundById (core/widget/). Lucide icons. - Navigation with go_router: four tabs (Home, Library, Explore, Profile), each keeping its own stack of screens, as a navigation rail with the app's icon from 600 dp and as a navigation bar below; choosing the open tab again returns to its first screen. A studyset's screen sits in the library; studying, cards and settings cover the tabs. - Routes carry ids: FoundById finds the item in the repository's live list, so a studyset deleted on another device, or an old link, says it no longer exists. A screen that deletes its own item keeps showing it while it closes, rather than flashing that message. - Every person gets an app of their own (PersonApp, lib/src/app/): a MaterialApp.router with its own GoRouter and PersonScope around the navigator, built by SessionGate inside the person's keyed subtree. Screens read the person's repositories wherever they are built, so the static route() helpers and the listener that closed every pushed screen on a change of person are gone: a change of person now disposes the whole router and starts again at home. - The account dialog becomes the Profile tab, with Settings (sign out, delete the account, About) behind a gear. A waiting GitHub sign-in now keeps waiting while another tab shows; a change of person still cancels it. - The new screens' strings come from Flutter's gen-l10n (English for now). The generated files are committed, left out of analysis and formatting, and written anew by `flutter pub get`, so CI's check of generated code also catches stale ones. Widget tests now start the whole app (test/support/pump_app.dart) at the screen's path and move through it as a person would, by tabs and taps. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-01 00:18:31 +02:00
"commonTryAgain": "Try again",
feat(app): the app speaks British and American English and German Settings offers English (UK), English (US) and Deutsch after the device's language, each named in its own language. app_en.arb, the template, is now British English (colour, centre) and the fallback for any language the app doesn't speak; app_en_US.arb overrides the five messages American English spells differently, and app_en_GB.arb is empty, there so that Material's texts and dates are British too. The German translation says "du" and keeps one set of terms throughout (Lernset, Karteikarte, Lernpfad; Anki's own Stapel and Unterstapel in the Anki import). arb_files_test checks that German has every message of the template and that every translation keeps its placeholders. resolveAppLocale picks the first language the device prefers that the app speaks, in its country's variant where there is one; other English is British, and a country alone never picks a language (Spanish in the United States isn't American English), which Flutter's own resolution would do. Both MaterialApps take material_ui's GlobalMaterialLocalizations delegates: gen-l10n's list brings flutter_localizations', which serve only package:flutter/material.dart, so material_ui's widgets found no Material texts in German and threw. The editor's own text blocks show our placeholders while empty (list item, to-do, quote, heading, and the desktop's / hint): the editor's own follow a locale of their own, process-wide, in few languages. The last texts written into widgets (the person's data failing to open, the cards failing to read, the About dialog) moved into the arb files. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 02:01:01 +02:00
"personDataFailed": "Couldn't open this device's data.",
feat(app): the UI foundation: theme, tabs and routes, strings The app gets its look and navigation before more features land on them. - Theme (core/theme/): hand-written light and dark Material 3 colour schemes around cobalt and copper; ThemeExtras for the colours Material has no role for (states, the four FSRS ratings); the 20 colours a person can give content. Tests hold text to WCAG AA contrast on each palette colour and on the dark theme's primary colour and surface. - Layout and shared widgets: Material 3's window-size classes (core/layout/); SectionCard, AppLoadingIndicator, confirmDestructiveAction and FoundById (core/widget/). Lucide icons. - Navigation with go_router: four tabs (Home, Library, Explore, Profile), each keeping its own stack of screens, as a navigation rail with the app's icon from 600 dp and as a navigation bar below; choosing the open tab again returns to its first screen. A studyset's screen sits in the library; studying, cards and settings cover the tabs. - Routes carry ids: FoundById finds the item in the repository's live list, so a studyset deleted on another device, or an old link, says it no longer exists. A screen that deletes its own item keeps showing it while it closes, rather than flashing that message. - Every person gets an app of their own (PersonApp, lib/src/app/): a MaterialApp.router with its own GoRouter and PersonScope around the navigator, built by SessionGate inside the person's keyed subtree. Screens read the person's repositories wherever they are built, so the static route() helpers and the listener that closed every pushed screen on a change of person are gone: a change of person now disposes the whole router and starts again at home. - The account dialog becomes the Profile tab, with Settings (sign out, delete the account, About) behind a gear. A waiting GitHub sign-in now keeps waiting while another tab shows; a change of person still cancels it. - The new screens' strings come from Flutter's gen-l10n (English for now). The generated files are committed, left out of analysis and formatting, and written anew by `flutter pub get`, so CI's check of generated code also catches stale ones. Widget tests now start the whole app (test/support/pump_app.dart) at the screen's path and move through it as a person would, by tabs and taps. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-01 00:18:31 +02:00
"sessionUnreachable": "Couldn't reach the server.",
Import Anki decks with their files and history Files in content: the person's images and sounds as asset rows synced like all content, their files kept by hash on each device, uploaded after each sync, downloaded on demand and checked against their hash (core/asset/AssetRepository). Rich text names them as asset:<id> URLs, in the editor's image block and an audio block of ours; any other URL is never fetched. Sounds play through audioplayers, one at a time. Content holding only an image or a sound isn't blank, and lists show it as such. The Anki import ("Import from Anki" under Add material): .apkg and .colpkg packages in all three formats Anki has written, read on an isolate of their own. Modern packages compress everything with zstd in frames that don't record their size, which pure_zstd v1.0.0 refuses; our fork decodes them. Fields become rich text by a converter of our own (lines, lists, formatting, images, sounds, cloze deletions hidden on the front). One card per note, the files first, studysets as chosen (flatten, sub-studysets, or tags by subdeck), the notes' tags, and, if wanted, the review history, which FSRS replays: the first template's reviews to the card's schedule, a reversed note type's second to the reverse one. Imported cards say where they came from in their first revision (card schema 3); the dashboard doesn't count them as written. The test fixtures are exported by Anki itself (tool/anki/make_fixtures.py). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-02 04:52:02 +02:00
"notFoundGone": "This no longer exists. It may have been deleted on another device.",
feat(app): the studyset screen laid out as before The Study pill reads "Learn 12 flashcards" in the app bar and "Learn 12" floating, "Study" with nothing due, and is off with nothing to study, saying so. With a path not finished, a chevron beside it offers to start or continue the path: a menu in the app bar, a Study mode sheet on phones. The floating bar rises above the licence line, which takes two lines at most. Add material offers a path, flashcards, a note and a PDF, in that order; imports moved to the options' Import content, which asks for a learning path or an Anki deck. The options read Edit, Move, Study options, Import content, Reset progress, Archive, Delete. The bibliography is an outlined round button above the content, and on phones at the foot of the topics. The tabs sit on a line of their own across the card, what the tab shown offers beside them: the flashcards' filter and options, and on the paths Reorder once there are two, which turns them into handles to drag. An empty tab says so in its middle; tapping the open tab again returns to its top, and pulling a tab down syncs. The breadcrumb's steps are plain links between "›", the studyset itself bold. A long description is cut at a fixed height, measured, with Read more opening it whole under the studyset's title. A studyset that no longer exists leads back to the library. The topics: All topics on the primary colour, in view also while they are rearranged; each topic with the study it invites in a round icon, what it holds ("Empty" with nothing, files counted too), and its options (now with Reset progress) behind "…" or a long press where the finger is; New sub-studyset at the foot below a line, the list with its scrollbar always shown. All topics opens Add material while nothing is due. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 11:42:50 +02:00
"studysetBackToLibrary": "Back to library",
Import Anki decks with their files and history Files in content: the person's images and sounds as asset rows synced like all content, their files kept by hash on each device, uploaded after each sync, downloaded on demand and checked against their hash (core/asset/AssetRepository). Rich text names them as asset:<id> URLs, in the editor's image block and an audio block of ours; any other URL is never fetched. Sounds play through audioplayers, one at a time. Content holding only an image or a sound isn't blank, and lists show it as such. The Anki import ("Import from Anki" under Add material): .apkg and .colpkg packages in all three formats Anki has written, read on an isolate of their own. Modern packages compress everything with zstd in frames that don't record their size, which pure_zstd v1.0.0 refuses; our fork decodes them. Fields become rich text by a converter of our own (lines, lists, formatting, images, sounds, cloze deletions hidden on the front). One card per note, the files first, studysets as chosen (flatten, sub-studysets, or tags by subdeck), the notes' tags, and, if wanted, the review history, which FSRS replays: the first template's reviews to the card's schedule, a reversed note type's second to the reverse one. Imported cards say where they came from in their first revision (card schema 3); the dashboard doesn't count them as written. The test fixtures are exported by Anki itself (tool/anki/make_fixtures.py). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-02 04:52:02 +02:00
"fileImage": "Image",
"fileSound": "Sound",
"fileImageUnavailable": "This image isn't on this device yet. It shows once it's uploaded and you're online.",
Fix what the first Android run found The flow ran on a Pixel 9a and its emulator (2026-10-02); what it found: - The composer stayed on the card just written after "New flashcard", and on the original after "Duplicate": leaving a card changed the state before the new one was in it, so the screen took the new card for gone. It now waits for the card it asked for. - Bottom sheets reached under the status bar with the keyboard open (useSafeArea). - The field being written stayed behind the keyboard: the editor scrolls only within itself, so the card face now keeps it in view when it opens and when the keyboard rises, as a text field does. - A tap on read-only rich text put a caret in it and opened the keyboard on phones, and in the composer never opened the field. RichContentView is display only now: no selection, taps go to what surrounds it, a sound's button still plays (decided 2026-10-02). - The card types broke their names on a phone; they are choice chips that wrap (decided 2026-10-02). - The week overview marked days before the person's first activity as missed; they show nothing now. An import starts the activity too, without counting as studying (decided 2026-10-02). - A composer preview cut short gave no sign of it; it fades out over its last 32 dp, only when cut short (decided 2026-10-02). - "Isn't on this device yet" showed for any image or sound that failed; a file that is here but can't be decoded now says so, and offers no retry. - The signed-in account card was narrower than the anonymous one. - The composer's title said "Create flashcards" also when opened on a stored card; it says "Edit flashcards in …" then (decided 2026-10-02). - The Anki fixtures carry a valid PNG and a silent MP3, so they also serve to try the import by hand (decided 2026-10-02); regenerated with Anki 26.9.3. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-02 19:52:39 +02:00
"fileImageUnreadable": "This image can't be shown. Its file may be damaged, or in a format this device can't read.",
Import Anki decks with their files and history Files in content: the person's images and sounds as asset rows synced like all content, their files kept by hash on each device, uploaded after each sync, downloaded on demand and checked against their hash (core/asset/AssetRepository). Rich text names them as asset:<id> URLs, in the editor's image block and an audio block of ours; any other URL is never fetched. Sounds play through audioplayers, one at a time. Content holding only an image or a sound isn't blank, and lists show it as such. The Anki import ("Import from Anki" under Add material): .apkg and .colpkg packages in all three formats Anki has written, read on an isolate of their own. Modern packages compress everything with zstd in frames that don't record their size, which pure_zstd v1.0.0 refuses; our fork decodes them. Fields become rich text by a converter of our own (lines, lists, formatting, images, sounds, cloze deletions hidden on the front). One card per note, the files first, studysets as chosen (flatten, sub-studysets, or tags by subdeck), the notes' tags, and, if wanted, the review history, which FSRS replays: the first template's reviews to the card's schedule, a reversed note type's second to the reverse one. Imported cards say where they came from in their first revision (card schema 3); the dashboard doesn't count them as written. The test fixtures are exported by Anki itself (tool/anki/make_fixtures.py). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-02 04:52:02 +02:00
"fileFromElsewhere": "Files from the web aren't shown.",
"filePlaySound": "Play sound",
"fileStopSound": "Stop sound",
"fileSoundUnavailable": "This sound isn't on this device yet. It plays once it's uploaded and you're online.",
Fix what the first Android run found The flow ran on a Pixel 9a and its emulator (2026-10-02); what it found: - The composer stayed on the card just written after "New flashcard", and on the original after "Duplicate": leaving a card changed the state before the new one was in it, so the screen took the new card for gone. It now waits for the card it asked for. - Bottom sheets reached under the status bar with the keyboard open (useSafeArea). - The field being written stayed behind the keyboard: the editor scrolls only within itself, so the card face now keeps it in view when it opens and when the keyboard rises, as a text field does. - A tap on read-only rich text put a caret in it and opened the keyboard on phones, and in the composer never opened the field. RichContentView is display only now: no selection, taps go to what surrounds it, a sound's button still plays (decided 2026-10-02). - The card types broke their names on a phone; they are choice chips that wrap (decided 2026-10-02). - The week overview marked days before the person's first activity as missed; they show nothing now. An import starts the activity too, without counting as studying (decided 2026-10-02). - A composer preview cut short gave no sign of it; it fades out over its last 32 dp, only when cut short (decided 2026-10-02). - "Isn't on this device yet" showed for any image or sound that failed; a file that is here but can't be decoded now says so, and offers no retry. - The signed-in account card was narrower than the anonymous one. - The composer's title said "Create flashcards" also when opened on a stored card; it says "Edit flashcards in …" then (decided 2026-10-02). - The Anki fixtures carry a valid PNG and a silent MP3, so they also serve to try the import by hand (decided 2026-10-02); regenerated with Anki 26.9.3. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-02 19:52:39 +02:00
"fileSoundUnplayable": "This sound can't be played. Its file may be damaged, or in a format this device can't play.",
feat(app): editor blocks: callout, spoiler, formulas, files, video, study button Blocks beyond the editor's own, each built once for editor and view: - callout: eight kinds in theme colours, kind, title and "folded at first" from its header; written in place, left with Enter on its empty last line; never inside another - spoiler: written in plain sight, hidden behind Reveal read-only - formula on its own line, written on its own screen with a preview and snippet buttons, and formulas within a line (Σ in the format bar); set by flutter_math_fork behind MathView, LaTeX's numbered environments read as their aligned forms - image and sound picked from the device, kept as synced files - YouTube video from its link, with its start and a caption: a card until played, nothing fetched before; played in place where a web view exists (youtube_player_iframe, privacy-enhanced), else opened in the browser, behind YoutubeVideos in Dependencies - study button: a studyset, a tag or all cards, with or without its topics, back first; its StudyFocus rides on the study route and narrows that session only - tables, already in the editor, now insertable everywhere An Insert button opens on the format bar, so blocks can be inserted on phones too; the desktop's / menu lists the same blocks, translated. Card faces now dock the format bar while written, so cards get blocks and formatting on phones as well. The blocks are listed in EditorBlocks: the core's, plus the features' through EditorBlocksScope. Blocks of a type the app doesn't know say they need a newer version and stay as they are, so formatVersion stays 1. Their types and keys are in content_blocks.dart, which RichContent reads: a block's text counts as text, and a video or study button isn't blank. The path import now makes formulas real ones. integration_test/youtube_player_test.dart plays a real video through the app's player on a device, which no widget test can: YouTube refuses embeds that don't say where they are embedded. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-03 12:20:41 +02:00
"fileImages": "Images",
"fileSounds": "Sounds",
"fileNotAnImage": "This file isn't an image the app can show.",
"fileNotASound": "This file isn't a sound the app can play.",
"fileTooLarge": "This file is larger than {megabytes} MB.",
"@fileTooLarge": {
"placeholders": {
"megabytes": {"type": "int"}
}
},
"fileNotKept": "The file couldn't be kept on this device.",
"fileRemoveImage": "Remove image",
"fileRemoveSound": "Remove sound",
"editorInsert": "Insert",
"blockGroupText": "Text",
"blockGroupBlocks": "Blocks",
"blockGroupMedia": "Media",
"blockHeading": "Heading {level}",
"@blockHeading": {
"placeholders": {
"level": {"type": "int"}
}
},
"blockBulletedList": "Bulleted list",
"blockNumberedList": "Numbered list",
"blockChecklist": "Checklist",
"blockQuote": "Quote",
feat(app): the app speaks British and American English and German Settings offers English (UK), English (US) and Deutsch after the device's language, each named in its own language. app_en.arb, the template, is now British English (colour, centre) and the fallback for any language the app doesn't speak; app_en_US.arb overrides the five messages American English spells differently, and app_en_GB.arb is empty, there so that Material's texts and dates are British too. The German translation says "du" and keeps one set of terms throughout (Lernset, Karteikarte, Lernpfad; Anki's own Stapel and Unterstapel in the Anki import). arb_files_test checks that German has every message of the template and that every translation keeps its placeholders. resolveAppLocale picks the first language the device prefers that the app speaks, in its country's variant where there is one; other English is British, and a country alone never picks a language (Spanish in the United States isn't American English), which Flutter's own resolution would do. Both MaterialApps take material_ui's GlobalMaterialLocalizations delegates: gen-l10n's list brings flutter_localizations', which serve only package:flutter/material.dart, so material_ui's widgets found no Material texts in German and threw. The editor's own text blocks show our placeholders while empty (list item, to-do, quote, heading, and the desktop's / hint): the editor's own follow a locale of their own, process-wide, in few languages. The last texts written into widgets (the person's data failing to open, the cards failing to read, the About dialog) moved into the arb files. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 02:01:01 +02:00
"blockListItem": "List item",
"blockChecklistItem": "To-do",
"editorSlashHint": "Type / to insert a block, or just start typing",
feat(app): editor blocks: callout, spoiler, formulas, files, video, study button Blocks beyond the editor's own, each built once for editor and view: - callout: eight kinds in theme colours, kind, title and "folded at first" from its header; written in place, left with Enter on its empty last line; never inside another - spoiler: written in plain sight, hidden behind Reveal read-only - formula on its own line, written on its own screen with a preview and snippet buttons, and formulas within a line (Σ in the format bar); set by flutter_math_fork behind MathView, LaTeX's numbered environments read as their aligned forms - image and sound picked from the device, kept as synced files - YouTube video from its link, with its start and a caption: a card until played, nothing fetched before; played in place where a web view exists (youtube_player_iframe, privacy-enhanced), else opened in the browser, behind YoutubeVideos in Dependencies - study button: a studyset, a tag or all cards, with or without its topics, back first; its StudyFocus rides on the study route and narrows that session only - tables, already in the editor, now insertable everywhere An Insert button opens on the format bar, so blocks can be inserted on phones too; the desktop's / menu lists the same blocks, translated. Card faces now dock the format bar while written, so cards get blocks and formatting on phones as well. The blocks are listed in EditorBlocks: the core's, plus the features' through EditorBlocksScope. Blocks of a type the app doesn't know say they need a newer version and stay as they are, so formatVersion stays 1. Their types and keys are in content_blocks.dart, which RichContent reads: a block's text counts as text, and a video or study button isn't blank. The path import now makes formulas real ones. integration_test/youtube_player_test.dart plays a real video through the app's player on a device, which no widget test can: YouTube refuses embeds that don't say where they are embedded. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-03 12:20:41 +02:00
"blockDivider": "Divider",
"blockTable": "Table",
"blockRemove": "Remove",
"blockUnknown": "This part needs a newer version of the app.",
"blockCallout": "Callout",
"blockSpoiler": "Spoiler",
"calloutNote": "Note",
"calloutInfo": "Info",
"calloutTip": "Tip",
"calloutSuccess": "Success",
"calloutQuestion": "Question",
"calloutWarning": "Warning",
"calloutDanger": "Danger",
"calloutQuote": "Quote",
"calloutOptions": "Callout options",
"calloutEditTitle": "Edit title…",
"calloutFoldedAtFirst": "Folded at first",
"calloutRemove": "Remove callout",
"calloutShow": "Show",
"calloutHide": "Hide",
"calloutWriteInside": "Write inside",
"calloutTitleDialog": "Callout title",
"calloutTitleLabel": "Title",
"calloutTitleHelper": "Leave it empty to show the kind's name.",
"spoilerReveal": "Reveal",
"spoilerPlaceholder": "Hidden text, revealed on a tap",
"blockFormula": "Formula",
"formatInlineMath": "Formula in the line",
"formulaTitle": "Formula",
"formulaInLineTitle": "Formula in the line",
"formulaPreview": "Preview",
"formulaPreviewEmpty": "The formula shows here",
"formulaLatex": "LaTeX",
"formulaLatexHelper": "\\\\ starts a new line in aligned, cases or a matrix.",
"formulaEmpty": "An empty formula. Tap to write it.",
"formulaEdit": "Edit formula",
"formulaRemove": "Remove formula",
"blockYoutube": "YouTube video",
"youtubeLink": "YouTube link",
"youtubeLinkHelper": "Paste a link from YouTube.",
"youtubeNotFound": "No YouTube video in this link.",
"youtubeFound": "Found the video.",
"youtubeFoundFrom": "Found the video, starting at {time}.",
"@youtubeFoundFrom": {
"placeholders": {
"time": {"type": "String"}
}
},
"youtubeCaption": "Caption",
"youtubeCaptionHelper": "Shown in place of the video until it plays.",
"youtubeVideo": "YouTube video",
"youtubeSource": "YouTube",
"youtubeFrom": "YouTube · from {time}",
"@youtubeFrom": {
"placeholders": {
"time": {"type": "String"}
}
},
"youtubeEdit": "Edit video",
"youtubePlay": "Play video",
"youtubeOpen": "Open on YouTube",
"youtubeRemove": "Remove video",
"youtubeBroken": "This video's link can't be read.",
"youtubeNotOpened": "Couldn't open YouTube.",
"blockStudyButton": "Study button",
"studyButtonDefaultLabel": "Study",
"studyButtonStudyset": "Studyset to study",
"studyButtonTag": "Cards",
"studyButtonAllCards": "All cards",
"studyButtonLabel": "Label",
"studyButtonTopics": "With its topics",
"studyButtonBackFirst": "Back first",
"studyButtonBackFirstHelper": "Front/back and vocabulary cards ask their back.",
"studyButtonWithTag": "Tagged {tag}",
"@studyButtonWithTag": {
"placeholders": {
"tag": {"type": "String"}
}
},
"studyButtonAlone": "Without its topics",
"studyButtonEdit": "Edit study button",
"studyButtonRemove": "Remove study button",
"studyButtonBroken": "This study button doesn't say what to study.",
"studyButtonGone": "That studyset no longer exists.",
feat: PDF sources: read, take notes and cards from pages, deadlines PDFs live in a studyset's new Files tab: uploaded from Add material (a file the studyset holds already asks first), each row with its pages, cards, notes and size, how far it is read and its reading deadline; renamed, given a deadline (a page or a chapter by a day), marked as read, started afresh, deleted with a moment to undo. The reader (/pdfs/:id) opens where reading left off: on wide windows a rail of tools (search, fit, zoom, fullscreen), a page counter with the chapter, and a sidebar; on phones a top bar, a page scrubber and a sheet. The sidebar holds the PDF's flashcards, by page or chapter, made from selected text or written there, each tied to its page and tagged with its chapter; and the page's note, an ordinary note tied to the page. Screenshots of a region become images that know their page. Cards and screenshots lead back to their page; reading on past a chapter with cards suggests studying it. Home shows the deadlines running and to come, and a timeline of them. Server: pdf_source rows (content in the payload, last writer wins) and an append-only pdf_reading log, the furthest page derived from it so devices never conflict. Files up to 50 MB for PDFs (20 MB for others; a larger file that isn't a PDF is deleted once stored). A deleted PDF takes its file's asset row along unless another PDF has the same file. Card payload 4 and note payload 2 keep the page. The reader draws with pdfrx (PDFium) behind PdfEngine in Dependencies; widget tests use a fake, and integration_test/pdf_engine_test.dart checks the real engine on a device or the desktop. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-03 14:40:08 +02:00
"pdfPageField": "PDF page",
"studysetTabFiles": "Files",
"pdfUploadMenu": "Upload a PDF",
"pdfFileType": "PDFs",
"pdfAdded": "Added \"{title}\".",
"@pdfAdded": {"placeholders": {"title": {"type": "String"}}},
"pdfNotPdf": "This file isn't a PDF.",
"pdfTooLarge": "This PDF is larger than {megabytes} MB.",
"@pdfTooLarge": {"placeholders": {"megabytes": {"type": "int"}}},
"pdfDuplicateTitle": "PDF already here",
"pdfDuplicateMessage": "This file is \"{title}\", which this studyset holds already. Add it as a copy, or keep the one there?",
"@pdfDuplicateMessage": {"placeholders": {"title": {"type": "String"}}},
"pdfDuplicateKeep": "Keep the one there",
"pdfDuplicateAdd": "Add a copy",
"filesEmpty": "No files yet",
"filesEmptyHint": "Use \"Add material → Upload a PDF\" to add one.",
"filesSort": "Sort",
"filesSortCustom": "Custom order",
feat: PDF sources: read, take notes and cards from pages, deadlines PDFs live in a studyset's new Files tab: uploaded from Add material (a file the studyset holds already asks first), each row with its pages, cards, notes and size, how far it is read and its reading deadline; renamed, given a deadline (a page or a chapter by a day), marked as read, started afresh, deleted with a moment to undo. The reader (/pdfs/:id) opens where reading left off: on wide windows a rail of tools (search, fit, zoom, fullscreen), a page counter with the chapter, and a sidebar; on phones a top bar, a page scrubber and a sheet. The sidebar holds the PDF's flashcards, by page or chapter, made from selected text or written there, each tied to its page and tagged with its chapter; and the page's note, an ordinary note tied to the page. Screenshots of a region become images that know their page. Cards and screenshots lead back to their page; reading on past a chapter with cards suggests studying it. Home shows the deadlines running and to come, and a timeline of them. Server: pdf_source rows (content in the payload, last writer wins) and an append-only pdf_reading log, the furthest page derived from it so devices never conflict. Files up to 50 MB for PDFs (20 MB for others; a larger file that isn't a PDF is deleted once stored). A deleted PDF takes its file's asset row along unless another PDF has the same file. Card payload 4 and note payload 2 keep the page. The reader draws with pdfrx (PDFium) behind PdfEngine in Dependencies; widget tests use a fake, and integration_test/pdf_engine_test.dart checks the real engine on a device or the desktop. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-03 14:40:08 +02:00
"filesSortName": "Name (A–Z)",
"filesSortNewest": "Newest first",
"filesSortOldest": "Oldest first",
"filesSortLargest": "Largest first",
"pdfPages": "{count, plural, =1{1 page} other{{count} pages}}",
"@pdfPages": {"placeholders": {"count": {"type": "int"}}},
"pdfPercentRead": "{percent}% read",
"@pdfPercentRead": {"placeholders": {"percent": {"type": "int"}}},
"pdfDeadlineMet": "Reading deadline met",
"pdfDeadlineUpcoming": "Starts in {days, plural, =1{1 day} other{{days} days}} — {pages}/day planned",
"@pdfDeadlineUpcoming": {"placeholders": {"days": {"type": "int"}, "pages": {"type": "int"}}},
"pdfDeadlinePassed": "Deadline passed — {pages, plural, =1{1 page} other{{pages} pages}} left",
"@pdfDeadlinePassed": {"placeholders": {"pages": {"type": "int"}}},
"pdfDeadlineToday": "Due today — {pages, plural, =1{1 page} other{{pages} pages}} left",
"@pdfDeadlineToday": {"placeholders": {"pages": {"type": "int"}}},
"pdfDeadlinePace": "{pages}/day to reach page {target} in {days, plural, =1{1 day} other{{days} days}}",
"@pdfDeadlinePace": {"placeholders": {"pages": {"type": "int"}, "target": {"type": "int"}, "days": {"type": "int"}}},
"pdfOptions": "Actions",
"pdfRename": "Rename",
"pdfRenameTitle": "Rename PDF",
"pdfRenameLabel": "Title",
"pdfSetDeadline": "Set reading deadline",
"pdfEditDeadline": "Edit reading deadline",
"pdfMarkFinished": "Mark as finished",
"pdfResetReading": "Reset reading progress",
"pdfResetTitle": "Reset reading progress?",
"pdfResetMessage": "How far you've read \"{title}\" is forgotten. The PDF, its flashcards and notes stay.",
"@pdfResetMessage": {"placeholders": {"title": {"type": "String"}}},
"pdfResetConfirm": "Reset",
"pdfMoreInfo": "More info",
"pdfInfoFileName": "File name",
"pdfInfoSize": "Size",
"pdfInfoPages": "Pages",
"pdfInfoUnknown": "Known once it is opened",
"pdfDelete": "Delete",
"pdfDeleteTitle": "Delete PDF?",
"pdfDeleteMessage": "\"{title}\" is removed from this studyset, with how far it was read. Flashcards and notes made from it stay.",
"@pdfDeleteMessage": {"placeholders": {"title": {"type": "String"}}},
"pdfDeleteConfirm": "Delete",
"pdfDeleted": "PDF deleted",
"deadlineSheetSet": "Set a reading deadline",
"deadlineSheetEdit": "Edit reading deadline",
"deadlineSheetHelp": "Reach a page by a day. Progress follows the furthest page you reach as you read.",
"deadlineReachPageOf": "Reach page (of {count})",
"@deadlineReachPageOf": {"placeholders": {"count": {"type": "int"}}},
"deadlineReachPage": "Reach page",
"deadlineDecrease": "Decrease",
"deadlineIncrease": "Increase",
"deadlineChapter": "Or finish a chapter",
"deadlineChapterEntry": "{title} · to p.{page}",
"@deadlineChapterEntry": {"placeholders": {"title": {"type": "String"}, "page": {"type": "int"}}},
"deadlineBy": "By",
"deadlineStart": "Start on",
"deadlineStartToday": "Today",
"deadlineStartReset": "Start today",
"deadlineStartHelp": "The daily pace counts from this day on. Until then the PDF waits under \"Upcoming\".",
"deadlineSave": "Save deadline",
"deadlineRemove": "Remove deadline",
"readerMissing": "This PDF isn't on this device yet. It opens once the device that added it has uploaded it and you're online.",
"readerUnreadable": "This file can't be read as a PDF.",
"readerBack": "Back to studyset",
"readerSearch": "Search PDF",
"readerFitWidth": "Fit width",
"readerFitHeight": "Fit height",
"readerZoomIn": "Zoom in",
"readerZoomOut": "Zoom out",
"readerSetZoom": "Set zoom",
"readerZoomTitle": "Zoom",
"readerZoomApply": "Apply",
"readerFullscreen": "Fullscreen",
"readerExitFullscreen": "Exit fullscreen",
"readerPreviousPage": "Previous page",
"readerNextPage": "Next page",
"readerPageOf": "/ {count}",
"@readerPageOf": {"placeholders": {"count": {"type": "int"}}},
"readerFindHint": "Find in PDF",
"readerMatchOf": "{current} of {total}",
"@readerMatchOf": {"placeholders": {"current": {"type": "int"}, "total": {"type": "int"}}},
"readerPreviousMatch": "Previous match",
"readerNextMatch": "Next match",
"readerCloseSearch": "Close search",
"readerExpand": "Expand",
"readerCollapse": "Collapse",
"readerTabFlashcards": "Flashcards",
"readerTabNotes": "Notes",
"readerCardCreated": "Flashcard created",
"readerCardDeleteTitle": "Delete flashcard?",
"readerCardDeleteMessage": "The flashcard is deleted, with how it was studied.",
"readerCardDeleteConfirm": "Delete",
"readerFrontMatter": "Front matter",
"readerPage": "Page {page}",
"@readerPage": {"placeholders": {"page": {"type": "int"}}},
"readerByPage": "Page",
"readerByChapter": "Chapter",
"readerCardsEmpty": "Select text to make flashcards in no time",
"readerCardsEmptyHint": "Select the lines that matter and send them to a question or an answer, or press \"Create flashcard\".",
"readerCreateCard": "Create flashcard",
"readerEditCard": "Edit flashcard",
"readerBackToCards": "Back to flashcards",
"readerReferencedPage": "Referenced page: {page}",
"@readerReferencedPage": {"placeholders": {"page": {"type": "int"}}},
"readerUseCurrentPage": "Use current ({page})",
"@readerUseCurrentPage": {"placeholders": {"page": {"type": "int"}}},
"readerQuestion": "Question",
"readerAnswer": "Answer",
"readerKeepOpen": "Keep creation mode open",
"readerClear": "Clear",
"readerCreate": "Create",
"readerUntitledCard": "Untitled flashcard",
"readerCardOptions": "Card options",
"readerNoteSaved": "Saved",
"readerNoteEditing": "Editing…",
"readerNoteSaving": "Saving…",
"readerNoteFailed": "Save failed",
"readerToQuestion": "Question",
"readerToAnswer": "Answer",
"readerToNote": "Notes",
"readerLineBreaksJoined": "Line breaks joined (tap to keep)",
"readerLineBreaksKept": "Line breaks kept (tap to join)",
"blockScreenshot": "Screenshot of the page",
"readerCaptureCancel": "Cancel screenshot",
"readerCaptureHint": "Drag over the part of the page to keep",
"readerCaptureFailed": "The page couldn't be drawn. Try again once it has loaded.",
"readerScreenshotSaved": "Screenshot saved",
"imageOpenPdfPage": "Open the PDF at this page",
feat(app): Home, the Library and the studyset sheets laid out as before Home: plain cards on the surface, 16 dp apart, the goal first and the Pomodoro timer after it in a new dashboard. The streak chip sits centred in the app bar, and its sheet shows the days inside a big flame and the week as marks over the weekdays' initials, with a word on today in a box. The week names its day as "Thursday, Oct 8" and its days carry no tooltip. The heatmap scrolls its weekdays with the weeks, outlines the days to come, and names a day's activities with its date. The goal card has a ring of 5 dp, a check once met and a pencil, and its sheet saves across its width with Remove goal below. Arranging puts an eye on each widget's corner and lifts the one picked up, with a tap the hand feels; with every widget hidden, Customise brings arranging back. The stepper moves to core, where the goal's sheet takes it too. Library: the counts line includes files (PDFs); Refresh in the app bar and pulling the list down sync now; a list that can't be read offers Retry, which reads it again; the star keeps its square corners. Studyset sheet: "Title *", the secondary title explained behind a question mark, Inherit as a box beside the colour, and the description in up to three lines with a chevron. Move sheet: round marks, the studyset itself marked as current, the top level only while it is inside another, archived studysets last under their heading, the destination named in the footer, and a new studyset to move into, made only once the move is. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 11:12:23 +02:00
"homeWidgetDeadlines": "PDF reading deadlines",
feat: PDF sources: read, take notes and cards from pages, deadlines PDFs live in a studyset's new Files tab: uploaded from Add material (a file the studyset holds already asks first), each row with its pages, cards, notes and size, how far it is read and its reading deadline; renamed, given a deadline (a page or a chapter by a day), marked as read, started afresh, deleted with a moment to undo. The reader (/pdfs/:id) opens where reading left off: on wide windows a rail of tools (search, fit, zoom, fullscreen), a page counter with the chapter, and a sidebar; on phones a top bar, a page scrubber and a sheet. The sidebar holds the PDF's flashcards, by page or chapter, made from selected text or written there, each tied to its page and tagged with its chapter; and the page's note, an ordinary note tied to the page. Screenshots of a region become images that know their page. Cards and screenshots lead back to their page; reading on past a chapter with cards suggests studying it. Home shows the deadlines running and to come, and a timeline of them. Server: pdf_source rows (content in the payload, last writer wins) and an append-only pdf_reading log, the furthest page derived from it so devices never conflict. Files up to 50 MB for PDFs (20 MB for others; a larger file that isn't a PDF is deleted once stored). A deleted PDF takes its file's asset row along unless another PDF has the same file. Card payload 4 and note payload 2 keep the page. The reader draws with pdfrx (PDFium) behind PdfEngine in Dependencies; widget tests use a fake, and integration_test/pdf_engine_test.dart checks the real engine on a device or the desktop. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-03 14:40:08 +02:00
"deadlinesTitle": "Reading deadlines",
"deadlinesCurrent": "Current",
"deadlinesUpcoming": "Upcoming",
"deadlinesProgress": "p.{furthest}/{target} · {when}",
"@deadlinesProgress": {"placeholders": {"furthest": {"type": "int"}, "target": {"type": "int"}, "when": {"type": "String"}}},
"deadlinePassedShort": "deadline passed",
"deadlineDueTodayShort": "due today",
"deadlineDaysLeft": "{days, plural, =1{1 day left} other{{days} days left}}",
"@deadlineDaysLeft": {"placeholders": {"days": {"type": "int"}}},
"deadlineToPageToday": "to p.{page} today",
"@deadlineToPageToday": {"placeholders": {"page": {"type": "int"}}},
"deadlineStartsIn": "Starts in {days, plural, =1{1 day} other{{days} days}}",
"@deadlineStartsIn": {"placeholders": {"days": {"type": "int"}}},
"deadlinesPlaceholder": "Appears when you have reading deadlines",
"deadlinesOpenTimeline": "Open the timeline",
"timelineTitle": "Reading timeline",
"timelineEmpty": "No reading deadlines yet",
"timelineEmptyHint": "Set a reading deadline on a PDF to see it here.",
"timelineToday": "Today",
"timelinePages": "p.{furthest}/{target}",
"@timelinePages": {"placeholders": {"furthest": {"type": "int"}, "target": {"type": "int"}}},
"chapterFinished": "Finished “{chapter}” — study the {count, plural, =1{card} other{{count} cards}} you made?",
"@chapterFinished": {"placeholders": {"chapter": {"type": "String"}, "count": {"type": "int"}}},
"chapterStudyNow": "Study now",
"chapterDismiss": "Dismiss",
"deadlineChapterLoading": "Loading chapters…",
"fileSizeKb": "{size} KB",
"@fileSizeKb": {"placeholders": {"size": {"type": "int"}}},
"fileSizeMb": "{size} MB",
"@fileSizeMb": {"placeholders": {"size": {"type": "String"}}},
"pdfPageShort": "p. {page}",
"@pdfPageShort": {
"placeholders": {
"page": {"type": "int"}
}
},
Import Anki decks with their files and history Files in content: the person's images and sounds as asset rows synced like all content, their files kept by hash on each device, uploaded after each sync, downloaded on demand and checked against their hash (core/asset/AssetRepository). Rich text names them as asset:<id> URLs, in the editor's image block and an audio block of ours; any other URL is never fetched. Sounds play through audioplayers, one at a time. Content holding only an image or a sound isn't blank, and lists show it as such. The Anki import ("Import from Anki" under Add material): .apkg and .colpkg packages in all three formats Anki has written, read on an isolate of their own. Modern packages compress everything with zstd in frames that don't record their size, which pure_zstd v1.0.0 refuses; our fork decodes them. Fields become rich text by a converter of our own (lines, lists, formatting, images, sounds, cloze deletions hidden on the front). One card per note, the files first, studysets as chosen (flatten, sub-studysets, or tags by subdeck), the notes' tags, and, if wanted, the review history, which FSRS replays: the first template's reviews to the card's schedule, a reversed note type's second to the reverse one. Imported cards say where they came from in their first revision (card schema 3); the dashboard doesn't count them as written. The test fixtures are exported by Anki itself (tool/anki/make_fixtures.py). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-02 04:52:02 +02:00
"ankiImportMenu": "Import from Anki",
"ankiImportFileType": "Anki decks",
"ankiImportTitle": "Import Anki deck",
"ankiImportOptionsTitle": "How should subdecks be imported?",
"ankiImportReading": "Reading the deck…",
"ankiImportSummary": "{cards, plural, =1{1 card.} other{{cards} cards.}}",
"@ankiImportSummary": {
"placeholders": {
"cards": {"type": "int"}
}
},
"ankiImportSummaryDecks": "{cards, plural, =1{1 card} other{{cards} cards}} across {decks} subdecks.",
"@ankiImportSummaryDecks": {
"placeholders": {
"cards": {"type": "int"},
"decks": {"type": "int"}
}
},
"ankiImportModeFlatten": "Flatten into this studyset",
"ankiImportModeFlattenSubtitle": "Import every card here and ignore the subdecks.",
"ankiImportModeSubStudysets": "Recreate as sub-studysets",
"ankiImportModeSubStudysetsSubtitle": "Mirror the subdeck tree: each subdeck becomes a nested studyset.",
"ankiImportModeTag": "Tag cards by subdeck",
"ankiImportModeTagSubtitle": "Keep every card here, tagged with each subdeck it came from.",
"ankiImportProgress": "Import study progress",
"ankiImportProgressSubtitle": "Bring Anki's review history over: cards continue where they left off. New cards stay new.",
"ankiImportMedia": "{count, plural, =1{Include media (1 file)} other{Include media ({count} files)}}",
"@ankiImportMedia": {
"placeholders": {
"count": {"type": "int"}
}
},
"ankiImportMediaSubtitle": "Keep the deck's images and sounds on the cards.",
"ankiImportMediaMayNotFit": "Its files take {size} MB, more than the {left} MB you have left: those that don't fit stay on this device, and your other devices won't show them.",
"@ankiImportMediaMayNotFit": {
"placeholders": {
"size": {"type": "String"},
"left": {"type": "String"}
}
},
Import Anki decks with their files and history Files in content: the person's images and sounds as asset rows synced like all content, their files kept by hash on each device, uploaded after each sync, downloaded on demand and checked against their hash (core/asset/AssetRepository). Rich text names them as asset:<id> URLs, in the editor's image block and an audio block of ours; any other URL is never fetched. Sounds play through audioplayers, one at a time. Content holding only an image or a sound isn't blank, and lists show it as such. The Anki import ("Import from Anki" under Add material): .apkg and .colpkg packages in all three formats Anki has written, read on an isolate of their own. Modern packages compress everything with zstd in frames that don't record their size, which pure_zstd v1.0.0 refuses; our fork decodes them. Fields become rich text by a converter of our own (lines, lists, formatting, images, sounds, cloze deletions hidden on the front). One card per note, the files first, studysets as chosen (flatten, sub-studysets, or tags by subdeck), the notes' tags, and, if wanted, the review history, which FSRS replays: the first template's reviews to the card's schedule, a reversed note type's second to the reverse one. Imported cards say where they came from in their first revision (card schema 3); the dashboard doesn't count them as written. The test fixtures are exported by Anki itself (tool/anki/make_fixtures.py). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-02 04:52:02 +02:00
"ankiImportRunning": "Importing…",
"ankiImportConfirm": "Import",
"ankiImportNotAPackage": "This isn't an Anki deck. In Anki, export a deck as an .apkg file and import that.",
"ankiImportNewerFormat": "This deck comes from a newer Anki than this app knows. Export it again with “Support older Anki versions”.",
"ankiImportUnreadable": "This deck is damaged and can't be read.",
"ankiImportBrokeOff": "The import broke off. The cards it brought in so far stay.",
"ankiImported": "{count, plural, =1{Imported 1 flashcard from Anki.} other{Imported {count} flashcards from Anki.}}",
"@ankiImported": {
"placeholders": {
"count": {"type": "int"}
}
},
"ankiImportedSubStudysets": "{count, plural, =1{Imported 1 card into sub-studysets.} other{Imported {count} cards into sub-studysets.}}",
"@ankiImportedSubStudysets": {
"placeholders": {
"count": {"type": "int"}
}
},
"ankiImportedTagged": "{count, plural, =1{Imported 1 card, tagged by subdeck.} other{Imported {count} cards, tagged by subdeck.}}",
"@ankiImportedTagged": {
"placeholders": {
"count": {"type": "int"}
}
},
"ankiImportFilesSkipped": "{count, plural, =1{1 media file couldn't be imported.} other{{count} media files couldn't be imported.}}",
"@ankiImportFilesSkipped": {
"placeholders": {
"count": {"type": "int"}
}
feat(app): a Pomodoro timer on Home, in the notification and in the top bar Home has a Pomodoro timer (decided 2026-10-07, after Goodtime): the profile it runs, chosen there while no timer is set, the time left of the phase, and Start, Pause or Resume, Skip and Stop. While studying, a small countdown sits in the study screen's header, and a tap pauses it or goes on. A phase that ends leads to the next, which starts by itself where the profile says so and otherwise waits, paused at its full length. Profiles follow the person to every device, in their settings (schema 4, still written as schema 3 while the profiles are as they come, so older apps go on reading the settings): Classic, 25 minutes of focus, 5 of break and 15 after four, and 52/17 without long breaks, built in; both can be changed, more added and deleted, from Home's card or from Settings. A profile can start breaks and focus by themselves, and keep the device quiet while focusing. The running timer is the device's own, kept in the person's folder: closed and opened again, the app catches up with the phases that ran out meanwhile. Android: the app's own foreground service (Kotlin, specialUse, as Goodtime does) shows an ongoing notification counting the phase down, with Pause or Resume, Skip and Stop; on Android 16 it is a Live Update, its progress bar the profile's cycle, each phase a segment, focus in cobalt and breaks in copper. An exact alarm (USE_EXACT_ALARM) alerts with sound and vibration when the phase ends, also with the app closed, and Do Not Disturb goes on while focusing once the person allowed it, the filter before given back afterwards. No notification plugin: flutter_local_notifications has Live Updates only in a prerelease that needs compileSdk 37; androidx.core 1.18, which the build resolved already, has every API needed. Linux, over the session bus (package:dbus, already in the build): where the desktop shows icons in its top bar (GNOME with the AppIndicator extension, which Ubuntu has built in; KDE) the timer counts down there, the buttons in the icon's menu, as a StatusNotifierItem written in Dart on the names and paths the snap's desktop plug allows; elsewhere a notification with the buttons says until when the phase runs. An alert with sound ends each phase while the app runs, and GNOME's banners stay off while focusing, through gsettings. xdg-desktop-portal's Background status, the planned fallback, serves Flatpaks only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 02:54:52 +02:00
},
"pomodoroTitle": "Pomodoro",
"pomodoroFocus": "Focus",
"pomodoroShortBreak": "Short break",
"pomodoroLongBreak": "Long break",
"pomodoroFocusOf": "Focus {done} of {total}",
"@pomodoroFocusOf": {"placeholders": {"done": {"type": "int"}, "total": {"type": "int"}}},
"pomodoroStart": "Start",
"pomodoroPause": "Pause",
"pomodoroResume": "Resume",
"pomodoroSkip": "Skip",
"pomodoroStop": "Stop",
"pomodoroPaused": "Paused",
"pomodoroPausedProfile": "Paused · {profile}",
"@pomodoroPausedProfile": {"placeholders": {"profile": {"type": "String"}}},
"pomodoroClassic": "Classic",
"pomodoroUnnamed": "Unnamed profile",
"pomodoroProfiles": "Pomodoro profiles",
"pomodoroChooseProfile": "Choose a profile",
"pomodoroAddProfile": "Add a profile",
"pomodoroEditProfile": "Edit profile",
"pomodoroName": "Name",
"pomodoroFocusLength": "Focus",
"pomodoroShortBreakLength": "Short break",
"pomodoroLongBreakLength": "Long break",
"pomodoroMinutes": "{count} min",
"@pomodoroMinutes": {"placeholders": {"count": {"type": "int"}}},
"pomodoroNoLongBreak": "None",
"pomodoroLongBreakAfter": "Focus phases before a long break",
"pomodoroAutoStartBreaks": "Start breaks by themselves",
"pomodoroAutoStartFocus": "Start focus by itself after a break",
"pomodoroDoNotDisturb": "Do Not Disturb while focusing",
"pomodoroDoNotDisturbHint": "The device keeps quiet while you focus; the alert at its end still sounds.",
"pomodoroDoNotDisturbDenied": "The app may not keep this device quiet. Allow it in the system's settings.",
"pomodoroDeleteProfile": "Delete profile",
"pomodoroSummary": "{focus} min focus, {shortBreak} min break",
"@pomodoroSummary": {"placeholders": {"focus": {"type": "int"}, "shortBreak": {"type": "int"}}},
"pomodoroSummaryLong": "{focus} min focus, {shortBreak} min break, {longBreak} min after {after}",
"@pomodoroSummaryLong": {"placeholders": {"focus": {"type": "int"}, "shortBreak": {"type": "int"}, "longBreak": {"type": "int"}, "after": {"type": "int"}}},
"pomodoroAlertFocusDone": "Time for a break",
"pomodoroAlertBreakDone": "Back to focus",
"pomodoroAlertStarts": "{phase} has started.",
"@pomodoroAlertStarts": {"placeholders": {"phase": {"type": "String"}}},
"pomodoroAlertWaits": "{phase} is ready when you are.",
"@pomodoroAlertWaits": {"placeholders": {"phase": {"type": "String"}}},
"homeWidgetPomodoro": "Pomodoro timer",
"pomodoroAlerts": "Pomodoro alerts",
"pomodoroUntil": "Until {time}",
"@pomodoroUntil": {"placeholders": {"time": {"type": "String"}}},
"pomodoroLeft": "{left} left",
"@pomodoroLeft": {"placeholders": {"left": {"type": "String"}}},
"pathImportAtStep": "Step {step}: {problem}",
"@pathImportAtStep": {"placeholders": {"step": {"type": "int"}, "problem": {"type": "String"}}},
"pathImportNotJson": "This is no JSON: {detail}",
"@pathImportNotJson": {"placeholders": {"detail": {"type": "String"}}},
"pathImportNoPath": "a \"path\" object is missing.",
"pathImportNoTitle": "the path has no \"title\".",
"pathImportDescriptionNotText": "the path's \"description\" is no text.",
"pathImportNotAnObject": "no object.",
"pathImportUnknownStepType": "unknown \"type\": {detail}.",
"@pathImportUnknownStepType": {"placeholders": {"detail": {"type": "String"}}},
"pathImportRightOptionMissing": "its right option {detail} is not among its options.",
"@pathImportRightOptionMissing": {"placeholders": {"detail": {"type": "String"}}},
"pathImportRightOptionsMissing": "it names a right option that is not among its options.",
"pathImportNoPairing": "no \"correct_pairing\".",
"pathImportPairingTargetMissing": "it pairs items with a target that isn't there: {detail}.",
"@pathImportPairingTargetMissing": {"placeholders": {"detail": {"type": "String"}}},
"pathImportPairingIncomplete": "every item must be paired with one target.",
"pathImportNoPassage": "no \"passage\".",
"pathImportBlanksMismatch": "it needs one word in \"blanks\" for each ___ in its passage.",
"pathImportBlockWithoutType": "a block without \"type\".",
"pathImportMalformedLevel": "a heading with a malformed level.",
"pathImportMalformedListItem": "a malformed list item.",
"pathImportMalformedMath": "a malformed math block.",
"pathImportMalformedCode": "a malformed code block.",
"pathImportUnknownBlock": "an unknown block: {detail}.",
"@pathImportUnknownBlock": {"placeholders": {"detail": {"type": "String"}}},
"pathImportTextlessBlock": "a {detail} without \"text\" or \"runs\".",
"@pathImportTextlessBlock": {"placeholders": {"detail": {"type": "String"}}},
"pathImportMalformedRun": "a malformed run of text.",
"pathImportListExpected": "a list was expected.",
"pathImportNotText": "\"{detail}\" must be text.",
"@pathImportNotText": {"placeholders": {"detail": {"type": "String"}}},
"pathImportTooFew": "it needs at least two \"{detail}\".",
"@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"
feat(app): the UI foundation: theme, tabs and routes, strings The app gets its look and navigation before more features land on them. - Theme (core/theme/): hand-written light and dark Material 3 colour schemes around cobalt and copper; ThemeExtras for the colours Material has no role for (states, the four FSRS ratings); the 20 colours a person can give content. Tests hold text to WCAG AA contrast on each palette colour and on the dark theme's primary colour and surface. - Layout and shared widgets: Material 3's window-size classes (core/layout/); SectionCard, AppLoadingIndicator, confirmDestructiveAction and FoundById (core/widget/). Lucide icons. - Navigation with go_router: four tabs (Home, Library, Explore, Profile), each keeping its own stack of screens, as a navigation rail with the app's icon from 600 dp and as a navigation bar below; choosing the open tab again returns to its first screen. A studyset's screen sits in the library; studying, cards and settings cover the tabs. - Routes carry ids: FoundById finds the item in the repository's live list, so a studyset deleted on another device, or an old link, says it no longer exists. A screen that deletes its own item keeps showing it while it closes, rather than flashing that message. - Every person gets an app of their own (PersonApp, lib/src/app/): a MaterialApp.router with its own GoRouter and PersonScope around the navigator, built by SessionGate inside the person's keyed subtree. Screens read the person's repositories wherever they are built, so the static route() helpers and the listener that closed every pushed screen on a change of person are gone: a change of person now disposes the whole router and starts again at home. - The account dialog becomes the Profile tab, with Settings (sign out, delete the account, About) behind a gear. A waiting GitHub sign-in now keeps waiting while another tab shows; a change of person still cancels it. - The new screens' strings come from Flutter's gen-l10n (English for now). The generated files are committed, left out of analysis and formatting, and written anew by `flutter pub get`, so CI's check of generated code also catches stale ones. Widget tests now start the whole app (test/support/pump_app.dart) at the screen's path and move through it as a person would, by tabs and taps. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-01 00:18:31 +02:00
}