v4: users sign in to one gerbeur instance with their account on another — topic instances, each with its own admins, domain and data, had no way to share accounts. Sign-in is federated over a subset of OpenID Connect, the authorization code flow with PKCE: each instance is an identity provider for its own users and a client for the others', and signs what it tells them with an Ed25519 key kept in federation_keys and published at /.well-known/jwks.json, beside its metadata at /.well-known/openid-configuration. Only sign-in is federated: an account from another instance is a local users row linked to (issuer, subject) in user_identities, with no password (password_hash ''), so sessions, roles, permissions, the socket and every foreign key work as before.
A remote user is name@host here, in users.username, in paths (/@alice@music.example) and in mentions, through one handle rule in shared/validation.ts that paths, MENTION_RE and Markdown all build on; Markdown undoes GFM's email autolink of a handle. Their name, email and avatar come from their home at each sign-in and by its signed events (federation_outbox, delivered by the federation job with backoff): a rename at home leaves the old handle an alias here, and a password change or a withdrawn grant ends their sessions here. Their password, email, avatar and name can't change here (assertLocalUser), nor can they sign in elsewhere from here. An admin keeps the trusted and blocked instances on /manage (federation:manage): a trusted instance's users sign in from a button on the login page, a blocked one's can't and are signed out at once, and any other's join with an invite from the register page. The /authorize page asks the user once per instance, and /settings lists the instances their account signs in to, each disconnectable; /login?next= brings a signed-out visitor back to /authorize. Emails stay unique among local accounts only, and migration 0024 adds the tables, makes that index partial and reserves authorize and federation as category slugs. remote/gerbeur-instance.ts is the only way to other instances: https and public addresses only, no redirects, no certificate fallback, unless GERBEUR_FEDERATION_ALLOW_PRIVATE lets two instances on one machine talk. 298 backend tests and 702 frontend tests pass, and deno check, deno fmt, deno lint, tsc, eslint, doc:lint and i18n:compile --strict are clean; checked end to end with two built instances on one machine: sign-in through the other's login and consent pages, consent skipped once granted and asked again after disconnecting, a rename and a password change at home reaching the other, and blocking; screenshots of the login, consent, profile, settings and manage pages at 1280 and 390px. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
276
locales/en.po
276
locales/en.po
@@ -51,7 +51,7 @@ msgstr "{0} more online: {restNames}"
|
||||
|
||||
#. placeholder {0}: VALIDATION.USERNAME_MIN
|
||||
#. placeholder {1}: VALIDATION.USERNAME_MAX
|
||||
#: src/pages/UserRegister.tsx:145
|
||||
#: src/pages/UserRegister.tsx:147
|
||||
msgid "{0}–{1} characters: letters, numbers, or underscores"
|
||||
msgstr "{0}–{1} characters: letters, numbers, or underscores"
|
||||
|
||||
@@ -280,6 +280,10 @@ msgstr "<0>{0}</0> upvoted <1>{1}</1>"
|
||||
msgid "<0>{0}</0> was added to <1>{1}</1>"
|
||||
msgstr "<0>{0}</0> was added to <1>{1}</1>"
|
||||
|
||||
#: src/pages/Authorize.tsx:138
|
||||
msgid "<0>{name}</0> ({host}) asks to sign you in with your account here, <1>@{username}</1>. It will receive your username, your email address and your avatar."
|
||||
msgstr "<0>{name}</0> ({host}) asks to sign you in with your account here, <1>@{username}</1>. It will receive your username, your email address and your avatar."
|
||||
|
||||
#: src/components/chat/ChatModal.tsx:778
|
||||
msgid "1 new message"
|
||||
msgstr "1 new message"
|
||||
@@ -296,10 +300,14 @@ msgstr "A link is required"
|
||||
msgid "a post"
|
||||
msgstr "a post"
|
||||
|
||||
#: src/pages/Settings.tsx:85
|
||||
#: src/pages/Settings.tsx:89
|
||||
msgid "Account"
|
||||
msgstr "Account"
|
||||
|
||||
#: src/components/profile/ProfileHeader.tsx:144
|
||||
msgid "Account on <0>{host}</0>"
|
||||
msgstr "Account on <0>{host}</0>"
|
||||
|
||||
#: src/components/comment/CommentThread.tsx:102
|
||||
msgid "Add a comment…"
|
||||
msgstr "Add a comment…"
|
||||
@@ -309,7 +317,7 @@ msgstr "Add a comment…"
|
||||
msgid "Add category"
|
||||
msgstr "Add category"
|
||||
|
||||
#: src/components/profile/ProfileHeader.tsx:153
|
||||
#: src/components/profile/ProfileHeader.tsx:173
|
||||
msgid "Add email…"
|
||||
msgstr "Add email…"
|
||||
|
||||
@@ -342,10 +350,14 @@ msgstr "All"
|
||||
msgid "Already dumped by {0} {1}"
|
||||
msgstr "Already dumped by {0} {1}"
|
||||
|
||||
#: src/pages/UserRegister.tsx:175
|
||||
#: src/pages/UserRegister.tsx:179
|
||||
msgid "Already have an account? <0>Log in</0>"
|
||||
msgstr "Already have an account? <0>Log in</0>"
|
||||
|
||||
#: src/components/federation/PeerManager.tsx:149
|
||||
msgid "An instance's address, like music.example"
|
||||
msgstr "An instance's address, like music.example"
|
||||
|
||||
#: src/utils/shared/api.ts:35
|
||||
msgid "An unexpected error occurred."
|
||||
msgstr "An unexpected error occurred."
|
||||
@@ -355,14 +367,14 @@ msgstr "An unexpected error occurred."
|
||||
msgid "email.digest.andMore"
|
||||
msgstr "and {n} more"
|
||||
|
||||
#: src/pages/Settings.tsx:101
|
||||
#: src/pages/Settings.tsx:134
|
||||
msgid "Appearance"
|
||||
msgstr "Appearance"
|
||||
|
||||
#. placeholder {0}: VALIDATION.PASSWORD_MIN
|
||||
#: src/components/profile/ChangePasswordModal.tsx:101
|
||||
#: src/pages/ResetPassword.tsx:124
|
||||
#: src/pages/UserRegister.tsx:164
|
||||
#: src/pages/UserRegister.tsx:166
|
||||
msgid "At least {0} characters"
|
||||
msgstr "At least {0} characters"
|
||||
|
||||
@@ -370,7 +382,7 @@ msgstr "At least {0} characters"
|
||||
msgid "At most {maxLength} characters."
|
||||
msgstr "At most {maxLength} characters."
|
||||
|
||||
#: src/pages/Settings.tsx:46
|
||||
#: src/pages/Settings.tsx:48
|
||||
msgid "Auto"
|
||||
msgstr "Auto"
|
||||
|
||||
@@ -379,6 +391,18 @@ msgstr "Auto"
|
||||
msgid "Back to login"
|
||||
msgstr "Back to login"
|
||||
|
||||
#: src/pages/FederationCallback.tsx:66
|
||||
msgid "Back to the login page"
|
||||
msgstr "Back to the login page"
|
||||
|
||||
#: src/components/federation/PeerManager.tsx:163
|
||||
msgid "Block"
|
||||
msgstr "Block"
|
||||
|
||||
#: src/components/federation/PeerManager.tsx:33
|
||||
msgid "Blocked"
|
||||
msgstr "Blocked"
|
||||
|
||||
#. js-lingui-explicit-id
|
||||
#: api/mail/digest.ts:225
|
||||
msgid "email.digest.by"
|
||||
@@ -394,6 +418,11 @@ msgstr "by @{username} · {n, plural, one {# dump} other {# dumps}}"
|
||||
msgid "Can't connect to the live updates server. Upvotes and notifications may not sync until it reconnects."
|
||||
msgstr "Can't connect to the live updates server. Upvotes and notifications may not sync until it reconnects."
|
||||
|
||||
#: src/pages/Authorize.tsx:117
|
||||
#: src/pages/Authorize.tsx:145
|
||||
msgid "Can't sign in there"
|
||||
msgstr "Can't sign in there"
|
||||
|
||||
#: src/components/category/CategoryManager.tsx:225
|
||||
#: src/components/category/CategoryManager.tsx:226
|
||||
#: src/components/chat/ChatEditBox.tsx:92
|
||||
@@ -404,6 +433,7 @@ msgstr "Can't connect to the live updates server. Upvotes and notifications may
|
||||
#: src/components/profile/DescriptionEditor.tsx:97
|
||||
#: src/components/profile/EmailEditor.tsx:83
|
||||
#: src/components/shared/ConfirmModal.tsx:63
|
||||
#: src/pages/Authorize.tsx:158
|
||||
#: src/pages/Dump.tsx:445
|
||||
#: src/pages/DumpEdit.tsx:565
|
||||
msgid "Cancel"
|
||||
@@ -423,7 +453,7 @@ msgid "Cancel search"
|
||||
msgstr "Cancel search"
|
||||
|
||||
#: src/components/category/CategorySelect.tsx:33
|
||||
#: src/pages/Manage.tsx:30
|
||||
#: src/pages/Manage.tsx:36
|
||||
msgid "Categories"
|
||||
msgstr "Categories"
|
||||
|
||||
@@ -431,7 +461,7 @@ msgstr "Categories"
|
||||
msgid "Category"
|
||||
msgstr "Category"
|
||||
|
||||
#: src/components/profile/ProfileHeader.tsx:95
|
||||
#: src/components/profile/ProfileHeader.tsx:102
|
||||
msgid "Change avatar"
|
||||
msgstr "Change avatar"
|
||||
|
||||
@@ -439,12 +469,16 @@ msgstr "Change avatar"
|
||||
msgid "Change image"
|
||||
msgstr "Change image"
|
||||
|
||||
#: src/pages/Settings.tsx:101
|
||||
msgid "Change it on {home}"
|
||||
msgstr "Change it on {home}"
|
||||
|
||||
#: src/components/profile/ChangePasswordModal.tsx:66
|
||||
#: src/components/profile/ChangePasswordModal.tsx:120
|
||||
msgid "Change password"
|
||||
msgstr "Change password"
|
||||
|
||||
#: src/pages/Settings.tsx:96
|
||||
#: src/pages/Settings.tsx:112
|
||||
msgid "Change password…"
|
||||
msgstr "Change password…"
|
||||
|
||||
@@ -464,10 +498,14 @@ msgstr "Chat"
|
||||
msgid "Chat ({unreadChatCount} unread)"
|
||||
msgstr "Chat ({unreadChatCount} unread)"
|
||||
|
||||
#: src/pages/UserRegister.tsx:106
|
||||
#: src/pages/UserRegister.tsx:108
|
||||
msgid "Checking invite…"
|
||||
msgstr "Checking invite…"
|
||||
|
||||
#: src/components/federation/PeerManager.tsx:154
|
||||
msgid "Checking…"
|
||||
msgstr "Checking…"
|
||||
|
||||
#: src/components/profile/ChangePasswordModal.tsx:75
|
||||
#: src/components/shared/Modal.tsx:76
|
||||
msgid "Close"
|
||||
@@ -493,7 +531,7 @@ msgstr "Close without posting? The attached file won't be kept — everything yo
|
||||
msgid "Collapse player"
|
||||
msgstr "Collapse player"
|
||||
|
||||
#: src/pages/Settings.tsx:110
|
||||
#: src/pages/Settings.tsx:143
|
||||
msgid "Color scheme"
|
||||
msgstr "Color scheme"
|
||||
|
||||
@@ -507,10 +545,22 @@ msgstr "Community"
|
||||
msgid "Confirm new password"
|
||||
msgstr "Confirm new password"
|
||||
|
||||
#: src/components/federation/FederatedSignIn.tsx:111
|
||||
msgid "Connecting…"
|
||||
msgstr "Connecting…"
|
||||
|
||||
#: src/contexts/ws/WSProvider.tsx:757
|
||||
msgid "Connection lost — this message may not have been sent"
|
||||
msgstr "Connection lost — this message may not have been sent"
|
||||
|
||||
#: src/components/federation/FederatedSignIn.tsx:113
|
||||
msgid "Continue"
|
||||
msgstr "Continue"
|
||||
|
||||
#: src/pages/Authorize.tsx:155
|
||||
msgid "Continue as @{username}"
|
||||
msgstr "Continue as @{username}"
|
||||
|
||||
#: src/components/profile/ProfileOwnActions.tsx:99
|
||||
msgid "Copied!"
|
||||
msgstr "Copied!"
|
||||
@@ -540,6 +590,10 @@ msgstr "Could not rename"
|
||||
msgid "Could not save"
|
||||
msgstr "Could not save"
|
||||
|
||||
#: src/components/federation/PeerManager.tsx:146
|
||||
msgid "Couldn't add that instance"
|
||||
msgstr "Couldn't add that instance"
|
||||
|
||||
#: src/components/dump/create/DumpCreateModal.tsx:607
|
||||
msgid "Couldn't load a preview for this link — check it, or post it as-is and refresh the preview later."
|
||||
msgstr "Couldn't load a preview for this link — check it, or post it as-is and refresh the preview later."
|
||||
@@ -548,6 +602,10 @@ msgstr "Couldn't load a preview for this link — check it, or post it as-is and
|
||||
msgid "Couldn't load the chat."
|
||||
msgstr "Couldn't load the chat."
|
||||
|
||||
#: src/components/federation/FederatedSignIn.tsx:102
|
||||
msgid "Couldn't reach that instance"
|
||||
msgstr "Couldn't reach that instance"
|
||||
|
||||
#: src/pages/Unsubscribe.tsx:116
|
||||
msgid "Couldn't unsubscribe"
|
||||
msgstr "Couldn't unsubscribe"
|
||||
@@ -576,11 +634,11 @@ msgstr "Creating…"
|
||||
msgid "Current password"
|
||||
msgstr "Current password"
|
||||
|
||||
#: src/pages/Settings.tsx:48
|
||||
#: src/pages/Settings.tsx:50
|
||||
msgid "Dark"
|
||||
msgstr "Dark"
|
||||
|
||||
#: src/pages/Settings.tsx:121
|
||||
#: src/pages/Settings.tsx:154
|
||||
msgid "Default tab"
|
||||
msgstr "Default tab"
|
||||
|
||||
@@ -655,6 +713,10 @@ msgstr "Description (optional)"
|
||||
msgid "Discard"
|
||||
msgstr "Discard"
|
||||
|
||||
#: src/components/federation/GrantList.tsx:84
|
||||
msgid "Disconnect"
|
||||
msgstr "Disconnect"
|
||||
|
||||
#: src/components/chat/ChatModal.tsx:743
|
||||
msgid "Disconnected — reconnecting…"
|
||||
msgstr "Disconnected — reconnecting…"
|
||||
@@ -730,7 +792,7 @@ msgstr "Edit {0}"
|
||||
msgid "Edit description"
|
||||
msgstr "Edit description"
|
||||
|
||||
#: src/components/profile/ProfileHeader.tsx:151
|
||||
#: src/components/profile/ProfileHeader.tsx:171
|
||||
msgid "Edit email"
|
||||
msgstr "Edit email"
|
||||
|
||||
@@ -772,11 +834,11 @@ msgstr "Editing"
|
||||
msgid "Editing {0}"
|
||||
msgstr "Editing {0}"
|
||||
|
||||
#: src/pages/Settings.tsx:145
|
||||
#: src/pages/Settings.tsx:178
|
||||
msgid "Email"
|
||||
msgstr "Email"
|
||||
|
||||
#: src/pages/UserRegister.tsx:152
|
||||
#: src/pages/UserRegister.tsx:154
|
||||
msgid "Email address"
|
||||
msgstr "Email address"
|
||||
|
||||
@@ -822,6 +884,8 @@ msgstr "Failed to post comment"
|
||||
msgid "Failed to post reply"
|
||||
msgstr "Failed to post reply"
|
||||
|
||||
#: src/components/federation/GrantList.tsx:98
|
||||
#: src/components/federation/PeerManager.tsx:143
|
||||
#: src/components/playlist/PlaylistEditForm.tsx:185
|
||||
#: src/components/profile/DescriptionEditor.tsx:99
|
||||
#: src/components/profile/EmailEditor.tsx:86
|
||||
@@ -836,7 +900,7 @@ msgstr "Failed to save category"
|
||||
msgid "Failed to save edit"
|
||||
msgstr "Failed to save edit"
|
||||
|
||||
#: src/components/profile/ProfileHeader.tsx:162
|
||||
#: src/components/profile/ProfileHeader.tsx:182
|
||||
msgid "Failed to update avatar"
|
||||
msgstr "Failed to update avatar"
|
||||
|
||||
@@ -844,7 +908,7 @@ msgstr "Failed to update avatar"
|
||||
msgid "Failed to update role"
|
||||
msgstr "Failed to update role"
|
||||
|
||||
#: src/pages/Settings.tsx:119
|
||||
#: src/pages/Settings.tsx:152
|
||||
msgid "Feeds"
|
||||
msgstr "Feeds"
|
||||
|
||||
@@ -879,7 +943,7 @@ msgstr "Follow some users to see their dumps here."
|
||||
|
||||
#: src/components/feed/FeedTabBar.tsx:43
|
||||
#: src/components/profile/ProfileFollowTab.tsx:140
|
||||
#: src/pages/Settings.tsx:55
|
||||
#: src/pages/Settings.tsx:57
|
||||
#: src/pages/UserPublicProfile.tsx:161
|
||||
msgid "Followed"
|
||||
msgstr "Followed"
|
||||
@@ -894,7 +958,7 @@ msgstr "Following"
|
||||
msgid "email.digest.forYou"
|
||||
msgstr "For you"
|
||||
|
||||
#: src/pages/UserLogin.tsx:97
|
||||
#: src/pages/UserLogin.tsx:101
|
||||
msgid "Forgot password?"
|
||||
msgstr "Forgot password?"
|
||||
|
||||
@@ -929,11 +993,11 @@ msgid "email.reset.hi"
|
||||
msgstr "Hi {username},"
|
||||
|
||||
#: src/components/feed/FeedTabBar.tsx:39
|
||||
#: src/pages/Settings.tsx:52
|
||||
#: src/pages/Settings.tsx:54
|
||||
msgid "Hot"
|
||||
msgstr "Hot"
|
||||
|
||||
#: src/pages/UserLogin.tsx:136
|
||||
#: src/pages/UserLogin.tsx:142
|
||||
msgid "If that address is registered you'll receive a reset link shortly."
|
||||
msgstr "If that address is registered you'll receive a reset link shortly."
|
||||
|
||||
@@ -965,7 +1029,11 @@ msgstr "In the chat"
|
||||
msgid "Insert emoji"
|
||||
msgstr "Insert emoji"
|
||||
|
||||
#: src/pages/UserRegister.tsx:117
|
||||
#: src/pages/Manage.tsx:43
|
||||
msgid "Instances"
|
||||
msgstr "Instances"
|
||||
|
||||
#: src/pages/UserRegister.tsx:119
|
||||
msgid "Invalid invite"
|
||||
msgstr "Invalid invite"
|
||||
|
||||
@@ -979,7 +1047,7 @@ msgstr "Invalid link"
|
||||
msgid "Invite link"
|
||||
msgstr "Invite link"
|
||||
|
||||
#: src/components/profile/ProfileHeader.tsx:116
|
||||
#: src/components/profile/ProfileHeader.tsx:126
|
||||
msgid "invited by"
|
||||
msgstr "invited by"
|
||||
|
||||
@@ -998,8 +1066,12 @@ msgstr "invited by you"
|
||||
msgid "Invitees"
|
||||
msgstr "Invitees"
|
||||
|
||||
#: src/components/federation/FederatedSignIn.tsx:105
|
||||
msgid "Its address, like music.example"
|
||||
msgstr "Its address, like music.example"
|
||||
|
||||
#: src/components/feed/FeedTabBar.tsx:41
|
||||
#: src/pages/Settings.tsx:54
|
||||
#: src/pages/Settings.tsx:56
|
||||
msgid "Journal"
|
||||
msgstr "Journal"
|
||||
|
||||
@@ -1007,11 +1079,16 @@ msgstr "Journal"
|
||||
msgid "Keep editing"
|
||||
msgstr "Keep editing"
|
||||
|
||||
#. placeholder {0}: relativeTime(grant.lastUsedAt)
|
||||
#: src/components/federation/GrantList.tsx:77
|
||||
msgid "last used {0}"
|
||||
msgstr "last used {0}"
|
||||
|
||||
#: src/components/profile/UsernameField.tsx:59
|
||||
msgid "Letters, numbers and underscores only"
|
||||
msgstr "Letters, numbers and underscores only"
|
||||
|
||||
#: src/pages/Settings.tsx:47
|
||||
#: src/pages/Settings.tsx:49
|
||||
msgid "Light"
|
||||
msgstr "Light"
|
||||
|
||||
@@ -1068,17 +1145,20 @@ msgstr "Loading profile…"
|
||||
#: src/components/category/CategoryManager.tsx:60
|
||||
#: src/components/chat/ChatModal.tsx:763
|
||||
#: src/components/editor/EmojiPickerPopup.tsx:125
|
||||
#: src/components/federation/PeerManager.tsx:108
|
||||
#: src/components/playlist/PlaylistMembershipPanel.tsx:45
|
||||
#: src/components/shared/ListState.tsx:38
|
||||
#: src/components/shared/LoadMoreButton.tsx:32
|
||||
#: src/components/social/UserListPopover.tsx:151
|
||||
#: src/pages/Authorize.tsx:122
|
||||
msgid "Loading…"
|
||||
msgstr "Loading…"
|
||||
|
||||
#: src/components/layout/AppHeader.tsx:208
|
||||
#: src/pages/UserLogin.tsx:41
|
||||
#: src/pages/UserLogin.tsx:67
|
||||
#: src/pages/UserLogin.tsx:86
|
||||
#: src/pages/FederationCallback.tsx:31
|
||||
#: src/pages/UserLogin.tsx:44
|
||||
#: src/pages/UserLogin.tsx:71
|
||||
#: src/pages/UserLogin.tsx:90
|
||||
msgid "Log in"
|
||||
msgstr "Log in"
|
||||
|
||||
@@ -1090,16 +1170,22 @@ msgstr "Log in to like"
|
||||
msgid "Log in to vote"
|
||||
msgstr "Log in to vote"
|
||||
|
||||
#: src/components/layout/UserMenu.tsx:126
|
||||
#. placeholder {0}: peer.name ?? peer.host
|
||||
#: src/components/federation/FederatedSignIn.tsx:97
|
||||
msgid "Log in with {0}"
|
||||
msgstr "Log in with {0}"
|
||||
|
||||
#: src/components/layout/UserMenu.tsx:127
|
||||
#: src/pages/UserPublicProfile.tsx:131
|
||||
msgid "Log out"
|
||||
msgstr "Log out"
|
||||
|
||||
#: src/pages/UserLogin.tsx:85
|
||||
#: src/pages/UserLogin.tsx:89
|
||||
msgid "Logging in…"
|
||||
msgstr "Logging in…"
|
||||
|
||||
#: src/pages/UserLogin.tsx:72
|
||||
#: src/pages/FederationCallback.tsx:63
|
||||
#: src/pages/UserLogin.tsx:76
|
||||
msgid "Login failed"
|
||||
msgstr "Login failed"
|
||||
|
||||
@@ -1107,9 +1193,9 @@ msgstr "Login failed"
|
||||
msgid "Lowercase letters, numbers and single hyphens only"
|
||||
msgstr "Lowercase letters, numbers and single hyphens only"
|
||||
|
||||
#: src/components/layout/UserMenu.tsx:113
|
||||
#: src/pages/Manage.tsx:24
|
||||
#: src/pages/Manage.tsx:29
|
||||
#: src/components/layout/UserMenu.tsx:114
|
||||
#: src/pages/Manage.tsx:27
|
||||
#: src/pages/Manage.tsx:34
|
||||
#: src/pages/UserPublicProfile.tsx:164
|
||||
msgid "Manage"
|
||||
msgstr "Manage"
|
||||
@@ -1138,7 +1224,7 @@ msgstr "Name"
|
||||
|
||||
#: src/components/chat/ChatModal.tsx:692
|
||||
#: src/components/feed/FeedTabBar.tsx:40
|
||||
#: src/pages/Settings.tsx:53
|
||||
#: src/pages/Settings.tsx:55
|
||||
msgid "New"
|
||||
msgstr "New"
|
||||
|
||||
@@ -1231,6 +1317,10 @@ msgstr "No users match \"{q}\"."
|
||||
msgid "Not following anyone yet."
|
||||
msgstr "Not following anyone yet."
|
||||
|
||||
#: src/pages/Authorize.tsx:103
|
||||
msgid "Not from here"
|
||||
msgstr "Not from here"
|
||||
|
||||
#: src/pages/Community.tsx:127
|
||||
msgid "Nothing happened this month."
|
||||
msgstr "Nothing happened this month."
|
||||
@@ -1248,7 +1338,7 @@ msgstr "Nothing here yet."
|
||||
#: src/components/layout/NotificationBell.tsx:57
|
||||
#: src/pages/Notifications.tsx:387
|
||||
#: src/pages/Notifications.tsx:505
|
||||
#: src/pages/Settings.tsx:130
|
||||
#: src/pages/Settings.tsx:163
|
||||
msgid "Notifications"
|
||||
msgstr "Notifications"
|
||||
|
||||
@@ -1256,11 +1346,11 @@ msgstr "Notifications"
|
||||
msgid "Notifications ({unreadNotificationCount} unread)"
|
||||
msgstr "Notifications ({unreadNotificationCount} unread)"
|
||||
|
||||
#: src/pages/Settings.tsx:60
|
||||
#: src/pages/Settings.tsx:62
|
||||
msgid "Off"
|
||||
msgstr "Off"
|
||||
|
||||
#: src/pages/Settings.tsx:59
|
||||
#: src/pages/Settings.tsx:61
|
||||
msgid "On"
|
||||
msgstr "On"
|
||||
|
||||
@@ -1300,6 +1390,18 @@ msgstr "Open the chat"
|
||||
msgid "or <0>browse files</0>"
|
||||
msgstr "or <0>browse files</0>"
|
||||
|
||||
#: src/components/federation/FederatedSignIn.tsx:82
|
||||
msgid "Or join with your account on another gerbeur"
|
||||
msgstr "Or join with your account on another gerbeur"
|
||||
|
||||
#: src/components/federation/FederatedSignIn.tsx:83
|
||||
msgid "Or log in with your account on another gerbeur"
|
||||
msgstr "Or log in with your account on another gerbeur"
|
||||
|
||||
#: src/pages/Settings.tsx:128
|
||||
msgid "Other instances"
|
||||
msgstr "Other instances"
|
||||
|
||||
#: src/pages/UserPublicProfile.tsx:157
|
||||
msgid "Overview"
|
||||
msgstr "Overview"
|
||||
@@ -1308,13 +1410,14 @@ msgstr "Overview"
|
||||
msgid "Page not found"
|
||||
msgstr "Page not found"
|
||||
|
||||
#: src/pages/Settings.tsx:90
|
||||
#: src/pages/UserLogin.tsx:82
|
||||
#: src/pages/Settings.tsx:96
|
||||
#: src/pages/Settings.tsx:106
|
||||
#: src/pages/UserLogin.tsx:86
|
||||
msgid "Password"
|
||||
msgstr "Password"
|
||||
|
||||
#. placeholder {0}: VALIDATION.PASSWORD_MIN
|
||||
#: src/pages/UserRegister.tsx:158
|
||||
#: src/pages/UserRegister.tsx:160
|
||||
msgid "Password (min. {0} characters)"
|
||||
msgstr "Password (min. {0} characters)"
|
||||
|
||||
@@ -1416,17 +1519,17 @@ msgstr "Refreshing stream…"
|
||||
msgid "Refreshing…"
|
||||
msgstr "Refreshing…"
|
||||
|
||||
#: src/pages/UserRegister.tsx:45
|
||||
#: src/pages/UserRegister.tsx:129
|
||||
#: src/pages/UserRegister.tsx:169
|
||||
#: src/pages/UserRegister.tsx:47
|
||||
#: src/pages/UserRegister.tsx:131
|
||||
#: src/pages/UserRegister.tsx:171
|
||||
msgid "Register"
|
||||
msgstr "Register"
|
||||
|
||||
#: src/pages/UserRegister.tsx:168
|
||||
#: src/pages/UserRegister.tsx:170
|
||||
msgid "Registering…"
|
||||
msgstr "Registering…"
|
||||
|
||||
#: src/pages/UserRegister.tsx:134
|
||||
#: src/pages/UserRegister.tsx:136
|
||||
msgid "Registration failed"
|
||||
msgstr "Registration failed"
|
||||
|
||||
@@ -1434,6 +1537,12 @@ msgstr "Registration failed"
|
||||
msgid "Related"
|
||||
msgstr "Related"
|
||||
|
||||
#. placeholder {0}: peer.host
|
||||
#: src/components/federation/PeerManager.tsx:133
|
||||
#: src/components/federation/PeerManager.tsx:134
|
||||
msgid "Remove {0}"
|
||||
msgstr "Remove {0}"
|
||||
|
||||
#: src/components/form/FileDropZone.tsx:139
|
||||
msgid "Remove file"
|
||||
msgstr "Remove file"
|
||||
@@ -1472,7 +1581,7 @@ msgstr "Reply"
|
||||
msgid "Replying to"
|
||||
msgstr "Replying to"
|
||||
|
||||
#: src/pages/UserLogin.tsx:148
|
||||
#: src/pages/UserLogin.tsx:154
|
||||
msgid "Request failed"
|
||||
msgstr "Request failed"
|
||||
|
||||
@@ -1579,12 +1688,12 @@ msgstr "Seek"
|
||||
msgid "Send"
|
||||
msgstr "Send"
|
||||
|
||||
#: src/pages/UserLogin.tsx:157
|
||||
#: src/pages/UserLogin.tsx:163
|
||||
msgid "Send reset link"
|
||||
msgstr "Send reset link"
|
||||
|
||||
#: src/components/chat/PendingItem.tsx:104
|
||||
#: src/pages/UserLogin.tsx:156
|
||||
#: src/pages/UserLogin.tsx:162
|
||||
msgid "Sending…"
|
||||
msgstr "Sending…"
|
||||
|
||||
@@ -1603,8 +1712,8 @@ msgid "email.settings"
|
||||
msgstr "Settings"
|
||||
|
||||
#: src/components/layout/UserMenu.tsx:104
|
||||
#: src/pages/Settings.tsx:72
|
||||
#: src/pages/Settings.tsx:84
|
||||
#: src/pages/Settings.tsx:75
|
||||
#: src/pages/Settings.tsx:88
|
||||
msgid "Settings"
|
||||
msgstr "Settings"
|
||||
|
||||
@@ -1612,6 +1721,19 @@ msgstr "Settings"
|
||||
msgid "Several people are typing…"
|
||||
msgstr "Several people are typing…"
|
||||
|
||||
#: src/pages/Authorize.tsx:37
|
||||
msgid "Sign in elsewhere"
|
||||
msgstr "Sign in elsewhere"
|
||||
|
||||
#: src/pages/Authorize.tsx:135
|
||||
msgid "Sign in to {name}?"
|
||||
msgstr "Sign in to {name}?"
|
||||
|
||||
#: src/pages/Authorize.tsx:154
|
||||
#: src/pages/FederationCallback.tsx:73
|
||||
msgid "Signing you in…"
|
||||
msgstr "Signing you in…"
|
||||
|
||||
#: src/components/profile/ProfileOwnActions.tsx:102
|
||||
msgid "Single use, valid for 7 days."
|
||||
msgstr "Single use, valid for 7 days."
|
||||
@@ -1636,7 +1758,7 @@ msgstr "Someone asked to reset the password of your {site} account. The button b
|
||||
msgid "Something went wrong"
|
||||
msgstr "Something went wrong"
|
||||
|
||||
#: src/pages/Settings.tsx:132
|
||||
#: src/pages/Settings.tsx:165
|
||||
msgid "Sounds"
|
||||
msgstr "Sounds"
|
||||
|
||||
@@ -1644,7 +1766,7 @@ msgstr "Sounds"
|
||||
msgid "Start fresh"
|
||||
msgstr "Start fresh"
|
||||
|
||||
#: src/pages/Settings.tsx:103
|
||||
#: src/pages/Settings.tsx:136
|
||||
msgid "Style"
|
||||
msgstr "Style"
|
||||
|
||||
@@ -1696,11 +1818,11 @@ msgstr "The new order couldn't be saved. Try again."
|
||||
msgid "This comment couldn't be deleted. Try again."
|
||||
msgstr "This comment couldn't be deleted. Try again."
|
||||
|
||||
#: src/pages/UserRegister.tsx:118
|
||||
#: src/pages/UserRegister.tsx:120
|
||||
msgid "This invite link is missing, expired, or already used."
|
||||
msgstr "This invite link is missing, expired, or already used."
|
||||
|
||||
#: src/pages/UserLogin.tsx:104
|
||||
#: src/pages/UserLogin.tsx:110
|
||||
msgid "This is a mirage."
|
||||
msgstr "This is a mirage."
|
||||
|
||||
@@ -1716,7 +1838,11 @@ msgstr "This page does not exist."
|
||||
msgid "This reset link is missing or malformed."
|
||||
msgstr "This reset link is missing or malformed."
|
||||
|
||||
#: src/pages/Settings.tsx:168
|
||||
#: src/pages/FederationCallback.tsx:38
|
||||
msgid "This sign-in link is incomplete."
|
||||
msgstr "This sign-in link is incomplete."
|
||||
|
||||
#: src/pages/Settings.tsx:201
|
||||
msgid "This site doesn't send email, so no digest goes out."
|
||||
msgstr "This site doesn't send email, so no digest goes out."
|
||||
|
||||
@@ -1763,6 +1889,14 @@ msgstr "Top this week"
|
||||
msgid "Track {0}"
|
||||
msgstr "Track {0}"
|
||||
|
||||
#: src/components/federation/PeerManager.tsx:155
|
||||
msgid "Trust"
|
||||
msgstr "Trust"
|
||||
|
||||
#: src/components/federation/PeerManager.tsx:32
|
||||
msgid "Trusted"
|
||||
msgstr "Trusted"
|
||||
|
||||
#: src/components/chat/ChatModal.tsx:668
|
||||
msgid "Try again"
|
||||
msgstr "Try again"
|
||||
@@ -1826,7 +1960,7 @@ msgstr "Unsubscribed"
|
||||
msgid "email.digest.upload"
|
||||
msgstr "upload"
|
||||
|
||||
#: src/components/profile/ProfileHeader.tsx:72
|
||||
#: src/components/profile/ProfileHeader.tsx:79
|
||||
msgid "Upload failed"
|
||||
msgstr "Upload failed"
|
||||
|
||||
@@ -1883,9 +2017,9 @@ msgstr "User menu"
|
||||
|
||||
#: src/components/profile/ProfileManageTab.tsx:61
|
||||
#: src/components/profile/UsernameField.tsx:51
|
||||
#: src/pages/Settings.tsx:87
|
||||
#: src/pages/UserLogin.tsx:75
|
||||
#: src/pages/UserRegister.tsx:137
|
||||
#: src/pages/Settings.tsx:91
|
||||
#: src/pages/UserLogin.tsx:79
|
||||
#: src/pages/UserRegister.tsx:139
|
||||
msgid "Username"
|
||||
msgstr "Username"
|
||||
|
||||
@@ -1894,6 +2028,10 @@ msgstr "Username"
|
||||
msgid "Users"
|
||||
msgstr "Users"
|
||||
|
||||
#: src/components/federation/PeerManager.tsx:169
|
||||
msgid "Users of a trusted instance sign in here with their account there. Those of a blocked one can't. Users of any other instance need an invite."
|
||||
msgstr "Users of a trusted instance sign in here with their account there. Those of a blocked one can't. Users of any other instance need an invite."
|
||||
|
||||
#: src/components/profile/ProfileSection.tsx:43
|
||||
msgid "View all →"
|
||||
msgstr "View all →"
|
||||
@@ -1952,6 +2090,10 @@ msgstr "Yesterday"
|
||||
msgid "You can post it anyway."
|
||||
msgstr "You can post it anyway."
|
||||
|
||||
#: src/components/federation/GrantList.tsx:93
|
||||
msgid "You haven't signed in to another gerbeur with this account yet."
|
||||
msgstr "You haven't signed in to another gerbeur with this account yet."
|
||||
|
||||
#: src/pages/Unsubscribe.tsx:94
|
||||
msgid "You won't get the monthly recap any more. You can turn it back on in your settings."
|
||||
msgstr "You won't get the monthly recap any more. You can turn it back on in your settings."
|
||||
@@ -1997,7 +2139,15 @@ msgstr "You've reached the end."
|
||||
msgid "email.welcome.preheader"
|
||||
msgstr "Your account is ready."
|
||||
|
||||
#: src/pages/UserLogin.tsx:152
|
||||
#: src/pages/Authorize.tsx:104
|
||||
msgid "Your account lives on {home}: sign in to other instances from there."
|
||||
msgstr "Your account lives on {home}: sign in to other instances from there."
|
||||
|
||||
#: src/pages/Settings.tsx:119
|
||||
msgid "Your account lives on {home}: your password, email address, avatar and username change there."
|
||||
msgstr "Your account lives on {home}: your password, email address, avatar and username change there."
|
||||
|
||||
#: src/pages/UserLogin.tsx:158
|
||||
msgid "Your email address"
|
||||
msgstr "Your email address"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user