Merge branch 'main' into kubernetes

pull/448/head
James Wynn 1 year ago
commit b6e8b64a2e

@ -85,7 +85,7 @@ services:
- 3000:3000 - 3000:3000
volumes: volumes:
- /path/to/config:/app/config # Make sure your local config directory exists - /path/to/config:/app/config # Make sure your local config directory exists
- /var/run/docker.sock:/var/run/docker.sock # (optional) For docker integrations - /var/run/docker.sock:/var/run/docker.sock:ro # (optional) For docker integrations
``` ```
or docker run: or docker run:

@ -347,61 +347,61 @@
"deluge": { "deluge": {
"download": "Preuzimanje", "download": "Preuzimanje",
"upload": "Prijenos", "upload": "Prijenos",
"leech": "Leech", "leech": "Korištenje tuđeg sadržaja",
"seed": "Seed" "seed": "Prenošenje preuzetog sadržaja"
}, },
"flood": { "flood": {
"download": "Preuzimanje", "download": "Preuzimanje",
"upload": "Prijenos", "upload": "Prijenos",
"leech": "Leech", "leech": "Korištenje tuđeg sadržaja",
"seed": "Seed" "seed": "Prenošenje preuzetog sadržaja"
}, },
"tdarr": { "tdarr": {
"queue": "Queue", "queue": "Red čekanja",
"processed": "Processed", "processed": "Obrađeno",
"errored": "Errored", "errored": "S greškom",
"saved": "Saved" "saved": "Spremljeno"
}, },
"miniflux": { "miniflux": {
"read": "Read", "read": "Pročitano",
"unread": "Unread" "unread": "Nepročitano"
}, },
"nextdns": { "nextdns": {
"wait": "Please Wait", "wait": "Pričekaj",
"no_devices": "No Device Data Received" "no_devices": "Podaci o uređaju nisu primljeni"
}, },
"common": { "common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}", "bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}" "bibitrate": "{{value, rate(bits: true; binary: true)}}"
}, },
"omada": { "omada": {
"connectedAp": "Connected APs", "connectedAp": "Povezani AP-ovi",
"activeUser": "Active devices", "activeUser": "Aktivni uređaji",
"alerts": "Alerts", "alerts": "Upozorenja",
"connectedGateway": "Connected gateways", "connectedGateway": "Povezani pristupi",
"connectedSwitches": "Connected switches" "connectedSwitches": "Povezani prekidači"
}, },
"downloadstation": { "downloadstation": {
"download": "Download", "download": "Preuzimanje",
"upload": "Upload", "upload": "Prijenos",
"leech": "Leech", "leech": "Korištenje tuđeg sadržaja",
"seed": "Seed" "seed": "Prenošenje preuzetog sadržaja"
}, },
"mikrotik": { "mikrotik": {
"cpuLoad": "CPU Load", "cpuLoad": "CPU Load",
"memoryUsed": "Memory Used", "memoryUsed": "Korištena memorija",
"uptime": "Uptime", "uptime": "Uptime",
"numberOfLeases": "Leases" "numberOfLeases": "Leases"
}, },
"xteve": { "xteve": {
"streams_all": "All Streams", "streams_all": "Svi prijenosi",
"streams_active": "Active Streams", "streams_active": "Aktivni prijenosi",
"streams_xepg": "XEPG Channels" "streams_xepg": "XEPG kanali"
}, },
"opnsense": { "opnsense": {
"cpu": "CPU Load", "cpu": "CPU Load",
"memory": "Active Memory", "memory": "Aktivna memorija",
"wanUpload": "WAN Upload", "wanUpload": "WAN prijenos",
"wanDownload": "WAN Download" "wanDownload": "WAN preuzimanje"
} }
} }

