diff --git a/src/App.css b/src/App.css index 6a92175..902cc88 100644 --- a/src/App.css +++ b/src/App.css @@ -1288,6 +1288,36 @@ body.has-player .fab-new { gap: 1.5rem; } +.profile-info { + position: relative; + min-width: 0; +} + +.profile-info-scroll { + overflow-x: auto; + scrollbar-width: none; + padding-bottom: 0.25rem; + padding-right: 0.25rem; +} + +.profile-info-scroll::-webkit-scrollbar { + display: none; +} + +/* Fade hint only at narrow viewports where the info column can actually overflow */ +@media (max-width: 600px) { + .profile-info::after { + content: ""; + position: absolute; + top: 0; + right: 0; + bottom: 0; + width: 2rem; + background: linear-gradient(to right, transparent, var(--color-bg)); + pointer-events: none; + } +} + .profile-tabs-scroller { margin-top: 0.5rem; padding-bottom: 0.5rem; @@ -1854,6 +1884,33 @@ body.has-player .fab-new { .app-header-center { display: flex; } + + .app-header-center .search-bar-btn { + display: none; + } +} + +/* Below-header search row — small viewports only */ +.header-search-below { + display: flex; + align-items: center; + padding: 0.5rem 1rem; + background: var(--color-surface); + border-bottom: 2px solid var(--color-border); +} + +.header-search-below .search-bar { + flex: 1; +} + +.header-search-below .search-bar-input { + max-width: 100%; +} + +@media (min-width: 860px) { + .header-search-below { + display: none; + } } /* When the search bar is expanded, immediately clear the rest of the center — @@ -1917,12 +1974,32 @@ body.has-player .fab-new { .app-header-nav button { padding: 0.35rem 0.85rem; font-size: 0.95rem; + font-family: inherit; + line-height: inherit; } .app-header-nav .btn-primary { padding: 0.35rem 1rem; } +/* Ghost search button — always visible except when the center search bar is shown */ +.nav-search-btn { + display: flex; + align-items: center; + padding: 0.35rem; + background: transparent; + border: none; + color: inherit; + text-decoration: none; + font-size: 1rem; + cursor: pointer; + border-radius: 6px; +} + +.nav-search-btn:hover { + background: var(--color-surface); +} + /* Text links — visible only at wide viewports */ .nav-links { display: none; @@ -2204,6 +2281,7 @@ body.has-player .fab-new { display: inline-flex; align-items: center; justify-content: center; + gap: 0.25em; white-space: nowrap; cursor: pointer; border-radius: 8px; @@ -2360,7 +2438,7 @@ body.has-player .fab-new { /* Right-edge gradient: absolutely positioned over the scroll container, always at the viewport-right edge regardless of scroll position */ .feed-sort-scroller::after { - content: ''; + content: ""; position: absolute; top: 0; right: 0; @@ -2387,6 +2465,7 @@ body.has-player .fab-new { overflow-x: auto; scrollbar-width: none; padding-bottom: 0.3rem; + padding-right: 0.25rem; min-width: 0; } @@ -2525,7 +2604,6 @@ body.has-player .fab-new { order: 0; } - /* Left column: preview + vote stacked with fixed gap, independent of body height */ .dump-card-left { display: flex; @@ -3052,7 +3130,6 @@ body.has-player .fab-new { opacity: 1; } - .playlist-detail-content { flex: 1; min-width: 0; @@ -3907,6 +3984,7 @@ body.has-player .fab-new { border: none; cursor: pointer; font-size: 0.95rem; + font-weight: 600; padding: 0.35rem 0.85rem; border-radius: 8px; transition: background 0.15s; @@ -4398,12 +4476,9 @@ body.has-player .fab-new { } .search-tabs { - display: flex; - align-items: center; - gap: 0.4rem; - padding: 1rem 1.25rem 0; width: 100%; max-width: 860px; + padding: 1rem 1.25rem 0; box-sizing: border-box; } diff --git a/src/App.tsx b/src/App.tsx index 0d451e0..e5dcab6 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -62,6 +62,9 @@ const ResetPassword = lazy(() => default: m.ResetPassword, })) ); +const NotFound = lazy(() => + import("./pages/NotFound.tsx").then((m) => ({ default: m.NotFound })) +); function AppRoutes() { return ( @@ -111,6 +114,7 @@ function AppRoutes() { } /> + } /> ); diff --git a/src/components/AppHeader.tsx b/src/components/AppHeader.tsx index b5b2ef7..e109c4d 100644 --- a/src/components/AppHeader.tsx +++ b/src/components/AppHeader.tsx @@ -1,11 +1,12 @@ import { lazy, type ReactNode, Suspense, useState } from "react"; -import { Link, useNavigate } from "react-router"; +import { Link, useLocation, useNavigate } from "react-router"; import { t } from "@lingui/core/macro"; import { Trans } from "@lingui/react/macro"; import { useAuth } from "../hooks/useAuth.ts"; import { useWS } from "../hooks/useWS.ts"; import { NotificationBell } from "./NotificationBell.tsx"; import { UserMenu } from "./UserMenu.tsx"; +import { SearchBar } from "./SearchBar.tsx"; const DumpCreateModal = lazy(() => import("./DumpCreateModal.tsx").then((m) => ({ default: m.DumpCreateModal })) @@ -21,21 +22,51 @@ export function AppHeader( const { user } = useAuth(); const { wsStatus, wsErrorMessage } = useWS(); const navigate = useNavigate(); + const location = useLocation(); + const isSearchPage = location.pathname === "/search"; + const [searchExpanded, setSearchExpanded] = useState(isSearchPage); const [createModalOpen, setCreateModalOpen] = useState(!!initialDumpUrl); + function handleSearchToggle() { + if (searchExpanded) { + if (isSearchPage) { + navigate(-1); + } else { + setSearchExpanded(false); + } + } else { + setSearchExpanded(true); + } + } + return ( <> -
+
- 🚚{" "}{document.querySelector('meta[name="site-name"]') - ?.content ?? "gerbeur"} + 🚚 + {" "} + {document.querySelector('meta[name="site-name"]') + ?.content ?? "gerbeur"} + - {centerSlot &&
{centerSlot}
} +
+ {centerSlot} + +
+ {searchExpanded && ( +
+ +
+ )} + {wsStatus === "disconnected" && wsErrorMessage && (
diff --git a/src/components/DumpCard.tsx b/src/components/DumpCard.tsx index 5830b7e..8ba2e50 100644 --- a/src/components/DumpCard.tsx +++ b/src/components/DumpCard.tsx @@ -106,7 +106,6 @@ export function DumpCard( )}
- ); diff --git a/src/components/FeedTabBar.tsx b/src/components/FeedTabBar.tsx index 12d58fd..a113c6f 100644 --- a/src/components/FeedTabBar.tsx +++ b/src/components/FeedTabBar.tsx @@ -2,6 +2,7 @@ import { useLocation, useNavigate } from "react-router"; import { Trans } from "@lingui/react/macro"; import { useAuth } from "../hooks/useAuth.ts"; import { type FeedTab, VALID_TABS } from "../config/feedTabs.ts"; +import { TabBar } from "./TabBar.tsx"; export function FeedTabBar() { const location = useLocation(); @@ -11,44 +12,20 @@ export function FeedTabBar() { const rawTab = new URLSearchParams(location.search).get("tab") ?? "hot"; const tab: FeedTab = VALID_TABS.has(rawTab) ? (rawTab as FeedTab) : "hot"; - function setTab(t: FeedTab) { - navigate(`/?tab=${t}`, { replace: true }); - } + const tabs = [ + { key: "hot" as FeedTab, label: Hot }, + { key: "new" as FeedTab, label: New }, + { key: "journal" as FeedTab, label: Journal }, + ...(user + ? [{ key: "followed" as FeedTab, label: Followed }] + : []), + ]; return ( -
-
- - - - {user && ( - - )} -
-
+ navigate(`/?tab=${t}`, { replace: true })} + /> ); } diff --git a/src/components/JournalCard.tsx b/src/components/JournalCard.tsx index 5c911ed..37a0dcb 100644 --- a/src/components/JournalCard.tsx +++ b/src/components/JournalCard.tsx @@ -1,5 +1,6 @@ import { useContext } from "react"; import { Link, useNavigate } from "react-router"; +import { Plural, Trans } from "@lingui/react/macro"; import type { Dump } from "../model.ts"; import { API_URL } from "../config/api.ts"; import { relativeTime } from "../utils/relativeTime.ts"; @@ -73,12 +74,18 @@ export function JournalCard( {dump.commentCount > 0 && ( - - {dump.commentCount} {dump.commentCount === 1 ? "comment" : "comments"} + + )} {dump.isPrivate && isOwner && ( - private + + private + )} ); diff --git a/src/components/NewPlaylistForm.tsx b/src/components/NewPlaylistForm.tsx index 7609371..e6e5fff 100644 --- a/src/components/NewPlaylistForm.tsx +++ b/src/components/NewPlaylistForm.tsx @@ -27,7 +27,13 @@ export function NewPlaylistForm( className={toggleClassName} onClick={() => setOpen(true)} > - {toggleLabel ?? <>+ New playlist} + {toggleLabel ?? ( + <> + + + New playlist + + + )} {open && ( diff --git a/src/components/PageShell.tsx b/src/components/PageShell.tsx index e66480c..b69721e 100644 --- a/src/components/PageShell.tsx +++ b/src/components/PageShell.tsx @@ -1,6 +1,5 @@ import { type ReactNode } from "react"; import { AppHeader } from "./AppHeader.tsx"; -import { SearchBar } from "./SearchBar.tsx"; interface PageShellProps { children: ReactNode; @@ -14,7 +13,7 @@ export function PageShell( ) { return (
- } /> +
diff --git a/src/components/SearchBar.tsx b/src/components/SearchBar.tsx index de53cff..9d7ab58 100644 --- a/src/components/SearchBar.tsx +++ b/src/components/SearchBar.tsx @@ -4,22 +4,35 @@ import { t } from "@lingui/core/macro"; interface SearchBarProps { collapsible?: boolean; + expanded?: boolean; + onExpandedChange?: (v: boolean) => void; } -export function SearchBar({ collapsible = false }: SearchBarProps) { - const [value, setValue] = useState( - () => new URLSearchParams(location.search).get("q") ?? "", - ); - const [expanded, setExpanded] = useState(!collapsible); +export function SearchBar( + { collapsible = false, expanded: expandedProp, onExpandedChange }: + SearchBarProps, +) { + const isControlled = expandedProp !== undefined; + const [expandedState, setExpandedState] = useState(!collapsible); + const expanded = isControlled ? expandedProp! : expandedState; const inputRef = useRef(null); const navigate = useNavigate(); + const [value, setValue] = useState( + () => new URLSearchParams(location.search).get("q") ?? "", + ); + + function setExpanded(v: boolean) { + if (!isControlled) setExpandedState(v); + onExpandedChange?.(v); + } + useEffect(() => { - if (collapsible && expanded) inputRef.current?.focus(); - }, [expanded, collapsible]); + if ((collapsible || isControlled) && expanded) inputRef.current?.focus(); + }, [expanded, collapsible, isControlled]); function handleIconClick() { - if (!collapsible) return; + if (!collapsible && !isControlled) return; if (expanded) { setExpanded(false); setValue(""); @@ -33,14 +46,14 @@ export function SearchBar({ collapsible = false }: SearchBarProps) { const q = value.trim(); if (!q) return; navigate(`/search?q=${encodeURIComponent(q)}&tab=dumps`); - if (collapsible) { + if (collapsible || isControlled) { setExpanded(false); setValue(""); } } function handleKeyDown(e: React.KeyboardEvent) { - if (e.key === "Escape" && collapsible) { + if (e.key === "Escape" && (collapsible || isControlled)) { setExpanded(false); setValue(""); } @@ -48,9 +61,9 @@ export function SearchBar({ collapsible = false }: SearchBarProps) { return (
@@ -66,10 +79,12 @@ export function SearchBar({ collapsible = false }: SearchBarProps) { tabIndex={expanded ? 0 : -1} /> diff --git a/src/components/TabBar.tsx b/src/components/TabBar.tsx new file mode 100644 index 0000000..630c304 --- /dev/null +++ b/src/components/TabBar.tsx @@ -0,0 +1,35 @@ +import { type ReactNode } from "react"; + +interface Tab { + key: T; + label: ReactNode; +} + +interface TabBarProps { + tabs: Tab[]; + activeTab: T; + onChange: (key: T) => void; + className?: string; + innerClassName?: string; +} + +export function TabBar( + { tabs, activeTab, onChange, className, innerClassName }: TabBarProps, +) { + return ( +
+
+ {tabs.map(({ key, label }) => ( + + ))} +
+
+ ); +} diff --git a/src/locales/en.js b/src/locales/en.js index 4ddeb1d..ca731a7 100644 --- a/src/locales/en.js +++ b/src/locales/en.js @@ -1 +1,5 @@ -/*eslint-disable*/module.exports={messages:JSON.parse("{\"-K9EZb\":[\"Add email…\"],\"-OxI15\":[\"Followed playlists\"],\"-Ya-b9\":[\"Failed to save\"],\"-siMqD\":[\"Journal\"],\"1CalO6\":[\"Style\"],\"1HfJWf\":[\"Search dumps, users, playlists…\"],\"1cbYY_\":[\"Upvoted (\",[\"0\"],[\"1\"],\")\"],\"1njn7W\":[\"Light\"],\"1utXA6\":[\"Dumps\"],\"26iNma\":[\"Post comment\"],\"29VNqC\":[\"Unknown error\"],\"2Hlmdt\":[\"Write a reply…\"],\"2ygf_L\":[\"← Back\"],\"3KKSM4\":[\"private\"],\"3yfh3D\":[\"<0>\",[\"0\"],\" followed your playlist <1>\",[\"1\"],\"\"],\"49voTZ\":[[\"label\"],\" (\",[\"count\"],\")\"],\"4B6w_o\":[\"Dumped!\"],\"4GKuCs\":[\"Login failed\"],\"4HH9iB\":[\"Not following anyone yet.\"],\"4RtQ1k\":[\"Unfollow \",[\"targetUsername\"]],\"4c-qBx\":[\"Your password has been changed. You can now log in.\"],\"4yj9xV\":[\"Live updates are temporarily disconnected. Trying to reconnect…\"],\"5cC8f2\":[\"Edited \",[\"0\"]],\"5oD9f_\":[\"Earlier\"],\"6Qly-0\":[\"a comment\"],\"6gRgw8\":[\"Retry\"],\"7PHCIN\":[\"Cancel removal\"],\"7d1a0d\":[\"Public\"],\"7sNhEz\":[\"Username\"],\"8ZsakT\":[\"Password\"],\"8pxhI8\":[\"Please select a file.\"],\"9BruTc\":[\"Why?\"],\"9l4qcT\":[\"Drop a replacement here\"],\"9uI_rE\":[\"Undo\"],\"A0y396\":[\"+ Invite someone\"],\"A1taO8\":[\"Search\"],\"AQbgNR\":[\"Follow \",[\"targetUsername\"]],\"ATGYL1\":[\"Email address\"],\"AZctoV\":[[\"0\",\"plural\",{\"one\":[\"#\",\" comment\"],\"other\":[\"#\",\" comments\"]}]],\"Ade-6d\":[\"Live updates unavailable.\"],\"AeXO77\":[\"Account\"],\"CI50ct\":[\"Upvoted\"],\"Cj24wt\":[\"Registering…\"],\"DPfwMq\":[\"Done\"],\"DdeHXH\":[\"Delete this dump? This cannot be undone.\"],\"Dp1JhP\":[\"<0>\",[\"0\"],\" upvoted <1>\",[\"1\"],\"\"],\"ECiS12\":[\"View dump →\"],\"ExR0Fr\":[\"URL is required.\"],\"F1O9Ep\":[\"Could not connect to server\"],\"F5Js1v\":[\"Unfollow playlist\"],\"FgAxTj\":[\"Log out\"],\"Fxf4jq\":[\"Description (optional)\"],\"GNSsCc\":[\"Failed to create playlist\"],\"GbqhrN\":[[\"0\"],\"–\",[\"1\"],\" characters: letters, numbers, or underscores\"],\"GptGxg\":[\"Change password\"],\"H8pzW-\":[\"Failed to update avatar\"],\"HTLDA4\":[\"Loading more…\"],\"I-x669\":[\"Invitees\"],\"IZX7TO\":[\"Failed to generate invite\"],\"IagCbF\":[\"URL\"],\"ImOQa9\":[\"Reply\"],\"J2eKUI\":[\"File\"],\"JJ-Bhk\":[\"Your email address\"],\"JRQitQ\":[\"Confirm new password\"],\"JXr41k\":[\"<0>\",[\"0\"],\" commented on <1>\",[\"1\"],\"\"],\"Jd58Fo\":[\"Hot\"],\"Jf0PuK\":[\"Go to login\"],\"KDGWg5\":[\"Remove from playlist\"],\"K_F6pa\":[\"Saving…\"],\"LLyMkV\":[\"Followed (\",[\"0\"],[\"1\"],\")\"],\"LPAv9E\":[[\"days\"],\"d ago\"],\"MHrjPM\":[\"Title\"],\"MKEPCY\":[\"Follow\"],\"Mq2B8E\":[[\"mins\"],\"m ago\"],\"Nn4kr3\":[\"+ New dump\"],\"Oprv1v\":[\"Password (min. \",[\"0\"],\" characters)\"],\"Oz0N9s\":[\"new\"],\"PiH3UR\":[\"Copied!\"],\"Pn2B7_\":[\"Current password\"],\"Pwqkdw\":[\"Loading…\"],\"Q6n4F4\":[\"Refresh metadata\"],\"QKsaQr\":[\"or <0>browse files\"],\"QLtPBd\":[\"No dumps in this playlist yet.\"],\"R9Khdg\":[\"Auto\"],\"RCcPrX\":[\"Delete this playlist? This cannot be undone.\"],\"RTksSy\":[\"<0>\",[\"0\"],\" started following you\"],\"RaKjrM\":[\"Failed to save edit\"],\"RcUHRT\":[\"Followed\"],\"SBTElJ\":[\"Searching…\"],\"Sad2tK\":[\"Sending…\"],\"Sxm8rQ\":[\"Users\"],\"T9bjWt\":[\"<0>\",[\"0\"],\" was added to <1>\",[\"1\"],\"\"],\"TM1ZbA\":[\"Playlists (\",[\"0\"],[\"1\"],\")\"],\"TN382O\":[\"Invalid link\"],\"Tv9vbB\":[\"Follow playlist\"],\"Tz0i8g\":[\"Settings\"],\"U7u3q-\":[\"+ New\"],\"UNMVei\":[\"Forgot password?\"],\"UOZith\":[\"Failed to post\"],\"UTiUFs\":[\"Fetching…\"],\"VCoEm-\":[\"Back to login\"],\"V_e7nf\":[\"Set new password\"],\"VnNJbN\":[\"From playlists\"],\"VyTYmS\":[\"Change avatar\"],\"WhimMi\":[\"Reset failed\"],\"WpXcBJ\":[\"Nothing here yet.\"],\"WtkMN8\":[\"All \",[\"0\",\"plural\",{\"one\":[\"#\",\" upvoted dump\"],\"other\":[\"#\",\" upvoted dumps\"]}],\" loaded.\"],\"XJy2oN\":[\"Logging in…\"],\"Xan6QP\":[\"New dump\"],\"XgRtUf\":[\"Could not change password\"],\"Xi0Mn4\":[\"← Back to profile\"],\"XnL-Eu\":[\"No users match \\\"\",[\"q\"],\"\\\".\"],\"Xs2Lez\":[\"This reset link is missing or malformed.\"],\"YK1Dhc\":[\"a post\"],\"YpkCca\":[\"No followed playlists yet.\"],\"ZCpU0u\":[\"No playlists match \\\"\",[\"q\"],\"\\\".\"],\"ZmD2o6\":[\"Create & Add\"],\"_3O5R_\":[\"Request failed\"],\"_84wxb\":[\"All \",[\"0\",\"plural\",{\"one\":[\"#\",\" dump\"],\"other\":[\"#\",\" dumps\"]}],\" loaded.\"],\"_DwR-n\":[\"Creating…\"],\"_R_sGB\":[\"Password changed successfully.\"],\"_aept4\":[\"Post reply\"],\"_nT6AE\":[\"New password\"],\"_t4W-i\":[\"From people\"],\"a8Ypyu\":[\" New playlist\"],\"aAIQg2\":[\"Appearance\"],\"aDvLhk\":[\"Add a comment…\"],\"b3Thhd\":[\"Upload failed\"],\"b8XMJ8\":[[\"visibleCount\",\"plural\",{\"one\":[\"#\",\" comment\"],\"other\":[\"#\",\" comments\"]}]],\"bQhwn-\":[\"Loading playlist…\"],\"cILfnJ\":[\"Remove file\"],\"cYP9Sb\":[\"+ Playlist\"],\"cbeBbZ\":[\"At least \",[\"0\"],\" characters\"],\"cnGeoo\":[\"Delete\"],\"d8DZWS\":[\"Open search\"],\"dAs22m\":[\"Replace file\"],\"dEgA5A\":[\"Cancel\"],\"dMizp8\":[\"New playlist\"],\"eFSqvc\":[\"Failed to post reply\"],\"ePK91l\":[\"Edit\"],\"eaUTwS\":[\"Send reset link\"],\"ecUA8p\":[\"Today\"],\"ef9nPf\":[\"Loading dump…\"],\"en9o7K\":[\"Failed to post comment\"],\"etFQQS\":[\"What makes it worth it?\"],\"fI-mNw\":[\"Playlists\"],\"f_akpP\":[\"Max 50 MB\"],\"fgLNSM\":[\"Register\"],\"gANddk\":[\"Uploading…\"],\"gGx5tM\":[\"Editing\"],\"gIQQwD\":[\"Failed to load\"],\"gLfZlz\":[\"Add to playlist\"],\"gjJ-sb\":[\"Can't connect to the live updates server. Upvotes and notifications may not sync until it reconnects.\"],\"hBuUKa\":[\"Change password…\"],\"hD7w09\":[\"You've reached the end.\"],\"hJSliC\":[\"<0>\",[\"0\"],\" posted <1>\",[\"1\"],\"\"],\"hYgDIe\":[\"Create\"],\"he3ygx\":[\"Copy\"],\"i7K_Te\":[\"Who am I?\"],\"iDNBZe\":[\"Notifications\"],\"ijVyoK\":[\"Could not reach the server. Please try again.\"],\"ipYn7W\":[\"If that address is registered you'll receive a reset link shortly.\"],\"isRobC\":[\"New\"],\"jbernk\":[\"Loading profile…\"],\"joEmfT\":[\"Server unreachable\"],\"jrZTZl\":[\"No dumps yet. Be the first!\"],\"kLttbL\":[\"Registration failed\"],\"klOeIX\":[\"Failed to change password\"],\"lUDifl\":[\"Created (\",[\"0\"],[\"1\"],\")\"],\"lUanmi\":[\"You'll be notified when someone follows your playlists, upvotes your dumps, or posts new content.\"],\"lY5h1V\":[[\"0\",\"plural\",{\"one\":[\"#\",\" dump\"],\"other\":[\"#\",\" dumps\"]}]],\"lcfvr_\":[\"Delete this comment?\"],\"lpIMne\":[\"Passwords do not match\"],\"mt6O6E\":[\"This is a mirage.\"],\"nbm5sI\":[\"No dumps match \\\"\",[\"q\"],\"\\\".\"],\"nrjqON\":[\"Checking invite…\"],\"nwtY4N\":[\"Something went wrong\"],\"ogtYkT\":[\"Password updated\"],\"pCpd9p\":[\"<0>\",[\"0\"],\" mentioned you in <1>\",[\"where\"],\"\"],\"pSheLH\":[\"No invitees yet.\"],\"pvnfJD\":[\"Dark\"],\"qIMfNQ\":[\"Delete playlist\"],\"qbDAcy\":[\"Dump it\"],\"qgx_78\":[\"Follow some public playlists to see their dumps here.\"],\"qvFa8r\":[\"public\"],\"r15pMp\":[\" Dump\"],\"rCbqPX\":[\"This invite link is missing, expired, or already used.\"],\"rg9pXu\":[\"Search failed\"],\"rtpJqV\":[\"Dumps (\",[\"0\"],[\"1\"],\")\"],\"sQia9P\":[\"Log in\"],\"sTiqbm\":[\"invited by\"],\"sdP5Aa\":[\"[deleted]\"],\"shHs8T\":[\"Enter a query to search.\"],\"smeBfS\":[\"Invalid invite\"],\"tfDRzk\":[\"Save\"],\"tvmuQ0\":[\"Color scheme\"],\"u1lDX2\":[\"Fetching preview…\"],\"uD0qXQ\":[\"Drop a file here\"],\"uMGUnV\":[\"No playlists yet.\"],\"ub1EEL\":[\"edited \",[\"0\"]],\"vJBF1r\":[\"Posting…\"],\"vLhLLO\":[\"Notifications (\",[\"unreadNotificationCount\"],\" unread)\"],\"vuosjb\":[\"User menu\"],\"wXO4Tg\":[[\"hrs\"],\"h ago\"],\"wbXKOv\":[\"File too large (max 50 MB).\"],\"wixIgH\":[\"Already have an account? <0>Log in\"],\"xEWkgZ\":[\"← Back to all dumps\"],\"xOTzt5\":[\"just now\"],\"xPHtx0\":[\"Submit search\"],\"xVuNgt\":[\"+ New playlist\"],\"xc9O_u\":[\"Delete dump\"],\"xy6Wtk\":[\" New dump\"],\"y6sq5j\":[\"Following\"],\"yA_6BX\":[\"View all →\"],\"yBBtRm\":[\"Follow some users to see their dumps here.\"],\"yQ2kGp\":[\"Load more\"],\"y_0uwd\":[\"Yesterday\"],\"yz7wBu\":[\"Close\"],\"z1uNN0\":[\"No emoji found.\"],\"zVuxvN\":[\"Refreshing…\"],\"zwBp5t\":[\"Private\"]}")}; \ No newline at end of file +/*eslint-disable*/ module.exports = { + messages: JSON.parse( + '{"-K9EZb":["Add email…"],"-OxI15":["Followed playlists"],"-Ya-b9":["Failed to save"],"-siMqD":["Journal"],"1CalO6":["Style"],"1HfJWf":["Search dumps, users, playlists…"],"1cbYY_":["Upvoted (",["0"],["1"],")"],"1njn7W":["Light"],"1utXA6":["Dumps"],"26iNma":["Post comment"],"29VNqC":["Unknown error"],"2Hlmdt":["Write a reply…"],"2ygf_L":["← Back"],"3KKSM4":["private"],"3yfh3D":["<0>",["0"]," followed your playlist <1>",["1"],""],"49voTZ":[["label"]," (",["count"],")"],"4B6w_o":["Dumped!"],"4GKuCs":["Login failed"],"4HH9iB":["Not following anyone yet."],"4RtQ1k":["Unfollow ",["targetUsername"]],"4c-qBx":["Your password has been changed. You can now log in."],"4yj9xV":["Live updates are temporarily disconnected. Trying to reconnect…"],"5TviPn":["Cancel search"],"5cC8f2":["Edited ",["0"]],"5oD9f_":["Earlier"],"6Qly-0":["a comment"],"6gRgw8":["Retry"],"7PHCIN":["Cancel removal"],"7d1a0d":["Public"],"7sNhEz":["Username"],"8ZsakT":["Password"],"8pxhI8":["Please select a file."],"9BruTc":["Why?"],"9l4qcT":["Drop a replacement here"],"9uI_rE":["Undo"],"A0y396":["+ Invite someone"],"A1taO8":["Search"],"AQbgNR":["Follow ",["targetUsername"]],"ATGYL1":["Email address"],"AZctoV":[["0","plural",{"one":["#"," comment"],"other":["#"," comments"]}]],"Ade-6d":["Live updates unavailable."],"AeXO77":["Account"],"CI50ct":["Upvoted"],"Cj24wt":["Registering…"],"DPfwMq":["Done"],"DdeHXH":["Delete this dump? This cannot be undone."],"Dp1JhP":["<0>",["0"]," upvoted <1>",["1"],""],"ECiS12":["View dump →"],"ExR0Fr":["URL is required."],"F1O9Ep":["Could not connect to server"],"F5Js1v":["Unfollow playlist"],"FgAxTj":["Log out"],"Fxf4jq":["Description (optional)"],"GNSsCc":["Failed to create playlist"],"GbqhrN":[["0"],"–",["1"]," characters: letters, numbers, or underscores"],"GptGxg":["Change password"],"H8pzW-":["Failed to update avatar"],"HTLDA4":["Loading more…"],"I-x669":["Invitees"],"IZX7TO":["Failed to generate invite"],"IagCbF":["URL"],"ImOQa9":["Reply"],"J2eKUI":["File"],"JJ-Bhk":["Your email address"],"JRQitQ":["Confirm new password"],"JXr41k":["<0>",["0"]," commented on <1>",["1"],""],"Jd58Fo":["Hot"],"Jf0PuK":["Go to login"],"KDGWg5":["Remove from playlist"],"K_F6pa":["Saving…"],"LLyMkV":["Followed (",["0"],["1"],")"],"LPAv9E":[["days"],"d ago"],"MHrjPM":["Title"],"MKEPCY":["Follow"],"Mq2B8E":[["mins"],"m ago"],"Nn4kr3":["+ New dump"],"Oprv1v":["Password (min. ",["0"]," characters)"],"Oz0N9s":["new"],"PiH3UR":["Copied!"],"Pn2B7_":["Current password"],"Pwqkdw":["Loading…"],"Q6n4F4":["Refresh metadata"],"QKsaQr":["or <0>browse files"],"QLtPBd":["No dumps in this playlist yet."],"R9Khdg":["Auto"],"RCcPrX":["Delete this playlist? This cannot be undone."],"RTksSy":["<0>",["0"]," started following you"],"RaKjrM":["Failed to save edit"],"RcUHRT":["Followed"],"SBTElJ":["Searching…"],"Sad2tK":["Sending…"],"StovX6":["This page does not exist."],"Sxm8rQ":["Users"],"T9bjWt":["<0>",["0"]," was added to <1>",["1"],""],"TM1ZbA":["Playlists (",["0"],["1"],")"],"TN382O":["Invalid link"],"Tv9vbB":["Follow playlist"],"Tz0i8g":["Settings"],"UNMVei":["Forgot password?"],"UOZith":["Failed to post"],"UTiUFs":["Fetching…"],"VCoEm-":["Back to login"],"V_e7nf":["Set new password"],"VnNJbN":["From playlists"],"VyTYmS":["Change avatar"],"WhimMi":["Reset failed"],"WpXcBJ":["Nothing here yet."],"WtkMN8":["All ",["0","plural",{"one":["#"," upvoted dump"],"other":["#"," upvoted dumps"]}]," loaded."],"XJy2oN":["Logging in…"],"Xan6QP":["New dump"],"XgRtUf":["Could not change password"],"Xi0Mn4":["← Back to profile"],"XnL-Eu":["No users match \\"",["q"],"\\"."],"Xs2Lez":["This reset link is missing or malformed."],"YK1Dhc":["a post"],"YpkCca":["No followed playlists yet."],"ZCpU0u":["No playlists match \\"",["q"],"\\"."],"ZmD2o6":["Create & Add"],"_3O5R_":["Request failed"],"_84wxb":["All ",["0","plural",{"one":["#"," dump"],"other":["#"," dumps"]}]," loaded."],"_DwR-n":["Creating…"],"_R_sGB":["Password changed successfully."],"_aept4":["Post reply"],"_nT6AE":["New password"],"_t4W-i":["From people"],"aAIQg2":["Appearance"],"aDvLhk":["Add a comment…"],"b3Thhd":["Upload failed"],"b8XMJ8":[["visibleCount","plural",{"one":["#"," comment"],"other":["#"," comments"]}]],"bQhwn-":["Loading playlist…"],"cILfnJ":["Remove file"],"cYP9Sb":["+ Playlist"],"cbeBbZ":["At least ",["0"]," characters"],"cnGeoo":["Delete"],"d8DZWS":["Open search"],"dAs22m":["Replace file"],"dEgA5A":["Cancel"],"dMizp8":["New playlist"],"eFSqvc":["Failed to post reply"],"ePK91l":["Edit"],"eaUTwS":["Send reset link"],"ecUA8p":["Today"],"ef9nPf":["Loading dump…"],"en9o7K":["Failed to post comment"],"etFQQS":["What makes it worth it?"],"fI-mNw":["Playlists"],"f_akpP":["Max 50 MB"],"fgLNSM":["Register"],"gANddk":["Uploading…"],"gGx5tM":["Editing"],"gIQQwD":["Failed to load"],"gLfZlz":["Add to playlist"],"gjJ-sb":["Can\'t connect to the live updates server. Upvotes and notifications may not sync until it reconnects."],"hBuUKa":["Change password…"],"hD7w09":["You\'ve reached the end."],"hJSliC":["<0>",["0"]," posted <1>",["1"],""],"hYgDIe":["Create"],"he3ygx":["Copy"],"i7K_Te":["Who am I?"],"iDNBZe":["Notifications"],"iWpEwy":["Go home"],"ijVyoK":["Could not reach the server. Please try again."],"ipYn7W":["If that address is registered you\'ll receive a reset link shortly."],"isRobC":["New"],"jbernk":["Loading profile…"],"joEmfT":["Server unreachable"],"jrZTZl":["No dumps yet. Be the first!"],"kLttbL":["Registration failed"],"klOeIX":["Failed to change password"],"lUDifl":["Created (",["0"],["1"],")"],"lUanmi":["You\'ll be notified when someone follows your playlists, upvotes your dumps, or posts new content."],"lY5h1V":[["0","plural",{"one":["#"," dump"],"other":["#"," dumps"]}]],"lcfvr_":["Delete this comment?"],"lpIMne":["Passwords do not match"],"mt6O6E":["This is a mirage."],"nbm5sI":["No dumps match \\"",["q"],"\\"."],"nrjqON":["Checking invite…"],"nwtY4N":["Something went wrong"],"ogtYkT":["Password updated"],"pCpd9p":["<0>",["0"]," mentioned you in <1>",["where"],""],"pSheLH":["No invitees yet."],"pvnfJD":["Dark"],"qIMfNQ":["Delete playlist"],"qbDAcy":["Dump it"],"qgx_78":["Follow some public playlists to see their dumps here."],"qvFa8r":["public"],"qvz_Pp":["Dump"],"rCbqPX":["This invite link is missing, expired, or already used."],"rg9pXu":["Search failed"],"rtpJqV":["Dumps (",["0"],["1"],")"],"sQia9P":["Log in"],"sTiqbm":["invited by"],"sdP5Aa":["[deleted]"],"shHs8T":["Enter a query to search."],"smeBfS":["Invalid invite"],"tfDRzk":["Save"],"tvmuQ0":["Color scheme"],"u1lDX2":["Fetching preview…"],"uD0qXQ":["Drop a file here"],"uMGUnV":["No playlists yet."],"ub1EEL":["edited ",["0"]],"vJBF1r":["Posting…"],"vLhLLO":["Notifications (",["unreadNotificationCount"]," unread)"],"vuosjb":["User menu"],"wXO4Tg":[["hrs"],"h ago"],"wbXKOv":["File too large (max 50 MB)."],"wixIgH":["Already have an account? <0>Log in"],"xEWkgZ":["← Back to all dumps"],"xOTzt5":["just now"],"xPHtx0":["Submit search"],"xVuNgt":["+ New playlist"],"xc9O_u":["Delete dump"],"y6sq5j":["Following"],"yA_6BX":["View all →"],"yBBtRm":["Follow some users to see their dumps here."],"yQ2kGp":["Load more"],"y_0uwd":["Yesterday"],"yz7wBu":["Close"],"z1uNN0":["No emoji found."],"zVuxvN":["Refreshing…"],"zwBp5t":["Private"]}', + ), +}; diff --git a/src/locales/en.po b/src/locales/en.po index a6b9f8a..7a83401 100644 --- a/src/locales/en.po +++ b/src/locales/en.po @@ -13,25 +13,13 @@ msgstr "" "Language-Team: \n" "Plural-Forms: \n" -#: src/components/AppHeader.tsx:71 -msgid " Dump" -msgstr " Dump" - -#: src/pages/UserDumps.tsx:114 -#: src/pages/UserPublicProfile.tsx:1332 -msgid " New dump" -msgstr " New dump" - -#: src/components/NewPlaylistForm.tsx:30 -msgid " New playlist" -msgstr " New playlist" - #: src/components/CommentThread.tsx:176 msgid "[deleted]" msgstr "[deleted]" #. placeholder {0}: dump.commentCount #: src/components/DumpCard.tsx:95 +#: src/components/JournalCard.tsx:78 msgid "{0, plural, one {# comment} other {# comments}}" msgstr "{0, plural, one {# comment} other {# comments}}" @@ -83,14 +71,10 @@ msgstr "← Back to all dumps" msgid "← Back to profile" msgstr "← Back to profile" -#: src/pages/UserPublicProfile.tsx:100 +#: src/pages/UserPublicProfile.tsx:101 msgid "+ Invite someone" msgstr "+ Invite someone" -#: src/components/AppHeader.tsx:71 -msgid "+ New" -msgstr "+ New" - #: src/pages/UserDumps.tsx:114 #: src/pages/UserPublicProfile.tsx:1332 msgid "+ New dump" @@ -152,7 +136,7 @@ msgstr "a comment" msgid "a post" msgstr "a post" -#: src/pages/UserPublicProfile.tsx:1217 +#: src/pages/UserPublicProfile.tsx:1193 msgid "Account" msgstr "Account" @@ -160,7 +144,7 @@ msgstr "Account" msgid "Add a comment…" msgstr "Add a comment…" -#: src/pages/UserPublicProfile.tsx:859 +#: src/pages/UserPublicProfile.tsx:860 msgid "Add email…" msgstr "Add email…" @@ -181,7 +165,7 @@ msgstr "All {0, plural, one {# upvoted dump} other {# upvoted dumps}} loaded." msgid "Already have an account? <0>Log in" msgstr "Already have an account? <0>Log in" -#: src/pages/UserPublicProfile.tsx:1236 +#: src/pages/UserPublicProfile.tsx:1212 msgid "Appearance" msgstr "Appearance" @@ -191,7 +175,7 @@ msgstr "Appearance" msgid "At least {0} characters" msgstr "At least {0} characters" -#: src/pages/UserPublicProfile.tsx:1270 +#: src/pages/UserPublicProfile.tsx:1246 msgid "Auto" msgstr "Auto" @@ -214,8 +198,8 @@ msgstr "Can't connect to the live updates server. Upvotes and notifications may #: src/components/PlaylistCreateForm.tsx:112 #: src/pages/DumpEdit.tsx:299 #: src/pages/PlaylistDetail.tsx:680 -#: src/pages/UserPublicProfile.tsx:841 -#: src/pages/UserPublicProfile.tsx:919 +#: src/pages/UserPublicProfile.tsx:842 +#: src/pages/UserPublicProfile.tsx:921 msgid "Cancel" msgstr "Cancel" @@ -223,6 +207,10 @@ msgstr "Cancel" msgid "Cancel removal" msgstr "Cancel removal" +#: src/components/AppHeader.tsx:62 +msgid "Cancel search" +msgstr "Cancel search" + #: src/pages/UserPublicProfile.tsx:772 msgid "Change avatar" msgstr "Change avatar" @@ -232,7 +220,7 @@ msgstr "Change avatar" msgid "Change password" msgstr "Change password" -#: src/pages/UserPublicProfile.tsx:1229 +#: src/pages/UserPublicProfile.tsx:1205 msgid "Change password…" msgstr "Change password…" @@ -245,7 +233,7 @@ msgstr "Checking invite…" msgid "Close" msgstr "Close" -#: src/pages/UserPublicProfile.tsx:1262 +#: src/pages/UserPublicProfile.tsx:1238 msgid "Color scheme" msgstr "Color scheme" @@ -254,11 +242,11 @@ msgstr "Color scheme" msgid "Confirm new password" msgstr "Confirm new password" -#: src/pages/UserPublicProfile.tsx:91 +#: src/pages/UserPublicProfile.tsx:92 msgid "Copied!" msgstr "Copied!" -#: src/pages/UserPublicProfile.tsx:91 +#: src/pages/UserPublicProfile.tsx:92 msgid "Copy" msgstr "Copy" @@ -299,7 +287,7 @@ msgstr "Creating…" msgid "Current password" msgstr "Current password" -#: src/pages/UserPublicProfile.tsx:1284 +#: src/pages/UserPublicProfile.tsx:1260 msgid "Dark" msgstr "Dark" @@ -351,6 +339,10 @@ msgstr "Drop a file here" msgid "Drop a replacement here" msgstr "Drop a replacement here" +#: src/components/AppHeader.tsx:99 +msgid "Dump" +msgstr "Dump" + #: src/components/DumpCreateModal.tsx:427 msgid "Dump it" msgstr "Dump it" @@ -361,13 +353,13 @@ msgstr "Dumped!" #: src/pages/Search.tsx:172 #: src/pages/UserDumps.tsx:107 -#: src/pages/UserPublicProfile.tsx:968 +#: src/pages/UserPublicProfile.tsx:965 msgid "Dumps" msgstr "Dumps" #. placeholder {0}: dumps.items.length #. placeholder {1}: dumps.hasMore ? "+" : "" -#: src/pages/UserPublicProfile.tsx:1006 +#: src/pages/UserPublicProfile.tsx:982 msgid "Dumps ({0}{1})" msgstr "Dumps ({0}{1})" @@ -407,7 +399,7 @@ msgstr "Editing" msgid "Email address" msgstr "Email address" -#: src/pages/Search.tsx:207 +#: src/pages/Search.tsx:198 msgid "Enter a query to search." msgstr "Enter a query to search." @@ -420,20 +412,20 @@ msgstr "Failed to change password" msgid "Failed to create playlist" msgstr "Failed to create playlist" -#: src/pages/UserPublicProfile.tsx:72 -#: src/pages/UserPublicProfile.tsx:75 -#: src/pages/UserPublicProfile.tsx:103 +#: src/pages/UserPublicProfile.tsx:73 +#: src/pages/UserPublicProfile.tsx:76 +#: src/pages/UserPublicProfile.tsx:104 msgid "Failed to generate invite" msgstr "Failed to generate invite" -#: src/pages/index/FollowedFeed.tsx:81 +#: src/pages/index/FollowedFeed.tsx:82 #: src/pages/index/HotFeed.tsx:36 #: src/pages/index/JournalFeed.tsx:48 #: src/pages/index/NewFeed.tsx:36 #: src/pages/Notifications.tsx:342 -#: src/pages/UserPublicProfile.tsx:1108 -#: src/pages/UserPublicProfile.tsx:1150 -#: src/pages/UserPublicProfile.tsx:1195 +#: src/pages/UserPublicProfile.tsx:1084 +#: src/pages/UserPublicProfile.tsx:1126 +#: src/pages/UserPublicProfile.tsx:1171 msgid "Failed to load" msgstr "Failed to load" @@ -452,8 +444,8 @@ msgstr "Failed to post reply" #: src/pages/PlaylistDetail.tsx:789 #: src/pages/UserPublicProfile.tsx:680 #: src/pages/UserPublicProfile.tsx:718 -#: src/pages/UserPublicProfile.tsx:845 -#: src/pages/UserPublicProfile.tsx:922 +#: src/pages/UserPublicProfile.tsx:846 +#: src/pages/UserPublicProfile.tsx:924 msgid "Failed to save" msgstr "Failed to save" @@ -461,7 +453,7 @@ msgstr "Failed to save" msgid "Failed to save edit" msgstr "Failed to save edit" -#: src/pages/UserPublicProfile.tsx:868 +#: src/pages/UserPublicProfile.tsx:869 msgid "Failed to update avatar" msgstr "Failed to update avatar" @@ -495,16 +487,16 @@ msgstr "Follow {targetUsername}" msgid "Follow playlist" msgstr "Follow playlist" -#: src/pages/index/FollowedFeed.tsx:371 +#: src/pages/index/FollowedFeed.tsx:365 msgid "Follow some public playlists to see their dumps here." msgstr "Follow some public playlists to see their dumps here." -#: src/pages/index/FollowedFeed.tsx:357 +#: src/pages/index/FollowedFeed.tsx:351 msgid "Follow some users to see their dumps here." msgstr "Follow some users to see their dumps here." -#: src/components/FeedTabBar.tsx:48 -#: src/pages/UserPublicProfile.tsx:982 +#: src/components/FeedTabBar.tsx:19 +#: src/pages/UserPublicProfile.tsx:967 msgid "Followed" msgstr "Followed" @@ -514,13 +506,13 @@ msgstr "Followed" msgid "Followed ({0}{1})" msgstr "Followed ({0}{1})" -#: src/pages/UserPublicProfile.tsx:1139 +#: src/pages/UserPublicProfile.tsx:1115 msgid "Followed playlists" msgstr "Followed playlists" #: src/components/FollowButton.tsx:37 #: src/components/FollowButton.tsx:64 -#: src/pages/UserPublicProfile.tsx:1097 +#: src/pages/UserPublicProfile.tsx:1073 msgid "Following" msgstr "Following" @@ -528,19 +520,23 @@ msgstr "Following" msgid "Forgot password?" msgstr "Forgot password?" -#: src/pages/index/FollowedFeed.tsx:337 +#: src/pages/index/FollowedFeed.tsx:334 msgid "From people" msgstr "From people" -#: src/pages/index/FollowedFeed.tsx:344 +#: src/pages/index/FollowedFeed.tsx:335 msgid "From playlists" msgstr "From playlists" +#: src/pages/NotFound.tsx:13 +msgid "Go home" +msgstr "Go home" + #: src/pages/ResetPassword.tsx:66 msgid "Go to login" msgstr "Go to login" -#: src/components/FeedTabBar.tsx:26 +#: src/components/FeedTabBar.tsx:16 msgid "Hot" msgstr "Hot" @@ -556,16 +552,16 @@ msgstr "Invalid invite" msgid "Invalid link" msgstr "Invalid link" -#: src/pages/UserPublicProfile.tsx:790 +#: src/pages/UserPublicProfile.tsx:791 msgid "invited by" msgstr "invited by" -#: src/pages/UserPublicProfile.tsx:989 -#: src/pages/UserPublicProfile.tsx:1184 +#: src/pages/UserPublicProfile.tsx:968 +#: src/pages/UserPublicProfile.tsx:1160 msgid "Invitees" msgstr "Invitees" -#: src/components/FeedTabBar.tsx:40 +#: src/components/FeedTabBar.tsx:18 msgid "Journal" msgstr "Journal" @@ -573,7 +569,7 @@ msgstr "Journal" msgid "just now" msgstr "just now" -#: src/pages/UserPublicProfile.tsx:1277 +#: src/pages/UserPublicProfile.tsx:1253 msgid "Light" msgstr "Light" @@ -581,7 +577,7 @@ msgstr "Light" msgid "Live updates are temporarily disconnected. Trying to reconnect…" msgstr "Live updates are temporarily disconnected. Trying to reconnect…" -#: src/components/AppHeader.tsx:88 +#: src/components/AppHeader.tsx:125 msgid "Live updates unavailable." msgstr "Live updates unavailable." @@ -594,11 +590,11 @@ msgstr "Load more" msgid "Loading dump…" msgstr "Loading dump…" -#: src/pages/index/FollowedFeed.tsx:109 +#: src/pages/index/FollowedFeed.tsx:110 #: src/pages/index/HotFeed.tsx:64 #: src/pages/index/JournalFeed.tsx:77 #: src/pages/index/NewFeed.tsx:64 -#: src/pages/Search.tsx:244 +#: src/pages/Search.tsx:235 #: src/pages/UserDumps.tsx:93 #: src/pages/UserPlaylists.tsx:417 #: src/pages/UserPlaylists.tsx:452 @@ -616,7 +612,7 @@ msgstr "Loading profile…" #: src/components/PlaylistMembershipPanel.tsx:28 #: src/components/TextEditor.tsx:289 -#: src/pages/index/FollowedFeed.tsx:76 +#: src/pages/index/FollowedFeed.tsx:77 #: src/pages/index/HotFeed.tsx:32 #: src/pages/index/JournalFeed.tsx:44 #: src/pages/index/NewFeed.tsx:32 @@ -624,21 +620,21 @@ msgstr "Loading profile…" #: src/pages/Notifications.tsx:414 #: src/pages/UserDumps.tsx:51 #: src/pages/UserPlaylists.tsx:342 -#: src/pages/UserPublicProfile.tsx:1102 -#: src/pages/UserPublicProfile.tsx:1144 -#: src/pages/UserPublicProfile.tsx:1189 +#: src/pages/UserPublicProfile.tsx:1078 +#: src/pages/UserPublicProfile.tsx:1120 +#: src/pages/UserPublicProfile.tsx:1165 #: src/pages/UserUpvoted.tsx:123 msgid "Loading…" msgstr "Loading…" -#: src/components/AppHeader.tsx:78 +#: src/components/AppHeader.tsx:106 #: src/pages/UserLogin.tsx:87 #: src/pages/UserLogin.tsx:117 msgid "Log in" msgstr "Log in" #: src/pages/UserPublicProfile.tsx:749 -#: src/pages/UserPublicProfile.tsx:882 +#: src/pages/UserPublicProfile.tsx:883 msgid "Log out" msgstr "Log out" @@ -658,11 +654,13 @@ msgstr "Max 50 MB" msgid "new" msgstr "new" -#: src/components/FeedTabBar.tsx:33 +#: src/components/FeedTabBar.tsx:17 msgid "New" msgstr "New" #: src/components/DumpCreateModal.tsx:277 +#: src/pages/UserDumps.tsx:114 +#: src/pages/UserPublicProfile.tsx:1308 msgid "New dump" msgstr "New dump" @@ -671,6 +669,7 @@ msgstr "New dump" msgid "New password" msgstr "New password" +#: src/components/NewPlaylistForm.tsx:30 #: src/components/NewPlaylistForm.tsx:34 msgid "New playlist" msgstr "New playlist" @@ -679,7 +678,7 @@ msgstr "New playlist" msgid "No dumps in this playlist yet." msgstr "No dumps in this playlist yet." -#: src/pages/Search.tsx:224 +#: src/pages/Search.tsx:215 msgid "No dumps match \"{q}\"." msgstr "No dumps match \"{q}\"." @@ -694,36 +693,36 @@ msgid "No emoji found." msgstr "No emoji found." #: src/pages/UserPlaylists.tsx:439 -#: src/pages/UserPublicProfile.tsx:1157 +#: src/pages/UserPublicProfile.tsx:1133 msgid "No followed playlists yet." msgstr "No followed playlists yet." -#: src/pages/UserPublicProfile.tsx:1202 +#: src/pages/UserPublicProfile.tsx:1178 msgid "No invitees yet." msgstr "No invitees yet." -#: src/pages/Search.tsx:283 +#: src/pages/Search.tsx:274 msgid "No playlists match \"{q}\"." msgstr "No playlists match \"{q}\"." #: src/components/PlaylistMembershipPanel.tsx:34 #: src/pages/UserPlaylists.tsx:397 -#: src/pages/UserPublicProfile.tsx:1068 +#: src/pages/UserPublicProfile.tsx:1044 msgid "No playlists yet." msgstr "No playlists yet." -#: src/pages/Search.tsx:257 +#: src/pages/Search.tsx:248 msgid "No users match \"{q}\"." msgstr "No users match \"{q}\"." -#: src/pages/UserPublicProfile.tsx:1115 +#: src/pages/UserPublicProfile.tsx:1091 msgid "Not following anyone yet." msgstr "Not following anyone yet." #: src/pages/Notifications.tsx:349 #: src/pages/UserDumps.tsx:123 -#: src/pages/UserPublicProfile.tsx:1342 -#: src/pages/UserPublicProfile.tsx:1465 +#: src/pages/UserPublicProfile.tsx:1318 +#: src/pages/UserPublicProfile.tsx:1441 #: src/pages/UserUpvoted.tsx:195 msgid "Nothing here yet." msgstr "Nothing here yet." @@ -737,7 +736,7 @@ msgstr "Notifications" msgid "Notifications ({unreadNotificationCount} unread)" msgstr "Notifications ({unreadNotificationCount} unread)" -#: src/components/SearchBar.tsx:71 +#: src/components/SearchBar.tsx:83 msgid "Open search" msgstr "Open search" @@ -746,7 +745,7 @@ msgid "or <0>browse files" msgstr "or <0>browse files" #: src/pages/UserLogin.tsx:106 -#: src/pages/UserPublicProfile.tsx:1222 +#: src/pages/UserPublicProfile.tsx:1198 msgid "Password" msgstr "Password" @@ -768,17 +767,17 @@ msgstr "Password updated" msgid "Passwords do not match" msgstr "Passwords do not match" -#: src/components/AppHeader.tsx:54 +#: src/components/AppHeader.tsx:82 #: src/components/UserMenu.tsx:62 #: src/pages/Search.tsx:175 #: src/pages/UserPlaylists.tsx:368 -#: src/pages/UserPublicProfile.tsx:975 +#: src/pages/UserPublicProfile.tsx:966 msgid "Playlists" msgstr "Playlists" #. placeholder {0}: playlists.items.length #. placeholder {1}: playlists.hasMore ? "+" : "" -#: src/pages/UserPublicProfile.tsx:1037 +#: src/pages/UserPublicProfile.tsx:1013 msgid "Playlists ({0}{1})" msgstr "Playlists ({0}{1})" @@ -800,6 +799,7 @@ msgid "Posting…" msgstr "Posting…" #: src/components/DumpCard.tsx:104 +#: src/components/JournalCard.tsx:87 #: src/components/PlaylistCard.tsx:73 #: src/components/PlaylistMembershipPanel.tsx:55 #: src/pages/Dump.tsx:287 @@ -879,8 +879,8 @@ msgstr "Retry" #: src/components/CommentThread.tsx:270 #: src/pages/DumpEdit.tsx:306 #: src/pages/PlaylistDetail.tsx:673 -#: src/pages/UserPublicProfile.tsx:833 -#: src/pages/UserPublicProfile.tsx:911 +#: src/pages/UserPublicProfile.tsx:834 +#: src/pages/UserPublicProfile.tsx:913 msgid "Save" msgstr "Save" @@ -888,24 +888,25 @@ msgstr "Save" #: src/components/CommentThread.tsx:269 #: src/pages/PlaylistDetail.tsx:673 #: src/pages/ResetPassword.tsx:152 -#: src/pages/UserPublicProfile.tsx:832 -#: src/pages/UserPublicProfile.tsx:911 +#: src/pages/UserPublicProfile.tsx:833 +#: src/pages/UserPublicProfile.tsx:913 msgid "Saving…" msgstr "Saving…" -#: src/components/SearchBar.tsx:65 +#: src/components/AppHeader.tsx:62 +#: src/components/SearchBar.tsx:77 msgid "Search" msgstr "Search" -#: src/components/SearchBar.tsx:61 +#: src/components/SearchBar.tsx:73 msgid "Search dumps, users, playlists…" msgstr "Search dumps, users, playlists…" -#: src/pages/Search.tsx:218 +#: src/pages/Search.tsx:209 msgid "Search failed" msgstr "Search failed" -#: src/pages/Search.tsx:213 +#: src/pages/Search.tsx:204 msgid "Searching…" msgstr "Searching…" @@ -917,7 +918,7 @@ msgstr "Send reset link" msgid "Sending…" msgstr "Sending…" -#: src/components/AppHeader.tsx:69 +#: src/components/AppHeader.tsx:97 msgid "Server unreachable" msgstr "Server unreachable" @@ -926,7 +927,7 @@ msgstr "Server unreachable" msgid "Set new password" msgstr "Set new password" -#: src/pages/UserPublicProfile.tsx:997 +#: src/pages/UserPublicProfile.tsx:970 msgid "Settings" msgstr "Settings" @@ -934,11 +935,11 @@ msgstr "Settings" msgid "Something went wrong" msgstr "Something went wrong" -#: src/pages/UserPublicProfile.tsx:1241 +#: src/pages/UserPublicProfile.tsx:1217 msgid "Style" msgstr "Style" -#: src/components/SearchBar.tsx:71 +#: src/components/SearchBar.tsx:83 msgid "Submit search" msgstr "Submit search" @@ -950,6 +951,10 @@ msgstr "This invite link is missing, expired, or already used." msgid "This is a mirage." msgstr "This is a mirage." +#: src/pages/NotFound.tsx:10 +msgid "This page does not exist." +msgstr "This page does not exist." + #: src/pages/ResetPassword.tsx:37 msgid "This reset link is missing or malformed." msgstr "This reset link is missing or malformed." @@ -993,7 +998,7 @@ msgstr "Upvoted" #. placeholder {0}: votes.items.length #. placeholder {1}: votes.hasMore ? "+" : "" -#: src/pages/UserPublicProfile.tsx:1017 +#: src/pages/UserPublicProfile.tsx:993 msgid "Upvoted ({0}{1})" msgstr "Upvoted ({0}{1})" @@ -1019,11 +1024,11 @@ msgstr "Username" msgid "Users" msgstr "Users" -#: src/pages/UserPublicProfile.tsx:1087 -#: src/pages/UserPublicProfile.tsx:1130 -#: src/pages/UserPublicProfile.tsx:1172 -#: src/pages/UserPublicProfile.tsx:1363 -#: src/pages/UserPublicProfile.tsx:1495 +#: src/pages/UserPublicProfile.tsx:1063 +#: src/pages/UserPublicProfile.tsx:1106 +#: src/pages/UserPublicProfile.tsx:1148 +#: src/pages/UserPublicProfile.tsx:1339 +#: src/pages/UserPublicProfile.tsx:1471 msgid "View all →" msgstr "View all →" @@ -1036,8 +1041,8 @@ msgstr "View dump →" msgid "What makes it worth it?" msgstr "What makes it worth it?" -#: src/pages/UserPublicProfile.tsx:899 -#: src/pages/UserPublicProfile.tsx:948 +#: src/pages/UserPublicProfile.tsx:901 +#: src/pages/UserPublicProfile.tsx:950 msgid "Who am I?" msgstr "Who am I?" @@ -1058,11 +1063,11 @@ msgstr "Yesterday" 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." -#: src/pages/index/FollowedFeed.tsx:114 +#: src/pages/index/FollowedFeed.tsx:115 #: src/pages/index/HotFeed.tsx:69 #: src/pages/index/JournalFeed.tsx:82 #: src/pages/index/NewFeed.tsx:69 -#: src/pages/Search.tsx:249 +#: src/pages/Search.tsx:240 #: src/pages/UserDumps.tsx:98 #: src/pages/UserPlaylists.tsx:422 #: src/pages/UserPlaylists.tsx:457 diff --git a/src/locales/fr.js b/src/locales/fr.js index 4e367d2..1be4d67 100644 --- a/src/locales/fr.js +++ b/src/locales/fr.js @@ -1 +1,5 @@ -/*eslint-disable*/module.exports={messages:JSON.parse("{\"-K9EZb\":[\"Ajouter un e-mail…\"],\"-OxI15\":[\"Collections suivies\"],\"-Ya-b9\":[\"Enregistrement échoué\"],\"-siMqD\":[\"Journal\"],\"1CalO6\":[\"Style\"],\"1HfJWf\":[\"Rechercher des recos, utilisateurs, collections…\"],\"1cbYY_\":[\"Votés (\",[\"0\"],[\"1\"],\")\"],\"1njn7W\":[\"Clair\"],\"1utXA6\":[\"Recos\"],\"26iNma\":[\"Publier le commentaire\"],\"29VNqC\":[\"Erreur inconnue\"],\"2Hlmdt\":[\"Écrire une réponse…\"],\"2ygf_L\":[\"← Retour\"],\"3KKSM4\":[\"privé\"],\"3yfh3D\":[\"<0>\",[\"0\"],\" a suivi votre collection <1>\",[\"1\"],\"\"],\"49voTZ\":[[\"label\"],\" (\",[\"count\"],\")\"],\"4B6w_o\":[\"Recommandé !\"],\"4GKuCs\":[\"Connexion échouée\"],\"4HH9iB\":[\"Aucun abonnement pour le moment.\"],\"4RtQ1k\":[\"Ne plus suivre \",[\"targetUsername\"]],\"4c-qBx\":[\"Votre mot de passe a été modifié. Vous pouvez maintenant vous connecter.\"],\"4yj9xV\":[\"Les mises à jour en direct sont temporairement interrompues. Tentative de reconnexion…\"],\"5cC8f2\":[\"Modifié le \",[\"0\"]],\"5oD9f_\":[\"Plus tôt\"],\"6Qly-0\":[\"un commentaire\"],\"6gRgw8\":[\"Réessayer\"],\"7PHCIN\":[\"Annuler la suppression\"],\"7d1a0d\":[\"Public\"],\"7sNhEz\":[\"Nom d'utilisateur\"],\"8ZsakT\":[\"Mot de passe\"],\"8pxhI8\":[\"Veuillez sélectionner un fichier.\"],\"9BruTc\":[\"Pourquoi ?\"],\"9l4qcT\":[\"Déposez un fichier de remplacement ici\"],\"9uI_rE\":[\"Annuler\"],\"A0y396\":[\"+ Inviter quelqu'un\"],\"A1taO8\":[\"Rechercher\"],\"AQbgNR\":[\"Suivre \",[\"targetUsername\"]],\"ATGYL1\":[\"Adresse e-mail\"],\"AZctoV\":[[\"0\",\"plural\",{\"one\":[\"#\",\" commentaire\"],\"other\":[\"#\",\" commentaires\"]}]],\"Ade-6d\":[\"Mises à jour en direct indisponibles.\"],\"AeXO77\":[\"Compte\"],\"CI50ct\":[\"Voté\"],\"Cj24wt\":[\"Inscription…\"],\"DPfwMq\":[\"Terminé\"],\"DdeHXH\":[\"Supprimer cette reco ? Cette action est irréversible.\"],\"Dp1JhP\":[\"<0>\",[\"0\"],\" a voté pour <1>\",[\"1\"],\"\"],\"ECiS12\":[\"Voir la reco →\"],\"ExR0Fr\":[\"L'URL est obligatoire.\"],\"F1O9Ep\":[\"Impossible de contacter le serveur\"],\"F5Js1v\":[\"Ne plus suivre la collection\"],\"FgAxTj\":[\"Se déconnecter\"],\"Fxf4jq\":[\"Description (facultatif)\"],\"GNSsCc\":[\"Impossible de créer la collection\"],\"GbqhrN\":[[\"0\"],\"–\",[\"1\"],\" caractères : lettres, chiffres ou tirets bas\"],\"GptGxg\":[\"Changer le mot de passe\"],\"H8pzW-\":[\"Impossible de mettre à jour l'avatar\"],\"HTLDA4\":[\"Chargement…\"],\"I-x669\":[\"Invités\"],\"IZX7TO\":[\"Impossible de générer une invitation\"],\"IagCbF\":[\"URL\"],\"ImOQa9\":[\"Répondre\"],\"J2eKUI\":[\"Fichier\"],\"JJ-Bhk\":[\"Votre adresse e-mail\"],\"JRQitQ\":[\"Confirmer le nouveau mot de passe\"],\"JXr41k\":[\"<0>\",[\"0\"],\" a commenté sur <1>\",[\"1\"],\"\"],\"Jd58Fo\":[\"Tendances\"],\"Jf0PuK\":[\"Aller à la connexion\"],\"KDGWg5\":[\"Retirer de la collection\"],\"K_F6pa\":[\"Enregistrement…\"],\"LLyMkV\":[\"Suivies (\",[\"0\"],[\"1\"],\")\"],\"LPAv9E\":[\"il y a \",[\"days\"],\"j\"],\"MHrjPM\":[\"Titre\"],\"MKEPCY\":[\"Suivre\"],\"Mq2B8E\":[\"il y a \",[\"mins\"],\"min\"],\"Nn4kr3\":[\"+ Nouvelle reco\"],\"Oprv1v\":[\"Mot de passe (min. \",[\"0\"],\" caractères)\"],\"Oz0N9s\":[\"nouveau\"],\"PiH3UR\":[\"Copié !\"],\"Pn2B7_\":[\"Mot de passe actuel\"],\"Pwqkdw\":[\"Chargement…\"],\"Q6n4F4\":[\"Actualiser les métadonnées\"],\"QKsaQr\":[\"ou <0>parcourir les fichiers\"],\"QLtPBd\":[\"Aucune reco dans cette collection pour l'instant.\"],\"R9Khdg\":[\"Auto\"],\"RCcPrX\":[\"Supprimer cette collection ? Cette action est irréversible.\"],\"RTksSy\":[\"<0>\",[\"0\"],\" a commencé à vous suivre\"],\"RaKjrM\":[\"Impossible d'enregistrer la modification\"],\"RcUHRT\":[\"Suivi\"],\"SBTElJ\":[\"Recherche…\"],\"Sad2tK\":[\"Envoi…\"],\"Sxm8rQ\":[\"Utilisateurs\"],\"T9bjWt\":[\"<0>\",[\"0\"],\" a été ajouté à <1>\",[\"1\"],\"\"],\"TM1ZbA\":[\"Collections (\",[\"0\"],[\"1\"],\")\"],\"TN382O\":[\"Lien invalide\"],\"Tv9vbB\":[\"Suivre la collection\"],\"Tz0i8g\":[\"Paramètres\"],\"U7u3q-\":[\"+ Nouveau\"],\"UNMVei\":[\"Mot de passe oublié ?\"],\"UOZith\":[\"Publication échouée\"],\"UTiUFs\":[\"Récupération…\"],\"VCoEm-\":[\"Retour à la connexion\"],\"V_e7nf\":[\"Définir un nouveau mot de passe\"],\"VnNJbN\":[\"De collections\"],\"VyTYmS\":[\"Changer l'avatar\"],\"WhimMi\":[\"Échec de la réinitialisation\"],\"WpXcBJ\":[\"Rien ici pour l'instant.\"],\"WtkMN8\":[\"Toutes les \",[\"0\",\"plural\",{\"one\":[\"#\",\" reco votée\"],\"other\":[\"#\",\" recos votées\"]}],\" chargées.\"],\"XJy2oN\":[\"Connexion…\"],\"Xan6QP\":[\"Nouvelle reco\"],\"XgRtUf\":[\"Impossible de changer le mot de passe\"],\"Xi0Mn4\":[\"← Retour au profil\"],\"XnL-Eu\":[\"Aucun utilisateur ne correspond à « \",[\"q\"],\" ».\"],\"Xs2Lez\":[\"Ce lien de réinitialisation est absent ou malformé.\"],\"YK1Dhc\":[\"une publication\"],\"YpkCca\":[\"Pas encore de collections suivies.\"],\"ZCpU0u\":[\"Aucune collection ne correspond à « \",[\"q\"],\" ».\"],\"ZmD2o6\":[\"Créer et ajouter\"],\"_3O5R_\":[\"Échec de la demande\"],\"_84wxb\":[\"Toutes les \",[\"0\",\"plural\",{\"one\":[\"#\",\" reco\"],\"other\":[\"#\",\" recos\"]}],\" chargées.\"],\"_DwR-n\":[\"Création…\"],\"_R_sGB\":[\"Mot de passe modifié avec succès.\"],\"_aept4\":[\"Publier la réponse\"],\"_nT6AE\":[\"Nouveau mot de passe\"],\"_t4W-i\":[\"De personnes\"],\"a8Ypyu\":[\" Nouvelle collection\"],\"aAIQg2\":[\"Apparence\"],\"aDvLhk\":[\"Ajouter un commentaire…\"],\"b3Thhd\":[\"Envoi échoué\"],\"b8XMJ8\":[[\"visibleCount\",\"plural\",{\"one\":[\"#\",\" commentaire\"],\"other\":[\"#\",\" commentaires\"]}]],\"bQhwn-\":[\"Chargement de la collection…\"],\"cILfnJ\":[\"Supprimer le fichier\"],\"cYP9Sb\":[\"+ Collection\"],\"cbeBbZ\":[\"Au moins \",[\"0\"],\" caractères\"],\"cnGeoo\":[\"Supprimer\"],\"d8DZWS\":[\"Ouvrir la recherche\"],\"dAs22m\":[\"Remplacer le fichier\"],\"dEgA5A\":[\"Annuler\"],\"dMizp8\":[\"Nouvelle collection\"],\"eFSqvc\":[\"Impossible de publier la réponse\"],\"ePK91l\":[\"Modifier\"],\"eaUTwS\":[\"Envoyer le lien de réinitialisation\"],\"ecUA8p\":[\"Aujourd'hui\"],\"ef9nPf\":[\"Chargement de la reco…\"],\"en9o7K\":[\"Impossible de publier le commentaire\"],\"etFQQS\":[\"Pourquoi on en voudrait ?\"],\"fI-mNw\":[\"Collections\"],\"f_akpP\":[\"Max 50 Mo\"],\"fgLNSM\":[\"S'inscrire\"],\"gANddk\":[\"Envoi…\"],\"gGx5tM\":[\"Modification\"],\"gIQQwD\":[\"Chargement échoué\"],\"gLfZlz\":[\"Ajouter à la collection\"],\"gjJ-sb\":[\"Impossible de se connecter au serveur de mises à jour en direct. Les votes et les notifications pourraient ne pas se synchroniser avant la reconnexion.\"],\"hBuUKa\":[\"Changer le mot de passe…\"],\"hD7w09\":[\"Vous avez tout lu, tout vu, tout bu.\"],\"hJSliC\":[\"<0>\",[\"0\"],\" a publié <1>\",[\"1\"],\"\"],\"hYgDIe\":[\"Créer\"],\"he3ygx\":[\"Copier\"],\"i7K_Te\":[\"Qui suis-je ?\"],\"iDNBZe\":[\"Notifications\"],\"ijVyoK\":[\"Impossible de contacter le serveur. Veuillez réessayer.\"],\"ipYn7W\":[\"Si cette adresse est enregistrée, vous recevrez un lien de réinitialisation sous peu.\"],\"isRobC\":[\"Nouveau\"],\"jbernk\":[\"Chargement du profil…\"],\"joEmfT\":[\"Serveur inaccessible\"],\"jrZTZl\":[\"Pas encore de recos. Soyez le premier !\"],\"kLttbL\":[\"Inscription échouée\"],\"klOeIX\":[\"Impossible de changer le mot de passe\"],\"lUDifl\":[\"Créées (\",[\"0\"],[\"1\"],\")\"],\"lUanmi\":[\"Vous serez notifié lorsque quelqu'un suit vos collections, vote pour vos recos ou publie du nouveau contenu.\"],\"lY5h1V\":[[\"0\",\"plural\",{\"one\":[\"#\",\" reco\"],\"other\":[\"#\",\" recos\"]}]],\"lcfvr_\":[\"Supprimer ce commentaire ?\"],\"lpIMne\":[\"Les mots de passe ne correspondent pas\"],\"mt6O6E\":[\"C'est un mirage.\"],\"nbm5sI\":[\"Aucune reco ne correspond à « \",[\"q\"],\" ».\"],\"nrjqON\":[\"Vérification de l'invitation…\"],\"nwtY4N\":[\"Une erreur est survenue\"],\"ogtYkT\":[\"Mot de passe mis à jour\"],\"pCpd9p\":[\"<0>\",[\"0\"],\" vous a mentionné dans <1>\",[\"where\"],\"\"],\"pSheLH\":[\"Aucun invité pour le moment.\"],\"pvnfJD\":[\"Sombre\"],\"qIMfNQ\":[\"Supprimer la collection\"],\"qbDAcy\":[\"Recommander\"],\"qgx_78\":[\"Suivez des collections publiques pour voir leurs recos ici.\"],\"qvFa8r\":[\"public\"],\"r15pMp\":[\" Reco\"],\"rCbqPX\":[\"Ce lien d'invitation est manquant, expiré ou déjà utilisé.\"],\"rg9pXu\":[\"Recherche échouée\"],\"rtpJqV\":[\"Recos (\",[\"0\"],[\"1\"],\")\"],\"sQia9P\":[\"Se connecter\"],\"sTiqbm\":[\"invité par\"],\"sdP5Aa\":[\"[supprimé]\"],\"shHs8T\":[\"Saisissez une recherche.\"],\"smeBfS\":[\"Invitation invalide\"],\"tfDRzk\":[\"Enregistrer\"],\"tvmuQ0\":[\"Thème de couleur\"],\"u1lDX2\":[\"Récupération de l'aperçu…\"],\"uD0qXQ\":[\"Déposez un fichier ici\"],\"uMGUnV\":[\"Pas encore de collections.\"],\"ub1EEL\":[\"modifié \",[\"0\"]],\"vJBF1r\":[\"Publication…\"],\"vLhLLO\":[\"Notifications (\",[\"unreadNotificationCount\"],\" non lues)\"],\"vuosjb\":[\"Menu utilisateur\"],\"wXO4Tg\":[\"il y a \",[\"hrs\"],\"h\"],\"wbXKOv\":[\"Fichier trop volumineux (max 50 Mo).\"],\"wixIgH\":[\"Vous avez déjà un compte ? <0>Se connecter\"],\"xEWkgZ\":[\"← Retour à toutes les recos\"],\"xOTzt5\":[\"à l'instant\"],\"xPHtx0\":[\"Lancer la recherche\"],\"xVuNgt\":[\"+ Nouvelle collection\"],\"xc9O_u\":[\"Supprimer la reco\"],\"xy6Wtk\":[\" Nouvelle reco\"],\"y6sq5j\":[\"Abonné\"],\"yA_6BX\":[\"Tout voir →\"],\"yBBtRm\":[\"Suivez des utilisateurs pour voir leurs recos ici.\"],\"yQ2kGp\":[\"Charger plus\"],\"y_0uwd\":[\"Hier\"],\"yz7wBu\":[\"Fermer\"],\"z1uNN0\":[\"Aucun emoji trouvé.\"],\"zVuxvN\":[\"Actualisation…\"],\"zwBp5t\":[\"Privé\"]}")}; \ No newline at end of file +/*eslint-disable*/ module.exports = { + messages: JSON.parse( + '{"-K9EZb":["Ajouter un e-mail…"],"-OxI15":["Collections suivies"],"-Ya-b9":["Enregistrement échoué"],"-siMqD":["Journal"],"1CalO6":["Style"],"1HfJWf":["Rechercher des recos, utilisateurs, collections…"],"1cbYY_":["Votés (",["0"],["1"],")"],"1njn7W":["Clair"],"1utXA6":["Recos"],"26iNma":["Publier le commentaire"],"29VNqC":["Erreur inconnue"],"2Hlmdt":["Écrire une réponse…"],"2ygf_L":["← Retour"],"3KKSM4":["privé"],"3yfh3D":["<0>",["0"]," a suivi votre collection <1>",["1"],""],"49voTZ":[["label"]," (",["count"],")"],"4B6w_o":["Recommandé !"],"4GKuCs":["Connexion échouée"],"4HH9iB":["Aucun abonnement pour le moment."],"4RtQ1k":["Ne plus suivre ",["targetUsername"]],"4c-qBx":["Votre mot de passe a été modifié. Vous pouvez maintenant vous connecter."],"4yj9xV":["Les mises à jour en direct sont temporairement interrompues. Tentative de reconnexion…"],"5TviPn":["Annuler la recherche"],"5cC8f2":["Modifié le ",["0"]],"5oD9f_":["Plus tôt"],"6Qly-0":["un commentaire"],"6gRgw8":["Réessayer"],"7PHCIN":["Annuler la suppression"],"7d1a0d":["Public"],"7sNhEz":["Nom d\'utilisateur"],"8ZsakT":["Mot de passe"],"8pxhI8":["Veuillez sélectionner un fichier."],"9BruTc":["Pourquoi ?"],"9l4qcT":["Déposez un fichier de remplacement ici"],"9uI_rE":["Annuler"],"A0y396":["+ Inviter quelqu\'un"],"A1taO8":["Rechercher"],"AQbgNR":["Suivre ",["targetUsername"]],"ATGYL1":["Adresse e-mail"],"AZctoV":[["0","plural",{"one":["#"," commentaire"],"other":["#"," commentaires"]}]],"Ade-6d":["Mises à jour en direct indisponibles."],"AeXO77":["Compte"],"CI50ct":["Voté"],"Cj24wt":["Inscription…"],"DPfwMq":["Terminé"],"DdeHXH":["Supprimer cette reco ? Cette action est irréversible."],"Dp1JhP":["<0>",["0"]," a voté pour <1>",["1"],""],"ECiS12":["Voir la reco →"],"ExR0Fr":["L\'URL est obligatoire."],"F1O9Ep":["Impossible de contacter le serveur"],"F5Js1v":["Ne plus suivre la collection"],"FgAxTj":["Se déconnecter"],"Fxf4jq":["Description (facultatif)"],"GNSsCc":["Impossible de créer la collection"],"GbqhrN":[["0"],"–",["1"]," caractères : lettres, chiffres ou tirets bas"],"GptGxg":["Changer le mot de passe"],"H8pzW-":["Impossible de mettre à jour l\'avatar"],"HTLDA4":["Chargement…"],"I-x669":["Invités"],"IZX7TO":["Impossible de générer une invitation"],"IagCbF":["URL"],"ImOQa9":["Répondre"],"J2eKUI":["Fichier"],"JJ-Bhk":["Votre adresse e-mail"],"JRQitQ":["Confirmer le nouveau mot de passe"],"JXr41k":["<0>",["0"]," a commenté sur <1>",["1"],""],"Jd58Fo":["Tendances"],"Jf0PuK":["Aller à la connexion"],"KDGWg5":["Retirer de la collection"],"K_F6pa":["Enregistrement…"],"LLyMkV":["Suivies (",["0"],["1"],")"],"LPAv9E":["il y a ",["days"],"j"],"MHrjPM":["Titre"],"MKEPCY":["Suivre"],"Mq2B8E":["il y a ",["mins"],"min"],"Nn4kr3":["+ Nouvelle reco"],"Oprv1v":["Mot de passe (min. ",["0"]," caractères)"],"Oz0N9s":["nouveau"],"PiH3UR":["Copié !"],"Pn2B7_":["Mot de passe actuel"],"Pwqkdw":["Chargement…"],"Q6n4F4":["Actualiser les métadonnées"],"QKsaQr":["ou <0>parcourir les fichiers"],"QLtPBd":["Aucune reco dans cette collection pour l\'instant."],"R9Khdg":["Auto"],"RCcPrX":["Supprimer cette collection ? Cette action est irréversible."],"RTksSy":["<0>",["0"]," a commencé à vous suivre"],"RaKjrM":["Impossible d\'enregistrer la modification"],"RcUHRT":["Suivi"],"SBTElJ":["Recherche…"],"Sad2tK":["Envoi…"],"StovX6":["Rien à voir, circulez."],"Sxm8rQ":["Utilisateurs"],"T9bjWt":["<0>",["0"]," a été ajouté à <1>",["1"],""],"TM1ZbA":["Collections (",["0"],["1"],")"],"TN382O":["Lien invalide"],"Tv9vbB":["Suivre la collection"],"Tz0i8g":["Paramètres"],"UNMVei":["Mot de passe oublié ?"],"UOZith":["Publication échouée"],"UTiUFs":["Récupération…"],"VCoEm-":["Retour à la connexion"],"V_e7nf":["Définir un nouveau mot de passe"],"VnNJbN":["De collections"],"VyTYmS":["Changer l\'avatar"],"WhimMi":["Échec de la réinitialisation"],"WpXcBJ":["Rien ici pour l\'instant."],"WtkMN8":["Toutes les ",["0","plural",{"one":["#"," reco votée"],"other":["#"," recos votées"]}]," chargées."],"XJy2oN":["Connexion…"],"Xan6QP":["Nouvelle reco"],"XgRtUf":["Impossible de changer le mot de passe"],"Xi0Mn4":["← Retour au profil"],"XnL-Eu":["Aucun utilisateur ne correspond à « ",["q"]," »."],"Xs2Lez":["Ce lien de réinitialisation est absent ou malformé."],"YK1Dhc":["une publication"],"YpkCca":["Pas encore de collections suivies."],"ZCpU0u":["Aucune collection ne correspond à « ",["q"]," »."],"ZmD2o6":["Créer et ajouter"],"_3O5R_":["Échec de la demande"],"_84wxb":["Toutes les ",["0","plural",{"one":["#"," reco"],"other":["#"," recos"]}]," chargées."],"_DwR-n":["Création…"],"_R_sGB":["Mot de passe modifié avec succès."],"_aept4":["Publier la réponse"],"_nT6AE":["Nouveau mot de passe"],"_t4W-i":["De personnes"],"aAIQg2":["Apparence"],"aDvLhk":["Ajouter un commentaire…"],"b3Thhd":["Envoi échoué"],"b8XMJ8":[["visibleCount","plural",{"one":["#"," commentaire"],"other":["#"," commentaires"]}]],"bQhwn-":["Chargement de la collection…"],"cILfnJ":["Supprimer le fichier"],"cYP9Sb":["+ Collection"],"cbeBbZ":["Au moins ",["0"]," caractères"],"cnGeoo":["Supprimer"],"d8DZWS":["Ouvrir la recherche"],"dAs22m":["Remplacer le fichier"],"dEgA5A":["Annuler"],"dMizp8":["Nouvelle collection"],"eFSqvc":["Impossible de publier la réponse"],"ePK91l":["Modifier"],"eaUTwS":["Envoyer le lien de réinitialisation"],"ecUA8p":["Aujourd\'hui"],"ef9nPf":["Chargement de la reco…"],"en9o7K":["Impossible de publier le commentaire"],"etFQQS":["Pourquoi on en voudrait ?"],"fI-mNw":["Collections"],"f_akpP":["Max 50 Mo"],"fgLNSM":["S\'inscrire"],"gANddk":["Envoi…"],"gGx5tM":["Modification"],"gIQQwD":["Chargement échoué"],"gLfZlz":["Ajouter à la collection"],"gjJ-sb":["Impossible de se connecter au serveur de mises à jour en direct. Les votes et les notifications pourraient ne pas se synchroniser avant la reconnexion."],"hBuUKa":["Changer le mot de passe…"],"hD7w09":["Vous avez tout lu, tout vu, tout bu."],"hJSliC":["<0>",["0"]," a publié <1>",["1"],""],"hYgDIe":["Créer"],"he3ygx":["Copier"],"i7K_Te":["Qui suis-je ?"],"iDNBZe":["Notifications"],"iWpEwy":["Accueil"],"ijVyoK":["Impossible de contacter le serveur. Veuillez réessayer."],"ipYn7W":["Si cette adresse est enregistrée, vous recevrez un lien de réinitialisation sous peu."],"isRobC":["Nouveau"],"jbernk":["Chargement du profil…"],"joEmfT":["Serveur inaccessible"],"jrZTZl":["Pas encore de recos. Soyez le premier !"],"kLttbL":["Inscription échouée"],"klOeIX":["Impossible de changer le mot de passe"],"lUDifl":["Créées (",["0"],["1"],")"],"lUanmi":["Vous serez notifié lorsque quelqu\'un suit vos collections, vote pour vos recos ou publie du nouveau contenu."],"lY5h1V":[["0","plural",{"one":["#"," reco"],"other":["#"," recos"]}]],"lcfvr_":["Supprimer ce commentaire ?"],"lpIMne":["Les mots de passe ne correspondent pas"],"mt6O6E":["C\'est un mirage."],"nbm5sI":["Aucune reco ne correspond à « ",["q"]," »."],"nrjqON":["Vérification de l\'invitation…"],"nwtY4N":["Une erreur est survenue"],"ogtYkT":["Mot de passe mis à jour"],"pCpd9p":["<0>",["0"]," vous a mentionné dans <1>",["where"],""],"pSheLH":["Aucun invité pour le moment."],"pvnfJD":["Sombre"],"qIMfNQ":["Supprimer la collection"],"qbDAcy":["Recommander"],"qgx_78":["Suivez des collections publiques pour voir leurs recos ici."],"qvFa8r":["public"],"qvz_Pp":["Reco"],"rCbqPX":["Ce lien d\'invitation est manquant, expiré ou déjà utilisé."],"rg9pXu":["Recherche échouée"],"rtpJqV":["Recos (",["0"],["1"],")"],"sQia9P":["Se connecter"],"sTiqbm":["invité par"],"sdP5Aa":["[supprimé]"],"shHs8T":["Saisissez une recherche."],"smeBfS":["Invitation invalide"],"tfDRzk":["Enregistrer"],"tvmuQ0":["Thème de couleur"],"u1lDX2":["Récupération de l\'aperçu…"],"uD0qXQ":["Déposez un fichier ici"],"uMGUnV":["Pas encore de collections."],"ub1EEL":["modifié ",["0"]],"vJBF1r":["Publication…"],"vLhLLO":["Notifications (",["unreadNotificationCount"]," non lues)"],"vuosjb":["Menu utilisateur"],"wXO4Tg":["il y a ",["hrs"],"h"],"wbXKOv":["Fichier trop volumineux (max 50 Mo)."],"wixIgH":["Vous avez déjà un compte ? <0>Se connecter"],"xEWkgZ":["← Retour à toutes les recos"],"xOTzt5":["à l\'instant"],"xPHtx0":["Lancer la recherche"],"xVuNgt":["+ Nouvelle collection"],"xc9O_u":["Supprimer la reco"],"y6sq5j":["Abonné"],"yA_6BX":["Tout voir →"],"yBBtRm":["Suivez des utilisateurs pour voir leurs recos ici."],"yQ2kGp":["Charger plus"],"y_0uwd":["Hier"],"yz7wBu":["Fermer"],"z1uNN0":["Aucun emoji trouvé."],"zVuxvN":["Actualisation…"],"zwBp5t":["Privé"]}', + ), +}; diff --git a/src/locales/fr.po b/src/locales/fr.po index 4baa886..55636b4 100644 --- a/src/locales/fr.po +++ b/src/locales/fr.po @@ -13,25 +13,13 @@ msgstr "" "Last-Translator: \n" "Language-Team: \n" -#: src/components/AppHeader.tsx:71 -msgid " Dump" -msgstr " Reco" - -#: src/pages/UserDumps.tsx:114 -#: src/pages/UserPublicProfile.tsx:1332 -msgid " New dump" -msgstr " Nouvelle reco" - -#: src/components/NewPlaylistForm.tsx:30 -msgid " New playlist" -msgstr " Nouvelle collection" - #: src/components/CommentThread.tsx:176 msgid "[deleted]" msgstr "[supprimé]" #. placeholder {0}: dump.commentCount #: src/components/DumpCard.tsx:95 +#: src/components/JournalCard.tsx:78 msgid "{0, plural, one {# comment} other {# comments}}" msgstr "{0, plural, one {# commentaire} other {# commentaires}}" @@ -83,14 +71,10 @@ msgstr "← Retour à toutes les recos" msgid "← Back to profile" msgstr "← Retour au profil" -#: src/pages/UserPublicProfile.tsx:100 +#: src/pages/UserPublicProfile.tsx:101 msgid "+ Invite someone" msgstr "+ Inviter quelqu'un" -#: src/components/AppHeader.tsx:71 -msgid "+ New" -msgstr "+ Nouveau" - #: src/pages/UserDumps.tsx:114 #: src/pages/UserPublicProfile.tsx:1332 msgid "+ New dump" @@ -152,7 +136,7 @@ msgstr "un commentaire" msgid "a post" msgstr "une publication" -#: src/pages/UserPublicProfile.tsx:1217 +#: src/pages/UserPublicProfile.tsx:1193 msgid "Account" msgstr "Compte" @@ -160,7 +144,7 @@ msgstr "Compte" msgid "Add a comment…" msgstr "Ajouter un commentaire…" -#: src/pages/UserPublicProfile.tsx:859 +#: src/pages/UserPublicProfile.tsx:860 msgid "Add email…" msgstr "Ajouter un e-mail…" @@ -181,7 +165,7 @@ msgstr "Toutes les {0, plural, one {# reco votée} other {# recos votées}} char msgid "Already have an account? <0>Log in" msgstr "Vous avez déjà un compte ? <0>Se connecter" -#: src/pages/UserPublicProfile.tsx:1236 +#: src/pages/UserPublicProfile.tsx:1212 msgid "Appearance" msgstr "Apparence" @@ -191,7 +175,7 @@ msgstr "Apparence" msgid "At least {0} characters" msgstr "Au moins {0} caractères" -#: src/pages/UserPublicProfile.tsx:1270 +#: src/pages/UserPublicProfile.tsx:1246 msgid "Auto" msgstr "Auto" @@ -214,8 +198,8 @@ msgstr "Impossible de se connecter au serveur de mises à jour en direct. Les vo #: src/components/PlaylistCreateForm.tsx:112 #: src/pages/DumpEdit.tsx:299 #: src/pages/PlaylistDetail.tsx:680 -#: src/pages/UserPublicProfile.tsx:841 -#: src/pages/UserPublicProfile.tsx:919 +#: src/pages/UserPublicProfile.tsx:842 +#: src/pages/UserPublicProfile.tsx:921 msgid "Cancel" msgstr "Annuler" @@ -223,6 +207,10 @@ msgstr "Annuler" msgid "Cancel removal" msgstr "Annuler la suppression" +#: src/components/AppHeader.tsx:62 +msgid "Cancel search" +msgstr "Annuler la recherche" + #: src/pages/UserPublicProfile.tsx:772 msgid "Change avatar" msgstr "Changer l'avatar" @@ -232,7 +220,7 @@ msgstr "Changer l'avatar" msgid "Change password" msgstr "Changer le mot de passe" -#: src/pages/UserPublicProfile.tsx:1229 +#: src/pages/UserPublicProfile.tsx:1205 msgid "Change password…" msgstr "Changer le mot de passe…" @@ -245,7 +233,7 @@ msgstr "Vérification de l'invitation…" msgid "Close" msgstr "Fermer" -#: src/pages/UserPublicProfile.tsx:1262 +#: src/pages/UserPublicProfile.tsx:1238 msgid "Color scheme" msgstr "Thème de couleur" @@ -254,11 +242,11 @@ msgstr "Thème de couleur" msgid "Confirm new password" msgstr "Confirmer le nouveau mot de passe" -#: src/pages/UserPublicProfile.tsx:91 +#: src/pages/UserPublicProfile.tsx:92 msgid "Copied!" msgstr "Copié !" -#: src/pages/UserPublicProfile.tsx:91 +#: src/pages/UserPublicProfile.tsx:92 msgid "Copy" msgstr "Copier" @@ -299,7 +287,7 @@ msgstr "Création…" msgid "Current password" msgstr "Mot de passe actuel" -#: src/pages/UserPublicProfile.tsx:1284 +#: src/pages/UserPublicProfile.tsx:1260 msgid "Dark" msgstr "Sombre" @@ -351,6 +339,10 @@ msgstr "Déposez un fichier ici" msgid "Drop a replacement here" msgstr "Déposez un fichier de remplacement ici" +#: src/components/AppHeader.tsx:99 +msgid "Dump" +msgstr "Reco" + #: src/components/DumpCreateModal.tsx:427 msgid "Dump it" msgstr "Recommander" @@ -361,13 +353,13 @@ msgstr "Recommandé !" #: src/pages/Search.tsx:172 #: src/pages/UserDumps.tsx:107 -#: src/pages/UserPublicProfile.tsx:968 +#: src/pages/UserPublicProfile.tsx:965 msgid "Dumps" msgstr "Recos" #. placeholder {0}: dumps.items.length #. placeholder {1}: dumps.hasMore ? "+" : "" -#: src/pages/UserPublicProfile.tsx:1006 +#: src/pages/UserPublicProfile.tsx:982 msgid "Dumps ({0}{1})" msgstr "Recos ({0}{1})" @@ -407,7 +399,7 @@ msgstr "Modification" msgid "Email address" msgstr "Adresse e-mail" -#: src/pages/Search.tsx:207 +#: src/pages/Search.tsx:198 msgid "Enter a query to search." msgstr "Saisissez une recherche." @@ -420,20 +412,20 @@ msgstr "Impossible de changer le mot de passe" msgid "Failed to create playlist" msgstr "Impossible de créer la collection" -#: src/pages/UserPublicProfile.tsx:72 -#: src/pages/UserPublicProfile.tsx:75 -#: src/pages/UserPublicProfile.tsx:103 +#: src/pages/UserPublicProfile.tsx:73 +#: src/pages/UserPublicProfile.tsx:76 +#: src/pages/UserPublicProfile.tsx:104 msgid "Failed to generate invite" msgstr "Impossible de générer une invitation" -#: src/pages/index/FollowedFeed.tsx:81 +#: src/pages/index/FollowedFeed.tsx:82 #: src/pages/index/HotFeed.tsx:36 #: src/pages/index/JournalFeed.tsx:48 #: src/pages/index/NewFeed.tsx:36 #: src/pages/Notifications.tsx:342 -#: src/pages/UserPublicProfile.tsx:1108 -#: src/pages/UserPublicProfile.tsx:1150 -#: src/pages/UserPublicProfile.tsx:1195 +#: src/pages/UserPublicProfile.tsx:1084 +#: src/pages/UserPublicProfile.tsx:1126 +#: src/pages/UserPublicProfile.tsx:1171 msgid "Failed to load" msgstr "Chargement échoué" @@ -452,8 +444,8 @@ msgstr "Impossible de publier la réponse" #: src/pages/PlaylistDetail.tsx:789 #: src/pages/UserPublicProfile.tsx:680 #: src/pages/UserPublicProfile.tsx:718 -#: src/pages/UserPublicProfile.tsx:845 -#: src/pages/UserPublicProfile.tsx:922 +#: src/pages/UserPublicProfile.tsx:846 +#: src/pages/UserPublicProfile.tsx:924 msgid "Failed to save" msgstr "Enregistrement échoué" @@ -461,7 +453,7 @@ msgstr "Enregistrement échoué" msgid "Failed to save edit" msgstr "Impossible d'enregistrer la modification" -#: src/pages/UserPublicProfile.tsx:868 +#: src/pages/UserPublicProfile.tsx:869 msgid "Failed to update avatar" msgstr "Impossible de mettre à jour l'avatar" @@ -495,16 +487,16 @@ msgstr "Suivre {targetUsername}" msgid "Follow playlist" msgstr "Suivre la collection" -#: src/pages/index/FollowedFeed.tsx:371 +#: src/pages/index/FollowedFeed.tsx:365 msgid "Follow some public playlists to see their dumps here." msgstr "Suivez des collections publiques pour voir leurs recos ici." -#: src/pages/index/FollowedFeed.tsx:357 +#: src/pages/index/FollowedFeed.tsx:351 msgid "Follow some users to see their dumps here." msgstr "Suivez des utilisateurs pour voir leurs recos ici." -#: src/components/FeedTabBar.tsx:48 -#: src/pages/UserPublicProfile.tsx:982 +#: src/components/FeedTabBar.tsx:19 +#: src/pages/UserPublicProfile.tsx:967 msgid "Followed" msgstr "Suivi" @@ -514,13 +506,13 @@ msgstr "Suivi" msgid "Followed ({0}{1})" msgstr "Suivies ({0}{1})" -#: src/pages/UserPublicProfile.tsx:1139 +#: src/pages/UserPublicProfile.tsx:1115 msgid "Followed playlists" msgstr "Collections suivies" #: src/components/FollowButton.tsx:37 #: src/components/FollowButton.tsx:64 -#: src/pages/UserPublicProfile.tsx:1097 +#: src/pages/UserPublicProfile.tsx:1073 msgid "Following" msgstr "Abonné" @@ -528,19 +520,23 @@ msgstr "Abonné" msgid "Forgot password?" msgstr "Mot de passe oublié ?" -#: src/pages/index/FollowedFeed.tsx:337 +#: src/pages/index/FollowedFeed.tsx:334 msgid "From people" msgstr "De personnes" -#: src/pages/index/FollowedFeed.tsx:344 +#: src/pages/index/FollowedFeed.tsx:335 msgid "From playlists" msgstr "De collections" +#: src/pages/NotFound.tsx:13 +msgid "Go home" +msgstr "Accueil" + #: src/pages/ResetPassword.tsx:66 msgid "Go to login" msgstr "Aller à la connexion" -#: src/components/FeedTabBar.tsx:26 +#: src/components/FeedTabBar.tsx:16 msgid "Hot" msgstr "Tendances" @@ -556,16 +552,16 @@ msgstr "Invitation invalide" msgid "Invalid link" msgstr "Lien invalide" -#: src/pages/UserPublicProfile.tsx:790 +#: src/pages/UserPublicProfile.tsx:791 msgid "invited by" msgstr "invité par" -#: src/pages/UserPublicProfile.tsx:989 -#: src/pages/UserPublicProfile.tsx:1184 +#: src/pages/UserPublicProfile.tsx:968 +#: src/pages/UserPublicProfile.tsx:1160 msgid "Invitees" msgstr "Invités" -#: src/components/FeedTabBar.tsx:40 +#: src/components/FeedTabBar.tsx:18 msgid "Journal" msgstr "Journal" @@ -573,7 +569,7 @@ msgstr "Journal" msgid "just now" msgstr "à l'instant" -#: src/pages/UserPublicProfile.tsx:1277 +#: src/pages/UserPublicProfile.tsx:1253 msgid "Light" msgstr "Clair" @@ -581,7 +577,7 @@ msgstr "Clair" msgid "Live updates are temporarily disconnected. Trying to reconnect…" msgstr "Les mises à jour en direct sont temporairement interrompues. Tentative de reconnexion…" -#: src/components/AppHeader.tsx:88 +#: src/components/AppHeader.tsx:125 msgid "Live updates unavailable." msgstr "Mises à jour en direct indisponibles." @@ -594,11 +590,11 @@ msgstr "Charger plus" msgid "Loading dump…" msgstr "Chargement de la reco…" -#: src/pages/index/FollowedFeed.tsx:109 +#: src/pages/index/FollowedFeed.tsx:110 #: src/pages/index/HotFeed.tsx:64 #: src/pages/index/JournalFeed.tsx:77 #: src/pages/index/NewFeed.tsx:64 -#: src/pages/Search.tsx:244 +#: src/pages/Search.tsx:235 #: src/pages/UserDumps.tsx:93 #: src/pages/UserPlaylists.tsx:417 #: src/pages/UserPlaylists.tsx:452 @@ -616,7 +612,7 @@ msgstr "Chargement du profil…" #: src/components/PlaylistMembershipPanel.tsx:28 #: src/components/TextEditor.tsx:289 -#: src/pages/index/FollowedFeed.tsx:76 +#: src/pages/index/FollowedFeed.tsx:77 #: src/pages/index/HotFeed.tsx:32 #: src/pages/index/JournalFeed.tsx:44 #: src/pages/index/NewFeed.tsx:32 @@ -624,21 +620,21 @@ msgstr "Chargement du profil…" #: src/pages/Notifications.tsx:414 #: src/pages/UserDumps.tsx:51 #: src/pages/UserPlaylists.tsx:342 -#: src/pages/UserPublicProfile.tsx:1102 -#: src/pages/UserPublicProfile.tsx:1144 -#: src/pages/UserPublicProfile.tsx:1189 +#: src/pages/UserPublicProfile.tsx:1078 +#: src/pages/UserPublicProfile.tsx:1120 +#: src/pages/UserPublicProfile.tsx:1165 #: src/pages/UserUpvoted.tsx:123 msgid "Loading…" msgstr "Chargement…" -#: src/components/AppHeader.tsx:78 +#: src/components/AppHeader.tsx:106 #: src/pages/UserLogin.tsx:87 #: src/pages/UserLogin.tsx:117 msgid "Log in" msgstr "Se connecter" #: src/pages/UserPublicProfile.tsx:749 -#: src/pages/UserPublicProfile.tsx:882 +#: src/pages/UserPublicProfile.tsx:883 msgid "Log out" msgstr "Se déconnecter" @@ -658,11 +654,13 @@ msgstr "Max 50 Mo" msgid "new" msgstr "nouveau" -#: src/components/FeedTabBar.tsx:33 +#: src/components/FeedTabBar.tsx:17 msgid "New" msgstr "Nouveau" #: src/components/DumpCreateModal.tsx:277 +#: src/pages/UserDumps.tsx:114 +#: src/pages/UserPublicProfile.tsx:1308 msgid "New dump" msgstr "Nouvelle reco" @@ -671,6 +669,7 @@ msgstr "Nouvelle reco" msgid "New password" msgstr "Nouveau mot de passe" +#: src/components/NewPlaylistForm.tsx:30 #: src/components/NewPlaylistForm.tsx:34 msgid "New playlist" msgstr "Nouvelle collection" @@ -679,7 +678,7 @@ msgstr "Nouvelle collection" msgid "No dumps in this playlist yet." msgstr "Aucune reco dans cette collection pour l'instant." -#: src/pages/Search.tsx:224 +#: src/pages/Search.tsx:215 msgid "No dumps match \"{q}\"." msgstr "Aucune reco ne correspond à « {q} »." @@ -694,36 +693,36 @@ msgid "No emoji found." msgstr "Aucun emoji trouvé." #: src/pages/UserPlaylists.tsx:439 -#: src/pages/UserPublicProfile.tsx:1157 +#: src/pages/UserPublicProfile.tsx:1133 msgid "No followed playlists yet." msgstr "Pas encore de collections suivies." -#: src/pages/UserPublicProfile.tsx:1202 +#: src/pages/UserPublicProfile.tsx:1178 msgid "No invitees yet." msgstr "Aucun invité pour le moment." -#: src/pages/Search.tsx:283 +#: src/pages/Search.tsx:274 msgid "No playlists match \"{q}\"." msgstr "Aucune collection ne correspond à « {q} »." #: src/components/PlaylistMembershipPanel.tsx:34 #: src/pages/UserPlaylists.tsx:397 -#: src/pages/UserPublicProfile.tsx:1068 +#: src/pages/UserPublicProfile.tsx:1044 msgid "No playlists yet." msgstr "Pas encore de collections." -#: src/pages/Search.tsx:257 +#: src/pages/Search.tsx:248 msgid "No users match \"{q}\"." msgstr "Aucun utilisateur ne correspond à « {q} »." -#: src/pages/UserPublicProfile.tsx:1115 +#: src/pages/UserPublicProfile.tsx:1091 msgid "Not following anyone yet." msgstr "Aucun abonnement pour le moment." #: src/pages/Notifications.tsx:349 #: src/pages/UserDumps.tsx:123 -#: src/pages/UserPublicProfile.tsx:1342 -#: src/pages/UserPublicProfile.tsx:1465 +#: src/pages/UserPublicProfile.tsx:1318 +#: src/pages/UserPublicProfile.tsx:1441 #: src/pages/UserUpvoted.tsx:195 msgid "Nothing here yet." msgstr "Rien ici pour l'instant." @@ -737,7 +736,7 @@ msgstr "Notifications" msgid "Notifications ({unreadNotificationCount} unread)" msgstr "Notifications ({unreadNotificationCount} non lues)" -#: src/components/SearchBar.tsx:71 +#: src/components/SearchBar.tsx:83 msgid "Open search" msgstr "Ouvrir la recherche" @@ -746,7 +745,7 @@ msgid "or <0>browse files" msgstr "ou <0>parcourir les fichiers" #: src/pages/UserLogin.tsx:106 -#: src/pages/UserPublicProfile.tsx:1222 +#: src/pages/UserPublicProfile.tsx:1198 msgid "Password" msgstr "Mot de passe" @@ -768,17 +767,17 @@ msgstr "Mot de passe mis à jour" msgid "Passwords do not match" msgstr "Les mots de passe ne correspondent pas" -#: src/components/AppHeader.tsx:54 +#: src/components/AppHeader.tsx:82 #: src/components/UserMenu.tsx:62 #: src/pages/Search.tsx:175 #: src/pages/UserPlaylists.tsx:368 -#: src/pages/UserPublicProfile.tsx:975 +#: src/pages/UserPublicProfile.tsx:966 msgid "Playlists" msgstr "Collections" #. placeholder {0}: playlists.items.length #. placeholder {1}: playlists.hasMore ? "+" : "" -#: src/pages/UserPublicProfile.tsx:1037 +#: src/pages/UserPublicProfile.tsx:1013 msgid "Playlists ({0}{1})" msgstr "Collections ({0}{1})" @@ -800,6 +799,7 @@ msgid "Posting…" msgstr "Publication…" #: src/components/DumpCard.tsx:104 +#: src/components/JournalCard.tsx:87 #: src/components/PlaylistCard.tsx:73 #: src/components/PlaylistMembershipPanel.tsx:55 #: src/pages/Dump.tsx:287 @@ -879,8 +879,8 @@ msgstr "Réessayer" #: src/components/CommentThread.tsx:270 #: src/pages/DumpEdit.tsx:306 #: src/pages/PlaylistDetail.tsx:673 -#: src/pages/UserPublicProfile.tsx:833 -#: src/pages/UserPublicProfile.tsx:911 +#: src/pages/UserPublicProfile.tsx:834 +#: src/pages/UserPublicProfile.tsx:913 msgid "Save" msgstr "Enregistrer" @@ -888,24 +888,25 @@ msgstr "Enregistrer" #: src/components/CommentThread.tsx:269 #: src/pages/PlaylistDetail.tsx:673 #: src/pages/ResetPassword.tsx:152 -#: src/pages/UserPublicProfile.tsx:832 -#: src/pages/UserPublicProfile.tsx:911 +#: src/pages/UserPublicProfile.tsx:833 +#: src/pages/UserPublicProfile.tsx:913 msgid "Saving…" msgstr "Enregistrement…" -#: src/components/SearchBar.tsx:65 +#: src/components/AppHeader.tsx:62 +#: src/components/SearchBar.tsx:77 msgid "Search" msgstr "Rechercher" -#: src/components/SearchBar.tsx:61 +#: src/components/SearchBar.tsx:73 msgid "Search dumps, users, playlists…" msgstr "Rechercher des recos, utilisateurs, collections…" -#: src/pages/Search.tsx:218 +#: src/pages/Search.tsx:209 msgid "Search failed" msgstr "Recherche échouée" -#: src/pages/Search.tsx:213 +#: src/pages/Search.tsx:204 msgid "Searching…" msgstr "Recherche…" @@ -917,7 +918,7 @@ msgstr "Envoyer le lien de réinitialisation" msgid "Sending…" msgstr "Envoi…" -#: src/components/AppHeader.tsx:69 +#: src/components/AppHeader.tsx:97 msgid "Server unreachable" msgstr "Serveur inaccessible" @@ -926,7 +927,7 @@ msgstr "Serveur inaccessible" msgid "Set new password" msgstr "Définir un nouveau mot de passe" -#: src/pages/UserPublicProfile.tsx:997 +#: src/pages/UserPublicProfile.tsx:970 msgid "Settings" msgstr "Paramètres" @@ -934,11 +935,11 @@ msgstr "Paramètres" msgid "Something went wrong" msgstr "Une erreur est survenue" -#: src/pages/UserPublicProfile.tsx:1241 +#: src/pages/UserPublicProfile.tsx:1217 msgid "Style" msgstr "Style" -#: src/components/SearchBar.tsx:71 +#: src/components/SearchBar.tsx:83 msgid "Submit search" msgstr "Lancer la recherche" @@ -950,6 +951,10 @@ msgstr "Ce lien d'invitation est manquant, expiré ou déjà utilisé." msgid "This is a mirage." msgstr "C'est un mirage." +#: src/pages/NotFound.tsx:10 +msgid "This page does not exist." +msgstr "Rien à voir, circulez." + #: src/pages/ResetPassword.tsx:37 msgid "This reset link is missing or malformed." msgstr "Ce lien de réinitialisation est absent ou malformé." @@ -993,7 +998,7 @@ msgstr "Voté" #. placeholder {0}: votes.items.length #. placeholder {1}: votes.hasMore ? "+" : "" -#: src/pages/UserPublicProfile.tsx:1017 +#: src/pages/UserPublicProfile.tsx:993 msgid "Upvoted ({0}{1})" msgstr "Votés ({0}{1})" @@ -1019,11 +1024,11 @@ msgstr "Nom d'utilisateur" msgid "Users" msgstr "Utilisateurs" -#: src/pages/UserPublicProfile.tsx:1087 -#: src/pages/UserPublicProfile.tsx:1130 -#: src/pages/UserPublicProfile.tsx:1172 -#: src/pages/UserPublicProfile.tsx:1363 -#: src/pages/UserPublicProfile.tsx:1495 +#: src/pages/UserPublicProfile.tsx:1063 +#: src/pages/UserPublicProfile.tsx:1106 +#: src/pages/UserPublicProfile.tsx:1148 +#: src/pages/UserPublicProfile.tsx:1339 +#: src/pages/UserPublicProfile.tsx:1471 msgid "View all →" msgstr "Tout voir →" @@ -1036,8 +1041,8 @@ msgstr "Voir la reco →" msgid "What makes it worth it?" msgstr "Pourquoi on en voudrait ?" -#: src/pages/UserPublicProfile.tsx:899 -#: src/pages/UserPublicProfile.tsx:948 +#: src/pages/UserPublicProfile.tsx:901 +#: src/pages/UserPublicProfile.tsx:950 msgid "Who am I?" msgstr "Qui suis-je ?" @@ -1058,11 +1063,11 @@ msgstr "Hier" msgid "You'll be notified when someone follows your playlists, upvotes your dumps, or posts new content." msgstr "Vous serez notifié lorsque quelqu'un suit vos collections, vote pour vos recos ou publie du nouveau contenu." -#: src/pages/index/FollowedFeed.tsx:114 +#: src/pages/index/FollowedFeed.tsx:115 #: src/pages/index/HotFeed.tsx:69 #: src/pages/index/JournalFeed.tsx:82 #: src/pages/index/NewFeed.tsx:69 -#: src/pages/Search.tsx:249 +#: src/pages/Search.tsx:240 #: src/pages/UserDumps.tsx:98 #: src/pages/UserPlaylists.tsx:422 #: src/pages/UserPlaylists.tsx:457 diff --git a/src/pages/Dump.tsx b/src/pages/Dump.tsx index 4c34a93..45e0721 100644 --- a/src/pages/Dump.tsx +++ b/src/pages/Dump.tsx @@ -252,42 +252,42 @@ export function Dump() { )}
-

{dump.title}

-
- - {op - ? ( - - {op.username} - - ) - : } - - - - {dump.updatedAt && ( - - - edited {relativeTime(dump.updatedAt)} - +

{dump.title}

+
+ + {op + ? ( + + {op.username} + + ) + : } + + - )} - {dump.isPrivate && ( - - private - - )} -
+ {dump.updatedAt && ( + + + edited {relativeTime(dump.updatedAt)} + + + )} + {dump.isPrivate && ( + + private + + )} +
diff --git a/src/pages/Index.tsx b/src/pages/Index.tsx index f622d02..5bba146 100644 --- a/src/pages/Index.tsx +++ b/src/pages/Index.tsx @@ -9,7 +9,6 @@ import { import { useLocation } from "react-router"; import { AppHeader } from "../components/AppHeader.tsx"; -import { SearchBar } from "../components/SearchBar.tsx"; import { PresenceRow } from "../components/PresenceRow.tsx"; import { FeedTabBar } from "../components/FeedTabBar.tsx"; import { type FeedTab, VALID_TABS } from "../config/feedTabs.ts"; @@ -249,7 +248,6 @@ export function Index() {
-
} disableNew={dumpsState.status === "error"} diff --git a/src/pages/NotFound.tsx b/src/pages/NotFound.tsx new file mode 100644 index 0000000..f171754 --- /dev/null +++ b/src/pages/NotFound.tsx @@ -0,0 +1,17 @@ +import { Link } from "react-router"; +import { Trans } from "@lingui/react/macro"; +import { PageShell } from "../components/PageShell.tsx"; + +export function NotFound() { + return ( + +

404

+

+ This page does not exist. +

+ + Go home + +
+ ); +} diff --git a/src/pages/Search.tsx b/src/pages/Search.tsx index afc67ac..d74ab0b 100644 --- a/src/pages/Search.tsx +++ b/src/pages/Search.tsx @@ -3,7 +3,7 @@ import { Link, useSearchParams } from "react-router"; import { t } from "@lingui/core/macro"; import { Trans } from "@lingui/react/macro"; import { AppHeader } from "../components/AppHeader.tsx"; -import { SearchBar } from "../components/SearchBar.tsx"; +import { TabBar } from "../components/TabBar.tsx"; import { DumpCard } from "../components/DumpCard.tsx"; import { PlaylistCard } from "../components/PlaylistCard.tsx"; import { ErrorCard } from "../components/ErrorCard.tsx"; @@ -178,28 +178,26 @@ export function Search() { return (
- } /> +
{q && ( -
- {(["dumps", "users", "playlists"] as Tab[]).map((tabKey) => ( - - ))} -
+ ({ + key, + label: tabLabel( + key, + key === "dumps" + ? dumpCount + : key === "users" + ? userCount + : playlistCount, + ), + }))} + activeTab={tab} + onChange={setTab} + className="search-tabs" + innerClassName="search-tabs-inner" + /> )} {state.status === "idle" && ( diff --git a/src/pages/UserDumps.tsx b/src/pages/UserDumps.tsx index 0ce5589..9c1293e 100644 --- a/src/pages/UserDumps.tsx +++ b/src/pages/UserDumps.tsx @@ -111,7 +111,9 @@ export function UserDumps() { className="new-playlist-toggle" onClick={() => setCreateModalOpen(true)} > - + New dump + + + New dump + )} /> diff --git a/src/pages/UserPublicProfile.tsx b/src/pages/UserPublicProfile.tsx index 9b4ac0c..7666b89 100644 --- a/src/pages/UserPublicProfile.tsx +++ b/src/pages/UserPublicProfile.tsx @@ -53,6 +53,7 @@ import { friendlyFetchError } from "../utils/apiError.ts"; import { TextEditor } from "../components/TextEditor.tsx"; import { Markdown } from "../components/Markdown.tsx"; import { ChangePasswordModal } from "../components/ChangePasswordModal.tsx"; +import { TabBar } from "../components/TabBar.tsx"; function InviteButton() { const { authFetch } = useAuth(); @@ -145,6 +146,7 @@ type InviteTreeState = | { status: "loaded"; entries: InviteTreeEntry[] }; type InviteTreeNode = InviteTreeEntry & { children: InviteTreeNode[] }; +type ProfileTab = "dumps" | "playlists" | "followed" | "invitees" | "settings"; function buildInviteTree( entries: InviteTreeEntry[], @@ -282,9 +284,7 @@ export function UserPublicProfile() { const [emailError, setEmailError] = useState(null); const prevMyVotesRef = useRef | null>(null); - const [tab, setTab] = useState< - "dumps" | "playlists" | "followed" | "invitees" | "settings" - >("dumps"); + const [tab, setTab] = useState("dumps"); const [changePasswordOpen, setChangePasswordOpen] = useState(false); const [followedState, setFollowedState] = useState(null); const [inviteTreeState, setInviteTreeState] = useState(null); @@ -782,107 +782,112 @@ export function UserPublicProfile() { )}
-
-

{profileUser.username}

- {profileUser.invitedByUsername - ? ( -

- invited by{" "} - - @{profileUser.invitedByUsername} - -

- ) - : ( -

- O.G. -

- )} - {isOwnProfile && ( - emailEditing +
+
+

{profileUser.username}

+ {profileUser.invitedByUsername ? ( - { - e.preventDefault(); - handleEmailSave(); - }} - > - setEmailDraft(e.currentTarget.value)} - onKeyDown={(e) => { - if (e.key === "Escape") setEmailEditing(false); - }} - disabled={emailSaving} - autoFocus - /> -
- - -
- {emailError && ( - - )} - - ) - : ( -

{ - setEmailDraft(me?.email ?? ""); - setEmailError(null); - setEmailEditing(true); - }} - title="Edit email" - > - {me?.email ?? t`Add email…`} - - ✎ - +

+ invited by{" "} + + @{profileUser.invitedByUsername} +

) - )} - {avatarError && ( - - )} - {!isOwnProfile && ( - - )} - {isOwnProfile && ( -
- - -
- )} + : ( +

+ O.G. +

+ )} + {isOwnProfile && ( + emailEditing + ? ( +
{ + e.preventDefault(); + handleEmailSave(); + }} + > + setEmailDraft(e.currentTarget.value)} + onKeyDown={(e) => { + if (e.key === "Escape") setEmailEditing(false); + }} + disabled={emailSaving} + autoFocus + /> +
+ + +
+ {emailError && ( + + )} + + ) + : ( +

{ + setEmailDraft(me?.email ?? ""); + setEmailError(null); + setEmailEditing(true); + }} + title="Edit email" + > + {me?.email ?? t`Add email…`} + + ✎ + +

+ ) + )} + {avatarError && ( + + )} + {!isOwnProfile && ( + + )} + {isOwnProfile && ( +
+ + +
+ )} +
@@ -958,47 +963,21 @@ export function UserPublicProfile() { )} -
-
- - - - - {isOwnProfile && ( - - )} -
-
+ Dumps }, + { key: "playlists", label: Playlists }, + { key: "followed", label: Followed }, + { key: "invitees", label: Invitees }, + ...(isOwnProfile + ? [{ key: "settings" as const, label: Settings }] + : []), + ]} + activeTab={tab} + onChange={(key) => setTab(key)} + className="profile-tabs-scroller" + innerClassName="profile-tabs" + /> {tab === "dumps" && (
@@ -1329,7 +1308,9 @@ function DumpList( className="new-playlist-toggle" onClick={() => setCreateModalOpen(true)} > - + New dump + + + New dump + )}
diff --git a/src/pages/index/FollowedFeed.tsx b/src/pages/index/FollowedFeed.tsx index d4ca43c..a958b05 100644 --- a/src/pages/index/FollowedFeed.tsx +++ b/src/pages/index/FollowedFeed.tsx @@ -1,4 +1,5 @@ import { useCallback, useEffect, useState } from "react"; +import { TabBar } from "../../components/TabBar.tsx"; import { t } from "@lingui/core/macro"; import { Trans } from "@lingui/react/macro"; import { DumpCard } from "../../components/DumpCard.tsx"; @@ -328,22 +329,15 @@ export function FollowedFeed({ return (
-
- - -
+ From people }, + { key: "playlists", label: From playlists }, + ]} + activeTab={section} + onChange={setSection} + innerClassName="followed-sub-nav" + /> {section === "users" && (