Merge branch 'main' into enhanced-glances

This commit is contained in:
Georges-Antoine Assi 2023-05-22 12:16:13 -04:00
commit 28180f0e81
No known key found for this signature in database
GPG Key ID: E01F01B06E816D51
131 changed files with 747 additions and 603 deletions

View File

@ -69,11 +69,18 @@ body:
attributes: attributes:
label: Browser Logs label: Browser Logs
description: Please review and provide any logs from the browser, if relevant 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 - type: textarea
id: other id: other
attributes: attributes:
label: Other 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 - type: checkboxes
id: pre-flight id: pre-flight
attributes: attributes:

View File

@ -513,7 +513,9 @@
"cpuload": "Cpu Load", "cpuload": "Cpu Load",
"memoryusage": "Memory Usage", "memoryusage": "Memory Usage",
"freespace": "Free Space", "freespace": "Free Space",
"activeusers": "Active Users" "activeusers": "Active Users",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Status",

View File

@ -513,7 +513,9 @@
"cpuload": "Cpu Load", "cpuload": "Cpu Load",
"memoryusage": "Memory Usage", "memoryusage": "Memory Usage",
"freespace": "Free Space", "freespace": "Free Space",
"activeusers": "Active Users" "activeusers": "Active Users",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Status",

View File

@ -513,7 +513,9 @@
"cpuload": "Cpu Load", "cpuload": "Cpu Load",
"memoryusage": "Memory Usage", "memoryusage": "Memory Usage",
"freespace": "Free Space", "freespace": "Free Space",
"activeusers": "Active Users" "activeusers": "Active Users",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Status",
@ -580,7 +582,7 @@
"passes": "Passes" "passes": "Passes"
}, },
"whatsupdocker": { "whatsupdocker": {
"monitoring": "Monitoring", "monitoring": "Supervisió",
"updates": "Updates" "updates": "Actualitzacions"
} }
} }

View File

@ -6,7 +6,7 @@
"downloads": "Fronta" "downloads": "Fronta"
}, },
"truenas": { "truenas": {
"load": "Vytížení systému", "load": "Zatížení systému",
"uptime": "Doba spuštění", "uptime": "Doba spuštění",
"alerts": "Upozornění", "alerts": "Upozornění",
"time": "{{value, number(style: unit; unitDisplay: long;)}}" "time": "{{value, number(style: unit; unitDisplay: long;)}}"
@ -30,19 +30,19 @@
"placeholder": "Hledat…" "placeholder": "Hledat…"
}, },
"resources": { "resources": {
"cpu": "CPU", "cpu": "PROC",
"total": "Celkem", "total": "Celkem",
"free": "Volné", "free": "Volné",
"used": "Využité", "used": "Využité",
"load": "Vytížení", "load": "Zatížení",
"mem": "RAM", "mem": "PAM",
"max": "Max", "max": "Max.",
"uptime": "UP", "uptime": "BĚŽÍ",
"months": "mo", "months": "měs.",
"days": "d", "days": "d",
"hours": "h", "hours": "h",
"minutes": "m", "minutes": "m",
"temp": "TEMP" "temp": "TEPLOTA"
}, },
"unifi": { "unifi": {
"users": "Uživatelé", "users": "Uživatelé",
@ -64,8 +64,8 @@
"docker": { "docker": {
"rx": "RX", "rx": "RX",
"tx": "TX", "tx": "TX",
"mem": "RAM", "mem": "PAM",
"cpu": "CPU", "cpu": "PROC",
"offline": "Offline", "offline": "Offline",
"error": "Chyba", "error": "Chyba",
"unknown": "Neznámý", "unknown": "Neznámý",
@ -85,7 +85,7 @@
"movies": "Filmy", "movies": "Filmy",
"series": "Seriály", "series": "Seriály",
"episodes": "Epizody", "episodes": "Epizody",
"songs": "Písničky" "songs": "Skladby"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "Celkem zjištěno", "totalObserved": "Celkem zjištěno",
@ -106,7 +106,7 @@
"streams": "Aktivní streamy", "streams": "Aktivní streamy",
"movies": "Filmy", "movies": "Filmy",
"tv": "Seriály", "tv": "Seriály",
"albums": "Albums" "albums": "Alba"
}, },
"sabnzbd": { "sabnzbd": {
"rate": "Rychlost", "rate": "Rychlost",
@ -188,9 +188,9 @@
"ping": "Ping" "ping": "Ping"
}, },
"portainer": { "portainer": {
"running": "Běží", "running": "Spuštěno",
"stopped": "Zastaveno", "stopped": "Zastaveno",
"total": "Celkově" "total": "Celkem"
}, },
"traefik": { "traefik": {
"routers": "Routery", "routers": "Routery",
@ -300,17 +300,17 @@
"failedLoginsLast24H": "Neúspěšná přihlášení (24h)" "failedLoginsLast24H": "Neúspěšná přihlášení (24h)"
}, },
"proxmox": { "proxmox": {
"mem": "RAM", "mem": "PAM",
"cpu": "CPU", "cpu": "PROC",
"lxc": "LXC", "lxc": "LXC",
"vms": "Virtuální Stroje" "vms": "Virtuální Stroje"
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "PROC",
"mem": "RAM", "mem": "PAM",
"wait": "Prosím počkejte", "wait": "Prosím počkejte",
"temp": "TEMP", "temp": "TEPLOTA",
"uptime": "UP", "uptime": "BĚŽÍ",
"days": "d", "days": "d",
"hours": "h" "hours": "h"
}, },
@ -334,9 +334,9 @@
"down": "Vypnutý" "down": "Vypnutý"
}, },
"watchtower": { "watchtower": {
"containers_scanned": "Naskenováno", "containers_scanned": "Prohledáno",
"containers_updated": "Aktualizováno", "containers_updated": "Aktualizováno",
"containers_failed": "Chyba" "containers_failed": "Selhalo"
}, },
"autobrr": { "autobrr": {
"approvedPushes": "Schváleno", "approvedPushes": "Schváleno",
@ -460,7 +460,7 @@
"proxmoxbackupserver": { "proxmoxbackupserver": {
"datastore_usage": "Datové úložiště", "datastore_usage": "Datové úložiště",
"failed_tasks_24h": "Neúspěšné úlohy 24h", "failed_tasks_24h": "Neúspěšné úlohy 24h",
"cpu_usage": "CPU", "cpu_usage": "PROC",
"memory_usage": "Paměť" "memory_usage": "Paměť"
}, },
"immich": { "immich": {
@ -504,16 +504,18 @@
"time": "Čas" "time": "Čas"
}, },
"grafana": { "grafana": {
"dashboards": "Přístrojové panely", "dashboards": "Nástěnky",
"datasources": "Zdroje dat", "datasources": "Zdroje dat",
"totalalerts": "Celkový počet upozornění", "totalalerts": "Celkový počet upozornění",
"alertstriggered": "Spuštěné výstrahy" "alertstriggered": "Spuštěné výstrahy"
}, },
"nextcloud": { "nextcloud": {
"cpuload": "CPU zatížení", "cpuload": "Zatížení procesoru",
"memoryusage": "Využití paměti", "memoryusage": "Využití paměti",
"freespace": "Volný prostor", "freespace": "Volný prostor",
"activeusers": "Aktivní uživatelé" "activeusers": "Aktivní uživatelé",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Stav", "status": "Stav",
@ -565,22 +567,22 @@
"booksDuration": "Trvání" "booksDuration": "Trvání"
}, },
"homeassistant": { "homeassistant": {
"people_home": "People Home", "people_home": "Lidí doma",
"lights_on": "Lights On", "lights_on": "Rozsvícená světla",
"switches_on": "Switches On" "switches_on": "Zapnuté přepínače"
}, },
"freshrss": { "freshrss": {
"subscriptions": "Subscriptions", "subscriptions": "Odběry",
"unread": "Unread" "unread": "Nepřečteno"
}, },
"channelsdvrserver": { "channelsdvrserver": {
"shows": "Shows", "shows": "Shows",
"recordings": "Recordings", "recordings": "Nahrávky",
"scheduled": "Scheduled", "scheduled": "Naplánováno",
"passes": "Passes" "passes": "Průchody"
}, },
"whatsupdocker": { "whatsupdocker": {
"monitoring": "Monitoring", "monitoring": "Sledování",
"updates": "Updates" "updates": "Aktualizace"
} }
} }

View File

@ -513,7 +513,9 @@
"memoryusage": "Memory Usage", "memoryusage": "Memory Usage",
"cpuload": "Cpu Load", "cpuload": "Cpu Load",
"freespace": "Free Space", "freespace": "Free Space",
"activeusers": "Active Users" "activeusers": "Active Users",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Status",

View File

@ -513,7 +513,9 @@
"cpuload": "CPU Last", "cpuload": "CPU Last",
"memoryusage": "RAM Verbrauch", "memoryusage": "RAM Verbrauch",
"freespace": "Freier Speicher", "freespace": "Freier Speicher",
"activeusers": "Aktive Nutzer" "activeusers": "Aktive Nutzer",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Status",

View File

@ -530,7 +530,9 @@
"cpuload": "Cpu Load", "cpuload": "Cpu Load",
"memoryusage": "Memory Usage", "memoryusage": "Memory Usage",
"freespace": "Free Space", "freespace": "Free Space",
"activeusers": "Active Users" "activeusers": "Active Users",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Status",

View File

@ -553,7 +553,9 @@
"cpuload": "Cpu Load", "cpuload": "Cpu Load",
"memoryusage": "Memory Usage", "memoryusage": "Memory Usage",
"freespace": "Free Space", "freespace": "Free Space",
"activeusers": "Active Users" "activeusers": "Active Users",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Status",

View File

@ -513,7 +513,9 @@
"activeusers": "Active Users", "activeusers": "Active Users",
"cpuload": "Cpu Load", "cpuload": "Cpu Load",
"memoryusage": "Memory Usage", "memoryusage": "Memory Usage",
"freespace": "Free Space" "freespace": "Free Space",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Status",

View File

@ -513,7 +513,9 @@
"cpuload": "Carga de la CPU", "cpuload": "Carga de la CPU",
"memoryusage": "Uso de la memoria", "memoryusage": "Uso de la memoria",
"freespace": "Espacio libre", "freespace": "Espacio libre",
"activeusers": "Usuarios activos" "activeusers": "Usuarios activos",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Estado", "status": "Estado",
@ -580,7 +582,7 @@
"passes": "Pases" "passes": "Pases"
}, },
"whatsupdocker": { "whatsupdocker": {
"monitoring": "Monitoring", "monitoring": "Supervisión",
"updates": "Updates" "updates": "Actualizaciones"
} }
} }

View File

@ -513,7 +513,9 @@
"cpuload": "Cpu Load", "cpuload": "Cpu Load",
"memoryusage": "Memory Usage", "memoryusage": "Memory Usage",
"freespace": "Free Space", "freespace": "Free Space",
"activeusers": "Active Users" "activeusers": "Active Users",
"numshares": "Shared Items",
"numfiles": "Files"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Status",

View File

