Files
gerbeur/locales/fr.po
khannurien 7960d74c55 v4: weekly digests and monthly recaps go out by email, every email is written once as Markdown in the app's one catalog, and a review of the last two commits removes what they stated twice — users get a weekly digest (what happened to them, what the people and playlists they follow posted, the week's top dumps, the community) and a monthly recap (the month's top dumps and the community), both on by default, in their own style and scheme. digest-service sends what is due every quarter of an hour from digest_schedule (migration 0020), which holds each user's rolling 7- or 30-day period; existing users' first periods are spread over the coming week or month, a digest more than a period late covers the last full one, an empty one isn't sent, and an address like admin@localhost is skipped. Each digest carries a one-click unsubscribe (List-Unsubscribe and List-Unsubscribe-Post, POST /api/users/unsubscribe) and a link to the new /unsubscribe page, which asks before turning that cadence off, since mail scanners open every link; the token (lib/jwt) names the user and the cadence and never expires. The welcome email now says the digests are on. The emails' words moved out of a hand-written api/mail/strings.ts into the Lingui catalogs the interface uses: lingui extracts api/mail/ too, the catalogs moved to a top-level locales/ that both halves read, compile emits ES modules the server imports (api/mail/i18n.ts), messages take ICU plurals, and the labels the settings tab, the unsubscribe page and the emails share are one message each (their French had already drifted apart). Each template writes its email once as Markdown, which is the plain-text part, and EmailKit.render draws its blocks in the style (a lone link is a button, a list item starting with an image a thumbnail row, a numbered list a ranking, --- the footer), so no string is declared for an HTML and a text version; user text is escaped for Markdown, which the welcome body didn't do for usernames, whose _ read as emphasis. paint() set colors before a border-top shorthand that reset them, so every divider was black. The review also gave one home to what was written twice: the locale list (shared/locale.ts, read by lingui.config, the client, the server and its catalog loader), the base style and default scheme (shared/theme.ts), an email's look (lookOf, which digest-service, welcome and reset share), whether email is on (EMAIL_ENABLED, read by email-service and index.html), a setting's column and its default in the digests' SQL (SETTINGS_COLUMNS, DEFAULT_SETTINGS), the unsubscribe token (made once, not parsed back from a URL), AuthProvider's compare-and-store, ThemeProvider's twin style and scheme code (useThemeChoice), the test JWT encoder, and duplicate digest messages. The email palettes stay a flattened copy of the themes' tokens, now under a test that caught Times' secondary and link colors drifting. The Dockerfile copies api/mail and locales so the build extracts the emails' messages and the server finds its catalogs, and deno.json maps @lingui/core for the runtime image. 236 backend tests (new: digest building, sending, catch-up, scheduling and unsubscribing; the Markdown renderer; French from the catalog; palettes against themes; the stagger migration; unsubscribe tokens) and 661 frontend tests (new: the unsubscribe page) pass, and tsc, eslint, doc:lint, deno check, deno lint and deno fmt are clean.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 22:14:46 +00:00

2010 lines
56 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
msgid ""
msgstr ""
"POT-Creation-Date: 2026-04-01 16:55+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: @lingui/cli\n"
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: \n"
"Last-Translator: \n"
"Language-Team: \n"
#: src/components/comment/CommentNode.tsx:139
msgid "[deleted]"
msgstr "[supprimé]"
#. placeholder {0}: dump.commentCount
#: src/components/dump/DumpCard.tsx:139
#: src/components/dump/JournalCard.tsx:133
msgid "{0, plural, one {# comment} other {# comments}}"
msgstr "{0, plural, one {# commentaire} other {# commentaires}}"
#. placeholder {0}: playlist.dumpCount
#: src/components/playlist/PlaylistCard.tsx:117
msgid "{0, plural, one {# dump} other {# dumps}}"
msgstr "{0, plural, one {# reco} other {# recos}}"
#. placeholder {0}: rest.length
#: src/components/dump/create/DuplicateNotice.tsx:52
msgid "{0, plural, one {and # earlier dump} other {and # earlier dumps}}"
msgstr "{0, plural, one {et # reco plus ancienne} other {et # recos plus anciennes}}"
#. placeholder {0}: typingNames[0]
#. placeholder {1}: typingNames[1]
#: src/components/chat/ChatModal.tsx:627
msgid "{0} and {1} are typing…"
msgstr "{0} et {1} sont en train d'écrire…"
#. placeholder {0}: typingNames[0]
#: src/components/chat/ChatModal.tsx:625
msgid "{0} is typing…"
msgstr "{0} est en train d'écrire…"
#. placeholder {0}: rest.length
#: src/components/feed/PresenceRow.tsx:81
msgid "{0} more online: {restNames}"
msgstr "{0} de plus en ligne : {restNames}"
#. placeholder {0}: VALIDATION.USERNAME_MIN
#. placeholder {1}: VALIDATION.USERNAME_MAX
#: src/pages/UserRegister.tsx:145
msgid "{0}–{1} characters: letters, numbers, or underscores"
msgstr "{0}–{1} caractères : lettres, chiffres ou tirets bas"
#. js-lingui-explicit-id
#: api/mail/digest.ts:514
msgid "email.digest.totals"
msgstr "{dumps, plural, one {# reco} other {# recos}}, {upvotes, plural, one {# vote} other {# votes}} et {comments, plural, one {# commentaire} other {# commentaires}}."
#: src/pages/Search.tsx:120
msgid "{label} ({count})"
msgstr "{label} ({count})"
#. js-lingui-explicit-id
#: api/mail/digest.ts:238
msgid "email.digest.comments"
msgstr "{n, plural, one {# commentaire} other {# commentaires}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:498
msgid "email.digest.chatWeek"
msgstr "{n, plural, one {# message cette semaine} other {# messages cette semaine}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:591
msgid "email.digest.pre.network"
msgstr "{n, plural, one {# nouvelle reco de ceux que vous suivez} other {# nouvelles recos de ceux que vous suivez}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:612
msgid "email.digest.pre.members"
msgstr "{n, plural, one {# nouveau membre} other {# nouveaux membres}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:619
msgid "email.digest.pre.playlists"
msgstr "{n, plural, one {# nouvelle collection} other {# nouvelles collections}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:232
msgid "email.digest.votes"
msgstr "{n, plural, one {# vote} other {# votes}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:442
msgid "email.digest.stat.chat"
msgstr "{n, plural, one {message dans la tribune} other {messages dans la tribune}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:149
msgid "email.digest.count.likes"
msgstr "{n, plural, one {j'aime sur vos commentaires} other {j'aime sur vos commentaires}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:137
msgid "email.digest.count.comments"
msgstr "{n, plural, one {commentaire} other {commentaires}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:432
msgid "email.digest.stat.dumps"
msgstr "{n, plural, one {reco} other {recos}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:143
msgid "email.digest.count.mentions"
msgstr "{n, plural, one {mention} other {mentions}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:131
msgid "email.digest.count.followers"
msgstr "{n, plural, one {nouvel abonné} other {nouveaux abonnés}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:155
msgid "email.digest.count.playlistFollows"
msgstr "{n, plural, one {abonnement à vos collections} other {abonnements à vos collections}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:364
msgid "email.digest.seeAll"
msgstr "{n, plural, one {Voir la notification} other {Voir les # notifications}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:604
msgid "email.digest.pre.topMonth"
msgstr "{n, plural, one {la reco la plus votée du mois} other {les # recos les plus votées du mois}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:627
msgid "email.digest.pre.topWeek"
msgstr "{n, plural, one {la reco la plus votée de la semaine} other {les # recos les plus votées de la semaine}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:125
msgid "email.digest.count.upvotes"
msgstr "{n, plural, one {vote} other {votes}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:389
msgid "email.digest.more"
msgstr "{n} de plus dans votre fil Suivi"
#: src/components/chat/ChatModal.tsx:756
msgid "{unseenCount} new messages"
msgstr "{unseenCount} nouveaux messages"
#: src/components/comment/CommentThread.tsx:82
msgid "{visibleCount, plural, one {# comment} other {# comments}}"
msgstr "{visibleCount, plural, one {# commentaire} other {# commentaires}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:199
msgid "email.digest.hl.comment"
msgstr "{who} a commenté votre reco {target}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:205
msgid "email.digest.hl.playlistFollow"
msgstr "{who} a suivi votre collection {target}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:217
msgid "email.digest.hl.commentLike"
msgstr "{who} a aimé votre commentaire sur {target}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:181
msgid "email.digest.hl.mentionDump"
msgstr "{who} vous a mentionné dans {target}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:193
msgid "email.digest.hl.mentionChat"
msgstr "{who} vous a mentionné dans {target}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:175
msgid "email.digest.hl.mentionComment"
msgstr "{who} vous a mentionné dans un commentaire sur {target}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:187
msgid "email.digest.hl.mentionPlaylist"
msgstr "{who} vous a mentionné dans la collection {target}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:211
msgid "email.digest.hl.userFollow"
msgstr "{who} vous suit désormais"
#. js-lingui-explicit-id
#: api/mail/welcome.ts:32
msgid "email.welcome.body"
msgstr "# Bienvenue sur {site} !\n"
"\n"
"Bonjour **{username}**,\n"
"\n"
"Votre compte a bien été créé. Bienvenue à bord !"
#: src/components/dump/create/DumpCreateModal.tsx:741
#: src/pages/PlaylistDetail.tsx:80
#: src/pages/UserPublicProfile.tsx:159
msgid "← Back"
msgstr "← Retour"
#: src/pages/Dump.tsx:314
#: src/pages/Dump.tsx:554
#: src/pages/DumpEdit.tsx:217
msgid "← Back to all dumps"
msgstr "← Retour à toutes les recos"
#: src/pages/UserDumps.tsx:74
#: src/pages/UserPlaylists.tsx:240
#: src/pages/UserUpvoted.tsx:60
msgid "← Back to profile"
msgstr "← Retour au profil"
#: src/components/profile/ProfileOwnActions.tsx:80
msgid "+ Invite someone"
msgstr "+ Inviter quelqu'un"
#: src/components/playlist/PlaylistMembershipPanel.tsx:107
msgid "+ New playlist"
msgstr "+ Nouvelle collection"
#: src/pages/Dump.tsx:391
msgid "+ Playlist"
msgstr "+ Collection"
#. placeholder {0}: d.commenterUsername
#. placeholder {1}: d.dumpTitle
#: src/pages/Notifications.tsx:199
msgid "<0>{0}</0> commented on <1>{1}</1>"
msgstr "<0>{0}</0> a commenté sur <1>{1}</1>"
#. placeholder {0}: d.followerUsername
#. placeholder {1}: d.playlistTitle
#: src/pages/Notifications.tsx:159
msgid "<0>{0}</0> followed your playlist <1>{1}</1>"
msgstr "<0>{0}</0> a suivi votre collection <1>{1}</1>"
#. placeholder {0}: d.likerUsername
#. placeholder {1}: d.dumpTitle
#: src/pages/Notifications.tsx:209
msgid "<0>{0}</0> liked your comment on <1>{1}</1>"
msgstr "<0>{0}</0> a aimé votre commentaire sur <1>{1}</1>"
#. placeholder {0}: d.mentionerUsername
#: src/pages/Notifications.tsx:225
msgid "<0>{0}</0> mentioned you in <1>{where}</1>"
msgstr "<0>{0}</0> vous a mentionné dans <1>{where}</1>"
#. placeholder {0}: d.dumperUsername
#. placeholder {1}: d.dumpTitle
#: src/pages/Notifications.tsx:169
msgid "<0>{0}</0> posted <1>{1}</1>"
msgstr "<0>{0}</0> a publié <1>{1}</1>"
#. placeholder {0}: d.followerUsername
#: src/pages/Notifications.tsx:150
msgid "<0>{0}</0> started following you"
msgstr "<0>{0}</0> a commencé à vous suivre"
#. placeholder {0}: d.voterUsername
#. placeholder {1}: d.dumpTitle
#: src/pages/Notifications.tsx:189
msgid "<0>{0}</0> upvoted <1>{1}</1>"
msgstr "<0>{0}</0> a voté pour <1>{1}</1>"
#. placeholder {0}: d.dumpTitle
#. placeholder {1}: d.playlistTitle
#: src/pages/Notifications.tsx:179
msgid "<0>{0}</0> was added to <1>{1}</1>"
msgstr "<0>{0}</0> a été ajouté à <1>{1}</1>"
#: src/components/chat/ChatModal.tsx:755
msgid "1 new message"
msgstr "1 nouveau message"
#: src/pages/Notifications.tsx:220
msgid "a comment"
msgstr "un commentaire"
#: src/pages/Notifications.tsx:223
msgid "a post"
msgstr "une publication"
#: src/components/profile/ProfileSettingsTab.tsx:69
msgid "Account"
msgstr "Compte"
#: src/components/comment/CommentThread.tsx:102
msgid "Add a comment…"
msgstr "Ajouter un commentaire…"
#: src/components/category/CategoryManager.tsx:104
#: src/components/category/CategoryManager.tsx:105
msgid "Add category"
msgstr "Ajouter une catégorie"
#: src/components/profile/ProfileHeader.tsx:152
msgid "Add email…"
msgstr "Ajouter un e-mail…"
#: src/components/shared/ImagePicker.tsx:63
msgid "Add image"
msgstr "Ajouter une image"
#: src/components/dump/create/DumpCreateModal.tsx:464
#: src/components/playlist/AddToPlaylistModal.tsx:29
msgid "Add to playlist"
msgstr "Ajouter à la collection"
#. js-lingui-explicit-id
#: api/mail/digest.ts:244
msgid "email.digest.addedTo"
msgstr "ajoutée à {playlist}"
#: src/components/profile/RoleSwitcher.tsx:24
msgid "Admin"
msgstr "Administrateur"
#: src/components/category/CategorySwitcher.tsx:84
#: src/components/category/CategorySwitcher.tsx:87
msgid "All"
msgstr "Tout"
#. placeholder {0}: first.username
#. placeholder {1}: relativeTime(first.createdAt)
#: src/components/dump/create/DuplicateNotice.tsx:39
msgid "Already dumped by {0} {1}"
msgstr "Déjà recommandé par {0} {1}"
#: src/pages/UserRegister.tsx:175
msgid "Already have an account? <0>Log in</0>"
msgstr "Vous avez déjà un compte ? <0>Se connecter</0>"
#: src/utils/shared/api.ts:35
msgid "An unexpected error occurred."
msgstr "Une erreur inattendue s'est produite."
#. js-lingui-explicit-id
#: api/mail/digest.ts:260
msgid "email.digest.andMore"
msgstr "et {n} de plus"
#: src/components/profile/ProfileSettingsTab.tsx:82
msgid "Appearance"
msgstr "Apparence"
#. placeholder {0}: VALIDATION.PASSWORD_MIN
#: src/components/profile/ChangePasswordModal.tsx:102
#: src/pages/ResetPassword.tsx:121
#: src/pages/UserRegister.tsx:164
msgid "At least {0} characters"
msgstr "Au moins {0} caractères"
#: src/components/form/RichTextField.tsx:66
msgid "At most {maxLength} characters."
msgstr "{maxLength} caractères au maximum."
#: src/components/profile/ProfileSettingsTab.tsx:34
msgid "Auto"
msgstr "Auto"
#: src/pages/ResetPassword.tsx:71
#: src/pages/ResetPassword.tsx:144
msgid "Back to login"
msgstr "Retour à la connexion"
#. js-lingui-explicit-id
#: api/mail/digest.ts:226
msgid "email.digest.by"
msgstr "par @{username}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:266
msgid "email.digest.playlistMeta"
msgstr "par @{username} · {n, plural, one {# reco} other {# recos}}"
#: src/contexts/ws/WSProvider.tsx:395
#: src/contexts/ws/WSProvider.tsx:761
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/components/category/CategoryManager.tsx:225
#: src/components/category/CategoryManager.tsx:226
#: src/components/chat/ChatEditBox.tsx:88
#: src/components/comment/CommentForm.tsx:127
#: src/components/dump/create/DumpCreateModal.tsx:751
#: src/components/form/FormActions.tsx:42
#: src/components/playlist/PlaylistEditForm.tsx:205
#: src/components/profile/DescriptionEditor.tsx:97
#: src/components/profile/EmailEditor.tsx:83
#: src/components/shared/ConfirmModal.tsx:63
#: src/pages/Dump.tsx:432
#: src/pages/DumpEdit.tsx:542
msgid "Cancel"
msgstr "Annuler"
#: src/components/playlist/PlaylistDumpList.tsx:118
msgid "Cancel removal"
msgstr "Annuler la suppression"
#: src/components/chat/ChatModal.tsx:816
#: src/components/chat/ChatModal.tsx:817
msgid "Cancel reply"
msgstr "Annuler la réponse"
#: src/components/layout/AppHeader.tsx:162
msgid "Cancel search"
msgstr "Annuler la recherche"
#: src/components/category/CategorySelect.tsx:33
#: src/components/profile/ProfileManageTab.tsx:49
msgid "Categories"
msgstr "Catégories"
#: src/components/category/CategorySwitcher.tsx:107
msgid "Category"
msgstr "Catégorie"
#: src/components/profile/ProfileHeader.tsx:93
msgid "Change avatar"
msgstr "Changer l'avatar"
#: src/components/shared/ImagePicker.tsx:63
msgid "Change image"
msgstr "Changer l'image"
#: src/components/profile/ChangePasswordModal.tsx:67
#: src/components/profile/ChangePasswordModal.tsx:121
msgid "Change password"
msgstr "Changer le mot de passe"
#: src/components/profile/ProfileSettingsTab.tsx:77
msgid "Change password…"
msgstr "Changer le mot de passe…"
#: src/components/editor/EmojiPickerPopup.tsx:108
msgid "Change skin tone"
msgstr "Changer la couleur de peau"
#: src/components/chat/ChatModal.tsx:716
#: src/components/layout/ChatButton.tsx:26
#: src/components/layout/ChatFab.tsx:53
#: src/components/layout/ChatFab.tsx:54
msgid "Chat"
msgstr "Tribune"
#: src/components/layout/ChatButton.tsx:25
#: src/components/layout/ChatFab.tsx:52
msgid "Chat ({unreadChatCount} unread)"
msgstr "{unreadChatCount} messages non lus"
#: src/pages/UserRegister.tsx:106
msgid "Checking invite…"
msgstr "Vérification de l'invitation…"
#: src/components/profile/ChangePasswordModal.tsx:76
#: src/components/shared/Modal.tsx:76
msgid "Close"
msgstr "Fermer"
#: src/components/dump/create/DumpCreateModal.tsx:495
msgid "Close anyway"
msgstr "Fermer quand même"
#: src/components/editor/EmojiPickerPopup.tsx:113
msgid "Close emoji picker"
msgstr "Fermer le sélecteur d'emoji"
#: src/components/player/GlobalPlayer.tsx:262
msgid "Close player"
msgstr "Fermer le lecteur"
#: src/components/dump/create/DumpCreateModal.tsx:485
msgid "Close without posting? The attached file won't be kept — everything you typed will."
msgstr "Fermer sans publier ? Le fichier joint sera perdu — ce que vous avez écrit sera conservé."
#: src/components/player/GlobalPlayer.tsx:254
msgid "Collapse player"
msgstr "Réduire le lecteur"
#: src/components/profile/ProfileSettingsTab.tsx:91
msgid "Color scheme"
msgstr "Thème de couleur"
#. js-lingui-explicit-id
#: api/mail/digest.ts:424
msgid "email.digest.community"
msgstr "La communauté"
#: src/components/profile/ChangePasswordModal.tsx:109
#: src/pages/ResetPassword.tsx:128
msgid "Confirm new password"
msgstr "Confirmer le nouveau mot de passe"
#: src/contexts/ws/WSProvider.tsx:754
msgid "Connection lost — this message may not have been sent"
msgstr "Connexion perdue — ce message n'a peut-être pas été envoyé"
#: src/components/profile/ProfileOwnActions.tsx:105
msgid "Copied!"
msgstr "Copié !"
#: src/components/profile/ProfileOwnActions.tsx:105
msgid "Copy"
msgstr "Copier"
#: src/components/profile/ChangePasswordModal.tsx:118
msgid "Could not change password"
msgstr "Impossible de changer le mot de passe"
#: src/utils/shared/api.ts:33
msgid "Could not connect to the server. Check your connection and try again."
msgstr "Impossible de joindre le serveur. Vérifiez votre connexion et réessayez."
#: src/pages/DumpEdit.tsx:530
#: src/pages/UserPlaylists.tsx:264
msgid "Could not delete"
msgstr "Suppression impossible"
#: src/pages/DumpEdit.tsx:490
msgid "Could not save"
msgstr "Sauvegarde impossible"
#: src/components/dump/create/DumpCreateModal.tsx:606
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."
#: src/components/chat/ChatModal.tsx:642
msgid "Couldn't load the chat."
msgstr "Impossible de charger le chat."
#: src/pages/Unsubscribe.tsx:111
msgid "Couldn't unsubscribe"
msgstr "Désabonnement impossible"
#: src/components/social/FollowButton.tsx:112
msgid "Couldn't update. Try again."
msgstr "La mise à jour a échoué. Réessayez."
#: src/components/playlist/PlaylistCreateForm.tsx:112
msgid "Create"
msgstr "Créer"
#: src/components/playlist/PlaylistCreateForm.tsx:112
msgid "Create & Add"
msgstr "Créer et ajouter"
#. placeholder {0}: created.items.length
#. placeholder {1}: created.hasMore ? "+" : ""
#: src/pages/UserPlaylists.tsx:269
msgid "Created ({0}{1})"
msgstr "Créées ({0}{1})"
#: src/components/playlist/PlaylistCreateForm.tsx:111
msgid "Creating…"
msgstr "Création…"
#: src/components/profile/ChangePasswordModal.tsx:87
msgid "Current password"
msgstr "Mot de passe actuel"
#: src/components/profile/ProfileSettingsTab.tsx:36
msgid "Dark"
msgstr "Sombre"
#: src/components/profile/ProfileSettingsTab.tsx:102
msgid "Default tab"
msgstr "Onglet par défaut"
#: src/components/category/CategoryManager.tsx:236
#: src/components/category/CategoryManager.tsx:237
#: src/components/chat/ChatMessageItem.tsx:114
#: src/components/chat/ChatMessageItem.tsx:115
#: src/components/chat/ChatMessageItem.tsx:213
#: src/components/comment/CommentNode.tsx:263
#: src/components/comment/CommentNode.tsx:269
#: src/components/playlist/PlaylistEditForm.tsx:201
#: src/components/shared/ConfirmModal.tsx:34
msgid "Delete"
msgstr "Supprimer"
#: src/components/category/CategoryManager.tsx:253
msgid "Delete category"
msgstr "Supprimer la catégorie"
#. placeholder {0}: category.name
#: src/components/category/CategoryManager.tsx:252
msgid "Delete category \"{0}\"? This cannot be undone."
msgstr "Supprimer la catégorie \"{0}\" ? Cette action est irréversible."
#: src/pages/DumpEdit.tsx:299
#: src/pages/DumpEdit.tsx:538
msgid "Delete dump"
msgstr "Supprimer la reco"
#. placeholder {0}: res.status
#: src/pages/DumpEdit.tsx:178
msgid "Delete failed ({0})"
msgstr "Échec de la suppression ({0})"
#: src/components/playlist/PlaylistCard.tsx:141
#: src/pages/PlaylistDetail.tsx:136
#: src/pages/UserPlaylists.tsx:327
msgid "Delete playlist"
msgstr "Supprimer la collection"
#: src/components/comment/CommentNode.tsx:268
msgid "Delete this comment?"
msgstr "Supprimer ce commentaire ?"
#: src/pages/DumpEdit.tsx:298
msgid "Delete this dump? This cannot be undone."
msgstr "Supprimer cette reco ? Cette action est irréversible."
#: src/components/chat/ChatMessageItem.tsx:212
msgid "Delete this message?"
msgstr "Supprimer ce message ?"
#: src/pages/PlaylistDetail.tsx:135
#: src/pages/UserPlaylists.tsx:326
msgid "Delete this playlist? This cannot be undone."
msgstr "Supprimer cette collection ? Cette action est irréversible."
#: src/components/chat/ReplyRef.tsx:49
msgid "deleted message"
msgstr "message supprimé"
#: src/components/playlist/PlaylistCreateForm.tsx:104
#: src/components/playlist/PlaylistEditForm.tsx:173
msgid "Description (optional)"
msgstr "Description (facultatif)"
#: src/components/chat/PendingItem.tsx:100
msgid "Discard"
msgstr "Abandonner"
#: src/components/chat/ChatModal.tsx:720
msgid "Disconnected — reconnecting…"
msgstr "Déconnecté — reconnexion…"
#: src/components/chat/ChatModal.tsx:792
#: src/components/chat/ChatModal.tsx:793
msgid "Dismiss"
msgstr "Fermer"
#: src/components/dump/create/DumpCreateModal.tsx:545
msgid "Done"
msgstr "Terminé"
#. placeholder {0}: dump.fileName
#: src/components/dump/FilePreview.tsx:358
msgid "Download {0}"
msgstr "Télécharger {0}"
#: src/components/form/FileDropZone.tsx:55
msgid "Drop a file here"
msgstr "Déposez un fichier ici"
#: src/components/dump/create/DumpCreateModal.tsx:652
msgid "Drop a file here, or paste one"
msgstr "Déposez un fichier ici, ou collez-en un"
#: src/pages/DumpEdit.tsx:481
msgid "Drop a replacement here"
msgstr "Déposez un fichier de remplacement ici"
#: src/components/layout/AppHeader.tsx:201
msgid "Dump"
msgstr "Reco"
#: src/components/dump/create/DumpCreateModal.tsx:764
msgid "Dump it"
msgstr "Recommander"
#: src/components/dump/create/DumpCreateModal.tsx:523
msgid "Dumped!"
msgstr "Recommandé !"
#: src/pages/Search.tsx:116
#: src/pages/UserDumps.tsx:88
#: src/pages/UserPublicProfile.tsx:189
msgid "Dumps"
msgstr "Recos"
#. placeholder {0}: dumps.items.length
#. placeholder {1}: dumps.hasMore ? "+" : ""
#: src/components/profile/ProfileDumpsTab.tsx:37
msgid "Dumps ({0}{1})"
msgstr "Recos ({0}{1})"
#: src/pages/Notifications.tsx:375
msgid "Earlier"
msgstr "Plus tôt"
#: src/components/chat/ChatMessageItem.tsx:103
#: src/components/chat/ChatMessageItem.tsx:104
#: src/components/chat/PendingItem.tsx:93
#: src/components/comment/CommentNode.tsx:254
#: src/components/playlist/PlaylistHeader.tsx:58
#: src/pages/Dump.tsx:550
msgid "Edit"
msgstr "Modifier"
#. placeholder {0}: category.name
#: src/components/category/CategoryManager.tsx:84
msgid "Edit {0}"
msgstr "Modifier {0}"
#: src/components/profile/ProfileDescription.tsx:58
msgid "Edit description"
msgstr "Modifier la description"
#: src/components/profile/ProfileHeader.tsx:150
msgid "Edit email"
msgstr "Modifier l'e-mail"
#: src/components/dump/create/TitleField.tsx:69
#: src/pages/Dump.tsx:448
msgid "Edit title"
msgstr "Modifier le titre"
#: src/components/chat/ChatMessageItem.tsx:127
msgid "edited"
msgstr "modifié"
#. placeholder {0}: relativeTime(comment.updatedAt)
#. placeholder {0}: relativeTime(dump.updatedAt)
#. placeholder {0}: relativeTime(message.updatedAt)
#: src/components/chat/ChatMessageItem.tsx:128
#: src/components/comment/CommentNode.tsx:203
#: src/components/playlist/PlaylistHeader.tsx:93
#: src/pages/Dump.tsx:491
msgid "edited {0}"
msgstr "modifié {0}"
#. placeholder {0}: comment.updatedAt.toLocaleString()
#. placeholder {0}: dump.updatedAt.toLocaleString()
#. placeholder {0}: message.updatedAt.toLocaleString()
#: src/components/chat/ChatMessageItem.tsx:124
#: src/components/comment/CommentNode.tsx:201
#: src/components/playlist/PlaylistHeader.tsx:91
#: src/pages/Dump.tsx:489
msgid "Edited {0}"
msgstr "Modifié le {0}"
#: src/pages/DumpEdit.tsx:242
msgid "Editing"
msgstr "Modification"
#. placeholder {0}: state.dump.title
#: src/pages/DumpEdit.tsx:72
msgid "Editing {0}"
msgstr "Édition de {0}"
#: src/components/profile/ProfileSettingsTab.tsx:126
msgid "Email"
msgstr "E-mail"
#: src/pages/UserRegister.tsx:152
msgid "Email address"
msgstr "Adresse e-mail"
#: src/pages/Search.tsx:149
msgid "Enter a query to search."
msgstr "Saisissez une recherche."
#: src/components/player/GlobalPlayer.tsx:254
msgid "Expand player"
msgstr "Agrandir le lecteur"
#: src/components/category/CategoryManager.tsx:246
msgid "Failed to create category"
msgstr "Échec de la création de la catégorie"
#: src/components/playlist/PlaylistCreateForm.tsx:109
msgid "Failed to create playlist"
msgstr "Impossible de créer la collection"
#: src/components/category/CategoryManager.tsx:169
msgid "Failed to delete"
msgstr "Suppression échouée"
#: src/components/profile/ProfileOwnActions.tsx:49
#: src/components/profile/ProfileOwnActions.tsx:52
#: src/components/profile/ProfileOwnActions.tsx:114
msgid "Failed to generate invite"
msgstr "Impossible de générer une invitation"
#: src/components/shared/ListState.tsx:43
#: src/pages/Notifications.tsx:349
msgid "Failed to load"
msgstr "Chargement échoué"
#: src/components/dump/create/DumpCreateModal.tsx:554
msgid "Failed to post"
msgstr "Publication échouée"
#: src/components/comment/CommentThread.tsx:101
msgid "Failed to post comment"
msgstr "Impossible de publier le commentaire"
#: src/components/comment/CommentNode.tsx:289
msgid "Failed to post reply"
msgstr "Impossible de publier la réponse"
#: src/components/playlist/PlaylistEditForm.tsx:193
#: src/components/profile/DescriptionEditor.tsx:99
#: src/components/profile/EmailEditor.tsx:86
msgid "Failed to save"
msgstr "Enregistrement échoué"
#: src/components/category/CategoryManager.tsx:247
msgid "Failed to save category"
msgstr "Échec de l’enregistrement de la catégorie"
#: src/components/comment/CommentNode.tsx:216
msgid "Failed to save edit"
msgstr "Impossible d'enregistrer la modification"
#: src/components/profile/ProfileHeader.tsx:161
msgid "Failed to update avatar"
msgstr "Impossible de mettre à jour l'avatar"
#: src/components/profile/RoleSwitcher.tsx:92
msgid "Failed to update role"
msgstr "Erreur lors de la mise à jour du rôle"
#: src/components/profile/ProfileSettingsTab.tsx:100
msgid "Feeds"
msgstr "Flux"
#: src/components/dump/create/DumpCreateModal.tsx:593
msgid "Fetching preview…"
msgstr "Récupération de l'aperçu…"
#: src/components/dump/create/DumpCreateModal.tsx:416
msgid "File too large (max {max})."
msgstr "Fichier trop volumineux (max {max})."
#: src/components/social/FollowButton.tsx:62
#: src/components/social/FollowButton.tsx:102
msgid "Follow"
msgstr "Suivre"
#: src/components/social/FollowButton.tsx:60
msgid "Follow {targetUsername}"
msgstr "Suivre {targetUsername}"
#: src/components/social/FollowButton.tsx:100
msgid "Follow playlist"
msgstr "Suivre la collection"
#: src/components/feed/FollowedFeed.tsx:151
msgid "Follow some public playlists to see their dumps here."
msgstr "Suivez des collections publiques pour voir leurs recos ici."
#: src/components/feed/FollowedFeed.tsx:143
msgid "Follow some users to see their dumps here."
msgstr "Suivez des utilisateurs pour voir leurs recos ici."
#: src/components/feed/FeedTabBar.tsx:49
#: src/components/profile/ProfileSettingsTab.tsx:43
#: src/pages/UserPublicProfile.tsx:191
msgid "Followed"
msgstr "Suivi"
#. placeholder {0}: followed.items.length
#. placeholder {1}: followed.hasMore ? "+" : ""
#: src/pages/UserPlaylists.tsx:300
msgid "Followed ({0}{1})"
msgstr "Suivies ({0}{1})"
#: src/components/profile/ProfileFollowedTab.tsx:100
msgid "Followed playlists"
msgstr "Collections suivies"
#: src/components/profile/ProfileFollowedTab.tsx:68
#: src/components/social/FollowButton.tsx:62
#: src/components/social/FollowButton.tsx:102
msgid "Following"
msgstr "Abonné"
#. js-lingui-explicit-id
#: api/mail/digest.ts:342
msgid "email.digest.forYou"
msgstr "Pour vous"
#: src/pages/UserLogin.tsx:97
msgid "Forgot password?"
msgstr "Mot de passe oublié ?"
#: src/components/feed/FollowedFeed.tsx:132
msgid "From people"
msgstr "De personnes"
#. js-lingui-explicit-id
#: api/mail/digest.ts:379
msgid "email.digest.network"
msgstr "De ceux que vous suivez"
#: src/components/feed/FollowedFeed.tsx:133
msgid "From playlists"
msgstr "De collections"
#: src/components/player/MediaPlayer.tsx:373
msgid "Fullscreen"
msgstr "Plein écran"
#: src/pages/NotFound.tsx:24
msgid "Go home"
msgstr "Accueil"
#: src/pages/ResetPassword.tsx:93
msgid "Go to login"
msgstr "Aller à la connexion"
#. js-lingui-explicit-id
#: api/mail/password-reset.ts:32
msgid "email.reset.hi"
msgstr "Bonjour {username},"
#: src/components/feed/FeedTabBar.tsx:45
#: src/components/profile/ProfileSettingsTab.tsx:40
msgid "Hot"
msgstr "Tendances"
#: src/pages/UserLogin.tsx:136
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."
#. js-lingui-explicit-id
#: api/mail/password-reset.ts:48
msgid "email.reset.fallback"
msgstr "Si le bouton ne fonctionne pas, collez ce lien dans votre navigateur :"
#. js-lingui-explicit-id
#: api/mail/password-reset.ts:56
msgid "email.reset.ignore"
msgstr "Si vous n'êtes pas à l'origine de cette demande, ignorez cet e-mail. Votre mot de passe ne change pas."
#: src/utils/chat/message.ts:43
msgid "image"
msgstr "image"
#: src/pages/Dump.tsx:570
msgid "In collections"
msgstr "Dans les collections"
#. js-lingui-explicit-id
#: api/mail/digest.ts:495
msgid "email.digest.inChat"
msgstr "Dans la tribune"
#: src/components/editor/TextEditor.tsx:544
#: src/components/editor/TextEditor.tsx:546
msgid "Insert emoji"
msgstr "Insérer un emoji"
#: src/pages/UserRegister.tsx:117
msgid "Invalid invite"
msgstr "Invitation invalide"
#: src/pages/ResetPassword.tsx:61
#: src/pages/Unsubscribe.tsx:61
msgid "Invalid link"
msgstr "Lien invalide"
#: src/components/profile/ProfileOwnActions.tsx:88
#: src/components/profile/ProfileOwnActions.tsx:95
msgid "Invite link"
msgstr "Lien d'invitation"
#: src/components/profile/ProfileHeader.tsx:115
msgid "invited by"
msgstr "invité par"
#. js-lingui-explicit-id
#: api/mail/digest.ts:254
msgid "email.digest.invitedBy"
msgstr "sur invitation de @{username}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:253
msgid "email.digest.invitedByYou"
msgstr "sur votre invitation"
#: src/components/profile/ProfileInviteesTab.tsx:76
#: src/pages/UserPublicProfile.tsx:192
msgid "Invitees"
msgstr "Invités"
#: src/components/feed/FeedTabBar.tsx:47
#: src/components/profile/ProfileSettingsTab.tsx:42
msgid "Journal"
msgstr "Journal"
#: src/components/dump/create/DumpCreateModal.tsx:492
msgid "Keep editing"
msgstr "Continuer l'édition"
#: src/components/profile/ProfileSettingsTab.tsx:35
msgid "Light"
msgstr "Clair"
#: src/components/social/LikeButton.tsx:54
msgid "Like"
msgstr "Aimer"
#: src/components/dump/create/DumpCreateModal.tsx:568
msgid "Link"
msgstr "Lien"
#: src/components/dump/create/StepIndicator.tsx:19
msgid "Link or file"
msgstr "Lien ou fichier"
#: src/contexts/ws/WSProvider.tsx:760
msgid "Live updates are temporarily disconnected. Trying to reconnect…"
msgstr "Les mises à jour en direct sont temporairement interrompues. Tentative de reconnexion…"
#: src/components/layout/AppHeader.tsx:236
msgid "Live updates unavailable."
msgstr "Mises à jour en direct indisponibles."
#: src/components/shared/LoadMoreButton.tsx:32
msgid "Load more"
msgstr "Charger plus"
#: src/components/chat/ChatModal.tsx:741
msgid "Load older messages"
msgstr "Charger les messages plus anciens"
#: src/pages/Dump.tsx:290
#: src/pages/DumpEdit.tsx:193
msgid "Loading dump…"
msgstr "Chargement de la reco…"
#: src/components/chat/ChatModal.tsx:634
msgid "Loading messages…"
msgstr "Chargement des messages…"
#: src/components/feed/FeedFooter.tsx:34
msgid "Loading more…"
msgstr "Chargement…"
#: src/pages/PlaylistDetail.tsx:64
msgid "Loading playlist…"
msgstr "Chargement de la collection…"
#: src/pages/UserPublicProfile.tsx:142
msgid "Loading profile…"
msgstr "Chargement du profil…"
#: src/components/category/CategoryManager.tsx:60
#: src/components/chat/ChatModal.tsx:740
#: src/components/editor/EmojiPickerPopup.tsx:125
#: src/components/playlist/PlaylistMembershipPanel.tsx:45
#: src/components/shared/ListState.tsx:38
#: src/components/shared/LoadMoreButton.tsx:32
#: src/components/social/UserListPopover.tsx:150
#: src/pages/Notifications.tsx:345
#: src/pages/UserDumps.tsx:62
#: src/pages/UserPlaylists.tsx:228
#: src/pages/UserUpvoted.tsx:48
msgid "Loading…"
msgstr "Chargement…"
#: src/components/layout/AppHeader.tsx:209
#: src/pages/UserLogin.tsx:41
#: src/pages/UserLogin.tsx:67
#: src/pages/UserLogin.tsx:86
msgid "Log in"
msgstr "Se connecter"
#: src/components/social/LikeButton.tsx:55
msgid "Log in to like"
msgstr "Se connecter pour aimer"
#: src/components/social/VoteButton.tsx:53
msgid "Log in to vote"
msgstr "Se connecter pour voter"
#: src/components/profile/ProfileHeader.tsx:174
#: src/pages/UserPublicProfile.tsx:163
msgid "Log out"
msgstr "Se déconnecter"
#: src/pages/UserLogin.tsx:85
msgid "Logging in…"
msgstr "Connexion…"
#: src/pages/UserLogin.tsx:72
msgid "Login failed"
msgstr "Connexion échouée"
#: src/pages/UserPublicProfile.tsx:197
msgid "Manage"
msgstr "Administration"
#: src/components/form/FileDropZone.tsx:169
msgid "Max {limit}"
msgstr "Max {limit}"
#: src/components/profile/RoleSwitcher.tsx:23
msgid "Moderator"
msgstr "Modérateur"
#. js-lingui-explicit-id
#: api/mail/digest.ts:311
#: src/components/profile/ProfileSettingsTab.tsx:137
msgid "digest.monthly"
msgstr "Récap mensuel"
#: src/components/player/MediaPlayer.tsx:346
msgid "Mute"
msgstr "Couper le son"
#: src/components/category/CategoryManager.tsx:192
#: src/components/category/CategoryManager.tsx:193
msgid "Name"
msgstr "Nom"
#: src/pages/Notifications.tsx:338
msgid "new"
msgstr "nouveau"
#: src/components/chat/ChatModal.tsx:669
#: src/components/feed/FeedTabBar.tsx:46
#: src/components/profile/ProfileSettingsTab.tsx:41
msgid "New"
msgstr "Nouveau"
#: src/components/dump/create/DumpCreateModal.tsx:464
#: src/components/dump/NewDumpButton.tsx:27
#: src/components/layout/DumpFab.tsx:66
#: src/components/layout/DumpFab.tsx:67
msgid "New dump"
msgstr "Nouvelle reco"
#. js-lingui-explicit-id
#: api/mail/digest.ts:455
msgid "email.digest.newMembers"
msgstr "Nouveaux membres"
#: src/components/profile/ChangePasswordModal.tsx:95
#: src/pages/ResetPassword.tsx:113
msgid "New password"
msgstr "Nouveau mot de passe"
#: src/components/playlist/NewPlaylistButton.tsx:49
#: src/components/playlist/NewPlaylistButton.tsx:56
msgid "New playlist"
msgstr "Nouvelle collection"
#. js-lingui-explicit-id
#: api/mail/digest.ts:475
msgid "email.digest.newPlaylists"
msgstr "Nouvelles collections publiques"
#: src/components/dump/create/DumpCreateModal.tsx:763
msgid "Next →"
msgstr "Suivant →"
#: src/components/player/GlobalPlayer.tsx:244
msgid "Next track"
msgstr "Piste suivante"
#: src/components/playlist/PlaylistDumpList.tsx:46
msgid "No dumps in this playlist yet."
msgstr "Aucune reco dans cette collection pour l'instant."
#: src/pages/Search.tsx:165
msgid "No dumps match \"{q}\"."
msgstr "Aucune reco ne correspond à « {q} »."
#: src/components/feed/DumpFeed.tsx:76
#: src/components/feed/JournalFeed.tsx:36
msgid "No dumps yet. Be the first!"
msgstr "Pas encore de recos. Soyez le premier !"
#: src/components/editor/EmojiPickerPopup.tsx:128
msgid "No emoji found."
msgstr "Aucun emoji trouvé."
#: src/components/profile/ProfileFollowedTab.tsx:110
#: src/pages/UserPlaylists.tsx:309
msgid "No followed playlists yet."
msgstr "Pas encore de collections suivies."
#: src/components/profile/ProfileInviteesTab.tsx:82
msgid "No invitees yet."
msgstr "Aucun invité pour le moment."
#: src/components/chat/ChatModal.tsx:653
msgid "No messages yet. Say hello!"
msgstr "Aucun message pour l'instant. Dites bonjour !"
#: src/components/social/UserListPopover.tsx:158
msgid "No one yet."
msgstr "Personne pour le moment."
#: src/pages/Search.tsx:206
msgid "No playlists match \"{q}\"."
msgstr "Aucune collection ne correspond à « {q} »."
#: src/components/playlist/PlaylistMembershipPanel.tsx:51
#: src/components/profile/ProfilePlaylistsTab.tsx:52
#: src/pages/UserPlaylists.tsx:278
msgid "No playlists yet."
msgstr "Pas encore de collections."
#: src/contexts/ws/WSProvider.tsx:929
msgid "No reply from the server — this message may not have been sent"
msgstr "Pas de réponse du serveur — ce message n'a peut-être pas été envoyé"
#: src/pages/Search.tsx:180
msgid "No users match \"{q}\"."
msgstr "Aucun utilisateur ne correspond à « {q} »."
#: src/components/profile/ProfileFollowedTab.tsx:74
msgid "Not following anyone yet."
msgstr "Aucun abonnement pour le moment."
#: src/components/profile/ProfileDumpsTab.tsx:46
#: src/components/profile/ProfileDumpsTab.tsx:60
#: src/pages/Notifications.tsx:356
#: src/pages/UserDumps.tsx:94
#: src/pages/UserUpvoted.tsx:79
msgid "Nothing here yet."
msgstr "Rien ici pour l'instant."
#: src/components/layout/NotificationBell.tsx:54
#: src/components/profile/ProfileSettingsTab.tsx:111
#: src/pages/Notifications.tsx:282
#: src/pages/Notifications.tsx:334
msgid "Notifications"
msgstr "Notifications"
#: src/components/layout/NotificationBell.tsx:53
msgid "Notifications ({unreadNotificationCount} unread)"
msgstr "Notifications ({unreadNotificationCount} non lues)"
#: src/components/profile/ProfileSettingsTab.tsx:48
msgid "Off"
msgstr "Désactivés"
#: src/components/profile/ProfileSettingsTab.tsx:47
msgid "On"
msgstr "Activés"
#. js-lingui-explicit-id
#: api/mail/welcome.ts:49
msgid "email.welcome.digests"
msgstr "Chaque semaine, vous recevrez un résumé de ce qui s'est passé ici, et chaque mois un récap des recos les plus votées. Vous pouvez désactiver l'un ou l'autre dans vos paramètres."
#: src/components/editor/TextEditor.tsx:359
msgid "Only images can be dropped here."
msgstr "Seules les images peuvent être déposées ici."
#: src/pages/DumpEdit.tsx:103
msgid "Only its poster or a moderator can edit this dump."
msgstr "Seuls son auteur et les modérateurs peuvent modifier ce dump."
#. js-lingui-explicit-id
#: api/mail/welcome.ts:41
msgid "email.welcome.button"
msgstr "Ouvrir {site}"
#. placeholder {0}: richContent.siteName
#: src/components/dump/RichContentCard.tsx:122
msgid "Open on {0}"
msgstr "Ouvrir sur {0}"
#: src/components/dump/RichContentCard.tsx:123
msgid "Open source"
msgstr "Ouvrir la source"
#. js-lingui-explicit-id
#: api/mail/digest.ts:506
msgid "email.digest.openChat"
msgstr "Ouvrir la tribune"
#: src/components/form/FileDropZone.tsx:163
msgid "or <0>browse files</0>"
msgstr "ou <0>parcourir les fichiers</0>"
#: src/pages/NotFound.tsx:16
msgid "Page not found"
msgstr "Page introuvable"
#: src/components/profile/ProfileSettingsTab.tsx:71
#: src/pages/UserLogin.tsx:82
msgid "Password"
msgstr "Mot de passe"
#. placeholder {0}: VALIDATION.PASSWORD_MIN
#: src/pages/UserRegister.tsx:158
msgid "Password (min. {0} characters)"
msgstr "Mot de passe (min. {0} caractères)"
#: src/components/profile/ChangePasswordModal.tsx:72
msgid "Password changed successfully."
msgstr "Mot de passe modifié avec succès."
#: src/pages/ResetPassword.tsx:83
msgid "Password updated"
msgstr "Mot de passe mis à jour"
#: src/components/profile/ChangePasswordModal.tsx:115
#: src/pages/ResetPassword.tsx:133
msgid "Passwords do not match"
msgstr "Les mots de passe ne correspondent pas"
#: src/components/dump/create/DumpCreateModal.tsx:586
msgid "Paste a link…"
msgstr "Collez un lien…"
#: src/components/dump/FilePreview.tsx:134
#: src/components/dump/FilePreview.tsx:310
#: src/components/dump/RichContentCard.tsx:103
#: src/components/player/MediaPlayer.tsx:330
msgid "Pause"
msgstr "Pause"
#: src/components/dump/create/DumpCreateModal.tsx:504
msgid "Picked up where you left off."
msgstr "Reprise de votre brouillon."
#: src/components/dump/FilePreview.tsx:134
#: src/components/dump/FilePreview.tsx:253
#: src/components/dump/FilePreview.tsx:275
#: src/components/dump/FilePreview.tsx:310
#: src/components/dump/RichContentCard.tsx:103
#: src/components/dump/RichContentCard.tsx:150
#: src/components/player/MediaPlayer.tsx:330
msgid "Play"
msgstr "Lecture"
#: src/components/playlist/PlaylistEditForm.tsx:157
msgid "Playlist title"
msgstr "Titre de la collection"
#: src/components/dump/create/StepIndicator.tsx:21
#: src/components/layout/AppHeader.tsx:182
#: src/components/layout/UserMenu.tsx:78
#: src/pages/Search.tsx:119
#: src/pages/UserPlaylists.tsx:254
#: src/pages/UserPublicProfile.tsx:190
msgid "Playlists"
msgstr "Collections"
#. placeholder {0}: playlists.items.length
#. placeholder {1}: playlists.hasMore ? "+" : ""
#: src/components/profile/ProfilePlaylistsTab.tsx:35
msgid "Playlists ({0}{1})"
msgstr "Collections ({0}{1})"
#: src/components/comment/CommentThread.tsx:99
msgid "Post comment"
msgstr "Publier le commentaire"
#: src/components/comment/CommentNode.tsx:287
msgid "Post reply"
msgstr "Publier la réponse"
#: src/components/comment/CommentNode.tsx:288
#: src/components/comment/CommentThread.tsx:100
#: src/components/dump/create/DumpCreateModal.tsx:757
msgid "Posting…"
msgstr "Publication…"
#: src/components/player/GlobalPlayer.tsx:228
msgid "Previous track"
msgstr "Piste précédente"
#: src/components/dump/DumpCard.tsx:148
#: src/components/dump/JournalCard.tsx:142
#: src/components/playlist/PlaylistCard.tsx:103
#: src/components/playlist/PlaylistHeader.tsx:75
#: src/components/playlist/PlaylistMembershipPanel.tsx:81
#: src/pages/Dump.tsx:497
msgid "private"
msgstr "privé"
#: src/components/form/SegmentedField.tsx:65
msgid "Private"
msgstr "Privé"
#: src/components/playlist/PlaylistCard.tsx:102
#: src/components/playlist/PlaylistHeader.tsx:75
msgid "public"
msgstr "public"
#: src/components/form/SegmentedField.tsx:64
msgid "Public"
msgstr "Public"
#: src/pages/DumpEdit.tsx:275
msgid "Refresh metadata"
msgstr "Actualiser les métadonnées"
#: src/components/player/GlobalPlayer.tsx:324
msgid "Refreshing stream…"
msgstr "Actualisation du flux…"
#: src/pages/DumpEdit.tsx:274
msgid "Refreshing…"
msgstr "Actualisation…"
#: src/pages/UserRegister.tsx:45
#: src/pages/UserRegister.tsx:129
#: src/pages/UserRegister.tsx:169
msgid "Register"
msgstr "S'inscrire"
#: src/pages/UserRegister.tsx:168
msgid "Registering…"
msgstr "Inscription…"
#: src/pages/UserRegister.tsx:134
msgid "Registration failed"
msgstr "Inscription échouée"
#: src/pages/Dump.tsx:561
msgid "Related"
msgstr "Connexe"
#: src/components/form/FileDropZone.tsx:139
msgid "Remove file"
msgstr "Supprimer le fichier"
#: src/components/playlist/PlaylistDumpList.tsx:108
msgid "Remove from playlist"
msgstr "Retirer de la collection"
#: src/components/social/LikeButton.tsx:54
msgid "Remove like"
msgstr "Retirer le j'aime"
#: src/components/social/VoteButton.tsx:52
msgid "Remove vote"
msgstr "Retirer le vote"
#: src/pages/DumpEdit.tsx:473
msgid "Replace file"
msgstr "Remplacer le fichier"
#: src/components/chat/ChatMessageItem.tsx:93
#: src/components/chat/ChatMessageItem.tsx:94
#: src/components/comment/CommentNode.tsx:242
msgid "Reply"
msgstr "Répondre"
#: src/components/chat/ChatModal.tsx:804
msgid "Replying to"
msgstr "En réponse à"
#: src/pages/UserLogin.tsx:148
msgid "Request failed"
msgstr "Échec de la demande"
#: src/pages/ResetPassword.tsx:109
msgid "Reset failed"
msgstr "Échec de la réinitialisation"
#. js-lingui-explicit-id
#: api/mail/password-reset.ts:44
msgid "email.reset.button"
msgstr "Choisir un nouveau mot de passe"
#: src/pages/ResetPassword.tsx:34
msgid "Reset password"
msgstr "Réinitialiser le mot de passe"
#: src/pages/DumpEdit.tsx:449
#: src/pages/DumpEdit.tsx:504
msgid "Reset to default"
msgstr "Réinitialiser par défaut"
#: src/components/dump/create/TitleField.tsx:80
#: src/components/dump/create/TitleField.tsx:81
msgid "Reset to the suggested title"
msgstr "Rétablir le titre suggéré"
#. js-lingui-explicit-id
#: api/mail/password-reset.ts:71
msgid "email.reset.subject"
msgstr "Réinitialisez votre mot de passe {site}"
#. js-lingui-explicit-id
#: api/mail/password-reset.ts:30
msgid "email.reset.title"
msgstr "Réinitialiser votre mot de passe"
#: src/components/chat/PendingItem.tsx:86
#: src/pages/Dump.tsx:307
#: src/pages/DumpEdit.tsx:210
msgid "Retry"
msgstr "Réessayer"
#: src/components/profile/RoleSwitcher.tsx:84
msgid "Role"
msgstr "Rôle"
#: src/components/category/CategoryManager.tsx:216
#: src/components/chat/ChatEditBox.tsx:85
#: src/components/comment/CommentNode.tsx:214
#: src/components/playlist/PlaylistEditForm.tsx:212
#: src/components/profile/DescriptionEditor.tsx:89
#: src/components/profile/EmailEditor.tsx:75
#: src/pages/Dump.tsx:424
#: src/pages/DumpEdit.tsx:545
msgid "Save"
msgstr "Enregistrer"
#: src/components/comment/CommentNode.tsx:215
#: src/components/playlist/PlaylistEditForm.tsx:208
#: src/components/profile/ChangePasswordModal.tsx:120
#: src/components/profile/DescriptionEditor.tsx:86
#: src/components/profile/EmailEditor.tsx:72
#: src/pages/Dump.tsx:423
#: src/pages/ResetPassword.tsx:136
msgid "Saving…"
msgstr "Enregistrement…"
#: src/components/layout/AppHeader.tsx:162
#: src/components/layout/SearchBar.tsx:82
#: src/pages/Search.tsx:65
msgid "Search"
msgstr "Rechercher"
#: src/components/layout/SearchBar.tsx:78
msgid "Search dumps, users, playlists…"
msgstr "Rechercher des recos, utilisateurs, collections…"
#: src/components/editor/EmojiPickerPopup.tsx:104
msgid "Search emoji"
msgstr "Rechercher un emoji"
#: src/components/editor/EmojiPickerPopup.tsx:103
msgid "Search emoji…"
msgstr "Rechercher un emoji…"
#: src/pages/Search.tsx:160
msgid "Search failed"
msgstr "Recherche échouée"
#: src/pages/Search.tsx:155
msgid "Searching…"
msgstr "Recherche…"
#: src/components/player/SeekBar.tsx:50
msgid "Seek"
msgstr "Position"
#: src/components/chat/ChatModal.tsx:844
msgid "Send"
msgstr "Envoyer"
#: src/pages/UserLogin.tsx:157
msgid "Send reset link"
msgstr "Envoyer le lien de réinitialisation"
#: src/components/chat/PendingItem.tsx:104
#: src/pages/UserLogin.tsx:156
msgid "Sending…"
msgstr "Envoi…"
#: src/components/layout/AppHeader.tsx:198
msgid "Server unreachable"
msgstr "Serveur inaccessible"
#: src/pages/ResetPassword.tsx:104
#: src/pages/ResetPassword.tsx:137
msgid "Set new password"
msgstr "Définir un nouveau mot de passe"
#. js-lingui-explicit-id
#: api/mail/digest.ts:554
msgid "email.settings"
msgstr "Paramètres"
#: src/pages/UserPublicProfile.tsx:194
msgid "Settings"
msgstr "Paramètres"
#: src/components/chat/ChatModal.tsx:628
msgid "Several people are typing…"
msgstr "Plusieurs personnes écrivent…"
#: src/components/profile/ProfileOwnActions.tsx:108
msgid "Single use, valid for 7 days."
msgstr "Usage unique, valable 7 jours."
#: src/components/category/CategoryManager.tsx:205
msgid "slug"
msgstr "identifiant"
#: src/components/editor/TextEditor.tsx:317
msgid "Some images couldn't be uploaded."
msgstr "Certaines images n'ont pas pu être envoyées."
#. js-lingui-explicit-id
#: api/mail/password-reset.ts:37
msgid "email.reset.body"
msgstr "Quelqu'un a demandé à réinitialiser le mot de passe de votre compte {site}. Le bouton ci-dessous vous permet d'en choisir un nouveau. Il ne fonctionne qu'une fois, pendant {hours, plural, one {# heure} other {# heures}}."
#: src/components/form/FormError.tsx:31
#: src/components/layout/PageError.tsx:29
#: src/contexts/ws/WSProvider.tsx:729
#: src/pages/PlaylistDetail.tsx:119
msgid "Something went wrong"
msgstr "Une erreur est survenue"
#: src/components/profile/ProfileSettingsTab.tsx:113
msgid "Sounds"
msgstr "Sons"
#: src/components/dump/create/DumpCreateModal.tsx:511
msgid "Start fresh"
msgstr "Repartir de zéro"
#: src/components/profile/ProfileSettingsTab.tsx:84
msgid "Style"
msgstr "Style"
#: src/components/layout/SearchBar.tsx:88
msgid "Submit search"
msgstr "Lancer la recherche"
#: src/components/form/FileField.tsx:60
msgid "That file is over {limit}."
msgstr "Ce fichier dépasse {limit}."
#. js-lingui-explicit-id
#: api/mail/digest.ts:351
msgid "email.digest.theChat"
msgstr "la tribune"
#: src/pages/Notifications.tsx:222
msgid "the chat"
msgstr "la tribune"
#: src/hooks/playlist/usePlaylist.ts:161
msgid "The dump couldn't be removed. Try again."
msgstr "Le dump n'a pas pu être retiré. Réessayez."
#: src/components/editor/TextEditor.tsx:318
msgid "The image couldn't be uploaded."
msgstr "L'image n'a pas pu être envoyée."
#. js-lingui-explicit-id
#: api/mail/password-reset.ts:76
msgid "email.reset.preheader"
msgstr "Le lien ne fonctionne qu'une fois, pendant {hours, plural, one {# heure} other {# heures}}."
#. js-lingui-explicit-id
#: api/mail/digest.ts:325
msgid "email.digest.monthly.title"
msgstr "Le mois sur {site}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:562
msgid "email.digest.monthly.subject"
msgstr "Le mois sur {site}, {range}"
#: src/hooks/playlist/usePlaylist.ts:307
msgid "The new order couldn't be saved. Try again."
msgstr "Le nouvel ordre n'a pas pu être enregistré. Réessayez."
#: src/components/comment/CommentNode.tsx:280
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
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
msgid "This is a mirage."
msgstr "C'est un mirage."
#: src/pages/NotFound.tsx:21
msgid "This page does not exist."
msgstr "Rien à voir, circulez."
#: src/pages/ResetPassword.tsx:64
msgid "This reset link is missing or malformed."
msgstr "Ce lien de réinitialisation est absent ou malformé."
#: src/components/profile/ProfileSettingsTab.tsx:149
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."
#: src/pages/Unsubscribe.tsx:64
msgid "This unsubscribe link is missing or malformed."
msgstr "Ce lien de désabonnement est absent ou mal formé."
#: src/pages/DumpEdit.tsx:433
msgid "Thumbnail"
msgstr "Miniature"
#: src/components/dump/create/TitleField.tsx:45
#: src/components/playlist/PlaylistCreateForm.tsx:96
#: src/pages/DumpEdit.tsx:494
msgid "Title"
msgstr "Titre"
#: src/components/dump/create/DumpCreateModal.tsx:413
msgid "Title is required."
msgstr "Un titre est requis."
#: src/pages/Notifications.tsx:372
#: src/utils/chat/time.ts:24
msgid "Today"
msgstr "Aujourd'hui"
#. js-lingui-explicit-id
#: api/mail/digest.ts:406
msgid "email.digest.topMonth"
msgstr "Les plus votées du mois"
#. js-lingui-explicit-id
#: api/mail/digest.ts:407
msgid "email.digest.topWeek"
msgstr "Les plus votées de la semaine"
#. placeholder {0}: i + 1
#: src/components/player/GlobalPlayer.tsx:338
msgid "Track {0}"
msgstr "Piste {0}"
#: src/components/chat/ChatModal.tsx:645
msgid "Try again"
msgstr "Réessayer"
#. js-lingui-explicit-id
#: api/mail/digest.ts:542
#: src/pages/Unsubscribe.tsx:116
msgid "digest.monthly.off"
msgstr "Ne plus recevoir le récap mensuel"
#: src/pages/Unsubscribe.tsx:107
msgid "Turn off the monthly recap?"
msgstr "Ne plus recevoir le récap mensuel ?"
#: src/pages/Unsubscribe.tsx:106
msgid "Turn off the weekly digest?"
msgstr "Ne plus recevoir le résumé hebdomadaire ?"
#. js-lingui-explicit-id
#: api/mail/digest.ts:546
#: src/pages/Unsubscribe.tsx:114
msgid "digest.weekly.off"
msgstr "Ne plus recevoir le résumé hebdomadaire"
#: src/pages/Unsubscribe.tsx:112
msgid "Turning off…"
msgstr "Désactivation…"
#: src/components/chat/ChatModal.tsx:829
msgid "Type a message…"
msgstr "Écrivez un message…"
#: src/components/playlist/PlaylistDumpList.tsx:120
msgid "Undo"
msgstr "Annuler"
#: src/utils/shared/api.ts:22
msgid "Unexpected response format"
msgstr "Format de réponse inattendu"
#: src/components/social/FollowButton.tsx:59
msgid "Unfollow {targetUsername}"
msgstr "Ne plus suivre {targetUsername}"
#: src/components/social/FollowButton.tsx:100
msgid "Unfollow playlist"
msgstr "Ne plus suivre la collection"
#: src/components/player/MediaPlayer.tsx:346
msgid "Unmute"
msgstr "Rétablir le son"
#: src/pages/Unsubscribe.tsx:30
msgid "Unsubscribe"
msgstr "Se désabonner"
#: src/pages/Unsubscribe.tsx:78
msgid "Unsubscribed"
msgstr "Désabonné"
#. js-lingui-explicit-id
#: api/mail/digest.ts:250
msgid "email.digest.upload"
msgstr "fichier"
#: src/components/profile/ProfileHeader.tsx:70
msgid "Upload failed"
msgstr "Envoi échoué"
#. placeholder {0}: Math.round((uploadProgress ?? 0) * 100)
#: src/components/dump/create/DumpCreateModal.tsx:448
msgid "Uploading {0}%"
msgstr "Envoi {0} %"
#: src/components/editor/TextEditor.tsx:566
msgid "Uploading image…"
msgstr "Envoi de l'image…"
#: src/components/dump/create/DumpCreateModal.tsx:760
msgid "Uploading…"
msgstr "Envoi…"
#: src/components/social/VoteButton.tsx:52
msgid "Upvote"
msgstr "Voter"
#: src/pages/UserUpvoted.tsx:74
msgid "Upvoted"
msgstr "Voté"
#. placeholder {0}: votes.items.length
#. placeholder {1}: votes.hasMore ? "+" : ""
#: src/components/profile/ProfileDumpsTab.tsx:52
msgid "Upvoted ({0}{1})"
msgstr "Votés ({0}{1})"
#: src/pages/DumpEdit.tsx:465
msgid "URL"
msgstr "URL"
#: src/components/dump/create/DumpCreateModal.tsx:397
msgid "URL is required."
msgstr "L'URL est obligatoire."
#: src/components/category/CategoryManager.tsx:206
msgid "URL slug"
msgstr "Identifiant d’URL"
#: src/components/profile/RoleSwitcher.tsx:22
msgid "User"
msgstr "Utilisateur"
#: src/components/profile/ProfileManageTab.tsx:38
msgid "User management"
msgstr "Gestion utilisateur"
#: src/components/layout/UserMenu.tsx:53
msgid "User menu"
msgstr "Menu utilisateur"
#: src/pages/UserLogin.tsx:75
#: src/pages/UserRegister.tsx:137
msgid "Username"
msgstr "Nom d'utilisateur"
#: src/pages/Search.tsx:118
msgid "Users"
msgstr "Utilisateurs"
#: src/components/profile/ProfileSection.tsx:43
msgid "View all →"
msgstr "Tout voir →"
#: src/components/dump/create/DumpCreateModal.tsx:525
msgid "View dump →"
msgstr "Voir la reco →"
#: src/components/player/MediaPlayer.tsx:363
msgid "Volume"
msgstr "Volume"
#. js-lingui-explicit-id
#: api/mail/digest.ts:315
#: src/components/profile/ProfileSettingsTab.tsx:128
msgid "digest.weekly"
msgstr "Résumé hebdomadaire"
#. js-lingui-explicit-id
#: api/mail/welcome.ts:65
msgid "email.welcome.subject"
msgstr "Bienvenue sur {site}"
#: src/components/dump/create/DumpCreateModal.tsx:711
#: src/pages/DumpEdit.tsx:515
msgid "What makes it worth it?"
msgstr "Pourquoi on en voudrait ?"
#: src/components/profile/DescriptionEditor.tsx:78
#: src/components/profile/ProfileDescription.tsx:79
msgid "Who am I?"
msgstr "Qui suis-je ?"
#: src/components/dump/create/DumpCreateModal.tsx:726
msgid "Who can see it"
msgstr "Qui peut la voir"
#: src/components/dump/create/StepIndicator.tsx:20
msgid "Why & where"
msgstr "Pourquoi & où"
#: src/components/dump/create/DumpCreateModal.tsx:710
#: src/pages/DumpEdit.tsx:514
msgid "Why?"
msgstr "Pourquoi ?"
#: src/components/comment/CommentNode.tsx:291
msgid "Write a reply…"
msgstr "Écrire une réponse…"
#: src/pages/Notifications.tsx:374
#: src/utils/chat/time.ts:27
msgid "Yesterday"
msgstr "Hier"
#: src/components/dump/create/DuplicateNotice.tsx:60
msgid "You can post it anyway."
msgstr "Vous pouvez la publier quand même."
#: src/pages/Unsubscribe.tsx:89
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."
#: src/pages/Unsubscribe.tsx:83
msgid "You won't get the weekly digest any more. You can turn it back on in your settings."
msgstr "Vous ne recevrez plus le résumé hebdomadaire. Vous pouvez le réactiver dans vos paramètres."
#: src/pages/Notifications.tsx:359
msgid "You'll be notified when someone follows your playlists, upvotes your dumps, or posts new content."
msgstr "Vous serez notifié lorsque quelqu'un suit vos collections, vote pour vos recos ou publie du nouveau contenu."
#. js-lingui-explicit-id
#: api/mail/digest.ts:528
msgid "email.digest.monthly.reason"
msgstr "Vous recevez ce récap mensuel car il est activé dans vos paramètres."
#. js-lingui-explicit-id
#: api/mail/digest.ts:533
msgid "email.digest.weekly.reason"
msgstr "Vous recevez ce résumé hebdomadaire car il est activé dans vos paramètres."
#. js-lingui-explicit-id
#: api/mail/password-reset.ts:63
msgid "email.reset.reason"
msgstr "Vous recevez cet e-mail car une réinitialisation de mot de passe a été demandée pour cette adresse."
#. js-lingui-explicit-id
#: api/mail/welcome.ts:56
msgid "email.welcome.reason"
msgstr "Vous recevez cet e-mail car un compte {site} a été créé avec cette adresse."
#: src/contexts/ws/WSProvider.tsx:910
msgid "You're offline — not sent"
msgstr "Hors ligne — message non envoyé"
#: src/components/feed/FeedFooter.tsx:39
msgid "You've reached the end."
msgstr "Vous avez tout lu, tout vu, tout bu."
#. js-lingui-explicit-id
#: api/mail/welcome.ts:70
msgid "email.welcome.preheader"
msgstr "Votre compte est prêt."
#: src/pages/UserLogin.tsx:152
msgid "Your email address"
msgstr "Votre adresse e-mail"
#: src/pages/ResetPassword.tsx:86
msgid "Your password has been changed. You can now log in."
msgstr "Votre mot de passe a été modifié. Vous pouvez maintenant vous connecter."
#: src/pages/Unsubscribe.tsx:51
msgid "Your settings"
msgstr "Vos paramètres"
#. js-lingui-explicit-id
#: api/mail/digest.ts:567
msgid "email.digest.weekly.subject"
msgstr "Votre semaine sur {site}, {range}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:330
msgid "email.digest.weekly.title"
msgstr "Votre semaine, {username}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:293
msgid "email.digest.yours"
msgstr "à vous"