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
// ignore: unused_import
import ' package:intl/intl.dart ' as intl ;
import ' app_localizations.dart ' ;
// ignore_for_file: type=lint
/// The translations for German (`de`).
class AppLocalizationsDe extends AppLocalizations {
AppLocalizationsDe ( [ String locale = ' de ' ] ) : super ( locale ) ;
@ override
String get appTitle = > ' Halkyon Learn ' ;
@ override
String get shellTabHome = > ' Startseite ' ;
@ override
String get shellTabLibrary = > ' Bibliothek ' ;
@ override
String get shellTabExplore = > ' Entdecken ' ;
@ override
String get shellTabProfile = > ' Profil ' ;
@ override
String get homeTitle = > ' Startseite ' ;
@ override
String get libraryTitle = > ' Bibliothek ' ;
@ override
String get libraryCreateStudyset = > ' Lernset erstellen ' ;
@ override
String get libraryEmpty = > ' Noch keine Lernsets ' ;
@ override
String get libraryUnreadable = >
' Deine Lernsets konnten nicht gelesen werden. ' ;
@ override
String get libraryArchivedSection = > ' Archiviert ' ;
@ override
String get librarySearchTooltip = > ' Suchen ' ;
@ override
String get librarySearchHint = > ' Lernsets durchsuchen ' ;
@ override
String get librarySearchClearTooltip = > ' Suche löschen ' ;
@ override
String get librarySearchCloseTooltip = > ' Suche schließen ' ;
@ override
String get librarySearchNoMatches = >
' Keine Lernsets für deine Suche gefunden ' ;
@ override
String get libraryStudysetArchived = > ' Lernset archiviert ' ;
@ override
String get libraryStudysetUnarchived = > ' Lernset aus dem Archiv geholt ' ;
@ override
String get libraryStudysetDeleted = > ' Lernset gelöscht ' ;
@ override
String get libraryDeleteTitle = > ' Lernset löschen? ' ;
@ override
String get libraryDeleteMessage = >
' Es wird samt allem, was darin ist, und allen zugehörigen Karten auf all deinen Geräten gelöscht. Du kannst dies für einige Sekunden rückgängig machen. ' ;
@ override
String get libraryDeleteConfirm = > ' Löschen ' ;
@ override
String get studysetSheetCreateTitle = > ' Lernset erstellen ' ;
@ override
String get studysetSheetEditTitle = > ' Lernset bearbeiten ' ;
@ override
String get studysetSheetCreate = > ' Erstellen ' ;
@ override
String get studysetSheetSave = > ' Speichern ' ;
@ override
String get studysetSheetTitleLabel = > ' Titel ' ;
@ override
String get studysetSheetSecondaryLabel = > ' Zweittitel ' ;
@ override
String get studysetSheetSecondaryHelper = >
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
' Wird als kleines Label über dem Titel auf Karten und im Kopf des Lernsets angezeigt. Pfade nutzen es, um Stufen zu kennzeichnen (Challenge, Meilenstein, Lektion). ' ;
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
@ override
String get studysetSheetColor = > ' Farbe ' ;
@ override
String get studysetSheetDiscardTitle = > ' Änderungen verwerfen? ' ;
@ override
String get studysetSheetDiscardMessage = >
' Du hast ungespeicherte Änderungen an diesem Lernset. Verwerfen und das Formular schließen? ' ;
@ override
String get studysetSheetDiscardConfirm = > ' Verwerfen ' ;
@ override
String paletteColorName ( String name ) {
String _temp0 = intl . Intl . selectLogic (
name ,
{
' carrot ' : ' Karotte ' ,
' cerise ' : ' Kirschrot ' ,
' cobalt ' : ' Kobalt ' ,
' copper ' : ' Kupfer ' ,
' enzian ' : ' Enzian ' ,
' fern ' : ' Farn ' ,
' forest ' : ' Wald ' ,
' ocean ' : ' Ozean ' ,
' olive ' : ' Olive ' ,
' pacific ' : ' Pazifik ' ,
' pickle ' : ' Essiggurke ' ,
' pine ' : ' Kiefer ' ,
' pink ' : ' Rosa ' ,
' plum ' : ' Pflaume ' ,
' purple ' : ' Lila ' ,
' reef ' : ' Riff ' ,
' sahara ' : ' Sahara ' ,
' slateblue ' : ' Schieferblau ' ,
' soil ' : ' Erde ' ,
' strawberry ' : ' Erdbeere ' ,
' other ' : ' $ name ' ,
} ,
) ;
return ' $ _temp0 ' ;
}
@ override
String colorPickerLabel ( String color ) {
return ' Farbe: $ color ' ;
}
@ override
String studysetCountFlashcards ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Karteikarten ' ,
one: ' 1 Karteikarte ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String studysetCountNotes ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Notizen ' ,
one: ' 1 Notiz ' ,
) ;
return ' $ _temp0 ' ;
}
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
@ override
String studysetCountFiles ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Dateien ' ,
one: ' 1 Datei ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String get libraryRefresh = > ' Aktualisieren ' ;
2026-10-08 14:47:23 +02:00
@ override
String get libraryImport = > ' Importieren ' ;
@ override
String get libraryImportAnkiHint = >
' Wird ein eigenes Lernset, aus einer .apkg- oder .colpkg-Datei ' ;
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
@ override
String get libraryRetry = > ' Erneut versuchen ' ;
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
@ override
String get studysetNoContent = > ' Noch kein Inhalt ' ;
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
@ override
String get studysetEmpty = > ' Leer ' ;
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
@ override
String get studysetActionReview = > ' Wiederholen ' ;
@ override
String get studysetActionStudy = > ' Lernen ' ;
@ override
String get studysetActionAdd = > ' Inhalt hinzufügen ' ;
@ override
String get studysetArchived = > ' Archiviert ' ;
@ override
String get studysetStar = > ' Mit Stern markieren ' ;
@ override
String get studysetUnstar = > ' Markierung entfernen ' ;
@ override
String get studysetOptions = > ' Optionen ' ;
feat(app): cite sources in APA, MLA or Chicago, and give studysets a bibliography
A source is now shared by learning paths and studysets (core/citation/):
authors as full names, year, title, what it is a part of, publisher,
ISBN, link, and a citation kept as a file brought it. formatCitation
cites it in APA 7, MLA 9 or Chicago 18: it inverts and abbreviates
names itself (particles, suffixes, names written as already cited stay),
sets a work of its own in italics and a part of something apart from
the whole, and writes a missing year as "n.d." in APA and Chicago.
- Settings: a Citations card per device, with a preview and a link to
the style's own guide.
- Studysets: a Bibliography button opens the works cited, to read and,
behind its pencil, to change (studyset schema 4).
- Steps: sources edited through the same sheet, opened from an
"N sources" button in the runner (step schema 2; schema 1 reads on).
- Path import: steps' sources, text kept as written, the old format's
"citation" read as what a source is part of.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 17:07:04 +02:00
@ override
String get studysetBibliography = > ' Literaturverzeichnis ' ;
@ override
String get studysetBibliographyIntro = >
' Die in diesem Lernset zitierten Werke, im Zitierstil aus den Einstellungen. ' ;
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
@ override
String get studysetMenuEdit = > ' Bearbeiten ' ;
@ override
String get studysetMenuArchive = > ' Archivieren ' ;
@ override
String get studysetMenuUnarchive = > ' Aus Archiv holen ' ;
@ override
String get studysetMenuDelete = > ' Löschen ' ;
@ override
String get studysetMenuMove = > ' Verschieben nach… ' ;
@ override
String get studysetTabFlashcards = > ' Karteikarten ' ;
@ override
String get studysetTabNotes = > ' Notizen ' ;
@ override
String get studysetTabPaths = > ' Pfade ' ;
@ override
String get studysetCreatePath = > ' Pfad erstellen ' ;
@ override
String get pathImportMenu = > ' Pfad importieren (JSON) ' ;
@ override
String get pathImportFileType = > ' Lernpfad (JSON) ' ;
@ override
String pathImported ( String title , int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' „ $ title “ mit $ count Schritten importiert. ' ,
one: ' „ $ title “ mit 1 Schritt importiert. ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String pathImportSkipped ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other:
' $ count Blöcke wurden ausgelassen: Bilder und Animationen werden nicht importiert. ' ,
one: ' 1 Block wurde ausgelassen: Bilder und Animationen werden nicht importiert. ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String pathImportFailed ( String reason ) {
return ' Diese Datei konnte nicht importiert werden. $ reason ' ;
}
@ override
String get pathImportUnreadable = > ' Der Inhalt ist kein Text in UTF-8. ' ;
@ override
String get pathsEmpty = > ' Noch keine Pfade ' ;
@ override
String get pathsEmptyHint = >
feat(app): every empty studyset tab says how to add some, as Files did
Paths, flashcards and notes now show what Files showed when empty: an
icon for what the tab holds, "No … yet", and the menus that add some
("Add material → Create a path", "⋮ → Import content", …), through one
shared widget, EmptyListMessage. The icons are those the app uses for
each already: the route, the study screen's card stack, the note pen,
the folder.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 20:24:22 +02:00
' Ein Pfad führt Schritt für Schritt durch eine Lektion. Nutze „Material hinzufügen → Pfad erstellen“, um einen zu schreiben, oder „⋮ → Inhalt importieren“, um einen zu importieren. ' ;
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
@ override
String get pathOptions = > ' Pfadoptionen ' ;
@ override
String get pathEdit = > ' Bearbeiten ' ;
@ override
String get pathResetProgress = > ' Fortschritt zurücksetzen ' ;
@ override
String get pathProgressReset = > ' Fortschritt zurückgesetzt ' ;
2026-10-08 11:52:14 +02:00
@ override
String get pathResetTitle = > ' Fortschritt zurücksetzen? ' ;
@ override
String get pathResetMessage = >
' Dein gesamter Fortschritt in diesem Pfad wird gelöscht. Du kannst das einige Sekunden lang rückgängig machen. ' ;
@ override
String get pathResetConfirm = > ' Zurücksetzen ' ;
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
@ override
String get pathDelete = > ' Löschen ' ;
@ override
String get pathDeleteTitle = > ' Pfad löschen? ' ;
@ override
String get pathDeleteMessage = >
' Dieser Pfad und seine Schritte werden aus dem Lernset entfernt. Du kannst dies für einige Sekunden rückgängig machen. ' ;
@ override
String get pathDeleteConfirm = > ' Löschen ' ;
@ override
String get pathDeleted = > ' Pfad gelöscht ' ;
@ override
String get pathCreateTitle = > ' Neuer Pfad ' ;
@ override
String get pathCreate = > ' Erstellen ' ;
@ override
String get pathTitleLabel = > ' Titel ' ;
@ override
String get pathTitleRequired = > ' Ein Pfad braucht einen Titel. ' ;
@ override
String get pathSecondaryTitleLabel = > ' Zweittitel ' ;
@ override
String get pathSecondaryTitleHint = >
' Z. B. der Titel in der Sprache, die du lernst ' ;
@ override
String get pathEditTitle = > ' Pfad bearbeiten ' ;
@ override
String get pathDescription = > ' Beschreibung ' ;
@ override
String get pathAddDescription = > ' Beschreibung hinzufügen ' ;
@ override
String get pathDescriptionEditTitle = > ' Pfadbeschreibung ' ;
@ override
String get pathAddTags = > ' Tags hinzufügen ' ;
@ override
String get pathTags = > ' Tags ' ;
2026-10-08 14:33:32 +02:00
@ override
String get pathEditTags = > ' Tags bearbeiten ' ;
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
@ override
String get pathSteps = > ' Schritte ' ;
@ override
String get pathStepsEmpty = > ' Noch keine Schritte ' ;
@ override
String get pathStepsEmptyHint = >
' Wähle einen Schritt-Typ, um mit dem Schreiben der Lektion zu beginnen. ' ;
@ override
String get pathAddStep = > ' Schritt hinzufügen ' ;
@ override
String get pathReorder = > ' Umsortieren ' ;
@ override
String get pathReorderDone = > ' Fertig ' ;
@ override
String get pathStepDelete = > ' Schritt löschen ' ;
@ override
String get pathStepDeleted = > ' Schritt gelöscht ' ;
@ override
String get stepUntitled = > ' Unbenannter Schritt ' ;
@ override
String get stepKindInfo = > ' Info ' ;
@ override
String get stepKindSingleChoice = > ' Einzelauswahl ' ;
@ override
String get stepKindMultipleChoice = > ' Mehrfachauswahl ' ;
@ override
String get stepKindDragAndDrop = > ' Ziehen und Ablegen ' ;
@ override
String get stepKindFillInTheBlank = > ' Lückentext ' ;
@ override
String get stepEditTitle = > ' Schritt bearbeiten ' ;
@ override
String get stepTitleHint = > ' Titel ' ;
@ override
String get stepOptions = > ' Optionen ' ;
@ override
String stepOptionHint ( int number ) {
return ' Option $ number ' ;
}
@ override
String get stepAddOption = > ' Option hinzufügen ' ;
@ override
String get stepRemoveOption = > ' Option entfernen ' ;
@ override
String get stepCorrectOption = > ' Richtige Option ' ;
@ override
String get stepCorrectOptions = > ' Richtige Optionen ' ;
@ override
String get stepCategories = > ' Kategorien ' ;
@ override
String stepCategoryHint ( int number ) {
return ' Kategorie $ number ' ;
}
@ override
String get stepAddCategory = > ' Kategorie hinzufügen ' ;
@ override
String get stepRemoveCategory = > ' Kategorie entfernen ' ;
@ override
String get stepItems = > ' Elemente ' ;
@ override
String stepItemHint ( int number ) {
return ' Element $ number ' ;
}
@ override
String get stepAddItem = > ' Element hinzufügen ' ;
@ override
String get stepRemoveItem = > ' Element entfernen ' ;
@ override
String get stepItemCategory = > ' Gehört zu ' ;
@ override
String get stepPassage = > ' Textpassage ' ;
@ override
String get stepPassageHint = >
' Gib ___ (drei Unterstriche) überall dort ein, wo ein Wort eingesetzt werden soll. ' ;
@ override
String stepBlankHint ( int number ) {
return ' Wort für Lücke $ number ' ;
}
@ override
String get stepIncomplete = >
' Noch nicht beantwortbar: Fülle jedes Feld aus und wähle, was richtig ist. ' ;
@ override
String get stepFeedbackRight = > ' Feedback nach einer richtigen Antwort ' ;
@ override
String get stepFeedbackWrong = > ' Feedback nach einer falschen Antwort ' ;
@ override
String get stepFeedbackNone = > ' Keines ' ;
@ override
feat(app): cite sources in APA, MLA or Chicago, and give studysets a bibliography
A source is now shared by learning paths and studysets (core/citation/):
authors as full names, year, title, what it is a part of, publisher,
ISBN, link, and a citation kept as a file brought it. formatCitation
cites it in APA 7, MLA 9 or Chicago 18: it inverts and abbreviates
names itself (particles, suffixes, names written as already cited stay),
sets a work of its own in italics and a part of something apart from
the whole, and writes a missing year as "n.d." in APA and Chicago.
- Settings: a Citations card per device, with a preview and a link to
the style's own guide.
- Studysets: a Bibliography button opens the works cited, to read and,
behind its pencil, to change (studyset schema 4).
- Steps: sources edited through the same sheet, opened from an
"N sources" button in the runner (step schema 2; schema 1 reads on).
- Path import: steps' sources, text kept as written, the old format's
"citation" read as what a source is part of.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 17:07:04 +02:00
String get sources = > ' Quellen ' ;
@ override
String sourcesCount ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Quellen ' ,
one: ' 1 Quelle ' ,
) ;
return ' $ _temp0 ' ;
}
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
@ override
feat(app): cite sources in APA, MLA or Chicago, and give studysets a bibliography
A source is now shared by learning paths and studysets (core/citation/):
authors as full names, year, title, what it is a part of, publisher,
ISBN, link, and a citation kept as a file brought it. formatCitation
cites it in APA 7, MLA 9 or Chicago 18: it inverts and abbreviates
names itself (particles, suffixes, names written as already cited stay),
sets a work of its own in italics and a part of something apart from
the whole, and writes a missing year as "n.d." in APA and Chicago.
- Settings: a Citations card per device, with a preview and a link to
the style's own guide.
- Studysets: a Bibliography button opens the works cited, to read and,
behind its pencil, to change (studyset schema 4).
- Steps: sources edited through the same sheet, opened from an
"N sources" button in the runner (step schema 2; schema 1 reads on).
- Path import: steps' sources, text kept as written, the old format's
"citation" read as what a source is part of.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 17:07:04 +02:00
String get sourcesNone = > ' Noch keine Quellen angegeben. ' ;
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
@ override
feat(app): cite sources in APA, MLA or Chicago, and give studysets a bibliography
A source is now shared by learning paths and studysets (core/citation/):
authors as full names, year, title, what it is a part of, publisher,
ISBN, link, and a citation kept as a file brought it. formatCitation
cites it in APA 7, MLA 9 or Chicago 18: it inverts and abbreviates
names itself (particles, suffixes, names written as already cited stay),
sets a work of its own in italics and a part of something apart from
the whole, and writes a missing year as "n.d." in APA and Chicago.
- Settings: a Citations card per device, with a preview and a link to
the style's own guide.
- Studysets: a Bibliography button opens the works cited, to read and,
behind its pencil, to change (studyset schema 4).
- Steps: sources edited through the same sheet, opened from an
"N sources" button in the runner (step schema 2; schema 1 reads on).
- Path import: steps' sources, text kept as written, the old format's
"citation" read as what a source is part of.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 17:07:04 +02:00
String get sourcesEdit = > ' Quellen bearbeiten ' ;
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
@ override
feat(app): cite sources in APA, MLA or Chicago, and give studysets a bibliography
A source is now shared by learning paths and studysets (core/citation/):
authors as full names, year, title, what it is a part of, publisher,
ISBN, link, and a citation kept as a file brought it. formatCitation
cites it in APA 7, MLA 9 or Chicago 18: it inverts and abbreviates
names itself (particles, suffixes, names written as already cited stay),
sets a work of its own in italics and a part of something apart from
the whole, and writes a missing year as "n.d." in APA and Chicago.
- Settings: a Citations card per device, with a preview and a link to
the style's own guide.
- Studysets: a Bibliography button opens the works cited, to read and,
behind its pencil, to change (studyset schema 4).
- Steps: sources edited through the same sheet, opened from an
"N sources" button in the runner (step schema 2; schema 1 reads on).
- Path import: steps' sources, text kept as written, the old format's
"citation" read as what a source is part of.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 17:07:04 +02:00
String get sourcesEditDone = > ' Bearbeiten beenden ' ;
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
@ override
feat(app): cite sources in APA, MLA or Chicago, and give studysets a bibliography
A source is now shared by learning paths and studysets (core/citation/):
authors as full names, year, title, what it is a part of, publisher,
ISBN, link, and a citation kept as a file brought it. formatCitation
cites it in APA 7, MLA 9 or Chicago 18: it inverts and abbreviates
names itself (particles, suffixes, names written as already cited stay),
sets a work of its own in italics and a part of something apart from
the whole, and writes a missing year as "n.d." in APA and Chicago.
- Settings: a Citations card per device, with a preview and a link to
the style's own guide.
- Studysets: a Bibliography button opens the works cited, to read and,
behind its pencil, to change (studyset schema 4).
- Steps: sources edited through the same sheet, opened from an
"N sources" button in the runner (step schema 2; schema 1 reads on).
- Path import: steps' sources, text kept as written, the old format's
"citation" read as what a source is part of.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 17:07:04 +02:00
String get sourceAdd = > ' Quelle hinzufügen ' ;
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
@ override
feat(app): cite sources in APA, MLA or Chicago, and give studysets a bibliography
A source is now shared by learning paths and studysets (core/citation/):
authors as full names, year, title, what it is a part of, publisher,
ISBN, link, and a citation kept as a file brought it. formatCitation
cites it in APA 7, MLA 9 or Chicago 18: it inverts and abbreviates
names itself (particles, suffixes, names written as already cited stay),
sets a work of its own in italics and a part of something apart from
the whole, and writes a missing year as "n.d." in APA and Chicago.
- Settings: a Citations card per device, with a preview and a link to
the style's own guide.
- Studysets: a Bibliography button opens the works cited, to read and,
behind its pencil, to change (studyset schema 4).
- Steps: sources edited through the same sheet, opened from an
"N sources" button in the runner (step schema 2; schema 1 reads on).
- Path import: steps' sources, text kept as written, the old format's
"citation" read as what a source is part of.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 17:07:04 +02:00
String get sourceEdit = > ' Quelle bearbeiten ' ;
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
@ override
feat(app): cite sources in APA, MLA or Chicago, and give studysets a bibliography
A source is now shared by learning paths and studysets (core/citation/):
authors as full names, year, title, what it is a part of, publisher,
ISBN, link, and a citation kept as a file brought it. formatCitation
cites it in APA 7, MLA 9 or Chicago 18: it inverts and abbreviates
names itself (particles, suffixes, names written as already cited stay),
sets a work of its own in italics and a part of something apart from
the whole, and writes a missing year as "n.d." in APA and Chicago.
- Settings: a Citations card per device, with a preview and a link to
the style's own guide.
- Studysets: a Bibliography button opens the works cited, to read and,
behind its pencil, to change (studyset schema 4).
- Steps: sources edited through the same sheet, opened from an
"N sources" button in the runner (step schema 2; schema 1 reads on).
- Path import: steps' sources, text kept as written, the old format's
"citation" read as what a source is part of.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 17:07:04 +02:00
String get sourceRemove = > ' Quelle entfernen ' ;
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
@ override
feat(app): cite sources in APA, MLA or Chicago, and give studysets a bibliography
A source is now shared by learning paths and studysets (core/citation/):
authors as full names, year, title, what it is a part of, publisher,
ISBN, link, and a citation kept as a file brought it. formatCitation
cites it in APA 7, MLA 9 or Chicago 18: it inverts and abbreviates
names itself (particles, suffixes, names written as already cited stay),
sets a work of its own in italics and a part of something apart from
the whole, and writes a missing year as "n.d." in APA and Chicago.
- Settings: a Citations card per device, with a preview and a link to
the style's own guide.
- Studysets: a Bibliography button opens the works cited, to read and,
behind its pencil, to change (studyset schema 4).
- Steps: sources edited through the same sheet, opened from an
"N sources" button in the runner (step schema 2; schema 1 reads on).
- Path import: steps' sources, text kept as written, the old format's
"citation" read as what a source is part of.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 17:07:04 +02:00
String get sourceRemoved = > ' Quelle entfernt ' ;
@ override
String get sourceSheetAdd = > ' Hinzufügen ' ;
@ override
String get sourceAuthors = > ' Autoren ' ;
@ override
String get sourceAuthorsHint = >
' Vollständige Namen, einer pro Zeile, z. B. Mark A. McDaniel ' ;
@ override
String get sourceYear = > ' Jahr ' ;
@ override
String get sourceYearHint = > ' z. B. 2014 ' ;
@ override
String get sourceTitle = > ' Titel ' ;
@ override
String get sourceTitleHint = > ' Titel des Werks ' ;
@ override
String get sourceContainer = > ' Erschienen in ' ;
@ override
String get sourceContainerHint = >
' Zeitschrift, Buch oder Website, mit Seiten ' ;
@ override
String get sourceContainerHelper = >
' Leer lassen bei einem eigenständigen Werk wie einem Buch. ' ;
@ override
String get sourcePublisher = > ' Verlag ' ;
@ override
String get sourcePublisherHint = > ' z. B. Belknap Press ' ;
@ override
String get sourceIsbn = > ' ISBN ' ;
@ override
String get sourceIsbnHint = > ' z. B. 978-0-674-72901-8 ' ;
@ override
String get sourceUrl = > ' Link ' ;
@ override
String get sourceUrlHint = > ' https://… ' ;
@ override
String sourceImportedAs ( String citation ) {
return ' Importiert als: $ citation ' ;
}
@ override
String sourceIsbnLine ( String isbn ) {
return ' ISBN: $ isbn ' ;
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
}
feat(app): cite sources in APA, MLA or Chicago, and give studysets a bibliography
A source is now shared by learning paths and studysets (core/citation/):
authors as full names, year, title, what it is a part of, publisher,
ISBN, link, and a citation kept as a file brought it. formatCitation
cites it in APA 7, MLA 9 or Chicago 18: it inverts and abbreviates
names itself (particles, suffixes, names written as already cited stay),
sets a work of its own in italics and a part of something apart from
the whole, and writes a missing year as "n.d." in APA and Chicago.
- Settings: a Citations card per device, with a preview and a link to
the style's own guide.
- Studysets: a Bibliography button opens the works cited, to read and,
behind its pencil, to change (studyset schema 4).
- Steps: sources edited through the same sheet, opened from an
"N sources" button in the runner (step schema 2; schema 1 reads on).
- Path import: steps' sources, text kept as written, the old format's
"citation" read as what a source is part of.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 17:07:04 +02:00
@ override
String get sourceAvailableAt = > ' Verfügbar unter: ' ;
@ override
String get sourceEmpty = > ' Leere Quellenangabe ' ;
@ override
String get sourceDiscardTitle = > ' Änderungen verwerfen? ' ;
@ override
String get sourceDiscardMessage = >
' Was du für diese Quelle eingegeben hast, geht verloren. ' ;
@ override
String get sourceDiscardConfirm = > ' Verwerfen ' ;
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
@ override
String get stepConflict = >
' Dieser Schritt wurde auf einem anderen Gerät anders geändert. Behalte eine Version, um weiterzuschreiben. ' ;
@ override
String get stepFieldTitle = > ' Titel ' ;
@ override
String get stepFieldBody = > ' Text ' ;
@ override
String get stepFieldExercise = > ' Aufgabe ' ;
@ override
String get stepFieldRightFeedback = > ' Feedback nach einer richtigen Antwort ' ;
@ override
String get stepFieldWrongFeedback = > ' Feedback nach einer falschen Antwort ' ;
@ override
String get stepFieldSources = > ' Quellen ' ;
@ override
String get runnerClose = > ' Schließen ' ;
@ override
String get runnerEditStep = > ' Schritt bearbeiten ' ;
@ override
String get runnerBack = > ' Zurück ' ;
@ override
String get runnerCheck = > ' Antworten prüfen ' ;
@ override
String get runnerContinue = > ' Weiter ' ;
@ override
String get runnerFinish = > ' Abschließen ' ;
@ override
String get runnerRight = > ' Richtig! ' ;
@ override
String get runnerWrong = > ' Nicht ganz ' ;
@ override
String get runnerAlreadyRight = > ' Du hast das schon richtig beantwortet. ' ;
@ override
String get runnerSelectAll = > ' Wähle alle zutreffenden aus. ' ;
@ override
String get runnerDragHint = >
' Ziehe jedes Element in die Kategorie, zu der es gehört, oder tippe es an und dann die Kategorie. Tippe ein platziertes Element an, um es zurückzunehmen. ' ;
@ override
String get runnerBlankHint = >
' Ziehe ein Wort in jede Lücke oder tippe es an und dann die Lücke. Tippe ein platziertes Wort an, um es zurückzunehmen. ' ;
@ override
String get runnerEmpty = > ' Dieser Pfad hat noch keine Schritte. ' ;
@ override
String get runnerFinished = > ' Du hast diesen Pfad abgeschlossen ' ;
@ override
String runnerFinishedSteps ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Schritte abgeschlossen. ' ,
one: ' 1 Schritt abgeschlossen. ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String get runnerNextPath = > ' Weiter zum nächsten Pfad ' ;
@ override
String get runnerBackToStudyset = > ' Zurück zum Lernset ' ;
@ override
String studysetCountPaths ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Pfade ' ,
one: ' 1 Pfad ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String get studysetCreateNote = > ' Notiz erstellen ' ;
@ override
String get notesEmpty = > ' Noch keine Notizen ' ;
@ override
String get notesEmptyHint = >
feat(app): every empty studyset tab says how to add some, as Files did
Paths, flashcards and notes now show what Files showed when empty: an
icon for what the tab holds, "No … yet", and the menus that add some
("Add material → Create a path", "⋮ → Import content", …), through one
shared widget, EmptyListMessage. The icons are those the app uses for
each already: the route, the study screen's card stack, the note pen,
the folder.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 20:24:22 +02:00
' Nutze „Material hinzufügen → Notiz erstellen“, um eine zu schreiben. ' ;
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
@ override
String get noteUntitled = > ' Unbenannte Notiz ' ;
@ override
String noteEdited ( String when ) {
return ' Bearbeitet $ when ' ;
}
@ override
String get timeJustNow = > ' gerade eben ' ;
@ override
String timeMinutesAgo ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' vor $ count Minuten ' ,
one: ' vor 1 Minute ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String timeHoursAgo ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' vor $ count Stunden ' ,
one: ' vor 1 Stunde ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String timeDaysAgo ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' vor $ count Tagen ' ,
one: ' gestern ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String get noteOptions = > ' Notizoptionen ' ;
@ override
String get noteEdit = > ' Bearbeiten ' ;
@ override
String get noteDelete = > ' Löschen ' ;
@ override
String get noteDeleteTitle = > ' Notiz löschen? ' ;
@ override
String get noteDeleteMessage = >
' Diese Notiz wird aus dem Lernset entfernt. Du kannst dies für einige Sekunden rückgängig machen. ' ;
@ override
String get noteDeleteConfirm = > ' Löschen ' ;
@ override
String get noteDeleted = > ' Notiz gelöscht ' ;
@ override
String get noteTitleHint = > ' Titel ' ;
@ override
String get noteEditing = > ' Wird bearbeitet… ' ;
@ override
String get noteSaving = > ' Wird gespeichert… ' ;
@ override
String get noteSaved = > ' Gespeichert ' ;
@ override
String get noteSaveFailed = > ' Speichern fehlgeschlagen ' ;
@ override
String get noteConflict = >
' Diese Notiz wurde auf einem anderen Gerät anders geändert. Behalte eine Version, um weiterzuschreiben. ' ;
@ override
String get noteFieldTitle = > ' Titel ' ;
@ override
String get noteFieldBody = > ' Text ' ;
@ override
String get noteKeepThis = > ' Diese behalten ' ;
@ override
String get noteAddTags = > ' Tags hinzufügen ' ;
@ override
2026-10-08 14:30:30 +02:00
String get noteEditTags = > ' Tags bearbeiten ' ;
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
@ override
String get studysetFlashcardsEmpty = > ' Noch keine Karteikarten ' ;
@ override
String get studysetFlashcardsEmptyHint = >
feat(app): every empty studyset tab says how to add some, as Files did
Paths, flashcards and notes now show what Files showed when empty: an
icon for what the tab holds, "No … yet", and the menus that add some
("Add material → Create a path", "⋮ → Import content", …), through one
shared widget, EmptyListMessage. The icons are those the app uses for
each already: the route, the study screen's card stack, the note pen,
the folder.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 20:24:22 +02:00
' Nutze „Material hinzufügen → Karteikarten erstellen“, um welche zu schreiben, oder „⋮ → Inhalt importieren“ für ein Anki-Deck oder eine Liste. ' ;
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
@ override
String get studysetAddMaterial = > ' Material hinzufügen ' ;
@ override
String get studysetCreateFlashcards = > ' Karteikarten erstellen ' ;
@ override
String get studysetStudy = > ' Lernen ' ;
@ override
String studysetLearnCount ( int count ) {
return ' $ count lernen ' ;
}
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
@ override
String studysetLearnFlashcards ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Karteikarten lernen ' ,
one: ' 1 Karteikarte lernen ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String get studysetNothingToStudy = > ' Noch nichts zu lernen ' ;
@ override
String get studysetStudyMode = > ' Lernmodus ' ;
@ override
String studysetStartPath ( String title ) {
return ' Starten: $ title ' ;
}
@ override
String studysetContinuePath ( String title ) {
return ' Fortsetzen: $ title ' ;
}
@ override
String get studysetStartPathHint = >
' Beginne mit dem ersten Schritt dieses Pfads. ' ;
@ override
String get studysetContinuePathHint = >
' Mach beim nächsten Pfadschritt weiter, wo du aufgehört hast. ' ;
@ override
String get studysetSpacedRepetition = > ' Verteilte Wiederholung ' ;
@ override
String get studysetSpacedRepetitionHint = >
' Wiederhole die fälligen Karten, geplant durch FSRS. ' ;
@ override
String get studysetImportContent = > ' Inhalt importieren ' ;
feat(app): export a studyset as Markdown
Export content, in the studyset's options, writes the studyset and
everything inside it as one readable Markdown document (decided
2026-10-08: no re-importable archive before the public tier's release
files): its title, secondary title, description and licence, then its
flashcards (answers below their questions, choices as task lists),
notes, learning paths (steps with their kinds, answers, feedback and
sources), PDFs and bibliography, then each sub-studyset a level deeper.
Rich text keeps its formatting; formulas go between dollars, callouts
become quotes, spoilers HTML details, YouTube videos links. With files
(images, sounds, PDFs) it keeps a .zip of the document and them under
files/; a file this device can't have is named and counted.
Saving goes through a FileSaver: file_selector's dialog on the desktop,
file_picker's (Android's Storage Access Framework) on phones, a direct
dependency now at the version the editor already brings.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 15:02:22 +02:00
@ override
String get studysetMenuExport = > ' Inhalt exportieren ' ;
@ override
String get exportRunning = > ' Wird exportiert … ' ;
@ override
String get exportedMarkdown = > ' Als Markdown exportiert. ' ;
@ override
String exportedZip ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' Als Markdown mit $ count Dateien exportiert (.zip). ' ,
one: ' Als Markdown mit 1 Datei exportiert (.zip). ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String exportMissingFiles ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Dateien waren nicht auf diesem Gerät und fehlen. ' ,
one: ' 1 Datei war nicht auf diesem Gerät und fehlt. ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String get exportFailed = > ' Das Lernset konnte nicht exportiert werden. ' ;
@ override
String get exportQuestion = > ' F ' ;
@ override
String get exportAnswer = > ' A ' ;
@ override
String get exportHint = > ' Hinweis ' ;
@ override
String get exportIfRight = > ' Wenn richtig ' ;
@ override
String get exportIfWrong = > ' Wenn falsch ' ;
@ override
String get exportSound = > ' Ton ' ;
@ override
String get exportVideo = > ' YouTube-Video ' ;
@ override
String get exportSpoiler = > ' Spoiler ' ;
@ override
String get exportUnavailable = > ' nicht auf diesem Gerät verfügbar ' ;
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
@ override
String get studysetImportPath = > ' Lernpfad ' ;
@ override
String get studysetImportPathHint = > ' Aus einer Halkyon-Pfad-JSON-Datei ' ;
@ override
String get studysetImportAnki = > ' Anki-Deck ' ;
@ override
String get studysetImportAnkiHint = > ' Aus einer .apkg- oder .colpkg-Datei ' ;
2026-10-08 14:43:49 +02:00
@ override
String get studysetImportCards = > ' Karteikarten ' ;
@ override
String get studysetImportCardsHint = >
' Eingefügt oder aus einer CSV- oder TSV-Datei ' ;
@ override
String get cardTextImportTitle = > ' Karteikarten importieren ' ;
@ override
String get cardTextImportDescription = >
fix(app): Reorder among older items, export and text import that hold up
- Reorder: rows from before an order existed all share one position, and
one moved among them landed at their end; the run it goes into now
gets positions of its own (placeAmong), for notes, files, paths,
steps and sub-studysets. Rows whose deletion can still be undone count
for nothing, as the list leaves them out, and a dropped row takes its
place at once instead of snapping back until the order is read again.
- Export: two studysets inside each other (moved so on two devices
offline) no longer make it run forever; links to files whose names
hold #, % or brackets work; PDFs, images and sounds go into the zip
without being compressed again; any error says the export failed.
- Text import: a real CSV reader (quoted fields over several lines, a
back over several quoted fields, a stray quote spoiling only its own
line), the separator guessed from the text (semicolons from German
spreadsheets), and files in UTF-16 or Windows-1252 read as meant.
- A tab whose notes, paths or files couldn't be read says so rather than
"No … yet"; an Anki import from the Library that fails leaves no empty
studyset behind.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-09 13:02:32 +02:00
' Eine Karte pro Zeile: ihre Vorderseite, ein Trennzeichen, dann ihre Rückseite. Jede Zeile wird an ihrem ersten Trennzeichen geteilt; Zeilen ohne eines werden ausgelassen. Ein Feld in doppelten Anführungszeichen, wie Tabellenprogramme sie schreiben, darf Trennzeichen und Zeilenumbrüche enthalten. ' ;
2026-10-08 14:43:49 +02:00
@ override
String get cardTextImportHint = > ' Füge die Karten hier ein ' ;
@ override
String get cardTextImportLoadFile = > ' CSV- oder TSV-Datei laden ' ;
@ override
String get cardTextImportFileType = > ' CSV- oder TSV-Dateien ' ;
@ override
fix(app): Reorder among older items, export and text import that hold up
- Reorder: rows from before an order existed all share one position, and
one moved among them landed at their end; the run it goes into now
gets positions of its own (placeAmong), for notes, files, paths,
steps and sub-studysets. Rows whose deletion can still be undone count
for nothing, as the list leaves them out, and a dropped row takes its
place at once instead of snapping back until the order is read again.
- Export: two studysets inside each other (moved so on two devices
offline) no longer make it run forever; links to files whose names
hold #, % or brackets work; PDFs, images and sounds go into the zip
without being compressed again; any error says the export failed.
- Text import: a real CSV reader (quoted fields over several lines, a
back over several quoted fields, a stray quote spoiling only its own
line), the separator guessed from the text (semicolons from German
spreadsheets), and files in UTF-16 or Windows-1252 read as meant.
- A tab whose notes, paths or files couldn't be read says so rather than
"No … yet"; an Anki import from the Library that fails leaves no empty
studyset behind.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-09 13:02:32 +02:00
String get cardTextImportUnreadable = > ' Diese Datei enthält keinen Text. ' ;
2026-10-08 14:43:49 +02:00
@ override
String get cardTextImportSeparator = > ' Trennzeichen ' ;
@ override
String get cardTextSeparatorTab = > ' Tab ' ;
@ override
String get cardTextSeparatorComma = > ' Komma ' ;
@ override
String get cardTextSeparatorSemicolon = > ' Semikolon ' ;
@ override
String get cardTextImportNone = > ' Noch keine Karten erkannt. ' ;
@ override
String cardTextImportReady ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Karten bereit zum Importieren. ' ,
one: ' 1 Karte bereit zum Importieren. ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String get cardTextImportSubmit = > ' Importieren ' ;
@ override
String cardTextImported ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Karteikarten importiert. ' ,
one: ' 1 Karteikarte importiert. ' ,
) ;
return ' $ _temp0 ' ;
}
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
@ override
String get studysetReorder = > ' Umsortieren ' ;
@ override
String get studysetReorderPaths = > ' Pfade umsortieren ' ;
2026-10-08 18:49:36 +02:00
@ override
String get studysetReorderNotes = > ' Notizen umsortieren ' ;
feat: files in an order of one's own, with Reorder beside the tabs
A PDF now has a position among its studyset's files, as notes and paths
have: a fractional index in a column of its own (so moving it on one
device and renaming it on another don't overwrite each other), last
writer wins. The migration adds it to pdf_source on the server and on
each device with 'a0', so PDFs from before stand in the order they were
added (ties sort by id), and new ones go at the end.
The Files tab lists them in that order by default (Custom order, first
in the Sort menu; newest first was the default before). With two files
or more, Reorder beside the tabs shows the custom order whatever they
were sorted by, a grip in place of each file's options and the Sort menu
put away, until Done.
The next release changes synced tables anyway (card.buriedAt, since
v0.2.2), so older apps have to update for that already.
Also: card.position's doc no longer speaks of moving cards.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 19:28:05 +02:00
@ override
String get studysetReorderFiles = > ' Dateien umsortieren ' ;
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
@ override
String get studysetReorderDone = > ' Fertig ' ;
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
@ override
String get studysetOpenTopics = > ' Themen anzeigen ' ;
@ override
String get studysetTopics = > ' Themen ' ;
@ override
String get studysetAllTopics = > ' Alle Themen ' ;
@ override
String get studysetNewSubStudyset = > ' Neues Unter-Lernset ' ;
@ override
String get studysetSubStudysetsEmpty = > ' Noch keine Unter-Lernsets. ' ;
@ override
String get studysetSubStudysetsEmptyHint = >
' Teile dieses Lernset in Meilensteine oder Lektionen auf. ' ;
@ override
String get studysetDragToReorder = > ' Zum Umsortieren ziehen ' ;
@ override
String get studysetMoveTitle = > ' Lernset verschieben nach ' ;
@ override
String get studysetMoveTopLevel = > ' Oberste Ebene ' ;
@ override
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
String get studysetMoveCurrent = > ' (aktuell) ' ;
@ override
String get studysetMoveTopLevelRow = > ' Oberste Ebene (in keinem Lernset) ' ;
@ override
String get studysetMoveArchived = > ' Archiviert ' ;
@ override
String get studysetMoveNew = > ' Neues Lernset ' ;
@ override
String get studysetMoveSelectDestination = > ' Wähle ein Ziel ' ;
@ override
String studysetMoveDestination ( String name ) {
return ' Ziel: $ name ' ;
}
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
@ override
String get studysetMoveConfirm = > ' Verschieben ' ;
@ override
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
String get studysetMoveShowInside = > ' Unter-Lernsets anzeigen ' ;
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
@ override
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
String get studysetMoveHideInside = > ' Unter-Lernsets ausblenden ' ;
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
@ override
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
String studysetMoved ( String title , String destination ) {
return ' „ $ title “ nach $ destination verschoben. ' ;
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
}
@ override
String get studysetReadMore = > ' Mehr anzeigen ' ;
@ override
String get studysetDescriptionTitle = > ' Beschreibung ' ;
@ override
String get studysetDescriptionEditTitle = > ' Beschreibung bearbeiten ' ;
@ override
String get richTextSave = > ' Speichern ' ;
@ override
String get studysetSheetDescription = > ' Beschreibung ' ;
@ override
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
String get studysetSheetDescriptionAdd = >
' Tippen, um eine Beschreibung hinzuzufügen ' ;
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
@ override
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
String get studysetSheetDescriptionAdded = >
' Beschreibung hinzugefügt — zum Bearbeiten tippen ' ;
@ override
String get studysetSheetInheritColor = > ' Erben ' ;
feat(app): a studyset's languages, and Chinese and Korean fonts
The studyset sheet gains Languages, as before: off until "Set
languages", then the language of the cards' fronts and of their backs
(22 languages, Chinese in its two scripts). A studyset without its own
takes those of the nearest studyset above it, both together; set for the
first time, they start from those it took. The payload held both fields
already.
They set its text: Noto Sans SC, TC and KR join Noto Sans JP (bundled,
never fetched; 34 MB more, fonts 42 MB in all, your call), and since
Han characters take the shapes of the first font that has them, every
screen inside a studyset (its screen, cards, notes, paths, studying it)
puts the font of its front's language first, else of its back's,
Japanese otherwise. Every studyset route goes through one helper now.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 23:30:31 +02:00
@ override
String get studysetSheetLanguages = > ' Sprachen ' ;
@ override
String get studysetSheetSetLanguages = > ' Sprachen festlegen ' ;
@ override
String get studysetSheetLanguagesHelper = >
' In welcher Sprache die Seiten der Karten sind. Chinesisch, Japanisch und Koreanisch erscheinen dann in ihren eigenen Schriftzeichen. ' ;
@ override
String get studysetSheetLanguagesInherited = >
fix(app): glyph shapes, languages, licences and the side bar's foot
- A Japanese front keeps Japanese shapes whatever the back's language
(Japanese learnt in Chinese or Korean took Chinese or Korean shapes).
- A change of languages no longer rebuilds the screen below: the scope
keeps one shape, so a study session keeps its Undo.
- The PDF reader, with the cards and notes written beside it, takes its
studyset's languages too.
- Licences: GPL-3.0 and AGPL-3.0 mean "only", as SPDX defines them (not
"or later"); GPLv3 and "public domain" stay as typed; words around a
Creative Commons licence ("International", "Unported", "Deed") and its
name written out are read; 4.0 takes no jurisdiction.
- A new sub-studyset takes its parent's licence, not its holder or year.
- The year says it is wrong once typed whole or left; full-width digits
count; the year's range comes from clock.
- New sub-studyset shows whole in the side bar, no longer cut at half.
- The languages switch says that neither side set means inheriting;
"license" as the British verb.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-09 12:45:19 +02:00
' Ausgeschaltet oder ohne festgelegte Seite übernimmt es die Sprachen des Lernsets, in dem es liegt. ' ;
feat(app): a studyset's languages, and Chinese and Korean fonts
The studyset sheet gains Languages, as before: off until "Set
languages", then the language of the cards' fronts and of their backs
(22 languages, Chinese in its two scripts). A studyset without its own
takes those of the nearest studyset above it, both together; set for the
first time, they start from those it took. The payload held both fields
already.
They set its text: Noto Sans SC, TC and KR join Noto Sans JP (bundled,
never fetched; 34 MB more, fonts 42 MB in all, your call), and since
Han characters take the shapes of the first font that has them, every
screen inside a studyset (its screen, cards, notes, paths, studying it)
puts the font of its front's language first, else of its back's,
Japanese otherwise. Every studyset route goes through one helper now.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 23:30:31 +02:00
@ override
String get studysetSheetFrontLanguage = > ' Sprache der Vorderseite ' ;
@ override
String get studysetSheetBackLanguage = > ' Sprache der Rückseite ' ;
@ override
String get studysetSheetLanguageNotSet = > ' Nicht festgelegt ' ;
2026-10-08 23:48:43 +02:00
@ override
String get studysetSheetLicense = > ' Lizenz ' ;
@ override
String get studysetSheetLicenseHelp = > ' Hilf mir bei der Wahl ' ;
@ override
String get studysetSheetLicenseLabel = > ' Lizenz ' ;
@ override
String get studysetSheetLicenseHelper = >
' Unter welchen Bedingungen andere den Inhalt nutzen dürfen, unter dem Lernset mit einem Link darauf angezeigt. Beispiele: CC-BY-4.0, CC-BY-SA-4.0, MIT, All Rights Reserved. ' ;
@ override
String get studysetSheetLicenseYear = > ' Jahr ' ;
@ override
String get studysetSheetLicenseYearHelper = >
' Das Jahr des Urheberrechts, angezeigt als „© 2019 Name“. Optional. ' ;
@ override
String studysetSheetLicenseYearInvalid ( int min , int max ) {
return ' Gib ein Jahr zwischen $ min und $ max ein. ' ;
}
@ override
String get studysetSheetLicenseHolder = > ' Rechteinhaber ' ;
@ override
String get studysetSheetLicenseHolderHelper = >
' Wer genannt wird: ein Name oder eine Organisation. ' ;
@ override
String studysetSheetLicenseNewer ( String license , String current ) {
return ' $ license ist eine ältere Creative-Commons-Lizenz. Ihre aktuelle Version, $ current , passt vielleicht besser. ' ;
}
@ override
String get licenseChooserTitle = > ' Lizenz wählen ' ;
@ override
String get licenseChooserSubtitle = >
' Ein paar Fragen, um die Creative-Commons-Lizenz zu finden, die dazu passt, wie du dein Werk teilen möchtest. ' ;
@ override
String get licenseChooserIntroPrompt = >
' Möchtest du Rechte an deinem Werk behalten? ' ;
@ override
String get licenseChooserIntroYes = > ' Ja, unter einer Lizenz teilen ' ;
@ override
String get licenseChooserIntroYesDetail = >
' Andere müssen die Bedingungen einhalten, die du als Nächstes wählst. ' ;
@ override
String get licenseChooserIntroNo = > ' Nein, als Gemeingut freigeben ' ;
@ override
String get licenseChooserIntroNoDetail = >
' CC0: Jeder darf es für alles nutzen, ohne Bedingungen. ' ;
@ override
String get licenseChooserCommercialPrompt = >
' Dürfen andere dein Werk kommerziell nutzen? ' ;
@ override
String get licenseChooserYes = > ' Ja ' ;
@ override
String get licenseChooserCommercialYesDetail = > ' Auch mit Gewinnabsicht. ' ;
@ override
String get licenseChooserNo = > ' Nein ' ;
@ override
String get licenseChooserCommercialNoDetail = >
' Nur nicht-kommerzielle Nutzung (NC). ' ;
@ override
String get licenseChooserAdaptationsPrompt = >
' Dürfen andere dein Werk bearbeiten oder darauf aufbauen? ' ;
@ override
String get licenseChooserAdaptationsYesDetail = >
' Bearbeitungen und Remixe sind erlaubt. ' ;
@ override
String get licenseChooserAdaptationsShareAlike = >
' Ja, unter gleichen Bedingungen ' ;
@ override
String get licenseChooserAdaptationsShareAlikeDetail = >
' Bearbeitungen stehen unter derselben Lizenz (SA). ' ;
@ override
String get licenseChooserAdaptationsNoDetail = >
' Nur Weitergabe, keine Bearbeitungen (ND). ' ;
@ override
String get licenseChooserBack = > ' Zurück ' ;
@ override
String get licenseChooserRecommended = > ' Empfohlene Lizenz ' ;
@ override
String get licenseChooserUse = > ' Diese Lizenz verwenden ' ;
@ override
String get licenseSummaryCc0 = >
' Jeder darf es für alles nutzen, ohne Bedingungen und ohne Nennung. ' ;
@ override
String get licenseSummaryBy = >
' Andere dürfen es teilen und bearbeiten, auch kommerziell, solange sie dich nennen. ' ;
@ override
String get licenseSummaryBySa = >
' Andere dürfen es teilen und bearbeiten, auch kommerziell, wenn sie dich nennen und ihre Bearbeitungen genauso lizenzieren. ' ;
@ override
String get licenseSummaryByNc = >
' Andere dürfen es für nicht-kommerzielle Zwecke teilen und bearbeiten, mit Nennung. ' ;
@ override
String get licenseSummaryByNcSa = >
' Andere dürfen es nicht-kommerziell teilen und bearbeiten, mit Nennung und derselben Lizenz für Bearbeitungen. ' ;
@ override
String get licenseSummaryByNd = >
' Andere dürfen es teilen, auch kommerziell, mit Nennung, aber keine Bearbeitungen weitergeben. ' ;
@ override
String get licenseSummaryByNcNd = >
' Andere dürfen es nicht-kommerziell teilen, mit Nennung, aber nicht bearbeiten: die strengste Creative-Commons-Lizenz. ' ;
feat(app): a studyset's languages, and Chinese and Korean fonts
The studyset sheet gains Languages, as before: off until "Set
languages", then the language of the cards' fronts and of their backs
(22 languages, Chinese in its two scripts). A studyset without its own
takes those of the nearest studyset above it, both together; set for the
first time, they start from those it took. The payload held both fields
already.
They set its text: Noto Sans SC, TC and KR join Noto Sans JP (bundled,
never fetched; 34 MB more, fonts 42 MB in all, your call), and since
Han characters take the shapes of the first font that has them, every
screen inside a studyset (its screen, cards, notes, paths, studying it)
puts the font of its front's language first, else of its back's,
Japanese otherwise. Every studyset route goes through one helper now.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 23:30:31 +02:00
@ override
String get languageArabic = > ' Arabisch ' ;
@ override
String get languageGerman = > ' Deutsch ' ;
@ override
String get languageGreek = > ' Griechisch ' ;
@ override
String get languageEnglish = > ' Englisch ' ;
@ override
String get languageSpanish = > ' Spanisch ' ;
@ override
String get languageFrench = > ' Französisch ' ;
@ override
String get languageHebrew = > ' Hebräisch ' ;
@ override
String get languageHindi = > ' Hindi ' ;
@ override
String get languageItalian = > ' Italienisch ' ;
@ override
String get languageJapanese = > ' Japanisch ' ;
@ override
String get languageKorean = > ' Koreanisch ' ;
@ override
String get languageDutch = > ' Niederländisch ' ;
@ override
String get languagePolish = > ' Polnisch ' ;
@ override
String get languagePortuguese = > ' Portugiesisch ' ;
@ override
String get languageRussian = > ' Russisch ' ;
@ override
String get languageSwedish = > ' Schwedisch ' ;
@ override
String get languageThai = > ' Thailändisch ' ;
@ override
String get languageTurkish = > ' Türkisch ' ;
@ override
String get languageUkrainian = > ' Ukrainisch ' ;
@ override
String get languageVietnamese = > ' Vietnamesisch ' ;
@ override
String get languageChineseSimplified = > ' Chinesisch (vereinfacht) ' ;
@ override
String get languageChineseTraditional = > ' Chinesisch (traditionell) ' ;
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
@ override
String get fieldRequired = > ' Pflichtfeld ' ;
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
@ override
String get exploreTitle = > ' Entdecken ' ;
@ override
String get exploreEmpty = > ' Lernsets, die andere teilen, erscheinen hier. ' ;
@ override
String get profileTitle = > ' Profil ' ;
@ override
String get profileSettingsTooltip = > ' Einstellungen ' ;
@ override
String get profileIdentified = >
' Dein Fortschritt wird in deinem Konto gespeichert. ' ;
@ override
String get profileAnonymous = >
' Dein Fortschritt wird auf diesem Gerät gespeichert. Melde dich an, um ihn zu behalten. ' ;
@ override
String get profileSignInWithGitHub = > ' Mit GitHub anmelden ' ;
@ override
String get profileSignInFailed = > ' Anmeldung mit GitHub fehlgeschlagen. ' ;
@ override
String get profileContinueInBrowser = > ' Fahre in deinem Browser fort. ' ;
@ override
String get profileSwitchTitle = > ' Zu deinem GitHub-Konto wechseln? ' ;
@ override
String get profileSwitchMessage = >
' Dieses GitHub-Konto hat bereits Fortschritt von einem anderen Gerät. Die Lernsets auf diesem Gerät lassen sich noch nicht damit zusammenführen: Wenn du wechselst, werden sie gelöscht. ' ;
@ override
String get profileSwitchStay = > ' Anonym bleiben ' ;
@ override
String get profileSwitchConfirm = > ' Wechseln ' ;
feat: public profiles, a handle on the account domain with name, bio, links and picture
Stage 1 of the public tier (ADR 0005). A person with an identity has a
public profile: a handle by Mastodon's rules (1 to 30 letters, digits or
underscores, unique whatever its case, a few kept for the instance),
changeable until they first publish, on the instance's account domain
(ACCOUNT_DOMAIN, else the server's host; the instance info names it), so
`raisondetredev@halkyon.eu`; a display name, a bio, up to four links and
an avatar. The table is server only: the app gets a Profile without the
person's id. ProfileEndpoint (identified only) reads, saves and removes
the caller's own; ProfilesEndpoint finds anyone's by handle.
An avatar is a PNG of at most 1 MB that the app draws anew from the
picture chosen, its middle square at 400 pixels, so a photo's metadata
never leaves the device. The server keeps it in the public storage named
by its content, so its URL tells nothing about whose it is, and deletes it
once no profile shows it. Deleting a person deletes their profile and its
picture.
In the app, the Profile tab holds the profile as a form, laid out as the
old app's; anonymous people are told GitHub sign-in gives them one.
Migration 20261009184924904-public-profiles creates public_profile with a
unique index on the person and one on the handle in lower case; it touches
no other table, and the old server never sees it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-09 20:55:16 +02:00
@ override
String get publicProfileTitle = > ' Öffentliches Profil ' ;
@ override
String get publicProfileIntro = >
' Wie andere dich sehen, sobald du veröffentlichst: das Handle, unter dem sie dich finden, dein Name, ein paar Worte und Links. Nichts davon ist sichtbar, bevor du es speicherst. ' ;
@ override
String get publicProfileAnonymousHint = >
' Melde dich mit GitHub an, um ein öffentliches Profil zu haben und zu veröffentlichen. ' ;
@ override
String get publicProfileDisplayName = > ' Anzeigename ' ;
@ override
String get publicProfileDisplayNameHint = > ' Der Name neben deinem Handle ' ;
@ override
String get publicProfileHandle = > ' Handle ' ;
@ override
String get publicProfileHandleHint = >
' Buchstaben, Ziffern und Unterstriche, bis zu 30 ' ;
@ override
String publicProfileAddress ( String address ) {
return ' Andere finden dich als @ $ address ' ;
}
@ override
String get publicProfileHandleFixed = >
' Fest, seit du veröffentlicht hast: Andere verweisen darauf. ' ;
@ override
String get publicProfileBio = > ' Über dich ' ;
@ override
String get publicProfileLinks = > ' Links ' ;
@ override
String get publicProfileLinksHint = >
' Deine Website oder andere Konten, bis zu 4. ' ;
@ override
String get publicProfileLinkHint = > ' https://… ' ;
@ override
String get publicProfileAddLink = > ' Link hinzufügen ' ;
@ override
String get publicProfileRemoveLink = > ' Link entfernen ' ;
@ override
String get publicProfileSaved = > ' Profil gespeichert. ' ;
@ override
String get publicProfileRemove = > ' Profil entfernen ' ;
@ override
String get publicProfileRemoveTitle = > ' Dein öffentliches Profil entfernen? ' ;
@ override
String get publicProfileRemoveMessage = > ' Dein Handle wird für andere frei. ' ;
@ override
String get publicProfileRemoved = > ' Profil entfernt. ' ;
@ override
String get publicProfileFailed = >
' Die Instanz ist nicht erreichbar. Versuche es erneut. ' ;
@ override
String get publicProfileUnreachable = >
' Dein öffentliches Profil ist gerade nicht erreichbar. ' ;
@ override
String get publicProfileRetry = > ' Erneut versuchen ' ;
@ override
String get profileProblemHandleInvalid = >
' Ein Handle besteht aus 1 bis 30 Buchstaben (a bis z), Ziffern oder Unterstrichen. ' ;
@ override
String get profileProblemHandleReserved = >
' Dieses Handle ist der Instanz vorbehalten. ' ;
@ override
String get profileProblemHandleTaken = >
' Dieses Handle hat schon jemand anderes. ' ;
@ override
String get profileProblemPublished = >
' Du hast veröffentlicht: Dein Handle kann sich nicht mehr ändern und dein Profil nicht mehr gehen. ' ;
@ override
String get profileProblemDisplayNameTooLong = > ' Höchstens 30 Zeichen. ' ;
@ override
String get profileProblemBioTooLong = > ' Höchstens 500 Zeichen. ' ;
@ override
String get profileProblemTooManyLinks = > ' Höchstens 4 Links. ' ;
@ override
String get profileProblemLinkInvalid = >
' Links beginnen mit https:// oder http://. ' ;
@ override
String get profileProblemAvatarInvalid = >
' Dieses Bild lässt sich nicht verwenden: Wähle ein PNG-, JPEG-, WebP- oder GIF-Bild. ' ;
@ override
String get publicProfilePicture = > ' Bild ' ;
@ override
String get publicProfileChoosePicture = > ' Bild wählen ' ;
@ override
String get publicProfileRemovePicture = > ' Bild entfernen ' ;
@ override
String get publicProfilePictureType = > ' Bilder ' ;
@ override
String get publicProfilePictureLater = >
' Speichere dein Profil, um ein Bild hinzuzufügen. ' ;
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
@ override
String get settingsTitle = > ' Einstellungen ' ;
@ override
String get settingsAccount = > ' Konto ' ;
@ override
String get settingsSignOut = > ' Abmelden ' ;
@ override
String get settingsSignOutTitle = > ' Abmelden? ' ;
@ override
String get settingsSignOutAnonymousMessage = >
' Bei diesem Konto kannst du dich nicht wieder anmelden, deshalb wird es beim Abmelden samt Fortschritt gelöscht. ' ;
@ override
String get settingsDeleteAccount = > ' Konto löschen ' ;
@ override
String get settingsDeleteTitle = > ' Dein Konto löschen? ' ;
@ override
String get settingsDeleteMessage = >
' Alles, was du hast, also deine Lernsets, Karten und Wiederholungen, wird auf dem Server und auf all deinen Geräten gelöscht. Dies kann nicht rückgängig gemacht werden. ' ;
@ override
String get settingsAbout = > ' Über Halkyon Learn ' ;
@ override
String get aboutLegalese = >
' Freie Software: Die App steht unter der GNU Affero General Public License, Version 3 oder jeder späteren Version, der Server unter der Server Side Public License, Version 1. ' ;
@ override
String get aboutSourceCode = >
' Der Quellcode dessen, was diese Instanz ausführt: ' ;
@ override
String get aboutSourceUnreachable = >
' Diese Instanz war nicht erreichbar, um nach ihrem Quellcode zu fragen. ' ;
@ override
String get settingsAppearance = > ' Darstellung ' ;
@ override
String get settingsAppearanceDevice = > ' Gerätedesign ' ;
@ override
String get settingsAppearanceLight = > ' Hell ' ;
@ override
String get settingsAppearanceDark = > ' Dunkel ' ;
@ override
String get settingsLanguage = > ' Sprache ' ;
@ override
String get settingsLanguageDevice = > ' Gerätesprache ' ;
feat(app): cite sources in APA, MLA or Chicago, and give studysets a bibliography
A source is now shared by learning paths and studysets (core/citation/):
authors as full names, year, title, what it is a part of, publisher,
ISBN, link, and a citation kept as a file brought it. formatCitation
cites it in APA 7, MLA 9 or Chicago 18: it inverts and abbreviates
names itself (particles, suffixes, names written as already cited stay),
sets a work of its own in italics and a part of something apart from
the whole, and writes a missing year as "n.d." in APA and Chicago.
- Settings: a Citations card per device, with a preview and a link to
the style's own guide.
- Studysets: a Bibliography button opens the works cited, to read and,
behind its pencil, to change (studyset schema 4).
- Steps: sources edited through the same sheet, opened from an
"N sources" button in the runner (step schema 2; schema 1 reads on).
- Path import: steps' sources, text kept as written, the old format's
"citation" read as what a source is part of.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 17:07:04 +02:00
@ override
String get settingsCitations = > ' Quellenangaben ' ;
@ override
String get settingsCitationsDescription = >
' Wie Quellen und die Literaturverzeichnisse von Lernsets auf diesem Gerät zitiert werden. Gib die vollständigen Namen der Autoren ein: Jeder Stil kürzt und ordnet sie selbst. ' ;
@ override
String get settingsCitationStyle = > ' Stil ' ;
@ override
String get settingsCitationStyleApa = > ' APA (7. Auflage) ' ;
@ override
String get settingsCitationStyleMla = > ' MLA (9. Auflage) ' ;
@ override
String get settingsCitationStyleChicago = > ' Chicago (18. Auflage) ' ;
@ override
String get settingsCitationPreview = > ' Vorschau ' ;
@ override
String get settingsCitationGuide = > ' Offizieller Leitfaden ' ;
2026-10-07 21:10:33 +02:00
@ override
String get settingsStudy = > ' Lernen ' ;
@ override
String get settingsStudyPomodoroTitle = >
' Pomodoro-Timer beim Lernen anzeigen ' ;
@ override
String get settingsStudyPomodoroSubtitle = >
' Zeige den Fokus-/Pausen-Countdown in der Lernsitzung, damit du die verbleibende Zeit siehst, ohne die Benachrichtigung zu öffnen. ' ;
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
@ override
String settingsVersion ( String version , String build ) {
return ' Version $ version (Build $ build ) ' ;
}
@ override
String get syncTitle = > ' Synchronisierung ' ;
@ override
String get syncStateSyncing = > ' Wird synchronisiert… ' ;
@ override
String get syncStateSynced = > ' Alles synchronisiert ' ;
@ override
String get syncStateNotYet = > ' Noch nicht synchronisiert ' ;
@ override
String get syncStateFailing = > ' Synchronisierung schlägt fehl ' ;
@ override
String syncStateMismatch ( String server ) {
return ' Diese App kann nicht mit $ server synchronisieren ' ;
}
@ override
String get syncMismatchDetail = >
' Aktualisiere die App. Ist sie schon aktuell, muss der Server aktualisiert werden. Was du bis dahin tust, bleibt auf diesem Gerät und wird danach synchronisiert. ' ;
@ override
String syncLastCompleted ( String time ) {
return ' Zuletzt abgeschlossen um $ time ' ;
}
@ override
String get syncNoRunYet = >
' Seit dem Start der App wurde noch keine Synchronisierung abgeschlossen ' ;
@ override
String syncLastFailed ( String time ) {
return ' Letzter Versuch fehlgeschlagen um $ time ' ;
}
@ override
String get syncNow = > ' Jetzt synchronisieren ' ;
@ override
String get syncTroubleLabel = > ' Synchronisierung benötigt Aufmerksamkeit ' ;
@ override
String syncMismatchBanner ( String server ) {
return ' Diese App kann nicht mehr mit $ server synchronisieren. Aktualisiere sie, um weiter zu synchronisieren. ' ;
}
@ override
String get syncMismatchMore = > ' Mehr ' ;
@ override
String get tagsReadFailed = > ' Die Tags konnten nicht gelesen werden. ' ;
fix(app): Reorder among older items, export and text import that hold up
- Reorder: rows from before an order existed all share one position, and
one moved among them landed at their end; the run it goes into now
gets positions of its own (placeAmong), for notes, files, paths,
steps and sub-studysets. Rows whose deletion can still be undone count
for nothing, as the list leaves them out, and a dropped row takes its
place at once instead of snapping back until the order is read again.
- Export: two studysets inside each other (moved so on two devices
offline) no longer make it run forever; links to files whose names
hold #, % or brackets work; PDFs, images and sounds go into the zip
without being compressed again; any error says the export failed.
- Text import: a real CSV reader (quoted fields over several lines, a
back over several quoted fields, a stray quote spoiling only its own
line), the separator guessed from the text (semicolons from German
spreadsheets), and files in UTF-16 or Windows-1252 read as meant.
- A tab whose notes, paths or files couldn't be read says so rather than
"No … yet"; an Anki import from the Library that fails leaves no empty
studyset behind.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-09 13:02:32 +02:00
@ override
String get notesReadFailed = > ' Die Notizen konnten nicht gelesen werden. ' ;
@ override
String get pathsReadFailed = > ' Die Lernpfade konnten nicht gelesen werden. ' ;
@ override
String get filesReadFailed = > ' Die Dateien konnten nicht gelesen werden. ' ;
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
@ override
String get tagPickerTitle = > ' Tags ' ;
@ override
String get tagPickerManage = > ' Tags verwalten ' ;
@ override
String get tagPickerSearchLabel = > ' Tag suchen oder erstellen ' ;
@ override
String tagPickerCreate ( String name ) {
return ' „ $ name “ erstellen ' ;
}
@ override
String get tagSheetCreateTitle = > ' Tag erstellen ' ;
@ override
String get tagSheetEditTitle = > ' Tag bearbeiten ' ;
@ override
String get tagSheetNameLabel = > ' Name ' ;
@ override
String get tagSheetNameHelper = >
feat(app): tags keep their case; dictionary tags read JLPT-N5, Noun
A tag is still its name, but no longer in lowercase: the name keeps the
case it was written in, and names that differ only in case are one tag
(ADR 0004, rule 2, amended). Two such tags from two devices fold into the
one with the smaller id, its case with it. Tags stored before stay
lowercase until renamed.
Words from the dictionary are tagged JLPT-N5 to JLPT-N1 and with their
word class (Noun, Verb, i-Adjective, na-Adjective, ...). Anki tags and
PDF chapter tags arrive as written.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-09 10:48:06 +02:00
' Groß- und Kleinschreibung ergibt keinen neuen Tag: „Nomen“ und „nomen“ sind einer. ' ;
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
@ override
String tagSheetNameExists ( String name ) {
return ' Den Tag „ $ name “ gibt es bereits. ' ;
}
@ override
String tagSheetNameMerges ( String name ) {
return ' Es gibt bereits einen Tag „ $ name “: Beim Speichern wird dieser mit ihm zusammengeführt. ' ;
}
@ override
String get tagSheetColor = > ' Farbe ' ;
@ override
String get tagSheetCreate = > ' Erstellen ' ;
@ override
String get tagSheetSave = > ' Speichern ' ;
@ override
String get tagManageTitle = > ' Tags verwalten ' ;
@ override
String get tagManageEmpty = > ' Noch keine Tags. Füge unten einen hinzu. ' ;
@ override
String get tagManageAdd = > ' Tag hinzufügen ' ;
@ override
String tagManageRow ( String name , int count ) {
return ' $ name ( $ count ) ' ;
}
@ override
String get tagManageEdit = > ' Tag bearbeiten ' ;
@ override
String get tagManageDelete = > ' Tag löschen ' ;
@ override
String tagDeleteTitle ( String name ) {
return ' Tag „ $ name “ löschen? ' ;
}
@ override
String tagDeleteMessage ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' Er wird auf all deinen Geräten von $ count Karteikarten entfernt. ' ,
one: ' Er wird auf all deinen Geräten von 1 Karteikarte entfernt. ' ,
zero: ' Er ist an keiner Karteikarte. ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String get tagDeleteConfirm = > ' Löschen ' ;
@ override
String tagDeleted ( String name ) {
return ' Tag „ $ name “ gelöscht ' ;
}
@ override
String get studySettingsTitle = > ' Sitzungseinstellungen ' ;
@ override
String get studySettingsFilterByTags = > ' Nach Tags filtern ' ;
@ override
String get studySettingsNoTags = >
feat(app): tag, edit, delete and swipe cards while studying, with tidier session sheets
- Above every studied card (but a matching one): the PDF it came from,
its tags on one line ("+2 tags" for the rest) or "Add tags", and a
menu to tag, edit or delete it; the session follows (an edited card
shows as saved, a deleted one leaves the round).
- On phones, a front/back or vocabulary card swiped right is rated
Good, left Bad; it tilts over the colour it heads for, and springs
back when let go early.
- The session's settings: "Settings", a 48 dp Save that warns mid-round
("Heads up!"), steppers in an outlined box ("20 / day", "5 / 50"),
the order in an outlined dropdown, the chosen tags with the rest
behind "Filter by tags" / "+3 more".
- A studyset's study options: Save above Reset to defaults, the
description small, reviews a day in steps of 25.
- One stepper look everywhere (study, Pomodoro profiles), its buttons
"Decrease" and "Increase".
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 18:13:32 +02:00
' Noch keine Inhalts-Tags. Füge deinen Karten Tags hinzu, um sie hier zu filtern. ' ;
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
@ override
String get studySettingsReset = > ' Zurücksetzen ' ;
@ override
String get studySettingsSave = > ' Speichern ' ;
feat(app): tag, edit, delete and swipe cards while studying, with tidier session sheets
- Above every studied card (but a matching one): the PDF it came from,
its tags on one line ("+2 tags" for the rest) or "Add tags", and a
menu to tag, edit or delete it; the session follows (an edited card
shows as saved, a deleted one leaves the round).
- On phones, a front/back or vocabulary card swiped right is rated
Good, left Bad; it tilts over the colour it heads for, and springs
back when let go early.
- The session's settings: "Settings", a 48 dp Save that warns mid-round
("Heads up!"), steppers in an outlined box ("20 / day", "5 / 50"),
the order in an outlined dropdown, the chosen tags with the rest
behind "Filter by tags" / "+3 more".
- A studyset's study options: Save above Reset to defaults, the
description small, reviews a day in steps of 25.
- One stepper look everywhere (study, Pomodoro profiles), its buttons
"Decrease" and "Increase".
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 18:13:32 +02:00
@ override
String get studySettingsHeadsUpTitle = > ' Achtung! ' ;
@ override
String get studySettingsHeadsUpBody = >
' Die vorgenommenen Änderungen laden die Sitzung neu und dein aktueller Fortschritt geht verloren. ' ;
@ override
String get studySettingsApplyChanges = > ' Änderungen übernehmen ' ;
@ override
String get studySettingsPerDay = > ' / Tag ' ;
@ override
String studySettingsMoreTags ( int count ) {
return ' + $ count weitere ' ;
}
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
@ override
String get cardTagsLabel = > ' Tags ' ;
@ override
String get cardTagsAdd = > ' Tags hinzufügen ' ;
@ override
String get cardTagsEdit = > ' Tags bearbeiten ' ;
feat(app): tag, edit, delete and swipe cards while studying, with tidier session sheets
- Above every studied card (but a matching one): the PDF it came from,
its tags on one line ("+2 tags" for the rest) or "Add tags", and a
menu to tag, edit or delete it; the session follows (an edited card
shows as saved, a deleted one leaves the round).
- On phones, a front/back or vocabulary card swiped right is rated
Good, left Bad; it tilts over the colour it heads for, and springs
back when let go early.
- The session's settings: "Settings", a 48 dp Save that warns mid-round
("Heads up!"), steppers in an outlined box ("20 / day", "5 / 50"),
the order in an outlined dropdown, the chosen tags with the rest
behind "Filter by tags" / "+3 more".
- A studyset's study options: Save above Reset to defaults, the
description small, reviews a day in steps of 25.
- One stepper look everywhere (study, Pomodoro profiles), its buttons
"Decrease" and "Increase".
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 18:13:32 +02:00
@ override
String tagChipsOverflow ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Tags ' ,
one: ' 1 Tag ' ,
) ;
return ' + $ _temp0 ' ;
}
feat(app): give cards hints and an explanation
A card of any type can carry up to six hints and an explanation, both
rich text. They are written in the composer, added from its menu (or
Ctrl+Alt+H / Ctrl+Alt+E), each removed on its own; blank ones aren't
kept. While studying, "Hints" under the question opens them one at a
time, and "Explanation" comes with the answer.
Card schema 5 holds them (`hints`, `explanation`), and with them what a
card needs next: a report that something on it is wrong (`report`:
category, note, when) and a word's senses with their grammar codes
(`senses`; a word's meanings then come from them, and its first sense
says whether it is usually written in kana). Each merges as a field of
its own.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 21:24:41 +02:00
@ override
String get cardHints = > ' Hinweise ' ;
@ override
String cardHint ( int number ) {
return ' Hinweis $ number ' ;
}
@ override
String get cardAddHint = > ' Hinweis hinzufügen ' ;
@ override
String get cardRemoveHint = > ' Hinweis entfernen ' ;
@ override
String get cardExplanation = > ' Erklärung ' ;
@ override
String get cardAddExplanation = > ' Erklärung hinzufügen ' ;
@ override
String get cardRemoveExplanation = > ' Erklärung entfernen ' ;
@ override
String cardHintsSheetTitle ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' Hinweise $ count ' ,
one: ' Hinweis ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String get cardPreviousHint = > ' Vorheriger Hinweis ' ;
@ override
String get cardNextHint = > ' Nächster Hinweis ' ;
@ override
String get cardReport = > ' Meldung ' ;
@ override
String get cardSenses = > ' Wortbedeutungen ' ;
feat(app): the dictionary in the app: look words up, add them as cards
A studyset's dictionary follows from its language, as decided: the
instance's dictionary of its front's language, with meanings in its
back's (else English). Nothing to attach or detach; nothing of it shows
where there is none.
- Add material › From the dictionary: search a word (kanji, kana,
romaji, meaning) and add it as a flashcard, or add a whole level
(JLPT N5…N1, common words) at once, asked first above 500 words, its
progress shown. Words already in the studyset show as such and are
left out. Each card is a vocabulary card (headword, reading, senses
with their codes), tagged `jlpt-n5` and with its word class, and
marked as imported from the dictionary.
- Look up beside a vocabulary card's front fills the card with the word
chosen, keeping its hints, explanation and tags.
- A card keeps the dictionary entry it was made from (card schema 6:
`dictionary` {source, id}), to be found again and not added twice.
- The dictionary's credits show at its foot and in About, as its licence
asks.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-09 01:33:12 +02:00
@ override
String get cardDictionaryEntry = > ' Wörterbucheintrag ' ;
feat: a dictionary's corrections reach the cards made from it, by offer
Every dictionary entry now has a version: 16 hex digits of the SHA-256 of
what cards take of it (headword, reading, entry), made by the loader and
carried on every hit. A card keeps the version it took (card schema 8).
DictionaryEndpoint.changed returns, of the entries named with the
versions cards keep (1,000 at most a call; the app asks 500 at a time),
those whose version is another now.
The card browser says how many cards are behind their dictionary and takes
the corrections at a tap (decided 2026-10-09: by offer, never by
themselves). Taking one writes the entry as it is now over the revision
in which the card last took it, beside whatever came after, so the
revisions merge per side as two devices' edits do (ADR 0003): a side only
the dictionary changed takes the correction, a side the person changed
too is a conflict settled in the composer, whose words now name that
case. Cards made before versions are never offered one.
The server rereads its dictionary folder hourly now, not daily: the
dictionaries service fills its volume after an instance's first start,
and an hour with nothing changed costs a hash of each file.
Migration 20261009145434785-dictionary-entry-version: adds
dictionary_entry.version, text NOT NULL DEFAULT '' (rows loaded before
have none and are never reported as corrected), and by hand empties
dictionary_source."fileHash", so every source loads once more and its
entries get their versions; the schema stays as definition.sql says. The
old server goes on working until the switch.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-09 17:32:00 +02:00
@ override
String get cardDictionaryVersion = > ' Wörterbuchversion ' ;
feat(app): the dictionary in the app: look words up, add them as cards
A studyset's dictionary follows from its language, as decided: the
instance's dictionary of its front's language, with meanings in its
back's (else English). Nothing to attach or detach; nothing of it shows
where there is none.
- Add material › From the dictionary: search a word (kanji, kana,
romaji, meaning) and add it as a flashcard, or add a whole level
(JLPT N5…N1, common words) at once, asked first above 500 words, its
progress shown. Words already in the studyset show as such and are
left out. Each card is a vocabulary card (headword, reading, senses
with their codes), tagged `jlpt-n5` and with its word class, and
marked as imported from the dictionary.
- Look up beside a vocabulary card's front fills the card with the word
chosen, keeping its hints, explanation and tags.
- A card keeps the dictionary entry it was made from (card schema 6:
`dictionary` {source, id}), to be found again and not added twice.
- The dictionary's credits show at its foot and in About, as its licence
asks.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-09 01:33:12 +02:00
@ override
String get studysetFromDictionary = > ' Aus dem Wörterbuch ' ;
@ override
String get dictionaryTitle = > ' Wörterbuch ' ;
@ override
String get dictionarySearchHint = >
' Ein Wort in Kanji, Kana oder Romaji, oder eine Bedeutung ' ;
@ override
String dictionaryNothingFound ( String query ) {
return ' Nichts gefunden für „ $ query “. ' ;
}
@ override
String get dictionaryUnreachable = >
' Das Wörterbuch ist gerade nicht erreichbar. ' ;
@ override
String get dictionaryRetry = > ' Erneut versuchen ' ;
fix(app): the dictionary adds each word once, says when it can't, and Look up tags hold
- A word tapped twice, or added while a level is being added, makes one
card: adds run one at a time, and the word counts as in the studyset
at once. The adder reads the studyset's cards once rather than for
every word.
- Adding that fails says so, and a level shows "Making the cards…" once
its words have come.
- Finding a studyset's dictionary tells finding, none and unreachable
apart: the dictionary screen says there is none or offers Retry, and
an instance unreachable at start is asked again once a sync goes
through (Look up and From the dictionary appear then).
- Look up's tags wait on the card by name and are made when it is saved:
leaving the card at once no longer saves it untagged, a word replaced
leaves no tag behind, and a new word replaces any level or word class
on the card, pinned ones too. Look up marks words already made into
cards of the studyset.
- The tag picker's Create keeps the case typed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-09 12:45:18 +02:00
@ override
String get dictionaryAddFailed = >
' Die Wörter konnten nicht hinzugefügt werden. Versuche es erneut. ' ;
@ override
String get dictionaryMakingCards = > ' Die Karteikarten werden erstellt… ' ;
@ override
String get dictionaryNone = >
' Für die Sprache dieses Lernsets gibt es auf dieser Instanz kein Wörterbuch. ' ;
feat(app): the dictionary in the app: look words up, add them as cards
A studyset's dictionary follows from its language, as decided: the
instance's dictionary of its front's language, with meanings in its
back's (else English). Nothing to attach or detach; nothing of it shows
where there is none.
- Add material › From the dictionary: search a word (kanji, kana,
romaji, meaning) and add it as a flashcard, or add a whole level
(JLPT N5…N1, common words) at once, asked first above 500 words, its
progress shown. Words already in the studyset show as such and are
left out. Each card is a vocabulary card (headword, reading, senses
with their codes), tagged `jlpt-n5` and with its word class, and
marked as imported from the dictionary.
- Look up beside a vocabulary card's front fills the card with the word
chosen, keeping its hints, explanation and tags.
- A card keeps the dictionary entry it was made from (card schema 6:
`dictionary` {source, id}), to be found again and not added twice.
- The dictionary's credits show at its foot and in About, as its licence
asks.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-09 01:33:12 +02:00
@ override
String get dictionaryAdd = > ' Hinzufügen ' ;
@ override
String get dictionaryInStudyset = > ' In diesem Lernset ' ;
@ override
String dictionaryAdded ( String word ) {
return ' „ $ word “ hinzugefügt. ' ;
}
@ override
String get dictionaryLevels = > ' Eine ganze Stufe hinzufügen ' ;
@ override
String get dictionaryLevelsHint = >
' Jedes Wort einer Stufe wird eine Karteikarte, in der Reihenfolge ihrer Liste, mit Stufe und Wortart als Tags. Wörter, die schon in diesem Lernset sind, werden ausgelassen. ' ;
@ override
String get dictionaryLabelCommon = > ' Häufig ' ;
@ override
String dictionaryAddLevel ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Wörter hinzufügen ' ,
one: ' 1 Wort hinzufügen ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String dictionaryAddingLevel ( int done , int count ) {
return ' Wird hinzugefügt… $ done von $ count ' ;
}
@ override
String dictionaryWordsAdded ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Wörter hinzugefügt. ' ,
one: ' 1 Wort hinzugefügt. ' ,
zero: ' Keine neuen Wörter. ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String dictionaryWordsSkipped ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count waren schon in diesem Lernset. ' ,
one: ' 1 war schon in diesem Lernset. ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String dictionaryConfirmTitle ( int count ) {
return ' $ count Wörter hinzufügen? ' ;
}
@ override
String get dictionaryConfirmMessage = >
' Jedes wird eine Karteikarte in diesem Lernset. ' ;
@ override
String get dictionaryConfirmAdd = > ' Hinzufügen ' ;
@ override
String dictionaryCredits ( String sources ) {
return ' Wörter aus $ sources . ' ;
}
@ override
String get dictionaryLookUp = > ' Im Wörterbuch nachschlagen ' ;
feat(app): kanji and kana in the dictionary, beside the words
Where the instance holds the characters of a studyset's language, the
dictionary screen has a tab for them, Kanji & kana: search by character,
reading (kana or romaji) or meaning, and whole levels to add, under their
names: the kana (hiragana, katakana), the JLPT levels and the school
grades. A character becomes a character card, its meanings (a kana's
romaji) and readings, tagged with its level (JLPT-N5), school grade
(Grade 1 … Grade 6, Secondary school) and script (Hiragana, Katakana). A
character card's Look up searches the characters, and an entry looked up
again on a card swaps the tags the one before brought, as words do.
A dictionary's entries are now words or characters (DictionaryItem), as
its kind says.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-09 15:19:22 +02:00
@ override
String get dictionaryCharacterSearchHint = >
' Ein Kanji oder Kana, eine Lesung in Kana oder Romaji, oder eine Bedeutung ' ;
@ override
String get dictionaryTabWords = > ' Wörter ' ;
@ override
String get dictionaryTabCharacters = > ' Kanji & Kana ' ;
@ override
String get dictionaryLabelHiragana = > ' Hiragana ' ;
@ override
String get dictionaryLabelKatakana = > ' Katakana ' ;
@ override
String dictionaryGrade ( int grade ) {
return ' Klasse $ grade ' ;
}
@ override
String get dictionaryLabelSecondary = > ' Weiterführende Schule ' ;
@ override
String get dictionaryGroupKana = > ' Kana ' ;
@ override
String get dictionaryGroupJlpt = > ' JLPT-Stufen ' ;
@ override
String get dictionaryGroupGrades = > ' Schuljahre ' ;
@ override
String dictionaryStrokes ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Striche ' ,
one: ' 1 Strich ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String get dictionaryCharacterLevelsHint = >
' Jedes Schriftzeichen einer Stufe wird eine Karteikarte, in der Reihenfolge ihrer Liste, mit Stufe, Schuljahr oder Schrift als Tags. Schriftzeichen, die schon in diesem Lernset sind, werden ausgelassen. ' ;
@ override
String dictionaryAddCharacters ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Schriftzeichen hinzufügen ' ,
one: ' 1 Schriftzeichen hinzufügen ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String dictionaryCharactersAdded ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Schriftzeichen hinzugefügt. ' ,
one: ' 1 Schriftzeichen hinzugefügt. ' ,
zero: ' Keine neuen Schriftzeichen. ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String dictionaryConfirmCharactersTitle ( int count ) {
return ' $ count Schriftzeichen hinzufügen? ' ;
}
@ override
String dictionaryCharacterCredits ( String sources ) {
return ' Schriftzeichen aus $ sources . ' ;
}
feat: a dictionary's corrections reach the cards made from it, by offer
Every dictionary entry now has a version: 16 hex digits of the SHA-256 of
what cards take of it (headword, reading, entry), made by the loader and
carried on every hit. A card keeps the version it took (card schema 8).
DictionaryEndpoint.changed returns, of the entries named with the
versions cards keep (1,000 at most a call; the app asks 500 at a time),
those whose version is another now.
The card browser says how many cards are behind their dictionary and takes
the corrections at a tap (decided 2026-10-09: by offer, never by
themselves). Taking one writes the entry as it is now over the revision
in which the card last took it, beside whatever came after, so the
revisions merge per side as two devices' edits do (ADR 0003): a side only
the dictionary changed takes the correction, a side the person changed
too is a conflict settled in the composer, whose words now name that
case. Cards made before versions are never offered one.
The server rereads its dictionary folder hourly now, not daily: the
dictionaries service fills its volume after an instance's first start,
and an hour with nothing changed costs a hash of each file.
Migration 20261009145434785-dictionary-entry-version: adds
dictionary_entry.version, text NOT NULL DEFAULT '' (rows loaded before
have none and are never reported as corrected), and by hand empties
dictionary_source."fileHash", so every source loads once more and its
entries get their versions; the schema stays as definition.sql says. The
old server goes on working until the switch.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-09 17:32:00 +02:00
@ override
String dictionaryUpdatesBehind ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other:
' $ count Karteikarten sind hinter dem Wörterbuch zurück: Ihre Einträge wurden seitdem korrigiert. ' ,
one: ' 1 Karteikarte ist hinter dem Wörterbuch zurück: Ihr Eintrag wurde seitdem korrigiert. ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String get dictionaryUpdatesTake = > ' Korrekturen übernehmen ' ;
@ override
String dictionaryUpdatesTaken ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Karteikarten aktualisiert. ' ,
one: ' 1 Karteikarte aktualisiert. ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String dictionaryUpdatesToSettle ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other:
' $ count haben dort auch eine Änderung von dir: Öffne sie, um zu wählen. ' ,
one: ' Eine hat dort auch eine Änderung von dir: Öffne sie, um zu wählen. ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String get dictionaryUpdatesFailed = >
' Die Korrekturen konnten nicht übernommen werden. Versuche es erneut. ' ;
feat(app): stroke order for kanji and kana, from KanjiVG
KanjiVG's strokes come with the app (assets/kanjivg/, CC BY-SA 3.0, its
notice in the licence list): 94 gzipped files, one per 256 code points,
2.7 MB in all, a file read the first time a character of it is asked for
(StrokeRepository, app-wide beside the maps). The strokes are SVG path
data, read with path_parsing (the Flutter team's, pure Dart, already in
the build through flutter_svg), so the model can flatten them into points
without dart:ui, as checking handwriting will.
A character's sheet traces its strokes in order over those to come, with
its stroke count, meanings, readings, level and the components KanjiVG
splits it into, each a tap away. It opens from a studied character's
answer (Stroke order) and from a character found in the dictionary.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-09 15:35:00 +02:00
@ override
String get kanjiStrokeOrder = > ' Strichfolge ' ;
@ override
String get kanjiPlayAgain = > ' Noch einmal abspielen ' ;
@ override
String get kanjiNoStrokes = >
' Für dieses Schriftzeichen gibt es keine Strichfolge. ' ;
@ override
String get kanjiComponents = > ' Bestandteile ' ;
feat(app): write kanji, kana and words by hand, each stroke checked
The study option Write by hand (settings schema 7) has character cards
and words written in a session, on a schedule of their own (review mode
`write`; older apps skip a mode they don't know): what to write on top, a
character's meanings and readings or a word's reading and meanings, and
below it a square to write it in, character by character.
Each stroke is checked as it ends against KanjiVG's: both resampled to 22
points, then their shape once centred, where they lie, how long they are
and which way they go, each against what a loose hand strays by; a stroke
closer to one still to come is out of order. One that counts is drawn as
KanjiVG draws it, and the hand's offset from the middle is forgiven in the
strokes after; any other flashes red, says why and counts as a mistake, as
does a hint. Two misses in a row show the next stroke faintly. Once
written, or given up on (Show it), the rating the mistakes suggest is
outlined: none Good, one or two OK, more Bad.
The square takes every touch on it at once, so writing never scrolls the
card or swipes to rate. Characters without a stroke order (in a word) are
written for the person.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-09 15:59:40 +02:00
@ override
String get studySettingsCharacters = > ' Kanji & Kana ' ;
@ override
String get studySettingsWriteByHand = > ' Von Hand schreiben ' ;
@ override
String get studySettingsWriteByHandDescription = >
' Kanji, Kana und Wörter schreibst du Strich für Strich, jeder Strich wird gleich geprüft, nach einem eigenen Plan. Geschriebene Wörter werden weder abgefragt noch getippt. ' ;
@ override
String get writingHint = > ' Tipp ' ;
@ override
String get writingShow = > ' Zeigen ' ;
@ override
String writingMistakes ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Fehler ' ,
one: ' 1 Fehler ' ,
zero: ' Keine Fehler ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String get writingWrongOrder = > ' Noch nicht: Dieser Strich kommt später. ' ;
@ override
String get writingWrong = > ' Das ist nicht der nächste Strich. ' ;
@ override
String writingSuggested ( String rating ) {
return ' $ rating vorgeschlagen ' ;
}
@ override
String get writingNoStrokes = >
' Für diese Schriftzeichen gibt es keine Strichfolge: Bewerte, wie gut du sie wusstest. ' ;
feat(app): the dictionary in the app: look words up, add them as cards
A studyset's dictionary follows from its language, as decided: the
instance's dictionary of its front's language, with meanings in its
back's (else English). Nothing to attach or detach; nothing of it shows
where there is none.
- Add material › From the dictionary: search a word (kanji, kana,
romaji, meaning) and add it as a flashcard, or add a whole level
(JLPT N5…N1, common words) at once, asked first above 500 words, its
progress shown. Words already in the studyset show as such and are
left out. Each card is a vocabulary card (headword, reading, senses
with their codes), tagged `jlpt-n5` and with its word class, and
marked as imported from the dictionary.
- Look up beside a vocabulary card's front fills the card with the word
chosen, keeping its hints, explanation and tags.
- A card keeps the dictionary entry it was made from (card schema 6:
`dictionary` {source, id}), to be found again and not added twice.
- The dictionary's credits show at its foot and in About, as its licence
asks.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-09 01:33:12 +02:00
@ override
String get aboutDictionaries = > ' Wörterbücher dieser Instanz ' ;
2026-10-07 21:31:48 +02:00
@ override
2026-10-09 16:05:05 +02:00
String get aboutAppData = > ' Daten in der App ' ;
@ override
2026-10-07 21:31:48 +02:00
String get cardReportTitle = > ' Fehler melden ' ;
@ override
String get cardReportSubtitle = >
' Markiere diese Karte, um sie später zu finden und zu korrigieren. ' ;
@ override
String get cardReportTypo = > ' Tippfehler ' ;
@ override
String get cardReportGrammar = > ' Grammatik ' ;
@ override
String get cardReportContent = > ' Inhalt ' ;
@ override
String get cardReportOther = > ' Sonstiges ' ;
@ override
String get cardReportNote = > ' Notiz ' ;
@ override
String get cardReportNoteHint = > ' Was muss korrigiert werden? ' ;
@ override
String get cardReportSubmit = > ' Melden ' ;
@ override
String get cardReported = > ' Zur Korrektur markiert ' ;
@ override
String get cardResolveReport = > ' Meldung erledigen ' ;
@ override
String get cardReportResolved = > ' Meldung erledigt ' ;
@ override
String get cardBuriedBadge = > ' Zurückgestellt ' ;
@ override
String get cardUnbury = > ' Zurückstellung aufheben ' ;
@ override
String get cardTileBuried = > ' Karteikarte bis morgen zurückgestellt ' ;
@ override
String get cardTileUnburied = > ' Karteikarte nicht mehr zurückgestellt ' ;
2026-10-07 21:52:03 +02:00
@ override
String get cardDeleteTitle = > ' Karteikarte löschen? ' ;
@ override
String get cardDeleteMessage = >
' Diese Karteikarte wird aus dem Lernset entfernt. Du kannst dies für einige Sekunden rückgängig machen. ' ;
@ override
String get cardDeleted = > ' Karteikarte gelöscht ' ;
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
@ override
String get cardFilterTooltip = > ' Filter ' ;
@ override
String get cardFilterTitle = > ' Filter ' ;
@ override
String get cardFilterTag = > ' Tag ' ;
@ override
String get cardFilterAllTags = > ' Alle Tags ' ;
@ override
String get cardFilterNoTags = >
' Keine dieser Karteikarten hat bisher einen Tag. ' ;
@ override
String get cardFilterClear = > ' Alles zurücksetzen ' ;
@ override
String get cardFilterApply = > ' Anwenden ' ;
@ override
String get cardFilterNothing = > ' Keine Karteikarte hat diesen Tag. ' ;
@ override
String get cardListFailed = > ' Die Karten konnten nicht gelesen werden. ' ;
@ override
String get cardListMore = > ' Mehr ' ;
@ override
String get cardListManageTags = > ' Tags verwalten ' ;
@ override
String get composerTitle = > ' Karteikarten erstellen ' ;
@ override
String composerTitleFor ( String title ) {
return ' Karteikarten erstellen für „ $ title “ ' ;
}
@ override
String get composerEditTitle = > ' Karteikarten bearbeiten ' ;
@ override
String composerEditTitleFor ( String title ) {
return ' Karteikarten bearbeiten in „ $ title “ ' ;
}
@ override
String get composerSaving = > ' Wird gespeichert… ' ;
@ override
String get composerSaveFailed = >
' Speichern fehlgeschlagen – erneut versuchen ' ;
@ override
String get composerAllSaved = > ' Alle Änderungen gespeichert ' ;
@ override
String get composerNewFlashcard = > ' Neue Karteikarte ' ;
@ override
String get composerCollapseStack = > ' Stapel einklappen ' ;
@ override
String get composerExpandStack = > ' Stapel ausklappen ' ;
@ override
String get composerStatusSaving = > ' Wird gespeichert ' ;
@ override
String get composerStatusSaved = > ' Gespeichert ' ;
@ override
String get composerStatusFailed = > ' Speichern fehlgeschlagen ' ;
@ override
String get composerSaveFailedInline = > ' Speichern fehlgeschlagen. ' ;
@ override
String get composerRetry = > ' Erneut versuchen ' ;
@ override
String get composerEmptyPane = > ' Füge eine Karteikarte hinzu, um loszulegen. ' ;
@ override
String get composerKindFlashcard = > ' Karteikarte ' ;
@ override
String get composerKindVocabulary = > ' Vokabel ' ;
@ override
String get composerKindMatching = > ' Zuordnung ' ;
@ override
String get composerKindMap = > ' Landkarte ' ;
2026-10-09 15:00:21 +02:00
@ override
String get composerKindCharacter = > ' Schriftzeichen ' ;
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
@ override
String get composerLabelFront = > ' Vorderseite ' ;
@ override
String get composerLabelQuestion = > ' Frage ' ;
@ override
String get composerLabelExpression = > ' Ausdruck ' ;
@ override
String get composerLabelPrompt = > ' Aufgabe ' ;
2026-10-09 15:00:21 +02:00
@ override
String get composerLabelCharacter = > ' Schriftzeichen ' ;
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
@ override
String get composerLabelBack = > ' Rückseite ' ;
@ override
String get composerLabelAnswers = > ' Antworten ' ;
@ override
String get composerLabelAnswer = > ' Antwort ' ;
@ override
String get composerPlaceholderFront = > ' Frage hinzufügen ' ;
@ override
String get composerPlaceholderExpression = > ' Ausdruck hinzufügen ' ;
@ override
String get composerPlaceholderPrompt = > ' Aufgabe hinzufügen ' ;
2026-10-09 15:00:21 +02:00
@ override
String get composerPlaceholderCharacter = > ' Kanji oder Kana hinzufügen ' ;
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
@ override
String get composerAddAnswer = > ' Antwort hinzufügen ' ;
@ override
String get composerCorrectAnswer = > ' Richtige Antwort ' ;
@ override
String get composerWrongAnswer = > ' Falsche Antwort ' ;
@ override
String get composerRemoveAnswer = > ' Antwort entfernen ' ;
@ override
String composerPin ( String field ) {
return ' $ field anheften: für die nächste Karte behalten ' ;
}
@ override
String composerUnpin ( String field ) {
return ' $ field nicht mehr anheften: für die nächste Karte leeren ' ;
}
@ override
String get composerTags = > ' Tags ' ;
@ override
String get composerAddTags = > ' Tags hinzufügen ' ;
@ override
String get composerMoreActions = > ' Weitere Aktionen ' ;
@ override
String get composerDuplicate = > ' Duplizieren ' ;
@ override
String get composerClearFields = > ' Felder leeren ' ;
@ override
String get composerDelete = > ' Löschen ' ;
@ override
String get composerDeleteTitle = > ' Diese Karteikarte löschen? ' ;
@ override
String get composerDeleteDraftMessage = >
' Der Entwurf wird aus dieser Sitzung entfernt. Er wurde noch nicht gespeichert. ' ;
@ override
String get composerDeleteSavedMessage = >
' Die Karteikarte wird auf all deinen Geräten aus dem Lernset entfernt. ' ;
@ override
String composerDiscardTitle ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' Nicht gespeicherte Karteikarten verwerfen? ' ,
one: ' Nicht gespeicherte Karteikarte verwerfen? ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String composerDiscardMessage ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other:
' $ count Karteikarten wurden noch nicht gespeichert. Wenn du jetzt gehst, werden sie verworfen. ' ,
one: ' 1 Karteikarte wurde noch nicht gespeichert. Wenn du jetzt gehst, wird sie verworfen. ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String get composerDiscardConfirm = > ' Verwerfen ' ;
@ override
String get composerConflict = >
feat: a dictionary's corrections reach the cards made from it, by offer
Every dictionary entry now has a version: 16 hex digits of the SHA-256 of
what cards take of it (headword, reading, entry), made by the loader and
carried on every hit. A card keeps the version it took (card schema 8).
DictionaryEndpoint.changed returns, of the entries named with the
versions cards keep (1,000 at most a call; the app asks 500 at a time),
those whose version is another now.
The card browser says how many cards are behind their dictionary and takes
the corrections at a tap (decided 2026-10-09: by offer, never by
themselves). Taking one writes the entry as it is now over the revision
in which the card last took it, beside whatever came after, so the
revisions merge per side as two devices' edits do (ADR 0003): a side only
the dictionary changed takes the correction, a side the person changed
too is a conflict settled in the composer, whose words now name that
case. Cards made before versions are never offered one.
The server rereads its dictionary folder hourly now, not daily: the
dictionaries service fills its volume after an instance's first start,
and an hour with nothing changed costs a hash of each file.
Migration 20261009145434785-dictionary-entry-version: adds
dictionary_entry.version, text NOT NULL DEFAULT '' (rows loaded before
have none and are never reported as corrected), and by hand empties
dictionary_source."fileHash", so every source loads once more and its
entries get their versions; the schema stays as definition.sql says. The
old server goes on working until the switch.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-09 17:32:00 +02:00
' Diese Karteikarte wurde auf zwei Arten zugleich geändert: auf zwei deiner Geräte oder von dir und durch eine Korrektur im Wörterbuch. Wähle unten für jeden Teil die Version, die du behalten möchtest. ' ;
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
@ override
String get composerKeepThis = > ' Diese behalten ' ;
@ override
String get formatAlignLeft = > ' Linksbündig ' ;
@ override
String get formatAlignCenter = > ' Zentriert ' ;
@ override
String get formatAlignRight = > ' Rechtsbündig ' ;
@ override
String get formatBold = > ' Fett ' ;
@ override
String get formatItalic = > ' Kursiv ' ;
@ override
String get formatUnderline = > ' Unterstrichen ' ;
@ override
String get formatSuperscript = > ' Hochgestellt ' ;
@ override
String get formatSubscript = > ' Tiefgestellt ' ;
feat(app): furigana in rich text
Text within a line can carry its reading now (`ruby` on the text's
attributes, `かんじ` on `漢字`), word by word, in lessons, example
sentences, notes and cards alike. Shown, the reading sits above the text,
smaller and centred, the text level with the line around it; while
editing, the text is dotted underneath and the caret moves through it as
text, as with formulas. The format bar's Furigana asks for the reading of
the text selected, starting from the one it has, and takes it away.
An Anki field's `<ruby>` keeps its reading as furigana now, each base its
own, instead of "漢(かん)"; Anki's `漢字[かんじ]` stays as written, as
telling it apart from other brackets is guesswork. The Markdown export
writes furigana as HTML's `<ruby>漢字<rt>かんじ</rt></ruby>`.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-09 01:51:28 +02:00
@ override
String get formatRuby = > ' Furigana (eine Lesung über dem Text) ' ;
@ override
String get rubyTitle = > ' Furigana ' ;
@ override
String get rubyReading = > ' Lesung ' ;
@ override
String get rubyReadingHint = > ' In Kana, z. B. かんじ ' ;
@ override
String get rubySave = > ' Speichern ' ;
@ override
String get rubyRemove = > ' Entfernen ' ;
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
@ override
String get vocabularyReading = > ' Lesung ' ;
@ override
String get vocabularyReadingHint = > ' Kana-Lesung ' ;
@ override
String get vocabularyMeanings = > ' Bedeutungen ' ;
@ override
String get vocabularyPrimaryMeaningHint = > ' Hauptbedeutung ' ;
@ override
String get vocabularyMeaningHint = > ' Bedeutung ' ;
@ override
String get vocabularyAddMeaning = > ' Bedeutung hinzufügen ' ;
@ override
String get vocabularyRemoveMeaning = > ' Bedeutung entfernen ' ;
2026-10-07 21:38:41 +02:00
@ override
String get vocabularyGlossHint = > ' Übersetzung ' ;
@ override
String get vocabularyAddGloss = > ' Übersetzung hinzufügen ' ;
@ override
String get vocabularyRemoveGloss = > ' Übersetzung entfernen ' ;
@ override
String get vocabularyAddSense = > ' Wortbedeutung hinzufügen ' ;
@ override
String get vocabularyRemoveSense = > ' Wortbedeutung entfernen ' ;
2026-10-09 15:00:21 +02:00
@ override
String get characterPrimaryMeaningHint = >
' Hauptbedeutung, bei Kana die Umschrift ' ;
@ override
String get characterOnReadings = > ' On-Lesungen ' ;
@ override
String get characterOnReadingsHint = >
' Aus dem Chinesischen, in Katakana: ショク、ジキ ' ;
@ override
String get characterKunReadings = > ' Kun-Lesungen ' ;
@ override
String get characterKunReadingsHint = >
' Japanisch, in Hiragana, Okurigana nach einem Punkt: た.べる ' ;
@ override
String get characterOn = > ' On ' ;
@ override
String get characterKun = > ' Kun ' ;
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
@ override
String get matchingCategories = > ' Kategorien ' ;
@ override
String get matchingCategoriesHint = >
' Die Ablagekarten, auf die Lernende Elemente ziehen. Jede Kategorie braucht mindestens ein Element, daher kann eine Karte nicht mehr Kategorien als Elemente haben. ' ;
@ override
String matchingCategory ( int number ) {
return ' Kategorie $ number ' ;
}
@ override
String get matchingAddCategory = > ' Kategorie hinzufügen ' ;
@ override
String get matchingAddCategoryBlocked = >
' Füge zuerst ein Element hinzu: Eine Karte kann nicht mehr Kategorien als Elemente haben ' ;
@ override
String get matchingRemoveCategory = > ' Kategorie entfernen ' ;
@ override
String get matchingMinCategories = > ' Mindestens zwei Kategorien erforderlich ' ;
@ override
String get matchingItems = > ' Elemente ' ;
@ override
String get matchingItemsHint = >
' Die ziehbaren Elemente. Ordne jedes Element seiner richtigen Kategorie zu: Ein nicht zugeordnetes Element kann nie richtig platziert werden. ' ;
@ override
String matchingItem ( int number ) {
return ' Element $ number ' ;
}
@ override
String get matchingAddItem = > ' Element hinzufügen ' ;
@ override
String get matchingUnassigned = > ' Nicht zugeordnet ' ;
@ override
String get matchingRemoveItem = > ' Element entfernen ' ;
@ override
String get matchingMinItems = > ' Mindestens zwei Elemente erforderlich ' ;
@ override
String get cardTileOptions = > ' Optionen ' ;
@ override
String get cardTileEdit = > ' Bearbeiten ' ;
@ override
String get cardTileDelete = > ' Löschen ' ;
@ override
String get cardTileUntitled = > ' Unbenannt ' ;
@ override
String get cardTileConflict = > ' Auf zwei Geräten geändert ' ;
@ override
String get studyClose = > ' Sitzung schließen ' ;
2026-10-07 22:03:27 +02:00
@ override
String get studyReviewsDueTitle = > ' Fällige Wiederholungen ' ;
@ override
String studyReviewsDueBody ( int reviews , int news ) {
String _temp0 = intl . Intl . pluralLogic (
reviews ,
locale: localeName ,
other: ' $ reviews Karten sind ' ,
one: ' 1 Karte ist ' ,
) ;
String _temp1 = intl . Intl . pluralLogic (
news ,
locale: localeName ,
other: ' Wenn du jetzt $ news neue Karten lernst ' ,
one: ' Wenn du jetzt 1 neue Karte lernst ' ,
) ;
return ' $ _temp0 zur Wiederholung fällig. $ _temp1 , erhöht das deine Wiederholungslast. ' ;
}
@ override
String get studyReviewsDueAllTagsNote = >
' „Zuerst wiederholen“ arbeitet den gesamten Rückstand über alle Tags hinweg ab – dein Tag-Filter greift erst wieder, wenn er abgebaut ist. ' ;
@ override
String get studyReviewFirst = > ' Zuerst wiederholen ' ;
@ override
String get studyLearnAnyway = > ' Trotzdem lernen ' ;
@ override
String get studySettingsTagFilterPausedForBacklog = >
' Diese Sitzung arbeitet deinen Wiederholungsrückstand über alle Tags hinweg ab, deshalb schränken diese Tags sie nicht ein. Ab der nächsten Sitzung greifen sie wieder. ' ;
2026-10-07 21:15:51 +02:00
@ override
String get studyBuryCard = > ' Bis morgen zurückstellen ' ;
@ override
String get studyCardBuried = > ' Karte bis morgen zurückgestellt ' ;
2026-10-07 21:06:58 +02:00
@ override
2026-10-07 22:30:44 +02:00
String get studyUndo = > ' Rückgängig machen ' ;
2026-10-07 21:06:58 +02:00
@ override
String get studyLockScreen = > ' Bildschirm sperren ' ;
@ override
String get studyUnlock = > ' Entsperren ' ;
@ override
String get studyTapToUnlock = > ' Zum Entsperren tippen ' ;
2026-10-07 21:00:42 +02:00
@ override
String get studyLoadFailed = > ' Diese Sitzung konnte nicht gelesen werden. ' ;
@ override
String get studyRatingFailed = >
' Deine Bewertung konnte nicht gespeichert werden. Bewerte die Karte noch einmal. ' ;
@ override
String get studyRetry = > ' Erneut versuchen ' ;
@ override
String get studyScopeTitle = > ' Lernumfang ' ;
@ override
String get studyScopeDescription = >
' Dieses Lernset hat Unter-Lernsets. Wähle, welche Karten wiederholt werden sollen. ' ;
@ override
String get studyScopeEverythingTitle = > ' Alles ' ;
@ override
String get studyScopeEverythingSubtitle = >
' Dieses Lernset und alle Unter-Lernsets ' ;
@ override
String get studyScopeSelfTitle = > ' Nur dieses Lernset ' ;
@ override
String get studyScopeSelfSubtitle = > ' Karten in Unter-Lernsets überspringen ' ;
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
@ override
String get studyBackFirstOn = >
' Rückseite der Karten wird zuerst gezeigt: tippe zum Zurückschalten ' ;
@ override
String get studyBackFirstOff = > ' Rückseite der Karten zuerst zeigen ' ;
@ override
String get studyShowAnswer = > ' Antwort anzeigen ' ;
@ override
String get studyCheck = > ' Prüfen ' ;
feat(app): study with faces on the ratings, centred cards and the session's figures
The study session, reworked:
- Ratings are coloured tiles with a face each (frown, meh, smile,
laugh), when the card comes back below them with a clock ("in 1
min", "in 3 days"), always shown, so a card can be rated without
revealing it; at most 540 dp wide, centred.
- Cards are centred in a section card: the question large, then a line
with 24 dp on either side and the answer a size smaller, or "Show
answer" 40 dp below; a tap anywhere on the card shows or hides the
answer. Read-only rich text takes a text style and an alignment.
- Words show their reading small above the expression once answered,
and several meanings numbered.
- Choice, matching and map cards: Check below the card, the ratings in
its place once checked; options marked before their text; matching
lists the categories first, then what is left to place; the map
fills the card with one caption below it.
- Header and progress on a band of their own; title start-aligned,
the Pomodoro timer only to watch, the back-first toggle in every
state; leaving a round under way asks first.
- Cramming goes round the round; back is there with two cards or more,
skipping always.
- The end of a round: the cards done of those due, accuracy (OK counts
half) and time, over the whole session.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 17:40:32 +02:00
@ override
String get studySelectAll = > ' Wähle alle zutreffenden aus ' ;
@ override
String get studySelectOne = > ' Wähle die richtige Antwort ' ;
@ override
String get studyMatchingInstructions = > ' AUF DIE KARTEN OBEN ZIEHEN ' ;
@ override
String get studyMatchingAllPlaced = > ' Alle platziert ' ;
@ override
String get studyMatchingDropHere = > ' Hier ablegen ' ;
@ override
String get studyMapTapPrompt = > ' Tippe auf eine Region, um zu antworten ' ;
@ override
String studyMapSelected ( String label ) {
return ' Ausgewählt: $ label ' ;
}
@ override
String get studyCorrect = > ' Richtig ' ;
@ override
String studyCorrectLabel ( String label ) {
return ' Richtig — $ label ' ;
}
@ override
String studyMapAnswer ( String answer ) {
return ' Antwort: $ answer ' ;
}
@ override
String studyMapPickedAnswer ( String picked , String answer ) {
return ' Du hast $ picked gewählt · Antwort: $ answer ' ;
}
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
@ override
String get studyRatingBad = > ' Schlecht ' ;
@ override
String get studyRatingOk = > ' OK ' ;
@ override
String get studyRatingGood = > ' Gut ' ;
@ override
String get studyRatingPerfect = > ' Perfekt ' ;
@ override
String get studyNothingTitle = > ' Gerade nichts zu lernen ' ;
@ override
String get studyNothingBody = >
' Komm später wieder, wenn mehr Karten fällig sind. ' ;
@ override
String studyNextDue ( String interval ) {
return ' Bis zur nächsten fälligen Karte: $ interval . ' ;
}
@ override
String get studyDone = > ' Fertig ' ;
@ override
feat(app): study with faces on the ratings, centred cards and the session's figures
The study session, reworked:
- Ratings are coloured tiles with a face each (frown, meh, smile,
laugh), when the card comes back below them with a clock ("in 1
min", "in 3 days"), always shown, so a card can be rated without
revealing it; at most 540 dp wide, centred.
- Cards are centred in a section card: the question large, then a line
with 24 dp on either side and the answer a size smaller, or "Show
answer" 40 dp below; a tap anywhere on the card shows or hides the
answer. Read-only rich text takes a text style and an alignment.
- Words show their reading small above the expression once answered,
and several meanings numbered.
- Choice, matching and map cards: Check below the card, the ratings in
its place once checked; options marked before their text; matching
lists the categories first, then what is left to place; the map
fills the card with one caption below it.
- Header and progress on a band of their own; title start-aligned,
the Pomodoro timer only to watch, the back-first toggle in every
state; leaving a round under way asks first.
- Cramming goes round the round; back is there with two cards or more,
skipping always.
- The end of a round: the cards done of those due, accuracy (OK counts
half) and time, over the whole session.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 17:40:32 +02:00
String get studySessionComplete = > ' Sitzung abgeschlossen ' ;
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
@ override
feat(app): study with faces on the ratings, centred cards and the session's figures
The study session, reworked:
- Ratings are coloured tiles with a face each (frown, meh, smile,
laugh), when the card comes back below them with a clock ("in 1
min", "in 3 days"), always shown, so a card can be rated without
revealing it; at most 540 dp wide, centred.
- Cards are centred in a section card: the question large, then a line
with 24 dp on either side and the answer a size smaller, or "Show
answer" 40 dp below; a tap anywhere on the card shows or hides the
answer. Read-only rich text takes a text style and an alignment.
- Words show their reading small above the expression once answered,
and several meanings numbered.
- Choice, matching and map cards: Check below the card, the ratings in
its place once checked; options marked before their text; matching
lists the categories first, then what is left to place; the map
fills the card with one caption below it.
- Header and progress on a band of their own; title start-aligned,
the Pomodoro timer only to watch, the back-first toggle in every
state; leaving a round under way asks first.
- Cramming goes round the round; back is there with two cards or more,
skipping always.
- The end of a round: the cards done of those due, accuracy (OK counts
half) and time, over the whole session.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 17:40:32 +02:00
String studyProgressReviewed ( int reviewed , int total ) {
return ' $ reviewed / $ total wiederholt ' ;
}
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
@ override
feat(app): study with faces on the ratings, centred cards and the session's figures
The study session, reworked:
- Ratings are coloured tiles with a face each (frown, meh, smile,
laugh), when the card comes back below them with a clock ("in 1
min", "in 3 days"), always shown, so a card can be rated without
revealing it; at most 540 dp wide, centred.
- Cards are centred in a section card: the question large, then a line
with 24 dp on either side and the answer a size smaller, or "Show
answer" 40 dp below; a tap anywhere on the card shows or hides the
answer. Read-only rich text takes a text style and an alignment.
- Words show their reading small above the expression once answered,
and several meanings numbered.
- Choice, matching and map cards: Check below the card, the ratings in
its place once checked; options marked before their text; matching
lists the categories first, then what is left to place; the map
fills the card with one caption below it.
- Header and progress on a band of their own; title start-aligned,
the Pomodoro timer only to watch, the back-first toggle in every
state; leaving a round under way asks first.
- Cramming goes round the round; back is there with two cards or more,
skipping always.
- The end of a round: the cards done of those due, accuracy (OK counts
half) and time, over the whole session.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 17:40:32 +02:00
String studyReviewedCount ( int reviewed ) {
return ' $ reviewed wiederholt ' ;
}
@ override
String get studyStatCards = > ' Karten ' ;
@ override
String get studyStatAccuracy = > ' Genauigkeit ' ;
@ override
String get studyStatTime = > ' Zeit ' ;
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
@ override
feat(app): study with faces on the ratings, centred cards and the session's figures
The study session, reworked:
- Ratings are coloured tiles with a face each (frown, meh, smile,
laugh), when the card comes back below them with a clock ("in 1
min", "in 3 days"), always shown, so a card can be rated without
revealing it; at most 540 dp wide, centred.
- Cards are centred in a section card: the question large, then a line
with 24 dp on either side and the answer a size smaller, or "Show
answer" 40 dp below; a tap anywhere on the card shows or hides the
answer. Read-only rich text takes a text style and an alignment.
- Words show their reading small above the expression once answered,
and several meanings numbered.
- Choice, matching and map cards: Check below the card, the ratings in
its place once checked; options marked before their text; matching
lists the categories first, then what is left to place; the map
fills the card with one caption below it.
- Header and progress on a band of their own; title start-aligned,
the Pomodoro timer only to watch, the back-first toggle in every
state; leaving a round under way asks first.
- Cramming goes round the round; back is there with two cards or more,
skipping always.
- The end of a round: the cards done of those due, accuracy (OK counts
half) and time, over the whole session.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 17:40:32 +02:00
String studyDurationSec ( int sec ) {
return ' $ sec Sek. ' ;
}
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
@ override
feat(app): study with faces on the ratings, centred cards and the session's figures
The study session, reworked:
- Ratings are coloured tiles with a face each (frown, meh, smile,
laugh), when the card comes back below them with a clock ("in 1
min", "in 3 days"), always shown, so a card can be rated without
revealing it; at most 540 dp wide, centred.
- Cards are centred in a section card: the question large, then a line
with 24 dp on either side and the answer a size smaller, or "Show
answer" 40 dp below; a tap anywhere on the card shows or hides the
answer. Read-only rich text takes a text style and an alignment.
- Words show their reading small above the expression once answered,
and several meanings numbered.
- Choice, matching and map cards: Check below the card, the ratings in
its place once checked; options marked before their text; matching
lists the categories first, then what is left to place; the map
fills the card with one caption below it.
- Header and progress on a band of their own; title start-aligned,
the Pomodoro timer only to watch, the back-first toggle in every
state; leaving a round under way asks first.
- Cramming goes round the round; back is there with two cards or more,
skipping always.
- The end of a round: the cards done of those due, accuracy (OK counts
half) and time, over the whole session.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 17:40:32 +02:00
String studyDurationMin ( int min ) {
return ' $ min Min. ' ;
}
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
@ override
feat(app): study with faces on the ratings, centred cards and the session's figures
The study session, reworked:
- Ratings are coloured tiles with a face each (frown, meh, smile,
laugh), when the card comes back below them with a clock ("in 1
min", "in 3 days"), always shown, so a card can be rated without
revealing it; at most 540 dp wide, centred.
- Cards are centred in a section card: the question large, then a line
with 24 dp on either side and the answer a size smaller, or "Show
answer" 40 dp below; a tap anywhere on the card shows or hides the
answer. Read-only rich text takes a text style and an alignment.
- Words show their reading small above the expression once answered,
and several meanings numbered.
- Choice, matching and map cards: Check below the card, the ratings in
its place once checked; options marked before their text; matching
lists the categories first, then what is left to place; the map
fills the card with one caption below it.
- Header and progress on a band of their own; title start-aligned,
the Pomodoro timer only to watch, the back-first toggle in every
state; leaving a round under way asks first.
- Cramming goes round the round; back is there with two cards or more,
skipping always.
- The end of a round: the cards done of those due, accuracy (OK counts
half) and time, over the whole session.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 17:40:32 +02:00
String studyDurationMinSec ( int min , int sec ) {
return ' $ min Min. $ sec Sek. ' ;
}
@ override
String get studyLeaveTitle = > ' Diese Lernsitzung verlassen? ' ;
@ override
String studyLeaveRated ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other:
' Deine bisherigen Bewertungen sind gespeichert, aber die $ count noch verbleibenden Karten in dieser Runde werden verworfen, wenn du jetzt gehst. ' ,
one: ' Deine bisherigen Bewertungen sind gespeichert, aber die letzte Karte in dieser Runde wird verworfen, wenn du jetzt gehst. ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String studyLeaveUnrated ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other:
' Du hast noch keine der $ count Karten in dieser Runde bewertet — beim Verlassen endet die Sitzung, ohne Fortschritt dafür zu speichern. ' ,
one: ' Du hast diese Karte noch nicht bewertet — beim Verlassen endet die Sitzung, ohne Fortschritt für diese Runde zu speichern. ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String get studyLeaveConfirm = > ' Verlassen ' ;
@ override
String get studyKeepStudying = > ' Weiter lernen ' ;
@ override
String studyInMinutes ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' in $ count Min. ' ,
one: ' in 1 Min. ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String studyInHours ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' in $ count Stunden ' ,
one: ' in 1 Stunde ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String studyInDays ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' in $ count Tagen ' ,
one: ' in 1 Tag ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String studyInMonths ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' in $ count Monaten ' ,
one: ' in 1 Monat ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String studyInYears ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' in $ count Jahren ' ,
one: ' in 1 Jahr ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String get studyContinue = > ' Weiterlernen ' ;
@ override
String get studyPrevious = > ' Vorherige Karte ' ;
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
@ override
feat(app): study with faces on the ratings, centred cards and the session's figures
The study session, reworked:
- Ratings are coloured tiles with a face each (frown, meh, smile,
laugh), when the card comes back below them with a clock ("in 1
min", "in 3 days"), always shown, so a card can be rated without
revealing it; at most 540 dp wide, centred.
- Cards are centred in a section card: the question large, then a line
with 24 dp on either side and the answer a size smaller, or "Show
answer" 40 dp below; a tap anywhere on the card shows or hides the
answer. Read-only rich text takes a text style and an alignment.
- Words show their reading small above the expression once answered,
and several meanings numbered.
- Choice, matching and map cards: Check below the card, the ratings in
its place once checked; options marked before their text; matching
lists the categories first, then what is left to place; the map
fills the card with one caption below it.
- Header and progress on a band of their own; title start-aligned,
the Pomodoro timer only to watch, the back-first toggle in every
state; leaving a round under way asks first.
- Cramming goes round the round; back is there with two cards or more,
skipping always.
- The end of a round: the cards done of those due, accuracy (OK counts
half) and time, over the whole session.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 17:40:32 +02:00
String get studySkipCard = > ' Karte überspringen ' ;
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
@ override
String studyMinutes ( int count ) {
return ' $ count Min. ' ;
}
@ override
String studyHours ( int count ) {
return ' $ count Std. ' ;
}
@ override
String studyDays ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Tage ' ,
one: ' 1 Tag ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String studyMonths ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Monate ' ,
one: ' 1 Monat ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String studyYears ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Jahre ' ,
one: ' 1 Jahr ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String studyFilteredBy ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' Eingegrenzt durch $ count Tag-Filter ' ,
one: ' Eingegrenzt durch 1 Tag-Filter ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String get studySettingsCardsPerRound = > ' Karten pro Runde ' ;
@ override
String get studySettingsNewPerDay = > ' Neue Karten pro Tag ' ;
@ override
String get studySettingsNewPerDayHint = >
feat(app): the library's options move, import into and set how a studyset is studied
A studyset's options in the library now offer, as on its own screen,
Edit, Move to…, Study options, Import from Anki, Archive and Delete.
Moving goes through the same sheet and says where the studyset went;
importing reads an Anki deck into it as Add material does.
Study options say how a studyset is studied, on every device: how many
new cards it starts a day (by default as the person's study settings
say), how many reviews it brings a day (no limit by default; cards in
their learning steps come anyway), and whether reviews or new cards
come first, or the new ones spread evenly among the reviews. They live
in the studyset's payload, schema 3; a studyset without them is still
written in schema 2, so that older apps, which skip a payload in a
newer schema whole, keep seeing every studyset nobody gave options.
Editing a studyset keeps its options, and Reset to defaults takes them
away.
The study queue takes each studyset's limits for its own cards and the
order of the studyset studied; a card's schedule now knows when it was
last reviewed, to count the reviews of the day. Sessions, the round's
end and the library's badges all count the same way, the badges now
with the person's own number of new cards a day too.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 02:18:42 +02:00
' Wie viele noch nie gelernte Karten jedes Lernset pro Tag neu beginnt, sofern seine eigenen Lernoptionen nichts anderes sagen. ' ;
@ override
String get studyOptionsTitle = > ' Lernoptionen ' ;
@ override
String get studyOptionsDescription = >
' Wie viele Karten dieses Lernset pro Tag bringt und welche zuerst kommen, auf all deinen Geräten. Die Lernsets darin behalten ihre eigenen. ' ;
@ override
String get studyOptionsReviewsPerDay = > ' Wiederholungen pro Tag ' ;
@ override
String get studyOptionsOrder = > ' Reihenfolge ' ;
@ override
String get studyOptionsReviewsFirst = > ' Wiederholungen zuerst ' ;
@ override
String get studyOptionsMixed = > ' Gemischt ' ;
@ override
String get studyOptionsNewFirst = > ' Neue zuerst ' ;
@ override
String get studyOptionsReset = > ' Standard wiederherstellen ' ;
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
@ override
String get studySettingsUnlimited = > ' Unbegrenzt ' ;
@ override
String get studySettingsSortBy = > ' Sortieren nach ' ;
@ override
String get studySettingsLearnMode = > ' Lernmodus ' ;
@ override
String get studyModeSpaced = > ' Verteilte Wiederholung ' ;
@ override
String get studyModeSpacedHint = >
' Fällige Karten nach ihrem Zeitplan; Bewertungen verschieben sie. ' ;
@ override
String get studyModeCram = > ' Pauken ' ;
@ override
String get studyModeCramHint = >
' Geh jede Karte durch, ohne die Zeitpläne zu ändern. ' ;
2026-10-07 21:57:04 +02:00
@ override
String get studySettingsVocabulary = > ' Vokabeln ' ;
@ override
String get studySettingsQuizMc = > ' Als Multiple-Choice abfragen ' ;
@ override
String get studySettingsQuizMcDescription = >
' Zeige Vokabelkarten als Multiple-Choice-Frage, mit falschen Antworten aus anderen Vokabeln in diesem Set. ' ;
feat(app): type a word's reading while studying
A new study option, Type the reading (settings schema 6, beside the
vocabulary quiz; turning one on turns the other off): a word with kanji
shows alone, and its reading is typed, in kana; romaji turn into kana as
they are typed (doubled consonants, n before a consonant, nn and n'), and
the device's own Japanese input works as it does. Check, or Enter, says
whether it was right (katakana counts as hiragana) and what was typed
beside the reading, then shows the meanings and the ratings; the person
still rates, as Anki's typed answers have it. A word written in kana, one
usually written so, and a card asked back first flip as before.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-09 02:09:10 +02:00
@ override
String get studySettingsTypeReading = > ' Lesung eintippen ' ;
@ override
String get studySettingsTypeReadingDescription = >
' Wörter mit Kanji fragen nach ihrer Lesung, in Kana getippt; Romaji werden beim Tippen zu Kana. ' ;
@ override
String get studyTypedHint = > ' Die Lesung, in Kana oder Romaji ' ;
@ override
String get studyTypedRight = > ' Richtig ' ;
@ override
String studyTypedWrong ( String answer ) {
return ' Du hast $ answer getippt ' ;
}
2026-10-07 21:57:04 +02:00
@ override
String get studyAspectMeaning = > ' Bedeutung ' ;
@ override
String get studyAspectReading = > ' Lesung ' ;
@ override
String get studyAspectExpression = > ' Ausdruck ' ;
@ override
String get studyAspectMixed = > ' Gemischt ' ;
@ override
String get studySettingsAspectDescription = >
' Was abgefragt wird — die Bedeutung, die Kana-Lesung oder der Ausdruck selbst (bei angezeigter Bedeutung). „Gemischt“ variiert Bedeutung und Lesung pro Karte; Karten, die nicht abgefragt werden können, bleiben ein normales Umdrehen. ' ;
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
@ override
String get studySortOldestFirst = > ' Älteste zuerst ' ;
@ override
String get studySortRandom = > ' Zufällig ' ;
@ override
String get studySortNewestFirst = > ' Neueste zuerst ' ;
@ override
feat(app): tag, edit, delete and swipe cards while studying, with tidier session sheets
- Above every studied card (but a matching one): the PDF it came from,
its tags on one line ("+2 tags" for the rest) or "Add tags", and a
menu to tag, edit or delete it; the session follows (an edited card
shows as saved, a deleted one leaves the round).
- On phones, a front/back or vocabulary card swiped right is rated
Good, left Bad; it tilts over the colour it heads for, and springs
back when let go early.
- The session's settings: "Settings", a 48 dp Save that warns mid-round
("Heads up!"), steppers in an outlined box ("20 / day", "5 / 50"),
the order in an outlined dropdown, the chosen tags with the rest
behind "Filter by tags" / "+3 more".
- A studyset's study options: Save above Reset to defaults, the
description small, reviews a day in steps of 25.
- One stepper look everywhere (study, Pomodoro profiles), its buttons
"Decrease" and "Increase".
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 18:13:32 +02:00
String get studyFewer = > ' Verringern ' ;
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
@ override
feat(app): tag, edit, delete and swipe cards while studying, with tidier session sheets
- Above every studied card (but a matching one): the PDF it came from,
its tags on one line ("+2 tags" for the rest) or "Add tags", and a
menu to tag, edit or delete it; the session follows (an edited card
shows as saved, a deleted one leaves the round).
- On phones, a front/back or vocabulary card swiped right is rated
Good, left Bad; it tilts over the colour it heads for, and springs
back when let go early.
- The session's settings: "Settings", a 48 dp Save that warns mid-round
("Heads up!"), steppers in an outlined box ("20 / day", "5 / 50"),
the order in an outlined dropdown, the chosen tags with the rest
behind "Filter by tags" / "+3 more".
- A studyset's study options: Save above Reset to defaults, the
description small, reviews a day in steps of 25.
- One stepper look everywhere (study, Pomodoro profiles), its buttons
"Decrease" and "Increase".
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 18:13:32 +02:00
String get studyMore = > ' Erhöhen ' ;
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
@ override
String get studysetMenuReset = > ' Fortschritt zurücksetzen ' ;
@ override
String get studysetResetTitle = > ' Fortschritt zurücksetzen? ' ;
@ override
String get studysetResetMessage = >
' Jede Karteikarte darin und in den enthaltenen Lernsets beginnt auf all deinen Geräten wieder als neu. Dein Lernverlauf bleibt erhalten. Du kannst dies für einige Sekunden rückgängig machen. ' ;
@ override
String get studysetResetConfirm = > ' Zurücksetzen ' ;
@ override
String get studysetResetDone = > ' Fortschritt zurückgesetzt ' ;
@ override
String get mapUnknown = >
' Diese Landkarte braucht eine neuere Version der App. ' ;
@ override
String get mapPickRegion = >
' Tippe auf die Region, die die Frage beantwortet; zoome mit zwei Fingern oder durch Scrollen. ' ;
@ override
String get mapNonePicked = > ' Noch keine Region gewählt ' ;
@ override
String get composerPlaceholderQuestion = > ' Frage hinzufügen ' ;
@ override
String get composerLabelRegion = > ' Antwort ' ;
@ override
String get homeStreakTooltip = > ' Lernserie ' ;
@ override
String get homeArrange = > ' Widgets anordnen ' ;
@ override
String get homeDone = > ' Fertig ' ;
@ override
String get homeDragToReorder = > ' Zum Umsortieren ziehen ' ;
@ override
String homeShowWidget ( String label ) {
return ' $ label anzeigen ' ;
}
@ override
String homeHideWidget ( String label ) {
return ' $ label ausblenden ' ;
}
@ override
String get homeAllHidden = > ' Alle Widgets sind ausgeblendet ' ;
@ override
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
String get homeAllHiddenBody = >
' Blende einige wieder ein, um dein Dashboard zu füllen. ' ;
@ override
String get homeCustomise = > ' Anpassen ' ;
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
@ override
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
String get homeWidgetGoal = > ' Tagesziel ' ;
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
@ override
String get homeWidgetWeek = > ' Wochenübersicht ' ;
@ override
String get homeWidgetActivity = > ' Aktivitäts-Heatmap ' ;
@ override
String get homeActivityTitle = > ' Deine Aktivität ' ;
@ override
String streakDays ( num count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Tage in Folge ' ,
one: ' 1 Tag in Folge ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String get streakStart = > ' Lerne heute, um deine Lernserie zu starten. ' ;
@ override
String get streakGrow = >
' Bleib dran: Lerne mindestens einmal am Tag, um deine Lernserie auszubauen. ' ;
@ override
String get streakFirstDay = >
' Wiederhole heute ein paar Karten, um den ersten Tag zu entfachen. ' ;
@ override
String get streakComeBack = >
' Komm morgen wieder, um deine Lernserie zu halten. ' ;
@ override
String get streakKeepAlive = >
' Lerne heute, um deine Lernserie am Leben zu halten. ' ;
@ override
String get goalEditTitle = > ' Lernziel bearbeiten ' ;
@ override
String get goalSetTitle = > ' Lernziel festlegen ' ;
@ override
String get goalDescriptionDaily = >
' Wiederhole jeden Tag eine bestimmte Anzahl Karteikarten. Jede Karte, die du bewertest, zählt. ' ;
@ override
String get goalDescriptionWeekly = >
' Wiederhole jede Woche ab Montag eine bestimmte Anzahl Karteikarten. Jede Karte, die du bewertest, zählt. ' ;
@ override
String get goalPeriod = > ' Zeitraum ' ;
@ override
String get goalPerDay = > ' Pro Tag ' ;
@ override
String get goalPerWeek = > ' Pro Woche ' ;
@ override
String get goalCardsPerDay = > ' Karten pro Tag ' ;
@ override
String get goalCardsPerWeek = > ' Karten pro Woche ' ;
@ override
String get goalSave = > ' Ziel speichern ' ;
@ override
String get goalRemove = > ' Ziel entfernen ' ;
@ override
String get goalEmptySubtitle = >
' Wiederhole jeden Tag oder jede Woche eine feste Anzahl Karten. ' ;
@ override
String get goalDailyHeadline = > ' Tagesziel ' ;
@ override
String get goalWeeklyHeadline = > ' Wochenziel ' ;
@ override
String goalProgressToday ( int reviewed , int target ) {
return ' $ reviewed von $ target Karten heute ' ;
}
@ override
String goalProgressThisWeek ( int reviewed , int target ) {
return ' $ reviewed von $ target Karten diese Woche ' ;
}
@ override
String get goalMet = > ' Ziel erreicht: gut gemacht! ' ;
@ override
String goalRemaining ( int count ) {
return ' Noch $ count ' ;
}
@ override
String get weekToday = > ' Heute ' ;
@ override
String get weekPreviousDay = > ' Vorheriger Tag ' ;
@ override
String get weekNextDay = > ' Nächster Tag ' ;
@ override
String get weekRestDay = > ' Ruhetag ' ;
@ override
String get heatmapLess = > ' Weniger ' ;
@ override
String get heatmapMore = > ' Mehr ' ;
@ override
String heatmapTotal ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Aktivitäten im letzten Jahr ' ,
one: ' 1 Aktivität im letzten Jahr ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String heatmapDay ( int count , String date ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Aktivitäten ' ,
one: ' 1 Aktivität ' ,
) ;
return ' $ _temp0 · $ date ' ;
}
@ override
String get commonCancel = > ' Abbrechen ' ;
@ override
String get commonSave = > ' Speichern ' ;
@ override
String get commonClose = > ' Schließen ' ;
@ override
String get commonUndo = > ' Rückgängig ' ;
2026-10-07 21:43:38 +02:00
@ override
String get moreInfo = > ' Weitere Informationen ' ;
@ override
String get moreInfoCreated = > ' Erstellt ' ;
@ override
String get moreInfoModified = > ' Zuletzt geändert ' ;
@ override
String get moreInfoItemId = > ' Element-ID ' ;
@ override
String get moreInfoStudysetId = > ' Lernset-ID ' ;
@ override
String get moreInfoPdfId = > ' PDF-Quellen-ID ' ;
feat(app): More info for studysets, paths, notes and PDFs
Wherever the old menus offered it: the studyset's options, a path's
(in the list and in the runner), a note's, and a PDF's, all on the
shared sheet the cards use: when it was made (from its UUID v7 id) and
last changed where that is kept, its ids to copy (parent, studyset,
PDF), and for a PDF its file.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 14:38:55 +02:00
@ override
String get moreInfoParentId = > ' Übergeordnete ID ' ;
@ override
String get moreInfoFile = > ' Datei ' ;
2026-10-07 21:43:38 +02:00
@ override
String get moreInfoReviews = > ' Wiederholungen ' ;
@ override
String get moreInfoReviewCount = > ' Anzahl Wiederholungen ' ;
@ override
String get moreInfoLastReviewed = > ' Zuletzt wiederholt ' ;
@ override
String get moreInfoCopy = > ' Kopieren ' ;
@ override
String get copiedToClipboard = > ' In die Zwischenablage kopiert ' ;
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
@ override
String get commonTryAgain = > ' Erneut versuchen ' ;
@ override
String get personDataFailed = >
' Die Daten dieses Geräts konnten nicht geöffnet werden. ' ;
@ override
String get sessionUnreachable = > ' Der Server war nicht erreichbar. ' ;
@ override
String get notFoundGone = >
' Das gibt es nicht mehr. Vielleicht wurde es auf einem anderen Gerät gelöscht. ' ;
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
@ override
String get studysetBackToLibrary = > ' Zurück zur Bibliothek ' ;
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
@ override
String get fileImage = > ' Bild ' ;
@ override
String get fileSound = > ' Audio ' ;
@ override
String get fileImageUnavailable = >
' Dieses Bild ist noch nicht auf diesem Gerät. Es erscheint, sobald es hochgeladen ist und du online bist. ' ;
@ override
String get fileImageUnreadable = >
' Dieses Bild kann nicht angezeigt werden. Die Datei ist vielleicht beschädigt oder in einem Format, das dieses Gerät nicht lesen kann. ' ;
@ override
String get fileFromElsewhere = > ' Dateien aus dem Web werden nicht angezeigt. ' ;
@ override
String get filePlaySound = > ' Audio abspielen ' ;
@ override
String get fileStopSound = > ' Audio stoppen ' ;
@ override
String get fileSoundUnavailable = >
' Diese Audiodatei ist noch nicht auf diesem Gerät. Du kannst sie abspielen, sobald sie hochgeladen ist und du online bist. ' ;
@ override
String get fileSoundUnplayable = >
' Diese Audiodatei kann nicht abgespielt werden. Die Datei ist vielleicht beschädigt oder in einem Format, das dieses Gerät nicht abspielen kann. ' ;
@ override
String get fileImages = > ' Bilder ' ;
@ override
String get fileSounds = > ' Audiodateien ' ;
@ override
String get fileNotAnImage = >
' Diese Datei ist kein Bild, das die App anzeigen kann. ' ;
@ override
String get fileNotASound = >
' Diese Datei ist keine Audiodatei, die die App abspielen kann. ' ;
@ override
String fileTooLarge ( int megabytes ) {
return ' Diese Datei ist größer als $ megabytes MB. ' ;
}
@ override
String get fileNotKept = >
' Die Datei konnte nicht auf diesem Gerät gespeichert werden. ' ;
@ override
String get fileRemoveImage = > ' Bild entfernen ' ;
@ override
String get fileRemoveSound = > ' Audio entfernen ' ;
@ override
String get editorInsert = > ' Einfügen ' ;
@ override
String get blockGroupText = > ' Text ' ;
@ override
String get blockGroupBlocks = > ' Blöcke ' ;
@ override
String get blockGroupMedia = > ' Medien ' ;
@ override
String blockHeading ( int level ) {
return ' Überschrift $ level ' ;
}
@ override
String get blockBulletedList = > ' Aufzählung ' ;
@ override
String get blockNumberedList = > ' Nummerierte Liste ' ;
@ override
String get blockChecklist = > ' Checkliste ' ;
@ override
String get blockQuote = > ' Zitat ' ;
@ override
String get blockListItem = > ' Listenpunkt ' ;
@ override
String get blockChecklistItem = > ' Aufgabe ' ;
@ override
String get editorSlashHint = >
' Tippe / für einen Block oder schreib einfach los ' ;
@ override
String get blockDivider = > ' Trennlinie ' ;
@ override
String get blockTable = > ' Tabelle ' ;
@ override
String get blockRemove = > ' Entfernen ' ;
@ override
String get blockUnknown = > ' Dieser Teil braucht eine neuere Version der App. ' ;
@ override
String get blockCallout = > ' Hinweisbox ' ;
@ override
String get blockSpoiler = > ' Spoiler ' ;
@ override
String get calloutNote = > ' Notiz ' ;
@ override
String get calloutInfo = > ' Info ' ;
@ override
String get calloutTip = > ' Tipp ' ;
@ override
String get calloutSuccess = > ' Erfolg ' ;
@ override
String get calloutQuestion = > ' Frage ' ;
@ override
String get calloutWarning = > ' Warnung ' ;
@ override
String get calloutDanger = > ' Gefahr ' ;
@ override
String get calloutQuote = > ' Zitat ' ;
@ override
String get calloutOptions = > ' Hinweisbox-Optionen ' ;
@ override
String get calloutEditTitle = > ' Titel bearbeiten… ' ;
@ override
String get calloutFoldedAtFirst = > ' Anfangs eingeklappt ' ;
@ override
String get calloutRemove = > ' Hinweisbox entfernen ' ;
@ override
String get calloutShow = > ' Einblenden ' ;
@ override
String get calloutHide = > ' Ausblenden ' ;
@ override
String get calloutWriteInside = > ' Hineinschreiben ' ;
@ override
String get calloutTitleDialog = > ' Titel der Hinweisbox ' ;
@ override
String get calloutTitleLabel = > ' Titel ' ;
@ override
String get calloutTitleHelper = >
' Lass ihn leer, um den Namen des Typs anzuzeigen. ' ;
@ override
String get spoilerReveal = > ' Aufdecken ' ;
@ override
String get spoilerPlaceholder = > ' Versteckter Text, per Tippen aufgedeckt ' ;
@ override
String get blockFormula = > ' Formel ' ;
@ override
String get formatInlineMath = > ' Formel in der Zeile ' ;
@ override
String get formulaTitle = > ' Formel ' ;
@ override
String get formulaInLineTitle = > ' Formel in der Zeile ' ;
@ override
String get formulaPreview = > ' Vorschau ' ;
@ override
String get formulaPreviewEmpty = > ' Hier erscheint die Formel ' ;
@ override
String get formulaLatex = > ' LaTeX ' ;
@ override
String get formulaLatexHelper = >
' \\ \\ beginnt eine neue Zeile in aligned, cases oder einer Matrix. ' ;
@ override
String get formulaEmpty = > ' Eine leere Formel. Tippe, um sie zu schreiben. ' ;
@ override
String get formulaEdit = > ' Formel bearbeiten ' ;
@ override
String get formulaRemove = > ' Formel entfernen ' ;
@ override
String get blockYoutube = > ' YouTube-Video ' ;
@ override
String get youtubeLink = > ' YouTube-Link ' ;
@ override
String get youtubeLinkHelper = > ' Füge einen Link von YouTube ein. ' ;
@ override
String get youtubeNotFound = > ' In diesem Link ist kein YouTube-Video. ' ;
@ override
String get youtubeFound = > ' Video gefunden. ' ;
@ override
String youtubeFoundFrom ( String time ) {
return ' Video gefunden, Start bei $ time . ' ;
}
@ override
String get youtubeCaption = > ' Beschriftung ' ;
@ override
String get youtubeCaptionHelper = >
' Wird anstelle des Videos angezeigt, bis es abgespielt wird. ' ;
@ override
String get youtubeVideo = > ' YouTube-Video ' ;
@ override
String get youtubeSource = > ' YouTube ' ;
@ override
String youtubeFrom ( String time ) {
return ' YouTube · ab $ time ' ;
}
@ override
String get youtubeEdit = > ' Video bearbeiten ' ;
@ override
String get youtubePlay = > ' Video abspielen ' ;
@ override
String get youtubeOpen = > ' Auf YouTube öffnen ' ;
@ override
String get youtubeRemove = > ' Video entfernen ' ;
@ override
String get youtubeBroken = >
' Der Link dieses Videos kann nicht gelesen werden. ' ;
@ override
String get youtubeNotOpened = > ' YouTube konnte nicht geöffnet werden. ' ;
@ override
String get blockStudyButton = > ' Lernbutton ' ;
@ override
String get studyButtonDefaultLabel = > ' Lernen ' ;
@ override
String get studyButtonStudyset = > ' Lernset ' ;
@ override
String get studyButtonTag = > ' Karten ' ;
@ override
String get studyButtonAllCards = > ' Alle Karten ' ;
@ override
String get studyButtonLabel = > ' Beschriftung ' ;
@ override
String get studyButtonTopics = > ' Mit seinen Themen ' ;
@ override
String get studyButtonBackFirst = > ' Rückseite zuerst ' ;
@ override
String get studyButtonBackFirstHelper = >
' Karten mit Vorder- und Rückseite sowie Vokabelkarten fragen ihre Rückseite ab. ' ;
@ override
String studyButtonWithTag ( String tag ) {
return ' Mit Tag $ tag ' ;
}
@ override
String get studyButtonAlone = > ' Ohne seine Themen ' ;
@ override
String get studyButtonEdit = > ' Lernbutton bearbeiten ' ;
@ override
String get studyButtonRemove = > ' Lernbutton entfernen ' ;
@ override
String get studyButtonBroken = >
' Dieser Lernbutton gibt nicht an, was gelernt werden soll. ' ;
@ override
String get studyButtonGone = > ' Dieses Lernset gibt es nicht mehr. ' ;
@ override
String get pdfPageField = > ' PDF-Seite ' ;
@ override
String get studysetTabFiles = > ' Dateien ' ;
@ override
String get pdfUploadMenu = > ' PDF hochladen ' ;
@ override
String get pdfFileType = > ' PDFs ' ;
@ override
String pdfAdded ( String title ) {
return ' „ $ title “ hinzugefügt. ' ;
}
@ override
String get pdfNotPdf = > ' Diese Datei ist kein PDF. ' ;
@ override
String pdfTooLarge ( int megabytes ) {
return ' Dieses PDF ist größer als $ megabytes MB. ' ;
}
@ override
String get pdfDuplicateTitle = > ' PDF schon vorhanden ' ;
@ override
String pdfDuplicateMessage ( String title ) {
return ' Diese Datei ist „ $ title “ und liegt schon in diesem Lernset. Als Kopie hinzufügen oder das vorhandene behalten? ' ;
}
@ override
String get pdfDuplicateKeep = > ' Vorhandenes behalten ' ;
@ override
String get pdfDuplicateAdd = > ' Kopie hinzufügen ' ;
@ override
String get filesEmpty = > ' Noch keine Dateien ' ;
@ override
String get filesEmptyHint = >
' Nutze „Material hinzufügen → PDF hochladen“, um eines hinzuzufügen. ' ;
@ override
String get filesSort = > ' Sortieren ' ;
feat: files in an order of one's own, with Reorder beside the tabs
A PDF now has a position among its studyset's files, as notes and paths
have: a fractional index in a column of its own (so moving it on one
device and renaming it on another don't overwrite each other), last
writer wins. The migration adds it to pdf_source on the server and on
each device with 'a0', so PDFs from before stand in the order they were
added (ties sort by id), and new ones go at the end.
The Files tab lists them in that order by default (Custom order, first
in the Sort menu; newest first was the default before). With two files
or more, Reorder beside the tabs shows the custom order whatever they
were sorted by, a grip in place of each file's options and the Sort menu
put away, until Done.
The next release changes synced tables anyway (card.buriedAt, since
v0.2.2), so older apps have to update for that already.
Also: card.position's doc no longer speaks of moving cards.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 19:28:05 +02:00
@ override
String get filesSortCustom = > ' Eigene Reihenfolge ' ;
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
@ override
String get filesSortName = > ' Name (A– Z) ' ;
@ override
String get filesSortNewest = > ' Neueste zuerst ' ;
@ override
String get filesSortOldest = > ' Älteste zuerst ' ;
@ override
String get filesSortLargest = > ' Größte zuerst ' ;
@ override
String pdfPages ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Seiten ' ,
one: ' 1 Seite ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String pdfPercentRead ( int percent ) {
return ' $ percent % gelesen ' ;
}
@ override
String get pdfDeadlineMet = > ' Lesefrist eingehalten ' ;
@ override
String pdfDeadlineUpcoming ( int days , int pages ) {
String _temp0 = intl . Intl . pluralLogic (
days ,
locale: localeName ,
other: ' $ days Tagen ' ,
one: ' 1 Tag ' ,
) ;
return ' Beginnt in $ _temp0 – $ pages /Tag geplant ' ;
}
@ override
String pdfDeadlinePassed ( int pages ) {
String _temp0 = intl . Intl . pluralLogic (
pages ,
locale: localeName ,
other: ' $ pages Seiten ' ,
one: ' 1 Seite ' ,
) ;
return ' Frist abgelaufen – noch $ _temp0 ' ;
}
@ override
String pdfDeadlineToday ( int pages ) {
String _temp0 = intl . Intl . pluralLogic (
pages ,
locale: localeName ,
other: ' $ pages Seiten ' ,
one: ' 1 Seite ' ,
) ;
return ' Heute fällig – noch $ _temp0 ' ;
}
@ override
String pdfDeadlinePace ( int pages , int target , int days ) {
String _temp0 = intl . Intl . pluralLogic (
days ,
locale: localeName ,
other: ' $ days Tagen ' ,
one: ' 1 Tag ' ,
) ;
return ' $ pages /Tag, um in $ _temp0 Seite $ target zu erreichen ' ;
}
@ override
String get pdfOptions = > ' Aktionen ' ;
@ override
String get pdfRename = > ' Umbenennen ' ;
@ override
String get pdfRenameTitle = > ' PDF umbenennen ' ;
@ override
String get pdfRenameLabel = > ' Titel ' ;
@ override
String get pdfSetDeadline = > ' Lesefrist festlegen ' ;
@ override
String get pdfEditDeadline = > ' Lesefrist bearbeiten ' ;
@ override
String get pdfMarkFinished = > ' Als abgeschlossen markieren ' ;
@ override
String get pdfResetReading = > ' Lesefortschritt zurücksetzen ' ;
@ override
String get pdfResetTitle = > ' Lesefortschritt zurücksetzen? ' ;
@ override
String pdfResetMessage ( String title ) {
return ' Wie weit du „ $ title “ gelesen hast, wird vergessen. Das PDF, seine Karteikarten und Notizen bleiben. ' ;
}
@ override
String get pdfResetConfirm = > ' Zurücksetzen ' ;
@ override
String get pdfMoreInfo = > ' Weitere Infos ' ;
@ override
String get pdfInfoFileName = > ' Dateiname ' ;
@ override
String get pdfInfoSize = > ' Größe ' ;
@ override
String get pdfInfoPages = > ' Seiten ' ;
@ override
String get pdfInfoUnknown = > ' Bekannt, sobald es geöffnet wurde ' ;
@ override
String get pdfDelete = > ' Löschen ' ;
@ override
String get pdfDeleteTitle = > ' PDF löschen? ' ;
@ override
String pdfDeleteMessage ( String title ) {
return ' „ $ title “ wird samt Lesefortschritt aus diesem Lernset entfernt. Karteikarten und Notizen, die daraus entstanden sind, bleiben. ' ;
}
@ override
String get pdfDeleteConfirm = > ' Löschen ' ;
@ override
String get pdfDeleted = > ' PDF gelöscht ' ;
@ override
String get deadlineSheetSet = > ' Lesefrist festlegen ' ;
@ override
String get deadlineSheetEdit = > ' Lesefrist bearbeiten ' ;
@ override
String get deadlineSheetHelp = >
' Erreiche bis zu einem Tag eine bestimmte Seite. Der Fortschritt folgt der weitesten Seite, die du beim Lesen erreichst. ' ;
@ override
String deadlineReachPageOf ( int count ) {
return ' Seite erreichen (von $ count ) ' ;
}
@ override
String get deadlineReachPage = > ' Seite erreichen ' ;
@ override
String get deadlineDecrease = > ' Verringern ' ;
@ override
String get deadlineIncrease = > ' Erhöhen ' ;
@ override
String get deadlineChapter = > ' Oder ein Kapitel abschließen ' ;
@ override
String deadlineChapterEntry ( String title , int page ) {
return ' $ title · bis S. $ page ' ;
}
@ override
String get deadlineBy = > ' Bis ' ;
@ override
String get deadlineStart = > ' Beginn am ' ;
@ override
String get deadlineStartToday = > ' Heute ' ;
@ override
String get deadlineStartReset = > ' Heute beginnen ' ;
@ override
String get deadlineStartHelp = >
' Das Tagespensum zählt ab diesem Tag. Bis dahin wartet das PDF unter „Demnächst“. ' ;
@ override
String get deadlineSave = > ' Frist speichern ' ;
@ override
String get deadlineRemove = > ' Frist entfernen ' ;
@ override
String get readerMissing = >
' Dieses PDF ist noch nicht auf diesem Gerät. Es öffnet sich, sobald das Gerät, das es hinzugefügt hat, es hochgeladen hat und du online bist. ' ;
@ override
String get readerUnreadable = >
' Diese Datei kann nicht als PDF gelesen werden. ' ;
@ override
String get readerBack = > ' Zurück zum Lernset ' ;
@ override
String get readerSearch = > ' PDF durchsuchen ' ;
@ override
String get readerFitWidth = > ' An Breite anpassen ' ;
@ override
String get readerFitHeight = > ' An Höhe anpassen ' ;
@ override
String get readerZoomIn = > ' Vergrößern ' ;
@ override
String get readerZoomOut = > ' Verkleinern ' ;
@ override
String get readerSetZoom = > ' Zoom festlegen ' ;
@ override
String get readerZoomTitle = > ' Zoom ' ;
@ override
String get readerZoomApply = > ' Anwenden ' ;
@ override
String get readerFullscreen = > ' Vollbild ' ;
@ override
String get readerExitFullscreen = > ' Vollbild verlassen ' ;
@ override
String get readerPreviousPage = > ' Vorherige Seite ' ;
@ override
String get readerNextPage = > ' Nächste Seite ' ;
@ override
String readerPageOf ( int count ) {
return ' / $ count ' ;
}
@ override
String get readerFindHint = > ' Im PDF suchen ' ;
@ override
String readerMatchOf ( int current , int total ) {
return ' $ current von $ total ' ;
}
@ override
String get readerPreviousMatch = > ' Vorheriger Treffer ' ;
@ override
String get readerNextMatch = > ' Nächster Treffer ' ;
@ override
String get readerCloseSearch = > ' Suche schließen ' ;
@ override
String get readerExpand = > ' Ausklappen ' ;
@ override
String get readerCollapse = > ' Einklappen ' ;
@ override
String get readerTabFlashcards = > ' Karteikarten ' ;
@ override
String get readerTabNotes = > ' Notizen ' ;
@ override
String get readerCardCreated = > ' Karteikarte erstellt ' ;
@ override
String get readerCardDeleteTitle = > ' Karteikarte löschen? ' ;
@ override
String get readerCardDeleteMessage = >
' Die Karteikarte wird samt ihrem Lernverlauf gelöscht. ' ;
@ override
String get readerCardDeleteConfirm = > ' Löschen ' ;
@ override
String get readerFrontMatter = > ' Vorspann ' ;
@ override
String readerPage ( int page ) {
return ' Seite $ page ' ;
}
@ override
String get readerByPage = > ' Seite ' ;
@ override
String get readerByChapter = > ' Kapitel ' ;
@ override
String get readerCardsEmpty = >
' Wähle Text aus, um im Nu Karteikarten zu erstellen ' ;
@ override
String get readerCardsEmptyHint = >
' Wähle die wichtigen Zeilen aus und schicke sie in eine Frage oder eine Antwort, oder nutze „Karteikarte erstellen“. ' ;
@ override
String get readerCreateCard = > ' Karteikarte erstellen ' ;
@ override
String get readerEditCard = > ' Karteikarte bearbeiten ' ;
@ override
String get readerBackToCards = > ' Zurück zu den Karteikarten ' ;
@ override
String readerReferencedPage ( int page ) {
return ' Referenzierte Seite: $ page ' ;
}
@ override
String readerUseCurrentPage ( int page ) {
return ' Aktuelle verwenden ( $ page ) ' ;
}
@ override
String get readerQuestion = > ' Frage ' ;
@ override
String get readerAnswer = > ' Antwort ' ;
@ override
String get readerKeepOpen = > ' Erstellungsmodus geöffnet lassen ' ;
@ override
String get readerClear = > ' Leeren ' ;
@ override
String get readerCreate = > ' Erstellen ' ;
@ override
String get readerUntitledCard = > ' Unbenannte Karteikarte ' ;
@ override
String get readerCardOptions = > ' Kartenoptionen ' ;
@ override
String get readerNoteSaved = > ' Gespeichert ' ;
@ override
String get readerNoteEditing = > ' Wird bearbeitet… ' ;
@ override
String get readerNoteSaving = > ' Wird gespeichert… ' ;
@ override
String get readerNoteFailed = > ' Speichern fehlgeschlagen ' ;
@ override
String get readerToQuestion = > ' Frage ' ;
@ override
String get readerToAnswer = > ' Antwort ' ;
@ override
String get readerToNote = > ' Notizen ' ;
@ override
String get readerLineBreaksJoined = >
' Zeilenumbrüche zusammengeführt (tippen zum Beibehalten) ' ;
@ override
String get readerLineBreaksKept = >
' Zeilenumbrüche beibehalten (tippen zum Zusammenführen) ' ;
@ override
String get blockScreenshot = > ' Bildschirmfoto der Seite ' ;
@ override
String get readerCaptureCancel = > ' Bildschirmfoto abbrechen ' ;
@ override
String get readerCaptureHint = >
' Ziehe über den Teil der Seite, den du behalten willst ' ;
@ override
String get readerCaptureFailed = >
' Die Seite konnte nicht dargestellt werden. Versuche es erneut, sobald sie geladen ist. ' ;
@ override
String get readerScreenshotSaved = > ' Bildschirmfoto gespeichert ' ;
@ override
String get imageOpenPdfPage = > ' PDF auf dieser Seite öffnen ' ;
@ override
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
String get homeWidgetDeadlines = > ' PDF-Lesefristen ' ;
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
@ override
String get deadlinesTitle = > ' Lesefristen ' ;
@ override
String get deadlinesCurrent = > ' Aktuell ' ;
@ override
String get deadlinesUpcoming = > ' Demnächst ' ;
@ override
String deadlinesProgress ( int furthest , int target , String when ) {
return ' S. $ furthest / $ target · $ when ' ;
}
@ override
String get deadlinePassedShort = > ' Frist abgelaufen ' ;
@ override
String get deadlineDueTodayShort = > ' heute fällig ' ;
@ override
String deadlineDaysLeft ( int days ) {
String _temp0 = intl . Intl . pluralLogic (
days ,
locale: localeName ,
other: ' noch $ days Tage ' ,
one: ' noch 1 Tag ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String deadlineToPageToday ( int page ) {
return ' heute bis S. $ page ' ;
}
@ override
String deadlineStartsIn ( int days ) {
String _temp0 = intl . Intl . pluralLogic (
days ,
locale: localeName ,
other: ' $ days Tagen ' ,
one: ' 1 Tag ' ,
) ;
return ' Beginnt in $ _temp0 ' ;
}
@ override
String get deadlinesPlaceholder = > ' Erscheint, sobald du Lesefristen hast ' ;
@ override
String get deadlinesOpenTimeline = > ' Zeitleiste öffnen ' ;
@ override
String get timelineTitle = > ' Lesefristen-Zeitleiste ' ;
@ override
String get timelineEmpty = > ' Noch keine Lesefristen ' ;
@ override
String get timelineEmptyHint = >
' Lege für ein PDF eine Lesefrist fest, um sie hier zu sehen. ' ;
@ override
String get timelineToday = > ' Heute ' ;
@ override
String timelinePages ( int furthest , int target ) {
return ' S. $ furthest / $ target ' ;
}
@ override
String chapterFinished ( String chapter , int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Karten ' ,
one: ' Karte ' ,
) ;
return ' „ $ chapter “ fertig gelesen – die $ _temp0 lernen, die du erstellt hast? ' ;
}
@ override
String get chapterStudyNow = > ' Jetzt lernen ' ;
@ override
String get chapterDismiss = > ' Schließen ' ;
@ override
String get deadlineChapterLoading = > ' Kapitel werden geladen… ' ;
@ override
String fileSizeKb ( int size ) {
return ' $ size KB ' ;
}
@ override
String fileSizeMb ( String size ) {
return ' $ size MB ' ;
}
@ override
String pdfPageShort ( int page ) {
return ' S. $ page ' ;
}
@ override
String get ankiImportMenu = > ' Aus Anki importieren ' ;
@ override
String get ankiImportFileType = > ' Anki-Stapel ' ;
@ override
String get ankiImportTitle = > ' Anki-Stapel importieren ' ;
@ override
String get ankiImportOptionsTitle = >
' Wie sollen Unterstapel importiert werden? ' ;
@ override
String get ankiImportReading = > ' Stapel wird gelesen… ' ;
@ override
String ankiImportSummary ( int cards ) {
String _temp0 = intl . Intl . pluralLogic (
cards ,
locale: localeName ,
other: ' $ cards Karten. ' ,
one: ' 1 Karte. ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String ankiImportSummaryDecks ( int cards , int decks ) {
String _temp0 = intl . Intl . pluralLogic (
cards ,
locale: localeName ,
other: ' $ cards Karten ' ,
one: ' 1 Karte ' ,
) ;
return ' $ _temp0 in $ decks Unterstapeln. ' ;
}
@ override
String get ankiImportModeFlatten = > ' In dieses Lernset zusammenführen ' ;
@ override
String get ankiImportModeFlattenSubtitle = >
' Alle Karten hierher importieren und die Unterstapel ignorieren. ' ;
@ override
String get ankiImportModeSubStudysets = > ' Als Unter-Lernsets nachbilden ' ;
@ override
String get ankiImportModeSubStudysetsSubtitle = >
' Die Unterstapel nachbilden: Jeder Unterstapel wird ein verschachteltes Lernset. ' ;
@ override
String get ankiImportModeTag = > ' Karten nach Unterstapel taggen ' ;
@ override
String get ankiImportModeTagSubtitle = >
' Alle Karten hier behalten, getaggt mit jedem Unterstapel, aus dem sie stammen. ' ;
@ override
String get ankiImportProgress = > ' Lernfortschritt importieren ' ;
@ override
String get ankiImportProgressSubtitle = >
' Den Wiederholungsverlauf aus Anki übernehmen: Karten machen dort weiter, wo sie aufgehört haben. Neue Karten bleiben neu. ' ;
@ override
String ankiImportMedia ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' Medien übernehmen ( $ count Dateien) ' ,
one: ' Medien übernehmen (1 Datei) ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String get ankiImportMediaSubtitle = >
' Bilder und Töne des Stapels auf den Karten behalten. ' ;
@ override
String ankiImportMediaMayNotFit ( String size , String left ) {
return ' Die Dateien belegen $ size MB, mehr als die $ left MB, die dir noch bleiben: Was nicht hineinpasst, bleibt auf diesem Gerät, und deine anderen Geräte zeigen es nicht an. ' ;
}
@ override
String get ankiImportRunning = > ' Wird importiert… ' ;
@ override
String get ankiImportConfirm = > ' Importieren ' ;
@ override
String get ankiImportNotAPackage = >
' Das ist kein Anki-Stapel. Exportiere in Anki einen Stapel als .apkg-Datei und importiere diese. ' ;
@ override
String get ankiImportNewerFormat = >
' Dieser Stapel stammt aus einer neueren Anki-Version, die diese App noch nicht kennt. Exportiere ihn erneut mit „Ältere Anki-Versionen unterstützen“. ' ;
@ override
String get ankiImportUnreadable = >
' Dieser Stapel ist beschädigt und kann nicht gelesen werden. ' ;
@ override
String get ankiImportBrokeOff = >
' Der Import wurde abgebrochen. Die bis dahin importierten Karten bleiben erhalten. ' ;
@ override
String ankiImported ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Karteikarten aus Anki importiert. ' ,
one: ' 1 Karteikarte aus Anki importiert. ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String ankiImportedSubStudysets ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Karten in Unter-Lernsets importiert. ' ,
one: ' 1 Karte in Unter-Lernsets importiert. ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String ankiImportedTagged ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Karten importiert und nach Unterstapel getaggt. ' ,
one: ' 1 Karte importiert und nach Unterstapel getaggt. ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String ankiImportFilesSkipped ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Mediendateien konnten nicht importiert werden. ' ,
one: ' 1 Mediendatei konnte nicht importiert werden. ' ,
) ;
return ' $ _temp0 ' ;
}
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
@ override
String get pomodoroTitle = > ' Pomodoro ' ;
@ override
String get pomodoroFocus = > ' Fokus ' ;
@ override
String get pomodoroShortBreak = > ' Kurze Pause ' ;
@ override
String get pomodoroLongBreak = > ' Lange Pause ' ;
@ override
String pomodoroFocusOf ( int done , int total ) {
return ' Fokus $ done von $ total ' ;
}
@ override
String get pomodoroStart = > ' Starten ' ;
@ override
String get pomodoroPause = > ' Pausieren ' ;
@ override
String get pomodoroResume = > ' Fortsetzen ' ;
@ override
String get pomodoroSkip = > ' Überspringen ' ;
@ override
String get pomodoroStop = > ' Beenden ' ;
@ override
String get pomodoroPaused = > ' Pausiert ' ;
@ override
String pomodoroPausedProfile ( String profile ) {
return ' Pausiert · $ profile ' ;
}
@ override
String get pomodoroClassic = > ' Klassisch ' ;
@ override
String get pomodoroUnnamed = > ' Profil ohne Namen ' ;
@ override
String get pomodoroProfiles = > ' Pomodoro-Profile ' ;
@ override
String get pomodoroChooseProfile = > ' Profil wählen ' ;
@ override
String get pomodoroAddProfile = > ' Profil hinzufügen ' ;
@ override
String get pomodoroEditProfile = > ' Profil bearbeiten ' ;
@ override
String get pomodoroName = > ' Name ' ;
@ override
String get pomodoroFocusLength = > ' Fokus ' ;
@ override
String get pomodoroShortBreakLength = > ' Kurze Pause ' ;
@ override
String get pomodoroLongBreakLength = > ' Lange Pause ' ;
@ override
String pomodoroMinutes ( int count ) {
return ' $ count Min. ' ;
}
@ override
String get pomodoroNoLongBreak = > ' Keine ' ;
@ override
String get pomodoroLongBreakAfter = > ' Fokusphasen vor einer langen Pause ' ;
@ override
String get pomodoroAutoStartBreaks = > ' Pausen von selbst starten ' ;
@ override
String get pomodoroAutoStartFocus = >
' Fokus nach einer Pause von selbst starten ' ;
@ override
String get pomodoroDoNotDisturb = > ' Nicht stören während des Fokus ' ;
@ override
String get pomodoroDoNotDisturbHint = >
fix(app): the Pomodoro timer holds up with the app gone, asleep or edited
A review of the timer found:
- Stop in the notification with the app swiped away took the timer
away there, but the app showed it again at its next start. The
service now leaves a mark the app takes when it starts, and the timer
it kept is forgotten.
- Pause, Resume and Skip did nothing with the app gone: since Android
12 a service may not start an activity from a notification's button.
The notification is posted again with buttons that open the app.
- A timer kept while the app was closed was shown as it was before it
caught up, so its ended phase alerted a second time. It is now caught
up before it first shows.
- Dart's timers sleep with the device, so a phase that ended while the
phone or laptop slept went unnoticed until the app came back. While a
phase runs the timer looks every 15 seconds, and on Android the
alarm's receiver wakes it too.
- On Linux, changes that came at once overlapped on the bus (an
indicator registered twice, notifications left over, a ticking label
never stopped); they now go one at a time. The indicator registers
again when GNOME's watcher restarts, and with a watcher that only
turns up later.
- Changing the running profile could put the timer outside its cycle
("Focus 6 of 4", the Live Update's bar past its end); where it is
stays within the new cycle, and a phase waiting at its full length
takes the new length. A countdown past its end shows 00:00.
- Writes of the kept timer go one at a time, and a closed timer arms no
more timers.
- The alert no longer renames the timer's notification channel, and a
German hint said the alert came at the device's end.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 03:23:24 +02:00
' Das Gerät bleibt still, während du dich konzentrierst; die Meldung am Ende des Fokus ist trotzdem zu hören. ' ;
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
@ override
String get pomodoroDoNotDisturbDenied = >
' Die App darf dieses Gerät nicht stummschalten. Erlaube es in den Systemeinstellungen. ' ;
@ override
String get pomodoroDeleteProfile = > ' Profil löschen ' ;
@ override
String pomodoroSummary ( int focus , int shortBreak ) {
return ' $ focus Min. Fokus, $ shortBreak Min. Pause ' ;
}
@ override
String pomodoroSummaryLong (
int focus ,
int shortBreak ,
int longBreak ,
int after ,
) {
return ' $ focus Min. Fokus, $ shortBreak Min. Pause, $ longBreak Min. nach $ after ' ;
}
@ override
String get pomodoroAlertFocusDone = > ' Zeit für eine Pause ' ;
@ override
String get pomodoroAlertBreakDone = > ' Zurück zum Fokus ' ;
@ override
String pomodoroAlertStarts ( String phase ) {
return ' $ phase hat begonnen. ' ;
}
@ override
String pomodoroAlertWaits ( String phase ) {
return ' $ phase wartet auf dich. ' ;
}
@ override
String get homeWidgetPomodoro = > ' Pomodoro-Timer ' ;
@ override
String get pomodoroAlerts = > ' Pomodoro-Meldungen ' ;
@ override
String pomodoroUntil ( String time ) {
return ' Bis $ time ' ;
}
@ override
String pomodoroLeft ( String left ) {
return ' Noch $ left ' ;
}
2026-10-07 03:01:12 +02:00
@ override
String pathImportAtStep ( int step , String problem ) {
return ' Schritt $ step : $ problem ' ;
}
@ override
String pathImportNotJson ( String detail ) {
return ' Das ist kein JSON: $ detail ' ;
}
@ override
String get pathImportNoPath = > ' ein „path“-Objekt fehlt. ' ;
@ override
String get pathImportNoTitle = > ' der Pfad hat keinen „title“. ' ;
@ override
String get pathImportDescriptionNotText = >
' „description“ des Pfads ist kein Text. ' ;
@ override
String get pathImportNotAnObject = > ' kein Objekt. ' ;
@ override
String pathImportUnknownStepType ( String detail ) {
return ' unbekannter „type“: $ detail . ' ;
}
@ override
String pathImportRightOptionMissing ( String detail ) {
return ' die richtige Option $ detail fehlt unter den Optionen. ' ;
}
@ override
String get pathImportRightOptionsMissing = >
' eine genannte richtige Option fehlt unter den Optionen. ' ;
@ override
String get pathImportNoPairing = > ' kein „correct_pairing“. ' ;
@ override
String pathImportPairingTargetMissing ( String detail ) {
return ' Elemente werden einem fehlenden Ziel zugeordnet: $ detail . ' ;
}
@ override
String get pathImportPairingIncomplete = >
' jedes Element braucht genau ein Ziel. ' ;
@ override
String get pathImportNoPassage = > ' keine „passage“. ' ;
@ override
String get pathImportBlanksMismatch = >
' für jedes ___ in der Passage braucht es ein Wort in „blanks“. ' ;
@ override
String get pathImportBlockWithoutType = > ' ein Block ohne „type“. ' ;
@ override
String get pathImportMalformedLevel = >
' eine Überschrift mit fehlerhafter Ebene. ' ;
@ override
String get pathImportMalformedListItem = > ' ein fehlerhafter Listenpunkt. ' ;
@ override
String get pathImportMalformedMath = > ' ein fehlerhafter Formelblock. ' ;
@ override
String get pathImportMalformedCode = > ' ein fehlerhafter Codeblock. ' ;
@ override
String pathImportUnknownBlock ( String detail ) {
return ' ein unbekannter Block: $ detail . ' ;
}
@ override
String pathImportTextlessBlock ( String detail ) {
return ' ein „ $ detail “ ohne „text“ oder „runs“. ' ;
}
@ override
String get pathImportMalformedRun = > ' ein fehlerhafter Textabschnitt. ' ;
@ override
String get pathImportListExpected = > ' eine Liste wurde erwartet. ' ;
@ override
String pathImportNotText ( String detail ) {
return ' „ $ detail “ muss Text sein. ' ;
}
@ override
String pathImportTooFew ( String detail ) {
return ' es braucht mindestens zwei „ $ detail “. ' ;
}
@ override
String get pathImportMalformedNumber = > ' eine fehlerhafte Zahl. ' ;
@ override
String get pathImportTitleNotText = > ' ein Titel muss Text sein. ' ;
2026-10-07 10:27:31 +02:00
feat(app): cite sources in APA, MLA or Chicago, and give studysets a bibliography
A source is now shared by learning paths and studysets (core/citation/):
authors as full names, year, title, what it is a part of, publisher,
ISBN, link, and a citation kept as a file brought it. formatCitation
cites it in APA 7, MLA 9 or Chicago 18: it inverts and abbreviates
names itself (particles, suffixes, names written as already cited stay),
sets a work of its own in italics and a part of something apart from
the whole, and writes a missing year as "n.d." in APA and Chicago.
- Settings: a Citations card per device, with a preview and a link to
the style's own guide.
- Studysets: a Bibliography button opens the works cited, to read and,
behind its pencil, to change (studyset schema 4).
- Steps: sources edited through the same sheet, opened from an
"N sources" button in the runner (step schema 2; schema 1 reads on).
- Path import: steps' sources, text kept as written, the old format's
"citation" read as what a source is part of.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-07 17:07:04 +02:00
@ override
String get pathImportMalformedSource = >
' eine Quelle muss ein Objekt oder Text sein und ihre Teile Text. ' ;
2026-10-07 10:27:31 +02:00
@ override
String get pomodoroTopBarHint = >
' Der Timer kann in der oberen Leiste von GNOME herunterzählen, mit seinen Knöpfen, sobald die Erweiterung „AppIndicator“ an ist. ' ;
@ override
String get pomodoroTopBarSetUp = > ' Einrichten ' ;
@ override
String get pomodoroTopBarDismiss = > ' Nicht mehr vorschlagen ' ;
feat(app): a card browser to search, filter, sort and change many cards at once
Browse beside the flashcards' tab opens the studyset's cards over the
tabs (with everything inside it when it has sub-studysets), laid out as
the older design had it:
- a grid of tiles (each card's two sides) or one card at a time beside
the list (on a phone above a strip of them, swiped through), as last
left for the studyset on this device;
- a search over front, back, reading, meanings, hints, explanation and
tag names, katakana found as hiragana and kana by romaji;
- sorting by own order, newest, oldest, A–Z (words by reading), due
first; a filter sheet by kind, tag and state (new, learning, due,
buried, reported);
- choosing cards (a toggle; shift-click or long-press for a range,
select all) to move into another or a new studyset, add or remove
tags, start afresh, or delete with Undo; the actions in the row on
wide windows, in a bar at the foot below.
Moving cards between studysets is new in the card repository and its
gateway (studysetId and position written, named columns).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-09 14:21:01 +02:00
@ override
String get cardBrowserTitle = > ' Karteikarten ' ;
@ override
String cardBrowserTitleWithName ( String title ) {
return ' $ title – Karteikarten ' ;
}
@ override
String cardBrowserTitleSubtree ( String title ) {
return ' $ title (mit Unter-Lernsets) ' ;
}
@ override
String get cardBrowserBrowse = > ' Durchsuchen ' ;
@ override
String get cardBrowserBrowseTooltip = > ' Karteikarten durchsuchen ' ;
@ override
String get cardBrowserStudy = > ' Lernen ' ;
@ override
String get cardBrowserEditor = > ' Editor ' ;
@ override
String get cardBrowserMore = > ' Mehr ' ;
@ override
String get cardBrowserImport = > ' Karteikarten importieren ' ;
@ override
String get cardBrowserGrid = > ' Raster ' ;
@ override
String get cardBrowserDetail = > ' Detail ' ;
@ override
String get cardBrowserSearch = > ' Suchen ' ;
@ override
String get cardBrowserSort = > ' Sortieren ' ;
@ override
String get cardBrowserFilter = > ' Filtern ' ;
@ override
String get cardBrowserSelect = > ' Auswählen ' ;
@ override
String get cardBrowserSortManual = > ' Eigene Reihenfolge ' ;
@ override
String get cardBrowserSortNewest = > ' Neueste zuerst ' ;
@ override
String get cardBrowserSortOldest = > ' Älteste zuerst ' ;
@ override
String get cardBrowserSortAlphabetical = > ' A– Z (Vorderseite) ' ;
@ override
String get cardBrowserSortDue = > ' Fällige zuerst ' ;
@ override
String get cardBrowserSearchHint = > ' Karteikarten durchsuchen ' ;
@ override
String get cardBrowserCloseSearch = > ' Suche schließen ' ;
@ override
String get cardBrowserClearQuery = > ' Suche leeren ' ;
@ override
String get cardBrowserFilterTitle = > ' Karteikarten filtern ' ;
@ override
String get cardBrowserFilterType = > ' Art ' ;
@ override
String get cardBrowserTypeAll = > ' Alle Karten ' ;
@ override
String get cardBrowserTypeFrontBack = > ' Nur Frage und Antwort ' ;
@ override
String get cardBrowserTypeMultipleChoice = > ' Nur Multiple Choice ' ;
@ override
String get cardBrowserTypeVocabulary = > ' Nur Wörter ' ;
@ override
String get cardBrowserTypeMatching = > ' Nur Zuordnungen ' ;
@ override
String get cardBrowserTypeMap = > ' Nur Karten ' ;
2026-10-09 15:00:21 +02:00
@ override
String get cardBrowserTypeCharacter = > ' Nur Schriftzeichen ' ;
feat(app): a card browser to search, filter, sort and change many cards at once
Browse beside the flashcards' tab opens the studyset's cards over the
tabs (with everything inside it when it has sub-studysets), laid out as
the older design had it:
- a grid of tiles (each card's two sides) or one card at a time beside
the list (on a phone above a strip of them, swiped through), as last
left for the studyset on this device;
- a search over front, back, reading, meanings, hints, explanation and
tag names, katakana found as hiragana and kana by romaji;
- sorting by own order, newest, oldest, A–Z (words by reading), due
first; a filter sheet by kind, tag and state (new, learning, due,
buried, reported);
- choosing cards (a toggle; shift-click or long-press for a range,
select all) to move into another or a new studyset, add or remove
tags, start afresh, or delete with Undo; the actions in the row on
wide windows, in a bar at the foot below.
Moving cards between studysets is new in the card repository and its
gateway (studysetId and position written, named columns).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-09 14:21:01 +02:00
@ override
String get cardBrowserFilterTag = > ' Tag ' ;
@ override
String get cardBrowserAllTags = > ' Alle Tags ' ;
@ override
String get cardBrowserFilterStatus = > ' Stand ' ;
@ override
String get cardBrowserStatusNew = > ' Neu ' ;
@ override
String get cardBrowserStatusLearning = > ' Im Lernen ' ;
@ override
String get cardBrowserStatusDue = > ' Fällig ' ;
@ override
String get cardBrowserStatusBuried = > ' Zurückgestellt ' ;
@ override
String get cardBrowserStatusReported = > ' Gemeldet ' ;
@ override
String get cardBrowserClearAll = > ' Alle zurücksetzen ' ;
@ override
String get cardBrowserApply = > ' Anwenden ' ;
@ override
String get cardBrowserEmptyTitle = > ' Noch keine Karteikarten ' ;
@ override
String get cardBrowserEmptyHint = >
' Erstelle welche, um sie hier zu durchsuchen. ' ;
@ override
String get cardBrowserCreate = > ' Karteikarten erstellen ' ;
@ override
String get cardBrowserNoMatches = > ' Keine Karteikarte passt ' ;
@ override
String get cardBrowserNoMatchesHint = >
' Versuche eine andere Suche oder einen anderen Filter. ' ;
@ override
String get cardBrowserClearFilters = > ' Suche und Filter zurücksetzen ' ;
@ override
String get cardBrowserRetry = > ' Erneut versuchen ' ;
@ override
String get cardBrowserPrevious = > ' Vorige ' ;
@ override
String get cardBrowserNext = > ' Nächste ' ;
@ override
String get cardBrowserBuried = > ' Zurückgestellt ' ;
@ override
String get cardBrowserSelectAll = > ' Alle auswählen ' ;
@ override
String get cardBrowserDeselectAll = > ' Auswahl aufheben ' ;
@ override
String cardBrowserSelected ( int count ) {
return ' $ count ausgewählt ' ;
}
@ override
String get cardBrowserRangeHintTouch = >
' Halte eine andere Karte gedrückt, um alles dazwischen auszuwählen. ' ;
@ override
String get cardBrowserRangeHintPointer = >
' Klicke mit gedrückter Umschalttaste auf eine andere Karte, um alles dazwischen auszuwählen. ' ;
@ override
String get cardBrowserMove = > ' Verschieben ' ;
@ override
String get cardBrowserAddTags = > ' Tags hinzufügen ' ;
@ override
String get cardBrowserRemoveTags = > ' Tags entfernen ' ;
@ override
String get cardBrowserResetProgress = > ' Fortschritt zurücksetzen ' ;
@ override
String get cardBrowserDelete = > ' Löschen ' ;
@ override
String get cardBrowserMoreActions = > ' Weitere Aktionen ' ;
@ override
String get cardBrowserDone = > ' Fertig ' ;
@ override
String cardBrowserDeleted ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Karteikarten gelöscht ' ,
one: ' 1 Karteikarte gelöscht ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String cardBrowserMoveTitle ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Karteikarten verschieben nach ' ,
one: ' 1 Karteikarte verschieben nach ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String cardBrowserMoved ( int count , String title ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Karteikarten nach „ $ title “ verschoben ' ,
one: ' 1 Karteikarte nach „ $ title “ verschoben ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String cardBrowserAddTagsTitle ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' Tags zu $ count Karteikarten hinzufügen ' ,
one: ' Tags zu 1 Karteikarte hinzufügen ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String cardBrowserAddTo ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' Zu $ count Karteikarten hinzufügen ' ,
one: ' Zu 1 Karteikarte hinzufügen ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String cardBrowserRemoveTagsTitle ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' Tags von $ count Karteikarten entfernen ' ,
one: ' Tags von 1 Karteikarte entfernen ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String cardBrowserRemoveFrom ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' Von $ count Karteikarten entfernen ' ,
one: ' Von 1 Karteikarte entfernen ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String get cardBrowserNoTags = >
' Noch keine Tags. Erstelle Tags im Editor einer Karteikarte und weise sie dann hier zu. ' ;
@ override
String get cardBrowserNoTagsOnCards = >
' Die ausgewählten Karteikarten haben keine Tags. ' ;
@ override
String cardBrowserTagsAdded ( int tags , int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Karteikarten ' ,
one: ' 1 Karteikarte ' ,
) ;
String _temp1 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Karteikarten ' ,
one: ' 1 Karteikarte ' ,
) ;
String _temp2 = intl . Intl . pluralLogic (
tags ,
locale: localeName ,
other: ' $ tags Tags zu $ _temp0 hinzugefügt ' ,
one: ' 1 Tag zu $ _temp1 hinzugefügt ' ,
) ;
return ' $ _temp2 ' ;
}
@ override
String cardBrowserTagsRemoved ( int tags , int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Karteikarten ' ,
one: ' 1 Karteikarte ' ,
) ;
String _temp1 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Karteikarten ' ,
one: ' 1 Karteikarte ' ,
) ;
String _temp2 = intl . Intl . pluralLogic (
tags ,
locale: localeName ,
other: ' $ tags Tags von $ _temp0 entfernt ' ,
one: ' 1 Tag von $ _temp1 entfernt ' ,
) ;
return ' $ _temp2 ' ;
}
@ override
String cardBrowserResetTitle ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Karteikarten neu beginnen? ' ,
one: ' 1 Karteikarte neu beginnen? ' ,
) ;
return ' $ _temp0 ' ;
}
@ override
String get cardBrowserResetMessage = >
' Sie gelten wieder als neu. Ihre Wiederholungen bleiben in deinem Verlauf und deinen Serien. ' ;
@ override
String get cardBrowserResetConfirm = > ' Zurücksetzen ' ;
@ override
String cardBrowserReset ( int count ) {
String _temp0 = intl . Intl . pluralLogic (
count ,
locale: localeName ,
other: ' $ count Karteikarten beginnen neu ' ,
one: ' 1 Karteikarte beginnt neu ' ,
) ;
return ' $ _temp0 ' ;
}
feat(publish): releases in git (public tier, stage 2)
A person with an identity and a public profile publishes a studyset with
everything inside it as its next release (ADR 0005, rule 3): the server
reads their synced rows and writes them through the git command as a
commit on main and the annotated tag vN, in a bare repository of the
studyset's own, named by a random public id made at the first publish.
A release is a directory per studyset with a file per card, note, path,
step and PDF (its id, position, tag names and payload as synced, keys
sorted and indented) and the files the content names, without what is
only the author's (a card's report, a PDF's deadline). Publishing is
refused without a licence allowing passing it on in every studyset ("no
derivatives" allowed), with revisions to settle, with files not uploaded
yet, when nothing changed, or for a name that won't do; the name is
fixed from the first release, as is the person's handle.
In the app, Share in a studyset's action row opens the Publish sheet;
publishing syncs first, and settles by itself the revisions that merge
cleanly, listing only real conflicts. The server's image gets git, the
repositories a volume of their own, and the hourly backup a git bundle of
each.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-09 22:01:00 +02:00
@ override
String get studysetShare = > ' Teilen ' ;
@ override
String get studysetSharePrivate = > ' Teilen: privat ' ;
@ override
String get studysetSharePublished = > ' Teilen: veröffentlicht ' ;
@ override
String get publishTitle = > ' Veröffentlichen ' ;
@ override
String get publishPrivate = > ' Privat · nur du siehst es ' ;
@ override
String publishPublished ( int version , String date ) {
return ' Veröffentlicht · v $ version · $ date ' ;
}
@ override
String get publishIntro = >
' Eine Veröffentlichung ist dieses Lernset mit allem darin, so wie es jetzt ist. Andere können es finden, damit lernen und es kopieren. Jede Veröffentlichung bleibt, wie sie war; spätere Änderungen kommen in die nächste. ' ;
@ override
String get publishAnonymous = >
' Melde dich mit GitHub an, um ein öffentliches Profil zu haben und zu veröffentlichen. ' ;
@ override
String get publishName = > ' Name ' ;
@ override
String get publishNameHint = > ' japanisch ' ;
@ override
String publishLocation ( String location ) {
return ' Zu finden unter $ location ' ;
}
@ override
String get publishNameFixed = >
' Fest, seit du zuerst veröffentlicht hast: andere verweisen darauf. ' ;
@ override
String get publishLicence = > ' Lizenz ' ;
@ override
String get publishLicenceNone = > ' Keine ' ;
@ override
String get publishLicenceOpen = > ' Erlaubt das Veröffentlichen. ' ;
@ override
String get publishLicenceNoDerivatives = >
' Erlaubt das Veröffentlichen, wie es ist: Lernende behalten ihre Änderungen für sich. ' ;
@ override
String get publishLicenceClosed = >
' Erlaubt keine Weitergabe. Wähle unter Bearbeiten eine andere. ' ;
@ override
String publishLicenceNotOpen ( String titles ) {
return ' Die Lizenzen dieser Lernsets erlauben keine Weitergabe: $ titles ' ;
}
@ override
String get publishNotes = > ' Was sich geändert hat ' ;
@ override
String get publishNotesHint = > ' Neu in dieser Veröffentlichung … ' ;
@ override
String get publishReleases = > ' Veröffentlichungen ' ;
@ override
String publishRelease ( int version , String date ) {
return ' v $ version · $ date ' ;
}
@ override
String publishButton ( int version ) {
return ' v $ version veröffentlichen ' ;
}
@ override
String get publishNoProfile = >
' Eine Veröffentlichung nennt dich mit deinem öffentlichen Profil. Lege zuerst eines an. ' ;
@ override
String get publishMakeProfile = > ' Öffentliches Profil anlegen ' ;
@ override
String get publishConflicts = >
' Diese wurden auf zwei Geräten verschieden geändert. Kläre sie zuerst: ' ;
@ override
String get publishConflictsElsewhere = >
' Einige Karteikarten, Notizen oder Schritte wurden auf zwei Geräten verschieden geändert. Synchronisiere, dann versuche es noch einmal. ' ;
@ override
String get publishUntitled = > ' Ohne Titel ' ;
@ override
String get publishFilesMissing = >
' Einige Dateien sind noch nicht auf deiner Instanz angekommen. Versuche es gleich noch einmal. ' ;
@ override
String get publishNothingChanged = >
' Seit der letzten Veröffentlichung hat sich nichts geändert. ' ;
@ override
String get publishBusy = >
' Dieses Lernset wird schon veröffentlicht. Versuche es gleich noch einmal. ' ;
@ override
String get publishSlugInvalid = >
' Kleinbuchstaben, Ziffern und Bindestriche, am Anfang ein Buchstabe oder eine Ziffer. ' ;
@ override
String get publishSlugTaken = >
' Ein anderes deiner Lernsets hat diesen Namen. ' ;
@ override
String get publishNotesTooLong = > ' Höchstens 5.000 Zeichen. ' ;
@ override
String publishDone ( int version ) {
return ' v $ version veröffentlicht. ' ;
}
@ override
String get publishFailed = >
' Deine Instanz war nicht erreichbar. Nichts wurde veröffentlicht. ' ;
@ override
String get publishUnreachable = >
' Das Veröffentlichen ist gerade nicht erreichbar. ' ;
@ override
String get publishRetry = > ' Erneut versuchen ' ;
@ override
String get publishCopyLocation = > ' Adresse kopieren ' ;
@ override
String get publishLocationCopied = > ' Adresse kopiert. ' ;
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
}