feat(app): one Profile for every app, the person's own tab first, then each app's (ADR 0014)

The public profile was already one per person for every service of an
instance (the register, ADR 0016); its app side was Learn's alone. It
moves into halkyon_app: the model, the repository on the module's
endpoints, the form, the avatar drawn on the device and the sheet with
someone's profile. They take the Public prefix (PublicProfileRepository,
BasePublicProfileGateway), as Train's own ProfileRepository holds the
body's figures. AppDependencies gains profiles and files, the picker the
avatar is chosen with, which moves out of Learn too.

HalkyonProfile is every app's Profile screen: the person's own tab first,
the same in every app (the account and the ways they sign in, the app's
own cards, then the public profile), then the app's own tabs, folding into
the title. Learn adds its inbox and Statistics. Train adds Progress, Days
and, where nothing records, Plans, and so opens on the person's tab, no
longer on Progress. Todo, which has no Profile tab, opens it from a row at
the top of Browse, where Todoist keeps the account.

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-02 09:44:38 +01:00
commit b7b0b937fe
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64
5 changed files with 1668 additions and 1293 deletions

View file

@ -447,8 +447,6 @@
"exploreTitle": "Entdecken",
"exploreEmpty": "Lernsets, die andere teilen, erscheinen hier.",
"profileTitle": "Profil",
"profileTabProfile": "Profil",
"profileTabStatistics": "Statistik",
"statisticsDays": "Tage",
"statisticsWeeks": "Wochen",
@ -467,75 +465,9 @@
"statisticsWeekOf": "Woche ab {date}",
"@statisticsWeekOf": {"placeholders": {"date": {"type": "String"}}},
"statisticsNothingYet": "Noch nichts gelernt. Deine Lernzeit und Bewertungen erscheinen hier, sobald du Karteikarten lernst.",
"profileSettingsTooltip": "Einstellungen",
"profileIdentified": "Dein Fortschritt wird in deinem Konto gespeichert.",
"profileSignInWays": "Anmeldewege",
"profileWayEmail": "E-Mail-Adresse",
"profileWayLinked": "Meldet dich an",
"publicProfileTitle": "Öffentliches Profil",
"profileSheetTitle": "Profil",
"profileSheetNotFound": "Niemand auf dieser Instanz hat diesen Handle.",
"profileSheetLinkVerified": "Verlinkt zurück auf dieses Profil",
"profileSheetUnreachable": "Das Profil konnte nicht geladen werden. Prüfe deine Verbindung.",
"publicProfileIntro": "Wie andere dich sehen, sobald du veröffentlichst: das Handle, unter dem sie dich finden, dein Name, ein paar Worte und Links. Es speichert sich beim Schreiben, sobald du dein Handle gewählt hast.",
"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"}}},
"publicProfileAddressPrivate": "Privat, bis du dein Profil ausfüllst oder etwas veröffentlichst; dann finden dich andere als @{address}.",
"@publicProfileAddressPrivate": {"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",
"publicProfilePage": "Deine Profilseite: {url}",
"publicProfilePageCopy": "Adresse kopieren",
"publicProfilePageCopied": "Adresse kopiert.",
"publicProfileVerifyHint": "Ein Link bekommt ein Häkchen, sobald seine Seite mit rel=\"me\" auf deine Profilseite zurückverlinkt, wie Mastodon Links prüft.",
"publicProfileCheckLinks": "Links prüfen",
"publicProfileLinkVerified": "Verlinkt zurück auf dein Profil",
"publicProfileLinksChecked": "{count, plural, =1{Geprüft: {verified} von 1 Link verlinkt zurück auf dein Profil.} other{Geprüft: {verified} von {count} Links verlinken zurück auf dein Profil.}}",
"publicProfileRemoveLink": "Link entfernen",
"publicProfileSaving": "Wird gespeichert …",
"publicProfileSavedNow": "Gespeichert",
"publicProfileHandleChoose": "Wähle ein Handle",
"publicProfileHandleFirst": "Wähle zuerst dein Handle: Damit wird dein Profil angelegt, und ab dann speichert es sich beim Schreiben.",
"publicProfileHandleChooseTitle": "Wähle dein Handle",
"publicProfileHandleChangeTitle": "Ändere dein Handle",
"publicProfileHandleDialogText": "Andere finden dich unter deinem Handle. Du kannst es ändern, bis du zum ersten Mal ein Lernset veröffentlichst.",
"publicProfileHandleChecking": "Wird geprüft …",
"publicProfileHandleFree": "@{handle} ist frei",
"@publicProfileHandleFree": {"placeholders": {"handle": {"type": "String"}}},
"publicProfileHandleYours": "Das ist dein Handle",
"publicProfileHandleConfirmChoose": "Wählen",
"publicProfileHandleConfirmChange": "Ändern",
"publicProfileRemove": "Profil entfernen",
"publicProfileRemoveTitle": "Dein öffentliches Profil entfernen?",
"publicProfileRemoveMessage": "Anzeigename, Text über dich, Links und Bild werden entfernt. Dein Handle bleibt deins und privat, bis du dein Profil wieder ausfüllst oder etwas veröffentlichst.",
"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.",
"profileProblemTooManyLinkChecks": "Die Links wurden zu oft geprüft. Versuche es in einer Stunde noch einmal.",
"profileProblemTooManyHandleChecks": "Es wurden zu viele Handles ausprobiert. Versuche es in einer Stunde noch einmal.",
"publicProfilePicture": "Bild",
"publicProfileChoosePicture": "Bild wählen",
"publicProfileRemovePicture": "Bild entfernen",
"publicProfilePictureType": "Bilder",
"publicProfilePictureLater": "Wähle dein Handle, um ein Bild hinzuzufügen.",
"settingsTitle": "Einstellungen",
"settingsAccount": "Konto",

View file

@ -504,8 +504,6 @@
"exploreTitle": "Explore",
"exploreEmpty": "Studysets that others share will appear here.",
"profileTitle": "Profile",
"profileTabProfile": "Profile",
"profileTabStatistics": "Statistics",
"statisticsDays": "Days",
"statisticsWeeks": "Weeks",
@ -532,81 +530,9 @@
}
},
"statisticsNothingYet": "Nothing studied yet. Your study time and ratings show here once you study flashcards.",
"profileSettingsTooltip": "Settings",
"profileIdentified": "Your progress is kept with your account.",
"profileSignInWays": "Ways to sign in",
"profileWayEmail": "Email address",
"profileWayLinked": "Signs you in",
"publicProfileTitle": "Public profile",
"profileSheetTitle": "Profile",
"profileSheetNotFound": "Nobody on this instance has this handle.",
"profileSheetLinkVerified": "Links back to this profile",
"profileSheetUnreachable": "The profile couldn’t be loaded. Check your connection.",
"publicProfileIntro": "How others see you once you publish: the handle they find you by, your name, a few words and links. It saves as you write, once you have chosen your handle.",
"publicProfileDisplayName": "Display name",
"publicProfileDisplayNameHint": "The name shown beside your handle",
"publicProfileHandle": "Handle",
"publicProfileHandleHint": "Letters, digits and underscores, up to 30",
"publicProfileAddress": "Others find you as @{address}",
"@publicProfileAddress": {"placeholders": {"address": {"type": "String"}}},
"publicProfileAddressPrivate": "Private until you fill in your profile or publish something; then others find you as @{address}.",
"@publicProfileAddressPrivate": {"placeholders": {"address": {"type": "String"}}},
"publicProfileHandleFixed": "Fixed since you published: others refer to it.",
"publicProfileBio": "Bio",
"publicProfileLinks": "Links",
"publicProfileLinksHint": "Your site or other accounts, up to 4.",
"publicProfileLinkHint": "https://…",
"publicProfileAddLink": "Add link",
"publicProfilePage": "Your profile page: {url}",
"@publicProfilePage": {"placeholders": {"url": {"type": "String"}}},
"publicProfilePageCopy": "Copy the address",
"publicProfilePageCopied": "Address copied.",
"publicProfileVerifyHint": "A link gets a checkmark once its page links back to your profile page with rel=\"me\", as Mastodon checks links.",
"publicProfileCheckLinks": "Check links",
"publicProfileLinkVerified": "Links back to your profile",
"publicProfileLinksChecked": "{count, plural, =1{Checked: {verified} of 1 link links back to your profile.} other{Checked: {verified} of {count} links link back to your profile.}}",
"@publicProfileLinksChecked": {"placeholders": {"count": {"type": "int"}, "verified": {"type": "int"}}},
"publicProfileRemoveLink": "Remove link",
"publicProfileSaving": "Saving…",
"publicProfileSavedNow": "Saved",
"publicProfileHandleChoose": "Choose a handle",
"publicProfileHandleFirst": "Choose your handle first: your profile is made with it, and saves as you write from then on.",
"publicProfileHandleChooseTitle": "Choose your handle",
"publicProfileHandleChangeTitle": "Change your handle",
"publicProfileHandleDialogText": "Others find you by your handle. You can change it until you first publish a studyset.",
"publicProfileHandleChecking": "Checking…",
"publicProfileHandleFree": "@{handle} is free",
"@publicProfileHandleFree": {
"placeholders": {
"handle": {"type": "String"}
}
},
"publicProfileHandleYours": "This is your handle",
"publicProfileHandleConfirmChoose": "Choose",
"publicProfileHandleConfirmChange": "Change",
"publicProfileRemove": "Remove profile",
"publicProfileRemoveTitle": "Remove your public profile?",
"publicProfileRemoveMessage": "Your display name, bio, links and picture are removed. Your handle stays yours and private until you fill in your profile again or publish something.",
"publicProfileRemoved": "Profile removed.",
"publicProfileFailed": "Couldn't reach the instance. Try again.",
"publicProfileUnreachable": "Your public profile can't be reached right now.",
"publicProfileRetry": "Retry",
"profileProblemHandleInvalid": "A handle is 1 to 30 letters (a to z), digits or underscores.",
"profileProblemHandleReserved": "This handle is kept for the instance.",
"profileProblemHandleTaken": "Someone else has this handle.",
"profileProblemPublished": "You have published: your handle can't change, nor your profile go.",
"profileProblemDisplayNameTooLong": "At most 30 characters.",
"profileProblemBioTooLong": "At most 500 characters.",
"profileProblemTooManyLinks": "At most 4 links.",
"profileProblemLinkInvalid": "Links start with https:// or http://.",
"profileProblemAvatarInvalid": "This picture can't be used: choose a PNG, JPEG, WebP or GIF image.",
"profileProblemTooManyLinkChecks": "The links were checked too often. Try again in an hour.",
"profileProblemTooManyHandleChecks": "Too many handles were tried. Try again in an hour.",
"publicProfilePicture": "Picture",
"publicProfileChoosePicture": "Choose picture",
"publicProfileRemovePicture": "Remove picture",
"publicProfilePictureType": "Images",
"publicProfilePictureLater": "Choose your handle to add a picture.",
"settingsTitle": "Settings",
"settingsAccount": "Account",

