Merge branch 'benphelps:main' into main

This commit is contained in:
Karl0ss 2023-07-23 14:57:07 +01:00 committed by GitHub
commit 3760b030a9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
72 changed files with 1769 additions and 569 deletions

View File

@ -141,7 +141,8 @@
"playing": "يشتغل", "playing": "يشتغل",
"transcoding": "التحويل", "transcoding": "التحويل",
"bitrate": "معدل البت", "bitrate": "معدل البت",
"no_active": "No Active Streams" "no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "معدل", "rate": "معدل",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -89,7 +89,8 @@
"playing": "Възпроизвежда", "playing": "Възпроизвежда",
"transcoding": "Конвертира", "transcoding": "Конвертира",
"bitrate": "Честота", "bitrate": "Честота",
"no_active": "Няма активни потоци" "no_active": "Няма активни потоци",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "Rate", "rate": "Rate",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -80,7 +80,8 @@
"playing": "Reproduint", "playing": "Reproduint",
"transcoding": "Transcodificant", "transcoding": "Transcodificant",
"bitrate": "Taxa de bits", "bitrate": "Taxa de bits",
"no_active": "Sense transmissions actives" "no_active": "Sense transmissions actives",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "Taxa", "rate": "Taxa",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -46,8 +46,8 @@
}, },
"unifi": { "unifi": {
"users": "Uživatelé", "users": "Uživatelé",
"uptime": "Doba provozu systému", "uptime": "Doba provozu",
"days": "Dnů", "days": "dní",
"wan": "WAN", "wan": "WAN",
"lan": "LAN", "lan": "LAN",
"wlan": "WLAN", "wlan": "WLAN",
@ -56,8 +56,8 @@
"wlan_devices": "Zařízení WLAN", "wlan_devices": "Zařízení WLAN",
"lan_users": "Uživatelé LAN", "lan_users": "Uživatelé LAN",
"wlan_users": "Uživatelé WLAN", "wlan_users": "Uživatelé WLAN",
"up": "BĚŽÍ", "up": "FUNKČNÍ",
"down": "NEBĚŽÍ", "down": "NEFUNKČNÍ",
"wait": "Počkejte prosím", "wait": "Počkejte prosím",
"empty_data": "Stav podsystému neznámý" "empty_data": "Stav podsystému neznámý"
}, },
@ -95,7 +95,8 @@
"playing": "Přehrává", "playing": "Přehrává",
"transcoding": "Překódovávání", "transcoding": "Překódovávání",
"bitrate": "Přenosová rychlost", "bitrate": "Přenosová rychlost",
"no_active": "Žádný aktivní stream" "no_active": "Žádný aktivní stream",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "Rychlost", "rate": "Rychlost",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -234,7 +234,8 @@
"playing": "Afspiller", "playing": "Afspiller",
"transcoding": "Transcoder", "transcoding": "Transcoder",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "Ingen Aktive Streams" "no_active": "Ingen Aktive Streams",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "Rate", "rate": "Rate",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -56,7 +56,8 @@
"playing": "Spielen", "playing": "Spielen",
"transcoding": "Transcodierung", "transcoding": "Transcodierung",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "Keine aktiven Streams" "no_active": "Keine aktiven Streams",
"plex_connection_error": "Check Plex Connection"
}, },
"rutorrent": { "rutorrent": {
"active": "Aktiv", "active": "Aktiv",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -162,7 +162,8 @@
"playing": "Αναπαράγει", "playing": "Αναπαράγει",
"transcoding": "Μετακωδικοποίηση", "transcoding": "Μετακωδικοποίηση",
"bitrate": "Ρυθμός bit", "bitrate": "Ρυθμός bit",
"no_active": "Δεν υπάρχουν ενεργές ροές" "no_active": "Δεν υπάρχουν ενεργές ροές",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "Ρυθμός", "rate": "Ρυθμός",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -129,7 +129,8 @@
"playing": "Playing", "playing": "Playing",
"transcoding": "Transcoding", "transcoding": "Transcoding",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "No Active Streams" "no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
}, },
"omada": { "omada": {
"connectedAp": "Connected APs", "connectedAp": "Connected APs",
@ -663,5 +664,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -87,7 +87,8 @@
"playing": "Playing", "playing": "Playing",
"transcoding": "Transcoding", "transcoding": "Transcoding",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "No Active Streams" "no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "Rate", "rate": "Rate",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -56,7 +56,8 @@
"playing": "Reproduciendo", "playing": "Reproduciendo",
"transcoding": "Transcodificando", "transcoding": "Transcodificando",
"bitrate": "Tasa de bits", "bitrate": "Tasa de bits",
"no_active": "Sin transmisiones activas" "no_active": "Sin transmisiones activas",
"plex_connection_error": "Comprueba la conexión a Plex"
}, },
"rutorrent": { "rutorrent": {
"active": "Activo", "active": "Activo",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Serie", "seriesCount": "Serie",
"totalFiles": "Archivos" "totalFiles": "Archivos"
},
"azurePipelines": {
"result": "Resultado",
"status": "Estado",
"buildId": "ID de la compilación",
"succeeded": "Con éxito",
"notStarted": "No iniciado",
"failed": "Fallido",
"canceled": "Cancelado",
"inProgress": "En proceso"
} }
} }

View File

@ -0,0 +1,669 @@
{
"wmo": {
"95-night": "Thunderstorm",
"96-day": "Thunderstorm With Hail",
"96-night": "Thunderstorm With Hail",
"99-day": "Thunderstorm With Hail",
"0-day": "Sunny",
"0-night": "Clear",
"1-day": "Mainly Sunny",
"1-night": "Mainly Clear",
"2-day": "Partly Cloudy",
"2-night": "Partly Cloudy",
"3-day": "Cloudy",
"3-night": "Cloudy",
"45-day": "Foggy",
"45-night": "Foggy",
"48-day": "Foggy",
"48-night": "Foggy",
"51-day": "Light Drizzle",
"51-night": "Light Drizzle",
"53-day": "Drizzle",
"53-night": "Drizzle",
"55-day": "Heavy Drizzle",
"55-night": "Heavy Drizzle",
"56-day": "Light Freezing Drizzle",
"56-night": "Light Freezing Drizzle",
"57-day": "Freezing Drizzle",
"57-night": "Freezing Drizzle",
"61-day": "Light Rain",
"61-night": "Light Rain",
"63-day": "Rain",
"63-night": "Rain",
"65-day": "Heavy Rain",
"65-night": "Heavy Rain",
"66-day": "Freezing Rain",
"66-night": "Freezing Rain",
"67-day": "Freezing Rain",
"67-night": "Freezing Rain",
"71-day": "Light Snow",
"71-night": "Light Snow",
"73-day": "Snow",
"73-night": "Snow",
"75-day": "Heavy Snow",
"75-night": "Heavy Snow",
"77-day": "Snow Grains",
"77-night": "Snow Grains",
"80-day": "Light Showers",
"80-night": "Light Showers",
"81-day": "Showers",
"81-night": "Showers",
"82-day": "Heavy Showers",
"82-night": "Heavy Showers",
"85-day": "Snow Showers",
"85-night": "Snow Showers",
"86-day": "Snow Showers",
"86-night": "Snow Showers",
"95-day": "Thunderstorm",
"99-night": "Thunderstorm With Hail"
},
"homebridge": {
"updates": "Updates",
"available_update": "System",
"update_available": "Update Available",
"up_to_date": "Up to Date",
"child_bridges": "Child Bridges",
"child_bridges_status": "{{ok}}/{{total}}",
"up": "Up",
"pending": "Pending",
"down": "Down"
},
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"widget": {
"missing_type": "Missing Widget Type: {{type}}",
"api_error": "API Error",
"information": "Informazioa",
"status": "Status",
"url": "URL",
"raw_error": "Raw Error",
"response_data": "Response Data"
},
"weather": {
"current": "Current Location",
"allow": "Click to allow",
"updating": "Eguneratzen",
"wait": "Itxaron mesedez"
},
"search": {
"placeholder": "Bilatu…"
},
"resources": {
"cpu": "CPU",
"mem": "MEM",
"total": "Guztira",
"free": "Free",
"used": "Erabilita",
"load": "Load",
"temp": "TEMP",
"max": "Max",
"uptime": "UP",
"months": "mo",
"days": "d",
"hours": "h",
"minutes": "m"
},
"unifi": {
"users": "Users",
"uptime": "System Uptime",
"days": "Egun",
"wan": "WAN",
"lan": "LAN",
"wlan": "WLAN",
"devices": "Gailuak",
"lan_devices": "LAN Gailuak",
"wlan_devices": "WLAN Gailuak",
"lan_users": "LAN Erabiltzaileak",
"wlan_users": "WLAN Erabiltzaileak",
"up": "UP",
"down": "DOWN",
"wait": "Itxaron mesedez",
"empty_data": "Subsystem status unknown"
},
"docker": {
"rx": "RX",
"tx": "TX",
"mem": "MEM",
"cpu": "CPU",
"running": "Running",
"offline": "Offline",
"error": "Error",
"unknown": "Ezezaguna",
"healthy": "Osasuntsu",
"starting": "Abiarazten",
"unhealthy": "Unhealthy",
"not_found": "Not Found",
"exited": "Exited",
"partial": "Partial"
},
"ping": {
"error": "Errorea",
"ping": "Ping"
},
"emby": {
"playing": "Playing",
"transcoding": "Transcoding",
"bitrate": "Bit-tasa",
"no_active": "No Active Streams",
"movies": "Movies",
"series": "Series",
"episodes": "Episodes",
"songs": "Abestiak"
},
"evcc": {
"pv_power": "Production",
"battery_soc": "Battery",
"grid_power": "Grid",
"home_power": "Consumption",
"charge_power": "Charger",
"watt_hour": "Wh"
},
"flood": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"caddy": {
"upstreams": "Upstreams",
"requests": "Current requests",
"requests_failed": "Failed requests"
},
"changedetectionio": {
"totalObserved": "Total Observed",
"diffsDetected": "Diffs Detected"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"tautulli": {
"playing": "Playing",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
},
"nzbget": {
"rate": "Rate",
"remaining": "Remaining",
"downloaded": "Downloaded"
},
"plex": {
"streams": "Active Streams",
"albums": "Albums",
"movies": "Movies",
"tv": "TV Shows"
},
"sabnzbd": {
"rate": "Rate",
"queue": "Queue",
"timeleft": "Time Left"
},
"rutorrent": {
"active": "Active",
"upload": "Kargatu",
"download": "Deskargatu"
},
"transmission": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"qbittorrent": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"qnap": {
"cpuUsage": "CPU Usage",
"memUsage": "MEM Usage",
"systemTempC": "System Temp",
"poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
},
"deluge": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"sonarr": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series",
"queue": "Queue",
"unknown": "Unknown"
},
"radarr": {
"wanted": "Wanted",
"missing": "Missing",
"queued": "Queued",
"movies": "Movies",
"queue": "Queue",
"unknown": "Unknown"
},
"lidarr": {
"wanted": "Wanted",
"queued": "Queued",
"artists": "Artists"
},
"readarr": {
"wanted": "Wanted",
"queued": "Queued",
"books": "Books"
},
"bazarr": {
"missingEpisodes": "Missing Episodes",
"missingMovies": "Missing Movies"
},
"ombi": {
"pending": "Pending",
"approved": "Approved",
"available": "Available"
},
"jellyseerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available"
},
"overseerr": {
"pending": "Pending",
"processing": "Processing",
"approved": "Approved",
"available": "Available"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
},
"pihole": {
"queries": "Queries",
"blocked": "Blocked",
"blocked_percent": "Blocked %",
"gravity": "Gravity"
},
"adguard": {
"queries": "Queries",
"blocked": "Blocked",
"filtered": "Filtered",
"latency": "Latency"
},
"speedtest": {
"upload": "Upload",
"download": "Download",
"ping": "Ping"
},
"portainer": {
"running": "Running",
"stopped": "Stopped",
"total": "Total"
},
"tailscale": {
"address": "Address",
"expires": "Expires",
"never": "Never",
"last_seen": "Last Seen",
"now": "Now",
"years": "{{number}}y",
"weeks": "{{number}}w",
"days": "{{number}}d",
"hours": "{{number}}h",
"minutes": "{{number}}m",
"seconds": "{{number}}s",
"ago": "{{value}} Ago"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
"traefik": {
"routers": "Routers",
"services": "Services",
"middleware": "Middleware"
},
"navidrome": {
"nothing_streaming": "No Active Streams",
"please_wait": "Please Wait"
},
"npm": {
"enabled": "Enabled",
"disabled": "Disabled",
"total": "Total"
},
"coinmarketcap": {
"configure": "Configure one or more crypto currencies to track",
"1hour": "1 Hour",
"1day": "1 Day",
"7days": "7 Days",
"30days": "30 Days"
},
"gotify": {
"apps": "Applications",
"clients": "Clients",
"messages": "Messages"
},
"prowlarr": {
"enableIndexers": "Indexers",
"numberOfGrabs": "Grabs",
"numberOfQueries": "Queries",
"numberOfFailGrabs": "Fail Grabs",
"numberOfFailQueries": "Fail Queries"
},
"jackett": {
"configured": "Configured",
"errored": "Errored"
},
"strelaysrv": {
"numActiveSessions": "Sessions",
"numConnections": "Connections",
"dataRelayed": "Relayed",
"transferRate": "Rate"
},
"mastodon": {
"user_count": "Users",
"status_count": "Posts",
"domain_count": "Domains"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"minecraft": {
"players": "Jokalariak",
"version": "Version",
"status": "Status",
"up": "Online",
"down": "Offline"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"authentik": {
"users": "Users",
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)"
},
"proxmox": {
"mem": "MEM",
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
},
"glances": {
"cpu": "CPU",
"load": "Load",
"wait": "Please wait",
"temp": "TEMP",
"warn": "Warn",
"uptime": "UP",
"total": "Total",
"free": "Free",
"used": "Used",
"days": "d",
"hours": "h"
},
"quicklaunch": {
"bookmark": "Bookmark",
"service": "Service",
"search": "Search",
"custom": "Custom",
"visit": "Visit",
"url": "URL"
},
"healthchecks": {
"new": "New",
"up": "Online",
"grace": "In Grace Period",
"down": "Offline",
"paused": "Paused",
"status": "Status",
"last_ping": "Last Ping",
"never": "No pings yet"
},
"watchtower": {
"containers_scanned": "Scanned",
"containers_updated": "Updated",
"containers_failed": "Failed"
},
"autobrr": {
"approvedPushes": "Approved",
"rejectedPushes": "Rejected",
"filters": "Filters",
"indexers": "Indexers"
},
"tubearchivist": {
"downloads": "Queue",
"videos": "Videos",
"channels": "Channels",
"playlists": "Playlists"
},
"truenas": {
"load": "System Load",
"uptime": "Uptime",
"alerts": "Alerts",
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
},
"pyload": {
"speed": "Speed",
"active": "Active",
"queue": "Queue",
"total": "Total"
},
"gluetun": {
"public_ip": "Public IP",
"region": "Region",
"country": "Country"
},
"hdhomerun": {
"channels": "Channels",
"hd": "HD"
},
"scrutiny": {
"passed": "Passed",
"failed": "Failed",
"unknown": "Unknown"
},
"paperlessngx": {
"inbox": "Inbox",
"total": "Total"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
},
"mikrotik": {
"cpuLoad": "CPU Load",
"memoryUsed": "Memory Used",
"uptime": "Uptime",
"numberOfLeases": "Leases"
},
"xteve": {
"streams_all": "All Streams",
"streams_active": "Active Streams",
"streams_xepg": "XEPG Channels"
},
"opnsense": {
"cpu": "CPU Load",
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
},
"moonraker": {
"printer_state": "Printer State",
"print_status": "Print Status",
"print_progress": "Progress",
"layers": "Layers"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"pfsense": {
"load": "Load Avg",
"memory": "Mem Usage",
"wanStatus": "WAN Status",
"up": "Up",
"down": "Down",
"temp": "Temp",
"disk": "Disk Usage",
"wanIP": "WAN IP"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
},
"uptimekuma": {
"up": "Sites Up",
"down": "Sites Down",
"uptime": "Uptime",
"incident": "Incident",
"m": "m"
},
"komga": {
"libraries": "Libraries",
"series": "Series",
"books": "Books"
},
"diskstation": {
"days": "Days",
"uptime": "Uptime",
"volumeAvailable": "Available"
},
"mylar": {
"series": "Series",
"issues": "Issues",
"wanted": "Wanted"
},
"photoprism": {
"albums": "Albums",
"photos": "Photos",
"videos": "Videos",
"people": "People"
},
"fileflows": {
"queue": "Queue",
"processing": "Processing",
"processed": "Processed",
"time": "Time"
},
"grafana": {
"dashboards": "Dashboards",
"datasources": "Data Sources",
"totalalerts": "Total Alerts",
"alertstriggered": "Alerts Triggered"
},
"nextcloud": {
"cpuload": "Cpu Load",
"memoryusage": "Memory Usage",
"freespace": "Free Space",
"activeusers": "Active Users",
"numfiles": "Files",
"numshares": "Shared Items"
},
"kopia": {
"status": "Status",
"size": "Size",
"lastrun": "Last Run",
"nextrun": "Next Run",
"failed": "Failed"
},
"unmanic": {
"active_workers": "Active Workers",
"total_workers": "Total Workers",
"records_total": "Queue Length"
},
"pterodactyl": {
"servers": "Servers",
"nodes": "Nodes"
},
"prometheus": {
"targets_up": "Targets Up",
"targets_down": "Targets Down",
"targets_total": "Total Targets"
},
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "One year",
"gross_percent_max": "All time"
},
"audiobookshelf": {
"podcasts": "Podcasts",
"books": "Books",
"podcastsDuration": "Duration",
"booksDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
},
"jdownloader": {
"downloadCount": "Queue",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size",
"downloadSpeed": "Speed"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
}
}

View File

@ -62,7 +62,8 @@
"playing": "Toistaa", "playing": "Toistaa",
"transcoding": "Transkoodaa", "transcoding": "Transkoodaa",
"bitrate": "Bittinopeus", "bitrate": "Bittinopeus",
"no_active": "Ei aktiivisia striimejä" "no_active": "Ei aktiivisia striimejä",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "Nopeus", "rate": "Nopeus",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -56,7 +56,8 @@
"playing": "En lecture", "playing": "En lecture",
"transcoding": "Transcodage", "transcoding": "Transcodage",
"bitrate": "Débit", "bitrate": "Débit",
"no_active": "Aucun flux actif" "no_active": "Aucun flux actif",
"plex_connection_error": "Vérifier la connexion à Plex"
}, },
"rutorrent": { "rutorrent": {
"active": "Actif", "active": "Actif",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Séries", "seriesCount": "Séries",
"totalFiles": "Fichiers" "totalFiles": "Fichiers"
},
"azurePipelines": {
"result": "Résultat",
"status": "Statut",
"buildId": "Build ID",
"succeeded": "Réussi",
"notStarted": "Non démarré",
"failed": "Échoué",
"canceled": "Annulé",
"inProgress": "En cours"
} }
} }

