/api/storage now runs a single `zpool status -j --json-int -P` (OpenZFS 2.3+) for all pools and returns, per pool: - top-level vdevs with type, raidz/draid parity, class (data, special, dedup, log, cache, spare), state and read/write/checksum errors - member devices with path, resolved base disk, state, error counters, slow I/Os, and the spare-N/replacing-N they sit under while swapping - scrub/resilver status (progress only while running), the pool's status/action text and data-error count - fragmentation, capacity and dedup ratio from `zpool list` This replaces the per-pool `zpool status` text loop whose result (zfs_disks) was never used. Member paths (by-id, by-partlabel, wwn) are resolved to base disks via sysfs rather than an lsblk call per device. On ZFS without `-j`, pools report details_available: false and the UI falls back to the existing basic card. The ZFS pool card shows a layout summary (e.g. "RAIDZ2 | 5 disks | Scrub finished ...") and opens a details dialog with the vdev tree, per-device error counts, scrub/resilver progress, and links from each member disk to its disk details dialog. Tested against `zpool status -j` output from PVE 9 / OpenZFS 2.4.4: mirror, raidz2, striped mirrors, single-disk pool, and a file-backed degraded raidz1 with log, cache and spare devices. Tests cover the `zpool status -j` -> Storage view shape against real output from PVE 9 / OpenZFS 2.4.4 hosts (serials and WWNs replaced): mirror, raidz2, single-disk pool, slow I/Os, and a degraded raidz1 with log, cache and spare devices; plus a synthetic resilver with a spare swapping in. Member path -> base disk resolution is tested against a stubbed sysfs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Monitor dashboard translations
The ProxMenux Monitor dashboard uses a small client-side i18n layer.
- English (
en) is the source language and the runtime fallback. - Eight locales are shipped and fully populated end-to-end:
en,de,es,fr,it,pt,sk,sv. Non-English catalogs started from an automated bootstrap and are being polished as native speakers pass through them.
To improve a translation, edit the values in your locale's common.json — keep placeholders such as {uptime}, {vmid} or {count} unchanged, and don't translate brand or product names (ProxMenux Monitor, Proxmox Backup Server, Secure Gateway, Tailscale, etc.). Missing keys fall back to English at runtime, so a partial refresh is always safe to merge.
Backup message composition regressions
From the repository root, run:
node tests/test_backup_archives_empty.cjs
node tests/test_backup_destination_messages.cjs
Prerequisites: Node.js and the typescript development dependency from
AppImage/package.json must be installed/resolvable (normally in
AppImage/node_modules). These tests compile actual JSX message branches and
pure i18n lookup functions without importing the component or calling a backend.
They cover whole English messages, missing-key locale fallback, loading/error
branches, nonempty lists, the removal notice at zero/one/multiple archives,
local-attach help, and unchanged shared labels. They do not replace browser or
real-host acceptance. Keep literal paths in the local-attach help unchanged.
To add a new locale, see §11 → Adding a new locale in the Contributing Guide.