import type { Metadata } from "next" import { getTranslations, getMessages, setRequestLocale } from "next-intl/server" import { Link } from "@/i18n/navigation" import Image from "next/image" import { ArrowRight, HardDrive, FileDown, Cpu, Boxes, Eraser, Activity, Server, Wrench } from "lucide-react" import { DocHeader } from "@/components/ui/doc-header" import { Callout } from "@/components/ui/callout" export async function generateMetadata({ params, }: { params: Promise<{ locale: string }> }): Promise { const { locale } = await params const t = await getTranslations({ locale, namespace: "docs.diskManager.meta" }) return { title: t("title"), description: t("description"), keywords: [ "proxmox disk passthrough", "proxmox attach disk to vm", "proxmox import disk", "proxmox qm importdisk", "proxmox lxc bind mount disk", "proxmox smart test", "proxmox wipe disk", "proxmox hba passthrough", "proxmox nvme passthrough", "qm set scsi", ], alternates: { canonical: "https://proxmenux.com/docs/disk-manager" }, openGraph: { title: t("ogTitle"), description: t("ogDescription"), type: "article", url: "https://proxmenux.com/docs/disk-manager", }, twitter: { card: "summary", title: t("twitterTitle"), description: t("twitterDescription"), }, } } type DiskOption = { icon: string; href: string; title: string; description: string } type StringItem = string type RelatedItem = { href: string; label: string; tail?: string } const ICONS: Record> = { HardDrive, FileDown, Cpu, Boxes, Eraser, Activity, } function DiskOptionCard({ option }: { option: DiskOption }) { const Icon = ICONS[option.icon] || HardDrive return (
{option.title}
{option.description}
) } export default async function DiskManagerOverviewPage({ params, }: { params: Promise<{ locale: string }> }) { const { locale } = await params setRequestLocale(locale) const t = await getTranslations({ locale, namespace: "docs.diskManager" }) const messages = (await getMessages({ locale })) as unknown as { docs: { diskManager: { groups: { vmItems: StringItem[]; lxcItems: StringItem[]; utilitiesItems: StringItem[] } vm: { options: DiskOption[] } lxc: { options: DiskOption[] } utilities: { options: DiskOption[] } safety: { items: StringItem[] } related: { items: RelatedItem[] } } } } const vmItems = messages.docs.diskManager.groups.vmItems const lxcItems = messages.docs.diskManager.groups.lxcItems const utilitiesItems = messages.docs.diskManager.groups.utilitiesItems const vmOptions = messages.docs.diskManager.vm.options const lxcOptions = messages.docs.diskManager.lxc.options const utilityOptions = messages.docs.diskManager.utilities.options const safetyItems = messages.docs.diskManager.safety.items const relatedItems = messages.docs.diskManager.related.items const strong = (chunks: React.ReactNode) => {chunks} return (
{t.rich("intro.body", { strong })}

{t("opening.heading")}

{t.rich("opening.body", { strong })}

{t("opening.imageAlt")}

{t("groups.heading")}

{t.rich("groups.intro", { strong })}

{t("groups.vmTitle")}

{t("groups.vmBody")}

    {vmItems.map((item, i) =>
  • {item}
  • )}

{t("groups.lxcTitle")}

{t("groups.lxcBody")}

    {lxcItems.map((item, i) =>
  • {item}
  • )}

{t("groups.utilitiesTitle")}

{t("groups.utilitiesBody")}

    {utilitiesItems.map((item, i) =>
  • {item}
  • )}

{t("vm.heading")}

{t("vm.intro")}

{vmOptions.map((o) => )}

{t("lxc.heading")}

{t("lxc.intro")}

{lxcOptions.map((o) => )}

{t("utilities.heading")}

{t("utilities.intro")}

{utilityOptions.map((o) => )}
{t("safety.intro")}
    {safetyItems.map((_, idx) => (
  • {t.rich(`safety.items.${idx}`, { strong })}
  • ))}

{t("related.heading")}

    {relatedItems.map((item) => (
  • {item.label} {item.tail}
  • ))}
) }