View File

@ -62,7 +62,8 @@
"playing": "מנגן", "playing": "מנגן",
"transcoding": "מקודד", "transcoding": "מקודד",
"bitrate": "סיביות", "bitrate": "סיביות",
"no_active": "אין הזרמות פעילות" "no_active": "אין הזרמות פעילות",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "יחס", "rate": "יחס",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -117,7 +117,8 @@
"playing": "Playing", "playing": "Playing",
"transcoding": "Transcoding", "transcoding": "Transcoding",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "No Active Streams" "no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "Rate", "rate": "Rate",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -104,7 +104,8 @@
"playing": "Reprodukcija", "playing": "Reprodukcija",
"transcoding": "Prekodiranje", "transcoding": "Prekodiranje",
"bitrate": "Stopa bitova", "bitrate": "Stopa bitova",
"no_active": "Nema aktivnih prijenosa" "no_active": "Nema aktivnih prijenosa",
"plex_connection_error": "Provjeri Plex vezu"
}, },
"nzbget": { "nzbget": {
"rate": "Stopa", "rate": "Stopa",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Serije", "seriesCount": "Serije",
"totalFiles": "Datoteke" "totalFiles": "Datoteke"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -4,15 +4,15 @@
"free": "Szabad", "free": "Szabad",
"used": "Használt", "used": "Használt",
"load": "Terhelés", "load": "Terhelés",
"cpu": "CPU", "cpu": "Processzor",
"mem": "MEM", "mem": "MEM",
"temp": "TEMP", "temp": "TEMP",
"max": "Max", "max": "Max",
"uptime": "UP", "uptime": "FUT",
"months": "mo", "months": "",
"days": "d", "days": "n",
"hours": "h", "hours": "ó",
"minutes": "m" "minutes": "p"
}, },
"docker": { "docker": {
"rx": "RX", "rx": "RX",
@ -20,20 +20,20 @@
"mem": "MEM", "mem": "MEM",
"cpu": "CPU", "cpu": "CPU",
"offline": "Offline", "offline": "Offline",
"error": "Error", "error": "Hiba",
"unknown": "Unknown", "unknown": "Ismeretlen",
"unhealthy": "Unhealthy", "unhealthy": "Egészségtelen",
"running": "Running", "running": "Futó",
"starting": "Starting", "starting": "Indul",
"not_found": "Not Found", "not_found": "Nem található",
"exited": "Exited", "exited": "Kilépett",
"partial": "Partial", "partial": "Részleges",
"healthy": "Healthy" "healthy": "Egészséges"
}, },
"lidarr": { "lidarr": {
"wanted": "Keresett", "wanted": "Keresett",
"queued": "Sorban áll", "queued": "Sorban áll",
"artists": "Artists" "artists": "Előadók"
}, },
"readarr": { "readarr": {
"wanted": "Keresett", "wanted": "Keresett",
@ -48,16 +48,16 @@
"missing_type": "Hiányzó Widget Típus: {{type}}", "missing_type": "Hiányzó Widget Típus: {{type}}",
"api_error": "API Hiba", "api_error": "API Hiba",
"status": "Státusz", "status": "Státusz",
"information": "Information", "information": "Információ",
"url": "URL", "url": "URL",
"raw_error": "Raw Error", "raw_error": "Nyers hiba",
"response_data": "Response Data" "response_data": "Válaszadatok"
}, },
"weather": { "weather": {
"current": "Aktuális hely", "current": "Aktuális hely",
"allow": "Kattints az engedélyezéshez", "allow": "Kattints az engedélyezéshez",
"updating": "Frissítés", "updating": "Frissítés",
"wait": "Kérlek várj" "wait": "Kérjük várjon"
}, },
"search": { "search": {
"placeholder": "Keresés…" "placeholder": "Keresés…"
@ -76,7 +76,8 @@
"playing": "Lejátszás folyamatban", "playing": "Lejátszás folyamatban",
"transcoding": "Átkódolás", "transcoding": "Átkódolás",
"bitrate": "Bitráta", "bitrate": "Bitráta",
"no_active": "Nincs aktív lejátszás" "no_active": "Nincs aktív lejátszás",
"plex_connection_error": "Plex kapcsolat ellenőrzése"
}, },
"nzbget": { "nzbget": {
"rate": "Ráta", "rate": "Ráta",
@ -109,16 +110,16 @@
"wanted": "Keresett", "wanted": "Keresett",
"queued": "Sorban áll", "queued": "Sorban áll",
"series": "Sorozat", "series": "Sorozat",
"queue": "Queue", "queue": "Várólista",
"unknown": "Unknown" "unknown": "Ismeretlen"
}, },
"radarr": { "radarr": {
"wanted": "Keresett", "wanted": "Keresett",
"queued": "Sorban áll", "queued": "Sorban áll",
"movies": "Filmek", "movies": "Filmek",
"missing": "Missing", "missing": "Hiányzik",
"queue": "Queue", "queue": "Várólista",
"unknown": "Unknown" "unknown": "Ismeretlen"
}, },
"ombi": { "ombi": {
"pending": "Függőben", "pending": "Függőben",
@ -134,13 +135,13 @@
"pending": "Függőben", "pending": "Függőben",
"approved": "Engedélyezett", "approved": "Engedélyezett",
"available": "Elérhető", "available": "Elérhető",
"processing": "Processing" "processing": "Feldolgozás"
}, },
"pihole": { "pihole": {
"queries": "Lekérdezések", "queries": "Lekérdezések",
"blocked": "Blokkolt", "blocked": "Blokkolt",
"gravity": "Gravitáció", "gravity": "Gravitáció",
"blocked_percent": "Blocked %" "blocked_percent": "Blokkolt %"
}, },
"adguard": { "adguard": {
"queries": "Lekérdezések", "queries": "Lekérdezések",
@ -192,184 +193,184 @@
"errored": "Hibás" "errored": "Hibás"
}, },
"mastodon": { "mastodon": {
"user_count": "Users", "user_count": "Felhasználók",
"status_count": "Posts", "status_count": "Posztok",
"domain_count": "Domains" "domain_count": "Domainek"
}, },
"strelaysrv": { "strelaysrv": {
"numActiveSessions": "Sessions", "numActiveSessions": "Munkamenetek",
"numConnections": "Connections", "numConnections": "Csatlakozások",
"dataRelayed": "Relayed", "dataRelayed": "Átirányított",
"transferRate": "Rate" "transferRate": "Ráta"
}, },
"authentik": { "authentik": {
"users": "Users", "users": "Felhasználók",
"loginsLast24H": "Logins (24h)", "loginsLast24H": "Bejelentkezések (24 óra)",
"failedLoginsLast24H": "Failed Logins (24h)" "failedLoginsLast24H": "Sikertelen bejelentkezések (24h)"
}, },
"proxmox": { "proxmox": {
"mem": "MEM", "mem": "RAM",
"cpu": "CPU", "cpu": "Processzor",
"lxc": "LXC", "lxc": "LXC",
"vms": "VMs" "vms": "VM-ek"
}, },
"unifi": { "unifi": {
"users": "Users", "users": "Felhasználók",
"uptime": "System Uptime", "uptime": "Rendszer üzemidő",
"days": "Days", "days": "Napok",
"wan": "WAN", "wan": "WAN",
"lan_users": "LAN Users", "lan_users": "LAN Felhasználók",
"wlan_users": "WLAN Users", "wlan_users": "WLAN Felhasználók",
"up": "UP", "up": "FUT",
"down": "DOWN", "down": "ÁLL",
"wait": "Please wait", "wait": "Kérjük várjon",
"lan": "LAN", "lan": "LAN",
"wlan": "WLAN", "wlan": "WLAN",
"devices": "Devices", "devices": "Eszközök",
"lan_devices": "LAN Devices", "lan_devices": "LAN Eszközök",
"wlan_devices": "WLAN Devices", "wlan_devices": "WLAN Eszközök",
"empty_data": "Subsystem status unknown" "empty_data": "Az alrendszer állapota ismeretlen"
}, },
"plex": { "plex": {
"streams": "Active Streams", "streams": "Aktív Stream-ek",
"movies": "Movies", "movies": "Filmek",
"tv": "TV Shows", "tv": "TV műsorok",
"albums": "Albums" "albums": "Albumok"
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "Processzor",
"wait": "Please wait", "wait": "Kérjük várjon",
"temp": "TEMP", "temp": "HŐMÉRSÉKLET",
"uptime": "UP", "uptime": "FUT",
"days": "d", "days": "n",
"hours": "h", "hours": "ó",
"load": "Load", "load": "Kapacitáskihasználás",
"warn": "Warn", "warn": "Figyelmeztet",
"total": "Total", "total": "Összes",
"free": "Free", "free": "Szabad",
"used": "Used" "used": "Felhasznált"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "Total Observed", "totalObserved": "Összes Megfigyelt",
"diffsDetected": "Diffs Detected" "diffsDetected": "Észlelt különbségek"
}, },
"wmo": { "wmo": {
"0-day": "Napos", "0-day": "Napos",
"0-night": "Derült", "0-night": "Derült",
"3-day": "Cloudy", "3-day": "Felhős",
"3-night": "Cloudy", "3-night": "Felhős",
"45-day": "Foggy", "45-day": "Ködös",
"53-day": "Drizzle", "53-day": "Szitálás",
"56-night": "Light Freezing Drizzle", "56-night": "Enyhe fagyos szitálás",
"57-day": "Freezing Drizzle", "57-day": "Fagyos szitálás",
"1-day": "Többnyire napos", "1-day": "Többnyire napos",
"1-night": "Többnyire derült", "1-night": "Többnyire derült",
"2-day": "Partly Cloudy", "2-day": "Részben felhős",
"2-night": "Partly Cloudy", "2-night": "Részben felhős",
"45-night": "Foggy", "45-night": "Ködös",
"48-day": "Foggy", "48-day": "Ködös",
"48-night": "Foggy", "48-night": "Ködös",
"51-day": "Light Drizzle", "51-day": "Enyhe szitálás",
"51-night": "Light Drizzle", "51-night": "Enyhe szitálás",
"57-night": "Freezing Drizzle", "57-night": "Fagyos szitálás",
"61-day": "Light Rain", "61-day": "Enyhe eső",
"61-night": "Light Rain", "61-night": "Enyhe eső",
"53-night": "Drizzle", "53-night": "Szitálás",
"55-day": "Heavy Drizzle", "55-day": "Erős szitálás",
"55-night": "Heavy Drizzle", "55-night": "Erős szitálás",
"56-day": "Light Freezing Drizzle", "56-day": "Enyhe fagyos szitálás",
"63-day": "Rain", "63-day": "Eső",
"63-night": "Rain", "63-night": "Eső",
"65-day": "Heavy Rain", "65-day": "Heves eső",
"65-night": "Heavy Rain", "65-night": "Heves eső",
"66-day": "Freezing Rain", "66-day": "Ónos eső",
"66-night": "Freezing Rain", "66-night": "Ónos eső",
"67-day": "Freezing Rain", "67-day": "Ónos eső",
"67-night": "Freezing Rain", "67-night": "Ónos eső",
"71-day": "Light Snow", "71-day": "Enyhe havazás",
"71-night": "Light Snow", "71-night": "Enyhe havazás",
"73-day": "Snow", "73-day": "",
"73-night": "Snow", "73-night": "",
"75-day": "Heavy Snow", "75-day": "Erős havazás",
"75-night": "Heavy Snow", "75-night": "Erős havazás",
"77-day": "Snow Grains", "77-day": "Hódara",
"77-night": "Snow Grains", "77-night": "Hódara",
"80-day": "Light Showers", "80-day": "Enyhe záporok",
"80-night": "Light Showers", "80-night": "Enyhe záporok",
"81-day": "Showers", "81-day": "Záporok",
"81-night": "Showers", "81-night": "Záporok",
"82-day": "Heavy Showers", "82-day": "Heves záporok",
"82-night": "Heavy Showers", "82-night": "Heves záporok",
"85-day": "Snow Showers", "85-day": "Hózáporok",
"85-night": "Snow Showers", "85-night": "Hózáporok",
"86-day": "Snow Showers", "86-day": "Hózáporok",
"86-night": "Snow Showers", "86-night": "Hózáporok",
"95-day": "Thunderstorm", "95-day": "Zivatar",
"95-night": "Thunderstorm", "95-night": "Zivatar",
"96-day": "Thunderstorm With Hail", "96-day": "Zivatar jégesővel",
"96-night": "Thunderstorm With Hail", "96-night": "Zivatar jégesővel",
"99-day": "Thunderstorm With Hail", "99-day": "Zivatar jégesővel",
"99-night": "Thunderstorm With Hail" "99-night": "Zivatar jégesővel"
}, },
"quicklaunch": { "quicklaunch": {
"bookmark": "Bookmark", "bookmark": "Könyvjelző",
"service": "Service", "service": "Szolgáltatás",
"search": "Search", "search": "Keresés",
"custom": "Custom", "custom": "Egyedi",
"visit": "Visit", "visit": "Megnéz",
"url": "URL" "url": "URL"
}, },
"homebridge": { "homebridge": {
"available_update": "System", "available_update": "Rendszer",
"updates": "Updates", "updates": "Frissítések",
"update_available": "Update Available", "update_available": "Elérhető Frissítés",
"up_to_date": "Up to Date", "up_to_date": "Naprakész",
"child_bridges": "Child Bridges", "child_bridges": "Gyerek Hidak",
"child_bridges_status": "{{ok}}/{{total}}", "child_bridges_status": "{{ok}}/{{total}}",
"up": "Up", "up": "Fut",
"pending": "Pending", "pending": "Függőben",
"down": "Down" "down": "Áll"
}, },
"autobrr": { "autobrr": {
"approvedPushes": "Approved", "approvedPushes": "Jóváhagyott",
"rejectedPushes": "Rejected", "rejectedPushes": "Elutasított",
"filters": "Filters", "filters": "Szűrők",
"indexers": "Indexers" "indexers": "Indexelők"
}, },
"watchtower": { "watchtower": {
"containers_scanned": "Scanned", "containers_scanned": "Beolvasott",
"containers_updated": "Updated", "containers_updated": "Frissített",
"containers_failed": "Failed" "containers_failed": "Sikertelen"
}, },
"tubearchivist": { "tubearchivist": {
"downloads": "Queue", "downloads": "Várólista",
"videos": "Videos", "videos": "Videók",
"channels": "Channels", "channels": "Csatornák",
"playlists": "Playlists" "playlists": "Lejátszási listák"
}, },
"truenas": { "truenas": {
"load": "System Load", "load": "Rendszerterheltség",
"uptime": "Uptime", "uptime": "Üzemidő",
"alerts": "Alerts", "alerts": "Riasztások",
"time": "{{value, number(style: unit; unitDisplay: long;)}}" "time": "{{value, number(style: unit; unitDisplay: long;)}}"
}, },
"navidrome": { "navidrome": {
"nothing_streaming": "No Active Streams", "nothing_streaming": "Nincsenek Aktív Stream-ek",
"please_wait": "Please Wait" "please_wait": "Kérjük Várjon"
}, },
"pyload": { "pyload": {
"speed": "Speed", "speed": "Sebesség",
"active": "Active", "active": "Aktív",
"queue": "Queue", "queue": "Várólista",
"total": "Total" "total": "Összes"
}, },
"gluetun": { "gluetun": {
"public_ip": "Public IP", "public_ip": "Nyilvános IP-cím",
"region": "Region", "region": "Régió",
"country": "Country" "country": "Ország"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Channels", "channels": "Csatornák",
"hd": "HD" "hd": "HD"
}, },
"ping": { "ping": {
@ -377,197 +378,197 @@
"ping": "Ping" "ping": "Ping"
}, },
"scrutiny": { "scrutiny": {
"passed": "Passed", "passed": "Megfelelt",
"failed": "Failed", "failed": "Sikertelen",
"unknown": "Unknown" "unknown": "Ismeretlen"
}, },
"paperlessngx": { "paperlessngx": {
"inbox": "Inbox", "inbox": "Beérkezett",
"total": "Total" "total": "Összes"
}, },
"deluge": { "deluge": {
"download": "Download", "download": "Letöltés",
"seed": "Seed", "seed": "Seed",
"upload": "Upload", "upload": "Feltöltés",
"leech": "Leech" "leech": "Leech"
}, },
"flood": { "flood": {
"download": "Download", "download": "Letöltés",
"upload": "Upload", "upload": "Feltöltés",
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"tdarr": { "tdarr": {
"queue": "Queue", "queue": "Várólista",
"processed": "Processed", "processed": "Feldolgozott",
"errored": "Errored", "errored": "Hibás",
"saved": "Saved" "saved": "Mentett"
}, },
"miniflux": { "miniflux": {
"read": "Read", "read": "Olvasott",
"unread": "Unread" "unread": "Olvasatlan"
}, },
"nextdns": { "nextdns": {
"wait": "Please Wait", "wait": "Kérjük Várjon",
"no_devices": "No Device Data Received" "no_devices": "Nincs fogadott eszközadat"
}, },
"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": {
"activeUser": "Active devices", "activeUser": "Aktív eszközök",
"alerts": "Alerts", "alerts": "Riasztások",
"connectedAp": "Connected APs", "connectedAp": "Csatlakoztatott AP-k",
"connectedGateway": "Connected gateways", "connectedGateway": "Csatlakoztatott gateway-ek",
"connectedSwitches": "Connected switches" "connectedSwitches": "Csatlakoztatott switch-ek"
}, },
"downloadstation": { "downloadstation": {
"download": "Download", "download": "Letöltés",
"upload": "Upload", "upload": "Feltöltés",
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"mikrotik": { "mikrotik": {
"cpuLoad": "CPU Load", "cpuLoad": "Processzor Terhelés",
"memoryUsed": "Memory Used", "memoryUsed": "Felhasznált Memória",
"uptime": "Uptime", "uptime": "Üzemidő",
"numberOfLeases": "Leases" "numberOfLeases": "Bérletek"
}, },
"xteve": { "xteve": {
"streams_all": "All Streams", "streams_all": "Minden Stream",
"streams_active": "Active Streams", "streams_active": "Aktív Stream-ek",
"streams_xepg": "XEPG Channels" "streams_xepg": "XEPG Csatornák"
}, },
"opnsense": { "opnsense": {
"cpu": "CPU Load", "cpu": "Processzor Terhelés",
"memory": "Active Memory", "memory": "Aktív Memória",
"wanUpload": "WAN Upload", "wanUpload": "WAN Feltöltés",
"wanDownload": "WAN Download" "wanDownload": "WAN Letöltés"
}, },
"moonraker": { "moonraker": {
"layers": "Layers", "layers": "Rétegek",
"printer_state": "Printer State", "printer_state": "Nyomtató Állapota",
"print_status": "Print Status", "print_status": "Nyomtatás Állapota",
"print_progress": "Progress" "print_progress": "Folyamat"
}, },
"medusa": { "medusa": {
"wanted": "Wanted", "wanted": "Keresett",
"queued": "Queued", "queued": "Sorba állítva",
"series": "Series" "series": "Sorozatok"
}, },
"octoprint": { "octoprint": {
"printer_state": "Status", "printer_state": "Állapot",
"temp_tool": "Tool temp", "temp_tool": "Szerszám hőmérséklet",
"temp_bed": "Bed temp", "temp_bed": "Ágy Hőmérséklet",
"job_completion": "Completion" "job_completion": "Teljesítés"
}, },
"cloudflared": { "cloudflared": {
"origin_ip": "Origin IP", "origin_ip": "Eredeti IP",
"status": "Status" "status": "Állapot"
}, },
"proxmoxbackupserver": { "proxmoxbackupserver": {
"datastore_usage": "Datastore", "datastore_usage": "Adattár",
"failed_tasks_24h": "Failed Tasks 24h", "failed_tasks_24h": "Sikertelen feladatok 24h",
"cpu_usage": "CPU", "cpu_usage": "Processzor",
"memory_usage": "Memory" "memory_usage": "Memória"
}, },
"immich": { "immich": {
"users": "Users", "users": "Felhasználók",
"photos": "Photos", "photos": "Fényképek",
"videos": "Videos", "videos": "Videók",
"storage": "Storage" "storage": "Tárhely"
}, },
"uptimekuma": { "uptimekuma": {
"up": "Sites Up", "up": "Futó Webhelyek",
"down": "Sites Down", "down": "Nem Elérhető Webhelyek",
"uptime": "Uptime", "uptime": "Üzemidő",
"incident": "Incident", "incident": "Incidens",
"m": "m" "m": "perc"
}, },
"komga": { "komga": {
"libraries": "Libraries", "libraries": "Könyvtárak",
"series": "Series", "series": "Sorozatok",
"books": "Books" "books": "Könyvek"
}, },
"mylar": { "mylar": {
"series": "Series", "series": "Sorozatok",
"issues": "Issues", "issues": "Problémák",
"wanted": "Wanted" "wanted": "Keresett"
}, },
"photoprism": { "photoprism": {
"albums": "Albums", "albums": "Albumok",
"photos": "Photos", "photos": "Fényképek",
"videos": "Videos", "videos": "Videók",
"people": "People" "people": "Emberek"
}, },
"diskstation": { "diskstation": {
"days": "Days", "days": "Napok",
"uptime": "Uptime", "uptime": "Üzemidő",
"volumeAvailable": "Available" "volumeAvailable": "Elérhető"
}, },
"fileflows": { "fileflows": {
"queue": "Queue", "queue": "Várólista",
"processing": "Processing", "processing": "Feldolgozás",
"processed": "Processed", "processed": "Feldolgozott",
"time": "Time" "time": "Idő"
}, },
"grafana": { "grafana": {
"dashboards": "Dashboards", "dashboards": "Műszerfalak",
"datasources": "Data Sources", "datasources": "Adatforrások",
"totalalerts": "Total Alerts", "totalalerts": "Összes Riasztás",
"alertstriggered": "Alerts Triggered" "alertstriggered": "Aktivált riasztások"
}, },
"nextcloud": { "nextcloud": {
"cpuload": "Cpu Load", "cpuload": "Processzor Terhelés",
"memoryusage": "Memory Usage", "memoryusage": "Memória Használat",
"freespace": "Free Space", "freespace": "Szabad hely",
"activeusers": "Active Users", "activeusers": "Aktív Felhasználók",
"numfiles": "Files", "numfiles": "Fájlok",
"numshares": "Shared Items" "numshares": "Megosztott Elemek"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Állapot",
"size": "Size", "size": "Méret",
"lastrun": "Last Run", "lastrun": "Legutóbbi futtatás",
"nextrun": "Next Run", "nextrun": "Következő Futtatás",
"failed": "Failed" "failed": "Sikertelen"
}, },
"unmanic": { "unmanic": {
"active_workers": "Active Workers", "active_workers": "Aktív Dolgozók",
"total_workers": "Total Workers", "total_workers": "Összes Dolgozó",
"records_total": "Queue Length" "records_total": "Várólista Hossza"
}, },
"healthchecks": { "healthchecks": {
"new": "New", "new": "Új",
"up": "Online", "up": "Online",
"grace": "In Grace Period", "grace": "Türelmi idő alatt",
"down": "Offline", "down": "Offline",
"paused": "Paused", "paused": "Szünetel",
"status": "Status", "status": "Állapot",
"last_ping": "Last Ping", "last_ping": "Legutóbbi Ping",
"never": "No pings yet" "never": "Még nincsenek ping-ek"
}, },
"pterodactyl": { "pterodactyl": {
"servers": "Servers", "servers": "Szerverek",
"nodes": "Nodes" "nodes": "Node-ok"
}, },
"prometheus": { "prometheus": {
"targets_up": "Targets Up", "targets_up": "Célpontok Futnak",
"targets_down": "Targets Down", "targets_down": "Célpontok Állnak",
"targets_total": "Total Targets" "targets_total": "Összes Célpont"
}, },
"minecraft": { "minecraft": {
"players": "Players", "players": "Lejátszók",
"version": "Version", "version": "Verzió",
"status": "Status", "status": "Állapot",
"up": "Online", "up": "Online",
"down": "Offline" "down": "Offline"
}, },
"ghostfolio": { "ghostfolio": {
"gross_percent_today": "Today", "gross_percent_today": "Ma",
"gross_percent_1y": "One year", "gross_percent_1y": "Egy év",
"gross_percent_max": "All time" "gross_percent_max": "Mindig"
}, },
"audiobookshelf": { "audiobookshelf": {
"podcasts": "Podcast", "podcasts": "Podcast",
@ -576,83 +577,93 @@
"booksDuration": "Időtartam" "booksDuration": "Időtartam"
}, },
"homeassistant": { "homeassistant": {
"people_home": "People Home", "people_home": "Emberek otthon",
"lights_on": "Lights On", "lights_on": "Fények bekapcsolva",
"switches_on": "Switches On" "switches_on": "Kapcsolók felkapcsolva"
}, },
"freshrss": { "freshrss": {
"subscriptions": "Subscriptions", "subscriptions": "Előfizetések",
"unread": "Unread" "unread": "Olvasatlan"
}, },
"channelsdvrserver": { "channelsdvrserver": {
"shows": "Shows", "shows": "Műsorok",
"recordings": "Recordings", "recordings": "Felvételek",
"scheduled": "Scheduled", "scheduled": "Ütemezett",
"passes": "Passes" "passes": "Engedélyek"
}, },
"whatsupdocker": { "whatsupdocker": {
"monitoring": "Monitoring", "monitoring": "Nyomonkövetés",
"updates": "Updates" "updates": "Frissítések"
}, },
"tailscale": { "tailscale": {
"address": "Address", "address": "Cím",
"expires": "Expires", "expires": "Lejár",
"never": "Never", "never": "Soha",
"last_seen": "Last Seen", "last_seen": "Utoljára látott",
"now": "Now", "now": "Most",
"years": "{{number}}y", "years": "{{number}}y",
"weeks": "{{number}}w", "weeks": "{{number}}w",
"days": "{{number}}d", "days": "{{number}}d",
"minutes": "{{number}}m", "minutes": "{{number}}m",
"seconds": "{{number}}s", "seconds": "{{number}}s",
"ago": "{{value}} Ago", "ago": "{{value}} Ezelőtt",
"hours": "{{number}}h" "hours": "{{number}}h"
}, },
"qnap": { "qnap": {
"cpuUsage": "CPU Usage", "cpuUsage": "Processzor Használat",
"memUsage": "MEM Usage", "memUsage": "Memória Használat",
"systemTempC": "System Temp", "systemTempC": "Rendszerhőmérséklet",
"poolUsage": "Pool Usage", "poolUsage": "Pool Használat",
"volumeUsage": "Volume Usage", "volumeUsage": "Kötet Használat",
"invalid": "Invalid" "invalid": "Érvénytelen"
}, },
"pfsense": { "pfsense": {
"load": "Load Avg", "load": "Átlagos terhelés",
"memory": "Mem Usage", "memory": "RAM Használat",
"wanStatus": "WAN Status", "wanStatus": "WAN Állapot",
"up": "Up", "up": "Fut",
"down": "Down", "down": "Áll",
"temp": "Temp", "temp": "Hőmérséklet",
"disk": "Disk Usage", "disk": "Lemezhasználat",
"wanIP": "WAN IP" "wanIP": "WAN IP"
}, },
"caddy": { "caddy": {
"upstreams": "Upstreams", "upstreams": "Upstreamek",
"requests": "Current requests", "requests": "Jelenlegi kérelmek",
"requests_failed": "Failed requests" "requests_failed": "Sikertelen kérelmek"
}, },
"evcc": { "evcc": {
"pv_power": "Production", "pv_power": "Termelés",
"battery_soc": "Battery", "battery_soc": "Akkumulátor",
"grid_power": "Grid", "grid_power": "Rács",
"home_power": "Consumption", "home_power": "Fogyasztás",
"charge_power": "Charger", "charge_power": "Töltő",
"watt_hour": "Wh" "watt_hour": "Wh"
}, },
"pialert": { "pialert": {
"total": "Total", "total": "Összes",
"connected": "Connected", "connected": "Csatlakoztatott",
"new_devices": "New Devices", "new_devices": "Új Eszközök",
"down_alerts": "Down Alerts" "down_alerts": "Leállási Figyelmeztetések"
}, },
"jdownloader": { "jdownloader": {
"downloadSpeed": "Download Speed", "downloadSpeed": "Sebesség",
"downloadCount": "Queue Count", "downloadCount": "Összes függőben lévő",
"downloadTotalBytes": "Size", "downloadTotalBytes": "Méret",
"downloadBytesRemaining": "Remaining" "downloadBytesRemaining": "Fennmaradó"
}, },
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Sorozatok",
"totalFiles": "Files" "totalFiles": "Fájlok"
},
"azurePipelines": {
"result": "Eredmény",
"status": "Állapot",
"buildId": "Build ID",
"succeeded": "Sikeres",
"notStarted": "Nincs elindítva",
"failed": "Sikertelen",
"canceled": "Megszakítva",
"inProgress": "Folyamatban"
} }
} }