@ -0,0 +1,407 @@
{
"navidrome": {
"nothing_streaming": "No Active Streams",
"please_wait": "Please Wait"
},
"npm": {
"total": "Total",
"enabled": "Enabled",
"disabled": "Disabled"
},
"strelaysrv": {
"numActiveSessions": "Sessions",
"numConnections": "Connections",
"dataRelayed": "Relayed",
"transferRate": "Rate"
},
"glances": {
"mem": "MEM",
"cpu": "CPU",
"wait": "Please wait"
},
"autobrr": {
"filters": "Filters",
"indexers": "Indexers",
"approvedPushes": "Approved",
"rejectedPushes": "Rejected"
},
"gluetun": {
"region": "Region",
"country": "Country",
"public_ip": "Public IP"
},
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"widget": {
"api_error": "APIエラー",
"information": "情報",
"missing_type": "見つからないウィジェットタイプ: {{type}}",
"status": "ステータス",
"url": "URL",
"raw_error": "生のエラー",
"response_data": "レスポンスデータ"
},
"weather": {
"current": "Current Location",
"allow": "Click to allow",
"updating": "Updating",
"wait": "Please wait"
},
"search": {
"placeholder": "Search…"
},
"resources": {
"cpu": "CPU",
"total": "Total",
"free": "Free",
"used": "Used",
"load": "Load"
},
"unifi": {
"users": "Users",
"uptime": "System Uptime",
"days": "Days",
"wan": "WAN",
"lan": "LAN",
"wlan": "WLAN",
"devices": "Devices",
"lan_devices": "LAN Devices",
"wlan_devices": "WLAN Devices",
"lan_users": "LAN Users",
"wlan_users": "WLAN Users",
"up": "UP",
"down": "DOWN",
"wait": "Please wait"
},
"docker": {
"rx": "RX",
"tx": "TX",
"mem": "MEM",
"cpu": "CPU",
"offline": "Offline",
"error": "Error",
"unknown": "Unknown"
},
"ping": {
"error": "Error",
"ping": "Ping"
},
"emby": {
"playing": "Playing",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"no_active": "No Active Streams"
},
"flood": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"changedetectionio": {
"totalObserved": "Total Observed",
"diffsDetected": "Diffs Detected"
},
"tautulli": {
"playing": "Playing",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"no_active": "No Active Streams"
},
"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",
"movies": "Movies",
"tv": "TV Shows"
},
"sabnzbd": {
"rate": "Rate",
"queue": "Queue",
"timeleft": "Time Left"
},
"rutorrent": {
"active": "Active",
"upload": "Upload",
"download": "Download"
},
"transmission": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"qbittorrent": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"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"
},
"radarr": {
"wanted": "Wanted",
"missing": "Missing",
"queued": "Queued",
"movies": "Movies"
},
"lidarr": {
"wanted": "Wanted",
"queued": "Queued",
"albums": "Albums"
},
"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"
},
"pihole": {
"queries": "Queries",
"blocked": "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"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
"traefik": {
"routers": "Routers",
"services": "Services",
"middleware": "Middleware"
},
"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"
},
"mastodon": {
"user_count": "Users",
"status_count": "Posts",
"domain_count": "Domains"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"authentik": {
"users": "Users",
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)"
},
"proxmox": {
"mem": "MEM",
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
},
"quicklaunch": {
"bookmark": "Bookmark",
"service": "Service"
},
"wmo": {
"0-day": "Sunny",
"1-day": "Mainly Sunny",
"0-night": "Clear",
"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",
"67-night": "Freezing Rain",
"71-day": "Light Snow",
"65-day": "Heavy Rain",
"65-night": "Heavy Rain",
"66-day": "Freezing Rain",
"66-night": "Freezing Rain",
"67-day": "Freezing Rain",
"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"
},
"homebridge": {
"available_update": "System",
"updates": "Updates",
"update_available": "Update Available",
"up_to_date": "Up to Date",
"child_bridges": "Child Bridges",
"child_bridges_status": "{{ok}}/{{total}}"
},
"watchtower": {
"containers_scanned": "Scanned",
"containers_updated": "Updated",
"containers_failed": "Failed"
},
"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"
},
"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"
}
}

