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:
khannurien
2026-10-09 14:23:00 +00:00
parent 2d26d0aada
commit c0d03e9aaa
67 changed files with 5261 additions and 339 deletions

View File

@@ -51,7 +51,7 @@ msgstr "{0} de plus en ligne : {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} caractères : lettres, chiffres ou tirets bas"
@@ -280,6 +280,10 @@ msgstr "<0>{0}</0> a voté pour <1>{1}</1>"
msgid "<0>{0}</0> was added to <1>{1}</1>"
msgstr "<0>{0}</0> a été ajouté à <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}) demande à vous connecter avec votre compte d'ici, <1>@{username}</1>. Il recevra votre nom d'utilisateur, votre adresse e-mail et votre avatar."
#: src/components/chat/ChatModal.tsx:778
msgid "1 new message"
msgstr "1 nouveau message"
@@ -296,10 +300,14 @@ msgstr "Il faut un lien"
msgid "a post"
msgstr "une publication"
#: src/pages/Settings.tsx:85
#: src/pages/Settings.tsx:89
msgid "Account"
msgstr "Compte"
#: src/components/profile/ProfileHeader.tsx:144
msgid "Account on <0>{host}</0>"
msgstr "Compte sur <0>{host}</0>"
#: src/components/comment/CommentThread.tsx:102
msgid "Add a comment…"
msgstr "Ajouter un commentaire…"
@@ -309,7 +317,7 @@ msgstr "Ajouter un commentaire…"
msgid "Add category"
msgstr "Ajouter une catégorie"
#: src/components/profile/ProfileHeader.tsx:153
#: src/components/profile/ProfileHeader.tsx:173
msgid "Add email…"
msgstr "Ajouter un e-mail…"
@@ -342,10 +350,14 @@ msgstr "Tout"
msgid "Already dumped by {0} {1}"
msgstr "Déjà recommandé par {0} {1}"
#: src/pages/UserRegister.tsx:175
#: src/pages/UserRegister.tsx:179
msgid "Already have an account? <0>Log in</0>"
msgstr "Vous avez déjà un compte ? <0>Se connecter</0>"
#: src/components/federation/PeerManager.tsx:149
msgid "An instance's address, like music.example"
msgstr "L'adresse d'une instance, comme music.example"
#: src/utils/shared/api.ts:35
msgid "An unexpected error occurred."
msgstr "Une erreur inattendue s'est produite."
@@ -355,14 +367,14 @@ msgstr "Une erreur inattendue s'est produite."
msgid "email.digest.andMore"
msgstr "et {n} de plus"
#: src/pages/Settings.tsx:101
#: src/pages/Settings.tsx:134
msgid "Appearance"
msgstr "Apparence"
#. 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 "Au moins {0} caractères"
@@ -370,7 +382,7 @@ msgstr "Au moins {0} caractères"
msgid "At most {maxLength} characters."
msgstr "{maxLength} caractères au maximum."
#: 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 "Retour à la connexion"
#: src/pages/FederationCallback.tsx:66
msgid "Back to the login page"
msgstr "Retour à la page de connexion"
#: src/components/federation/PeerManager.tsx:163
msgid "Block"
msgstr "Bloquer"
#: src/components/federation/PeerManager.tsx:33
msgid "Blocked"
msgstr "Bloquée"
#. js-lingui-explicit-id
#: api/mail/digest.ts:225
msgid "email.digest.by"
@@ -394,6 +418,11 @@ msgstr "par @{username} · {n, plural, one {# reco} other {# recos}}"
msgid "Can't connect to the live updates server. Upvotes and notifications may not sync until it reconnects."
msgstr "Impossible de se connecter au serveur de mises à jour en direct. Les votes et les notifications pourraient ne pas se synchroniser avant la reconnexion."
#: src/pages/Authorize.tsx:117
#: src/pages/Authorize.tsx:145
msgid "Can't sign in there"
msgstr "Connexion impossible"
#: src/components/category/CategoryManager.tsx:225
#: src/components/category/CategoryManager.tsx:226
#: src/components/chat/ChatEditBox.tsx:92
@@ -404,6 +433,7 @@ msgstr "Impossible de se connecter au serveur de mises à jour en direct. Les vo
#: 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 "Annuler la recherche"
#: src/components/category/CategorySelect.tsx:33
#: src/pages/Manage.tsx:30
#: src/pages/Manage.tsx:36
msgid "Categories"
msgstr "Catégories"
@@ -431,7 +461,7 @@ msgstr "Catégories"
msgid "Category"
msgstr "Catégorie"
#: src/components/profile/ProfileHeader.tsx:95
#: src/components/profile/ProfileHeader.tsx:102
msgid "Change avatar"
msgstr "Changer l'avatar"
@@ -439,12 +469,16 @@ msgstr "Changer l'avatar"
msgid "Change image"
msgstr "Changer l'image"
#: src/pages/Settings.tsx:101
msgid "Change it on {home}"
msgstr "Le changer sur {home}"
#: src/components/profile/ChangePasswordModal.tsx:66
#: src/components/profile/ChangePasswordModal.tsx:120
msgid "Change password"
msgstr "Changer le mot de passe"
#: src/pages/Settings.tsx:96
#: src/pages/Settings.tsx:112
msgid "Change password…"
msgstr "Changer le mot de passe…"
@@ -464,10 +498,14 @@ msgstr "Tribune"
msgid "Chat ({unreadChatCount} unread)"
msgstr "{unreadChatCount} messages non lus"
#: src/pages/UserRegister.tsx:106
#: src/pages/UserRegister.tsx:108
msgid "Checking invite…"
msgstr "Vérification de l'invitation…"
#: src/components/federation/PeerManager.tsx:154
msgid "Checking…"
msgstr "Vérification…"
#: src/components/profile/ChangePasswordModal.tsx:75
#: src/components/shared/Modal.tsx:76
msgid "Close"
@@ -493,7 +531,7 @@ msgstr "Fermer sans publier ? Le fichier joint sera perdu — ce que vous avez
msgid "Collapse player"
msgstr "Réduire le lecteur"
#: src/pages/Settings.tsx:110
#: src/pages/Settings.tsx:143
msgid "Color scheme"
msgstr "Thème de couleur"
@@ -507,10 +545,22 @@ msgstr "Communauté"
msgid "Confirm new password"
msgstr "Confirmer le nouveau mot de passe"
#: src/components/federation/FederatedSignIn.tsx:111
msgid "Connecting…"
msgstr "Connexion…"
#: src/contexts/ws/WSProvider.tsx:757
msgid "Connection lost — this message may not have been sent"
msgstr "Connexion perdue — ce message n'a peut-être pas été envoyé"
#: src/components/federation/FederatedSignIn.tsx:113
msgid "Continue"
msgstr "Continuer"
#: src/pages/Authorize.tsx:155
msgid "Continue as @{username}"
msgstr "Continuer en tant que @{username}"
#: src/components/profile/ProfileOwnActions.tsx:99
msgid "Copied!"
msgstr "Copié !"
@@ -540,6 +590,10 @@ msgstr "Renommage impossible"
msgid "Could not save"
msgstr "Sauvegarde impossible"
#: src/components/federation/PeerManager.tsx:146
msgid "Couldn't add that instance"
msgstr "Impossible d'ajouter cette 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 "Impossible de charger un aperçu pour ce lien — vérifiez-le, ou publiez-le tel quel et actualisez l'aperçu plus tard."
@@ -548,6 +602,10 @@ msgstr "Impossible de charger un aperçu pour ce lien — vérifiez-le, ou publi
msgid "Couldn't load the chat."
msgstr "Impossible de charger le chat."
#: src/components/federation/FederatedSignIn.tsx:102
msgid "Couldn't reach that instance"
msgstr "Impossible de joindre cette instance"
#: src/pages/Unsubscribe.tsx:116
msgid "Couldn't unsubscribe"
msgstr "Désabonnement impossible"
@@ -576,11 +634,11 @@ msgstr "Création…"
msgid "Current password"
msgstr "Mot de passe actuel"
#: src/pages/Settings.tsx:48
#: src/pages/Settings.tsx:50
msgid "Dark"
msgstr "Sombre"
#: src/pages/Settings.tsx:121
#: src/pages/Settings.tsx:154
msgid "Default tab"
msgstr "Onglet par défaut"
@@ -655,6 +713,10 @@ msgstr "Description (facultatif)"
msgid "Discard"
msgstr "Abandonner"
#: src/components/federation/GrantList.tsx:84
msgid "Disconnect"
msgstr "Déconnecter"
#: src/components/chat/ChatModal.tsx:743
msgid "Disconnected — reconnecting…"
msgstr "Déconnecté — reconnexion…"
@@ -730,7 +792,7 @@ msgstr "Modifier {0}"
msgid "Edit description"
msgstr "Modifier la description"
#: src/components/profile/ProfileHeader.tsx:151
#: src/components/profile/ProfileHeader.tsx:171
msgid "Edit email"
msgstr "Modifier l'e-mail"
@@ -772,11 +834,11 @@ msgstr "Modification"
msgid "Editing {0}"
msgstr "Édition de {0}"
#: src/pages/Settings.tsx:145
#: src/pages/Settings.tsx:178
msgid "Email"
msgstr "E-mail"
#: src/pages/UserRegister.tsx:152
#: src/pages/UserRegister.tsx:154
msgid "Email address"
msgstr "Adresse e-mail"
@@ -822,6 +884,8 @@ msgstr "Impossible de publier le commentaire"
msgid "Failed to post reply"
msgstr "Impossible de publier la réponse"
#: 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 "Échec de l’enregistrement de la catégorie"
msgid "Failed to save edit"
msgstr "Impossible d'enregistrer la modification"
#: src/components/profile/ProfileHeader.tsx:162
#: src/components/profile/ProfileHeader.tsx:182
msgid "Failed to update avatar"
msgstr "Impossible de mettre à jour l'avatar"
@@ -844,7 +908,7 @@ msgstr "Impossible de mettre à jour l'avatar"
msgid "Failed to update role"
msgstr "Erreur lors de la mise à jour du rôle"
#: src/pages/Settings.tsx:119
#: src/pages/Settings.tsx:152
msgid "Feeds"
msgstr "Flux"
@@ -879,7 +943,7 @@ msgstr "Suivez des utilisateurs pour voir leurs recos ici."
#: 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 "Suivi"
@@ -894,7 +958,7 @@ msgstr "Abonné"
msgid "email.digest.forYou"
msgstr "Pour vous"
#: src/pages/UserLogin.tsx:97
#: src/pages/UserLogin.tsx:101
msgid "Forgot password?"
msgstr "Mot de passe oublié ?"
@@ -929,11 +993,11 @@ msgid "email.reset.hi"
msgstr "Bonjour {username},"
#: src/components/feed/FeedTabBar.tsx:39
#: src/pages/Settings.tsx:52
#: src/pages/Settings.tsx:54
msgid "Hot"
msgstr "Tendances"
#: src/pages/UserLogin.tsx:136
#: src/pages/UserLogin.tsx:142
msgid "If that address is registered you'll receive a reset link shortly."
msgstr "Si cette adresse est enregistrée, vous recevrez un lien de réinitialisation sous peu."
@@ -965,7 +1029,11 @@ msgstr "Dans la tribune"
msgid "Insert emoji"
msgstr "Insérer un emoji"
#: src/pages/UserRegister.tsx:117
#: src/pages/Manage.tsx:43
msgid "Instances"
msgstr "Instances"
#: src/pages/UserRegister.tsx:119
msgid "Invalid invite"
msgstr "Invitation invalide"
@@ -979,7 +1047,7 @@ msgstr "Lien invalide"
msgid "Invite link"
msgstr "Lien d'invitation"
#: src/components/profile/ProfileHeader.tsx:116
#: src/components/profile/ProfileHeader.tsx:126
msgid "invited by"
msgstr "invité par"
@@ -998,8 +1066,12 @@ msgstr "sur votre invitation"
msgid "Invitees"
msgstr "Invités"
#: src/components/federation/FederatedSignIn.tsx:105
msgid "Its address, like music.example"
msgstr "Son adresse, comme 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 "Continuer l'édition"
#. placeholder {0}: relativeTime(grant.lastUsedAt)
#: src/components/federation/GrantList.tsx:77
msgid "last used {0}"
msgstr "utilisée {0}"
#: src/components/profile/UsernameField.tsx:59
msgid "Letters, numbers and underscores only"
msgstr "Lettres, chiffres et tirets bas seulement"
#: src/pages/Settings.tsx:47
#: src/pages/Settings.tsx:49
msgid "Light"
msgstr "Clair"
@@ -1068,17 +1145,20 @@ msgstr "Chargement du profil…"
#: 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 "Chargement…"
#: 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 "Se connecter"
@@ -1090,16 +1170,22 @@ msgstr "Se connecter pour aimer"
msgid "Log in to vote"
msgstr "Se connecter pour voter"
#: src/components/layout/UserMenu.tsx:126
#. placeholder {0}: peer.name ?? peer.host
#: src/components/federation/FederatedSignIn.tsx:97
msgid "Log in with {0}"
msgstr "Se connecter avec {0}"
#: src/components/layout/UserMenu.tsx:127
#: src/pages/UserPublicProfile.tsx:131
msgid "Log out"
msgstr "Se déconnecter"
#: src/pages/UserLogin.tsx:85
#: src/pages/UserLogin.tsx:89
msgid "Logging in…"
msgstr "Connexion…"
#: src/pages/UserLogin.tsx:72
#: src/pages/FederationCallback.tsx:63
#: src/pages/UserLogin.tsx:76
msgid "Login failed"
msgstr "Connexion échouée"
@@ -1107,9 +1193,9 @@ msgstr "Connexion échouée"
msgid "Lowercase letters, numbers and single hyphens only"
msgstr "Minuscules, chiffres et tirets simples seulement"
#: 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 "Administration"
@@ -1138,7 +1224,7 @@ msgstr "Nom"
#: 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 "Nouveau"
@@ -1231,6 +1317,10 @@ msgstr "Aucun utilisateur ne correspond à « {q} »."
msgid "Not following anyone yet."
msgstr "Aucun abonnement pour le moment."
#: src/pages/Authorize.tsx:103
msgid "Not from here"
msgstr "Compte d'ailleurs"
#: src/pages/Community.tsx:127
msgid "Nothing happened this month."
msgstr "Rien de neuf ce mois-ci."
@@ -1248,7 +1338,7 @@ msgstr "Rien ici pour l'instant."
#: 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} non lues)"
#: src/pages/Settings.tsx:60
#: src/pages/Settings.tsx:62
msgid "Off"
msgstr "Désactivés"
#: src/pages/Settings.tsx:59
#: src/pages/Settings.tsx:61
msgid "On"
msgstr "Activés"
@@ -1300,6 +1390,18 @@ msgstr "Ouvrir la tribune"
msgid "or <0>browse files</0>"
msgstr "ou <0>parcourir les fichiers</0>"
#: src/components/federation/FederatedSignIn.tsx:82
msgid "Or join with your account on another gerbeur"
msgstr "Ou rejoignez-nous avec votre compte d'un autre gerbeur"
#: src/components/federation/FederatedSignIn.tsx:83
msgid "Or log in with your account on another gerbeur"
msgstr "Ou connectez-vous avec votre compte d'un autre gerbeur"
#: src/pages/Settings.tsx:128
msgid "Other instances"
msgstr "Autres instances"
#: src/pages/UserPublicProfile.tsx:157
msgid "Overview"
msgstr "Aperçu"
@@ -1308,13 +1410,14 @@ msgstr "Aperçu"
msgid "Page not found"
msgstr "Page introuvable"
#: 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 "Mot de passe"
#. placeholder {0}: VALIDATION.PASSWORD_MIN
#: src/pages/UserRegister.tsx:158
#: src/pages/UserRegister.tsx:160
msgid "Password (min. {0} characters)"
msgstr "Mot de passe (min. {0} caractères)"
@@ -1416,17 +1519,17 @@ msgstr "Actualisation du flux…"
msgid "Refreshing…"
msgstr "Actualisation…"
#: 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 "S'inscrire"
#: src/pages/UserRegister.tsx:168
#: src/pages/UserRegister.tsx:170
msgid "Registering…"
msgstr "Inscription…"
#: src/pages/UserRegister.tsx:134
#: src/pages/UserRegister.tsx:136
msgid "Registration failed"
msgstr "Inscription échouée"
@@ -1434,6 +1537,12 @@ msgstr "Inscription échouée"
msgid "Related"
msgstr "Connexe"
#. placeholder {0}: peer.host
#: src/components/federation/PeerManager.tsx:133
#: src/components/federation/PeerManager.tsx:134
msgid "Remove {0}"
msgstr "Retirer {0}"
#: src/components/form/FileDropZone.tsx:139
msgid "Remove file"
msgstr "Supprimer le fichier"
@@ -1472,7 +1581,7 @@ msgstr "Répondre"
msgid "Replying to"
msgstr "En réponse à"
#: src/pages/UserLogin.tsx:148
#: src/pages/UserLogin.tsx:154
msgid "Request failed"
msgstr "Échec de la demande"
@@ -1579,12 +1688,12 @@ msgstr "Position"
msgid "Send"
msgstr "Envoyer"
#: src/pages/UserLogin.tsx:157
#: src/pages/UserLogin.tsx:163
msgid "Send reset link"
msgstr "Envoyer le lien de réinitialisation"
#: src/components/chat/PendingItem.tsx:104
#: src/pages/UserLogin.tsx:156
#: src/pages/UserLogin.tsx:162
msgid "Sending…"
msgstr "Envoi…"
@@ -1603,8 +1712,8 @@ msgid "email.settings"
msgstr "Paramètres"
#: 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 "Paramètres"
@@ -1612,6 +1721,19 @@ msgstr "Paramètres"
msgid "Several people are typing…"
msgstr "Plusieurs personnes écrivent…"
#: src/pages/Authorize.tsx:37
msgid "Sign in elsewhere"
msgstr "Se connecter ailleurs"
#: src/pages/Authorize.tsx:135
msgid "Sign in to {name}?"
msgstr "Se connecter à {name} ?"
#: src/pages/Authorize.tsx:154
#: src/pages/FederationCallback.tsx:73
msgid "Signing you in…"
msgstr "Connexion…"
#: src/components/profile/ProfileOwnActions.tsx:102
msgid "Single use, valid for 7 days."
msgstr "Usage unique, valable 7 jours."
@@ -1636,7 +1758,7 @@ msgstr "Quelqu'un a demandé à réinitialiser le mot de passe de votre compte {
msgid "Something went wrong"
msgstr "Une erreur est survenue"
#: src/pages/Settings.tsx:132
#: src/pages/Settings.tsx:165
msgid "Sounds"
msgstr "Sons"
@@ -1644,7 +1766,7 @@ msgstr "Sons"
msgid "Start fresh"
msgstr "Repartir de zéro"
#: src/pages/Settings.tsx:103
#: src/pages/Settings.tsx:136
msgid "Style"
msgstr "Style"
@@ -1696,11 +1818,11 @@ msgstr "Le nouvel ordre n'a pas pu être enregistré. Réessayez."
msgid "This comment couldn't be deleted. Try again."
msgstr "Ce commentaire n'a pas pu être supprimé. Réessayez."
#: src/pages/UserRegister.tsx:118
#: src/pages/UserRegister.tsx:120
msgid "This invite link is missing, expired, or already used."
msgstr "Ce lien d'invitation est manquant, expiré ou déjà utilisé."
#: src/pages/UserLogin.tsx:104
#: src/pages/UserLogin.tsx:110
msgid "This is a mirage."
msgstr "C'est un mirage."
@@ -1716,7 +1838,11 @@ msgstr "Rien à voir, circulez."
msgid "This reset link is missing or malformed."
msgstr "Ce lien de réinitialisation est absent ou malformé."
#: src/pages/Settings.tsx:168
#: src/pages/FederationCallback.tsx:38
msgid "This sign-in link is incomplete."
msgstr "Ce lien de connexion est incomplet."
#: src/pages/Settings.tsx:201
msgid "This site doesn't send email, so no digest goes out."
msgstr "Ce site n'envoie pas d'e-mails, aucun résumé ne part donc."
@@ -1763,6 +1889,14 @@ msgstr "Les plus votées de la semaine"
msgid "Track {0}"
msgstr "Piste {0}"
#: src/components/federation/PeerManager.tsx:155
msgid "Trust"
msgstr "Approuver"
#: src/components/federation/PeerManager.tsx:32
msgid "Trusted"
msgstr "Approuvée"
#: src/components/chat/ChatModal.tsx:668
msgid "Try again"
msgstr "Réessayer"
@@ -1826,7 +1960,7 @@ msgstr "Désabonné"
msgid "email.digest.upload"
msgstr "fichier"
#: src/components/profile/ProfileHeader.tsx:72
#: src/components/profile/ProfileHeader.tsx:79
msgid "Upload failed"
msgstr "Envoi échoué"
@@ -1883,9 +2017,9 @@ msgstr "Menu utilisateur"
#: 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 "Nom d'utilisateur"
@@ -1894,6 +2028,10 @@ msgstr "Nom d'utilisateur"
msgid "Users"
msgstr "Utilisateurs"
#: 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 "Les utilisateurs d'une instance approuvée se connectent ici avec leur compte de là-bas. Ceux d'une instance bloquée ne le peuvent pas. Ceux de toute autre instance ont besoin d'une invitation."
#: src/components/profile/ProfileSection.tsx:43
msgid "View all →"
msgstr "Tout voir →"
@@ -1952,6 +2090,10 @@ msgstr "Hier"
msgid "You can post it anyway."
msgstr "Vous pouvez la publier quand même."
#: src/components/federation/GrantList.tsx:93
msgid "You haven't signed in to another gerbeur with this account yet."
msgstr "Vous ne vous êtes encore connecté à aucun autre gerbeur avec ce compte."
#: 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 "Vous ne recevrez plus le récap mensuel. Vous pouvez le réactiver dans vos paramètres."
@@ -1997,7 +2139,15 @@ msgstr "Vous avez tout lu, tout vu, tout bu."
msgid "email.welcome.preheader"
msgstr "Votre compte est prêt."
#: src/pages/UserLogin.tsx:152
#: src/pages/Authorize.tsx:104
msgid "Your account lives on {home}: sign in to other instances from there."
msgstr "Votre compte est sur {home} : connectez-vous aux autres instances depuis là-bas."
#: src/pages/Settings.tsx:119
msgid "Your account lives on {home}: your password, email address, avatar and username change there."
msgstr "Votre compte est sur {home} : votre mot de passe, votre adresse e-mail, votre avatar et votre nom d'utilisateur se changent là-bas."
#: src/pages/UserLogin.tsx:158
msgid "Your email address"
msgstr "Votre adresse e-mail"