@ -513,7 +513,9 @@
"freespace": "Espace Libre", "freespace": "Espace Libre",
"activeusers": "Utilisateurs Actifs", "activeusers": "Utilisateurs Actifs",
"cpuload": "Charge Cpu", "cpuload": "Charge Cpu",
"memoryusage": "Utilisation Mémoire" "memoryusage": "Utilisation Mémoire",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Statut", "status": "Statut",
@ -580,7 +582,7 @@
"passes": "Passes" "passes": "Passes"
}, },
"whatsupdocker": { "whatsupdocker": {
"monitoring": "Monitoring", "monitoring": "Conteneurs",
"updates": "Updates" "updates": "Mises à jour"
} }
} }

View File

@ -513,7 +513,9 @@
"cpuload": "Cpu Load", "cpuload": "Cpu Load",
"memoryusage": "Memory Usage", "memoryusage": "Memory Usage",
"freespace": "Free Space", "freespace": "Free Space",
"activeusers": "Active Users" "activeusers": "Active Users",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Status",

View File

@ -513,7 +513,9 @@
"cpuload": "Cpu Load", "cpuload": "Cpu Load",
"memoryusage": "Memory Usage", "memoryusage": "Memory Usage",
"freespace": "Free Space", "freespace": "Free Space",
"activeusers": "Active Users" "activeusers": "Active Users",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Status",

View File

@ -229,7 +229,7 @@
"streams": "Aktivni prijenosi", "streams": "Aktivni prijenosi",
"movies": "Filmovi", "movies": "Filmovi",
"tv": "TV emisije", "tv": "TV emisije",
"albums": "Albums" "albums": "Albumi"
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
@ -513,7 +513,9 @@
"cpuload": "Cpu opterećenje", "cpuload": "Cpu opterećenje",
"memoryusage": "Korištenje memorije", "memoryusage": "Korištenje memorije",
"freespace": "Slobodna memorija", "freespace": "Slobodna memorija",
"activeusers": "Aktivni korisnici" "activeusers": "Aktivni korisnici",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Stanje", "status": "Stanje",
@ -581,6 +583,6 @@
}, },
"whatsupdocker": { "whatsupdocker": {
"monitoring": "Monitoring", "monitoring": "Monitoring",
"updates": "Updates" "updates": "Aktualiziranja"
} }
} }

View File

@ -513,7 +513,9 @@
"cpuload": "Cpu Load", "cpuload": "Cpu Load",
"memoryusage": "Memory Usage", "memoryusage": "Memory Usage",
"freespace": "Free Space", "freespace": "Free Space",
"activeusers": "Active Users" "activeusers": "Active Users",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Status",

View File

@ -513,7 +513,9 @@
"memoryusage": "Memory Usage", "memoryusage": "Memory Usage",
"cpuload": "Cpu Load", "cpuload": "Cpu Load",
"freespace": "Free Space", "freespace": "Free Space",
"activeusers": "Active Users" "activeusers": "Active Users",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Status",

View File

@ -513,7 +513,9 @@
"cpuload": "Cpu Load", "cpuload": "Cpu Load",
"memoryusage": "Memory Usage", "memoryusage": "Memory Usage",
"freespace": "Free Space", "freespace": "Free Space",
"activeusers": "Active Users" "activeusers": "Active Users",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Status",

View File

@ -534,7 +534,9 @@
"cpuload": "Cpu Load", "cpuload": "Cpu Load",
"memoryusage": "Memory Usage", "memoryusage": "Memory Usage",
"freespace": "Free Space", "freespace": "Free Space",
"activeusers": "Active Users" "activeusers": "Active Users",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Status",

View File

@ -513,7 +513,9 @@
"cpuload": "Cpu Load", "cpuload": "Cpu Load",
"memoryusage": "Memory Usage", "memoryusage": "Memory Usage",
"freespace": "Free Space", "freespace": "Free Space",
"activeusers": "Active Users" "activeusers": "Active Users",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Status",

View File

@ -513,7 +513,9 @@
"cpuload": "Cpu Load", "cpuload": "Cpu Load",
"memoryusage": "Memory Usage", "memoryusage": "Memory Usage",
"freespace": "Free Space", "freespace": "Free Space",
"activeusers": "Active Users" "activeusers": "Active Users",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Status",

View File

@ -513,7 +513,9 @@
"cpuload": "Cpu Load", "cpuload": "Cpu Load",
"memoryusage": "Memory Usage", "memoryusage": "Memory Usage",
"freespace": "Free Space", "freespace": "Free Space",
"activeusers": "Active Users" "activeusers": "Active Users",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Status",

View File

@ -513,7 +513,9 @@
"cpuload": "Cpu Belasting", "cpuload": "Cpu Belasting",
"memoryusage": "Geheugen Gebruik", "memoryusage": "Geheugen Gebruik",
"freespace": "Vrije Ruimte", "freespace": "Vrije Ruimte",
"activeusers": "Actieve Gebruikers" "activeusers": "Actieve Gebruikers",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Status",

View File

@ -513,7 +513,9 @@
"cpuload": "Cpu Load", "cpuload": "Cpu Load",
"memoryusage": "Memory Usage", "memoryusage": "Memory Usage",
"freespace": "Free Space", "freespace": "Free Space",
"activeusers": "Active Users" "activeusers": "Active Users",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Status",

View File

@ -513,7 +513,9 @@
"cpuload": "Carga de CPU", "cpuload": "Carga de CPU",
"memoryusage": "Memória Utilizada", "memoryusage": "Memória Utilizada",
"freespace": "Espaço Livre", "freespace": "Espaço Livre",
"activeusers": "Usuários Ativos" "activeusers": "Usuários Ativos",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Status",

View File

@ -522,7 +522,9 @@
"cpuload": "Carga de CPU", "cpuload": "Carga de CPU",
"memoryusage": "Memória Utilizada", "memoryusage": "Memória Utilizada",
"freespace": "Espaço Livre", "freespace": "Espaço Livre",
"activeusers": "Utilizadores Ativos" "activeusers": "Utilizadores Ativos",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Estado", "status": "Estado",

View File

@ -513,7 +513,9 @@
"activeusers": "Active Users", "activeusers": "Active Users",
"cpuload": "Cpu Load", "cpuload": "Cpu Load",
"memoryusage": "Memory Usage", "memoryusage": "Memory Usage",
"freespace": "Free Space" "freespace": "Free Space",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Status",

View File

