Merge branch 'main' into enhanced-glances
This commit is contained in:
commit
28180f0e81
9
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
9
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@ -69,11 +69,18 @@ body:
|
||||
attributes:
|
||||
label: Browser Logs
|
||||
description: Please review and provide any logs from the browser, if relevant
|
||||
- type: textarea
|
||||
id: troubleshooting
|
||||
attributes:
|
||||
label: Troubleshooting
|
||||
description: Please include output from your [troubleshooting tests](https://gethomepage.dev/en/more/troubleshooting/#service-widget-errors). If this is a service widget issue and you do not include any information here your issue will be closed. If it is not, indicate e.g. 'n/a'
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: other
|
||||
attributes:
|
||||
label: Other
|
||||
description: Please include output from your troubleshooting tests, if relevant. Include any other relevant details. E.g. service version or API version, docker version, etc.
|
||||
description: Include any other relevant details. E.g. service version or API version, docker version, etc.
|
||||
- type: checkboxes
|
||||
id: pre-flight
|
||||
attributes:
|
||||
|
||||
@ -513,7 +513,9 @@
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
"activeusers": "Active Users",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
|
||||
@ -513,7 +513,9 @@
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
"activeusers": "Active Users",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
|
||||
@ -513,7 +513,9 @@
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
"activeusers": "Active Users",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
@ -580,7 +582,7 @@
|
||||
"passes": "Passes"
|
||||
},
|
||||
"whatsupdocker": {
|
||||
"monitoring": "Monitoring",
|
||||
"updates": "Updates"
|
||||
"monitoring": "Supervisió",
|
||||
"updates": "Actualitzacions"
|
||||
}
|
||||
}
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
"downloads": "Fronta"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "Vytížení systému",
|
||||
"load": "Zatížení systému",
|
||||
"uptime": "Doba spuštění",
|
||||
"alerts": "Upozornění",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
@ -30,19 +30,19 @@
|
||||
"placeholder": "Hledat…"
|
||||
},
|
||||
"resources": {
|
||||
"cpu": "CPU",
|
||||
"cpu": "PROC",
|
||||
"total": "Celkem",
|
||||
"free": "Volné",
|
||||
"used": "Využité",
|
||||
"load": "Vytížení",
|
||||
"mem": "RAM",
|
||||
"max": "Max",
|
||||
"uptime": "UP",
|
||||
"months": "mo",
|
||||
"load": "Zatížení",
|
||||
"mem": "PAM",
|
||||
"max": "Max.",
|
||||
"uptime": "BĚŽÍ",
|
||||
"months": "měs.",
|
||||
"days": "d",
|
||||
"hours": "h",
|
||||
"minutes": "m",
|
||||
"temp": "TEMP"
|
||||
"temp": "TEPLOTA"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Uživatelé",
|
||||
@ -64,8 +64,8 @@
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
"tx": "TX",
|
||||
"mem": "RAM",
|
||||
"cpu": "CPU",
|
||||
"mem": "PAM",
|
||||
"cpu": "PROC",
|
||||
"offline": "Offline",
|
||||
"error": "Chyba",
|
||||
"unknown": "Neznámý",
|
||||
@ -85,7 +85,7 @@
|
||||
"movies": "Filmy",
|
||||
"series": "Seriály",
|
||||
"episodes": "Epizody",
|
||||
"songs": "Písničky"
|
||||
"songs": "Skladby"
|
||||
},
|
||||
"changedetectionio": {
|
||||
"totalObserved": "Celkem zjištěno",
|
||||
@ -106,7 +106,7 @@
|
||||
"streams": "Aktivní streamy",
|
||||
"movies": "Filmy",
|
||||
"tv": "Seriály",
|
||||
"albums": "Albums"
|
||||
"albums": "Alba"
|
||||
},
|
||||
"sabnzbd": {
|
||||
"rate": "Rychlost",
|
||||
@ -188,9 +188,9 @@
|
||||
"ping": "Ping"
|
||||
},
|
||||
"portainer": {
|
||||
"running": "Běží",
|
||||
"running": "Spuštěno",
|
||||
"stopped": "Zastaveno",
|
||||
"total": "Celkově"
|
||||
"total": "Celkem"
|
||||
},
|
||||
"traefik": {
|
||||
"routers": "Routery",
|
||||
@ -300,17 +300,17 @@
|
||||
"failedLoginsLast24H": "Neúspěšná přihlášení (24h)"
|
||||
},
|
||||
"proxmox": {
|
||||
"mem": "RAM",
|
||||
"cpu": "CPU",
|
||||
"mem": "PAM",
|
||||
"cpu": "PROC",
|
||||
"lxc": "LXC",
|
||||
"vms": "Virtuální Stroje"
|
||||
},
|
||||
"glances": {
|
||||
"cpu": "CPU",
|
||||
"mem": "RAM",
|
||||
"cpu": "PROC",
|
||||
"mem": "PAM",
|
||||
"wait": "Prosím počkejte",
|
||||
"temp": "TEMP",
|
||||
"uptime": "UP",
|
||||
"temp": "TEPLOTA",
|
||||
"uptime": "BĚŽÍ",
|
||||
"days": "d",
|
||||
"hours": "h"
|
||||
},
|
||||
@ -334,9 +334,9 @@
|
||||
"down": "Vypnutý"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Naskenováno",
|
||||
"containers_scanned": "Prohledáno",
|
||||
"containers_updated": "Aktualizováno",
|
||||
"containers_failed": "Chyba"
|
||||
"containers_failed": "Selhalo"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Schváleno",
|
||||
@ -460,7 +460,7 @@
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datové úložiště",
|
||||
"failed_tasks_24h": "Neúspěšné úlohy 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"cpu_usage": "PROC",
|
||||
"memory_usage": "Paměť"
|
||||
},
|
||||
"immich": {
|
||||
@ -504,16 +504,18 @@
|
||||
"time": "Čas"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Přístrojové panely",
|
||||
"dashboards": "Nástěnky",
|
||||
"datasources": "Zdroje dat",
|
||||
"totalalerts": "Celkový počet upozornění",
|
||||
"alertstriggered": "Spuštěné výstrahy"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "CPU zatížení",
|
||||
"cpuload": "Zatížení procesoru",
|
||||
"memoryusage": "Využití paměti",
|
||||
"freespace": "Volný prostor",
|
||||
"activeusers": "Aktivní uživatelé"
|
||||
"activeusers": "Aktivní uživatelé",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Stav",
|
||||
@ -565,22 +567,22 @@
|
||||
"booksDuration": "Trvání"
|
||||
},
|
||||
"homeassistant": {
|
||||
"people_home": "People Home",
|
||||
"lights_on": "Lights On",
|
||||
"switches_on": "Switches On"
|
||||
"people_home": "Lidí doma",
|
||||
"lights_on": "Rozsvícená světla",
|
||||
"switches_on": "Zapnuté přepínače"
|
||||
},
|
||||
"freshrss": {
|
||||
"subscriptions": "Subscriptions",
|
||||
"unread": "Unread"
|
||||
"subscriptions": "Odběry",
|
||||
"unread": "Nepřečteno"
|
||||
},
|
||||
"channelsdvrserver": {
|
||||
"shows": "Shows",
|
||||
"recordings": "Recordings",
|
||||
"scheduled": "Scheduled",
|
||||
"passes": "Passes"
|
||||
"recordings": "Nahrávky",
|
||||
"scheduled": "Naplánováno",
|
||||
"passes": "Průchody"
|
||||
},
|
||||
"whatsupdocker": {
|
||||
"monitoring": "Monitoring",
|
||||
"updates": "Updates"
|
||||
"monitoring": "Sledování",
|
||||
"updates": "Aktualizace"
|
||||
}
|
||||
}
|
||||
|
||||
@ -513,7 +513,9 @@
|
||||
"memoryusage": "Memory Usage",
|
||||
"cpuload": "Cpu Load",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
"activeusers": "Active Users",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
|
||||
@ -513,7 +513,9 @@
|
||||
"cpuload": "CPU Last",
|
||||
"memoryusage": "RAM Verbrauch",
|
||||
"freespace": "Freier Speicher",
|
||||
"activeusers": "Aktive Nutzer"
|
||||
"activeusers": "Aktive Nutzer",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
|
||||
@ -530,7 +530,9 @@
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
"activeusers": "Active Users",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
|
||||
@ -553,7 +553,9 @@
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
"activeusers": "Active Users",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
|
||||
@ -513,7 +513,9 @@
|
||||
"activeusers": "Active Users",
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space"
|
||||
"freespace": "Free Space",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
|
||||
@ -513,7 +513,9 @@
|
||||
"cpuload": "Carga de la CPU",
|
||||
"memoryusage": "Uso de la memoria",
|
||||
"freespace": "Espacio libre",
|
||||
"activeusers": "Usuarios activos"
|
||||
"activeusers": "Usuarios activos",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Estado",
|
||||
@ -580,7 +582,7 @@
|
||||
"passes": "Pases"
|
||||
},
|
||||
"whatsupdocker": {
|
||||
"monitoring": "Monitoring",
|
||||
"updates": "Updates"
|
||||
"monitoring": "Supervisión",
|
||||
"updates": "Actualizaciones"
|
||||
}
|
||||
}
|
||||
|
||||
@ -513,7 +513,9 @@
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
"activeusers": "Active Users",
|
||||
"numshares": "Shared Items",
|
||||
"numfiles": "Files"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
|
||||
@ -513,7 +513,9 @@
|
||||
"freespace": "Espace Libre",
|
||||
"activeusers": "Utilisateurs Actifs",
|
||||
"cpuload": "Charge Cpu",
|
||||
"memoryusage": "Utilisation Mémoire"
|
||||
"memoryusage": "Utilisation Mémoire",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Statut",
|
||||
@ -580,7 +582,7 @@
|
||||
"passes": "Passes"
|
||||
},
|
||||
"whatsupdocker": {
|
||||
"monitoring": "Monitoring",
|
||||
"updates": "Updates"
|
||||
"monitoring": "Conteneurs",
|
||||
"updates": "Mises à jour"
|
||||
}
|
||||
}
|
||||
|
||||
@ -513,7 +513,9 @@
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
"activeusers": "Active Users",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
|
||||
@ -513,7 +513,9 @@
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
"activeusers": "Active Users",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
|
||||
@ -229,7 +229,7 @@
|
||||
"streams": "Aktivni prijenosi",
|
||||
"movies": "Filmovi",
|
||||
"tv": "TV emisije",
|
||||
"albums": "Albums"
|
||||
"albums": "Albumi"
|
||||
},
|
||||
"glances": {
|
||||
"cpu": "CPU",
|
||||
@ -513,7 +513,9 @@
|
||||
"cpuload": "Cpu opterećenje",
|
||||
"memoryusage": "Korištenje memorije",
|
||||
"freespace": "Slobodna memorija",
|
||||
"activeusers": "Aktivni korisnici"
|
||||
"activeusers": "Aktivni korisnici",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Stanje",
|
||||
@ -581,6 +583,6 @@
|
||||
},
|
||||
"whatsupdocker": {
|
||||
"monitoring": "Monitoring",
|
||||
"updates": "Updates"
|
||||
"updates": "Aktualiziranja"
|
||||
}
|
||||
}
|
||||
|
||||
@ -513,7 +513,9 @@
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
"activeusers": "Active Users",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
|
||||
@ -513,7 +513,9 @@
|
||||
"memoryusage": "Memory Usage",
|
||||
"cpuload": "Cpu Load",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
"activeusers": "Active Users",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
|
||||
@ -513,7 +513,9 @@
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
"activeusers": "Active Users",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
|
||||
@ -534,7 +534,9 @@
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
"activeusers": "Active Users",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
|
||||
@ -513,7 +513,9 @@
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
"activeusers": "Active Users",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
|
||||
@ -513,7 +513,9 @@
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
"activeusers": "Active Users",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
|
||||
@ -513,7 +513,9 @@
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
"activeusers": "Active Users",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
|
||||
@ -513,7 +513,9 @@
|
||||
"cpuload": "Cpu Belasting",
|
||||
"memoryusage": "Geheugen Gebruik",
|
||||
"freespace": "Vrije Ruimte",
|
||||
"activeusers": "Actieve Gebruikers"
|
||||
"activeusers": "Actieve Gebruikers",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
|
||||
@ -513,7 +513,9 @@
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
"activeusers": "Active Users",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
|
||||
@ -513,7 +513,9 @@
|
||||
"cpuload": "Carga de CPU",
|
||||
"memoryusage": "Memória Utilizada",
|
||||
"freespace": "Espaço Livre",
|
||||
"activeusers": "Usuários Ativos"
|
||||
"activeusers": "Usuários Ativos",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
|
||||
@ -522,7 +522,9 @@
|
||||
"cpuload": "Carga de CPU",
|
||||
"memoryusage": "Memória Utilizada",
|
||||
"freespace": "Espaço Livre",
|
||||
"activeusers": "Utilizadores Ativos"
|
||||
"activeusers": "Utilizadores Ativos",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Estado",
|
||||
|
||||
@ -513,7 +513,9 @@
|
||||
"activeusers": "Active Users",
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space"
|
||||
"freespace": "Free Space",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
"status": "Статус",
|
||||
"information": "Информация",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"raw_error": "Необработанная ошибка",
|
||||
"response_data": "Данные ответа"
|
||||
},
|
||||
"search": {
|
||||
@ -17,14 +17,14 @@
|
||||
"used": "Использовано",
|
||||
"load": "Загрузка",
|
||||
"cpu": "Процессор",
|
||||
"mem": "MEM",
|
||||
"temp": "TEMP",
|
||||
"max": "Max",
|
||||
"mem": "Память",
|
||||
"temp": "Температура",
|
||||
"max": "Макс.",
|
||||
"uptime": "UP",
|
||||
"months": "mo",
|
||||
"days": "d",
|
||||
"hours": "h",
|
||||
"minutes": "m"
|
||||
"months": "мес",
|
||||
"days": "д",
|
||||
"hours": "ч",
|
||||
"minutes": "м"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "Rx",
|
||||
@ -34,34 +34,34 @@
|
||||
"offline": "Не в сети",
|
||||
"error": "Ошибка",
|
||||
"unknown": "Неизвестный",
|
||||
"running": "Running",
|
||||
"starting": "Starting",
|
||||
"unhealthy": "Unhealthy",
|
||||
"not_found": "Not Found",
|
||||
"exited": "Exited",
|
||||
"partial": "Partial",
|
||||
"healthy": "Healthy"
|
||||
"running": "Запущенно",
|
||||
"starting": "Запускается",
|
||||
"unhealthy": "Не живой",
|
||||
"not_found": "Не найден",
|
||||
"exited": "Существует",
|
||||
"partial": "Частично",
|
||||
"healthy": "Живой"
|
||||
},
|
||||
"emby": {
|
||||
"playing": "Воспроизведение",
|
||||
"transcoding": "Транскодирование",
|
||||
"bitrate": "Битрейт",
|
||||
"no_active": "Нет активных потоков",
|
||||
"movies": "Movies",
|
||||
"series": "Series",
|
||||
"episodes": "Episodes",
|
||||
"songs": "Songs"
|
||||
"movies": "Фильмы",
|
||||
"series": "Сериалы",
|
||||
"episodes": "Эпизоды",
|
||||
"songs": "Песни"
|
||||
},
|
||||
"tautulli": {
|
||||
"playing": "Воспроизведение",
|
||||
"transcoding": "Транскодирование",
|
||||
"bitrate": "Битрейт",
|
||||
"no_active": "No Active Streams"
|
||||
"no_active": "Нет активных трансляций"
|
||||
},
|
||||
"rutorrent": {
|
||||
"active": "Активный",
|
||||
"upload": "Загрузить",
|
||||
"download": "Скачать"
|
||||
"upload": "Загрузка",
|
||||
"download": "Загрузка"
|
||||
},
|
||||
"sonarr": {
|
||||
"wanted": "Хотел",
|
||||
@ -72,12 +72,12 @@
|
||||
"wanted": "Хотел",
|
||||
"queued": "В очереди",
|
||||
"movies": "Фильмы",
|
||||
"missing": "Missing"
|
||||
"missing": "Пропущено"
|
||||
},
|
||||
"readarr": {
|
||||
"wanted": "Wanted",
|
||||
"queued": "Queued",
|
||||
"books": "Books"
|
||||
"wanted": "Хотел",
|
||||
"queued": "В очереди",
|
||||
"books": "Книги"
|
||||
},
|
||||
"ombi": {
|
||||
"pending": "Ожидание",
|
||||
@ -95,12 +95,12 @@
|
||||
"gravity": "Сила тяжести"
|
||||
},
|
||||
"speedtest": {
|
||||
"upload": "Загрузка",
|
||||
"download": "Скачать",
|
||||
"ping": "пинг"
|
||||
"upload": "Отдача",
|
||||
"download": "Загрузка",
|
||||
"ping": "Пинг"
|
||||
},
|
||||
"portainer": {
|
||||
"running": "Запущено",
|
||||
"running": "Запущенно",
|
||||
"stopped": "Остановлено",
|
||||
"total": "Всего"
|
||||
},
|
||||
@ -121,92 +121,92 @@
|
||||
"updating": "Обновление"
|
||||
},
|
||||
"overseerr": {
|
||||
"pending": "Pending",
|
||||
"approved": "Approved",
|
||||
"available": "Available",
|
||||
"processing": "Processing"
|
||||
"pending": "Ожидание",
|
||||
"approved": "Одобрено",
|
||||
"available": "Доступно",
|
||||
"processing": "Обработка"
|
||||
},
|
||||
"sabnzbd": {
|
||||
"rate": "Rate",
|
||||
"queue": "Queue",
|
||||
"timeleft": "Time Left"
|
||||
"rate": "Оценка",
|
||||
"queue": "Очередь",
|
||||
"timeleft": "Осталось времени"
|
||||
},
|
||||
"nzbget": {
|
||||
"rate": "Rate",
|
||||
"remaining": "Remaining",
|
||||
"downloaded": "Downloaded"
|
||||
"rate": "Оценка",
|
||||
"remaining": "Осталось",
|
||||
"downloaded": "Загружено"
|
||||
},
|
||||
"coinmarketcap": {
|
||||
"configure": "Configure one or more crypto currencies to track",
|
||||
"1hour": "1 Hour",
|
||||
"1day": "1 Day",
|
||||
"7days": "7 Days",
|
||||
"configure": "Настройте одну или несколько криптовалют для отслеживания",
|
||||
"1hour": "1 Час",
|
||||
"1day": "1 День",
|
||||
"7days": "7 Дней",
|
||||
"30days": "30 Дней"
|
||||
},
|
||||
"gotify": {
|
||||
"apps": "Applications",
|
||||
"clients": "Clients",
|
||||
"messages": "Messages"
|
||||
"apps": "Приложения",
|
||||
"clients": "Клиенты",
|
||||
"messages": "Сообщения"
|
||||
},
|
||||
"prowlarr": {
|
||||
"enableIndexers": "Indexers",
|
||||
"numberOfGrabs": "Grabs",
|
||||
"numberOfQueries": "Queries",
|
||||
"numberOfFailGrabs": "Fail Grabs",
|
||||
"numberOfFailQueries": "Fail Queries"
|
||||
"enableIndexers": "Индексаторы",
|
||||
"numberOfGrabs": "Захваты",
|
||||
"numberOfQueries": "Запросы",
|
||||
"numberOfFailGrabs": "Неудачные захваты",
|
||||
"numberOfFailQueries": "Неудачные запросы"
|
||||
},
|
||||
"transmission": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
"download": "Загрузка",
|
||||
"upload": "Отдача",
|
||||
"leech": "Пиры",
|
||||
"seed": "Сиды"
|
||||
},
|
||||
"jackett": {
|
||||
"configured": "Configured",
|
||||
"errored": "Errored"
|
||||
"configured": "Настроено",
|
||||
"errored": "Ошибочно"
|
||||
},
|
||||
"bazarr": {
|
||||
"missingEpisodes": "Missing Episodes",
|
||||
"missingMovies": "Missing Movies"
|
||||
"missingEpisodes": "Отсутствующие эпизоды",
|
||||
"missingMovies": "Отсутствующие фильмы"
|
||||
},
|
||||
"lidarr": {
|
||||
"wanted": "Wanted",
|
||||
"queued": "Queued",
|
||||
"albums": "Albums"
|
||||
"wanted": "Хотел",
|
||||
"queued": "В очереди",
|
||||
"albums": "Альбомы"
|
||||
},
|
||||
"adguard": {
|
||||
"queries": "Queries",
|
||||
"blocked": "Blocked",
|
||||
"filtered": "Filtered",
|
||||
"latency": "Latency"
|
||||
"queries": "Запросы",
|
||||
"blocked": "Заблокировано",
|
||||
"filtered": "Отсортировано",
|
||||
"latency": "Задержка"
|
||||
},
|
||||
"qbittorrent": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
"download": "Загрузка",
|
||||
"upload": "Отдача",
|
||||
"leech": "Пиры",
|
||||
"seed": "Сиды"
|
||||
},
|
||||
"mastodon": {
|
||||
"user_count": "Users",
|
||||
"status_count": "Posts",
|
||||
"domain_count": "Domains"
|
||||
"user_count": "Пользователи",
|
||||
"status_count": "Посты",
|
||||
"domain_count": "Домены"
|
||||
},
|
||||
"strelaysrv": {
|
||||
"numConnections": "Connections",
|
||||
"dataRelayed": "Relayed",
|
||||
"transferRate": "Rate",
|
||||
"numActiveSessions": "Sessions"
|
||||
"numConnections": "Соединения",
|
||||
"dataRelayed": "Ретранслировано",
|
||||
"transferRate": "Оценка",
|
||||
"numActiveSessions": "Сессий"
|
||||
},
|
||||
"authentik": {
|
||||
"users": "Users",
|
||||
"loginsLast24H": "Logins (24h)",
|
||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||
"users": "Пользователи",
|
||||
"loginsLast24H": "Входы (24ч)",
|
||||
"failedLoginsLast24H": "Неудачные входы (24ч)"
|
||||
},
|
||||
"proxmox": {
|
||||
"mem": "MEM",
|
||||
"cpu": "CPU",
|
||||
"mem": "Память",
|
||||
"cpu": "Процессор",
|
||||
"lxc": "LXC",
|
||||
"vms": "VMs"
|
||||
"vms": "Виртуальные машины"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Пользователи",
|
||||
@ -215,152 +215,152 @@
|
||||
"wan": "WAN",
|
||||
"lan_users": "Пользователи LAN",
|
||||
"wlan_users": "Пользователи WLAN",
|
||||
"up": "UP",
|
||||
"down": "DOWN",
|
||||
"wait": "Подождите",
|
||||
"up": "Работает",
|
||||
"down": "Не работает",
|
||||
"wait": "Пожалуйста, подождите",
|
||||
"lan": "LAN",
|
||||
"wlan": "WLAN",
|
||||
"devices": "Устройства",
|
||||
"lan_devices": "Устройства подключённые по LAN",
|
||||
"wlan_devices": "WLAN Devices",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
"wlan_devices": "Подключения WLAN",
|
||||
"empty_data": "Статус системы неизвестен"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
"movies": "Movies",
|
||||
"tv": "TV Shows",
|
||||
"albums": "Albums"
|
||||
"streams": "Активные трансляции",
|
||||
"movies": "Фильмы",
|
||||
"tv": "Передачи",
|
||||
"albums": "Альбомы"
|
||||
},
|
||||
"glances": {
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM",
|
||||
"wait": "Please wait",
|
||||
"temp": "TEMP",
|
||||
"uptime": "UP",
|
||||
"days": "d",
|
||||
"hours": "h"
|
||||
"cpu": "Процессор",
|
||||
"mem": "Память",
|
||||
"wait": "Пожалуйста, подождите",
|
||||
"temp": "Температура",
|
||||
"uptime": "Работает",
|
||||
"days": "д",
|
||||
"hours": "ч"
|
||||
},
|
||||
"changedetectionio": {
|
||||
"totalObserved": "Всего наблюдаемых",
|
||||
"diffsDetected": "Обнаружены различия"
|
||||
},
|
||||
"wmo": {
|
||||
"0-day": "Sunny",
|
||||
"0-night": "Clear",
|
||||
"71-night": "Light Snow",
|
||||
"73-day": "Snow",
|
||||
"73-night": "Snow",
|
||||
"75-day": "Heavy Snow",
|
||||
"75-night": "Heavy Snow",
|
||||
"77-day": "Snow Grains",
|
||||
"77-night": "Snow Grains",
|
||||
"80-day": "Light Showers",
|
||||
"80-night": "Light Showers",
|
||||
"81-day": "Showers",
|
||||
"1-day": "Mainly Sunny",
|
||||
"1-night": "Mainly Clear",
|
||||
"2-day": "Partly Cloudy",
|
||||
"2-night": "Partly Cloudy",
|
||||
"3-day": "Cloudy",
|
||||
"3-night": "Cloudy",
|
||||
"45-day": "Foggy",
|
||||
"45-night": "Foggy",
|
||||
"48-day": "Foggy",
|
||||
"48-night": "Foggy",
|
||||
"51-day": "Light Drizzle",
|
||||
"51-night": "Light Drizzle",
|
||||
"53-day": "Drizzle",
|
||||
"53-night": "Drizzle",
|
||||
"55-day": "Heavy Drizzle",
|
||||
"55-night": "Heavy Drizzle",
|
||||
"56-day": "Light Freezing Drizzle",
|
||||
"56-night": "Light Freezing Drizzle",
|
||||
"57-day": "Freezing Drizzle",
|
||||
"57-night": "Freezing Drizzle",
|
||||
"61-day": "Light Rain",
|
||||
"61-night": "Light Rain",
|
||||
"63-day": "Rain",
|
||||
"63-night": "Rain",
|
||||
"65-day": "Heavy Rain",
|
||||
"65-night": "Heavy Rain",
|
||||
"66-day": "Freezing Rain",
|
||||
"66-night": "Freezing Rain",
|
||||
"67-day": "Freezing Rain",
|
||||
"67-night": "Freezing Rain",
|
||||
"71-day": "Light Snow",
|
||||
"81-night": "Showers",
|
||||
"82-day": "Heavy Showers",
|
||||
"82-night": "Heavy Showers",
|
||||
"85-day": "Snow Showers",
|
||||
"85-night": "Snow Showers",
|
||||
"86-day": "Snow Showers",
|
||||
"86-night": "Snow Showers",
|
||||
"95-day": "Thunderstorm",
|
||||
"95-night": "Thunderstorm",
|
||||
"96-day": "Thunderstorm With Hail",
|
||||
"96-night": "Thunderstorm With Hail",
|
||||
"99-day": "Thunderstorm With Hail",
|
||||
"99-night": "Thunderstorm With Hail"
|
||||
"0-day": "Солнечно",
|
||||
"0-night": "Ясно",
|
||||
"71-night": "Лёгкий снег",
|
||||
"73-day": "Снег",
|
||||
"73-night": "Снег",
|
||||
"75-day": "Сильный снегопад",
|
||||
"75-night": "Сильный снегопад",
|
||||
"77-day": "Снежные зёрна",
|
||||
"77-night": "Снежные зёрна",
|
||||
"80-day": "Слабый дождь",
|
||||
"80-night": "Слабый дождь",
|
||||
"81-day": "Ливень",
|
||||
"1-day": "Преимущественно солнечно",
|
||||
"1-night": "Преимущественно ясно",
|
||||
"2-day": "Переменная облачность",
|
||||
"2-night": "Переменная облачность",
|
||||
"3-day": "Облачно",
|
||||
"3-night": "Облачно",
|
||||
"45-day": "Туманно",
|
||||
"45-night": "Туманно",
|
||||
"48-day": "Туманно",
|
||||
"48-night": "Туманно",
|
||||
"51-day": "Слегка моросит",
|
||||
"51-night": "Слегка моросит",
|
||||
"53-day": "Моросит",
|
||||
"53-night": "Моросит",
|
||||
"55-day": "Сильно моросит",
|
||||
"55-night": "Сильно моросит",
|
||||
"56-day": "Лёгкая изморозь",
|
||||
"56-night": "Лёгкая изморозь",
|
||||
"57-day": "Изморозь",
|
||||
"57-night": "Изморозь",
|
||||
"61-day": "Лёгкий дождь",
|
||||
"61-night": "Лёгкий дождь",
|
||||
"63-day": "Дождь",
|
||||
"63-night": "Дождь",
|
||||
"65-day": "Сильный дождь",
|
||||
"65-night": "Сильный дождь",
|
||||
"66-day": "Ледяной дождь",
|
||||
"66-night": "Ледяной дождь",
|
||||
"67-day": "Ледяной дождь",
|
||||
"67-night": "Ледяной дождь",
|
||||
"71-day": "Лёгкий снег",
|
||||
"81-night": "Ливень",
|
||||
"82-day": "Сильный ливень",
|
||||
"82-night": "Сильный ливень",
|
||||
"85-day": "Снегопад",
|
||||
"85-night": "Снегопад",
|
||||
"86-day": "Снегопад",
|
||||
"86-night": "Снегопад",
|
||||
"95-day": "Гроза",
|
||||
"95-night": "Гроза",
|
||||
"96-day": "Гроза с градом",
|
||||
"96-night": "Гроза с градом",
|
||||
"99-day": "Гроза с градом",
|
||||
"99-night": "Гроза с градом"
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom",
|
||||
"visit": "Visit",
|
||||
"bookmark": "Закладка",
|
||||
"service": "Сервис",
|
||||
"search": "Поиск",
|
||||
"custom": "Пользовательский",
|
||||
"visit": "Посетить",
|
||||
"url": "URL"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
"updates": "Updates",
|
||||
"update_available": "Update Available",
|
||||
"up_to_date": "Up to Date",
|
||||
"available_update": "Система",
|
||||
"updates": "Обновления",
|
||||
"update_available": "Доступные обновления",
|
||||
"up_to_date": "Обновлено",
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"child_bridges": "Child Bridges",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"child_bridges": "Дочерние мосты",
|
||||
"up": "Включено",
|
||||
"pending": "В ожидании",
|
||||
"down": "Выключено"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Approved",
|
||||
"rejectedPushes": "Rejected",
|
||||
"filters": "Filters",
|
||||
"indexers": "Indexers"
|
||||
"approvedPushes": "Одобрено",
|
||||
"rejectedPushes": "Отклонено",
|
||||
"filters": "Фильтры",
|
||||
"indexers": "Индексаторы"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Scanned",
|
||||
"containers_updated": "Updated",
|
||||
"containers_failed": "Failed"
|
||||
"containers_scanned": "Отсканировано",
|
||||
"containers_updated": "Обновлено",
|
||||
"containers_failed": "Неудачно"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Queue",
|
||||
"videos": "Videos",
|
||||
"channels": "Channels",
|
||||
"playlists": "Playlists"
|
||||
"downloads": "Очередь",
|
||||
"videos": "Видео",
|
||||
"channels": "Каналы",
|
||||
"playlists": "Плейлисты"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "System Load",
|
||||
"uptime": "Uptime",
|
||||
"alerts": "Alerts",
|
||||
"load": "Загрузка системы",
|
||||
"uptime": "Время работы",
|
||||
"alerts": "Уведомления",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "No Active Streams",
|
||||
"please_wait": "Please Wait"
|
||||
"nothing_streaming": "Нет активных трансляций",
|
||||
"please_wait": "Пожалуйста, подождите"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Speed",
|
||||
"active": "Active",
|
||||
"queue": "Queue",
|
||||
"total": "Total"
|
||||
"speed": "Скорость",
|
||||
"active": "Активный",
|
||||
"queue": "Очередь",
|
||||
"total": "Всего"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
"public_ip": "Публичный IP",
|
||||
"region": "Регион",
|
||||
"country": "Страна"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"channels": "Каналы",
|
||||
"hd": "HD"
|
||||
},
|
||||
"ping": {
|
||||
@ -368,219 +368,221 @@
|
||||
"ping": "Пинг"
|
||||
},
|
||||
"scrutiny": {
|
||||
"failed": "Failed",
|
||||
"unknown": "Unknown",
|
||||
"passed": "Passed"
|
||||
"failed": "Неудачно",
|
||||
"unknown": "Неизвестный",
|
||||
"passed": "Пройдено"
|
||||
},
|
||||
"paperlessngx": {
|
||||
"inbox": "Inbox",
|
||||
"total": "Total"
|
||||
"inbox": "Входящие",
|
||||
"total": "Всего"
|
||||
},
|
||||
"deluge": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
"download": "Загрузка",
|
||||
"upload": "Отдача",
|
||||
"leech": "Пиры",
|
||||
"seed": "Сиды"
|
||||
},
|
||||
"flood": {
|
||||
"upload": "Upload",
|
||||
"download": "Download",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
"upload": "Отдача",
|
||||
"download": "Загрузка",
|
||||
"leech": "Пиры",
|
||||
"seed": "Сиды"
|
||||
},
|
||||
"tdarr": {
|
||||
"queue": "Queue",
|
||||
"processed": "Processed",
|
||||
"errored": "Errored",
|
||||
"saved": "Saved"
|
||||
"queue": "Очередь",
|
||||
"processed": "Обработано",
|
||||
"errored": "Ошибочно",
|
||||
"saved": "Сохранено"
|
||||
},
|
||||
"miniflux": {
|
||||
"read": "Read",
|
||||
"unread": "Unread"
|
||||
"read": "Прочитанные",
|
||||
"unread": "Непрочитанные"
|
||||
},
|
||||
"nextdns": {
|
||||
"wait": "Please Wait",
|
||||
"no_devices": "No Device Data Received"
|
||||
"wait": "Пожалуйста, подождите",
|
||||
"no_devices": "Данные устройства не получены"
|
||||
},
|
||||
"common": {
|
||||
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
|
||||
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
|
||||
},
|
||||
"omada": {
|
||||
"connectedSwitches": "Connected switches",
|
||||
"connectedAp": "Connected APs",
|
||||
"activeUser": "Active devices",
|
||||
"alerts": "Alerts",
|
||||
"connectedGateway": "Connected gateways"
|
||||
"connectedSwitches": "Подключенные свитчи",
|
||||
"connectedAp": "Подключенные точки доступа",
|
||||
"activeUser": "Активные устройства",
|
||||
"alerts": "Оповещения",
|
||||
"connectedGateway": "Подключенные шлюзы"
|
||||
},
|
||||
"downloadstation": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
"download": "Загрузка",
|
||||
"upload": "Отдача",
|
||||
"leech": "Пиры",
|
||||
"seed": "Сиды"
|
||||
},
|
||||
"mikrotik": {
|
||||
"cpuLoad": "CPU Load",
|
||||
"memoryUsed": "Memory Used",
|
||||
"uptime": "Uptime",
|
||||
"numberOfLeases": "Leases"
|
||||
"cpuLoad": "Загрузка процессора",
|
||||
"memoryUsed": "Использование памяти",
|
||||
"uptime": "Время работы",
|
||||
"numberOfLeases": "Аренды"
|
||||
},
|
||||
"xteve": {
|
||||
"streams_all": "All Streams",
|
||||
"streams_active": "Active Streams",
|
||||
"streams_xepg": "XEPG Channels"
|
||||
"streams_all": "Все трансляции",
|
||||
"streams_active": "Активные трансляции",
|
||||
"streams_xepg": "XEPG-каналы"
|
||||
},
|
||||
"opnsense": {
|
||||
"cpu": "CPU Load",
|
||||
"memory": "Active Memory",
|
||||
"wanUpload": "WAN Upload",
|
||||
"wanDownload": "WAN Download"
|
||||
"cpu": "Загрузка процессора",
|
||||
"memory": "Активная память",
|
||||
"wanUpload": "Отдача через WAN",
|
||||
"wanDownload": "Загрузка через WAN"
|
||||
},
|
||||
"moonraker": {
|
||||
"printer_state": "Printer State",
|
||||
"print_status": "Print Status",
|
||||
"print_progress": "Progress",
|
||||
"layers": "Layers"
|
||||
"printer_state": "Состояние принтера",
|
||||
"print_status": "Статус печати",
|
||||
"print_progress": "Прогресс",
|
||||
"layers": "Слои"
|
||||
},
|
||||
"medusa": {
|
||||
"wanted": "Wanted",
|
||||
"queued": "Queued",
|
||||
"series": "Series"
|
||||
"wanted": "Хотел",
|
||||
"queued": "В очереди",
|
||||
"series": "Сериалы"
|
||||
},
|
||||
"octoprint": {
|
||||
"printer_state": "Status",
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
"printer_state": "Статус",
|
||||
"temp_tool": "Температура инструмента",
|
||||
"temp_bed": "Температура стола",
|
||||
"job_completion": "Завершение"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
"origin_ip": "IP источника",
|
||||
"status": "Статус"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
"datastore_usage": "Хранилище данных",
|
||||
"failed_tasks_24h": "Неудачные задачи 24ч",
|
||||
"cpu_usage": "Процессор",
|
||||
"memory_usage": "Память"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
"users": "Пользователи",
|
||||
"photos": "Фотографии",
|
||||
"videos": "Видео",
|
||||
"storage": "Хранилище"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
"up": "Сайтов включено",
|
||||
"down": "Сайтов выключено",
|
||||
"uptime": "Время работы",
|
||||
"incident": "Инцидент",
|
||||
"m": "м"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
"libraries": "Библиотеки",
|
||||
"series": "Серии",
|
||||
"books": "Книги"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
"series": "Серии",
|
||||
"issues": "Проблемы",
|
||||
"wanted": "Хотел"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
"albums": "Альбомы",
|
||||
"photos": "Фотографии",
|
||||
"videos": "Видео",
|
||||
"people": "Люди"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
"days": "Дней",
|
||||
"uptime": "Время работы",
|
||||
"volumeAvailable": "Доступно"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
"queue": "Очередь",
|
||||
"processing": "Обработка",
|
||||
"processed": "Обработано",
|
||||
"time": "Время"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
"dashboards": "Панели мониторинга",
|
||||
"datasources": "Источники данных",
|
||||
"totalalerts": "Всего уведомлений",
|
||||
"alertstriggered": "Уведомлений сработало"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
"cpuload": "Загрузка процессора",
|
||||
"memoryusage": "Использование памяти",
|
||||
"freespace": "Свободное место",
|
||||
"activeusers": "Активные пользователи",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
"status": "Статус",
|
||||
"size": "Размер",
|
||||
"lastrun": "Последний запуск",
|
||||
"nextrun": "Следующий запуск",
|
||||
"failed": "Неудачно"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
"active_workers": "Активные воркеры",
|
||||
"total_workers": "Всего воркеров",
|
||||
"records_total": "Длина запроса"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
"new": "Новые",
|
||||
"up": "Онлайн",
|
||||
"grace": "В льготный период",
|
||||
"down": "Офлайн",
|
||||
"paused": "Приостановлено",
|
||||
"status": "Статус",
|
||||
"last_ping": "Последний пинг",
|
||||
"never": "Пока нет пингов"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
"servers": "Сервера",
|
||||
"nodes": "Узлы"
|
||||
},
|
||||
"prometheus": {
|
||||
"targets_up": "Targets Up",
|
||||
"targets_down": "Targets Down",
|
||||
"targets_total": "Total Targets"
|
||||
"targets_up": "Целей включено",
|
||||
"targets_down": "Целей выключено",
|
||||
"targets_total": "Всего целей"
|
||||
},
|
||||
"minecraft": {
|
||||
"players": "Players",
|
||||
"version": "Version",
|
||||
"status": "Status",
|
||||
"up": "Online",
|
||||
"down": "Offline"
|
||||
"players": "Игроков",
|
||||
"version": "Версия",
|
||||
"status": "Статус",
|
||||
"up": "Онлайн",
|
||||
"down": "Офлайн"
|
||||
},
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "One year",
|
||||
"gross_percent_max": "All time"
|
||||
"gross_percent_today": "Сегодня",
|
||||
"gross_percent_1y": "1 год",
|
||||
"gross_percent_max": "За всё время"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
"books": "Books",
|
||||
"podcastsDuration": "Duration",
|
||||
"booksDuration": "Duration"
|
||||
"podcasts": "Подкасты",
|
||||
"books": "Книги",
|
||||
"podcastsDuration": "Продолжительность",
|
||||
"booksDuration": "Продолжительность"
|
||||
},
|
||||
"homeassistant": {
|
||||
"people_home": "People Home",
|
||||
"lights_on": "Lights On",
|
||||
"switches_on": "Switches On"
|
||||
"people_home": "Людей дома",
|
||||
"lights_on": "Включено света",
|
||||
"switches_on": "Включено переключателей"
|
||||
},
|
||||
"freshrss": {
|
||||
"subscriptions": "Subscriptions",
|
||||
"unread": "Unread"
|
||||
"subscriptions": "Подписки",
|
||||
"unread": "Непрочитанные"
|
||||
},
|
||||
"channelsdvrserver": {
|
||||
"shows": "Shows",
|
||||
"recordings": "Recordings",
|
||||
"scheduled": "Scheduled",
|
||||
"passes": "Passes"
|
||||
"shows": "Сериалы",
|
||||
"recordings": "Записи",
|
||||
"scheduled": "Запланировано",
|
||||
"passes": "Пройдено"
|
||||
},
|
||||
"whatsupdocker": {
|
||||
"monitoring": "Monitoring",
|
||||
"updates": "Updates"
|
||||
"monitoring": "Мониторинг",
|
||||
"updates": "Обновления"
|
||||
}
|
||||
}
|
||||
|
||||
@ -534,7 +534,9 @@
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users",
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage"
|
||||
"memoryusage": "Memory Usage",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
|
||||
@ -68,7 +68,9 @@
|
||||
"cpuload": "CPU obremenitev",
|
||||
"memoryusage": "Uporabljen spomin",
|
||||
"freespace": "Prostor na voljo",
|
||||
"activeusers": "Aktivni uporabniki"
|
||||
"activeusers": "Aktivni uporabniki",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Stanje",
|
||||
@ -193,10 +195,10 @@
|
||||
"streams": "Aktivna vsebina",
|
||||
"movies": "Filmi",
|
||||
"tv": "TV serije",
|
||||
"albums": "Albums"
|
||||
"albums": "Albumi"
|
||||
},
|
||||
"sabnzbd": {
|
||||
"rate": "Hitrost prenosa",
|
||||
"rate": "Hitrost",
|
||||
"queue": "Vrsta",
|
||||
"timeleft": "Preostali čas"
|
||||
},
|
||||
@ -236,7 +238,7 @@
|
||||
},
|
||||
"radarr": {
|
||||
"wanted": "Iskano",
|
||||
"missing": "Manjkajoče",
|
||||
"missing": "Manjka",
|
||||
"queued": "V vrsti",
|
||||
"movies": "Filmi"
|
||||
},
|
||||
@ -341,7 +343,7 @@
|
||||
},
|
||||
"proxmox": {
|
||||
"lxc": "LXC",
|
||||
"vms": "VM-ji",
|
||||
"vms": "VM",
|
||||
"mem": "MEM",
|
||||
"cpu": "CPU"
|
||||
},
|
||||
@ -521,10 +523,10 @@
|
||||
"storage": "Shramba"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Povezanih strani",
|
||||
"down": "Nepovezanih strani",
|
||||
"up": "Deluje",
|
||||
"down": "Ne deluje",
|
||||
"uptime": "Čas delovanja",
|
||||
"incident": "Težave",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
@ -561,11 +563,11 @@
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasti",
|
||||
"books": "Knjige",
|
||||
"podcastsDuration": "Dolžina",
|
||||
"booksDuration": "Dolžina"
|
||||
"podcastsDuration": "Trajanje",
|
||||
"booksDuration": "Trajanje"
|
||||
},
|
||||
"homeassistant": {
|
||||
"people_home": "Ljudi doma",
|
||||
"people_home": "Ljudje doma",
|
||||
"lights_on": "Vklopljene luči",
|
||||
"switches_on": "Vklopljena stikala"
|
||||
},
|
||||
@ -580,7 +582,7 @@
|
||||
"passes": "Prehodi"
|
||||
},
|
||||
"whatsupdocker": {
|
||||
"monitoring": "Monitoring",
|
||||
"updates": "Updates"
|
||||
"monitoring": "Se spremlja",
|
||||
"updates": "Posodobitve"
|
||||
}
|
||||
}
|
||||
|
||||
@ -513,7 +513,9 @@
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
"activeusers": "Active Users",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
|
||||
@ -513,7 +513,9 @@
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
"activeusers": "Active Users",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
|
||||
@ -513,7 +513,9 @@
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"cpuload": "Cpu Load",
|
||||
"activeusers": "Active Users"
|
||||
"activeusers": "Active Users",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
|
||||
@ -513,7 +513,9 @@
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
"activeusers": "Active Users",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
|
||||
@ -513,7 +513,9 @@
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
"activeusers": "Active Users",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
|
||||
@ -513,7 +513,9 @@
|
||||
"cpuload": "Навантаження Cpu",
|
||||
"memoryusage": "Використання пам'яті",
|
||||
"freespace": "Вільного місця",
|
||||
"activeusers": "Активні користувачі"
|
||||
"activeusers": "Активні користувачі",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Статус",
|
||||
@ -580,7 +582,7 @@
|
||||
"passes": "Перепустки"
|
||||
},
|
||||
"whatsupdocker": {
|
||||
"monitoring": "Monitoring",
|
||||
"updates": "Updates"
|
||||
"monitoring": "Спостереження",
|
||||
"updates": "Оновлення"
|
||||
}
|
||||
}
|
||||
|
||||
@ -513,7 +513,9 @@
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
"activeusers": "Active Users",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
|
||||
@ -513,7 +513,9 @@
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
"activeusers": "Active Users",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"lastrun": "Last Run",
|
||||
|
||||
@ -229,7 +229,7 @@
|
||||
"streams": "活动流",
|
||||
"movies": "电影",
|
||||
"tv": "电视节目",
|
||||
"albums": "Albums"
|
||||
"albums": "专辑"
|
||||
},
|
||||
"glances": {
|
||||
"cpu": "处理器",
|
||||
@ -513,7 +513,9 @@
|
||||
"cpuload": "处理器负载",
|
||||
"memoryusage": "内存占用",
|
||||
"freespace": "剩余空间",
|
||||
"activeusers": "活跃用户"
|
||||
"activeusers": "活跃用户",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "状态",
|
||||
@ -542,9 +544,9 @@
|
||||
"nodes": "节点"
|
||||
},
|
||||
"prometheus": {
|
||||
"targets_up": "Targets Up",
|
||||
"targets_down": "Targets Down",
|
||||
"targets_total": "Total Targets"
|
||||
"targets_up": "目标离线",
|
||||
"targets_down": "目标在线",
|
||||
"targets_total": "总目标"
|
||||
},
|
||||
"minecraft": {
|
||||
"players": "播放中",
|
||||
@ -570,13 +572,13 @@
|
||||
"switches_on": "Switches On"
|
||||
},
|
||||
"freshrss": {
|
||||
"subscriptions": "Subscriptions",
|
||||
"unread": "Unread"
|
||||
"subscriptions": "订阅",
|
||||
"unread": "未读"
|
||||
},
|
||||
"channelsdvrserver": {
|
||||
"shows": "Shows",
|
||||
"recordings": "Recordings",
|
||||
"scheduled": "Scheduled",
|
||||
"shows": "节目",
|
||||
"recordings": "录像",
|
||||
"scheduled": "已计划的",
|
||||
"passes": "Passes"
|
||||
},
|
||||
"whatsupdocker": {
|
||||
|
||||
@ -26,8 +26,8 @@
|
||||
"starting": "啟動中",
|
||||
"unhealthy": "不健康的",
|
||||
"not_found": "未找到",
|
||||
"exited": "Exited",
|
||||
"partial": "Partial",
|
||||
"exited": "已退出",
|
||||
"partial": "部分",
|
||||
"healthy": "健康的"
|
||||
},
|
||||
"emby": {
|
||||
@ -35,10 +35,10 @@
|
||||
"transcoding": "轉碼",
|
||||
"bitrate": "位元率",
|
||||
"no_active": "無播放活動",
|
||||
"movies": "Movies",
|
||||
"series": "Series",
|
||||
"episodes": "Episodes",
|
||||
"songs": "Songs"
|
||||
"movies": "電影",
|
||||
"series": "影集",
|
||||
"episodes": "集",
|
||||
"songs": "曲目"
|
||||
},
|
||||
"tautulli": {
|
||||
"playing": "正在播放",
|
||||
@ -61,13 +61,13 @@
|
||||
"load": "負載",
|
||||
"cpu": "CPU",
|
||||
"mem": "記憶體",
|
||||
"temp": "TEMP",
|
||||
"max": "Max",
|
||||
"uptime": "UP",
|
||||
"months": "mo",
|
||||
"days": "d",
|
||||
"hours": "h",
|
||||
"minutes": "m"
|
||||
"temp": "溫度",
|
||||
"max": "最大",
|
||||
"uptime": "運行時間",
|
||||
"months": "月",
|
||||
"days": "天",
|
||||
"hours": "時",
|
||||
"minutes": "分"
|
||||
},
|
||||
"nzbget": {
|
||||
"rate": "速率",
|
||||
@ -98,7 +98,7 @@
|
||||
"readarr": {
|
||||
"wanted": "關注中",
|
||||
"queued": "已加入佇列",
|
||||
"books": "書籍"
|
||||
"books": "叢書"
|
||||
},
|
||||
"ombi": {
|
||||
"pending": "待下載",
|
||||
@ -114,7 +114,7 @@
|
||||
"pihole": {
|
||||
"queries": "查詢",
|
||||
"blocked": "已阻擋",
|
||||
"gravity": "Gravity"
|
||||
"gravity": "阻擋清單"
|
||||
},
|
||||
"speedtest": {
|
||||
"upload": "上行速率",
|
||||
@ -229,16 +229,16 @@
|
||||
"streams": "正在播放",
|
||||
"movies": "電影",
|
||||
"tv": "影集",
|
||||
"albums": "Albums"
|
||||
"albums": "專輯"
|
||||
},
|
||||
"glances": {
|
||||
"cpu": "CPU",
|
||||
"mem": "記憶體",
|
||||
"wait": "請稍後",
|
||||
"temp": "TEMP",
|
||||
"uptime": "UP",
|
||||
"days": "d",
|
||||
"hours": "h"
|
||||
"temp": "溫度",
|
||||
"uptime": "運行時間",
|
||||
"days": "天",
|
||||
"hours": "時"
|
||||
},
|
||||
"changedetectionio": {
|
||||
"totalObserved": "總監測數",
|
||||
@ -307,8 +307,8 @@
|
||||
"service": "服務",
|
||||
"search": "搜尋",
|
||||
"custom": "自訂",
|
||||
"visit": "Visit",
|
||||
"url": "URL"
|
||||
"visit": "訪問",
|
||||
"url": "網址"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "系統",
|
||||
@ -317,9 +317,9 @@
|
||||
"up_to_date": "已更新至最新",
|
||||
"child_bridges": "Child Bridges",
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"up": "Up",
|
||||
"pending": "Pending",
|
||||
"down": "Down"
|
||||
"up": "在線",
|
||||
"pending": "處理中",
|
||||
"down": "離線"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "已核准",
|
||||
@ -479,7 +479,7 @@
|
||||
"komga": {
|
||||
"libraries": "文庫",
|
||||
"series": "叢刊",
|
||||
"books": "書刊"
|
||||
"books": "叢書"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "系列",
|
||||
@ -513,7 +513,9 @@
|
||||
"cpuload": "處理器負載",
|
||||
"memoryusage": "記憶體用量",
|
||||
"freespace": "可用空間",
|
||||
"activeusers": "活躍用戶"
|
||||
"activeusers": "活躍用戶",
|
||||
"numfiles": "Files",
|
||||
"numshares": "Shared Items"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "狀態",
|
||||
@ -523,9 +525,9 @@
|
||||
"failed": "失敗"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
"active_workers": "在線工作程序",
|
||||
"total_workers": "總工作程序",
|
||||
"records_total": "佇列長度"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "新建立",
|
||||
@ -538,49 +540,49 @@
|
||||
"never": "尚未檢查"
|
||||
},
|
||||
"pterodactyl": {
|
||||
"servers": "Servers",
|
||||
"nodes": "Nodes"
|
||||
"servers": "伺服器",
|
||||
"nodes": "節點"
|
||||
},
|
||||
"prometheus": {
|
||||
"targets_up": "Targets Up",
|
||||
"targets_down": "Targets Down",
|
||||
"targets_total": "Total Targets"
|
||||
"targets_up": "目標上線",
|
||||
"targets_down": "目標離線",
|
||||
"targets_total": "目標總數"
|
||||
},
|
||||
"minecraft": {
|
||||
"players": "Players",
|
||||
"version": "Version",
|
||||
"status": "Status",
|
||||
"up": "Online",
|
||||
"down": "Offline"
|
||||
"players": "玩家",
|
||||
"version": "版本",
|
||||
"status": "狀態",
|
||||
"up": "上線",
|
||||
"down": "離線"
|
||||
},
|
||||
"ghostfolio": {
|
||||
"gross_percent_today": "Today",
|
||||
"gross_percent_1y": "One year",
|
||||
"gross_percent_max": "All time"
|
||||
"gross_percent_today": "今日",
|
||||
"gross_percent_1y": "一年",
|
||||
"gross_percent_max": "所有時間"
|
||||
},
|
||||
"audiobookshelf": {
|
||||
"podcasts": "Podcasts",
|
||||
"books": "Books",
|
||||
"podcastsDuration": "Duration",
|
||||
"booksDuration": "Duration"
|
||||
"podcasts": "播客",
|
||||
"books": "叢書",
|
||||
"podcastsDuration": "歷時",
|
||||
"booksDuration": "歷時"
|
||||
},
|
||||
"homeassistant": {
|
||||
"people_home": "People Home",
|
||||
"lights_on": "Lights On",
|
||||
"switches_on": "Switches On"
|
||||
"people_home": "在家人數",
|
||||
"lights_on": "燈亮著",
|
||||
"switches_on": "開關開著"
|
||||
},
|
||||
"freshrss": {
|
||||
"subscriptions": "Subscriptions",
|
||||
"unread": "Unread"
|
||||
"subscriptions": "訂閱",
|
||||
"unread": "未讀"
|
||||
},
|
||||
"channelsdvrserver": {
|
||||
"shows": "Shows",
|
||||
"recordings": "Recordings",
|
||||
"scheduled": "Scheduled",
|
||||
"passes": "Passes"
|
||||
"shows": "節目",
|
||||
"recordings": "錄影",
|
||||
"scheduled": "已排定",
|
||||
"passes": "通行證"
|
||||
},
|
||||
"whatsupdocker": {
|
||||
"monitoring": "Monitoring",
|
||||
"updates": "Updates"
|
||||
"monitoring": "監測中",
|
||||
"updates": "可更新"
|
||||
}
|
||||
}
|
||||
|
||||
@ -4,7 +4,7 @@ export default function List({ bookmarks }) {
|
||||
return (
|
||||
<ul className="mt-3 flex flex-col">
|
||||
{bookmarks.map((bookmark) => (
|
||||
<Item key={bookmark.name} bookmark={bookmark} />
|
||||
<Item key={`${bookmark.name}-${bookmark.href}`} bookmark={bookmark} />
|
||||
))}
|
||||
</ul>
|
||||
);
|
||||
|
||||
@ -161,7 +161,7 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear
|
||||
)} type="text" autoCorrect="false" ref={searchField} value={searchString} onChange={handleSearchChange} onKeyDown={handleSearchKeyDown} />
|
||||
{results.length > 0 && <ul className="max-h-[60vh] overflow-y-auto m-2">
|
||||
{results.map((r, i) => (
|
||||
<li key={r.container ?? r.app ?? r.name}>
|
||||
<li key={r.container ?? r.app ?? `${r.name}-${r.href}`}>
|
||||
<button type="button" data-index={i} onMouseEnter={handleItemHover} className={classNames(
|
||||
"flex flex-row w-full items-center justify-between rounded-md text-sm md:text-xl py-2 px-4 cursor-pointer text-theme-700 dark:text-theme-200",
|
||||
i === currentItemIndex && "bg-theme-300/50 dark:bg-theme-700/50",
|
||||
|
||||
@ -1,6 +1,18 @@
|
||||
import { useContext } from "react";
|
||||
import Image from "next/future/image";
|
||||
|
||||
import { SettingsContext } from "utils/contexts/settings";
|
||||
import { ThemeContext } from "utils/contexts/theme";
|
||||
|
||||
const iconSetURLs = {
|
||||
'mdi': "https://cdn.jsdelivr.net/npm/@mdi/svg@latest/svg/",
|
||||
'si' : "https://cdn.jsdelivr.net/npm/simple-icons@latest/icons/",
|
||||
};
|
||||
|
||||
export default function ResolvedIcon({ icon, width = 32, height = 32, alt = "logo" }) {
|
||||
const { settings } = useContext(SettingsContext);
|
||||
const { theme } = useContext(ThemeContext);
|
||||
|
||||
// direct or relative URLs
|
||||
if (icon.startsWith("http") || icon.startsWith("/")) {
|
||||
return (
|
||||
@ -12,15 +24,22 @@ export default function ResolvedIcon({ icon, width = 32, height = 32, alt = "log
|
||||
width,
|
||||
height,
|
||||
objectFit: "contain",
|
||||
maxHeight: "100%",
|
||||
maxWidth: "100%",
|
||||
}}
|
||||
alt={alt}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
// mdi- prefixed, material design icons
|
||||
if (icon.startsWith("mdi-")) {
|
||||
const iconName = icon.replace("mdi-", "").replace(".svg", "");
|
||||
// check mdi- or si- prefixed icons
|
||||
const prefix = icon.split("-")[0]
|
||||
|
||||
if (prefix in iconSetURLs) {
|
||||
// get icon source
|
||||
const iconName = icon.replace(`${prefix}-`, "").replace(".svg", "");
|
||||
const iconSource = `${iconSetURLs[prefix]}${iconName}.svg`;
|
||||
|
||||
return (
|
||||
<div
|
||||
style={{
|
||||
@ -28,9 +47,11 @@ export default function ResolvedIcon({ icon, width = 32, height = 32, alt = "log
|
||||
height,
|
||||
maxWidth: '100%',
|
||||
maxHeight: '100%',
|
||||
background: "linear-gradient(180deg, rgb(var(--color-logo-start)), rgb(var(--color-logo-stop)))",
|
||||
mask: `url(https://cdn.jsdelivr.net/npm/@mdi/svg@latest/svg/${iconName}.svg) no-repeat center / contain`,
|
||||
WebkitMask: `url(https://cdn.jsdelivr.net/npm/@mdi/svg@latest/svg/${iconName}.svg) no-repeat center / contain`,
|
||||
background: settings.iconStyle === "theme" ?
|
||||
`rgb(var(--color-${ theme === "dark" ? 300 : 900 }) / var(--tw-text-opacity, 1))` :
|
||||
"linear-gradient(180deg, rgb(var(--color-logo-start)), rgb(var(--color-logo-stop)))",
|
||||
mask: `url(${iconSource}) no-repeat center / contain`,
|
||||
WebkitMask: `url(${iconSource}) no-repeat center / contain`,
|
||||
}}
|
||||
/>
|
||||
);
|
||||
@ -47,6 +68,8 @@ export default function ResolvedIcon({ icon, width = 32, height = 32, alt = "log
|
||||
width,
|
||||
height,
|
||||
objectFit: "contain",
|
||||
maxHeight: "100%",
|
||||
maxWidth: "100%"
|
||||
}}
|
||||
alt={alt}
|
||||
/>
|
||||
|
||||
@ -1,8 +1,18 @@
|
||||
import { useContext } from "react";
|
||||
|
||||
import Error from "./error";
|
||||
|
||||
import { SettingsContext } from "utils/contexts/settings";
|
||||
|
||||
export default function Container({ error = false, children, service }) {
|
||||
const { settings } = useContext(SettingsContext);
|
||||
|
||||
if (error) {
|
||||
return <Error error={error} />
|
||||
if (settings.hideErrors || service.widget.hide_errors) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return <Error service={service} error={error} />
|
||||
}
|
||||
|
||||
let visibleChildren = children;
|
||||
|
||||
@ -9,12 +9,10 @@ function displayData(data) {
|
||||
return (data.type === 'Buffer') ? Buffer.from(data).toString() : JSON.stringify(data, 4);
|
||||
}
|
||||
|
||||
export default function Error({ error }) {
|
||||
export default function Error({ error: err }) {
|
||||
const { t } = useTranslation();
|
||||
|
||||
if (error?.data?.error) {
|
||||
error = error.data.error; // eslint-disable-line no-param-reassign
|
||||
}
|
||||
const { error } = err?.data ?? { error: err };
|
||||
|
||||
return (
|
||||
<details className="px-1 pb-1">
|
||||
|
||||
@ -30,7 +30,7 @@ export default async function handler(req, res) {
|
||||
});
|
||||
}
|
||||
|
||||
const containerNames = containers.map((container) => container.Names[0]?.replace(/^\//, ""));
|
||||
const containerNames = containers.flatMap((container) => container.Names.map((name) => name.replace(/^\//, "")));
|
||||
const containerExists = containerNames.includes(containerName);
|
||||
|
||||
if (containerExists) {
|
||||
|
||||
@ -30,7 +30,7 @@ export default async function handler(req, res) {
|
||||
});
|
||||
}
|
||||
|
||||
const containerNames = containers.map((container) => container.Names[0]?.replace(/^\//, ""));
|
||||
const containerNames = containers.flatMap((container) => container.Names.map((name) => name.replace(/^\//, "")));
|
||||
const containerExists = containerNames.includes(containerName);
|
||||
|
||||
if (containerExists) {
|
||||
|
||||
@ -286,7 +286,7 @@ function Home({ initialSettings }) {
|
||||
)}
|
||||
</div>
|
||||
|
||||
{services && (
|
||||
{services?.length > 0 && (
|
||||
<div className="flex flex-wrap p-4 sm:p-8 sm:pt-4 items-start pb-2">
|
||||
{services.map((group) => (
|
||||
<ServicesGroup key={group.name} services={group} layout={initialSettings.layout?.[group.name]} fiveColumns={settings.fiveColumns} />
|
||||
@ -294,7 +294,7 @@ function Home({ initialSettings }) {
|
||||
</div>
|
||||
)}
|
||||
|
||||
{bookmarks && (
|
||||
{bookmarks?.length > 0 && (
|
||||
<div className={`grow flex flex-wrap pt-0 p-4 sm:p-8 gap-2 grid-cols-1 lg:grid-cols-2 lg:grid-cols-${Math.min(6, bookmarks.length)}`}>
|
||||
{bookmarks.map((group) => (
|
||||
<BookmarksGroup key={group.name} group={group} />
|
||||
|
||||
@ -257,6 +257,7 @@ export function cleanServiceGroups(groups) {
|
||||
const {
|
||||
type, // all widgets
|
||||
fields,
|
||||
hideErrors,
|
||||
server, // docker widget
|
||||
container,
|
||||
currency, // coinmarketcap widget
|
||||
@ -269,7 +270,7 @@ export function cleanServiceGroups(groups) {
|
||||
wan, // opnsense widget,
|
||||
enableBlocks, // emby/jellyfin
|
||||
enableNowPlaying,
|
||||
volume // diskstation widget
|
||||
volume, // diskstation widget
|
||||
} = cleanedService.widget;
|
||||
|
||||
const fieldsList = typeof fields === 'string' ? JSON.parse(fields) : fields;
|
||||
@ -277,6 +278,7 @@ export function cleanServiceGroups(groups) {
|
||||
cleanedService.widget = {
|
||||
type,
|
||||
fields: fieldsList || null,
|
||||
hide_errors: hideErrors || false,
|
||||
service_name: service.name,
|
||||
service_group: serviceGroup.name,
|
||||
};
|
||||
|
||||
@ -12,7 +12,7 @@ export default function Component({ service }) {
|
||||
const { data: adguardData, error: adguardError } = useWidgetAPI(widget, "stats");
|
||||
|
||||
if (adguardError) {
|
||||
return <Container error={adguardError} />;
|
||||
return <Container service={service} error={adguardError} />;
|
||||
}
|
||||
|
||||
if (!adguardData) {
|
||||
|
||||
@ -12,7 +12,7 @@ export default function Component({ service }) {
|
||||
|
||||
|
||||
if (librariesError) {
|
||||
return <Container error={librariesError} />;
|
||||
return <Container service={service} error={librariesError} />;
|
||||
}
|
||||
|
||||
if (!librariesData) {
|
||||
|
||||
@ -15,7 +15,7 @@ export default function Component({ service }) {
|
||||
|
||||
if (usersError || loginsError || failedLoginsError) {
|
||||
const finalError = usersError ?? loginsError ?? failedLoginsError;
|
||||
return <Container error={finalError} />;
|
||||
return <Container service={service} error={finalError} />;
|
||||
}
|
||||
|
||||
if (!usersData || !loginsData || !failedLoginsData) {
|
||||
|
||||
@ -15,7 +15,7 @@ export default function Component({ service }) {
|
||||
|
||||
if (statsError || filtersError || indexersError) {
|
||||
const finalError = statsError ?? filtersError ?? indexersError;
|
||||
return <Container error={finalError} />;
|
||||
return <Container service={service} error={finalError} />;
|
||||
}
|
||||
|
||||
if (!statsData || !filtersData || !indexersData) {
|
||||
|
||||
@ -14,7 +14,7 @@ export default function Component({ service }) {
|
||||
|
||||
if (moviesError || episodesError) {
|
||||
const finalError = moviesError ?? episodesError;
|
||||
return <Container error={finalError} />;
|
||||
return <Container service={service} error={finalError} />;
|
||||
}
|
||||
|
||||
if (!episodesData || !moviesData) {
|
||||
|
||||
@ -12,7 +12,7 @@ export default function Component({ service }) {
|
||||
const { data, error } = useWidgetAPI(widget, "info");
|
||||
|
||||
if (error) {
|
||||
return <Container error={error} />;
|
||||
return <Container service={service} error={error} />;
|
||||
}
|
||||
|
||||
if (!data) {
|
||||
|
||||
@ -11,7 +11,7 @@ export default function Component({ service }) {
|
||||
const { data: channelsData, error: channelsError } = useWidgetAPI(widget, "status");
|
||||
|
||||
if (channelsError) {
|
||||
return <Container error={channelsError} />;
|
||||
return <Container service={service} error={channelsError} />;
|
||||
}
|
||||
|
||||
if (!channelsData) {
|
||||
|
||||
@ -8,7 +8,7 @@ export default function Component({ service }) {
|
||||
const { data: statsData, error: statsError } = useWidgetAPI(widget, "cfd_tunnel");
|
||||
|
||||
if (statsError) {
|
||||
return <Container error={statsError} />;
|
||||
return <Container service={service} error={statsError} />;
|
||||
}
|
||||
|
||||
if (!statsData) {
|
||||
|
||||
@ -38,7 +38,7 @@ export default function Component({ service }) {
|
||||
}
|
||||
|
||||
if (statsError) {
|
||||
return <Container error={statsError} />;
|
||||
return <Container service={service} error={statsError} />;
|
||||
}
|
||||
|
||||
if (!statsData || !dateRange) {
|
||||
|
||||
@ -12,7 +12,7 @@ export default function Component({ service }) {
|
||||
const { data: torrentData, error: torrentError } = useWidgetAPI(widget);
|
||||
|
||||
if (torrentError) {
|
||||
return <Container error={torrentError} />;
|
||||
return <Container service={service} error={torrentError} />;
|
||||
}
|
||||
|
||||
if (!torrentData) {
|
||||
|
||||
@ -12,7 +12,7 @@ export default function Component({ service }) {
|
||||
const { data: utilizationData, error: utilizationError } = useWidgetAPI(widget, "utilization");
|
||||
|
||||
if (storageError || infoError || utilizationError) {
|
||||
return <Container error={ storageError ?? infoError ?? utilizationError } />;
|
||||
return <Container service={service} error={ storageError ?? infoError ?? utilizationError } />;
|
||||
}
|
||||
|
||||
if (!storageData || !infoData || !utilizationData) {
|
||||
|
||||
@ -19,7 +19,7 @@ export default function Component({ service }) {
|
||||
|
||||
if (statsError || statsData?.error || statusError || statusData?.error) {
|
||||
const finalError = statsError ?? statsData?.error ?? statusError ?? statusData?.error;
|
||||
return <Container error={finalError} />;
|
||||
return <Container service={service} error={finalError} />;
|
||||
}
|
||||
|
||||
if (statusData && !(statusData.status.includes("running") || statusData.status.includes("partial"))) {
|
||||
|
||||
@ -10,7 +10,7 @@ export default function Component({ service }) {
|
||||
const { data: listData, error: listError } = useWidgetAPI(widget, "list");
|
||||
|
||||
if (listError) {
|
||||
return <Container error={listError} />;
|
||||
return <Container service={service} error={listError} />;
|
||||
}
|
||||
|
||||
const tasks = listData?.data?.tasks;
|
||||
|
||||
@ -206,7 +206,7 @@ export default function Component({ service }) {
|
||||
}
|
||||
|
||||
if (sessionsError || countError) {
|
||||
return <Container error={sessionsError ?? countError} />;
|
||||
return <Container service={service} error={sessionsError ?? countError} />;
|
||||
}
|
||||
|
||||
const enableBlocks = service.widget?.enableBlocks
|
||||
|
||||
@ -12,7 +12,7 @@ export default function Component({ service }) {
|
||||
const { data: fileflowsData, error: fileflowsError } = useWidgetAPI(widget, "status");
|
||||
|
||||
if (fileflowsError) {
|
||||
return <Container error={fileflowsError} />;
|
||||
return <Container service={service} error={fileflowsError} />;
|
||||
}
|
||||
|
||||
if (!fileflowsData) {
|
||||
|
||||
@ -12,7 +12,7 @@ export default function Component({ service }) {
|
||||
const { data: torrentData, error: torrentError } = useWidgetAPI(widget, "torrents");
|
||||
|
||||
if (torrentError || !torrentData?.torrents) {
|
||||
return <Container error={torrentError ?? {message: "No torrent data returned"}} />;
|
||||
return <Container service={service} error={torrentError ?? {message: "No torrent data returned"}} />;
|
||||
}
|
||||
|
||||
if (!torrentData || !torrentData.torrents) {
|
||||
|
||||
@ -12,7 +12,7 @@ export default function Component({ service }) {
|
||||
const { data: freshrssData, error: freshrssError } = useWidgetAPI(widget, "info");
|
||||
|
||||
if (freshrssError) {
|
||||
return <Container error={freshrssError} />;
|
||||
return <Container service={service} error={freshrssError} />;
|
||||
}
|
||||
|
||||
if (!freshrssData) {
|
||||
|
||||
@ -18,7 +18,7 @@ export default function Component({ service }) {
|
||||
|
||||
if (ghostfolioErrorToday || ghostfolioErrorYear || ghostfolioErrorMax) {
|
||||
const finalError = ghostfolioErrorToday ?? ghostfolioErrorYear ?? ghostfolioErrorMax
|
||||
return <Container error={finalError} />;
|
||||
return <Container service={service} error={finalError} />;
|
||||
}
|
||||
|
||||
if (!performanceToday || !performanceYear || !performanceMax) {
|
||||
|
||||
@ -8,7 +8,7 @@ export default function Component({ service }) {
|
||||
const { data: gluetunData, error: gluetunError } = useWidgetAPI(widget, "ip");
|
||||
|
||||
if (gluetunError) {
|
||||
return <Container error={gluetunError} />;
|
||||
return <Container service={service} error={gluetunError} />;
|
||||
}
|
||||
|
||||
if (!gluetunData) {
|
||||
|
||||
@ -11,7 +11,7 @@ export default function Component({ service }) {
|
||||
|
||||
if (appsError || messagesError || clientsError) {
|
||||
const finalError = appsError ?? messagesError ?? clientsError;
|
||||
return <Container error={finalError} />;
|
||||
return <Container service={service} error={finalError} />;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -12,7 +12,7 @@ export default function Component({ service }) {
|
||||
const { data: alertsData, error: alertsError } = useWidgetAPI(widget, "alerts");
|
||||
|
||||
if (statsError || alertsError) {
|
||||
return <Container error={statsError ?? alertsError} />;
|
||||
return <Container service={service} error={statsError ?? alertsError} />;
|
||||
}
|
||||
|
||||
if (!statsData || !alertsData) {
|
||||
|
||||
@ -8,7 +8,7 @@ export default function Component({ service }) {
|
||||
const { data: channelsData, error: channelsError } = useWidgetAPI(widget, "lineup");
|
||||
|
||||
if (channelsError) {
|
||||
return <Container error={channelsError} />;
|
||||
return <Container service={service} error={channelsError} />;
|
||||
}
|
||||
|
||||
if (!channelsData) {
|
||||
|
||||
@ -30,7 +30,7 @@ export default function Component({ service }) {
|
||||
const { data, error } = useWidgetAPI(widget, "checks");
|
||||
|
||||
if (error) {
|
||||
return <Container error={error} />;
|
||||
return <Container service={service} error={error} />;
|
||||
}
|
||||
|
||||
if (!data) {
|
||||
|
||||
@ -7,7 +7,7 @@ export default function Component({ service }) {
|
||||
|
||||
const { data, error } = useWidgetAPI(widget, null, { refreshInterval: 60000 });
|
||||
if (error) {
|
||||
return <Container error={error} />;
|
||||
return <Container service={service} error={error} />;
|
||||
}
|
||||
|
||||
return <Container service={service}>
|
||||
|
||||
@ -12,7 +12,7 @@ export default function Component({ service }) {
|
||||
const { data: homebridgeData, error: homebridgeError } = useWidgetAPI(widget, "info");
|
||||
|
||||
if (homebridgeError) {
|
||||
return <Container error={homebridgeError} />;
|
||||
return <Container service={service} error={homebridgeError} />;
|
||||
}
|
||||
|
||||
if (!homebridgeData) {
|
||||
|
||||
@ -11,7 +11,7 @@ export default function Component({ service }) {
|
||||
const { data: immichData, error: immichError } = useWidgetAPI(widget);
|
||||
|
||||
if (immichError || immichData?.statusCode === 401) {
|
||||
return <Container error={immichError ?? immichData} />;
|
||||
return <Container service={service} error={immichError ?? immichData} />;
|
||||
}
|
||||
|
||||
if (!immichData) {
|
||||
|
||||
@ -12,7 +12,7 @@ export default function Component({ service }) {
|
||||
const { data: indexersData, error: indexersError } = useWidgetAPI(widget, "indexers");
|
||||
|
||||
if (indexersError) {
|
||||
return <Container error={indexersError} />;
|
||||
return <Container service={service} error={indexersError} />;
|
||||
}
|
||||
|
||||
if (!indexersData) {
|
||||
|
||||
@ -8,7 +8,7 @@ export default function Component({ service }) {
|
||||
const { data: statsData, error: statsError } = useWidgetAPI(widget, "request/count");
|
||||
|
||||
if (statsError) {
|
||||
return <Container error={statsError} />;
|
||||
return <Container service={service} error={statsError} />;
|
||||
}
|
||||
|
||||
if (!statsData) {
|
||||
|
||||
@ -14,7 +14,7 @@ export default function Component({ service }) {
|
||||
|
||||
if (libraryError || seriesError || bookError) {
|
||||
const finalError = libraryError ?? seriesError ?? bookError;
|
||||
return <Container error={finalError} />;
|
||||
return <Container service={service} error={finalError} />;
|
||||
}
|
||||
|
||||
if (!libraryData || !seriesData || !bookData) {
|
||||
|
||||
@ -38,7 +38,7 @@ export default function Component({ service }) {
|
||||
const { data: statusData, error: statusError } = useWidgetAPI(widget, "status");
|
||||
|
||||
if (statusError) {
|
||||
return <Container error={statusError} />;
|
||||
return <Container service={service} error={statusError} />;
|
||||
}
|
||||
|
||||
const source = statusData?.sources[0];
|
||||
|
||||
@ -16,7 +16,7 @@ export default function Component({ service }) {
|
||||
`/api/kubernetes/stats/${widget.namespace}/${widget.app}?${podSelectorString}`);
|
||||
|
||||
if (statsError || statusError) {
|
||||
return <Container error={t("widget.api_error")} />;
|
||||
return <Container service={service} error={t("widget.api_error")} />;
|
||||
}
|
||||
|
||||
if (statusData && statusData.status !== "running") {
|
||||
|
||||
@ -15,7 +15,7 @@ export default function Component({ service }) {
|
||||
|
||||
if (albumsError || wantedError || queueError) {
|
||||
const finalError = albumsError ?? wantedError ?? queueError;
|
||||
return <Container error={finalError} />;
|
||||
return <Container service={service} error={finalError} />;
|
||||
}
|
||||
|
||||
if (!albumsData || !wantedData || !queueData) {
|
||||
|
||||
@ -12,7 +12,7 @@ export default function Component({ service }) {
|
||||
const { data: statsData, error: statsError } = useWidgetAPI(widget, "instance");
|
||||
|
||||
if (statsError) {
|
||||
return <Container error={statsError} />;
|
||||
return <Container service={service} error={statsError} />;
|
||||
}
|
||||
|
||||
if (!statsData) {
|
||||
|
||||
@ -13,7 +13,7 @@ export default function Component({ service }) {
|
||||
|
||||
if (statsError || futureError) {
|
||||
const finalError = statsError ?? futureError;
|
||||
return <Container error={finalError} />;
|
||||
return <Container service={service} error={finalError} />;
|
||||
}
|
||||
|
||||
if (!statsData || !futureData) {
|
||||
|
||||
@ -14,7 +14,7 @@ export default function Component({ service }) {
|
||||
|
||||
if (statsError || leasesError) {
|
||||
const finalError = statsError ?? leasesError;
|
||||
return <Container error={ finalError } />;
|
||||
return <Container service={service} error={ finalError } />;
|
||||
}
|
||||
|
||||
if (!statsData || !leasesData) {
|
||||
|
||||
@ -10,7 +10,7 @@ export default function Component({ service }) {
|
||||
const { t } = useTranslation();
|
||||
|
||||
if(serverError){
|
||||
return <Container error={serverError} />;
|
||||
return <Container service={service} error={serverError} />;
|
||||
}
|
||||
if (!serverData) {
|
||||
return (
|
||||
|
||||
@ -12,7 +12,7 @@ export default function Component({ service }) {
|
||||
const { data: minifluxData, error: minifluxError } = useWidgetAPI(widget, "counters");
|
||||
|
||||
if (minifluxError) {
|
||||
return <Container error={minifluxError} />;
|
||||
return <Container service={service} error={minifluxError} />;
|
||||
}
|
||||
|
||||
if (!minifluxData) {
|
||||
|
||||
@ -15,7 +15,7 @@ export default function Component({ service }) {
|
||||
|
||||
if (printStatsError || displayStatsError || webHooksError) {
|
||||
const finalError = printStatsError ?? displayStatsError ?? webHooksError;
|
||||
return <Container error={finalError} />;
|
||||
return <Container service={service} error={finalError} />;
|
||||
}
|
||||
|
||||
if (!printStats || !displayStatus || !webHooks) {
|
||||
|
||||
@ -15,7 +15,7 @@ export default function Component({ service }) {
|
||||
|
||||
if (seriesError || issuesError || wantedError) {
|
||||
const finalError = seriesError ?? issuesError ?? wantedError;
|
||||
return <Container error={finalError} />;
|
||||
return <Container service={service} error={finalError} />;
|
||||
}
|
||||
|
||||
if (!seriesData || !issuesData || !wantedData) {
|
||||
|
||||
@ -27,7 +27,7 @@ export default function Component({ service }) {
|
||||
const { data: navidromeData, error: navidromeError } = useWidgetAPI(widget, "getNowPlaying");
|
||||
|
||||
if (navidromeError || navidromeData?.["subsonic-response"]?.error) {
|
||||
return <Container error={navidromeError ?? navidromeData?.["subsonic-response"]?.error} />;
|
||||
return <Container service={service} error={navidromeError ?? navidromeData?.["subsonic-response"]?.error} />;
|
||||
}
|
||||
|
||||
if (!navidromeData) {
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
import { useTranslation } from "next-i18next";
|
||||
import { useMemo } from "react";
|
||||
|
||||
import Container from "components/services/widget/container";
|
||||
import Block from "components/services/widget/block";
|
||||
@ -10,30 +11,53 @@ export default function Component({ service }) {
|
||||
const { widget } = service;
|
||||
const { data: nextcloudData, error: nextcloudError } = useWidgetAPI(widget, "serverinfo");
|
||||
|
||||
// Support for deprecated fields (cpuload, memoryusage)
|
||||
const [showCpuLoad, showMemoryUsage] = useMemo(() => {
|
||||
// Default values if fields is not set
|
||||
if (!widget.fields) return [false, false];
|
||||
|
||||
// Allows for backwards compatibility with existing values of fields
|
||||
if (widget.fields.length <= 4) return [true, true];
|
||||
|
||||
// If all fields are enabled, drop cpuload and memoryusage
|
||||
if (widget.fields.length === 6) return [false, false];
|
||||
|
||||
const hasCpuLoad = widget.fields?.includes('cpuload');
|
||||
const hasMemoryUsage = widget.fields?.includes('memoryusage');
|
||||
|
||||
// If (for some reason) 5 fields are set, drop memoryusage
|
||||
if (hasCpuLoad && hasMemoryUsage) return [true, false];
|
||||
return [!hasCpuLoad, !hasMemoryUsage]
|
||||
}, [widget.fields]);
|
||||
|
||||
if (nextcloudError) {
|
||||
return <Container error={nextcloudError} />;
|
||||
return <Container service={service} error={nextcloudError} />;
|
||||
}
|
||||
|
||||
if (!nextcloudData) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="nextcloud.cpuload" />
|
||||
<Block label="nextcloud.memoryusage" />
|
||||
{showCpuLoad && <Block label="nextcloud.cpuload" />}
|
||||
{showMemoryUsage && <Block label="nextcloud.memoryusage" />}
|
||||
<Block label="nextcloud.freespace" />
|
||||
<Block label="nextcloud.activeusers" />
|
||||
<Block label="nextcloud.numfiles" />
|
||||
<Block label="nextcloud.numshares" />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
const nextcloudInfo = nextcloudData.ocs.data.nextcloud;
|
||||
const { nextcloud: nextcloudInfo, activeUsers } = nextcloudData.ocs.data;
|
||||
const memoryUsage = 100 * ((parseFloat(nextcloudInfo.system.mem_total) - parseFloat(nextcloudInfo.system.mem_free)) / parseFloat(nextcloudInfo.system.mem_total));
|
||||
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="nextcloud.cpuload" value={t("common.percent", { value: nextcloudInfo.system.cpuload[0] })} />
|
||||
<Block label="nextcloud.memoryusage" value={t("common.percent", { value:memoryUsage })} />
|
||||
{showCpuLoad && <Block label="nextcloud.cpuload" value={t("common.percent", { value: nextcloudInfo.system.cpuload[0] })} />}
|
||||
{showMemoryUsage && <Block label="nextcloud.memoryusage" value={t("common.percent", { value:memoryUsage })} />}
|
||||
<Block label="nextcloud.freespace" value={t("common.bbytes", { value: nextcloudInfo.system.freespace, maximumFractionDigits: 1 })} />
|
||||
<Block label="nextcloud.activeusers" value={t("common.number", { value: nextcloudData.ocs.data.activeUsers.last5minutes })} />
|
||||
<Block label="nextcloud.activeusers" value={t("common.number", { value: activeUsers.last24hours })} />
|
||||
<Block label="nextcloud.numfiles" value={t("common.number", { value: nextcloudInfo.storage.num_files })} />
|
||||
<Block label="nextcloud.numshares" value={t("common.number", { value: nextcloudInfo.shares.num_shares })} />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
@ -12,7 +12,7 @@ export default function Component({ service }) {
|
||||
const { data: nextdnsData, error: nextdnsError } = useWidgetAPI(widget, "analytics/status");
|
||||
|
||||
if (nextdnsError) {
|
||||
return <Container error={nextdnsError} />;
|
||||
return <Container service={service} error={nextdnsError} />;
|
||||
}
|
||||
|
||||
if (!nextdnsData) {
|
||||
|
||||
@ -8,7 +8,7 @@ export default function Component({ service }) {
|
||||
const { data: infoData, error: infoError } = useWidgetAPI(widget, "nginx/proxy-hosts");
|
||||
|
||||
if (infoError) {
|
||||
return <Container error={infoError} />;
|
||||
return <Container service={service} error={infoError} />;
|
||||
}
|
||||
|
||||
if (!infoData) {
|
||||
|
||||
@ -12,7 +12,7 @@ export default function Component({ service }) {
|
||||
const { data: statusData, error: statusError } = useWidgetAPI(widget, "status");
|
||||
|
||||
if (statusError) {
|
||||
return <Container error={statusError} />;
|
||||
return <Container service={service} error={statusError} />;
|
||||
}
|
||||
|
||||
if (!statusData) {
|
||||
|
||||
@ -9,11 +9,11 @@ export default function Component({ service }) {
|
||||
const { data: jobStats, error: jobStatsError } = useWidgetAPI(widget, "job_stats");
|
||||
|
||||
if (printerStatsError) {
|
||||
return <Container error={printerStatsError} />;
|
||||
return <Container service={service} error={printerStatsError} />;
|
||||
}
|
||||
|
||||
if (jobStatsError) {
|
||||
return <Container error={jobStatsError} />;
|
||||
return <Container service={service} error={jobStatsError} />;
|
||||
}
|
||||
|
||||
const state = printerStats?.state?.text;
|
||||
|
||||
@ -14,7 +14,7 @@ export default function Component({ service }) {
|
||||
});
|
||||
|
||||
if (omadaAPIError) {
|
||||
return <Container error={omadaAPIError} />;
|
||||
return <Container service={service} error={omadaAPIError} />;
|
||||
}
|
||||
|
||||
if (!omadaData) {
|
||||
|
||||
@ -8,7 +8,7 @@ export default function Component({ service }) {
|
||||
const { data: statsData, error: statsError } = useWidgetAPI(widget, "Request/count");
|
||||
|
||||
if (statsError) {
|
||||
return <Container error={statsError} />;
|
||||
return <Container service={service} error={statsError} />;
|
||||
}
|
||||
|
||||
if (!statsData) {
|
||||
|
||||
@ -14,7 +14,7 @@ export default function Component({ service }) {
|
||||
|
||||
if (activityError || interfaceError) {
|
||||
const finalError = activityError ?? interfaceError;
|
||||
return <Container error={ finalError } />;
|
||||
return <Container service={service} error={ finalError } />;
|
||||
}
|
||||
|
||||
if (!activityData || !interfaceData) {
|
||||
|
||||
@ -11,7 +11,7 @@ export default function Component({ service }) {
|
||||
const { data: statsData, error: statsError } = useWidgetAPI(widget, "request/count");
|
||||
|
||||
if (statsError) {
|
||||
return <Container error={statsError} />;
|
||||
return <Container service={service} error={statsError} />;
|
||||
}
|
||||
|
||||
if (!statsData) {
|
||||
|
||||
@ -8,7 +8,7 @@ export default function Component({ service }) {
|
||||
const { data: statisticsData, error: statisticsError } = useWidgetAPI(widget, "statistics");
|
||||
|
||||
if (statisticsError) {
|
||||
return <Container error={statisticsError} />;
|
||||
return <Container service={service} error={statisticsError} />;
|
||||
}
|
||||
|
||||
if (!statisticsData) {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user