feat(learn): share a studyset with people from its Share sheet

Share opens one sheet (Halkyon's ADR 0044, D29): the people first, then
the community. A studyset of the person's own offers Share with people,
which says what it does, moves it into a space of its own with its
progress told and Abort, and opens it there (StudysetSharingCubit). A
shared one lists its members (SpaceMembersCubit): the Owner invites by
handle as Editor or Viewer, changes roles, hands on and removes, and
deletes it for everyone; anyone leaves, the Owner naming who takes it
on; each refusal is said. A member's row opens their safety code
(twelve groups of five digits) to mark compared, and changed keys are
flagged, trusted only after comparing (D32). The community row leads to
the privacy dialog or publishing as Share did, and is off for a shared
studyset (D27).

A studyset knows its space and whether the person only views it
(Studyset.sharedIn, viewOnly, from the sync engine's grants). Its mark
is Lucide's users icon, "Shared · private" (D31). A Viewer's studyset
screen, its options, its topics and the move sheet offer nothing that
writes, and say they can view and study it (D30); the engine refuses
their writes on the device in any case. A shared top isn't moved,
archived or deleted from its options, and nothing moves in or out of
its space.

Whats-New: Share a studyset with people: invite them by their handle as editors or viewers, and compare safety codes to know nobody stands between you.
Whats-New-De: Teile ein Lernset mit Personen: Lade sie über ihr Handle als Bearbeiter:innen oder Betrachter:innen ein und vergleicht Sicherheitscodes, damit niemand zwischen euch steht.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-11-11 15:26:47 +01:00
commit 9b344141ef
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -13051,6 +13051,360 @@ abstract class AppLocalizations {
/// In en, this message translates to:
/// **'{count, plural, =0{No notes or files go} =1{1 note or file goes} other{{count} notes and files go}}'**
String publishMaterialCount(int count);
/// The mark of a studyset shared with people, sealed for its members alone
///
/// In en, this message translates to:
/// **'Shared · private'**
String get studysetVisibilityShared;
/// Title of a studyset's Share sheet
///
/// In en, this message translates to:
/// **'Share {title}'**
String shareTitle(String title);
/// Heading of the Share sheet's section on people the studyset is shared with
///
/// In en, this message translates to:
/// **'People'**
String get sharePeople;
/// Above the members, on a topic of a shared studyset
///
/// In en, this message translates to:
/// **'Part of {title}, which is shared with these people:'**
String sharePartOf(String title);
/// Explains sharing with people, before a studyset is shared
///
/// In en, this message translates to:
/// **'Study and write it together with others. They see it as you do, sealed for the people you invite alone.'**
String get sharePeopleIntro;
/// Button starting to share a studyset with people
///
/// In en, this message translates to:
/// **'Share with people'**
String get shareWithPeople;
/// Heading of the Share sheet's section on publishing
///
/// In en, this message translates to:
/// **'Community'**
String get shareCommunity;
/// Why a shared studyset can't be published
///
/// In en, this message translates to:
/// **'Not for studysets shared with people yet.'**
String get shareCommunityNotShared;
/// Snack bar after sharing a studyset was aborted
///
/// In en, this message translates to:
/// **'Sharing stopped. The studyset is as it was.'**
String get shareAborted;
/// Title of the sheet sharing a studyset with people
///
/// In en, this message translates to:
/// **'Share {title} with people'**
String shareWithPeopleTitle(String title);
/// Confirms sharing a studyset with people
///
/// In en, this message translates to:
/// **'Share'**
String get shareWithPeopleConfirm;
/// What sharing a studyset with people does, asked before it starts
///
/// In en, this message translates to:
/// **'It moves with everything in it, your progress too, into a space of its own that you own. Then invite people by their handle. Topics stay inside it, and it can\'t be published while it is shared.'**
String get shareWithPeopleBody;
/// Why a studyset can't be shared
///
/// In en, this message translates to:
/// **'Something in it is published, or was. Studysets with a publication can\'t be shared yet.'**
String get shareRefusedPublished;
/// Why a studyset can't be shared
///
/// In en, this message translates to:
/// **'This device doesn\'t hold your account\'s keys. Sign in with your password first.'**
String get shareRefusedKeys;
/// Why a studyset couldn't be shared
///
/// In en, this message translates to:
/// **'Your instance couldn\'t be reached. Try again once you\'re online.'**
String get shareRefusedUnreached;
/// Sharing a studyset failed for another reason
///
/// In en, this message translates to:
/// **'Sharing failed. The studyset is as it was.'**
String get shareFailed;
/// Stage of sharing a studyset
///
/// In en, this message translates to:
/// **'Making its space'**
String get workStageSpace;
/// Stage of sharing a studyset
///
/// In en, this message translates to:
/// **'Clearing the old copy'**
String get workStageCleaning;
/// The members of a shared studyset couldn't be read or changed
///
/// In en, this message translates to:
/// **'Your instance couldn\'t be reached.'**
String get shareMembersUnreachable;
/// Button inviting someone to a shared studyset
///
/// In en, this message translates to:
/// **'Invite'**
String get shareInvite;
/// Title of the invite dialog
///
/// In en, this message translates to:
/// **'Invite someone'**
String get shareInviteTitle;
/// Field for the handle of the person invited
///
/// In en, this message translates to:
/// **'Their handle'**
String get shareInviteHandle;
/// A member's role in a shared studyset
///
/// In en, this message translates to:
/// **'Owner'**
String get shareRoleOwner;
/// A member's role in a shared studyset
///
/// In en, this message translates to:
/// **'Editor'**
String get shareRoleEditor;
/// A member's role in a shared studyset
///
/// In en, this message translates to:
/// **'Viewer'**
String get shareRoleViewer;
/// What an Editor may do
///
/// In en, this message translates to:
/// **'Studies it and changes it with you.'**
String get shareRoleEditorHint;
/// What a Viewer may do
///
/// In en, this message translates to:
/// **'Studies it, but can\'t change it.'**
String get shareRoleViewerHint;
/// Marks the person's own row among the members
///
/// In en, this message translates to:
/// **'you'**
String get shareYou;
/// Marks a member who hasn't accepted yet
///
/// In en, this message translates to:
/// **'invited'**
String get shareInvited;
/// Marks a member whose keys changed since this device saw them
///
/// In en, this message translates to:
/// **'keys changed'**
String get shareKeysChanged;
/// Marks a member whose safety code the person compared
///
/// In en, this message translates to:
/// **'Safety code compared'**
String get shareCompared;
/// Tooltip of a member's menu
///
/// In en, this message translates to:
/// **'Member options'**
String get shareMemberOptions;
/// Gives a member the Editor role
///
/// In en, this message translates to:
/// **'Make editor'**
String get shareMakeEditor;
/// Gives a member the Viewer role
///
/// In en, this message translates to:
/// **'Make viewer'**
String get shareMakeViewer;
/// Hands the shared studyset on to a member
///
/// In en, this message translates to:
/// **'Make owner'**
String get shareMakeOwner;
/// Asks before handing a shared studyset on
///
/// In en, this message translates to:
/// **'Make {name} its owner?'**
String shareMakeOwnerTitle(String name);
/// What handing a shared studyset on does
///
/// In en, this message translates to:
/// **'They decide who it is shared with from then on. You stay an editor.'**
String get shareMakeOwnerBody;
/// Removes a member from a shared studyset
///
/// In en, this message translates to:
/// **'Remove'**
String get shareRemove;
/// Asks before removing a member
///
/// In en, this message translates to:
/// **'Remove {name}?'**
String shareRemoveTitle(String name);
/// What removing a member does
///
/// In en, this message translates to:
/// **'They no longer see it or anything written in it from now on.'**
String get shareRemoveBody;
/// Leaves a shared studyset
///
/// In en, this message translates to:
/// **'Leave'**
String get shareLeave;
/// Asks before leaving a shared studyset
///
/// In en, this message translates to:
/// **'Leave {title}?'**
String shareLeaveTitle(String title);
/// What leaving a shared studyset does
///
/// In en, this message translates to:
/// **'It goes from your library with your progress in it. Someone has to invite you again to come back.'**
String get shareLeaveBody;
/// Asks the owner who takes a shared studyset on as they leave
///
/// In en, this message translates to:
/// **'Who owns it after you?'**
String get shareLeaveNextOwner;
/// Deletes a shared studyset with everything in it, for every member
///
/// In en, this message translates to:
/// **'Delete for everyone'**
String get shareDeleteForEveryone;
/// Asks before deleting a shared studyset
///
/// In en, this message translates to:
/// **'Delete {title} for everyone?'**
String shareDeleteTitle(String title);
/// What deleting a shared studyset does
///
/// In en, this message translates to:
/// **'It goes for good, with everything in it and everyone\'s progress, from every member\'s library. This can\'t be undone.'**
String get shareDeleteBody;
/// An invitation was refused
///
/// In en, this message translates to:
/// **'Nobody on your instance has that handle.'**
String get shareRefusedNoHandle;
/// An invitation was refused
///
/// In en, this message translates to:
/// **'They are a member or invited already.'**
String get shareRefusedAlreadyMember;
/// Leaving was refused
///
/// In en, this message translates to:
/// **'You\'re its only member: delete it instead.'**
String get shareRefusedLastMember;
/// The instance keeps no shared spaces
///
/// In en, this message translates to:
/// **'Your instance doesn\'t share studysets.'**
String get shareRefusedUnavailable;
/// A change to a shared studyset was refused
///
/// In en, this message translates to:
/// **'Only its owner can do that.'**
String get shareRefusedNotAllowed;
/// Title of the safety code sheet
///
/// In en, this message translates to:
/// **'Safety code with {name}'**
String safetyCodeTitle(String name);
/// How to use a safety code
///
/// In en, this message translates to:
/// **'Compare this with the code {name} sees for you, in person or on a call. If they match, nobody stands between you, not even your instance.'**
String safetyCodeHowTo(String name);
/// Warns that a member's keys changed
///
/// In en, this message translates to:
/// **'{name}\'s keys changed since this device last saw them. That happens after a new password without the recovery phrase, or if someone stands between you. Compare the code before trusting them.'**
String safetyCodeChanged(String name);
/// Marks a safety code compared
///
/// In en, this message translates to:
/// **'Mark as compared'**
String get safetyCodeMarkCompared;
/// Trusts a member's changed keys after comparing
///
/// In en, this message translates to:
/// **'Trust the new keys'**
String get safetyCodeTrustNew;
/// Line on a shared studyset where the person is a Viewer
///
/// In en, this message translates to:
/// **'You can view and study this, not change it.'**
String get studysetViewOnly;
/// A write in a studyset shared with the person as a Viewer was refused
///
/// In en, this message translates to:
/// **'You can only view this studyset.'**
String get studysetViewOnlyRefused;
}
class _AppLocalizationsDelegate