@ -5,7 +5,7 @@
"status": "Статус", "status": "Статус",
"information": "Информация", "information": "Информация",
"url": "URL", "url": "URL",
"raw_error": "Raw Error", "raw_error": "Необработанная ошибка",
"response_data": "Данные ответа" "response_data": "Данные ответа"
}, },
"search": { "search": {
@ -17,14 +17,14 @@
"used": "Использовано", "used": "Использовано",
"load": "Загрузка", "load": "Загрузка",
"cpu": "Процессор", "cpu": "Процессор",
"mem": "MEM", "mem": "Память",
"temp": "TEMP", "temp": "Температура",
"max": "Max", "max": "Макс.",
"uptime": "UP", "uptime": "UP",
"months": "mo", "months": "мес",
"days": "d", "days": "д",
"hours": "h", "hours": "ч",
"minutes": "m" "minutes": "м"
}, },
"docker": { "docker": {
"rx": "Rx", "rx": "Rx",
@ -34,34 +34,34 @@
"offline": "Не в сети", "offline": "Не в сети",
"error": "Ошибка", "error": "Ошибка",
"unknown": "Неизвестный", "unknown": "Неизвестный",
"running": "Running", "running": "Запущенно",
"starting": "Starting", "starting": "Запускается",
"unhealthy": "Unhealthy", "unhealthy": "Не живой",
"not_found": "Not Found", "not_found": "Не найден",
"exited": "Exited", "exited": "Существует",
"partial": "Partial", "partial": "Частично",
"healthy": "Healthy" "healthy": "Живой"
}, },
"emby": { "emby": {
"playing": "Воспроизведение", "playing": "Воспроизведение",
"transcoding": "Транскодирование", "transcoding": "Транскодирование",
"bitrate": "Битрейт", "bitrate": "Битрейт",
"no_active": "Нет активных потоков", "no_active": "Нет активных потоков",
"movies": "Movies", "movies": "Фильмы",
"series": "Series", "series": "Сериалы",
"episodes": "Episodes", "episodes": "Эпизоды",
"songs": "Songs" "songs": "Песни"
}, },
"tautulli": { "tautulli": {
"playing": "Воспроизведение", "playing": "Воспроизведение",
"transcoding": "Транскодирование", "transcoding": "Транскодирование",
"bitrate": "Битрейт", "bitrate": "Битрейт",
"no_active": "No Active Streams" "no_active": "Нет активных трансляций"
}, },
"rutorrent": { "rutorrent": {
"active": "Активный", "active": "Активный",
"upload": "Загрузить", "upload": "Загрузка",
"download": "Скачать" "download": "Загрузка"
}, },
"sonarr": { "sonarr": {
"wanted": "Хотел", "wanted": "Хотел",
@ -72,12 +72,12 @@
"wanted": "Хотел", "wanted": "Хотел",
"queued": "В очереди", "queued": "В очереди",
"movies": "Фильмы", "movies": "Фильмы",
"missing": "Missing" "missing": "Пропущено"
}, },
"readarr": { "readarr": {
"wanted": "Wanted", "wanted": "Хотел",
"queued": "Queued", "queued": "В очереди",
"books": "Books" "books": "Книги"
}, },
"ombi": { "ombi": {
"pending": "Ожидание", "pending": "Ожидание",
@ -95,12 +95,12 @@
"gravity": "Сила тяжести" "gravity": "Сила тяжести"
}, },
"speedtest": { "speedtest": {
"upload": "Загрузка", "upload": "Отдача",
"download": "Скачать", "download": "Загрузка",
"ping": "пинг" "ping": "Пинг"
}, },
"portainer": { "portainer": {
"running": "Запущено", "running": "Запущенно",
"stopped": "Остановлено", "stopped": "Остановлено",
"total": "Всего" "total": "Всего"
}, },
@ -121,92 +121,92 @@
"updating": "Обновление" "updating": "Обновление"
}, },
"overseerr": { "overseerr": {
"pending": "Pending", "pending": "Ожидание",
"approved": "Approved", "approved": "Одобрено",
"available": "Available", "available": "Доступно",
"processing": "Processing" "processing": "Обработка"
}, },
"sabnzbd": { "sabnzbd": {
"rate": "Rate", "rate": "Оценка",
"queue": "Queue", "queue": "Очередь",
"timeleft": "Time Left" "timeleft": "Осталось времени"
}, },
"nzbget": { "nzbget": {
"rate": "Rate", "rate": "Оценка",
"remaining": "Remaining", "remaining": "Осталось",
"downloaded": "Downloaded" "downloaded": "Загружено"
}, },
"coinmarketcap": { "coinmarketcap": {
"configure": "Configure one or more crypto currencies to track", "configure": "Настройте одну или несколько криптовалют для отслеживания",
"1hour": "1 Hour", "1hour": "1 Час",
"1day": "1 Day", "1day": "1 День",
"7days": "7 Days", "7days": "7 Дней",
"30days": "30 Дней" "30days": "30 Дней"
}, },
"gotify": { "gotify": {
"apps": "Applications", "apps": "Приложения",
"clients": "Clients", "clients": "Клиенты",
"messages": "Messages" "messages": "Сообщения"
}, },
"prowlarr": { "prowlarr": {
"enableIndexers": "Indexers", "enableIndexers": "Индексаторы",
"numberOfGrabs": "Grabs", "numberOfGrabs": "Захваты",
"numberOfQueries": "Queries", "numberOfQueries": "Запросы",
"numberOfFailGrabs": "Fail Grabs", "numberOfFailGrabs": "Неудачные захваты",
"numberOfFailQueries": "Fail Queries" "numberOfFailQueries": "Неудачные запросы"
}, },
"transmission": { "transmission": {
"download": "Download", "download": "Загрузка",
"upload": "Upload", "upload": "Отдача",
"leech": "Leech", "leech": "Пиры",
"seed": "Seed" "seed": "Сиды"
}, },
"jackett": { "jackett": {
"configured": "Configured", "configured": "Настроено",
"errored": "Errored" "errored": "Ошибочно"
}, },
"bazarr": { "bazarr": {
"missingEpisodes": "Missing Episodes", "missingEpisodes": "Отсутствующие эпизоды",
"missingMovies": "Missing Movies" "missingMovies": "Отсутствующие фильмы"
}, },
"lidarr": { "lidarr": {
"wanted": "Wanted", "wanted": "Хотел",
"queued": "Queued", "queued": "В очереди",
"albums": "Albums" "albums": "Альбомы"
}, },
"adguard": { "adguard": {
"queries": "Queries", "queries": "Запросы",
"blocked": "Blocked", "blocked": "Заблокировано",
"filtered": "Filtered", "filtered": "Отсортировано",
"latency": "Latency" "latency": "Задержка"
}, },
"qbittorrent": { "qbittorrent": {
"download": "Download", "download": "Загрузка",
"upload": "Upload", "upload": "Отдача",
"leech": "Leech", "leech": "Пиры",
"seed": "Seed" "seed": "Сиды"
}, },
"mastodon": { "mastodon": {
"user_count": "Users", "user_count": "Пользователи",
"status_count": "Posts", "status_count": "Посты",
"domain_count": "Domains" "domain_count": "Домены"
}, },
"strelaysrv": { "strelaysrv": {
"numConnections": "Connections", "numConnections": "Соединения",
"dataRelayed": "Relayed", "dataRelayed": "Ретранслировано",
"transferRate": "Rate", "transferRate": "Оценка",
"numActiveSessions": "Sessions" "numActiveSessions": "Сессий"
}, },
"authentik": { "authentik": {
"users": "Users", "users": "Пользователи",
"loginsLast24H": "Logins (24h)", "loginsLast24H": "Входы (24ч)",
"failedLoginsLast24H": "Failed Logins (24h)" "failedLoginsLast24H": "Неудачные входы (24ч)"
}, },
"proxmox": { "proxmox": {
"mem": "MEM", "mem": "Память",
"cpu": "CPU", "cpu": "Процессор",
"lxc": "LXC", "lxc": "LXC",
"vms": "VMs" "vms": "Виртуальные машины"
}, },
"unifi": { "unifi": {
"users": "Пользователи", "users": "Пользователи",
@ -215,152 +215,152 @@
"wan": "WAN", "wan": "WAN",
"lan_users": "Пользователи LAN", "lan_users": "Пользователи LAN",
"wlan_users": "Пользователи WLAN", "wlan_users": "Пользователи WLAN",
"up": "UP", "up": "Работает",
"down": "DOWN", "down": "Не работает",
"wait": "Подождите", "wait": "Пожалуйста, подождите",
"lan": "LAN", "lan": "LAN",
"wlan": "WLAN", "wlan": "WLAN",
"devices": "Устройства", "devices": "Устройства",
"lan_devices": "Устройства подключённые по LAN", "lan_devices": "Устройства подключённые по LAN",
"wlan_devices": "WLAN Devices", "wlan_devices": "Подключения WLAN",
"empty_data": "Subsystem status unknown" "empty_data": "Статус системы неизвестен"
}, },
"plex": { "plex": {
"streams": "Active Streams", "streams": "Активные трансляции",
"movies": "Movies", "movies": "Фильмы",
"tv": "TV Shows", "tv": "Передачи",
"albums": "Albums" "albums": "Альбомы"
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "Процессор",
"mem": "MEM", "mem": "Память",
"wait": "Please wait", "wait": "Пожалуйста, подождите",
"temp": "TEMP", "temp": "Температура",
"uptime": "UP", "uptime": "Работает",
"days": "d", "days": "д",
"hours": "h" "hours": "ч"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "Всего наблюдаемых", "totalObserved": "Всего наблюдаемых",
"diffsDetected": "Обнаружены различия" "diffsDetected": "Обнаружены различия"
}, },
"wmo": { "wmo": {
"0-day": "Sunny", "0-day": "Солнечно",
"0-night": "Clear", "0-night": "Ясно",
"71-night": "Light Snow", "71-night": "Лёгкий снег",
"73-day": "Snow", "73-day": "Снег",
"73-night": "Snow", "73-night": "Снег",
"75-day": "Heavy Snow", "75-day": "Сильный снегопад",
"75-night": "Heavy Snow", "75-night": "Сильный снегопад",
"77-day": "Snow Grains", "77-day": "Снежные зёрна",
"77-night": "Snow Grains", "77-night": "Снежные зёрна",
"80-day": "Light Showers", "80-day": "Слабый дождь",
"80-night": "Light Showers", "80-night": "Слабый дождь",
"81-day": "Showers", "81-day": "Ливень",
"1-day": "Mainly Sunny", "1-day": "Преимущественно солнечно",
"1-night": "Mainly Clear", "1-night": "Преимущественно ясно",
"2-day": "Partly Cloudy", "2-day": "Переменная облачность",
"2-night": "Partly Cloudy", "2-night": "Переменная облачность",
"3-day": "Cloudy", "3-day": "Облачно",
"3-night": "Cloudy", "3-night": "Облачно",
"45-day": "Foggy", "45-day": "Туманно",
"45-night": "Foggy", "45-night": "Туманно",
"48-day": "Foggy", "48-day": "Туманно",
"48-night": "Foggy", "48-night": "Туманно",
"51-day": "Light Drizzle", "51-day": "Слегка моросит",
"51-night": "Light Drizzle", "51-night": "Слегка моросит",
"53-day": "Drizzle", "53-day": "Моросит",
"53-night": "Drizzle", "53-night": "Моросит",
"55-day": "Heavy Drizzle", "55-day": "Сильно моросит",
"55-night": "Heavy Drizzle", "55-night": "Сильно моросит",
"56-day": "Light Freezing Drizzle", "56-day": "Лёгкая изморозь",
"56-night": "Light Freezing Drizzle", "56-night": "Лёгкая изморозь",
"57-day": "Freezing Drizzle", "57-day": "Изморозь",
"57-night": "Freezing Drizzle", "57-night": "Изморозь",
"61-day": "Light Rain", "61-day": "Лёгкий дождь",
"61-night": "Light Rain", "61-night": "Лёгкий дождь",
"63-day": "Rain", "63-day": "Дождь",
"63-night": "Rain", "63-night": "Дождь",
"65-day": "Heavy Rain", "65-day": "Сильный дождь",
"65-night": "Heavy Rain", "65-night": "Сильный дождь",
"66-day": "Freezing Rain", "66-day": "Ледяной дождь",
"66-night": "Freezing Rain", "66-night": "Ледяной дождь",
"67-day": "Freezing Rain", "67-day": "Ледяной дождь",
"67-night": "Freezing Rain", "67-night": "Ледяной дождь",
"71-day": "Light Snow", "71-day": "Лёгкий снег",
"81-night": "Showers", "81-night": "Ливень",
"82-day": "Heavy Showers", "82-day": "Сильный ливень",
"82-night": "Heavy Showers", "82-night": "Сильный ливень",
"85-day": "Snow Showers", "85-day": "Снегопад",
"85-night": "Snow Showers", "85-night": "Снегопад",
"86-day": "Snow Showers", "86-day": "Снегопад",
"86-night": "Snow Showers", "86-night": "Снегопад",
"95-day": "Thunderstorm", "95-day": "Гроза",
"95-night": "Thunderstorm", "95-night": "Гроза",
"96-day": "Thunderstorm With Hail", "96-day": "Гроза с градом",
"96-night": "Thunderstorm With Hail", "96-night": "Гроза с градом",
"99-day": "Thunderstorm With Hail", "99-day": "Гроза с градом",
"99-night": "Thunderstorm With Hail" "99-night": "Гроза с градом"
}, },
"quicklaunch": { "quicklaunch": {
"bookmark": "Bookmark", "bookmark": "Закладка",
"service": "Service", "service": "Сервис",
"search": "Search", "search": "Поиск",
"custom": "Custom", "custom": "Пользовательский",
"visit": "Visit", "visit": "Посетить",
"url": "URL" "url": "URL"
}, },
"homebridge": { "homebridge": {
"available_update": "System", "available_update": "Система",
"updates": "Updates", "updates": "Обновления",
"update_available": "Update Available", "update_available": "Доступные обновления",
"up_to_date": "Up to Date", "up_to_date": "Обновлено",
"child_bridges_status": "{{ok}}/{{total}}", "child_bridges_status": "{{ok}}/{{total}}",
"child_bridges": "Child Bridges", "child_bridges": "Дочерние мосты",
"up": "Up", "up": "Включено",
"pending": "Pending", "pending": "В ожидании",
"down": "Down" "down": "Выключено"
}, },
"autobrr": { "autobrr": {
"approvedPushes": "Approved", "approvedPushes": "Одобрено",
"rejectedPushes": "Rejected", "rejectedPushes": "Отклонено",
"filters": "Filters", "filters": "Фильтры",
"indexers": "Indexers" "indexers": "Индексаторы"
}, },
"watchtower": { "watchtower": {
"containers_scanned": "Scanned", "containers_scanned": "Отсканировано",
"containers_updated": "Updated", "containers_updated": "Обновлено",
"containers_failed": "Failed" "containers_failed": "Неудачно"
}, },
"tubearchivist": { "tubearchivist": {
"downloads": "Queue", "downloads": "Очередь",
"videos": "Videos", "videos": "Видео",
"channels": "Channels", "channels": "Каналы",
"playlists": "Playlists" "playlists": "Плейлисты"
}, },
"truenas": { "truenas": {
"load": "System Load", "load": "Загрузка системы",
"uptime": "Uptime", "uptime": "Время работы",
"alerts": "Alerts", "alerts": "Уведомления",
"time": "{{value, number(style: unit; unitDisplay: long;)}}" "time": "{{value, number(style: unit; unitDisplay: long;)}}"
}, },
"navidrome": { "navidrome": {
"nothing_streaming": "No Active Streams", "nothing_streaming": "Нет активных трансляций",
"please_wait": "Please Wait" "please_wait": "Пожалуйста, подождите"
}, },
"pyload": { "pyload": {
"speed": "Speed", "speed": "Скорость",
"active": "Active", "active": "Активный",
"queue": "Queue", "queue": "Очередь",
"total": "Total" "total": "Всего"
}, },
"gluetun": { "gluetun": {
"public_ip": "Public IP", "public_ip": "Публичный IP",
"region": "Region", "region": "Регион",
"country": "Country" "country": "Страна"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Channels", "channels": "Каналы",
"hd": "HD" "hd": "HD"
}, },
"ping": { "ping": {
@ -368,219 +368,221 @@
"ping": "Пинг" "ping": "Пинг"
}, },
"scrutiny": { "scrutiny": {
"failed": "Failed", "failed": "Неудачно",
"unknown": "Unknown", "unknown": "Неизвестный",
"passed": "Passed" "passed": "Пройдено"
}, },
"paperlessngx": { "paperlessngx": {
"inbox": "Inbox", "inbox": "Входящие",
"total": "Total" "total": "Всего"
}, },
"deluge": { "deluge": {
"download": "Download", "download": "Загрузка",
"upload": "Upload", "upload": "Отдача",
"leech": "Leech", "leech": "Пиры",
"seed": "Seed" "seed": "Сиды"
}, },
"flood": { "flood": {
"upload": "Upload", "upload": "Отдача",
"download": "Download", "download": "Загрузка",
"leech": "Leech", "leech": "Пиры",
"seed": "Seed" "seed": "Сиды"
}, },
"tdarr": { "tdarr": {
"queue": "Queue", "queue": "Очередь",
"processed": "Processed", "processed": "Обработано",
"errored": "Errored", "errored": "Ошибочно",
"saved": "Saved" "saved": "Сохранено"
}, },
"miniflux": { "miniflux": {
"read": "Read", "read": "Прочитанные",
"unread": "Unread" "unread": "Непрочитанные"
}, },
"nextdns": { "nextdns": {
"wait": "Please Wait", "wait": "Пожалуйста, подождите",
"no_devices": "No Device Data Received" "no_devices": "Данные устройства не получены"
}, },
"common": { "common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}", "bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}" "bibitrate": "{{value, rate(bits: true; binary: true)}}"
}, },
"omada": { "omada": {
"connectedSwitches": "Connected switches", "connectedSwitches": "Подключенные свитчи",
"connectedAp": "Connected APs", "connectedAp": "Подключенные точки доступа",
"activeUser": "Active devices", "activeUser": "Активные устройства",
"alerts": "Alerts", "alerts": "Оповещения",
"connectedGateway": "Connected gateways" "connectedGateway": "Подключенные шлюзы"
}, },
"downloadstation": { "downloadstation": {
"download": "Download", "download": "Загрузка",
"upload": "Upload", "upload": "Отдача",
"leech": "Leech", "leech": "Пиры",
"seed": "Seed" "seed": "Сиды"
}, },
"mikrotik": { "mikrotik": {
"cpuLoad": "CPU Load", "cpuLoad": "Загрузка процессора",
"memoryUsed": "Memory Used", "memoryUsed": "Использование памяти",
"uptime": "Uptime", "uptime": "Время работы",
"numberOfLeases": "Leases" "numberOfLeases": "Аренды"
}, },
"xteve": { "xteve": {
"streams_all": "All Streams", "streams_all": "Все трансляции",
"streams_active": "Active Streams", "streams_active": "Активные трансляции",
"streams_xepg": "XEPG Channels" "streams_xepg": "XEPG-каналы"
}, },
"opnsense": { "opnsense": {
"cpu": "CPU Load", "cpu": "Загрузка процессора",
"memory": "Active Memory", "memory": "Активная память",
"wanUpload": "WAN Upload", "wanUpload": "Отдача через WAN",
"wanDownload": "WAN Download" "wanDownload": "Загрузка через WAN"
}, },
"moonraker": { "moonraker": {
"printer_state": "Printer State", "printer_state": "Состояние принтера",
"print_status": "Print Status", "print_status": "Статус печати",
"print_progress": "Progress", "print_progress": "Прогресс",
"layers": "Layers" "layers": "Слои"
}, },
"medusa": { "medusa": {
"wanted": "Wanted", "wanted": "Хотел",
"queued": "Queued", "queued": "В очереди",
"series": "Series" "series": "Сериалы"
}, },
"octoprint": { "octoprint": {
"printer_state": "Status", "printer_state": "Статус",
"temp_tool": "Tool temp", "temp_tool": "Температура инструмента",
"temp_bed": "Bed temp", "temp_bed": "Температура стола",
"job_completion": "Completion" "job_completion": "Завершение"
}, },
"cloudflared": { "cloudflared": {
"origin_ip": "Origin IP", "origin_ip": "IP источника",
"status": "Status" "status": "Статус"
}, },
"proxmoxbackupserver": { "proxmoxbackupserver": {
"datastore_usage": "Datastore", "datastore_usage": "Хранилище данных",
"failed_tasks_24h": "Failed Tasks 24h", "failed_tasks_24h": "Неудачные задачи 24ч",
"cpu_usage": "CPU", "cpu_usage": "Процессор",
"memory_usage": "Memory" "memory_usage": "Память"
}, },
"immich": { "immich": {
"users": "Users", "users": "Пользователи",
"photos": "Photos", "photos": "Фотографии",
"videos": "Videos", "videos": "Видео",
"storage": "Storage" "storage": "Хранилище"
}, },
"uptimekuma": { "uptimekuma": {
"up": "Sites Up", "up": "Сайтов включено",
"down": "Sites Down", "down": "Сайтов выключено",
"uptime": "Uptime", "uptime": "Время работы",
"incident": "Incident", "incident": "Инцидент",
"m": "m" "m": "м"
}, },
"komga": { "komga": {
"libraries": "Libraries", "libraries": "Библиотеки",
"series": "Series", "series": "Серии",
"books": "Books" "books": "Книги"
}, },
"mylar": { "mylar": {
"series": "Series", "series": "Серии",
"issues": "Issues", "issues": "Проблемы",
"wanted": "Wanted" "wanted": "Хотел"
}, },
"photoprism": { "photoprism": {
"albums": "Albums", "albums": "Альбомы",
"photos": "Photos", "photos": "Фотографии",
"videos": "Videos", "videos": "Видео",
"people": "People" "people": "Люди"
}, },
"diskstation": { "diskstation": {
"days": "Days", "days": "Дней",
"uptime": "Uptime", "uptime": "Время работы",
"volumeAvailable": "Available" "volumeAvailable": "Доступно"
}, },
"fileflows": { "fileflows": {
"queue": "Queue", "queue": "Очередь",
"processing": "Processing", "processing": "Обработка",
"processed": "Processed", "processed": "Обработано",
"time": "Time" "time": "Время"
}, },
"grafana": { "grafana": {
"dashboards": "Dashboards", "dashboards": "Панели мониторинга",
"datasources": "Data Sources", "datasources": "Источники данных",
"totalalerts": "Total Alerts", "totalalerts": "Всего уведомлений",
"alertstriggered": "Alerts Triggered" "alertstriggered": "Уведомлений сработало"
}, },
"nextcloud": { "nextcloud": {
"cpuload": "Cpu Load", "cpuload": "Загрузка процессора",
"memoryusage": "Memory Usage", "memoryusage": "Использование памяти",
"freespace": "Free Space", "freespace": "Свободное место",
"activeusers": "Active Users" "activeusers": "Активные пользователи",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Статус",
"size": "Size", "size": "Размер",
"lastrun": "Last Run", "lastrun": "Последний запуск",
"nextrun": "Next Run", "nextrun": "Следующий запуск",
"failed": "Failed" "failed": "Неудачно"
}, },
"unmanic": { "unmanic": {
"active_workers": "Active Workers", "active_workers": "Активные воркеры",
"total_workers": "Total Workers", "total_workers": "Всего воркеров",
"records_total": "Queue Length" "records_total": "Длина запроса"
}, },
"healthchecks": { "healthchecks": {
"new": "New", "new": "Новые",
"up": "Online", "up": "Онлайн",
"grace": "In Grace Period", "grace": "В льготный период",
"down": "Offline", "down": "Офлайн",
"paused": "Paused", "paused": "Приостановлено",
"status": "Status", "status": "Статус",
"last_ping": "Last Ping", "last_ping": "Последний пинг",
"never": "No pings yet" "never": "Пока нет пингов"
}, },
"pterodactyl": { "pterodactyl": {
"servers": "Servers", "servers": "Сервера",
"nodes": "Nodes" "nodes": "Узлы"
}, },
"prometheus": { "prometheus": {
"targets_up": "Targets Up", "targets_up": "Целей включено",
"targets_down": "Targets Down", "targets_down": "Целей выключено",
"targets_total": "Total Targets" "targets_total": "Всего целей"
}, },
"minecraft": { "minecraft": {
"players": "Players", "players": "Игроков",
"version": "Version", "version": "Версия",
"status": "Status", "status": "Статус",
"up": "Online", "up": "Онлайн",
"down": "Offline" "down": "Офлайн"
}, },
"ghostfolio": { "ghostfolio": {
"gross_percent_today": "Today", "gross_percent_today": "Сегодня",
"gross_percent_1y": "One year", "gross_percent_1y": "1 год",
"gross_percent_max": "All time" "gross_percent_max": "За всё время"
}, },
"audiobookshelf": { "audiobookshelf": {
"podcasts": "Podcasts", "podcasts": "Подкасты",
"books": "Books", "books": "Книги",
"podcastsDuration": "Duration", "podcastsDuration": "Продолжительность",
"booksDuration": "Duration" "booksDuration": "Продолжительность"
}, },
"homeassistant": { "homeassistant": {
"people_home": "People Home", "people_home": "Людей дома",
"lights_on": "Lights On", "lights_on": "Включено света",
"switches_on": "Switches On" "switches_on": "Включено переключателей"
}, },
"freshrss": { "freshrss": {
"subscriptions": "Subscriptions", "subscriptions": "Подписки",
"unread": "Unread" "unread": "Непрочитанные"
}, },
"channelsdvrserver": { "channelsdvrserver": {
"shows": "Shows", "shows": "Сериалы",
"recordings": "Recordings", "recordings": "Записи",
"scheduled": "Scheduled", "scheduled": "Запланировано",
"passes": "Passes" "passes": "Пройдено"
}, },
"whatsupdocker": { "whatsupdocker": {
"monitoring": "Monitoring", "monitoring": "Мониторинг",
"updates": "Updates" "updates": "Обновления"
} }
} }