@ -1,6 +1,6 @@
{ {
"widget": { "widget": {
"missing_type": "Widget ausente: {{type}}", "missing_type": "Tipo de Widget ausente: {{type}}",
"api_error": "Erro da API", "api_error": "Erro da API",
"status": "Estado", "status": "Estado",
"information": "Informação", "information": "Informação",
@ -14,8 +14,8 @@
"resources": { "resources": {
"total": "Total", "total": "Total",
"free": "Livre", "free": "Livre",
"used": "Usado", "used": "Utilizado",
"load": "Carregar", "load": "Carga",
"cpu": "CPU" "cpu": "CPU"
}, },
"docker": { "docker": {
@ -53,7 +53,7 @@
"wanted": "Desejado", "wanted": "Desejado",
"queued": "Fila", "queued": "Fila",
"movies": "Filmes", "movies": "Filmes",
"missing": "Missing" "missing": "Faltando"
}, },
"readarr": { "readarr": {
"wanted": "Desejados", "wanted": "Desejados",
@ -111,14 +111,14 @@
"weather": { "weather": {
"current": "Localização atual", "current": "Localização atual",
"allow": "Clicar para permitir", "allow": "Clicar para permitir",
"updating": "A atualizar", "updating": "Atualizando",
"wait": "Por favor aguarde" "wait": "Por favor aguarde"
}, },
"overseerr": { "overseerr": {
"pending": "Pendente", "pending": "Pendente",
"approved": "Aprovado", "approved": "Aprovado",
"available": "Disponível", "available": "Disponível",
"processing": "Processing" "processing": "Processando"
}, },
"sabnzbd": { "sabnzbd": {
"rate": "Taxa", "rate": "Taxa",
@ -192,9 +192,9 @@
"transferRate": "Taxa" "transferRate": "Taxa"
}, },
"authentik": { "authentik": {
"loginsLast24H": "Logins (24h)", "loginsLast24H": "Inícios de sessão (24h)",
"failedLoginsLast24H": "Failed Logins (24h)", "failedLoginsLast24H": "Inícios de sessão falhados (24h)",
"users": "Users" "users": "Utilizadores"
}, },
"proxmox": { "proxmox": {
"mem": "MEM", "mem": "MEM",
@ -204,13 +204,13 @@
}, },
"unifi": { "unifi": {
"users": "Utilizadores", "users": "Utilizadores",
"uptime": "Tempo de Atividade do Sistema", "uptime": "Sistema Ativo",
"days": "Dias", "days": "Dias",
"wan": "WAN", "wan": "WAN",
"lan_users": "Utilizadores LAN", "lan_users": "Utilizadores LAN",
"wlan_users": "Utilizadores WLAN", "wlan_users": "Utilizadores WLAN",
"up": "Ligados", "up": "Ligado",
"down": "Desligados", "down": "Desligado",
"wait": "Por favor, aguarde", "wait": "Por favor, aguarde",
"lan": "LAN", "lan": "LAN",
"wlan": "WLAN", "wlan": "WLAN",
@ -241,7 +241,7 @@
"2-night": "Parcialmente nublado", "2-night": "Parcialmente nublado",
"3-day": "Nublado", "3-day": "Nublado",
"3-night": "Nublado", "3-night": "Nublado",
"99-night": "Thunderstorm With Hail", "99-night": "Trovoada com granizo",
"45-day": "Nevoeiro", "45-day": "Nevoeiro",
"45-night": "Nevoeiro", "45-night": "Nevoeiro",
"48-day": "Nevoeiro", "48-day": "Nevoeiro",
@ -257,160 +257,160 @@
"57-day": "Freezing Drizzle", "57-day": "Freezing Drizzle",
"57-night": "Freezing Drizzle", "57-night": "Freezing Drizzle",
"66-day": "Freezing Rain", "66-day": "Freezing Rain",
"61-day": "Light Rain", "61-day": "Chuva fraca",
"61-night": "Light Rain", "61-night": "Chuva fraca",
"63-day": "Rain", "63-day": "Chuva",
"63-night": "Rain", "63-night": "Chuva",
"65-day": "Heavy Rain", "65-day": "Chuva forte",
"66-night": "Freezing Rain", "66-night": "Freezing Rain",
"65-night": "Heavy Rain", "65-night": "Chuva forte",
"67-day": "Freezing Rain", "67-day": "Freezing Rain",
"67-night": "Freezing Rain", "67-night": "Freezing Rain",
"71-day": "Light Snow", "71-day": "Neve fraca",
"71-night": "Light Snow", "71-night": "Neve fraca",
"73-day": "Snow", "73-day": "Neve",
"73-night": "Snow", "73-night": "Neve",
"75-day": "Heavy Snow", "75-day": "Neve forte",
"75-night": "Heavy Snow", "75-night": "Neve forte",
"77-day": "Snow Grains", "77-day": "Snow Grains",
"77-night": "Snow Grains", "77-night": "Snow Grains",
"80-day": "Light Showers", "80-day": "Neve fraca",
"80-night": "Light Showers", "80-night": "Chuviscos ligeiros",
"81-day": "Showers", "81-day": "Chuviscos",
"81-night": "Showers", "81-night": "Chuviscos",
"82-day": "Heavy Showers", "82-day": "Chuviscos fortes",
"82-night": "Heavy Showers", "82-night": "Chuviscos fortes",
"85-day": "Snow Showers", "85-day": "Snow Showers",
"85-night": "Snow Showers", "85-night": "Snow Showers",
"86-day": "Snow Showers", "86-day": "Snow Showers",
"86-night": "Snow Showers", "86-night": "Snow Showers",
"95-day": "Thunderstorm", "95-day": "Trovoada",
"95-night": "Thunderstorm", "95-night": "Trovoada",
"96-day": "Thunderstorm With Hail", "96-day": "Trovoada com granizo",
"96-night": "Thunderstorm With Hail", "96-night": "Trovoada com granizo",
"99-day": "Thunderstorm With Hail" "99-day": "Trovoada com granizo"
}, },
"quicklaunch": { "quicklaunch": {
"bookmark": "Marcador", "bookmark": "Marcador",
"service": "Serviço" "service": "Serviço"
}, },
"homebridge": { "homebridge": {
"available_update": "System", "available_update": "Sistema",
"updates": "Updates", "updates": "Atualizações",
"update_available": "Update Available", "update_available": "Atualização disponível",
"up_to_date": "Up to Date", "up_to_date": "Atualizado",
"child_bridges": "Child Bridges", "child_bridges": "Child Bridges",
"child_bridges_status": "{{ok}}/{{total}}" "child_bridges_status": "{{ok}}/{{total}}"
}, },
"autobrr": { "autobrr": {
"approvedPushes": "Approved", "approvedPushes": "Aprovado",
"rejectedPushes": "Rejected", "rejectedPushes": "Rejeitado",
"filters": "Filters", "filters": "Filtros",
"indexers": "Indexers" "indexers": "Indexadores"
}, },
"watchtower": { "watchtower": {
"containers_scanned": "Scanned", "containers_scanned": "Verificado",
"containers_updated": "Updated", "containers_updated": "Atualizado",
"containers_failed": "Failed" "containers_failed": "Falhou"
}, },
"tubearchivist": { "tubearchivist": {
"downloads": "Queue", "downloads": "Fila",
"videos": "Videos", "videos": "Vídeos",
"channels": "Channels", "channels": "Canais",
"playlists": "Playlists" "playlists": "Listas"
}, },
"truenas": { "truenas": {
"load": "System Load", "load": "Carga do sistema",
"uptime": "Uptime", "uptime": "Ligado",
"alerts": "Alerts", "alerts": "Alertas",
"time": "{{value, number(style: unit; unitDisplay: long;)}}" "time": "{{value, number(style: unit; unitDisplay: long;)}}"
}, },
"navidrome": { "navidrome": {
"nothing_streaming": "No Active Streams", "nothing_streaming": "Sem streams ativos",
"please_wait": "Please Wait" "please_wait": "Por favor aguarde"
}, },
"pyload": { "pyload": {
"queue": "Queue", "queue": "Fila",
"total": "Total", "total": "Total",
"speed": "Speed", "speed": "Velocidade",
"active": "Active" "active": "Ativo"
}, },
"gluetun": { "gluetun": {
"region": "Region", "region": "Região",
"country": "Country", "country": "País",
"public_ip": "Public IP" "public_ip": "IP público"
}, },
"hdhomerun": { "hdhomerun": {
"channels": "Channels", "channels": "Canais",
"hd": "HD" "hd": "HD"
}, },
"ping": { "ping": {
"error": "Erro", "error": "Erro",
"ping": "Ping" "ping": "Tempo de resposta"
}, },
"scrutiny": { "scrutiny": {
"passed": "Passed", "passed": "Aprovado",
"failed": "Failed", "failed": "Falhou",
"unknown": "Unknown" "unknown": "Desconhecido"
}, },
"paperlessngx": { "paperlessngx": {
"inbox": "Inbox", "inbox": "Caixa de entrada",
"total": "Total" "total": "Total"
}, },
"deluge": { "deluge": {
"download": "Download", "download": "Descarregar",
"upload": "Upload", "upload": "Enviar",
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Semente"
}, },
"flood": { "flood": {
"download": "Descarregar", "download": "Descarregar",
"upload": "Carregar", "upload": "Carregar",
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Semente"
}, },
"tdarr": { "tdarr": {
"queue": "Queue", "queue": "Fila",
"processed": "Processed", "processed": "Processado",
"errored": "Errored", "errored": "Erro",
"saved": "Saved" "saved": "Guardado"
}, },
"miniflux": { "miniflux": {
"read": "Read", "read": "Lido",
"unread": "Unread" "unread": "Não lido"
}, },
"nextdns": { "nextdns": {
"wait": "Please Wait", "wait": "Aguarde",
"no_devices": "No Device Data Received" "no_devices": "Nenhum dado do dispositivo recebido"
}, },
"omada": { "omada": {
"connectedAp": "Connected APs", "connectedAp": "APs Ligados",
"activeUser": "Active devices", "activeUser": "Dispositivos activos",
"alerts": "Alerts", "alerts": "Alertas",
"connectedGateway": "Connected gateways", "connectedGateway": "Gateways ligados",
"connectedSwitches": "Connected switches" "connectedSwitches": "Switches ligados"
}, },
"downloadstation": { "downloadstation": {
"download": "Download", "download": "Descarregar",
"upload": "Upload", "upload": "Enviar",
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Semente"
}, },
"mikrotik": { "mikrotik": {
"cpuLoad": "CPU Load", "cpuLoad": "Carga do CPU",
"memoryUsed": "Memory Used", "memoryUsed": "Memória Utilizada",
"uptime": "Uptime", "uptime": "Ativo",
"numberOfLeases": "Leases" "numberOfLeases": "Leases"
}, },
"xteve": { "xteve": {
"streams_all": "All Streams", "streams_all": "Todos os Streams",
"streams_active": "Active Streams", "streams_active": "Streams ativos",
"streams_xepg": "XEPG Channels" "streams_xepg": "Canais XEPG"
}, },
"opnsense": { "opnsense": {
"cpu": "CPU Load", "cpu": "Carga do CPU",
"memory": "Active Memory", "memory": "Memória Ativa",
"wanUpload": "WAN Upload", "wanUpload": "Envio WAN",
"wanDownload": "WAN Download" "wanDownload": "WAN Descarga"
} }
} }

@ -1,116 +1,116 @@
{ {
"widget": { "widget": {
"missing_type": "Missing Widget Type: {{type}}", "missing_type": "遺失的小工具類型: {{type}}",
"api_error": "API Error", "api_error": "API錯誤",
"status": "Status", "status": "狀態",
"information": "Information", "information": "資訊",
"url": "URL", "url": "URL",
"raw_error": "Raw Error", "raw_error": "Raw Error",
"response_data": "Response Data" "response_data": "Response Data"
}, },
"weather": { "weather": {
"current": "Current Location", "current": "目前位置",
"allow": "Click to allow", "allow": "點擊以允許",
"updating": "Updating", "updating": "更新中",
"wait": "Please wait" "wait": "請稍後"
}, },
"docker": { "docker": {
"rx": "RX", "rx": "接收",
"offline": "Offline", "offline": "離線",
"tx": "TX", "tx": "發送",
"mem": "MEM", "mem": "記憶體",
"cpu": "CPU", "cpu": "處理器",
"error": "Error", "error": "錯誤",
"unknown": "Unknown" "unknown": "未知的"
}, },
"emby": { "emby": {
"playing": "Playing", "playing": "正在播放",
"transcoding": "Transcoding", "transcoding": "轉碼",
"bitrate": "Bitrate", "bitrate": "位元率",
"no_active": "No Active Streams" "no_active": "暫無撥放"
}, },
"tautulli": { "tautulli": {
"playing": "Playing", "playing": "正在播放",
"transcoding": "Transcoding", "transcoding": "轉碼",
"bitrate": "Bitrate", "bitrate": "位元率",
"no_active": "No Active Streams" "no_active": "暫無撥放"
}, },
"jellyseerr": { "jellyseerr": {
"pending": "Pending", "pending": "待定",
"approved": "Approved", "approved": "已接受",
"available": "Available" "available": "可用的"
}, },
"search": { "search": {
"placeholder": "Search…" "placeholder": "搜尋…"
}, },
"resources": { "resources": {
"total": "Total", "total": "全部",
"free": "Free", "free": "剩餘",
"used": "Used", "used": "已使用",
"load": "Load", "load": "負載",
"cpu": "CPU" "cpu": "CPU"
}, },
"nzbget": { "nzbget": {
"rate": "Rate", "rate": "速率",
"remaining": "Remaining", "remaining": "剩餘",
"downloaded": "Downloaded" "downloaded": "已下載"
}, },
"sabnzbd": { "sabnzbd": {
"rate": "Rate", "rate": "速率",
"queue": "Queue", "queue": "佇列",
"timeleft": "Time Left" "timeleft": "剩餘時間"
}, },
"rutorrent": { "rutorrent": {
"active": "Active", "active": "Active",
"upload": "Upload", "upload": "上傳",
"download": "Download" "download": "下載"
}, },
"radarr": { "radarr": {
"movies": "Movies", "movies": "電影",
"wanted": "Wanted", "wanted": "欲觀看",
"queued": "Queued", "queued": "已加入佇列",
"missing": "Missing" "missing": "遺失"
}, },
"sonarr": { "sonarr": {
"wanted": "Wanted", "wanted": "欲觀看",
"queued": "Queued", "queued": "已加入佇列",
"series": "Series" "series": "系列"
}, },
"readarr": { "readarr": {
"wanted": "Wanted", "wanted": "欲觀看",
"queued": "Queued", "queued": "已加入佇列",
"books": "Books" "books": "書籍"
}, },
"ombi": { "ombi": {
"pending": "Pending", "pending": "待定",
"approved": "Approved", "approved": "已接受",
"available": "Available" "available": "可用的"
}, },
"overseerr": { "overseerr": {
"pending": "Pending", "pending": "待定",
"approved": "Approved", "approved": "已接受",
"available": "Available", "available": "可用的",
"processing": "Processing" "processing": "處理中"
}, },
"pihole": { "pihole": {
"queries": "Queries", "queries": "查詢",
"blocked": "Blocked", "blocked": "已阻擋",
"gravity": "Gravity" "gravity": "Gravity"
}, },
"speedtest": { "speedtest": {
"upload": "Upload", "upload": "上行",
"download": "Download", "download": "下行",
"ping": "Ping" "ping": "Ping"
}, },
"portainer": { "portainer": {
"running": "Running", "running": "運行中",
"stopped": "Stopped", "stopped": "已停止",
"total": "Total" "total": "總數"
}, },
"traefik": { "traefik": {
"routers": "Routers", "routers": "路由器",
"services": "Services", "services": "服務",
"middleware": "Middleware" "middleware": "中介軟體"
}, },
"gotify": { "gotify": {
"clients": "Clients", "clients": "Clients",
@ -118,8 +118,8 @@
"messages": "Messages" "messages": "Messages"
}, },
"npm": { "npm": {
"enabled": "Enabled", "enabled": "已啟用",
"disabled": "Disabled", "disabled": "已停用",
"total": "Total" "total": "Total"
}, },
"coinmarketcap": { "coinmarketcap": {
@ -137,8 +137,8 @@
"numberOfFailQueries": "Fail Queries" "numberOfFailQueries": "Fail Queries"
}, },
"transmission": { "transmission": {
"download": "Download", "download": "下載",
"upload": "Upload", "upload": "上傳",
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
@ -147,23 +147,23 @@
"errored": "Errored" "errored": "Errored"
}, },
"bazarr": { "bazarr": {
"missingEpisodes": "Missing Episodes", "missingEpisodes": "缺失的劇集",
"missingMovies": "Missing Movies" "missingMovies": "缺失的電影"
}, },
"lidarr": { "lidarr": {
"wanted": "Wanted", "wanted": "欲觀看",
"queued": "Queued", "queued": "已加入佇列",
"albums": "Albums" "albums": "專輯"
}, },
"adguard": { "adguard": {
"queries": "Queries", "queries": "查詢",
"blocked": "Blocked", "blocked": "已阻擋",
"filtered": "Filtered", "filtered": "已過濾",
"latency": "Latency" "latency": "延遲"
}, },
"qbittorrent": { "qbittorrent": {
"download": "Download", "download": "下載",
"upload": "Upload", "upload": "上傳",
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
@ -190,25 +190,25 @@
"vms": "VMs" "vms": "VMs"
}, },
"unifi": { "unifi": {
"users": "Users", "users": "使用者",
"uptime": "System Uptime", "uptime": "系統運行時間",
"days": "Days", "days": "",
"wan": "WAN", "wan": "WAN",
"lan_users": "LAN Users", "lan_users": "LAN使用者",
"wlan_users": "WLAN Users", "wlan_users": "WLAN使用者",
"up": "UP", "up": "UP",
"down": "DOWN", "down": "DOWN",
"wait": "Please wait", "wait": "請稍後",
"lan": "LAN", "lan": "LAN",
"wlan": "WLAN", "wlan": "WLAN",
"devices": "Devices", "devices": "設備",
"lan_devices": "LAN Devices", "lan_devices": "LAN設備",
"wlan_devices": "WLAN Devices" "wlan_devices": "WLAN設備"
}, },
"plex": { "plex": {
"streams": "Active Streams", "streams": "正在串流",
"movies": "Movies", "movies": "電影",
"tv": "TV Shows" "tv": "影集"
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
@ -313,8 +313,8 @@
"time": "{{value, number(style: unit; unitDisplay: long;)}}" "time": "{{value, number(style: unit; unitDisplay: long;)}}"
}, },
"navidrome": { "navidrome": {
"nothing_streaming": "No Active Streams", "nothing_streaming": "暫無撥放",
"please_wait": "Please Wait" "please_wait": "請稍後"
}, },
"pyload": { "pyload": {
"speed": "Speed", "speed": "Speed",
@ -332,7 +332,7 @@
"hd": "HD" "hd": "HD"
}, },
"ping": { "ping": {
"error": "Error", "error": "錯誤",
"ping": "Ping" "ping": "Ping"
}, },
"scrutiny": { "scrutiny": {
@ -345,22 +345,22 @@
"total": "Total" "total": "Total"
}, },
"deluge": { "deluge": {
"download": "Download", "download": "下載",
"upload": "Upload", "upload": "上傳",
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"flood": { "flood": {
"download": "Download", "download": "下載",
"upload": "Upload", "upload": "上傳",
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"tdarr": { "tdarr": {
"queue": "Queue", "queue": "佇列",
"processed": "Processed", "processed": "已處理",
"errored": "Errored", "errored": "錯誤",
"saved": "Saved" "saved": "已儲存"
}, },
"miniflux": { "miniflux": {
"read": "Read", "read": "Read",
@ -375,15 +375,15 @@
"bibitrate": "{{value, rate(bits: true; binary: true)}}" "bibitrate": "{{value, rate(bits: true; binary: true)}}"
}, },
"omada": { "omada": {
"connectedAp": "Connected APs", "connectedAp": "已連接的存取點",
"activeUser": "Active devices", "activeUser": "在線裝置",
"alerts": "Alerts", "alerts": "警示",
"connectedGateway": "Connected gateways", "connectedGateway": "已連接的閘道",
"connectedSwitches": "Connected switches" "connectedSwitches": "已連接的交換器"
}, },
"downloadstation": { "downloadstation": {
"download": "Download", "download": "下載",
"upload": "Upload", "upload": "上傳",
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },

@ -13,22 +13,23 @@ const textSizes = {
}; };
export default function DateTime({ options }) { export default function DateTime({ options }) {
const { text_size: textSize, format } = options; const { text_size: textSize, locale, format } = options;
const { i18n } = useTranslation(); const { i18n } = useTranslation();
const [date, setDate] = useState(""); const [date, setDate] = useState("");
const dateLocale = locale ?? i18n.language;
useEffect(() => { useEffect(() => {
const dateFormat = new Intl.DateTimeFormat(i18n.language, { ...format }); const dateFormat = new Intl.DateTimeFormat(dateLocale, { ...format });
const interval = setInterval(() => { const interval = setInterval(() => {
setDate(dateFormat.format(new Date())); setDate(dateFormat.format(new Date()));
}, 1000); }, 1000);
return () => clearInterval(interval); return () => clearInterval(interval);
}, [date, setDate, i18n.language, format]); }, [date, setDate, dateLocale, format]);
return ( return (
<div className="flex flex-col justify-center first:ml-0 ml-4"> <div className="flex flex-col justify-center first:ml-0 ml-4">
<div className="flex flex-row items-center grow justify-end"> <div className="flex flex-row items-center grow justify-end">
<span className={`text-theme-800 dark:text-theme-200 ${textSizes[textSize || "lg"]}`}> <span className={`text-theme-800 dark:text-theme-200 tabular-nums ${textSizes[textSize || "lg"]}`}>
{date} {date}
</span> </span>
</div> </div>

@ -30,6 +30,8 @@ export default async function credentialedProxyHandler(req, res, map) {
headers["X-gotify-Key"] = `${widget.key}`; headers["X-gotify-Key"] = `${widget.key}`;
} else if (widget.type === "authentik") { } else if (widget.type === "authentik") {
headers.Authorization = `Bearer ${widget.key}`; headers.Authorization = `Bearer ${widget.key}`;
} else if (widget.type === "truenas") {
headers.Authorization = `Bearer ${widget.key}`;
} else if (widget.type === "proxmox") { } else if (widget.type === "proxmox") {
headers.Authorization = `PVEAPIToken=${widget.username}=${widget.password}`; headers.Authorization = `PVEAPIToken=${widget.username}=${widget.password}`;
} else if (widget.type === "autobrr") { } else if (widget.type === "autobrr") {

@ -4,8 +4,8 @@ import { formatProxyUrl } from "./api-helpers";
export default function useWidgetAPI(widget, ...options) { export default function useWidgetAPI(widget, ...options) {
const config = {}; const config = {};
if (options?.refreshInterval) { if (options && options[1]?.refreshInterval) {
config.refreshInterval = options.refreshInterval; config.refreshInterval = options[1].refreshInterval;
} }
const { data, error } = useSWR(formatProxyUrl(widget, ...options), config); const { data, error } = useSWR(formatProxyUrl(widget, ...options), config);
// make the data error the top-level error // make the data error the top-level error

@ -5,10 +5,8 @@ import widgets from "widgets/widgets";
import getServiceWidget from "utils/config/service-helpers"; import getServiceWidget from "utils/config/service-helpers";
const logger = createLogger("downloadstationProxyHandler"); const logger = createLogger("downloadstationProxyHandler");
const authApi = "{url}/webapi/auth.cgi?api=SYNO.API.Auth&version=2&method=login&account={username}&passwd={password}&session=DownloadStation&format=cookie"
async function login(widget) { async function login(loginUrl) {
const loginUrl = formatApiCall(authApi, widget);
const [status, contentType, data] = await httpProxy(loginUrl); const [status, contentType, data] = await httpProxy(loginUrl);
if (status !== 200) { if (status !== 200) {
return [status, contentType, data]; return [status, contentType, data];
@ -56,8 +54,28 @@ export default async function downloadstationProxyHandler(req, res) {
const json = JSON.parse(data.toString()); const json = JSON.parse(data.toString());
if (json?.success !== true) { if (json?.success !== true) {
logger.debug("Logging in to DownloadStation"); logger.debug("Attempting login to DownloadStation");
[status, contentType, data] = await login(widget);
const apiInfoUrl = formatApiCall("{url}/webapi/query.cgi?api=SYNO.API.Info&version=1&method=query", widget);
let path = "entry.cgi";
let maxVersion = 7;
[status, contentType, data] = await httpProxy(apiInfoUrl);
if (status === 200) {
try {
const apiAuthInfo = JSON.parse(data.toString()).data['SYNO.API.Auth'];
if (apiAuthInfo) {
path = apiAuthInfo.path;
maxVersion = apiAuthInfo.maxVersion;
logger.debug(`Deteceted Downloadstation auth API path: ${path} and maxVersion: ${maxVersion}`);
}
} catch {
logger.debug(`Error ${status} obtaining DownloadStation API info`);
}
}
const authApi = `{url}/webapi/${path}?api=SYNO.API.Auth&version=${maxVersion}&method=login&account={username}&passwd={password}&session=DownloadStation&format=cookie`
const loginUrl = formatApiCall(authApi, widget);
[status, contentType, data] = await login(loginUrl);
if (status !== 200) { if (status !== 200) {
return res.status(status).end(data) return res.status(status).end(data)
} }

@ -1,9 +1,31 @@
import { jsonArrayFilter } from "utils/proxy/api-helpers"; import { jsonArrayFilter } from "utils/proxy/api-helpers";
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
import genericProxyHandler from "utils/proxy/handlers/generic"; import genericProxyHandler from "utils/proxy/handlers/generic";
import getServiceWidget from "utils/config/service-helpers";
const widget = { const widget = {
api: "{url}/api/v2.0/{endpoint}", api: "{url}/api/v2.0/{endpoint}",
proxyHandler: genericProxyHandler, proxyHandler: async (req, res, map) => { // choose proxy handler based on widget settings
const { group, service } = req.query;
if (group && service) {
const widgetOpts = await getServiceWidget(group, service);
let handler;
if (widgetOpts.username && widgetOpts.password) {
handler = genericProxyHandler;
} else if (widgetOpts.key) {
handler = credentialedProxyHandler;
}
if (handler) {
return handler(req, res, map);
}
return res.status(500).json({ error: "Username / password or API key required" });
}
return res.status(500).json({ error: "Error parsing widget request" });
},
mappings: { mappings: {
alerts: { alerts: {

Loading…
Cancel
Save