diff --git a/src/app/(admin)/backups/page.tsx b/src/app/(admin)/backups/page.tsx index ead9fe2..4fba215 100644 --- a/src/app/(admin)/backups/page.tsx +++ b/src/app/(admin)/backups/page.tsx @@ -15,6 +15,7 @@ import { Trash2, Upload, } from "lucide-react"; +import { useLanguage } from "@/components/language-provider"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { @@ -31,6 +32,7 @@ import { Select } from "@/components/ui/select"; import { SkeletonRows } from "@/components/ui/skeleton"; import { Switch } from "@/components/ui/switch"; import { BACKUP_TABLE_GROUPS } from "@/lib/backups/table-groups"; +import type { TranslationKey } from "@/lib/i18n/types"; import type { BackupItem, BackupSettings } from "./types"; import { WEEKDAYS, @@ -46,6 +48,7 @@ import { } from "./utils"; export default function BackupsPage() { + const { t } = useLanguage(); const queryClient = useQueryClient(); const restoreInput = useRef(null); const savedSettings = useRef(null); @@ -116,10 +119,10 @@ export default function BackupsPage() {

- Database Backups + {t("backups.title")}

- Export database records and store them in the configured R2 bucket. + {t("backups.description")}

@@ -131,17 +134,17 @@ export default function BackupsPage() { onChange={(event) => { const file = event.target.files?.[0]; event.target.value = ""; - if (!file || !window.confirm("Restore this backup? This replaces all current database records and may sign you out.")) return; + if (!file || !window.confirm(t("backups.restoreConfirm"))) return; restore.mutate(file); }} /> - @@ -149,11 +152,11 @@ export default function BackupsPage() { restoreInput.current?.click()} className="flex cursor-pointer items-center gap-2 rounded-md px-3 py-2 text-neutral-900 outline-none hover:bg-neutral-100 focus:bg-neutral-100 data-[disabled]:pointer-events-none data-[disabled]:opacity-50"> - {restore.isPending ? "Restoring..." : "Restore from backup"} + {restore.isPending ? t("backups.restoring") : t("backups.restore")} setSettingsOpen(true)} className="flex cursor-pointer items-center gap-2 rounded-md px-3 py-2 text-neutral-900 outline-none hover:bg-neutral-100 focus:bg-neutral-100 data-[disabled]:pointer-events-none data-[disabled]:opacity-50"> - Settings + {t("backups.settings")} @@ -164,8 +167,8 @@ export default function BackupsPage() { - Tables to back up - Choose related groups of tables for manual and automatic backups. All groups are enabled by default. Restore requires a backup containing every group. + {t("backups.tablesTitle")} + {t("backups.tablesDescription")} {settings &&
@@ -173,20 +176,20 @@ export default function BackupsPage() { const enabled = !settings.excludedTableGroups.includes(group.id); const lastEnabled = enabled && settings.excludedTableGroups.length === BACKUP_TABLE_GROUPS.length - 1; return
-

{group.label}

Tables: {group.tables.join(", ")}

- setSettings({ ...settings, excludedTableGroups: checked ? settings.excludedTableGroups.filter((id) => id !== group.id) : [...settings.excludedTableGroups, group.id] })} aria-label={`Back up ${group.label}`} /> +

{group.label}

{t("backups.tables", { list: group.tables.join(", ") })}

+ setSettings({ ...settings, excludedTableGroups: checked ? settings.excludedTableGroups.filter((id) => id !== group.id) : [...settings.excludedTableGroups, group.id] })} aria-label={t("backups.backUpGroup", { group: group.label })} />
; })}
- {saveSettings.error &&

{saveSettings.error instanceof Error ? saveSettings.error.message : "Failed to save backup settings"}

} - + {saveSettings.error &&

{saveSettings.error instanceof Error ? saveSettings.error.message : t("backups.saveSettingsFailed")}

} +
}
{error && (

- {error instanceof Error ? error.message : "Backup operation failed"} + {error instanceof Error ? error.message : t("backups.operationFailed")}

)} @@ -197,12 +200,10 @@ export default function BackupsPage() {
- Complete backup setup + {t("backups.setupTitle")} - Add the missing values under the deployed Worker's - Variables and Secrets settings. This check disappears after - backup configuration is complete. + {t("backups.setupDescription")}
@@ -229,7 +230,7 @@ export default function BackupsPage() { - Check again + {t("backups.checkAgain")}
@@ -238,17 +239,16 @@ export default function BackupsPage() { - Automatic backup + {t("backups.automatic")} - The schedule runs at 02:00 UTC. Monthly schedules are limited to - days 1-28. + {t("backups.scheduleNote")} {settings && ( <>
- +
- +
{settings.scheduleType === "weekly" && (
- + @@ -316,7 +316,7 @@ export default function BackupsPage() { {settings.scheduleType === "monthly" && (
- +
- +
- days + {t("backups.days")}
@@ -394,18 +394,18 @@ export default function BackupsPage() {
-

Backup history

+

{t("backups.history")}

- File - Status - Size - Created - Actions + {t("backups.col.file")} + {t("backups.col.status")} + {t("backups.col.size")} + {t("backups.col.created")} + {t("backups.col.actions")}
{backups.isLoading && } {!backups.isLoading && (backups.data?.backups ?? []).length === 0 && ( -

No backups yet.

+

{t("backups.none")}

)} {(backups.data?.backups ?? []).map((backup: BackupItem) => (

- {backup.trigger === "manual" ? "Manual" : "Scheduled"} + {backup.trigger === "manual" ? t("backups.manual") : t("backups.scheduled")} {backup.error ? `: ${backup.error}` : ""}

- {backup.status} + {t(`backups.status.${backup.status}` as TranslationKey)} {formatBackupSize(backup.size)} @@ -434,7 +434,7 @@ export default function BackupsPage() {