feat(ui): phase 5 — graphs, widgets, theming, PWA, boards, i18n

P5a: 24h uptime bar strip + latency chart on monitor detail, iframe
embed widget, generic JSON-path widget, accent/wallpaper/custom CSS
settings, PWA manifest + service worker, demo GIF.

P5b: transport picker + per-transport fields + test button in
settings; per-monitor alert-rule fields in dialogs.

P5c: container cpu/mem columns, SMART/ZFS/GPU sections on system
detail, subdomains section on domain detail.

P5d: login/setup page + auth middleware client handling, board
switcher + /b/:slug routes, full string extraction to typed t() keys
with {param} interpolation, complete cs locale, language select.

Authored By: TDvorak <[email protected]>

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
Tomas DvorakandDevin committed 2026-09-22 12:49:51 +02:00
1 parent f3143af351
commit e0ef60eca6
49 files changed
+2131 -426

No files matched your search

+414
View File
@@ -0,0 +1,414 @@
import type { Key } from "@/i18n/en";
// Czech strings. Partial — missing keys fall back to English in t().
export const cs: Partial<Record<Key, string>> = {
"nav.board": "Nástěnka",
"nav.monitors": "Monitory",
"nav.domains": "Domény",
"nav.systems": "Systémy",
"nav.incidents": "Incidenty",
"nav.status": "Stav",
"header.search": "Hledat (⌘K)",
"header.settings": "Nastavení",
"header.theme": "Přepnout motiv",
"header.addWidget": "Přidat widget",
"header.addService": "Přidat službu",
"header.widget": "Widget",
"common.add": "Přidat",
"common.edit": "Upravit",
"common.delete": "Smazat",
"common.cancel": "Zrušit",
"common.save": "Uložit",
"common.create": "Vytvořit",
"common.creating": "Vytvářím…",
"common.saving": "Ukládám…",
"common.test": "Test",
"common.loading": "Načítám…",
"common.name": "Název",
"common.title": "Titulek",
"common.description": "Popis",
"common.slug": "Slug",
"common.url": "URL",
"common.type": "Typ",
"common.hostname": "Hostname",
"common.port": "Port",
"common.optional": "volitelné",
"common.enabled": "Zapnuto",
"common.refresh": "Obnovit",
"common.never": "nikdy",
"common.all": "Vše",
"common.reset": "Resetovat",
"common.close": "Zavřít",
"auth.setupTitle": "Vytvořte si účet správce",
"auth.setupHint": "První uživatel se stane správcem. Pouze lokální účet — žádná externí identita.",
"auth.signInTitle": "Přihlásit se",
"auth.signInHint": "Tato instance Dash vyžaduje přihlášení.",
"auth.username": "Uživatelské jméno nebo e-mail",
"auth.password": "Heslo",
"auth.createAccount": "Vytvořit účet",
"auth.signIn": "Přihlásit se",
"auth.invalid": "Neplatné jméno nebo heslo.",
"auth.rateLimited": "Příliš mnoho pokusů — počkejte minutu.",
"auth.section": "Ověřování",
"auth.offHint": "Kdokoli, kdo dosáhne na tuto instanci, má plný přístup. Zapněte pro vyžadování přihlášení.",
"auth.enable": "Zapnout ověřování",
"auth.onHint": "Přihlášen jako",
"auth.signOut": "Odhlásit se",
"auth.disable": "Vypnout ověřování",
"auth.disabledNote": "Ověřování je vypnuté — nástěnka je otevřená vaší síti.",
"boards.title": "Nástěnky",
"boards.manage": "Spravovat nástěnky…",
"boards.newPlaceholder": "Název nové nástěnky",
"board.empty": "Zatím žádné sekce.",
"board.emptyHint": "Přidejte službu nebo widget.",
"board.addSection": "Přidat sekci",
"board.sectionNamePlaceholder": "Název sekce",
"board.deleteSectionConfirm": "Smazat sekci \"{name}\" a jejích {count} položek?",
"palette.title": "Příkazová paleta",
"palette.placeholder": "Hledat služby a akce…",
"palette.noResults": "Nic nenalezeno.",
"palette.pages": "Stránky",
"palette.services": "Služby",
"palette.actions": "Akce",
"palette.goTo": "Přejít na {page}",
"palette.openSettings": "Otevřít nastavení",
"palette.themeSwitch": "Přepnout na motiv {theme}",
"palette.renderer": "Vzhled: {name}",
"palette.exportJson": "Exportovat nástěnku do JSON",
"palette.hintNew": "nové",
"palette.hintActive": "aktivní",
"settings.title": "Nastavení",
"settings.desc": "Rozvržení nástěnky, motiv a záloha.",
"settings.theme": "Motiv",
"settings.language": "Jazyk",
"settings.dark": "Tmavý",
"settings.light": "Světlý",
"settings.renderer": "Vzhled nástěnky",
"settings.appearance": "Vzhled",
"settings.accent": "Akcentní barva",
"settings.accentHint": "Libovolná CSS barva — hex, hsl, pojmenovaná.",
"settings.wallpaper": "URL tapety",
"settings.wallpaperHint": "Pozadí přes celou nástěnku.",
"settings.customCss": "Vlastní CSS",
"settings.customCssHint": "Aplikuje se naposled — přebije proměnné motivu.",
"settings.notifications": "Notifikace",
"settings.notifyFanout": "Přepnutí monitorů a expirace domén/certifikátů se rozešlou všem nastaveným transportům.",
"settings.exportJson": "Export JSON",
"settings.import": "Import",
"settings.importHint": "Import umí Dash exporty plus konfigurace Homepage, Homarr a Dashy.",
"settings.saved": "uloženo",
"settings.sent": "odesláno",
"settings.failed": "selhalo",
"settings.testNotify": "Odeslat testovací notifikaci",
"settings.wallpaperPh": "https://… — prázdné = žádná",
"settings.importFailed": "Import selhal",
"service.editTitle": "Upravit službu",
"service.newTitle": "Přidat službu",
"service.desc": "Záložka na nástěnce — název, ikona, jedna nebo více URL.",
"service.newDesc": "Pojmenujte ji, dejte ikonu, přidejte jednu nebo více URL.",
"service.editDesc": "Upravte název, ikonu nebo URL.",
"service.icon": "URL ikony",
"service.iconHint": "URL nebo nahraný soubor; prázdné zobrazí dlaždici s písmenem.",
"service.upload": "Nahrát",
"service.urls": "URL",
"service.addUrl": "Přidat URL",
"service.labelPlaceholder": "štítek",
"service.removeUrl": "Odebrat URL",
"service.suggest": "návrh: {slug}.png",
"service.alsoMonitor": "Vytvořit i uptime monitor pro první URL",
"service.nameRequired": "Název je povinný",
"service.urlRequired": "Je potřeba alespoň jedna platná http(s) URL",
"service.saveFailed": "uložení selhalo",
"service.addService": "Přidat službu",
"widget.editTitle": "Upravit widget",
"widget.newTitle": "Přidat widget",
"widget.desc": "Živá data na nástěnce.",
"widget.newDesc": "Vyberte typ a nasměrujte na svou službu.",
"widget.editDesc": "Upravte nastavení widgetu.",
"widget.type": "Typ widgetu",
"widget.section": "Sekce",
"widget.pickOne": "Vyberte…",
"widget.pickType": "Vyberte typ widgetu",
"widget.requiredFields": "Vyplňte povinná pole",
"widget.defaultSection": "Widgety",
"widget.err": "chyba",
"widget.offline": "offline",
"widget.fetchFailed": "načtení selhalo",
"widget.queries": "{n} dotazů",
"widget.blocked": "{n} blokováno",
"widget.msAvg": "{n} ms prům.",
"widget.videos": "{n} videí",
"widget.blockedLbl": "blokováno",
"widget.photosLbl": "fotek",
"widget.embedHint": "Nastavte URL v konfiguraci widgetu.",
"renderer.localTime": "Místní čas",
"renderer.down": "Nedostupné",
"renderer.allGreen": "vše v pořádku",
"renderer.offline": "offline",
"renderer.needsAttention": "vyžaduje pozornost",
"renderer.downCount": "{n} nedostupných",
"renderer.entry": "položka",
"renderer.entries": "položek",
"renderer.dragSection": "Přesunout sekci",
"renderer.deleteSection": "Smazat sekci",
"renderer.live": "živě",
"monitors.title": "Monitory",
"monitors.subtitle": "HTTP, TCP, ping, DNS, klíčové slovo, JSON a push kontroly.",
"monitors.new": "Nový monitor",
"monitors.empty": "Zatím žádné monitory.",
"monitors.emptyHint": "Přidejte jeden pro sledování dostupnosti.",
"monitors.deleteConfirm": "Smazat monitor \"{name}\" a jeho historii?",
"monitors.checkNow": "Zkontrolovat nyní",
"monitors.pause": "Pozastavit",
"monitors.resume": "Obnovit",
"monitors.editTitle": "Upravit monitor",
"monitors.newTitle": "Nový monitor",
"monitors.desc": "Kontrola dostupnosti v intervalu.",
"monitors.method": "Metoda",
"monitors.keyword": "Klíčové slovo",
"monitors.keywordInvert": "Invertovat (down když nalezeno)",
"monitors.jsonPath": "JSON cesta",
"monitors.expected": "Očekávaná hodnota",
"monitors.record": "Záznam",
"monitors.dnsExpected": "Záznam obsahuje (volitelné)",
"monitors.pushHint": "Po uložení volají vaše úlohy zobrazenou push URL. Ztichne-li se na 2× interval, monitor přejde do down.",
"monitors.interval": "Interval (s)",
"monitors.timeout": "Timeout (s)",
"monitors.retries": "Opakování",
"monitors.failsBeforeDown": "Selhání před down",
"monitors.latencyWarn": "Varování latence (ms)",
"monitors.mute": "Ztišit notifikace",
"monitors.pushUrl": "Push URL",
"monitors.addMonitor": "Přidat monitor",
"monitors.nameRequired": "Název je povinný",
"monitors.urlRequired": "URL je povinná",
"monitors.hostnameRequired": "Hostname je povinný",
"monitors.saveFailed": "uložení selhalo",
"monitors.uptime24h": "24h dostupnost",
"monitors.avgLatency": "Prům. latence",
"monitors.lastCheck": "Poslední kontrola",
"monitors.latencyHistory": "Latence",
"monitors.uptimeHistory": "Historie dostupnosti",
"monitors.noHeartbeats": "Zatím žádné odezvy.",
"monitors.everyInterval": "každých {interval}s",
"monitors.status": "Stav",
"monitors.uptime30d": "Dostupnost 30d",
"monitors.ping": "Ping",
"monitors.every": "Každých",
"monitors.checksHint": "HTTP, TCP, ping, DNS, klíčové slovo, JSON cesta nebo push — kontroly běží na serveru ve vašem intervalu.",
"monitors.uptime": "Dostupnost",
"monitors.checks": "Kontroly",
"monitors.responseTime": "Doba odezvy",
"monitors.recentChecks": "Nedávné kontroly",
"monitors.noChecks": "Žádné kontroly v rozsahu.",
"monitors.noChecksBucket": "žádné kontroly",
"monitors.bucketChecks": "{status} ({n} kontrol)",
"domains.title": "Domény",
"domains.subtitle": "WHOIS, DNS a hlídání certifikátů.",
"domains.new": "Sledovat doménu",
"domains.empty": "Zatím žádné sledované domény.",
"domains.emptyHint": "Expirace, registrátor, DNS záznamy, SSL certifikáty a detekce poskytovatelů.",
"domains.domain": "Doména",
"domains.ssl": "SSL",
"domains.providers": "Poskytovatelé",
"domains.lookupError": "chyba dotazu",
"domains.refreshNow": "Obnovit nyní",
"domains.deleteConfirm": "Přestat sledovat \"{name}\"?",
"domains.refresh": "Překontrolovat",
"domains.expiresIn": "expiruje za {days}d",
"domains.expired": "expirováno",
"domains.certDays": "cert {days}d",
"domains.registrar": "Registrátor",
"domains.expires": "Expirace",
"domains.cert": "Certifikát",
"domains.nameservers": "Nameservery",
"domains.hosting": "Hosting",
"domains.subdomains": "Subdomény",
"domains.subdomainsHint": "Objevené přes Certificate Transparency logy; resolvováno přes DNS.",
"domains.scan": "Skenovat",
"domains.scanning": "Skenuji…",
"domains.noSubdomains": "Zatím žádné subdomény — spusťte sken.",
"domains.lastSeen": "naposledy viděna",
"domains.namePlaceholder": "example.com",
"domains.addTitle": "Sledovat doménu",
"domains.editTitle": "Upravit doménu",
"domains.addDesc": "WHOIS, DNS, TLS certifikát a host — obnoveno ve vašem intervalu.",
"domains.refreshEvery": "Obnovovat každých (hodin)",
"domains.alertDays": "Dní před expirací pro alert",
"domains.certDaysLbl": "Práh TLS alertu (dny)",
"domains.certDaysPlaceholder": "stejné jako expirace",
"domains.autoRenewLbl": "Auto-renew zapnutý u registrátora",
"domains.notesOptional": "Poznámky (volitelné)",
"domains.lookingUp": "Dotazuji…",
"domains.nameRequired": "Doména je povinná",
"domains.saveFailed": "uložení selhalo",
"domains.add": "Sledovat",
"domains.domainExpires": "Doména expiruje",
"domains.sslExpires": "SSL expiruje",
"domains.registration": "Registrace",
"domains.dns": "DNS",
"domains.tlsCert": "TLS certifikát",
"domains.host": "Host",
"domains.checkHistory": "Historie kontrol",
"domains.noSnapshots": "Zatím žádné snímky.",
"domains.created": "Vytvořeno",
"domains.updated": "Aktualizováno",
"domains.registrant": "Registrant",
"domains.country": "Země",
"domains.abuse": "Abuse",
"domains.statusLbl": "Stav",
"domains.location": "Lokalita",
"domains.isp": "ISP",
"domains.org": "Organizace",
"domains.checked": "Zkontrolováno",
"domains.dnsProvider": "DNS poskytovatel",
"domains.email": "E-mail",
"domains.issuer": "Vydavatel",
"domains.valid": "Platnost",
"domains.subject": "Subjekt",
"domains.key": "Klíč",
"domains.algorithm": "Algoritmus",
"domains.responseHeaders": "Hlavičky odpovědi ({n})",
"domains.transferLock": "transfer lock",
"domains.whoisPrivacy": "whois ochrana",
"domains.autoRenew": "auto-renew",
"domains.scanShort": "Sken",
"domains.noSubsFound": "Žádné subdomény nenalezeny — sken dotazuje certificate transparency.",
"domains.expPrefix": "exp",
"domains.sslPrefix": "ssl",
"systems.title": "Systémy",
"systems.subtitle": "Servery a PC reportující přes dash-agent.",
"systems.new": "Nový systém",
"systems.empty": "Zatím žádné systémy.",
"systems.emptyHintPre": "Přidejte jeden, poté spusťte",
"systems.emptyHintPost": "na hostiteli s vydaným tokenem.",
"systems.waiting": "čeká se na agenta…",
"systems.cores": "{n} jader",
"systems.newTitle": "Nový systém",
"systems.newDesc": "Pojmenujte hostitele, poté na něm spusťte dash-agent s vydaným tokenem.",
"systems.agentCmdFor": "Příkaz agenta pro",
"systems.tokenWarning": "Token identifikuje tento systém — nedávejte ho do veřejných repozitářů.",
"systems.done": "Hotovo",
"systems.copy": "Kopírovat",
"systems.deleteConfirm": "Smazat systém \"{name}\"?",
"systems.agentHint": "Spusťte agenta s tímto tokenem; statistiky dorazí sem.",
"systems.token": "Bearer token",
"systems.containers": "Kontejnery",
"systems.drives": "Disky",
"systems.zfs": "ZFS pooly",
"systems.gpu": "GPU",
"systems.cpu": "CPU",
"systems.mem": "Paměť",
"systems.disk": "Disk",
"systems.net": "Síť",
"systems.temp": "Teplota",
"systems.load": "Zátěž",
"systems.up": "up",
"systems.down": "down",
"systems.namePlaceholder": "nas",
"systems.addTitle": "Přidat systém",
"systems.addDesc": "Vytvoří bearer token — spusťte s ním dash-agent.",
"systems.notFound": "Systém nenalezen.",
"systems.usage": "Využití",
"systems.cpuPct": "CPU %",
"systems.memPct": "Paměť %",
"systems.netKbs": "Síť KB/s",
"systems.load1m": "Load 1m",
"systems.temperatures": "Teploty",
"systems.drivesSmart": "Disky (SMART)",
"systems.agentCmd": "Příkaz agenta",
"systems.neverSeen": "nikdy neviděn",
"systems.seenAt": "viděn {time}",
"systems.failing": "selhává",
"systems.uptime": "Doba běhu",
"incidents.title": "Incidenty",
"incidents.subtitle": "Automaticky otevřené při výpadcích monitorů, nebo vedené ručně.",
"incidents.new": "Nový incident",
"incidents.empty": "Žádné otevřené incidenty.",
"incidents.resolve": "Vyřešit",
"incidents.acknowledge": "Potvrdit",
"incidents.close": "Zavřít",
"incidents.reopen": "Znovu otevřít",
"incidents.deleteConfirm": "Smazat incident \"{title}\"?",
"incidents.openOnly": "Jen otevřené",
"incidents.showAll": "Zobrazit vše",
"incidents.noUpdates": "Zatím žádné aktualizace.",
"incidents.notePlaceholder": "Přidat poznámku…",
"incidents.post": "Odeslat",
"incidents.open": "otevřený",
"incidents.resolved": "vyřešený",
"incidents.editTitle": "Upravit incident",
"incidents.newTitle": "Nový incident",
"incidents.desc": "Ručně evidujte výpadek nebo degradaci.",
"incidents.severity": "Závažnost",
"incidents.sevMinor": "menší",
"incidents.sevMajor": "významný",
"incidents.sevCritical": "kritický",
"incidents.status": "Stav",
"incidents.monitor": "Monitor",
"incidents.bodyLabel": "Podrobnosti",
"incidents.noteOptional": "Poznámka (volitelná)",
"incidents.titlePlaceholder": "NAS offline",
"incidents.noteFirst": "Poprvé pozorováno…",
"incidents.createError": "Incident se nepodařilo vytvořit.",
"statusPages.title": "Stavové stránky",
"statusPages.publicAt": "Veřejné živé náhledy na",
"statusPages.new": "Nová stránka",
"statusPages.empty": "Zatím žádné stavové stránky.",
"statusPages.open": "Otevřít veřejnou stránku",
"statusPages.deleteConfirm": "Smazat stavovou stránku \"{title}\"?",
"statusPages.createError": "Nepodařilo se vytvořit — slug může být obsazený.",
"statusPages.newTitle": "Nová stavová stránka",
"statusPages.newDesc": "Veřejný živý náhled nad vybranými monitory.",
"statusPages.monitors": "Monitory",
"statusPages.services": "Služby",
"statusPages.noMonitors": "Zatím žádné monitory — prázdný výběr zobrazí vše.",
"statusPages.allHint": "Nechte vše nezaškrtnuté pro zahrnutí všech aktivních monitorů.",
"statusPages.slugPlaceholder": "auto",
"statusPages.titlePlaceholder": "Stav homelab",
"maintenance.title": "Okna údržby",
"maintenance.subtitle": "Aktivní okna ztišují alerty + auto-incidenty a označují pokryté monitory.",
"maintenance.schedule": "Naplánovat",
"maintenance.empty": "Žádná naplánovaná údržba.",
"maintenance.deleteConfirm": "Smazat okno \"{title}\"?",
"maintenance.active": "aktivní",
"maintenance.scheduled": "naplánované",
"maintenance.dialogTitle": "Naplánovat údržbu",
"maintenance.dialogDesc": "Potlačí alerty a auto-incidenty po dobu okna.",
"maintenance.starts": "Začátek",
"maintenance.ends": "Konec",
"maintenance.titlePlaceholder": "Upgrade sítě",
"maintenance.createError": "Neplatné okno — zkontrolujte časy.",
"statusPublic.operational": "Všechny systémy v provozu",
"statusPublic.degraded": "Částečný výpadek",
"statusPublic.outage": "Velký výpadek",
"statusPublic.underMaintenance": "Probíhá údržba",
"statusPublic.poweredBy": "Běží na Dash",
"statusPublic.updated": "Aktualizováno {time}",
"statusPublic.noMonitors": "Tato stránka zatím nemá monitory.",
"statusPublic.uptime90": "90denní dostupnost",
"statusPublic.services": "Služby",
"statusPublic.systems": "Systémy",
"statusPublic.maintenance": "Údržba",
"statusPublic.incidents": "Incidenty",
"statusPublic.checking": "Kontroluji…",
"statusPublic.notFound": "Stavová stránka nenalezena.",
"statusPublic.footer": "běží na dash",
};