View File

@ -643,7 +643,8 @@
"playing": "Playing", "playing": "Playing",
"transcoding": "Transcoding", "transcoding": "Transcoding",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "No Active Streams" "no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
}, },
"jdownloader": { "jdownloader": {
"downloadCount": "Queue Count", "downloadCount": "Queue Count",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -29,7 +29,8 @@
"playing": "In riproduzione", "playing": "In riproduzione",
"transcoding": "Transcodifica", "transcoding": "Transcodifica",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "Nessuno Stream Attivo" "no_active": "Nessuno Stream Attivo",
"plex_connection_error": "Check Plex Connection"
}, },
"speedtest": { "speedtest": {
"upload": "Upload", "upload": "Upload",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Serie", "seriesCount": "Serie",
"totalFiles": "File" "totalFiles": "File"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -136,7 +136,8 @@
"playing": "再生中", "playing": "再生中",
"transcoding": "変換中", "transcoding": "変換中",
"bitrate": "ビットレート", "bitrate": "ビットレート",
"no_active": "アクティブストリームなし" "no_active": "アクティブストリームなし",
"plex_connection_error": "Check Plex Connection"
}, },
"omada": { "omada": {
"connectedAp": "接続されたAP", "connectedAp": "接続されたAP",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -111,7 +111,8 @@
"playing": "재생 중", "playing": "재생 중",
"transcoding": "트랜스코딩", "transcoding": "트랜스코딩",
"bitrate": "비트레이트", "bitrate": "비트레이트",
"no_active": "활성 스트림 없음" "no_active": "활성 스트림 없음",
"plex_connection_error": "Check Plex Connection"
}, },
"omada": { "omada": {
"connectedAp": "연결된 AP", "connectedAp": "연결된 AP",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -97,7 +97,8 @@
"playing": "Atskaņo", "playing": "Atskaņo",
"transcoding": "Pārkodē", "transcoding": "Pārkodē",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "Nav aktīvu straumju" "no_active": "Nav aktīvu straumju",
"plex_connection_error": "Check Plex Connection"
}, },
"omada": { "omada": {
"connectedAp": "Savienotie piekļuves punkti", "connectedAp": "Savienotie piekļuves punkti",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"result": "Result",
"inProgress": "In Progress"
} }
} }

