diff --git a/public/locales/ar/common.json b/public/locales/ar/common.json index 2f80f21a..6ff5acab 100644 --- a/public/locales/ar/common.json +++ b/public/locales/ar/common.json @@ -141,7 +141,8 @@ "playing": "يشتغل", "transcoding": "التحويل", "bitrate": "معدل البت", - "no_active": "No Active Streams" + "no_active": "No Active Streams", + "plex_connection_error": "Check Plex Connection" }, "nzbget": { "rate": "معدل", @@ -654,5 +655,15 @@ "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" } } diff --git a/public/locales/bg/common.json b/public/locales/bg/common.json index 594d2870..d0dea6a9 100644 --- a/public/locales/bg/common.json +++ b/public/locales/bg/common.json @@ -89,7 +89,8 @@ "playing": "Възпроизвежда", "transcoding": "Конвертира", "bitrate": "Честота", - "no_active": "Няма активни потоци" + "no_active": "Няма активни потоци", + "plex_connection_error": "Check Plex Connection" }, "nzbget": { "rate": "Rate", @@ -654,5 +655,15 @@ "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" } } diff --git a/public/locales/ca/common.json b/public/locales/ca/common.json index 5d4082da..83fc95a4 100644 --- a/public/locales/ca/common.json +++ b/public/locales/ca/common.json @@ -80,7 +80,8 @@ "playing": "Reproduint", "transcoding": "Transcodificant", "bitrate": "Taxa de bits", - "no_active": "Sense transmissions actives" + "no_active": "Sense transmissions actives", + "plex_connection_error": "Check Plex Connection" }, "nzbget": { "rate": "Taxa", @@ -654,5 +655,15 @@ "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" } } diff --git a/public/locales/cs/common.json b/public/locales/cs/common.json index 164cc194..ed5dc276 100644 --- a/public/locales/cs/common.json +++ b/public/locales/cs/common.json @@ -46,8 +46,8 @@ }, "unifi": { "users": "Uživatelé", - "uptime": "Doba provozu systému", - "days": "Dnů", + "uptime": "Doba provozu", + "days": "dní", "wan": "WAN", "lan": "LAN", "wlan": "WLAN", @@ -56,8 +56,8 @@ "wlan_devices": "Zařízení WLAN", "lan_users": "Uživatelé LAN", "wlan_users": "Uživatelé WLAN", - "up": "BĚŽÍ", - "down": "NEBĚŽÍ", + "up": "FUNKČNÍ", + "down": "NEFUNKČNÍ", "wait": "Počkejte prosím", "empty_data": "Stav podsystému neznámý" }, @@ -95,7 +95,8 @@ "playing": "Přehrává", "transcoding": "Překódovávání", "bitrate": "Přenosová rychlost", - "no_active": "Žádný aktivní stream" + "no_active": "Žádný aktivní stream", + "plex_connection_error": "Check Plex Connection" }, "nzbget": { "rate": "Rychlost", @@ -654,5 +655,15 @@ "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" } } diff --git a/public/locales/da/common.json b/public/locales/da/common.json index 3ff03563..797f9f4a 100644 --- a/public/locales/da/common.json +++ b/public/locales/da/common.json @@ -234,7 +234,8 @@ "playing": "Afspiller", "transcoding": "Transcoder", "bitrate": "Bitrate", - "no_active": "Ingen Aktive Streams" + "no_active": "Ingen Aktive Streams", + "plex_connection_error": "Check Plex Connection" }, "nzbget": { "rate": "Rate", @@ -654,5 +655,15 @@ "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" } } diff --git a/public/locales/de/common.json b/public/locales/de/common.json index 8b5dca93..8bd743ea 100644 --- a/public/locales/de/common.json +++ b/public/locales/de/common.json @@ -56,7 +56,8 @@ "playing": "Spielen", "transcoding": "Transcodierung", "bitrate": "Bitrate", - "no_active": "Keine aktiven Streams" + "no_active": "Keine aktiven Streams", + "plex_connection_error": "Check Plex Connection" }, "rutorrent": { "active": "Aktiv", @@ -654,5 +655,15 @@ "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" } } diff --git a/public/locales/el/common.json b/public/locales/el/common.json index a3be18f2..506a25d7 100644 --- a/public/locales/el/common.json +++ b/public/locales/el/common.json @@ -162,7 +162,8 @@ "playing": "Αναπαράγει", "transcoding": "Μετακωδικοποίηση", "bitrate": "Ρυθμός bit", - "no_active": "Δεν υπάρχουν ενεργές ροές" + "no_active": "Δεν υπάρχουν ενεργές ροές", + "plex_connection_error": "Check Plex Connection" }, "nzbget": { "rate": "Ρυθμός", @@ -654,5 +655,15 @@ "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" } } diff --git a/public/locales/en/common.json b/public/locales/en/common.json index 409445d9..027b227f 100644 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -129,7 +129,8 @@ "playing": "Playing", "transcoding": "Transcoding", "bitrate": "Bitrate", - "no_active": "No Active Streams" + "no_active": "No Active Streams", + "plex_connection_error": "Check Plex Connection" }, "omada": { "connectedAp": "Connected APs", @@ -663,5 +664,15 @@ "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" } } \ No newline at end of file diff --git a/public/locales/eo/common.json b/public/locales/eo/common.json index c3c1c87d..4a1ae6f3 100644 --- a/public/locales/eo/common.json +++ b/public/locales/eo/common.json @@ -87,7 +87,8 @@ "playing": "Playing", "transcoding": "Transcoding", "bitrate": "Bitrate", - "no_active": "No Active Streams" + "no_active": "No Active Streams", + "plex_connection_error": "Check Plex Connection" }, "nzbget": { "rate": "Rate", @@ -654,5 +655,15 @@ "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" } } diff --git a/public/locales/es/common.json b/public/locales/es/common.json index 498cb8b8..c4712669 100644 --- a/public/locales/es/common.json +++ b/public/locales/es/common.json @@ -56,7 +56,8 @@ "playing": "Reproduciendo", "transcoding": "Transcodificando", "bitrate": "Tasa de bits", - "no_active": "Sin transmisiones activas" + "no_active": "Sin transmisiones activas", + "plex_connection_error": "Comprueba la conexión a Plex" }, "rutorrent": { "active": "Activo", @@ -654,5 +655,15 @@ "kavita": { "seriesCount": "Serie", "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" } } diff --git a/public/locales/eu/common.json b/public/locales/eu/common.json new file mode 100644 index 00000000..27685703 --- /dev/null +++ b/public/locales/eu/common.json @@ -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" + } +} diff --git a/public/locales/fi/common.json b/public/locales/fi/common.json index 306c5b2b..ad457f2c 100644 --- a/public/locales/fi/common.json +++ b/public/locales/fi/common.json @@ -62,7 +62,8 @@ "playing": "Toistaa", "transcoding": "Transkoodaa", "bitrate": "Bittinopeus", - "no_active": "Ei aktiivisia striimejä" + "no_active": "Ei aktiivisia striimejä", + "plex_connection_error": "Check Plex Connection" }, "nzbget": { "rate": "Nopeus", @@ -654,5 +655,15 @@ "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" } } diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json index 55da9947..79187db3 100644 --- a/public/locales/fr/common.json +++ b/public/locales/fr/common.json @@ -56,7 +56,8 @@ "playing": "En lecture", "transcoding": "Transcodage", "bitrate": "Débit", - "no_active": "Aucun flux actif" + "no_active": "Aucun flux actif", + "plex_connection_error": "Vérifier la connexion à Plex" }, "rutorrent": { "active": "Actif", @@ -654,5 +655,15 @@ "kavita": { "seriesCount": "Séries", "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" } } diff --git a/public/locales/he/common.json b/public/locales/he/common.json index 6fa54751..78545f39 100644 --- a/public/locales/he/common.json +++ b/public/locales/he/common.json @@ -62,7 +62,8 @@ "playing": "מנגן", "transcoding": "מקודד", "bitrate": "סיביות", - "no_active": "אין הזרמות פעילות" + "no_active": "אין הזרמות פעילות", + "plex_connection_error": "Check Plex Connection" }, "nzbget": { "rate": "יחס", @@ -654,5 +655,15 @@ "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" } } diff --git a/public/locales/hi/common.json b/public/locales/hi/common.json index 88a100c3..70dd22e8 100644 --- a/public/locales/hi/common.json +++ b/public/locales/hi/common.json @@ -117,7 +117,8 @@ "playing": "Playing", "transcoding": "Transcoding", "bitrate": "Bitrate", - "no_active": "No Active Streams" + "no_active": "No Active Streams", + "plex_connection_error": "Check Plex Connection" }, "nzbget": { "rate": "Rate", @@ -654,5 +655,15 @@ "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" } } diff --git a/public/locales/hr/common.json b/public/locales/hr/common.json index a5390eb1..49e13492 100644 --- a/public/locales/hr/common.json +++ b/public/locales/hr/common.json @@ -104,7 +104,8 @@ "playing": "Reprodukcija", "transcoding": "Prekodiranje", "bitrate": "Stopa bitova", - "no_active": "Nema aktivnih prijenosa" + "no_active": "Nema aktivnih prijenosa", + "plex_connection_error": "Provjeri Plex vezu" }, "nzbget": { "rate": "Stopa", @@ -654,5 +655,15 @@ "kavita": { "seriesCount": "Serije", "totalFiles": "Datoteke" + }, + "azurePipelines": { + "result": "Result", + "status": "Status", + "buildId": "Build ID", + "succeeded": "Succeeded", + "notStarted": "Not Started", + "failed": "Failed", + "canceled": "Canceled", + "inProgress": "In Progress" } } diff --git a/public/locales/hu/common.json b/public/locales/hu/common.json index f4b1509c..56bfd877 100644 --- a/public/locales/hu/common.json +++ b/public/locales/hu/common.json @@ -4,15 +4,15 @@ "free": "Szabad", "used": "Használt", "load": "Terhelés", - "cpu": "CPU", + "cpu": "Processzor", "mem": "MEM", "temp": "TEMP", "max": "Max", - "uptime": "UP", - "months": "mo", - "days": "d", - "hours": "h", - "minutes": "m" + "uptime": "FUT", + "months": "hó", + "days": "n", + "hours": "ó", + "minutes": "p" }, "docker": { "rx": "RX", @@ -20,20 +20,20 @@ "mem": "MEM", "cpu": "CPU", "offline": "Offline", - "error": "Error", - "unknown": "Unknown", - "unhealthy": "Unhealthy", - "running": "Running", - "starting": "Starting", - "not_found": "Not Found", - "exited": "Exited", - "partial": "Partial", - "healthy": "Healthy" + "error": "Hiba", + "unknown": "Ismeretlen", + "unhealthy": "Egészségtelen", + "running": "Futó", + "starting": "Indul", + "not_found": "Nem található", + "exited": "Kilépett", + "partial": "Részleges", + "healthy": "Egészséges" }, "lidarr": { "wanted": "Keresett", "queued": "Sorban áll", - "artists": "Artists" + "artists": "Előadók" }, "readarr": { "wanted": "Keresett", @@ -48,16 +48,16 @@ "missing_type": "Hiányzó Widget Típus: {{type}}", "api_error": "API Hiba", "status": "Státusz", - "information": "Information", + "information": "Információ", "url": "URL", - "raw_error": "Raw Error", - "response_data": "Response Data" + "raw_error": "Nyers hiba", + "response_data": "Válaszadatok" }, "weather": { "current": "Aktuális hely", "allow": "Kattints az engedélyezéshez", "updating": "Frissítés", - "wait": "Kérlek várj" + "wait": "Kérjük várjon" }, "search": { "placeholder": "Keresés…" @@ -76,7 +76,8 @@ "playing": "Lejátszás folyamatban", "transcoding": "Átkódolás", "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": { "rate": "Ráta", @@ -109,16 +110,16 @@ "wanted": "Keresett", "queued": "Sorban áll", "series": "Sorozat", - "queue": "Queue", - "unknown": "Unknown" + "queue": "Várólista", + "unknown": "Ismeretlen" }, "radarr": { "wanted": "Keresett", "queued": "Sorban áll", "movies": "Filmek", - "missing": "Missing", - "queue": "Queue", - "unknown": "Unknown" + "missing": "Hiányzik", + "queue": "Várólista", + "unknown": "Ismeretlen" }, "ombi": { "pending": "Függőben", @@ -134,13 +135,13 @@ "pending": "Függőben", "approved": "Engedélyezett", "available": "Elérhető", - "processing": "Processing" + "processing": "Feldolgozás" }, "pihole": { "queries": "Lekérdezések", "blocked": "Blokkolt", "gravity": "Gravitáció", - "blocked_percent": "Blocked %" + "blocked_percent": "Blokkolt %" }, "adguard": { "queries": "Lekérdezések", @@ -192,184 +193,184 @@ "errored": "Hibás" }, "mastodon": { - "user_count": "Users", - "status_count": "Posts", - "domain_count": "Domains" + "user_count": "Felhasználók", + "status_count": "Posztok", + "domain_count": "Domainek" }, "strelaysrv": { - "numActiveSessions": "Sessions", - "numConnections": "Connections", - "dataRelayed": "Relayed", - "transferRate": "Rate" + "numActiveSessions": "Munkamenetek", + "numConnections": "Csatlakozások", + "dataRelayed": "Átirányított", + "transferRate": "Ráta" }, "authentik": { - "users": "Users", - "loginsLast24H": "Logins (24h)", - "failedLoginsLast24H": "Failed Logins (24h)" + "users": "Felhasználók", + "loginsLast24H": "Bejelentkezések (24 óra)", + "failedLoginsLast24H": "Sikertelen bejelentkezések (24h)" }, "proxmox": { - "mem": "MEM", - "cpu": "CPU", + "mem": "RAM", + "cpu": "Processzor", "lxc": "LXC", - "vms": "VMs" + "vms": "VM-ek" }, "unifi": { - "users": "Users", - "uptime": "System Uptime", - "days": "Days", + "users": "Felhasználók", + "uptime": "Rendszer üzemidő", + "days": "Napok", "wan": "WAN", - "lan_users": "LAN Users", - "wlan_users": "WLAN Users", - "up": "UP", - "down": "DOWN", - "wait": "Please wait", + "lan_users": "LAN Felhasználók", + "wlan_users": "WLAN Felhasználók", + "up": "FUT", + "down": "ÁLL", + "wait": "Kérjük várjon", "lan": "LAN", "wlan": "WLAN", - "devices": "Devices", - "lan_devices": "LAN Devices", - "wlan_devices": "WLAN Devices", - "empty_data": "Subsystem status unknown" + "devices": "Eszközök", + "lan_devices": "LAN Eszközök", + "wlan_devices": "WLAN Eszközök", + "empty_data": "Az alrendszer állapota ismeretlen" }, "plex": { - "streams": "Active Streams", - "movies": "Movies", - "tv": "TV Shows", - "albums": "Albums" + "streams": "Aktív Stream-ek", + "movies": "Filmek", + "tv": "TV műsorok", + "albums": "Albumok" }, "glances": { - "cpu": "CPU", - "wait": "Please wait", - "temp": "TEMP", - "uptime": "UP", - "days": "d", - "hours": "h", - "load": "Load", - "warn": "Warn", - "total": "Total", - "free": "Free", - "used": "Used" + "cpu": "Processzor", + "wait": "Kérjük várjon", + "temp": "HŐMÉRSÉKLET", + "uptime": "FUT", + "days": "n", + "hours": "ó", + "load": "Kapacitáskihasználás", + "warn": "Figyelmeztet", + "total": "Összes", + "free": "Szabad", + "used": "Felhasznált" }, "changedetectionio": { - "totalObserved": "Total Observed", - "diffsDetected": "Diffs Detected" + "totalObserved": "Összes Megfigyelt", + "diffsDetected": "Észlelt különbségek" }, "wmo": { "0-day": "Napos", "0-night": "Derült", - "3-day": "Cloudy", - "3-night": "Cloudy", - "45-day": "Foggy", - "53-day": "Drizzle", - "56-night": "Light Freezing Drizzle", - "57-day": "Freezing Drizzle", + "3-day": "Felhős", + "3-night": "Felhős", + "45-day": "Ködös", + "53-day": "Szitálás", + "56-night": "Enyhe fagyos szitálás", + "57-day": "Fagyos szitálás", "1-day": "Többnyire napos", "1-night": "Többnyire derült", - "2-day": "Partly Cloudy", - "2-night": "Partly Cloudy", - "45-night": "Foggy", - "48-day": "Foggy", - "48-night": "Foggy", - "51-day": "Light Drizzle", - "51-night": "Light Drizzle", - "57-night": "Freezing Drizzle", - "61-day": "Light Rain", - "61-night": "Light Rain", - "53-night": "Drizzle", - "55-day": "Heavy Drizzle", - "55-night": "Heavy Drizzle", - "56-day": "Light Freezing Drizzle", - "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", - "95-night": "Thunderstorm", - "96-day": "Thunderstorm With Hail", - "96-night": "Thunderstorm With Hail", - "99-day": "Thunderstorm With Hail", - "99-night": "Thunderstorm With Hail" + "2-day": "Részben felhős", + "2-night": "Részben felhős", + "45-night": "Ködös", + "48-day": "Ködös", + "48-night": "Ködös", + "51-day": "Enyhe szitálás", + "51-night": "Enyhe szitálás", + "57-night": "Fagyos szitálás", + "61-day": "Enyhe eső", + "61-night": "Enyhe eső", + "53-night": "Szitálás", + "55-day": "Erős szitálás", + "55-night": "Erős szitálás", + "56-day": "Enyhe fagyos szitálás", + "63-day": "Eső", + "63-night": "Eső", + "65-day": "Heves eső", + "65-night": "Heves eső", + "66-day": "Ónos eső", + "66-night": "Ónos eső", + "67-day": "Ónos eső", + "67-night": "Ónos eső", + "71-day": "Enyhe havazás", + "71-night": "Enyhe havazás", + "73-day": "Hó", + "73-night": "Hó", + "75-day": "Erős havazás", + "75-night": "Erős havazás", + "77-day": "Hódara", + "77-night": "Hódara", + "80-day": "Enyhe záporok", + "80-night": "Enyhe záporok", + "81-day": "Záporok", + "81-night": "Záporok", + "82-day": "Heves záporok", + "82-night": "Heves záporok", + "85-day": "Hózáporok", + "85-night": "Hózáporok", + "86-day": "Hózáporok", + "86-night": "Hózáporok", + "95-day": "Zivatar", + "95-night": "Zivatar", + "96-day": "Zivatar jégesővel", + "96-night": "Zivatar jégesővel", + "99-day": "Zivatar jégesővel", + "99-night": "Zivatar jégesővel" }, "quicklaunch": { - "bookmark": "Bookmark", - "service": "Service", - "search": "Search", - "custom": "Custom", - "visit": "Visit", + "bookmark": "Könyvjelző", + "service": "Szolgáltatás", + "search": "Keresés", + "custom": "Egyedi", + "visit": "Megnéz", "url": "URL" }, "homebridge": { - "available_update": "System", - "updates": "Updates", - "update_available": "Update Available", - "up_to_date": "Up to Date", - "child_bridges": "Child Bridges", + "available_update": "Rendszer", + "updates": "Frissítések", + "update_available": "Elérhető Frissítés", + "up_to_date": "Naprakész", + "child_bridges": "Gyerek Hidak", "child_bridges_status": "{{ok}}/{{total}}", - "up": "Up", - "pending": "Pending", - "down": "Down" + "up": "Fut", + "pending": "Függőben", + "down": "Áll" }, "autobrr": { - "approvedPushes": "Approved", - "rejectedPushes": "Rejected", - "filters": "Filters", - "indexers": "Indexers" + "approvedPushes": "Jóváhagyott", + "rejectedPushes": "Elutasított", + "filters": "Szűrők", + "indexers": "Indexelők" }, "watchtower": { - "containers_scanned": "Scanned", - "containers_updated": "Updated", - "containers_failed": "Failed" + "containers_scanned": "Beolvasott", + "containers_updated": "Frissített", + "containers_failed": "Sikertelen" }, "tubearchivist": { - "downloads": "Queue", - "videos": "Videos", - "channels": "Channels", - "playlists": "Playlists" + "downloads": "Várólista", + "videos": "Videók", + "channels": "Csatornák", + "playlists": "Lejátszási listák" }, "truenas": { - "load": "System Load", - "uptime": "Uptime", - "alerts": "Alerts", + "load": "Rendszerterheltség", + "uptime": "Üzemidő", + "alerts": "Riasztások", "time": "{{value, number(style: unit; unitDisplay: long;)}}" }, "navidrome": { - "nothing_streaming": "No Active Streams", - "please_wait": "Please Wait" + "nothing_streaming": "Nincsenek Aktív Stream-ek", + "please_wait": "Kérjük Várjon" }, "pyload": { - "speed": "Speed", - "active": "Active", - "queue": "Queue", - "total": "Total" + "speed": "Sebesség", + "active": "Aktív", + "queue": "Várólista", + "total": "Összes" }, "gluetun": { - "public_ip": "Public IP", - "region": "Region", - "country": "Country" + "public_ip": "Nyilvános IP-cím", + "region": "Régió", + "country": "Ország" }, "hdhomerun": { - "channels": "Channels", + "channels": "Csatornák", "hd": "HD" }, "ping": { @@ -377,197 +378,197 @@ "ping": "Ping" }, "scrutiny": { - "passed": "Passed", - "failed": "Failed", - "unknown": "Unknown" + "passed": "Megfelelt", + "failed": "Sikertelen", + "unknown": "Ismeretlen" }, "paperlessngx": { - "inbox": "Inbox", - "total": "Total" + "inbox": "Beérkezett", + "total": "Összes" }, "deluge": { - "download": "Download", + "download": "Letöltés", "seed": "Seed", - "upload": "Upload", + "upload": "Feltöltés", "leech": "Leech" }, "flood": { - "download": "Download", - "upload": "Upload", + "download": "Letöltés", + "upload": "Feltöltés", "leech": "Leech", "seed": "Seed" }, "tdarr": { - "queue": "Queue", - "processed": "Processed", - "errored": "Errored", - "saved": "Saved" + "queue": "Várólista", + "processed": "Feldolgozott", + "errored": "Hibás", + "saved": "Mentett" }, "miniflux": { - "read": "Read", - "unread": "Unread" + "read": "Olvasott", + "unread": "Olvasatlan" }, "nextdns": { - "wait": "Please Wait", - "no_devices": "No Device Data Received" + "wait": "Kérjük Várjon", + "no_devices": "Nincs fogadott eszközadat" }, "common": { "bibyterate": "{{value, rate(bits: false; binary: true)}}", "bibitrate": "{{value, rate(bits: true; binary: true)}}" }, "omada": { - "activeUser": "Active devices", - "alerts": "Alerts", - "connectedAp": "Connected APs", - "connectedGateway": "Connected gateways", - "connectedSwitches": "Connected switches" + "activeUser": "Aktív eszközök", + "alerts": "Riasztások", + "connectedAp": "Csatlakoztatott AP-k", + "connectedGateway": "Csatlakoztatott gateway-ek", + "connectedSwitches": "Csatlakoztatott switch-ek" }, "downloadstation": { - "download": "Download", - "upload": "Upload", + "download": "Letöltés", + "upload": "Feltöltés", "leech": "Leech", "seed": "Seed" }, "mikrotik": { - "cpuLoad": "CPU Load", - "memoryUsed": "Memory Used", - "uptime": "Uptime", - "numberOfLeases": "Leases" + "cpuLoad": "Processzor Terhelés", + "memoryUsed": "Felhasznált Memória", + "uptime": "Üzemidő", + "numberOfLeases": "Bérletek" }, "xteve": { - "streams_all": "All Streams", - "streams_active": "Active Streams", - "streams_xepg": "XEPG Channels" + "streams_all": "Minden Stream", + "streams_active": "Aktív Stream-ek", + "streams_xepg": "XEPG Csatornák" }, "opnsense": { - "cpu": "CPU Load", - "memory": "Active Memory", - "wanUpload": "WAN Upload", - "wanDownload": "WAN Download" + "cpu": "Processzor Terhelés", + "memory": "Aktív Memória", + "wanUpload": "WAN Feltöltés", + "wanDownload": "WAN Letöltés" }, "moonraker": { - "layers": "Layers", - "printer_state": "Printer State", - "print_status": "Print Status", - "print_progress": "Progress" + "layers": "Rétegek", + "printer_state": "Nyomtató Állapota", + "print_status": "Nyomtatás Állapota", + "print_progress": "Folyamat" }, "medusa": { - "wanted": "Wanted", - "queued": "Queued", - "series": "Series" + "wanted": "Keresett", + "queued": "Sorba állítva", + "series": "Sorozatok" }, "octoprint": { - "printer_state": "Status", - "temp_tool": "Tool temp", - "temp_bed": "Bed temp", - "job_completion": "Completion" + "printer_state": "Állapot", + "temp_tool": "Szerszám hőmérséklet", + "temp_bed": "Ágy Hőmérséklet", + "job_completion": "Teljesítés" }, "cloudflared": { - "origin_ip": "Origin IP", - "status": "Status" + "origin_ip": "Eredeti IP", + "status": "Állapot" }, "proxmoxbackupserver": { - "datastore_usage": "Datastore", - "failed_tasks_24h": "Failed Tasks 24h", - "cpu_usage": "CPU", - "memory_usage": "Memory" + "datastore_usage": "Adattár", + "failed_tasks_24h": "Sikertelen feladatok 24h", + "cpu_usage": "Processzor", + "memory_usage": "Memória" }, "immich": { - "users": "Users", - "photos": "Photos", - "videos": "Videos", - "storage": "Storage" + "users": "Felhasználók", + "photos": "Fényképek", + "videos": "Videók", + "storage": "Tárhely" }, "uptimekuma": { - "up": "Sites Up", - "down": "Sites Down", - "uptime": "Uptime", - "incident": "Incident", - "m": "m" + "up": "Futó Webhelyek", + "down": "Nem Elérhető Webhelyek", + "uptime": "Üzemidő", + "incident": "Incidens", + "m": "perc" }, "komga": { - "libraries": "Libraries", - "series": "Series", - "books": "Books" + "libraries": "Könyvtárak", + "series": "Sorozatok", + "books": "Könyvek" }, "mylar": { - "series": "Series", - "issues": "Issues", - "wanted": "Wanted" + "series": "Sorozatok", + "issues": "Problémák", + "wanted": "Keresett" }, "photoprism": { - "albums": "Albums", - "photos": "Photos", - "videos": "Videos", - "people": "People" + "albums": "Albumok", + "photos": "Fényképek", + "videos": "Videók", + "people": "Emberek" }, "diskstation": { - "days": "Days", - "uptime": "Uptime", - "volumeAvailable": "Available" + "days": "Napok", + "uptime": "Üzemidő", + "volumeAvailable": "Elérhető" }, "fileflows": { - "queue": "Queue", - "processing": "Processing", - "processed": "Processed", - "time": "Time" + "queue": "Várólista", + "processing": "Feldolgozás", + "processed": "Feldolgozott", + "time": "Idő" }, "grafana": { - "dashboards": "Dashboards", - "datasources": "Data Sources", - "totalalerts": "Total Alerts", - "alertstriggered": "Alerts Triggered" + "dashboards": "Műszerfalak", + "datasources": "Adatforrások", + "totalalerts": "Összes Riasztás", + "alertstriggered": "Aktivált riasztások" }, "nextcloud": { - "cpuload": "Cpu Load", - "memoryusage": "Memory Usage", - "freespace": "Free Space", - "activeusers": "Active Users", - "numfiles": "Files", - "numshares": "Shared Items" + "cpuload": "Processzor Terhelés", + "memoryusage": "Memória Használat", + "freespace": "Szabad hely", + "activeusers": "Aktív Felhasználók", + "numfiles": "Fájlok", + "numshares": "Megosztott Elemek" }, "kopia": { - "status": "Status", - "size": "Size", - "lastrun": "Last Run", - "nextrun": "Next Run", - "failed": "Failed" + "status": "Állapot", + "size": "Méret", + "lastrun": "Legutóbbi futtatás", + "nextrun": "Következő Futtatás", + "failed": "Sikertelen" }, "unmanic": { - "active_workers": "Active Workers", - "total_workers": "Total Workers", - "records_total": "Queue Length" + "active_workers": "Aktív Dolgozók", + "total_workers": "Összes Dolgozó", + "records_total": "Várólista Hossza" }, "healthchecks": { - "new": "New", + "new": "Új", "up": "Online", - "grace": "In Grace Period", + "grace": "Türelmi idő alatt", "down": "Offline", - "paused": "Paused", - "status": "Status", - "last_ping": "Last Ping", - "never": "No pings yet" + "paused": "Szünetel", + "status": "Állapot", + "last_ping": "Legutóbbi Ping", + "never": "Még nincsenek ping-ek" }, "pterodactyl": { - "servers": "Servers", - "nodes": "Nodes" + "servers": "Szerverek", + "nodes": "Node-ok" }, "prometheus": { - "targets_up": "Targets Up", - "targets_down": "Targets Down", - "targets_total": "Total Targets" + "targets_up": "Célpontok Futnak", + "targets_down": "Célpontok Állnak", + "targets_total": "Összes Célpont" }, "minecraft": { - "players": "Players", - "version": "Version", - "status": "Status", + "players": "Lejátszók", + "version": "Verzió", + "status": "Állapot", "up": "Online", "down": "Offline" }, "ghostfolio": { - "gross_percent_today": "Today", - "gross_percent_1y": "One year", - "gross_percent_max": "All time" + "gross_percent_today": "Ma", + "gross_percent_1y": "Egy év", + "gross_percent_max": "Mindig" }, "audiobookshelf": { "podcasts": "Podcast", @@ -576,83 +577,93 @@ "booksDuration": "Időtartam" }, "homeassistant": { - "people_home": "People Home", - "lights_on": "Lights On", - "switches_on": "Switches On" + "people_home": "Emberek otthon", + "lights_on": "Fények bekapcsolva", + "switches_on": "Kapcsolók felkapcsolva" }, "freshrss": { - "subscriptions": "Subscriptions", - "unread": "Unread" + "subscriptions": "Előfizetések", + "unread": "Olvasatlan" }, "channelsdvrserver": { - "shows": "Shows", - "recordings": "Recordings", - "scheduled": "Scheduled", - "passes": "Passes" + "shows": "Műsorok", + "recordings": "Felvételek", + "scheduled": "Ütemezett", + "passes": "Engedélyek" }, "whatsupdocker": { - "monitoring": "Monitoring", - "updates": "Updates" + "monitoring": "Nyomonkövetés", + "updates": "Frissítések" }, "tailscale": { - "address": "Address", - "expires": "Expires", - "never": "Never", - "last_seen": "Last Seen", - "now": "Now", + "address": "Cím", + "expires": "Lejár", + "never": "Soha", + "last_seen": "Utoljára látott", + "now": "Most", "years": "{{number}}y", "weeks": "{{number}}w", "days": "{{number}}d", "minutes": "{{number}}m", "seconds": "{{number}}s", - "ago": "{{value}} Ago", + "ago": "{{value}} Ezelőtt", "hours": "{{number}}h" }, "qnap": { - "cpuUsage": "CPU Usage", - "memUsage": "MEM Usage", - "systemTempC": "System Temp", - "poolUsage": "Pool Usage", - "volumeUsage": "Volume Usage", - "invalid": "Invalid" + "cpuUsage": "Processzor Használat", + "memUsage": "Memória Használat", + "systemTempC": "Rendszerhőmérséklet", + "poolUsage": "Pool Használat", + "volumeUsage": "Kötet Használat", + "invalid": "Érvénytelen" }, "pfsense": { - "load": "Load Avg", - "memory": "Mem Usage", - "wanStatus": "WAN Status", - "up": "Up", - "down": "Down", - "temp": "Temp", - "disk": "Disk Usage", + "load": "Átlagos terhelés", + "memory": "RAM Használat", + "wanStatus": "WAN Állapot", + "up": "Fut", + "down": "Áll", + "temp": "Hőmérséklet", + "disk": "Lemezhasználat", "wanIP": "WAN IP" }, "caddy": { - "upstreams": "Upstreams", - "requests": "Current requests", - "requests_failed": "Failed requests" + "upstreams": "Upstreamek", + "requests": "Jelenlegi kérelmek", + "requests_failed": "Sikertelen kérelmek" }, "evcc": { - "pv_power": "Production", - "battery_soc": "Battery", - "grid_power": "Grid", - "home_power": "Consumption", - "charge_power": "Charger", + "pv_power": "Termelés", + "battery_soc": "Akkumulátor", + "grid_power": "Rács", + "home_power": "Fogyasztás", + "charge_power": "Töltő", "watt_hour": "Wh" }, "pialert": { - "total": "Total", - "connected": "Connected", - "new_devices": "New Devices", - "down_alerts": "Down Alerts" + "total": "Összes", + "connected": "Csatlakoztatott", + "new_devices": "Új Eszközök", + "down_alerts": "Leállási Figyelmeztetések" }, "jdownloader": { - "downloadSpeed": "Download Speed", - "downloadCount": "Queue Count", - "downloadTotalBytes": "Size", - "downloadBytesRemaining": "Remaining" + "downloadSpeed": "Sebesség", + "downloadCount": "Összes függőben lévő", + "downloadTotalBytes": "Méret", + "downloadBytesRemaining": "Fennmaradó" }, "kavita": { - "seriesCount": "Series", - "totalFiles": "Files" + "seriesCount": "Sorozatok", + "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" } } diff --git a/public/locales/id/common.json b/public/locales/id/common.json index 51daa4f1..d3cab359 100644 --- a/public/locales/id/common.json +++ b/public/locales/id/common.json @@ -643,7 +643,8 @@ "playing": "Playing", "transcoding": "Transcoding", "bitrate": "Bitrate", - "no_active": "No Active Streams" + "no_active": "No Active Streams", + "plex_connection_error": "Check Plex Connection" }, "jdownloader": { "downloadCount": "Queue Count", @@ -654,5 +655,15 @@ "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" } } diff --git a/public/locales/it/common.json b/public/locales/it/common.json index f59048ac..0e45b23f 100644 --- a/public/locales/it/common.json +++ b/public/locales/it/common.json @@ -29,7 +29,8 @@ "playing": "In riproduzione", "transcoding": "Transcodifica", "bitrate": "Bitrate", - "no_active": "Nessuno Stream Attivo" + "no_active": "Nessuno Stream Attivo", + "plex_connection_error": "Check Plex Connection" }, "speedtest": { "upload": "Upload", @@ -654,5 +655,15 @@ "kavita": { "seriesCount": "Serie", "totalFiles": "File" + }, + "azurePipelines": { + "result": "Result", + "status": "Status", + "buildId": "Build ID", + "succeeded": "Succeeded", + "notStarted": "Not Started", + "failed": "Failed", + "canceled": "Canceled", + "inProgress": "In Progress" } } diff --git a/public/locales/ja/common.json b/public/locales/ja/common.json index 61cd0983..5a0eccee 100644 --- a/public/locales/ja/common.json +++ b/public/locales/ja/common.json @@ -136,7 +136,8 @@ "playing": "再生中", "transcoding": "変換中", "bitrate": "ビットレート", - "no_active": "アクティブストリームなし" + "no_active": "アクティブストリームなし", + "plex_connection_error": "Check Plex Connection" }, "omada": { "connectedAp": "接続されたAP", @@ -654,5 +655,15 @@ "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" } } diff --git a/public/locales/ko/common.json b/public/locales/ko/common.json index a3a1d9e6..f1325b75 100644 --- a/public/locales/ko/common.json +++ b/public/locales/ko/common.json @@ -111,7 +111,8 @@ "playing": "재생 중", "transcoding": "트랜스코딩", "bitrate": "비트레이트", - "no_active": "활성 스트림 없음" + "no_active": "활성 스트림 없음", + "plex_connection_error": "Check Plex Connection" }, "omada": { "connectedAp": "연결된 AP", @@ -654,5 +655,15 @@ "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" } } diff --git a/public/locales/lv/common.json b/public/locales/lv/common.json index 8022ec13..696b4d85 100644 --- a/public/locales/lv/common.json +++ b/public/locales/lv/common.json @@ -97,7 +97,8 @@ "playing": "Atskaņo", "transcoding": "Pārkodē", "bitrate": "Bitrate", - "no_active": "Nav aktīvu straumju" + "no_active": "Nav aktīvu straumju", + "plex_connection_error": "Check Plex Connection" }, "omada": { "connectedAp": "Savienotie piekļuves punkti", @@ -654,5 +655,15 @@ "kavita": { "seriesCount": "Series", "totalFiles": "Files" + }, + "azurePipelines": { + "status": "Status", + "buildId": "Build ID", + "succeeded": "Succeeded", + "notStarted": "Not Started", + "failed": "Failed", + "canceled": "Canceled", + "result": "Result", + "inProgress": "In Progress" } } diff --git a/public/locales/ms/common.json b/public/locales/ms/common.json index 77b3a759..a25ed71f 100644 --- a/public/locales/ms/common.json +++ b/public/locales/ms/common.json @@ -200,7 +200,8 @@ "playing": "Sedang Dimainkan", "transcoding": "Transkoding", "bitrate": "Kadar bit", - "no_active": "Tiada Strim Aktif" + "no_active": "Tiada Strim Aktif", + "plex_connection_error": "Check Plex Connection" }, "plex": { "streams": "Strim Aktif", @@ -654,5 +655,15 @@ "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" } } diff --git a/public/locales/nb-NO/common.json b/public/locales/nb-NO/common.json index a633028c..38dd3012 100644 --- a/public/locales/nb-NO/common.json +++ b/public/locales/nb-NO/common.json @@ -56,7 +56,8 @@ "playing": "Spiller", "transcoding": "Transkoding", "bitrate": "Bitrate", - "no_active": "Ingen aktive strømmer" + "no_active": "Ingen aktive strømmer", + "plex_connection_error": "Check Plex Connection" }, "rutorrent": { "active": "Aktiv", @@ -653,6 +654,16 @@ }, "kavita": { "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" } } diff --git a/public/locales/nl/common.json b/public/locales/nl/common.json index 88c809a9..5bcce505 100644 --- a/public/locales/nl/common.json +++ b/public/locales/nl/common.json @@ -72,7 +72,8 @@ "playing": "Afspelen", "transcoding": "Transcodering", "bitrate": "Bitsnelheid", - "no_active": "Geen Actieve Streams" + "no_active": "Geen Actieve Streams", + "plex_connection_error": "Check Plex Connection" }, "rutorrent": { "active": "Actief", @@ -654,5 +655,15 @@ "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" } } diff --git a/public/locales/pl/common.json b/public/locales/pl/common.json index 5df12a52..c44da833 100644 --- a/public/locales/pl/common.json +++ b/public/locales/pl/common.json @@ -37,7 +37,8 @@ "playing": "Odtwarzanie", "transcoding": "Transkodowanie", "bitrate": "Bitrate", - "no_active": "Brak aktywnych strumieni" + "no_active": "Brak aktywnych strumieni", + "plex_connection_error": "Check Plex Connection" }, "speedtest": { "download": "Pobieranie", @@ -654,5 +655,15 @@ "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" } } diff --git a/public/locales/pt-BR/common.json b/public/locales/pt-BR/common.json index 57e524fe..55e45757 100644 --- a/public/locales/pt-BR/common.json +++ b/public/locales/pt-BR/common.json @@ -90,7 +90,8 @@ "playing": "Reproduzindo", "transcoding": "Transcodificando", "bitrate": "Taxa de bits", - "no_active": "Sem transmissões ativas" + "no_active": "Sem transmissões ativas", + "plex_connection_error": "Check Plex Connection" }, "nzbget": { "rate": "Taxa", @@ -654,5 +655,15 @@ "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" } } diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json index 3bfb6df8..add4573a 100644 --- a/public/locales/pt/common.json +++ b/public/locales/pt/common.json @@ -56,7 +56,8 @@ "playing": "Reproduzindo", "transcoding": "Transcodificação", "bitrate": "Taxa de bits", - "no_active": "Sem streams ativas" + "no_active": "Sem streams ativas", + "plex_connection_error": "Check Plex Connection" }, "rutorrent": { "active": "Ativo", @@ -663,5 +664,15 @@ "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" } } diff --git a/public/locales/ro/common.json b/public/locales/ro/common.json index 3fc07bff..96fd22b4 100644 --- a/public/locales/ro/common.json +++ b/public/locales/ro/common.json @@ -92,7 +92,8 @@ "no_active": "Niciun stream activ", "playing": "Activ", "transcoding": "Transcodare", - "bitrate": "Bitrate" + "bitrate": "Bitrate", + "plex_connection_error": "Check Plex Connection" }, "nzbget": { "rate": "Rată", @@ -654,5 +655,15 @@ "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" } } diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json index ded1be07..ed23a2a9 100644 --- a/public/locales/ru/common.json +++ b/public/locales/ru/common.json @@ -56,7 +56,8 @@ "playing": "Воспроизведение", "transcoding": "Транскодирование", "bitrate": "Битрейт", - "no_active": "Нет активных трансляций" + "no_active": "Нет активных трансляций", + "plex_connection_error": "Проверьте соединение с Plex" }, "rutorrent": { "active": "Активный", @@ -64,22 +65,22 @@ "download": "Загрузка" }, "sonarr": { - "wanted": "Хотел", + "wanted": "Желаемое", "queued": "В очереди", "series": "Серии", - "queue": "Queue", + "queue": "Очередь", "unknown": "Unknown" }, "radarr": { - "wanted": "Хотел", + "wanted": "Желаемое", "queued": "В очереди", "movies": "Фильмы", "missing": "Пропущено", - "queue": "Queue", + "queue": "Очередь", "unknown": "Unknown" }, "readarr": { - "wanted": "Хотел", + "wanted": "Желаемое", "queued": "В очереди", "books": "Книги" }, @@ -175,9 +176,9 @@ "missingMovies": "Отсутствующие фильмы" }, "lidarr": { - "wanted": "Хотел", + "wanted": "Желаемое", "queued": "В очереди", - "artists": "Artists" + "artists": "Артисты" }, "adguard": { "queries": "Запросы", @@ -612,8 +613,8 @@ "cpuUsage": "CPU Usage", "memUsage": "MEM Usage", "systemTempC": "System Temp", - "poolUsage": "Pool Usage", - "volumeUsage": "Volume Usage", + "poolUsage": "Использование пула", + "volumeUsage": "Использование тома", "invalid": "Invalid" }, "pfsense": { @@ -627,23 +628,23 @@ "temp": "Temp" }, "caddy": { - "upstreams": "Upstreams", - "requests": "Current requests", - "requests_failed": "Failed requests" + "upstreams": "Апстримы", + "requests": "Текущие запросы", + "requests_failed": "Неудачные запросы" }, "evcc": { - "home_power": "Consumption", + "home_power": "Потребление", "pv_power": "Production", "battery_soc": "Battery", "grid_power": "Grid", - "charge_power": "Charger", + "charge_power": "Зарядка", "watt_hour": "Wh" }, "pialert": { "total": "Total", "connected": "Connected", - "new_devices": "New Devices", - "down_alerts": "Down Alerts" + "new_devices": "Новые устройства", + "down_alerts": "Оповещения о сбоях" }, "jdownloader": { "downloadCount": "Queue Count", @@ -654,5 +655,15 @@ "kavita": { "seriesCount": "Series", "totalFiles": "Files" + }, + "azurePipelines": { + "inProgress": "In Progress", + "result": "Result", + "status": "Status", + "buildId": "Build ID", + "succeeded": "Succeeded", + "notStarted": "Not Started", + "failed": "Failed", + "canceled": "Canceled" } } diff --git a/public/locales/sk/common.json b/public/locales/sk/common.json index 8d3a80ec..710b5007 100644 --- a/public/locales/sk/common.json +++ b/public/locales/sk/common.json @@ -221,7 +221,8 @@ "playing": "Playing", "transcoding": "Transcoding", "bitrate": "Bitrate", - "no_active": "No Active Streams" + "no_active": "No Active Streams", + "plex_connection_error": "Check Plex Connection" }, "omada": { "connectedAp": "Connected APs", @@ -654,5 +655,15 @@ "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" } } diff --git a/public/locales/sl/common.json b/public/locales/sl/common.json index c4a9e317..60cee85f 100644 --- a/public/locales/sl/common.json +++ b/public/locales/sl/common.json @@ -168,7 +168,8 @@ "transcoding": "Transkodira", "bitrate": "Pasovna širina", "playing": "Predvaja", - "no_active": "Ni aktivne vsebine" + "no_active": "Ni aktivne vsebine", + "plex_connection_error": "Check Plex Connection" }, "flood": { "download": "Prenos", @@ -236,21 +237,21 @@ "wanted": "Iskano", "queued": "V vrsti", "series": "Serije", - "queue": "Queue", - "unknown": "Unknown" + "queue": "Vrsta", + "unknown": "Neznano" }, "radarr": { "wanted": "Iskano", "missing": "Manjka", "queued": "V vrsti", "movies": "Filmi", - "queue": "Queue", - "unknown": "Unknown" + "queue": "Vrsta", + "unknown": "Neznano" }, "lidarr": { "wanted": "Iskano", "queued": "V vrsti", - "artists": "Artists" + "artists": "Avtorji" }, "readarr": { "wanted": "Iskano", @@ -359,11 +360,11 @@ "uptime": "UP", "days": "d", "hours": "u", - "free": "Free", - "load": "Load", - "warn": "Warn", - "total": "Total", - "used": "Used" + "free": "Prosto", + "load": "Obremenitev", + "warn": "Opoz.", + "total": "Skupaj", + "used": "V uporabi" }, "authentik": { "users": "Uporabniki", @@ -613,8 +614,8 @@ "memUsage": "MEM", "systemTempC": "Temperatura", "poolUsage": "Prostor", - "volumeUsage": "Volume Usage", - "invalid": "Invalid" + "volumeUsage": "Prostora", + "invalid": "Neveljavno" }, "pfsense": { "load": "Povp. obremenitev", @@ -640,19 +641,29 @@ "watt_hour": "Wh" }, "pialert": { - "total": "Total", - "connected": "Connected", - "new_devices": "New Devices", - "down_alerts": "Down Alerts" + "total": "Skupaj", + "connected": "Povezanih", + "new_devices": "Nove naprave", + "down_alerts": "Izključeno" }, "jdownloader": { - "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed", - "downloadBytesRemaining": "Remaining", - "downloadTotalBytes": "Size" + "downloadCount": "Vrsta", + "downloadSpeed": "Hitrost prenosa", + "downloadBytesRemaining": "Še ostane", + "downloadTotalBytes": "Velikost" }, "kavita": { - "seriesCount": "Series", - "totalFiles": "Files" + "seriesCount": "Serije", + "totalFiles": "Datoteke" + }, + "azurePipelines": { + "result": "Result", + "status": "Status", + "buildId": "Build ID", + "succeeded": "Succeeded", + "notStarted": "Not Started", + "failed": "Failed", + "canceled": "Canceled", + "inProgress": "In Progress" } } diff --git a/public/locales/sr/common.json b/public/locales/sr/common.json index f60d3e22..bb387d90 100644 --- a/public/locales/sr/common.json +++ b/public/locales/sr/common.json @@ -79,7 +79,8 @@ "playing": "Playing", "transcoding": "Transcoding", "bitrate": "Bitrate", - "no_active": "No Active Streams" + "no_active": "No Active Streams", + "plex_connection_error": "Check Plex Connection" }, "nzbget": { "rate": "Rate", @@ -654,5 +655,15 @@ "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" } } diff --git a/public/locales/sv/common.json b/public/locales/sv/common.json index 0d61d400..d432afc4 100644 --- a/public/locales/sv/common.json +++ b/public/locales/sv/common.json @@ -62,7 +62,8 @@ "playing": "Spelar", "transcoding": "Omkodning", "bitrate": "Bitrate", - "no_active": "Inga aktiva strömmar" + "no_active": "Inga aktiva strömmar", + "plex_connection_error": "Check Plex Connection" }, "nzbget": { "rate": "Hastighet", @@ -654,5 +655,15 @@ "kavita": { "totalFiles": "Files", "seriesCount": "Series" + }, + "azurePipelines": { + "result": "Result", + "status": "Status", + "buildId": "Build ID", + "succeeded": "Succeeded", + "notStarted": "Not Started", + "failed": "Failed", + "canceled": "Canceled", + "inProgress": "In Progress" } } diff --git a/public/locales/te/common.json b/public/locales/te/common.json index 9957fc7d..a73051a4 100644 --- a/public/locales/te/common.json +++ b/public/locales/te/common.json @@ -79,7 +79,8 @@ "playing": "ఆడుతున్నారు", "transcoding": "ట్రాన్స్‌కోడింగ్", "bitrate": "బిట్రేట్", - "no_active": "యాక్టివ్ స్ట్రీమ్‌లు లేవు" + "no_active": "యాక్టివ్ స్ట్రీమ్‌లు లేవు", + "plex_connection_error": "Check Plex Connection" }, "nzbget": { "rate": "రేట్", @@ -654,5 +655,15 @@ "kavita": { "totalFiles": "Files", "seriesCount": "Series" + }, + "azurePipelines": { + "result": "Result", + "status": "Status", + "buildId": "Build ID", + "succeeded": "Succeeded", + "notStarted": "Not Started", + "failed": "Failed", + "canceled": "Canceled", + "inProgress": "In Progress" } } diff --git a/public/locales/th/common.json b/public/locales/th/common.json index 6122992f..64300953 100644 --- a/public/locales/th/common.json +++ b/public/locales/th/common.json @@ -139,7 +139,8 @@ "playing": "Playing", "transcoding": "Transcoding", "bitrate": "Bitrate", - "no_active": "No Active Streams" + "no_active": "No Active Streams", + "plex_connection_error": "Check Plex Connection" }, "omada": { "connectedAp": "Connected APs", @@ -654,5 +655,15 @@ "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" } } diff --git a/public/locales/tr/common.json b/public/locales/tr/common.json index bb98d412..0aac8e9f 100644 --- a/public/locales/tr/common.json +++ b/public/locales/tr/common.json @@ -79,7 +79,8 @@ "playing": "Oynatılıyor", "transcoding": "Dönüştürülüyor", "bitrate": "Bit Oranı", - "no_active": "Aktif akış yok" + "no_active": "Aktif akış yok", + "plex_connection_error": "Check Plex Connection" }, "nzbget": { "rate": "Oran", @@ -654,5 +655,15 @@ "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" } } diff --git a/public/locales/uk/common.json b/public/locales/uk/common.json index f2b5e629..86008450 100644 --- a/public/locales/uk/common.json +++ b/public/locales/uk/common.json @@ -198,7 +198,8 @@ "playing": "Відтворення", "transcoding": "Перекодування", "bitrate": "Бітрейт", - "no_active": "Немає активних потоків" + "no_active": "Немає активних потоків", + "plex_connection_error": "Перевірте з'єднання Plex" }, "nzbget": { "rate": "Швидкість", @@ -654,5 +655,15 @@ "kavita": { "seriesCount": "Серій", "totalFiles": "Файлів" + }, + "azurePipelines": { + "failed": "Невдача", + "result": "Результат", + "status": "Стан", + "buildId": "ID збірки", + "succeeded": "Успішно", + "notStarted": "Не розпочато", + "canceled": "Скасовано", + "inProgress": "В процесі" } } diff --git a/public/locales/vi/common.json b/public/locales/vi/common.json index 1fe186c9..d3341c7a 100644 --- a/public/locales/vi/common.json +++ b/public/locales/vi/common.json @@ -56,7 +56,8 @@ "playing": "Đang chơi", "transcoding": "Chuyển định dạng", "bitrate": "Bitrate", - "no_active": "No Active Streams" + "no_active": "No Active Streams", + "plex_connection_error": "Check Plex Connection" }, "rutorrent": { "active": "Hoạt động", @@ -654,5 +655,15 @@ "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" } } diff --git a/public/locales/yue/common.json b/public/locales/yue/common.json index 48accfc0..91775685 100644 --- a/public/locales/yue/common.json +++ b/public/locales/yue/common.json @@ -13,7 +13,8 @@ "playing": "播放緊", "no_active": "無任何活動", "transcoding": "轉碼緊", - "bitrate": "比特率" + "bitrate": "比特率", + "plex_connection_error": "Check Plex Connection" }, "transmission": { "download": "下載速度", @@ -654,5 +655,15 @@ "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" } } diff --git a/public/locales/zh-CN/common.json b/public/locales/zh-CN/common.json index 2506671c..448893aa 100644 --- a/public/locales/zh-CN/common.json +++ b/public/locales/zh-CN/common.json @@ -56,7 +56,8 @@ "playing": "播放中", "transcoding": "转码", "bitrate": "比特率", - "no_active": "暂无播放" + "no_active": "暂无播放", + "plex_connection_error": "Check Plex Connection" }, "rutorrent": { "active": "活动中", @@ -654,5 +655,15 @@ "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" } } diff --git a/public/locales/zh-Hant/common.json b/public/locales/zh-Hant/common.json index e4f96dd3..2f9d8622 100644 --- a/public/locales/zh-Hant/common.json +++ b/public/locales/zh-Hant/common.json @@ -44,7 +44,8 @@ "playing": "正在播放", "transcoding": "轉碼", "bitrate": "位元率", - "no_active": "無播放活動" + "no_active": "無播放活動", + "plex_connection_error": "Check Plex Connection" }, "jellyseerr": { "pending": "待下載", @@ -654,5 +655,15 @@ "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" } } diff --git a/src/components/bookmarks/group.jsx b/src/components/bookmarks/group.jsx index ef0a5ab8..44db59fc 100644 --- a/src/components/bookmarks/group.jsx +++ b/src/components/bookmarks/group.jsx @@ -1,3 +1,4 @@ +import { useRef } from "react"; import classNames from "classnames"; import { Disclosure, Transition } from '@headlessui/react'; import { MdKeyboardArrowDown } from "react-icons/md"; @@ -6,6 +7,7 @@ import ErrorBoundary from "components/errorboundry"; import List from "components/bookmarks/list"; export default function BookmarksGroup({ group, disableCollapse }) { + const panel = useRef(); return (
@@ -15,19 +17,24 @@ export default function BookmarksGroup({ group, disableCollapse }) {

{group.name}

{ + panel.current.style.height = `${panel.current.scrollHeight}px`; + setTimeout(() => {panel.current.style.height = `0`}, 1); + }} + beforeEnter={() => { + panel.current.style.height = `0px`; + setTimeout(() => {panel.current.style.height = `${panel.current.scrollHeight}px`}, 1); + }} > - + diff --git a/src/components/services/group.jsx b/src/components/services/group.jsx index eb64cc3d..b3805c4f 100644 --- a/src/components/services/group.jsx +++ b/src/components/services/group.jsx @@ -1,3 +1,4 @@ +import { useRef } from "react"; import classNames from "classnames"; import { Disclosure, Transition } from '@headlessui/react'; import { MdKeyboardArrowDown } from "react-icons/md"; @@ -7,6 +8,8 @@ import ResolvedIcon from "components/resolvedicon"; export default function ServicesGroup({ group, services, layout, fiveColumns, disableCollapse }) { + const panel = useRef(); + return (
{services.name} { + panel.current.style.height = `${panel.current.scrollHeight}px`; + setTimeout(() => {panel.current.style.height = `0`}, 1); + }} + beforeEnter={() => { + panel.current.style.height = `0px`; + setTimeout(() => {panel.current.style.height = `${panel.current.scrollHeight}px`}, 1); + }} > - + diff --git a/src/components/services/widget/container.jsx b/src/components/services/widget/container.jsx index 4b8a06ca..7d883336 100644 --- a/src/components/services/widget/container.jsx +++ b/src/components/services/widget/container.jsx @@ -18,7 +18,8 @@ export default function Container({ error = false, children, service }) { const childrenArray = Array.isArray(children) ? children : [children]; 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; if (fields && type) { // if the field contains a "." then it most likely contains a common loc value diff --git a/src/components/widgets/glances/glances.jsx b/src/components/widgets/glances/glances.jsx index e5cf3fbd..cf580630 100644 --- a/src/components/widgets/glances/glances.jsx +++ b/src/components/widgets/glances/glances.jsx @@ -37,7 +37,7 @@ export default function Widget({ options }) { { options.cputemp && } { options.disk && !Array.isArray(options.disk) && } - { options.disk && Array.isArray(options.disk) && options.disk.map((disk) => )} + { options.disk && Array.isArray(options.disk) && options.disk.map((disk) => ) } { options.uptime && } { options.label && } ; @@ -50,7 +50,7 @@ export default function Widget({ options }) { if (options.cputemp && cpuSensors) { try { 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") { mainTemp = convertToFahrenheit(mainTemp); maxTemp = convertToFahrenheit(maxTemp); @@ -108,7 +108,7 @@ export default function Widget({ options }) { expanded={options.expanded} /> {disks.map((disk) => ( - : // fallback to homepage logo - - - - - - + + + + - + + + + - - - - + + +
} diff --git a/src/components/widgets/openmeteo/icon.jsx b/src/components/widgets/openmeteo/icon.jsx deleted file mode 100644 index 12d93fcb..00000000 --- a/src/components/widgets/openmeteo/icon.jsx +++ /dev/null @@ -1,7 +0,0 @@ -import mapIcon from "utils/weather/openmeteo-condition-map"; - -export default function Icon({ condition, timeOfDay }) { - const IconComponent = mapIcon(condition, timeOfDay); - - return ; -} diff --git a/src/components/widgets/openmeteo/openmeteo.jsx b/src/components/widgets/openmeteo/openmeteo.jsx index 040a3b6b..0614d925 100644 --- a/src/components/widgets/openmeteo/openmeteo.jsx +++ b/src/components/widgets/openmeteo/openmeteo.jsx @@ -10,8 +10,7 @@ import ContainerButton from "../widget/container_button"; import WidgetIcon from "../widget/widget_icon"; import PrimaryText from "../widget/primary_text"; import SecondaryText from "../widget/secondary_text"; - -import Icon from "./icon"; +import mapIcon from "../../../utils/weather/openmeteo-condition-map"; function Widget({ options }) { const { t } = useTranslation(); @@ -33,10 +32,8 @@ function Widget({ options }) { } const unit = options.units === "metric" ? "celsius" : "fahrenheit"; - const weatherInfo = { - condition: data.current_weather.weathercode, - timeOfDay: data.current_weather.time > data.daily.sunrise[0] && data.current_weather.time < data.daily.sunset[0] ? "day" : "night" - }; + const 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"; return @@ -47,8 +44,8 @@ function Widget({ options }) { unit, })} - {t(`wmo.${data.current_weather.weathercode}-${weatherInfo.timeOfDay}`)} - + {t(`wmo.${data.current_weather.weathercode}-${timeOfDay}`)} + ; } diff --git a/src/components/widgets/openweathermap/icon.jsx b/src/components/widgets/openweathermap/icon.jsx deleted file mode 100644 index a2b01ba1..00000000 --- a/src/components/widgets/openweathermap/icon.jsx +++ /dev/null @@ -1,7 +0,0 @@ -import mapIcon from "utils/weather/owm-condition-map"; - -export default function Icon({ condition, timeOfDay }) { - const IconComponent = mapIcon(condition, timeOfDay); - - return ; -} diff --git a/src/components/widgets/openweathermap/weather.jsx b/src/components/widgets/openweathermap/weather.jsx index a857f13a..32c81f06 100644 --- a/src/components/widgets/openweathermap/weather.jsx +++ b/src/components/widgets/openweathermap/weather.jsx @@ -10,9 +10,7 @@ import ContainerButton from "../widget/container_button"; import PrimaryText from "../widget/primary_text"; import SecondaryText from "../widget/secondary_text"; import WidgetIcon from "../widget/widget_icon"; - -import Icon from "./icon"; - +import mapIcon from "../../../utils/weather/owm-condition-map"; function Widget({ options }) { const { t, i18n } = useTranslation(); @@ -35,15 +33,13 @@ function Widget({ options }) { const unit = options.units === "metric" ? "celsius" : "fahrenheit"; - const weatherInfo = { - condition: data.weather[0].id, - timeOfDay: data.dt > data.sys.sunrise && data.dt < data.sys.sunset ? "day" : "night" - }; + const condition = data.weather[0].id; + const timeOfDay = data.dt > data.sys.sunrise && data.dt < data.sys.sunset ? "day" : "night"; return {options.label && `${options.label}, ` }{t("common.number", { value: data.main.temp, style: "unit", unit })} {data.weather[0].description} - + ; } diff --git a/src/components/widgets/weather/icon.jsx b/src/components/widgets/weather/icon.jsx deleted file mode 100644 index 79406ae7..00000000 --- a/src/components/widgets/weather/icon.jsx +++ /dev/null @@ -1,7 +0,0 @@ -import mapIcon from "utils/weather/condition-map"; - -export default function Icon({ condition, timeOfDay }) { - const IconComponent = mapIcon(condition, timeOfDay); - - return ; -} diff --git a/src/components/widgets/weather/weather.jsx b/src/components/widgets/weather/weather.jsx index 702ea669..20d4eeee 100644 --- a/src/components/widgets/weather/weather.jsx +++ b/src/components/widgets/weather/weather.jsx @@ -10,8 +10,7 @@ import PrimaryText from "../widget/primary_text"; import SecondaryText from "../widget/secondary_text"; import WidgetIcon from "../widget/widget_icon"; import ContainerButton from "../widget/container_button"; - -import Icon from "./icon"; +import mapIcon from "../../../utils/weather/condition-map"; function Widget({ options }) { const { t, i18n } = useTranslation(); @@ -33,10 +32,8 @@ function Widget({ options }) { } const unit = options.units === "metric" ? "celsius" : "fahrenheit"; - const weatherInfo = { - condition: data.current.condition.code, - timeOfDay: data.current.is_day ? "day" : "night", - }; + const condition = data.current.condition.code; + const timeOfDay = data.current.is_day ? "day" : "night"; return @@ -48,7 +45,7 @@ function Widget({ options }) { })} {data.current.condition.text} - + ; } diff --git a/src/components/widgets/widget/widget_icon.jsx b/src/components/widgets/widget/widget_icon.jsx index 9766a879..557cba01 100644 --- a/src/components/widgets/widget/widget_icon.jsx +++ b/src/components/widgets/widget/widget_icon.jsx @@ -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 { condition, timeOfDay } = weatherInfo; let additionalClasses = "text-theme-800 dark:text-theme-200 "; switch (size) { @@ -14,5 +13,5 @@ export default function WidgetIcon({ icon, size = "s", pulse = false, weatherInf additionalClasses += "animate-pulse "; } - return ; + return ; } diff --git a/src/pages/api/hash.js b/src/pages/api/hash.js index 96369134..0e8d0261 100644 --- a/src/pages/api/hash.js +++ b/src/pages/api/hash.js @@ -2,7 +2,7 @@ import { join } from "path"; import { createHash } from "crypto"; 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"]; @@ -15,7 +15,7 @@ function hash(buffer) { export default async function handler(req, res) { const hashes = configs.map((config) => { checkAndCopyConfig(config); - const configYaml = join(process.cwd(), "config", config); + const configYaml = join(CONF_DIR, config); return hash(readFileSync(configYaml, "utf8")); }); diff --git a/src/pages/api/services/proxy.js b/src/pages/api/services/proxy.js index a33e6628..dbe6fe9e 100644 --- a/src/pages/api/services/proxy.js +++ b/src/pages/api/services/proxy.js @@ -22,6 +22,7 @@ export default async function handler(req, res) { if (widget?.mappings) { const mapping = widget?.mappings?.[req.query.endpoint]; const mappingParams = mapping?.params; + const optionalParams = mapping?.optionalParams; const map = mapping?.map; const endpoint = mapping?.endpoint; const endpointProxy = mapping?.proxyHandler || serviceProxyHandler; @@ -40,9 +41,17 @@ export default async function handler(req, res) { 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 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}`; } diff --git a/src/utils/config/api-response.js b/src/utils/config/api-response.js index fad3022d..e00846db 100644 --- a/src/utils/config/api-response.js +++ b/src/utils/config/api-response.js @@ -4,7 +4,7 @@ import path from "path"; import yaml from "js-yaml"; -import checkAndCopyConfig, { getSettings, substituteEnvironmentVars } from "utils/config/config"; +import checkAndCopyConfig, { getSettings, substituteEnvironmentVars, CONF_DIR } from "utils/config/config"; import { servicesFromConfig, servicesFromDocker, @@ -27,7 +27,7 @@ function compareServices(service1, service2) { export async function bookmarksResponse() { 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 fileContents = substituteEnvironmentVars(rawFileContents); const bookmarks = yaml.load(fileContents); diff --git a/src/utils/config/config.js b/src/utils/config/config.js index 6c5f4ee7..dbb0261e 100644 --- a/src/utils/config/config.js +++ b/src/utils/config/config.js @@ -1,6 +1,6 @@ /* eslint-disable no-console */ import { join } from "path"; -import { existsSync, readFileSync, copyFileSync } from "fs"; +import { copyFileSync, existsSync, mkdirSync, readFileSync } from "fs"; import cache from "memory-cache"; import yaml from "js-yaml"; @@ -9,8 +9,14 @@ const cacheKey = "homepageEnvironmentVariables"; const homepageVarPrefix = "HOMEPAGE_VAR_"; 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) { - 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)) { const configSkeleton = join(process.cwd(), "src", "skeleton", config); try { @@ -62,7 +68,7 @@ export function substituteEnvironmentVars(str) { export function getSettings() { checkAndCopyConfig("settings.yaml"); - const settingsYaml = join(process.cwd(), "config", "settings.yaml"); + const settingsYaml = join(CONF_DIR, "settings.yaml"); const rawFileContents = readFileSync(settingsYaml, "utf8"); const fileContents = substituteEnvironmentVars(rawFileContents); const initialSettings = yaml.load(fileContents) ?? {}; @@ -79,6 +85,5 @@ export function getSettings() { }) } } - return initialSettings } diff --git a/src/utils/config/docker.js b/src/utils/config/docker.js index 8f658db2..b0bb7e55 100644 --- a/src/utils/config/docker.js +++ b/src/utils/config/docker.js @@ -3,12 +3,12 @@ import { readFileSync } from "fs"; 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) { 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 configData = substituteEnvironmentVars(rawConfigData); const servers = yaml.load(configData); @@ -37,9 +37,9 @@ export default function getDockerArguments(server) { } if (servers[server].tls){ - res.conn.ca = readFileSync(path.join(process.cwd(), "config", servers[server].tls.caFile)); - res.conn.cert = readFileSync(path.join(process.cwd(), "config", servers[server].tls.certFile)); - res.conn.key = readFileSync(path.join(process.cwd(), "config", servers[server].tls.keyFile)); + res.conn.ca = readFileSync(path.join(CONF_DIR, servers[server].tls.caFile)); + res.conn.cert = readFileSync(path.join(CONF_DIR, servers[server].tls.certFile)); + res.conn.key = readFileSync(path.join(CONF_DIR, servers[server].tls.keyFile)); } return res; diff --git a/src/utils/config/kubernetes.js b/src/utils/config/kubernetes.js index ba2a37a0..ea9254e3 100644 --- a/src/utils/config/kubernetes.js +++ b/src/utils/config/kubernetes.js @@ -4,12 +4,12 @@ import { readFileSync } from "fs"; import yaml from "js-yaml"; 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() { 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 configData = substituteEnvironmentVars(rawConfigData); const config = yaml.load(configData); diff --git a/src/utils/config/service-helpers.js b/src/utils/config/service-helpers.js index a016a00d..e99582b2 100644 --- a/src/utils/config/service-helpers.js +++ b/src/utils/config/service-helpers.js @@ -7,7 +7,7 @@ import * as shvl from "shvl"; import { CustomObjectsApi, NetworkingV1Api } from "@kubernetes/client-node"; 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 getKubeConfig from "utils/config/kubernetes"; @@ -17,7 +17,7 @@ const logger = createLogger("service-helpers"); export async function servicesFromConfig() { 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 fileContents = substituteEnvironmentVars(rawFileContents); const services = yaml.load(fileContents); @@ -51,7 +51,7 @@ export async function servicesFromConfig() { export async function servicesFromDocker() { 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 dockerFileContents = substituteEnvironmentVars(rawDockerFileContents); const servers = yaml.load(dockerFileContents); @@ -279,6 +279,7 @@ export function cleanServiceGroups(groups) { container, currency, // coinmarketcap widget symbols, + slugs, defaultinterval, site, // unifi widget namespace, // kubernetes widget @@ -289,6 +290,7 @@ export function cleanServiceGroups(groups) { enableNowPlaying, volume, // diskstation widget, enableQueue, // sonarr/radarr + node, // Proxmox } = cleanedService.widget; let fieldsList = fields; @@ -299,7 +301,7 @@ export function cleanServiceGroups(groups) { fieldsList = null; } } - + cleanedService.widget = { type, fields: fieldsList || null, @@ -308,9 +310,12 @@ export function cleanServiceGroups(groups) { service_group: serviceGroup.name, }; - if (currency) cleanedService.widget.currency = currency; - if (symbols) cleanedService.widget.symbols = symbols; - if (defaultinterval) cleanedService.widget.defaultinterval = defaultinterval; + if (type === "coinmarketcap") { + if (currency) cleanedService.widget.currency = currency; + if (symbols) cleanedService.widget.symbols = symbols; + if (slugs) cleanedService.widget.slugs = slugs; + if (defaultinterval) cleanedService.widget.defaultinterval = defaultinterval; + } if (type === "docker") { if (server) cleanedService.widget.server = server; @@ -319,6 +324,9 @@ export function cleanServiceGroups(groups) { if (type === "unifi") { if (site) cleanedService.widget.site = site; } + if (type === "proxmox") { + if (node) cleanedService.widget.node = node; + } if (type === "kubernetes") { if (namespace) cleanedService.widget.namespace = namespace; if (app) cleanedService.widget.app = app; diff --git a/src/utils/config/widget-helpers.js b/src/utils/config/widget-helpers.js index 6f61b7e2..0e1eac6a 100644 --- a/src/utils/config/widget-helpers.js +++ b/src/utils/config/widget-helpers.js @@ -3,12 +3,12 @@ import path from "path"; 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() { 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 fileContents = substituteEnvironmentVars(rawFileContents); const widgets = yaml.load(fileContents); diff --git a/src/utils/logger.js b/src/utils/logger.js index 048c5356..98adbdf0 100644 --- a/src/utils/logger.js +++ b/src/utils/logger.js @@ -1,18 +1,17 @@ /* eslint-disable no-console */ -import { join } from "path"; import { format as utilFormat } from "node:util"; import winston from "winston"; -import checkAndCopyConfig, { getSettings } from "utils/config/config"; +import checkAndCopyConfig, { getSettings, CONF_DIR } from "utils/config/config"; + let winstonLogger; function init() { - const configPath = join(process.cwd(), "config"); checkAndCopyConfig("settings.yaml"); const settings = getSettings(); - const logpath = settings.logpath || configPath; + const logpath = settings.logpath || CONF_DIR; function combineMessageAndSplat() { return { diff --git a/src/utils/proxy/handlers/credentialed.js b/src/utils/proxy/handlers/credentialed.js index 8fa975d0..3d181ead 100644 --- a/src/utils/proxy/handlers/credentialed.js +++ b/src/utils/proxy/handlers/credentialed.js @@ -61,6 +61,9 @@ export default async function credentialedProxyHandler(req, res, map) { } else { 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 { headers["X-API-Key"] = `${widget.key}`; } diff --git a/src/widgets/azurePipelines/component.jsx b/src/widgets/azurePipelines/component.jsx new file mode 100644 index 00000000..a47296f3 --- /dev/null +++ b/src/widgets/azurePipelines/component.jsx @@ -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 ; + } + + if (!pipelineData || !Array.isArray(pipelineData.value)) { + return ( + + + + + ); + } + + return ( + + {pipelineData.value[0].result ? + : + + } + + + ); +} diff --git a/src/widgets/azurePipelines/widget.js b/src/widgets/azurePipelines/widget.js new file mode 100644 index 00000000..708266d2 --- /dev/null +++ b/src/widgets/azurePipelines/widget.js @@ -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; \ No newline at end of file diff --git a/src/widgets/coinmarketcap/component.jsx b/src/widgets/coinmarketcap/component.jsx index 554bb044..a71a246f 100644 --- a/src/widgets/coinmarketcap/component.jsx +++ b/src/widgets/coinmarketcap/component.jsx @@ -19,17 +19,26 @@ export default function Component({ service }) { const { widget } = service; const { symbols } = widget; + const { slugs } = widget; const currencyCode = widget.currency ?? "USD"; const interval = widget.defaultinterval ?? dateRangeOptions[0].value; const [dateRange, setDateRange] = useState(interval); - const { data: statsData, error: statsError } = useWidgetAPI(widget, "v1/cryptocurrency/quotes/latest", { - symbol: `${symbols.join(",")}`, + const params = { 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 ( @@ -50,6 +59,7 @@ export default function Component({ service }) { } const { data } = statsData; + const validCryptos = Object.values(data).filter(crypto => crypto.quote[currencyCode][`percent_change_${dateRange}`] !== null) return ( @@ -58,28 +68,28 @@ export default function Component({ service }) {
- {symbols.map((symbol) => ( + {validCryptos.map((crypto) => (
-
{data[symbol].name}
+
{crypto.name}
{t("common.number", { - value: data[symbol].quote[currencyCode].price, + value: crypto.quote[currencyCode].price, style: "currency", currency: currencyCode, })}
0 + crypto.quote[currencyCode][`percent_change_${dateRange}`] > 0 ? "text-emerald-300" : "text-rose-300" }`} > - {data[symbol].quote[currencyCode][`percent_change_${dateRange}`].toFixed(2)}% + {crypto.quote[currencyCode][`percent_change_${dateRange}`].toFixed(2)}%
diff --git a/src/widgets/coinmarketcap/widget.js b/src/widgets/coinmarketcap/widget.js index fcbafadf..85062b60 100644 --- a/src/widgets/coinmarketcap/widget.js +++ b/src/widgets/coinmarketcap/widget.js @@ -7,7 +7,8 @@ const widget = { mappings: { "v1/cryptocurrency/quotes/latest": { endpoint: "v1/cryptocurrency/quotes/latest", - params: ["symbol", "convert"], + params: ["convert"], + optionalParams: ["symbol", "slug"], }, }, }; diff --git a/src/widgets/components.js b/src/widgets/components.js index b3924bf4..c5d1e840 100644 --- a/src/widgets/components.js +++ b/src/widgets/components.js @@ -5,6 +5,7 @@ const components = { audiobookshelf: dynamic(() => import("./audiobookshelf/component")), authentik: dynamic(() => import("./authentik/component")), autobrr: dynamic(() => import("./autobrr/component")), + azurePipelines: dynamic(() => import("./azurePipelines/component")), bazarr: dynamic(() => import("./bazarr/component")), caddy: dynamic(() => import("./caddy/component")), changedetectionio: dynamic(() => import("./changedetectionio/component")), diff --git a/src/widgets/proxmox/component.jsx b/src/widgets/proxmox/component.jsx index e022be6e..10151f59 100644 --- a/src/widgets/proxmox/component.jsx +++ b/src/widgets/proxmox/component.jsx @@ -4,6 +4,7 @@ import Container from "components/services/widget/container"; import Block from "components/services/widget/block"; import useWidgetAPI from "utils/proxy/use-widget-api"; + function calcRunning(total, current) { return current.status === "running" ? total + 1 : total; } @@ -25,29 +26,40 @@ export default function Component({ service }) { - + ); } const { data } = clusterData ; - const vms = data.filter(item => item.type === "qemu" && item.template === 0) || []; - const lxc = data.filter(item => item.type === "lxc" && item.template === 0) || []; - const nodes = data.filter(item => item.type === "node") || []; - + 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 && (widget.node === undefined || widget.node === item.node)) || []; + const nodes = data.filter(item => item.type === "node" && (widget.node === undefined || widget.node === item.node)) || []; const runningVMs = vms.reduce(calcRunning, 0); const runningLXC = lxc.reduce(calcRunning, 0); - // TODO: support more than one node - // TODO: better handling of cluster with zero nodes - const node = nodes.length > 0 ? nodes[0] : { cpu: 0.0, mem: 0, maxmem: 0 }; + if (nodes.length === 0) { + return ( + + + + + + + ); + } + + 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 ( - - + + ); } diff --git a/src/widgets/tautulli/component.jsx b/src/widgets/tautulli/component.jsx index a0328383..e52eeb5d 100644 --- a/src/widgets/tautulli/component.jsx +++ b/src/widgets/tautulli/component.jsx @@ -122,8 +122,8 @@ export default function Component({ service }) { refreshInterval: 5000, }); - if (activityError) { - return ; + if (activityError || (activityData && Object.keys(activityData.response.data).length === 0)) { + return ; } if (!activityData) { diff --git a/src/widgets/widgets.js b/src/widgets/widgets.js index fafb8ed7..4057567e 100644 --- a/src/widgets/widgets.js +++ b/src/widgets/widgets.js @@ -2,6 +2,7 @@ import adguard from "./adguard/widget"; import audiobookshelf from "./audiobookshelf/widget"; import authentik from "./authentik/widget"; import autobrr from "./autobrr/widget"; +import azurePipelines from "./azurePipelines/widget"; import bazarr from "./bazarr/widget"; import caddy from "./caddy/widget"; import changedetectionio from "./changedetectionio/widget"; @@ -95,6 +96,7 @@ const widgets = { audiobookshelf, authentik, autobrr, + azurePipelines, bazarr, caddy, changedetectionio,