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

2010 lines
53 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-03-31 06:22+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: en\n"
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: \n"
"Last-Translator: \n"
"Language-Team: \n"
"Plural-Forms: \n"
#: src/components/comment/CommentNode.tsx:139
msgid "[deleted]"
msgstr "[deleted]"
#. 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 {# comment} other {# comments}}"
#. placeholder {0}: playlist.dumpCount
#: src/components/playlist/PlaylistCard.tsx:117
msgid "{0, plural, one {# dump} other {# dumps}}"
msgstr "{0, plural, one {# dump} other {# dumps}}"
#. placeholder {0}: rest.length
#: src/components/dump/create/DuplicateNotice.tsx:52
msgid "{0, plural, one {and # earlier dump} other {and # earlier dumps}}"
msgstr "{0, plural, one {and # earlier dump} other {and # earlier dumps}}"
#. placeholder {0}: typingNames[0]
#. placeholder {1}: typingNames[1]
#: src/components/chat/ChatModal.tsx:627
msgid "{0} and {1} are typing…"
msgstr "{0} and {1} are typing…"
#. placeholder {0}: typingNames[0]
#: src/components/chat/ChatModal.tsx:625
msgid "{0} is typing…"
msgstr "{0} is typing…"
#. placeholder {0}: rest.length
#: src/components/feed/PresenceRow.tsx:81
msgid "{0} more online: {restNames}"
msgstr "{0} more online: {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} characters: letters, numbers, or underscores"
#. js-lingui-explicit-id
#: api/mail/digest.ts:514
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:120
msgid "{label} ({count})"
msgstr "{label} ({count})"
#. js-lingui-explicit-id
#: api/mail/digest.ts:238
msgid "email.digest.comments"
msgstr "{n, plural, one {# comment} other {# comments}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:498
msgid "email.digest.chatWeek"
msgstr "{n, plural, one {# message this week} other {# messages this week}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:591
msgid "email.digest.pre.network"
msgstr "{n, plural, one {# new dump from people you follow} other {# new dumps from people you follow}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:612
msgid "email.digest.pre.members"
msgstr "{n, plural, one {# new member} other {# new members}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:619
msgid "email.digest.pre.playlists"
msgstr "{n, plural, one {# new playlist} other {# new playlists}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:232
msgid "email.digest.votes"
msgstr "{n, plural, one {# upvote} other {# upvotes}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:442
msgid "email.digest.stat.chat"
msgstr "{n, plural, one {chat message} other {chat messages}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:149
msgid "email.digest.count.likes"
msgstr "{n, plural, one {comment like} other {comment likes}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:137
msgid "email.digest.count.comments"
msgstr "{n, plural, one {comment} other {comments}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:432
msgid "email.digest.stat.dumps"
msgstr "{n, plural, one {dump} other {dumps}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:143
msgid "email.digest.count.mentions"
msgstr "{n, plural, one {mention} other {mentions}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:131
msgid "email.digest.count.followers"
msgstr "{n, plural, one {new follower} other {new followers}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:155
msgid "email.digest.count.playlistFollows"
msgstr "{n, plural, one {playlist follow} other {playlist follows}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:364
msgid "email.digest.seeAll"
msgstr "{n, plural, one {See the notification} other {See all # notifications}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:604
msgid "email.digest.pre.topMonth"
msgstr "{n, plural, one {the most upvoted dump of the month} other {the # most upvoted dumps of the month}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:627
msgid "email.digest.pre.topWeek"
msgstr "{n, plural, one {the most upvoted dump of the week} other {the # most upvoted dumps of the week}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:125
msgid "email.digest.count.upvotes"
msgstr "{n, plural, one {upvote} other {upvotes}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:389
msgid "email.digest.more"
msgstr "{n} more on your Followed feed"
#: src/components/chat/ChatModal.tsx:756
msgid "{unseenCount} new messages"
msgstr "{unseenCount} new messages"
#: src/components/comment/CommentThread.tsx:82
msgid "{visibleCount, plural, one {# comment} other {# comments}}"
msgstr "{visibleCount, plural, one {# comment} other {# comments}}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:199
msgid "email.digest.hl.comment"
msgstr "{who} commented on your dump {target}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:205
msgid "email.digest.hl.playlistFollow"
msgstr "{who} followed your playlist {target}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:217
msgid "email.digest.hl.commentLike"
msgstr "{who} liked your comment on {target}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:181
msgid "email.digest.hl.mentionDump"
msgstr "{who} mentioned you in {target}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:193
msgid "email.digest.hl.mentionChat"
msgstr "{who} mentioned you in {target}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:175
msgid "email.digest.hl.mentionComment"
msgstr "{who} mentioned you in a comment on {target}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:187
msgid "email.digest.hl.mentionPlaylist"
msgstr "{who} mentioned you in the playlist {target}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:211
msgid "email.digest.hl.userFollow"
msgstr "{who} started following you"
#. js-lingui-explicit-id
#: api/mail/welcome.ts:32
msgid "email.welcome.body"
msgstr "# Welcome to {site}!\n"
"\n"
"Hi **{username}**,\n"
"\n"
"Your account has been created successfully. Welcome aboard!"
#: src/components/dump/create/DumpCreateModal.tsx:741
#: src/pages/PlaylistDetail.tsx:80
#: src/pages/UserPublicProfile.tsx:159
msgid "← Back"
msgstr "← Back"
#: src/pages/Dump.tsx:314
#: src/pages/Dump.tsx:554
#: src/pages/DumpEdit.tsx:217
msgid "← Back to all dumps"
msgstr "← Back to all dumps"
#: src/pages/UserDumps.tsx:74
#: src/pages/UserPlaylists.tsx:240
#: src/pages/UserUpvoted.tsx:60
msgid "← Back to profile"
msgstr "← Back to profile"
#: src/components/profile/ProfileOwnActions.tsx:80
msgid "+ Invite someone"
msgstr "+ Invite someone"
#: src/components/playlist/PlaylistMembershipPanel.tsx:107
msgid "+ New playlist"
msgstr "+ New playlist"
#: src/pages/Dump.tsx:391
msgid "+ Playlist"
msgstr "+ Playlist"
#. placeholder {0}: d.commenterUsername
#. placeholder {1}: d.dumpTitle
#: src/pages/Notifications.tsx:199
msgid "<0>{0}</0> commented on <1>{1}</1>"
msgstr "<0>{0}</0> commented on <1>{1}</1>"
#. placeholder {0}: d.followerUsername
#. placeholder {1}: d.playlistTitle
#: src/pages/Notifications.tsx:159
msgid "<0>{0}</0> followed your playlist <1>{1}</1>"
msgstr "<0>{0}</0> followed your playlist <1>{1}</1>"
#. placeholder {0}: d.likerUsername
#. placeholder {1}: d.dumpTitle
#: src/pages/Notifications.tsx:209
msgid "<0>{0}</0> liked your comment on <1>{1}</1>"
msgstr "<0>{0}</0> liked your comment on <1>{1}</1>"
#. placeholder {0}: d.mentionerUsername
#: src/pages/Notifications.tsx:225
msgid "<0>{0}</0> mentioned you in <1>{where}</1>"
msgstr "<0>{0}</0> mentioned you in <1>{where}</1>"
#. placeholder {0}: d.dumperUsername
#. placeholder {1}: d.dumpTitle
#: src/pages/Notifications.tsx:169
msgid "<0>{0}</0> posted <1>{1}</1>"
msgstr "<0>{0}</0> posted <1>{1}</1>"
#. placeholder {0}: d.followerUsername
#: src/pages/Notifications.tsx:150
msgid "<0>{0}</0> started following you"
msgstr "<0>{0}</0> started following you"
#. placeholder {0}: d.voterUsername
#. placeholder {1}: d.dumpTitle
#: src/pages/Notifications.tsx:189
msgid "<0>{0}</0> upvoted <1>{1}</1>"
msgstr "<0>{0}</0> upvoted <1>{1}</1>"
#. placeholder {0}: d.dumpTitle
#. placeholder {1}: d.playlistTitle
#: src/pages/Notifications.tsx:179
msgid "<0>{0}</0> was added to <1>{1}</1>"
msgstr "<0>{0}</0> was added to <1>{1}</1>"
#: src/components/chat/ChatModal.tsx:755
msgid "1 new message"
msgstr "1 new message"
#: src/pages/Notifications.tsx:220
msgid "a comment"
msgstr "a comment"
#: src/pages/Notifications.tsx:223
msgid "a post"
msgstr "a post"
#: src/components/profile/ProfileSettingsTab.tsx:69
msgid "Account"
msgstr "Account"
#: src/components/comment/CommentThread.tsx:102
msgid "Add a comment…"
msgstr "Add a comment…"
#: src/components/category/CategoryManager.tsx:104
#: src/components/category/CategoryManager.tsx:105
msgid "Add category"
msgstr "Add category"
#: src/components/profile/ProfileHeader.tsx:152
msgid "Add email…"
msgstr "Add email…"
#: src/components/shared/ImagePicker.tsx:63
msgid "Add image"
msgstr "Add image"
#: src/components/dump/create/DumpCreateModal.tsx:464
#: src/components/playlist/AddToPlaylistModal.tsx:29
msgid "Add to playlist"
msgstr "Add to playlist"
#. js-lingui-explicit-id
#: api/mail/digest.ts:244
msgid "email.digest.addedTo"
msgstr "added to {playlist}"
#: src/components/profile/RoleSwitcher.tsx:24
msgid "Admin"
msgstr "Admin"
#: src/components/category/CategorySwitcher.tsx:84
#: src/components/category/CategorySwitcher.tsx:87
msgid "All"
msgstr "All"
#. placeholder {0}: first.username
#. placeholder {1}: relativeTime(first.createdAt)
#: src/components/dump/create/DuplicateNotice.tsx:39
msgid "Already dumped by {0} {1}"
msgstr "Already dumped by {0} {1}"
#: src/pages/UserRegister.tsx:175
msgid "Already have an account? <0>Log in</0>"
msgstr "Already have an account? <0>Log in</0>"
#: src/utils/shared/api.ts:35
msgid "An unexpected error occurred."
msgstr "An unexpected error occurred."
#. js-lingui-explicit-id
#: api/mail/digest.ts:260
msgid "email.digest.andMore"
msgstr "and {n} more"
#: src/components/profile/ProfileSettingsTab.tsx:82
msgid "Appearance"
msgstr "Appearance"
#. placeholder {0}: VALIDATION.PASSWORD_MIN
#: src/components/profile/ChangePasswordModal.tsx:102
#: src/pages/ResetPassword.tsx:121
#: src/pages/UserRegister.tsx:164
msgid "At least {0} characters"
msgstr "At least {0} characters"
#: src/components/form/RichTextField.tsx:66
msgid "At most {maxLength} characters."
msgstr "At most {maxLength} characters."
#: src/components/profile/ProfileSettingsTab.tsx:34
msgid "Auto"
msgstr "Auto"
#: src/pages/ResetPassword.tsx:71
#: src/pages/ResetPassword.tsx:144
msgid "Back to login"
msgstr "Back to login"
#. js-lingui-explicit-id
#: api/mail/digest.ts:226
msgid "email.digest.by"
msgstr "by @{username}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:266
msgid "email.digest.playlistMeta"
msgstr "by @{username} · {n, plural, one {# dump} other {# dumps}}"
#: 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 "Can't connect to the live updates server. Upvotes and notifications may not sync until it reconnects."
#: src/components/category/CategoryManager.tsx:225
#: src/components/category/CategoryManager.tsx:226
#: src/components/chat/ChatEditBox.tsx:88
#: src/components/comment/CommentForm.tsx:127
#: src/components/dump/create/DumpCreateModal.tsx:751
#: src/components/form/FormActions.tsx:42
#: src/components/playlist/PlaylistEditForm.tsx:205
#: src/components/profile/DescriptionEditor.tsx:97
#: src/components/profile/EmailEditor.tsx:83
#: src/components/shared/ConfirmModal.tsx:63
#: src/pages/Dump.tsx:432
#: src/pages/DumpEdit.tsx:542
msgid "Cancel"
msgstr "Cancel"
#: src/components/playlist/PlaylistDumpList.tsx:118
msgid "Cancel removal"
msgstr "Cancel removal"
#: src/components/chat/ChatModal.tsx:816
#: src/components/chat/ChatModal.tsx:817
msgid "Cancel reply"
msgstr "Cancel reply"
#: src/components/layout/AppHeader.tsx:162
msgid "Cancel search"
msgstr "Cancel search"
#: src/components/category/CategorySelect.tsx:33
#: src/components/profile/ProfileManageTab.tsx:49
msgid "Categories"
msgstr "Categories"
#: src/components/category/CategorySwitcher.tsx:107
msgid "Category"
msgstr "Category"
#: src/components/profile/ProfileHeader.tsx:93
msgid "Change avatar"
msgstr "Change avatar"
#: src/components/shared/ImagePicker.tsx:63
msgid "Change image"
msgstr "Change image"
#: src/components/profile/ChangePasswordModal.tsx:67
#: src/components/profile/ChangePasswordModal.tsx:121
msgid "Change password"
msgstr "Change password"
#: src/components/profile/ProfileSettingsTab.tsx:77
msgid "Change password…"
msgstr "Change password…"
#: src/components/editor/EmojiPickerPopup.tsx:108
msgid "Change skin tone"
msgstr "Change skin tone"
#: 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 "Chat"
#: src/components/layout/ChatButton.tsx:25
#: src/components/layout/ChatFab.tsx:52
msgid "Chat ({unreadChatCount} unread)"
msgstr "Chat ({unreadChatCount} unread)"
#: src/pages/UserRegister.tsx:106
msgid "Checking invite…"
msgstr "Checking invite…"
#: src/components/profile/ChangePasswordModal.tsx:76
#: src/components/shared/Modal.tsx:76
msgid "Close"
msgstr "Close"
#: src/components/dump/create/DumpCreateModal.tsx:495
msgid "Close anyway"
msgstr "Close anyway"
#: src/components/editor/EmojiPickerPopup.tsx:113
msgid "Close emoji picker"
msgstr "Close emoji picker"
#: src/components/player/GlobalPlayer.tsx:262
msgid "Close player"
msgstr "Close player"
#: src/components/dump/create/DumpCreateModal.tsx:485
msgid "Close without posting? The attached file won't be kept — everything you typed will."
msgstr "Close without posting? The attached file won't be kept — everything you typed will."
#: src/components/player/GlobalPlayer.tsx:254
msgid "Collapse player"
msgstr "Collapse player"
#: src/components/profile/ProfileSettingsTab.tsx:91
msgid "Color scheme"
msgstr "Color scheme"
#. js-lingui-explicit-id
#: api/mail/digest.ts:424
msgid "email.digest.community"
msgstr "Community"
#: src/components/profile/ChangePasswordModal.tsx:109
#: src/pages/ResetPassword.tsx:128
msgid "Confirm new password"
msgstr "Confirm new password"
#: src/contexts/ws/WSProvider.tsx:754
msgid "Connection lost — this message may not have been sent"
msgstr "Connection lost — this message may not have been sent"
#: src/components/profile/ProfileOwnActions.tsx:105
msgid "Copied!"
msgstr "Copied!"
#: src/components/profile/ProfileOwnActions.tsx:105
msgid "Copy"
msgstr "Copy"
#: src/components/profile/ChangePasswordModal.tsx:118
msgid "Could not change password"
msgstr "Could not change password"
#: src/utils/shared/api.ts:33
msgid "Could not connect to the server. Check your connection and try again."
msgstr "Could not connect to the server. Check your connection and try again."
#: src/pages/DumpEdit.tsx:530
#: src/pages/UserPlaylists.tsx:264
msgid "Could not delete"
msgstr "Could not delete"
#: src/pages/DumpEdit.tsx:490
msgid "Could not save"
msgstr "Could not save"
#: src/components/dump/create/DumpCreateModal.tsx:606
msgid "Couldn't load a preview for this link — check it, or post it as-is and refresh the preview later."
msgstr "Couldn't load a preview for this link — check it, or post it as-is and refresh the preview later."
#: src/components/chat/ChatModal.tsx:642
msgid "Couldn't load the chat."
msgstr "Couldn't load the chat."
#: src/pages/Unsubscribe.tsx:111
msgid "Couldn't unsubscribe"
msgstr "Couldn't unsubscribe"
#: src/components/social/FollowButton.tsx:112
msgid "Couldn't update. Try again."
msgstr "Couldn't update. Try again."
#: src/components/playlist/PlaylistCreateForm.tsx:112
msgid "Create"
msgstr "Create"
#: src/components/playlist/PlaylistCreateForm.tsx:112
msgid "Create & Add"
msgstr "Create & Add"
#. placeholder {0}: created.items.length
#. placeholder {1}: created.hasMore ? "+" : ""
#: src/pages/UserPlaylists.tsx:269
msgid "Created ({0}{1})"
msgstr "Created ({0}{1})"
#: src/components/playlist/PlaylistCreateForm.tsx:111
msgid "Creating…"
msgstr "Creating…"
#: src/components/profile/ChangePasswordModal.tsx:87
msgid "Current password"
msgstr "Current password"
#: src/components/profile/ProfileSettingsTab.tsx:36
msgid "Dark"
msgstr "Dark"
#: src/components/profile/ProfileSettingsTab.tsx:102
msgid "Default tab"
msgstr "Default tab"
#: src/components/category/CategoryManager.tsx:236
#: src/components/category/CategoryManager.tsx:237
#: src/components/chat/ChatMessageItem.tsx:114
#: src/components/chat/ChatMessageItem.tsx:115
#: src/components/chat/ChatMessageItem.tsx:213
#: src/components/comment/CommentNode.tsx:263
#: src/components/comment/CommentNode.tsx:269
#: src/components/playlist/PlaylistEditForm.tsx:201
#: src/components/shared/ConfirmModal.tsx:34
msgid "Delete"
msgstr "Delete"
#: src/components/category/CategoryManager.tsx:253
msgid "Delete category"
msgstr "Delete category"
#. placeholder {0}: category.name
#: src/components/category/CategoryManager.tsx:252
msgid "Delete category \"{0}\"? This cannot be undone."
msgstr "Delete category \"{0}\"? This cannot be undone."
#: src/pages/DumpEdit.tsx:299
#: src/pages/DumpEdit.tsx:538
msgid "Delete dump"
msgstr "Delete dump"
#. placeholder {0}: res.status
#: src/pages/DumpEdit.tsx:178
msgid "Delete failed ({0})"
msgstr "Delete failed ({0})"
#: src/components/playlist/PlaylistCard.tsx:141
#: src/pages/PlaylistDetail.tsx:136
#: src/pages/UserPlaylists.tsx:327
msgid "Delete playlist"
msgstr "Delete playlist"
#: src/components/comment/CommentNode.tsx:268
msgid "Delete this comment?"
msgstr "Delete this comment?"
#: src/pages/DumpEdit.tsx:298
msgid "Delete this dump? This cannot be undone."
msgstr "Delete this dump? This cannot be undone."
#: src/components/chat/ChatMessageItem.tsx:212
msgid "Delete this message?"
msgstr "Delete this message?"
#: src/pages/PlaylistDetail.tsx:135
#: src/pages/UserPlaylists.tsx:326
msgid "Delete this playlist? This cannot be undone."
msgstr "Delete this playlist? This cannot be undone."
#: src/components/chat/ReplyRef.tsx:49
msgid "deleted message"
msgstr "deleted message"
#: src/components/playlist/PlaylistCreateForm.tsx:104
#: src/components/playlist/PlaylistEditForm.tsx:173
msgid "Description (optional)"
msgstr "Description (optional)"
#: src/components/chat/PendingItem.tsx:100
msgid "Discard"
msgstr "Discard"
#: src/components/chat/ChatModal.tsx:720
msgid "Disconnected — reconnecting…"
msgstr "Disconnected — reconnecting…"
#: src/components/chat/ChatModal.tsx:792
#: src/components/chat/ChatModal.tsx:793
msgid "Dismiss"
msgstr "Dismiss"
#: src/components/dump/create/DumpCreateModal.tsx:545
msgid "Done"
msgstr "Done"
#. placeholder {0}: dump.fileName
#: src/components/dump/FilePreview.tsx:358
msgid "Download {0}"
msgstr "Download {0}"
#: src/components/form/FileDropZone.tsx:55
msgid "Drop a file here"
msgstr "Drop a file here"
#: src/components/dump/create/DumpCreateModal.tsx:652
msgid "Drop a file here, or paste one"
msgstr "Drop a file here, or paste one"
#: src/pages/DumpEdit.tsx:481
msgid "Drop a replacement here"
msgstr "Drop a replacement here"
#: src/components/layout/AppHeader.tsx:201
msgid "Dump"
msgstr "Dump"
#: src/components/dump/create/DumpCreateModal.tsx:764
msgid "Dump it"
msgstr "Dump it"
#: src/components/dump/create/DumpCreateModal.tsx:523
msgid "Dumped!"
msgstr "Dumped!"
#: src/pages/Search.tsx:116
#: src/pages/UserDumps.tsx:88
#: src/pages/UserPublicProfile.tsx:189
msgid "Dumps"
msgstr "Dumps"
#. placeholder {0}: dumps.items.length
#. placeholder {1}: dumps.hasMore ? "+" : ""
#: src/components/profile/ProfileDumpsTab.tsx:37
msgid "Dumps ({0}{1})"
msgstr "Dumps ({0}{1})"
#: src/pages/Notifications.tsx:375
msgid "Earlier"
msgstr "Earlier"
#: src/components/chat/ChatMessageItem.tsx:103
#: src/components/chat/ChatMessageItem.tsx:104
#: src/components/chat/PendingItem.tsx:93
#: src/components/comment/CommentNode.tsx:254
#: src/components/playlist/PlaylistHeader.tsx:58
#: src/pages/Dump.tsx:550
msgid "Edit"
msgstr "Edit"
#. placeholder {0}: category.name
#: src/components/category/CategoryManager.tsx:84
msgid "Edit {0}"
msgstr "Edit {0}"
#: src/components/profile/ProfileDescription.tsx:58
msgid "Edit description"
msgstr "Edit description"
#: src/components/profile/ProfileHeader.tsx:150
msgid "Edit email"
msgstr "Edit email"
#: src/components/dump/create/TitleField.tsx:69
#: src/pages/Dump.tsx:448
msgid "Edit title"
msgstr "Edit title"
#: src/components/chat/ChatMessageItem.tsx:127
msgid "edited"
msgstr "edited"
#. placeholder {0}: relativeTime(comment.updatedAt)
#. placeholder {0}: relativeTime(dump.updatedAt)
#. placeholder {0}: relativeTime(message.updatedAt)
#: src/components/chat/ChatMessageItem.tsx:128
#: src/components/comment/CommentNode.tsx:203
#: src/components/playlist/PlaylistHeader.tsx:93
#: src/pages/Dump.tsx:491
msgid "edited {0}"
msgstr "edited {0}"
#. placeholder {0}: comment.updatedAt.toLocaleString()
#. placeholder {0}: dump.updatedAt.toLocaleString()
#. placeholder {0}: message.updatedAt.toLocaleString()
#: src/components/chat/ChatMessageItem.tsx:124
#: src/components/comment/CommentNode.tsx:201
#: src/components/playlist/PlaylistHeader.tsx:91
#: src/pages/Dump.tsx:489
msgid "Edited {0}"
msgstr "Edited {0}"
#: src/pages/DumpEdit.tsx:242
msgid "Editing"
msgstr "Editing"
#. placeholder {0}: state.dump.title
#: src/pages/DumpEdit.tsx:72
msgid "Editing {0}"
msgstr "Editing {0}"
#: src/components/profile/ProfileSettingsTab.tsx:126
msgid "Email"
msgstr "Email"
#: src/pages/UserRegister.tsx:152
msgid "Email address"
msgstr "Email address"
#: src/pages/Search.tsx:149
msgid "Enter a query to search."
msgstr "Enter a query to search."
#: src/components/player/GlobalPlayer.tsx:254
msgid "Expand player"
msgstr "Expand player"
#: src/components/category/CategoryManager.tsx:246
msgid "Failed to create category"
msgstr "Failed to create category"
#: src/components/playlist/PlaylistCreateForm.tsx:109
msgid "Failed to create playlist"
msgstr "Failed to create playlist"
#: src/components/category/CategoryManager.tsx:169
msgid "Failed to delete"
msgstr "Failed to delete"
#: src/components/profile/ProfileOwnActions.tsx:49
#: src/components/profile/ProfileOwnActions.tsx:52
#: src/components/profile/ProfileOwnActions.tsx:114
msgid "Failed to generate invite"
msgstr "Failed to generate invite"
#: src/components/shared/ListState.tsx:43
#: src/pages/Notifications.tsx:349
msgid "Failed to load"
msgstr "Failed to load"
#: src/components/dump/create/DumpCreateModal.tsx:554
msgid "Failed to post"
msgstr "Failed to post"
#: src/components/comment/CommentThread.tsx:101
msgid "Failed to post comment"
msgstr "Failed to post comment"
#: src/components/comment/CommentNode.tsx:289
msgid "Failed to post reply"
msgstr "Failed to post reply"
#: src/components/playlist/PlaylistEditForm.tsx:193
#: src/components/profile/DescriptionEditor.tsx:99
#: src/components/profile/EmailEditor.tsx:86
msgid "Failed to save"
msgstr "Failed to save"
#: src/components/category/CategoryManager.tsx:247
msgid "Failed to save category"
msgstr "Failed to save category"
#: src/components/comment/CommentNode.tsx:216
msgid "Failed to save edit"
msgstr "Failed to save edit"
#: src/components/profile/ProfileHeader.tsx:161
msgid "Failed to update avatar"
msgstr "Failed to update avatar"
#: src/components/profile/RoleSwitcher.tsx:92
msgid "Failed to update role"
msgstr "Failed to update role"
#: src/components/profile/ProfileSettingsTab.tsx:100
msgid "Feeds"
msgstr "Feeds"
#: src/components/dump/create/DumpCreateModal.tsx:593
msgid "Fetching preview…"
msgstr "Fetching preview…"
#: src/components/dump/create/DumpCreateModal.tsx:416
msgid "File too large (max {max})."
msgstr "File too large (max {max})."
#: src/components/social/FollowButton.tsx:62
#: src/components/social/FollowButton.tsx:102
msgid "Follow"
msgstr "Follow"
#: src/components/social/FollowButton.tsx:60
msgid "Follow {targetUsername}"
msgstr "Follow {targetUsername}"
#: src/components/social/FollowButton.tsx:100
msgid "Follow playlist"
msgstr "Follow playlist"
#: src/components/feed/FollowedFeed.tsx:151
msgid "Follow some public playlists to see their dumps here."
msgstr "Follow some public playlists to see their dumps here."
#: src/components/feed/FollowedFeed.tsx:143
msgid "Follow some users to see their dumps here."
msgstr "Follow some users to see their dumps here."
#: src/components/feed/FeedTabBar.tsx:49
#: src/components/profile/ProfileSettingsTab.tsx:43
#: src/pages/UserPublicProfile.tsx:191
msgid "Followed"
msgstr "Followed"
#. placeholder {0}: followed.items.length
#. placeholder {1}: followed.hasMore ? "+" : ""
#: src/pages/UserPlaylists.tsx:300
msgid "Followed ({0}{1})"
msgstr "Followed ({0}{1})"
#: src/components/profile/ProfileFollowedTab.tsx:100
msgid "Followed playlists"
msgstr "Followed playlists"
#: src/components/profile/ProfileFollowedTab.tsx:68
#: src/components/social/FollowButton.tsx:62
#: src/components/social/FollowButton.tsx:102
msgid "Following"
msgstr "Following"
#. js-lingui-explicit-id
#: api/mail/digest.ts:342
msgid "email.digest.forYou"
msgstr "For you"
#: src/pages/UserLogin.tsx:97
msgid "Forgot password?"
msgstr "Forgot password?"
#: src/components/feed/FollowedFeed.tsx:132
msgid "From people"
msgstr "From people"
#. js-lingui-explicit-id
#: api/mail/digest.ts:379
msgid "email.digest.network"
msgstr "From people you follow"
#: src/components/feed/FollowedFeed.tsx:133
msgid "From playlists"
msgstr "From playlists"
#: src/components/player/MediaPlayer.tsx:373
msgid "Fullscreen"
msgstr "Fullscreen"
#: src/pages/NotFound.tsx:24
msgid "Go home"
msgstr "Go home"
#: src/pages/ResetPassword.tsx:93
msgid "Go to login"
msgstr "Go to login"
#. js-lingui-explicit-id
#: api/mail/password-reset.ts:32
msgid "email.reset.hi"
msgstr "Hi {username},"
#: src/components/feed/FeedTabBar.tsx:45
#: src/components/profile/ProfileSettingsTab.tsx:40
msgid "Hot"
msgstr "Hot"
#: src/pages/UserLogin.tsx:136
msgid "If that address is registered you'll receive a reset link shortly."
msgstr "If that address is registered you'll receive a reset link shortly."
#. js-lingui-explicit-id
#: api/mail/password-reset.ts:48
msgid "email.reset.fallback"
msgstr "If the button doesn't work, paste this link into your browser:"
#. js-lingui-explicit-id
#: api/mail/password-reset.ts:56
msgid "email.reset.ignore"
msgstr "If you didn't ask for this, ignore this email. Your password stays the same."
#: src/utils/chat/message.ts:43
msgid "image"
msgstr "image"
#: src/pages/Dump.tsx:570
msgid "In collections"
msgstr "In collections"
#. js-lingui-explicit-id
#: api/mail/digest.ts:495
msgid "email.digest.inChat"
msgstr "In the chat"
#: src/components/editor/TextEditor.tsx:544
#: src/components/editor/TextEditor.tsx:546
msgid "Insert emoji"
msgstr "Insert emoji"
#: src/pages/UserRegister.tsx:117
msgid "Invalid invite"
msgstr "Invalid invite"
#: src/pages/ResetPassword.tsx:61
#: src/pages/Unsubscribe.tsx:61
msgid "Invalid link"
msgstr "Invalid link"
#: src/components/profile/ProfileOwnActions.tsx:88
#: src/components/profile/ProfileOwnActions.tsx:95
msgid "Invite link"
msgstr "Invite link"
#: src/components/profile/ProfileHeader.tsx:115
msgid "invited by"
msgstr "invited by"
#. js-lingui-explicit-id
#: api/mail/digest.ts:254
msgid "email.digest.invitedBy"
msgstr "invited by @{username}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:253
msgid "email.digest.invitedByYou"
msgstr "invited by you"
#: src/components/profile/ProfileInviteesTab.tsx:76
#: src/pages/UserPublicProfile.tsx:192
msgid "Invitees"
msgstr "Invitees"
#: src/components/feed/FeedTabBar.tsx:47
#: src/components/profile/ProfileSettingsTab.tsx:42
msgid "Journal"
msgstr "Journal"
#: src/components/dump/create/DumpCreateModal.tsx:492
msgid "Keep editing"
msgstr "Keep editing"
#: src/components/profile/ProfileSettingsTab.tsx:35
msgid "Light"
msgstr "Light"
#: src/components/social/LikeButton.tsx:54
msgid "Like"
msgstr "Like"
#: src/components/dump/create/DumpCreateModal.tsx:568
msgid "Link"
msgstr "Link"
#: src/components/dump/create/StepIndicator.tsx:19
msgid "Link or file"
msgstr "Link or file"
#: src/contexts/ws/WSProvider.tsx:760
msgid "Live updates are temporarily disconnected. Trying to reconnect…"
msgstr "Live updates are temporarily disconnected. Trying to reconnect…"
#: src/components/layout/AppHeader.tsx:236
msgid "Live updates unavailable."
msgstr "Live updates unavailable."
#: src/components/shared/LoadMoreButton.tsx:32
msgid "Load more"
msgstr "Load more"
#: src/components/chat/ChatModal.tsx:741
msgid "Load older messages"
msgstr "Load older messages"
#: src/pages/Dump.tsx:290
#: src/pages/DumpEdit.tsx:193
msgid "Loading dump…"
msgstr "Loading dump…"
#: src/components/chat/ChatModal.tsx:634
msgid "Loading messages…"
msgstr "Loading messages…"
#: src/components/feed/FeedFooter.tsx:34
msgid "Loading more…"
msgstr "Loading more…"
#: src/pages/PlaylistDetail.tsx:64
msgid "Loading playlist…"
msgstr "Loading playlist…"
#: src/pages/UserPublicProfile.tsx:142
msgid "Loading profile…"
msgstr "Loading profile…"
#: src/components/category/CategoryManager.tsx:60
#: src/components/chat/ChatModal.tsx:740
#: src/components/editor/EmojiPickerPopup.tsx:125
#: src/components/playlist/PlaylistMembershipPanel.tsx:45
#: src/components/shared/ListState.tsx:38
#: src/components/shared/LoadMoreButton.tsx:32
#: src/components/social/UserListPopover.tsx:150
#: src/pages/Notifications.tsx:345
#: src/pages/UserDumps.tsx:62
#: src/pages/UserPlaylists.tsx:228
#: src/pages/UserUpvoted.tsx:48
msgid "Loading…"
msgstr "Loading…"
#: src/components/layout/AppHeader.tsx:209
#: src/pages/UserLogin.tsx:41
#: src/pages/UserLogin.tsx:67
#: src/pages/UserLogin.tsx:86
msgid "Log in"
msgstr "Log in"
#: src/components/social/LikeButton.tsx:55
msgid "Log in to like"
msgstr "Log in to like"
#: src/components/social/VoteButton.tsx:53
msgid "Log in to vote"
msgstr "Log in to vote"
#: src/components/profile/ProfileHeader.tsx:174
#: src/pages/UserPublicProfile.tsx:163
msgid "Log out"
msgstr "Log out"
#: src/pages/UserLogin.tsx:85
msgid "Logging in…"
msgstr "Logging in…"
#: src/pages/UserLogin.tsx:72
msgid "Login failed"
msgstr "Login failed"
#: src/pages/UserPublicProfile.tsx:197
msgid "Manage"
msgstr "Manage"
#: src/components/form/FileDropZone.tsx:169
msgid "Max {limit}"
msgstr "Max {limit}"
#: src/components/profile/RoleSwitcher.tsx:23
msgid "Moderator"
msgstr "Moderator"
#. js-lingui-explicit-id
#: api/mail/digest.ts:311
#: src/components/profile/ProfileSettingsTab.tsx:137
msgid "digest.monthly"
msgstr "Monthly recap"
#: src/components/player/MediaPlayer.tsx:346
msgid "Mute"
msgstr "Mute"
#: src/components/category/CategoryManager.tsx:192
#: src/components/category/CategoryManager.tsx:193
msgid "Name"
msgstr "Name"
#: src/pages/Notifications.tsx:338
msgid "new"
msgstr "new"
#: src/components/chat/ChatModal.tsx:669
#: src/components/feed/FeedTabBar.tsx:46
#: src/components/profile/ProfileSettingsTab.tsx:41
msgid "New"
msgstr "New"
#: src/components/dump/create/DumpCreateModal.tsx:464
#: src/components/dump/NewDumpButton.tsx:27
#: src/components/layout/DumpFab.tsx:66
#: src/components/layout/DumpFab.tsx:67
msgid "New dump"
msgstr "New dump"
#. js-lingui-explicit-id
#: api/mail/digest.ts:455
msgid "email.digest.newMembers"
msgstr "New members"
#: src/components/profile/ChangePasswordModal.tsx:95
#: src/pages/ResetPassword.tsx:113
msgid "New password"
msgstr "New password"
#: src/components/playlist/NewPlaylistButton.tsx:49
#: src/components/playlist/NewPlaylistButton.tsx:56
msgid "New playlist"
msgstr "New playlist"
#. js-lingui-explicit-id
#: api/mail/digest.ts:475
msgid "email.digest.newPlaylists"
msgstr "New public playlists"
#: src/components/dump/create/DumpCreateModal.tsx:763
msgid "Next →"
msgstr "Next →"
#: src/components/player/GlobalPlayer.tsx:244
msgid "Next track"
msgstr "Next track"
#: src/components/playlist/PlaylistDumpList.tsx:46
msgid "No dumps in this playlist yet."
msgstr "No dumps in this playlist yet."
#: src/pages/Search.tsx:165
msgid "No dumps match \"{q}\"."
msgstr "No dumps match \"{q}\"."
#: src/components/feed/DumpFeed.tsx:76
#: src/components/feed/JournalFeed.tsx:36
msgid "No dumps yet. Be the first!"
msgstr "No dumps yet. Be the first!"
#: src/components/editor/EmojiPickerPopup.tsx:128
msgid "No emoji found."
msgstr "No emoji found."
#: src/components/profile/ProfileFollowedTab.tsx:110
#: src/pages/UserPlaylists.tsx:309
msgid "No followed playlists yet."
msgstr "No followed playlists yet."
#: src/components/profile/ProfileInviteesTab.tsx:82
msgid "No invitees yet."
msgstr "No invitees yet."
#: src/components/chat/ChatModal.tsx:653
msgid "No messages yet. Say hello!"
msgstr "No messages yet. Say hello!"
#: src/components/social/UserListPopover.tsx:158
msgid "No one yet."
msgstr "No one yet."
#: src/pages/Search.tsx:206
msgid "No playlists match \"{q}\"."
msgstr "No playlists match \"{q}\"."
#: src/components/playlist/PlaylistMembershipPanel.tsx:51
#: src/components/profile/ProfilePlaylistsTab.tsx:52
#: src/pages/UserPlaylists.tsx:278
msgid "No playlists yet."
msgstr "No playlists yet."
#: src/contexts/ws/WSProvider.tsx:929
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:180
msgid "No users match \"{q}\"."
msgstr "No users match \"{q}\"."
#: src/components/profile/ProfileFollowedTab.tsx:74
msgid "Not following anyone yet."
msgstr "Not following anyone yet."
#: src/components/profile/ProfileDumpsTab.tsx:46
#: src/components/profile/ProfileDumpsTab.tsx:60
#: src/pages/Notifications.tsx:356
#: src/pages/UserDumps.tsx:94
#: src/pages/UserUpvoted.tsx:79
msgid "Nothing here yet."
msgstr "Nothing here yet."
#: src/components/layout/NotificationBell.tsx:54
#: src/components/profile/ProfileSettingsTab.tsx:111
#: src/pages/Notifications.tsx:282
#: src/pages/Notifications.tsx:334
msgid "Notifications"
msgstr "Notifications"
#: src/components/layout/NotificationBell.tsx:53
msgid "Notifications ({unreadNotificationCount} unread)"
msgstr "Notifications ({unreadNotificationCount} unread)"
#: src/components/profile/ProfileSettingsTab.tsx:48
msgid "Off"
msgstr "Off"
#: src/components/profile/ProfileSettingsTab.tsx:47
msgid "On"
msgstr "On"
#. js-lingui-explicit-id
#: api/mail/welcome.ts:49
msgid "email.welcome.digests"
msgstr "Once a week you'll get a digest of what happened here, and once a month a recap of the most upvoted dumps. You can turn either off in your settings."
#: src/components/editor/TextEditor.tsx:359
msgid "Only images can be dropped here."
msgstr "Only images can be dropped here."
#: src/pages/DumpEdit.tsx:103
msgid "Only its poster or a moderator can edit this dump."
msgstr "Only its poster or a moderator can edit this dump."
#. js-lingui-explicit-id
#: api/mail/welcome.ts:41
msgid "email.welcome.button"
msgstr "Open {site}"
#. placeholder {0}: richContent.siteName
#: src/components/dump/RichContentCard.tsx:122
msgid "Open on {0}"
msgstr "Open on {0}"
#: src/components/dump/RichContentCard.tsx:123
msgid "Open source"
msgstr "Open source"
#. js-lingui-explicit-id
#: api/mail/digest.ts:506
msgid "email.digest.openChat"
msgstr "Open the chat"
#: src/components/form/FileDropZone.tsx:163
msgid "or <0>browse files</0>"
msgstr "or <0>browse files</0>"
#: src/pages/NotFound.tsx:16
msgid "Page not found"
msgstr "Page not found"
#: src/components/profile/ProfileSettingsTab.tsx:71
#: src/pages/UserLogin.tsx:82
msgid "Password"
msgstr "Password"
#. placeholder {0}: VALIDATION.PASSWORD_MIN
#: src/pages/UserRegister.tsx:158
msgid "Password (min. {0} characters)"
msgstr "Password (min. {0} characters)"
#: src/components/profile/ChangePasswordModal.tsx:72
msgid "Password changed successfully."
msgstr "Password changed successfully."
#: src/pages/ResetPassword.tsx:83
msgid "Password updated"
msgstr "Password updated"
#: src/components/profile/ChangePasswordModal.tsx:115
#: src/pages/ResetPassword.tsx:133
msgid "Passwords do not match"
msgstr "Passwords do not match"
#: src/components/dump/create/DumpCreateModal.tsx:586
msgid "Paste a link…"
msgstr "Paste a link…"
#: src/components/dump/FilePreview.tsx:134
#: src/components/dump/FilePreview.tsx:310
#: src/components/dump/RichContentCard.tsx:103
#: src/components/player/MediaPlayer.tsx:330
msgid "Pause"
msgstr "Pause"
#: src/components/dump/create/DumpCreateModal.tsx:504
msgid "Picked up where you left off."
msgstr "Picked up where you left off."
#: 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 "Play"
#: src/components/playlist/PlaylistEditForm.tsx:157
msgid "Playlist title"
msgstr "Playlist title"
#: src/components/dump/create/StepIndicator.tsx:21
#: src/components/layout/AppHeader.tsx:182
#: src/components/layout/UserMenu.tsx:78
#: src/pages/Search.tsx:119
#: src/pages/UserPlaylists.tsx:254
#: src/pages/UserPublicProfile.tsx:190
msgid "Playlists"
msgstr "Playlists"
#. placeholder {0}: playlists.items.length
#. placeholder {1}: playlists.hasMore ? "+" : ""
#: src/components/profile/ProfilePlaylistsTab.tsx:35
msgid "Playlists ({0}{1})"
msgstr "Playlists ({0}{1})"
#: src/components/comment/CommentThread.tsx:99
msgid "Post comment"
msgstr "Post comment"
#: src/components/comment/CommentNode.tsx:287
msgid "Post reply"
msgstr "Post reply"
#: src/components/comment/CommentNode.tsx:288
#: src/components/comment/CommentThread.tsx:100
#: src/components/dump/create/DumpCreateModal.tsx:757
msgid "Posting…"
msgstr "Posting…"
#: src/components/player/GlobalPlayer.tsx:228
msgid "Previous track"
msgstr "Previous track"
#: src/components/dump/DumpCard.tsx:148
#: src/components/dump/JournalCard.tsx:142
#: src/components/playlist/PlaylistCard.tsx:103
#: src/components/playlist/PlaylistHeader.tsx:75
#: src/components/playlist/PlaylistMembershipPanel.tsx:81
#: src/pages/Dump.tsx:497
msgid "private"
msgstr "private"
#: src/components/form/SegmentedField.tsx:65
msgid "Private"
msgstr "Private"
#: src/components/playlist/PlaylistCard.tsx:102
#: src/components/playlist/PlaylistHeader.tsx:75
msgid "public"
msgstr "public"
#: src/components/form/SegmentedField.tsx:64
msgid "Public"
msgstr "Public"
#: src/pages/DumpEdit.tsx:275
msgid "Refresh metadata"
msgstr "Refresh metadata"
#: src/components/player/GlobalPlayer.tsx:324
msgid "Refreshing stream…"
msgstr "Refreshing stream…"
#: src/pages/DumpEdit.tsx:274
msgid "Refreshing…"
msgstr "Refreshing…"
#: src/pages/UserRegister.tsx:45
#: src/pages/UserRegister.tsx:129
#: src/pages/UserRegister.tsx:169
msgid "Register"
msgstr "Register"
#: src/pages/UserRegister.tsx:168
msgid "Registering…"
msgstr "Registering…"
#: src/pages/UserRegister.tsx:134
msgid "Registration failed"
msgstr "Registration failed"
#: src/pages/Dump.tsx:561
msgid "Related"
msgstr "Related"
#: src/components/form/FileDropZone.tsx:139
msgid "Remove file"
msgstr "Remove file"
#: src/components/playlist/PlaylistDumpList.tsx:108
msgid "Remove from playlist"
msgstr "Remove from playlist"
#: src/components/social/LikeButton.tsx:54
msgid "Remove like"
msgstr "Remove like"
#: src/components/social/VoteButton.tsx:52
msgid "Remove vote"
msgstr "Remove vote"
#: src/pages/DumpEdit.tsx:473
msgid "Replace file"
msgstr "Replace file"
#: src/components/chat/ChatMessageItem.tsx:93
#: src/components/chat/ChatMessageItem.tsx:94
#: src/components/comment/CommentNode.tsx:242
msgid "Reply"
msgstr "Reply"
#: src/components/chat/ChatModal.tsx:804
msgid "Replying to"
msgstr "Replying to"
#: src/pages/UserLogin.tsx:148
msgid "Request failed"
msgstr "Request failed"
#: src/pages/ResetPassword.tsx:109
msgid "Reset failed"
msgstr "Reset failed"
#. js-lingui-explicit-id
#: api/mail/password-reset.ts:44
msgid "email.reset.button"
msgstr "Reset password"
#: src/pages/ResetPassword.tsx:34
msgid "Reset password"
msgstr "Reset password"
#: src/pages/DumpEdit.tsx:449
#: src/pages/DumpEdit.tsx:504
msgid "Reset to default"
msgstr "Reset to default"
#: src/components/dump/create/TitleField.tsx:80
#: src/components/dump/create/TitleField.tsx:81
msgid "Reset to the suggested title"
msgstr "Reset to the suggested title"
#. js-lingui-explicit-id
#: api/mail/password-reset.ts:71
msgid "email.reset.subject"
msgstr "Reset your {site} password"
#. js-lingui-explicit-id
#: api/mail/password-reset.ts:30
msgid "email.reset.title"
msgstr "Reset your password"
#: src/components/chat/PendingItem.tsx:86
#: src/pages/Dump.tsx:307
#: src/pages/DumpEdit.tsx:210
msgid "Retry"
msgstr "Retry"
#: src/components/profile/RoleSwitcher.tsx:84
msgid "Role"
msgstr "Role"
#: src/components/category/CategoryManager.tsx:216
#: src/components/chat/ChatEditBox.tsx:85
#: src/components/comment/CommentNode.tsx:214
#: src/components/playlist/PlaylistEditForm.tsx:212
#: src/components/profile/DescriptionEditor.tsx:89
#: src/components/profile/EmailEditor.tsx:75
#: src/pages/Dump.tsx:424
#: src/pages/DumpEdit.tsx:545
msgid "Save"
msgstr "Save"
#: src/components/comment/CommentNode.tsx:215
#: src/components/playlist/PlaylistEditForm.tsx:208
#: src/components/profile/ChangePasswordModal.tsx:120
#: src/components/profile/DescriptionEditor.tsx:86
#: src/components/profile/EmailEditor.tsx:72
#: src/pages/Dump.tsx:423
#: src/pages/ResetPassword.tsx:136
msgid "Saving…"
msgstr "Saving…"
#: src/components/layout/AppHeader.tsx:162
#: src/components/layout/SearchBar.tsx:82
#: src/pages/Search.tsx:65
msgid "Search"
msgstr "Search"
#: src/components/layout/SearchBar.tsx:78
msgid "Search dumps, users, playlists…"
msgstr "Search dumps, users, playlists…"
#: src/components/editor/EmojiPickerPopup.tsx:104
msgid "Search emoji"
msgstr "Search emoji"
#: src/components/editor/EmojiPickerPopup.tsx:103
msgid "Search emoji…"
msgstr "Search emoji…"
#: src/pages/Search.tsx:160
msgid "Search failed"
msgstr "Search failed"
#: src/pages/Search.tsx:155
msgid "Searching…"
msgstr "Searching…"
#: src/components/player/SeekBar.tsx:50
msgid "Seek"
msgstr "Seek"
#: src/components/chat/ChatModal.tsx:844
msgid "Send"
msgstr "Send"
#: src/pages/UserLogin.tsx:157
msgid "Send reset link"
msgstr "Send reset link"
#: src/components/chat/PendingItem.tsx:104
#: src/pages/UserLogin.tsx:156
msgid "Sending…"
msgstr "Sending…"
#: src/components/layout/AppHeader.tsx:198
msgid "Server unreachable"
msgstr "Server unreachable"
#: src/pages/ResetPassword.tsx:104
#: src/pages/ResetPassword.tsx:137
msgid "Set new password"
msgstr "Set new password"
#. js-lingui-explicit-id
#: api/mail/digest.ts:554
msgid "email.settings"
msgstr "Settings"
#: src/pages/UserPublicProfile.tsx:194
msgid "Settings"
msgstr "Settings"
#: src/components/chat/ChatModal.tsx:628
msgid "Several people are typing…"
msgstr "Several people are typing…"
#: src/components/profile/ProfileOwnActions.tsx:108
msgid "Single use, valid for 7 days."
msgstr "Single use, valid for 7 days."
#: src/components/category/CategoryManager.tsx:205
msgid "slug"
msgstr "slug"
#: src/components/editor/TextEditor.tsx:317
msgid "Some images couldn't be uploaded."
msgstr "Some images couldn't be uploaded."
#. js-lingui-explicit-id
#: api/mail/password-reset.ts:37
msgid "email.reset.body"
msgstr "Someone asked to reset the password of your {site} account. The button below lets you choose a new one. It works once, for {hours, plural, one {# hour} other {# hours}}."
#: 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 "Something went wrong"
#: src/components/profile/ProfileSettingsTab.tsx:113
msgid "Sounds"
msgstr "Sounds"
#: src/components/dump/create/DumpCreateModal.tsx:511
msgid "Start fresh"
msgstr "Start fresh"
#: src/components/profile/ProfileSettingsTab.tsx:84
msgid "Style"
msgstr "Style"
#: src/components/layout/SearchBar.tsx:88
msgid "Submit search"
msgstr "Submit search"
#: src/components/form/FileField.tsx:60
msgid "That file is over {limit}."
msgstr "That file is over {limit}."
#. js-lingui-explicit-id
#: api/mail/digest.ts:351
msgid "email.digest.theChat"
msgstr "the chat"
#: src/pages/Notifications.tsx:222
msgid "the chat"
msgstr "the chat"
#: src/hooks/playlist/usePlaylist.ts:161
msgid "The dump couldn't be removed. Try again."
msgstr "The dump couldn't be removed. Try again."
#: src/components/editor/TextEditor.tsx:318
msgid "The image couldn't be uploaded."
msgstr "The image couldn't be uploaded."
#. js-lingui-explicit-id
#: api/mail/password-reset.ts:76
msgid "email.reset.preheader"
msgstr "The link works once, for {hours, plural, one {# hour} other {# hours}}."
#. js-lingui-explicit-id
#: api/mail/digest.ts:325
msgid "email.digest.monthly.title"
msgstr "The month on {site}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:562
msgid "email.digest.monthly.subject"
msgstr "The month on {site}, {range}"
#: src/hooks/playlist/usePlaylist.ts:307
msgid "The new order couldn't be saved. Try again."
msgstr "The new order couldn't be saved. Try again."
#: src/components/comment/CommentNode.tsx:280
msgid "This comment couldn't be deleted. Try again."
msgstr "This comment couldn't be deleted. Try again."
#: src/pages/UserRegister.tsx:118
msgid "This invite link is missing, expired, or already used."
msgstr "This invite link is missing, expired, or already used."
#: src/pages/UserLogin.tsx:104
msgid "This is a mirage."
msgstr "This is a mirage."
#: src/pages/NotFound.tsx:21
msgid "This page does not exist."
msgstr "This page does not exist."
#: src/pages/ResetPassword.tsx:64
msgid "This reset link is missing or malformed."
msgstr "This reset link is missing or malformed."
#: src/components/profile/ProfileSettingsTab.tsx:149
msgid "This site doesn't send email, so no digest goes out."
msgstr "This site doesn't send email, so no digest goes out."
#: src/pages/Unsubscribe.tsx:64
msgid "This unsubscribe link is missing or malformed."
msgstr "This unsubscribe link is missing or malformed."
#: src/pages/DumpEdit.tsx:433
msgid "Thumbnail"
msgstr "Thumbnail"
#: src/components/dump/create/TitleField.tsx:45
#: src/components/playlist/PlaylistCreateForm.tsx:96
#: src/pages/DumpEdit.tsx:494
msgid "Title"
msgstr "Title"
#: src/components/dump/create/DumpCreateModal.tsx:413
msgid "Title is required."
msgstr "Title is required."
#: src/pages/Notifications.tsx:372
#: src/utils/chat/time.ts:24
msgid "Today"
msgstr "Today"
#. js-lingui-explicit-id
#: api/mail/digest.ts:406
msgid "email.digest.topMonth"
msgstr "Top this month"
#. js-lingui-explicit-id
#: api/mail/digest.ts:407
msgid "email.digest.topWeek"
msgstr "Top this week"
#. placeholder {0}: i + 1
#: src/components/player/GlobalPlayer.tsx:338
msgid "Track {0}"
msgstr "Track {0}"
#: src/components/chat/ChatModal.tsx:645
msgid "Try again"
msgstr "Try again"
#. js-lingui-explicit-id
#: api/mail/digest.ts:542
#: src/pages/Unsubscribe.tsx:116
msgid "digest.monthly.off"
msgstr "Turn off monthly recaps"
#: src/pages/Unsubscribe.tsx:107
msgid "Turn off the monthly recap?"
msgstr "Turn off the monthly recap?"
#: src/pages/Unsubscribe.tsx:106
msgid "Turn off the weekly digest?"
msgstr "Turn off the weekly digest?"
#. js-lingui-explicit-id
#: api/mail/digest.ts:546
#: src/pages/Unsubscribe.tsx:114
msgid "digest.weekly.off"
msgstr "Turn off weekly digests"
#: src/pages/Unsubscribe.tsx:112
msgid "Turning off…"
msgstr "Turning off…"
#: src/components/chat/ChatModal.tsx:829
msgid "Type a message…"
msgstr "Type a message…"
#: src/components/playlist/PlaylistDumpList.tsx:120
msgid "Undo"
msgstr "Undo"
#: src/utils/shared/api.ts:22
msgid "Unexpected response format"
msgstr "Unexpected response format"
#: src/components/social/FollowButton.tsx:59
msgid "Unfollow {targetUsername}"
msgstr "Unfollow {targetUsername}"
#: src/components/social/FollowButton.tsx:100
msgid "Unfollow playlist"
msgstr "Unfollow playlist"
#: src/components/player/MediaPlayer.tsx:346
msgid "Unmute"
msgstr "Unmute"
#: src/pages/Unsubscribe.tsx:30
msgid "Unsubscribe"
msgstr "Unsubscribe"
#: src/pages/Unsubscribe.tsx:78
msgid "Unsubscribed"
msgstr "Unsubscribed"
#. js-lingui-explicit-id
#: api/mail/digest.ts:250
msgid "email.digest.upload"
msgstr "upload"
#: src/components/profile/ProfileHeader.tsx:70
msgid "Upload failed"
msgstr "Upload failed"
#. placeholder {0}: Math.round((uploadProgress ?? 0) * 100)
#: src/components/dump/create/DumpCreateModal.tsx:448
msgid "Uploading {0}%"
msgstr "Uploading {0}%"
#: src/components/editor/TextEditor.tsx:566
msgid "Uploading image…"
msgstr "Uploading image…"
#: src/components/dump/create/DumpCreateModal.tsx:760
msgid "Uploading…"
msgstr "Uploading…"
#: src/components/social/VoteButton.tsx:52
msgid "Upvote"
msgstr "Upvote"
#: src/pages/UserUpvoted.tsx:74
msgid "Upvoted"
msgstr "Upvoted"
#. placeholder {0}: votes.items.length
#. placeholder {1}: votes.hasMore ? "+" : ""
#: src/components/profile/ProfileDumpsTab.tsx:52
msgid "Upvoted ({0}{1})"
msgstr "Upvoted ({0}{1})"
#: src/pages/DumpEdit.tsx:465
msgid "URL"
msgstr "URL"
#: src/components/dump/create/DumpCreateModal.tsx:397
msgid "URL is required."
msgstr "URL is required."
#: src/components/category/CategoryManager.tsx:206
msgid "URL slug"
msgstr "URL slug"
#: src/components/profile/RoleSwitcher.tsx:22
msgid "User"
msgstr "User"
#: src/components/profile/ProfileManageTab.tsx:38
msgid "User management"
msgstr "User management"
#: src/components/layout/UserMenu.tsx:53
msgid "User menu"
msgstr "User menu"
#: src/pages/UserLogin.tsx:75
#: src/pages/UserRegister.tsx:137
msgid "Username"
msgstr "Username"
#: src/pages/Search.tsx:118
msgid "Users"
msgstr "Users"
#: src/components/profile/ProfileSection.tsx:43
msgid "View all →"
msgstr "View all →"
#: src/components/dump/create/DumpCreateModal.tsx:525
msgid "View dump →"
msgstr "View dump →"
#: src/components/player/MediaPlayer.tsx:363
msgid "Volume"
msgstr "Volume"
#. js-lingui-explicit-id
#: api/mail/digest.ts:315
#: src/components/profile/ProfileSettingsTab.tsx:128
msgid "digest.weekly"
msgstr "Weekly digest"
#. js-lingui-explicit-id
#: api/mail/welcome.ts:65
msgid "email.welcome.subject"
msgstr "Welcome to {site}"
#: src/components/dump/create/DumpCreateModal.tsx:711
#: src/pages/DumpEdit.tsx:515
msgid "What makes it worth it?"
msgstr "What makes it worth it?"
#: src/components/profile/DescriptionEditor.tsx:78
#: src/components/profile/ProfileDescription.tsx:79
msgid "Who am I?"
msgstr "Who am I?"
#: src/components/dump/create/DumpCreateModal.tsx:726
msgid "Who can see it"
msgstr "Who can see it"
#: src/components/dump/create/StepIndicator.tsx:20
msgid "Why & where"
msgstr "Why & where"
#: src/components/dump/create/DumpCreateModal.tsx:710
#: src/pages/DumpEdit.tsx:514
msgid "Why?"
msgstr "Why?"
#: src/components/comment/CommentNode.tsx:291
msgid "Write a reply…"
msgstr "Write a reply…"
#: src/pages/Notifications.tsx:374
#: src/utils/chat/time.ts:27
msgid "Yesterday"
msgstr "Yesterday"
#: src/components/dump/create/DuplicateNotice.tsx:60
msgid "You can post it anyway."
msgstr "You can post it anyway."
#: src/pages/Unsubscribe.tsx:89
msgid "You won't get the monthly recap any more. You can turn it back on in your settings."
msgstr "You won't get the monthly recap any more. You can turn it back on in your settings."
#: src/pages/Unsubscribe.tsx:83
msgid "You won't get the weekly digest any more. You can turn it back on in your settings."
msgstr "You won't get the weekly digest any more. You can turn it back on in your settings."
#: src/pages/Notifications.tsx:359
msgid "You'll be notified when someone follows your playlists, upvotes your dumps, or posts new content."
msgstr "You'll be notified when someone follows your playlists, upvotes your dumps, or posts new content."
#. js-lingui-explicit-id
#: api/mail/digest.ts:528
msgid "email.digest.monthly.reason"
msgstr "You're getting the monthly recap because it's on in your settings."
#. js-lingui-explicit-id
#: api/mail/digest.ts:533
msgid "email.digest.weekly.reason"
msgstr "You're getting the weekly digest because it's on in your settings."
#. js-lingui-explicit-id
#: api/mail/password-reset.ts:63
msgid "email.reset.reason"
msgstr "You're getting this email because a password reset was requested for this address."
#. js-lingui-explicit-id
#: api/mail/welcome.ts:56
msgid "email.welcome.reason"
msgstr "You're getting this email because an account was created on {site} with this address."
#: src/contexts/ws/WSProvider.tsx:910
msgid "You're offline — not sent"
msgstr "You're offline — not sent"
#: src/components/feed/FeedFooter.tsx:39
msgid "You've reached the end."
msgstr "You've reached the end."
#. js-lingui-explicit-id
#: api/mail/welcome.ts:70
msgid "email.welcome.preheader"
msgstr "Your account is ready."
#: src/pages/UserLogin.tsx:152
msgid "Your email address"
msgstr "Your email address"
#: src/pages/ResetPassword.tsx:86
msgid "Your password has been changed. You can now log in."
msgstr "Your password has been changed. You can now log in."
#: src/pages/Unsubscribe.tsx:51
msgid "Your settings"
msgstr "Your settings"
#. js-lingui-explicit-id
#: api/mail/digest.ts:567
msgid "email.digest.weekly.subject"
msgstr "Your week on {site}, {range}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:330
msgid "email.digest.weekly.title"
msgstr "Your week, {username}"
#. js-lingui-explicit-id
#: api/mail/digest.ts:293
msgid "email.digest.yours"
msgstr "yours"