View File

@ -200,7 +200,8 @@
"playing": "Sedang Dimainkan", "playing": "Sedang Dimainkan",
"transcoding": "Transkoding", "transcoding": "Transkoding",
"bitrate": "Kadar bit", "bitrate": "Kadar bit",
"no_active": "Tiada Strim Aktif" "no_active": "Tiada Strim Aktif",
"plex_connection_error": "Check Plex Connection"
}, },
"plex": { "plex": {
"streams": "Strim Aktif", "streams": "Strim Aktif",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -56,7 +56,8 @@
"playing": "Spiller", "playing": "Spiller",
"transcoding": "Transkoding", "transcoding": "Transkoding",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "Ingen aktive strømmer" "no_active": "Ingen aktive strømmer",
"plex_connection_error": "Check Plex Connection"
}, },
"rutorrent": { "rutorrent": {
"active": "Aktiv", "active": "Aktiv",
@ -653,6 +654,16 @@
}, },
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Filer"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -72,7 +72,8 @@
"playing": "Afspelen", "playing": "Afspelen",
"transcoding": "Transcodering", "transcoding": "Transcodering",
"bitrate": "Bitsnelheid", "bitrate": "Bitsnelheid",
"no_active": "Geen Actieve Streams" "no_active": "Geen Actieve Streams",
"plex_connection_error": "Check Plex Connection"
}, },
"rutorrent": { "rutorrent": {
"active": "Actief", "active": "Actief",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -37,7 +37,8 @@
"playing": "Odtwarzanie", "playing": "Odtwarzanie",
"transcoding": "Transkodowanie", "transcoding": "Transkodowanie",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "Brak aktywnych strumieni" "no_active": "Brak aktywnych strumieni",
"plex_connection_error": "Check Plex Connection"
}, },
"speedtest": { "speedtest": {
"download": "Pobieranie", "download": "Pobieranie",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -90,7 +90,8 @@
"playing": "Reproduzindo", "playing": "Reproduzindo",
"transcoding": "Transcodificando", "transcoding": "Transcodificando",
"bitrate": "Taxa de bits", "bitrate": "Taxa de bits",
"no_active": "Sem transmissões ativas" "no_active": "Sem transmissões ativas",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "Taxa", "rate": "Taxa",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -56,7 +56,8 @@
"playing": "Reproduzindo", "playing": "Reproduzindo",
"transcoding": "Transcodificação", "transcoding": "Transcodificação",
"bitrate": "Taxa de bits", "bitrate": "Taxa de bits",
"no_active": "Sem streams ativas" "no_active": "Sem streams ativas",
"plex_connection_error": "Check Plex Connection"
}, },
"rutorrent": { "rutorrent": {
"active": "Ativo", "active": "Ativo",
@ -663,5 +664,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -92,7 +92,8 @@
"no_active": "Niciun stream activ", "no_active": "Niciun stream activ",
"playing": "Activ", "playing": "Activ",
"transcoding": "Transcodare", "transcoding": "Transcodare",
"bitrate": "Bitrate" "bitrate": "Bitrate",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "Rată", "rate": "Rată",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -56,7 +56,8 @@
"playing": "Воспроизведение", "playing": "Воспроизведение",
"transcoding": "Транскодирование", "transcoding": "Транскодирование",
"bitrate": "Битрейт", "bitrate": "Битрейт",
"no_active": "Нет активных трансляций" "no_active": "Нет активных трансляций",
"plex_connection_error": "Проверьте соединение с Plex"
}, },
"rutorrent": { "rutorrent": {
"active": "Активный", "active": "Активный",
@ -64,22 +65,22 @@
"download": "Загрузка" "download": "Загрузка"
}, },
"sonarr": { "sonarr": {
"wanted": "Хотел", "wanted": "Желаемое",
"queued": "В очереди", "queued": "В очереди",
"series": "Серии", "series": "Серии",
"queue": "Queue", "queue": "Очередь",
"unknown": "Unknown" "unknown": "Unknown"
}, },
"radarr": { "radarr": {
"wanted": "Хотел", "wanted": "Желаемое",
"queued": "В очереди", "queued": "В очереди",
"movies": "Фильмы", "movies": "Фильмы",
"missing": "Пропущено", "missing": "Пропущено",
"queue": "Queue", "queue": "Очередь",
"unknown": "Unknown" "unknown": "Unknown"
}, },
"readarr": { "readarr": {
"wanted": "Хотел", "wanted": "Желаемое",
"queued": "В очереди", "queued": "В очереди",
"books": "Книги" "books": "Книги"
}, },
@ -175,9 +176,9 @@
"missingMovies": "Отсутствующие фильмы" "missingMovies": "Отсутствующие фильмы"
}, },
"lidarr": { "lidarr": {
"wanted": "Хотел", "wanted": "Желаемое",
"queued": "В очереди", "queued": "В очереди",
"artists": "Artists" "artists": "Артисты"
}, },
"adguard": { "adguard": {
"queries": "Запросы", "queries": "Запросы",
@ -612,8 +613,8 @@
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Usage", "poolUsage": "Использование пула",
"volumeUsage": "Volume Usage", "volumeUsage": "Использование тома",
"invalid": "Invalid" "invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
@ -627,23 +628,23 @@
"temp": "Temp" "temp": "Temp"
}, },
"caddy": { "caddy": {
"upstreams": "Upstreams", "upstreams": "Апстримы",
"requests": "Current requests", "requests": "Текущие запросы",
"requests_failed": "Failed requests" "requests_failed": "Неудачные запросы"
}, },
"evcc": { "evcc": {
"home_power": "Consumption", "home_power": "Потребление",
"pv_power": "Production", "pv_power": "Production",
"battery_soc": "Battery", "battery_soc": "Battery",
"grid_power": "Grid", "grid_power": "Grid",
"charge_power": "Charger", "charge_power": "Зарядка",
"watt_hour": "Wh" "watt_hour": "Wh"
}, },
"pialert": { "pialert": {
"total": "Total", "total": "Total",
"connected": "Connected", "connected": "Connected",
"new_devices": "New Devices", "new_devices": "Новые устройства",
"down_alerts": "Down Alerts" "down_alerts": "Оповещения о сбоях"
}, },
"jdownloader": { "jdownloader": {
"downloadCount": "Queue Count", "downloadCount": "Queue Count",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"inProgress": "In Progress",
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled"
} }
} }

