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
{
"@@locale": "de",
"appTitle": "Halkyon Learn",
"shellTabHome": "Startseite",
"shellTabLibrary": "Bibliothek",
"shellTabExplore": "Entdecken",
"shellTabProfile": "Profil",
"homeTitle": "Startseite",
"libraryTitle": "Bibliothek",
"libraryCreateStudyset": "Lernset erstellen",
"libraryEmpty": "Noch keine Lernsets",
"libraryUnreadable": "Deine Lernsets konnten nicht gelesen werden.",
"libraryArchivedSection": "Archiviert",
"librarySearchTooltip": "Suchen",
"librarySearchHint": "Lernsets durchsuchen",
"librarySearchClearTooltip": "Suche löschen",
"librarySearchCloseTooltip": "Suche schließen",
"librarySearchNoMatches": "Keine Lernsets für deine Suche gefunden",
"libraryStudysetArchived": "Lernset archiviert",
"libraryStudysetUnarchived": "Lernset aus dem Archiv geholt",
"libraryStudysetDeleted": "Lernset gelöscht",
"libraryDeleteTitle": "Lernset löschen?",
"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.",
"libraryDeleteConfirm": "Löschen",
"studysetSheetCreateTitle": "Lernset erstellen",
"studysetSheetEditTitle": "Lernset bearbeiten",
"studysetSheetCreate": "Erstellen",
"studysetSheetSave": "Speichern",
"studysetSheetTitleLabel": "Titel",
"studysetSheetSecondaryLabel": "Zweittitel",
feat(app): Home, the Library and the studyset sheets laid out as before
Home: plain cards on the surface, 16 dp apart, the goal first and the
Pomodoro timer after it in a new dashboard. The streak chip sits centred
in the app bar, and its sheet shows the days inside a big flame and the
week as marks over the weekdays' initials, with a word on today in a box.
The week names its day as "Thursday, Oct 8" and its days carry no
tooltip. The heatmap scrolls its weekdays with the weeks, outlines the
days to come, and names a day's activities with its date. The goal card
has a ring of 5 dp, a check once met and a pencil, and its sheet saves
across its width with Remove goal below. Arranging puts an eye on each
widget's corner and lifts the one picked up, with a tap the hand feels;
with every widget hidden, Customise brings arranging back. The stepper
moves to core, where the goal's sheet takes it too.
Library: the counts line includes files (PDFs); Refresh in the app bar
and pulling the list down sync now; a list that can't be read offers
Retry, which reads it again; the star keeps its square corners.
Studyset sheet: "Title *", the secondary title explained behind a
question mark, Inherit as a box beside the colour, and the description
in up to three lines with a chevron. Move sheet: round marks, the
studyset itself marked as current, the top level only while it is
inside another, archived studysets last under their heading, the
destination named in the footer, and a new studyset to move into, made
only once the move is.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 11:12:23 +02:00
"studysetSheetSecondaryHelper": "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
"studysetSheetColor": "Farbe",
"studysetSheetDiscardTitle": "Änderungen verwerfen?",
"studysetSheetDiscardMessage": "Du hast ungespeicherte Änderungen an diesem Lernset. Verwerfen und das Formular schließen?",
"studysetSheetDiscardConfirm": "Verwerfen",
"paletteColorName": "{name, select, 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}}}",
"colorPickerLabel": "Farbe: {color}",
"studysetCountFlashcards": "{count, plural, =1{1 Karteikarte} other{{count} Karteikarten}}",
"studysetCountNotes": "{count, plural, =1{1 Notiz} other{{count} Notizen}}",
feat(app): Home, the Library and the studyset sheets laid out as before
Home: plain cards on the surface, 16 dp apart, the goal first and the
Pomodoro timer after it in a new dashboard. The streak chip sits centred
in the app bar, and its sheet shows the days inside a big flame and the
week as marks over the weekdays' initials, with a word on today in a box.
The week names its day as "Thursday, Oct 8" and its days carry no
tooltip. The heatmap scrolls its weekdays with the weeks, outlines the
days to come, and names a day's activities with its date. The goal card
has a ring of 5 dp, a check once met and a pencil, and its sheet saves
across its width with Remove goal below. Arranging puts an eye on each
widget's corner and lifts the one picked up, with a tap the hand feels;
with every widget hidden, Customise brings arranging back. The stepper
moves to core, where the goal's sheet takes it too.
Library: the counts line includes files (PDFs); Refresh in the app bar
and pulling the list down sync now; a list that can't be read offers
Retry, which reads it again; the star keeps its square corners.
Studyset sheet: "Title *", the secondary title explained behind a
question mark, Inherit as a box beside the colour, and the description
in up to three lines with a chevron. Move sheet: round marks, the
studyset itself marked as current, the top level only while it is
inside another, archived studysets last under their heading, the
destination named in the footer, and a new studyset to move into, made
only once the move is.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 11:12:23 +02:00
"studysetCountFiles": "{count, plural, =1{1 Datei} other{{count} Dateien}}",
"libraryRefresh": "Aktualisieren",
2026-10-08 14:47:23 +02:00
"libraryImport": "Importieren",
"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
"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
"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
"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
"studysetActionReview": "Wiederholen",
"studysetActionStudy": "Lernen",
"studysetActionAdd": "Inhalt hinzufügen",
"studysetArchived": "Archiviert",
"studysetStar": "Mit Stern markieren",
"studysetUnstar": "Markierung entfernen",
2026-10-10 05:17:10 +02:00
"studysetByYou": "Von dir",
"studysetByAuthor": "Von {author}",
"studysetByOthers": "Eine Kopie",
"studysetVisibilityPrivate": "Privat",
"studysetVisibilityPublic": "Öffentlich",
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
"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
"studysetBibliography": "Literaturverzeichnis",
"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
"studysetMenuEdit": "Bearbeiten",
"studysetMenuArchive": "Archivieren",
"studysetMenuUnarchive": "Aus Archiv holen",
"studysetMenuDelete": "Löschen",
"studysetMenuMove": "Verschieben nach…",
"studysetTabFlashcards": "Karteikarten",
"studysetTabNotes": "Notizen",
"studysetTabPaths": "Pfade",
"studysetCreatePath": "Pfad erstellen",
"pathImportMenu": "Pfad importieren (JSON)",
"pathImportFileType": "Lernpfad (JSON)",
"pathImported": "{count, plural, =1{„{title}“ mit 1 Schritt importiert.} other{„{title}“ mit {count} Schritten importiert.}}",
"pathImportSkipped": "{count, plural, =1{1 Block wurde ausgelassen: Bilder und Animationen werden nicht importiert.} other{{count} Blöcke wurden ausgelassen: Bilder und Animationen werden nicht importiert.}}",
"pathImportFailed": "Diese Datei konnte nicht importiert werden. {reason}",
"pathImportUnreadable": "Der Inhalt ist kein Text in UTF-8.",
"pathsEmpty": "Noch keine Pfade",
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
"pathsEmptyHint": "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
"pathOptions": "Pfadoptionen",
"pathEdit": "Bearbeiten",
"pathResetProgress": "Fortschritt zurücksetzen",
"pathProgressReset": "Fortschritt zurückgesetzt",
2026-10-08 11:52:14 +02:00
"pathResetTitle": "Fortschritt zurücksetzen?",
"pathResetMessage": "Dein gesamter Fortschritt in diesem Pfad wird gelöscht. Du kannst das einige Sekunden lang rückgängig machen.",
"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
"pathDelete": "Löschen",
"pathDeleteTitle": "Pfad löschen?",
"pathDeleteMessage": "Dieser Pfad und seine Schritte werden aus dem Lernset entfernt. Du kannst dies für einige Sekunden rückgängig machen.",
"pathDeleteConfirm": "Löschen",
"pathDeleted": "Pfad gelöscht",
"pathCreateTitle": "Neuer Pfad",
"pathCreate": "Erstellen",
"pathTitleLabel": "Titel",
"pathTitleRequired": "Ein Pfad braucht einen Titel.",
"pathSecondaryTitleLabel": "Zweittitel",
"pathSecondaryTitleHint": "Z. B. der Titel in der Sprache, die du lernst",
"pathEditTitle": "Pfad bearbeiten",
"pathDescription": "Beschreibung",
"pathAddDescription": "Beschreibung hinzufügen",
"pathDescriptionEditTitle": "Pfadbeschreibung",
"pathAddTags": "Tags hinzufügen",
"pathTags": "Tags",
2026-10-08 14:33:32 +02:00
"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
"pathSteps": "Schritte",
"pathStepsEmpty": "Noch keine Schritte",
"pathStepsEmptyHint": "Wähle einen Schritt-Typ, um mit dem Schreiben der Lektion zu beginnen.",
"pathAddStep": "Schritt hinzufügen",
"pathReorder": "Umsortieren",
"pathReorderDone": "Fertig",
"pathStepDelete": "Schritt löschen",
"pathStepDeleted": "Schritt gelöscht",
"stepUntitled": "Unbenannter Schritt",
"stepKindInfo": "Info",
"stepKindSingleChoice": "Einzelauswahl",
"stepKindMultipleChoice": "Mehrfachauswahl",
"stepKindDragAndDrop": "Ziehen und Ablegen",
"stepKindFillInTheBlank": "Lückentext",
"stepEditTitle": "Schritt bearbeiten",
"stepTitleHint": "Titel",
"stepOptions": "Optionen",
"stepOptionHint": "Option {number}",
"stepAddOption": "Option hinzufügen",
"stepRemoveOption": "Option entfernen",
"stepCorrectOption": "Richtige Option",
"stepCorrectOptions": "Richtige Optionen",
"stepCategories": "Kategorien",
"stepCategoryHint": "Kategorie {number}",
"stepAddCategory": "Kategorie hinzufügen",
"stepRemoveCategory": "Kategorie entfernen",
"stepItems": "Elemente",
"stepItemHint": "Element {number}",
"stepAddItem": "Element hinzufügen",
"stepRemoveItem": "Element entfernen",
"stepItemCategory": "Gehört zu",
"stepPassage": "Textpassage",
"stepPassageHint": "Gib ___ (drei Unterstriche) überall dort ein, wo ein Wort eingesetzt werden soll.",
"stepBlankHint": "Wort für Lücke {number}",
"stepIncomplete": "Noch nicht beantwortbar: Fülle jedes Feld aus und wähle, was richtig ist.",
"stepFeedbackRight": "Feedback nach einer richtigen Antwort",
"stepFeedbackWrong": "Feedback nach einer falschen Antwort",
"stepFeedbackNone": "Keines",
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
"sources": "Quellen",
"sourcesCount": "{count, plural, =1{1 Quelle} other{{count} Quellen}}",
"sourcesNone": "Noch keine Quellen angegeben.",
"sourcesEdit": "Quellen bearbeiten",
"sourcesEditDone": "Bearbeiten beenden",
"sourceAdd": "Quelle hinzufügen",
"sourceEdit": "Quelle bearbeiten",
"sourceRemove": "Quelle entfernen",
"sourceRemoved": "Quelle entfernt",
"sourceSheetAdd": "Hinzufügen",
"sourceAuthors": "Autoren",
"sourceAuthorsHint": "Vollständige Namen, einer pro Zeile, z. B. Mark A. McDaniel",
"sourceYear": "Jahr",
"sourceYearHint": "z. B. 2014",
"sourceTitle": "Titel",
"sourceTitleHint": "Titel des Werks",
"sourceContainer": "Erschienen in",
"sourceContainerHint": "Zeitschrift, Buch oder Website, mit Seiten",
"sourceContainerHelper": "Leer lassen bei einem eigenständigen Werk wie einem Buch.",
"sourcePublisher": "Verlag",
"sourcePublisherHint": "z. B. Belknap Press",
"sourceIsbn": "ISBN",
"sourceIsbnHint": "z. B. 978-0-674-72901-8",
"sourceUrl": "Link",
"sourceUrlHint": "https://…",
"sourceImportedAs": "Importiert als: {citation}",
"sourceIsbnLine": "ISBN: {isbn}",
"sourceAvailableAt": "Verfügbar unter:",
"sourceEmpty": "Leere Quellenangabe",
"sourceDiscardTitle": "Änderungen verwerfen?",
"sourceDiscardMessage": "Was du für diese Quelle eingegeben hast, geht verloren.",
"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
"stepConflict": "Dieser Schritt wurde auf einem anderen Gerät anders geändert. Behalte eine Version, um weiterzuschreiben.",
"stepFieldTitle": "Titel",
"stepFieldBody": "Text",
"stepFieldExercise": "Aufgabe",
"stepFieldRightFeedback": "Feedback nach einer richtigen Antwort",
"stepFieldWrongFeedback": "Feedback nach einer falschen Antwort",
"stepFieldSources": "Quellen",
"runnerClose": "Schließen",
"runnerEditStep": "Schritt bearbeiten",
"runnerBack": "Zurück",
"runnerCheck": "Antworten prüfen",
"runnerContinue": "Weiter",
"runnerFinish": "Abschließen",
"runnerRight": "Richtig!",
"runnerWrong": "Nicht ganz",
"runnerAlreadyRight": "Du hast das schon richtig beantwortet.",
"runnerSelectAll": "Wähle alle zutreffenden aus.",
"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.",
"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.",
"runnerEmpty": "Dieser Pfad hat noch keine Schritte.",
"runnerFinished": "Du hast diesen Pfad abgeschlossen",
"runnerFinishedSteps": "{count, plural, =1{1 Schritt abgeschlossen.} other{{count} Schritte abgeschlossen.}}",
"runnerNextPath": "Weiter zum nächsten Pfad",
"runnerBackToStudyset": "Zurück zum Lernset",
"studysetCountPaths": "{count, plural, =1{1 Pfad} other{{count} Pfade}}",
"studysetCreateNote": "Notiz erstellen",
"notesEmpty": "Noch keine Notizen",
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
"notesEmptyHint": "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
"noteUntitled": "Unbenannte Notiz",
"noteEdited": "Bearbeitet {when}",
"timeJustNow": "gerade eben",
"timeMinutesAgo": "{count, plural, =1{vor 1 Minute} other{vor {count} Minuten}}",
"timeHoursAgo": "{count, plural, =1{vor 1 Stunde} other{vor {count} Stunden}}",
"timeDaysAgo": "{count, plural, =1{gestern} other{vor {count} Tagen}}",
"noteOptions": "Notizoptionen",
"noteEdit": "Bearbeiten",
"noteDelete": "Löschen",
"noteDeleteTitle": "Notiz löschen?",
"noteDeleteMessage": "Diese Notiz wird aus dem Lernset entfernt. Du kannst dies für einige Sekunden rückgängig machen.",
"noteDeleteConfirm": "Löschen",
"noteDeleted": "Notiz gelöscht",
"noteTitleHint": "Titel",
"noteEditing": "Wird bearbeitet…",
"noteSaving": "Wird gespeichert…",
"noteSaved": "Gespeichert",
"noteSaveFailed": "Speichern fehlgeschlagen",
"noteConflict": "Diese Notiz wurde auf einem anderen Gerät anders geändert. Behalte eine Version, um weiterzuschreiben.",
"noteFieldTitle": "Titel",
"noteFieldBody": "Text",
"noteKeepThis": "Diese behalten",
"noteAddTags": "Tags hinzufügen",
2026-10-08 14:30:30 +02:00
"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
"studysetFlashcardsEmpty": "Noch keine Karteikarten",
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
"studysetFlashcardsEmptyHint": "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
"studysetAddMaterial": "Material hinzufügen",
"studysetCreateFlashcards": "Karteikarten erstellen",
"studysetStudy": "Lernen",
"studysetLearnCount": "{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
"studysetLearnFlashcards": "{count, plural, =1{1 Karteikarte lernen} other{{count} Karteikarten lernen}}",
"studysetNothingToStudy": "Noch nichts zu lernen",
"studysetStudyMode": "Lernmodus",
"studysetStartPath": "Starten: {title}",
"studysetContinuePath": "Fortsetzen: {title}",
"studysetStartPathHint": "Beginne mit dem ersten Schritt dieses Pfads.",
"studysetContinuePathHint": "Mach beim nächsten Pfadschritt weiter, wo du aufgehört hast.",
"studysetSpacedRepetition": "Verteilte Wiederholung",
"studysetSpacedRepetitionHint": "Wiederhole die fälligen Karten, geplant durch FSRS.",
"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
"studysetMenuExport": "Inhalt exportieren",
"exportRunning": "Wird exportiert …",
"exportedMarkdown": "Als Markdown exportiert.",
"exportedZip": "{count, plural, =1{Als Markdown mit 1 Datei exportiert (.zip).} other{Als Markdown mit {count} Dateien exportiert (.zip).}}",
"exportMissingFiles": "{count, plural, =1{1 Datei war nicht auf diesem Gerät und fehlt.} other{{count} Dateien waren nicht auf diesem Gerät und fehlen.}}",
"exportFailed": "Das Lernset konnte nicht exportiert werden.",
"exportQuestion": "F",
"exportAnswer": "A",
"exportHint": "Hinweis",
"exportIfRight": "Wenn richtig",
"exportIfWrong": "Wenn falsch",
"exportSound": "Ton",
"exportVideo": "YouTube-Video",
"exportSpoiler": "Spoiler",
"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
"studysetImportPath": "Lernpfad",
"studysetImportPathHint": "Aus einer Halkyon-Pfad-JSON-Datei",
"studysetImportAnki": "Anki-Deck",
"studysetImportAnkiHint": "Aus einer .apkg- oder .colpkg-Datei",
2026-10-08 14:43:49 +02:00
"studysetImportCards": "Karteikarten",
"studysetImportCardsHint": "Eingefügt oder aus einer CSV- oder TSV-Datei",
"cardTextImportTitle": "Karteikarten importieren",
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
"cardTextImportDescription": "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
"cardTextImportHint": "Füge die Karten hier ein",
"cardTextImportLoadFile": "CSV- oder TSV-Datei laden",
"cardTextImportFileType": "CSV- oder TSV-Dateien",
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
"cardTextImportUnreadable": "Diese Datei enthält keinen Text.",
2026-10-08 14:43:49 +02:00
"cardTextImportSeparator": "Trennzeichen",
"cardTextSeparatorTab": "Tab",
"cardTextSeparatorComma": "Komma",
"cardTextSeparatorSemicolon": "Semikolon",
"cardTextImportNone": "Noch keine Karten erkannt.",
"cardTextImportReady": "{count, plural, =1{1 Karte bereit zum Importieren.} other{{count} Karten bereit zum Importieren.}}",
"cardTextImportSubmit": "Importieren",
"cardTextImported": "{count, plural, =1{1 Karteikarte importiert.} other{{count} Karteikarten importiert.}}",
feat(app): the studyset screen laid out as before
The Study pill reads "Learn 12 flashcards" in the app bar and "Learn 12"
floating, "Study" with nothing due, and is off with nothing to study,
saying so. With a path not finished, a chevron beside it offers to start
or continue the path: a menu in the app bar, a Study mode sheet on
phones. The floating bar rises above the licence line, which takes two
lines at most.
Add material offers a path, flashcards, a note and a PDF, in that order;
imports moved to the options' Import content, which asks for a learning
path or an Anki deck. The options read Edit, Move, Study options, Import
content, Reset progress, Archive, Delete. The bibliography is an outlined
round button above the content, and on phones at the foot of the topics.
The tabs sit on a line of their own across the card, what the tab shown
offers beside them: the flashcards' filter and options, and on the paths
Reorder once there are two, which turns them into handles to drag. An
empty tab says so in its middle; tapping the open tab again returns to
its top, and pulling a tab down syncs. The breadcrumb's steps are plain
links between "›", the studyset itself bold. A long description is cut at
a fixed height, measured, with Read more opening it whole under the
studyset's title. A studyset that no longer exists leads back to the
library.
The topics: All topics on the primary colour, in view also while they
are rearranged; each topic with the study it invites in a round icon,
what it holds ("Empty" with nothing, files counted too), and its options
(now with Reset progress) behind "…" or a long press where the finger
is; New sub-studyset at the foot below a line, the list with its
scrollbar always shown. All topics opens Add material while nothing is
due.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 11:42:50 +02:00
"studysetReorder": "Umsortieren",
"studysetReorderPaths": "Pfade umsortieren",
2026-10-08 18:49:36 +02:00
"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
"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
"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
"studysetOpenTopics": "Themen anzeigen",
"studysetTopics": "Themen",
"studysetAllTopics": "Alle Themen",
"studysetNewSubStudyset": "Neues Unter-Lernset",
"studysetSubStudysetsEmpty": "Noch keine Unter-Lernsets.",
"studysetSubStudysetsEmptyHint": "Teile dieses Lernset in Meilensteine oder Lektionen auf.",
"studysetDragToReorder": "Zum Umsortieren ziehen",
"studysetMoveTitle": "Lernset verschieben nach",
"studysetMoveTopLevel": "Oberste Ebene",
feat(app): Home, the Library and the studyset sheets laid out as before
Home: plain cards on the surface, 16 dp apart, the goal first and the
Pomodoro timer after it in a new dashboard. The streak chip sits centred
in the app bar, and its sheet shows the days inside a big flame and the
week as marks over the weekdays' initials, with a word on today in a box.
The week names its day as "Thursday, Oct 8" and its days carry no
tooltip. The heatmap scrolls its weekdays with the weeks, outlines the
days to come, and names a day's activities with its date. The goal card
has a ring of 5 dp, a check once met and a pencil, and its sheet saves
across its width with Remove goal below. Arranging puts an eye on each
widget's corner and lifts the one picked up, with a tap the hand feels;
with every widget hidden, Customise brings arranging back. The stepper
moves to core, where the goal's sheet takes it too.
Library: the counts line includes files (PDFs); Refresh in the app bar
and pulling the list down sync now; a list that can't be read offers
Retry, which reads it again; the star keeps its square corners.
Studyset sheet: "Title *", the secondary title explained behind a
question mark, Inherit as a box beside the colour, and the description
in up to three lines with a chevron. Move sheet: round marks, the
studyset itself marked as current, the top level only while it is
inside another, archived studysets last under their heading, the
destination named in the footer, and a new studyset to move into, made
only once the move is.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 11:12:23 +02:00
"studysetMoveCurrent": "(aktuell)",
"studysetMoveTopLevelRow": "Oberste Ebene (in keinem Lernset)",
"studysetMoveArchived": "Archiviert",
"studysetMoveNew": "Neues Lernset",
"studysetMoveSelectDestination": "Wähle ein Ziel",
"studysetMoveDestination": "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
"studysetMoveConfirm": "Verschieben",
feat(app): Home, the Library and the studyset sheets laid out as before
Home: plain cards on the surface, 16 dp apart, the goal first and the
Pomodoro timer after it in a new dashboard. The streak chip sits centred
in the app bar, and its sheet shows the days inside a big flame and the
week as marks over the weekdays' initials, with a word on today in a box.
The week names its day as "Thursday, Oct 8" and its days carry no
tooltip. The heatmap scrolls its weekdays with the weeks, outlines the
days to come, and names a day's activities with its date. The goal card
has a ring of 5 dp, a check once met and a pencil, and its sheet saves
across its width with Remove goal below. Arranging puts an eye on each
widget's corner and lifts the one picked up, with a tap the hand feels;
with every widget hidden, Customise brings arranging back. The stepper
moves to core, where the goal's sheet takes it too.
Library: the counts line includes files (PDFs); Refresh in the app bar
and pulling the list down sync now; a list that can't be read offers
Retry, which reads it again; the star keeps its square corners.
Studyset sheet: "Title *", the secondary title explained behind a
question mark, Inherit as a box beside the colour, and the description
in up to three lines with a chevron. Move sheet: round marks, the
studyset itself marked as current, the top level only while it is
inside another, archived studysets last under their heading, the
destination named in the footer, and a new studyset to move into, made
only once the move is.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 11:12:23 +02:00
"studysetMoveShowInside": "Unter-Lernsets anzeigen",
"studysetMoveHideInside": "Unter-Lernsets ausblenden",
"studysetMoved": "„{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
"studysetReadMore": "Mehr anzeigen",
"studysetDescriptionTitle": "Beschreibung",
"studysetDescriptionEditTitle": "Beschreibung bearbeiten",
"richTextSave": "Speichern",
"studysetSheetDescription": "Beschreibung",
feat(app): Home, the Library and the studyset sheets laid out as before
Home: plain cards on the surface, 16 dp apart, the goal first and the
Pomodoro timer after it in a new dashboard. The streak chip sits centred
in the app bar, and its sheet shows the days inside a big flame and the
week as marks over the weekdays' initials, with a word on today in a box.
The week names its day as "Thursday, Oct 8" and its days carry no
tooltip. The heatmap scrolls its weekdays with the weeks, outlines the
days to come, and names a day's activities with its date. The goal card
has a ring of 5 dp, a check once met and a pencil, and its sheet saves
across its width with Remove goal below. Arranging puts an eye on each
widget's corner and lifts the one picked up, with a tap the hand feels;
with every widget hidden, Customise brings arranging back. The stepper
moves to core, where the goal's sheet takes it too.
Library: the counts line includes files (PDFs); Refresh in the app bar
and pulling the list down sync now; a list that can't be read offers
Retry, which reads it again; the star keeps its square corners.
Studyset sheet: "Title *", the secondary title explained behind a
question mark, Inherit as a box beside the colour, and the description
in up to three lines with a chevron. Move sheet: round marks, the
studyset itself marked as current, the top level only while it is
inside another, archived studysets last under their heading, the
destination named in the footer, and a new studyset to move into, made
only once the move is.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 11:12:23 +02:00
"studysetSheetDescriptionAdd": "Tippen, um eine Beschreibung hinzuzufügen",
"studysetSheetDescriptionAdded": "Beschreibung hinzugefügt — zum Bearbeiten tippen",
"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
"studysetSheetLanguages": "Sprachen",
"studysetSheetSetLanguages": "Sprachen festlegen",
"studysetSheetLanguagesHelper": "In welcher Sprache die Seiten der Karten sind. Chinesisch, Japanisch und Koreanisch erscheinen dann in ihren eigenen Schriftzeichen.",
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
"studysetSheetLanguagesInherited": "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
"studysetSheetFrontLanguage": "Sprache der Vorderseite",
"studysetSheetBackLanguage": "Sprache der Rückseite",
"studysetSheetLanguageNotSet": "Nicht festgelegt",
2026-10-08 23:48:43 +02:00
"studysetSheetLicense": "Lizenz",
"studysetSheetLicenseHelp": "Hilf mir bei der Wahl",
"studysetSheetLicenseLabel": "Lizenz",
"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.",
"studysetSheetLicenseYear": "Jahr",
"studysetSheetLicenseYearHelper": "Das Jahr des Urheberrechts, angezeigt als „© 2019 Name“. Optional.",
"studysetSheetLicenseYearInvalid": "Gib ein Jahr zwischen {min} und {max} ein.",
"@studysetSheetLicenseYearInvalid": {"placeholders": {"min": {"type": "int"}, "max": {"type": "int"}}},
"studysetSheetLicenseHolder": "Rechteinhaber",
"studysetSheetLicenseHolderHelper": "Wer genannt wird: ein Name oder eine Organisation.",
"studysetSheetLicenseNewer": "{license} ist eine ältere Creative-Commons-Lizenz. Ihre aktuelle Version, {current}, passt vielleicht besser.",
"@studysetSheetLicenseNewer": {"placeholders": {"license": {"type": "String"}, "current": {"type": "String"}}},
"licenseChooserTitle": "Lizenz wählen",
"licenseChooserSubtitle": "Ein paar Fragen, um die Creative-Commons-Lizenz zu finden, die dazu passt, wie du dein Werk teilen möchtest.",
"licenseChooserIntroPrompt": "Möchtest du Rechte an deinem Werk behalten?",
"licenseChooserIntroYes": "Ja, unter einer Lizenz teilen",
"licenseChooserIntroYesDetail": "Andere müssen die Bedingungen einhalten, die du als Nächstes wählst.",
"licenseChooserIntroNo": "Nein, als Gemeingut freigeben",
"licenseChooserIntroNoDetail": "CC0: Jeder darf es für alles nutzen, ohne Bedingungen.",
"licenseChooserCommercialPrompt": "Dürfen andere dein Werk kommerziell nutzen?",
"licenseChooserYes": "Ja",
"licenseChooserCommercialYesDetail": "Auch mit Gewinnabsicht.",
"licenseChooserNo": "Nein",
"licenseChooserCommercialNoDetail": "Nur nicht-kommerzielle Nutzung (NC).",
"licenseChooserAdaptationsPrompt": "Dürfen andere dein Werk bearbeiten oder darauf aufbauen?",
"licenseChooserAdaptationsYesDetail": "Bearbeitungen und Remixe sind erlaubt.",
"licenseChooserAdaptationsShareAlike": "Ja, unter gleichen Bedingungen",
"licenseChooserAdaptationsShareAlikeDetail": "Bearbeitungen stehen unter derselben Lizenz (SA).",
"licenseChooserAdaptationsNoDetail": "Nur Weitergabe, keine Bearbeitungen (ND).",
"licenseChooserBack": "Zurück",
"licenseChooserRecommended": "Empfohlene Lizenz",
"licenseChooserUse": "Diese Lizenz verwenden",
"licenseSummaryCc0": "Jeder darf es für alles nutzen, ohne Bedingungen und ohne Nennung.",
"licenseSummaryBy": "Andere dürfen es teilen und bearbeiten, auch kommerziell, solange sie dich nennen.",
"licenseSummaryBySa": "Andere dürfen es teilen und bearbeiten, auch kommerziell, wenn sie dich nennen und ihre Bearbeitungen genauso lizenzieren.",
"licenseSummaryByNc": "Andere dürfen es für nicht-kommerzielle Zwecke teilen und bearbeiten, mit Nennung.",
"licenseSummaryByNcSa": "Andere dürfen es nicht-kommerziell teilen und bearbeiten, mit Nennung und derselben Lizenz für Bearbeitungen.",
"licenseSummaryByNd": "Andere dürfen es teilen, auch kommerziell, mit Nennung, aber keine Bearbeitungen weitergeben.",
"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
"languageArabic": "Arabisch",
"languageGerman": "Deutsch",
"languageGreek": "Griechisch",
"languageEnglish": "Englisch",
"languageSpanish": "Spanisch",
"languageFrench": "Französisch",
"languageHebrew": "Hebräisch",
"languageHindi": "Hindi",
"languageItalian": "Italienisch",
"languageJapanese": "Japanisch",
"languageKorean": "Koreanisch",
"languageDutch": "Niederländisch",
"languagePolish": "Polnisch",
"languagePortuguese": "Portugiesisch",
"languageRussian": "Russisch",
"languageSwedish": "Schwedisch",
"languageThai": "Thailändisch",
"languageTurkish": "Türkisch",
"languageUkrainian": "Ukrainisch",
"languageVietnamese": "Vietnamesisch",
"languageChineseSimplified": "Chinesisch (vereinfacht)",
"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
"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
"exploreTitle": "Entdecken",
"exploreEmpty": "Lernsets, die andere teilen, erscheinen hier.",
"profileTitle": "Profil",
"profileSettingsTooltip": "Einstellungen",
"profileIdentified": "Dein Fortschritt wird in deinem Konto gespeichert.",
"profileAnonymous": "Dein Fortschritt wird auf diesem Gerät gespeichert. Melde dich an, um ihn zu behalten.",
"profileSignInWithGitHub": "Mit GitHub anmelden",
"profileSignInFailed": "Anmeldung mit GitHub fehlgeschlagen.",
"profileContinueInBrowser": "Fahre in deinem Browser fort.",
"profileSwitchTitle": "Zu deinem GitHub-Konto wechseln?",
"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.",
"profileSwitchStay": "Anonym bleiben",
"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
"publicProfileTitle": "Öffentliches Profil",
"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.",
"publicProfileAnonymousHint": "Melde dich mit GitHub an, um ein öffentliches Profil zu haben und zu veröffentlichen.",
"publicProfileDisplayName": "Anzeigename",
"publicProfileDisplayNameHint": "Der Name neben deinem Handle",
"publicProfileHandle": "Handle",
"publicProfileHandleHint": "Buchstaben, Ziffern und Unterstriche, bis zu 30",
"publicProfileAddress": "Andere finden dich als @{address}",
"@publicProfileAddress": {"placeholders": {"address": {"type": "String"}}},
"publicProfileHandleFixed": "Fest, seit du veröffentlicht hast: Andere verweisen darauf.",
"publicProfileBio": "Über dich",
"publicProfileLinks": "Links",
"publicProfileLinksHint": "Deine Website oder andere Konten, bis zu 4.",
"publicProfileLinkHint": "https://…",
"publicProfileAddLink": "Link hinzufügen",
"publicProfileRemoveLink": "Link entfernen",
"publicProfileSaved": "Profil gespeichert.",
"publicProfileRemove": "Profil entfernen",
"publicProfileRemoveTitle": "Dein öffentliches Profil entfernen?",
"publicProfileRemoveMessage": "Dein Handle wird für andere frei.",
"publicProfileRemoved": "Profil entfernt.",
"publicProfileFailed": "Die Instanz ist nicht erreichbar. Versuche es erneut.",
"publicProfileUnreachable": "Dein öffentliches Profil ist gerade nicht erreichbar.",
"publicProfileRetry": "Erneut versuchen",
"profileProblemHandleInvalid": "Ein Handle besteht aus 1 bis 30 Buchstaben (a bis z), Ziffern oder Unterstrichen.",
"profileProblemHandleReserved": "Dieses Handle ist der Instanz vorbehalten.",
"profileProblemHandleTaken": "Dieses Handle hat schon jemand anderes.",
"profileProblemPublished": "Du hast veröffentlicht: Dein Handle kann sich nicht mehr ändern und dein Profil nicht mehr gehen.",
"profileProblemDisplayNameTooLong": "Höchstens 30 Zeichen.",
"profileProblemBioTooLong": "Höchstens 500 Zeichen.",
"profileProblemTooManyLinks": "Höchstens 4 Links.",
"profileProblemLinkInvalid": "Links beginnen mit https:// oder http://.",
"profileProblemAvatarInvalid": "Dieses Bild lässt sich nicht verwenden: Wähle ein PNG-, JPEG-, WebP- oder GIF-Bild.",
"publicProfilePicture": "Bild",
"publicProfileChoosePicture": "Bild wählen",
"publicProfileRemovePicture": "Bild entfernen",
"publicProfilePictureType": "Bilder",
"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
"settingsTitle": "Einstellungen",
"settingsAccount": "Konto",
feat(instances): choose the instance, and keep accounts on several
A new install asks first which instance to keep the person's studysets
on, as Mastodon's apps do: an address, checked to answer as an instance
of Halkyon Learn, or the build's own (learn.halkyon.eu) in one tap.
Nothing is made anywhere before that, not even an anonymous account. An
install from before goes on with the build's instance without asking.
As Moshidon does, the device keeps an account on each instance it was
used with, each signed in with its own folder and session, one in use at
a time. Settings › Switch account lists them: another one switches at
once, anonymous accounts included; Add account chooses another instance;
removing one not in use deletes what the device holds of it. Signing out
ends only the account in use.
The build's own instance keeps its data where installs kept it before
(`people/`, Serverpod's own session key), so they keep everything; other
instances get folders and keys of their own. What the device shares
across instances (its settings, sounds, the Pomodoro timer's place in the
system) is made once and outlives every switch.
The F-Droid listing drops TetheredNet: the app is no longer tied to the
project's instance.
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-10 06:00:47 +02:00
"instanceWelcome": "Willkommen bei Halkyon Learn",
"instanceFirstStartSubtitle": "Wähle die Instanz, auf der deine Lernsets liegen sollen. Jede betreibt jemand; weitere kannst du später hinzufügen.",
"instanceAddress": "Adresse der Instanz",
"instanceUseBuiltIn": "{name} verwenden",
"instanceContinue": "Weiter",
"instanceAddressRequired": "Gib die Adresse einer Instanz ein.",
"instanceAddressInvalid": "Das ist keine Adresse.",
"instanceUnreachable": "Unter {name} antwortet keine Instanz von Halkyon Learn.",
"instanceOpenFailed": "Die App auf {name} konnte nicht geöffnet werden.",
"settingsSwitchAccount": "Konto wechseln",
"accountsTitle": "Konten",
"accountAdd": "Konto hinzufügen",
"accountAddSubtitle": "Wähle die Instanz für das Konto, das du hinzufügst.",
"accountRemoveTooltip": "Konto entfernen",
"accountRemoveTitle": "Konto entfernen?",
"accountRemoveMessage": "Entfernt das Konto auf {name} von diesem Gerät, mit allem, was das Gerät davon hat. Was es synchronisiert hat, bleibt auf {name}: Melde dich dort mit GitHub an, um es wiederzuhaben. In ein anonymes Konto kann man sich nicht wieder anmelden.",
"accountRemoveConfirm": "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
"settingsSignOut": "Abmelden",
"settingsSignOutTitle": "Abmelden?",
"settingsSignOutAnonymousMessage": "Bei diesem Konto kannst du dich nicht wieder anmelden, deshalb wird es beim Abmelden samt Fortschritt gelöscht.",
"settingsDeleteAccount": "Konto löschen",
"settingsDeleteTitle": "Dein Konto löschen?",
"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.",
"settingsAbout": "Über Halkyon Learn",
"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.",
"aboutSourceCode": "Der Quellcode dessen, was diese Instanz ausführt:",
"aboutSourceUnreachable": "Diese Instanz war nicht erreichbar, um nach ihrem Quellcode zu fragen.",
"settingsAppearance": "Darstellung",
"settingsAppearanceDevice": "Gerätedesign",
"settingsAppearanceLight": "Hell",
"settingsAppearanceDark": "Dunkel",
"settingsLanguage": "Sprache",
"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
"settingsCitations": "Quellenangaben",
"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.",
"settingsCitationStyle": "Stil",
"settingsCitationStyleApa": "APA (7. Auflage)",
"settingsCitationStyleMla": "MLA (9. Auflage)",
"settingsCitationStyleChicago": "Chicago (18. Auflage)",
"settingsCitationPreview": "Vorschau",
"settingsCitationGuide": "Offizieller Leitfaden",
2026-10-07 21:10:33 +02:00
"settingsStudy": "Lernen",
"settingsStudyPomodoroTitle": "Pomodoro-Timer beim Lernen anzeigen",
"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
"settingsVersion": "Version {version} (Build {build})",
"syncTitle": "Synchronisierung",
"syncStateSyncing": "Wird synchronisiert…",
"syncStateSynced": "Alles synchronisiert",
"syncStateNotYet": "Noch nicht synchronisiert",
"syncStateFailing": "Synchronisierung schlägt fehl",
"syncStateMismatch": "Diese App kann nicht mit {server} synchronisieren",
"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.",
"syncLastCompleted": "Zuletzt abgeschlossen um {time}",
"syncNoRunYet": "Seit dem Start der App wurde noch keine Synchronisierung abgeschlossen",
"syncLastFailed": "Letzter Versuch fehlgeschlagen um {time}",
"syncNow": "Jetzt synchronisieren",
2026-10-10 05:29:43 +02:00
"syncPending": "{count, plural, =1{1 Änderung wartet auf die Synchronisierung} other{{count} Änderungen warten auf die Synchronisierung}}",
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
"syncTroubleLabel": "Synchronisierung benötigt Aufmerksamkeit",
"syncMismatchBanner": "Diese App kann nicht mehr mit {server} synchronisieren. Aktualisiere sie, um weiter zu synchronisieren.",
"syncMismatchMore": "Mehr",
"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
"notesReadFailed": "Die Notizen konnten nicht gelesen werden.",
"pathsReadFailed": "Die Lernpfade konnten nicht gelesen werden.",
"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
"tagPickerTitle": "Tags",
"tagPickerManage": "Tags verwalten",
"tagPickerSearchLabel": "Tag suchen oder erstellen",
"tagPickerCreate": "„{name}“ erstellen",
"tagSheetCreateTitle": "Tag erstellen",
"tagSheetEditTitle": "Tag bearbeiten",
"tagSheetNameLabel": "Name",
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
"tagSheetNameHelper": "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
"tagSheetNameExists": "Den Tag „{name}“ gibt es bereits.",
"tagSheetNameMerges": "Es gibt bereits einen Tag „{name}“: Beim Speichern wird dieser mit ihm zusammengeführt.",
"tagSheetColor": "Farbe",
"tagSheetCreate": "Erstellen",
"tagSheetSave": "Speichern",
"tagManageTitle": "Tags verwalten",
"tagManageEmpty": "Noch keine Tags. Füge unten einen hinzu.",
"tagManageAdd": "Tag hinzufügen",
"tagManageRow": "{name} ({count})",
"tagManageEdit": "Tag bearbeiten",
"tagManageDelete": "Tag löschen",
"tagDeleteTitle": "Tag „{name}“ löschen?",
"tagDeleteMessage": "{count, plural, =0{Er ist an keiner Karteikarte.} =1{Er wird auf all deinen Geräten von 1 Karteikarte entfernt.} other{Er wird auf all deinen Geräten von {count} Karteikarten entfernt.}}",
"tagDeleteConfirm": "Löschen",
"tagDeleted": "Tag „{name}“ gelöscht",
"studySettingsTitle": "Sitzungseinstellungen",
"studySettingsFilterByTags": "Nach Tags filtern",
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
"studySettingsNoTags": "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
"studySettingsReset": "Zurücksetzen",
"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
"studySettingsHeadsUpTitle": "Achtung!",
"studySettingsHeadsUpBody": "Die vorgenommenen Änderungen laden die Sitzung neu und dein aktueller Fortschritt geht verloren.",
"studySettingsApplyChanges": "Änderungen übernehmen",
"studySettingsPerDay": " / Tag",
"studySettingsMoreTags": "+{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
"cardTagsLabel": "Tags",
"cardTagsAdd": "Tags hinzufügen",
"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
"tagChipsOverflow": "+{count, plural, =1{1 Tag} other{{count} Tags}}",
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
"cardHints": "Hinweise",
"cardHint": "Hinweis {number}",
"cardAddHint": "Hinweis hinzufügen",
"cardRemoveHint": "Hinweis entfernen",
"cardExplanation": "Erklärung",
"cardAddExplanation": "Erklärung hinzufügen",
"cardRemoveExplanation": "Erklärung entfernen",
"cardHintsSheetTitle": "{count, plural, =1{Hinweis} other{Hinweise {count}}}",
"cardPreviousHint": "Vorheriger Hinweis",
"cardNextHint": "Nächster Hinweis",
"cardReport": "Meldung",
"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
"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
"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
"studysetFromDictionary": "Aus dem Wörterbuch",
"dictionaryTitle": "Wörterbuch",
"dictionarySearchHint": "Ein Wort in Kanji, Kana oder Romaji, oder eine Bedeutung",
"dictionaryNothingFound": "Nichts gefunden für „{query}“.",
"dictionaryUnreachable": "Das Wörterbuch ist gerade nicht erreichbar.",
"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
"dictionaryAddFailed": "Die Wörter konnten nicht hinzugefügt werden. Versuche es erneut.",
"dictionaryMakingCards": "Die Karteikarten werden erstellt…",
"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
"dictionaryAdd": "Hinzufügen",
"dictionaryInStudyset": "In diesem Lernset",
"dictionaryAdded": "„{word}“ hinzugefügt.",
"dictionaryLevels": "Eine ganze Stufe hinzufügen",
"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.",
"dictionaryLabelCommon": "Häufig",
"dictionaryAddLevel": "{count, plural, =1{1 Wort hinzufügen} other{{count} Wörter hinzufügen}}",
"dictionaryAddingLevel": "Wird hinzugefügt… {done} von {count}",
"dictionaryWordsAdded": "{count, plural, =0{Keine neuen Wörter.} =1{1 Wort hinzugefügt.} other{{count} Wörter hinzugefügt.}}",
"dictionaryWordsSkipped": "{count, plural, =1{1 war schon in diesem Lernset.} other{{count} waren schon in diesem Lernset.}}",
"dictionaryConfirmTitle": "{count} Wörter hinzufügen?",
"dictionaryConfirmMessage": "Jedes wird eine Karteikarte in diesem Lernset.",
"dictionaryConfirmAdd": "Hinzufügen",
"dictionaryCredits": "Wörter aus {sources}.",
"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
"dictionaryCharacterSearchHint": "Ein Kanji oder Kana, eine Lesung in Kana oder Romaji, oder eine Bedeutung",
"dictionaryTabWords": "Wörter",
"dictionaryTabCharacters": "Kanji & Kana",
"dictionaryLabelHiragana": "Hiragana",
"dictionaryLabelKatakana": "Katakana",
"dictionaryGrade": "Klasse {grade}",
"@dictionaryGrade": {"placeholders": {"grade": {"type": "int"}}},
"dictionaryLabelSecondary": "Weiterführende Schule",
"dictionaryGroupKana": "Kana",
"dictionaryGroupJlpt": "JLPT-Stufen",
"dictionaryGroupGrades": "Schuljahre",
"dictionaryStrokes": "{count, plural, =1{1 Strich} other{{count} Striche}}",
"@dictionaryStrokes": {"placeholders": {"count": {"type": "int"}}},
feat(dictionary): the radicals, each listing the kanji written with it
Beside Words and Kanji & kana, a Radicals tab lists the 214 Kangxi
radicals by their strokes, with the forms Japanese writes them as inside
kanji (亻, 氵, 艹, …). One chosen lists the kanji KANJIDIC2 files under
it, in the dictionary's order, to add or to see how one is written; the
tab shares the characters' bloc, so a kanji added there shows as held in
a search too.
The curator labels each kanji with its classical radical (`radical:N`),
so the server's existing label queries serve the tab unchanged. Its
files now say which conversion made them (`.conversion`): an instance
running a curator that converts differently converts again at once,
rather than at its weekly update, so the radicals appear right after a
deploy.
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-10 02:13:06 +02:00
"dictionaryTabRadicals": "Radikale",
"dictionaryRadicalsHint": "Die 214 Radikale, nach denen Wörterbücher Kanji ordnen, nach ihrer Strichzahl gruppiert. Wähle eins für die Kanji, die damit geschrieben werden.",
"dictionaryAllRadicals": "Alle Radikale",
"dictionaryRadicalNumber": "Radikal {number}",
"@dictionaryRadicalNumber": {"placeholders": {"number": {"type": "int"}}},
"dictionaryRadicalKanjiCount": "{count} Kanji",
"@dictionaryRadicalKanjiCount": {"placeholders": {"count": {"type": "int"}}},
"dictionaryRadicalNone": "Das Wörterbuch der Instanz hat unter diesem Radikal noch keine Kanji.",
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
"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.",
"dictionaryAddCharacters": "{count, plural, =1{1 Schriftzeichen hinzufügen} other{{count} Schriftzeichen hinzufügen}}",
"@dictionaryAddCharacters": {"placeholders": {"count": {"type": "int"}}},
"dictionaryCharactersAdded": "{count, plural, =0{Keine neuen Schriftzeichen.} =1{1 Schriftzeichen hinzugefügt.} other{{count} Schriftzeichen hinzugefügt.}}",
"@dictionaryCharactersAdded": {"placeholders": {"count": {"type": "int"}}},
"dictionaryConfirmCharactersTitle": "{count} Schriftzeichen hinzufügen?",
"@dictionaryConfirmCharactersTitle": {"placeholders": {"count": {"type": "int"}}},
"dictionaryCharacterCredits": "Schriftzeichen aus {sources}.",
"@dictionaryCharacterCredits": {"placeholders": {"sources": {"type": "String"}}},
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
"dictionaryUpdatesBehind": "{count, plural, =1{1 Karteikarte ist hinter dem Wörterbuch zurück: Ihr Eintrag wurde seitdem korrigiert.} other{{count} Karteikarten sind hinter dem Wörterbuch zurück: Ihre Einträge wurden seitdem korrigiert.}}",
"@dictionaryUpdatesBehind": {"placeholders": {"count": {"type": "int"}}},
"dictionaryUpdatesTake": "Korrekturen übernehmen",
"dictionaryUpdatesTaken": "{count, plural, =1{1 Karteikarte aktualisiert.} other{{count} Karteikarten aktualisiert.}}",
"@dictionaryUpdatesTaken": {"placeholders": {"count": {"type": "int"}}},
"dictionaryUpdatesToSettle": "{count, plural, =1{Eine hat dort auch eine Änderung von dir: Öffne sie, um zu wählen.} other{{count} haben dort auch eine Änderung von dir: Öffne sie, um zu wählen.}}",
"@dictionaryUpdatesToSettle": {"placeholders": {"count": {"type": "int"}}},
"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
"kanjiStrokeOrder": "Strichfolge",
"kanjiPlayAgain": "Noch einmal abspielen",
"kanjiNoStrokes": "Für dieses Schriftzeichen gibt es keine Strichfolge.",
"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
"studySettingsCharacters": "Kanji & Kana",
"studySettingsWriteByHand": "Von Hand schreiben",
"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.",
"writingHint": "Tipp",
"writingShow": "Zeigen",
"writingMistakes": "{count, plural, =0{Keine Fehler} =1{1 Fehler} other{{count} Fehler}}",
"@writingMistakes": {"placeholders": {"count": {"type": "int"}}},
"writingWrongOrder": "Noch nicht: Dieser Strich kommt später.",
"writingWrong": "Das ist nicht der nächste Strich.",
"writingSuggested": "{rating} vorgeschlagen",
"@writingSuggested": {"placeholders": {"rating": {"type": "String"}}},
"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
"aboutDictionaries": "Wörterbücher dieser Instanz",
2026-10-09 16:05:05 +02:00
"aboutAppData": "Daten in der App",
2026-10-07 21:31:48 +02:00
"cardReportTitle": "Fehler melden",
"cardReportSubtitle": "Markiere diese Karte, um sie später zu finden und zu korrigieren.",
"cardReportTypo": "Tippfehler",
"cardReportGrammar": "Grammatik",
"cardReportContent": "Inhalt",
"cardReportOther": "Sonstiges",
"cardReportNote": "Notiz",
"cardReportNoteHint": "Was muss korrigiert werden?",
"cardReportSubmit": "Melden",
"cardReported": "Zur Korrektur markiert",
"cardResolveReport": "Meldung erledigen",
"cardReportResolved": "Meldung erledigt",
"cardBuriedBadge": "Zurückgestellt",
"cardUnbury": "Zurückstellung aufheben",
"cardTileBuried": "Karteikarte bis morgen zurückgestellt",
"cardTileUnburied": "Karteikarte nicht mehr zurückgestellt",
2026-10-07 21:52:03 +02:00
"cardDeleteTitle": "Karteikarte löschen?",
"cardDeleteMessage": "Diese Karteikarte wird aus dem Lernset entfernt. Du kannst dies für einige Sekunden rückgängig machen.",
"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
"cardFilterTooltip": "Filter",
"cardFilterTitle": "Filter",
"cardFilterTag": "Tag",
"cardFilterAllTags": "Alle Tags",
"cardFilterNoTags": "Keine dieser Karteikarten hat bisher einen Tag.",
"cardFilterClear": "Alles zurücksetzen",
"cardFilterApply": "Anwenden",
"cardFilterNothing": "Keine Karteikarte hat diesen Tag.",
"cardListFailed": "Die Karten konnten nicht gelesen werden.",
"cardListMore": "Mehr",
"cardListManageTags": "Tags verwalten",
"composerTitle": "Karteikarten erstellen",
"composerTitleFor": "Karteikarten erstellen für „{title}“",
"composerEditTitle": "Karteikarten bearbeiten",
"composerEditTitleFor": "Karteikarten bearbeiten in „{title}“",
"composerSaving": "Wird gespeichert…",
"composerSaveFailed": "Speichern fehlgeschlagen – erneut versuchen",
"composerAllSaved": "Alle Änderungen gespeichert",
"composerNewFlashcard": "Neue Karteikarte",
"composerCollapseStack": "Stapel einklappen",
"composerExpandStack": "Stapel ausklappen",
"composerStatusSaving": "Wird gespeichert",
"composerStatusSaved": "Gespeichert",
"composerStatusFailed": "Speichern fehlgeschlagen",
"composerSaveFailedInline": "Speichern fehlgeschlagen.",
"composerRetry": "Erneut versuchen",
"composerEmptyPane": "Füge eine Karteikarte hinzu, um loszulegen.",
"composerKindFlashcard": "Karteikarte",
"composerKindVocabulary": "Vokabel",
"composerKindMatching": "Zuordnung",
"composerKindMap": "Landkarte",
2026-10-09 15:00:21 +02:00
"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
"composerLabelFront": "Vorderseite",
"composerLabelQuestion": "Frage",
"composerLabelExpression": "Ausdruck",
"composerLabelPrompt": "Aufgabe",
2026-10-09 15:00:21 +02:00
"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
"composerLabelBack": "Rückseite",
"composerLabelAnswers": "Antworten",
"composerLabelAnswer": "Antwort",
"composerPlaceholderFront": "Frage hinzufügen",
"composerPlaceholderExpression": "Ausdruck hinzufügen",
"composerPlaceholderPrompt": "Aufgabe hinzufügen",
2026-10-09 15:00:21 +02:00
"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
"composerAddAnswer": "Antwort hinzufügen",
"composerCorrectAnswer": "Richtige Antwort",
"composerWrongAnswer": "Falsche Antwort",
"composerRemoveAnswer": "Antwort entfernen",
"composerPin": "{field} anheften: für die nächste Karte behalten",
"composerUnpin": "{field} nicht mehr anheften: für die nächste Karte leeren",
"composerTags": "Tags",
"composerAddTags": "Tags hinzufügen",
"composerMoreActions": "Weitere Aktionen",
"composerDuplicate": "Duplizieren",
"composerClearFields": "Felder leeren",
"composerDelete": "Löschen",
"composerDeleteTitle": "Diese Karteikarte löschen?",
"composerDeleteDraftMessage": "Der Entwurf wird aus dieser Sitzung entfernt. Er wurde noch nicht gespeichert.",
"composerDeleteSavedMessage": "Die Karteikarte wird auf all deinen Geräten aus dem Lernset entfernt.",
"composerDiscardTitle": "{count, plural, =1{Nicht gespeicherte Karteikarte verwerfen?} other{Nicht gespeicherte Karteikarten verwerfen?}}",
"composerDiscardMessage": "{count, plural, =1{1 Karteikarte wurde noch nicht gespeichert. Wenn du jetzt gehst, wird sie verworfen.} other{{count} Karteikarten wurden noch nicht gespeichert. Wenn du jetzt gehst, werden sie verworfen.}}",
"composerDiscardConfirm": "Verwerfen",
feat(explore): take a later release into a copy, at a tap
A copy's top studyset says when a newer release of what it came from is
out, and what it would bring: changed, new and withdrawn items, counted
against the release the copy last took. Update takes it, never by
itself (ADR 0005, rule 4): cards, notes and steps take the release as a
revision on the one where they last took a release and merge per side,
as a dictionary's corrections do, so what the learner changed stays and
a side both changed is a conflict to settle; studysets, paths and PDFs
take each field the learner left as it was. New items come in where
they belong, unless the learner deleted that part; what the author
withdrew stays, marked, and the card browser filters for it; what the
learner deleted stays deleted; progress is never touched.
The instance gives out any release by its version, for the app to
compare the two. UpdateTaken moves into the shared revision merge, now
that notes and steps take updates too.
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 23:47:41 +02:00
"composerConflict": "Diese Karteikarte wurde auf zwei Arten zugleich geändert: auf zwei deiner Geräte oder von dir und durch eine Korrektur im Wörterbuch oder eine neue Veröffentlichung dessen, wovon es kopiert ist. 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
"composerKeepThis": "Diese behalten",
"formatAlignLeft": "Linksbündig",
"formatAlignCenter": "Zentriert",
"formatAlignRight": "Rechtsbündig",
"formatBold": "Fett",
"formatItalic": "Kursiv",
"formatUnderline": "Unterstrichen",
"formatSuperscript": "Hochgestellt",
"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
"formatRuby": "Furigana (eine Lesung über dem Text)",
"rubyTitle": "Furigana",
"rubyReading": "Lesung",
"rubyReadingHint": "In Kana, z. B. かんじ",
"rubySave": "Speichern",
"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
"vocabularyReading": "Lesung",
"vocabularyReadingHint": "Kana-Lesung",
"vocabularyMeanings": "Bedeutungen",
"vocabularyPrimaryMeaningHint": "Hauptbedeutung",
"vocabularyMeaningHint": "Bedeutung",
"vocabularyAddMeaning": "Bedeutung hinzufügen",
"vocabularyRemoveMeaning": "Bedeutung entfernen",
2026-10-07 21:38:41 +02:00
"vocabularyGlossHint": "Übersetzung",
"vocabularyAddGloss": "Übersetzung hinzufügen",
"vocabularyRemoveGloss": "Übersetzung entfernen",
"vocabularyAddSense": "Wortbedeutung hinzufügen",
"vocabularyRemoveSense": "Wortbedeutung entfernen",
2026-10-09 15:00:21 +02:00
"characterPrimaryMeaningHint": "Hauptbedeutung, bei Kana die Umschrift",
"characterOnReadings": "On-Lesungen",
"characterOnReadingsHint": "Aus dem Chinesischen, in Katakana: ショク、ジキ",
"characterKunReadings": "Kun-Lesungen",
"characterKunReadingsHint": "Japanisch, in Hiragana, Okurigana nach einem Punkt: た.べる",
"characterOn": "On",
"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
"matchingCategories": "Kategorien",
"matchingCategoriesHint": "Die Ablagekarten, auf die Lernende Elemente ziehen. Jede Kategorie braucht mindestens ein Element, daher kann eine Karte nicht mehr Kategorien als Elemente haben.",
"matchingCategory": "Kategorie {number}",
"matchingAddCategory": "Kategorie hinzufügen",
"matchingAddCategoryBlocked": "Füge zuerst ein Element hinzu: Eine Karte kann nicht mehr Kategorien als Elemente haben",
"matchingRemoveCategory": "Kategorie entfernen",
"matchingMinCategories": "Mindestens zwei Kategorien erforderlich",
"matchingItems": "Elemente",
"matchingItemsHint": "Die ziehbaren Elemente. Ordne jedes Element seiner richtigen Kategorie zu: Ein nicht zugeordnetes Element kann nie richtig platziert werden.",
"matchingItem": "Element {number}",
"matchingAddItem": "Element hinzufügen",
"matchingUnassigned": "Nicht zugeordnet",
"matchingRemoveItem": "Element entfernen",
"matchingMinItems": "Mindestens zwei Elemente erforderlich",
"cardTileOptions": "Optionen",
"cardTileEdit": "Bearbeiten",
"cardTileDelete": "Löschen",
"cardTileUntitled": "Unbenannt",
"cardTileConflict": "Auf zwei Geräten geändert",
"studyClose": "Sitzung schließen",
2026-10-07 22:03:27 +02:00
"studyReviewsDueTitle": "Fällige Wiederholungen",
"studyReviewsDueBody": "{reviews, plural, =1{1 Karte ist} other{{reviews} Karten sind}} zur Wiederholung fällig. {news, plural, =1{Wenn du jetzt 1 neue Karte lernst} other{Wenn du jetzt {news} neue Karten lernst}}, erhöht das deine Wiederholungslast.",
"studyReviewsDueAllTagsNote": "„Zuerst wiederholen“ arbeitet den gesamten Rückstand über alle Tags hinweg ab – dein Tag-Filter greift erst wieder, wenn er abgebaut ist.",
"studyReviewFirst": "Zuerst wiederholen",
"studyLearnAnyway": "Trotzdem lernen",
"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
"studyBuryCard": "Bis morgen zurückstellen",
"studyCardBuried": "Karte bis morgen zurückgestellt",
2026-10-07 22:30:44 +02:00
"studyUndo": "Rückgängig machen",
2026-10-07 21:06:58 +02:00
"studyLockScreen": "Bildschirm sperren",
"studyUnlock": "Entsperren",
"studyTapToUnlock": "Zum Entsperren tippen",
2026-10-07 21:00:42 +02:00
"studyLoadFailed": "Diese Sitzung konnte nicht gelesen werden.",
"studyRatingFailed": "Deine Bewertung konnte nicht gespeichert werden. Bewerte die Karte noch einmal.",
"studyRetry": "Erneut versuchen",
"studyScopeTitle": "Lernumfang",
"studyScopeDescription": "Dieses Lernset hat Unter-Lernsets. Wähle, welche Karten wiederholt werden sollen.",
"studyScopeEverythingTitle": "Alles",
"studyScopeEverythingSubtitle": "Dieses Lernset und alle Unter-Lernsets",
"studyScopeSelfTitle": "Nur dieses Lernset",
"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
"studyBackFirstOn": "Rückseite der Karten wird zuerst gezeigt: tippe zum Zurückschalten",
"studyBackFirstOff": "Rückseite der Karten zuerst zeigen",
"studyShowAnswer": "Antwort anzeigen",
"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
"studySelectAll": "Wähle alle zutreffenden aus",
"studySelectOne": "Wähle die richtige Antwort",
"studyMatchingInstructions": "AUF DIE KARTEN OBEN ZIEHEN",
"studyMatchingAllPlaced": "Alle platziert",
"studyMatchingDropHere": "Hier ablegen",
"studyMapTapPrompt": "Tippe auf eine Region, um zu antworten",
"studyMapSelected": "Ausgewählt: {label}",
"studyCorrect": "Richtig",
"studyCorrectLabel": "Richtig — {label}",
"studyMapAnswer": "Antwort: {answer}",
"studyMapPickedAnswer": "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
"studyRatingBad": "Schlecht",
"studyRatingOk": "OK",
"studyRatingGood": "Gut",
"studyRatingPerfect": "Perfekt",
"studyNothingTitle": "Gerade nichts zu lernen",
"studyNothingBody": "Komm später wieder, wenn mehr Karten fällig sind.",
"studyNextDue": "Bis zur nächsten fälligen Karte: {interval}.",
"studyDone": "Fertig",
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
"studySessionComplete": "Sitzung abgeschlossen",
"studyProgressReviewed": "{reviewed} / {total} wiederholt",
"studyReviewedCount": "{reviewed} wiederholt",
"studyStatCards": "Karten",
"studyStatAccuracy": "Genauigkeit",
"studyStatTime": "Zeit",
"studyDurationSec": "{sec} Sek.",
"studyDurationMin": "{min} Min.",
"studyDurationMinSec": "{min} Min. {sec} Sek.",
"studyLeaveTitle": "Diese Lernsitzung verlassen?",
"studyLeaveRated": "{count, plural, =1{Deine bisherigen Bewertungen sind gespeichert, aber die letzte Karte in dieser Runde wird verworfen, wenn du jetzt gehst.} other{Deine bisherigen Bewertungen sind gespeichert, aber die {count} noch verbleibenden Karten in dieser Runde werden verworfen, wenn du jetzt gehst.}}",
"studyLeaveUnrated": "{count, plural, =1{Du hast diese Karte noch nicht bewertet — beim Verlassen endet die Sitzung, ohne Fortschritt für diese Runde zu speichern.} other{Du hast noch keine der {count} Karten in dieser Runde bewertet — beim Verlassen endet die Sitzung, ohne Fortschritt dafür zu speichern.}}",
"studyLeaveConfirm": "Verlassen",
"studyKeepStudying": "Weiter lernen",
"studyInMinutes": "{count, plural, =1{in 1 Min.} other{in {count} Min.}}",
"studyInHours": "{count, plural, =1{in 1 Stunde} other{in {count} Stunden}}",
"studyInDays": "{count, plural, =1{in 1 Tag} other{in {count} Tagen}}",
"studyInMonths": "{count, plural, =1{in 1 Monat} other{in {count} Monaten}}",
"studyInYears": "{count, plural, =1{in 1 Jahr} other{in {count} Jahren}}",
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
"studyContinue": "Weiterlernen",
"studyPrevious": "Vorherige Karte",
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
"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
"studyMinutes": "{count} Min.",
"studyHours": "{count} Std.",
"studyDays": "{count, plural, =1{1 Tag} other{{count} Tage}}",
"studyMonths": "{count, plural, =1{1 Monat} other{{count} Monate}}",
"studyYears": "{count, plural, =1{1 Jahr} other{{count} Jahre}}",
"studyFilteredBy": "{count, plural, =1{Eingegrenzt durch 1 Tag-Filter} other{Eingegrenzt durch {count} Tag-Filter}}",
"studySettingsCardsPerRound": "Karten pro Runde",
"studySettingsNewPerDay": "Neue Karten pro Tag",
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
"studySettingsNewPerDayHint": "Wie viele noch nie gelernte Karten jedes Lernset pro Tag neu beginnt, sofern seine eigenen Lernoptionen nichts anderes sagen.",
"studyOptionsTitle": "Lernoptionen",
"studyOptionsDescription": "Wie viele Karten dieses Lernset pro Tag bringt und welche zuerst kommen, auf all deinen Geräten. Die Lernsets darin behalten ihre eigenen.",
"studyOptionsReviewsPerDay": "Wiederholungen pro Tag",
"studyOptionsOrder": "Reihenfolge",
"studyOptionsReviewsFirst": "Wiederholungen zuerst",
"studyOptionsMixed": "Gemischt",
"studyOptionsNewFirst": "Neue zuerst",
"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
"studySettingsUnlimited": "Unbegrenzt",
"studySettingsSortBy": "Sortieren nach",
"studySettingsLearnMode": "Lernmodus",
"studyModeSpaced": "Verteilte Wiederholung",
"studyModeSpacedHint": "Fällige Karten nach ihrem Zeitplan; Bewertungen verschieben sie.",
"studyModeCram": "Pauken",
"studyModeCramHint": "Geh jede Karte durch, ohne die Zeitpläne zu ändern.",
2026-10-07 21:57:04 +02:00
"studySettingsVocabulary": "Vokabeln",
"studySettingsQuizMc": "Als Multiple-Choice abfragen",
"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
"studySettingsTypeReading": "Lesung eintippen",
"studySettingsTypeReadingDescription": "Wörter mit Kanji fragen nach ihrer Lesung, in Kana getippt; Romaji werden beim Tippen zu Kana.",
"studyTypedHint": "Die Lesung, in Kana oder Romaji",
"studyTypedRight": "Richtig",
"studyTypedWrong": "Du hast {answer} getippt",
2026-10-07 21:57:04 +02:00
"studyAspectMeaning": "Bedeutung",
"studyAspectReading": "Lesung",
"studyAspectExpression": "Ausdruck",
"studyAspectMixed": "Gemischt",
"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
"studySortOldestFirst": "Älteste zuerst",
"studySortRandom": "Zufällig",
"studySortNewestFirst": "Neueste zuerst",
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
"studyFewer": "Verringern",
"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
"studysetMenuReset": "Fortschritt zurücksetzen",
"studysetResetTitle": "Fortschritt zurücksetzen?",
"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.",
"studysetResetConfirm": "Zurücksetzen",
"studysetResetDone": "Fortschritt zurückgesetzt",
"mapUnknown": "Diese Landkarte braucht eine neuere Version der App.",
"mapPickRegion": "Tippe auf die Region, die die Frage beantwortet; zoome mit zwei Fingern oder durch Scrollen.",
"mapNonePicked": "Noch keine Region gewählt",
"composerPlaceholderQuestion": "Frage hinzufügen",
"composerLabelRegion": "Antwort",
"homeStreakTooltip": "Lernserie",
"homeArrange": "Widgets anordnen",
"homeDone": "Fertig",
"homeDragToReorder": "Zum Umsortieren ziehen",
"homeShowWidget": "{label} anzeigen",
"homeHideWidget": "{label} ausblenden",
"homeAllHidden": "Alle Widgets sind ausgeblendet",
feat(app): Home, the Library and the studyset sheets laid out as before
Home: plain cards on the surface, 16 dp apart, the goal first and the
Pomodoro timer after it in a new dashboard. The streak chip sits centred
in the app bar, and its sheet shows the days inside a big flame and the
week as marks over the weekdays' initials, with a word on today in a box.
The week names its day as "Thursday, Oct 8" and its days carry no
tooltip. The heatmap scrolls its weekdays with the weeks, outlines the
days to come, and names a day's activities with its date. The goal card
has a ring of 5 dp, a check once met and a pencil, and its sheet saves
across its width with Remove goal below. Arranging puts an eye on each
widget's corner and lifts the one picked up, with a tap the hand feels;
with every widget hidden, Customise brings arranging back. The stepper
moves to core, where the goal's sheet takes it too.
Library: the counts line includes files (PDFs); Refresh in the app bar
and pulling the list down sync now; a list that can't be read offers
Retry, which reads it again; the star keeps its square corners.
Studyset sheet: "Title *", the secondary title explained behind a
question mark, Inherit as a box beside the colour, and the description
in up to three lines with a chevron. Move sheet: round marks, the
studyset itself marked as current, the top level only while it is
inside another, archived studysets last under their heading, the
destination named in the footer, and a new studyset to move into, made
only once the move is.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 11:12:23 +02:00
"homeAllHiddenBody": "Blende einige wieder ein, um dein Dashboard zu füllen.",
"homeCustomise": "Anpassen",
"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
"homeWidgetWeek": "Wochenübersicht",
"homeWidgetActivity": "Aktivitäts-Heatmap",
"homeActivityTitle": "Deine Aktivität",
"streakDays": "{count, plural, =1{1 Tag in Folge} other{{count} Tage in Folge}}",
"streakStart": "Lerne heute, um deine Lernserie zu starten.",
"streakGrow": "Bleib dran: Lerne mindestens einmal am Tag, um deine Lernserie auszubauen.",
"streakFirstDay": "Wiederhole heute ein paar Karten, um den ersten Tag zu entfachen.",
"streakComeBack": "Komm morgen wieder, um deine Lernserie zu halten.",
"streakKeepAlive": "Lerne heute, um deine Lernserie am Leben zu halten.",
"goalEditTitle": "Lernziel bearbeiten",
"goalSetTitle": "Lernziel festlegen",
"goalDescriptionDaily": "Wiederhole jeden Tag eine bestimmte Anzahl Karteikarten. Jede Karte, die du bewertest, zählt.",
"goalDescriptionWeekly": "Wiederhole jede Woche ab Montag eine bestimmte Anzahl Karteikarten. Jede Karte, die du bewertest, zählt.",
"goalPeriod": "Zeitraum",
"goalPerDay": "Pro Tag",
"goalPerWeek": "Pro Woche",
"goalCardsPerDay": "Karten pro Tag",
"goalCardsPerWeek": "Karten pro Woche",
"goalSave": "Ziel speichern",
"goalRemove": "Ziel entfernen",
"goalEmptySubtitle": "Wiederhole jeden Tag oder jede Woche eine feste Anzahl Karten.",
"goalDailyHeadline": "Tagesziel",
"goalWeeklyHeadline": "Wochenziel",
"goalProgressToday": "{reviewed} von {target} Karten heute",
"goalProgressThisWeek": "{reviewed} von {target} Karten diese Woche",
"goalMet": "Ziel erreicht: gut gemacht!",
"goalRemaining": "Noch {count}",
"weekToday": "Heute",
"weekPreviousDay": "Vorheriger Tag",
"weekNextDay": "Nächster Tag",
"weekRestDay": "Ruhetag",
"heatmapLess": "Weniger",
"heatmapMore": "Mehr",
"heatmapTotal": "{count, plural, =1{1 Aktivität im letzten Jahr} other{{count} Aktivitäten im letzten Jahr}}",
feat(app): Home, the Library and the studyset sheets laid out as before
Home: plain cards on the surface, 16 dp apart, the goal first and the
Pomodoro timer after it in a new dashboard. The streak chip sits centred
in the app bar, and its sheet shows the days inside a big flame and the
week as marks over the weekdays' initials, with a word on today in a box.
The week names its day as "Thursday, Oct 8" and its days carry no
tooltip. The heatmap scrolls its weekdays with the weeks, outlines the
days to come, and names a day's activities with its date. The goal card
has a ring of 5 dp, a check once met and a pencil, and its sheet saves
across its width with Remove goal below. Arranging puts an eye on each
widget's corner and lifts the one picked up, with a tap the hand feels;
with every widget hidden, Customise brings arranging back. The stepper
moves to core, where the goal's sheet takes it too.
Library: the counts line includes files (PDFs); Refresh in the app bar
and pulling the list down sync now; a list that can't be read offers
Retry, which reads it again; the star keeps its square corners.
Studyset sheet: "Title *", the secondary title explained behind a
question mark, Inherit as a box beside the colour, and the description
in up to three lines with a chevron. Move sheet: round marks, the
studyset itself marked as current, the top level only while it is
inside another, archived studysets last under their heading, the
destination named in the footer, and a new studyset to move into, made
only once the move is.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 11:12:23 +02:00
"heatmapDay": "{count, plural, =1{1 Aktivität} other{{count} Aktivitäten}} · {date}",
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
"commonCancel": "Abbrechen",
"commonSave": "Speichern",
"commonClose": "Schließen",
"commonUndo": "Rückgängig",
2026-10-07 21:43:38 +02:00
"moreInfo": "Weitere Informationen",
"moreInfoCreated": "Erstellt",
"moreInfoModified": "Zuletzt geändert",
"moreInfoItemId": "Element-ID",
"moreInfoStudysetId": "Lernset-ID",
"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
"moreInfoParentId": "Übergeordnete ID",
"moreInfoFile": "Datei",
2026-10-07 21:43:38 +02:00
"moreInfoReviews": "Wiederholungen",
"moreInfoReviewCount": "Anzahl Wiederholungen",
"moreInfoLastReviewed": "Zuletzt wiederholt",
"moreInfoCopy": "Kopieren",
"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
"commonTryAgain": "Erneut versuchen",
"personDataFailed": "Die Daten dieses Geräts konnten nicht geöffnet werden.",
"sessionUnreachable": "Der Server war nicht erreichbar.",
"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
"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
"fileImage": "Bild",
"fileSound": "Audio",
"fileImageUnavailable": "Dieses Bild ist noch nicht auf diesem Gerät. Es erscheint, sobald es hochgeladen ist und du online bist.",
"fileImageUnreadable": "Dieses Bild kann nicht angezeigt werden. Die Datei ist vielleicht beschädigt oder in einem Format, das dieses Gerät nicht lesen kann.",
"fileFromElsewhere": "Dateien aus dem Web werden nicht angezeigt.",
"filePlaySound": "Audio abspielen",
"fileStopSound": "Audio stoppen",
"fileSoundUnavailable": "Diese Audiodatei ist noch nicht auf diesem Gerät. Du kannst sie abspielen, sobald sie hochgeladen ist und du online bist.",
"fileSoundUnplayable": "Diese Audiodatei kann nicht abgespielt werden. Die Datei ist vielleicht beschädigt oder in einem Format, das dieses Gerät nicht abspielen kann.",
"fileImages": "Bilder",
"fileSounds": "Audiodateien",
"fileNotAnImage": "Diese Datei ist kein Bild, das die App anzeigen kann.",
"fileNotASound": "Diese Datei ist keine Audiodatei, die die App abspielen kann.",
"fileTooLarge": "Diese Datei ist größer als {megabytes} MB.",
"fileNotKept": "Die Datei konnte nicht auf diesem Gerät gespeichert werden.",
"fileRemoveImage": "Bild entfernen",
"fileRemoveSound": "Audio entfernen",
"editorInsert": "Einfügen",
"blockGroupText": "Text",
"blockGroupBlocks": "Blöcke",
"blockGroupMedia": "Medien",
"blockHeading": "Überschrift {level}",
"blockBulletedList": "Aufzählung",
"blockNumberedList": "Nummerierte Liste",
"blockChecklist": "Checkliste",
"blockQuote": "Zitat",
"blockListItem": "Listenpunkt",
"blockChecklistItem": "Aufgabe",
"editorSlashHint": "Tippe / für einen Block oder schreib einfach los",
"blockDivider": "Trennlinie",
"blockTable": "Tabelle",
"blockRemove": "Entfernen",
"blockUnknown": "Dieser Teil braucht eine neuere Version der App.",
"blockCallout": "Hinweisbox",
"blockSpoiler": "Spoiler",
"calloutNote": "Notiz",
"calloutInfo": "Info",
"calloutTip": "Tipp",
"calloutSuccess": "Erfolg",
"calloutQuestion": "Frage",
"calloutWarning": "Warnung",
"calloutDanger": "Gefahr",
"calloutQuote": "Zitat",
"calloutOptions": "Hinweisbox-Optionen",
"calloutEditTitle": "Titel bearbeiten…",
"calloutFoldedAtFirst": "Anfangs eingeklappt",
"calloutRemove": "Hinweisbox entfernen",
"calloutShow": "Einblenden",
"calloutHide": "Ausblenden",
"calloutWriteInside": "Hineinschreiben",
"calloutTitleDialog": "Titel der Hinweisbox",
"calloutTitleLabel": "Titel",
"calloutTitleHelper": "Lass ihn leer, um den Namen des Typs anzuzeigen.",
"spoilerReveal": "Aufdecken",
"spoilerPlaceholder": "Versteckter Text, per Tippen aufgedeckt",
"blockFormula": "Formel",
"formatInlineMath": "Formel in der Zeile",
"formulaTitle": "Formel",
"formulaInLineTitle": "Formel in der Zeile",
"formulaPreview": "Vorschau",
"formulaPreviewEmpty": "Hier erscheint die Formel",
"formulaLatex": "LaTeX",
"formulaLatexHelper": "\\\\ beginnt eine neue Zeile in aligned, cases oder einer Matrix.",
"formulaEmpty": "Eine leere Formel. Tippe, um sie zu schreiben.",
"formulaEdit": "Formel bearbeiten",
"formulaRemove": "Formel entfernen",
"blockYoutube": "YouTube-Video",
"youtubeLink": "YouTube-Link",
"youtubeLinkHelper": "Füge einen Link von YouTube ein.",
"youtubeNotFound": "In diesem Link ist kein YouTube-Video.",
"youtubeFound": "Video gefunden.",
"youtubeFoundFrom": "Video gefunden, Start bei {time}.",
"youtubeCaption": "Beschriftung",
"youtubeCaptionHelper": "Wird anstelle des Videos angezeigt, bis es abgespielt wird.",
"youtubeVideo": "YouTube-Video",
"youtubeSource": "YouTube",
"youtubeFrom": "YouTube · ab {time}",
"youtubeEdit": "Video bearbeiten",
"youtubePlay": "Video abspielen",
"youtubeOpen": "Auf YouTube öffnen",
"youtubeRemove": "Video entfernen",
"youtubeBroken": "Der Link dieses Videos kann nicht gelesen werden.",
"youtubeNotOpened": "YouTube konnte nicht geöffnet werden.",
"blockStudyButton": "Lernbutton",
"studyButtonDefaultLabel": "Lernen",
"studyButtonStudyset": "Lernset",
"studyButtonTag": "Karten",
"studyButtonAllCards": "Alle Karten",
"studyButtonLabel": "Beschriftung",
"studyButtonTopics": "Mit seinen Themen",
"studyButtonBackFirst": "Rückseite zuerst",
"studyButtonBackFirstHelper": "Karten mit Vorder- und Rückseite sowie Vokabelkarten fragen ihre Rückseite ab.",
"studyButtonWithTag": "Mit Tag {tag}",
"studyButtonAlone": "Ohne seine Themen",
"studyButtonEdit": "Lernbutton bearbeiten",
"studyButtonRemove": "Lernbutton entfernen",
"studyButtonBroken": "Dieser Lernbutton gibt nicht an, was gelernt werden soll.",
"studyButtonGone": "Dieses Lernset gibt es nicht mehr.",
"pdfPageField": "PDF-Seite",
"studysetTabFiles": "Dateien",
"pdfUploadMenu": "PDF hochladen",
"pdfFileType": "PDFs",
"pdfAdded": "„{title}“ hinzugefügt.",
"pdfNotPdf": "Diese Datei ist kein PDF.",
"pdfTooLarge": "Dieses PDF ist größer als {megabytes} MB.",
"pdfDuplicateTitle": "PDF schon vorhanden",
"pdfDuplicateMessage": "Diese Datei ist „{title}“ und liegt schon in diesem Lernset. Als Kopie hinzufügen oder das vorhandene behalten?",
"pdfDuplicateKeep": "Vorhandenes behalten",
"pdfDuplicateAdd": "Kopie hinzufügen",
"filesEmpty": "Noch keine Dateien",
"filesEmptyHint": "Nutze „Material hinzufügen → PDF hochladen“, um eines hinzuzufügen.",
"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
"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
"filesSortName": "Name (A– Z)",
"filesSortNewest": "Neueste zuerst",
"filesSortOldest": "Älteste zuerst",
"filesSortLargest": "Größte zuerst",
"pdfPages": "{count, plural, =1{1 Seite} other{{count} Seiten}}",
"pdfPercentRead": "{percent} % gelesen",
"pdfDeadlineMet": "Lesefrist eingehalten",
"pdfDeadlineUpcoming": "Beginnt in {days, plural, =1{1 Tag} other{{days} Tagen}} – {pages}/Tag geplant",
"pdfDeadlinePassed": "Frist abgelaufen – noch {pages, plural, =1{1 Seite} other{{pages} Seiten}}",
"pdfDeadlineToday": "Heute fällig – noch {pages, plural, =1{1 Seite} other{{pages} Seiten}}",
"pdfDeadlinePace": "{pages}/Tag, um in {days, plural, =1{1 Tag} other{{days} Tagen}} Seite {target} zu erreichen",
"pdfOptions": "Aktionen",
"pdfRename": "Umbenennen",
"pdfRenameTitle": "PDF umbenennen",
"pdfRenameLabel": "Titel",
"pdfSetDeadline": "Lesefrist festlegen",
"pdfEditDeadline": "Lesefrist bearbeiten",
"pdfMarkFinished": "Als abgeschlossen markieren",
"pdfResetReading": "Lesefortschritt zurücksetzen",
"pdfResetTitle": "Lesefortschritt zurücksetzen?",
"pdfResetMessage": "Wie weit du „{title}“ gelesen hast, wird vergessen. Das PDF, seine Karteikarten und Notizen bleiben.",
"pdfResetConfirm": "Zurücksetzen",
"pdfMoreInfo": "Weitere Infos",
"pdfInfoFileName": "Dateiname",
"pdfInfoSize": "Größe",
"pdfInfoPages": "Seiten",
"pdfInfoUnknown": "Bekannt, sobald es geöffnet wurde",
"pdfDelete": "Löschen",
"pdfDeleteTitle": "PDF löschen?",
"pdfDeleteMessage": "„{title}“ wird samt Lesefortschritt aus diesem Lernset entfernt. Karteikarten und Notizen, die daraus entstanden sind, bleiben.",
"pdfDeleteConfirm": "Löschen",
"pdfDeleted": "PDF gelöscht",
"deadlineSheetSet": "Lesefrist festlegen",
"deadlineSheetEdit": "Lesefrist bearbeiten",
"deadlineSheetHelp": "Erreiche bis zu einem Tag eine bestimmte Seite. Der Fortschritt folgt der weitesten Seite, die du beim Lesen erreichst.",
"deadlineReachPageOf": "Seite erreichen (von {count})",
"deadlineReachPage": "Seite erreichen",
"deadlineDecrease": "Verringern",
"deadlineIncrease": "Erhöhen",
"deadlineChapter": "Oder ein Kapitel abschließen",
"deadlineChapterEntry": "{title} · bis S. {page}",
"deadlineBy": "Bis",
"deadlineStart": "Beginn am",
"deadlineStartToday": "Heute",
"deadlineStartReset": "Heute beginnen",
"deadlineStartHelp": "Das Tagespensum zählt ab diesem Tag. Bis dahin wartet das PDF unter „Demnächst“.",
"deadlineSave": "Frist speichern",
"deadlineRemove": "Frist entfernen",
"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.",
"readerUnreadable": "Diese Datei kann nicht als PDF gelesen werden.",
"readerBack": "Zurück zum Lernset",
"readerSearch": "PDF durchsuchen",
"readerFitWidth": "An Breite anpassen",
"readerFitHeight": "An Höhe anpassen",
"readerZoomIn": "Vergrößern",
"readerZoomOut": "Verkleinern",
"readerSetZoom": "Zoom festlegen",
"readerZoomTitle": "Zoom",
"readerZoomApply": "Anwenden",
"readerFullscreen": "Vollbild",
"readerExitFullscreen": "Vollbild verlassen",
"readerPreviousPage": "Vorherige Seite",
"readerNextPage": "Nächste Seite",
"readerPageOf": "/ {count}",
"readerFindHint": "Im PDF suchen",
"readerMatchOf": "{current} von {total}",
"readerPreviousMatch": "Vorheriger Treffer",
"readerNextMatch": "Nächster Treffer",
"readerCloseSearch": "Suche schließen",
"readerExpand": "Ausklappen",
"readerCollapse": "Einklappen",
"readerTabFlashcards": "Karteikarten",
"readerTabNotes": "Notizen",
"readerCardCreated": "Karteikarte erstellt",
"readerCardDeleteTitle": "Karteikarte löschen?",
"readerCardDeleteMessage": "Die Karteikarte wird samt ihrem Lernverlauf gelöscht.",
"readerCardDeleteConfirm": "Löschen",
"readerFrontMatter": "Vorspann",
"readerPage": "Seite {page}",
"readerByPage": "Seite",
"readerByChapter": "Kapitel",
"readerCardsEmpty": "Wähle Text aus, um im Nu Karteikarten zu erstellen",
"readerCardsEmptyHint": "Wähle die wichtigen Zeilen aus und schicke sie in eine Frage oder eine Antwort, oder nutze „Karteikarte erstellen“.",
"readerCreateCard": "Karteikarte erstellen",
"readerEditCard": "Karteikarte bearbeiten",
"readerBackToCards": "Zurück zu den Karteikarten",
"readerReferencedPage": "Referenzierte Seite: {page}",
"readerUseCurrentPage": "Aktuelle verwenden ({page})",
"readerQuestion": "Frage",
"readerAnswer": "Antwort",
"readerKeepOpen": "Erstellungsmodus geöffnet lassen",
"readerClear": "Leeren",
"readerCreate": "Erstellen",
"readerUntitledCard": "Unbenannte Karteikarte",
"readerCardOptions": "Kartenoptionen",
"readerNoteSaved": "Gespeichert",
"readerNoteEditing": "Wird bearbeitet…",
"readerNoteSaving": "Wird gespeichert…",
"readerNoteFailed": "Speichern fehlgeschlagen",
"readerToQuestion": "Frage",
"readerToAnswer": "Antwort",
"readerToNote": "Notizen",
"readerLineBreaksJoined": "Zeilenumbrüche zusammengeführt (tippen zum Beibehalten)",
"readerLineBreaksKept": "Zeilenumbrüche beibehalten (tippen zum Zusammenführen)",
"blockScreenshot": "Bildschirmfoto der Seite",
"readerCaptureCancel": "Bildschirmfoto abbrechen",
"readerCaptureHint": "Ziehe über den Teil der Seite, den du behalten willst",
"readerCaptureFailed": "Die Seite konnte nicht dargestellt werden. Versuche es erneut, sobald sie geladen ist.",
"readerScreenshotSaved": "Bildschirmfoto gespeichert",
"imageOpenPdfPage": "PDF auf dieser Seite öffnen",
feat(app): Home, the Library and the studyset sheets laid out as before
Home: plain cards on the surface, 16 dp apart, the goal first and the
Pomodoro timer after it in a new dashboard. The streak chip sits centred
in the app bar, and its sheet shows the days inside a big flame and the
week as marks over the weekdays' initials, with a word on today in a box.
The week names its day as "Thursday, Oct 8" and its days carry no
tooltip. The heatmap scrolls its weekdays with the weeks, outlines the
days to come, and names a day's activities with its date. The goal card
has a ring of 5 dp, a check once met and a pencil, and its sheet saves
across its width with Remove goal below. Arranging puts an eye on each
widget's corner and lifts the one picked up, with a tap the hand feels;
with every widget hidden, Customise brings arranging back. The stepper
moves to core, where the goal's sheet takes it too.
Library: the counts line includes files (PDFs); Refresh in the app bar
and pulling the list down sync now; a list that can't be read offers
Retry, which reads it again; the star keeps its square corners.
Studyset sheet: "Title *", the secondary title explained behind a
question mark, Inherit as a box beside the colour, and the description
in up to three lines with a chevron. Move sheet: round marks, the
studyset itself marked as current, the top level only while it is
inside another, archived studysets last under their heading, the
destination named in the footer, and a new studyset to move into, made
only once the move is.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-08 11:12:23 +02:00
"homeWidgetDeadlines": "PDF-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
"deadlinesTitle": "Lesefristen",
"deadlinesCurrent": "Aktuell",
"deadlinesUpcoming": "Demnächst",
"deadlinesProgress": "S. {furthest}/{target} · {when}",
"deadlinePassedShort": "Frist abgelaufen",
"deadlineDueTodayShort": "heute fällig",
"deadlineDaysLeft": "{days, plural, =1{noch 1 Tag} other{noch {days} Tage}}",
"deadlineToPageToday": "heute bis S. {page}",
"deadlineStartsIn": "Beginnt in {days, plural, =1{1 Tag} other{{days} Tagen}}",
"deadlinesPlaceholder": "Erscheint, sobald du Lesefristen hast",
"deadlinesOpenTimeline": "Zeitleiste öffnen",
"timelineTitle": "Lesefristen-Zeitleiste",
"timelineEmpty": "Noch keine Lesefristen",
"timelineEmptyHint": "Lege für ein PDF eine Lesefrist fest, um sie hier zu sehen.",
"timelineToday": "Heute",
"timelinePages": "S. {furthest}/{target}",
"chapterFinished": "„{chapter}“ fertig gelesen – die {count, plural, =1{Karte} other{{count} Karten}} lernen, die du erstellt hast?",
"chapterStudyNow": "Jetzt lernen",
"chapterDismiss": "Schließen",
"deadlineChapterLoading": "Kapitel werden geladen…",
"fileSizeKb": "{size} KB",
"fileSizeMb": "{size} MB",
"pdfPageShort": "S. {page}",
"ankiImportMenu": "Aus Anki importieren",
"ankiImportFileType": "Anki-Stapel",
"ankiImportTitle": "Anki-Stapel importieren",
"ankiImportOptionsTitle": "Wie sollen Unterstapel importiert werden?",
"ankiImportReading": "Stapel wird gelesen…",
"ankiImportSummary": "{cards, plural, =1{1 Karte.} other{{cards} Karten.}}",
"ankiImportSummaryDecks": "{cards, plural, =1{1 Karte} other{{cards} Karten}} in {decks} Unterstapeln.",
"ankiImportModeFlatten": "In dieses Lernset zusammenführen",
"ankiImportModeFlattenSubtitle": "Alle Karten hierher importieren und die Unterstapel ignorieren.",
"ankiImportModeSubStudysets": "Als Unter-Lernsets nachbilden",
"ankiImportModeSubStudysetsSubtitle": "Die Unterstapel nachbilden: Jeder Unterstapel wird ein verschachteltes Lernset.",
"ankiImportModeTag": "Karten nach Unterstapel taggen",
"ankiImportModeTagSubtitle": "Alle Karten hier behalten, getaggt mit jedem Unterstapel, aus dem sie stammen.",
"ankiImportProgress": "Lernfortschritt importieren",
"ankiImportProgressSubtitle": "Den Wiederholungsverlauf aus Anki übernehmen: Karten machen dort weiter, wo sie aufgehört haben. Neue Karten bleiben neu.",
"ankiImportMedia": "{count, plural, =1{Medien übernehmen (1 Datei)} other{Medien übernehmen ({count} Dateien)}}",
"ankiImportMediaSubtitle": "Bilder und Töne des Stapels auf den Karten behalten.",
"ankiImportMediaMayNotFit": "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.",
"ankiImportRunning": "Wird importiert…",
"ankiImportConfirm": "Importieren",
"ankiImportNotAPackage": "Das ist kein Anki-Stapel. Exportiere in Anki einen Stapel als .apkg-Datei und importiere diese.",
"ankiImportNewerFormat": "Dieser Stapel stammt aus einer neueren Anki-Version, die diese App noch nicht kennt. Exportiere ihn erneut mit „Ältere Anki-Versionen unterstützen“.",
"ankiImportUnreadable": "Dieser Stapel ist beschädigt und kann nicht gelesen werden.",
"ankiImportBrokeOff": "Der Import wurde abgebrochen. Die bis dahin importierten Karten bleiben erhalten.",
"ankiImported": "{count, plural, =1{1 Karteikarte aus Anki importiert.} other{{count} Karteikarten aus Anki importiert.}}",
"ankiImportedSubStudysets": "{count, plural, =1{1 Karte in Unter-Lernsets importiert.} other{{count} Karten in Unter-Lernsets importiert.}}",
"ankiImportedTagged": "{count, plural, =1{1 Karte importiert und nach Unterstapel getaggt.} other{{count} Karten importiert und nach Unterstapel getaggt.}}",
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
"ankiImportFilesSkipped": "{count, plural, =1{1 Mediendatei konnte nicht importiert werden.} other{{count} Mediendateien konnten nicht importiert werden.}}",
"pomodoroTitle": "Pomodoro",
"pomodoroFocus": "Fokus",
"pomodoroShortBreak": "Kurze Pause",
"pomodoroLongBreak": "Lange Pause",
"pomodoroFocusOf": "Fokus {done} von {total}",
"pomodoroStart": "Starten",
"pomodoroPause": "Pausieren",
"pomodoroResume": "Fortsetzen",
"pomodoroSkip": "Überspringen",
"pomodoroStop": "Beenden",
"pomodoroPaused": "Pausiert",
"pomodoroPausedProfile": "Pausiert · {profile}",
"pomodoroClassic": "Klassisch",
"pomodoroUnnamed": "Profil ohne Namen",
"pomodoroProfiles": "Pomodoro-Profile",
"pomodoroChooseProfile": "Profil wählen",
"pomodoroAddProfile": "Profil hinzufügen",
"pomodoroEditProfile": "Profil bearbeiten",
"pomodoroName": "Name",
"pomodoroFocusLength": "Fokus",
"pomodoroShortBreakLength": "Kurze Pause",
"pomodoroLongBreakLength": "Lange Pause",
"pomodoroMinutes": "{count} Min.",
"pomodoroNoLongBreak": "Keine",
"pomodoroLongBreakAfter": "Fokusphasen vor einer langen Pause",
"pomodoroAutoStartBreaks": "Pausen von selbst starten",
"pomodoroAutoStartFocus": "Fokus nach einer Pause von selbst starten",
"pomodoroDoNotDisturb": "Nicht stören während des Fokus",
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
"pomodoroDoNotDisturbHint": "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
"pomodoroDoNotDisturbDenied": "Die App darf dieses Gerät nicht stummschalten. Erlaube es in den Systemeinstellungen.",
"pomodoroDeleteProfile": "Profil löschen",
"pomodoroSummary": "{focus} Min. Fokus, {shortBreak} Min. Pause",
"pomodoroSummaryLong": "{focus} Min. Fokus, {shortBreak} Min. Pause, {longBreak} Min. nach {after}",
"pomodoroAlertFocusDone": "Zeit für eine Pause",
"pomodoroAlertBreakDone": "Zurück zum Fokus",
"pomodoroAlertStarts": "{phase} hat begonnen.",
"pomodoroAlertWaits": "{phase} wartet auf dich.",
"homeWidgetPomodoro": "Pomodoro-Timer",
"pomodoroAlerts": "Pomodoro-Meldungen",
"pomodoroUntil": "Bis {time}",
2026-10-07 03:01:12 +02:00
"pomodoroLeft": "Noch {left}",
"pathImportAtStep": "Schritt {step}: {problem}",
"pathImportNotJson": "Das ist kein JSON: {detail}",
"pathImportNoPath": "ein „path“-Objekt fehlt.",
"pathImportNoTitle": "der Pfad hat keinen „title“.",
"pathImportDescriptionNotText": "„description“ des Pfads ist kein Text.",
"pathImportNotAnObject": "kein Objekt.",
"pathImportUnknownStepType": "unbekannter „type“: {detail}.",
"pathImportRightOptionMissing": "die richtige Option {detail} fehlt unter den Optionen.",
"pathImportRightOptionsMissing": "eine genannte richtige Option fehlt unter den Optionen.",
"pathImportNoPairing": "kein „correct_pairing“.",
"pathImportPairingTargetMissing": "Elemente werden einem fehlenden Ziel zugeordnet: {detail}.",
"pathImportPairingIncomplete": "jedes Element braucht genau ein Ziel.",
"pathImportNoPassage": "keine „passage“.",
"pathImportBlanksMismatch": "für jedes ___ in der Passage braucht es ein Wort in „blanks“.",
"pathImportBlockWithoutType": "ein Block ohne „type“.",
"pathImportMalformedLevel": "eine Überschrift mit fehlerhafter Ebene.",
"pathImportMalformedListItem": "ein fehlerhafter Listenpunkt.",
"pathImportMalformedMath": "ein fehlerhafter Formelblock.",
"pathImportMalformedCode": "ein fehlerhafter Codeblock.",
"pathImportUnknownBlock": "ein unbekannter Block: {detail}.",
"pathImportTextlessBlock": "ein „{detail}“ ohne „text“ oder „runs“.",
"pathImportMalformedRun": "ein fehlerhafter Textabschnitt.",
"pathImportListExpected": "eine Liste wurde erwartet.",
"pathImportNotText": "„{detail}“ muss Text sein.",
"pathImportTooFew": "es braucht mindestens zwei „{detail}“.",
"pathImportMalformedNumber": "eine fehlerhafte Zahl.",
2026-10-07 10:27:31 +02:00
"pathImportTitleNotText": "ein Titel muss Text sein.",
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
"pathImportMalformedSource": "eine Quelle muss ein Objekt oder Text sein und ihre Teile Text.",
2026-10-07 10:27:31 +02:00
"pomodoroTopBarHint": "Der Timer kann in der oberen Leiste von GNOME herunterzählen, mit seinen Knöpfen, sobald die Erweiterung „AppIndicator“ an ist.",
"pomodoroTopBarSetUp": "Einrichten",
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
"pomodoroTopBarDismiss": "Nicht mehr vorschlagen",
"cardBrowserTitle": "Karteikarten",
"cardBrowserTitleWithName": "{title} – Karteikarten",
"cardBrowserTitleSubtree": "{title} (mit Unter-Lernsets)",
"cardBrowserBrowse": "Durchsuchen",
"cardBrowserBrowseTooltip": "Karteikarten durchsuchen",
"cardBrowserStudy": "Lernen",
"cardBrowserEditor": "Editor",
"cardBrowserMore": "Mehr",
"cardBrowserImport": "Karteikarten importieren",
"cardBrowserGrid": "Raster",
"cardBrowserDetail": "Detail",
"cardBrowserSearch": "Suchen",
"cardBrowserSort": "Sortieren",
"cardBrowserFilter": "Filtern",
"cardBrowserSelect": "Auswählen",
"cardBrowserSortManual": "Eigene Reihenfolge",
"cardBrowserSortNewest": "Neueste zuerst",
"cardBrowserSortOldest": "Älteste zuerst",
"cardBrowserSortAlphabetical": "A– Z (Vorderseite)",
"cardBrowserSortDue": "Fällige zuerst",
"cardBrowserSearchHint": "Karteikarten durchsuchen",
"cardBrowserCloseSearch": "Suche schließen",
"cardBrowserClearQuery": "Suche leeren",
"cardBrowserFilterTitle": "Karteikarten filtern",
"cardBrowserFilterType": "Art",
"cardBrowserTypeAll": "Alle Karten",
"cardBrowserTypeFrontBack": "Nur Frage und Antwort",
"cardBrowserTypeMultipleChoice": "Nur Multiple Choice",
"cardBrowserTypeVocabulary": "Nur Wörter",
"cardBrowserTypeMatching": "Nur Zuordnungen",
"cardBrowserTypeMap": "Nur Karten",
2026-10-09 15:00:21 +02:00
"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
"cardBrowserFilterTag": "Tag",
"cardBrowserAllTags": "Alle Tags",
"cardBrowserFilterStatus": "Stand",
"cardBrowserStatusNew": "Neu",
"cardBrowserStatusLearning": "Im Lernen",
"cardBrowserStatusDue": "Fällig",
"cardBrowserStatusBuried": "Zurückgestellt",
"cardBrowserStatusReported": "Gemeldet",
"cardBrowserClearAll": "Alle zurücksetzen",
"cardBrowserApply": "Anwenden",
"cardBrowserEmptyTitle": "Noch keine Karteikarten",
"cardBrowserEmptyHint": "Erstelle welche, um sie hier zu durchsuchen.",
"cardBrowserCreate": "Karteikarten erstellen",
"cardBrowserNoMatches": "Keine Karteikarte passt",
"cardBrowserNoMatchesHint": "Versuche eine andere Suche oder einen anderen Filter.",
"cardBrowserClearFilters": "Suche und Filter zurücksetzen",
"cardBrowserRetry": "Erneut versuchen",
"cardBrowserPrevious": "Vorige",
"cardBrowserNext": "Nächste",
"cardBrowserBuried": "Zurückgestellt",
"cardBrowserSelectAll": "Alle auswählen",
"cardBrowserDeselectAll": "Auswahl aufheben",
"cardBrowserSelected": "{count} ausgewählt",
"cardBrowserRangeHintTouch": "Halte eine andere Karte gedrückt, um alles dazwischen auszuwählen.",
"cardBrowserRangeHintPointer": "Klicke mit gedrückter Umschalttaste auf eine andere Karte, um alles dazwischen auszuwählen.",
"cardBrowserMove": "Verschieben",
"cardBrowserAddTags": "Tags hinzufügen",
"cardBrowserRemoveTags": "Tags entfernen",
"cardBrowserResetProgress": "Fortschritt zurücksetzen",
"cardBrowserDelete": "Löschen",
"cardBrowserMoreActions": "Weitere Aktionen",
"cardBrowserDone": "Fertig",
"cardBrowserDeleted": "{count, plural, =1{1 Karteikarte gelöscht} other{{count} Karteikarten gelöscht}}",
"cardBrowserMoveTitle": "{count, plural, =1{1 Karteikarte verschieben nach} other{{count} Karteikarten verschieben nach}}",
"cardBrowserMoved": "{count, plural, =1{1 Karteikarte nach „{title}“ verschoben} other{{count} Karteikarten nach „{title}“ verschoben}}",
"cardBrowserAddTagsTitle": "{count, plural, =1{Tags zu 1 Karteikarte hinzufügen} other{Tags zu {count} Karteikarten hinzufügen}}",
"cardBrowserAddTo": "{count, plural, =1{Zu 1 Karteikarte hinzufügen} other{Zu {count} Karteikarten hinzufügen}}",
"cardBrowserRemoveTagsTitle": "{count, plural, =1{Tags von 1 Karteikarte entfernen} other{Tags von {count} Karteikarten entfernen}}",
"cardBrowserRemoveFrom": "{count, plural, =1{Von 1 Karteikarte entfernen} other{Von {count} Karteikarten entfernen}}",
"cardBrowserNoTags": "Noch keine Tags. Erstelle Tags im Editor einer Karteikarte und weise sie dann hier zu.",
"cardBrowserNoTagsOnCards": "Die ausgewählten Karteikarten haben keine Tags.",
"cardBrowserTagsAdded": "{tags, plural, =1{1 Tag zu {count, plural, =1{1 Karteikarte} other{{count} Karteikarten}} hinzugefügt} other{{tags} Tags zu {count, plural, =1{1 Karteikarte} other{{count} Karteikarten}} hinzugefügt}}",
"cardBrowserTagsRemoved": "{tags, plural, =1{1 Tag von {count, plural, =1{1 Karteikarte} other{{count} Karteikarten}} entfernt} other{{tags} Tags von {count, plural, =1{1 Karteikarte} other{{count} Karteikarten}} entfernt}}",
"cardBrowserResetTitle": "{count, plural, =1{1 Karteikarte neu beginnen?} other{{count} Karteikarten neu beginnen?}}",
"cardBrowserResetMessage": "Sie gelten wieder als neu. Ihre Wiederholungen bleiben in deinem Verlauf und deinen Serien.",
"cardBrowserResetConfirm": "Zurücksetzen",
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
"cardBrowserReset": "{count, plural, =1{1 Karteikarte beginnt neu} other{{count} Karteikarten beginnen neu}}",
"studysetShare": "Teilen",
"studysetSharePrivate": "Teilen: privat",
"studysetSharePublished": "Teilen: veröffentlicht",
"publishTitle": "Veröffentlichen",
"publishPrivate": "Privat · nur du siehst es",
"publishPublished": "Veröffentlicht · v{version} · {date}",
"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.",
"publishAnonymous": "Melde dich mit GitHub an, um ein öffentliches Profil zu haben und zu veröffentlichen.",
"publishName": "Name",
"publishNameHint": "japanisch",
"publishLocation": "Zu finden unter {location}",
"publishNameFixed": "Fest, seit du zuerst veröffentlicht hast: andere verweisen darauf.",
"publishLicence": "Lizenz",
"publishLicenceNone": "Keine",
"publishLicenceOpen": "Erlaubt das Veröffentlichen.",
"publishLicenceNoDerivatives": "Erlaubt das Veröffentlichen, wie es ist: Lernende behalten ihre Änderungen für sich.",
"publishLicenceClosed": "Erlaubt keine Weitergabe. Wähle unter Bearbeiten eine andere.",
"publishLicenceNotOpen": "Die Lizenzen dieser Lernsets erlauben keine Weitergabe: {titles}",
"publishNotes": "Was sich geändert hat",
"publishNotesHint": "Neu in dieser Veröffentlichung …",
"publishReleases": "Veröffentlichungen",
"publishRelease": "v{version} · {date}",
"publishButton": "v{version} veröffentlichen",
"publishNoProfile": "Eine Veröffentlichung nennt dich mit deinem öffentlichen Profil. Lege zuerst eines an.",
"publishMakeProfile": "Öffentliches Profil anlegen",
"publishConflicts": "Diese wurden auf zwei Geräten verschieden geändert. Kläre sie zuerst:",
"publishConflictsElsewhere": "Einige Karteikarten, Notizen oder Schritte wurden auf zwei Geräten verschieden geändert. Synchronisiere, dann versuche es noch einmal.",
"publishUntitled": "Ohne Titel",
"publishFilesMissing": "Einige Dateien sind noch nicht auf deiner Instanz angekommen. Versuche es gleich noch einmal.",
"publishNothingChanged": "Seit der letzten Veröffentlichung hat sich nichts geändert.",
"publishBusy": "Dieses Lernset wird schon veröffentlicht. Versuche es gleich noch einmal.",
"publishSlugInvalid": "Kleinbuchstaben, Ziffern und Bindestriche, am Anfang ein Buchstabe oder eine Ziffer.",
"publishSlugTaken": "Ein anderes deiner Lernsets hat diesen Namen.",
"publishNotesTooLong": "Höchstens 5.000 Zeichen.",
"publishDone": "v{version} veröffentlicht.",
"publishFailed": "Deine Instanz war nicht erreichbar. Nichts wurde veröffentlicht.",
"publishUnreachable": "Das Veröffentlichen ist gerade nicht erreichbar.",
"publishRetry": "Erneut versuchen",
"publishCopyLocation": "Adresse kopieren",
feat(explore): the Explore tab, and adding a published studyset as a copy
Explore lists what is published on the instance as the old app's feed:
search over titles and authors, filters for languages and kinds of
content, the newest release first, the next page only when asked for;
each studyset opens a summary with all of it. Anonymous people explore
too.
Add to library makes a copy in the app, as an import: through the
person's own repositories, the files among their own files, the tags by
name among their own tags, everything read first, so a release in a
schema this app doesn't know is refused whole. The server never writes
into a learner's space. Every item of a copy names where it came from
(publication, item, release: card schema 9, note 3, step 3, path 2,
PDF 2, studyset 5), merged per side like the rest, for later releases to
be taken from there.
The Publish sheet takes a studyset off Explore again, after asking.
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 23:15:28 +02:00
"publishLocationCopied": "Adresse kopiert.",
"publishedField": "Veröffentlichung",
"publishedVersion": "v{version}",
"exploreSearch": "Titel und Namen durchsuchen",
"exploreLanguages": "Sprachen",
"exploreAnyLanguage": "Alle",
"exploreLanguagePair": "{front} → {back}",
"exploreKinds": "Inhalt",
"exploreKindsChosen": "{count, plural, =1{1 Art Inhalt} other{{count} Arten Inhalt}}",
"exploreKindCards": "Karteikarten",
"exploreKindNotes": "Notizen",
"exploreKindPaths": "Lernpfade",
"exploreKindPdfs": "PDFs",
"exploreKindsIntro": "Nur Lernsets, die all das enthalten.",
"exploreClearFilters": "Filter zurücksetzen",
"exploreNothingMatches": "Nichts Veröffentlichtes passt dazu.",
"exploreBy": "von {author}",
"exploreRelease": "v{version} · {date}",
"exploreLatestRelease": "Neueste Veröffentlichung: v{version} · {date}",
"exploreAddToLibrary": "Zur Bibliothek hinzufügen",
"exploreInLibrary": "In deiner Bibliothek",
"explorePercent": "{percent} %",
"exploreAdded": "Zu deiner Bibliothek hinzugefügt.",
"exploreOpen": "Öffnen",
"exploreNeedsNewerApp": "Dieses Lernset braucht eine neuere Version der App.",
"exploreFailed": "Deine Instanz war nicht erreichbar. Versuche es noch einmal.",
"exploreUnreachable": "Entdecken ist gerade nicht erreichbar.",
"exploreRetry": "Erneut versuchen",
"exploreMore": "Mehr anzeigen",
"exploreNoDescription": "Keine Beschreibung.",
"exploreReadLicence": "Lizenz lesen",
"publishWithdraw": "Aus Entdecken nehmen",
"publishWithdrawTitle": "Aus Entdecken nehmen?",
"publishWithdrawMessage": "Niemand kann es dann noch hinzufügen, und Kopien bekommen keine Aktualisierungen. Seine Veröffentlichungen bleiben, wie sie sind; veröffentlichst du es wieder, ist es zurück.",
"publishWithdrawn": "Zurückgezogen · Kopien bekommen keine Aktualisierungen",
feat(explore): take a later release into a copy, at a tap
A copy's top studyset says when a newer release of what it came from is
out, and what it would bring: changed, new and withdrawn items, counted
against the release the copy last took. Update takes it, never by
itself (ADR 0005, rule 4): cards, notes and steps take the release as a
revision on the one where they last took a release and merge per side,
as a dictionary's corrections do, so what the learner changed stays and
a side both changed is a conflict to settle; studysets, paths and PDFs
take each field the learner left as it was. New items come in where
they belong, unless the learner deleted that part; what the author
withdrew stays, marked, and the card browser filters for it; what the
learner deleted stays deleted; progress is never touched.
The instance gives out any release by its version, for the app to
compare the two. UpdateTaken moves into the shared revision merge, now
that notes and steps take updates too.
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 23:47:41 +02:00
"publishWithdrawnDone": "Aus Entdecken genommen.",
"copyUpdateOut": "v{version} ist da: {summary}.",
"copyUpdateChanged": "{count} geändert",
"copyUpdateAdded": "{count} neu",
"copyUpdateWithdrawn": "{count} zurückgezogen",
"copyUpdateNothing": "an deiner Kopie ändert sich nichts",
"copyUpdate": "Aktualisieren",
"copyUpdated": "Auf v{version} aktualisiert.",
"copyUpdatedToSettle": "{count, plural, =1{Bei einem hast du dort auch etwas geändert: öffne es, um zu wählen.} other{Bei {count} hast du dort auch etwas geändert: öffne sie, um zu wählen.}}",
"copyUpdateFailed": "Deine Instanz war nicht erreichbar. Versuche es noch einmal.",
feat(explore): how many learn it here, opt-in; copies published within their licence
Explore says how many people learn a published studyset on this instance
(ADR 0005, rule 8): shown, never ranked, counted daily by the server from
the people with an identity who chose to be counted (Settings, Privacy;
settings schema 8) and studied a copy on 3 or more days of the last 30,
rounded down from 5 on, so that nobody can be told apart. Only a number
the instance computes itself counts; votes count for nothing. The author
sees the same rounded number in the Publish sheet.
A copy of a published studyset is published within the original's
licence: never under "no derivatives", under a licence that keeps
adaptations under it only under that one, in every studyset of the copy.
Its releases say what they are based on, and Explore shows it.
ADR 0005 gets an addendum with stage 3's decisions.
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-10 00:18:29 +02:00
"cardBrowserStatusWithdrawn": "Im Original zurückgezogen",
"settingsPrivacy": "Privatsphäre",
"settingsCountLearning": "Mein Lernen in Entdecken mitzählen",
"settingsCountLearningSubtitle": "Entdecken zeigt, wie viele auf dieser Instanz ein veröffentlichtes Lernset lernen: Personen mit einer Identität, die das gewählt und es in den letzten 30 Tagen an 3 oder mehr Tagen gelernt haben, gerundet, ab 5. Nichts über dich wird gezeigt, und nichts verlässt die Instanz.",
"exploreLearners": "{count}+ lernen das hier",
"publishLearnersFew": "Weniger als 5 lernen es hier, von denen, die mitgezählt werden möchten.",
"publishForkForbidden": "Sein Original verbietet, Bearbeitungen weiterzugeben: nur wer es verfasst hat, veröffentlicht es.",
"publishLicenseMustStay": "Sein Original verlangt, dass Bearbeitungen unter {license} bleiben: wähle sie unter Bearbeiten, für jedes Lernset darin.",
feat(feedback): report, suggest, and an inbox in the Profile tab
The app's side of stage 4 (ADR 0005, rule 11). The card's Report sheet
offers "Send to the author too" on a card from a release; a copy's menu
reports the studyset as a whole and lists what is reported and
suggested on it, as Explore's summary does; the editors of cards, notes
and steps suggest them to the author as the learner has them, never
under "no derivatives". The Profile tab holds the inbox: the threads on
the person's published studysets and those they wrote, the newest
activity first, with a count on the tab. A thread shows a suggestion
beside the author's own item and its replies; its writer and the author
reply, and the author accepts (the content becomes their own edit, its
files fetched from the writer's), declines, closes, hides or blocks.
Writing needs an identity; reading what is public doesn't.
ADR 0005 gets an addendum for stage 4.
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-10 01:29:09 +02:00
"exploreBasedOn": "nach {location}",
"feedbackReport": "Meldung",
"feedbackSuggestion": "Vorschlag",
"feedbackOnStudyset": "Zum Lernset",
"feedbackOnCard": "Zu einer Karteikarte",
"feedbackOnNote": "Zu einer Notiz",
"feedbackOnStep": "Zu einem Schritt",
"feedbackByOn": "{name} · {date}",
"feedbackStatusClosed": "Geschlossen",
"feedbackStatusAccepted": "Angenommen",
"feedbackStatusDeclined": "Abgelehnt",
"feedbackStatusHidden": "Verborgen",
"feedbackReplyHint": "Schreib eine Antwort …",
"feedbackSend": "Senden",
"feedbackAccept": "Annehmen",
"feedbackDecline": "Ablehnen",
"feedbackClose": "Schließen",
"feedbackReopen": "Wieder öffnen",
"feedbackHide": "Verbergen",
"feedbackShow": "Zeigen",
"feedbackBlock": "{name} blockieren",
"feedbackBlockTitle": "{name} blockieren?",
"feedbackBlockMessage": "Was zu deinen Lernsets von dort kam und kommt, sieht dann niemand außer der Person selbst.",
"feedbackProposed": "Vorgeschlagen",
"feedbackYours": "Jetzt bei dir",
"feedbackAuthor": "Original",
"feedbackAccepted": "In dein Lernset übernommen. Die nächste Veröffentlichung nennt, wer es vorgeschlagen hat.",
"feedbackDecided": "Erledigt.",
"feedbackReplied": "Antwort gesendet.",
"feedbackBlocked": "Blockiert.",
"feedbackNotTaken": "Das lässt sich nicht übernehmen: worum es geht, ist nicht mehr in deinem Lernset.",
"feedbackFailed": "Deine Instanz war nicht erreichbar. Versuche es noch einmal.",
"feedbackUnreachable": "Meldungen und Vorschläge sind gerade nicht erreichbar.",
"feedbackRetry": "Erneut versuchen",
"inboxTitle": "Posteingang",
"inboxIntro": "Meldungen und Vorschläge zu deinen veröffentlichten Lernsets und die, die du geschrieben hast.",
"inboxEmpty": "Noch nichts.",
"studysetFeedback": "Meldungen und Vorschläge",
"studysetFeedbackEmpty": "Noch hat niemand etwas gemeldet oder vorgeschlagen.",
"reportToAuthor": "Fehler im Original melden",
"cardReportToAuthor": "Auch im Original melden",
"cardReportToAuthorHint": "Öffentlich: alle, die es lernen, lesen es, mit deinem öffentlichen Profil.",
"feedbackReportSent": "Im Original gemeldet.",
"suggestToAuthor": "Dem Original vorschlagen",
"suggestHint": "Was es ändert, und warum",
"suggestIntro": "Im Original sieht man es so, wie du es jetzt hast, neben der eigenen Fassung. Öffentlich: alle, die es lernen, lesen es, mit deinem öffentlichen Profil.",
"suggestSent": "Vorschlag gesendet.",
"suggestNoDerivatives": "Seine Lizenz verbietet Bearbeitungen: keine Vorschläge.",
2026-10-10 01:51:20 +02:00
"feedbackNeedsIdentity": "Melde dich mit GitHub an, um im Original zu melden und vorzuschlagen.",
feat(assistant): ask Claude from Home, the Library, a studyset and a session
A device setting, off unless the person turns it on (Settings ›
Assistant), shows a field at the foot of Home and a button that unfolds
into one: above Create studyset in the Library (smaller), in the free lane
on the right of a studyset's bottom bar (floating alone from expanded
windows on), and in the card's lower right corner while studying.
A question is handed to Claude, not answered here: the app opens
claude.ai/new with the question written in, followed by what it is about
(the person's learning on the instance, a studyset by name, or the studied
card's front and back as text), cut at 12,000 characters, for the person
to read and send in Claude. A Claude plan can't drive a chat inside
another app, as Anthropic allows no third party to offer sign-in with it;
Claude is to read the studysets through a connector on the instance
instead (next). Nothing leaves the app until the person sends it there.
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-10 11:51:58 +02:00
"kanjiExampleWords": "Wörter damit",
"settingsAssistant": "Assistent",
feat(assistant): search the web too, and choose what goes along
The assistant's field now has a switch at its start: a question goes to
Claude or into a web search, and the field remembers which. A web search
opens the chosen engine's results: on Android the device's own web
search by default (ACTION_WEB_SEARCH, answered by its default browser or
search app; Brave Search where nothing answers), elsewhere Brave Search
by default; Settings › Assistant › Search engine offers Ecosia,
DuckDuckGo, Startpage, Qwant, Google, Bing, or one's own address with
%s where the question goes.
Above the field, chips offer what the question is about: a card's
front, back, each hint and its explanation, the studyset's name and
description. None is chosen, so only what the person picks goes along,
each part cut at 600 characters; Claude gets the question and a compact
line per chosen part, a web search the question and the chosen text,
never the studyset's name. A chosen chip alone is enough to send. The
old sentences around every question (where it was asked, the connector)
are gone: they cost tokens for nothing unless the studyset is chosen.
On a studyset's screen the button now stands above the bottom bar, as in
the Library: unfolded inside the bar, its chips lay outside the bar's
bounds, where taps don't land.
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-10 14:41:36 +02:00
"settingsAskClaude": "Claude fragen oder im Web suchen",
"settingsAskClaudeSubtitle": "Aus, bis du es einschaltest. Fügt ein Feld auf der Startseite und einen Knopf in der Bibliothek, bei einem Lernset und beim Lernen hinzu. Eine Frage öffnet sich in Claude oder als Websuche, nur mit dem Zusammenhang, den du wählst; von hier aus wird nichts gesendet.",
feat(assistant): ask Claude from Home, the Library, a studyset and a session
A device setting, off unless the person turns it on (Settings ›
Assistant), shows a field at the foot of Home and a button that unfolds
into one: above Create studyset in the Library (smaller), in the free lane
on the right of a studyset's bottom bar (floating alone from expanded
windows on), and in the card's lower right corner while studying.
A question is handed to Claude, not answered here: the app opens
claude.ai/new with the question written in, followed by what it is about
(the person's learning on the instance, a studyset by name, or the studied
card's front and back as text), cut at 12,000 characters, for the person
to read and send in Claude. A Claude plan can't drive a chat inside
another app, as Anthropic allows no third party to offer sign-in with it;
Claude is to read the studysets through a connector on the instance
instead (next). Nothing leaves the app until the person sends it there.
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-10 11:51:58 +02:00
"assistantHint": "Frag Claude…",
"assistantHintStudyset": "Frag Claude zu {title}…",
"assistantHintCard": "Frag Claude zu dieser Karte…",
"assistantSend": "In Claude fragen",
feat(assistant): search the web too, and choose what goes along
The assistant's field now has a switch at its start: a question goes to
Claude or into a web search, and the field remembers which. A web search
opens the chosen engine's results: on Android the device's own web
search by default (ACTION_WEB_SEARCH, answered by its default browser or
search app; Brave Search where nothing answers), elsewhere Brave Search
by default; Settings › Assistant › Search engine offers Ecosia,
DuckDuckGo, Startpage, Qwant, Google, Bing, or one's own address with
%s where the question goes.
Above the field, chips offer what the question is about: a card's
front, back, each hint and its explanation, the studyset's name and
description. None is chosen, so only what the person picks goes along,
each part cut at 600 characters; Claude gets the question and a compact
line per chosen part, a web search the question and the chosen text,
never the studyset's name. A chosen chip alone is enough to send. The
old sentences around every question (where it was asked, the connector)
are gone: they cost tokens for nothing unless the studyset is chosen.
On a studyset's screen the button now stands above the bottom bar, as in
the Library: unfolded inside the bar, its chips lay outside the bar's
bounds, where taps don't land.
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-10 14:41:36 +02:00
"assistantOpen": "Fragen oder suchen",
feat(assistant): ask Claude from Home, the Library, a studyset and a session
A device setting, off unless the person turns it on (Settings ›
Assistant), shows a field at the foot of Home and a button that unfolds
into one: above Create studyset in the Library (smaller), in the free lane
on the right of a studyset's bottom bar (floating alone from expanded
windows on), and in the card's lower right corner while studying.
A question is handed to Claude, not answered here: the app opens
claude.ai/new with the question written in, followed by what it is about
(the person's learning on the instance, a studyset by name, or the studied
card's front and back as text), cut at 12,000 characters, for the person
to read and send in Claude. A Claude plan can't drive a chat inside
another app, as Anthropic allows no third party to offer sign-in with it;
Claude is to read the studysets through a connector on the instance
instead (next). Nothing leaves the app until the person sends it there.
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-10 11:51:58 +02:00
"assistantClose": "Schließen",
"assistantOpenFailed": "Claude ließ sich nicht öffnen.",
feat(assistant): Claude reads studysets through a connector on the instance
A Claude plan can't drive a chat inside another app, but Claude's apps
(every plan, the phone apps too) can add a remote MCP server as a custom
connector. The instance now is one (ADR 0006): Serverpod's web server
serves the MCP endpoint (/mcp, Streamable HTTP, JSON answers, no
sessions) with five read-only tools over the person's own synced rows
(their studysets, a studyset's cards and notes a page at a time, a
search across cards, a note, their progress), and the OAuth the
specification asks for: protected resource and authorization server
metadata, dynamic client registration, authorization code with PKCE
(S256 only), tokens bound to the resource, iss in the response, refresh
tokens that rotate. Caddy forwards these paths alone to the web server,
which production now runs on 8082.
People connect with a code from the app (Settings › Assistant › Connect
Claude): eight Crockford characters, valid for ten minutes and once,
typed on the authorization page, which names where it returns to, loads
nothing from elsewhere and may not be framed. Anonymous people can
connect too. Codes and tokens are kept only as SHA-256 hashes; an access
token lives an hour, a refresh token 30 days. The app lists what is
connected and disconnects it, which ends its tokens at once; deleting
the account deletes it; a daily job forgets what expired and clients
nobody connected within a week. InstanceInfo says where the connector is
(additive); the migration only adds server-only tables, so devices and
older apps are untouched.
The handlers take plain requests, so the integration tests drive the
whole flow (registration, the code, tokens, refresh, the tools, another
person's content, disconnecting, expiry, pruning, account deletion)
without a web server.
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-10 12:13:00 +02:00
"assistantConnectTitle": "Claude verbinden",
"assistantConnectSubtitle": "Claude deine Lernsets lesen lassen",
"assistantConnectIntro": "Claude kann über den Konnektor von Halkyon Learn deine Lernsets, Karten, Notizen und deinen Lernstand auf {instance} lesen und dazu antworten. Ändern kann es nichts. Was es liest, geht an Anthropic, unter deren Datenschutzerklärung.",
"assistantStepAdd": "Öffne in Claude Einstellungen › Konnektoren und füge einen eigenen Konnektor namens Halkyon Learn mit dieser Adresse hinzu. Einmal hinzugefügt, gilt er auch in den Apps von Claude.",
"assistantStepCode": "Claude öffnet dann eine Seite, die nach einem Code fragt. Hol ihn dir hier: Er gilt einmal, zehn Minuten lang.",
"assistantShowCode": "Code anzeigen",
"assistantNewCode": "Neuer Code",
"assistantCodeValid": "Gültig bis {time}",
"assistantCopy": "Kopieren",
"assistantCopied": "Kopiert",
"assistantConnected": "Verbunden",
"assistantNoneConnected": "Noch nichts verbunden.",
"assistantConnectedOn": "verbunden am {date}",
"assistantLastRead": "zuletzt gelesen am {date}",
"assistantDisconnect": "Trennen",
"assistantDisconnectTitle": "{name} trennen?",
"assistantDisconnectMessage": "Es kann deine Lernsets nicht mehr lesen. Mit einem neuen Code kannst du es wieder verbinden.",
"assistantNotOffered": "Diese Instanz bietet noch keinen Konnektor an. Fragen öffnen sich trotzdem in Claude, mit dem, worum es geht.",
"assistantUnreachable": "Die Instanz ist nicht erreichbar. Versuch es noch einmal, sobald du online bist.",
feat(assistant): search the web too, and choose what goes along
The assistant's field now has a switch at its start: a question goes to
Claude or into a web search, and the field remembers which. A web search
opens the chosen engine's results: on Android the device's own web
search by default (ACTION_WEB_SEARCH, answered by its default browser or
search app; Brave Search where nothing answers), elsewhere Brave Search
by default; Settings › Assistant › Search engine offers Ecosia,
DuckDuckGo, Startpage, Qwant, Google, Bing, or one's own address with
%s where the question goes.
Above the field, chips offer what the question is about: a card's
front, back, each hint and its explanation, the studyset's name and
description. None is chosen, so only what the person picks goes along,
each part cut at 600 characters; Claude gets the question and a compact
line per chosen part, a web search the question and the chosen text,
never the studyset's name. A chosen chip alone is enough to send. The
old sentences around every question (where it was asked, the connector)
are gone: they cost tokens for nothing unless the studyset is chosen.
On a studyset's screen the button now stands above the bottom bar, as in
the Library: unfolded inside the bar, its chips lay outside the bar's
bounds, where taps don't land.
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-10 14:41:36 +02:00
"assistantRetry": "Erneut versuchen",
"assistantLineFront": "Vorderseite: {text}",
"assistantLineBack": "Rückseite: {text}",
"assistantLineHint": "Hinweis {number}: {text}",
"assistantLineExplanation": "Erklärung: {text}",
"assistantLineStudyset": "Lernset: „{title}“ in Halkyon Learn auf {instance}",
"assistantLineDescription": "Beschreibung: {text}",
"assistantChipStudyset": "Lernset: {title}",
"assistantContextLabel": "Mitsenden",
"assistantTargetClaude": "Claude",
"assistantTargetWeb": "Web",
"assistantSwitchToWeb": "Stattdessen im Web suchen",
"assistantSwitchToClaude": "Stattdessen Claude fragen",
"assistantHintWeb": "Im Web suchen…",
"assistantSendWeb": "Suchen",
"assistantSearchFailed": "Die Suche ließ sich nicht öffnen.",
"settingsSearchEngine": "Suchmaschine",
"searchEngineDevice": "Suche des Geräts",
"searchEngineCustom": "Eigene Adresse",
"searchEngineCustomHint": "https://example.org/search?q=%s",
"searchEngineCustomInvalid": "Eine http- oder https-Adresse mit %s, wo die Frage hingehört.",
"searchEngineCustomSave": "Verwenden"
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
}