Compare commits

...

16 Commits

Author SHA1 Message Date
shamoon
44405b4aae Merge branch 'main' into dev 2025-08-21 13:06:07 -07:00
Derek Kaser
842cec2fee Feature: Unraid widget (#5683)
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2025-08-21 18:06:49 +00:00
shamoon
c6ad937619 Bump version to 1.4.6 2025-08-21 06:55:46 -07:00
shamoon
a6ab095ff9 Update component.jsx 2025-08-20 13:29:43 -07:00
shamoon
9a085bcb17 Enhancement: handle authentik v2025.8.0 breaking API changes (#5687) 2025-08-20 13:27:21 -07:00
github-actions[bot]
6d7be1c7f2 New Crowdin translations by GitHub Action (#5679)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2025-08-18 23:55:25 -07:00
shamoon
25cd51cee9 Update repo-maintenance.yml 2025-08-18 23:54:22 -07:00
Vincent Verdeil
495de204d1 Documentation: fix typo in docs/configs/settings.md (#5671) 2025-08-14 17:30:48 -07:00
shamoon
8e5f4d55c9 Bump version to 1.4.5 2025-08-13 06:44:47 -07:00
shamoon
184fd65c76 Update resources.js 2025-08-13 06:44:47 -07:00
shamoon
15817f9b27 Update package.json 2025-08-13 06:35:11 -07:00
shamoon
79671ac30e Merge branch 'dev' 2025-08-13 06:17:38 -07:00
github-actions[bot]
1d5db612fd New Crowdin translations by GitHub Action (#5655)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2025-08-13 06:16:35 -07:00
shamoon
d30016304b Security: refactor disk resource lookup logic (#5666) 2025-08-13 06:16:12 -07:00
Markus Thierolf
f0fd125e37 Enhancement: summarize charge power of all loadpoints in evcc widget (#5663) 2025-08-12 08:46:23 -07:00
dependabot[bot]
9ed4b85d5a Chore(deps): Bump actions/checkout from 4 to 5 (#5660)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-11 17:21:06 -07:00
26 changed files with 764 additions and 428 deletions

View File

@@ -17,7 +17,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v5
- name: crowdin action
uses: crowdin/github-action@v2
with:

View File

@@ -22,7 +22,7 @@ jobs:
runs-on: ubuntu-22.04
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v5
- name: Install python
uses: actions/setup-python@v5
@@ -61,7 +61,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v5
- name: Extract Docker metadata
id: meta

View File

@@ -17,7 +17,7 @@ jobs:
runs-on: ubuntu-22.04
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v5
- name: Install python
uses: actions/setup-python@v5
with:
@@ -32,7 +32,7 @@ jobs:
needs:
- pre-commit
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: actions/setup-python@v5
with:
python-version: 3.x
@@ -54,7 +54,7 @@ jobs:
needs:
- pre-commit
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Configure Git Credentials
run: |
git config user.name github-actions[bot]

View File

@@ -212,9 +212,9 @@ jobs:
}
const CUTOFF_1_DAYS = 180;
const CUTOFF_1_COUNT = 10;
const CUTOFF_1_COUNT = 20;
const CUTOFF_2_DAYS = 365;
const CUTOFF_2_COUNT = 20;
const CUTOFF_2_COUNT = 40;
const cutoff1Date = new Date();
cutoff1Date.setDate(cutoff1Date.getDate() - CUTOFF_1_DAYS);

View File

@@ -63,7 +63,7 @@ The homepage team appreciates all effort and interest from the community in fili
- Issues, pull requests and discussions that are closed will be locked after 30 days of inactivity.
- Discussions with a marked answer will be automatically closed.
- Discussions in the 'General' or 'Support' categories will be closed after 180 days of inactivity.
- Feature requests that do not meet the following thresholds will be closed: 10 "up-votes" after 180 days of inactivity or 20 "up-votes" after 365 days.
- Feature requests that do not meet the following thresholds will be closed: 20 "up-votes" after 180 days of inactivity or 40 "up-votes" after 365 days.
In all cases, threads can be re-opened by project maintainers and, of course, users can always create a new discussion for related concerns.
Finally, remember that all information remains searchable and 'closed' feature requests can still serve as inspiration for new features.

View File

@@ -264,7 +264,7 @@ fullWidth: true
### Maximum Group Columns
You can set the maximum number of columns of groups on larger screen sizes (note this is only for groups with the default `style: columns`, not groups with `stle: row`) by adding:
You can set the maximum number of columns of groups on larger screen sizes (note this is only for groups with the default `style: columns`, not groups with `style: row`) by adding:
```yaml
maxGroupColumns: 8 # default is 4 for services, 6 for bookmarks, max 8

View File

@@ -17,9 +17,15 @@ The account you made the API token for also needs the following **Assigned globa
Allowed fields: `["users", "loginsLast24H", "failedLoginsLast24H"]`.
| Authentik Version | Homepage Widget Version |
| ----------------- | ----------------------- |
| < 2025.8.0 | 1 (default) |
| >= 2025.8.0 | 2 |
```yaml
widget:
type: authentik
url: http://authentik.host.or.ip:port
key: api_token
version: 2 # optional, default is 1
```

View File

@@ -139,6 +139,7 @@ You can also find a list of all available service widgets in the sidebar navigat
- [TubeArchivist](tubearchivist.md)
- [UniFi Controller](unifi-controller.md)
- [Unmanic](unmanic.md)
- [Unraid](unraid.md)
- [Uptime Kuma](uptime-kuma.md)
- [UptimeRobot](uptimerobot.md)
- [UrBackup](urbackup.md)

View File

@@ -0,0 +1,28 @@
---
title: Unraid
description: Unraid Widget Configuration
---
Learn more about [Unraid](https://unraid.net/).
The Unraid widget allows you to monitor the resources of an Unraid server.
**Minimum Requirements:**
- Unraid 7.2 -or- Unraid Connect plugin 2025.08.19.1850
- API key with the **GUEST** (read only) role: [Managing API Keys](https://docs.unraid.net/go/managing-api-keys)
The widget can display metrics for selected Unraid pools. If using one of the "pool" fields, you must also add the pool name to the settings.
**Allowed fields:** `["cpu","memoryPercent","memoryAvailable","memoryUsed","notifications","arrayFreeSpace","arrayUsedSpace","arrayUsedPercent","status","pool1UsedSpace","pool1FreeSpace","pool1UsedPercent","pool2UsedSpace","pool2FreeSpace","pool2UsedPercent","pool3UsedSpace","pool3FreeSpace","pool3UsedPercent","pool4UsedSpace","pool4FreeSpace","pool4UsedPercent"]`
```yaml
widget:
type: unraid
url: https://unraid.host.or.ip
key: api-key
pool1: pool1name # required only if using pool1 fields
pool2: pool2name # required only if using pool2 fields
pool3: pool3name # required only if using pool3 fields
pool4: pool4name # required only if using pool4 fields
```

View File

@@ -165,6 +165,7 @@ nav:
- widgets/services/tubearchivist.md
- widgets/services/unifi-controller.md
- widgets/services/unmanic.md
- widgets/services/unraid.md
- widgets/services/uptime-kuma.md
- widgets/services/uptimerobot.md
- widgets/services/urbackup.md

View File

@@ -1,6 +1,6 @@
{
"name": "homepage",
"version": "1.4.4",
"version": "1.4.6",
"private": true,
"scripts": {
"preinstall": "npx only-allow pnpm",
@@ -72,6 +72,7 @@
},
"pnpm": {
"onlyBuiltDependencies": [
"osx-temperature-sensor",
"sharp"
]
}

View File

@@ -1083,5 +1083,27 @@
"nextMonthlyCost": "Next Month",
"previousMonthlyCost": "Prev. Month",
"nextRenewingSubscription": "Next Payment"
},
"unraid": {
"STARTED": "Started",
"STOPPED": "Stopped",
"NEW_ARRAY": "New Array",
"RECON_DISK": "Reconstructing Disk",
"DISABLE_DISK": "Disk Disabled",
"SWAP_DSBL": "Swap Disable",
"INVALID_EXPANSION": "Invalid Expansion",
"PARITY_NOT_BIGGEST": "Parity Not Biggest",
"TOO_MANY_MISSING_DISKS": "Too Many Missing Disks",
"NEW_DISK_TOO_SMALL": "New Disk Too Small",
"NO_DATA_DISKS": "No Data Disks",
"notifications": "Notifications",
"status": "Status",
"cpu": "CPU",
"memoryUsed": "Memory Used",
"memoryAvailable": "Memory Available",
"arrayUsed": "Array Used",
"arrayFree": "Array Free",
"poolUsed": "{{pool}} Used",
"poolFree": "{{pool}} Free"
}
}

View File

@@ -93,9 +93,9 @@
"http_status": "Estado HTTP",
"error": "Error",
"response": "Respuesta",
"down": "Down",
"up": "Up",
"not_available": "Not Available"
"down": "Inactivo",
"up": "Activos",
"not_available": "No disponible"
},
"emby": {
"playing": "Reproduciendo",
@@ -108,11 +108,11 @@
"songs": "Canciones"
},
"esphome": {
"offline": "Offline",
"offline_alt": "Offline",
"offline": "Fuera de línea",
"offline_alt": "Fuera de línea",
"online": "En línea",
"total": "Total",
"unknown": "Unknown"
"unknown": "Desconocido"
},
"evcc": {
"pv_power": "Producción",
@@ -133,7 +133,7 @@
"unread": "Sin leer"
},
"fritzbox": {
"connectionStatus": "Status",
"connectionStatus": "Estado",
"connectionStatusUnconfigured": "Sin configurar",
"connectionStatusConnecting": "Conectando",
"connectionStatusAuthenticating": "Autenticando",
@@ -141,11 +141,11 @@
"connectionStatusDisconnecting": "Desconectando",
"connectionStatusDisconnected": "Desconectado",
"connectionStatusConnected": "Conectado",
"uptime": "Uptime",
"uptime": "Tiempo activo",
"maxDown": "Descarga máxima",
"maxUp": "Subida máxima",
"down": "Down",
"up": "Up",
"down": "Inactivo",
"up": "Activos",
"received": "Recibido",
"sent": "Enviado",
"externalIPAddress": "IP ext.",
@@ -193,7 +193,7 @@
"tv": "Series"
},
"sabnzbd": {
"rate": "Rate",
"rate": "Tasa",
"queue": "En cola",
"timeleft": "Tiempo restante"
},
@@ -315,7 +315,7 @@
"download": "Descargado",
"nondownload": "No descargado",
"read": "Leído",
"unread": "Sin leer",
"unread": "No leídos",
"downloadedread": "Descargado y leído",
"downloadedunread": "Descargado y no leído",
"nondownloadedread": "No descargado y leído",
@@ -344,12 +344,12 @@
"totalAuthoritative": "Autoritarios",
"totalRecursive": "Recursivos",
"totalCached": "En caché",
"totalBlocked": "Blocked",
"totalBlocked": "Bloqueado",
"totalDropped": "Descartados",
"totalClients": "Clientes"
},
"tdarr": {
"queue": "Queue",
"queue": "Cola",
"processed": "Procesado",
"errored": "Error",
"saved": "Guardado"
@@ -360,13 +360,13 @@
"middleware": "Software intermedio"
},
"trilium": {
"version": "Version",
"notesCount": "Notes",
"dbSize": "Database Size",
"unknown": "Unknown"
"version": "Versión",
"notesCount": "Notas",
"dbSize": "Tamaño de la base de datos",
"unknown": "Desconocido"
},
"navidrome": {
"nothing_streaming": "No Active Streams",
"nothing_streaming": "Sin transmisiones activas",
"please_wait": "Por favor, espera"
},
"npm": {
@@ -401,31 +401,31 @@
"numActiveSessions": "Sesiones",
"numConnections": "Conexiones",
"dataRelayed": "Retransmitido",
"transferRate": "Rate"
"transferRate": "Tasa"
},
"mastodon": {
"user_count": "Users",
"user_count": "Usuarios",
"status_count": "Publicaciones",
"domain_count": "Dominios"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"wanted": "Buscando",
"queued": "En cola",
"series": "Series"
},
"minecraft": {
"players": "Jugadores",
"version": "Versión",
"status": "Status",
"up": "Online",
"down": "Offline"
"status": "Estado",
"up": "En línea",
"down": "Fuera de línea"
},
"miniflux": {
"read": "Leer",
"unread": "Unread"
"unread": "Sin leer"
},
"authentik": {
"users": "Users",
"users": "Usuarios",
"loginsLast24H": "Inicios de sesión (24h)",
"failedLoginsLast24H": "Inicios de sesión fallidos (24h)"
},
@@ -437,19 +437,19 @@
},
"glances": {
"cpu": "CPU",
"load": "Load",
"wait": "Please wait",
"load": "Carga",
"wait": "Por favor, espera",
"temp": "TEMP",
"_temp": "Temperatura",
"warn": "Advertir",
"uptime": "UP",
"uptime": "ACTIVO",
"total": "Total",
"free": "Free",
"used": "Used",
"free": "Libre",
"used": "Usado",
"days": "d",
"hours": "h",
"crit": "Crít.",
"read": "Read",
"read": "Leído",
"write": "Escribir",
"gpu": "GPU",
"mem": "Memoria",
@@ -470,57 +470,57 @@
"1-day": "Mayormente soleado",
"1-night": "Mayormente despejado",
"2-day": "Parcialmente nuboso",
"2-night": "Partly Cloudy",
"2-night": "Parcialmente nublado",
"3-day": "Nublado",
"3-night": "Cloudy",
"3-night": "Nublado",
"45-day": "Niebla",
"45-night": "Foggy",
"48-day": "Foggy",
"48-night": "Foggy",
"45-night": "Neblinoso",
"48-day": "Neblinoso",
"48-night": "Neblinoso",
"51-day": "Llovizna ligera",
"51-night": "Light Drizzle",
"51-night": "Llovizna ligera",
"53-day": "Llovizna",
"53-night": "Drizzle",
"53-night": "Llovizna",
"55-day": "Llovizna intensa",
"55-night": "Heavy Drizzle",
"55-night": "Llovizna intensa",
"56-day": "Llovizna helada ligera",
"56-night": "Light Freezing Drizzle",
"56-night": "Llovizna helada ligera",
"57-day": "Llovizna helada",
"57-night": "Freezing Drizzle",
"57-night": "Llovizna helada",
"61-day": "Lluvia ligera",
"61-night": "Light Rain",
"61-night": "Lluvia ligera",
"63-day": "Lluvia",
"63-night": "Rain",
"63-night": "Lluvia",
"65-day": "Lluvia torrencial",
"65-night": "Heavy Rain",
"65-night": "Lluvia fuerte",
"66-day": "Granizo",
"66-night": "Freezing Rain",
"67-day": "Freezing Rain",
"67-night": "Freezing Rain",
"66-night": "Lluvia helada",
"67-day": "Lluvia helada",
"67-night": "Lluvia helada",
"71-day": "Nevada leve",
"71-night": "Light Snow",
"71-night": "Nieve ligera",
"73-day": "Nevada",
"73-night": "Snow",
"73-night": "Nieve",
"75-day": "Nevada intensa",
"75-night": "Heavy Snow",
"75-night": "Nieve intensa",
"77-day": "Granizada",
"77-night": "Snow Grains",
"77-night": "Granizada",
"80-day": "Llovizna",
"80-night": "Light Showers",
"80-night": "Chubascos ligeros",
"81-day": "Lluvia",
"81-night": "Showers",
"81-night": "Chubascos",
"82-day": "Lluvias torrenciales",
"82-night": "Heavy Showers",
"82-night": "Chubascos fuertes",
"85-day": "Lluvia de nieve",
"85-night": "Snow Showers",
"86-day": "Snow Showers",
"86-night": "Snow Showers",
"85-night": "Chubascos de nieve",
"86-day": "Chubascos de nieve",
"86-night": "Chubascos de nieve",
"95-day": "Tormenta",
"95-night": "Thunderstorm",
"95-night": "Tormenta",
"96-day": "Tormenta con granizo",
"96-night": "Thunderstorm With Hail",
"99-day": "Thunderstorm With Hail",
"99-night": "Thunderstorm With Hail"
"96-night": "Tormenta con granizo",
"99-day": "Tormenta con granizo",
"99-night": "Tormenta con granizo"
},
"homebridge": {
"available_update": "Sistema",
@@ -535,11 +535,11 @@
},
"healthchecks": {
"new": "Nuevo",
"up": "Up",
"up": "Activo",
"grace": "En Periodo de Gracia",
"down": "Down",
"down": "Inactivo",
"paused": "Pausado",
"status": "Status",
"status": "Estado",
"last_ping": "Último ping",
"never": "Aún no hay pings"
},
@@ -549,26 +549,26 @@
"containers_failed": "Fallido"
},
"autobrr": {
"approvedPushes": "Approved",
"approvedPushes": "Aprobado",
"rejectedPushes": "Rechazado",
"filters": "Filtros",
"indexers": "Indexers"
"indexers": "Indexadores"
},
"tubearchivist": {
"downloads": "Queue",
"downloads": "Cola",
"videos": "Videos",
"channels": "Canales",
"playlists": "Listas de reproducción"
},
"truenas": {
"load": "Carga del sistema",
"uptime": "Uptime",
"alerts": "Alerts"
"uptime": "Tiempo activo",
"alerts": "Alertas"
},
"pyload": {
"speed": "Velocidad",
"active": "Active",
"queue": "Queue",
"active": "Activo",
"queue": "Cola",
"total": "Total"
},
"gluetun": {
@@ -578,21 +578,21 @@
"port_forwarded": "Puerto redireccionado"
},
"hdhomerun": {
"channels": "Channels",
"channels": "Canales",
"hd": "Alta definición",
"tunerCount": "Sintonizadores",
"channelNumber": "Canal",
"channelNetwork": "Red",
"signalStrength": "Intensidad",
"signalQuality": "Calidad",
"symbolQuality": "Quality",
"networkRate": "Bitrate",
"symbolQuality": "Calidad",
"networkRate": "Tasa de bits",
"clientIP": "Cliente"
},
"scrutiny": {
"passed": "Aprobado",
"failed": "Failed",
"unknown": "Unknown"
"failed": "Fallido",
"unknown": "Desconocido"
},
"paperlessngx": {
"inbox": "Bandeja de entrada",
@@ -602,23 +602,23 @@
"battery_charge": "Carga de la batería",
"ups_load": "Carga del UPS",
"ups_status": "Estado del UPS",
"online": "Online",
"online": "En línea",
"on_battery": "Con batería",
"low_battery": "Batería baja"
},
"nextdns": {
"wait": "Please Wait",
"wait": "Por favor, espera",
"no_devices": "No se recibieron datos del dispositivo"
},
"mikrotik": {
"cpuLoad": "Carga de la CPU",
"memoryUsed": "Memoria utilizada",
"uptime": "Uptime",
"uptime": "Tiempo activo",
"numberOfLeases": "Alquileres"
},
"xteve": {
"streams_all": "Todas las transmisiones",
"streams_active": "Active Streams",
"streams_active": "Transmisiones activas",
"streams_xepg": "Canales XEPG"
},
"opendtu": {
@@ -628,7 +628,7 @@
"limit": "Límite"
},
"opnsense": {
"cpu": "CPU Load",
"cpu": "Carga de la CPU",
"memory": "Memoria activa",
"wanUpload": "Subida WAN",
"wanDownload": "Descarga WAN"
@@ -640,7 +640,7 @@
"layers": "Capas"
},
"octoprint": {
"printer_state": "Status",
"printer_state": "Estado",
"temp_tool": "Temperatura de la herramienta",
"temp_bed": "Temperatura de la plataforma",
"job_completion": "Finalización"
@@ -653,8 +653,8 @@
"load": "Promedio de carga",
"memory": "Uso de memoria",
"wanStatus": "Estado de la WAN",
"up": "Up",
"down": "Down",
"up": "Activo",
"down": "Inactivo",
"temp": "Temp",
"disk": "Uso del disco",
"wanIP": "IP de la WAN"
@@ -666,7 +666,7 @@
"memory_usage": "Memoria"
},
"immich": {
"users": "Users",
"users": "Usuarios",
"photos": "Fotos",
"videos": "Videos",
"storage": "Almacenamiento"
@@ -674,7 +674,7 @@
"uptimekuma": {
"up": "Sitios activos",
"down": "Sitios inactivos",
"uptime": "Uptime",
"uptime": "Tiempo activo",
"incident": "Incidencia",
"m": "m"
},
@@ -687,17 +687,17 @@
"komga": {
"libraries": "Librerías",
"series": "Series",
"books": "Books"
"books": "Libros"
},
"diskstation": {
"days": "Days",
"uptime": "Uptime",
"volumeAvailable": "Available"
"days": "Días",
"uptime": "Tiempo activo",
"volumeAvailable": "Disponible"
},
"mylar": {
"series": "Series",
"issues": "Números",
"wanted": "Wanted"
"wanted": "Buscando"
},
"photoprism": {
"albums": "Álbumes",
@@ -706,9 +706,9 @@
"people": "Personas"
},
"fileflows": {
"queue": "Queue",
"processing": "Processing",
"processed": "Processed",
"queue": "Cola",
"processing": "Procesando",
"processed": "Procesado",
"time": "Tiempo"
},
"firefly": {
@@ -730,11 +730,11 @@
"numshares": "Elementos compartidos"
},
"kopia": {
"status": "Status",
"status": "Estado",
"size": "Tamaño",
"lastrun": "Última ejecución",
"nextrun": "Siguiente ejecución",
"failed": "Failed"
"failed": "Fallido"
},
"unmanic": {
"active_workers": "Trabajadores activos",
@@ -751,20 +751,20 @@
"targets_total": "Objetivos totales"
},
"gatus": {
"up": "Sites Up",
"down": "Sites Down",
"uptime": "Uptime"
"up": "Sitios activos",
"down": "Sitios inactivos",
"uptime": "Tiempo activo"
},
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_today": "Hoy",
"gross_percent_1y": "Un año",
"gross_percent_max": "Todo el tiempo"
},
"audiobookshelf": {
"podcasts": "Podcasts",
"books": "Books",
"books": "Libros",
"podcastsDuration": "Duración",
"booksDuration": "Duration"
"booksDuration": "Duración"
},
"homeassistant": {
"people_home": "Personas en casa",
@@ -773,7 +773,7 @@
},
"whatsupdocker": {
"monitoring": "Monitorizando",
"updates": "Updates"
"updates": "Actualizaciones"
},
"calibreweb": {
"books": "Libros",
@@ -789,32 +789,32 @@
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
"totalFiles": "Archivos"
},
"azuredevops": {
"result": "Resultado",
"status": "Status",
"status": "Estado",
"buildId": "ID de compilación",
"succeeded": "Exitoso",
"notStarted": "No iniciado",
"failed": "Failed",
"failed": "Fallido",
"canceled": "Cancelado",
"inProgress": "En curso",
"totalPrs": "RP totales",
"myPrs": "Mis logros",
"approved": "Approved"
"totalPrs": "PRs totales",
"myPrs": "Mis PRs",
"approved": "Aprobado"
},
"gamedig": {
"status": "Status",
"online": "Online",
"offline": "Offline",
"status": "Estado",
"online": "En línea",
"offline": "Fuera de línea",
"name": "Nombre",
"map": "Mapa",
"currentPlayers": "Jugadores actuales",
"players": "Players",
"players": "Jugadores",
"maxPlayers": "Jugadores máximos",
"bots": "Bots",
"ping": "Ping"
"ping": "Latencia"
},
"urbackup": {
"ok": "OK",
@@ -824,42 +824,42 @@
},
"mealie": {
"recipes": "Recetas",
"users": "Users",
"categories": "Categories",
"users": "Usuarios",
"categories": "Categorías",
"tags": "Etiquetas"
},
"openmediavault": {
"downloading": "Descargando",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
"running": "Ejecutando",
"stopped": "Detenido",
"passed": "Aprobado",
"failed": "Fallido"
},
"openwrt": {
"uptime": "Uptime",
"uptime": "Tiempo activo",
"cpuLoad": "Carga promedio del CPU (5m)",
"up": "Up",
"down": "Down",
"up": "Activo",
"down": "Inactivo",
"bytesTx": "Transmitido",
"bytesRx": "Received"
"bytesRx": "Recibido"
},
"uptimerobot": {
"status": "Status",
"uptime": "Uptime",
"status": "Estado",
"uptime": "Tiempo activo",
"lastDown": "Último periodo de inactividad",
"downDuration": "Duración de inactividad",
"sitesUp": "Sites Up",
"sitesDown": "Sites Down",
"paused": "Paused",
"notyetchecked": "Aún no verificado",
"up": "Up",
"seemsdown": "Parece caída",
"down": "Down",
"unknown": "Unknown"
"sitesUp": "Sitios activos",
"sitesDown": "Sitios inactivos",
"paused": "Pausado",
"notyetchecked": "Aún no comprobado",
"up": "Activo",
"seemsdown": "Parece caído",
"down": "Inactivo",
"unknown": "Desconocido"
},
"calendar": {
"inCinemas": "En cine",
"inCinemas": "En cines",
"physicalRelease": "Lanzamiento en físico",
"digitalRelease": "Lanzamiento en digital",
"noEventsToday": "¡Sin eventos para hoy!",
@@ -875,10 +875,10 @@
"totalfilesize": "Tamaño total"
},
"mailcow": {
"domains": "Domains",
"domains": "Dominios",
"mailboxes": "Buzones de correo",
"mails": "Correos",
"storage": "Storage"
"storage": "Almacenamiento"
},
"netdata": {
"warnings": "Advertencias",
@@ -887,12 +887,12 @@
"plantit": {
"events": "Eventos",
"plants": "Plantas",
"photos": "Photos",
"photos": "Fotos",
"species": "Especies"
},
"gitea": {
"notifications": "Notificaciones",
"issues": "Issues",
"issues": "Incidencias",
"pulls": "Solicitudes de cambios",
"repositories": "Repositorios"
},
@@ -908,13 +908,13 @@
"galleries": "Galerías",
"performers": "Intérpretes",
"studios": "Estudios",
"movies": "Movies",
"tags": "Tags",
"movies": "Películas",
"tags": "Etiquetas",
"oCount": "Cantidad de O"
},
"tandoor": {
"users": "Users",
"recipes": "Recipes",
"users": "Usuarios",
"recipes": "Recetas",
"keywords": "Palabras clave"
},
"homebox": {
@@ -922,11 +922,11 @@
"totalWithWarranty": "Con garantía",
"locations": "Ubicaciones",
"labels": "Etiquetas",
"users": "Users",
"users": "Usuarios",
"totalValue": "Valor total"
},
"crowdsec": {
"alerts": "Alerts",
"alerts": "Alertas",
"bans": "Baneos"
},
"wgeasy": {
@@ -942,9 +942,9 @@
"banned": "Baneado"
},
"myspeed": {
"ping": "Ping",
"download": "Download",
"upload": "Upload"
"ping": "Latencia",
"download": "Descarga",
"upload": "Subida"
},
"stocks": {
"stocks": "Acciones",
@@ -955,17 +955,17 @@
},
"frigate": {
"cameras": "Cámaras",
"uptime": "Uptime",
"version": "Version"
"uptime": "Tiempo activo",
"version": "Versión"
},
"linkwarden": {
"links": "Enlaces",
"collections": "Colecciones",
"tags": "Tags"
"tags": "Etiquetas"
},
"zabbix": {
"unclassified": "No clasificado",
"information": "Information",
"information": "Información",
"warning": "Advertencia",
"average": "Promedio",
"high": "Alto",
@@ -986,22 +986,22 @@
"tasksInProgress": "Tareas en progreso"
},
"headscale": {
"name": "Name",
"address": "Address",
"last_seen": "Last Seen",
"status": "Status",
"online": "Online",
"offline": "Offline"
"name": "Nombre",
"address": "Dirección",
"last_seen": "Visto por última vez",
"status": "Estado",
"online": "En línea",
"offline": "Fuera de línea"
},
"beszel": {
"name": "Name",
"name": "Nombre",
"systems": "Sistemas",
"up": "Up",
"down": "Down",
"paused": "Paused",
"pending": "Pending",
"status": "Status",
"updated": "Updated",
"up": "Activo",
"down": "Inactivo",
"paused": "Pausado",
"pending": "Pendiente",
"status": "Estado",
"updated": "Actualizado",
"cpu": "CPU",
"memory": "MEM",
"disk": "Disco",
@@ -1011,26 +1011,26 @@
"apps": "Apps",
"synced": "Sincronizado",
"outOfSync": "Desincronizado",
"healthy": "Healthy",
"healthy": "Saludable",
"degraded": "Degradado",
"progressing": "Progresando",
"missing": "Missing",
"missing": "Faltantes",
"suspended": "Suspendido"
},
"spoolman": {
"loading": "Loading"
"loading": "Cargando"
},
"gitlab": {
"groups": "Grupos",
"issues": "Issues",
"issues": "Incidencias",
"merges": "Solicitudes de fusión",
"projects": "Proyectos"
},
"apcups": {
"status": "Status",
"load": "Load",
"bcharge": "Battery Charge",
"timeleft": "Time Left"
"status": "Estado",
"load": "Carga",
"bcharge": "Carga de la batería",
"timeleft": "Tiempo restante"
},
"karakeep": {
"bookmarks": "Marcadores",
@@ -1038,10 +1038,10 @@
"archived": "Archivado",
"highlights": "Destacados",
"lists": "Listas",
"tags": "Tags"
"tags": "Etiquetas"
},
"slskd": {
"slskStatus": "Network",
"slskStatus": "Red",
"connected": "Conectado",
"disconnected": "Desconectado",
"updateStatus": "Actualización",
@@ -1049,12 +1049,12 @@
"update_no": "Actualizado",
"downloads": "Descargas",
"uploads": "Subidas",
"sharedFiles": "Compartidos"
"sharedFiles": "Archivos"
},
"jellystat": {
"songs": "Songs",
"movies": "Movies",
"episodes": "Episodes",
"songs": "Canciones",
"movies": "Películas",
"episodes": "Episodios",
"other": "Otros"
},
"checkmk": {
@@ -1063,25 +1063,25 @@
},
"komodo": {
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"down": "Down",
"unhealthy": "Unhealthy",
"unknown": "Unknown",
"servers": "Servers",
"running": "En ejecución",
"stopped": "Detenido",
"down": "Inactivo",
"unhealthy": "En mal estado",
"unknown": "Desconocido",
"servers": "Servidores",
"stacks": "Stacks",
"containers": "Containers"
"containers": "Contenedores"
},
"filebrowser": {
"available": "Available",
"used": "Used",
"available": "Disponible",
"used": "Usado",
"total": "Total"
},
"wallos": {
"activeSubscriptions": "Subscriptions",
"thisMonthlyCost": "This Month",
"nextMonthlyCost": "Next Month",
"previousMonthlyCost": "Prev. Month",
"nextRenewingSubscription": "Next Payment"
"activeSubscriptions": "Suscripciones",
"thisMonthlyCost": "Este mes",
"nextMonthlyCost": "Próximo mes",
"previousMonthlyCost": "Mes anterior",
"nextRenewingSubscription": "Próximo pago"
}
}

View File

@@ -212,7 +212,7 @@
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
"seed": "Semear"
},
"qnap": {
"cpuUsage": "Utilização do CPU",
@@ -223,39 +223,39 @@
"invalid": "Inválido"
},
"deluge": {
"download": "Download",
"download": "Baixar",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
"seed": "Semear"
},
"develancacheui": {
"cachehitbytes": "Bytes de Acerto na Memória transitória",
"cachemissbytes": "Bytes de Falha de Memória transitória"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
"download": "Baixar",
"upload": "Envio de Dados",
"leech": "Sanguessuga",
"seed": "Semear"
},
"sonarr": {
"wanted": "Desejados",
"queued": "Em fila de espera",
"series": "Series",
"queue": "Queue",
"unknown": "Unknown"
"series": "Séries",
"queue": "Fila",
"unknown": "Desconhecido"
},
"radarr": {
"wanted": "Wanted",
"wanted": "Desejado",
"missing": "Em falta",
"queued": "Queued",
"movies": "Movies",
"queue": "Queue",
"unknown": "Unknown"
"queued": "Na Fila",
"movies": "Filmes",
"queue": "Fila",
"unknown": "Desconhecido"
},
"lidarr": {
"wanted": "Wanted",
"queued": "Queued",
"wanted": "Desejado",
"queued": "Na Fila",
"artists": "Artistas"
},
"readarr": {

View File

@@ -61,9 +61,9 @@
"wlan_devices": "Zariadenia WLAN",
"lan_users": "Použ. LAN",
"wlan_users": "Použ. WLAN",
"up": "UP",
"up": "BEŽÍ",
"down": "NEBEŽÍ",
"wait": "Please wait",
"wait": "Čakajte, prosím",
"empty_data": "Stav podsystému neznámy"
},
"docker": {
@@ -94,8 +94,8 @@
"error": "Chyba",
"response": "Odpoveď",
"down": "Down",
"up": "Up",
"not_available": "Not Available"
"up": "Beží",
"not_available": "Nedostupné"
},
"emby": {
"playing": "Prehrávané",
@@ -112,7 +112,7 @@
"offline_alt": "Offline",
"online": "Online",
"total": "Celkom",
"unknown": "Unknown"
"unknown": "Neznáme"
},
"evcc": {
"pv_power": "Produkcia",
@@ -141,11 +141,11 @@
"connectionStatusDisconnecting": "Odpájanie",
"connectionStatusDisconnected": "Odpojené",
"connectionStatusConnected": "Pripojené",
"uptime": "Uptime",
"uptime": "Dostupnosť",
"maxDown": "Max. sťahovanie",
"maxUp": "Max. nahrávanie",
"down": "Down",
"up": "Up",
"up": "Beží",
"received": "Prijaté",
"sent": "Odoslané",
"externalIPAddress": "Ext. IP",
@@ -189,7 +189,7 @@
"plex": {
"streams": "Aktívne vysielanie",
"albums": "Albumy",
"movies": "Movies",
"movies": "Filmov",
"tv": "Seriály"
},
"sabnzbd": {
@@ -199,18 +199,18 @@
},
"rutorrent": {
"active": "Aktívne",
"upload": "Upload",
"upload": "Nahrávanie",
"download": "Download"
},
"transmission": {
"download": "Download",
"upload": "Upload",
"upload": "Nahrávanie",
"leech": "Leech",
"seed": "Seed"
},
"qbittorrent": {
"download": "Download",
"upload": "Upload",
"upload": "Nahrávanie",
"leech": "Leech",
"seed": "Seed"
},
@@ -224,7 +224,7 @@
},
"deluge": {
"download": "Download",
"upload": "Upload",
"upload": "Nahrávanie",
"leech": "Leech",
"seed": "Seed"
},
@@ -234,7 +234,7 @@
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"upload": "Nahrávanie",
"leech": "Leech",
"seed": "Seed"
},
@@ -242,25 +242,25 @@
"wanted": "Žiadané",
"queued": "V poradí",
"series": "Series",
"queue": "Queue",
"unknown": "Unknown"
"queue": "Poradie",
"unknown": "Neznáme"
},
"radarr": {
"wanted": "Wanted",
"missing": "Chýbajúce",
"queued": "Queued",
"movies": "Movies",
"queue": "Queue",
"unknown": "Unknown"
"queued": "V poradí",
"movies": "Filmov",
"queue": "Poradie",
"unknown": "Neznáme"
},
"lidarr": {
"wanted": "Wanted",
"queued": "Queued",
"queued": "V poradí",
"artists": "Interpreti"
},
"readarr": {
"wanted": "Wanted",
"queued": "Queued",
"queued": "V poradí",
"books": "Knihy"
},
"bazarr": {
@@ -273,19 +273,19 @@
"available": "Dostupné"
},
"jellyseerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available"
"pending": "Čakajúce",
"approved": "Schválené",
"available": "Dostupné"
},
"overseerr": {
"pending": "Pending",
"pending": "Čakajúce",
"processing": "Spracovávané",
"approved": "Approved",
"available": "Available"
"approved": "Schválené",
"available": "Dostupné"
},
"netalertx": {
"total": "Total",
"connected": "Connected",
"total": "Celkom",
"connected": "Pripojené",
"new_devices": "Nové zariadenia",
"down_alerts": "Upozornenia o výpadkoch"
},
@@ -296,26 +296,26 @@
"gravity": "Gravity"
},
"adguard": {
"queries": "Queries",
"blocked": "Blocked",
"queries": "Požiadaviek",
"blocked": "Blokované",
"filtered": "Filtrované",
"latency": "Odozva"
},
"speedtest": {
"upload": "Upload",
"upload": "Nahrávanie",
"download": "Download",
"ping": "Ping"
"ping": "Odozva"
},
"portainer": {
"running": "Running",
"running": "Beží",
"stopped": "Zastavené",
"total": "Total"
"total": "Celkom"
},
"suwayomi": {
"download": "Downloaded",
"nondownload": "Non-Downloaded",
"read": "Read",
"unread": "Unread",
"unread": "Neprečítané",
"downloadedread": "Downloaded & Read",
"downloadedunread": "Downloaded & Unread",
"nondownloadedread": "Non-Downloaded & Read",
@@ -336,7 +336,7 @@
"ago": "Pred {{value}}"
},
"technitium": {
"totalQueries": "Queries",
"totalQueries": "Požiadaviek",
"totalNoError": "Success",
"totalServerFailure": "Failures",
"totalNxDomain": "NX Domains",
@@ -344,12 +344,12 @@
"totalAuthoritative": "Authoritative",
"totalRecursive": "Recursive",
"totalCached": "Cached",
"totalBlocked": "Blocked",
"totalBlocked": "Blokované",
"totalDropped": "Dropped",
"totalClients": "Klienti"
},
"tdarr": {
"queue": "Queue",
"queue": "Poradie",
"processed": "Spracované",
"errored": "Chybné",
"saved": "Uložené"
@@ -360,10 +360,10 @@
"middleware": "Midlvér"
},
"trilium": {
"version": "Version",
"version": "Verzia",
"notesCount": "Notes",
"dbSize": "Database Size",
"unknown": "Unknown"
"unknown": "Neznáme"
},
"navidrome": {
"nothing_streaming": "No Active Streams",
@@ -372,7 +372,7 @@
"npm": {
"enabled": "Povolené",
"disabled": "Zakázané",
"total": "Total"
"total": "Celkom"
},
"coinmarketcap": {
"configure": "Nastavte jednu alebo viac kryptomien na sledovanie",
@@ -389,7 +389,7 @@
"prowlarr": {
"enableIndexers": "Indexery",
"numberOfGrabs": "Zachytení",
"numberOfQueries": "Queries",
"numberOfQueries": "Požiadaviek",
"numberOfFailGrabs": "Neúspešné zachytenia",
"numberOfFailQueries": "Neúspešné dopyty"
},
@@ -404,48 +404,48 @@
"transferRate": "Rate"
},
"mastodon": {
"user_count": "Users",
"user_count": "Používateľov",
"status_count": "Príspevky",
"domain_count": "Domény"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"queued": "V poradí",
"series": "Series"
},
"minecraft": {
"players": "Hráči",
"version": "Verzia",
"status": "Status",
"status": "Stav",
"up": "Online",
"down": "Offline"
},
"miniflux": {
"read": "Prečítané",
"unread": "Unread"
"unread": "Neprečítané"
},
"authentik": {
"users": "Users",
"users": "Používateľov",
"loginsLast24H": "Prihlás. (24 hod.)",
"failedLoginsLast24H": "Neúspešné prihlás. (24 hod.)"
},
"proxmox": {
"mem": "MEM",
"mem": "RAM",
"cpu": "CPU",
"lxc": "LXC",
"vms": "Virtuálne stroje"
},
"glances": {
"cpu": "CPU",
"load": "Load",
"wait": "Please wait",
"load": "Záťaž",
"wait": "Čakajte, prosím",
"temp": "TEMP",
"_temp": "Teplota",
"warn": "Upozornení",
"uptime": "UP",
"total": "Total",
"free": "Free",
"used": "Used",
"uptime": "BEŽÍ",
"total": "Celkom",
"free": "Voľné",
"used": "Využité",
"days": "d",
"hours": "h",
"crit": "Kritické",
@@ -461,7 +461,7 @@
"search": "Hľadať",
"custom": "Vlastné",
"visit": "Navštíviť",
"url": "URL",
"url": "URL adresa",
"searchsuggestion": "Návrh"
},
"wmo": {
@@ -474,49 +474,49 @@
"3-day": "Oblačno",
"3-night": "Cloudy",
"45-day": "Hmlisto",
"45-night": "Foggy",
"48-day": "Foggy",
"48-night": "Foggy",
"45-night": "Hmlisto",
"48-day": "Hmlisto",
"48-night": "Hmlisto",
"51-day": "Mierne mrholenie",
"51-night": "Light Drizzle",
"53-day": "Mrholenie",
"53-night": "Drizzle",
"55-day": "Silné mrholenie",
"55-night": "Heavy Drizzle",
"55-night": "Silné mrholenie",
"56-day": "Mierne mrazivé mrholenie",
"56-night": "Light Freezing Drizzle",
"57-day": "Mrazivé mrholenie",
"57-night": "Freezing Drizzle",
"61-day": "Slabý dážď",
"61-night": "Light Rain",
"61-night": "Slabý dážď",
"63-day": "Dážď",
"63-night": "Rain",
"63-night": "Dážď",
"65-day": "Silný dážď",
"65-night": "Heavy Rain",
"65-night": "Silný dážď",
"66-day": "Mrazivý dážď",
"66-night": "Mrznúci dážď",
"67-day": "Mrznúci dážď",
"67-night": "Mrznúci dážď",
"71-day": "Mierne sneženie",
"71-night": "Light Snow",
"71-night": "Slabé sneženie",
"73-day": "Sneženie",
"73-night": "Snow",
"73-night": "Sneženie",
"75-day": "Silné sneženie",
"75-night": "Heavy Snow",
"75-night": "Husté sneženie",
"77-day": "Snehové vločky",
"77-night": "Snow Grains",
"80-day": "Mierne prehánky",
"80-night": "Light Showers",
"80-night": "Mierne prehánky",
"81-day": "Prehánky",
"81-night": "Showers",
"81-night": "Prehánky",
"82-day": "Silné prehánky",
"82-night": "Heavy Showers",
"82-night": "Silné prehánky",
"85-day": "Snehové prehánky",
"85-night": "Snow Showers",
"86-day": "Snow Showers",
"86-night": "Snow Showers",
"85-night": "Snehové prehánky",
"86-day": "Snehové prehánky",
"86-night": "Snehové prehánky",
"95-day": "Búrka",
"95-night": "Thunderstorm",
"95-night": "Búrka",
"96-day": "Búrka s krupobitím",
"96-night": "Thunderstorm With Hail",
"99-day": "Thunderstorm With Hail",
@@ -529,17 +529,17 @@
"up_to_date": "Aktuálny",
"child_bridges": "Podradené premostenia",
"child_bridges_status": "{{ok}}/{{total}}",
"up": "Up",
"pending": "Pending",
"up": "Beží",
"pending": "Čakajúce",
"down": "Down"
},
"healthchecks": {
"new": "Nový",
"up": "Up",
"up": "Beží",
"grace": "V dodatočnej lehote",
"down": "Down",
"paused": "Pozastavené",
"status": "Status",
"status": "Stav",
"last_ping": "Poslendný ping",
"never": "Zatiaľ žiadne ping-y"
},
@@ -549,27 +549,27 @@
"containers_failed": "Zlyhané"
},
"autobrr": {
"approvedPushes": "Approved",
"approvedPushes": "Schválené",
"rejectedPushes": "Odmietnuté",
"filters": "Filtre",
"indexers": "Indexers"
},
"tubearchivist": {
"downloads": "Queue",
"downloads": "Poradie",
"videos": "Videá",
"channels": "Kanály",
"playlists": "Playlisty"
},
"truenas": {
"load": "Záťaž systému",
"uptime": "Uptime",
"alerts": "Alerts"
"uptime": "Dostupnosť",
"alerts": "Upozornenia"
},
"pyload": {
"speed": "Rýchlosť",
"active": "Active",
"queue": "Queue",
"total": "Total"
"queue": "Poradie",
"total": "Celkom"
},
"gluetun": {
"public_ip": "Verejná IP",
@@ -585,18 +585,18 @@
"channelNetwork": "Sieť",
"signalStrength": "Sila",
"signalQuality": "Kvalita",
"symbolQuality": "Quality",
"symbolQuality": "Kvalita",
"networkRate": "Bitrate",
"clientIP": "Klient"
},
"scrutiny": {
"passed": "Úspešný",
"failed": "Failed",
"unknown": "Unknown"
"unknown": "Neznáme"
},
"paperlessngx": {
"inbox": "Schránka správ",
"total": "Total"
"total": "Celkom"
},
"peanut": {
"battery_charge": "Nabitie batérie",
@@ -607,13 +607,13 @@
"low_battery": "Slabá batéria"
},
"nextdns": {
"wait": "Please Wait",
"wait": "Čakajte, prosím",
"no_devices": "Informácie o zariadení nezískané"
},
"mikrotik": {
"cpuLoad": "Využitie CPU",
"memoryUsed": "Využitie pamäte",
"uptime": "Uptime",
"uptime": "Dostupnosť",
"numberOfLeases": "Pridelené adresy"
},
"xteve": {
@@ -628,7 +628,7 @@
"limit": "Limit"
},
"opnsense": {
"cpu": "CPU Load",
"cpu": "Zátaž procesora",
"memory": "Aktívna pamäť",
"wanUpload": "WAN nahrávanie",
"wanDownload": "WAN sťahovanie"
@@ -640,20 +640,20 @@
"layers": "Vrstvy"
},
"octoprint": {
"printer_state": "Status",
"printer_state": "Stav",
"temp_tool": "Teplota extrudéra",
"temp_bed": "Teplota podložky",
"job_completion": "Priebeh"
},
"cloudflared": {
"origin_ip": "Zdrojová IP",
"status": "Status"
"status": "Stav"
},
"pfsense": {
"load": "Priemerné zaťaženie",
"memory": "Využitie pamäte",
"wanStatus": "Stav WAN",
"up": "Up",
"up": "Beží",
"down": "Down",
"temp": "Temp",
"disk": "Využitie disku",
@@ -666,15 +666,15 @@
"memory_usage": "Pamäť"
},
"immich": {
"users": "Users",
"photos": "Fotografie",
"videos": "Videos",
"users": "Používateľov",
"photos": "Fotografií",
"videos": "Videí",
"storage": "Úložisko"
},
"uptimekuma": {
"up": "Weby dostupné",
"down": "Weby nedostupné",
"uptime": "Uptime",
"uptime": "Dostupnosť",
"incident": "Udalosť",
"m": "m"
},
@@ -691,8 +691,8 @@
},
"diskstation": {
"days": "Days",
"uptime": "Uptime",
"volumeAvailable": "Available"
"uptime": "Dostupnosť",
"volumeAvailable": "Dostupné"
},
"mylar": {
"series": "Series",
@@ -700,15 +700,15 @@
"wanted": "Wanted"
},
"photoprism": {
"albums": "Albums",
"photos": "Photos",
"videos": "Videos",
"albums": "Albumov",
"photos": "Fotografií",
"videos": "Videí",
"people": "Ľudia"
},
"fileflows": {
"queue": "Queue",
"queue": "Poradie",
"processing": "Processing",
"processed": "Processed",
"processed": "Spracované",
"time": "Čas"
},
"firefly": {
@@ -730,7 +730,7 @@
"numshares": "Zdieľané položky"
},
"kopia": {
"status": "Status",
"status": "Stav",
"size": "Veľkosť",
"lastrun": "Naposledy spustené",
"nextrun": "Nasledujúce spustenie",
@@ -753,10 +753,10 @@
"gatus": {
"up": "Sites Up",
"down": "Sites Down",
"uptime": "Uptime"
"uptime": "Dostupnosť"
},
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_today": "Dnes",
"gross_percent_1y": "Jeden rok",
"gross_percent_max": "Za celý čas"
},
@@ -778,22 +778,22 @@
"calibreweb": {
"books": "Books",
"authors": "Autori",
"categories": "Categories",
"categories": "Kategórie",
"series": "Series"
},
"jdownloader": {
"downloadCount": "Queue",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size",
"downloadCount": "Poradie",
"downloadBytesRemaining": "Zostávajúce",
"downloadTotalBytes": "Veľkosť",
"downloadSpeed": "Speed"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
"totalFiles": "Súborov"
},
"azuredevops": {
"result": "Výsledok",
"status": "Status",
"status": "Stav",
"buildId": "ID zostavy",
"succeeded": "Úspešný",
"notStarted": "Nespustený",
@@ -802,10 +802,10 @@
"inProgress": "Prebieha",
"totalPrs": "Počet PR-ok",
"myPrs": "Moje PR-ka",
"approved": "Approved"
"approved": "Schválené"
},
"gamedig": {
"status": "Status",
"status": "Stav",
"online": "Online",
"offline": "Offline",
"name": "Meno",
@@ -814,7 +814,7 @@
"players": "Players",
"maxPlayers": "Maximálny počet hráčov",
"bots": "Boti",
"ping": "Ping"
"ping": "Odozva"
},
"urbackup": {
"ok": "Ok",
@@ -824,39 +824,39 @@
},
"mealie": {
"recipes": "Recepty",
"users": "Users",
"categories": "Categories",
"users": "Používateľov",
"categories": "Kategórie",
"tags": "Štítky"
},
"openmediavault": {
"downloading": "Sťahovanie",
"total": "Total",
"running": "Running",
"total": "Celkom",
"running": "Beží",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"openwrt": {
"uptime": "Uptime",
"uptime": "Dostupnosť",
"cpuLoad": "Záťaž CPU priem. (5m)",
"up": "Up",
"up": "Beží",
"down": "Down",
"bytesTx": "Prenesených",
"bytesRx": "Received"
"bytesRx": "Prijaté"
},
"uptimerobot": {
"status": "Status",
"uptime": "Uptime",
"status": "Stav",
"uptime": "Dostupnosť",
"lastDown": "Posledný čas nedostupnosti",
"downDuration": "Trvanie nedostupnosti",
"sitesUp": "Sites Up",
"sitesDown": "Sites Down",
"paused": "Paused",
"paused": "Pozastavené",
"notyetchecked": "Neskontrolované",
"up": "Up",
"up": "Beží",
"seemsdown": "Javí sa nedostupný",
"down": "Down",
"unknown": "Unknown"
"unknown": "Neznáme"
},
"calendar": {
"inCinemas": "V kinách",
@@ -872,13 +872,13 @@
"saves": "Saves",
"states": "States",
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
"totalfilesize": "Celková veľkosť"
},
"mailcow": {
"domains": "Domains",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Storage"
"storage": "Úložisko"
},
"netdata": {
"warnings": "Upozornenia",
@@ -887,7 +887,7 @@
"plantit": {
"events": "Udalosti",
"plants": "Rastliny",
"photos": "Photos",
"photos": "Fotografií",
"species": "Druhy"
},
"gitea": {
@@ -908,13 +908,13 @@
"galleries": "Galérie",
"performers": "Herci",
"studios": "Štúdiá",
"movies": "Movies",
"tags": "Tags",
"movies": "Filmov",
"tags": "Štítky",
"oCount": "O Count"
},
"tandoor": {
"users": "Users",
"recipes": "Recipes",
"users": "Používateľov",
"recipes": "Recepty",
"keywords": "Kľúčové slová"
},
"homebox": {
@@ -922,18 +922,18 @@
"totalWithWarranty": "So zárukou",
"locations": "Umiestnenia",
"labels": "Štítky",
"users": "Users",
"users": "Používateľov",
"totalValue": "Celková hodnota"
},
"crowdsec": {
"alerts": "Alerts",
"alerts": "Upozornenia",
"bans": "Bany"
},
"wgeasy": {
"connected": "Connected",
"connected": "Pripojené",
"enabled": "Enabled",
"disabled": "Disabled",
"total": "Total"
"total": "Celkom"
},
"swagdashboard": {
"proxied": "Proxied",
@@ -942,26 +942,26 @@
"banned": "Zabanovaný"
},
"myspeed": {
"ping": "Ping",
"ping": "Odozva",
"download": "Download",
"upload": "Upload"
"upload": "Nahrávanie"
},
"stocks": {
"stocks": "Stocks",
"loading": "Loading",
"loading": "Načítava sa",
"open": "Open - US Market",
"closed": "Closed - US Market",
"invalidConfiguration": "Invalid Configuration"
},
"frigate": {
"cameras": "Cameras",
"uptime": "Uptime",
"version": "Version"
"uptime": "Dostupnosť",
"version": "Verzia"
},
"linkwarden": {
"links": "Links",
"links": "Odkazy",
"collections": "Collections",
"tags": "Tags"
"tags": "Štítky"
},
"zabbix": {
"unclassified": "Not classified",
@@ -972,38 +972,38 @@
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"vehicle": "Vozidlo",
"vehicles": "Vozidlá",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
"none": "Žiadne"
},
"vikunja": {
"projects": "Active Projects",
"projects": "Aktívne projekty",
"tasks7d": "Tasks Due This Week",
"tasksOverdue": "Overdue Tasks",
"tasksInProgress": "Tasks In Progress"
},
"headscale": {
"name": "Name",
"address": "Address",
"address": "Adresa",
"last_seen": "Last Seen",
"status": "Status",
"status": "Stav",
"online": "Online",
"offline": "Offline"
},
"beszel": {
"name": "Name",
"systems": "Systems",
"up": "Up",
"up": "Beží",
"down": "Down",
"paused": "Paused",
"pending": "Pending",
"status": "Status",
"paused": "Pozastavené",
"pending": "Čakajúce",
"status": "Stav",
"updated": "Updated",
"cpu": "CPU",
"memory": "MEM",
"memory": "RAM",
"disk": "Disk",
"network": "NET"
},
@@ -1011,14 +1011,14 @@
"apps": "Apps",
"synced": "Synced",
"outOfSync": "Out Of Sync",
"healthy": "Healthy",
"healthy": "Zdravý",
"degraded": "Degraded",
"progressing": "Progressing",
"missing": "Missing",
"suspended": "Suspended"
},
"spoolman": {
"loading": "Loading"
"loading": "Načítava sa"
},
"gitlab": {
"groups": "Groups",
@@ -1027,8 +1027,8 @@
"projects": "Projects"
},
"apcups": {
"status": "Status",
"load": "Load",
"status": "Stav",
"load": "Záťaž",
"bcharge": "Battery Charge",
"timeleft": "Time Left"
},
@@ -1037,45 +1037,45 @@
"favorites": "Favorites",
"archived": "Archived",
"highlights": "Highlights",
"lists": "Lists",
"tags": "Tags"
"lists": "Zoznamy",
"tags": "Štítky"
},
"slskd": {
"slskStatus": "Network",
"connected": "Connected",
"disconnected": "Disconnected",
"connected": "Pripojené",
"disconnected": "Odpojené",
"updateStatus": "Update",
"update_yes": "Available",
"update_yes": "Dostupné",
"update_no": "Up to Date",
"downloads": "Downloads",
"uploads": "Uploads",
"sharedFiles": "Files"
},
"jellystat": {
"songs": "Songs",
"movies": "Movies",
"episodes": "Episodes",
"other": "Other"
"songs": "Skladieb",
"movies": "Filmov",
"episodes": "Epizód",
"other": "Ostatné"
},
"checkmk": {
"serviceErrors": "Service issues",
"hostErrors": "Host issues"
},
"komodo": {
"total": "Total",
"running": "Running",
"total": "Celkom",
"running": "Beží",
"stopped": "Stopped",
"down": "Down",
"unhealthy": "Unhealthy",
"unknown": "Unknown",
"unhealthy": "Nezdravý",
"unknown": "Neznáme",
"servers": "Servers",
"stacks": "Stacks",
"containers": "Containers"
},
"filebrowser": {
"available": "Available",
"used": "Used",
"total": "Total"
"available": "Dostupné",
"used": "Využité",
"total": "Celkom"
},
"wallos": {
"activeSubscriptions": "Subscriptions",

View File

@@ -37,12 +37,12 @@ export default function Container({ error = false, children, service }) {
if (!field.includes(".")) {
fullField = `${type}.${field}`;
}
let matches = fullField === child?.props?.label;
let matches = fullField === (child?.props?.field || child?.props?.label);
// check if the field is an 'alias'
if (matches) {
return true;
} else if (ALIASED_WIDGETS[type]) {
matches = fullField.replace(type, ALIASED_WIDGETS[type]) === child?.props?.label;
matches = fullField.replace(type, ALIASED_WIDGETS[type]) === (child?.props?.field || child?.props?.label);
return matches;
}

View File

@@ -1,5 +1,3 @@
import { existsSync } from "fs";
import createLogger from "utils/logger";
const logger = createLogger("resources");
@@ -20,17 +18,20 @@ export default async function handler(req, res) {
}
if (type === "disk") {
if (!existsSync(target)) {
return res.status(404).json({
error: "Target not found",
});
}
const requested = typeof target === "string" && target ? target : "/";
const fsSize = await si.fsSize();
logger.debug("fsSize:", JSON.stringify(fsSize));
return res.status(200).json({
drive: fsSize.find((fs) => fs.mount === target) ?? fsSize.find((fs) => fs.mount === "/"),
const drive = fsSize.find((fs) => {
return fs.mount === requested;
});
if (!drive) {
logger.warn(`Drive not found for target: ${requested}`);
return res.status(404).json({ error: "Resource not available." });
}
return res.status(200).json({ drive });
}
if (type === "memory") {

View File

@@ -308,7 +308,7 @@ export function cleanServiceGroups(groups) {
// gamedig
gameToken,
// beszel, glances, immich, komga, mealie, pihole, pfsense, speedtest
// authentik, beszel, glances, immich, komga, mealie, pihole, pfsense, speedtest
version,
// glances
@@ -396,6 +396,12 @@ export function cleanServiceGroups(groups) {
// unifi
site,
// unraid
pool1,
pool2,
pool3,
pool4,
// vikunja
enableTaskList,
@@ -518,6 +524,7 @@ export function cleanServiceGroups(groups) {
}
if (
[
"authentik",
"beszel",
"glances",
"immich",
@@ -610,6 +617,12 @@ export function cleanServiceGroups(groups) {
if (type === "grafana") {
if (alerts) widget.alerts = alerts;
}
if (type === "unraid") {
if (pool1) widget.pool1 = pool1;
if (pool2) widget.pool2 = pool2;
if (pool3) widget.pool3 = pool3;
if (pool4) widget.pool4 = pool4;
}
return widget;
});
return cleanedService;

View File

@@ -10,8 +10,12 @@ export default function Component({ service }) {
const { widget } = service;
const { data: usersData, error: usersError } = useWidgetAPI(widget, "users");
const { data: loginsData, error: loginsError } = useWidgetAPI(widget, "login");
const { data: failedLoginsData, error: failedLoginsError } = useWidgetAPI(widget, "login_failed");
const loginsEndpoint = widget.version === 2 ? "loginv2" : "login";
const { data: loginsData, error: loginsError } = useWidgetAPI(widget, loginsEndpoint);
const failedLoginsEndpoint = widget.version === 2 ? "login_failedv2" : "login_failed";
const { data: failedLoginsData, error: failedLoginsError } = useWidgetAPI(widget, failedLoginsEndpoint);
if (usersError || loginsError || failedLoginsError) {
const finalError = usersError ?? loginsError ?? failedLoginsError;
@@ -28,15 +32,25 @@ export default function Component({ service }) {
);
}
const yesterday = new Date(Date.now()).setHours(-24);
const loginsLast24H = loginsData.reduce(
(total, current) => (current.x_cord >= yesterday ? total + current.y_cord : total),
0,
);
const failedLoginsLast24H = failedLoginsData.reduce(
(total, current) => (current.x_cord >= yesterday ? total + current.y_cord : total),
0,
);
let loginsLast24H;
let failedLoginsLast24H;
switch (widget.version) {
case 1:
const yesterday = new Date(Date.now()).setHours(-24);
loginsLast24H = loginsData.reduce(
(total, current) => (current.x_cord >= yesterday ? total + current.y_cord : total),
0,
);
failedLoginsLast24H = failedLoginsData.reduce(
(total, current) => (current.x_cord >= yesterday ? total + current.y_cord : total),
0,
);
break;
case 2:
loginsLast24H = loginsData[0]?.count || 0;
failedLoginsLast24H = failedLoginsData[0]?.count || 0;
break;
}
return (
<Container service={service}>

View File

@@ -11,9 +11,15 @@ const widget = {
login: {
endpoint: "events/events/per_month/?action=login",
},
loginv2: {
endpoint: "events/events/volume/?action=login&&history_days=1",
},
login_failed: {
endpoint: "events/events/per_month/?action=login_failed",
},
login_failedv2: {
endpoint: "events/events/volume/?action=login_failed&&history_days=1",
},
},
};

View File

@@ -139,6 +139,7 @@ const components = {
truenas: dynamic(() => import("./truenas/component")),
unifi: dynamic(() => import("./unifi/component")),
unmanic: dynamic(() => import("./unmanic/component")),
unraid: dynamic(() => import("./unraid/component")),
uptimekuma: dynamic(() => import("./uptimekuma/component")),
uptimerobot: dynamic(() => import("./uptimerobot/component")),
urbackup: dynamic(() => import("./urbackup/component")),

View File

@@ -35,15 +35,17 @@ export default function Component({ service }) {
// broken by evcc v0.133.0 https://github.com/evcc-io/evcc/commit/9dcb1fa0a7c08dd926b79309aa1f676a5fc6c8aa
const gridPower = data.gridPower ?? data.grid?.power ?? 0;
// Sum chargePower of all loadpoints
const totalChargePower = Array.isArray(data.loadpoints)
? data.loadpoints.reduce((sum, lp) => sum + (lp.chargePower ?? 0), 0)
: 0;
return (
<Container service={service}>
<Block label="evcc.pv_power" value={`${toKilowatts(t, data.pvPower)} ${t("evcc.kilowatt")}`} />
<Block label="evcc.grid_power" value={`${toKilowatts(t, gridPower)} ${t("evcc.kilowatt")}`} />
<Block label="evcc.home_power" value={`${toKilowatts(t, data.homePower)} ${t("evcc.kilowatt")}`} />
<Block
label="evcc.charge_power"
value={`${toKilowatts(t, data.loadpoints[0].chargePower)} ${t("evcc.kilowatt")}`}
/>
<Block label="evcc.charge_power" value={`${toKilowatts(t, totalChargePower)} ${t("evcc.kilowatt")}`} />
</Container>
);
}

View File

@@ -0,0 +1,93 @@
import Block from "components/services/widget/block";
import Container from "components/services/widget/container";
import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
const UNRAID_DEFAULT_FIELDS = ["status", "cpu", "memoryPercent", "notifications"];
const MAX_ALLOWED_FIELDS = 4;
const POOLS = ["pool1", "pool2", "pool3", "pool4"];
const POOL_FIELDS = [
{ param: "UsedSpace", label: "poolUsed", valueKey: "fsUsed", valueType: "common.bytes" },
{ param: "FreeSpace", label: "poolFree", valueKey: "fsFree", valueType: "common.bytes" },
{ param: "UsedPercent", label: "poolUsed", valueKey: "fsUsedPercent", valueType: "common.percent" },
];
export default function Component({ service }) {
const { t } = useTranslation();
const { widget } = service;
const { data, error } = useWidgetAPI(widget);
if (error) {
return <Container service={service} error={error} />;
}
if (!widget.fields?.length) {
widget.fields = UNRAID_DEFAULT_FIELDS;
} else if (widget.fields.length > MAX_ALLOWED_FIELDS) {
widget.fields = widget.fields.slice(0, MAX_ALLOWED_FIELDS);
}
if (!data) {
return (
<Container service={service}>
<Block label="unraid.status" />
<Block label="unraid.memoryAvailable" />
<Block label="unraid.memoryUsed" />
<Block field="unraid.memoryPercent" label="unraid.memoryUsed" />
<Block label="unraid.cpu" />
<Block label="unraid.notifications" />
<Block field="unraid.arrayUsedSpace" label="unraid.arrayUsed" />
<Block field="unraid.arrayFree" label="unraid.arrayFree" />
<Block field="unraid.arrayUsedPercent" label="unraid.arrayUsed" />
{...POOLS.flatMap((pool) =>
POOL_FIELDS.map(({ param, label }) => (
<Block
key={`${pool}-${param}`}
field={`unraid.${pool}${param}`}
label={t(`unraid.${label}`, { pool: widget?.[pool] || pool })}
/>
)),
)}
</Container>
);
}
return (
<Container service={service}>
<Block label="unraid.status" value={t(`unraid.${data.arrayState}`)} />
<Block label="unraid.memoryAvailable" value={t("common.bbytes", { value: data.memoryAvailable })} />
<Block label="unraid.memoryUsed" value={t("common.bbytes", { value: data.memoryUsed })} />
<Block
field="unraid.memoryPercent"
label="unraid.memoryUsed"
value={t("common.percent", { value: data.memoryUsedPercent })}
/>
<Block label="unraid.cpu" value={t("common.percent", { value: data.cpuPercent })} />
<Block label="unraid.notifications" value={t("common.number", { value: data.unreadNotifications })} />
<Block
field="unraid.arrayUsedSpace"
label="unraid.arrayUsed"
value={t("common.bytes", { value: data.arrayUsed })}
/>
<Block label="unraid.arrayFree" value={t("common.bytes", { value: data.arrayFree })} />
<Block
field="unraid.arrayUsedPercent"
label="unraid.arrayUsed"
value={t("common.percent", { value: data.arrayUsedPercent })}
/>
{...POOLS.flatMap((pool) =>
POOL_FIELDS.map(({ param, label, valueKey, valueType }) => (
<Block
key={`${pool}-${param}`}
field={`unraid.${pool}${param}`}
label={t(`unraid.${label}`, { pool: widget?.[pool] || pool })}
value={t(valueType, { value: data.caches?.[widget?.[pool]]?.[valueKey] || "-" })}
/>
)),
)}
</Container>
);
}

138
src/widgets/unraid/proxy.js Normal file
View File

@@ -0,0 +1,138 @@
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
import { asJson } from "utils/proxy/api-helpers";
import { httpProxy } from "utils/proxy/http";
const logger = createLogger("unraidProxyHandler");
const graphqlQuery = `
{
array {
state
capacity {
kilobytes {
free
total
used
}
}
caches {
name
fsType
fsSize
fsFree
fsUsed
}
}
metrics {
memory {
active
available
percentTotal
}
cpu {
percentTotal
}
}
notifications {
overview {
unread {
total
}
}
}
}
`;
function processUnraidResponse(data) {
const response = {};
try {
data = asJson(data)?.data;
response["memoryUsedPercent"] = data?.metrics?.memory?.percentTotal ?? null;
response["memoryUsed"] = data?.metrics?.memory?.active ?? null;
response["memoryAvailable"] = data?.metrics?.memory?.available ?? null;
response["cpuPercent"] = data?.metrics?.cpu?.percentTotal ?? null;
response["unreadNotifications"] = data?.notifications?.overview?.unread?.total ?? null;
response["arrayState"] = data?.array?.state ?? null;
response["arrayFree"] = data?.array?.capacity?.kilobytes?.free * 1000 ?? null;
response["arrayUsed"] = data?.array?.capacity?.kilobytes?.used * 1000 ?? null;
response["arrayUsedPercent"] =
(data?.array?.capacity?.kilobytes?.used / data?.array?.capacity?.kilobytes?.total) * 100 ?? null;
response["caches"] = {};
if (data?.array?.caches) {
data.array.caches.forEach((cache) => {
if (cache.fsType) {
response.caches[cache.name] = {
fsFree: cache.fsFree * 1000,
fsUsed: cache.fsUsed * 1000,
fsUsedPercent: (cache.fsUsed / cache.fsSize) * 100 ?? null,
};
}
});
}
} catch (error) {
return { error: error.message };
}
return response;
}
export default async function unraidProxyHandler(req, res) {
const { group, service, index } = req.query;
if (!group || !service) {
logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
return res.status(400).json({ error: "Invalid proxy service type" });
}
const widget = await getServiceWidget(group, service, index);
if (!widget) {
logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
return res.status(400).json({ error: "Invalid proxy service type" });
}
const url = new URL(widget.url + "/graphql");
const headers = {
"Content-Type": "application/json",
Accept: `application/json`,
"X-API-Key": `${widget.key}`,
};
const params = {
method: "POST",
headers,
};
params.body = JSON.stringify({
query: graphqlQuery,
});
const [status, , data] = await httpProxy(url, params);
if (status === 204 || status === 304) {
return res.status(status).end();
}
if (status !== 200) {
logger.error(
"Error getting data from Unraid for service '%s' in group '%s': %d. Data: %s",
service,
group,
status,
data,
);
return res.status(status).send({ error: { message: "Error calling Unraid API.", data } });
}
const result = processUnraidResponse(data);
if (result.error) {
logger.error("Error processing Unraid data: %s", result.error);
return res.status(500).json({ error: result.error });
}
res.setHeader("Content-Type", "application/json");
return res.status(status).send(result);
}

View File

@@ -0,0 +1,7 @@
import unraidProxyHandler from "./proxy";
const widget = {
proxyHandler: unraidProxyHandler,
};
export default widget;

View File

@@ -130,6 +130,7 @@ import truenas from "./truenas/widget";
import tubearchivist from "./tubearchivist/widget";
import unifi from "./unifi/widget";
import unmanic from "./unmanic/widget";
import unraid from "./unraid/widget";
import uptimekuma from "./uptimekuma/widget";
import uptimerobot from "./uptimerobot/widget";
import urbackup from "./urbackup/widget";
@@ -278,6 +279,7 @@ const widgets = {
unifi,
unifi_console: unifi,
unmanic,
unraid,
uptimekuma,
uptimerobot,
urbackup,