v4: the header has two playlists links, each to its own page — it had three: the text button and the avatar menu's "Playlists" both led to the user's own playlists, and the menu's "All playlists" to /playlists. The text button now leads to /playlists, every public playlist, and shows to guests too, the page being open to them. The menu keeps one entry, "My playlists", to the user's own. Below 1150px, where the text button is hidden, the header no longer links to /playlists.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -24,7 +24,7 @@ msgid "{0, plural, one {# comment} other {# comments}}"
|
||||
msgstr "{0, plural, one {# comment} other {# comments}}"
|
||||
|
||||
#. placeholder {0}: playlist.dumpCount
|
||||
#: src/components/playlist/PlaylistCard.tsx:120
|
||||
#: src/components/playlist/PlaylistCard.tsx:125
|
||||
msgid "{0, plural, one {# dump} other {# dumps}}"
|
||||
msgstr "{0, plural, one {# dump} other {# dumps}}"
|
||||
|
||||
@@ -60,7 +60,7 @@ msgstr "{0}–{1} characters: letters, numbers, or underscores"
|
||||
msgid "email.digest.totals"
|
||||
msgstr "{dumps, plural, one {# dump} other {# dumps}}, {upvotes, plural, one {# upvote} other {# upvotes}} and {comments, plural, one {# comment} other {# comments}}."
|
||||
|
||||
#: src/pages/Search.tsx:178
|
||||
#: src/pages/Search.tsx:215
|
||||
msgid "{label} ({count})"
|
||||
msgstr "{label} ({count})"
|
||||
|
||||
@@ -211,9 +211,9 @@ msgstr "# Welcome to {site}!\n"
|
||||
msgid "← Back"
|
||||
msgstr "← Back"
|
||||
|
||||
#: src/pages/Dump.tsx:353
|
||||
#: src/pages/Dump.tsx:378
|
||||
#: src/pages/Dump.tsx:605
|
||||
#: src/pages/Dump.tsx:354
|
||||
#: src/pages/Dump.tsx:379
|
||||
#: src/pages/Dump.tsx:606
|
||||
#: src/pages/DumpEdit.tsx:234
|
||||
msgid "← Back to all dumps"
|
||||
msgstr "← Back to all dumps"
|
||||
@@ -226,7 +226,7 @@ msgstr "+ Invite someone"
|
||||
msgid "+ New playlist"
|
||||
msgstr "+ New playlist"
|
||||
|
||||
#: src/pages/Dump.tsx:452
|
||||
#: src/pages/Dump.tsx:453
|
||||
msgid "+ Playlist"
|
||||
msgstr "+ Playlist"
|
||||
|
||||
@@ -345,10 +345,6 @@ msgstr "Admin"
|
||||
msgid "All"
|
||||
msgstr "All"
|
||||
|
||||
#: src/components/layout/UserMenu.tsx:108
|
||||
msgid "All playlists"
|
||||
msgstr "All playlists"
|
||||
|
||||
#. placeholder {0}: first.ownerUsername
|
||||
#. placeholder {1}: relativeTime(first.createdAt)
|
||||
#: src/components/dump/create/DuplicateNotice.tsx:39
|
||||
@@ -419,7 +415,7 @@ msgstr "by @{username}"
|
||||
msgid "email.digest.playlistMeta"
|
||||
msgstr "by @{username} · {n, plural, one {# dump} other {# dumps}}"
|
||||
|
||||
#: src/contexts/ws/WSProvider.tsx:376
|
||||
#: src/contexts/ws/WSProvider.tsx:377
|
||||
#: src/contexts/ws/WSProvider.tsx:765
|
||||
msgid "Can't connect to the live updates server. Upvotes and notifications may not sync until it reconnects."
|
||||
msgstr "Can't connect to the live updates server. Upvotes and notifications may not sync until it reconnects."
|
||||
@@ -440,7 +436,7 @@ msgstr "Can't sign in there"
|
||||
#: src/components/profile/EmailEditor.tsx:83
|
||||
#: src/components/shared/ConfirmModal.tsx:63
|
||||
#: src/pages/Authorize.tsx:158
|
||||
#: src/pages/Dump.tsx:494
|
||||
#: src/pages/Dump.tsx:495
|
||||
#: src/pages/DumpEdit.tsx:561
|
||||
msgid "Cancel"
|
||||
msgstr "Cancel"
|
||||
@@ -454,7 +450,7 @@ msgstr "Cancel removal"
|
||||
msgid "Cancel reply"
|
||||
msgstr "Cancel reply"
|
||||
|
||||
#: src/components/layout/AppHeader.tsx:182
|
||||
#: src/components/layout/AppHeader.tsx:177
|
||||
msgid "Cancel search"
|
||||
msgstr "Cancel search"
|
||||
|
||||
@@ -679,7 +675,7 @@ msgstr "Delete dump"
|
||||
msgid "Delete failed ({0})"
|
||||
msgstr "Delete failed ({0})"
|
||||
|
||||
#: src/components/playlist/PlaylistCard.tsx:149
|
||||
#: src/components/playlist/PlaylistCard.tsx:154
|
||||
#: src/components/playlist/PlaylistEditForm.tsx:213
|
||||
#: src/components/profile/ProfilePlaylistsTab.tsx:201
|
||||
#: src/pages/PlaylistDetail.tsx:172
|
||||
@@ -753,7 +749,7 @@ msgstr "Drop a file here, or paste one"
|
||||
msgid "Drop a replacement here"
|
||||
msgstr "Drop a replacement here"
|
||||
|
||||
#: src/components/layout/AppHeader.tsx:201
|
||||
#: src/components/layout/AppHeader.tsx:196
|
||||
msgid "Dump"
|
||||
msgstr "Dump"
|
||||
|
||||
@@ -770,7 +766,7 @@ msgid "Dumped!"
|
||||
msgstr "Dumped!"
|
||||
|
||||
#: src/components/profile/ProfileDumpsTab.tsx:46
|
||||
#: src/pages/Search.tsx:174
|
||||
#: src/pages/Search.tsx:211
|
||||
#: src/pages/UserPublicProfile.tsx:160
|
||||
msgid "Dumps"
|
||||
msgstr "Dumps"
|
||||
@@ -789,7 +785,7 @@ msgstr "Earlier"
|
||||
#: src/components/chat/PendingItem.tsx:93
|
||||
#: src/components/comment/CommentNode.tsx:256
|
||||
#: src/components/playlist/PlaylistHeader.tsx:60
|
||||
#: src/pages/Dump.tsx:601
|
||||
#: src/pages/Dump.tsx:602
|
||||
msgid "Edit"
|
||||
msgstr "Edit"
|
||||
|
||||
@@ -807,7 +803,7 @@ msgid "Edit email"
|
||||
msgstr "Edit email"
|
||||
|
||||
#: src/components/dump/create/TitleField.tsx:69
|
||||
#: src/pages/Dump.tsx:511
|
||||
#: src/pages/Dump.tsx:512
|
||||
msgid "Edit title"
|
||||
msgstr "Edit title"
|
||||
|
||||
@@ -821,7 +817,7 @@ msgstr "edited"
|
||||
#: src/components/chat/ChatMessageItem.tsx:132
|
||||
#: src/components/comment/CommentNode.tsx:205
|
||||
#: src/components/playlist/PlaylistHeader.tsx:95
|
||||
#: src/pages/Dump.tsx:554
|
||||
#: src/pages/Dump.tsx:555
|
||||
msgid "edited {0}"
|
||||
msgstr "edited {0}"
|
||||
|
||||
@@ -831,7 +827,7 @@ msgstr "edited {0}"
|
||||
#: src/components/chat/ChatMessageItem.tsx:128
|
||||
#: src/components/comment/CommentNode.tsx:203
|
||||
#: src/components/playlist/PlaylistHeader.tsx:93
|
||||
#: src/pages/Dump.tsx:552
|
||||
#: src/pages/Dump.tsx:553
|
||||
msgid "Edited {0}"
|
||||
msgstr "Edited {0}"
|
||||
|
||||
@@ -852,7 +848,7 @@ msgstr "Email"
|
||||
msgid "Email address"
|
||||
msgstr "Email address"
|
||||
|
||||
#: src/pages/Search.tsx:230
|
||||
#: src/pages/Search.tsx:267
|
||||
msgid "Enter a query to search."
|
||||
msgstr "Enter a query to search."
|
||||
|
||||
@@ -1025,7 +1021,7 @@ msgstr "If you didn't ask for this, ignore this email. Your password stays the s
|
||||
msgid "image"
|
||||
msgstr "image"
|
||||
|
||||
#: src/pages/Dump.tsx:621
|
||||
#: src/pages/Dump.tsx:622
|
||||
msgid "In collections"
|
||||
msgstr "In collections"
|
||||
|
||||
@@ -1114,7 +1110,7 @@ msgstr "Link or file"
|
||||
msgid "Live updates are temporarily disconnected. Trying to reconnect…"
|
||||
msgstr "Live updates are temporarily disconnected. Trying to reconnect…"
|
||||
|
||||
#: src/components/layout/AppHeader.tsx:234
|
||||
#: src/components/layout/AppHeader.tsx:229
|
||||
msgid "Live updates unavailable."
|
||||
msgstr "Live updates unavailable."
|
||||
|
||||
@@ -1126,7 +1122,7 @@ msgstr "Load more"
|
||||
msgid "Load older messages"
|
||||
msgstr "Load older messages"
|
||||
|
||||
#: src/pages/Dump.tsx:337
|
||||
#: src/pages/Dump.tsx:338
|
||||
#: src/pages/DumpEdit.tsx:210
|
||||
msgid "Loading dump…"
|
||||
msgstr "Loading dump…"
|
||||
@@ -1159,7 +1155,7 @@ msgstr "Loading profile…"
|
||||
msgid "Loading…"
|
||||
msgstr "Loading…"
|
||||
|
||||
#: src/components/layout/AppHeader.tsx:208
|
||||
#: src/components/layout/AppHeader.tsx:203
|
||||
#: src/pages/FederationCallback.tsx:32
|
||||
#: src/pages/UserLogin.tsx:41
|
||||
#: src/pages/UserLogin.tsx:66
|
||||
@@ -1180,7 +1176,7 @@ msgstr "Log in to vote"
|
||||
msgid "Log in with {0}"
|
||||
msgstr "Log in with {0}"
|
||||
|
||||
#: src/components/layout/UserMenu.tsx:139
|
||||
#: src/components/layout/UserMenu.tsx:128
|
||||
#: src/pages/UserPublicProfile.tsx:133
|
||||
msgid "Log out"
|
||||
msgstr "Log out"
|
||||
@@ -1198,7 +1194,7 @@ msgstr "Login failed"
|
||||
msgid "Lowercase letters, numbers and single hyphens only"
|
||||
msgstr "Lowercase letters, numbers and single hyphens only"
|
||||
|
||||
#: src/components/layout/UserMenu.tsx:126
|
||||
#: src/components/layout/UserMenu.tsx:115
|
||||
#: src/pages/Manage.tsx:32
|
||||
#: src/pages/Manage.tsx:40
|
||||
#: src/pages/UserPublicProfile.tsx:166
|
||||
@@ -1222,6 +1218,10 @@ msgstr "Monthly recap"
|
||||
msgid "Mute"
|
||||
msgstr "Mute"
|
||||
|
||||
#: src/components/layout/UserMenu.tsx:89
|
||||
msgid "My playlists"
|
||||
msgstr "My playlists"
|
||||
|
||||
#: src/components/category/CategoryManager.tsx:208
|
||||
#: src/components/category/CategoryManager.tsx:209
|
||||
msgid "Name"
|
||||
@@ -1272,7 +1272,7 @@ msgstr "Next track"
|
||||
msgid "No dumps in this playlist yet."
|
||||
msgstr "No dumps in this playlist yet."
|
||||
|
||||
#: src/pages/Search.tsx:246
|
||||
#: src/pages/Search.tsx:283
|
||||
msgid "No dumps match \"{q}\"."
|
||||
msgstr "No dumps match \"{q}\"."
|
||||
|
||||
@@ -1301,7 +1301,7 @@ msgstr "No messages yet. Say hello!"
|
||||
msgid "No one yet."
|
||||
msgstr "No one yet."
|
||||
|
||||
#: src/pages/Search.tsx:287
|
||||
#: src/pages/Search.tsx:330
|
||||
msgid "No playlists match \"{q}\"."
|
||||
msgstr "No playlists match \"{q}\"."
|
||||
|
||||
@@ -1315,7 +1315,7 @@ msgstr "No playlists yet."
|
||||
msgid "No reply from the server — this message may not have been sent"
|
||||
msgstr "No reply from the server — this message may not have been sent"
|
||||
|
||||
#: src/pages/Search.tsx:261
|
||||
#: src/pages/Search.tsx:298
|
||||
msgid "No users match \"{q}\"."
|
||||
msgstr "No users match \"{q}\"."
|
||||
|
||||
@@ -1468,13 +1468,12 @@ msgid "Playlist categories"
|
||||
msgstr "Playlist categories"
|
||||
|
||||
#: src/components/dump/create/StepIndicator.tsx:21
|
||||
#: src/components/layout/AppHeader.tsx:172
|
||||
#: src/components/layout/UserMenu.tsx:92
|
||||
#: src/components/layout/AppHeader.tsx:169
|
||||
#: src/components/profile/ProfileFollowTab.tsx:148
|
||||
#: src/components/profile/ProfilePlaylistsTab.tsx:149
|
||||
#: src/pages/Playlists.tsx:53
|
||||
#: src/pages/Playlists.tsx:114
|
||||
#: src/pages/Search.tsx:177
|
||||
#: src/pages/Search.tsx:214
|
||||
#: src/pages/UserPublicProfile.tsx:162
|
||||
msgid "Playlists"
|
||||
msgstr "Playlists"
|
||||
@@ -1499,10 +1498,10 @@ msgstr "Previous track"
|
||||
|
||||
#: src/components/dump/DumpCard.tsx:144
|
||||
#: src/components/dump/JournalCard.tsx:145
|
||||
#: src/components/playlist/PlaylistCard.tsx:106
|
||||
#: src/components/playlist/PlaylistCard.tsx:111
|
||||
#: src/components/playlist/PlaylistHeader.tsx:77
|
||||
#: src/components/playlist/PlaylistMembershipPanel.tsx:81
|
||||
#: src/pages/Dump.tsx:560
|
||||
#: src/pages/Dump.tsx:561
|
||||
msgid "private"
|
||||
msgstr "private"
|
||||
|
||||
@@ -1510,7 +1509,7 @@ msgstr "private"
|
||||
msgid "Private"
|
||||
msgstr "Private"
|
||||
|
||||
#: src/components/playlist/PlaylistCard.tsx:105
|
||||
#: src/components/playlist/PlaylistCard.tsx:110
|
||||
#: src/components/playlist/PlaylistHeader.tsx:77
|
||||
msgid "public"
|
||||
msgstr "public"
|
||||
@@ -1545,7 +1544,7 @@ msgstr "Registering…"
|
||||
msgid "Registration failed"
|
||||
msgstr "Registration failed"
|
||||
|
||||
#: src/pages/Dump.tsx:612
|
||||
#: src/pages/Dump.tsx:613
|
||||
msgid "Related"
|
||||
msgstr "Related"
|
||||
|
||||
@@ -1632,7 +1631,7 @@ msgid "email.reset.title"
|
||||
msgstr "Reset your password"
|
||||
|
||||
#: src/components/chat/PendingItem.tsx:86
|
||||
#: src/pages/Dump.tsx:371
|
||||
#: src/pages/Dump.tsx:372
|
||||
#: src/pages/DumpEdit.tsx:227
|
||||
msgid "Retry"
|
||||
msgstr "Retry"
|
||||
@@ -1647,7 +1646,7 @@ msgstr "Role"
|
||||
#: src/components/playlist/PlaylistEditForm.tsx:229
|
||||
#: src/components/profile/DescriptionEditor.tsx:89
|
||||
#: src/components/profile/EmailEditor.tsx:75
|
||||
#: src/pages/Dump.tsx:486
|
||||
#: src/pages/Dump.tsx:487
|
||||
#: src/pages/DumpEdit.tsx:564
|
||||
msgid "Save"
|
||||
msgstr "Save"
|
||||
@@ -1657,14 +1656,14 @@ msgstr "Save"
|
||||
#: src/components/profile/ChangePasswordModal.tsx:119
|
||||
#: src/components/profile/DescriptionEditor.tsx:86
|
||||
#: src/components/profile/EmailEditor.tsx:72
|
||||
#: src/pages/Dump.tsx:485
|
||||
#: src/pages/Dump.tsx:486
|
||||
#: src/pages/ResetPassword.tsx:191
|
||||
msgid "Saving…"
|
||||
msgstr "Saving…"
|
||||
|
||||
#: src/components/layout/AppHeader.tsx:182
|
||||
#: src/components/layout/AppHeader.tsx:177
|
||||
#: src/components/layout/SearchBar.tsx:83
|
||||
#: src/pages/Search.tsx:90
|
||||
#: src/pages/Search.tsx:106
|
||||
msgid "Search"
|
||||
msgstr "Search"
|
||||
|
||||
@@ -1680,11 +1679,11 @@ msgstr "Search emoji"
|
||||
msgid "Search emoji…"
|
||||
msgstr "Search emoji…"
|
||||
|
||||
#: src/pages/Search.tsx:241
|
||||
#: src/pages/Search.tsx:278
|
||||
msgid "Search failed"
|
||||
msgstr "Search failed"
|
||||
|
||||
#: src/pages/Search.tsx:236
|
||||
#: src/pages/Search.tsx:273
|
||||
msgid "Searching…"
|
||||
msgstr "Searching…"
|
||||
|
||||
@@ -1710,7 +1709,7 @@ msgstr "Send reset link"
|
||||
msgid "Sending…"
|
||||
msgstr "Sending…"
|
||||
|
||||
#: src/components/layout/AppHeader.tsx:198
|
||||
#: src/components/layout/AppHeader.tsx:193
|
||||
msgid "Server unreachable"
|
||||
msgstr "Server unreachable"
|
||||
|
||||
@@ -1724,7 +1723,7 @@ msgstr "Set new password"
|
||||
msgid "email.settings"
|
||||
msgstr "Settings"
|
||||
|
||||
#: src/components/layout/UserMenu.tsx:116
|
||||
#: src/components/layout/UserMenu.tsx:105
|
||||
#: src/pages/Settings.tsx:75
|
||||
#: src/pages/Settings.tsx:88
|
||||
msgid "Settings"
|
||||
@@ -1831,7 +1830,7 @@ msgstr "The new order couldn't be saved. Try again."
|
||||
msgid "This comment couldn't be deleted. Try again."
|
||||
msgstr "This comment couldn't be deleted. Try again."
|
||||
|
||||
#: src/pages/Dump.tsx:346
|
||||
#: src/pages/Dump.tsx:347
|
||||
msgid "This dump was deleted, or made private."
|
||||
msgstr "This dump was deleted, or made private."
|
||||
|
||||
@@ -2028,7 +2027,7 @@ msgstr "User"
|
||||
msgid "User management"
|
||||
msgstr "User management"
|
||||
|
||||
#: src/components/layout/UserMenu.tsx:67
|
||||
#: src/components/layout/UserMenu.tsx:64
|
||||
msgid "User menu"
|
||||
msgstr "User menu"
|
||||
|
||||
@@ -2041,7 +2040,7 @@ msgid "Username"
|
||||
msgstr "Username"
|
||||
|
||||
#: src/components/profile/ProfileFollowTab.tsx:147
|
||||
#: src/pages/Search.tsx:176
|
||||
#: src/pages/Search.tsx:213
|
||||
msgid "Users"
|
||||
msgstr "Users"
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -24,7 +24,7 @@ msgid "{0, plural, one {# comment} other {# comments}}"
|
||||
msgstr "{0, plural, one {# commentaire} other {# commentaires}}"
|
||||
|
||||
#. placeholder {0}: playlist.dumpCount
|
||||
#: src/components/playlist/PlaylistCard.tsx:120
|
||||
#: src/components/playlist/PlaylistCard.tsx:125
|
||||
msgid "{0, plural, one {# dump} other {# dumps}}"
|
||||
msgstr "{0, plural, one {# reco} other {# recos}}"
|
||||
|
||||
@@ -60,7 +60,7 @@ msgstr "{0}–{1} caractères : lettres, chiffres ou tirets bas"
|
||||
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:178
|
||||
#: src/pages/Search.tsx:215
|
||||
msgid "{label} ({count})"
|
||||
msgstr "{label} ({count})"
|
||||
|
||||
@@ -211,9 +211,9 @@ msgstr "# Bienvenue sur {site} !\n"
|
||||
msgid "← Back"
|
||||
msgstr "← Retour"
|
||||
|
||||
#: src/pages/Dump.tsx:353
|
||||
#: src/pages/Dump.tsx:378
|
||||
#: src/pages/Dump.tsx:605
|
||||
#: src/pages/Dump.tsx:354
|
||||
#: src/pages/Dump.tsx:379
|
||||
#: src/pages/Dump.tsx:606
|
||||
#: src/pages/DumpEdit.tsx:234
|
||||
msgid "← Back to all dumps"
|
||||
msgstr "← Retour à toutes les recos"
|
||||
@@ -226,7 +226,7 @@ msgstr "+ Inviter quelqu'un"
|
||||
msgid "+ New playlist"
|
||||
msgstr "+ Nouvelle collection"
|
||||
|
||||
#: src/pages/Dump.tsx:452
|
||||
#: src/pages/Dump.tsx:453
|
||||
msgid "+ Playlist"
|
||||
msgstr "+ Collection"
|
||||
|
||||
@@ -345,10 +345,6 @@ msgstr "Administrateur"
|
||||
msgid "All"
|
||||
msgstr "Tout"
|
||||
|
||||
#: src/components/layout/UserMenu.tsx:108
|
||||
msgid "All playlists"
|
||||
msgstr "Toutes les collections"
|
||||
|
||||
#. placeholder {0}: first.ownerUsername
|
||||
#. placeholder {1}: relativeTime(first.createdAt)
|
||||
#: src/components/dump/create/DuplicateNotice.tsx:39
|
||||
@@ -419,7 +415,7 @@ msgstr "par @{username}"
|
||||
msgid "email.digest.playlistMeta"
|
||||
msgstr "par @{username} · {n, plural, one {# reco} other {# recos}}"
|
||||
|
||||
#: src/contexts/ws/WSProvider.tsx:376
|
||||
#: src/contexts/ws/WSProvider.tsx:377
|
||||
#: src/contexts/ws/WSProvider.tsx:765
|
||||
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."
|
||||
@@ -440,7 +436,7 @@ msgstr "Connexion impossible"
|
||||
#: src/components/profile/EmailEditor.tsx:83
|
||||
#: src/components/shared/ConfirmModal.tsx:63
|
||||
#: src/pages/Authorize.tsx:158
|
||||
#: src/pages/Dump.tsx:494
|
||||
#: src/pages/Dump.tsx:495
|
||||
#: src/pages/DumpEdit.tsx:561
|
||||
msgid "Cancel"
|
||||
msgstr "Annuler"
|
||||
@@ -454,7 +450,7 @@ msgstr "Annuler la suppression"
|
||||
msgid "Cancel reply"
|
||||
msgstr "Annuler la réponse"
|
||||
|
||||
#: src/components/layout/AppHeader.tsx:182
|
||||
#: src/components/layout/AppHeader.tsx:177
|
||||
msgid "Cancel search"
|
||||
msgstr "Annuler la recherche"
|
||||
|
||||
@@ -679,7 +675,7 @@ msgstr "Supprimer la reco"
|
||||
msgid "Delete failed ({0})"
|
||||
msgstr "Échec de la suppression ({0})"
|
||||
|
||||
#: src/components/playlist/PlaylistCard.tsx:149
|
||||
#: src/components/playlist/PlaylistCard.tsx:154
|
||||
#: src/components/playlist/PlaylistEditForm.tsx:213
|
||||
#: src/components/profile/ProfilePlaylistsTab.tsx:201
|
||||
#: src/pages/PlaylistDetail.tsx:172
|
||||
@@ -753,7 +749,7 @@ msgstr "Déposez un fichier ici, ou collez-en un"
|
||||
msgid "Drop a replacement here"
|
||||
msgstr "Déposez un fichier de remplacement ici"
|
||||
|
||||
#: src/components/layout/AppHeader.tsx:201
|
||||
#: src/components/layout/AppHeader.tsx:196
|
||||
msgid "Dump"
|
||||
msgstr "Reco"
|
||||
|
||||
@@ -770,7 +766,7 @@ msgid "Dumped!"
|
||||
msgstr "Recommandé !"
|
||||
|
||||
#: src/components/profile/ProfileDumpsTab.tsx:46
|
||||
#: src/pages/Search.tsx:174
|
||||
#: src/pages/Search.tsx:211
|
||||
#: src/pages/UserPublicProfile.tsx:160
|
||||
msgid "Dumps"
|
||||
msgstr "Recos"
|
||||
@@ -789,7 +785,7 @@ msgstr "Plus tôt"
|
||||
#: src/components/chat/PendingItem.tsx:93
|
||||
#: src/components/comment/CommentNode.tsx:256
|
||||
#: src/components/playlist/PlaylistHeader.tsx:60
|
||||
#: src/pages/Dump.tsx:601
|
||||
#: src/pages/Dump.tsx:602
|
||||
msgid "Edit"
|
||||
msgstr "Modifier"
|
||||
|
||||
@@ -807,7 +803,7 @@ msgid "Edit email"
|
||||
msgstr "Modifier l'e-mail"
|
||||
|
||||
#: src/components/dump/create/TitleField.tsx:69
|
||||
#: src/pages/Dump.tsx:511
|
||||
#: src/pages/Dump.tsx:512
|
||||
msgid "Edit title"
|
||||
msgstr "Modifier le titre"
|
||||
|
||||
@@ -821,7 +817,7 @@ msgstr "modifié"
|
||||
#: src/components/chat/ChatMessageItem.tsx:132
|
||||
#: src/components/comment/CommentNode.tsx:205
|
||||
#: src/components/playlist/PlaylistHeader.tsx:95
|
||||
#: src/pages/Dump.tsx:554
|
||||
#: src/pages/Dump.tsx:555
|
||||
msgid "edited {0}"
|
||||
msgstr "modifié {0}"
|
||||
|
||||
@@ -831,7 +827,7 @@ msgstr "modifié {0}"
|
||||
#: src/components/chat/ChatMessageItem.tsx:128
|
||||
#: src/components/comment/CommentNode.tsx:203
|
||||
#: src/components/playlist/PlaylistHeader.tsx:93
|
||||
#: src/pages/Dump.tsx:552
|
||||
#: src/pages/Dump.tsx:553
|
||||
msgid "Edited {0}"
|
||||
msgstr "Modifié le {0}"
|
||||
|
||||
@@ -852,7 +848,7 @@ msgstr "E-mail"
|
||||
msgid "Email address"
|
||||
msgstr "Adresse e-mail"
|
||||
|
||||
#: src/pages/Search.tsx:230
|
||||
#: src/pages/Search.tsx:267
|
||||
msgid "Enter a query to search."
|
||||
msgstr "Saisissez une recherche."
|
||||
|
||||
@@ -1025,7 +1021,7 @@ msgstr "Si vous n'êtes pas à l'origine de cette demande, ignorez cet e-mail. V
|
||||
msgid "image"
|
||||
msgstr "image"
|
||||
|
||||
#: src/pages/Dump.tsx:621
|
||||
#: src/pages/Dump.tsx:622
|
||||
msgid "In collections"
|
||||
msgstr "Dans les collections"
|
||||
|
||||
@@ -1114,7 +1110,7 @@ msgstr "Lien ou fichier"
|
||||
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:234
|
||||
#: src/components/layout/AppHeader.tsx:229
|
||||
msgid "Live updates unavailable."
|
||||
msgstr "Mises à jour en direct indisponibles."
|
||||
|
||||
@@ -1126,7 +1122,7 @@ msgstr "Charger plus"
|
||||
msgid "Load older messages"
|
||||
msgstr "Charger les messages plus anciens"
|
||||
|
||||
#: src/pages/Dump.tsx:337
|
||||
#: src/pages/Dump.tsx:338
|
||||
#: src/pages/DumpEdit.tsx:210
|
||||
msgid "Loading dump…"
|
||||
msgstr "Chargement de la reco…"
|
||||
@@ -1159,7 +1155,7 @@ msgstr "Chargement du profil…"
|
||||
msgid "Loading…"
|
||||
msgstr "Chargement…"
|
||||
|
||||
#: src/components/layout/AppHeader.tsx:208
|
||||
#: src/components/layout/AppHeader.tsx:203
|
||||
#: src/pages/FederationCallback.tsx:32
|
||||
#: src/pages/UserLogin.tsx:41
|
||||
#: src/pages/UserLogin.tsx:66
|
||||
@@ -1180,7 +1176,7 @@ msgstr "Se connecter pour valider"
|
||||
msgid "Log in with {0}"
|
||||
msgstr "Se connecter avec {0}"
|
||||
|
||||
#: src/components/layout/UserMenu.tsx:139
|
||||
#: src/components/layout/UserMenu.tsx:128
|
||||
#: src/pages/UserPublicProfile.tsx:133
|
||||
msgid "Log out"
|
||||
msgstr "Se déconnecter"
|
||||
@@ -1198,7 +1194,7 @@ msgstr "Connexion échouée"
|
||||
msgid "Lowercase letters, numbers and single hyphens only"
|
||||
msgstr "Minuscules, chiffres et tirets simples seulement"
|
||||
|
||||
#: src/components/layout/UserMenu.tsx:126
|
||||
#: src/components/layout/UserMenu.tsx:115
|
||||
#: src/pages/Manage.tsx:32
|
||||
#: src/pages/Manage.tsx:40
|
||||
#: src/pages/UserPublicProfile.tsx:166
|
||||
@@ -1222,6 +1218,10 @@ msgstr "Récap mensuel"
|
||||
msgid "Mute"
|
||||
msgstr "Couper le son"
|
||||
|
||||
#: src/components/layout/UserMenu.tsx:89
|
||||
msgid "My playlists"
|
||||
msgstr "Mes collections"
|
||||
|
||||
#: src/components/category/CategoryManager.tsx:208
|
||||
#: src/components/category/CategoryManager.tsx:209
|
||||
msgid "Name"
|
||||
@@ -1272,7 +1272,7 @@ msgstr "Piste suivante"
|
||||
msgid "No dumps in this playlist yet."
|
||||
msgstr "Aucune reco dans cette collection pour l'instant."
|
||||
|
||||
#: src/pages/Search.tsx:246
|
||||
#: src/pages/Search.tsx:283
|
||||
msgid "No dumps match \"{q}\"."
|
||||
msgstr "Aucune reco ne correspond à « {q} »."
|
||||
|
||||
@@ -1301,7 +1301,7 @@ msgstr "Aucun message pour l'instant. Dites bonjour !"
|
||||
msgid "No one yet."
|
||||
msgstr "Personne pour le moment."
|
||||
|
||||
#: src/pages/Search.tsx:287
|
||||
#: src/pages/Search.tsx:330
|
||||
msgid "No playlists match \"{q}\"."
|
||||
msgstr "Aucune collection ne correspond à « {q} »."
|
||||
|
||||
@@ -1315,7 +1315,7 @@ msgstr "Pas encore de collections."
|
||||
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:261
|
||||
#: src/pages/Search.tsx:298
|
||||
msgid "No users match \"{q}\"."
|
||||
msgstr "Aucun utilisateur ne correspond à « {q} »."
|
||||
|
||||
@@ -1468,13 +1468,12 @@ msgid "Playlist categories"
|
||||
msgstr "Catégories de collections"
|
||||
|
||||
#: src/components/dump/create/StepIndicator.tsx:21
|
||||
#: src/components/layout/AppHeader.tsx:172
|
||||
#: src/components/layout/UserMenu.tsx:92
|
||||
#: src/components/layout/AppHeader.tsx:169
|
||||
#: src/components/profile/ProfileFollowTab.tsx:148
|
||||
#: src/components/profile/ProfilePlaylistsTab.tsx:149
|
||||
#: src/pages/Playlists.tsx:53
|
||||
#: src/pages/Playlists.tsx:114
|
||||
#: src/pages/Search.tsx:177
|
||||
#: src/pages/Search.tsx:214
|
||||
#: src/pages/UserPublicProfile.tsx:162
|
||||
msgid "Playlists"
|
||||
msgstr "Collections"
|
||||
@@ -1499,10 +1498,10 @@ msgstr "Piste précédente"
|
||||
|
||||
#: src/components/dump/DumpCard.tsx:144
|
||||
#: src/components/dump/JournalCard.tsx:145
|
||||
#: src/components/playlist/PlaylistCard.tsx:106
|
||||
#: src/components/playlist/PlaylistCard.tsx:111
|
||||
#: src/components/playlist/PlaylistHeader.tsx:77
|
||||
#: src/components/playlist/PlaylistMembershipPanel.tsx:81
|
||||
#: src/pages/Dump.tsx:560
|
||||
#: src/pages/Dump.tsx:561
|
||||
msgid "private"
|
||||
msgstr "privé"
|
||||
|
||||
@@ -1510,7 +1509,7 @@ msgstr "privé"
|
||||
msgid "Private"
|
||||
msgstr "Privé"
|
||||
|
||||
#: src/components/playlist/PlaylistCard.tsx:105
|
||||
#: src/components/playlist/PlaylistCard.tsx:110
|
||||
#: src/components/playlist/PlaylistHeader.tsx:77
|
||||
msgid "public"
|
||||
msgstr "public"
|
||||
@@ -1545,7 +1544,7 @@ msgstr "Inscription…"
|
||||
msgid "Registration failed"
|
||||
msgstr "Inscription échouée"
|
||||
|
||||
#: src/pages/Dump.tsx:612
|
||||
#: src/pages/Dump.tsx:613
|
||||
msgid "Related"
|
||||
msgstr "Connexe"
|
||||
|
||||
@@ -1632,7 +1631,7 @@ msgid "email.reset.title"
|
||||
msgstr "Réinitialiser votre mot de passe"
|
||||
|
||||
#: src/components/chat/PendingItem.tsx:86
|
||||
#: src/pages/Dump.tsx:371
|
||||
#: src/pages/Dump.tsx:372
|
||||
#: src/pages/DumpEdit.tsx:227
|
||||
msgid "Retry"
|
||||
msgstr "Réessayer"
|
||||
@@ -1647,7 +1646,7 @@ msgstr "Rôle"
|
||||
#: src/components/playlist/PlaylistEditForm.tsx:229
|
||||
#: src/components/profile/DescriptionEditor.tsx:89
|
||||
#: src/components/profile/EmailEditor.tsx:75
|
||||
#: src/pages/Dump.tsx:486
|
||||
#: src/pages/Dump.tsx:487
|
||||
#: src/pages/DumpEdit.tsx:564
|
||||
msgid "Save"
|
||||
msgstr "Enregistrer"
|
||||
@@ -1657,14 +1656,14 @@ msgstr "Enregistrer"
|
||||
#: src/components/profile/ChangePasswordModal.tsx:119
|
||||
#: src/components/profile/DescriptionEditor.tsx:86
|
||||
#: src/components/profile/EmailEditor.tsx:72
|
||||
#: src/pages/Dump.tsx:485
|
||||
#: src/pages/Dump.tsx:486
|
||||
#: src/pages/ResetPassword.tsx:191
|
||||
msgid "Saving…"
|
||||
msgstr "Enregistrement…"
|
||||
|
||||
#: src/components/layout/AppHeader.tsx:182
|
||||
#: src/components/layout/AppHeader.tsx:177
|
||||
#: src/components/layout/SearchBar.tsx:83
|
||||
#: src/pages/Search.tsx:90
|
||||
#: src/pages/Search.tsx:106
|
||||
msgid "Search"
|
||||
msgstr "Rechercher"
|
||||
|
||||
@@ -1680,11 +1679,11 @@ msgstr "Rechercher un emoji"
|
||||
msgid "Search emoji…"
|
||||
msgstr "Rechercher un emoji…"
|
||||
|
||||
#: src/pages/Search.tsx:241
|
||||
#: src/pages/Search.tsx:278
|
||||
msgid "Search failed"
|
||||
msgstr "Recherche échouée"
|
||||
|
||||
#: src/pages/Search.tsx:236
|
||||
#: src/pages/Search.tsx:273
|
||||
msgid "Searching…"
|
||||
msgstr "Recherche…"
|
||||
|
||||
@@ -1710,7 +1709,7 @@ msgstr "Envoyer le lien de réinitialisation"
|
||||
msgid "Sending…"
|
||||
msgstr "Envoi…"
|
||||
|
||||
#: src/components/layout/AppHeader.tsx:198
|
||||
#: src/components/layout/AppHeader.tsx:193
|
||||
msgid "Server unreachable"
|
||||
msgstr "Serveur inaccessible"
|
||||
|
||||
@@ -1724,7 +1723,7 @@ msgstr "Définir un nouveau mot de passe"
|
||||
msgid "email.settings"
|
||||
msgstr "Paramètres"
|
||||
|
||||
#: src/components/layout/UserMenu.tsx:116
|
||||
#: src/components/layout/UserMenu.tsx:105
|
||||
#: src/pages/Settings.tsx:75
|
||||
#: src/pages/Settings.tsx:88
|
||||
msgid "Settings"
|
||||
@@ -1831,7 +1830,7 @@ msgstr "Le nouvel ordre n'a pas pu être enregistré. Réessayez."
|
||||
msgid "This comment couldn't be deleted. Try again."
|
||||
msgstr "Ce commentaire n'a pas pu être supprimé. Réessayez."
|
||||
|
||||
#: src/pages/Dump.tsx:346
|
||||
#: src/pages/Dump.tsx:347
|
||||
msgid "This dump was deleted, or made private."
|
||||
msgstr "Cette reco a été supprimée, ou rendue privée."
|
||||
|
||||
@@ -2028,7 +2027,7 @@ msgstr "Utilisateur"
|
||||
msgid "User management"
|
||||
msgstr "Gestion utilisateur"
|
||||
|
||||
#: src/components/layout/UserMenu.tsx:67
|
||||
#: src/components/layout/UserMenu.tsx:64
|
||||
msgid "User menu"
|
||||
msgstr "Menu utilisateur"
|
||||
|
||||
@@ -2041,7 +2040,7 @@ msgid "Username"
|
||||
msgstr "Nom d'utilisateur"
|
||||
|
||||
#: src/components/profile/ProfileFollowTab.tsx:147
|
||||
#: src/pages/Search.tsx:176
|
||||
#: src/pages/Search.tsx:213
|
||||
msgid "Users"
|
||||
msgstr "Utilisateurs"
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ import { UserMenu } from "./UserMenu.tsx";
|
||||
import { SearchBar } from "./SearchBar.tsx";
|
||||
import { IconClose, IconSearch } from "./NavIcons.tsx";
|
||||
import { SITE_EMOJI, SITE_NAME } from "../../hooks/shared/useDocumentTitle.ts";
|
||||
import { searchPath, userPath } from "../../../shared/paths.ts";
|
||||
import { playlistsPath, searchPath } from "../../../shared/paths.ts";
|
||||
|
||||
/** Loaded on first open, so its editor stays out of every page's bundle. */
|
||||
const DumpCreateModal = lazy(() =>
|
||||
@@ -62,9 +62,10 @@ export interface AppHeaderProps {
|
||||
|
||||
/**
|
||||
* Renders the site's header. It holds the search, which stays open on the
|
||||
* results page and slides open under the header on small screens, the
|
||||
* signed-in user's links and buttons, and a banner while live updates are down.
|
||||
* It also hosts the dump creation dialog that its "+ Dump" button opens.
|
||||
* results page and slides open under the header on small screens, the link to
|
||||
* every playlist, the signed-in user's menu and buttons or a guest's "Log in",
|
||||
* and a banner while live updates are down. It also hosts the dump creation
|
||||
* dialog that its "+ Dump" button opens.
|
||||
*/
|
||||
export function AppHeader(
|
||||
{ centerSlot, disableNew, initialDumpUrl }: AppHeaderProps,
|
||||
@@ -158,23 +159,17 @@ export function AppHeader(
|
||||
|
||||
<nav className="app-header-nav">
|
||||
{
|
||||
/* The user's own links lead the row, so the icons after them run
|
||||
unbroken to the "+": Playlists on wide screens, then the
|
||||
avatar's menu, which leads to their profile, at every width. */
|
||||
/* The links lead the row, so the icons after them run unbroken to
|
||||
the "+": every playlist on wide screens, for guests too, then
|
||||
the avatar's menu, which leads to the user's profile and their
|
||||
own playlists, at every width. */
|
||||
}
|
||||
{user && (
|
||||
<>
|
||||
<div className="nav-links">
|
||||
<Link
|
||||
to={userPath(user.username, "playlists")}
|
||||
className="app-header-user"
|
||||
>
|
||||
<Trans>Playlists</Trans>
|
||||
</Link>
|
||||
</div>
|
||||
<UserMenu user={user} />
|
||||
</>
|
||||
)}
|
||||
<div className="nav-links">
|
||||
<Link to={playlistsPath()} className="app-header-user">
|
||||
<Trans>Playlists</Trans>
|
||||
</Link>
|
||||
</div>
|
||||
{user && <UserMenu user={user} />}
|
||||
<button
|
||||
ref={searchToggleRef}
|
||||
type="button"
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
/**
|
||||
* Renders the avatar menu that leads the header's icon row at every width: it
|
||||
* holds the profile link, the playlists one (on small screens, the only one),
|
||||
* the community page, the settings, the site's tools, and logging out.
|
||||
* holds the profile link, the user's own playlists (the header's text link
|
||||
* leads to everyone's), the community page, the settings, the site's tools, and
|
||||
* logging out.
|
||||
*
|
||||
* @module
|
||||
*/
|
||||
@@ -15,11 +16,7 @@ import { DIGEST_MESSAGES } from "../../../shared/digest-messages.ts";
|
||||
import { Avatar } from "../shared/Avatar.tsx";
|
||||
import type { SelfUser } from "../../../shared/user.ts";
|
||||
import { can } from "../../utils/auth/permissions.ts";
|
||||
import {
|
||||
communityPath,
|
||||
playlistsPath,
|
||||
userPath,
|
||||
} from "../../../shared/paths.ts";
|
||||
import { communityPath, userPath } from "../../../shared/paths.ts";
|
||||
import { useAuth } from "../../hooks/auth/useAuth.ts";
|
||||
|
||||
/** Passed to {@link UserMenu} by `AppHeader`, for a signed-in user. */
|
||||
@@ -89,7 +86,7 @@ export function UserMenu({ user }: UserMenuProps): React.JSX.Element {
|
||||
role="menuitem"
|
||||
onClick={() => setOpen(false)}
|
||||
>
|
||||
<Trans>Playlists</Trans>
|
||||
<Trans>My playlists</Trans>
|
||||
</Link>
|
||||
<Link
|
||||
to={communityPath()}
|
||||
@@ -99,14 +96,6 @@ export function UserMenu({ user }: UserMenuProps): React.JSX.Element {
|
||||
>
|
||||
{i18n._(DIGEST_MESSAGES.community)}
|
||||
</Link>
|
||||
<Link
|
||||
to={playlistsPath()}
|
||||
className="user-menu-item"
|
||||
role="menuitem"
|
||||
onClick={() => setOpen(false)}
|
||||
>
|
||||
<Trans>All playlists</Trans>
|
||||
</Link>
|
||||
<Link
|
||||
to="/settings"
|
||||
className="user-menu-item"
|
||||
|
||||
@@ -13,9 +13,13 @@ import { makeSession } from "../../fixtures.ts";
|
||||
import { currentPath, renderWithContexts } from "../../render.tsx";
|
||||
|
||||
describe("AppHeader", () => {
|
||||
test("guests get a login button", async () => {
|
||||
test("guests get the playlists link and a login button", async () => {
|
||||
const user = userEvent.setup();
|
||||
renderWithContexts(<AppHeader />);
|
||||
expect(screen.getByRole("link", { name: "Playlists" })).toHaveAttribute(
|
||||
"href",
|
||||
"/playlists",
|
||||
);
|
||||
await user.click(screen.getByRole("button", { name: "Log in" }));
|
||||
expect(currentPath()).toBe("/login");
|
||||
});
|
||||
@@ -26,7 +30,7 @@ describe("AppHeader", () => {
|
||||
});
|
||||
expect(screen.getByRole("link", { name: "Playlists" })).toHaveAttribute(
|
||||
"href",
|
||||
"/@ann/playlists",
|
||||
"/playlists",
|
||||
);
|
||||
expect(screen.getByRole("button", { name: "User menu" }))
|
||||
.toBeInTheDocument();
|
||||
|
||||
@@ -22,10 +22,13 @@ describe("UserMenu", () => {
|
||||
"href",
|
||||
"/@ann",
|
||||
);
|
||||
expect(screen.getByRole("menuitem", { name: "Playlists" })).toHaveAttribute(
|
||||
"href",
|
||||
"/@ann/playlists",
|
||||
);
|
||||
// One playlists link, the user's own: the header's leads to everyone's.
|
||||
expect(screen.getAllByRole("menuitem", { name: /playlists/i }))
|
||||
.toHaveLength(
|
||||
1,
|
||||
);
|
||||
expect(screen.getByRole("menuitem", { name: "My playlists" }))
|
||||
.toHaveAttribute("href", "/@ann/playlists");
|
||||
expect(screen.getByRole("menuitem", { name: "Community" })).toHaveAttribute(
|
||||
"href",
|
||||
"/community",
|
||||
|
||||
Reference in New Issue
Block a user