View File

@ -221,7 +221,8 @@
"playing": "Playing", "playing": "Playing",
"transcoding": "Transcoding", "transcoding": "Transcoding",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "No Active Streams" "no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
}, },
"omada": { "omada": {
"connectedAp": "Connected APs", "connectedAp": "Connected APs",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -168,7 +168,8 @@
"transcoding": "Transkodira", "transcoding": "Transkodira",
"bitrate": "Pasovna širina", "bitrate": "Pasovna širina",
"playing": "Predvaja", "playing": "Predvaja",
"no_active": "Ni aktivne vsebine" "no_active": "Ni aktivne vsebine",
"plex_connection_error": "Check Plex Connection"
}, },
"flood": { "flood": {
"download": "Prenos", "download": "Prenos",
@ -236,21 +237,21 @@
"wanted": "Iskano", "wanted": "Iskano",
"queued": "V vrsti", "queued": "V vrsti",
"series": "Serije", "series": "Serije",
"queue": "Queue", "queue": "Vrsta",
"unknown": "Unknown" "unknown": "Neznano"
}, },
"radarr": { "radarr": {
"wanted": "Iskano", "wanted": "Iskano",
"missing": "Manjka", "missing": "Manjka",
"queued": "V vrsti", "queued": "V vrsti",
"movies": "Filmi", "movies": "Filmi",
"queue": "Queue", "queue": "Vrsta",
"unknown": "Unknown" "unknown": "Neznano"
}, },
"lidarr": { "lidarr": {
"wanted": "Iskano", "wanted": "Iskano",
"queued": "V vrsti", "queued": "V vrsti",
"artists": "Artists" "artists": "Avtorji"
}, },
"readarr": { "readarr": {
"wanted": "Iskano", "wanted": "Iskano",
@ -359,11 +360,11 @@
"uptime": "UP", "uptime": "UP",
"days": "d", "days": "d",
"hours": "u", "hours": "u",
"free": "Free", "free": "Prosto",
"load": "Load", "load": "Obremenitev",
"warn": "Warn", "warn": "Opoz.",
"total": "Total", "total": "Skupaj",
"used": "Used" "used": "V uporabi"
}, },
"authentik": { "authentik": {
"users": "Uporabniki", "users": "Uporabniki",
@ -613,8 +614,8 @@
"memUsage": "MEM", "memUsage": "MEM",
"systemTempC": "Temperatura", "systemTempC": "Temperatura",
"poolUsage": "Prostor", "poolUsage": "Prostor",
"volumeUsage": "Volume Usage", "volumeUsage": "Prostora",
"invalid": "Invalid" "invalid": "Neveljavno"
}, },
"pfsense": { "pfsense": {
"load": "Povp. obremenitev", "load": "Povp. obremenitev",
@ -640,19 +641,29 @@
"watt_hour": "Wh" "watt_hour": "Wh"
}, },
"pialert": { "pialert": {
"total": "Total", "total": "Skupaj",
"connected": "Connected", "connected": "Povezanih",
"new_devices": "New Devices", "new_devices": "Nove naprave",
"down_alerts": "Down Alerts" "down_alerts": "Izključeno"
}, },
"jdownloader": { "jdownloader": {
"downloadCount": "Queue Count", "downloadCount": "Vrsta",
"downloadSpeed": "Download Speed", "downloadSpeed": "Hitrost prenosa",
"downloadBytesRemaining": "Remaining", "downloadBytesRemaining": "Še ostane",
"downloadTotalBytes": "Size" "downloadTotalBytes": "Velikost"
}, },
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Serije",
"totalFiles": "Files" "totalFiles": "Datoteke"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -79,7 +79,8 @@
"playing": "Playing", "playing": "Playing",
"transcoding": "Transcoding", "transcoding": "Transcoding",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "No Active Streams" "no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "Rate", "rate": "Rate",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -62,7 +62,8 @@
"playing": "Spelar", "playing": "Spelar",
"transcoding": "Omkodning", "transcoding": "Omkodning",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "Inga aktiva strömmar" "no_active": "Inga aktiva strömmar",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "Hastighet", "rate": "Hastighet",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"totalFiles": "Files", "totalFiles": "Files",
"seriesCount": "Series" "seriesCount": "Series"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -79,7 +79,8 @@
"playing": "ఆడుతున్నారు", "playing": "ఆడుతున్నారు",
"transcoding": "ట్రాన్స్‌కోడింగ్", "transcoding": "ట్రాన్స్‌కోడింగ్",
"bitrate": "బిట్రేట్", "bitrate": "బిట్రేట్",
"no_active": "యాక్టివ్ స్ట్రీమ్‌లు లేవు" "no_active": "యాక్టివ్ స్ట్రీమ్‌లు లేవు",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "రేట్", "rate": "రేట్",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"totalFiles": "Files", "totalFiles": "Files",
"seriesCount": "Series" "seriesCount": "Series"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -139,7 +139,8 @@
"playing": "Playing", "playing": "Playing",
"transcoding": "Transcoding", "transcoding": "Transcoding",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "No Active Streams" "no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
}, },
"omada": { "omada": {
"connectedAp": "Connected APs", "connectedAp": "Connected APs",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -79,7 +79,8 @@
"playing": "Oynatılıyor", "playing": "Oynatılıyor",
"transcoding": "Dönüştürülüyor", "transcoding": "Dönüştürülüyor",
"bitrate": "Bit Oranı", "bitrate": "Bit Oranı",
"no_active": "Aktif akış yok" "no_active": "Aktif akış yok",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "Oran", "rate": "Oran",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -198,7 +198,8 @@
"playing": "Відтворення", "playing": "Відтворення",
"transcoding": "Перекодування", "transcoding": "Перекодування",
"bitrate": "Бітрейт", "bitrate": "Бітрейт",
"no_active": "Немає активних потоків" "no_active": "Немає активних потоків",
"plex_connection_error": "Перевірте з'єднання Plex"
}, },
"nzbget": { "nzbget": {
"rate": "Швидкість", "rate": "Швидкість",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Серій", "seriesCount": "Серій",
"totalFiles": "Файлів" "totalFiles": "Файлів"
},
"azurePipelines": {
"failed": "Невдача",
"result": "Результат",
"status": "Стан",
"buildId": "ID збірки",
"succeeded": "Успішно",
"notStarted": "Не розпочато",
"canceled": "Скасовано",
"inProgress": "В процесі"
} }
} }

View File

@ -56,7 +56,8 @@
"playing": "Đang chơi", "playing": "Đang chơi",
"transcoding": "Chuyển định dạng", "transcoding": "Chuyển định dạng",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "No Active Streams" "no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
}, },
"rutorrent": { "rutorrent": {
"active": "Hoạt động", "active": "Hoạt động",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -13,7 +13,8 @@
"playing": "播放緊", "playing": "播放緊",
"no_active": "無任何活動", "no_active": "無任何活動",
"transcoding": "轉碼緊", "transcoding": "轉碼緊",
"bitrate": "比特率" "bitrate": "比特率",
"plex_connection_error": "Check Plex Connection"
}, },
"transmission": { "transmission": {
"download": "下載速度", "download": "下載速度",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -56,7 +56,8 @@
"playing": "播放中", "playing": "播放中",
"transcoding": "转码", "transcoding": "转码",
"bitrate": "比特率", "bitrate": "比特率",
"no_active": "暂无播放" "no_active": "暂无播放",
"plex_connection_error": "Check Plex Connection"
}, },
"rutorrent": { "rutorrent": {
"active": "活动中", "active": "活动中",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -44,7 +44,8 @@
"playing": "正在播放", "playing": "正在播放",
"transcoding": "轉碼", "transcoding": "轉碼",
"bitrate": "位元率", "bitrate": "位元率",
"no_active": "無播放活動" "no_active": "無播放活動",
"plex_connection_error": "Check Plex Connection"
}, },
"jellyseerr": { "jellyseerr": {
"pending": "待下載", "pending": "待下載",
@ -654,5 +655,15 @@
"kavita": { "kavita": {
"seriesCount": "Series", "seriesCount": "Series",
"totalFiles": "Files" "totalFiles": "Files"
},
"azurePipelines": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress"
} }
} }

View File