View file

@ -2704,18 +2704,6 @@ abstract class AppLocalizations {
/// **'Studysets that others share will appear here.'**
String get exploreEmpty;
/// No description provided for @profileTitle.
///
/// In en, this message translates to:
/// **'Profile'**
String get profileTitle;
/// No description provided for @profileTabProfile.
///
/// In en, this message translates to:
/// **'Profile'**
String get profileTabProfile;
/// No description provided for @profileTabStatistics.
///
/// In en, this message translates to:
@ -2812,42 +2800,6 @@ abstract class AppLocalizations {
/// **'Nothing studied yet. Your study time and ratings show here once you study flashcards.'**
String get statisticsNothingYet;
/// No description provided for @profileSettingsTooltip.
///
/// In en, this message translates to:
/// **'Settings'**
String get profileSettingsTooltip;
/// No description provided for @profileIdentified.
///
/// In en, this message translates to:
/// **'Your progress is kept with your account.'**
String get profileIdentified;
/// No description provided for @profileSignInWays.
///
/// In en, this message translates to:
/// **'Ways to sign in'**
String get profileSignInWays;
/// No description provided for @profileWayEmail.
///
/// In en, this message translates to:
/// **'Email address'**
String get profileWayEmail;
/// No description provided for @profileWayLinked.
///
/// In en, this message translates to:
/// **'Signs you in'**
String get profileWayLinked;
/// No description provided for @publicProfileTitle.
///
/// In en, this message translates to:
/// **'Public profile'**
String get publicProfileTitle;
/// No description provided for @profileSheetTitle.
///
/// In en, this message translates to:
@ -2860,354 +2812,12 @@ abstract class AppLocalizations {
/// **'Nobody on this instance has this handle.'**
String get profileSheetNotFound;
/// No description provided for @profileSheetLinkVerified.
///
/// In en, this message translates to:
/// **'Links back to this profile'**
String get profileSheetLinkVerified;
/// No description provided for @profileSheetUnreachable.
///
/// In en, this message translates to:
/// **'The profile couldn’t be loaded. Check your connection.'**
String get profileSheetUnreachable;
/// No description provided for @publicProfileIntro.
///
/// In en, this message translates to:
/// **'How others see you once you publish: the handle they find you by, your name, a few words and links. It saves as you write, once you have chosen your handle.'**
String get publicProfileIntro;
/// No description provided for @publicProfileDisplayName.
///
/// In en, this message translates to:
/// **'Display name'**
String get publicProfileDisplayName;
/// No description provided for @publicProfileDisplayNameHint.
///
/// In en, this message translates to:
/// **'The name shown beside your handle'**
String get publicProfileDisplayNameHint;
/// No description provided for @publicProfileHandle.
///
/// In en, this message translates to:
/// **'Handle'**
String get publicProfileHandle;
/// No description provided for @publicProfileHandleHint.
///
/// In en, this message translates to:
/// **'Letters, digits and underscores, up to 30'**
String get publicProfileHandleHint;
/// No description provided for @publicProfileAddress.
///
/// In en, this message translates to:
/// **'Others find you as @{address}'**
String publicProfileAddress(String address);
/// No description provided for @publicProfileAddressPrivate.
///
/// In en, this message translates to:
/// **'Private until you fill in your profile or publish something; then others find you as @{address}.'**
String publicProfileAddressPrivate(String address);
/// No description provided for @publicProfileHandleFixed.
///
/// In en, this message translates to:
/// **'Fixed since you published: others refer to it.'**
String get publicProfileHandleFixed;
/// No description provided for @publicProfileBio.
///
/// In en, this message translates to:
/// **'Bio'**
String get publicProfileBio;
/// No description provided for @publicProfileLinks.
///
/// In en, this message translates to:
/// **'Links'**
String get publicProfileLinks;
/// No description provided for @publicProfileLinksHint.
///
/// In en, this message translates to:
/// **'Your site or other accounts, up to 4.'**
String get publicProfileLinksHint;
/// No description provided for @publicProfileLinkHint.
///
/// In en, this message translates to:
/// **'https://…'**
String get publicProfileLinkHint;
/// No description provided for @publicProfileAddLink.
///
/// In en, this message translates to:
/// **'Add link'**
String get publicProfileAddLink;
/// No description provided for @publicProfilePage.
///
/// In en, this message translates to:
/// **'Your profile page: {url}'**
String publicProfilePage(String url);
/// No description provided for @publicProfilePageCopy.
///
/// In en, this message translates to:
/// **'Copy the address'**
String get publicProfilePageCopy;
/// No description provided for @publicProfilePageCopied.
///
/// In en, this message translates to:
/// **'Address copied.'**
String get publicProfilePageCopied;
/// No description provided for @publicProfileVerifyHint.
///
/// In en, this message translates to:
/// **'A link gets a checkmark once its page links back to your profile page with rel=\"me\", as Mastodon checks links.'**
String get publicProfileVerifyHint;
/// No description provided for @publicProfileCheckLinks.
///
/// In en, this message translates to:
/// **'Check links'**
String get publicProfileCheckLinks;
/// No description provided for @publicProfileLinkVerified.
///
/// In en, this message translates to:
/// **'Links back to your profile'**
String get publicProfileLinkVerified;
/// No description provided for @publicProfileLinksChecked.
///
/// In en, this message translates to:
/// **'{count, plural, =1{Checked: {verified} of 1 link links back to your profile.} other{Checked: {verified} of {count} links link back to your profile.}}'**
String publicProfileLinksChecked(int count, int verified);
/// No description provided for @publicProfileRemoveLink.
///
/// In en, this message translates to:
/// **'Remove link'**
String get publicProfileRemoveLink;
/// No description provided for @publicProfileSaving.
///
/// In en, this message translates to:
/// **'Saving…'**
String get publicProfileSaving;
/// No description provided for @publicProfileSavedNow.
///
/// In en, this message translates to:
/// **'Saved'**
String get publicProfileSavedNow;
/// No description provided for @publicProfileHandleChoose.
///
/// In en, this message translates to:
/// **'Choose a handle'**
String get publicProfileHandleChoose;
/// No description provided for @publicProfileHandleFirst.
///
/// In en, this message translates to:
/// **'Choose your handle first: your profile is made with it, and saves as you write from then on.'**
String get publicProfileHandleFirst;
/// No description provided for @publicProfileHandleChooseTitle.
///
/// In en, this message translates to:
/// **'Choose your handle'**
String get publicProfileHandleChooseTitle;
/// No description provided for @publicProfileHandleChangeTitle.
///
/// In en, this message translates to:
/// **'Change your handle'**
String get publicProfileHandleChangeTitle;
/// No description provided for @publicProfileHandleDialogText.
///
/// In en, this message translates to:
/// **'Others find you by your handle. You can change it until you first publish a studyset.'**
String get publicProfileHandleDialogText;
/// No description provided for @publicProfileHandleChecking.
///
/// In en, this message translates to:
/// **'Checking…'**
String get publicProfileHandleChecking;
/// No description provided for @publicProfileHandleFree.
///
/// In en, this message translates to:
/// **'@{handle} is free'**
String publicProfileHandleFree(String handle);
/// No description provided for @publicProfileHandleYours.
///
/// In en, this message translates to:
/// **'This is your handle'**
String get publicProfileHandleYours;
/// No description provided for @publicProfileHandleConfirmChoose.
///
/// In en, this message translates to:
/// **'Choose'**
String get publicProfileHandleConfirmChoose;
/// No description provided for @publicProfileHandleConfirmChange.
///
/// In en, this message translates to:
/// **'Change'**
String get publicProfileHandleConfirmChange;
/// No description provided for @publicProfileRemove.
///
/// In en, this message translates to:
/// **'Remove profile'**
String get publicProfileRemove;
/// No description provided for @publicProfileRemoveTitle.
///
/// In en, this message translates to:
/// **'Remove your public profile?'**
String get publicProfileRemoveTitle;
/// No description provided for @publicProfileRemoveMessage.
///
/// In en, this message translates to:
/// **'Your display name, bio, links and picture are removed. Your handle stays yours and private until you fill in your profile again or publish something.'**
String get publicProfileRemoveMessage;
/// No description provided for @publicProfileRemoved.
///
/// In en, this message translates to:
/// **'Profile removed.'**
String get publicProfileRemoved;
/// No description provided for @publicProfileFailed.
///
/// In en, this message translates to:
/// **'Couldn\'t reach the instance. Try again.'**
String get publicProfileFailed;
/// No description provided for @publicProfileUnreachable.
///
/// In en, this message translates to:
/// **'Your public profile can\'t be reached right now.'**
String get publicProfileUnreachable;
/// No description provided for @publicProfileRetry.
///
/// In en, this message translates to:
/// **'Retry'**
String get publicProfileRetry;
/// No description provided for @profileProblemHandleInvalid.
///
/// In en, this message translates to:
/// **'A handle is 1 to 30 letters (a to z), digits or underscores.'**
String get profileProblemHandleInvalid;
/// No description provided for @profileProblemHandleReserved.
///
/// In en, this message translates to:
/// **'This handle is kept for the instance.'**
String get profileProblemHandleReserved;
/// No description provided for @profileProblemHandleTaken.
///
/// In en, this message translates to:
/// **'Someone else has this handle.'**
String get profileProblemHandleTaken;
/// No description provided for @profileProblemPublished.
///
/// In en, this message translates to:
/// **'You have published: your handle can\'t change, nor your profile go.'**
String get profileProblemPublished;
/// No description provided for @profileProblemDisplayNameTooLong.
///
/// In en, this message translates to:
/// **'At most 30 characters.'**
String get profileProblemDisplayNameTooLong;
/// No description provided for @profileProblemBioTooLong.
///
/// In en, this message translates to:
/// **'At most 500 characters.'**
String get profileProblemBioTooLong;
/// No description provided for @profileProblemTooManyLinks.
///
/// In en, this message translates to:
/// **'At most 4 links.'**
String get profileProblemTooManyLinks;
/// No description provided for @profileProblemLinkInvalid.
///
/// In en, this message translates to:
/// **'Links start with https:// or http://.'**
String get profileProblemLinkInvalid;
/// No description provided for @profileProblemAvatarInvalid.
///
/// In en, this message translates to:
/// **'This picture can\'t be used: choose a PNG, JPEG, WebP or GIF image.'**
String get profileProblemAvatarInvalid;
/// No description provided for @profileProblemTooManyLinkChecks.
///
/// In en, this message translates to:
/// **'The links were checked too often. Try again in an hour.'**
String get profileProblemTooManyLinkChecks;
/// No description provided for @profileProblemTooManyHandleChecks.
///
/// In en, this message translates to:
/// **'Too many handles were tried. Try again in an hour.'**
String get profileProblemTooManyHandleChecks;
/// No description provided for @publicProfilePicture.
///
/// In en, this message translates to:
/// **'Picture'**
String get publicProfilePicture;
/// No description provided for @publicProfileChoosePicture.
///
/// In en, this message translates to:
/// **'Choose picture'**
String get publicProfileChoosePicture;
/// No description provided for @publicProfileRemovePicture.
///
/// In en, this message translates to:
/// **'Remove picture'**
String get publicProfileRemovePicture;
/// No description provided for @publicProfilePictureType.
///
/// In en, this message translates to:
/// **'Images'**
String get publicProfilePictureType;
/// No description provided for @publicProfilePictureLater.
///
/// In en, this message translates to:
/// **'Choose your handle to add a picture.'**
String get publicProfilePictureLater;
/// No description provided for @settingsTitle.
///
/// In en, this message translates to:

View file

@ -1639,12 +1639,6 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get exploreEmpty => 'Lernsets, die andere teilen, erscheinen hier.';
@override
String get profileTitle => 'Profil';
@override
String get profileTabProfile => 'Profil';
@override
String get profileTabStatistics => 'Statistik';
@ -1708,25 +1702,6 @@ class AppLocalizationsDe extends AppLocalizations {
String get statisticsNothingYet =>
'Noch nichts gelernt. Deine Lernzeit und Bewertungen erscheinen hier, sobald du Karteikarten lernst.';
@override
String get profileSettingsTooltip => 'Einstellungen';
@override
String get profileIdentified =>
'Dein Fortschritt wird in deinem Konto gespeichert.';
@override
String get profileSignInWays => 'Anmeldewege';
@override
String get profileWayEmail => 'E-Mail-Adresse';
@override
String get profileWayLinked => 'Meldet dich an';
@override
String get publicProfileTitle => 'Öffentliches Profil';
@override
String get profileSheetTitle => 'Profil';
@ -1734,217 +1709,10 @@ class AppLocalizationsDe extends AppLocalizations {
String get profileSheetNotFound =>
'Niemand auf dieser Instanz hat diesen Handle.';
@override
String get profileSheetLinkVerified => 'Verlinkt zurück auf dieses Profil';
@override
String get profileSheetUnreachable =>
'Das Profil konnte nicht geladen werden. Prüfe deine Verbindung.';
@override
String get publicProfileIntro =>
'Wie andere dich sehen, sobald du veröffentlichst: das Handle, unter dem sie dich finden, dein Name, ein paar Worte und Links. Es speichert sich beim Schreiben, sobald du dein Handle gewählt hast.';
@override
String get publicProfileDisplayName => 'Anzeigename';
@override
String get publicProfileDisplayNameHint => 'Der Name neben deinem Handle';
@override
String get publicProfileHandle => 'Handle';
@override
String get publicProfileHandleHint =>
'Buchstaben, Ziffern und Unterstriche, bis zu 30';
@override
String publicProfileAddress(String address) {
return 'Andere finden dich als @$address';
}
@override
String publicProfileAddressPrivate(String address) {
return 'Privat, bis du dein Profil ausfüllst oder etwas veröffentlichst; dann finden dich andere als @$address.';
}
@override
String get publicProfileHandleFixed =>
'Fest, seit du veröffentlicht hast: Andere verweisen darauf.';
@override
String get publicProfileBio => 'Über dich';
@override
String get publicProfileLinks => 'Links';
@override
String get publicProfileLinksHint =>
'Deine Website oder andere Konten, bis zu 4.';
@override
String get publicProfileLinkHint => 'https://…';
@override
String get publicProfileAddLink => 'Link hinzufügen';
@override
String publicProfilePage(String url) {
return 'Deine Profilseite: $url';
}
@override
String get publicProfilePageCopy => 'Adresse kopieren';
@override
String get publicProfilePageCopied => 'Adresse kopiert.';
@override
String get publicProfileVerifyHint =>
'Ein Link bekommt ein Häkchen, sobald seine Seite mit rel=\"me\" auf deine Profilseite zurückverlinkt, wie Mastodon Links prüft.';
@override
String get publicProfileCheckLinks => 'Links prüfen';
@override
String get publicProfileLinkVerified => 'Verlinkt zurück auf dein Profil';
@override
String publicProfileLinksChecked(int count, int verified) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other:
'Geprüft: $verified von $count Links verlinken zurück auf dein Profil.',
one: 'Geprüft: $verified von 1 Link verlinkt zurück auf dein Profil.',
);
return '$_temp0';
}
@override
String get publicProfileRemoveLink => 'Link entfernen';
@override
String get publicProfileSaving => 'Wird gespeichert …';
@override
String get publicProfileSavedNow => 'Gespeichert';
@override
String get publicProfileHandleChoose => 'Wähle ein Handle';
@override
String get publicProfileHandleFirst =>
'Wähle zuerst dein Handle: Damit wird dein Profil angelegt, und ab dann speichert es sich beim Schreiben.';
@override
String get publicProfileHandleChooseTitle => 'Wähle dein Handle';
@override
String get publicProfileHandleChangeTitle => 'Ändere dein Handle';
@override
String get publicProfileHandleDialogText =>
'Andere finden dich unter deinem Handle. Du kannst es ändern, bis du zum ersten Mal ein Lernset veröffentlichst.';
@override
String get publicProfileHandleChecking => 'Wird geprüft …';
@override
String publicProfileHandleFree(String handle) {
return '@$handle ist frei';
}
@override
String get publicProfileHandleYours => 'Das ist dein Handle';
@override
String get publicProfileHandleConfirmChoose => 'Wählen';
@override
String get publicProfileHandleConfirmChange => 'Ändern';
@override
String get publicProfileRemove => 'Profil entfernen';
@override
String get publicProfileRemoveTitle => 'Dein öffentliches Profil entfernen?';
@override
String get publicProfileRemoveMessage =>
'Anzeigename, Text über dich, Links und Bild werden entfernt. Dein Handle bleibt deins und privat, bis du dein Profil wieder ausfüllst oder etwas veröffentlichst.';
@override
String get publicProfileRemoved => 'Profil entfernt.';
@override
String get publicProfileFailed =>
'Die Instanz ist nicht erreichbar. Versuche es erneut.';
@override
String get publicProfileUnreachable =>
'Dein öffentliches Profil ist gerade nicht erreichbar.';
@override
String get publicProfileRetry => 'Erneut versuchen';
@override
String get profileProblemHandleInvalid =>
'Ein Handle besteht aus 1 bis 30 Buchstaben (a bis z), Ziffern oder Unterstrichen.';
@override
String get profileProblemHandleReserved =>
'Dieses Handle ist der Instanz vorbehalten.';
@override
String get profileProblemHandleTaken =>
'Dieses Handle hat schon jemand anderes.';
@override
String get profileProblemPublished =>
'Du hast veröffentlicht: Dein Handle kann sich nicht mehr ändern und dein Profil nicht mehr gehen.';
@override
String get profileProblemDisplayNameTooLong => 'Höchstens 30 Zeichen.';
@override
String get profileProblemBioTooLong => 'Höchstens 500 Zeichen.';
@override
String get profileProblemTooManyLinks => 'Höchstens 4 Links.';
@override
String get profileProblemLinkInvalid =>
'Links beginnen mit https:// oder http://.';
@override
String get profileProblemAvatarInvalid =>
'Dieses Bild lässt sich nicht verwenden: Wähle ein PNG-, JPEG-, WebP- oder GIF-Bild.';
@override
String get profileProblemTooManyLinkChecks =>
'Die Links wurden zu oft geprüft. Versuche es in einer Stunde noch einmal.';
@override
String get profileProblemTooManyHandleChecks =>
'Es wurden zu viele Handles ausprobiert. Versuche es in einer Stunde noch einmal.';
@override
String get publicProfilePicture => 'Bild';
@override
String get publicProfileChoosePicture => 'Bild wählen';
@override
String get publicProfileRemovePicture => 'Bild entfernen';
@override
String get publicProfilePictureType => 'Bilder';
@override
String get publicProfilePictureLater =>
'Wähle dein Handle, um ein Bild hinzuzufügen.';
@override
String get settingsTitle => 'Einstellungen';

View file

@ -1624,12 +1624,6 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get exploreEmpty => 'Studysets that others share will appear here.';
@override
String get profileTitle => 'Profile';
@override
String get profileTabProfile => 'Profile';
@override
String get profileTabStatistics => 'Statistics';
@ -1693,238 +1687,16 @@ class AppLocalizationsEn extends AppLocalizations {
String get statisticsNothingYet =>
'Nothing studied yet. Your study time and ratings show here once you study flashcards.';
@override
String get profileSettingsTooltip => 'Settings';
@override
String get profileIdentified => 'Your progress is kept with your account.';
@override
String get profileSignInWays => 'Ways to sign in';
@override
String get profileWayEmail => 'Email address';
@override
String get profileWayLinked => 'Signs you in';
@override
String get publicProfileTitle => 'Public profile';
@override
String get profileSheetTitle => 'Profile';
@override
String get profileSheetNotFound => 'Nobody on this instance has this handle.';
@override
String get profileSheetLinkVerified => 'Links back to this profile';
@override
String get profileSheetUnreachable =>
'The profile couldn’t be loaded. Check your connection.';
@override
String get publicProfileIntro =>
'How others see you once you publish: the handle they find you by, your name, a few words and links. It saves as you write, once you have chosen your handle.';
@override
String get publicProfileDisplayName => 'Display name';
@override
String get publicProfileDisplayNameHint =>
'The name shown beside your handle';
@override
String get publicProfileHandle => 'Handle';
@override
String get publicProfileHandleHint =>
'Letters, digits and underscores, up to 30';
@override
String publicProfileAddress(String address) {
return 'Others find you as @$address';
}
@override
String publicProfileAddressPrivate(String address) {
return 'Private until you fill in your profile or publish something; then others find you as @$address.';
}
@override
String get publicProfileHandleFixed =>
'Fixed since you published: others refer to it.';
@override
String get publicProfileBio => 'Bio';
@override
String get publicProfileLinks => 'Links';
@override
String get publicProfileLinksHint => 'Your site or other accounts, up to 4.';
@override
String get publicProfileLinkHint => 'https://…';
@override
String get publicProfileAddLink => 'Add link';
@override
String publicProfilePage(String url) {
return 'Your profile page: $url';
}
@override
String get publicProfilePageCopy => 'Copy the address';
@override
String get publicProfilePageCopied => 'Address copied.';
@override
String get publicProfileVerifyHint =>
'A link gets a checkmark once its page links back to your profile page with rel=\"me\", as Mastodon checks links.';
@override
String get publicProfileCheckLinks => 'Check links';
@override
String get publicProfileLinkVerified => 'Links back to your profile';
@override
String publicProfileLinksChecked(int count, int verified) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'Checked: $verified of $count links link back to your profile.',
one: 'Checked: $verified of 1 link links back to your profile.',
);
return '$_temp0';
}
@override
String get publicProfileRemoveLink => 'Remove link';
@override
String get publicProfileSaving => 'Saving…';
@override
String get publicProfileSavedNow => 'Saved';
@override
String get publicProfileHandleChoose => 'Choose a handle';
@override
String get publicProfileHandleFirst =>
'Choose your handle first: your profile is made with it, and saves as you write from then on.';
@override
String get publicProfileHandleChooseTitle => 'Choose your handle';
@override
String get publicProfileHandleChangeTitle => 'Change your handle';
@override
String get publicProfileHandleDialogText =>
'Others find you by your handle. You can change it until you first publish a studyset.';
@override
String get publicProfileHandleChecking => 'Checking…';
@override
String publicProfileHandleFree(String handle) {
return '@$handle is free';
}
@override
String get publicProfileHandleYours => 'This is your handle';
@override
String get publicProfileHandleConfirmChoose => 'Choose';
@override
String get publicProfileHandleConfirmChange => 'Change';
@override
String get publicProfileRemove => 'Remove profile';
@override
String get publicProfileRemoveTitle => 'Remove your public profile?';
@override
String get publicProfileRemoveMessage =>
'Your display name, bio, links and picture are removed. Your handle stays yours and private until you fill in your profile again or publish something.';
@override
String get publicProfileRemoved => 'Profile removed.';
@override
String get publicProfileFailed => 'Couldn\'t reach the instance. Try again.';
@override
String get publicProfileUnreachable =>
'Your public profile can\'t be reached right now.';
@override
String get publicProfileRetry => 'Retry';
@override
String get profileProblemHandleInvalid =>
'A handle is 1 to 30 letters (a to z), digits or underscores.';
@override
String get profileProblemHandleReserved =>
'This handle is kept for the instance.';
@override
String get profileProblemHandleTaken => 'Someone else has this handle.';
@override
String get profileProblemPublished =>
'You have published: your handle can\'t change, nor your profile go.';
@override
String get profileProblemDisplayNameTooLong => 'At most 30 characters.';
@override
String get profileProblemBioTooLong => 'At most 500 characters.';
@override
String get profileProblemTooManyLinks => 'At most 4 links.';
@override
String get profileProblemLinkInvalid =>
'Links start with https:// or http://.';
@override
String get profileProblemAvatarInvalid =>
'This picture can\'t be used: choose a PNG, JPEG, WebP or GIF image.';
@override
String get profileProblemTooManyLinkChecks =>
'The links were checked too often. Try again in an hour.';
@override
String get profileProblemTooManyHandleChecks =>
'Too many handles were tried. Try again in an hour.';
@override
String get publicProfilePicture => 'Picture';
@override
String get publicProfileChoosePicture => 'Choose picture';
@override
String get publicProfileRemovePicture => 'Remove picture';
@override
String get publicProfilePictureType => 'Images';
@override
String get publicProfilePictureLater =>
'Choose your handle to add a picture.';
@override
String get settingsTitle => 'Settings';