View File

@ -534,7 +534,9 @@
"freespace": "Free Space", "freespace": "Free Space",
"activeusers": "Active Users", "activeusers": "Active Users",
"cpuload": "Cpu Load", "cpuload": "Cpu Load",
"memoryusage": "Memory Usage" "memoryusage": "Memory Usage",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Status",

View File

@ -68,7 +68,9 @@
"cpuload": "CPU obremenitev", "cpuload": "CPU obremenitev",
"memoryusage": "Uporabljen spomin", "memoryusage": "Uporabljen spomin",
"freespace": "Prostor na voljo", "freespace": "Prostor na voljo",
"activeusers": "Aktivni uporabniki" "activeusers": "Aktivni uporabniki",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Stanje", "status": "Stanje",
@ -193,10 +195,10 @@
"streams": "Aktivna vsebina", "streams": "Aktivna vsebina",
"movies": "Filmi", "movies": "Filmi",
"tv": "TV serije", "tv": "TV serije",
"albums": "Albums" "albums": "Albumi"
}, },
"sabnzbd": { "sabnzbd": {
"rate": "Hitrost prenosa", "rate": "Hitrost",
"queue": "Vrsta", "queue": "Vrsta",
"timeleft": "Preostali čas" "timeleft": "Preostali čas"
}, },
@ -236,7 +238,7 @@
}, },
"radarr": { "radarr": {
"wanted": "Iskano", "wanted": "Iskano",
"missing": "Manjkajoče", "missing": "Manjka",
"queued": "V vrsti", "queued": "V vrsti",
"movies": "Filmi" "movies": "Filmi"
}, },
@ -341,7 +343,7 @@
}, },
"proxmox": { "proxmox": {
"lxc": "LXC", "lxc": "LXC",
"vms": "VM-ji", "vms": "VM",
"mem": "MEM", "mem": "MEM",
"cpu": "CPU" "cpu": "CPU"
}, },
@ -521,10 +523,10 @@
"storage": "Shramba" "storage": "Shramba"
}, },
"uptimekuma": { "uptimekuma": {
"up": "Povezanih strani", "up": "Deluje",
"down": "Nepovezanih strani", "down": "Ne deluje",
"uptime": "Čas delovanja", "uptime": "Čas delovanja",
"incident": "Težave", "incident": "Incident",
"m": "m" "m": "m"
}, },
"komga": { "komga": {
@ -561,11 +563,11 @@
"audiobookshelf": { "audiobookshelf": {
"podcasts": "Podcasti", "podcasts": "Podcasti",
"books": "Knjige", "books": "Knjige",
"podcastsDuration": "Dolžina", "podcastsDuration": "Trajanje",
"booksDuration": "Dolžina" "booksDuration": "Trajanje"
}, },
"homeassistant": { "homeassistant": {
"people_home": "Ljudi doma", "people_home": "Ljudje doma",
"lights_on": "Vklopljene luči", "lights_on": "Vklopljene luči",
"switches_on": "Vklopljena stikala" "switches_on": "Vklopljena stikala"
}, },
@ -580,7 +582,7 @@
"passes": "Prehodi" "passes": "Prehodi"
}, },
"whatsupdocker": { "whatsupdocker": {
"monitoring": "Monitoring", "monitoring": "Se spremlja",
"updates": "Updates" "updates": "Posodobitve"
} }
} }

