Compare commits

..

17 Commits

Author SHA1 Message Date
shamoon
e1799f17e3 Merge pull request #777 from jhollowe-forks/truenas-apikey
Change TrueNAS to use API key
2023-01-07 11:05:43 -08:00
Michael Shamoon
730f1c5ec1 Support api key + username / pass for truenas widget 2023-01-07 10:00:25 -08:00
John Hollowell
34a7b25c9c Add truenas key to credentialed proxy handler
Revert "Change TrueNAS to use API key"

This reverts commit 1926c26b77d8e048d92da6e20ff24a3056237daf.

Co-Authored-By: John Hollowell <jhollowe@johnhollowell.com>
2023-01-07 10:00:16 -08:00
Anonymous
f93106970a Translated using Weblate (Japanese)
Currently translated at 5.2% (15 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-01-07 01:13:54 +01:00
SASAGAWA, Kiyoshi
2b4fb03dcf Translated using Weblate (Japanese)
Currently translated at 5.2% (15 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-01-06 01:14:21 +01:00
Anonymous
11fad11b6d Translated using Weblate (Japanese)
Currently translated at 100.0% (0 of 0 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-01-05 10:26:06 +01:00
Milo Ivir
885dca1750 Translated using Weblate (Croatian)
Currently translated at 97.9% (282 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-01-05 10:26:03 +01:00
ze cabra
1caa9faded Translated using Weblate (Portuguese)
Currently translated at 88.8% (256 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-01-05 10:26:03 +01:00
SASAGAWA, Kiyoshi
4f24c0f909 Added translation using Weblate (Japanese) 2023-01-05 10:25:44 +01:00
shamoon
1fd198c255 Merge pull request #771 from benphelps/datetime-locale
Feature: allow setting locale for datetime widget directly
2023-01-04 19:12:23 -08:00
Michael Shamoon
84b7f103c3 Allow setting locale for datetime widget directly 2023-01-04 13:53:06 -08:00
shamoon
272be2c086 Merge pull request #770 from HaroldVB/patch-1
Giving Read Only rights to homepage
2023-01-04 12:28:31 -08:00
Harold
6705197a35 Giving Read Only rights to homepage
Giving Read Only rights to homepage container.
Adding :RO to the docker.sock volume. When the container gets compromised the intruder will have root access basically. The container doesn't need the write privileges.

This measure will stop inexperienced people from exposing their docker.socket to the public internet.
2023-01-04 20:10:18 +01:00
shamoon
2ac06937f9 Merge pull request #769 from benphelps/downloadstation-support-v6+v7
Fix: Support Synology DownloadStation v6 + v7
2023-01-03 23:19:56 -08:00
Michael Shamoon
35a2cd9b94 Support Synology DownloadStation v6 + v7
Co-Authored-By: Benoit SERRA <11260343+Oupsman@users.noreply.github.com>
2023-01-03 15:51:21 -08:00
shamoon
3a43cf247b Merge pull request #765 from benphelps/fix-764
Use tabular nums for datetime to prevent size changing
2023-01-02 08:34:49 -08:00
Michael Shamoon
af29f5b266 Use tabular nums for datetime to prevent size changing 2023-01-02 08:30:57 -08:00
8 changed files with 587 additions and 137 deletions

View File

@@ -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:

View File

@@ -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"
} }
} }

View File

@@ -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"
}
}

View File

@@ -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"
} }
} }

View File

@@ -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>

View File

@@ -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") {

View File

@@ -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)
} }

View File

@@ -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: {