Files
gerbeur/locales/fr.po
khannurien 4468438ba7 v4: every page and API URL follows one of two rules, written down in API.md — pages are a hierarchy where @name is a user and any other root word a category or an app page, tabs and views are plain segments and a default view is the bare path; API resources are /api/<plural>/<key>, a user's key being an id or @name, the caller's things under /api/me, media a sub-resource, lookups by another key a query filter. ~ is gone: the feed is /, /hot, /new, /journal, /follow and /music/hot, a profile /@bob with its overview and the tabs dumps, upvoted, playlists (her own only), follow (users, and /follow/playlists), invitees and manage (role and name, for user:manage), which replace the separate UserDumps, UserUpvoted and UserPlaylists pages; /settings holds the account (now with the username) and /manage the category manager, both linked from the user menu and one's profile. Dumps and playlists live under their owner, /@bob/dumps/<slug> and /@bob/playlists/<slug>, named by slug alone: migration 0021 re-slugs them to the bare slugify(title), unique per owner and kind (the oldest keeps it, clashes get -2), renames the categories whose slug v4 reserves (hot, follow, settings…), and rewrites this site's v3 links in dump notes, comments, chat, and playlist and profile descriptions. A slug changes only when edited, through the edit forms' new link field, which proposes slugify(title) as the title changes; a username changes from /settings or, for user:manage, from /@name/manage. Every slug or name left behind stays an alias of its item or user for good (dump_slug_aliases, playlist_slug_aliases, user_aliases), so old links redirect without chaining and nobody else can take one; slugs change 3 times a day per item, names once in 30 days, moderators exempt. An alias, or a name in another case, answers the item with its current path: the pages put it in their URL (useCanonicalPath, without fetching again), and the OG middleware answers a 301. shared/paths.ts builds and parses every page path, for the client's links, the emails' (digest-service lost its own builders and its id fallbacks, and links /follow and /settings) and the server's matchers (OG tags, self previews, backlinks, self-url); shared/slug.ts holds slugify and the format categories share. Dumps and playlists carry ownerUsername and a required slug, and notifications join their users' current names and their items' paths each time they are sent or read, so renames reach them and a deleted item's has no link. The API was renamed per the plan's table: POST /api/users and /api/sessions, /api/password-resets, /api/me (with settings, password, avatar, media-token, playlists?contains=, follow, feed?from=, notifications), /api/users/:key/{dumps,upvoted,playlists,follow/users,follow/playlists,invitees,avatar} and by path /api/users/:key/{dumps,playlists}/:slug, /api/dumps?url= and ?category=, /api/dumps/:id/{file,thumbnail,metadata}, /api/playlists/:id/cover, /api/remote/{preview,image,bandcamp,youtube} (one router), and /api/unsubscribe, the v3 POST /api/users/unsubscribe staying for the digests already sent. A stored default feed tab "followed" reads as "follow" once. dumps.slug and playlists.slug stay nullable, since SQLite can't add NOT NULL without rebuilding tables others reference; every writer sets them and unique (user_id, slug) indexes hold them. 254 backend tests (new: migration 0021 on a v3 fixture, slug aliases, swaps and rate limits, username renames, aliases and limits, reads by path and their privacy, the OG 301s, both unsubscribe paths, v4-shaped digest links with no ids, notification joins, shared paths and slugs) and 668 frontend tests (new: the profile's tabs and follow views, Settings, Manage, the link field, canonical URLs on the dump, playlist and profile pages, bare default feed paths) pass, and tsc, eslint, deno check, deno lint, deno fmt and doc:lint are clean; the migration was also run on a copy of the development database.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 16:08:59 +00:00