View File

@ -513,7 +513,9 @@
"cpuload": "Cpu Load", "cpuload": "Cpu Load",
"memoryusage": "Memory Usage", "memoryusage": "Memory Usage",
"freespace": "Free Space", "freespace": "Free Space",
"activeusers": "Active Users" "activeusers": "Active Users",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Status",

View File

@ -513,7 +513,9 @@
"cpuload": "Cpu Load", "cpuload": "Cpu Load",
"memoryusage": "Memory Usage", "memoryusage": "Memory Usage",
"freespace": "Free Space", "freespace": "Free Space",
"activeusers": "Active Users" "activeusers": "Active Users",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Status",

View File

@ -513,7 +513,9 @@
"memoryusage": "Memory Usage", "memoryusage": "Memory Usage",
"freespace": "Free Space", "freespace": "Free Space",
"cpuload": "Cpu Load", "cpuload": "Cpu Load",
"activeusers": "Active Users" "activeusers": "Active Users",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Status",

View File

@ -513,7 +513,9 @@
"cpuload": "Cpu Load", "cpuload": "Cpu Load",
"memoryusage": "Memory Usage", "memoryusage": "Memory Usage",
"freespace": "Free Space", "freespace": "Free Space",
"activeusers": "Active Users" "activeusers": "Active Users",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Status",

View File

@ -513,7 +513,9 @@
"cpuload": "Cpu Load", "cpuload": "Cpu Load",
"memoryusage": "Memory Usage", "memoryusage": "Memory Usage",
"freespace": "Free Space", "freespace": "Free Space",
"activeusers": "Active Users" "activeusers": "Active Users",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Status",

View File

@ -513,7 +513,9 @@
"cpuload": "Навантаження Cpu", "cpuload": "Навантаження Cpu",
"memoryusage": "Використання пам'яті", "memoryusage": "Використання пам'яті",
"freespace": "Вільного місця", "freespace": "Вільного місця",
"activeusers": "Активні користувачі" "activeusers": "Активні користувачі",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Статус", "status": "Статус",
@ -580,7 +582,7 @@
"passes": "Перепустки" "passes": "Перепустки"
}, },
"whatsupdocker": { "whatsupdocker": {
"monitoring": "Monitoring", "monitoring": "Спостереження",
"updates": "Updates" "updates": "Оновлення"
} }
} }

View File

@ -513,7 +513,9 @@
"cpuload": "Cpu Load", "cpuload": "Cpu Load",
"memoryusage": "Memory Usage", "memoryusage": "Memory Usage",
"freespace": "Free Space", "freespace": "Free Space",
"activeusers": "Active Users" "activeusers": "Active Users",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Status",

View File

@ -513,7 +513,9 @@
"cpuload": "Cpu Load", "cpuload": "Cpu Load",
"memoryusage": "Memory Usage", "memoryusage": "Memory Usage",
"freespace": "Free Space", "freespace": "Free Space",
"activeusers": "Active Users" "activeusers": "Active Users",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"lastrun": "Last Run", "lastrun": "Last Run",

View File

