halkyon/halkyon_learn_flutter/lib/l10n/app_localizations.dart

6473 lines
181 KiB
Dart
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
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:intl/intl.dart' as intl;
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
import 'app_localizations_de.dart';
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
import 'app_localizations_en.dart';
// ignore_for_file: type=lint
/// Callers can lookup localized strings with an instance of AppLocalizations
/// returned by `AppLocalizations.of(context)`.
///
/// Applications need to include `AppLocalizations.delegate()` in their app's
/// `localizationDelegates` list, and the locales they support in the app's
/// `supportedLocales` list. For example:
///
/// ```dart
/// import 'l10n/app_localizations.dart';
///
/// return MaterialApp(
/// localizationsDelegates: AppLocalizations.localizationsDelegates,
/// supportedLocales: AppLocalizations.supportedLocales,
/// home: MyApplicationHome(),
/// );
/// ```
///
/// ## Update pubspec.yaml
///
/// Please make sure to update your pubspec.yaml to include the following
/// packages:
///
/// ```yaml
/// dependencies:
/// # Internationalization support.
/// flutter_localizations:
/// sdk: flutter
/// intl: any # Use the pinned version from flutter_localizations
///
/// # Rest of dependencies
/// ```
///
/// ## iOS Applications
///
/// iOS applications define key application metadata, including supported
/// locales, in an Info.plist file that is built into the application bundle.
/// To configure the locales supported by your app, you’ll need to edit this
/// file.
///
/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file.
/// Then, in the Project Navigator, open the Info.plist file under the Runner
/// project’s Runner folder.
///
/// Next, select the Information Property List item, select Add Item from the
/// Editor menu, then select Localizations from the pop-up menu.
///
/// Select and expand the newly-created Localizations item then, for each
/// locale your application supports, add a new item and select the locale
/// you wish to add from the pop-up menu in the Value field. This list should
/// be consistent with the languages listed in the AppLocalizations.supportedLocales
/// property.
abstract class AppLocalizations {
AppLocalizations(String locale)
: localeName = intl.Intl.canonicalizedLocale(locale.toString());
final String localeName;
static AppLocalizations of(BuildContext context) {
return Localizations.of<AppLocalizations>(context, AppLocalizations)!;
}
static const LocalizationsDelegate<AppLocalizations> delegate =
_AppLocalizationsDelegate();
/// A list of this localizations delegate along with the default localizations
/// delegates.
///
/// Returns a list of localizations delegates containing this delegate along with
/// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate,
/// and GlobalWidgetsLocalizations.delegate.
///
/// Additional delegates can be added by appending to this list in
/// MaterialApp. This list does not have to be used at all if a custom list
/// of delegates is preferred or required.
static const List<LocalizationsDelegate<dynamic>> localizationsDelegates =
<LocalizationsDelegate<dynamic>>[
delegate,
GlobalMaterialLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
];
/// A list of this localizations delegate's supported locales.
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
static const List<Locale> supportedLocales = <Locale>[
Locale('de'),
Locale('en'),
Locale('en', 'GB'),
Locale('en', 'US'),
];
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
/// The app's name, e.g. in the window title and the rail's logo.
///
/// In en, this message translates to:
/// **'Halkyon Learn'**
String get appTitle;
/// No description provided for @shellTabHome.
///
/// In en, this message translates to:
/// **'Home'**
String get shellTabHome;
/// No description provided for @shellTabLibrary.
///
/// In en, this message translates to:
/// **'Library'**
String get shellTabLibrary;
/// No description provided for @shellTabExplore.
///
/// In en, this message translates to:
/// **'Explore'**
String get shellTabExplore;
/// No description provided for @shellTabProfile.
///
/// In en, this message translates to:
/// **'Profile'**
String get shellTabProfile;
/// No description provided for @homeTitle.
///
/// In en, this message translates to:
/// **'Home'**
String get homeTitle;
/// No description provided for @libraryTitle.
///
/// In en, this message translates to:
/// **'Library'**
String get libraryTitle;
/// No description provided for @libraryCreateStudyset.
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
///
/// In en, this message translates to:
/// **'Create studyset'**
String get libraryCreateStudyset;
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
/// No description provided for @libraryEmpty.
///
/// In en, this message translates to:
/// **'No studysets yet'**
String get libraryEmpty;
/// No description provided for @libraryUnreadable.
///
/// In en, this message translates to:
/// **'Couldn\'t read your studysets.'**
String get libraryUnreadable;
/// No description provided for @libraryArchivedSection.
///
/// In en, this message translates to:
/// **'Archived'**
String get libraryArchivedSection;
/// No description provided for @librarySearchTooltip.
///
/// In en, this message translates to:
/// **'Search'**
String get librarySearchTooltip;
/// No description provided for @librarySearchHint.
///
/// In en, this message translates to:
/// **'Search studysets'**
String get librarySearchHint;
/// No description provided for @librarySearchClearTooltip.
///
/// In en, this message translates to:
/// **'Clear query'**
String get librarySearchClearTooltip;
/// No description provided for @librarySearchCloseTooltip.
///
/// In en, this message translates to:
/// **'Close search'**
String get librarySearchCloseTooltip;
/// No description provided for @librarySearchNoMatches.
///
/// In en, this message translates to:
/// **'No studysets match your search'**
String get librarySearchNoMatches;
/// No description provided for @libraryStudysetArchived.
///
/// In en, this message translates to:
/// **'Studyset archived'**
String get libraryStudysetArchived;
/// No description provided for @libraryStudysetUnarchived.
///
/// In en, this message translates to:
/// **'Studyset unarchived'**
String get libraryStudysetUnarchived;
/// No description provided for @libraryStudysetDeleted.
///
/// In en, this message translates to:
/// **'Studyset deleted'**
String get libraryStudysetDeleted;
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
/// No description provided for @libraryDeleteTitle.
///
/// In en, this message translates to:
/// **'Delete studyset?'**
String get libraryDeleteTitle;
/// No description provided for @libraryDeleteMessage.
///
/// In en, this message translates to:
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
/// **'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
String get libraryDeleteMessage;
/// No description provided for @libraryDeleteConfirm.
///
/// In en, this message translates to:
/// **'Delete'**
String get libraryDeleteConfirm;
/// No description provided for @studysetSheetCreateTitle.
///
/// In en, this message translates to:
/// **'Create studyset'**
String get studysetSheetCreateTitle;
/// No description provided for @studysetSheetEditTitle.
///
/// In en, this message translates to:
/// **'Edit studyset'**
String get studysetSheetEditTitle;
/// No description provided for @studysetSheetCreate.
///
/// In en, this message translates to:
/// **'Create'**
String get studysetSheetCreate;
/// No description provided for @studysetSheetSave.
///
/// In en, this message translates to:
/// **'Save'**
String get studysetSheetSave;
/// No description provided for @studysetSheetTitleLabel.
///
/// In en, this message translates to:
/// **'Title'**
String get studysetSheetTitleLabel;
/// No description provided for @studysetSheetSecondaryLabel.
///
/// In en, this message translates to:
/// **'Secondary title'**
String get studysetSheetSecondaryLabel;
/// No description provided for @studysetSheetSecondaryHelper.
///
/// In en, this message translates to:
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
/// **'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 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
String get studysetSheetSecondaryHelper;
/// No description provided for @studysetSheetColor.
///
/// In en, this message translates to:
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
/// **'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
String get studysetSheetColor;
/// No description provided for @studysetSheetDiscardTitle.
///
/// In en, this message translates to:
/// **'Discard changes?'**
String get studysetSheetDiscardTitle;
/// No description provided for @studysetSheetDiscardMessage.
///
/// In en, this message translates to:
/// **'You have unsaved changes to this studyset. Discard them and close the form?'**
String get studysetSheetDiscardMessage;
/// No description provided for @studysetSheetDiscardConfirm.
///
/// In en, this message translates to:
/// **'Discard'**
String get studysetSheetDiscardConfirm;
/// A colour of the palette content can take, by its stored name.
///
/// In en, this message translates to:
/// **'{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}}}'**
String paletteColorName(String name);
/// No description provided for @colorPickerLabel.
///
/// In en, this message translates to:
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
/// **'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
String colorPickerLabel(String color);
/// No description provided for @studysetCountFlashcards.
///
/// In en, this message translates to:
/// **'{count, plural, =1{1 flashcard} other{{count} flashcards}}'**
String studysetCountFlashcards(int count);
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
/// No description provided for @studysetCountNotes.
///
/// In en, this message translates to:
/// **'{count, plural, =1{1 note} other{{count} notes}}'**
String studysetCountNotes(int count);
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
/// No description provided for @studysetCountFiles.
///
/// In en, this message translates to:
/// **'{count, plural, =1{1 file} other{{count} files}}'**
String studysetCountFiles(int count);
/// No description provided for @libraryRefresh.
///
/// In en, this message translates to:
/// **'Refresh'**
String get libraryRefresh;
/// No description provided for @libraryImport.
///
/// In en, this message translates to:
/// **'Import'**
String get libraryImport;
/// No description provided for @libraryImportAnkiHint.
///
/// In en, this message translates to:
/// **'Becomes a studyset of its own, from an .apkg or .colpkg file'**
String get libraryImportAnkiHint;
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
/// No description provided for @libraryRetry.
///
/// In en, this message translates to:
/// **'Retry'**
String get libraryRetry;
/// No description provided for @studysetNoContent.
///
/// In en, this message translates to:
/// **'No content yet'**
String get studysetNoContent;
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
/// No description provided for @studysetEmpty.
///
/// In en, this message translates to:
/// **'Empty'**
String get studysetEmpty;
/// No description provided for @studysetActionReview.
///
/// In en, this message translates to:
/// **'Review'**
String get studysetActionReview;
/// No description provided for @studysetActionStudy.
///
/// In en, this message translates to:
/// **'Study'**
String get studysetActionStudy;
/// No description provided for @studysetActionAdd.
///
/// In en, this message translates to:
/// **'Add content'**
String get studysetActionAdd;
/// No description provided for @studysetArchived.
///
/// In en, this message translates to:
/// **'Archived'**
String get studysetArchived;
/// No description provided for @studysetStar.
///
/// In en, this message translates to:
/// **'Star'**
String get studysetStar;
/// No description provided for @studysetUnstar.
///
/// In en, this message translates to:
/// **'Unstar'**
String get studysetUnstar;
/// No description provided for @studysetOptions.
///
/// In en, this message translates to:
/// **'Options'**
String get studysetOptions;
/// No description provided for @studysetBibliography.
///
/// In en, this message translates to:
/// **'Bibliography'**
String get studysetBibliography;
/// No description provided for @studysetBibliographyIntro.
///
/// In en, this message translates to:
/// **'Works cited across this studyset, in the citation style chosen in Settings.'**
String get studysetBibliographyIntro;
/// No description provided for @studysetMenuEdit.
///
/// In en, this message translates to:
/// **'Edit'**
String get studysetMenuEdit;
/// No description provided for @studysetMenuArchive.
///
/// In en, this message translates to:
/// **'Archive'**
String get studysetMenuArchive;
/// No description provided for @studysetMenuUnarchive.
///
/// In en, this message translates to:
/// **'Unarchive'**
String get studysetMenuUnarchive;
/// No description provided for @studysetMenuDelete.
///
/// In en, this message translates to:
/// **'Delete'**
String get studysetMenuDelete;
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
/// No description provided for @studysetMenuMove.
///
/// In en, this message translates to:
/// **'Move to…'**
String get studysetMenuMove;
/// No description provided for @studysetTabFlashcards.
///
/// In en, this message translates to:
/// **'Flashcards'**
String get studysetTabFlashcards;
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
/// No description provided for @studysetTabNotes.
///
/// In en, this message translates to:
/// **'Notes'**
String get studysetTabNotes;
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
/// No description provided for @studysetTabPaths.
///
/// In en, this message translates to:
/// **'Paths'**
String get studysetTabPaths;
/// No description provided for @studysetCreatePath.
///
/// In en, this message translates to:
/// **'Create a path'**
String get studysetCreatePath;
/// No description provided for @pathImportMenu.
///
/// In en, this message translates to:
/// **'Import a path (JSON)'**
String get pathImportMenu;
/// No description provided for @pathImportFileType.
///
/// In en, this message translates to:
/// **'Learning path (JSON)'**
String get pathImportFileType;
/// No description provided for @pathImported.
///
/// In en, this message translates to:
/// **'{count, plural, =1{Imported \"{title}\" with 1 step.} other{Imported \"{title}\" with {count} steps.}}'**
String pathImported(String title, int count);
/// No description provided for @pathImportSkipped.
///
/// In en, this message translates to:
/// **'{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.}}'**
String pathImportSkipped(int count);
/// No description provided for @pathImportFailed.
///
/// In en, this message translates to:
/// **'Couldn\'t import this file. {reason}'**
String pathImportFailed(String reason);
/// No description provided for @pathImportUnreadable.
///
/// In en, this message translates to:
/// **'It isn\'t text in UTF-8.'**
String get pathImportUnreadable;
/// No description provided for @pathsEmpty.
///
/// In en, this message translates to:
/// **'No paths yet'**
String get pathsEmpty;
/// No description provided for @pathsEmptyHint.
///
/// In en, this message translates to:
/// **'A path leads through a lesson, step by step.'**
String get pathsEmptyHint;
/// No description provided for @pathOptions.
///
/// In en, this message translates to:
/// **'Path options'**
String get pathOptions;
/// No description provided for @pathEdit.
///
/// In en, this message translates to:
/// **'Edit'**
String get pathEdit;
/// No description provided for @pathResetProgress.
///
/// In en, this message translates to:
/// **'Reset progress'**
String get pathResetProgress;
/// No description provided for @pathProgressReset.
///
/// In en, this message translates to:
/// **'Progress reset'**
String get pathProgressReset;
/// No description provided for @pathResetTitle.
///
/// In en, this message translates to:
/// **'Reset progress?'**
String get pathResetTitle;
/// No description provided for @pathResetMessage.
///
/// In en, this message translates to:
/// **'All your progress through this path will be cleared. You can undo this for a few seconds.'**
String get pathResetMessage;
/// No description provided for @pathResetConfirm.
///
/// In en, this message translates to:
/// **'Reset'**
String get pathResetConfirm;
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
/// No description provided for @pathDelete.
///
/// In en, this message translates to:
/// **'Delete'**
String get pathDelete;
/// No description provided for @pathDeleteTitle.
///
/// In en, this message translates to:
/// **'Delete path?'**
String get pathDeleteTitle;
/// No description provided for @pathDeleteMessage.
///
/// In en, this message translates to:
/// **'This path and its steps will be removed from the studyset. You can undo this for a few seconds.'**
String get pathDeleteMessage;
/// No description provided for @pathDeleteConfirm.
///
/// In en, this message translates to:
/// **'Delete'**
String get pathDeleteConfirm;
/// No description provided for @pathDeleted.
///
/// In en, this message translates to:
/// **'Path deleted'**
String get pathDeleted;
/// No description provided for @pathCreateTitle.
///
/// In en, this message translates to:
/// **'New path'**
String get pathCreateTitle;
/// No description provided for @pathCreate.
///
/// In en, this message translates to:
/// **'Create'**
String get pathCreate;
/// No description provided for @pathTitleLabel.
///
/// In en, this message translates to:
/// **'Title'**
String get pathTitleLabel;
/// No description provided for @pathTitleRequired.
///
/// In en, this message translates to:
/// **'A path needs a title.'**
String get pathTitleRequired;
/// No description provided for @pathSecondaryTitleLabel.
///
/// In en, this message translates to:
/// **'Secondary title'**
String get pathSecondaryTitleLabel;
/// No description provided for @pathSecondaryTitleHint.
///
/// In en, this message translates to:
/// **'E.g. the title in the language you learn'**
String get pathSecondaryTitleHint;
/// No description provided for @pathEditTitle.
///
/// In en, this message translates to:
/// **'Edit path'**
String get pathEditTitle;
/// No description provided for @pathDescription.
///
/// In en, this message translates to:
/// **'Description'**
String get pathDescription;
/// No description provided for @pathAddDescription.
///
/// In en, this message translates to:
/// **'Add a description'**
String get pathAddDescription;
/// No description provided for @pathDescriptionEditTitle.
///
/// In en, this message translates to:
/// **'Path description'**
String get pathDescriptionEditTitle;
/// No description provided for @pathAddTags.
///
/// In en, this message translates to:
/// **'Add tags'**
String get pathAddTags;
/// No description provided for @pathTags.
///
/// In en, this message translates to:
/// **'Tags'**
String get pathTags;
/// No description provided for @pathEditTags.
///
/// In en, this message translates to:
/// **'Edit tags'**
String get pathEditTags;
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
/// No description provided for @pathSteps.
///
/// In en, this message translates to:
/// **'Steps'**
String get pathSteps;
/// No description provided for @pathStepsEmpty.
///
/// In en, this message translates to:
/// **'No steps yet'**
String get pathStepsEmpty;
/// No description provided for @pathStepsEmptyHint.
///
/// In en, this message translates to:
/// **'Pick a step type to start writing the lesson.'**
String get pathStepsEmptyHint;
/// No description provided for @pathAddStep.
///
/// In en, this message translates to:
/// **'Add step'**
String get pathAddStep;
/// No description provided for @pathReorder.
///
/// In en, this message translates to:
/// **'Reorder'**
String get pathReorder;
/// No description provided for @pathReorderDone.
///
/// In en, this message translates to:
/// **'Done'**
String get pathReorderDone;
/// No description provided for @pathStepDelete.
///
/// In en, this message translates to:
/// **'Delete step'**
String get pathStepDelete;
/// No description provided for @pathStepDeleted.
///
/// In en, this message translates to:
/// **'Step deleted'**
String get pathStepDeleted;
/// No description provided for @stepUntitled.
///
/// In en, this message translates to:
/// **'Untitled step'**
String get stepUntitled;
/// No description provided for @stepKindInfo.
///
/// In en, this message translates to:
/// **'Info'**
String get stepKindInfo;
/// No description provided for @stepKindSingleChoice.
///
/// In en, this message translates to:
/// **'Single choice'**
String get stepKindSingleChoice;
/// No description provided for @stepKindMultipleChoice.
///
/// In en, this message translates to:
/// **'Multiple choice'**
String get stepKindMultipleChoice;
/// No description provided for @stepKindDragAndDrop.
///
/// In en, this message translates to:
/// **'Drag and drop'**
String get stepKindDragAndDrop;
/// No description provided for @stepKindFillInTheBlank.
///
/// In en, this message translates to:
/// **'Fill in the blank'**
String get stepKindFillInTheBlank;
/// No description provided for @stepEditTitle.
///
/// In en, this message translates to:
/// **'Edit step'**
String get stepEditTitle;
/// No description provided for @stepTitleHint.
///
/// In en, this message translates to:
/// **'Title'**
String get stepTitleHint;
/// No description provided for @stepOptions.
///
/// In en, this message translates to:
/// **'Options'**
String get stepOptions;
/// No description provided for @stepOptionHint.
///
/// In en, this message translates to:
/// **'Option {number}'**
String stepOptionHint(int number);
/// No description provided for @stepAddOption.
///
/// In en, this message translates to:
/// **'Add option'**
String get stepAddOption;
/// No description provided for @stepRemoveOption.
///
/// In en, this message translates to:
/// **'Remove option'**
String get stepRemoveOption;
/// No description provided for @stepCorrectOption.
///
/// In en, this message translates to:
/// **'The right one'**
String get stepCorrectOption;
/// No description provided for @stepCorrectOptions.
///
/// In en, this message translates to:
/// **'Right ones'**
String get stepCorrectOptions;
/// No description provided for @stepCategories.
///
/// In en, this message translates to:
/// **'Categories'**
String get stepCategories;
/// No description provided for @stepCategoryHint.
///
/// In en, this message translates to:
/// **'Category {number}'**
String stepCategoryHint(int number);
/// No description provided for @stepAddCategory.
///
/// In en, this message translates to:
/// **'Add category'**
String get stepAddCategory;
/// No description provided for @stepRemoveCategory.
///
/// In en, this message translates to:
/// **'Remove category'**
String get stepRemoveCategory;
/// No description provided for @stepItems.
///
/// In en, this message translates to:
/// **'Items'**
String get stepItems;
/// No description provided for @stepItemHint.
///
/// In en, this message translates to:
/// **'Item {number}'**
String stepItemHint(int number);
/// No description provided for @stepAddItem.
///
/// In en, this message translates to:
/// **'Add item'**
String get stepAddItem;
/// No description provided for @stepRemoveItem.
///
/// In en, this message translates to:
/// **'Remove item'**
String get stepRemoveItem;
/// No description provided for @stepItemCategory.
///
/// In en, this message translates to:
/// **'Belongs to'**
String get stepItemCategory;
/// No description provided for @stepPassage.
///
/// In en, this message translates to:
/// **'Passage'**
String get stepPassage;
/// No description provided for @stepPassageHint.
///
/// In en, this message translates to:
/// **'Type ___ (three underscores) wherever a word should be dropped in.'**
String get stepPassageHint;
/// No description provided for @stepBlankHint.
///
/// In en, this message translates to:
/// **'Word for gap {number}'**
String stepBlankHint(int number);
/// No description provided for @stepIncomplete.
///
/// In en, this message translates to:
/// **'Not ready to answer yet: fill in every field and choose what is right.'**
String get stepIncomplete;
/// No description provided for @stepFeedbackRight.
///
/// In en, this message translates to:
/// **'Feedback after a right answer'**
String get stepFeedbackRight;
/// No description provided for @stepFeedbackWrong.
///
/// In en, this message translates to:
/// **'Feedback after a wrong answer'**
String get stepFeedbackWrong;
/// No description provided for @stepFeedbackNone.
///
/// In en, this message translates to:
/// **'None'**
String get stepFeedbackNone;
/// No description provided for @sources.
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
///
/// In en, this message translates to:
/// **'Sources'**
String get sources;
/// No description provided for @sourcesCount.
///
/// In en, this message translates to:
/// **'{count, plural, =1{1 source} other{{count} sources}}'**
String sourcesCount(int count);
/// No description provided for @sourcesNone.
///
/// In en, this message translates to:
/// **'No sources cited yet.'**
String get sourcesNone;
/// No description provided for @sourcesEdit.
///
/// In en, this message translates to:
/// **'Edit sources'**
String get sourcesEdit;
/// No description provided for @sourcesEditDone.
///
/// In en, this message translates to:
/// **'Done editing'**
String get sourcesEditDone;
/// No description provided for @sourceAdd.
///
/// In en, this message translates to:
/// **'Add a source'**
String get sourceAdd;
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
/// No description provided for @sourceEdit.
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
///
/// In en, this message translates to:
/// **'Edit source'**
String get sourceEdit;
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
/// No description provided for @sourceRemove.
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
///
/// In en, this message translates to:
/// **'Remove source'**
String get sourceRemove;
/// No description provided for @sourceRemoved.
///
/// In en, this message translates to:
/// **'Source removed'**
String get sourceRemoved;
/// No description provided for @sourceSheetAdd.
///
/// In en, this message translates to:
/// **'Add'**
String get sourceSheetAdd;
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
/// No description provided for @sourceAuthors.
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
///
/// In en, this message translates to:
/// **'Authors'**
String get sourceAuthors;
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
/// No description provided for @sourceAuthorsHint.
///
/// In en, this message translates to:
/// **'Full names, one per line, e.g. Mark A. McDaniel'**
String get sourceAuthorsHint;
/// No description provided for @sourceYear.
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
///
/// In en, this message translates to:
/// **'Year'**
String get sourceYear;
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
/// No description provided for @sourceYearHint.
///
/// In en, this message translates to:
/// **'e.g. 2014'**
String get sourceYearHint;
/// No description provided for @sourceTitle.
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
///
/// In en, this message translates to:
/// **'Title'**
String get sourceTitle;
/// No description provided for @sourceTitleHint.
///
/// In en, this message translates to:
/// **'Title of the work'**
String get sourceTitleHint;
/// No description provided for @sourceContainer.
///
/// In en, this message translates to:
/// **'Published in'**
String get sourceContainer;
/// No description provided for @sourceContainerHint.
///
/// In en, this message translates to:
/// **'Journal, book or website it is part of, with pages'**
String get sourceContainerHint;
/// No description provided for @sourceContainerHelper.
///
/// In en, this message translates to:
/// **'Leave empty for a work of its own, such as a book.'**
String get sourceContainerHelper;
/// No description provided for @sourcePublisher.
///
/// In en, this message translates to:
/// **'Publisher'**
String get sourcePublisher;
/// No description provided for @sourcePublisherHint.
///
/// In en, this message translates to:
/// **'e.g. Belknap Press'**
String get sourcePublisherHint;
/// No description provided for @sourceIsbn.
///
/// In en, this message translates to:
/// **'ISBN'**
String get sourceIsbn;
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
/// No description provided for @sourceIsbnHint.
///
/// In en, this message translates to:
/// **'e.g. 978-0-674-72901-8'**
String get sourceIsbnHint;
/// No description provided for @sourceUrl.
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
///
/// In en, this message translates to:
/// **'Link'**
String get sourceUrl;
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
/// No description provided for @sourceUrlHint.
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
///
/// In en, this message translates to:
/// **'https://…'**
String get sourceUrlHint;
/// No description provided for @sourceImportedAs.
///
/// In en, this message translates to:
/// **'Imported as: {citation}'**
String sourceImportedAs(String citation);
/// No description provided for @sourceIsbnLine.
///
/// In en, this message translates to:
/// **'ISBN: {isbn}'**
String sourceIsbnLine(String isbn);
/// No description provided for @sourceAvailableAt.
///
/// In en, this message translates to:
/// **'Available at:'**
String get sourceAvailableAt;
/// No description provided for @sourceEmpty.
///
/// In en, this message translates to:
/// **'Empty reference'**
String get sourceEmpty;
/// No description provided for @sourceDiscardTitle.
///
/// In en, this message translates to:
/// **'Discard changes?'**
String get sourceDiscardTitle;
/// No description provided for @sourceDiscardMessage.
///
/// In en, this message translates to:
/// **'What you typed for this source will be lost.'**
String get sourceDiscardMessage;
/// No description provided for @sourceDiscardConfirm.
///
/// In en, this message translates to:
/// **'Discard'**
String get sourceDiscardConfirm;
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
/// No description provided for @stepConflict.
///
/// In en, this message translates to:
/// **'This step was changed differently on another device. Keep one version to go on writing.'**
String get stepConflict;
/// No description provided for @stepFieldTitle.
///
/// In en, this message translates to:
/// **'Title'**
String get stepFieldTitle;
/// No description provided for @stepFieldBody.
///
/// In en, this message translates to:
/// **'Text'**
String get stepFieldBody;
/// No description provided for @stepFieldExercise.
///
/// In en, this message translates to:
/// **'Exercise'**
String get stepFieldExercise;
/// No description provided for @stepFieldRightFeedback.
///
/// In en, this message translates to:
/// **'Feedback after a right answer'**
String get stepFieldRightFeedback;
/// No description provided for @stepFieldWrongFeedback.
///
/// In en, this message translates to:
/// **'Feedback after a wrong answer'**
String get stepFieldWrongFeedback;
/// No description provided for @stepFieldSources.
///
/// In en, this message translates to:
/// **'Sources'**
String get stepFieldSources;
/// No description provided for @runnerClose.
///
/// In en, this message translates to:
/// **'Close'**
String get runnerClose;
/// No description provided for @runnerEditStep.
///
/// In en, this message translates to:
/// **'Edit step'**
String get runnerEditStep;
/// No description provided for @runnerBack.
///
/// In en, this message translates to:
/// **'Back'**
String get runnerBack;
/// No description provided for @runnerCheck.
///
/// In en, this message translates to:
/// **'Check answers'**
String get runnerCheck;
/// No description provided for @runnerContinue.
///
/// In en, this message translates to:
/// **'Continue'**
String get runnerContinue;
/// No description provided for @runnerFinish.
///
/// In en, this message translates to:
/// **'Finish'**
String get runnerFinish;
/// No description provided for @runnerRight.
///
/// In en, this message translates to:
/// **'Correct!'**
String get runnerRight;
/// No description provided for @runnerWrong.
///
/// In en, this message translates to:
/// **'Not quite'**
String get runnerWrong;
/// No description provided for @runnerAlreadyRight.
///
/// In en, this message translates to:
/// **'You already answered this correctly.'**
String get runnerAlreadyRight;
/// No description provided for @runnerSelectAll.
///
/// In en, this message translates to:
/// **'Select all that apply.'**
String get runnerSelectAll;
/// No description provided for @runnerDragHint.
///
/// In en, this message translates to:
/// **'Drag each item into the category it belongs to, or tap it and then the category. Tap a placed item to take it back.'**
String get runnerDragHint;
/// No description provided for @runnerBlankHint.
///
/// In en, this message translates to:
/// **'Drag a word into each gap, or tap it and then the gap. Tap a placed word to take it back.'**
String get runnerBlankHint;
/// No description provided for @runnerEmpty.
///
/// In en, this message translates to:
/// **'This path has no steps yet.'**
String get runnerEmpty;
/// No description provided for @runnerFinished.
///
/// In en, this message translates to:
/// **'You finished this path'**
String get runnerFinished;
/// No description provided for @runnerFinishedSteps.
///
/// In en, this message translates to:
/// **'{count, plural, =1{1 step complete.} other{{count} steps complete.}}'**
String runnerFinishedSteps(int count);
/// No description provided for @runnerNextPath.
///
/// In en, this message translates to:
/// **'Continue to next path'**
String get runnerNextPath;
/// No description provided for @runnerBackToStudyset.
///
/// In en, this message translates to:
/// **'Back to studyset'**
String get runnerBackToStudyset;
/// No description provided for @studysetCountPaths.
///
/// In en, this message translates to:
/// **'{count, plural, =1{1 path} other{{count} paths}}'**
String studysetCountPaths(int count);
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
/// No description provided for @studysetCreateNote.
///
/// In en, this message translates to:
/// **'Create a note'**
String get studysetCreateNote;
/// No description provided for @notesEmpty.
///
/// In en, this message translates to:
/// **'No notes yet'**
String get notesEmpty;
/// No description provided for @notesEmptyHint.
///
/// In en, this message translates to:
/// **'Notes will appear here when you add them.'**
String get notesEmptyHint;
/// No description provided for @noteUntitled.
///
/// In en, this message translates to:
/// **'Untitled note'**
String get noteUntitled;
/// No description provided for @noteEdited.
///
/// In en, this message translates to:
/// **'Edited {when}'**
String noteEdited(String when);
/// No description provided for @timeJustNow.
///
/// In en, this message translates to:
/// **'just now'**
String get timeJustNow;
/// No description provided for @timeMinutesAgo.
///
/// In en, this message translates to:
/// **'{count, plural, =1{1 minute ago} other{{count} minutes ago}}'**
String timeMinutesAgo(int count);
/// No description provided for @timeHoursAgo.
///
/// In en, this message translates to:
/// **'{count, plural, =1{1 hour ago} other{{count} hours ago}}'**
String timeHoursAgo(int count);
/// No description provided for @timeDaysAgo.
///
/// In en, this message translates to:
/// **'{count, plural, =1{yesterday} other{{count} days ago}}'**
String timeDaysAgo(int count);
/// No description provided for @noteOptions.
///
/// In en, this message translates to:
/// **'Note options'**
String get noteOptions;
/// No description provided for @noteEdit.
///
/// In en, this message translates to:
/// **'Edit'**
String get noteEdit;
/// No description provided for @noteDelete.
///
/// In en, this message translates to:
/// **'Delete'**
String get noteDelete;
/// No description provided for @noteDeleteTitle.
///
/// In en, this message translates to:
/// **'Delete note?'**
String get noteDeleteTitle;
/// No description provided for @noteDeleteMessage.
///
/// In en, this message translates to:
/// **'This note will be removed from the studyset. You can undo this for a few seconds.'**
String get noteDeleteMessage;
/// No description provided for @noteDeleteConfirm.
///
/// In en, this message translates to:
/// **'Delete'**
String get noteDeleteConfirm;
/// No description provided for @noteDeleted.
///
/// In en, this message translates to:
/// **'Note deleted'**
String get noteDeleted;
/// No description provided for @noteTitleHint.
///
/// In en, this message translates to:
/// **'Title'**
String get noteTitleHint;
/// No description provided for @noteEditing.
///
/// In en, this message translates to:
/// **'Editing…'**
String get noteEditing;
/// No description provided for @noteSaving.
///
/// In en, this message translates to:
/// **'Saving…'**
String get noteSaving;
/// No description provided for @noteSaved.
///
/// In en, this message translates to:
/// **'Saved'**
String get noteSaved;
/// No description provided for @noteSaveFailed.
///
/// In en, this message translates to:
/// **'Save failed'**
String get noteSaveFailed;
/// No description provided for @noteConflict.
///
/// In en, this message translates to:
/// **'This note was changed differently on another device. Keep one version to go on writing.'**
String get noteConflict;
/// No description provided for @noteFieldTitle.
///
/// In en, this message translates to:
/// **'Title'**
String get noteFieldTitle;
/// No description provided for @noteFieldBody.
///
/// In en, this message translates to:
/// **'Text'**
String get noteFieldBody;
/// No description provided for @noteKeepThis.
///
/// In en, this message translates to:
/// **'Keep this'**
String get noteKeepThis;
/// No description provided for @noteAddTags.
///
/// In en, this message translates to:
/// **'Add tags'**
String get noteAddTags;
/// No description provided for @noteEditTags.
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
///
/// In en, this message translates to:
/// **'Edit tags'**
String get noteEditTags;
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
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
/// No description provided for @studysetFlashcardsEmpty.
///
/// In en, this message translates to:
/// **'No flashcards yet'**
String get studysetFlashcardsEmpty;
/// No description provided for @studysetFlashcardsEmptyHint.
///
/// In en, this message translates to:
/// **'Add some to start studying.'**
String get studysetFlashcardsEmptyHint;
/// No description provided for @studysetAddMaterial.
///
/// In en, this message translates to:
/// **'Add material'**
String get studysetAddMaterial;
/// No description provided for @studysetCreateFlashcards.
///
/// In en, this message translates to:
/// **'Create flashcards'**
String get studysetCreateFlashcards;
/// No description provided for @studysetStudy.
///
/// In en, this message translates to:
/// **'Study'**
String get studysetStudy;
/// No description provided for @studysetLearnCount.
///
/// In en, this message translates to:
/// **'Learn {count}'**
String studysetLearnCount(int count);
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
/// No description provided for @studysetLearnFlashcards.
///
/// In en, this message translates to:
/// **'{count, plural, =1{Learn 1 flashcard} other{Learn {count} flashcards}}'**
String studysetLearnFlashcards(int count);
/// No description provided for @studysetNothingToStudy.
///
/// In en, this message translates to:
/// **'Nothing to study yet'**
String get studysetNothingToStudy;
/// No description provided for @studysetStudyMode.
///
/// In en, this message translates to:
/// **'Study mode'**
String get studysetStudyMode;
/// No description provided for @studysetStartPath.
///
/// In en, this message translates to:
/// **'Start: {title}'**
String studysetStartPath(String title);
/// No description provided for @studysetContinuePath.
///
/// In en, this message translates to:
/// **'Continue: {title}'**
String studysetContinuePath(String title);
/// No description provided for @studysetStartPathHint.
///
/// In en, this message translates to:
/// **'Begin the first step of this path.'**
String get studysetStartPathHint;
/// No description provided for @studysetContinuePathHint.
///
/// In en, this message translates to:
/// **'Pick up the next path step where you left off.'**
String get studysetContinuePathHint;
/// No description provided for @studysetSpacedRepetition.
///
/// In en, this message translates to:
/// **'Spaced repetition'**
String get studysetSpacedRepetition;
/// No description provided for @studysetSpacedRepetitionHint.
///
/// In en, this message translates to:
/// **'Review the cards that are due, scheduled by FSRS.'**
String get studysetSpacedRepetitionHint;
/// No description provided for @studysetImportContent.
///
/// In en, this message translates to:
/// **'Import content'**
String get studysetImportContent;
/// No description provided for @studysetMenuExport.
///
/// In en, this message translates to:
/// **'Export content'**
String get studysetMenuExport;
/// No description provided for @exportRunning.
///
/// In en, this message translates to:
/// **'Exporting…'**
String get exportRunning;
/// No description provided for @exportedMarkdown.
///
/// In en, this message translates to:
/// **'Exported as Markdown.'**
String get exportedMarkdown;
/// No description provided for @exportedZip.
///
/// In en, this message translates to:
/// **'{count, plural, =1{Exported as Markdown with 1 file (.zip).} other{Exported as Markdown with {count} files (.zip).}}'**
String exportedZip(int count);
/// No description provided for @exportMissingFiles.
///
/// In en, this message translates to:
/// **'{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.}}'**
String exportMissingFiles(int count);
/// No description provided for @exportFailed.
///
/// In en, this message translates to:
/// **'Couldn\'t export the studyset.'**
String get exportFailed;
/// No description provided for @exportQuestion.
///
/// In en, this message translates to:
/// **'Q'**
String get exportQuestion;
/// No description provided for @exportAnswer.
///
/// In en, this message translates to:
/// **'A'**
String get exportAnswer;
/// No description provided for @exportHint.
///
/// In en, this message translates to:
/// **'Hint'**
String get exportHint;
/// No description provided for @exportIfRight.
///
/// In en, this message translates to:
/// **'If right'**
String get exportIfRight;
/// No description provided for @exportIfWrong.
///
/// In en, this message translates to:
/// **'If wrong'**
String get exportIfWrong;
/// No description provided for @exportSound.
///
/// In en, this message translates to:
/// **'Sound'**
String get exportSound;
/// No description provided for @exportVideo.
///
/// In en, this message translates to:
/// **'YouTube video'**
String get exportVideo;
/// No description provided for @exportSpoiler.
///
/// In en, this message translates to:
/// **'Spoiler'**
String get exportSpoiler;
/// No description provided for @exportUnavailable.
///
/// In en, this message translates to:
/// **'not available on this device'**
String get exportUnavailable;
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
/// No description provided for @studysetImportPath.
///
/// In en, this message translates to:
/// **'Learning path'**
String get studysetImportPath;
/// No description provided for @studysetImportPathHint.
///
/// In en, this message translates to:
/// **'From a Halkyon path JSON file'**
String get studysetImportPathHint;
/// No description provided for @studysetImportAnki.
///
/// In en, this message translates to:
/// **'Anki deck'**
String get studysetImportAnki;
/// No description provided for @studysetImportAnkiHint.
///
/// In en, this message translates to:
/// **'From an .apkg or .colpkg file'**
String get studysetImportAnkiHint;
/// No description provided for @studysetImportCards.
///
/// In en, this message translates to:
/// **'Flashcards'**
String get studysetImportCards;
/// No description provided for @studysetImportCardsHint.
///
/// In en, this message translates to:
/// **'Pasted, or from a CSV or TSV file'**
String get studysetImportCardsHint;
/// No description provided for @cardTextImportTitle.
///
/// In en, this message translates to:
/// **'Import flashcards'**
String get cardTextImportTitle;
/// No description provided for @cardTextImportDescription.
///
/// In en, this message translates to:
/// **'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.'**
String get cardTextImportDescription;
/// No description provided for @cardTextImportHint.
///
/// In en, this message translates to:
/// **'Paste the cards here'**
String get cardTextImportHint;
/// No description provided for @cardTextImportLoadFile.
///
/// In en, this message translates to:
/// **'Load a CSV or TSV file'**
String get cardTextImportLoadFile;
/// No description provided for @cardTextImportFileType.
///
/// In en, this message translates to:
/// **'CSV or TSV files'**
String get cardTextImportFileType;
/// No description provided for @cardTextImportUnreadable.
///
/// In en, this message translates to:
/// **'This file isn\'t text in UTF-8.'**
String get cardTextImportUnreadable;
/// No description provided for @cardTextImportSeparator.
///
/// In en, this message translates to:
/// **'Separator'**
String get cardTextImportSeparator;
/// No description provided for @cardTextSeparatorTab.
///
/// In en, this message translates to:
/// **'Tab'**
String get cardTextSeparatorTab;
/// No description provided for @cardTextSeparatorComma.
///
/// In en, this message translates to:
/// **'Comma'**
String get cardTextSeparatorComma;
/// No description provided for @cardTextSeparatorSemicolon.
///
/// In en, this message translates to:
/// **'Semicolon'**
String get cardTextSeparatorSemicolon;
/// No description provided for @cardTextImportNone.
///
/// In en, this message translates to:
/// **'No cards found yet.'**
String get cardTextImportNone;
/// No description provided for @cardTextImportReady.
///
/// In en, this message translates to:
/// **'{count, plural, =1{1 card ready to import.} other{{count} cards ready to import.}}'**
String cardTextImportReady(int count);
/// No description provided for @cardTextImportSubmit.
///
/// In en, this message translates to:
/// **'Import'**
String get cardTextImportSubmit;
/// No description provided for @cardTextImported.
///
/// In en, this message translates to:
/// **'{count, plural, =1{Imported 1 flashcard.} other{Imported {count} flashcards.}}'**
String cardTextImported(int count);
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
/// No description provided for @studysetReorder.
///
/// In en, this message translates to:
/// **'Reorder'**
String get studysetReorder;
/// No description provided for @studysetReorderPaths.
///
/// In en, this message translates to:
/// **'Reorder paths'**
String get studysetReorderPaths;
/// No description provided for @studysetReorderNotes.
///
/// In en, this message translates to:
/// **'Reorder notes'**
String get studysetReorderNotes;
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
/// No description provided for @studysetReorderDone.
///
/// In en, this message translates to:
/// **'Done'**
String get studysetReorderDone;
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
/// No description provided for @studysetOpenTopics.
///
/// In en, this message translates to:
/// **'Show topics'**
String get studysetOpenTopics;
/// No description provided for @studysetTopics.
///
/// In en, this message translates to:
/// **'Topics'**
String get studysetTopics;
/// No description provided for @studysetAllTopics.
///
/// In en, this message translates to:
/// **'All topics'**
String get studysetAllTopics;
/// No description provided for @studysetNewSubStudyset.
///
/// In en, this message translates to:
/// **'New sub-studyset'**
String get studysetNewSubStudyset;
/// No description provided for @studysetSubStudysetsEmpty.
///
/// In en, this message translates to:
/// **'No sub-studysets yet.'**
String get studysetSubStudysetsEmpty;
/// No description provided for @studysetSubStudysetsEmptyHint.
///
/// In en, this message translates to:
/// **'Break this studyset into milestones or lessons.'**
String get studysetSubStudysetsEmptyHint;
/// No description provided for @studysetDragToReorder.
///
/// In en, this message translates to:
/// **'Drag to reorder'**
String get studysetDragToReorder;
/// No description provided for @studysetMoveTitle.
///
/// In en, this message translates to:
/// **'Move studyset to'**
String get studysetMoveTitle;
/// No description provided for @studysetMoveTopLevel.
///
/// In en, this message translates to:
/// **'Top level'**
String get studysetMoveTopLevel;
/// No description provided for @studysetMoveCurrent.
///
/// In en, this message translates to:
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
/// **'(current)'**
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
String get studysetMoveCurrent;
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
/// No description provided for @studysetMoveTopLevelRow.
///
/// In en, this message translates to:
/// **'Top level (no parent)'**
String get studysetMoveTopLevelRow;
/// No description provided for @studysetMoveArchived.
///
/// In en, this message translates to:
/// **'Archived'**
String get studysetMoveArchived;
/// No description provided for @studysetMoveNew.
///
/// In en, this message translates to:
/// **'New studyset'**
String get studysetMoveNew;
/// No description provided for @studysetMoveSelectDestination.
///
/// In en, this message translates to:
/// **'Select a destination'**
String get studysetMoveSelectDestination;
/// No description provided for @studysetMoveDestination.
///
/// In en, this message translates to:
/// **'Destination: {name}'**
String studysetMoveDestination(String name);
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
/// No description provided for @studysetMoveConfirm.
///
/// In en, this message translates to:
/// **'Move'**
String get studysetMoveConfirm;
/// No description provided for @studysetMoveShowInside.
///
/// In en, this message translates to:
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
/// **'Show sub-studysets'**
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
String get studysetMoveShowInside;
/// No description provided for @studysetMoveHideInside.
///
/// In en, this message translates to:
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
/// **'Hide sub-studysets'**
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
String get studysetMoveHideInside;
/// No description provided for @studysetMoved.
///
/// In en, this message translates to:
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
/// **'Moved \"{title}\" to {destination}.'**
String studysetMoved(String title, String destination);
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
/// No description provided for @studysetReadMore.
///
/// In en, this message translates to:
/// **'Read more'**
String get studysetReadMore;
/// No description provided for @studysetDescriptionTitle.
///
/// In en, this message translates to:
/// **'Description'**
String get studysetDescriptionTitle;
/// No description provided for @studysetDescriptionEditTitle.
///
/// In en, this message translates to:
/// **'Edit description'**
String get studysetDescriptionEditTitle;
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
/// No description provided for @richTextSave.
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
///
/// In en, this message translates to:
/// **'Save'**
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
String get richTextSave;
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
/// No description provided for @studysetSheetDescription.
///
/// In en, this message translates to:
/// **'Description'**
String get studysetSheetDescription;
/// No description provided for @studysetSheetDescriptionAdd.
///
/// In en, this message translates to:
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
/// **'Tap to add a description'**
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
String get studysetSheetDescriptionAdd;
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
/// No description provided for @studysetSheetDescriptionAdded.
///
/// In en, this message translates to:
/// **'Description added — tap to edit'**
String get studysetSheetDescriptionAdded;
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
/// No description provided for @studysetSheetInheritColor.
///
/// In en, this message translates to:
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
/// **'Inherit'**
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
String get studysetSheetInheritColor;
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
/// No description provided for @fieldRequired.
///
/// In en, this message translates to:
/// **'required'**
String get fieldRequired;
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
/// No description provided for @exploreTitle.
///
/// In en, this message translates to:
/// **'Explore'**
String get exploreTitle;
/// No description provided for @exploreEmpty.
///
/// In en, this message translates to:
/// **'Studysets that others share will appear here.'**
String get exploreEmpty;
/// No description provided for @profileTitle.
///
/// In en, this message translates to:
/// **'Profile'**
String get profileTitle;
/// No description provided for @profileSettingsTooltip.
///
/// In en, this message translates to:
/// **'Settings'**
String get profileSettingsTooltip;
/// No description provided for @profileIdentified.
///
/// In en, this message translates to:
/// **'Your progress is kept with your account.'**
String get profileIdentified;
/// No description provided for @profileAnonymous.
///
/// In en, this message translates to:
/// **'Progress is saved on this device. Sign in to keep it.'**
String get profileAnonymous;
/// No description provided for @profileSignInWithGitHub.
///
/// In en, this message translates to:
/// **'Sign in with GitHub'**
String get profileSignInWithGitHub;
/// No description provided for @profileSignInFailed.
///
/// In en, this message translates to:
/// **'Couldn\'t sign in with GitHub.'**
String get profileSignInFailed;
/// No description provided for @profileContinueInBrowser.
///
/// In en, this message translates to:
/// **'Continue in your browser.'**
String get profileContinueInBrowser;
/// No description provided for @profileSwitchTitle.
///
/// In en, this message translates to:
/// **'Switch to your GitHub account?'**
String get profileSwitchTitle;
/// No description provided for @profileSwitchMessage.
///
/// In en, this message translates to:
/// **'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.'**
String get profileSwitchMessage;
/// No description provided for @profileSwitchStay.
///
/// In en, this message translates to:
/// **'Stay anonymous'**
String get profileSwitchStay;
/// No description provided for @profileSwitchConfirm.
///
/// In en, this message translates to:
/// **'Switch'**
String get profileSwitchConfirm;
/// No description provided for @settingsTitle.
///
/// In en, this message translates to:
/// **'Settings'**
String get settingsTitle;
/// No description provided for @settingsAccount.
///
/// In en, this message translates to:
/// **'Account'**
String get settingsAccount;
/// No description provided for @settingsSignOut.
///
/// In en, this message translates to:
/// **'Sign out'**
String get settingsSignOut;
/// No description provided for @settingsSignOutTitle.
///
/// In en, this message translates to:
/// **'Sign out?'**
String get settingsSignOutTitle;
/// No description provided for @settingsSignOutAnonymousMessage.
///
/// In en, this message translates to:
/// **'This account can\'t be signed into again, so signing out deletes it with its progress.'**
String get settingsSignOutAnonymousMessage;
/// No description provided for @settingsDeleteAccount.
///
/// In en, this message translates to:
/// **'Delete account'**
String get settingsDeleteAccount;
/// No description provided for @settingsDeleteTitle.
///
/// In en, this message translates to:
/// **'Delete your account?'**
String get settingsDeleteTitle;
/// No description provided for @settingsDeleteMessage.
///
/// In en, this message translates to:
/// **'Everything you have, your studysets, cards and reviews, is deleted on the server and on all your devices. This can\'t be undone.'**
String get settingsDeleteMessage;
/// No description provided for @settingsAbout.
///
/// In en, this message translates to:
/// **'About Halkyon Learn'**
String get settingsAbout;
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
/// No description provided for @aboutLegalese.
///
/// In en, this message translates to:
/// **'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.'**
String get aboutLegalese;
/// No description provided for @aboutSourceCode.
///
/// In en, this message translates to:
/// **'The source of what this instance runs:'**
String get aboutSourceCode;
/// No description provided for @aboutSourceUnreachable.
///
/// In en, this message translates to:
/// **'Couldn\'t reach this instance to ask where its source is.'**
String get aboutSourceUnreachable;
/// No description provided for @settingsAppearance.
///
/// In en, this message translates to:
/// **'Appearance'**
String get settingsAppearance;
/// No description provided for @settingsAppearanceDevice.
///
/// In en, this message translates to:
/// **'Device theme'**
String get settingsAppearanceDevice;
/// No description provided for @settingsAppearanceLight.
///
/// In en, this message translates to:
/// **'Light'**
String get settingsAppearanceLight;
/// No description provided for @settingsAppearanceDark.
///
/// In en, this message translates to:
/// **'Dark'**
String get settingsAppearanceDark;
/// No description provided for @settingsLanguage.
///
/// In en, this message translates to:
/// **'Language'**
String get settingsLanguage;
/// No description provided for @settingsLanguageDevice.
///
/// In en, this message translates to:
/// **'Device language'**
String get settingsLanguageDevice;
/// No description provided for @settingsCitations.
///
/// In en, this message translates to:
/// **'Citations'**
String get settingsCitations;
/// No description provided for @settingsCitationsDescription.
///
/// In en, this message translates to:
/// **'How sources and studysets\' bibliographies are cited on this device. Type authors\' full names: each style abbreviates and orders them itself.'**
String get settingsCitationsDescription;
/// No description provided for @settingsCitationStyle.
///
/// In en, this message translates to:
/// **'Style'**
String get settingsCitationStyle;
/// No description provided for @settingsCitationStyleApa.
///
/// In en, this message translates to:
/// **'APA (7th edition)'**
String get settingsCitationStyleApa;
/// No description provided for @settingsCitationStyleMla.
///
/// In en, this message translates to:
/// **'MLA (9th edition)'**
String get settingsCitationStyleMla;
/// No description provided for @settingsCitationStyleChicago.
///
/// In en, this message translates to:
/// **'Chicago (18th edition)'**
String get settingsCitationStyleChicago;
/// No description provided for @settingsCitationPreview.
///
/// In en, this message translates to:
/// **'Preview'**
String get settingsCitationPreview;
/// No description provided for @settingsCitationGuide.
///
/// In en, this message translates to:
/// **'Official guide'**
String get settingsCitationGuide;
/// No description provided for @settingsStudy.
///
/// In en, this message translates to:
/// **'Study'**
String get settingsStudy;
/// No description provided for @settingsStudyPomodoroTitle.
///
/// In en, this message translates to:
/// **'Show the Pomodoro timer while studying'**
String get settingsStudyPomodoroTitle;
/// No description provided for @settingsStudyPomodoroSubtitle.
///
/// In en, this message translates to:
/// **'Show the focus / break countdown inside the study session, so you can see the time left without opening the notification.'**
String get settingsStudyPomodoroSubtitle;
/// No description provided for @settingsVersion.
///
/// In en, this message translates to:
/// **'Version {version} (build {build})'**
String settingsVersion(String version, String build);
/// No description provided for @syncTitle.
///
/// In en, this message translates to:
/// **'Sync'**
String get syncTitle;
/// No description provided for @syncStateSyncing.
///
/// In en, this message translates to:
/// **'Syncing…'**
String get syncStateSyncing;
/// No description provided for @syncStateSynced.
///
/// In en, this message translates to:
/// **'Everything synced'**
String get syncStateSynced;
/// No description provided for @syncStateNotYet.
///
/// In en, this message translates to:
/// **'Not synced yet'**
String get syncStateNotYet;
/// No description provided for @syncStateFailing.
///
/// In en, this message translates to:
/// **'Sync is failing'**
String get syncStateFailing;
/// No description provided for @syncStateMismatch.
///
/// In en, this message translates to:
/// **'This app can\'t sync with {server}'**
String syncStateMismatch(String server);
/// No description provided for @syncMismatchDetail.
///
/// In en, this message translates to:
/// **'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.'**
String get syncMismatchDetail;
/// No description provided for @syncLastCompleted.
///
/// In en, this message translates to:
/// **'Last completed at {time}'**
String syncLastCompleted(String time);
/// No description provided for @syncNoRunYet.
///
/// In en, this message translates to:
/// **'No sync has completed since the app started'**
String get syncNoRunYet;
/// No description provided for @syncLastFailed.
///
/// In en, this message translates to:
/// **'Last attempt failed at {time}'**
String syncLastFailed(String time);
/// No description provided for @syncNow.
///
/// In en, this message translates to:
/// **'Sync now'**
String get syncNow;
/// No description provided for @syncTroubleLabel.
///
/// In en, this message translates to:
/// **'Sync needs attention'**
String get syncTroubleLabel;
/// No description provided for @syncMismatchBanner.
///
/// In en, this message translates to:
/// **'This app can\'t sync with {server} any more. Update it to keep syncing.'**
String syncMismatchBanner(String server);
/// No description provided for @syncMismatchMore.
///
/// In en, this message translates to:
/// **'More'**
String get syncMismatchMore;
/// No description provided for @tagsReadFailed.
///
/// In en, this message translates to:
/// **'Couldn\'t read the tags.'**
String get tagsReadFailed;
/// No description provided for @tagPickerTitle.
///
/// In en, this message translates to:
/// **'Tags'**
String get tagPickerTitle;
/// No description provided for @tagPickerManage.
///
/// In en, this message translates to:
/// **'Manage tags'**
String get tagPickerManage;
/// No description provided for @tagPickerSearchLabel.
///
/// In en, this message translates to:
/// **'Search or create a tag'**
String get tagPickerSearchLabel;
/// No description provided for @tagPickerCreate.
///
/// In en, this message translates to:
/// **'Create \"{name}\"'**
String tagPickerCreate(String name);
/// No description provided for @tagSheetCreateTitle.
///
/// In en, this message translates to:
/// **'Create tag'**
String get tagSheetCreateTitle;
/// No description provided for @tagSheetEditTitle.
///
/// In en, this message translates to:
/// **'Edit tag'**
String get tagSheetEditTitle;
/// No description provided for @tagSheetNameLabel.
///
/// In en, this message translates to:
/// **'Name'**
String get tagSheetNameLabel;
/// No description provided for @tagSheetNameHelper.
///
/// In en, this message translates to:
/// **'Stored and displayed in lowercase.'**
String get tagSheetNameHelper;
/// No description provided for @tagSheetNameExists.
///
/// In en, this message translates to:
/// **'The tag \'{name}\' exists already.'**
String tagSheetNameExists(String name);
/// No description provided for @tagSheetNameMerges.
///
/// In en, this message translates to:
/// **'There is a tag \'{name}\' already: saving merges this one into it.'**
String tagSheetNameMerges(String name);
/// No description provided for @tagSheetColor.
///
/// In en, this message translates to:
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
/// **'Colour'**
String get tagSheetColor;
/// No description provided for @tagSheetCreate.
///
/// In en, this message translates to:
/// **'Create'**
String get tagSheetCreate;
/// No description provided for @tagSheetSave.
///
/// In en, this message translates to:
/// **'Save'**
String get tagSheetSave;
/// No description provided for @tagManageTitle.
///
/// In en, this message translates to:
/// **'Manage tags'**
String get tagManageTitle;
/// No description provided for @tagManageEmpty.
///
/// In en, this message translates to:
/// **'No tags yet. Add one below.'**
String get tagManageEmpty;
/// No description provided for @tagManageAdd.
///
/// In en, this message translates to:
/// **'Add tag'**
String get tagManageAdd;
/// A tag in the list of tags, with how many flashcards have it.
///
/// In en, this message translates to:
/// **'{name} ({count})'**
String tagManageRow(String name, int count);
/// No description provided for @tagManageEdit.
///
/// In en, this message translates to:
/// **'Edit tag'**
String get tagManageEdit;
/// No description provided for @tagManageDelete.
///
/// In en, this message translates to:
/// **'Delete tag'**
String get tagManageDelete;
/// No description provided for @tagDeleteTitle.
///
/// In en, this message translates to:
/// **'Delete the tag \'{name}\'?'**
String tagDeleteTitle(String name);
/// No description provided for @tagDeleteMessage.
///
/// In en, this message translates to:
/// **'{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.}}'**
String tagDeleteMessage(int count);
/// No description provided for @tagDeleteConfirm.
///
/// In en, this message translates to:
/// **'Delete'**
String get tagDeleteConfirm;
/// No description provided for @tagDeleted.
///
/// In en, this message translates to:
/// **'Deleted the tag \'{name}\''**
String tagDeleted(String name);
/// No description provided for @studySettingsTitle.
///
/// In en, this message translates to:
/// **'Session settings'**
String get studySettingsTitle;
/// No description provided for @studySettingsFilterByTags.
///
/// In en, this message translates to:
/// **'Filter by tags'**
String get studySettingsFilterByTags;
/// No description provided for @studySettingsNoTags.
///
/// In en, this message translates to:
/// **'No content tags yet. Add tags to your cards to filter them here.'**
String get studySettingsNoTags;
/// No description provided for @studySettingsReset.
///
/// In en, this message translates to:
/// **'Reset'**
String get studySettingsReset;
/// No description provided for @studySettingsSave.
///
/// In en, this message translates to:
/// **'Save'**
String get studySettingsSave;
/// No description provided for @studySettingsHeadsUpTitle.
///
/// In en, this message translates to:
/// **'Heads up!'**
String get studySettingsHeadsUpTitle;
/// No description provided for @studySettingsHeadsUpBody.
///
/// In en, this message translates to:
/// **'The changes you’ve made will reload the session, and you’ll lose your current progress.'**
String get studySettingsHeadsUpBody;
/// No description provided for @studySettingsApplyChanges.
///
/// In en, this message translates to:
/// **'Apply changes'**
String get studySettingsApplyChanges;
/// No description provided for @studySettingsPerDay.
///
/// In en, this message translates to:
/// **' / day'**
String get studySettingsPerDay;
/// No description provided for @studySettingsMoreTags.
///
/// In en, this message translates to:
/// **'+{count} more'**
String studySettingsMoreTags(int count);
/// No description provided for @cardTagsLabel.
///
/// In en, this message translates to:
/// **'Tags'**
String get cardTagsLabel;
/// No description provided for @cardTagsAdd.
///
/// In en, this message translates to:
/// **'Add tags'**
String get cardTagsAdd;
/// No description provided for @cardTagsEdit.
///
/// In en, this message translates to:
/// **'Edit tags'**
String get cardTagsEdit;
/// No description provided for @tagChipsOverflow.
///
/// In en, this message translates to:
/// **'+{count, plural, =1{1 tag} other{{count} tags}}'**
String tagChipsOverflow(int count);
/// No description provided for @cardHints.
///
/// In en, this message translates to:
/// **'Hints'**
String get cardHints;
/// No description provided for @cardHint.
///
/// In en, this message translates to:
/// **'Hint {number}'**
String cardHint(int number);
/// No description provided for @cardAddHint.
///
/// In en, this message translates to:
/// **'Add hint'**
String get cardAddHint;
/// No description provided for @cardRemoveHint.
///
/// In en, this message translates to:
/// **'Remove hint'**
String get cardRemoveHint;
/// No description provided for @cardExplanation.
///
/// In en, this message translates to:
/// **'Explanation'**
String get cardExplanation;
/// No description provided for @cardAddExplanation.
///
/// In en, this message translates to:
/// **'Add explanation'**
String get cardAddExplanation;
/// No description provided for @cardRemoveExplanation.
///
/// In en, this message translates to:
/// **'Remove explanation'**
String get cardRemoveExplanation;
/// No description provided for @cardHintsSheetTitle.
///
/// In en, this message translates to:
/// **'{count, plural, =1{Hint} other{Hints {count}}}'**
String cardHintsSheetTitle(int count);
/// No description provided for @cardPreviousHint.
///
/// In en, this message translates to:
/// **'Previous hint'**
String get cardPreviousHint;
/// No description provided for @cardNextHint.
///
/// In en, this message translates to:
/// **'Next hint'**
String get cardNextHint;
/// No description provided for @cardReport.
///
/// In en, this message translates to:
/// **'Report'**
String get cardReport;
/// No description provided for @cardSenses.
///
/// In en, this message translates to:
/// **'Senses'**
String get cardSenses;
/// No description provided for @cardReportTitle.
///
/// In en, this message translates to:
/// **'Report an error'**
String get cardReportTitle;
/// No description provided for @cardReportSubtitle.
///
/// In en, this message translates to:
/// **'Flag this card so you can find and fix it later.'**
String get cardReportSubtitle;
/// No description provided for @cardReportTypo.
///
/// In en, this message translates to:
/// **'Typo'**
String get cardReportTypo;
/// No description provided for @cardReportGrammar.
///
/// In en, this message translates to:
/// **'Grammar'**
String get cardReportGrammar;
/// No description provided for @cardReportContent.
///
/// In en, this message translates to:
/// **'Content'**
String get cardReportContent;
/// No description provided for @cardReportOther.
///
/// In en, this message translates to:
/// **'Other'**
String get cardReportOther;
/// No description provided for @cardReportNote.
///
/// In en, this message translates to:
/// **'Note'**
String get cardReportNote;
/// No description provided for @cardReportNoteHint.
///
/// In en, this message translates to:
/// **'What needs fixing?'**
String get cardReportNoteHint;
/// No description provided for @cardReportSubmit.
///
/// In en, this message translates to:
/// **'Report'**
String get cardReportSubmit;
/// No description provided for @cardReported.
///
/// In en, this message translates to:
/// **'Flagged for fixing'**
String get cardReported;
/// No description provided for @cardResolveReport.
///
/// In en, this message translates to:
/// **'Resolve report'**
String get cardResolveReport;
/// No description provided for @cardReportResolved.
///
/// In en, this message translates to:
/// **'Report resolved'**
String get cardReportResolved;
/// No description provided for @cardBuriedBadge.
///
/// In en, this message translates to:
/// **'Buried'**
String get cardBuriedBadge;
/// No description provided for @cardUnbury.
///
/// In en, this message translates to:
/// **'Unbury'**
String get cardUnbury;
/// No description provided for @cardTileBuried.
///
/// In en, this message translates to:
/// **'Flashcard buried until tomorrow'**
String get cardTileBuried;
/// No description provided for @cardTileUnburied.
///
/// In en, this message translates to:
/// **'Flashcard unburied'**
String get cardTileUnburied;
/// No description provided for @cardDeleteTitle.
///
/// In en, this message translates to:
/// **'Delete flashcard?'**
String get cardDeleteTitle;
/// No description provided for @cardDeleteMessage.
///
/// In en, this message translates to:
/// **'This flashcard will be removed from the studyset. You can undo this for a few seconds.'**
String get cardDeleteMessage;
/// No description provided for @cardDeleted.
///
/// In en, this message translates to:
/// **'Flashcard deleted'**
String get cardDeleted;
/// No description provided for @cardFilterTooltip.
///
/// In en, this message translates to:
/// **'Filter'**
String get cardFilterTooltip;
/// No description provided for @cardFilterTitle.
///
/// In en, this message translates to:
/// **'Filter'**
String get cardFilterTitle;
/// No description provided for @cardFilterTag.
///
/// In en, this message translates to:
/// **'Tag'**
String get cardFilterTag;
/// No description provided for @cardFilterAllTags.
///
/// In en, this message translates to:
/// **'All tags'**
String get cardFilterAllTags;
/// No description provided for @cardFilterNoTags.
///
/// In en, this message translates to:
/// **'None of these flashcards has a tag yet.'**
String get cardFilterNoTags;
/// No description provided for @cardFilterClear.
///
/// In en, this message translates to:
/// **'Clear all'**
String get cardFilterClear;
/// No description provided for @cardFilterApply.
///
/// In en, this message translates to:
/// **'Apply'**
String get cardFilterApply;
/// No description provided for @cardFilterNothing.
///
/// In en, this message translates to:
/// **'No flashcards have this tag.'**
String get cardFilterNothing;
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
/// No description provided for @cardListFailed.
///
/// In en, this message translates to:
/// **'Couldn\'t read the cards.'**
String get cardListFailed;
/// No description provided for @cardListMore.
///
/// In en, this message translates to:
/// **'More'**
String get cardListMore;
/// No description provided for @cardListManageTags.
///
/// In en, this message translates to:
/// **'Manage tags'**
String get cardListManageTags;
/// No description provided for @composerTitle.
///
/// In en, this message translates to:
/// **'Create flashcards'**
String get composerTitle;
/// No description provided for @composerTitleFor.
///
/// In en, this message translates to:
/// **'Create flashcards for \"{title}\"'**
String composerTitleFor(String title);
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
/// No description provided for @composerEditTitle.
///
/// In en, this message translates to:
/// **'Edit flashcards'**
String get composerEditTitle;
/// No description provided for @composerEditTitleFor.
///
/// In en, this message translates to:
/// **'Edit flashcards in \"{title}\"'**
String composerEditTitleFor(String title);
/// No description provided for @composerSaving.
///
/// In en, this message translates to:
/// **'Saving…'**
String get composerSaving;
/// No description provided for @composerSaveFailed.
///
/// In en, this message translates to:
/// **'Save failed — retry'**
String get composerSaveFailed;
/// No description provided for @composerAllSaved.
///
/// In en, this message translates to:
/// **'All changes saved'**
String get composerAllSaved;
/// No description provided for @composerNewFlashcard.
///
/// In en, this message translates to:
/// **'New flashcard'**
String get composerNewFlashcard;
/// No description provided for @composerCollapseStack.
///
/// In en, this message translates to:
/// **'Collapse stack'**
String get composerCollapseStack;
/// No description provided for @composerExpandStack.
///
/// In en, this message translates to:
/// **'Expand stack'**
String get composerExpandStack;
/// No description provided for @composerStatusSaving.
///
/// In en, this message translates to:
/// **'Saving'**
String get composerStatusSaving;
/// No description provided for @composerStatusSaved.
///
/// In en, this message translates to:
/// **'Saved'**
String get composerStatusSaved;
/// No description provided for @composerStatusFailed.
///
/// In en, this message translates to:
/// **'Save failed'**
String get composerStatusFailed;
/// No description provided for @composerSaveFailedInline.
///
/// In en, this message translates to:
/// **'Save failed.'**
String get composerSaveFailedInline;
/// No description provided for @composerRetry.
///
/// In en, this message translates to:
/// **'Retry'**
String get composerRetry;
/// No description provided for @composerEmptyPane.
///
/// In en, this message translates to:
/// **'Add a flashcard to get started.'**
String get composerEmptyPane;
/// No description provided for @composerKindFlashcard.
///
/// In en, this message translates to:
/// **'Flashcard'**
String get composerKindFlashcard;
/// No description provided for @composerKindVocabulary.
///
/// In en, this message translates to:
/// **'Vocabulary'**
String get composerKindVocabulary;
/// No description provided for @composerKindMatching.
///
/// In en, this message translates to:
/// **'Matching'**
String get composerKindMatching;
/// No description provided for @composerKindMap.
///
/// In en, this message translates to:
/// **'Map'**
String get composerKindMap;
/// No description provided for @composerLabelFront.
///
/// In en, this message translates to:
/// **'Front'**
String get composerLabelFront;
/// No description provided for @composerLabelQuestion.
///
/// In en, this message translates to:
/// **'Question'**
String get composerLabelQuestion;
/// No description provided for @composerLabelExpression.
///
/// In en, this message translates to:
/// **'Expression'**
String get composerLabelExpression;
/// No description provided for @composerLabelPrompt.
///
/// In en, this message translates to:
/// **'Prompt'**
String get composerLabelPrompt;
/// No description provided for @composerLabelBack.
///
/// In en, this message translates to:
/// **'Back'**
String get composerLabelBack;
/// No description provided for @composerLabelAnswers.
///
/// In en, this message translates to:
/// **'Answers'**
String get composerLabelAnswers;
/// No description provided for @composerLabelAnswer.
///
/// In en, this message translates to:
/// **'Answer'**
String get composerLabelAnswer;
/// No description provided for @composerPlaceholderFront.
///
/// In en, this message translates to:
/// **'Add question'**
String get composerPlaceholderFront;
/// No description provided for @composerPlaceholderExpression.
///
/// In en, this message translates to:
/// **'Add expression'**
String get composerPlaceholderExpression;
/// No description provided for @composerPlaceholderPrompt.
///
/// In en, this message translates to:
/// **'Add prompt'**
String get composerPlaceholderPrompt;
/// No description provided for @composerAddAnswer.
///
/// In en, this message translates to:
/// **'Add answer'**
String get composerAddAnswer;
/// No description provided for @composerCorrectAnswer.
///
/// In en, this message translates to:
/// **'Correct answer'**
String get composerCorrectAnswer;
/// No description provided for @composerWrongAnswer.
///
/// In en, this message translates to:
/// **'Wrong answer'**
String get composerWrongAnswer;
/// No description provided for @composerRemoveAnswer.
///
/// In en, this message translates to:
/// **'Remove answer'**
String get composerRemoveAnswer;
/// No description provided for @composerPin.
///
/// In en, this message translates to:
/// **'Pin {field}: keep it for the next card'**
String composerPin(String field);
/// No description provided for @composerUnpin.
///
/// In en, this message translates to:
/// **'Unpin {field}: clear it for the next card'**
String composerUnpin(String field);
/// No description provided for @composerTags.
///
/// In en, this message translates to:
/// **'Tags'**
String get composerTags;
/// No description provided for @composerAddTags.
///
/// In en, this message translates to:
/// **'Add tags'**
String get composerAddTags;
/// No description provided for @composerMoreActions.
///
/// In en, this message translates to:
/// **'More actions'**
String get composerMoreActions;
/// No description provided for @composerDuplicate.
///
/// In en, this message translates to:
/// **'Duplicate'**
String get composerDuplicate;
/// No description provided for @composerClearFields.
///
/// In en, this message translates to:
/// **'Clear fields'**
String get composerClearFields;
/// No description provided for @composerDelete.
///
/// In en, this message translates to:
/// **'Delete'**
String get composerDelete;
/// No description provided for @composerDeleteTitle.
///
/// In en, this message translates to:
/// **'Delete this flashcard?'**
String get composerDeleteTitle;
/// No description provided for @composerDeleteDraftMessage.
///
/// In en, this message translates to:
/// **'The draft will be removed from this session. It has not been saved.'**
String get composerDeleteDraftMessage;
/// No description provided for @composerDeleteSavedMessage.
///
/// In en, this message translates to:
/// **'The flashcard will be removed from the studyset, on all your devices.'**
String get composerDeleteSavedMessage;
/// No description provided for @composerDiscardTitle.
///
/// In en, this message translates to:
/// **'{count, plural, =1{Discard unsaved flashcard?} other{Discard unsaved flashcards?}}'**
String composerDiscardTitle(int count);
/// No description provided for @composerDiscardMessage.
///
/// In en, this message translates to:
/// **'{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.}}'**
String composerDiscardMessage(int count);
/// No description provided for @composerDiscardConfirm.
///
/// In en, this message translates to:
/// **'Discard'**
String get composerDiscardConfirm;
/// No description provided for @composerConflict.
///
/// In en, this message translates to:
/// **'This flashcard was changed differently on two devices. Choose the version to keep of each part below.'**
String get composerConflict;
/// No description provided for @composerKeepThis.
///
/// In en, this message translates to:
/// **'Keep this'**
String get composerKeepThis;
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
/// No description provided for @formatAlignLeft.
///
/// In en, this message translates to:
/// **'Align left'**
String get formatAlignLeft;
/// No description provided for @formatAlignCenter.
///
/// In en, this message translates to:
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
/// **'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
String get formatAlignCenter;
/// No description provided for @formatAlignRight.
///
/// In en, this message translates to:
/// **'Align right'**
String get formatAlignRight;
/// No description provided for @formatBold.
///
/// In en, this message translates to:
/// **'Bold'**
String get formatBold;
/// No description provided for @formatItalic.
///
/// In en, this message translates to:
/// **'Italic'**
String get formatItalic;
/// No description provided for @formatUnderline.
///
/// In en, this message translates to:
/// **'Underline'**
String get formatUnderline;
/// No description provided for @formatSuperscript.
///
/// In en, this message translates to:
/// **'Superscript'**
String get formatSuperscript;
/// No description provided for @formatSubscript.
///
/// In en, this message translates to:
/// **'Subscript'**
String get formatSubscript;
/// No description provided for @vocabularyReading.
///
/// In en, this message translates to:
/// **'Reading'**
String get vocabularyReading;
/// No description provided for @vocabularyReadingHint.
///
/// In en, this message translates to:
/// **'Kana reading'**
String get vocabularyReadingHint;
/// No description provided for @vocabularyMeanings.
///
/// In en, this message translates to:
/// **'Meanings'**
String get vocabularyMeanings;
/// No description provided for @vocabularyPrimaryMeaningHint.
///
/// In en, this message translates to:
/// **'Primary meaning'**
String get vocabularyPrimaryMeaningHint;
/// No description provided for @vocabularyMeaningHint.
///
/// In en, this message translates to:
/// **'Meaning'**
String get vocabularyMeaningHint;
/// No description provided for @vocabularyAddMeaning.
///
/// In en, this message translates to:
/// **'Add meaning'**
String get vocabularyAddMeaning;
/// No description provided for @vocabularyRemoveMeaning.
///
/// In en, this message translates to:
/// **'Remove meaning'**
String get vocabularyRemoveMeaning;
/// No description provided for @vocabularyGlossHint.
///
/// In en, this message translates to:
/// **'Translation'**
String get vocabularyGlossHint;
/// No description provided for @vocabularyAddGloss.
///
/// In en, this message translates to:
/// **'Add translation'**
String get vocabularyAddGloss;
/// No description provided for @vocabularyRemoveGloss.
///
/// In en, this message translates to:
/// **'Remove translation'**
String get vocabularyRemoveGloss;
/// No description provided for @vocabularyAddSense.
///
/// In en, this message translates to:
/// **'Add sense'**
String get vocabularyAddSense;
/// No description provided for @vocabularyRemoveSense.
///
/// In en, this message translates to:
/// **'Remove sense'**
String get vocabularyRemoveSense;
/// No description provided for @matchingCategories.
///
/// In en, this message translates to:
/// **'Categories'**
String get matchingCategories;
/// No description provided for @matchingCategoriesHint.
///
/// In en, this message translates to:
/// **'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.'**
String get matchingCategoriesHint;
/// No description provided for @matchingCategory.
///
/// In en, this message translates to:
/// **'Category {number}'**
String matchingCategory(int number);
/// No description provided for @matchingAddCategory.
///
/// In en, this message translates to:
/// **'Add category'**
String get matchingAddCategory;
/// No description provided for @matchingAddCategoryBlocked.
///
/// In en, this message translates to:
/// **'Add an item first: a card can\'t have more categories than items'**
String get matchingAddCategoryBlocked;
/// No description provided for @matchingRemoveCategory.
///
/// In en, this message translates to:
/// **'Remove category'**
String get matchingRemoveCategory;
/// No description provided for @matchingMinCategories.
///
/// In en, this message translates to:
/// **'At least two categories required'**
String get matchingMinCategories;
/// No description provided for @matchingItems.
///
/// In en, this message translates to:
/// **'Items'**
String get matchingItems;
/// No description provided for @matchingItemsHint.
///
/// In en, this message translates to:
/// **'The draggable items. Assign every item to its correct category: an unassigned item can never be placed right.'**
String get matchingItemsHint;
/// No description provided for @matchingItem.
///
/// In en, this message translates to:
/// **'Item {number}'**
String matchingItem(int number);
/// No description provided for @matchingAddItem.
///
/// In en, this message translates to:
/// **'Add item'**
String get matchingAddItem;
/// No description provided for @matchingUnassigned.
///
/// In en, this message translates to:
/// **'Unassigned'**
String get matchingUnassigned;
/// No description provided for @matchingRemoveItem.
///
/// In en, this message translates to:
/// **'Remove item'**
String get matchingRemoveItem;
/// No description provided for @matchingMinItems.
///
/// In en, this message translates to:
/// **'At least two items required'**
String get matchingMinItems;
/// No description provided for @cardTileOptions.
///
/// In en, this message translates to:
/// **'Options'**
String get cardTileOptions;
/// No description provided for @cardTileEdit.
///
/// In en, this message translates to:
/// **'Edit'**
String get cardTileEdit;
/// No description provided for @cardTileDelete.
///
/// In en, this message translates to:
/// **'Delete'**
String get cardTileDelete;
/// No description provided for @cardTileUntitled.
///
/// In en, this message translates to:
/// **'Untitled'**
String get cardTileUntitled;
/// No description provided for @cardTileConflict.
///
/// In en, this message translates to:
/// **'Changed on two devices'**
String get cardTileConflict;
/// No description provided for @studyClose.
///
/// In en, this message translates to:
/// **'Close session'**
String get studyClose;
/// No description provided for @studyReviewsDueTitle.
///
/// In en, this message translates to:
/// **'You have reviews due'**
String get studyReviewsDueTitle;
/// No description provided for @studyReviewsDueBody.
///
/// In en, this message translates to:
/// **'{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.'**
String studyReviewsDueBody(int reviews, int news);
/// No description provided for @studyReviewsDueAllTagsNote.
///
/// In en, this message translates to:
/// **'“Review first” studies the whole backlog across every tag — your tag filter doesn\'t apply until it\'s clear.'**
String get studyReviewsDueAllTagsNote;
/// No description provided for @studyReviewFirst.
///
/// In en, this message translates to:
/// **'Review first'**
String get studyReviewFirst;
/// No description provided for @studyLearnAnyway.
///
/// In en, this message translates to:
/// **'Learn anyway'**
String get studyLearnAnyway;
/// No description provided for @studySettingsTagFilterPausedForBacklog.
///
/// In en, this message translates to:
/// **'This session is clearing your review backlog across every tag, so these tags aren\'t narrowing it. They apply again to your next session.'**
String get studySettingsTagFilterPausedForBacklog;
/// No description provided for @studyBuryCard.
///
/// In en, this message translates to:
/// **'Bury until tomorrow'**
String get studyBuryCard;
/// No description provided for @studyCardBuried.
///
/// In en, this message translates to:
/// **'Card buried until tomorrow'**
String get studyCardBuried;
/// No description provided for @studyUndo.
///
/// In en, this message translates to:
/// **'Undo'**
String get studyUndo;
/// No description provided for @studyLockScreen.
///
/// In en, this message translates to:
/// **'Lock screen'**
String get studyLockScreen;
/// No description provided for @studyUnlock.
///
/// In en, this message translates to:
/// **'Unlock'**
String get studyUnlock;
/// No description provided for @studyTapToUnlock.
///
/// In en, this message translates to:
/// **'Tap to unlock'**
String get studyTapToUnlock;
/// No description provided for @studyLoadFailed.
///
/// In en, this message translates to:
/// **'Couldn\'t read this session.'**
String get studyLoadFailed;
/// No description provided for @studyRatingFailed.
///
/// In en, this message translates to:
/// **'Couldn\'t keep your rating. Rate the card again.'**
String get studyRatingFailed;
/// No description provided for @studyRetry.
///
/// In en, this message translates to:
/// **'Retry'**
String get studyRetry;
/// No description provided for @studyScopeTitle.
///
/// In en, this message translates to:
/// **'Study scope'**
String get studyScopeTitle;
/// No description provided for @studyScopeDescription.
///
/// In en, this message translates to:
/// **'This studyset has sub-studysets. Pick which cards to review.'**
String get studyScopeDescription;
/// No description provided for @studyScopeEverythingTitle.
///
/// In en, this message translates to:
/// **'Everything'**
String get studyScopeEverythingTitle;
/// No description provided for @studyScopeEverythingSubtitle.
///
/// In en, this message translates to:
/// **'This studyset and all sub-studysets'**
String get studyScopeEverythingSubtitle;
/// No description provided for @studyScopeSelfTitle.
///
/// In en, this message translates to:
/// **'This studyset only'**
String get studyScopeSelfTitle;
/// No description provided for @studyScopeSelfSubtitle.
///
/// In en, this message translates to:
/// **'Skip cards in sub-studysets'**
String get studyScopeSelfSubtitle;
/// No description provided for @studyBackFirstOn.
///
/// In en, this message translates to:
/// **'Showing the back of cards first: tap to revert'**
String get studyBackFirstOn;
/// No description provided for @studyBackFirstOff.
///
/// In en, this message translates to:
/// **'Show the back of cards first'**
String get studyBackFirstOff;
/// No description provided for @studyShowAnswer.
///
/// In en, this message translates to:
/// **'Show answer'**
String get studyShowAnswer;
/// No description provided for @studyCheck.
///
/// In en, this message translates to:
/// **'Check'**
String get studyCheck;
/// No description provided for @studySelectAll.
///
/// In en, this message translates to:
/// **'Select all that apply'**
String get studySelectAll;
/// No description provided for @studySelectOne.
///
/// In en, this message translates to:
/// **'Select the correct answer'**
String get studySelectOne;
/// No description provided for @studyMatchingInstructions.
///
/// In en, this message translates to:
/// **'DRAG AND DROP ONTO CARDS ABOVE'**
String get studyMatchingInstructions;
/// No description provided for @studyMatchingAllPlaced.
///
/// In en, this message translates to:
/// **'All placed'**
String get studyMatchingAllPlaced;
/// No description provided for @studyMatchingDropHere.
///
/// In en, this message translates to:
/// **'Drop here'**
String get studyMatchingDropHere;
/// No description provided for @studyMapTapPrompt.
///
/// In en, this message translates to:
/// **'Tap a region to answer'**
String get studyMapTapPrompt;
/// No description provided for @studyMapSelected.
///
/// In en, this message translates to:
/// **'Selected: {label}'**
String studyMapSelected(String label);
/// No description provided for @studyCorrect.
///
/// In en, this message translates to:
/// **'Correct'**
String get studyCorrect;
/// No description provided for @studyCorrectLabel.
///
/// In en, this message translates to:
/// **'Correct — {label}'**
String studyCorrectLabel(String label);
/// No description provided for @studyMapAnswer.
///
/// In en, this message translates to:
/// **'Answer: {answer}'**
String studyMapAnswer(String answer);
/// No description provided for @studyMapPickedAnswer.
///
/// In en, this message translates to:
/// **'You picked {picked} · Answer: {answer}'**
String studyMapPickedAnswer(String picked, String answer);
/// No description provided for @studyRatingBad.
///
/// In en, this message translates to:
/// **'Bad'**
String get studyRatingBad;
/// No description provided for @studyRatingOk.
///
/// In en, this message translates to:
/// **'OK'**
String get studyRatingOk;
/// No description provided for @studyRatingGood.
///
/// In en, this message translates to:
/// **'Good'**
String get studyRatingGood;
/// No description provided for @studyRatingPerfect.
///
/// In en, this message translates to:
/// **'Perfect'**
String get studyRatingPerfect;
/// No description provided for @studyNothingTitle.
///
/// In en, this message translates to:
/// **'Nothing to study right now'**
String get studyNothingTitle;
/// No description provided for @studyNothingBody.
///
/// In en, this message translates to:
/// **'Come back later when more cards are due.'**
String get studyNothingBody;
/// No description provided for @studyNextDue.
///
/// In en, this message translates to:
/// **'The next card is due in {interval}.'**
String studyNextDue(String interval);
/// No description provided for @studyDone.
///
/// In en, this message translates to:
/// **'Done'**
String get studyDone;
/// No description provided for @studySessionComplete.
///
/// In en, this message translates to:
/// **'Session complete'**
String get studySessionComplete;
/// No description provided for @studyProgressReviewed.
///
/// In en, this message translates to:
/// **'{reviewed} / {total} reviewed'**
String studyProgressReviewed(int reviewed, int total);
/// No description provided for @studyReviewedCount.
///
/// In en, this message translates to:
/// **'{reviewed} reviewed'**
String studyReviewedCount(int reviewed);
/// No description provided for @studyStatCards.
///
/// In en, this message translates to:
/// **'Cards'**
String get studyStatCards;
/// No description provided for @studyStatAccuracy.
///
/// In en, this message translates to:
/// **'Accuracy'**
String get studyStatAccuracy;
/// No description provided for @studyStatTime.
///
/// In en, this message translates to:
/// **'Time'**
String get studyStatTime;
/// No description provided for @studyDurationSec.
///
/// In en, this message translates to:
/// **'{sec} sec'**
String studyDurationSec(int sec);
/// No description provided for @studyDurationMin.
///
/// In en, this message translates to:
/// **'{min} min'**
String studyDurationMin(int min);
/// No description provided for @studyDurationMinSec.
///
/// In en, this message translates to:
/// **'{min} min {sec} sec'**
String studyDurationMinSec(int min, int sec);
/// No description provided for @studyLeaveTitle.
///
/// In en, this message translates to:
/// **'Leave this study session?'**
String get studyLeaveTitle;
/// No description provided for @studyLeaveRated.
///
/// In en, this message translates to:
/// **'{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.}}'**
String studyLeaveRated(int count);
/// No description provided for @studyLeaveUnrated.
///
/// In en, this message translates to:
/// **'{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.}}'**
String studyLeaveUnrated(int count);
/// No description provided for @studyLeaveConfirm.
///
/// In en, this message translates to:
/// **'Leave'**
String get studyLeaveConfirm;
/// No description provided for @studyKeepStudying.
///
/// In en, this message translates to:
/// **'Keep studying'**
String get studyKeepStudying;
/// No description provided for @studyInMinutes.
///
/// In en, this message translates to:
/// **'{count, plural, =1{in 1 min} other{in {count} min}}'**
String studyInMinutes(int count);
/// No description provided for @studyInHours.
///
/// In en, this message translates to:
/// **'{count, plural, =1{in 1 hour} other{in {count} hours}}'**
String studyInHours(int count);
/// No description provided for @studyInDays.
///
/// In en, this message translates to:
/// **'{count, plural, =1{in 1 day} other{in {count} days}}'**
String studyInDays(int count);
/// No description provided for @studyInMonths.
///
/// In en, this message translates to:
/// **'{count, plural, =1{in 1 month} other{in {count} months}}'**
String studyInMonths(int count);
/// No description provided for @studyInYears.
///
/// In en, this message translates to:
/// **'{count, plural, =1{in 1 year} other{in {count} years}}'**
String studyInYears(int count);
/// No description provided for @studyContinue.
///
/// In en, this message translates to:
/// **'Continue learning'**
String get studyContinue;
/// No description provided for @studyPrevious.
///
/// In en, this message translates to:
/// **'Previous card'**
String get studyPrevious;
/// No description provided for @studySkipCard.
///
/// In en, this message translates to:
/// **'Skip card'**
String get studySkipCard;
/// No description provided for @studyMinutes.
///
/// In en, this message translates to:
/// **'{count} min'**
String studyMinutes(int count);
/// No description provided for @studyHours.
///
/// In en, this message translates to:
/// **'{count} h'**
String studyHours(int count);
/// No description provided for @studyDays.
///
/// In en, this message translates to:
/// **'{count, plural, =1{1 day} other{{count} days}}'**
String studyDays(int count);
/// No description provided for @studyMonths.
///
/// In en, this message translates to:
/// **'{count, plural, =1{1 month} other{{count} months}}'**
String studyMonths(int count);
/// No description provided for @studyYears.
///
/// In en, this message translates to:
/// **'{count, plural, =1{1 year} other{{count} years}}'**
String studyYears(int count);
/// No description provided for @studyFilteredBy.
///
/// In en, this message translates to:
/// **'{count, plural, =1{Narrowed to 1 tag} other{Narrowed to {count} tags}}'**
String studyFilteredBy(int count);
/// No description provided for @studySettingsCardsPerRound.
///
/// In en, this message translates to:
/// **'Cards per round'**
String get studySettingsCardsPerRound;
/// No description provided for @studySettingsNewPerDay.
///
/// In en, this message translates to:
/// **'New cards per day'**
String get studySettingsNewPerDay;
/// No description provided for @studySettingsNewPerDayHint.
///
/// In en, this message translates to:
/// **'How many never-studied cards each studyset starts a day, unless its own study options say otherwise.'**
String get studySettingsNewPerDayHint;
/// No description provided for @studyOptionsTitle.
///
/// In en, this message translates to:
/// **'Study options'**
String get studyOptionsTitle;
/// No description provided for @studyOptionsDescription.
///
/// In en, this message translates to:
/// **'How many cards this studyset brings a day, and which come first, on every device. The studysets inside it keep their own.'**
String get studyOptionsDescription;
/// No description provided for @studyOptionsReviewsPerDay.
///
/// In en, this message translates to:
/// **'Reviews per day'**
String get studyOptionsReviewsPerDay;
/// No description provided for @studyOptionsOrder.
///
/// In en, this message translates to:
/// **'Order'**
String get studyOptionsOrder;
/// No description provided for @studyOptionsReviewsFirst.
///
/// In en, this message translates to:
/// **'Reviews first'**
String get studyOptionsReviewsFirst;
/// No description provided for @studyOptionsMixed.
///
/// In en, this message translates to:
/// **'Mixed'**
String get studyOptionsMixed;
/// No description provided for @studyOptionsNewFirst.
///
/// In en, this message translates to:
/// **'New first'**
String get studyOptionsNewFirst;
/// No description provided for @studyOptionsReset.
///
/// In en, this message translates to:
/// **'Reset to defaults'**
String get studyOptionsReset;
/// No description provided for @studySettingsUnlimited.
///
/// In en, this message translates to:
/// **'Unlimited'**
String get studySettingsUnlimited;
/// No description provided for @studySettingsSortBy.
///
/// In en, this message translates to:
/// **'Sort by'**
String get studySettingsSortBy;
/// No description provided for @studySettingsLearnMode.
///
/// In en, this message translates to:
/// **'Learn mode'**
String get studySettingsLearnMode;
/// No description provided for @studyModeSpaced.
///
/// In en, this message translates to:
/// **'Spaced repetition'**
String get studyModeSpaced;
/// No description provided for @studyModeSpacedHint.
///
/// In en, this message translates to:
/// **'Due cards on their schedules; ratings move them.'**
String get studyModeSpacedHint;
/// No description provided for @studyModeCram.
///
/// In en, this message translates to:
/// **'Cram'**
String get studyModeCram;
/// No description provided for @studyModeCramHint.
///
/// In en, this message translates to:
/// **'Walk every card without touching the schedules.'**
String get studyModeCramHint;
/// No description provided for @studySettingsVocabulary.
///
/// In en, this message translates to:
/// **'Vocabulary'**
String get studySettingsVocabulary;
/// No description provided for @studySettingsQuizMc.
///
/// In en, this message translates to:
/// **'Quiz with multiple choice'**
String get studySettingsQuizMc;
/// No description provided for @studySettingsQuizMcDescription.
///
/// In en, this message translates to:
/// **'Show vocabulary cards as a multiple-choice question, with wrong answers drawn from other vocabulary in this set.'**
String get studySettingsQuizMcDescription;
/// No description provided for @studyAspectMeaning.
///
/// In en, this message translates to:
/// **'Meaning'**
String get studyAspectMeaning;
/// No description provided for @studyAspectReading.
///
/// In en, this message translates to:
/// **'Reading'**
String get studyAspectReading;
/// No description provided for @studyAspectExpression.
///
/// In en, this message translates to:
/// **'Expression'**
String get studyAspectExpression;
/// No description provided for @studyAspectMixed.
///
/// In en, this message translates to:
/// **'Mixed'**
String get studyAspectMixed;
/// No description provided for @studySettingsAspectDescription.
///
/// In en, this message translates to:
/// **'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.'**
String get studySettingsAspectDescription;
/// No description provided for @studySortOldestFirst.
///
/// In en, this message translates to:
/// **'Oldest first'**
String get studySortOldestFirst;
/// No description provided for @studySortRandom.
///
/// In en, this message translates to:
/// **'Random'**
String get studySortRandom;
/// No description provided for @studySortNewestFirst.
///
/// In en, this message translates to:
/// **'Newest first'**
String get studySortNewestFirst;
/// No description provided for @studyFewer.
///
/// In en, this message translates to:
/// **'Decrease'**
String get studyFewer;
/// No description provided for @studyMore.
///
/// In en, this message translates to:
/// **'Increase'**
String get studyMore;
/// No description provided for @studysetMenuReset.
///
/// In en, this message translates to:
/// **'Reset progress'**
String get studysetMenuReset;
/// No description provided for @studysetResetTitle.
///
/// In en, this message translates to:
/// **'Reset progress?'**
String get studysetResetTitle;
/// No description provided for @studysetResetMessage.
///
/// In en, this message translates to:
/// **'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.'**
String get studysetResetMessage;
/// No description provided for @studysetResetConfirm.
///
/// In en, this message translates to:
/// **'Reset'**
String get studysetResetConfirm;
/// No description provided for @studysetResetDone.
///
/// In en, this message translates to:
/// **'Progress reset'**
String get studysetResetDone;
/// No description provided for @mapUnknown.
///
/// In en, this message translates to:
/// **'This map needs a newer version of the app.'**
String get mapUnknown;
/// No description provided for @mapPickRegion.
///
/// In en, this message translates to:
/// **'Tap the region that answers the question; pinch or scroll to zoom.'**
String get mapPickRegion;
/// No description provided for @mapNonePicked.
///
/// In en, this message translates to:
/// **'No region picked yet'**
String get mapNonePicked;
/// No description provided for @composerPlaceholderQuestion.
///
/// In en, this message translates to:
/// **'Add question'**
String get composerPlaceholderQuestion;
/// No description provided for @composerLabelRegion.
///
/// In en, this message translates to:
/// **'Answer'**
String get composerLabelRegion;
/// No description provided for @homeStreakTooltip.
///
/// In en, this message translates to:
/// **'Study streak'**
String get homeStreakTooltip;
/// No description provided for @homeArrange.
///
/// In en, this message translates to:
/// **'Arrange widgets'**
String get homeArrange;
/// No description provided for @homeDone.
///
/// In en, this message translates to:
/// **'Done'**
String get homeDone;
/// No description provided for @homeDragToReorder.
///
/// In en, this message translates to:
/// **'Drag to reorder'**
String get homeDragToReorder;
/// No description provided for @homeShowWidget.
///
/// In en, this message translates to:
/// **'Show {label}'**
String homeShowWidget(String label);
/// No description provided for @homeHideWidget.
///
/// In en, this message translates to:
/// **'Hide {label}'**
String homeHideWidget(String label);
/// No description provided for @homeAllHidden.
///
/// In en, this message translates to:
/// **'All widgets are hidden'**
String get homeAllHidden;
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
/// No description provided for @homeAllHiddenBody.
///
/// In en, this message translates to:
/// **'Bring some back to fill your dashboard.'**
String get homeAllHiddenBody;
/// No description provided for @homeCustomise.
///
/// In en, this message translates to:
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
/// **'Customise'**
String get homeCustomise;
/// No description provided for @homeWidgetGoal.
///
/// In en, this message translates to:
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
/// **'Daily goal'**
String get homeWidgetGoal;
/// No description provided for @homeWidgetWeek.
///
/// In en, this message translates to:
/// **'Week overview'**
String get homeWidgetWeek;
/// No description provided for @homeWidgetActivity.
///
/// In en, this message translates to:
/// **'Activity heatmap'**
String get homeWidgetActivity;
/// No description provided for @homeActivityTitle.
///
/// In en, this message translates to:
/// **'Your activity'**
String get homeActivityTitle;
/// No description provided for @streakDays.
///
/// In en, this message translates to:
/// **'{count, plural, =1{1 day streak} other{{count} day streak}}'**
String streakDays(num count);
/// No description provided for @streakStart.
///
/// In en, this message translates to:
/// **'Study today to start your streak.'**
String get streakStart;
/// No description provided for @streakGrow.
///
/// In en, this message translates to:
/// **'Keep it going: study at least once a day to grow your streak.'**
String get streakGrow;
/// No description provided for @streakFirstDay.
///
/// In en, this message translates to:
/// **'Review some cards today to light the first day.'**
String get streakFirstDay;
/// No description provided for @streakComeBack.
///
/// In en, this message translates to:
/// **'Come back tomorrow to keep your streak.'**
String get streakComeBack;
/// No description provided for @streakKeepAlive.
///
/// In en, this message translates to:
/// **'Study today to keep your streak alive.'**
String get streakKeepAlive;
/// No description provided for @goalEditTitle.
///
/// In en, this message translates to:
/// **'Edit study goal'**
String get goalEditTitle;
/// No description provided for @goalSetTitle.
///
/// In en, this message translates to:
/// **'Set a study goal'**
String get goalSetTitle;
/// No description provided for @goalDescriptionDaily.
///
/// In en, this message translates to:
/// **'Review a number of flashcards each day. Every card you rate counts.'**
String get goalDescriptionDaily;
/// No description provided for @goalDescriptionWeekly.
///
/// In en, this message translates to:
/// **'Review a number of flashcards each week, from Monday. Every card you rate counts.'**
String get goalDescriptionWeekly;
/// No description provided for @goalPeriod.
///
/// In en, this message translates to:
/// **'Period'**
String get goalPeriod;
/// No description provided for @goalPerDay.
///
/// In en, this message translates to:
/// **'Per day'**
String get goalPerDay;
/// No description provided for @goalPerWeek.
///
/// In en, this message translates to:
/// **'Per week'**
String get goalPerWeek;
/// No description provided for @goalCardsPerDay.
///
/// In en, this message translates to:
/// **'Cards per day'**
String get goalCardsPerDay;
/// No description provided for @goalCardsPerWeek.
///
/// In en, this message translates to:
/// **'Cards per week'**
String get goalCardsPerWeek;
/// No description provided for @goalSave.
///
/// In en, this message translates to:
/// **'Save goal'**
String get goalSave;
/// No description provided for @goalRemove.
///
/// In en, this message translates to:
/// **'Remove goal'**
String get goalRemove;
/// No description provided for @goalEmptySubtitle.
///
/// In en, this message translates to:
/// **'Review a set number of cards each day or week.'**
String get goalEmptySubtitle;
/// No description provided for @goalDailyHeadline.
///
/// In en, this message translates to:
/// **'Daily goal'**
String get goalDailyHeadline;
/// No description provided for @goalWeeklyHeadline.
///
/// In en, this message translates to:
/// **'Weekly goal'**
String get goalWeeklyHeadline;
/// No description provided for @goalProgressToday.
///
/// In en, this message translates to:
/// **'{reviewed} of {target} cards today'**
String goalProgressToday(int reviewed, int target);
/// No description provided for @goalProgressThisWeek.
///
/// In en, this message translates to:
/// **'{reviewed} of {target} cards this week'**
String goalProgressThisWeek(int reviewed, int target);
/// No description provided for @goalMet.
///
/// In en, this message translates to:
/// **'Goal met: nice work!'**
String get goalMet;
/// No description provided for @goalRemaining.
///
/// In en, this message translates to:
/// **'{count} to go'**
String goalRemaining(int count);
/// No description provided for @weekToday.
///
/// In en, this message translates to:
/// **'Today'**
String get weekToday;
/// No description provided for @weekPreviousDay.
///
/// In en, this message translates to:
/// **'Previous day'**
String get weekPreviousDay;
/// No description provided for @weekNextDay.
///
/// In en, this message translates to:
/// **'Next day'**
String get weekNextDay;
/// No description provided for @weekRestDay.
///
/// In en, this message translates to:
/// **'Rest day'**
String get weekRestDay;
/// No description provided for @heatmapLess.
///
/// In en, this message translates to:
/// **'Less'**
String get heatmapLess;
/// No description provided for @heatmapMore.
///
/// In en, this message translates to:
/// **'More'**
String get heatmapMore;
/// No description provided for @heatmapTotal.
///
/// In en, this message translates to:
/// **'{count, plural, =1{1 activity in the last year} other{{count} activities in the last year}}'**
String heatmapTotal(int count);
/// No description provided for @heatmapDay.
///
/// In en, this message translates to:
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
/// **'{count, plural, =1{1 activity} other{{count} activities}} · {date}'**
String heatmapDay(int count, String date);
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
/// No description provided for @commonCancel.
///
/// In en, this message translates to:
/// **'Cancel'**
String get commonCancel;
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
/// No description provided for @commonSave.
///
/// In en, this message translates to:
/// **'Save'**
String get commonSave;
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
/// No description provided for @commonClose.
///
/// In en, this message translates to:
/// **'Close'**
String get commonClose;
/// No description provided for @commonUndo.
///
/// In en, this message translates to:
/// **'Undo'**
String get commonUndo;
/// No description provided for @moreInfo.
///
/// In en, this message translates to:
/// **'More info'**
String get moreInfo;
/// No description provided for @moreInfoCreated.
///
/// In en, this message translates to:
/// **'Created'**
String get moreInfoCreated;
/// No description provided for @moreInfoModified.
///
/// In en, this message translates to:
/// **'Last modified'**
String get moreInfoModified;
/// No description provided for @moreInfoItemId.
///
/// In en, this message translates to:
/// **'Item ID'**
String get moreInfoItemId;
/// No description provided for @moreInfoStudysetId.
///
/// In en, this message translates to:
/// **'Studyset ID'**
String get moreInfoStudysetId;
/// No description provided for @moreInfoPdfId.
///
/// In en, this message translates to:
/// **'PDF source ID'**
String get moreInfoPdfId;
/// No description provided for @moreInfoParentId.
///
/// In en, this message translates to:
/// **'Parent ID'**
String get moreInfoParentId;
/// No description provided for @moreInfoFile.
///
/// In en, this message translates to:
/// **'File'**
String get moreInfoFile;
/// No description provided for @moreInfoReviews.
///
/// In en, this message translates to:
/// **'Reviews'**
String get moreInfoReviews;
/// No description provided for @moreInfoReviewCount.
///
/// In en, this message translates to:
/// **'Review count'**
String get moreInfoReviewCount;
/// No description provided for @moreInfoLastReviewed.
///
/// In en, this message translates to:
/// **'Last reviewed'**
String get moreInfoLastReviewed;
/// No description provided for @moreInfoCopy.
///
/// In en, this message translates to:
/// **'Copy'**
String get moreInfoCopy;
/// No description provided for @copiedToClipboard.
///
/// In en, this message translates to:
/// **'Copied to clipboard'**
String get copiedToClipboard;
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
/// No description provided for @commonTryAgain.
///
/// In en, this message translates to:
/// **'Try again'**
String get commonTryAgain;
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
/// No description provided for @personDataFailed.
///
/// In en, this message translates to:
/// **'Couldn\'t open this device\'s data.'**
String get personDataFailed;
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
/// No description provided for @sessionUnreachable.
///
/// In en, this message translates to:
/// **'Couldn\'t reach the server.'**
String get sessionUnreachable;
/// No description provided for @notFoundGone.
///
/// In en, this message translates to:
/// **'This no longer exists. It may have been deleted on another device.'**
String get notFoundGone;
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
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
/// No description provided for @studysetBackToLibrary.
///
/// In en, this message translates to:
/// **'Back to library'**
String get studysetBackToLibrary;
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
/// No description provided for @fileImage.
///
/// In en, this message translates to:
/// **'Image'**
String get fileImage;
/// No description provided for @fileSound.
///
/// In en, this message translates to:
/// **'Sound'**
String get fileSound;
/// No description provided for @fileImageUnavailable.
///
/// In en, this message translates to:
/// **'This image isn\'t on this device yet. It shows once it\'s uploaded and you\'re online.'**
String get fileImageUnavailable;
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
/// No description provided for @fileImageUnreadable.
///
/// In en, this message translates to:
/// **'This image can\'t be shown. Its file may be damaged, or in a format this device can\'t read.'**
String get fileImageUnreadable;
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
/// No description provided for @fileFromElsewhere.
///
/// In en, this message translates to:
/// **'Files from the web aren\'t shown.'**
String get fileFromElsewhere;
/// No description provided for @filePlaySound.
///
/// In en, this message translates to:
/// **'Play sound'**
String get filePlaySound;
/// No description provided for @fileStopSound.
///
/// In en, this message translates to:
/// **'Stop sound'**
String get fileStopSound;
/// No description provided for @fileSoundUnavailable.
///
/// In en, this message translates to:
/// **'This sound isn\'t on this device yet. It plays once it\'s uploaded and you\'re online.'**
String get fileSoundUnavailable;
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
/// No description provided for @fileSoundUnplayable.
///
/// In en, this message translates to:
/// **'This sound can\'t be played. Its file may be damaged, or in a format this device can\'t play.'**
String get fileSoundUnplayable;
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
/// No description provided for @fileImages.
///
/// In en, this message translates to:
/// **'Images'**
String get fileImages;
/// No description provided for @fileSounds.
///
/// In en, this message translates to:
/// **'Sounds'**
String get fileSounds;
/// No description provided for @fileNotAnImage.
///
/// In en, this message translates to:
/// **'This file isn\'t an image the app can show.'**
String get fileNotAnImage;
/// No description provided for @fileNotASound.
///
/// In en, this message translates to:
/// **'This file isn\'t a sound the app can play.'**
String get fileNotASound;
/// No description provided for @fileTooLarge.
///
/// In en, this message translates to:
/// **'This file is larger than {megabytes} MB.'**
String fileTooLarge(int megabytes);
/// No description provided for @fileNotKept.
///
/// In en, this message translates to:
/// **'The file couldn\'t be kept on this device.'**
String get fileNotKept;
/// No description provided for @fileRemoveImage.
///
/// In en, this message translates to:
/// **'Remove image'**
String get fileRemoveImage;
/// No description provided for @fileRemoveSound.
///
/// In en, this message translates to:
/// **'Remove sound'**
String get fileRemoveSound;
/// No description provided for @editorInsert.
///
/// In en, this message translates to:
/// **'Insert'**
String get editorInsert;
/// No description provided for @blockGroupText.
///
/// In en, this message translates to:
/// **'Text'**
String get blockGroupText;
/// No description provided for @blockGroupBlocks.
///
/// In en, this message translates to:
/// **'Blocks'**
String get blockGroupBlocks;
/// No description provided for @blockGroupMedia.
///
/// In en, this message translates to:
/// **'Media'**
String get blockGroupMedia;
/// No description provided for @blockHeading.
///
/// In en, this message translates to:
/// **'Heading {level}'**
String blockHeading(int level);
/// No description provided for @blockBulletedList.
///
/// In en, this message translates to:
/// **'Bulleted list'**
String get blockBulletedList;
/// No description provided for @blockNumberedList.
///
/// In en, this message translates to:
/// **'Numbered list'**
String get blockNumberedList;
/// No description provided for @blockChecklist.
///
/// In en, this message translates to:
/// **'Checklist'**
String get blockChecklist;
/// No description provided for @blockQuote.
///
/// In en, this message translates to:
/// **'Quote'**
String get blockQuote;
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
/// No description provided for @blockListItem.
///
/// In en, this message translates to:
/// **'List item'**
String get blockListItem;
/// No description provided for @blockChecklistItem.
///
/// In en, this message translates to:
/// **'To-do'**
String get blockChecklistItem;
/// No description provided for @editorSlashHint.
///
/// In en, this message translates to:
/// **'Type / to insert a block, or just start typing'**
String get editorSlashHint;
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
/// No description provided for @blockDivider.
///
/// In en, this message translates to:
/// **'Divider'**
String get blockDivider;
/// No description provided for @blockTable.
///
/// In en, this message translates to:
/// **'Table'**
String get blockTable;
/// No description provided for @blockRemove.
///
/// In en, this message translates to:
/// **'Remove'**
String get blockRemove;
/// No description provided for @blockUnknown.
///
/// In en, this message translates to:
/// **'This part needs a newer version of the app.'**
String get blockUnknown;
/// No description provided for @blockCallout.
///
/// In en, this message translates to:
/// **'Callout'**
String get blockCallout;
/// No description provided for @blockSpoiler.
///
/// In en, this message translates to:
/// **'Spoiler'**
String get blockSpoiler;
/// No description provided for @calloutNote.
///
/// In en, this message translates to:
/// **'Note'**
String get calloutNote;
/// No description provided for @calloutInfo.
///
/// In en, this message translates to:
/// **'Info'**
String get calloutInfo;
/// No description provided for @calloutTip.
///
/// In en, this message translates to:
/// **'Tip'**
String get calloutTip;
/// No description provided for @calloutSuccess.
///
/// In en, this message translates to:
/// **'Success'**
String get calloutSuccess;
/// No description provided for @calloutQuestion.
///
/// In en, this message translates to:
/// **'Question'**
String get calloutQuestion;
/// No description provided for @calloutWarning.
///
/// In en, this message translates to:
/// **'Warning'**
String get calloutWarning;
/// No description provided for @calloutDanger.
///
/// In en, this message translates to:
/// **'Danger'**
String get calloutDanger;
/// No description provided for @calloutQuote.
///
/// In en, this message translates to:
/// **'Quote'**
String get calloutQuote;
/// No description provided for @calloutOptions.
///
/// In en, this message translates to:
/// **'Callout options'**
String get calloutOptions;
/// No description provided for @calloutEditTitle.
///
/// In en, this message translates to:
/// **'Edit title…'**
String get calloutEditTitle;
/// No description provided for @calloutFoldedAtFirst.
///
/// In en, this message translates to:
/// **'Folded at first'**
String get calloutFoldedAtFirst;
/// No description provided for @calloutRemove.
///
/// In en, this message translates to:
/// **'Remove callout'**
String get calloutRemove;
/// No description provided for @calloutShow.
///
/// In en, this message translates to:
/// **'Show'**
String get calloutShow;
/// No description provided for @calloutHide.
///
/// In en, this message translates to:
/// **'Hide'**
String get calloutHide;
/// No description provided for @calloutWriteInside.
///
/// In en, this message translates to:
/// **'Write inside'**
String get calloutWriteInside;
/// No description provided for @calloutTitleDialog.
///
/// In en, this message translates to:
/// **'Callout title'**
String get calloutTitleDialog;
/// No description provided for @calloutTitleLabel.
///
/// In en, this message translates to:
/// **'Title'**
String get calloutTitleLabel;
/// No description provided for @calloutTitleHelper.
///
/// In en, this message translates to:
/// **'Leave it empty to show the kind\'s name.'**
String get calloutTitleHelper;
/// No description provided for @spoilerReveal.
///
/// In en, this message translates to:
/// **'Reveal'**
String get spoilerReveal;
/// No description provided for @spoilerPlaceholder.
///
/// In en, this message translates to:
/// **'Hidden text, revealed on a tap'**
String get spoilerPlaceholder;
/// No description provided for @blockFormula.
///
/// In en, this message translates to:
/// **'Formula'**
String get blockFormula;
/// No description provided for @formatInlineMath.
///
/// In en, this message translates to:
/// **'Formula in the line'**
String get formatInlineMath;
/// No description provided for @formulaTitle.
///
/// In en, this message translates to:
/// **'Formula'**
String get formulaTitle;
/// No description provided for @formulaInLineTitle.
///
/// In en, this message translates to:
/// **'Formula in the line'**
String get formulaInLineTitle;
/// No description provided for @formulaPreview.
///
/// In en, this message translates to:
/// **'Preview'**
String get formulaPreview;
/// No description provided for @formulaPreviewEmpty.
///
/// In en, this message translates to:
/// **'The formula shows here'**
String get formulaPreviewEmpty;
/// No description provided for @formulaLatex.
///
/// In en, this message translates to:
/// **'LaTeX'**
String get formulaLatex;
/// No description provided for @formulaLatexHelper.
///
/// In en, this message translates to:
/// **'\\\\ starts a new line in aligned, cases or a matrix.'**
String get formulaLatexHelper;
/// No description provided for @formulaEmpty.
///
/// In en, this message translates to:
/// **'An empty formula. Tap to write it.'**
String get formulaEmpty;
/// No description provided for @formulaEdit.
///
/// In en, this message translates to:
/// **'Edit formula'**
String get formulaEdit;
/// No description provided for @formulaRemove.
///
/// In en, this message translates to:
/// **'Remove formula'**
String get formulaRemove;
/// No description provided for @blockYoutube.
///
/// In en, this message translates to:
/// **'YouTube video'**
String get blockYoutube;
/// No description provided for @youtubeLink.
///
/// In en, this message translates to:
/// **'YouTube link'**
String get youtubeLink;
/// No description provided for @youtubeLinkHelper.
///
/// In en, this message translates to:
/// **'Paste a link from YouTube.'**
String get youtubeLinkHelper;
/// No description provided for @youtubeNotFound.
///
/// In en, this message translates to:
/// **'No YouTube video in this link.'**
String get youtubeNotFound;
/// No description provided for @youtubeFound.
///
/// In en, this message translates to:
/// **'Found the video.'**
String get youtubeFound;
/// No description provided for @youtubeFoundFrom.
///
/// In en, this message translates to:
/// **'Found the video, starting at {time}.'**
String youtubeFoundFrom(String time);
/// No description provided for @youtubeCaption.
///
/// In en, this message translates to:
/// **'Caption'**
String get youtubeCaption;
/// No description provided for @youtubeCaptionHelper.
///
/// In en, this message translates to:
/// **'Shown in place of the video until it plays.'**
String get youtubeCaptionHelper;
/// No description provided for @youtubeVideo.
///
/// In en, this message translates to:
/// **'YouTube video'**
String get youtubeVideo;
/// No description provided for @youtubeSource.
///
/// In en, this message translates to:
/// **'YouTube'**
String get youtubeSource;
/// No description provided for @youtubeFrom.
///
/// In en, this message translates to:
/// **'YouTube · from {time}'**
String youtubeFrom(String time);
/// No description provided for @youtubeEdit.
///
/// In en, this message translates to:
/// **'Edit video'**
String get youtubeEdit;
/// No description provided for @youtubePlay.
///
/// In en, this message translates to:
/// **'Play video'**
String get youtubePlay;
/// No description provided for @youtubeOpen.
///
/// In en, this message translates to:
/// **'Open on YouTube'**
String get youtubeOpen;
/// No description provided for @youtubeRemove.
///
/// In en, this message translates to:
/// **'Remove video'**
String get youtubeRemove;
/// No description provided for @youtubeBroken.
///
/// In en, this message translates to:
/// **'This video\'s link can\'t be read.'**
String get youtubeBroken;
/// No description provided for @youtubeNotOpened.
///
/// In en, this message translates to:
/// **'Couldn\'t open YouTube.'**
String get youtubeNotOpened;
/// No description provided for @blockStudyButton.
///
/// In en, this message translates to:
/// **'Study button'**
String get blockStudyButton;
/// No description provided for @studyButtonDefaultLabel.
///
/// In en, this message translates to:
/// **'Study'**
String get studyButtonDefaultLabel;
/// No description provided for @studyButtonStudyset.
///
/// In en, this message translates to:
/// **'Studyset to study'**
String get studyButtonStudyset;
/// No description provided for @studyButtonTag.
///
/// In en, this message translates to:
/// **'Cards'**
String get studyButtonTag;
/// No description provided for @studyButtonAllCards.
///
/// In en, this message translates to:
/// **'All cards'**
String get studyButtonAllCards;
/// No description provided for @studyButtonLabel.
///
/// In en, this message translates to:
/// **'Label'**
String get studyButtonLabel;
/// No description provided for @studyButtonTopics.
///
/// In en, this message translates to:
/// **'With its topics'**
String get studyButtonTopics;
/// No description provided for @studyButtonBackFirst.
///
/// In en, this message translates to:
/// **'Back first'**
String get studyButtonBackFirst;
/// No description provided for @studyButtonBackFirstHelper.
///
/// In en, this message translates to:
/// **'Front/back and vocabulary cards ask their back.'**
String get studyButtonBackFirstHelper;
/// No description provided for @studyButtonWithTag.
///
/// In en, this message translates to:
/// **'Tagged {tag}'**
String studyButtonWithTag(String tag);
/// No description provided for @studyButtonAlone.
///
/// In en, this message translates to:
/// **'Without its topics'**
String get studyButtonAlone;
/// No description provided for @studyButtonEdit.
///
/// In en, this message translates to:
/// **'Edit study button'**
String get studyButtonEdit;
/// No description provided for @studyButtonRemove.
///
/// In en, this message translates to:
/// **'Remove study button'**
String get studyButtonRemove;
/// No description provided for @studyButtonBroken.
///
/// In en, this message translates to:
/// **'This study button doesn\'t say what to study.'**
String get studyButtonBroken;
/// No description provided for @studyButtonGone.
///
/// In en, this message translates to:
/// **'That studyset no longer exists.'**
String get studyButtonGone;
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
/// No description provided for @pdfPageField.
///
/// In en, this message translates to:
/// **'PDF page'**
String get pdfPageField;
/// No description provided for @studysetTabFiles.
///
/// In en, this message translates to:
/// **'Files'**
String get studysetTabFiles;
/// No description provided for @pdfUploadMenu.
///
/// In en, this message translates to:
/// **'Upload a PDF'**
String get pdfUploadMenu;
/// No description provided for @pdfFileType.
///
/// In en, this message translates to:
/// **'PDFs'**
String get pdfFileType;
/// No description provided for @pdfAdded.
///
/// In en, this message translates to:
/// **'Added \"{title}\".'**
String pdfAdded(String title);
/// No description provided for @pdfNotPdf.
///
/// In en, this message translates to:
/// **'This file isn\'t a PDF.'**
String get pdfNotPdf;
/// No description provided for @pdfTooLarge.
///
/// In en, this message translates to:
/// **'This PDF is larger than {megabytes} MB.'**
String pdfTooLarge(int megabytes);
/// No description provided for @pdfDuplicateTitle.
///
/// In en, this message translates to:
/// **'PDF already here'**
String get pdfDuplicateTitle;
/// No description provided for @pdfDuplicateMessage.
///
/// In en, this message translates to:
/// **'This file is \"{title}\", which this studyset holds already. Add it as a copy, or keep the one there?'**
String pdfDuplicateMessage(String title);
/// No description provided for @pdfDuplicateKeep.
///
/// In en, this message translates to:
/// **'Keep the one there'**
String get pdfDuplicateKeep;
/// No description provided for @pdfDuplicateAdd.
///
/// In en, this message translates to:
/// **'Add a copy'**
String get pdfDuplicateAdd;
/// No description provided for @filesEmpty.
///
/// In en, this message translates to:
/// **'No files yet'**
String get filesEmpty;
/// No description provided for @filesEmptyHint.
///
/// In en, this message translates to:
/// **'Use \"Add material → Upload a PDF\" to add one.'**
String get filesEmptyHint;
/// No description provided for @filesSort.
///
/// In en, this message translates to:
/// **'Sort'**
String get filesSort;
/// No description provided for @filesSortName.
///
/// In en, this message translates to:
/// **'Name (A–Z)'**
String get filesSortName;
/// No description provided for @filesSortNewest.
///
/// In en, this message translates to:
/// **'Newest first'**
String get filesSortNewest;
/// No description provided for @filesSortOldest.
///
/// In en, this message translates to:
/// **'Oldest first'**
String get filesSortOldest;
/// No description provided for @filesSortLargest.
///
/// In en, this message translates to:
/// **'Largest first'**
String get filesSortLargest;
/// No description provided for @pdfPages.
///
/// In en, this message translates to:
/// **'{count, plural, =1{1 page} other{{count} pages}}'**
String pdfPages(int count);
/// No description provided for @pdfPercentRead.
///
/// In en, this message translates to:
/// **'{percent}% read'**
String pdfPercentRead(int percent);
/// No description provided for @pdfDeadlineMet.
///
/// In en, this message translates to:
/// **'Reading deadline met'**
String get pdfDeadlineMet;
/// No description provided for @pdfDeadlineUpcoming.
///
/// In en, this message translates to:
/// **'Starts in {days, plural, =1{1 day} other{{days} days}} — {pages}/day planned'**
String pdfDeadlineUpcoming(int days, int pages);
/// No description provided for @pdfDeadlinePassed.
///
/// In en, this message translates to:
/// **'Deadline passed — {pages, plural, =1{1 page} other{{pages} pages}} left'**
String pdfDeadlinePassed(int pages);
/// No description provided for @pdfDeadlineToday.
///
/// In en, this message translates to:
/// **'Due today — {pages, plural, =1{1 page} other{{pages} pages}} left'**
String pdfDeadlineToday(int pages);
/// No description provided for @pdfDeadlinePace.
///
/// In en, this message translates to:
/// **'{pages}/day to reach page {target} in {days, plural, =1{1 day} other{{days} days}}'**
String pdfDeadlinePace(int pages, int target, int days);
/// No description provided for @pdfOptions.
///
/// In en, this message translates to:
/// **'Actions'**
String get pdfOptions;
/// No description provided for @pdfRename.
///
/// In en, this message translates to:
/// **'Rename'**
String get pdfRename;
/// No description provided for @pdfRenameTitle.
///
/// In en, this message translates to:
/// **'Rename PDF'**
String get pdfRenameTitle;
/// No description provided for @pdfRenameLabel.
///
/// In en, this message translates to:
/// **'Title'**
String get pdfRenameLabel;
/// No description provided for @pdfSetDeadline.
///
/// In en, this message translates to:
/// **'Set reading deadline'**
String get pdfSetDeadline;
/// No description provided for @pdfEditDeadline.
///
/// In en, this message translates to:
/// **'Edit reading deadline'**
String get pdfEditDeadline;
/// No description provided for @pdfMarkFinished.
///
/// In en, this message translates to:
/// **'Mark as finished'**
String get pdfMarkFinished;
/// No description provided for @pdfResetReading.
///
/// In en, this message translates to:
/// **'Reset reading progress'**
String get pdfResetReading;
/// No description provided for @pdfResetTitle.
///
/// In en, this message translates to:
/// **'Reset reading progress?'**
String get pdfResetTitle;
/// No description provided for @pdfResetMessage.
///
/// In en, this message translates to:
/// **'How far you\'ve read \"{title}\" is forgotten. The PDF, its flashcards and notes stay.'**
String pdfResetMessage(String title);
/// No description provided for @pdfResetConfirm.
///
/// In en, this message translates to:
/// **'Reset'**
String get pdfResetConfirm;
/// No description provided for @pdfMoreInfo.
///
/// In en, this message translates to:
/// **'More info'**
String get pdfMoreInfo;
/// No description provided for @pdfInfoFileName.
///
/// In en, this message translates to:
/// **'File name'**
String get pdfInfoFileName;
/// No description provided for @pdfInfoSize.
///
/// In en, this message translates to:
/// **'Size'**
String get pdfInfoSize;
/// No description provided for @pdfInfoPages.
///
/// In en, this message translates to:
/// **'Pages'**
String get pdfInfoPages;
/// No description provided for @pdfInfoUnknown.
///
/// In en, this message translates to:
/// **'Known once it is opened'**
String get pdfInfoUnknown;
/// No description provided for @pdfDelete.
///
/// In en, this message translates to:
/// **'Delete'**
String get pdfDelete;
/// No description provided for @pdfDeleteTitle.
///
/// In en, this message translates to:
/// **'Delete PDF?'**
String get pdfDeleteTitle;
/// No description provided for @pdfDeleteMessage.
///
/// In en, this message translates to:
/// **'\"{title}\" is removed from this studyset, with how far it was read. Flashcards and notes made from it stay.'**
String pdfDeleteMessage(String title);
/// No description provided for @pdfDeleteConfirm.
///
/// In en, this message translates to:
/// **'Delete'**
String get pdfDeleteConfirm;
/// No description provided for @pdfDeleted.
///
/// In en, this message translates to:
/// **'PDF deleted'**
String get pdfDeleted;
/// No description provided for @deadlineSheetSet.
///
/// In en, this message translates to:
/// **'Set a reading deadline'**
String get deadlineSheetSet;
/// No description provided for @deadlineSheetEdit.
///
/// In en, this message translates to:
/// **'Edit reading deadline'**
String get deadlineSheetEdit;
/// No description provided for @deadlineSheetHelp.
///
/// In en, this message translates to:
/// **'Reach a page by a day. Progress follows the furthest page you reach as you read.'**
String get deadlineSheetHelp;
/// No description provided for @deadlineReachPageOf.
///
/// In en, this message translates to:
/// **'Reach page (of {count})'**
String deadlineReachPageOf(int count);
/// No description provided for @deadlineReachPage.
///
/// In en, this message translates to:
/// **'Reach page'**
String get deadlineReachPage;
/// No description provided for @deadlineDecrease.
///
/// In en, this message translates to:
/// **'Decrease'**
String get deadlineDecrease;
/// No description provided for @deadlineIncrease.
///
/// In en, this message translates to:
/// **'Increase'**
String get deadlineIncrease;
/// No description provided for @deadlineChapter.
///
/// In en, this message translates to:
/// **'Or finish a chapter'**
String get deadlineChapter;
/// No description provided for @deadlineChapterEntry.
///
/// In en, this message translates to:
/// **'{title} · to p.{page}'**
String deadlineChapterEntry(String title, int page);
/// No description provided for @deadlineBy.
///
/// In en, this message translates to:
/// **'By'**
String get deadlineBy;
/// No description provided for @deadlineStart.
///
/// In en, this message translates to:
/// **'Start on'**
String get deadlineStart;
/// No description provided for @deadlineStartToday.
///
/// In en, this message translates to:
/// **'Today'**
String get deadlineStartToday;
/// No description provided for @deadlineStartReset.
///
/// In en, this message translates to:
/// **'Start today'**
String get deadlineStartReset;
/// No description provided for @deadlineStartHelp.
///
/// In en, this message translates to:
/// **'The daily pace counts from this day on. Until then the PDF waits under \"Upcoming\".'**
String get deadlineStartHelp;
/// No description provided for @deadlineSave.
///
/// In en, this message translates to:
/// **'Save deadline'**
String get deadlineSave;
/// No description provided for @deadlineRemove.
///
/// In en, this message translates to:
/// **'Remove deadline'**
String get deadlineRemove;
/// No description provided for @readerMissing.
///
/// In en, this message translates to:
/// **'This PDF isn\'t on this device yet. It opens once the device that added it has uploaded it and you\'re online.'**
String get readerMissing;
/// No description provided for @readerUnreadable.
///
/// In en, this message translates to:
/// **'This file can\'t be read as a PDF.'**
String get readerUnreadable;
/// No description provided for @readerBack.
///
/// In en, this message translates to:
/// **'Back to studyset'**
String get readerBack;
/// No description provided for @readerSearch.
///
/// In en, this message translates to:
/// **'Search PDF'**
String get readerSearch;
/// No description provided for @readerFitWidth.
///
/// In en, this message translates to:
/// **'Fit width'**
String get readerFitWidth;
/// No description provided for @readerFitHeight.
///
/// In en, this message translates to:
/// **'Fit height'**
String get readerFitHeight;
/// No description provided for @readerZoomIn.
///
/// In en, this message translates to:
/// **'Zoom in'**
String get readerZoomIn;
/// No description provided for @readerZoomOut.
///
/// In en, this message translates to:
/// **'Zoom out'**
String get readerZoomOut;
/// No description provided for @readerSetZoom.
///
/// In en, this message translates to:
/// **'Set zoom'**
String get readerSetZoom;
/// No description provided for @readerZoomTitle.
///
/// In en, this message translates to:
/// **'Zoom'**
String get readerZoomTitle;
/// No description provided for @readerZoomApply.
///
/// In en, this message translates to:
/// **'Apply'**
String get readerZoomApply;
/// No description provided for @readerFullscreen.
///
/// In en, this message translates to:
/// **'Fullscreen'**
String get readerFullscreen;
/// No description provided for @readerExitFullscreen.
///
/// In en, this message translates to:
/// **'Exit fullscreen'**
String get readerExitFullscreen;
/// No description provided for @readerPreviousPage.
///
/// In en, this message translates to:
/// **'Previous page'**
String get readerPreviousPage;
/// No description provided for @readerNextPage.
///
/// In en, this message translates to:
/// **'Next page'**
String get readerNextPage;
/// No description provided for @readerPageOf.
///
/// In en, this message translates to:
/// **'/ {count}'**
String readerPageOf(int count);
/// No description provided for @readerFindHint.
///
/// In en, this message translates to:
/// **'Find in PDF'**
String get readerFindHint;
/// No description provided for @readerMatchOf.
///
/// In en, this message translates to:
/// **'{current} of {total}'**
String readerMatchOf(int current, int total);
/// No description provided for @readerPreviousMatch.
///
/// In en, this message translates to:
/// **'Previous match'**
String get readerPreviousMatch;
/// No description provided for @readerNextMatch.
///
/// In en, this message translates to:
/// **'Next match'**
String get readerNextMatch;
/// No description provided for @readerCloseSearch.
///
/// In en, this message translates to:
/// **'Close search'**
String get readerCloseSearch;
/// No description provided for @readerExpand.
///
/// In en, this message translates to:
/// **'Expand'**
String get readerExpand;
/// No description provided for @readerCollapse.
///
/// In en, this message translates to:
/// **'Collapse'**
String get readerCollapse;
/// No description provided for @readerTabFlashcards.
///
/// In en, this message translates to:
/// **'Flashcards'**
String get readerTabFlashcards;
/// No description provided for @readerTabNotes.
///
/// In en, this message translates to:
/// **'Notes'**
String get readerTabNotes;
/// No description provided for @readerCardCreated.
///
/// In en, this message translates to:
/// **'Flashcard created'**
String get readerCardCreated;
/// No description provided for @readerCardDeleteTitle.
///
/// In en, this message translates to:
/// **'Delete flashcard?'**
String get readerCardDeleteTitle;
/// No description provided for @readerCardDeleteMessage.
///
/// In en, this message translates to:
/// **'The flashcard is deleted, with how it was studied.'**
String get readerCardDeleteMessage;
/// No description provided for @readerCardDeleteConfirm.
///
/// In en, this message translates to:
/// **'Delete'**
String get readerCardDeleteConfirm;
/// No description provided for @readerFrontMatter.
///
/// In en, this message translates to:
/// **'Front matter'**
String get readerFrontMatter;
/// No description provided for @readerPage.
///
/// In en, this message translates to:
/// **'Page {page}'**
String readerPage(int page);
/// No description provided for @readerByPage.
///
/// In en, this message translates to:
/// **'Page'**
String get readerByPage;
/// No description provided for @readerByChapter.
///
/// In en, this message translates to:
/// **'Chapter'**
String get readerByChapter;
/// No description provided for @readerCardsEmpty.
///
/// In en, this message translates to:
/// **'Select text to make flashcards in no time'**
String get readerCardsEmpty;
/// No description provided for @readerCardsEmptyHint.
///
/// In en, this message translates to:
/// **'Select the lines that matter and send them to a question or an answer, or press \"Create flashcard\".'**
String get readerCardsEmptyHint;
/// No description provided for @readerCreateCard.
///
/// In en, this message translates to:
/// **'Create flashcard'**
String get readerCreateCard;
/// No description provided for @readerEditCard.
///
/// In en, this message translates to:
/// **'Edit flashcard'**
String get readerEditCard;
/// No description provided for @readerBackToCards.
///
/// In en, this message translates to:
/// **'Back to flashcards'**
String get readerBackToCards;
/// No description provided for @readerReferencedPage.
///
/// In en, this message translates to:
/// **'Referenced page: {page}'**
String readerReferencedPage(int page);
/// No description provided for @readerUseCurrentPage.
///
/// In en, this message translates to:
/// **'Use current ({page})'**
String readerUseCurrentPage(int page);
/// No description provided for @readerQuestion.
///
/// In en, this message translates to:
/// **'Question'**
String get readerQuestion;
/// No description provided for @readerAnswer.
///
/// In en, this message translates to:
/// **'Answer'**
String get readerAnswer;
/// No description provided for @readerKeepOpen.
///
/// In en, this message translates to:
/// **'Keep creation mode open'**
String get readerKeepOpen;
/// No description provided for @readerClear.
///
/// In en, this message translates to:
/// **'Clear'**
String get readerClear;
/// No description provided for @readerCreate.
///
/// In en, this message translates to:
/// **'Create'**
String get readerCreate;
/// No description provided for @readerUntitledCard.
///
/// In en, this message translates to:
/// **'Untitled flashcard'**
String get readerUntitledCard;
/// No description provided for @readerCardOptions.
///
/// In en, this message translates to:
/// **'Card options'**
String get readerCardOptions;
/// No description provided for @readerNoteSaved.
///
/// In en, this message translates to:
/// **'Saved'**
String get readerNoteSaved;
/// No description provided for @readerNoteEditing.
///
/// In en, this message translates to:
/// **'Editing…'**
String get readerNoteEditing;
/// No description provided for @readerNoteSaving.
///
/// In en, this message translates to:
/// **'Saving…'**
String get readerNoteSaving;
/// No description provided for @readerNoteFailed.
///
/// In en, this message translates to:
/// **'Save failed'**
String get readerNoteFailed;
/// No description provided for @readerToQuestion.
///
/// In en, this message translates to:
/// **'Question'**
String get readerToQuestion;
/// No description provided for @readerToAnswer.
///
/// In en, this message translates to:
/// **'Answer'**
String get readerToAnswer;
/// No description provided for @readerToNote.
///
/// In en, this message translates to:
/// **'Notes'**
String get readerToNote;
/// No description provided for @readerLineBreaksJoined.
///
/// In en, this message translates to:
/// **'Line breaks joined (tap to keep)'**
String get readerLineBreaksJoined;
/// No description provided for @readerLineBreaksKept.
///
/// In en, this message translates to:
/// **'Line breaks kept (tap to join)'**
String get readerLineBreaksKept;
/// No description provided for @blockScreenshot.
///
/// In en, this message translates to:
/// **'Screenshot of the page'**
String get blockScreenshot;
/// No description provided for @readerCaptureCancel.
///
/// In en, this message translates to:
/// **'Cancel screenshot'**
String get readerCaptureCancel;
/// No description provided for @readerCaptureHint.
///
/// In en, this message translates to:
/// **'Drag over the part of the page to keep'**
String get readerCaptureHint;
/// No description provided for @readerCaptureFailed.
///
/// In en, this message translates to:
/// **'The page couldn\'t be drawn. Try again once it has loaded.'**
String get readerCaptureFailed;
/// No description provided for @readerScreenshotSaved.
///
/// In en, this message translates to:
/// **'Screenshot saved'**
String get readerScreenshotSaved;
/// No description provided for @imageOpenPdfPage.
///
/// In en, this message translates to:
/// **'Open the PDF at this page'**
String get imageOpenPdfPage;
/// No description provided for @homeWidgetDeadlines.
///
/// In en, this message translates to:
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
/// **'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
String get homeWidgetDeadlines;
/// No description provided for @deadlinesTitle.
///
/// In en, this message translates to:
/// **'Reading deadlines'**
String get deadlinesTitle;
/// No description provided for @deadlinesCurrent.
///
/// In en, this message translates to:
/// **'Current'**
String get deadlinesCurrent;
/// No description provided for @deadlinesUpcoming.
///
/// In en, this message translates to:
/// **'Upcoming'**
String get deadlinesUpcoming;
/// No description provided for @deadlinesProgress.
///
/// In en, this message translates to:
/// **'p.{furthest}/{target} · {when}'**
String deadlinesProgress(int furthest, int target, String when);
/// No description provided for @deadlinePassedShort.
///
/// In en, this message translates to:
/// **'deadline passed'**
String get deadlinePassedShort;
/// No description provided for @deadlineDueTodayShort.
///
/// In en, this message translates to:
/// **'due today'**
String get deadlineDueTodayShort;
/// No description provided for @deadlineDaysLeft.
///
/// In en, this message translates to:
/// **'{days, plural, =1{1 day left} other{{days} days left}}'**
String deadlineDaysLeft(int days);
/// No description provided for @deadlineToPageToday.
///
/// In en, this message translates to:
/// **'to p.{page} today'**
String deadlineToPageToday(int page);
/// No description provided for @deadlineStartsIn.
///
/// In en, this message translates to:
/// **'Starts in {days, plural, =1{1 day} other{{days} days}}'**
String deadlineStartsIn(int days);
/// No description provided for @deadlinesPlaceholder.
///
/// In en, this message translates to:
/// **'Appears when you have reading deadlines'**
String get deadlinesPlaceholder;
/// No description provided for @deadlinesOpenTimeline.
///
/// In en, this message translates to:
/// **'Open the timeline'**
String get deadlinesOpenTimeline;
/// No description provided for @timelineTitle.
///
/// In en, this message translates to:
/// **'Reading timeline'**
String get timelineTitle;
/// No description provided for @timelineEmpty.
///
/// In en, this message translates to:
/// **'No reading deadlines yet'**
String get timelineEmpty;
/// No description provided for @timelineEmptyHint.
///
/// In en, this message translates to:
/// **'Set a reading deadline on a PDF to see it here.'**
String get timelineEmptyHint;
/// No description provided for @timelineToday.
///
/// In en, this message translates to:
/// **'Today'**
String get timelineToday;
/// No description provided for @timelinePages.
///
/// In en, this message translates to:
/// **'p.{furthest}/{target}'**
String timelinePages(int furthest, int target);
/// No description provided for @chapterFinished.
///
/// In en, this message translates to:
/// **'Finished “{chapter}” — study the {count, plural, =1{card} other{{count} cards}} you made?'**
String chapterFinished(String chapter, int count);
/// No description provided for @chapterStudyNow.
///
/// In en, this message translates to:
/// **'Study now'**
String get chapterStudyNow;
/// No description provided for @chapterDismiss.
///
/// In en, this message translates to:
/// **'Dismiss'**
String get chapterDismiss;
/// No description provided for @deadlineChapterLoading.
///
/// In en, this message translates to:
/// **'Loading chapters…'**
String get deadlineChapterLoading;
/// No description provided for @fileSizeKb.
///
/// In en, this message translates to:
/// **'{size} KB'**
String fileSizeKb(int size);
/// No description provided for @fileSizeMb.
///
/// In en, this message translates to:
/// **'{size} MB'**
String fileSizeMb(String size);
/// No description provided for @pdfPageShort.
///
/// In en, this message translates to:
/// **'p. {page}'**
String pdfPageShort(int page);
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
/// No description provided for @ankiImportMenu.
///
/// In en, this message translates to:
/// **'Import from Anki'**
String get ankiImportMenu;
/// No description provided for @ankiImportFileType.
///
/// In en, this message translates to:
/// **'Anki decks'**
String get ankiImportFileType;
/// No description provided for @ankiImportTitle.
///
/// In en, this message translates to:
/// **'Import Anki deck'**
String get ankiImportTitle;
/// No description provided for @ankiImportOptionsTitle.
///
/// In en, this message translates to:
/// **'How should subdecks be imported?'**
String get ankiImportOptionsTitle;
/// No description provided for @ankiImportReading.
///
/// In en, this message translates to:
/// **'Reading the deck…'**
String get ankiImportReading;
/// No description provided for @ankiImportSummary.
///
/// In en, this message translates to:
/// **'{cards, plural, =1{1 card.} other{{cards} cards.}}'**
String ankiImportSummary(int cards);
/// No description provided for @ankiImportSummaryDecks.
///
/// In en, this message translates to:
/// **'{cards, plural, =1{1 card} other{{cards} cards}} across {decks} subdecks.'**
String ankiImportSummaryDecks(int cards, int decks);
/// No description provided for @ankiImportModeFlatten.
///
/// In en, this message translates to:
/// **'Flatten into this studyset'**
String get ankiImportModeFlatten;
/// No description provided for @ankiImportModeFlattenSubtitle.
///
/// In en, this message translates to:
/// **'Import every card here and ignore the subdecks.'**
String get ankiImportModeFlattenSubtitle;
/// No description provided for @ankiImportModeSubStudysets.
///
/// In en, this message translates to:
/// **'Recreate as sub-studysets'**
String get ankiImportModeSubStudysets;
/// No description provided for @ankiImportModeSubStudysetsSubtitle.
///
/// In en, this message translates to:
/// **'Mirror the subdeck tree: each subdeck becomes a nested studyset.'**
String get ankiImportModeSubStudysetsSubtitle;
/// No description provided for @ankiImportModeTag.
///
/// In en, this message translates to:
/// **'Tag cards by subdeck'**
String get ankiImportModeTag;
/// No description provided for @ankiImportModeTagSubtitle.
///
/// In en, this message translates to:
/// **'Keep every card here, tagged with each subdeck it came from.'**
String get ankiImportModeTagSubtitle;
/// No description provided for @ankiImportProgress.
///
/// In en, this message translates to:
/// **'Import study progress'**
String get ankiImportProgress;
/// No description provided for @ankiImportProgressSubtitle.
///
/// In en, this message translates to:
/// **'Bring Anki\'s review history over: cards continue where they left off. New cards stay new.'**
String get ankiImportProgressSubtitle;
/// No description provided for @ankiImportMedia.
///
/// In en, this message translates to:
/// **'{count, plural, =1{Include media (1 file)} other{Include media ({count} files)}}'**
String ankiImportMedia(int count);
/// No description provided for @ankiImportMediaSubtitle.
///
/// In en, this message translates to:
/// **'Keep the deck\'s images and sounds on the cards.'**
String get ankiImportMediaSubtitle;
/// No description provided for @ankiImportMediaMayNotFit.
///
/// In en, this message translates to:
/// **'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.'**
String ankiImportMediaMayNotFit(String size, String left);
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
/// No description provided for @ankiImportRunning.
///
/// In en, this message translates to:
/// **'Importing…'**
String get ankiImportRunning;
/// No description provided for @ankiImportConfirm.
///
/// In en, this message translates to:
/// **'Import'**
String get ankiImportConfirm;
/// No description provided for @ankiImportNotAPackage.
///
/// In en, this message translates to:
/// **'This isn\'t an Anki deck. In Anki, export a deck as an .apkg file and import that.'**
String get ankiImportNotAPackage;
/// No description provided for @ankiImportNewerFormat.
///
/// In en, this message translates to:
/// **'This deck comes from a newer Anki than this app knows. Export it again with “Support older Anki versions”.'**
String get ankiImportNewerFormat;
/// No description provided for @ankiImportUnreadable.
///
/// In en, this message translates to:
/// **'This deck is damaged and can\'t be read.'**
String get ankiImportUnreadable;
/// No description provided for @ankiImportBrokeOff.
///
/// In en, this message translates to:
/// **'The import broke off. The cards it brought in so far stay.'**
String get ankiImportBrokeOff;
/// No description provided for @ankiImported.
///
/// In en, this message translates to:
/// **'{count, plural, =1{Imported 1 flashcard from Anki.} other{Imported {count} flashcards from Anki.}}'**
String ankiImported(int count);
/// No description provided for @ankiImportedSubStudysets.
///
/// In en, this message translates to:
/// **'{count, plural, =1{Imported 1 card into sub-studysets.} other{Imported {count} cards into sub-studysets.}}'**
String ankiImportedSubStudysets(int count);
/// No description provided for @ankiImportedTagged.
///
/// In en, this message translates to:
/// **'{count, plural, =1{Imported 1 card, tagged by subdeck.} other{Imported {count} cards, tagged by subdeck.}}'**
String ankiImportedTagged(int count);
/// No description provided for @ankiImportFilesSkipped.
///
/// In en, this message translates to:
/// **'{count, plural, =1{1 media file couldn\'t be imported.} other{{count} media files couldn\'t be imported.}}'**
String ankiImportFilesSkipped(int count);
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
/// No description provided for @pomodoroTitle.
///
/// In en, this message translates to:
/// **'Pomodoro'**
String get pomodoroTitle;
/// No description provided for @pomodoroFocus.
///
/// In en, this message translates to:
/// **'Focus'**
String get pomodoroFocus;
/// No description provided for @pomodoroShortBreak.
///
/// In en, this message translates to:
/// **'Short break'**
String get pomodoroShortBreak;
/// No description provided for @pomodoroLongBreak.
///
/// In en, this message translates to:
/// **'Long break'**
String get pomodoroLongBreak;
/// No description provided for @pomodoroFocusOf.
///
/// In en, this message translates to:
/// **'Focus {done} of {total}'**
String pomodoroFocusOf(int done, int total);
/// No description provided for @pomodoroStart.
///
/// In en, this message translates to:
/// **'Start'**
String get pomodoroStart;
/// No description provided for @pomodoroPause.
///
/// In en, this message translates to:
/// **'Pause'**
String get pomodoroPause;
/// No description provided for @pomodoroResume.
///
/// In en, this message translates to:
/// **'Resume'**
String get pomodoroResume;
/// No description provided for @pomodoroSkip.
///
/// In en, this message translates to:
/// **'Skip'**
String get pomodoroSkip;
/// No description provided for @pomodoroStop.
///
/// In en, this message translates to:
/// **'Stop'**
String get pomodoroStop;
/// No description provided for @pomodoroPaused.
///
/// In en, this message translates to:
/// **'Paused'**
String get pomodoroPaused;
/// No description provided for @pomodoroPausedProfile.
///
/// In en, this message translates to:
/// **'Paused · {profile}'**
String pomodoroPausedProfile(String profile);
/// No description provided for @pomodoroClassic.
///
/// In en, this message translates to:
/// **'Classic'**
String get pomodoroClassic;
/// No description provided for @pomodoroUnnamed.
///
/// In en, this message translates to:
/// **'Unnamed profile'**
String get pomodoroUnnamed;
/// No description provided for @pomodoroProfiles.
///
/// In en, this message translates to:
/// **'Pomodoro profiles'**
String get pomodoroProfiles;
/// No description provided for @pomodoroChooseProfile.
///
/// In en, this message translates to:
/// **'Choose a profile'**
String get pomodoroChooseProfile;
/// No description provided for @pomodoroAddProfile.
///
/// In en, this message translates to:
/// **'Add a profile'**
String get pomodoroAddProfile;
/// No description provided for @pomodoroEditProfile.
///
/// In en, this message translates to:
/// **'Edit profile'**
String get pomodoroEditProfile;
/// No description provided for @pomodoroName.
///
/// In en, this message translates to:
/// **'Name'**
String get pomodoroName;
/// No description provided for @pomodoroFocusLength.
///
/// In en, this message translates to:
/// **'Focus'**
String get pomodoroFocusLength;
/// No description provided for @pomodoroShortBreakLength.
///
/// In en, this message translates to:
/// **'Short break'**
String get pomodoroShortBreakLength;
/// No description provided for @pomodoroLongBreakLength.
///
/// In en, this message translates to:
/// **'Long break'**
String get pomodoroLongBreakLength;
/// No description provided for @pomodoroMinutes.
///
/// In en, this message translates to:
/// **'{count} min'**
String pomodoroMinutes(int count);
/// No description provided for @pomodoroNoLongBreak.
///
/// In en, this message translates to:
/// **'None'**
String get pomodoroNoLongBreak;
/// No description provided for @pomodoroLongBreakAfter.
///
/// In en, this message translates to:
/// **'Focus phases before a long break'**
String get pomodoroLongBreakAfter;
/// No description provided for @pomodoroAutoStartBreaks.
///
/// In en, this message translates to:
/// **'Start breaks by themselves'**
String get pomodoroAutoStartBreaks;
/// No description provided for @pomodoroAutoStartFocus.
///
/// In en, this message translates to:
/// **'Start focus by itself after a break'**
String get pomodoroAutoStartFocus;
/// No description provided for @pomodoroDoNotDisturb.
///
/// In en, this message translates to:
/// **'Do Not Disturb while focusing'**
String get pomodoroDoNotDisturb;
/// No description provided for @pomodoroDoNotDisturbHint.
///
/// In en, this message translates to:
/// **'The device keeps quiet while you focus; the alert at its end still sounds.'**
String get pomodoroDoNotDisturbHint;
/// No description provided for @pomodoroDoNotDisturbDenied.
///
/// In en, this message translates to:
/// **'The app may not keep this device quiet. Allow it in the system\'s settings.'**
String get pomodoroDoNotDisturbDenied;
/// No description provided for @pomodoroDeleteProfile.
///
/// In en, this message translates to:
/// **'Delete profile'**
String get pomodoroDeleteProfile;
/// No description provided for @pomodoroSummary.
///
/// In en, this message translates to:
/// **'{focus} min focus, {shortBreak} min break'**
String pomodoroSummary(int focus, int shortBreak);
/// No description provided for @pomodoroSummaryLong.
///
/// In en, this message translates to:
/// **'{focus} min focus, {shortBreak} min break, {longBreak} min after {after}'**
String pomodoroSummaryLong(
int focus,
int shortBreak,
int longBreak,
int after,
);
/// No description provided for @pomodoroAlertFocusDone.
///
/// In en, this message translates to:
/// **'Time for a break'**
String get pomodoroAlertFocusDone;
/// No description provided for @pomodoroAlertBreakDone.
///
/// In en, this message translates to:
/// **'Back to focus'**
String get pomodoroAlertBreakDone;
/// No description provided for @pomodoroAlertStarts.
///
/// In en, this message translates to:
/// **'{phase} has started.'**
String pomodoroAlertStarts(String phase);
/// No description provided for @pomodoroAlertWaits.
///
/// In en, this message translates to:
/// **'{phase} is ready when you are.'**
String pomodoroAlertWaits(String phase);
/// No description provided for @homeWidgetPomodoro.
///
/// In en, this message translates to:
/// **'Pomodoro timer'**
String get homeWidgetPomodoro;
/// No description provided for @pomodoroAlerts.
///
/// In en, this message translates to:
/// **'Pomodoro alerts'**
String get pomodoroAlerts;
/// No description provided for @pomodoroUntil.
///
/// In en, this message translates to:
/// **'Until {time}'**
String pomodoroUntil(String time);
/// No description provided for @pomodoroLeft.
///
/// In en, this message translates to:
/// **'{left} left'**
String pomodoroLeft(String left);
/// No description provided for @pathImportAtStep.
///
/// In en, this message translates to:
/// **'Step {step}: {problem}'**
String pathImportAtStep(int step, String problem);
/// No description provided for @pathImportNotJson.
///
/// In en, this message translates to:
/// **'This is no JSON: {detail}'**
String pathImportNotJson(String detail);
/// No description provided for @pathImportNoPath.
///
/// In en, this message translates to:
/// **'a \"path\" object is missing.'**
String get pathImportNoPath;
/// No description provided for @pathImportNoTitle.
///
/// In en, this message translates to:
/// **'the path has no \"title\".'**
String get pathImportNoTitle;
/// No description provided for @pathImportDescriptionNotText.
///
/// In en, this message translates to:
/// **'the path\'s \"description\" is no text.'**
String get pathImportDescriptionNotText;
/// No description provided for @pathImportNotAnObject.
///
/// In en, this message translates to:
/// **'no object.'**
String get pathImportNotAnObject;
/// No description provided for @pathImportUnknownStepType.
///
/// In en, this message translates to:
/// **'unknown \"type\": {detail}.'**
String pathImportUnknownStepType(String detail);
/// No description provided for @pathImportRightOptionMissing.
///
/// In en, this message translates to:
/// **'its right option {detail} is not among its options.'**
String pathImportRightOptionMissing(String detail);
/// No description provided for @pathImportRightOptionsMissing.
///
/// In en, this message translates to:
/// **'it names a right option that is not among its options.'**
String get pathImportRightOptionsMissing;
/// No description provided for @pathImportNoPairing.
///
/// In en, this message translates to:
/// **'no \"correct_pairing\".'**
String get pathImportNoPairing;
/// No description provided for @pathImportPairingTargetMissing.
///
/// In en, this message translates to:
/// **'it pairs items with a target that isn\'t there: {detail}.'**
String pathImportPairingTargetMissing(String detail);
/// No description provided for @pathImportPairingIncomplete.
///
/// In en, this message translates to:
/// **'every item must be paired with one target.'**
String get pathImportPairingIncomplete;
/// No description provided for @pathImportNoPassage.
///
/// In en, this message translates to:
/// **'no \"passage\".'**
String get pathImportNoPassage;
/// No description provided for @pathImportBlanksMismatch.
///
/// In en, this message translates to:
/// **'it needs one word in \"blanks\" for each ___ in its passage.'**
String get pathImportBlanksMismatch;
/// No description provided for @pathImportBlockWithoutType.
///
/// In en, this message translates to:
/// **'a block without \"type\".'**
String get pathImportBlockWithoutType;
/// No description provided for @pathImportMalformedLevel.
///
/// In en, this message translates to:
/// **'a heading with a malformed level.'**
String get pathImportMalformedLevel;
/// No description provided for @pathImportMalformedListItem.
///
/// In en, this message translates to:
/// **'a malformed list item.'**
String get pathImportMalformedListItem;
/// No description provided for @pathImportMalformedMath.
///
/// In en, this message translates to:
/// **'a malformed math block.'**
String get pathImportMalformedMath;
/// No description provided for @pathImportMalformedCode.
///
/// In en, this message translates to:
/// **'a malformed code block.'**
String get pathImportMalformedCode;
/// No description provided for @pathImportUnknownBlock.
///
/// In en, this message translates to:
/// **'an unknown block: {detail}.'**
String pathImportUnknownBlock(String detail);
/// No description provided for @pathImportTextlessBlock.
///
/// In en, this message translates to:
/// **'a {detail} without \"text\" or \"runs\".'**
String pathImportTextlessBlock(String detail);
/// No description provided for @pathImportMalformedRun.
///
/// In en, this message translates to:
/// **'a malformed run of text.'**
String get pathImportMalformedRun;
/// No description provided for @pathImportListExpected.
///
/// In en, this message translates to:
/// **'a list was expected.'**
String get pathImportListExpected;
/// No description provided for @pathImportNotText.
///
/// In en, this message translates to:
/// **'\"{detail}\" must be text.'**
String pathImportNotText(String detail);
/// No description provided for @pathImportTooFew.
///
/// In en, this message translates to:
/// **'it needs at least two \"{detail}\".'**
String pathImportTooFew(String detail);
/// No description provided for @pathImportMalformedNumber.
///
/// In en, this message translates to:
/// **'a malformed number.'**
String get pathImportMalformedNumber;
/// No description provided for @pathImportTitleNotText.
///
/// In en, this message translates to:
/// **'a title must be text.'**
String get pathImportTitleNotText;
/// No description provided for @pathImportMalformedSource.
///
/// In en, this message translates to:
/// **'a source must be an object or text, and its parts text.'**
String get pathImportMalformedSource;
/// No description provided for @pomodoroTopBarHint.
///
/// In en, this message translates to:
/// **'The timer can count down in GNOME\'s top bar, with its buttons, once the AppIndicator extension is on.'**
String get pomodoroTopBarHint;
/// No description provided for @pomodoroTopBarSetUp.
///
/// In en, this message translates to:
/// **'Set up'**
String get pomodoroTopBarSetUp;
/// No description provided for @pomodoroTopBarDismiss.
///
/// In en, this message translates to:
/// **'Don\'t suggest again'**
String get pomodoroTopBarDismiss;
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
}
class _AppLocalizationsDelegate
extends LocalizationsDelegate<AppLocalizations> {
const _AppLocalizationsDelegate();
@override
Future<AppLocalizations> load(Locale locale) {
return SynchronousFuture<AppLocalizations>(lookupAppLocalizations(locale));
}
@override
bool isSupported(Locale locale) =>
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
<String>['de', 'en'].contains(locale.languageCode);
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
@override
bool shouldReload(_AppLocalizationsDelegate old) => false;
}
AppLocalizations lookupAppLocalizations(Locale locale) {
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
// Lookup logic when language+country codes are specified.
switch (locale.languageCode) {
case 'en':
{
switch (locale.countryCode) {
case 'GB':
return AppLocalizationsEnGb();
case 'US':
return AppLocalizationsEnUs();
}
break;
}
}
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
// Lookup logic when only language code is specified.
switch (locale.languageCode) {
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
case 'de':
return AppLocalizationsDe();
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
case 'en':
return AppLocalizationsEn();
}
throw FlutterError(
'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely '
'an issue with the localizations generation tool. Please file an issue '
'on GitHub with a reproducible sample app and the gen-l10n configuration '
'that was used.',
);
}