diff --git a/frontend/src/components/About.tsx b/frontend/src/components/About.tsx
index 9da74868..7eb4078e 100644
--- a/frontend/src/components/About.tsx
+++ b/frontend/src/components/About.tsx
@@ -4,13 +4,14 @@ import { useTranslation } from "react-i18next";
import { Info, Sparkles } from "lucide-react";
import { api } from "../lib/api";
import { FRONTEND_VERSION, FRONTEND_SHA, FRONTEND_BUILD_DATE } from "../lib/version";
+import { formatDateTime } from "../lib/format";
import { Button } from "./ui/Button";
import Modal from "./ui/Modal";
function fmtDate(d?: string | null): string {
if (!d) return "—";
const t = new Date(d);
- return isNaN(t.getTime()) ? d : t.toLocaleString();
+ return isNaN(t.getTime()) ? d : formatDateTime(d);
}
// About dialog: app + build + schema versions (frontend/backend/database), plus a
diff --git a/frontend/src/components/AdminUsers.tsx b/frontend/src/components/AdminUsers.tsx
index 833b8052..28495f6e 100644
--- a/frontend/src/components/AdminUsers.tsx
+++ b/frontend/src/components/AdminUsers.tsx
@@ -431,7 +431,7 @@ function PendingAccessRowView({
{row.created_at && (
{t("users.pendingAccess.signedUp", {
- time: new Date(row.created_at).toLocaleString(),
+ time: formatDateTime(row.created_at),
})}
)}
@@ -619,7 +619,10 @@ function AdminInvites() {
inv.invited_at
? "settings.invites.inviteConfirmAgain"
: "settings.invites.inviteConfirm",
- { email: inv.email, time: new Date(inv.invited_at ?? 0).toLocaleString() },
+ {
+ email: inv.email,
+ time: formatDateTime(inv.invited_at ?? new Date(0).toISOString()),
+ },
)}
(lang = v)} />
@@ -718,7 +721,7 @@ function AdminInvites() {
hint={
i.invited_at
? t("settings.invites.invitedAt", {
- time: new Date(i.invited_at).toLocaleString(),
+ time: formatDateTime(i.invited_at),
})
: t("settings.invites.inviteHint")
}
@@ -916,7 +919,7 @@ function InviteRow({
{inv.requested_at && (
{t("settings.invites.requested", {
- time: new Date(inv.requested_at).toLocaleString(),
+ time: formatDateTime(inv.requested_at),
})}
)}
diff --git a/frontend/src/components/ShareDialog.tsx b/frontend/src/components/ShareDialog.tsx
index bae70fc6..a9caf014 100644
--- a/frontend/src/components/ShareDialog.tsx
+++ b/frontend/src/components/ShareDialog.tsx
@@ -9,6 +9,7 @@ import { useConfirm } from "./ConfirmProvider";
import { notify } from "../lib/notifications";
import { notifyActionError } from "../lib/actionErrors";
import { copyText } from "../lib/clipboard";
+import { formatDate } from "../lib/format";
import { api, type DownloadJob, type ShareLink } from "../lib/api";
import { inputCls } from "./ui/form";
import { Button } from "./ui/Button";
@@ -88,7 +89,7 @@ function UserShare({ job }: { job: DownloadJob }) {
// --- share by public link -------------------------------------------------------------------
function LinkRow({ link, onChanged }: { link: ShareLink; onChanged: () => void }) {
- const { t } = useTranslation();
+ const { t, i18n } = useTranslation();
const confirm = useConfirm();
const [copied, setCopied] = useState(false);
const [editPass, setEditPass] = useState(false);
@@ -130,7 +131,7 @@ function LinkRow({ link, onChanged }: { link: ShareLink; onChanged: () => void }
if (link.allow_download) badges.push(t("downloads.share.downloadable"));
if (link.expires_at)
badges.push(
- t("downloads.share.expiresOn", { date: new Date(link.expires_at).toLocaleDateString() }),
+ t("downloads.share.expiresOn", { date: formatDate(link.expires_at, i18n.language) }),
);
return (
diff --git a/frontend/src/components/downloadRow.tsx b/frontend/src/components/downloadRow.tsx
index 23699847..60570395 100644
--- a/frontend/src/components/downloadRow.tsx
+++ b/frontend/src/components/downloadRow.tsx
@@ -7,7 +7,14 @@ import { useLiveQuery } from "../lib/useLiveQuery";
import { api, type DownloadJob } from "../lib/api";
import { notify } from "../lib/notifications";
import { copyText } from "../lib/clipboard";
-import { formatBytes, formatDuration, formatEta, formatSpeed, relativeTime } from "../lib/format";
+import {
+ formatBytes,
+ formatDateTime,
+ formatDuration,
+ formatEta,
+ formatSpeed,
+ relativeTime,
+} from "../lib/format";
import { navItemAttrs } from "../lib/listNav";
import { failCopyKeys } from "../lib/downloadFailure";
@@ -250,7 +257,7 @@ export function DownloadRow({
{job.status === "done" && job.created_at ? (
· {relativeTime(job.created_at)}