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>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-09 23:15:28 +02:00
commit f4af6cfd3a
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -8288,6 +8288,216 @@ abstract class AppLocalizations {
/// In en, this message translates to:
/// **'Address copied.'**
String get publishLocationCopied;
/// No description provided for @publishedField.
///
/// In en, this message translates to:
/// **'Release'**
String get publishedField;
/// No description provided for @publishedVersion.
///
/// In en, this message translates to:
/// **'v{version}'**
String publishedVersion(int version);
/// No description provided for @exploreSearch.
///
/// In en, this message translates to:
/// **'Search titles and authors'**
String get exploreSearch;
/// No description provided for @exploreLanguages.
///
/// In en, this message translates to:
/// **'Languages'**
String get exploreLanguages;
/// No description provided for @exploreAnyLanguage.
///
/// In en, this message translates to:
/// **'Any'**
String get exploreAnyLanguage;
/// No description provided for @exploreLanguagePair.
///
/// In en, this message translates to:
/// **'{front} → {back}'**
String exploreLanguagePair(String front, String back);
/// No description provided for @exploreKinds.
///
/// In en, this message translates to:
/// **'Content'**
String get exploreKinds;
/// No description provided for @exploreKindsChosen.
///
/// In en, this message translates to:
/// **'{count, plural, =1{1 kind of content} other{{count} kinds of content}}'**
String exploreKindsChosen(int count);
/// No description provided for @exploreKindCards.
///
/// In en, this message translates to:
/// **'Flashcards'**
String get exploreKindCards;
/// No description provided for @exploreKindNotes.
///
/// In en, this message translates to:
/// **'Notes'**
String get exploreKindNotes;
/// No description provided for @exploreKindPaths.
///
/// In en, this message translates to:
/// **'Learning paths'**
String get exploreKindPaths;
/// No description provided for @exploreKindPdfs.
///
/// In en, this message translates to:
/// **'PDFs'**
String get exploreKindPdfs;
/// No description provided for @exploreKindsIntro.
///
/// In en, this message translates to:
/// **'Only studysets holding each of these.'**
String get exploreKindsIntro;
/// No description provided for @exploreClearFilters.
///
/// In en, this message translates to:
/// **'Clear filters'**
String get exploreClearFilters;
/// No description provided for @exploreNothingMatches.
///
/// In en, this message translates to:
/// **'Nothing published here matches.'**
String get exploreNothingMatches;
/// No description provided for @exploreBy.
///
/// In en, this message translates to:
/// **'by {author}'**
String exploreBy(String author);
/// No description provided for @exploreRelease.
///
/// In en, this message translates to:
/// **'v{version} · {date}'**
String exploreRelease(int version, String date);
/// No description provided for @exploreLatestRelease.
///
/// In en, this message translates to:
/// **'Latest release: v{version} · {date}'**
String exploreLatestRelease(int version, String date);
/// No description provided for @exploreAddToLibrary.
///
/// In en, this message translates to:
/// **'Add to library'**
String get exploreAddToLibrary;
/// No description provided for @exploreInLibrary.
///
/// In en, this message translates to:
/// **'In your library'**
String get exploreInLibrary;
/// No description provided for @explorePercent.
///
/// In en, this message translates to:
/// **'{percent} %'**
String explorePercent(int percent);
/// No description provided for @exploreAdded.
///
/// In en, this message translates to:
/// **'Added to your library.'**
String get exploreAdded;
/// No description provided for @exploreOpen.
///
/// In en, this message translates to:
/// **'Open'**
String get exploreOpen;
/// No description provided for @exploreNeedsNewerApp.
///
/// In en, this message translates to:
/// **'This studyset needs a newer version of the app.'**
String get exploreNeedsNewerApp;
/// No description provided for @exploreFailed.
///
/// In en, this message translates to:
/// **'Couldn\'t reach your instance. Try again.'**
String get exploreFailed;
/// No description provided for @exploreUnreachable.
///
/// In en, this message translates to:
/// **'Explore can\'t be reached right now.'**
String get exploreUnreachable;
/// No description provided for @exploreRetry.
///
/// In en, this message translates to:
/// **'Retry'**
String get exploreRetry;
/// No description provided for @exploreMore.
///
/// In en, this message translates to:
/// **'Show more'**
String get exploreMore;
/// No description provided for @exploreNoDescription.
///
/// In en, this message translates to:
/// **'No description.'**
String get exploreNoDescription;
/// No description provided for @exploreReadLicence.
///
/// In en, this message translates to:
/// **'Read the licence'**
String get exploreReadLicence;
/// No description provided for @publishWithdraw.
///
/// In en, this message translates to:
/// **'Take off Explore'**
String get publishWithdraw;
/// No description provided for @publishWithdrawTitle.
///
/// In en, this message translates to:
/// **'Take it off Explore?'**
String get publishWithdrawTitle;
/// No description provided for @publishWithdrawMessage.
///
/// In en, this message translates to:
/// **'Nobody can add it any more, and copies get no updates. Its releases stay as they are; publishing it again brings it back.'**
String get publishWithdrawMessage;
/// No description provided for @publishWithdrawn.
///
/// In en, this message translates to:
/// **'Withdrawn · copies get no updates'**
String get publishWithdrawn;
/// No description provided for @publishWithdrawnDone.
///
/// In en, this message translates to:
/// **'Taken off Explore.'**
String get publishWithdrawnDone;
}
class _AppLocalizationsDelegate