2012 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"
#. js-lingui-explicit-id
#: api/mail/digest.ts:127
msgid "email.digest.count.upvotes"
msgstr "{n, plural, one {vote} other {votes}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:129
msgid "email.digest.count.followers"
msgstr "{n, plural, one {nouvel abonné} other {nouveaux abonnés}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:131
msgid "email.digest.count.comments"
msgstr "{n, plural, one {commentaire} other {commentaires}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:133
msgid "email.digest.count.mentions"
msgstr "{n, plural, one {mention} other {mentions}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:135
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.playlistFollows"
msgstr "{n, plural, one {abonnement à vos collections} other {abonnements à vos collections}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:153
msgid "email.digest.hl.mentionComment"
msgstr "{who} vous a mentionné dans un commentaire sur {target}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:156
msgid "email.digest.hl.mentionIn"
msgstr "{who} vous a mentionné dans {target}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:158
msgid "email.digest.hl.mentionPlaylist"
msgstr "{who} vous a mentionné dans la collection {target}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:160
msgid "email.digest.hl.comment"
msgstr "{who} a commenté votre reco {target}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:162
msgid "email.digest.hl.playlistFollow"
msgstr "{who} a suivi votre collection {target}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:164
msgid "email.digest.hl.userFollow"
msgstr "{who} vous suit désormais"
#. js-lingui-explicit-id
#: api/mail/digest.ts:166
msgid "email.digest.hl.commentLike"
msgstr "{who} a aimé votre commentaire sur {target}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:170
msgid "email.digest.by"
msgstr "par @{username}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:172
msgid "email.digest.addedTo"
msgstr "ajoutée à {playlist}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:173
msgid "email.digest.upload"
msgstr "fichier"
#. js-lingui-explicit-id
#: api/mail/digest.ts:176
msgid "email.digest.invitedByYou"
msgstr "sur votre invitation"
#. js-lingui-explicit-id
#: api/mail/digest.ts:177
msgid "email.digest.invitedBy"
msgstr "sur invitation de @{username}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:178
msgid "email.digest.andMore"
msgstr "et {n} de plus"
#. js-lingui-explicit-id
#: api/mail/digest.ts:180
msgid "email.digest.playlistMeta"
msgstr "par @{username} · {n, plural, one {# reco} other {# recos}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:203
msgid "email.digest.yours"
msgstr "à vous"
#. js-lingui-explicit-id
#: api/mail/digest.ts:221
#: src/pages/Settings.tsx:190
msgid "digest.monthly"
msgstr "Récap mensuel"
#. js-lingui-explicit-id
#: api/mail/digest.ts:221
#: src/pages/Settings.tsx:181
msgid "digest.weekly"
msgstr "Résumé hebdomadaire"
#. js-lingui-explicit-id
#: api/mail/digest.ts:229
msgid "email.digest.monthly.title"
msgstr "Le mois sur {site}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:230
msgid "email.digest.weekly.title"
msgstr "Votre semaine, {username}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:238
msgid "email.digest.forYou"
msgstr "Pour vous"
#. js-lingui-explicit-id
#: api/mail/digest.ts:247
msgid "email.digest.theChat"
msgstr "la tribune"
#. js-lingui-explicit-id
#: api/mail/digest.ts:262
msgid "email.digest.seeAll"
msgstr "{n, plural, one {Voir la notification} other {Voir les # notifications}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:271
msgid "email.digest.network"
msgstr "De ceux que vous suivez"
#. js-lingui-explicit-id
#: api/mail/digest.ts:277
msgid "email.digest.more"
msgstr "{n} de plus dans votre fil Suivi"
#. js-lingui-explicit-id
#: api/mail/digest.ts:290
msgid "email.digest.topMonth"
msgstr "Les plus votées du mois"
#. js-lingui-explicit-id
#: api/mail/digest.ts:291
msgid "email.digest.topWeek"
msgstr "Les plus votées de la semaine"
#. js-lingui-explicit-id
#: api/mail/digest.ts:307
msgid "email.digest.community"
msgstr "La communauté"
#. js-lingui-explicit-id
#: api/mail/digest.ts:314
msgid "email.digest.stat.dumps"
msgstr "{n, plural, one {reco} other {recos}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:320
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:329
msgid "email.digest.newMembers"
msgstr "Nouveaux membres"
#. js-lingui-explicit-id
#: api/mail/digest.ts:348
msgid "email.digest.newPlaylists"
msgstr "Nouvelles collections publiques"
#. js-lingui-explicit-id
#: api/mail/digest.ts:363
msgid "email.digest.inChat"
msgstr "Dans la tribune"
#. js-lingui-explicit-id
#: api/mail/digest.ts:365
msgid "email.digest.chatWeek"
msgstr "{n, plural, one {# message cette semaine} other {# messages cette semaine}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:368
msgid "email.digest.openChat"
msgstr "Ouvrir la tribune"
#. js-lingui-explicit-id
#: api/mail/digest.ts:377
msgid "email.digest.totals"
msgstr "{dumps, plural, one {# reco} other {# recos}}, {upvotes, plural, one {# vote} other {# votes}} et {comments, plural, one {# commentaire} other {# commentaires}}."
#. js-lingui-explicit-id
#: api/mail/digest.ts:387
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:388
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/digest.ts:392
#: src/pages/Unsubscribe.tsx:118
msgid "digest.monthly.off"
msgstr "Ne plus recevoir le récap mensuel"
#. js-lingui-explicit-id
#: api/mail/digest.ts:392
#: src/pages/Unsubscribe.tsx:117
msgid "digest.weekly.off"
msgstr "Ne plus recevoir le résumé hebdomadaire"
#. js-lingui-explicit-id
#: api/mail/digest.ts:397
msgid "email.settings"
msgstr "Paramètres"
#. js-lingui-explicit-id
#: api/mail/digest.ts:405
msgid "email.digest.monthly.subject"
msgstr "Le mois sur {site}, {range}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:409
msgid "email.digest.weekly.subject"
msgstr "Votre semaine sur {site}, {range}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:432
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:441
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:445
msgid "email.digest.pre.members"
msgstr "{n, plural, one {# nouveau membre} other {# nouveaux membres}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:448
msgid "email.digest.pre.playlists"
msgstr "{n, plural, one {# nouvelle collection} other {# nouvelles collections}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:452
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/password-reset.ts:29
msgid "email.reset.title"
msgstr "Réinitialiser votre mot de passe"
#. js-lingui-explicit-id
#: api/mail/password-reset.ts:30
msgid "email.reset.hi"
msgstr "Bonjour {username},"
#. js-lingui-explicit-id
#: api/mail/password-reset.ts:31
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}}."
#. js-lingui-explicit-id
#: api/mail/password-reset.ts:33
msgid "email.reset.button"
msgstr "Choisir un nouveau mot de passe"
#. js-lingui-explicit-id
#: api/mail/password-reset.ts:36
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:38
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."
#. js-lingui-explicit-id
#: api/mail/password-reset.ts:40
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/password-reset.ts:44
msgid "email.reset.subject"
msgstr "Réinitialisez votre mot de passe {site}"
#. js-lingui-explicit-id
#: api/mail/password-reset.ts:45
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/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 !"
#. js-lingui-explicit-id
#: api/mail/welcome.ts:39
msgid "email.welcome.button"
msgstr "Ouvrir {site}"
#. js-lingui-explicit-id
#: api/mail/welcome.ts:42
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."
#. js-lingui-explicit-id
#: api/mail/welcome.ts:44
msgid "email.welcome.reason"
msgstr "Vous recevez cet e-mail car un compte {site} a été créé avec cette adresse."
#. js-lingui-explicit-id
#: api/mail/welcome.ts:48
msgid "email.welcome.subject"
msgstr "Bienvenue sur {site}"
#. js-lingui-explicit-id
#: api/mail/welcome.ts:49
msgid "email.welcome.preheader"
msgstr "Votre compte est prêt."
#: src/components/comment/CommentNode.tsx:140
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:118
msgid "{0, plural, one {# dump} other {# dumps}}"
msgstr "{0, plural, one {# reco} other {# recos}}"
#. placeholder {0}: rest.length
#: src/components/dump/create/DuplicateNotice.tsx:53
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:82
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"
#: src/pages/Search.tsx:124
msgid "{label} ({count})"
msgstr "{label} ({count})"
#: 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}}"
#: src/components/dump/create/DumpCreateModal.tsx:742
#: src/pages/PlaylistDetail.tsx:80
#: src/pages/UserPublicProfile.tsx:123
msgid "← Back"
msgstr "← Retour"
#: src/pages/Dump.tsx:326
#: src/pages/Dump.tsx:566
#: src/pages/DumpEdit.tsx:231
msgid "← Back to all dumps"
msgstr "← Retour à toutes les recos"
#: 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:403
msgid "+ Playlist"
msgstr "+ Collection"
#. placeholder {0}: d.commenterUsername
#. placeholder {1}: d.dumpTitle
#: src/pages/Notifications.tsx:225
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:185
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:235
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:251
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:195
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:176
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:215
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:205
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:246
msgid "a comment"
msgstr "un commentaire"
#: src/components/form/SlugField.tsx:83
msgid "A link is required"
msgstr "Il faut un lien"
#: src/pages/Notifications.tsx:249
msgid "a post"
msgstr "une publication"
#: src/pages/Settings.tsx:108
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:155
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:465
#: src/components/playlist/AddToPlaylistModal.tsx:29
msgid "Add to playlist"
msgstr "Ajouter à la collection"
#: src/components/profile/RoleSwitcher.tsx:24
msgid "Admin"
msgstr "Administrateur"
#: src/components/category/CategorySwitcher.tsx:96
#: src/components/category/CategorySwitcher.tsx:99
msgid "All"
msgstr "Tout"
#. placeholder {0}: first.ownerUsername
#. 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."
#: src/pages/Settings.tsx:135
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
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/pages/Settings.tsx:51
msgid "Auto"
msgstr "Auto"
#: src/pages/ResetPassword.tsx:74
#: src/pages/ResetPassword.tsx:147
msgid "Back to login"
msgstr "Retour à la connexion"
#: 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:752
#: src/components/form/FormActions.tsx:42
#: src/components/playlist/PlaylistEditForm.tsx:218
#: src/components/profile/DescriptionEditor.tsx:97
#: src/components/profile/EmailEditor.tsx:83
#: src/components/shared/ConfirmModal.tsx:63
#: src/pages/Dump.tsx:444
#: src/pages/DumpEdit.tsx:570
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:163
msgid "Cancel search"
msgstr "Annuler la recherche"
#: src/components/category/CategorySelect.tsx:33
#: src/pages/Manage.tsx:33
msgid "Categories"
msgstr "Catégories"
#: src/components/category/CategorySwitcher.tsx:119
msgid "Category"
msgstr "Catégorie"
#: src/components/profile/ProfileHeader.tsx:96
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:66
#: src/components/profile/ChangePasswordModal.tsx:120
msgid "Change password"
msgstr "Changer le mot de passe"
#: src/pages/Settings.tsx:130
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:75
#: src/components/shared/Modal.tsx:76
msgid "Close"
msgstr "Fermer"
#: src/components/dump/create/DumpCreateModal.tsx:496
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:486
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/pages/Settings.tsx:144
msgid "Color scheme"
msgstr "Thème de couleur"
#: src/components/profile/ChangePasswordModal.tsx:108
#: src/pages/ResetPassword.tsx:131
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:117
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/components/profile/ProfilePlaylistsTab.tsx:126
#: src/pages/DumpEdit.tsx:558
msgid "Could not delete"
msgstr "Suppression impossible"
#: src/components/profile/UsernameField.tsx:81
msgid "Could not rename"
msgstr "Renommage impossible"
#: src/pages/DumpEdit.tsx:511
msgid "Could not save"
msgstr "Sauvegarde impossible"
#: 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."
#: src/components/chat/ChatModal.tsx:642
msgid "Couldn't load the chat."
msgstr "Impossible de charger le chat."
#: src/pages/Unsubscribe.tsx:114
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"
#: src/components/playlist/PlaylistCreateForm.tsx:111
msgid "Creating…"
msgstr "Création…"
#: src/components/profile/ChangePasswordModal.tsx:86
msgid "Current password"
msgstr "Mot de passe actuel"
#: src/pages/Settings.tsx:53
msgid "Dark"
msgstr "Sombre"
#: src/pages/Settings.tsx:155
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:115
#: src/components/chat/ChatMessageItem.tsx:116
#: src/components/chat/ChatMessageItem.tsx:214
#: src/components/comment/CommentNode.tsx:265
#: src/components/comment/CommentNode.tsx:271
#: src/components/playlist/PlaylistEditForm.tsx:214
#: 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:313
#: src/pages/DumpEdit.tsx:566
msgid "Delete dump"
msgstr "Supprimer la reco"
#. placeholder {0}: res.status
#: src/pages/DumpEdit.tsx:192
msgid "Delete failed ({0})"
msgstr "Échec de la suppression ({0})"
#: src/components/playlist/PlaylistCard.tsx:142
#: src/components/profile/ProfilePlaylistsTab.tsx:156
#: src/pages/PlaylistDetail.tsx:136
msgid "Delete playlist"
msgstr "Supprimer la collection"
#: src/components/comment/CommentNode.tsx:270
msgid "Delete this comment?"
msgstr "Supprimer ce commentaire ?"
#: src/pages/DumpEdit.tsx:312
msgid "Delete this dump? This cannot be undone."
msgstr "Supprimer cette reco ? Cette action est irréversible."
#: src/components/chat/ChatMessageItem.tsx:213
msgid "Delete this message?"
msgstr "Supprimer ce message ?"
#: src/components/profile/ProfilePlaylistsTab.tsx:155
#: src/pages/PlaylistDetail.tsx:135
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:186
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:546
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:653
msgid "Drop a file here, or paste one"
msgstr "Déposez un fichier ici, ou collez-en un"
#: src/pages/DumpEdit.tsx:502
msgid "Drop a replacement here"
msgstr "Déposez un fichier de remplacement ici"
#: src/components/layout/AppHeader.tsx:202
msgid "Dump"
msgstr "Reco"
#: src/components/dump/create/DumpCreateModal.tsx:765
msgid "Dump it"
msgstr "Recommander"
#: src/components/dump/create/DumpCreateModal.tsx:524
msgid "Dumped!"
msgstr "Recommandé !"
#: src/components/profile/ProfileDumpsTab.tsx:45
#: src/pages/Search.tsx:120
#: src/pages/UserPublicProfile.tsx:154
msgid "Dumps"
msgstr "Recos"
#. placeholder {0}: countOf(dumps.state)
#: src/components/profile/ProfileOverviewTab.tsx:56
msgid "Dumps ({0})"
msgstr "Recos ({0})"
#: src/pages/Notifications.tsx:405
msgid "Earlier"
msgstr "Plus tôt"
#: src/components/chat/ChatMessageItem.tsx:104
#: src/components/chat/ChatMessageItem.tsx:105
#: src/components/chat/PendingItem.tsx:93
#: src/components/comment/CommentNode.tsx:256
#: src/components/playlist/PlaylistHeader.tsx:59
#: src/pages/Dump.tsx:562
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:153
msgid "Edit email"
msgstr "Modifier l'e-mail"
#: src/components/dump/create/TitleField.tsx:69
#: src/pages/Dump.tsx:460
msgid "Edit title"
msgstr "Modifier le titre"
#: src/components/chat/ChatMessageItem.tsx:128
msgid "edited"
msgstr "modifié"
#. placeholder {0}: relativeTime(comment.updatedAt)
#. placeholder {0}: relativeTime(dump.updatedAt)
#. placeholder {0}: relativeTime(message.updatedAt)
#: src/components/chat/ChatMessageItem.tsx:129
#: src/components/comment/CommentNode.tsx:205
#: src/components/playlist/PlaylistHeader.tsx:94
#: src/pages/Dump.tsx:503
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:125
#: src/components/comment/CommentNode.tsx:203
#: src/components/playlist/PlaylistHeader.tsx:92
#: src/pages/Dump.tsx:501
msgid "Edited {0}"
msgstr "Modifié le {0}"
#: src/pages/DumpEdit.tsx:256
msgid "Editing"
msgstr "Modification"
#. placeholder {0}: state.dump.title
#: src/pages/DumpEdit.tsx:79
msgid "Editing {0}"
msgstr "Édition de {0}"
#: src/pages/Settings.tsx:179
msgid "Email"
msgstr "E-mail"
#: src/pages/UserRegister.tsx:152
msgid "Email address"
msgstr "Adresse e-mail"
#: src/pages/Search.tsx:155
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:379
msgid "Failed to load"
msgstr "Chargement échoué"
#: src/components/dump/create/DumpCreateModal.tsx:555
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:291
msgid "Failed to post reply"
msgstr "Impossible de publier la réponse"
#: src/components/playlist/PlaylistEditForm.tsx:206
#: 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:218
msgid "Failed to save edit"
msgstr "Impossible d'enregistrer la modification"
#: src/components/profile/ProfileHeader.tsx:164
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/pages/Settings.tsx:153
msgid "Feeds"
msgstr "Flux"
#: src/components/dump/create/DumpCreateModal.tsx:594
msgid "Fetching preview…"
msgstr "Récupération de l'aperçu…"
#: src/components/dump/create/DumpCreateModal.tsx:417
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:43
#: src/components/profile/ProfileFollowTab.tsx:163
#: src/pages/Settings.tsx:60
#: src/pages/UserPublicProfile.tsx:157
msgid "Followed"
msgstr "Suivi"
#: src/components/social/FollowButton.tsx:62
#: src/components/social/FollowButton.tsx:102
msgid "Following"
msgstr "Abonné"
#: 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"
#: 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:96
msgid "Go to login"
msgstr "Aller à la connexion"
#: src/components/feed/FeedTabBar.tsx:39
#: src/pages/Settings.tsx:57
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."
#: src/utils/chat/message.ts:43
msgid "image"
msgstr "image"
#: src/pages/Dump.tsx:582
msgid "In collections"
msgstr "Dans les collections"
#: 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:64
#: src/pages/Unsubscribe.tsx:64
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:118
msgid "invited by"
msgstr "invité par"
#: src/components/profile/ProfileInviteesTab.tsx:77
#: src/pages/UserPublicProfile.tsx:158
msgid "Invitees"
msgstr "Invités"
#: src/components/feed/FeedTabBar.tsx:41
#: src/pages/Settings.tsx:59
msgid "Journal"
msgstr "Journal"
#: src/components/dump/create/DumpCreateModal.tsx:493
msgid "Keep editing"
msgstr "Continuer l'édition"
#: src/components/profile/UsernameField.tsx:63
msgid "Letters, numbers and underscores only"
msgstr "Lettres, chiffres et tirets bas seulement"
#: src/pages/Settings.tsx:52
msgid "Light"
msgstr "Clair"
#: src/components/social/LikeButton.tsx:54
msgid "Like"
msgstr "Aimer"
#: src/components/dump/create/DumpCreateModal.tsx:569
#: src/components/form/SlugField.tsx:70
msgid "Link"
msgstr "Lien"
#: src/components/dump/create/StepIndicator.tsx:19
msgid "Link or file"
msgstr "Lien ou fichier"
#: src/components/form/SlugField.tsx:100
msgid "Links to the old address keep working."
msgstr "Les liens vers l’ancienne adresse marchent toujours."
#: 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:237
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:302
#: src/pages/DumpEdit.tsx:207
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:106
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:151
#: src/pages/Notifications.tsx:375
msgid "Loading…"
msgstr "Chargement…"
#: src/components/layout/AppHeader.tsx:210
#: 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:185
#: src/pages/UserPublicProfile.tsx:127
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/components/form/SlugField.tsx:86
msgid "Lowercase letters, numbers and single hyphens only"
msgstr "Minuscules, chiffres et tirets simples seulement"
#: src/components/layout/UserMenu.tsx:98
#: src/components/profile/ProfileHeader.tsx:181
#: src/pages/Manage.tsx:23
#: src/pages/Manage.tsx:30
#: src/pages/UserPublicProfile.tsx:160
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"
#: 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:368
msgid "new"
msgstr "nouveau"
#: src/components/chat/ChatModal.tsx:669
#: src/components/feed/FeedTabBar.tsx:40
#: src/pages/Settings.tsx:58
msgid "New"
msgstr "Nouveau"
#: src/components/dump/create/DumpCreateModal.tsx:465
#: src/components/dump/NewDumpButton.tsx:27
#: src/components/layout/DumpFab.tsx:66
#: src/components/layout/DumpFab.tsx:67
msgid "New dump"
msgstr "Nouvelle reco"
#: src/components/profile/ChangePasswordModal.tsx:94
#: src/pages/ResetPassword.tsx:116
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"
#: src/components/dump/create/DumpCreateModal.tsx:764
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:171
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/ProfileFollowTab.tsx:136
msgid "No followed playlists yet."
msgstr "Pas encore de collections suivies."
#: src/components/profile/ProfileInviteesTab.tsx:83
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:159
msgid "No one yet."
msgstr "Personne pour le moment."
#: src/pages/Search.tsx:212
msgid "No playlists match \"{q}\"."
msgstr "Aucune collection ne correspond à « {q} »."
#: src/components/playlist/PlaylistMembershipPanel.tsx:51
#: src/components/profile/ProfilePlaylistsTab.tsx:133
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:186
msgid "No users match \"{q}\"."
msgstr "Aucun utilisateur ne correspond à « {q} »."
#: src/components/profile/ProfileFollowTab.tsx:99
msgid "Not following anyone yet."
msgstr "Aucun abonnement pour le moment."
#: src/components/profile/ProfileDumpsTab.tsx:53
#: src/components/profile/ProfileOverviewTab.tsx:47
#: src/pages/Notifications.tsx:386
msgid "Nothing here yet."
msgstr "Rien ici pour l'instant."
#: src/components/layout/NotificationBell.tsx:54
#: src/pages/Notifications.tsx:308
#: src/pages/Notifications.tsx:364
#: src/pages/Settings.tsx:164
msgid "Notifications"
msgstr "Notifications"
#: src/components/layout/NotificationBell.tsx:53
msgid "Notifications ({unreadNotificationCount} unread)"
msgstr "Notifications ({unreadNotificationCount} non lues)"
#: src/pages/Settings.tsx:65
msgid "Off"
msgstr "Désactivés"
#: src/pages/Settings.tsx:64
msgid "On"
msgstr "Activés"
#: 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:117
msgid "Only its poster or a moderator can edit this dump."
msgstr "Seuls son auteur et les modérateurs peuvent modifier ce dump."
#. 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"
#: src/components/form/FileDropZone.tsx:163
msgid "or <0>browse files</0>"
msgstr "ou <0>parcourir les fichiers</0>"
#: src/pages/UserPublicProfile.tsx:153
msgid "Overview"
msgstr "Aperçu"
#: src/pages/NotFound.tsx:16
msgid "Page not found"
msgstr "Page introuvable"
#: src/pages/Settings.tsx:124
#: 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:71
msgid "Password changed successfully."
msgstr "Mot de passe modifié avec succès."
#: src/pages/ResetPassword.tsx:86
msgid "Password updated"
msgstr "Mot de passe mis à jour"
#: src/components/profile/ChangePasswordModal.tsx:114
#: src/pages/ResetPassword.tsx:136
msgid "Passwords do not match"
msgstr "Les mots de passe ne correspondent pas"
#: src/components/dump/create/DumpCreateModal.tsx:587
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:505
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:162
msgid "Playlist title"
msgstr "Titre de la collection"
#: src/components/dump/create/StepIndicator.tsx:21
#: src/components/layout/AppHeader.tsx:183
#: src/components/layout/UserMenu.tsx:81
#: src/components/profile/ProfileFollowTab.tsx:167
#: src/components/profile/ProfilePlaylistsTab.tsx:118
#: src/pages/Search.tsx:123
#: src/pages/UserPublicProfile.tsx:156
msgid "Playlists"
msgstr "Collections"
#: src/components/comment/CommentThread.tsx:99
msgid "Post comment"
msgstr "Publier le commentaire"
#: src/components/comment/CommentNode.tsx:289
msgid "Post reply"
msgstr "Publier la réponse"
#: src/components/comment/CommentNode.tsx:290
#: src/components/comment/CommentThread.tsx:100
#: src/components/dump/create/DumpCreateModal.tsx:758
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:104
#: src/components/playlist/PlaylistHeader.tsx:76
#: src/components/playlist/PlaylistMembershipPanel.tsx:81
#: src/pages/Dump.tsx:509
msgid "private"
msgstr "privé"
#: src/components/form/SegmentedField.tsx:65
msgid "Private"
msgstr "Privé"
#: src/components/playlist/PlaylistCard.tsx:103
#: src/components/playlist/PlaylistHeader.tsx:76
msgid "public"
msgstr "public"
#: src/components/form/SegmentedField.tsx:64
msgid "Public"
msgstr "Public"
#: src/pages/DumpEdit.tsx:289
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:288
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:573
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/components/profile/UsernameField.tsx:72
msgid "Rename"
msgstr "Renommer"
#: src/components/profile/UsernameField.tsx:69
msgid "Renaming…"
msgstr "Renommage…"
#: src/pages/DumpEdit.tsx:494
msgid "Replace file"
msgstr "Remplacer le fichier"
#: src/components/chat/ChatMessageItem.tsx:94
#: src/components/chat/ChatMessageItem.tsx:95
#: src/components/comment/CommentNode.tsx:244
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:112
msgid "Reset failed"
msgstr "Échec de la réinitialisation"
#: src/pages/ResetPassword.tsx:34
msgid "Reset password"
msgstr "Réinitialiser le mot de passe"
#: src/pages/DumpEdit.tsx:470
#: src/pages/DumpEdit.tsx:525
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é"
#: src/components/chat/PendingItem.tsx:86
#: src/pages/Dump.tsx:319
#: src/pages/DumpEdit.tsx:224
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:216
#: src/components/playlist/PlaylistEditForm.tsx:225
#: src/components/profile/DescriptionEditor.tsx:89
#: src/components/profile/EmailEditor.tsx:75
#: src/pages/Dump.tsx:436
#: src/pages/DumpEdit.tsx:573
msgid "Save"
msgstr "Enregistrer"
#: src/components/comment/CommentNode.tsx:217
#: src/components/playlist/PlaylistEditForm.tsx:221
#: src/components/profile/ChangePasswordModal.tsx:119
#: src/components/profile/DescriptionEditor.tsx:86
#: src/components/profile/EmailEditor.tsx:72
#: src/pages/Dump.tsx:435
#: src/pages/ResetPassword.tsx:139
msgid "Saving…"
msgstr "Enregistrement…"
#: src/components/layout/AppHeader.tsx:163
#: src/components/layout/SearchBar.tsx:82
#: src/pages/Search.tsx:69
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:166
msgid "Search failed"
msgstr "Recherche échouée"
#: src/pages/Search.tsx:161
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:199
msgid "Server unreachable"
msgstr "Serveur inaccessible"
#: src/pages/ResetPassword.tsx:107
#: src/pages/ResetPassword.tsx:140
msgid "Set new password"
msgstr "Définir un nouveau mot de passe"
#: src/components/layout/UserMenu.tsx:89
#: src/components/profile/ProfileHeader.tsx:177
#: src/pages/Settings.tsx:77
#: src/pages/Settings.tsx:105
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."
#: 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/pages/Settings.tsx:166
msgid "Sounds"
msgstr "Sons"
#: src/components/dump/create/DumpCreateModal.tsx:512
msgid "Start fresh"
msgstr "Repartir de zéro"
#: src/pages/Settings.tsx:137
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}."
#: src/pages/Notifications.tsx:248
msgid "the chat"
msgstr "la tribune"
#: src/hooks/playlist/usePlaylist.ts:179
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."
#: src/hooks/playlist/usePlaylist.ts:322
msgid "The new order couldn't be saved. Try again."
msgstr "Le nouvel ordre n'a pas pu être enregistré. Réessayez."
#: src/components/profile/ProfileManageTab.tsx:67
msgid "Their old name keeps leading to them, and nobody else can take it."
msgstr "Son ancien nom mène toujours à son profil, et personne d’autre ne peut le prendre."
#: src/components/comment/CommentNode.tsx:282
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:67
msgid "This reset link is missing or malformed."
msgstr "Ce lien de réinitialisation est absent ou malformé."
#: src/pages/Settings.tsx:202
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:67
msgid "This unsubscribe link is missing or malformed."
msgstr "Ce lien de désabonnement est absent ou mal formé."
#: src/pages/DumpEdit.tsx:454
msgid "Thumbnail"
msgstr "Miniature"
#: src/components/dump/create/TitleField.tsx:45
#: src/components/playlist/PlaylistCreateForm.tsx:96
#: src/pages/DumpEdit.tsx:515
msgid "Title"
msgstr "Titre"
#: src/components/dump/create/DumpCreateModal.tsx:414
msgid "Title is required."
msgstr "Un titre est requis."
#: src/pages/Notifications.tsx:402
#: src/utils/chat/time.ts:24
msgid "Today"
msgstr "Aujourd'hui"
#. 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"
#: src/pages/Unsubscribe.tsx:110
msgid "Turn off the monthly recap?"
msgstr "Ne plus recevoir le récap mensuel ?"
#: src/pages/Unsubscribe.tsx:109
msgid "Turn off the weekly digest?"
msgstr "Ne plus recevoir le résumé hebdomadaire ?"
#: src/pages/Unsubscribe.tsx:115
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:33
msgid "Unsubscribe"
msgstr "Se désabonner"
#: src/pages/Unsubscribe.tsx:81
msgid "Unsubscribed"
msgstr "Désabonné"
#: src/components/profile/ProfileHeader.tsx:73
msgid "Upload failed"
msgstr "Envoi échoué"
#. placeholder {0}: Math.round((uploadProgress ?? 0) * 100)
#: src/components/dump/create/DumpCreateModal.tsx:449
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:761
msgid "Uploading…"
msgstr "Envoi…"
#: src/components/social/VoteButton.tsx:52
msgid "Upvote"
msgstr "Voter"
#: src/components/profile/ProfileDumpsTab.tsx:45
#: src/pages/UserPublicProfile.tsx:155
msgid "Upvoted"
msgstr "Voté"
#. placeholder {0}: countOf(votes.state)
#: src/components/profile/ProfileOverviewTab.tsx:71
msgid "Upvoted ({0})"
msgstr "Voté ({0})"
#: src/pages/DumpEdit.tsx:486
msgid "URL"
msgstr "URL"
#: src/components/dump/create/DumpCreateModal.tsx:398
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:54
msgid "User management"
msgstr "Gestion utilisateur"
#: src/components/layout/UserMenu.tsx:56
msgid "User menu"
msgstr "Menu utilisateur"
#: src/components/profile/ProfileManageTab.tsx:61
#: src/components/profile/UsernameField.tsx:55
#: src/pages/Settings.tsx:110
#: src/pages/UserLogin.tsx:75
#: src/pages/UserRegister.tsx:137
msgid "Username"
msgstr "Nom d'utilisateur"
#: src/components/profile/ProfileFollowTab.tsx:166
#: src/pages/Search.tsx:122
msgid "Users"
msgstr "Utilisateurs"
#: src/components/profile/ProfileSection.tsx:43
msgid "View all →"
msgstr "Tout voir →"
#: src/components/dump/create/DumpCreateModal.tsx:526
msgid "View dump →"
msgstr "Voir la reco →"
#: src/components/player/MediaPlayer.tsx:363
msgid "Volume"
msgstr "Volume"
#: src/components/dump/create/DumpCreateModal.tsx:712
#: src/pages/DumpEdit.tsx:543
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:727
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:711
#: src/pages/DumpEdit.tsx:542
msgid "Why?"
msgstr "Pourquoi ?"
#: src/components/comment/CommentNode.tsx:293
msgid "Write a reply…"
msgstr "Écrire une réponse…"
#: src/pages/Notifications.tsx:404
#: src/utils/chat/time.ts:27
msgid "Yesterday"
msgstr "Hier"
#: src/pages/Settings.tsx:116
msgid "You can change it once every {renameDays} days. Links to your old name keep working, and nobody else can take it."
msgstr "Vous pouvez le changer une fois tous les {renameDays} jours. Les liens vers votre ancien nom marchent toujours, et personne d’autre ne peut le prendre."
#: src/components/dump/create/DuplicateNotice.tsx:61
msgid "You can post it anyway."
msgstr "Vous pouvez la publier quand même."
#: src/pages/Unsubscribe.tsx:92
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:86
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:389
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."
#: 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."
#: src/pages/UserLogin.tsx:152
msgid "Your email address"
msgstr "Votre adresse e-mail"
#: src/pages/ResetPassword.tsx:89
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:54
msgid "Your settings"
msgstr "Vos paramètres"