@ -229,7 +229,7 @@
"streams": "活动流", "streams": "活动流",
"movies": "电影", "movies": "电影",
"tv": "电视节目", "tv": "电视节目",
"albums": "Albums" "albums": "专辑"
}, },
"glances": { "glances": {
"cpu": "处理器", "cpu": "处理器",
@ -513,7 +513,9 @@
"cpuload": "处理器负载", "cpuload": "处理器负载",
"memoryusage": "内存占用", "memoryusage": "内存占用",
"freespace": "剩余空间", "freespace": "剩余空间",
"activeusers": "活跃用户" "activeusers": "活跃用户",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "状态", "status": "状态",
@ -542,9 +544,9 @@
"nodes": "节点" "nodes": "节点"
}, },
"prometheus": { "prometheus": {
"targets_up": "Targets Up", "targets_up": "目标离线",
"targets_down": "Targets Down", "targets_down": "目标在线",
"targets_total": "Total Targets" "targets_total": "总目标"
}, },
"minecraft": { "minecraft": {
"players": "播放中", "players": "播放中",
@ -570,13 +572,13 @@
"switches_on": "Switches On" "switches_on": "Switches On"
}, },
"freshrss": { "freshrss": {
"subscriptions": "Subscriptions", "subscriptions": "订阅",
"unread": "Unread" "unread": "未读"
}, },
"channelsdvrserver": { "channelsdvrserver": {
"shows": "Shows", "shows": "节目",
"recordings": "Recordings", "recordings": "录像",
"scheduled": "Scheduled", "scheduled": "已计划的",
"passes": "Passes" "passes": "Passes"
}, },
"whatsupdocker": { "whatsupdocker": {

View File

@ -26,8 +26,8 @@
"starting": "啟動中", "starting": "啟動中",
"unhealthy": "不健康的", "unhealthy": "不健康的",
"not_found": "未找到", "not_found": "未找到",
"exited": "Exited", "exited": "已退出",
"partial": "Partial", "partial": "部分",
"healthy": "健康的" "healthy": "健康的"
}, },
"emby": { "emby": {
@ -35,10 +35,10 @@
"transcoding": "轉碼", "transcoding": "轉碼",
"bitrate": "位元率", "bitrate": "位元率",
"no_active": "無播放活動", "no_active": "無播放活動",
"movies": "Movies", "movies": "電影",
"series": "Series", "series": "影集",
"episodes": "Episodes", "episodes": "",
"songs": "Songs" "songs": "曲目"
}, },
"tautulli": { "tautulli": {
"playing": "正在播放", "playing": "正在播放",
@ -61,13 +61,13 @@
"load": "負載", "load": "負載",
"cpu": "CPU", "cpu": "CPU",
"mem": "記憶體", "mem": "記憶體",
"temp": "TEMP", "temp": "溫度",
"max": "Max", "max": "最大",
"uptime": "UP", "uptime": "運行時間",
"months": "mo", "months": "",
"days": "d", "days": "",
"hours": "h", "hours": "",
"minutes": "m" "minutes": ""
}, },
"nzbget": { "nzbget": {
"rate": "速率", "rate": "速率",
@ -98,7 +98,7 @@
"readarr": { "readarr": {
"wanted": "關注中", "wanted": "關注中",
"queued": "已加入佇列", "queued": "已加入佇列",
"books": "" "books": "書"
}, },
"ombi": { "ombi": {
"pending": "待下載", "pending": "待下載",
@ -114,7 +114,7 @@
"pihole": { "pihole": {
"queries": "查詢", "queries": "查詢",
"blocked": "已阻擋", "blocked": "已阻擋",
"gravity": "Gravity" "gravity": "阻擋清單"
}, },
"speedtest": { "speedtest": {
"upload": "上行速率", "upload": "上行速率",
@ -229,16 +229,16 @@
"streams": "正在播放", "streams": "正在播放",
"movies": "電影", "movies": "電影",
"tv": "影集", "tv": "影集",
"albums": "Albums" "albums": "專輯"
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
"mem": "記憶體", "mem": "記憶體",
"wait": "請稍後", "wait": "請稍後",
"temp": "TEMP", "temp": "溫度",
"uptime": "UP", "uptime": "運行時間",
"days": "d", "days": "",
"hours": "h" "hours": ""
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "總監測數", "totalObserved": "總監測數",
@ -307,8 +307,8 @@
"service": "服務", "service": "服務",
"search": "搜尋", "search": "搜尋",
"custom": "自訂", "custom": "自訂",
"visit": "Visit", "visit": "訪問",
"url": "URL" "url": "網址"
}, },
"homebridge": { "homebridge": {
"available_update": "系統", "available_update": "系統",
@ -317,9 +317,9 @@
"up_to_date": "已更新至最新", "up_to_date": "已更新至最新",
"child_bridges": "Child Bridges", "child_bridges": "Child Bridges",
"child_bridges_status": "{{ok}}/{{total}}", "child_bridges_status": "{{ok}}/{{total}}",
"up": "Up", "up": "在線",
"pending": "Pending", "pending": "處理中",
"down": "Down" "down": "離線"
}, },
"autobrr": { "autobrr": {
"approvedPushes": "已核准", "approvedPushes": "已核准",
@ -479,7 +479,7 @@
"komga": { "komga": {
"libraries": "文庫", "libraries": "文庫",
"series": "叢刊", "series": "叢刊",
"books": "" "books": "書"
}, },
"mylar": { "mylar": {
"series": "系列", "series": "系列",
@ -513,7 +513,9 @@
"cpuload": "處理器負載", "cpuload": "處理器負載",
"memoryusage": "記憶體用量", "memoryusage": "記憶體用量",
"freespace": "可用空間", "freespace": "可用空間",
"activeusers": "活躍用戶" "activeusers": "活躍用戶",
"numfiles": "Files",
"numshares": "Shared Items"
}, },
"kopia": { "kopia": {
"status": "狀態", "status": "狀態",
@ -523,9 +525,9 @@
"failed": "失敗" "failed": "失敗"
}, },
"unmanic": { "unmanic": {
"active_workers": "Active Workers", "active_workers": "在線工作程序",
"total_workers": "Total Workers", "total_workers": "總工作程序",
"records_total": "Queue Length" "records_total": "佇列長度"
}, },
"healthchecks": { "healthchecks": {
"new": "新建立", "new": "新建立",
@ -538,49 +540,49 @@
"never": "尚未檢查" "never": "尚未檢查"
}, },
"pterodactyl": { "pterodactyl": {
"servers": "Servers", "servers": "伺服器",
"nodes": "Nodes" "nodes": "節點"
}, },
"prometheus": { "prometheus": {
"targets_up": "Targets Up", "targets_up": "目標上線",
"targets_down": "Targets Down", "targets_down": "目標離線",
"targets_total": "Total Targets" "targets_total": "目標總數"
}, },
"minecraft": { "minecraft": {
"players": "Players", "players": "玩家",
"version": "Version", "version": "版本",
"status": "Status", "status": "狀態",
"up": "Online", "up": "上線",
"down": "Offline" "down": "離線"
}, },
"ghostfolio": { "ghostfolio": {
"gross_percent_today": "Today", "gross_percent_today": "今日",
"gross_percent_1y": "One year", "gross_percent_1y": "一年",
"gross_percent_max": "All time" "gross_percent_max": "所有時間"
}, },
"audiobookshelf": { "audiobookshelf": {
"podcasts": "Podcasts", "podcasts": "播客",
"books": "Books", "books": "叢書",
"podcastsDuration": "Duration", "podcastsDuration": "歷時",
"booksDuration": "Duration" "booksDuration": "歷時"
}, },
"homeassistant": { "homeassistant": {
"people_home": "People Home", "people_home": "在家人數",
"lights_on": "Lights On", "lights_on": "燈亮著",
"switches_on": "Switches On" "switches_on": "開關開著"
}, },
"freshrss": { "freshrss": {
"subscriptions": "Subscriptions", "subscriptions": "訂閱",
"unread": "Unread" "unread": "未讀"
}, },
"channelsdvrserver": { "channelsdvrserver": {
"shows": "Shows", "shows": "節目",
"recordings": "Recordings", "recordings": "錄影",
"scheduled": "Scheduled", "scheduled": "已排定",
"passes": "Passes" "passes": "通行證"
}, },
"whatsupdocker": { "whatsupdocker": {
"monitoring": "Monitoring", "monitoring": "監測中",
"updates": "Updates" "updates": "可更新"
} }
} }

View File

@ -4,7 +4,7 @@ export default function List({ bookmarks }) {
return ( return (
<ul className="mt-3 flex flex-col"> <ul className="mt-3 flex flex-col">
{bookmarks.map((bookmark) => ( {bookmarks.map((bookmark) => (
<Item key={bookmark.name} bookmark={bookmark} /> <Item key={`${bookmark.name}-${bookmark.href}`} bookmark={bookmark} />
))} ))}
</ul> </ul>
); );

View File

@ -161,7 +161,7 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear
)} type="text" autoCorrect="false" ref={searchField} value={searchString} onChange={handleSearchChange} onKeyDown={handleSearchKeyDown} /> )} 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.length > 0 && <ul className="max-h-[60vh] overflow-y-auto m-2">
{results.map((r, i) => ( {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( <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", "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", i === currentItemIndex && "bg-theme-300/50 dark:bg-theme-700/50",

View File

@ -1,6 +1,18 @@
import { useContext } from "react";
import Image from "next/future/image"; 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" }) { export default function ResolvedIcon({ icon, width = 32, height = 32, alt = "logo" }) {
const { settings } = useContext(SettingsContext);
const { theme } = useContext(ThemeContext);
// direct or relative URLs // direct or relative URLs
if (icon.startsWith("http") || icon.startsWith("/")) { if (icon.startsWith("http") || icon.startsWith("/")) {
return ( return (
@ -12,15 +24,22 @@ export default function ResolvedIcon({ icon, width = 32, height = 32, alt = "log
width, width,
height, height,
objectFit: "contain", objectFit: "contain",
maxHeight: "100%",
maxWidth: "100%",
}} }}
alt={alt} alt={alt}
/> />
); );
} }
// mdi- prefixed, material design icons // check mdi- or si- prefixed icons
if (icon.startsWith("mdi-")) { const prefix = icon.split("-")[0]
const iconName = icon.replace("mdi-", "").replace(".svg", "");
if (prefix in iconSetURLs) {
// get icon source
const iconName = icon.replace(`${prefix}-`, "").replace(".svg", "");
const iconSource = `${iconSetURLs[prefix]}${iconName}.svg`;
return ( return (
<div <div
style={{ style={{
@ -28,9 +47,11 @@ export default function ResolvedIcon({ icon, width = 32, height = 32, alt = "log
height, height,
maxWidth: '100%', maxWidth: '100%',
maxHeight: '100%', maxHeight: '100%',
background: "linear-gradient(180deg, rgb(var(--color-logo-start)), rgb(var(--color-logo-stop)))", background: settings.iconStyle === "theme" ?
mask: `url(https://cdn.jsdelivr.net/npm/@mdi/svg@latest/svg/${iconName}.svg) no-repeat center / contain`, `rgb(var(--color-${ theme === "dark" ? 300 : 900 }) / var(--tw-text-opacity, 1))` :
WebkitMask: `url(https://cdn.jsdelivr.net/npm/@mdi/svg@latest/svg/${iconName}.svg) no-repeat center / contain`, "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, width,
height, height,
objectFit: "contain", objectFit: "contain",
maxHeight: "100%",
maxWidth: "100%"
}} }}
alt={alt} alt={alt}
/> />

View File

@ -1,8 +1,18 @@
import { useContext } from "react";
import Error from "./error"; import Error from "./error";
import { SettingsContext } from "utils/contexts/settings";
export default function Container({ error = false, children, service }) { export default function Container({ error = false, children, service }) {
const { settings } = useContext(SettingsContext);
if (error) { if (error) {
return <Error error={error} /> if (settings.hideErrors || service.widget.hide_errors) {
return null;
}
return <Error service={service} error={error} />
} }
let visibleChildren = children; let visibleChildren = children;

View File

@ -9,12 +9,10 @@ function displayData(data) {
return (data.type === 'Buffer') ? Buffer.from(data).toString() : JSON.stringify(data, 4); 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(); const { t } = useTranslation();
if (error?.data?.error) { const { error } = err?.data ?? { error: err };
error = error.data.error; // eslint-disable-line no-param-reassign
}
return ( return (
<details className="px-1 pb-1"> <details className="px-1 pb-1">

View File

@ -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); const containerExists = containerNames.includes(containerName);
if (containerExists) { if (containerExists) {

View File

@ -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); const containerExists = containerNames.includes(containerName);
if (containerExists) { if (containerExists) {

View File

@ -286,7 +286,7 @@ function Home({ initialSettings }) {
)} )}
</div> </div>
{services && ( {services?.length > 0 && (
<div className="flex flex-wrap p-4 sm:p-8 sm:pt-4 items-start pb-2"> <div className="flex flex-wrap p-4 sm:p-8 sm:pt-4 items-start pb-2">
{services.map((group) => ( {services.map((group) => (
<ServicesGroup key={group.name} services={group} layout={initialSettings.layout?.[group.name]} fiveColumns={settings.fiveColumns} /> <ServicesGroup key={group.name} services={group} layout={initialSettings.layout?.[group.name]} fiveColumns={settings.fiveColumns} />
@ -294,7 +294,7 @@ function Home({ initialSettings }) {
</div> </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)}`}> <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) => ( {bookmarks.map((group) => (
<BookmarksGroup key={group.name} group={group} /> <BookmarksGroup key={group.name} group={group} />

View File

@ -257,6 +257,7 @@ export function cleanServiceGroups(groups) {
const { const {
type, // all widgets type, // all widgets
fields, fields,
hideErrors,
server, // docker widget server, // docker widget
container, container,
currency, // coinmarketcap widget currency, // coinmarketcap widget
@ -269,7 +270,7 @@ export function cleanServiceGroups(groups) {
wan, // opnsense widget, wan, // opnsense widget,
enableBlocks, // emby/jellyfin enableBlocks, // emby/jellyfin
enableNowPlaying, enableNowPlaying,
volume // diskstation widget volume, // diskstation widget
} = cleanedService.widget; } = cleanedService.widget;
const fieldsList = typeof fields === 'string' ? JSON.parse(fields) : fields; const fieldsList = typeof fields === 'string' ? JSON.parse(fields) : fields;
@ -277,6 +278,7 @@ export function cleanServiceGroups(groups) {
cleanedService.widget = { cleanedService.widget = {
type, type,
fields: fieldsList || null, fields: fieldsList || null,
hide_errors: hideErrors || false,
service_name: service.name, service_name: service.name,
service_group: serviceGroup.name, service_group: serviceGroup.name,
}; };

View File

@ -12,7 +12,7 @@ export default function Component({ service }) {
const { data: adguardData, error: adguardError } = useWidgetAPI(widget, "stats"); const { data: adguardData, error: adguardError } = useWidgetAPI(widget, "stats");
if (adguardError) { if (adguardError) {
return <Container error={adguardError} />; return <Container service={service} error={adguardError} />;
} }
if (!adguardData) { if (!adguardData) {

View File

@ -12,7 +12,7 @@ export default function Component({ service }) {
if (librariesError) { if (librariesError) {
return <Container error={librariesError} />; return <Container service={service} error={librariesError} />;
} }
if (!librariesData) { if (!librariesData) {

View File

@ -15,7 +15,7 @@ export default function Component({ service }) {
if (usersError || loginsError || failedLoginsError) { if (usersError || loginsError || failedLoginsError) {
const finalError = usersError ?? loginsError ?? failedLoginsError; const finalError = usersError ?? loginsError ?? failedLoginsError;
return <Container error={finalError} />; return <Container service={service} error={finalError} />;
} }
if (!usersData || !loginsData || !failedLoginsData) { if (!usersData || !loginsData || !failedLoginsData) {

View File

@ -15,7 +15,7 @@ export default function Component({ service }) {
if (statsError || filtersError || indexersError) { if (statsError || filtersError || indexersError) {
const finalError = statsError ?? filtersError ?? indexersError; const finalError = statsError ?? filtersError ?? indexersError;
return <Container error={finalError} />; return <Container service={service} error={finalError} />;
} }
if (!statsData || !filtersData || !indexersData) { if (!statsData || !filtersData || !indexersData) {

View File

@ -14,7 +14,7 @@ export default function Component({ service }) {
if (moviesError || episodesError) { if (moviesError || episodesError) {
const finalError = moviesError ?? episodesError; const finalError = moviesError ?? episodesError;
return <Container error={finalError} />; return <Container service={service} error={finalError} />;
} }
if (!episodesData || !moviesData) { if (!episodesData || !moviesData) {

View File

@ -12,7 +12,7 @@ export default function Component({ service }) {
const { data, error } = useWidgetAPI(widget, "info"); const { data, error } = useWidgetAPI(widget, "info");
if (error) { if (error) {
return <Container error={error} />; return <Container service={service} error={error} />;
} }
if (!data) { if (!data) {

View File

@ -11,7 +11,7 @@ export default function Component({ service }) {
const { data: channelsData, error: channelsError } = useWidgetAPI(widget, "status"); const { data: channelsData, error: channelsError } = useWidgetAPI(widget, "status");
if (channelsError) { if (channelsError) {
return <Container error={channelsError} />; return <Container service={service} error={channelsError} />;
} }
if (!channelsData) { if (!channelsData) {

View File

@ -8,7 +8,7 @@ export default function Component({ service }) {
const { data: statsData, error: statsError } = useWidgetAPI(widget, "cfd_tunnel"); const { data: statsData, error: statsError } = useWidgetAPI(widget, "cfd_tunnel");
if (statsError) { if (statsError) {
return <Container error={statsError} />; return <Container service={service} error={statsError} />;
} }
if (!statsData) { if (!statsData) {
@ -28,4 +28,4 @@ export default function Component({ service }) {
<Block label="cloudflared.origin_ip" value={originIP} /> <Block label="cloudflared.origin_ip" value={originIP} />
</Container> </Container>
); );
} }

View File

@ -38,7 +38,7 @@ export default function Component({ service }) {
} }
if (statsError) { if (statsError) {
return <Container error={statsError} />; return <Container service={service} error={statsError} />;
} }
if (!statsData || !dateRange) { if (!statsData || !dateRange) {

View File

@ -12,7 +12,7 @@ export default function Component({ service }) {
const { data: torrentData, error: torrentError } = useWidgetAPI(widget); const { data: torrentData, error: torrentError } = useWidgetAPI(widget);
if (torrentError) { if (torrentError) {
return <Container error={torrentError} />; return <Container service={service} error={torrentError} />;
} }
if (!torrentData) { if (!torrentData) {

View File

@ -12,7 +12,7 @@ export default function Component({ service }) {
const { data: utilizationData, error: utilizationError } = useWidgetAPI(widget, "utilization"); const { data: utilizationData, error: utilizationError } = useWidgetAPI(widget, "utilization");
if (storageError || infoError || utilizationError) { if (storageError || infoError || utilizationError) {
return <Container error={ storageError ?? infoError ?? utilizationError } />; return <Container service={service} error={ storageError ?? infoError ?? utilizationError } />;
} }
if (!storageData || !infoData || !utilizationData) { if (!storageData || !infoData || !utilizationData) {

View File

@ -19,7 +19,7 @@ export default function Component({ service }) {
if (statsError || statsData?.error || statusError || statusData?.error) { if (statsError || statsData?.error || statusError || statusData?.error) {
const finalError = 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"))) { if (statusData && !(statusData.status.includes("running") || statusData.status.includes("partial"))) {

View File

@ -10,7 +10,7 @@ export default function Component({ service }) {
const { data: listData, error: listError } = useWidgetAPI(widget, "list"); const { data: listData, error: listError } = useWidgetAPI(widget, "list");
if (listError) { if (listError) {
return <Container error={listError} />; return <Container service={service} error={listError} />;
} }
const tasks = listData?.data?.tasks; const tasks = listData?.data?.tasks;

View File

@ -206,7 +206,7 @@ export default function Component({ service }) {
} }
if (sessionsError || countError) { if (sessionsError || countError) {
return <Container error={sessionsError ?? countError} />; return <Container service={service} error={sessionsError ?? countError} />;
} }
const enableBlocks = service.widget?.enableBlocks const enableBlocks = service.widget?.enableBlocks

View File

@ -12,7 +12,7 @@ export default function Component({ service }) {
const { data: fileflowsData, error: fileflowsError } = useWidgetAPI(widget, "status"); const { data: fileflowsData, error: fileflowsError } = useWidgetAPI(widget, "status");
if (fileflowsError) { if (fileflowsError) {
return <Container error={fileflowsError} />; return <Container service={service} error={fileflowsError} />;
} }
if (!fileflowsData) { if (!fileflowsData) {

View File

@ -12,7 +12,7 @@ export default function Component({ service }) {
const { data: torrentData, error: torrentError } = useWidgetAPI(widget, "torrents"); const { data: torrentData, error: torrentError } = useWidgetAPI(widget, "torrents");
if (torrentError || !torrentData?.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) { if (!torrentData || !torrentData.torrents) {

View File

@ -12,7 +12,7 @@ export default function Component({ service }) {
const { data: freshrssData, error: freshrssError } = useWidgetAPI(widget, "info"); const { data: freshrssData, error: freshrssError } = useWidgetAPI(widget, "info");
if (freshrssError) { if (freshrssError) {
return <Container error={freshrssError} />; return <Container service={service} error={freshrssError} />;
} }
if (!freshrssData) { if (!freshrssData) {

View File

@ -18,7 +18,7 @@ export default function Component({ service }) {
if (ghostfolioErrorToday || ghostfolioErrorYear || ghostfolioErrorMax) { if (ghostfolioErrorToday || ghostfolioErrorYear || ghostfolioErrorMax) {
const finalError = ghostfolioErrorToday ?? ghostfolioErrorYear ?? ghostfolioErrorMax const finalError = ghostfolioErrorToday ?? ghostfolioErrorYear ?? ghostfolioErrorMax
return <Container error={finalError} />; return <Container service={service} error={finalError} />;
} }
if (!performanceToday || !performanceYear || !performanceMax) { if (!performanceToday || !performanceYear || !performanceMax) {

View File

@ -8,7 +8,7 @@ export default function Component({ service }) {
const { data: gluetunData, error: gluetunError } = useWidgetAPI(widget, "ip"); const { data: gluetunData, error: gluetunError } = useWidgetAPI(widget, "ip");
if (gluetunError) { if (gluetunError) {
return <Container error={gluetunError} />; return <Container service={service} error={gluetunError} />;
} }
if (!gluetunData) { if (!gluetunData) {

View File

@ -11,7 +11,7 @@ export default function Component({ service }) {
if (appsError || messagesError || clientsError) { if (appsError || messagesError || clientsError) {
const finalError = appsError ?? messagesError ?? clientsError; const finalError = appsError ?? messagesError ?? clientsError;
return <Container error={finalError} />; return <Container service={service} error={finalError} />;
} }

View File

@ -12,7 +12,7 @@ export default function Component({ service }) {
const { data: alertsData, error: alertsError } = useWidgetAPI(widget, "alerts"); const { data: alertsData, error: alertsError } = useWidgetAPI(widget, "alerts");
if (statsError || alertsError) { if (statsError || alertsError) {
return <Container error={statsError ?? alertsError} />; return <Container service={service} error={statsError ?? alertsError} />;
} }
if (!statsData || !alertsData) { if (!statsData || !alertsData) {

View File

@ -8,7 +8,7 @@ export default function Component({ service }) {
const { data: channelsData, error: channelsError } = useWidgetAPI(widget, "lineup"); const { data: channelsData, error: channelsError } = useWidgetAPI(widget, "lineup");
if (channelsError) { if (channelsError) {
return <Container error={channelsError} />; return <Container service={service} error={channelsError} />;
} }
if (!channelsData) { if (!channelsData) {

View File

@ -30,7 +30,7 @@ export default function Component({ service }) {
const { data, error } = useWidgetAPI(widget, "checks"); const { data, error } = useWidgetAPI(widget, "checks");
if (error) { if (error) {
return <Container error={error} />; return <Container service={service} error={error} />;
} }
if (!data) { if (!data) {

View File

@ -7,7 +7,7 @@ export default function Component({ service }) {
const { data, error } = useWidgetAPI(widget, null, { refreshInterval: 60000 }); const { data, error } = useWidgetAPI(widget, null, { refreshInterval: 60000 });
if (error) { if (error) {
return <Container error={error} />; return <Container service={service} error={error} />;
} }
return <Container service={service}> return <Container service={service}>

View File

@ -12,7 +12,7 @@ export default function Component({ service }) {
const { data: homebridgeData, error: homebridgeError } = useWidgetAPI(widget, "info"); const { data: homebridgeData, error: homebridgeError } = useWidgetAPI(widget, "info");
if (homebridgeError) { if (homebridgeError) {
return <Container error={homebridgeError} />; return <Container service={service} error={homebridgeError} />;
} }
if (!homebridgeData) { if (!homebridgeData) {

View File

@ -11,7 +11,7 @@ export default function Component({ service }) {
const { data: immichData, error: immichError } = useWidgetAPI(widget); const { data: immichData, error: immichError } = useWidgetAPI(widget);
if (immichError || immichData?.statusCode === 401) { if (immichError || immichData?.statusCode === 401) {
return <Container error={immichError ?? immichData} />; return <Container service={service} error={immichError ?? immichData} />;
} }
if (!immichData) { if (!immichData) {

View File

@ -12,7 +12,7 @@ export default function Component({ service }) {
const { data: indexersData, error: indexersError } = useWidgetAPI(widget, "indexers"); const { data: indexersData, error: indexersError } = useWidgetAPI(widget, "indexers");
if (indexersError) { if (indexersError) {
return <Container error={indexersError} />; return <Container service={service} error={indexersError} />;
} }
if (!indexersData) { if (!indexersData) {

View File

@ -8,7 +8,7 @@ export default function Component({ service }) {
const { data: statsData, error: statsError } = useWidgetAPI(widget, "request/count"); const { data: statsData, error: statsError } = useWidgetAPI(widget, "request/count");
if (statsError) { if (statsError) {
return <Container error={statsError} />; return <Container service={service} error={statsError} />;
} }
if (!statsData) { if (!statsData) {

View File

@ -14,7 +14,7 @@ export default function Component({ service }) {
if (libraryError || seriesError || bookError) { if (libraryError || seriesError || bookError) {
const finalError = libraryError ?? seriesError ?? bookError; const finalError = libraryError ?? seriesError ?? bookError;
return <Container error={finalError} />; return <Container service={service} error={finalError} />;
} }
if (!libraryData || !seriesData || !bookData) { if (!libraryData || !seriesData || !bookData) {
@ -34,4 +34,4 @@ export default function Component({ service }) {
<Block label="komga.books" value={t("common.number", { value: bookData.totalElements })} /> <Block label="komga.books" value={t("common.number", { value: bookData.totalElements })} />
</Container> </Container>
); );
} }

View File

@ -38,7 +38,7 @@ export default function Component({ service }) {
const { data: statusData, error: statusError } = useWidgetAPI(widget, "status"); const { data: statusData, error: statusError } = useWidgetAPI(widget, "status");
if (statusError) { if (statusError) {
return <Container error={statusError} />; return <Container service={service} error={statusError} />;
} }
const source = statusData?.sources[0]; const source = statusData?.sources[0];
@ -65,4 +65,4 @@ export default function Component({ service }) {
{nextTime && <Block label="kopia.nextrun" value={ relativeDate(nextTime) } />} {nextTime && <Block label="kopia.nextrun" value={ relativeDate(nextTime) } />}
</Container> </Container>
); );
} }

View File

@ -16,7 +16,7 @@ export default function Component({ service }) {
`/api/kubernetes/stats/${widget.namespace}/${widget.app}?${podSelectorString}`); `/api/kubernetes/stats/${widget.namespace}/${widget.app}?${podSelectorString}`);
if (statsError || statusError) { if (statsError || statusError) {
return <Container error={t("widget.api_error")} />; return <Container service={service} error={t("widget.api_error")} />;
} }
if (statusData && statusData.status !== "running") { if (statusData && statusData.status !== "running") {

View File

@ -15,7 +15,7 @@ export default function Component({ service }) {
if (albumsError || wantedError || queueError) { if (albumsError || wantedError || queueError) {
const finalError = albumsError ?? wantedError ?? queueError; const finalError = albumsError ?? wantedError ?? queueError;
return <Container error={finalError} />; return <Container service={service} error={finalError} />;
} }
if (!albumsData || !wantedData || !queueData) { if (!albumsData || !wantedData || !queueData) {

View File

@ -12,7 +12,7 @@ export default function Component({ service }) {
const { data: statsData, error: statsError } = useWidgetAPI(widget, "instance"); const { data: statsData, error: statsError } = useWidgetAPI(widget, "instance");
if (statsError) { if (statsError) {
return <Container error={statsError} />; return <Container service={service} error={statsError} />;
} }
if (!statsData) { if (!statsData) {

View File

@ -13,7 +13,7 @@ export default function Component({ service }) {
if (statsError || futureError) { if (statsError || futureError) {
const finalError = statsError ?? futureError; const finalError = statsError ?? futureError;
return <Container error={finalError} />; return <Container service={service} error={finalError} />;
} }
if (!statsData || !futureData) { if (!statsData || !futureData) {

View File

@ -14,7 +14,7 @@ export default function Component({ service }) {
if (statsError || leasesError) { if (statsError || leasesError) {
const finalError = statsError ?? leasesError; const finalError = statsError ?? leasesError;
return <Container error={ finalError } />; return <Container service={service} error={ finalError } />;
} }
if (!statsData || !leasesData) { if (!statsData || !leasesData) {

View File

@ -10,7 +10,7 @@ export default function Component({ service }) {
const { t } = useTranslation(); const { t } = useTranslation();
if(serverError){ if(serverError){
return <Container error={serverError} />; return <Container service={service} error={serverError} />;
} }
if (!serverData) { if (!serverData) {
return ( return (

View File

@ -12,7 +12,7 @@ export default function Component({ service }) {
const { data: minifluxData, error: minifluxError } = useWidgetAPI(widget, "counters"); const { data: minifluxData, error: minifluxError } = useWidgetAPI(widget, "counters");
if (minifluxError) { if (minifluxError) {
return <Container error={minifluxError} />; return <Container service={service} error={minifluxError} />;
} }
if (!minifluxData) { if (!minifluxData) {

View File

@ -15,7 +15,7 @@ export default function Component({ service }) {
if (printStatsError || displayStatsError || webHooksError) { if (printStatsError || displayStatsError || webHooksError) {
const finalError = printStatsError ?? displayStatsError ?? webHooksError; const finalError = printStatsError ?? displayStatsError ?? webHooksError;
return <Container error={finalError} />; return <Container service={service} error={finalError} />;
} }
if (!printStats || !displayStatus || !webHooks) { if (!printStats || !displayStatus || !webHooks) {

View File

@ -15,7 +15,7 @@ export default function Component({ service }) {
if (seriesError || issuesError || wantedError) { if (seriesError || issuesError || wantedError) {
const finalError = seriesError ?? issuesError ?? wantedError; const finalError = seriesError ?? issuesError ?? wantedError;
return <Container error={finalError} />; return <Container service={service} error={finalError} />;
} }
if (!seriesData || !issuesData || !wantedData) { if (!seriesData || !issuesData || !wantedData) {
@ -37,4 +37,4 @@ export default function Component({ service }) {
<Block label="mylar.wanted" value={t("common.number", { value: wantedData.issues.length })} /> <Block label="mylar.wanted" value={t("common.number", { value: wantedData.issues.length })} />
</Container> </Container>
); );
} }

View File

@ -27,7 +27,7 @@ export default function Component({ service }) {
const { data: navidromeData, error: navidromeError } = useWidgetAPI(widget, "getNowPlaying"); const { data: navidromeData, error: navidromeError } = useWidgetAPI(widget, "getNowPlaying");
if (navidromeError || navidromeData?.["subsonic-response"]?.error) { 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) { if (!navidromeData) {

View File

@ -1,4 +1,5 @@
import { useTranslation } from "next-i18next"; import { useTranslation } from "next-i18next";
import { useMemo } from "react";
import Container from "components/services/widget/container"; import Container from "components/services/widget/container";
import Block from "components/services/widget/block"; import Block from "components/services/widget/block";
@ -10,30 +11,53 @@ export default function Component({ service }) {
const { widget } = service; const { widget } = service;
const { data: nextcloudData, error: nextcloudError } = useWidgetAPI(widget, "serverinfo"); 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) { if (nextcloudError) {
return <Container error={nextcloudError} />; return <Container service={service} error={nextcloudError} />;
} }
if (!nextcloudData) { if (!nextcloudData) {
return ( return (
<Container service={service}> <Container service={service}>
<Block label="nextcloud.cpuload" /> {showCpuLoad && <Block label="nextcloud.cpuload" />}
<Block label="nextcloud.memoryusage" /> {showMemoryUsage && <Block label="nextcloud.memoryusage" />}
<Block label="nextcloud.freespace" /> <Block label="nextcloud.freespace" />
<Block label="nextcloud.activeusers" /> <Block label="nextcloud.activeusers" />
<Block label="nextcloud.numfiles" />
<Block label="nextcloud.numshares" />
</Container> </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)); const memoryUsage = 100 * ((parseFloat(nextcloudInfo.system.mem_total) - parseFloat(nextcloudInfo.system.mem_free)) / parseFloat(nextcloudInfo.system.mem_total));
return ( return (
<Container service={service}> <Container service={service}>
<Block label="nextcloud.cpuload" value={t("common.percent", { value: nextcloudInfo.system.cpuload[0] })} /> {showCpuLoad && <Block label="nextcloud.cpuload" value={t("common.percent", { value: nextcloudInfo.system.cpuload[0] })} />}
<Block label="nextcloud.memoryusage" value={t("common.percent", { value:memoryUsage })} /> {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.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> </Container>
); );
} }

View File

@ -12,7 +12,7 @@ export default function Component({ service }) {
const { data: nextdnsData, error: nextdnsError } = useWidgetAPI(widget, "analytics/status"); const { data: nextdnsData, error: nextdnsError } = useWidgetAPI(widget, "analytics/status");
if (nextdnsError) { if (nextdnsError) {
return <Container error={nextdnsError} />; return <Container service={service} error={nextdnsError} />;
} }
if (!nextdnsData) { if (!nextdnsData) {

View File

@ -8,7 +8,7 @@ export default function Component({ service }) {
const { data: infoData, error: infoError } = useWidgetAPI(widget, "nginx/proxy-hosts"); const { data: infoData, error: infoError } = useWidgetAPI(widget, "nginx/proxy-hosts");
if (infoError) { if (infoError) {
return <Container error={infoError} />; return <Container service={service} error={infoError} />;
} }
if (!infoData) { if (!infoData) {

View File

@ -12,7 +12,7 @@ export default function Component({ service }) {
const { data: statusData, error: statusError } = useWidgetAPI(widget, "status"); const { data: statusData, error: statusError } = useWidgetAPI(widget, "status");
if (statusError) { if (statusError) {
return <Container error={statusError} />; return <Container service={service} error={statusError} />;
} }
if (!statusData) { if (!statusData) {

View File

@ -9,11 +9,11 @@ export default function Component({ service }) {
const { data: jobStats, error: jobStatsError } = useWidgetAPI(widget, "job_stats"); const { data: jobStats, error: jobStatsError } = useWidgetAPI(widget, "job_stats");
if (printerStatsError) { if (printerStatsError) {
return <Container error={printerStatsError} />; return <Container service={service} error={printerStatsError} />;
} }
if (jobStatsError) { if (jobStatsError) {
return <Container error={jobStatsError} />; return <Container service={service} error={jobStatsError} />;
} }
const state = printerStats?.state?.text; const state = printerStats?.state?.text;

View File

@ -14,7 +14,7 @@ export default function Component({ service }) {
}); });
if (omadaAPIError) { if (omadaAPIError) {
return <Container error={omadaAPIError} />; return <Container service={service} error={omadaAPIError} />;
} }
if (!omadaData) { if (!omadaData) {

View File

@ -8,7 +8,7 @@ export default function Component({ service }) {
const { data: statsData, error: statsError } = useWidgetAPI(widget, "Request/count"); const { data: statsData, error: statsError } = useWidgetAPI(widget, "Request/count");
if (statsError) { if (statsError) {
return <Container error={statsError} />; return <Container service={service} error={statsError} />;
} }
if (!statsData) { if (!statsData) {

View File

@ -14,7 +14,7 @@ export default function Component({ service }) {
if (activityError || interfaceError) { if (activityError || interfaceError) {
const finalError = activityError ?? interfaceError; const finalError = activityError ?? interfaceError;
return <Container error={ finalError } />; return <Container service={service} error={ finalError } />;
} }
if (!activityData || !interfaceData) { if (!activityData || !interfaceData) {

View File

@ -11,7 +11,7 @@ export default function Component({ service }) {
const { data: statsData, error: statsError } = useWidgetAPI(widget, "request/count"); const { data: statsData, error: statsError } = useWidgetAPI(widget, "request/count");
if (statsError) { if (statsError) {
return <Container error={statsError} />; return <Container service={service} error={statsError} />;
} }
if (!statsData) { if (!statsData) {

View File

@ -8,7 +8,7 @@ export default function Component({ service }) {
const { data: statisticsData, error: statisticsError } = useWidgetAPI(widget, "statistics"); const { data: statisticsData, error: statisticsError } = useWidgetAPI(widget, "statistics");
if (statisticsError) { if (statisticsError) {
return <Container error={statisticsError} />; return <Container service={service} error={statisticsError} />;
} }
if (!statisticsData) { if (!statisticsData) {

Some files were not shown because too many files have changed in this diff Show More