@ -1,3 +1,4 @@
import { useRef } from "react";
import classNames from "classnames"; import classNames from "classnames";
import { Disclosure, Transition } from '@headlessui/react'; import { Disclosure, Transition } from '@headlessui/react';
import { MdKeyboardArrowDown } from "react-icons/md"; import { MdKeyboardArrowDown } from "react-icons/md";
@ -6,6 +7,7 @@ import ErrorBoundary from "components/errorboundry";
import List from "components/bookmarks/list"; import List from "components/bookmarks/list";
export default function BookmarksGroup({ group, disableCollapse }) { export default function BookmarksGroup({ group, disableCollapse }) {
const panel = useRef();
return ( return (
<div key={group.name} className="flex-1"> <div key={group.name} className="flex-1">
<Disclosure defaultOpen> <Disclosure defaultOpen>
@ -15,19 +17,24 @@ export default function BookmarksGroup({ group, disableCollapse }) {
<h2 className="text-theme-800 dark:text-theme-300 text-xl font-medium">{group.name}</h2> <h2 className="text-theme-800 dark:text-theme-300 text-xl font-medium">{group.name}</h2>
<MdKeyboardArrowDown className={classNames( <MdKeyboardArrowDown className={classNames(
disableCollapse ? 'hidden' : '', disableCollapse ? 'hidden' : '',
'transition-opacity opacity-0 group-hover:opacity-100 ml-auto text-theme-800 dark:text-theme-300 text-xl', 'transition-all opacity-0 group-hover:opacity-100 ml-auto text-theme-800 dark:text-theme-300 text-xl',
open ? 'rotate-180 transform' : '' open ? '' : 'rotate-90'
)} /> )} />
</Disclosure.Button> </Disclosure.Button>
<Transition <Transition
enter="transition duration-200 ease-out" // Otherwise the transition group does display: none and cancels animation
enterFrom="transform scale-75 opacity-0" className="!block"
enterTo="transform scale-100 opacity-100" unmount={false}
leave="transition duration-75 ease-out" beforeLeave={() => {
leaveFrom="transform scale-100 opacity-100" panel.current.style.height = `${panel.current.scrollHeight}px`;
leaveTo="transform scale-75 opacity-0" setTimeout(() => {panel.current.style.height = `0`}, 1);
}}
beforeEnter={() => {
panel.current.style.height = `0px`;
setTimeout(() => {panel.current.style.height = `${panel.current.scrollHeight}px`}, 1);
}}
> >
<Disclosure.Panel> <Disclosure.Panel className="transition-all overflow-hidden duration-300 ease-out" ref={panel} static>
<ErrorBoundary> <ErrorBoundary>
<List bookmarks={group.bookmarks} /> <List bookmarks={group.bookmarks} />
</ErrorBoundary> </ErrorBoundary>

View File

@ -1,3 +1,4 @@
import { useRef } from "react";
import classNames from "classnames"; import classNames from "classnames";
import { Disclosure, Transition } from '@headlessui/react'; import { Disclosure, Transition } from '@headlessui/react';
import { MdKeyboardArrowDown } from "react-icons/md"; import { MdKeyboardArrowDown } from "react-icons/md";
@ -7,6 +8,8 @@ import ResolvedIcon from "components/resolvedicon";
export default function ServicesGroup({ group, services, layout, fiveColumns, disableCollapse }) { export default function ServicesGroup({ group, services, layout, fiveColumns, disableCollapse }) {
const panel = useRef();
return ( return (
<div <div
key={services.name} key={services.name}
@ -28,19 +31,24 @@ export default function ServicesGroup({ group, services, layout, fiveColumns, di
<h2 className="flex text-theme-800 dark:text-theme-300 text-xl font-medium">{services.name}</h2> <h2 className="flex text-theme-800 dark:text-theme-300 text-xl font-medium">{services.name}</h2>
<MdKeyboardArrowDown className={classNames( <MdKeyboardArrowDown className={classNames(
disableCollapse ? 'hidden' : '', disableCollapse ? 'hidden' : '',
'transition-opacity opacity-0 group-hover:opacity-100 ml-auto text-theme-800 dark:text-theme-300 text-xl', 'transition-all opacity-0 group-hover:opacity-100 ml-auto text-theme-800 dark:text-theme-300 text-xl',
open ? 'rotate-180 transform' : '' open ? '' : 'rotate-90'
)} /> )} />
</Disclosure.Button> </Disclosure.Button>
<Transition <Transition
enter="transition duration-200 ease-out" // Otherwise the transition group does display: none and cancels animation
enterFrom="transform scale-75 opacity-0" className="!block"
enterTo="transform scale-100 opacity-100" unmount={false}
leave="transition duration-75 ease-out" beforeLeave={() => {
leaveFrom="transform scale-100 opacity-100" panel.current.style.height = `${panel.current.scrollHeight}px`;
leaveTo="transform scale-75 opacity-0" setTimeout(() => {panel.current.style.height = `0`}, 1);
}}
beforeEnter={() => {
panel.current.style.height = `0px`;
setTimeout(() => {panel.current.style.height = `${panel.current.scrollHeight}px`}, 1);
}}
> >
<Disclosure.Panel> <Disclosure.Panel className="transition-all overflow-hidden duration-300 ease-out" ref={panel} static>
<List group={group} services={services.services} layout={layout} /> <List group={group} services={services.services} layout={layout} />
</Disclosure.Panel> </Disclosure.Panel>
</Transition> </Transition>

View File

@ -18,7 +18,8 @@ export default function Container({ error = false, children, service }) {
const childrenArray = Array.isArray(children) ? children : [children]; const childrenArray = Array.isArray(children) ? children : [children];
let visibleChildren = childrenArray; let visibleChildren = childrenArray;
const fields = service?.widget?.fields; let fields = service?.widget?.fields;
if (typeof service.widget.fields === 'string') fields = JSON.parse(service.widget.fields);
const type = service?.widget?.type; const type = service?.widget?.type;
if (fields && type) { if (fields && type) {
// if the field contains a "." then it most likely contains a common loc value // if the field contains a "." then it most likely contains a common loc value

View File

@ -37,7 +37,7 @@ export default function Widget({ options }) {
<Resource icon={FaMemory} label={t("glances.wait")} percentage="0" /> <Resource icon={FaMemory} label={t("glances.wait")} percentage="0" />
{ options.cputemp && <Resource icon={FaThermometerHalf} label={t("glances.wait")} percentage="0" /> } { options.cputemp && <Resource icon={FaThermometerHalf} label={t("glances.wait")} percentage="0" /> }
{ options.disk && !Array.isArray(options.disk) && <Resource key={options.disk} icon={FiHardDrive} label={t("glances.wait")} percentage="0" /> } { options.disk && !Array.isArray(options.disk) && <Resource key={options.disk} icon={FiHardDrive} label={t("glances.wait")} percentage="0" /> }
{ options.disk && Array.isArray(options.disk) && options.disk.map((disk) => <Resource key={disk.mnt_point} icon={FiHardDrive} label={t("glances.wait")} percentage="0" /> )} { options.disk && Array.isArray(options.disk) && options.disk.map((disk) => <Resource key={`disk_${disk.mnt_point}`} icon={FiHardDrive} label={t("glances.wait")} percentage="0" /> ) }
{ options.uptime && <Resource icon={FaRegClock} label={t("glances.wait")} percentage="0" /> } { options.uptime && <Resource icon={FaRegClock} label={t("glances.wait")} percentage="0" /> }
{ options.label && <WidgetLabel label={options.label} /> } { options.label && <WidgetLabel label={options.label} /> }
</Resources>; </Resources>;
@ -50,7 +50,7 @@ export default function Widget({ options }) {
if (options.cputemp && cpuSensors) { if (options.cputemp && cpuSensors) {
try { try {
mainTemp = cpuSensors.reduce((acc, s) => acc + s.value, 0) / cpuSensors.length; mainTemp = cpuSensors.reduce((acc, s) => acc + s.value, 0) / cpuSensors.length;
maxTemp = Math.max(cpuSensors.reduce((acc, s) => acc + s.warning, 0) / cpuSensors.length, maxTemp); maxTemp = Math.max(cpuSensors.reduce((acc, s) => acc + (s.warning > 0 ? s.warning : 0), 0) / cpuSensors.length, maxTemp);
if (unit === "fahrenheit") { if (unit === "fahrenheit") {
mainTemp = convertToFahrenheit(mainTemp); mainTemp = convertToFahrenheit(mainTemp);
maxTemp = convertToFahrenheit(maxTemp); maxTemp = convertToFahrenheit(maxTemp);
@ -108,7 +108,7 @@ export default function Widget({ options }) {
expanded={options.expanded} expanded={options.expanded}
/> />
{disks.map((disk) => ( {disks.map((disk) => (
<Resource key={disk.mnt_point} <Resource key={`disk_${disk.mnt_point}`}
icon={FiHardDrive} icon={FiHardDrive}
value={t("common.bytes", { value: disk.free })} value={t("common.bytes", { value: disk.free })}
label={t("glances.free")} label={t("glances.free")}

View File

@ -10,56 +10,58 @@ export default function Logo({ options }) {
{options.icon ? {options.icon ?
<ResolvedIcon icon={options.icon} width={48} height={48} /> : <ResolvedIcon icon={options.icon} width={48} height={48} /> :
// fallback to homepage logo // fallback to homepage logo
<svg <div className="w-12 h-12">
xmlns="http://www.w3.org/2000/svg" <svg
viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg"
style={{ viewBox="0 0 1024 1024"
enableBackground: "new 0 0 1024 1024", style={{
}} enableBackground: "new 0 0 1024 1024",
xmlSpace="preserve" }}
className="w-full h-full" xmlSpace="preserve"
> className="w-full h-full"
<style> >
{ <style>
".st0{display:none}.st3{stroke-linecap:square}.st3,.st4{fill:none;stroke:#fff;stroke-miterlimit:10}.st6{display:inline;fill:#333}.st7{fill:#fff}" {
} ".st0{display:none}.st3{stroke-linecap:square}.st3,.st4{fill:none;stroke:#fff;stroke-miterlimit:10}.st6{display:inline;fill:#333}.st7{fill:#fff}"
</style> }
<g id="Icon"> </style>
<path <g id="Icon">
d="M771.9 191c27.7 0 50.1 26.5 50.1 59.3v186.4l-100.2.3V250.3c0-32.8 22.4-59.3 50.1-59.3z" <path
style={{ d="M771.9 191c27.7 0 50.1 26.5 50.1 59.3v186.4l-100.2.3V250.3c0-32.8 22.4-59.3 50.1-59.3z"
fill: "rgba(var(--color-logo-start))",
}}
/>
<linearGradient
id="homepage_logo_gradient"
gradientUnits="userSpaceOnUse"
x1={200.746}
y1={225.015}
x2={764.986}
y2={789.255}
>
<stop
offset={0}
style={{ style={{
stopColor: "rgba(var(--color-logo-start))", fill: "rgba(var(--color-logo-start))",
}} }}
/> />
<stop <linearGradient
offset={1} id="homepage_logo_gradient"
gradientUnits="userSpaceOnUse"
x1={200.746}
y1={225.015}
x2={764.986}
y2={789.255}
>
<stop
offset={0}
style={{
stopColor: "rgba(var(--color-logo-start))",
}}
/>
<stop
offset={1}
style={{
stopColor: "rgba(var(--color-logo-stop))",
}}
/>
</linearGradient>
<path
d="M721.8 250.3c0-32.7 22.4-59.3 50.1-59.3H253.1c-27.7 0-50.1 26.5-50.1 59.3v582.2l90.2-75.7-.1-130.3H375v61.8l88-73.8 258.8 217.9V250.6"
style={{ style={{
stopColor: "rgba(var(--color-logo-stop))", fill: "url(#homepage_logo_gradient)",
}} }}
/> />
</linearGradient> </g>
<path </svg>
d="M721.8 250.3c0-32.7 22.4-59.3 50.1-59.3H253.1c-27.7 0-50.1 26.5-50.1 59.3v582.2l90.2-75.7-.1-130.3H375v61.8l88-73.8 258.8 217.9V250.6" </div>
style={{
fill: "url(#homepage_logo_gradient)",
}}
/>
</g>
</svg>
} }
</Raw> </Raw>
</Container> </Container>

View File

@ -1,7 +0,0 @@
import mapIcon from "utils/weather/openmeteo-condition-map";
export default function Icon({ condition, timeOfDay }) {
const IconComponent = mapIcon(condition, timeOfDay);
return <IconComponent className="w-10 h-10 text-theme-800 dark:text-theme-200" />;
}

View File

@ -10,8 +10,7 @@ import ContainerButton from "../widget/container_button";
import WidgetIcon from "../widget/widget_icon"; import WidgetIcon from "../widget/widget_icon";
import PrimaryText from "../widget/primary_text"; import PrimaryText from "../widget/primary_text";
import SecondaryText from "../widget/secondary_text"; import SecondaryText from "../widget/secondary_text";
import mapIcon from "../../../utils/weather/openmeteo-condition-map";
import Icon from "./icon";
function Widget({ options }) { function Widget({ options }) {
const { t } = useTranslation(); const { t } = useTranslation();
@ -33,10 +32,8 @@ function Widget({ options }) {
} }
const unit = options.units === "metric" ? "celsius" : "fahrenheit"; const unit = options.units === "metric" ? "celsius" : "fahrenheit";
const weatherInfo = { const condition = data.current_weather.weathercode;
condition: data.current_weather.weathercode, const timeOfDay = data.current_weather.time > data.daily.sunrise[0] && data.current_weather.time < data.daily.sunset[0] ? "day" : "night";
timeOfDay: data.current_weather.time > data.daily.sunrise[0] && data.current_weather.time < data.daily.sunset[0] ? "day" : "night"
};
return <Container options={options}> return <Container options={options}>
<PrimaryText> <PrimaryText>
@ -47,8 +44,8 @@ function Widget({ options }) {
unit, unit,
})} })}
</PrimaryText> </PrimaryText>
<SecondaryText>{t(`wmo.${data.current_weather.weathercode}-${weatherInfo.timeOfDay}`)}</SecondaryText> <SecondaryText>{t(`wmo.${data.current_weather.weathercode}-${timeOfDay}`)}</SecondaryText>
<WidgetIcon icon={Icon} size="xl" weatherInfo={weatherInfo} /> <WidgetIcon icon={mapIcon(condition, timeOfDay)} size="xl" />
</Container>; </Container>;
} }

View File

@ -1,7 +0,0 @@
import mapIcon from "utils/weather/owm-condition-map";
export default function Icon({ condition, timeOfDay }) {
const IconComponent = mapIcon(condition, timeOfDay);
return <IconComponent className="w-10 h-10 text-theme-800 dark:text-theme-200" />;
}

View File

@ -10,9 +10,7 @@ import ContainerButton from "../widget/container_button";
import PrimaryText from "../widget/primary_text"; import PrimaryText from "../widget/primary_text";
import SecondaryText from "../widget/secondary_text"; import SecondaryText from "../widget/secondary_text";
import WidgetIcon from "../widget/widget_icon"; import WidgetIcon from "../widget/widget_icon";
import mapIcon from "../../../utils/weather/owm-condition-map";
import Icon from "./icon";
function Widget({ options }) { function Widget({ options }) {
const { t, i18n } = useTranslation(); const { t, i18n } = useTranslation();
@ -35,15 +33,13 @@ function Widget({ options }) {
const unit = options.units === "metric" ? "celsius" : "fahrenheit"; const unit = options.units === "metric" ? "celsius" : "fahrenheit";
const weatherInfo = { const condition = data.weather[0].id;
condition: data.weather[0].id, const timeOfDay = data.dt > data.sys.sunrise && data.dt < data.sys.sunset ? "day" : "night";
timeOfDay: data.dt > data.sys.sunrise && data.dt < data.sys.sunset ? "day" : "night"
};
return <Container options={options}> return <Container options={options}>
<PrimaryText>{options.label && `${options.label}, ` }{t("common.number", { value: data.main.temp, style: "unit", unit })}</PrimaryText> <PrimaryText>{options.label && `${options.label}, ` }{t("common.number", { value: data.main.temp, style: "unit", unit })}</PrimaryText>
<SecondaryText>{data.weather[0].description}</SecondaryText> <SecondaryText>{data.weather[0].description}</SecondaryText>
<WidgetIcon icon={Icon} size="xl" weatherInfo={weatherInfo} /> <WidgetIcon icon={mapIcon(condition, timeOfDay)} size="xl" />
</Container>; </Container>;
} }

View File

@ -1,7 +0,0 @@
import mapIcon from "utils/weather/condition-map";
export default function Icon({ condition, timeOfDay }) {
const IconComponent = mapIcon(condition, timeOfDay);
return <IconComponent className="w-10 h-10 text-theme-800 dark:text-theme-200" />;
}

View File

@ -10,8 +10,7 @@ import PrimaryText from "../widget/primary_text";
import SecondaryText from "../widget/secondary_text"; import SecondaryText from "../widget/secondary_text";
import WidgetIcon from "../widget/widget_icon"; import WidgetIcon from "../widget/widget_icon";
import ContainerButton from "../widget/container_button"; import ContainerButton from "../widget/container_button";
import mapIcon from "../../../utils/weather/condition-map";
import Icon from "./icon";
function Widget({ options }) { function Widget({ options }) {
const { t, i18n } = useTranslation(); const { t, i18n } = useTranslation();
@ -33,10 +32,8 @@ function Widget({ options }) {
} }
const unit = options.units === "metric" ? "celsius" : "fahrenheit"; const unit = options.units === "metric" ? "celsius" : "fahrenheit";
const weatherInfo = { const condition = data.current.condition.code;
condition: data.current.condition.code, const timeOfDay = data.current.is_day ? "day" : "night";
timeOfDay: data.current.is_day ? "day" : "night",
};
return <Container options={options}> return <Container options={options}>
<PrimaryText> <PrimaryText>
@ -48,7 +45,7 @@ function Widget({ options }) {
})} })}
</PrimaryText> </PrimaryText>
<SecondaryText>{data.current.condition.text}</SecondaryText> <SecondaryText>{data.current.condition.text}</SecondaryText>
<WidgetIcon icon={Icon} size="xl" weatherInfo={weatherInfo} /> <WidgetIcon icon={mapIcon(condition, timeOfDay)} size="xl" />
</Container>; </Container>;
} }

View File

@ -1,6 +1,5 @@
export default function WidgetIcon({ icon, size = "s", pulse = false, weatherInfo = {} }) { export default function WidgetIcon({ icon, size = "s", pulse = false }) {
const Icon = icon; const Icon = icon;
const { condition, timeOfDay } = weatherInfo;
let additionalClasses = "text-theme-800 dark:text-theme-200 "; let additionalClasses = "text-theme-800 dark:text-theme-200 ";
switch (size) { switch (size) {
@ -14,5 +13,5 @@ export default function WidgetIcon({ icon, size = "s", pulse = false, weatherInf
additionalClasses += "animate-pulse "; additionalClasses += "animate-pulse ";
} }
return <Icon className={additionalClasses} condition={condition} timeOfDay={timeOfDay} />; return <Icon className={additionalClasses} />;
} }

View File

@ -2,7 +2,7 @@ import { join } from "path";
import { createHash } from "crypto"; import { createHash } from "crypto";
import { readFileSync } from "fs"; import { readFileSync } from "fs";
import checkAndCopyConfig from "utils/config/config"; import checkAndCopyConfig, { CONF_DIR } from "utils/config/config";
const configs = ["docker.yaml", "settings.yaml", "services.yaml", "bookmarks.yaml", "widgets.yaml"]; const configs = ["docker.yaml", "settings.yaml", "services.yaml", "bookmarks.yaml", "widgets.yaml"];
@ -15,7 +15,7 @@ function hash(buffer) {
export default async function handler(req, res) { export default async function handler(req, res) {
const hashes = configs.map((config) => { const hashes = configs.map((config) => {
checkAndCopyConfig(config); checkAndCopyConfig(config);
const configYaml = join(process.cwd(), "config", config); const configYaml = join(CONF_DIR, config);
return hash(readFileSync(configYaml, "utf8")); return hash(readFileSync(configYaml, "utf8"));
}); });

View File

@ -22,6 +22,7 @@ export default async function handler(req, res) {
if (widget?.mappings) { if (widget?.mappings) {
const mapping = widget?.mappings?.[req.query.endpoint]; const mapping = widget?.mappings?.[req.query.endpoint];
const mappingParams = mapping?.params; const mappingParams = mapping?.params;
const optionalParams = mapping?.optionalParams;
const map = mapping?.map; const map = mapping?.map;
const endpoint = mapping?.endpoint; const endpoint = mapping?.endpoint;
const endpointProxy = mapping?.proxyHandler || serviceProxyHandler; const endpointProxy = mapping?.proxyHandler || serviceProxyHandler;
@ -40,9 +41,17 @@ export default async function handler(req, res) {
req.query.endpoint = formatApiCall(endpoint, segments); req.query.endpoint = formatApiCall(endpoint, segments);
} }
if (req.query.query && mappingParams) { if (req.query.query && (mappingParams || optionalParams)) {
const queryParams = JSON.parse(req.query.query); const queryParams = JSON.parse(req.query.query);
const query = new URLSearchParams(mappingParams.map((p) => [p, queryParams[p]]));
let filteredOptionalParams = []
if (optionalParams) filteredOptionalParams = optionalParams.filter(p => queryParams[p] !== undefined);
let params = [];
if (mappingParams) params = params.concat(mappingParams);
if (filteredOptionalParams) params = params.concat(filteredOptionalParams);
const query = new URLSearchParams(params.map((p) => [p, queryParams[p]]));
req.query.endpoint = `${req.query.endpoint}?${query}`; req.query.endpoint = `${req.query.endpoint}?${query}`;
} }

View File

@ -4,7 +4,7 @@ import path from "path";
import yaml from "js-yaml"; import yaml from "js-yaml";
import checkAndCopyConfig, { getSettings, substituteEnvironmentVars } from "utils/config/config"; import checkAndCopyConfig, { getSettings, substituteEnvironmentVars, CONF_DIR } from "utils/config/config";
import { import {
servicesFromConfig, servicesFromConfig,
servicesFromDocker, servicesFromDocker,
@ -27,7 +27,7 @@ function compareServices(service1, service2) {
export async function bookmarksResponse() { export async function bookmarksResponse() {
checkAndCopyConfig("bookmarks.yaml"); checkAndCopyConfig("bookmarks.yaml");
const bookmarksYaml = path.join(process.cwd(), "config", "bookmarks.yaml"); const bookmarksYaml = path.join(CONF_DIR, "bookmarks.yaml");
const rawFileContents = await fs.readFile(bookmarksYaml, "utf8"); const rawFileContents = await fs.readFile(bookmarksYaml, "utf8");
const fileContents = substituteEnvironmentVars(rawFileContents); const fileContents = substituteEnvironmentVars(rawFileContents);
const bookmarks = yaml.load(fileContents); const bookmarks = yaml.load(fileContents);

View File

@ -1,6 +1,6 @@
/* eslint-disable no-console */ /* eslint-disable no-console */
import { join } from "path"; import { join } from "path";
import { existsSync, readFileSync, copyFileSync } from "fs"; import { copyFileSync, existsSync, mkdirSync, readFileSync } from "fs";
import cache from "memory-cache"; import cache from "memory-cache";
import yaml from "js-yaml"; import yaml from "js-yaml";
@ -9,8 +9,14 @@ const cacheKey = "homepageEnvironmentVariables";
const homepageVarPrefix = "HOMEPAGE_VAR_"; const homepageVarPrefix = "HOMEPAGE_VAR_";
const homepageFilePrefix = "HOMEPAGE_FILE_"; const homepageFilePrefix = "HOMEPAGE_FILE_";
export const CONF_DIR = process.env.HOMEPAGE_CONFIG_DIR ? process.env.HOMEPAGE_CONFIG_DIR : join(process.cwd(), "config");
export default function checkAndCopyConfig(config) { export default function checkAndCopyConfig(config) {
const configYaml = join(process.cwd(), "config", config); if (!existsSync(CONF_DIR)) {
mkdirSync(CONF_DIR, { recursive: true });
}
const configYaml = join(CONF_DIR, config);
if (!existsSync(configYaml)) { if (!existsSync(configYaml)) {
const configSkeleton = join(process.cwd(), "src", "skeleton", config); const configSkeleton = join(process.cwd(), "src", "skeleton", config);
try { try {
@ -62,7 +68,7 @@ export function substituteEnvironmentVars(str) {
export function getSettings() { export function getSettings() {
checkAndCopyConfig("settings.yaml"); checkAndCopyConfig("settings.yaml");
const settingsYaml = join(process.cwd(), "config", "settings.yaml"); const settingsYaml = join(CONF_DIR, "settings.yaml");
const rawFileContents = readFileSync(settingsYaml, "utf8"); const rawFileContents = readFileSync(settingsYaml, "utf8");
const fileContents = substituteEnvironmentVars(rawFileContents); const fileContents = substituteEnvironmentVars(rawFileContents);
const initialSettings = yaml.load(fileContents) ?? {}; const initialSettings = yaml.load(fileContents) ?? {};
@ -79,6 +85,5 @@ export function getSettings() {
}) })
} }
} }
return initialSettings return initialSettings
} }

View File

@ -3,12 +3,12 @@ import { readFileSync } from "fs";
import yaml from "js-yaml"; import yaml from "js-yaml";
import checkAndCopyConfig, { substituteEnvironmentVars } from "utils/config/config"; import checkAndCopyConfig, { CONF_DIR, substituteEnvironmentVars } from "utils/config/config";
export default function getDockerArguments(server) { export default function getDockerArguments(server) {
checkAndCopyConfig("docker.yaml"); checkAndCopyConfig("docker.yaml");
const configFile = path.join(process.cwd(), "config", "docker.yaml"); const configFile = path.join(CONF_DIR, "docker.yaml");
const rawConfigData = readFileSync(configFile, "utf8"); const rawConfigData = readFileSync(configFile, "utf8");
const configData = substituteEnvironmentVars(rawConfigData); const configData = substituteEnvironmentVars(rawConfigData);
const servers = yaml.load(configData); const servers = yaml.load(configData);
@ -37,9 +37,9 @@ export default function getDockerArguments(server) {
} }
if (servers[server].tls){ if (servers[server].tls){
res.conn.ca = readFileSync(path.join(process.cwd(), "config", servers[server].tls.caFile)); res.conn.ca = readFileSync(path.join(CONF_DIR, servers[server].tls.caFile));
res.conn.cert = readFileSync(path.join(process.cwd(), "config", servers[server].tls.certFile)); res.conn.cert = readFileSync(path.join(CONF_DIR, servers[server].tls.certFile));
res.conn.key = readFileSync(path.join(process.cwd(), "config", servers[server].tls.keyFile)); res.conn.key = readFileSync(path.join(CONF_DIR, servers[server].tls.keyFile));
} }
return res; return res;

View File

@ -4,12 +4,12 @@ import { readFileSync } from "fs";
import yaml from "js-yaml"; import yaml from "js-yaml";
import { KubeConfig } from "@kubernetes/client-node"; import { KubeConfig } from "@kubernetes/client-node";
import checkAndCopyConfig, { substituteEnvironmentVars } from "utils/config/config"; import checkAndCopyConfig, { CONF_DIR, substituteEnvironmentVars } from "utils/config/config";
export default function getKubeConfig() { export default function getKubeConfig() {
checkAndCopyConfig("kubernetes.yaml"); checkAndCopyConfig("kubernetes.yaml");
const configFile = path.join(process.cwd(), "config", "kubernetes.yaml"); const configFile = path.join(CONF_DIR, "kubernetes.yaml");
const rawConfigData = readFileSync(configFile, "utf8"); const rawConfigData = readFileSync(configFile, "utf8");
const configData = substituteEnvironmentVars(rawConfigData); const configData = substituteEnvironmentVars(rawConfigData);
const config = yaml.load(configData); const config = yaml.load(configData);

View File

@ -7,7 +7,7 @@ import * as shvl from "shvl";
import { CustomObjectsApi, NetworkingV1Api } from "@kubernetes/client-node"; import { CustomObjectsApi, NetworkingV1Api } from "@kubernetes/client-node";
import createLogger from "utils/logger"; import createLogger from "utils/logger";
import checkAndCopyConfig, { substituteEnvironmentVars } from "utils/config/config"; import checkAndCopyConfig, { CONF_DIR, substituteEnvironmentVars } from "utils/config/config";
import getDockerArguments from "utils/config/docker"; import getDockerArguments from "utils/config/docker";
import getKubeConfig from "utils/config/kubernetes"; import getKubeConfig from "utils/config/kubernetes";
@ -17,7 +17,7 @@ const logger = createLogger("service-helpers");
export async function servicesFromConfig() { export async function servicesFromConfig() {
checkAndCopyConfig("services.yaml"); checkAndCopyConfig("services.yaml");
const servicesYaml = path.join(process.cwd(), "config", "services.yaml"); const servicesYaml = path.join(CONF_DIR, "services.yaml");
const rawFileContents = await fs.readFile(servicesYaml, "utf8"); const rawFileContents = await fs.readFile(servicesYaml, "utf8");
const fileContents = substituteEnvironmentVars(rawFileContents); const fileContents = substituteEnvironmentVars(rawFileContents);
const services = yaml.load(fileContents); const services = yaml.load(fileContents);
@ -51,7 +51,7 @@ export async function servicesFromConfig() {
export async function servicesFromDocker() { export async function servicesFromDocker() {
checkAndCopyConfig("docker.yaml"); checkAndCopyConfig("docker.yaml");
const dockerYaml = path.join(process.cwd(), "config", "docker.yaml"); const dockerYaml = path.join(CONF_DIR, "docker.yaml");
const rawDockerFileContents = await fs.readFile(dockerYaml, "utf8"); const rawDockerFileContents = await fs.readFile(dockerYaml, "utf8");
const dockerFileContents = substituteEnvironmentVars(rawDockerFileContents); const dockerFileContents = substituteEnvironmentVars(rawDockerFileContents);
const servers = yaml.load(dockerFileContents); const servers = yaml.load(dockerFileContents);
@ -279,6 +279,7 @@ export function cleanServiceGroups(groups) {
container, container,
currency, // coinmarketcap widget currency, // coinmarketcap widget
symbols, symbols,
slugs,
defaultinterval, defaultinterval,
site, // unifi widget site, // unifi widget
namespace, // kubernetes widget namespace, // kubernetes widget
@ -289,6 +290,7 @@ export function cleanServiceGroups(groups) {
enableNowPlaying, enableNowPlaying,
volume, // diskstation widget, volume, // diskstation widget,
enableQueue, // sonarr/radarr enableQueue, // sonarr/radarr
node, // Proxmox
} = cleanedService.widget; } = cleanedService.widget;
let fieldsList = fields; let fieldsList = fields;
@ -299,7 +301,7 @@ export function cleanServiceGroups(groups) {
fieldsList = null; fieldsList = null;
} }
} }
cleanedService.widget = { cleanedService.widget = {
type, type,
fields: fieldsList || null, fields: fieldsList || null,
@ -308,9 +310,12 @@ export function cleanServiceGroups(groups) {
service_group: serviceGroup.name, service_group: serviceGroup.name,
}; };
if (currency) cleanedService.widget.currency = currency; if (type === "coinmarketcap") {
if (symbols) cleanedService.widget.symbols = symbols; if (currency) cleanedService.widget.currency = currency;
if (defaultinterval) cleanedService.widget.defaultinterval = defaultinterval; if (symbols) cleanedService.widget.symbols = symbols;
if (slugs) cleanedService.widget.slugs = slugs;
if (defaultinterval) cleanedService.widget.defaultinterval = defaultinterval;
}
if (type === "docker") { if (type === "docker") {
if (server) cleanedService.widget.server = server; if (server) cleanedService.widget.server = server;
@ -319,6 +324,9 @@ export function cleanServiceGroups(groups) {
if (type === "unifi") { if (type === "unifi") {
if (site) cleanedService.widget.site = site; if (site) cleanedService.widget.site = site;
} }
if (type === "proxmox") {
if (node) cleanedService.widget.node = node;
}
if (type === "kubernetes") { if (type === "kubernetes") {
if (namespace) cleanedService.widget.namespace = namespace; if (namespace) cleanedService.widget.namespace = namespace;
if (app) cleanedService.widget.app = app; if (app) cleanedService.widget.app = app;

View File

@ -3,12 +3,12 @@ import path from "path";
import yaml from "js-yaml"; import yaml from "js-yaml";
import checkAndCopyConfig, { substituteEnvironmentVars } from "utils/config/config"; import checkAndCopyConfig, { CONF_DIR, substituteEnvironmentVars } from "utils/config/config";
export async function widgetsFromConfig() { export async function widgetsFromConfig() {
checkAndCopyConfig("widgets.yaml"); checkAndCopyConfig("widgets.yaml");
const widgetsYaml = path.join(process.cwd(), "config", "widgets.yaml"); const widgetsYaml = path.join(CONF_DIR, "widgets.yaml");
const rawFileContents = await fs.readFile(widgetsYaml, "utf8"); const rawFileContents = await fs.readFile(widgetsYaml, "utf8");
const fileContents = substituteEnvironmentVars(rawFileContents); const fileContents = substituteEnvironmentVars(rawFileContents);
const widgets = yaml.load(fileContents); const widgets = yaml.load(fileContents);

View File

@ -1,18 +1,17 @@
/* eslint-disable no-console */ /* eslint-disable no-console */
import { join } from "path";
import { format as utilFormat } from "node:util"; import { format as utilFormat } from "node:util";
import winston from "winston"; import winston from "winston";
import checkAndCopyConfig, { getSettings } from "utils/config/config"; import checkAndCopyConfig, { getSettings, CONF_DIR } from "utils/config/config";
let winstonLogger; let winstonLogger;
function init() { function init() {
const configPath = join(process.cwd(), "config");
checkAndCopyConfig("settings.yaml"); checkAndCopyConfig("settings.yaml");
const settings = getSettings(); const settings = getSettings();
const logpath = settings.logpath || configPath; const logpath = settings.logpath || CONF_DIR;
function combineMessageAndSplat() { function combineMessageAndSplat() {
return { return {

View File

@ -61,6 +61,9 @@ export default async function credentialedProxyHandler(req, res, map) {
} else { } else {
headers.Authorization = `Basic ${Buffer.from(`${widget.username}:${widget.password}`).toString("base64")}`; headers.Authorization = `Basic ${Buffer.from(`${widget.username}:${widget.password}`).toString("base64")}`;
} }
}
else if (widget.type === "azurePipelines") {
headers.Authorization = `Basic ${Buffer.from(`$:${widget.key}`).toString("base64")}`;
} else { } else {
headers["X-API-Key"] = `${widget.key}`; headers["X-API-Key"] = `${widget.key}`;
} }

View File

@ -0,0 +1,36 @@
import { useTranslation } from "next-i18next";
import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
import useWidgetAPI from "utils/proxy/use-widget-api";
export default function Component({ service }) {
const { t } = useTranslation();
const { widget } = service;
const { data: pipelineData, error: pipelineError } = useWidgetAPI(widget);
if (pipelineError) {
return <Container service={service} error={pipelineError} />;
}
if (!pipelineData || !Array.isArray(pipelineData.value)) {
return (
<Container service={service}>
<Block label="azurePipelines.result" />
<Block label="azurePipelines.buildId" />
</Container>
);
}
return (
<Container service={service}>
{pipelineData.value[0].result ?
<Block label="azurePipelines.result" value={t(`azurePipelines.${pipelineData.value[0].result.toString()}`)} /> :
<Block label="azurePipelines.status" value={t(`azurePipelines.${pipelineData.value[0].status.toString()}`)} />
}
<Block label="azurePipelines.buildId" value= { pipelineData.value[0].id } />
</Container>
);
}

View File

@ -0,0 +1,8 @@
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
const widget = {
api: "https://dev.azure.com/{organization}/{project}/_apis/build/Builds?branchName={branchName}&definitions={definitionId}",
proxyHandler: credentialedProxyHandler,
};
export default widget;

View File

@ -19,17 +19,26 @@ export default function Component({ service }) {
const { widget } = service; const { widget } = service;
const { symbols } = widget; const { symbols } = widget;
const { slugs } = widget;
const currencyCode = widget.currency ?? "USD"; const currencyCode = widget.currency ?? "USD";
const interval = widget.defaultinterval ?? dateRangeOptions[0].value; const interval = widget.defaultinterval ?? dateRangeOptions[0].value;
const [dateRange, setDateRange] = useState(interval); const [dateRange, setDateRange] = useState(interval);
const { data: statsData, error: statsError } = useWidgetAPI(widget, "v1/cryptocurrency/quotes/latest", { const params = {
symbol: `${symbols.join(",")}`,
convert: `${currencyCode}`, convert: `${currencyCode}`,
}); }
if (!symbols || symbols.length === 0) { // slugs >> symbols, not both
if (slugs?.length) {
params.slug = slugs.join(",");
} else if (symbols?.length) {
params.symbol = symbols.join(",");
}
const { data: statsData, error: statsError } = useWidgetAPI(widget, "v1/cryptocurrency/quotes/latest", params);
if ((!symbols && !slugs) || (symbols?.length === 0 && slugs?.length === 0)) {
return ( return (
<Container service={service}> <Container service={service}>
<Block value={t("coinmarketcap.configure")} /> <Block value={t("coinmarketcap.configure")} />
@ -50,6 +59,7 @@ export default function Component({ service }) {
} }
const { data } = statsData; const { data } = statsData;
const validCryptos = Object.values(data).filter(crypto => crypto.quote[currencyCode][`percent_change_${dateRange}`] !== null)
return ( return (
<Container service={service}> <Container service={service}>
@ -58,28 +68,28 @@ export default function Component({ service }) {
</div> </div>
<div className="flex flex-col w-full"> <div className="flex flex-col w-full">
{symbols.map((symbol) => ( {validCryptos.map((crypto) => (
<div <div
key={data[symbol].symbol} key={crypto.id}
className="bg-theme-200/50 dark:bg-theme-900/20 rounded m-1 flex-1 flex flex-row items-center justify-between p-1 text-xs" className="bg-theme-200/50 dark:bg-theme-900/20 rounded m-1 flex-1 flex flex-row items-center justify-between p-1 text-xs"
> >
<div className="font-thin pl-2">{data[symbol].name}</div> <div className="font-thin pl-2">{crypto.name}</div>
<div className="flex flex-row text-right"> <div className="flex flex-row text-right">
<div className="font-bold mr-2"> <div className="font-bold mr-2">
{t("common.number", { {t("common.number", {
value: data[symbol].quote[currencyCode].price, value: crypto.quote[currencyCode].price,
style: "currency", style: "currency",
currency: currencyCode, currency: currencyCode,
})} })}
</div> </div>
<div <div
className={`font-bold w-10 mr-2 ${ className={`font-bold w-10 mr-2 ${
data[symbol].quote[currencyCode][`percent_change_${dateRange}`] > 0 crypto.quote[currencyCode][`percent_change_${dateRange}`] > 0
? "text-emerald-300" ? "text-emerald-300"
: "text-rose-300" : "text-rose-300"
}`} }`}
> >
{data[symbol].quote[currencyCode][`percent_change_${dateRange}`].toFixed(2)}% {crypto.quote[currencyCode][`percent_change_${dateRange}`].toFixed(2)}%
</div> </div>
</div> </div>
</div> </div>

View File

@ -7,7 +7,8 @@ const widget = {
mappings: { mappings: {
"v1/cryptocurrency/quotes/latest": { "v1/cryptocurrency/quotes/latest": {
endpoint: "v1/cryptocurrency/quotes/latest", endpoint: "v1/cryptocurrency/quotes/latest",
params: ["symbol", "convert"], params: ["convert"],
optionalParams: ["symbol", "slug"],
}, },
}, },
}; };

View File

@ -5,6 +5,7 @@ const components = {
audiobookshelf: dynamic(() => import("./audiobookshelf/component")), audiobookshelf: dynamic(() => import("./audiobookshelf/component")),
authentik: dynamic(() => import("./authentik/component")), authentik: dynamic(() => import("./authentik/component")),
autobrr: dynamic(() => import("./autobrr/component")), autobrr: dynamic(() => import("./autobrr/component")),
azurePipelines: dynamic(() => import("./azurePipelines/component")),
bazarr: dynamic(() => import("./bazarr/component")), bazarr: dynamic(() => import("./bazarr/component")),
caddy: dynamic(() => import("./caddy/component")), caddy: dynamic(() => import("./caddy/component")),
changedetectionio: dynamic(() => import("./changedetectionio/component")), changedetectionio: dynamic(() => import("./changedetectionio/component")),

View File

@ -4,6 +4,7 @@ import Container from "components/services/widget/container";
import Block from "components/services/widget/block"; import Block from "components/services/widget/block";
import useWidgetAPI from "utils/proxy/use-widget-api"; import useWidgetAPI from "utils/proxy/use-widget-api";
function calcRunning(total, current) { function calcRunning(total, current) {
return current.status === "running" ? total + 1 : total; return current.status === "running" ? total + 1 : total;
} }
@ -25,29 +26,40 @@ export default function Component({ service }) {
<Block label="proxmox.vms" /> <Block label="proxmox.vms" />
<Block label="proxmox.lxc" /> <Block label="proxmox.lxc" />
<Block label="resources.cpu" /> <Block label="resources.cpu" />
<Block label="resources.ram" /> <Block label="resources.mem" />
</Container> </Container>
); );
} }
const { data } = clusterData ; const { data } = clusterData ;
const vms = data.filter(item => item.type === "qemu" && item.template === 0) || []; const vms = data.filter(item => item.type === "qemu" && item.template === 0 && (widget.node === undefined || widget.node === item.node)) || [];
const lxc = data.filter(item => item.type === "lxc" && item.template === 0) || []; const lxc = data.filter(item => item.type === "lxc" && item.template === 0 && (widget.node === undefined || widget.node === item.node)) || [];
const nodes = data.filter(item => item.type === "node") || []; const nodes = data.filter(item => item.type === "node" && (widget.node === undefined || widget.node === item.node)) || [];
const runningVMs = vms.reduce(calcRunning, 0); const runningVMs = vms.reduce(calcRunning, 0);
const runningLXC = lxc.reduce(calcRunning, 0); const runningLXC = lxc.reduce(calcRunning, 0);
// TODO: support more than one node if (nodes.length === 0) {
// TODO: better handling of cluster with zero nodes return (
const node = nodes.length > 0 ? nodes[0] : { cpu: 0.0, mem: 0, maxmem: 0 }; <Container service={service}>
<Block label="proxmox.vms" value={`${runningVMs} / ${vms.length}`} />
<Block label="proxmox.lxc" value={`${runningLXC} / ${lxc.length}`} />
<Block label="resources.cpu" />
<Block label="resources.mem" />
</Container>
);
}
const maxMemory = nodes.reduce((sum, n) => n.maxmem + sum, 0);
const usedMemory = nodes.reduce((sum, n) => n.mem + sum, 0);
const maxCpu = nodes.reduce((sum, n) => n.maxcpu + sum, 0);
const usedCpu = nodes.reduce((sum, n) => (n.cpu * n.maxcpu) + sum, 0);
return ( return (
<Container service={service}> <Container service={service}>
<Block label="proxmox.vms" value={`${runningVMs} / ${vms.length}`} /> <Block label="proxmox.vms" value={`${runningVMs} / ${vms.length}`} />
<Block label="proxmox.lxc" value={`${runningLXC} / ${lxc.length}`} /> <Block label="proxmox.lxc" value={`${runningLXC} / ${lxc.length}`} />
<Block label="resources.cpu" value={t("common.percent", { value: (node.cpu * 100) })} /> <Block label="resources.cpu" value={t("common.percent", { value: ((usedCpu / maxCpu) * 100) })} />
<Block label="resources.mem" value={t("common.percent", { value: ((node.mem / node.maxmem) * 100) })} /> <Block label="resources.mem" value={t("common.percent", { value: ((usedMemory / maxMemory) * 100) })} />
</Container> </Container>
); );
} }

View File

@ -122,8 +122,8 @@ export default function Component({ service }) {
refreshInterval: 5000, refreshInterval: 5000,
}); });
if (activityError) { if (activityError || (activityData && Object.keys(activityData.response.data).length === 0)) {
return <Container service={service} error={activityError} />; return <Container service={service} error={activityError ?? { message: t("tautulli.plex_connection_error") } } />;
} }
if (!activityData) { if (!activityData) {

View File

@ -2,6 +2,7 @@ import adguard from "./adguard/widget";
import audiobookshelf from "./audiobookshelf/widget"; import audiobookshelf from "./audiobookshelf/widget";
import authentik from "./authentik/widget"; import authentik from "./authentik/widget";
import autobrr from "./autobrr/widget"; import autobrr from "./autobrr/widget";
import azurePipelines from "./azurePipelines/widget";
import bazarr from "./bazarr/widget"; import bazarr from "./bazarr/widget";
import caddy from "./caddy/widget"; import caddy from "./caddy/widget";
import changedetectionio from "./changedetectionio/widget"; import changedetectionio from "./changedetectionio/widget";
@ -95,6 +96,7 @@ const widgets = {
audiobookshelf, audiobookshelf,
authentik, authentik,
autobrr, autobrr,
azurePipelines,
bazarr, bazarr,
caddy, caddy,
changedetectionio, changedetectionio,