Compare commits

...

226 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
shamoon
f6b1304e22 Merge pull request #749 from benphelps/fix-docker-log-error
Fix: remove error on no discovered services
2022-12-30 20:32:11 -08:00
Michael Shamoon
ee729a7e6a remove error on no discovered services 2022-12-30 20:31:25 -08:00
Michael Shamoon
bc7937db71 omada widget cleanup 2022-12-29 00:25:50 -08:00
shamoon
0e1aeaf54c Merge pull request #719 from benphelps/docker-server-failovers
Fix: Handle docker server failures if others succeed
2022-12-28 18:40:08 -08:00
shamoon
2e8717247d Merge pull request #745 from benphelps/fix-version-check-cache
Fix: version check caching
2022-12-28 18:38:50 -08:00
Michael Shamoon
d17a17bd3c Use server-side endpoint to properly cache GH release data 2022-12-28 18:33:14 -08:00
Michael Shamoon
0afc1b96f1 CPU / memory / disk usage bars start from 0
Closes #737
2022-12-28 16:21:04 -08:00
Michael Shamoon
5fbc6702bc Prevent blocking error on GH releases failure
Closes #738
2022-12-28 16:17:49 -08:00
Nonoss117
75455a23e2 Translated using Weblate (French)
Currently translated at 100.0% (288 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-12-27 12:50:18 +01:00
gallegonovato
2aed46671f Translated using Weblate (Spanish)
Currently translated at 100.0% (288 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-12-27 12:50:18 +01:00
shamoon
88934ec39a Correct debug messages in Pyload widget
Closes #733
2022-12-26 06:07:43 -08:00
shamoon
21c0c687cd Update README.md 2022-12-26 01:17:54 -08:00
shamoon
9f63a5a1d5 Merge pull request #732 from benphelps/fix-update-checker
Fix broken update checker
2022-12-26 01:02:37 -08:00
Michael Shamoon
679704949e Fix broken update checker 2022-12-26 01:02:01 -08:00
Anonymous
e46d291c78 Translated using Weblate (Ukrainian)
Currently translated at 45.1% (130 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2022-12-26 09:32:44 +01:00
Anonymous
54b01b302b Translated using Weblate (Esperanto)
Currently translated at 35.7% (103 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2022-12-26 09:32:43 +01:00
Anonymous
aa1726df05 Translated using Weblate (Hindi)
Currently translated at 3.1% (9 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2022-12-26 09:32:43 +01:00
Anonymous
810390c1be Translated using Weblate (Malay)
Currently translated at 87.8% (253 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2022-12-26 09:32:43 +01:00
Anonymous
b7b5e4a117 Translated using Weblate (Danish)
Currently translated at 68.7% (198 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2022-12-26 09:32:43 +01:00
Anonymous
e99a38063c Translated using Weblate (Czech)
Currently translated at 78.1% (225 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2022-12-26 09:32:42 +01:00
Anonymous
dacfc30cea Translated using Weblate (Arabic)
Currently translated at 15.2% (44 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2022-12-26 09:32:42 +01:00
Anonymous
7803b815af Translated using Weblate (Serbian)
Currently translated at 3.1% (9 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2022-12-26 09:32:42 +01:00
Anonymous
3500c81a1c Translated using Weblate (Turkish)
Currently translated at 80.2% (231 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2022-12-26 09:32:42 +01:00
Anonymous
6aa77faea0 Translated using Weblate (Bulgarian)
Currently translated at 15.9% (46 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2022-12-26 09:32:41 +01:00
Anonymous
3ca720953a Translated using Weblate (Telugu)
Currently translated at 75.3% (217 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2022-12-26 09:32:41 +01:00
Anonymous
4396d0a5f1 Translated using Weblate (Finnish)
Currently translated at 42.7% (123 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2022-12-26 09:32:41 +01:00
Anonymous
87ec2ea20c Translated using Weblate (Yue)
Currently translated at 40.9% (118 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2022-12-26 09:32:40 +01:00
Anonymous
700fb09e64 Translated using Weblate (Portuguese (Brazil))
Currently translated at 40.6% (117 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2022-12-26 09:32:40 +01:00
Anonymous
3736194c7c Translated using Weblate (Romanian)
Currently translated at 47.5% (137 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2022-12-26 09:32:40 +01:00
Anonymous
08c9379eba Translated using Weblate (Hebrew)
Currently translated at 35.0% (101 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2022-12-26 09:32:40 +01:00
Anonymous
040e784526 Translated using Weblate (Hungarian)
Currently translated at 37.5% (108 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2022-12-26 09:32:39 +01:00
Anonymous
443a073ae3 Translated using Weblate (Croatian)
Currently translated at 88.1% (254 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2022-12-26 09:32:39 +01:00
Anonymous
b792ba8267 Translated using Weblate (Swedish)
Currently translated at 45.1% (130 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2022-12-26 09:32:39 +01:00
Anonymous
349f2a1c66 Translated using Weblate (Polish)
Currently translated at 95.4% (275 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2022-12-26 09:32:39 +01:00
Anonymous
7750a1c1f4 Translated using Weblate (Catalan)
Currently translated at 89.5% (258 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-12-26 09:32:38 +01:00
Anonymous
631e7adb7c Translated using Weblate (Chinese (Traditional))
Currently translated at 3.1% (9 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2022-12-26 09:32:38 +01:00
Anonymous
9a70bb7e3d Translated using Weblate (Dutch)
Currently translated at 21.8% (63 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2022-12-26 09:32:38 +01:00
Anonymous
c08ca4ce44 Translated using Weblate (Vietnamese)
Currently translated at 15.2% (44 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2022-12-26 09:32:38 +01:00
Anonymous
cddf393714 Translated using Weblate (Norwegian Bokmål)
Currently translated at 27.4% (79 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2022-12-26 09:32:37 +01:00
Anonymous
fe0eeb5332 Translated using Weblate (Italian)
Currently translated at 97.2% (280 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2022-12-26 09:32:37 +01:00
Anonymous
9ad78f8204 Translated using Weblate (Chinese (Simplified))
Currently translated at 58.3% (168 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-12-26 09:32:37 +01:00
Anonymous
87be6b1105 Translated using Weblate (Russian)
Currently translated at 16.6% (48 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2022-12-26 09:32:37 +01:00
Anonymous
fc799000d3 Translated using Weblate (Portuguese)
Currently translated at 56.9% (164 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2022-12-26 09:32:36 +01:00
Anonymous
d4ee7962ce Translated using Weblate (French)
Currently translated at 98.6% (284 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-12-26 09:32:36 +01:00
Anonymous
762a02f287 Translated using Weblate (Spanish)
Currently translated at 97.5% (281 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-12-26 09:32:36 +01:00
Anonymous
cc1f580e46 Translated using Weblate (German)
Currently translated at 79.1% (228 of 288 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2022-12-26 09:32:36 +01:00
Nonoss117
765c6f9b99 Translated using Weblate (French)
Currently translated at 100.0% (284 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-12-26 09:32:16 +01:00
Benoit SERRA
94f43b1210 OPNSense widget (#730)
* Opnsense widget (#2)

* OPNSense widget : initial version, memory usage is inaccurate.

* OPNSense widget : code cleanup in widget.js. Firewall is no longer displayed, so it did not need to be queried.

* Opnsense widget (#3)

* OPNSense widget : initial version, memory usage is inaccurate.

* OPNSense widget : code cleanup in widget.js. Firewall is no longer displayed, so it did not need to be queried.

* OPNSense widget : fixing the CPU code to make it more reliable.

* OPNSense widget : fixing the CPU code to make it more reliable. Removing uptime info

* Update src/widgets/opnsense/component.jsx

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>

* Update public/locales/en/common.json

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>

* Update src/widgets/opnsense/component.jsx

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>

* Update src/widgets/opnsense/component.jsx

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2022-12-26 00:32:12 -08:00
Michael Shamoon
ba4cbad601 xteve cleanup 2022-12-25 20:58:20 -08:00
Anonymous
ab75534d3e Translated using Weblate (Ukrainian)
Currently translated at 45.7% (130 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2022-12-26 05:52:21 +01:00
Anonymous
a697a6e8d4 Translated using Weblate (Esperanto)
Currently translated at 36.2% (103 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2022-12-26 05:52:21 +01:00
Anonymous
5c3d7af929 Translated using Weblate (Hindi)
Currently translated at 3.1% (9 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2022-12-26 05:52:20 +01:00
Anonymous
5b8d781eb3 Translated using Weblate (Malay)
Currently translated at 89.0% (253 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2022-12-26 05:52:20 +01:00
Anonymous
2c8ab6e9d6 Translated using Weblate (Danish)
Currently translated at 69.7% (198 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2022-12-26 05:52:20 +01:00
Anonymous
fb9dc36226 Translated using Weblate (Czech)
Currently translated at 79.2% (225 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2022-12-26 05:52:19 +01:00
Anonymous
e549fc50af Translated using Weblate (Arabic)
Currently translated at 15.4% (44 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2022-12-26 05:52:19 +01:00
Anonymous
1b847136ab Translated using Weblate (Serbian)
Currently translated at 3.1% (9 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2022-12-26 05:52:19 +01:00
Anonymous
94e156b078 Translated using Weblate (Turkish)
Currently translated at 81.3% (231 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2022-12-26 05:52:19 +01:00
Anonymous
00aacba639 Translated using Weblate (Bulgarian)
Currently translated at 16.1% (46 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2022-12-26 05:52:19 +01:00
Anonymous
7ebd509036 Translated using Weblate (Telugu)
Currently translated at 76.4% (217 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2022-12-26 05:52:18 +01:00
Anonymous
b335c9603c Translated using Weblate (Finnish)
Currently translated at 43.3% (123 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2022-12-26 05:52:18 +01:00
Anonymous
4e58341443 Translated using Weblate (Yue)
Currently translated at 41.5% (118 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2022-12-26 05:52:18 +01:00
Anonymous
3b0931c012 Translated using Weblate (Portuguese (Brazil))
Currently translated at 41.1% (117 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2022-12-26 05:52:18 +01:00
Anonymous
513d187567 Translated using Weblate (Romanian)
Currently translated at 48.2% (137 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2022-12-26 05:52:17 +01:00
Anonymous
0d9068c6fa Translated using Weblate (Hebrew)
Currently translated at 35.5% (101 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2022-12-26 05:52:17 +01:00
Anonymous
1f756c1a67 Translated using Weblate (Hungarian)
Currently translated at 38.0% (108 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2022-12-26 05:52:17 +01:00
Anonymous
0e18d14eb1 Translated using Weblate (Croatian)
Currently translated at 89.4% (254 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2022-12-26 05:52:17 +01:00
Anonymous
ccf8d2c611 Translated using Weblate (Swedish)
Currently translated at 45.7% (130 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2022-12-26 05:52:16 +01:00
Anonymous
cad721dee2 Translated using Weblate (Polish)
Currently translated at 96.8% (275 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2022-12-26 05:52:16 +01:00
Anonymous
a3e21e56c0 Translated using Weblate (Catalan)
Currently translated at 90.8% (258 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-12-26 05:52:16 +01:00
Anonymous
e0213269c0 Translated using Weblate (Chinese (Traditional))
Currently translated at 3.1% (9 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2022-12-26 05:52:16 +01:00
Anonymous
d0f83aa30a Translated using Weblate (Dutch)
Currently translated at 22.1% (63 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2022-12-26 05:52:15 +01:00
Anonymous
acbc66f26b Translated using Weblate (Vietnamese)
Currently translated at 15.4% (44 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2022-12-26 05:52:15 +01:00
Anonymous
ee1fc2fa55 Translated using Weblate (Norwegian Bokmål)
Currently translated at 27.8% (79 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2022-12-26 05:52:15 +01:00
Anonymous
f0231e17fd Translated using Weblate (Italian)
Currently translated at 98.5% (280 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2022-12-26 05:52:15 +01:00
Anonymous
2182ffb894 Translated using Weblate (Chinese (Simplified))
Currently translated at 59.1% (168 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-12-26 05:52:14 +01:00
Anonymous
fbbf007fc7 Translated using Weblate (Russian)
Currently translated at 16.9% (48 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2022-12-26 05:52:14 +01:00
Anonymous
ba87f8b64d Translated using Weblate (Portuguese)
Currently translated at 57.7% (164 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2022-12-26 05:52:14 +01:00
Anonymous
0ab30b711c Translated using Weblate (French)
Currently translated at 98.9% (281 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-12-26 05:52:14 +01:00
Anonymous
63de2888c4 Translated using Weblate (Spanish)
Currently translated at 98.9% (281 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-12-26 05:52:14 +01:00
Anonymous
bdbe81268b Translated using Weblate (German)
Currently translated at 80.2% (228 of 284 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2022-12-26 05:52:13 +01:00
Dan
1dd7947c71 Translated using Weblate (Ukrainian)
Currently translated at 46.2% (130 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2022-12-26 05:51:55 +01:00
Marcus Kimpenhaus
43a11eadfc added widget for xteve (#731)
* added xteve widget

* eslint fixes

* xteve code cleanup

Co-authored-by: Marcus Kimpenhaus <k@AirM2.kimpenhaus.net>
Co-authored-by: Michael Shamoon <4887959+shamoon@users.noreply.github.com>
2022-12-25 20:51:51 -08:00
Anonymous
3a27486c34 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (0 of 0 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2022-12-25 23:03:08 +01:00
Dan
54fb201874 Added translation using Weblate (Ukrainian) 2022-12-25 23:02:49 +01:00
retmas-gh
977c65f911 Translated using Weblate (Polish)
Currently translated at 97.8% (275 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2022-12-25 17:50:08 +01:00
Paolo Casellati
8bdd03a632 Translated using Weblate (Italian)
Currently translated at 99.6% (280 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2022-12-25 17:50:07 +01:00
Nonoss117
6f34aaefa4 Translated using Weblate (French)
Currently translated at 100.0% (281 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-12-25 17:50:07 +01:00
gallegonovato
4017997448 Translated using Weblate (Spanish)
Currently translated at 100.0% (281 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-12-25 17:50:07 +01:00
Anonymous
82c290d5d8 Translated using Weblate (Esperanto)
Currently translated at 36.6% (103 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2022-12-23 18:12:36 +01:00
Anonymous
4417161e0c Translated using Weblate (Hindi)
Currently translated at 3.2% (9 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2022-12-23 18:12:35 +01:00
Anonymous
2b41121a80 Translated using Weblate (Malay)
Currently translated at 90.0% (253 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2022-12-23 18:12:35 +01:00
Anonymous
b1a0b4ebcf Translated using Weblate (Danish)
Currently translated at 70.4% (198 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2022-12-23 18:12:35 +01:00
Anonymous
5a8ae8a626 Translated using Weblate (Czech)
Currently translated at 80.0% (225 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2022-12-23 18:12:35 +01:00
Anonymous
59e966c6dd Translated using Weblate (Arabic)
Currently translated at 15.6% (44 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2022-12-23 18:12:35 +01:00
Anonymous
4ff2799c0e Translated using Weblate (Serbian)
Currently translated at 3.2% (9 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2022-12-23 18:12:34 +01:00
Anonymous
789831ff57 Translated using Weblate (Turkish)
Currently translated at 82.2% (231 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2022-12-23 18:12:34 +01:00
Anonymous
b4602a2e4b Translated using Weblate (Bulgarian)
Currently translated at 16.3% (46 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2022-12-23 18:12:34 +01:00
Anonymous
6722c3712d Translated using Weblate (Telugu)
Currently translated at 77.2% (217 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2022-12-23 18:12:34 +01:00
Anonymous
d650d1cae5 Translated using Weblate (Finnish)
Currently translated at 43.7% (123 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2022-12-23 18:12:34 +01:00
Anonymous
a8084e9e80 Translated using Weblate (Yue)
Currently translated at 41.9% (118 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2022-12-23 18:12:33 +01:00
Anonymous
458d376ce5 Translated using Weblate (Portuguese (Brazil))
Currently translated at 41.6% (117 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2022-12-23 18:12:33 +01:00
Anonymous
4c658cf717 Translated using Weblate (Romanian)
Currently translated at 48.7% (137 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2022-12-23 18:12:33 +01:00
Anonymous
8dff267305 Translated using Weblate (Hebrew)
Currently translated at 35.9% (101 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2022-12-23 18:12:33 +01:00
Anonymous
d69dda762a Translated using Weblate (Hungarian)
Currently translated at 38.4% (108 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2022-12-23 18:12:32 +01:00
Anonymous
b0b5d8b381 Translated using Weblate (Croatian)
Currently translated at 90.3% (254 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2022-12-23 18:12:32 +01:00
Anonymous
1662302b13 Translated using Weblate (Swedish)
Currently translated at 46.2% (130 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2022-12-23 18:12:32 +01:00
Anonymous
ae781a942e Translated using Weblate (Polish)
Currently translated at 90.3% (254 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2022-12-23 18:12:32 +01:00
Anonymous
f5f6c57ba8 Translated using Weblate (Catalan)
Currently translated at 91.8% (258 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-12-23 18:12:32 +01:00
Anonymous
ca6065d428 Translated using Weblate (Chinese (Traditional))
Currently translated at 3.2% (9 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2022-12-23 18:12:31 +01:00
Anonymous
7602ec8479 Translated using Weblate (Dutch)
Currently translated at 22.4% (63 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2022-12-23 18:12:31 +01:00
Anonymous
cf4c8885a1 Translated using Weblate (Vietnamese)
Currently translated at 15.6% (44 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2022-12-23 18:12:31 +01:00
Anonymous
644014419c Translated using Weblate (Norwegian Bokmål)
Currently translated at 28.1% (79 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2022-12-23 18:12:31 +01:00
Anonymous
922df3288b Translated using Weblate (Italian)
Currently translated at 95.3% (268 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2022-12-23 18:12:30 +01:00
Anonymous
195ebf2067 Translated using Weblate (Chinese (Simplified))
Currently translated at 59.7% (168 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-12-23 18:12:30 +01:00
Anonymous
f363f90da5 Translated using Weblate (Russian)
Currently translated at 17.0% (48 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2022-12-23 18:12:30 +01:00
Anonymous
667b88a450 Translated using Weblate (Portuguese)
Currently translated at 58.3% (164 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2022-12-23 18:12:30 +01:00
Anonymous
3b0e2797ca Translated using Weblate (French)
Currently translated at 97.1% (273 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-12-23 18:12:30 +01:00
Anonymous
cbded542f9 Translated using Weblate (Spanish)
Currently translated at 97.1% (273 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-12-23 18:12:29 +01:00
Anonymous
e9610f7c34 Translated using Weblate (German)
Currently translated at 81.1% (228 of 281 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2022-12-23 18:12:29 +01:00
Hosted Weblate
31fec3cead Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/
2022-12-23 18:12:11 +01:00
Benoit SERRA
38d81b654e Mikrotik widget (#720) 2022-12-23 09:12:06 -08:00
Anonymous
17e7d449b0 Translated using Weblate (Esperanto)
Currently translated at 37.1% (103 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2022-12-23 17:47:09 +01:00
Anonymous
3249e03bf6 Translated using Weblate (Hindi)
Currently translated at 3.2% (9 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2022-12-23 17:47:08 +01:00
Anonymous
817e5b630e Translated using Weblate (Malay)
Currently translated at 91.3% (253 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2022-12-23 17:47:08 +01:00
Anonymous
953ade7506 Translated using Weblate (Danish)
Currently translated at 71.4% (198 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2022-12-23 17:47:08 +01:00
Anonymous
a834d2a4e4 Translated using Weblate (Czech)
Currently translated at 81.2% (225 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2022-12-23 17:47:08 +01:00
Anonymous
b419ddde2d Translated using Weblate (Arabic)
Currently translated at 15.8% (44 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2022-12-23 17:47:07 +01:00
Anonymous
bb422179e5 Translated using Weblate (Serbian)
Currently translated at 3.2% (9 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2022-12-23 17:47:07 +01:00
Anonymous
efa35b4bd4 Translated using Weblate (Turkish)
Currently translated at 83.3% (231 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2022-12-23 17:47:07 +01:00
Anonymous
450babf95d Translated using Weblate (Bulgarian)
Currently translated at 16.6% (46 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2022-12-23 17:47:07 +01:00
Anonymous
1452d846e4 Translated using Weblate (Telugu)
Currently translated at 78.3% (217 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2022-12-23 17:47:06 +01:00
Anonymous
4c646c660b Translated using Weblate (Finnish)
Currently translated at 44.4% (123 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2022-12-23 17:47:06 +01:00
Anonymous
40657049a6 Translated using Weblate (Yue)
Currently translated at 42.5% (118 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2022-12-23 17:47:06 +01:00
Anonymous
0c8fe35af1 Translated using Weblate (Portuguese (Brazil))
Currently translated at 42.2% (117 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2022-12-23 17:47:06 +01:00
Anonymous
bf1b874368 Translated using Weblate (Romanian)
Currently translated at 49.4% (137 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2022-12-23 17:47:06 +01:00
Anonymous
207bd04489 Translated using Weblate (Hebrew)
Currently translated at 36.4% (101 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2022-12-23 17:47:05 +01:00
Anonymous
b4ca671902 Translated using Weblate (Hungarian)
Currently translated at 38.9% (108 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2022-12-23 17:47:05 +01:00
Anonymous
4062671466 Translated using Weblate (Croatian)
Currently translated at 91.6% (254 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2022-12-23 17:47:05 +01:00
Anonymous
ecccab9ebf Translated using Weblate (Swedish)
Currently translated at 46.9% (130 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2022-12-23 17:47:04 +01:00
Anonymous
5c8b821732 Translated using Weblate (Polish)
Currently translated at 91.6% (254 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2022-12-23 17:47:04 +01:00
Anonymous
2400357666 Translated using Weblate (Catalan)
Currently translated at 93.1% (258 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-12-23 17:47:04 +01:00
Anonymous
b7e58ae07b Translated using Weblate (Chinese (Traditional))
Currently translated at 3.2% (9 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2022-12-23 17:47:04 +01:00
Anonymous
3f523111b3 Translated using Weblate (Dutch)
Currently translated at 22.7% (63 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2022-12-23 17:47:03 +01:00
Anonymous
874a51f56c Translated using Weblate (Vietnamese)
Currently translated at 15.8% (44 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2022-12-23 17:47:03 +01:00
Anonymous
efe763fff8 Translated using Weblate (Norwegian Bokmål)
Currently translated at 28.5% (79 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2022-12-23 17:47:03 +01:00
Anonymous
05c0f39354 Translated using Weblate (Italian)
Currently translated at 96.7% (268 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2022-12-23 17:47:03 +01:00
Anonymous
3722caee73 Translated using Weblate (Chinese (Simplified))
Currently translated at 60.6% (168 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-12-23 17:47:03 +01:00
Anonymous
303acc24f6 Translated using Weblate (Russian)
Currently translated at 17.3% (48 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2022-12-23 17:47:02 +01:00
Anonymous
4a747f1f93 Translated using Weblate (Portuguese)
Currently translated at 59.2% (164 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2022-12-23 17:47:02 +01:00
Anonymous
caa97f774e Translated using Weblate (French)
Currently translated at 98.5% (273 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-12-23 17:47:02 +01:00
Anonymous
805d57bf31 Translated using Weblate (Spanish)
Currently translated at 98.5% (273 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-12-23 17:47:01 +01:00
Anonymous
3e86920b95 Translated using Weblate (German)
Currently translated at 82.3% (228 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2022-12-23 17:47:01 +01:00
Hosted Weblate
da32e54a4b Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/
2022-12-23 17:46:43 +01:00
Nonoss117
d1dce8b605 Translated using Weblate (French)
Currently translated at 100.0% (277 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-12-23 17:46:41 +01:00
gallegonovato
79176852b8 Translated using Weblate (Spanish)
Currently translated at 100.0% (277 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-12-23 17:46:41 +01:00
shamoon
c68cc3c8ed Merge pull request #715 from benphelps/diskstation-to-downloadstation
Chore: rename diskstation to downloadstation
2022-12-23 08:46:37 -08:00
Michael Shamoon
c8ea72c217 lint 2022-12-23 08:38:52 -08:00
Michael Shamoon
1cac02f2c0 Add number formatting to prowlarr
https://github.com/benphelps/homepage/pull/721#issuecomment-1364092798
2022-12-23 08:30:52 -08:00
shamoon
ca2f0ab229 Merge pull request #721 from kimpenhaus/bugfix/widget-number-format
fixed number formatting in widgets: radarr, sonarr, overseerr
2022-12-23 07:56:38 -08:00
Marcus Kimpenhaus
e7db56101b fixed number formatting in widgets: radarr, sonarr, overseerr 2022-12-23 14:20:12 +01:00
Anonymous
f63732fd19 Translated using Weblate (Esperanto)
Currently translated at 37.1% (103 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2022-12-23 06:24:34 +01:00
Anonymous
bbfe92cda6 Translated using Weblate (Hindi)
Currently translated at 3.2% (9 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2022-12-23 06:24:34 +01:00
Anonymous
ff54a8d1c3 Translated using Weblate (Malay)
Currently translated at 91.3% (253 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2022-12-23 06:24:34 +01:00
Anonymous
6f912bfcdc Translated using Weblate (Danish)
Currently translated at 71.4% (198 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2022-12-23 06:24:33 +01:00
Anonymous
7c14e682e7 Translated using Weblate (Czech)
Currently translated at 81.2% (225 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2022-12-23 06:24:33 +01:00
Anonymous
15a0e77450 Translated using Weblate (Arabic)
Currently translated at 15.8% (44 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2022-12-23 06:24:33 +01:00
Anonymous
35c6e92799 Translated using Weblate (Serbian)
Currently translated at 3.2% (9 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2022-12-23 06:24:33 +01:00
Anonymous
b4682aebd6 Translated using Weblate (Turkish)
Currently translated at 83.3% (231 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2022-12-23 06:24:32 +01:00
Anonymous
7f1ea3f67b Translated using Weblate (Bulgarian)
Currently translated at 16.6% (46 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2022-12-23 06:24:32 +01:00
Anonymous
b903240b40 Translated using Weblate (Telugu)
Currently translated at 78.3% (217 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2022-12-23 06:24:32 +01:00
Anonymous
a5f4e81d37 Translated using Weblate (Finnish)
Currently translated at 44.4% (123 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2022-12-23 06:24:32 +01:00
Anonymous
3466732b8e Translated using Weblate (Yue)
Currently translated at 42.5% (118 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2022-12-23 06:24:31 +01:00
Anonymous
e908bc2078 Translated using Weblate (Portuguese (Brazil))
Currently translated at 42.2% (117 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2022-12-23 06:24:31 +01:00
Anonymous
0aa8439301 Translated using Weblate (Romanian)
Currently translated at 49.4% (137 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2022-12-23 06:24:31 +01:00
Anonymous
7a69636794 Translated using Weblate (Hebrew)
Currently translated at 36.4% (101 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2022-12-23 06:24:30 +01:00
Anonymous
e4728e2cc9 Translated using Weblate (Hungarian)
Currently translated at 38.9% (108 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2022-12-23 06:24:30 +01:00
Anonymous
ca1af07aff Translated using Weblate (Croatian)
Currently translated at 92.4% (256 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2022-12-23 06:24:30 +01:00
Anonymous
c4e5574518 Translated using Weblate (Swedish)
Currently translated at 46.9% (130 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2022-12-23 06:24:30 +01:00
Anonymous
f34e7c9640 Translated using Weblate (Polish)
Currently translated at 93.1% (258 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2022-12-23 06:24:29 +01:00
Anonymous
17f289b00b Translated using Weblate (Catalan)
Currently translated at 94.5% (262 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-12-23 06:24:29 +01:00
Anonymous
966dabe3b5 Translated using Weblate (Chinese (Traditional))
Currently translated at 3.2% (9 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2022-12-23 06:24:29 +01:00
Anonymous
c3de335f2d Translated using Weblate (Dutch)
Currently translated at 22.7% (63 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2022-12-23 06:24:28 +01:00
Anonymous
155ef11596 Translated using Weblate (Vietnamese)
Currently translated at 15.8% (44 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2022-12-23 06:24:28 +01:00
Anonymous
0083379d96 Translated using Weblate (Norwegian Bokmål)
Currently translated at 28.5% (79 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2022-12-23 06:24:28 +01:00
Anonymous
f26af72dbe Translated using Weblate (Italian)
Currently translated at 98.1% (272 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2022-12-23 06:24:28 +01:00
Anonymous
c29e97a738 Translated using Weblate (Chinese (Simplified))
Currently translated at 60.6% (168 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-12-23 06:24:27 +01:00
Anonymous
1f5aac7e8f Translated using Weblate (Russian)
Currently translated at 17.3% (48 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2022-12-23 06:24:27 +01:00
Anonymous
34673e9bb5 Translated using Weblate (Portuguese)
Currently translated at 59.2% (164 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2022-12-23 06:24:27 +01:00
Anonymous
a535d052ec Translated using Weblate (French)
Currently translated at 98.1% (272 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-12-23 06:24:27 +01:00
Anonymous
f48a214024 Translated using Weblate (Spanish)
Currently translated at 98.1% (272 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-12-23 06:24:26 +01:00
Anonymous
ce629128e1 Translated using Weblate (German)
Currently translated at 82.3% (228 of 277 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2022-12-23 06:24:26 +01:00
Daniele Luisetto
df72dcfc7f Translated using Weblate (Italian)
Currently translated at 100.0% (272 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2022-12-23 06:23:19 +01:00
shamoon
b9415b43b0 Merge pull request #704 from benphelps/omada-widget
Feature: Omada widget
2022-12-22 21:23:14 -08:00
Michael Shamoon
6b90d3ef28 Handle docker server failures if others succeed 2022-12-22 21:16:52 -08:00
Daniele Luisetto
cac21ebd38 Translated using Weblate (Italian)
Currently translated at 84.5% (230 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2022-12-22 23:51:19 +01:00
shamoon
ccba3d87b0 Merge pull request #714 from benphelps/pihole-changes-1222
Pihole allow auth, updated API endpoint
2022-12-22 11:07:24 -08:00
Michael Shamoon
23ba45729e Rename diskstation to downloadstation 2022-12-22 10:58:46 -08:00
shamoon
04f803676a Update bug_report.yml 2022-12-22 09:39:52 -08:00
shamoon
61f77947ac Update bug_report.yml 2022-12-22 09:39:28 -08:00
Michael Shamoon
a9429e5335 Pihole allow auth, updated API endpoint 2022-12-22 09:27:13 -08:00
Michael Shamoon
952305492c More Omada widget cleanup 2022-12-21 13:18:32 -08:00
Michael Shamoon
b01e6eaf56 Refactor Omada proxy for api v3 2022-12-21 13:12:04 -08:00
Michael Shamoon
4a3f836020 Refactor Omada proxy for v4/v5 2022-12-21 13:12:04 -08:00
Michael Shamoon
a9cc0100f6 Squashed commit of the following from initial Omada widget:
commit ad3e664b56
Author: Benoit <oupsman@oupsman.fr>
Date:   Tue Dec 13 19:54:54 2022 +0100

    Add .idea to .gitignore

commit 7e51a09384
Merge: 93d8035 7dd0b0e
Author: Benoit SERRA <oupsman@oupsman.fr>
Date:   Tue Dec 13 18:38:51 2022 +0100

    Merge branch 'benphelps:main' into main

commit 93d80350b1
Author: Benoit <oupsman@oupsman.fr>
Date:   Tue Dec 13 18:15:20 2022 +0100

    Omada widget : One widget, shows only the number alerts, the number of connected AP, the number of connected devices to Wifi, the number of connected switches and gatewawys.

commit a1babd860c
Author: Benoit <oupsman@oupsman.fr>
Date:   Tue Dec 13 09:33:50 2022 +0100

    Omada widget : spliting widget between WLAN and LAN/WAN fields to have no more than 5 fields per widget.

commit e12cc65c77
Merge: 331f31f 146326f
Author: Benoit SERRA <oupsman@oupsman.fr>
Date:   Sun Dec 11 14:39:27 2022 +0100

    Merge branch 'benphelps:main' into main

commit 331f31fc2b
Merge: 37154e3 ccc1229
Author: Benoit SERRA <oupsman@oupsman.fr>
Date:   Sat Dec 10 17:56:44 2022 +0100

    Merge branch 'benphelps:main' into main

commit 37154e327a
Author: Benoit <oupsman@oupsman.fr>
Date:   Sat Dec 10 17:11:30 2022 +0100

    Omada widget : Improved error handling
    Omada widget: handling power as common.power in translation

commit 1f48491406
Author: Benoit <oupsman@oupsman.fr>
Date:   Sat Dec 10 10:24:55 2022 +0100

    Omada widget : adding stats for isolated aps, connected gateways, connected switches, available ports, power consumption

commit f375f0b815
Merge: 467b678 775b511
Author: Benoit <oupsman@oupsman.fr>
Date:   Fri Dec 9 21:06:38 2022 +0100

    Merge branch 'main' of https://github.com/Oupsman/homepage into main

commit 467b67802a
Author: Benoit <oupsman@oupsman.fr>
Date:   Fri Dec 9 21:06:09 2022 +0100

    Omada widget : v3 v4 and v5 versions don't use the same fields for the same stats, I've corrected the code to make it more reliable

commit 775b5111e1
Merge: 8d66756 88c4375
Author: Benoit SERRA <oupsman@oupsman.fr>
Date:   Thu Dec 8 15:38:20 2022 +0100

    Merge branch 'benphelps:main' into main

commit 8d66756a7d
Author: Benoit <oupsman@oupsman.fr>
Date:   Thu Dec 8 12:45:44 2022 +0100

    Omada Widget : code cleanup

commit 282a6d0592
Author: Benoit <oupsman@oupsman.fr>
Date:   Thu Dec 8 12:42:41 2022 +0100

    Omada Widget : code cleanup

commit c3e9b8f870
Author: Benoit <oupsman@oupsman.fr>
Date:   Thu Dec 8 12:37:10 2022 +0100

    Omada Widget : No more legacy variable, the code detects the controller version and adapts the requests. Logic is not duplicated anymore

commit eafcc20597
Author: Benoit <oupsman@oupsman.fr>
Date:   Wed Dec 7 15:46:00 2022 +0100

    V2 API is working

commit bcc2864ee2
Author: Benoit <oupsman@oupsman.fr>
Date:   Wed Dec 7 10:01:26 2022 +0100

    Code fore v2 API is not working but V1 code is.

commit ea8e297e84
Author: Benoit <oupsman@oupsman.fr>
Date:   Tue Dec 6 14:28:05 2022 +0100

    Errors handling

commit ab6d51a88c
Author: Benoit <oupsman@oupsman.fr>
Date:   Tue Dec 6 09:50:14 2022 +0100

    Adding alerts

commit 047db2cce8
Author: Benoit <oupsman@oupsman.fr>
Date:   Mon Dec 5 22:53:43 2022 +0100

    Fixed translation system

commit 42c5a3e665
Author: Benoit <oupsman@oupsman.fr>
Date:   Mon Dec 5 22:34:34 2022 +0100

    Translation system is still * up

commit c80eac9d5b
Author: Benoit <oupsman@oupsman.fr>
Date:   Mon Dec 5 22:33:50 2022 +0100

    Translation system is still * up

commit f8ba6b0245
Author: Benoit <oupsman@oupsman.fr>
Date:   Mon Dec 5 22:32:22 2022 +0100

    Translation system is still * up

commit dec7eec6de
Author: Benoit <oupsman@oupsman.fr>
Date:   Mon Dec 5 22:16:13 2022 +0100

    Translation system is * up

commit cc840cf7cc
Author: Benoit <oupsman@oupsman.fr>
Date:   Mon Dec 5 21:33:00 2022 +0100

    First working version

commit 54b65e619e
Author: Benoit <oupsman@oupsman.fr>
Date:   Mon Dec 5 18:59:09 2022 +0100

    Using getGlobalStat method

commit 7ebc8500da
Author: Benoit <oupsman@oupsman.fr>
Date:   Mon Dec 5 14:33:37 2022 +0100

    Working on Omada Widget : NOT WORKING FOR NOW

commit 04eaf28cae
Merge: 61065ac 826fe15
Author: Benoit <oupsman@oupsman.fr>
Date:   Mon Dec 5 10:32:30 2022 +0100

    Merge branch 'main' of https://github.com/Oupsman/homepage into main

commit 61065ace28
Author: Benoit <oupsman@oupsman.fr>
Date:   Mon Dec 5 10:24:57 2022 +0100

    Working on Omada Widget

remove idea

Co-Authored-By: Benoit SERRA <11260343+oupsman@users.noreply.github.com>
2022-12-21 13:12:04 -08:00
shamoon
de584eae8f Merge pull request #702 from bycEEE/patch-1
Fix minor typo in readme
2022-12-21 07:32:13 -08:00
Brian Choy
92641695ad Fix minor typo 2022-12-21 12:14:28 +00:00
gallegonovato
8e40aa1869 Translated using Weblate (Spanish)
Currently translated at 100.0% (272 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-12-19 18:47:43 +01:00
Nonoss117
e606b50cd0 Translated using Weblate (French)
Currently translated at 100.0% (272 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-12-18 12:50:04 +01:00
69 changed files with 2660 additions and 433 deletions

View File

@@ -68,9 +68,20 @@ body:
id: browser-logs
attributes:
label: Browser Logs
description: Please review and provide any relevant logs from the browser, if relevant
description: Please review and provide any logs from the browser, if relevant
- type: textarea
id: other
attributes:
label: Other
description: Any other relevant details. E.g. service version or API version, docker version, etc.
description: Please include output from your troubleshooting tests, if relevant. Include any other relevant details. E.g. service version or API version, docker version, etc.
- type: checkboxes
id: pre-flight
attributes:
label: Before submitting, I have made sure to
options:
- label: Check [the documentation](https://gethomepage.dev/)
required: true
- label: Follow [the troubleshooting guide](https://gethomepage.dev/en/more/troubleshooting/) (please include output above if applicable).
required: true
- label: Search [existing issues](https://github.com/benphelps/homepage/search?q=&type=issues) and [discussions](https://github.com/benphelps/homepage/search?q=&type=discussions).
required: true

5
.gitignore vendored
View File

@@ -41,3 +41,8 @@ next-env.d.ts
# homepage
/config
# IDEs
/.idea/

View File

@@ -45,15 +45,17 @@
- Container status (Running / Stopped) & statistics (CPU, Memory, Network)
- Automatic service discovery (via labels)
- Service Integration
- Sonarr, Radarr, Readarr, Prowlarr, Bazarr, Lidarr, Emby, Jellyfin, Tautulli (Plex)
- Ombi, Overseerr, Jellyseerr, Jackett, NZBGet, SABnzbd, ruTorrent, Transmission, qBittorrent
- Portainer, Traefik, Speedtest Tracker, PiHole, AdGuard Home, Nginx Proxy Manager, Gotify, Syncthing Relay Server, Authentik, Proxmox
- Sonarr, Radarr, Readarr, Prowlarr, Bazarr, Lidarr, Emby, Jellyfin, Tautulli, Plex and more
- Ombi, Overseerr, Jellyseerr, Jackett, NZBGet, SABnzbd, ruTorrent, Transmission, qBittorrent and more
- Portainer, Traefik, Speedtest Tracker, PiHole, AdGuard Home, Nginx Proxy Manager, Gotify, Syncthing Relay Server, Authentik, Proxmox and more
- Information Providers
- Coin Market Cap, Mastodon
- Coin Market Cap, Mastodon and more
- Information & Utility Widgets
- System Stats (Disk, CPU, Memory)
- Weather via [OpenWeatherMap](https://openweathermap.org/) or [Open-Meteo](https://open-meteo.com/)
- Search Bar
- Web Search Bar
- UniFi Console, Glances and more
- Instant "Quick-launch" search
- Customizable
- 21 theme colors with light and dark mode support
- Background image support
@@ -63,7 +65,7 @@
If you have any questions, suggestions, or general issues, please start a discussion on the [Discussions](https://github.com/benphelps/homepage/discussions) page.
If you have a more specific issue, please open an issue on the [Issues](https://github.com/benphelps/homepage/issues) page.
For bug reports, please open an issue on the [Issues](https://github.com/benphelps/homepage/issues) page.
## Getting Started
@@ -83,7 +85,7 @@ services:
- 3000:3000
volumes:
- /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:
@@ -117,7 +119,7 @@ pnpm start
## Configuration
Configuration files will be genereted and placed on the first request.
Configuration files will be generated and placed on the first request.
Configuration is done in the /config directory using .yaml files. Refer to each config for
the specific configuration options.

View File

@@ -350,12 +350,6 @@
"leech": "Leech",
"seed": "Seed"
},
"diskstation": {
"leech": "Leech",
"seed": "Seed",
"download": "Download",
"upload": "Upload"
},
"flood": {
"download": "Download",
"upload": "Upload",
@@ -379,5 +373,35 @@
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"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

@@ -350,12 +350,6 @@
"leech": "Leech",
"seed": "Seed"
},
"diskstation": {
"seed": "Seed",
"download": "Download",
"upload": "Upload",
"leech": "Leech"
},
"flood": {
"leech": "Leech",
"seed": "Seed",
@@ -379,5 +373,35 @@
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"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

@@ -350,12 +350,6 @@
"upload": "Pujada",
"leech": "Company"
},
"diskstation": {
"download": "Descàrrega",
"upload": "Pujada",
"leech": "Company",
"seed": "Llavor"
},
"flood": {
"download": "Descarregar",
"upload": "Pujada",
@@ -379,5 +373,35 @@
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"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

@@ -350,12 +350,6 @@
"seed": "Seed",
"download": "Download"
},
"diskstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
@@ -379,5 +373,35 @@
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"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

@@ -350,12 +350,6 @@
"leech": "Leech",
"seed": "Seed"
},
"diskstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"leech": "Leech",
"download": "Download",
@@ -379,5 +373,35 @@
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"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

@@ -350,12 +350,6 @@
"leech": "Leech",
"seed": "Seed"
},
"diskstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
@@ -379,5 +373,35 @@
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"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

@@ -88,6 +88,13 @@
"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",
@@ -126,7 +133,7 @@
"leech": "Leech",
"seed": "Seed"
},
"diskstation": {
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
@@ -199,7 +206,7 @@
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
},
"traefik": {
"routers": "Routers",
"services": "Services",
@@ -388,5 +395,22 @@
"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

@@ -350,12 +350,6 @@
"inbox": "Inbox",
"total": "Totalo"
},
"diskstation": {
"download": "Download",
"leech": "Leech",
"upload": "Upload",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
@@ -379,5 +373,35 @@
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"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

@@ -350,12 +350,6 @@
"leech": "Leech",
"seed": "Semilla"
},
"diskstation": {
"download": "Descargar",
"upload": "Cargar",
"leech": "Leech",
"seed": "Semilla"
},
"flood": {
"download": "Descargar",
"upload": "Subir",
@@ -363,21 +357,51 @@
"seed": "Seed"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"saved": "Saved",
"errored": "Errored"
"queue": "Cola",
"processed": "Procesado",
"saved": "Guardado",
"errored": "Error"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
"read": "Leer",
"unread": "Sin leer"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
"wait": "Espere, por favor",
"no_devices": "No se reciben datos del dispositivo"
},
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedAp": "AP conectados",
"activeUser": "Dispositivos activos",
"alerts": "Alertas",
"connectedGateway": "Pasarelas conectadas",
"connectedSwitches": "Interruptores conectados"
},
"downloadstation": {
"download": "Descargar",
"upload": "Subir",
"leech": "Sanguijuela",
"seed": "Semilla"
},
"mikrotik": {
"cpuLoad": "Carga de la CPU",
"memoryUsed": "Memoria utilizada",
"uptime": "Tiempo en funcionamiento",
"numberOfLeases": "Alquileres"
},
"xteve": {
"streams_all": "Todas las corrientes",
"streams_active": "Corrientes activas",
"streams_xepg": "Canales XEPG"
},
"opnsense": {
"cpu": "Carga de la CPU",
"memory": "Memoria activa",
"wanUpload": "Carga WAN",
"wanDownload": "Descargar WAN"
}
}

View File

@@ -350,12 +350,6 @@
"seed": "Seed",
"download": "Download"
},
"diskstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
@@ -379,5 +373,35 @@
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedSwitches": "Connected switches",
"connectedGateway": "Connected gateways"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"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

@@ -350,12 +350,6 @@
"leech": "Leech",
"seed": "Seed"
},
"diskstation": {
"download": "Réception",
"upload": "Envoi",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Récep.",
"upload": "Envoi",
@@ -369,15 +363,45 @@
"saved": "Enregistré"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
"read": "Lu",
"unread": "Non lu"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
"wait": "Patientez...",
"no_devices": "Aucune donnée d'appareil reçue"
},
"common": {
"bibitrate": "{{value, rate(bits: true; binary: true)}}",
"bibyterate": "{{value, rate(bits: false; binary: true)}}"
},
"omada": {
"connectedAp": "APs connectées",
"activeUser": "Équipts actifs",
"alerts": "Alertes",
"connectedGateway": "Passerelles connectées",
"connectedSwitches": "Switches connectés"
},
"downloadstation": {
"download": "Récep.",
"upload": "Envoi",
"leech": "Leech",
"seed": "Seed"
},
"mikrotik": {
"cpuLoad": "Charge CPU",
"memoryUsed": "Mém. Utilisée",
"uptime": "Disponibilité",
"numberOfLeases": "Baux"
},
"xteve": {
"streams_all": "Tous les flux",
"streams_active": "Flux actif",
"streams_xepg": "Canal XEPG"
},
"opnsense": {
"cpu": "Charge CPU",
"memory": "Mém. Utilisée",
"wanUpload": "WAN Envoi",
"wanDownload": "WAN Récep."
}
}

View File

@@ -350,12 +350,6 @@
"leech": "Leech",
"seed": "Seed"
},
"diskstation": {
"upload": "Upload",
"leech": "Leech",
"download": "Download",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
@@ -379,5 +373,35 @@
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"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

@@ -350,12 +350,6 @@
"leech": "Leech",
"seed": "Seed"
},
"diskstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
@@ -379,5 +373,35 @@
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"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

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

View File

@@ -350,12 +350,6 @@
"upload": "Upload",
"leech": "Leech"
},
"diskstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
@@ -379,5 +373,35 @@
"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"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"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

@@ -5,18 +5,18 @@
"cpu": "CPU",
"offline": "Offline",
"rx": "RX",
"error": "Error",
"unknown": "Unknown"
"error": "Errore",
"unknown": "Sconosciuto"
},
"emby": {
"playing": "In riproduzione",
"transcoding": "Transcoding",
"transcoding": "Transcodifica",
"bitrate": "Bitrate",
"no_active": "Nessuno Stream Attivo"
},
"tautulli": {
"playing": "In riproduzione",
"transcoding": "Transcoding",
"transcoding": "Transcodifica",
"bitrate": "Bitrate",
"no_active": "Nessuno Stream Attivo"
},
@@ -31,7 +31,7 @@
"total": "Totali"
},
"traefik": {
"routers": "Routers",
"routers": "Router",
"services": "Servizi",
"middleware": "Middleware"
},
@@ -40,9 +40,9 @@
"api_error": "Errore API",
"status": "Stato",
"url": "URL",
"information": "Information",
"information": "Informazione",
"raw_error": "Raw Error",
"response_data": "Response Data"
"response_data": "Dati risposta"
},
"search": {
"placeholder": "Cerca…"
@@ -105,7 +105,7 @@
"pending": "In attesa",
"approved": "Approvati",
"available": "Disponibili",
"processing": "Processing"
"processing": "In lavorazione"
},
"sabnzbd": {
"rate": "Rapporto",
@@ -126,13 +126,13 @@
},
"gotify": {
"apps": "Applicazioni",
"clients": "Clients",
"clients": "Client",
"messages": "Messaggi"
},
"prowlarr": {
"enableIndexers": "Indicizzatori",
"numberOfGrabs": "Grabs",
"numberOfQueries": "Queries",
"numberOfQueries": "Interrogazioni",
"numberOfFailGrabs": "Grabs Falliti",
"numberOfFailQueries": "Queries Fallite"
},
@@ -153,10 +153,10 @@
"lidarr": {
"wanted": "Mancanti",
"queued": "In coda",
"albums": "Albums"
"albums": "Album"
},
"adguard": {
"queries": "Queries",
"queries": "Interrogazioni",
"blocked": "Bloccati",
"filtered": "Filtrati",
"latency": "Latenza"
@@ -304,12 +304,12 @@
"downloads": "Coda",
"videos": "Video",
"channels": "Canali",
"playlists": "Playlists"
"playlists": "Playlist"
},
"truenas": {
"load": "Carico di Sistema",
"uptime": "Uptime",
"alerts": "Alerts",
"uptime": "Tempo di attività",
"alerts": "Avvisi",
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
},
"navidrome": {
@@ -323,26 +323,26 @@
"total": "Totale"
},
"gluetun": {
"public_ip": "Public IP",
"region": "Region",
"country": "Country"
"public_ip": "IP pubblico",
"region": "Località",
"country": "Stato"
},
"hdhomerun": {
"channels": "Channels",
"channels": "Canali",
"hd": "HD"
},
"ping": {
"error": "Error",
"error": "Errore",
"ping": "Ping"
},
"scrutiny": {
"passed": "Passed",
"failed": "Failed",
"unknown": "Unknown"
"passed": "Passati",
"failed": "Falliti",
"unknown": "Sconosciuto"
},
"paperlessngx": {
"inbox": "Inbox",
"total": "Total"
"inbox": "In arrivo",
"total": "Totali"
},
"deluge": {
"download": "Download",
@@ -350,12 +350,6 @@
"leech": "Leech",
"seed": "Seed"
},
"diskstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
@@ -363,21 +357,51 @@
"seed": "Seed"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
"queue": "In coda",
"processed": "Elaborati",
"errored": "Errori",
"saved": "Salvati"
},
"miniflux": {
"unread": "Unread",
"read": "Read"
"unread": "Non letti",
"read": "Letti"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
"wait": "Attendi",
"no_devices": "Nessun dato del dispositivo ricevuto"
},
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedAp": "AP Connessi",
"activeUser": "Dispositivi attivi",
"alerts": "Allarmi",
"connectedGateway": "Gateway connessi",
"connectedSwitches": "Switch connessi"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"mikrotik": {
"cpuLoad": "Carico della CPU",
"memoryUsed": "Memoria Utilizzata",
"uptime": "Tempo di attività",
"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

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

@@ -350,12 +350,6 @@
"leech": "Leech",
"seed": "Seed"
},
"diskstation": {
"upload": "Upload",
"download": "Download",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
@@ -379,5 +373,35 @@
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"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

@@ -350,12 +350,6 @@
"upload": "Upload",
"seed": "Seed"
},
"diskstation": {
"leech": "Leech",
"download": "Download",
"upload": "Upload",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
@@ -379,5 +373,35 @@
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"mikrotik": {
"uptime": "Uptime",
"numberOfLeases": "Leases",
"cpuLoad": "CPU Load",
"memoryUsed": "Memory Used"
},
"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

@@ -350,12 +350,6 @@
"leech": "Leech",
"seed": "Seed"
},
"diskstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
@@ -379,5 +373,35 @@
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"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

@@ -350,12 +350,6 @@
"leech": "Leech",
"seed": "Seed"
},
"diskstation": {
"download": "Pobieranie",
"upload": "Wysyłanie",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Pobieranie",
"upload": "Wysyłanie",
@@ -363,21 +357,51 @@
"seed": "Seed"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
"queue": "Kolejka",
"processed": "Przetworzone",
"errored": "Błędne",
"saved": "Zapisane"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
"read": "Przeczytane",
"unread": "Nieprzeczytane"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
"wait": "Proszę czekać",
"no_devices": "Nie otrzymano danych urządzenia"
},
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedSwitches": "Połączone przełączniki",
"connectedAp": "Połączone punkty dostępowe",
"activeUser": "Aktywne urządzenia",
"alerts": "Alarmy",
"connectedGateway": "Połączone bramy"
},
"downloadstation": {
"download": "Pobieranie",
"upload": "Wysyłanie",
"leech": "Leech",
"seed": "Seed"
},
"mikrotik": {
"cpuLoad": "Obciążenie procesora",
"memoryUsed": "Zuyżyta pamięć",
"uptime": "Czas działania",
"numberOfLeases": "Dzierżawy"
},
"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

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

View File

@@ -350,12 +350,6 @@
"leech": "Leech",
"seed": "Seed"
},
"diskstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
@@ -379,5 +373,35 @@
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"mikrotik": {
"numberOfLeases": "Leases",
"cpuLoad": "CPU Load",
"memoryUsed": "Memory Used",
"uptime": "Uptime"
},
"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

@@ -350,12 +350,6 @@
"leech": "Leech",
"seed": "Seed"
},
"diskstation": {
"download": "Download",
"upload": "Upload",
"seed": "Seed",
"leech": "Leech"
},
"flood": {
"upload": "Upload",
"download": "Download",
@@ -379,5 +373,35 @@
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedSwitches": "Connected switches",
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"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

@@ -350,12 +350,6 @@
"leech": "Leech",
"seed": "Seed"
},
"diskstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Download",
"seed": "Seed",
@@ -379,5 +373,35 @@
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"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

@@ -350,12 +350,6 @@
"upload": "Upload",
"seed": "Seed"
},
"diskstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
@@ -379,5 +373,35 @@
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"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

@@ -350,12 +350,6 @@
"upload": "Upload",
"leech": "Leech"
},
"diskstation": {
"leech": "Leech",
"download": "Download",
"upload": "Upload",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
@@ -379,5 +373,35 @@
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"mikrotik": {
"cpuLoad": "CPU Load",
"uptime": "Uptime",
"numberOfLeases": "Leases",
"memoryUsed": "Memory Used"
},
"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

@@ -350,12 +350,6 @@
"leech": "Leech",
"seed": "Seed"
},
"diskstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
@@ -379,5 +373,35 @@
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"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

@@ -0,0 +1,407 @@
{
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"alerts": "Оповіщення",
"connectedGateway": "Підключені шлюзи",
"connectedSwitches": "Підключені перемикачі",
"connectedAp": "Підключені точки доступу",
"activeUser": "Активні пристрої"
},
"sabnzbd": {
"rate": "Швидкість",
"queue": "Черга",
"timeleft": "Залишилось"
},
"rutorrent": {
"active": "Активний",
"upload": "Відправлення",
"download": "Завантаження"
},
"deluge": {
"download": "Завантаження",
"upload": "Відправлення",
"leech": "Leech",
"seed": "Seed"
},
"readarr": {
"wanted": "Розшукується",
"queued": "У черзі",
"books": "Книжки"
},
"wmo": {
"55-day": "Heavy Drizzle",
"55-night": "Heavy Drizzle",
"56-day": "Light Freezing Drizzle",
"56-night": "Light Freezing Drizzle",
"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",
"53-day": "Drizzle",
"45-day": "Foggy",
"45-night": "Foggy",
"48-day": "Foggy",
"48-night": "Foggy",
"51-day": "Light Drizzle",
"51-night": "Light Drizzle",
"53-night": "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",
"82-day": "Heavy Showers",
"82-night": "Heavy Showers",
"81-night": "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"
},
"pyload": {
"speed": "Speed",
"active": "Active",
"queue": "Queue",
"total": "Total"
},
"gluetun": {
"country": "Country",
"public_ip": "Public IP",
"region": "Region"
},
"hdhomerun": {
"channels": "Channels",
"hd": "HD"
},
"widget": {
"missing_type": "Відсутній тип віджета: {{type}}",
"api_error": "Помилка API",
"information": "Інформація",
"status": "Стан",
"url": "URL",
"raw_error": "Помилка Raw",
"response_data": "Дані відповіді"
},
"weather": {
"current": "Поточне розташування",
"allow": "Натисніть, щоб дозволити",
"updating": "Оновлення",
"wait": "Будь ласка, зачекайте"
},
"search": {
"placeholder": "Пошук…"
},
"resources": {
"cpu": "CPU",
"total": "Всього",
"free": "Вільно",
"used": "Використано",
"load": "Навантаження"
},
"unifi": {
"users": "Користувачі",
"uptime": "Час роботи системи",
"days": "Днів",
"wan": "WAN",
"lan": "LAN",
"wlan": "WLAN",
"devices": "Пристрої",
"lan_devices": "LAN пристрої",
"wlan_devices": "WLAN пристрої",
"lan_users": "LAN користувачі",
"wlan_users": "WLAN користувачі",
"up": "Відправка",
"down": "Завантаження",
"wait": "Будь ласка, зачекайте"
},
"docker": {
"rx": "RX",
"tx": "TX",
"mem": "Пам'ять",
"cpu": "CPU",
"offline": "Офлайн",
"error": "Помилка",
"unknown": "Невідомий"
},
"ping": {
"error": "Помилка",
"ping": "Пінг"
},
"emby": {
"playing": "Відтворення",
"transcoding": "Перекодування",
"bitrate": "Бітрейт",
"no_active": "Немає активних потоків"
},
"flood": {
"download": "Завантаження",
"upload": "Відправлення",
"leech": "Leech",
"seed": "Seed"
},
"changedetectionio": {
"totalObserved": "Всього спостережень",
"diffsDetected": "Виявлено відмінності"
},
"tautulli": {
"playing": "Відтворення",
"transcoding": "Перекодування",
"bitrate": "Бітрейт",
"no_active": "Немає активних потоків"
},
"nzbget": {
"rate": "Швидкість",
"downloaded": "Завантажено",
"remaining": "Залишилося"
},
"plex": {
"streams": "Активні потоки",
"movies": "Фільми",
"tv": "TБ шоу"
},
"transmission": {
"download": "Завантаження",
"upload": "Відправлення",
"leech": "Leech",
"seed": "Seed"
},
"qbittorrent": {
"download": "Завантаження",
"upload": "Відправлення",
"leech": "Leech",
"seed": "Seed"
},
"downloadstation": {
"download": "Завантаження",
"upload": "Відправлення",
"leech": "Leech",
"seed": "Seed"
},
"sonarr": {
"wanted": "Розшукується",
"queued": "У черзі",
"series": "Серії"
},
"radarr": {
"wanted": "Розшукується",
"missing": "Відсутній",
"queued": "У черзі",
"movies": "Фільми"
},
"lidarr": {
"wanted": "Розшукується",
"queued": "У черзі",
"albums": "Альбоми"
},
"traefik": {
"middleware": "Middleware",
"routers": "Роутери",
"services": "Сервіси"
},
"navidrome": {
"nothing_streaming": "No Active Streams",
"please_wait": "Please Wait"
},
"bazarr": {
"missingEpisodes": "Відсутні епізоди",
"missingMovies": "Відсутні фільми"
},
"ombi": {
"pending": "В очікуванні",
"approved": "Затверджено",
"available": "Доступно"
},
"jellyseerr": {
"pending": "В очікуванні",
"approved": "Затверджено",
"available": "Доступно"
},
"overseerr": {
"pending": "В очікуванні",
"processing": "Обробка",
"approved": "Затверджено",
"available": "Доступно"
},
"pihole": {
"queries": "Запити",
"blocked": "Заблоковано",
"gravity": "Гравітація"
},
"adguard": {
"queries": "Запити",
"blocked": "Заблоковано",
"filtered": "Відфільтровано",
"latency": "Затримка"
},
"speedtest": {
"upload": "Відправлення",
"download": "Завантаження",
"ping": "Пінг"
},
"portainer": {
"running": "Запущено",
"stopped": "Зупинено",
"total": "Всього"
},
"tdarr": {
"queue": "Черга",
"processed": "Обробка",
"errored": "Помилка",
"saved": "Збережено"
},
"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"
},
"mastodon": {
"domain_count": "Domains",
"user_count": "Users",
"status_count": "Posts"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"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"
},
"authentik": {
"users": "Users",
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)"
},
"proxmox": {
"mem": "MEM",
"cpu": "CPU",
"vms": "VMs",
"lxc": "LXC"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait"
},
"quicklaunch": {
"bookmark": "Bookmark",
"service": "Service"
},
"homebridge": {
"available_update": "System",
"updates": "Updates",
"child_bridges_status": "{{ok}}/{{total}}",
"update_available": "Update Available",
"up_to_date": "Up to Date",
"child_bridges": "Child Bridges"
},
"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;)}}"
},
"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

@@ -350,12 +350,6 @@
"leech": "Leech",
"seed": "Seed"
},
"diskstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
@@ -379,5 +373,35 @@
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"mikrotik": {
"uptime": "Uptime",
"numberOfLeases": "Leases",
"cpuLoad": "CPU Load",
"memoryUsed": "Memory Used"
},
"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

@@ -350,12 +350,6 @@
"leech": "Leech",
"seed": "Seed"
},
"diskstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
@@ -379,5 +373,35 @@
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"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

@@ -350,12 +350,6 @@
"leech": "Leech",
"seed": "Seed"
},
"diskstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"leech": "Leech",
"download": "Download",
@@ -379,5 +373,35 @@
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"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

@@ -350,12 +350,6 @@
"leech": "Leech",
"seed": "Seed"
},
"diskstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
@@ -379,5 +373,35 @@
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"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

@@ -3,8 +3,6 @@ import useSWR from "swr";
import { compareVersions } from "compare-versions";
import { MdNewReleases } from "react-icons/md";
import cachedFetch from "utils/proxy/cached-fetch";
export default function Version() {
const { t, i18n } = useTranslation();
@@ -12,9 +10,7 @@ export default function Version() {
const revision = process.env.NEXT_PUBLIC_REVISION?.length ? process.env.NEXT_PUBLIC_REVISION : "dev";
const version = process.env.NEXT_PUBLIC_VERSION?.length ? process.env.NEXT_PUBLIC_VERSION : "dev";
const cachedFetcher = (resource) => cachedFetch(resource, 5).then((res) => res.json());
const { data: releaseData } = useSWR("https://api.github.com/repos/benphelps/homepage/releases", cachedFetcher);
const { data: releaseData } = useSWR("/api/releases");
// use Intl.DateTimeFormat to format the date
const formatDate = (date) => {
@@ -48,7 +44,7 @@ export default function Version() {
</span>
{version === "main" || version === "dev" || version === "nightly"
? null
: releaseData &&
: releaseData && latestRelease &&
compareVersions(latestRelease.tag_name, version) > 0 && (
<a
href={latestRelease.html_url}

View File

@@ -13,22 +13,23 @@ const textSizes = {
};
export default function DateTime({ options }) {
const { text_size: textSize, format } = options;
const { text_size: textSize, locale, format } = options;
const { i18n } = useTranslation();
const [date, setDate] = useState("");
const dateLocale = locale ?? i18n.language;
useEffect(() => {
const dateFormat = new Intl.DateTimeFormat(i18n.language, { ...format });
const dateFormat = new Intl.DateTimeFormat(dateLocale, { ...format });
const interval = setInterval(() => {
setDate(dateFormat.format(new Date()));
}, 1000);
return () => clearInterval(interval);
}, [date, setDate, i18n.language, format]);
}, [date, setDate, dateLocale, format]);
return (
<div className="flex flex-col justify-center first:ml-0 ml-4">
<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}
</span>
</div>

View File

@@ -38,7 +38,7 @@ export default function Cpu({ expanded }) {
<div className="pr-1">{t("resources.load")}</div>
</div>
)}
<UsageBar percent={100} />
<UsageBar percent={0} />
</div>
</div>
);

View File

@@ -38,7 +38,7 @@ export default function Disk({ options, expanded }) {
<div className="pr-1">{t("resources.total")}</div>
</span>
)}
<UsageBar percent={100} />
<UsageBar percent={0} />
</div>
</div>
);

View File

@@ -38,7 +38,7 @@ export default function Memory({ expanded }) {
<div className="pr-1">{t("resources.total")}</div>
</span>
)}
<UsageBar percent={100} />
<UsageBar percent={0} />
</div>
</div>
);

View File

@@ -0,0 +1,6 @@
import cachedFetch from "utils/proxy/cached-fetch";
export default async function handler(req, res) {
const releasesURL = "https://api.github.com/repos/benphelps/homepage/releases";
return res.send(await cachedFetch(releasesURL, 5));
}

View File

@@ -50,9 +50,12 @@ export async function servicesResponse() {
try {
discoveredServices = cleanServiceGroups(await servicesFromDocker());
if (discoveredServices?.length === 0) {
console.debug("No containers were found with homepage labels.");
}
} catch (e) {
console.error("Failed to discover services, please check docker.yaml for errors or remove example entries.");
if (e) console.error(e);
if (e) console.error(e.toString());
discoveredServices = [];
}
@@ -60,7 +63,7 @@ export async function servicesResponse() {
configuredServices = cleanServiceGroups(await servicesFromConfig());
} catch (e) {
console.error("Failed to load services.yaml, please check for errors");
if (e) console.error(e);
if (e) console.error(e.toString());
configuredServices = [];
}
@@ -68,7 +71,7 @@ export async function servicesResponse() {
initialSettings = await getSettings();
} catch (e) {
console.error("Failed to load settings.yaml, please check for errors");
if (e) console.error(e);
if (e) console.error(e.toString());
initialSettings = {};
}

View File

@@ -44,36 +44,41 @@ export async function servicesFromDocker() {
const serviceServers = await Promise.all(
Object.keys(servers).map(async (serverName) => {
const docker = new Docker(getDockerArguments(serverName).conn);
const containers = await docker.listContainers({
all: true,
});
// bad docker connections can result in a <Buffer ...> object?
// in any case, this ensures the result is the expected array
if (!Array.isArray(containers)) {
return [];
}
const discovered = containers.map((container) => {
let constructedService = null;
Object.keys(container.Labels).forEach((label) => {
if (label.startsWith("homepage.")) {
if (!constructedService) {
constructedService = {
container: container.Names[0].replace(/^\//, ""),
server: serverName,
};
}
shvl.set(constructedService, label.replace("homepage.", ""), container.Labels[label]);
}
try {
const docker = new Docker(getDockerArguments(serverName).conn);
const containers = await docker.listContainers({
all: true,
});
return constructedService;
});
// bad docker connections can result in a <Buffer ...> object?
// in any case, this ensures the result is the expected array
if (!Array.isArray(containers)) {
return [];
}
return { server: serverName, services: discovered.filter((filteredService) => filteredService) };
const discovered = containers.map((container) => {
let constructedService = null;
Object.keys(container.Labels).forEach((label) => {
if (label.startsWith("homepage.")) {
if (!constructedService) {
constructedService = {
container: container.Names[0].replace(/^\//, ""),
server: serverName,
};
}
shvl.set(constructedService, label.replace("homepage.", ""), container.Labels[label]);
}
});
return constructedService;
});
return { server: serverName, services: discovered.filter((filteredService) => filteredService) };
} catch (e) {
// a server failed, but others may succeed
return { server: serverName, services: [] };
}
})
);

View File

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

View File

@@ -8,7 +8,7 @@ const components = {
changedetectionio: dynamic(() => import("./changedetectionio/component")),
coinmarketcap: dynamic(() => import("./coinmarketcap/component")),
deluge: dynamic(() => import("./deluge/component")),
diskstation: dynamic(() => import("./diskstation/component")),
downloadstation: dynamic(() => import("./downloadstation/component")),
docker: dynamic(() => import("./docker/component")),
emby: dynamic(() => import("./emby/component")),
flood: dynamic(() => import("./flood/component")),
@@ -22,11 +22,14 @@ const components = {
lidarr: dynamic(() => import("./lidarr/component")),
mastodon: dynamic(() => import("./mastodon/component")),
miniflux: dynamic(() => import("./miniflux/component")),
mikrotik: dynamic(() => import("./mikrotik/component")),
navidrome: dynamic(() => import("./navidrome/component")),
nextdns: dynamic(() => import("./nextdns/component")),
npm: dynamic(() => import("./npm/component")),
nzbget: dynamic(() => import("./nzbget/component")),
omada: dynamic(() => import("./omada/component")),
ombi: dynamic(() => import("./ombi/component")),
opnsense: dynamic(() => import("./opnsense/component")),
overseerr: dynamic(() => import("./overseerr/component")),
paperlessngx: dynamic(() => import("./paperlessngx/component")),
pihole: dynamic(() => import("./pihole/component")),
@@ -52,6 +55,7 @@ const components = {
truenas: dynamic(() => import("./truenas/component")),
unifi: dynamic(() => import("./unifi/component")),
watchtower: dynamic(() => import("./watchtower/component")),
xteve: dynamic(() => import("./xteve/component")),
};
export default components;

View File

@@ -17,10 +17,10 @@ export default function Component({ service }) {
if (!tasks) {
return (
<Container service={service}>
<Block label="diskstation.leech" />
<Block label="diskstation.download" />
<Block label="diskstation.seed" />
<Block label="diskstation.upload" />
<Block label="downloadstation.leech" />
<Block label="downloadstation.download" />
<Block label="downloadstation.seed" />
<Block label="downloadstation.upload" />
</Container>
);
}
@@ -32,10 +32,10 @@ export default function Component({ service }) {
return (
<Container service={service}>
<Block label="diskstation.leech" value={t("common.number", { value: leech })} />
<Block label="diskstation.download" value={t("common.bitrate", { value: rateDl })} />
<Block label="diskstation.seed" value={t("common.number", { value: completed })} />
<Block label="diskstation.upload" value={t("common.bitrate", { value: rateUl })} />
<Block label="downloadstation.leech" value={t("common.number", { value: leech })} />
<Block label="downloadstation.download" value={t("common.bitrate", { value: rateDl })} />
<Block label="downloadstation.seed" value={t("common.number", { value: completed })} />
<Block label="downloadstation.upload" value={t("common.bitrate", { value: rateUl })} />
</Container>
);
}

View File

@@ -4,11 +4,9 @@ import createLogger from "utils/logger";
import widgets from "widgets/widgets";
import getServiceWidget from "utils/config/service-helpers";
const logger = createLogger("diskstationProxyHandler");
const authApi = "{url}/webapi/auth.cgi?api=SYNO.API.Auth&version=2&method=login&account={username}&passwd={password}&session=DownloadStation&format=cookie"
const logger = createLogger("downloadstationProxyHandler");
async function login(widget) {
const loginUrl = formatApiCall(authApi, widget);
async function login(loginUrl) {
const [status, contentType, data] = await httpProxy(loginUrl);
if (status !== 200) {
return [status, contentType, data];
@@ -34,7 +32,7 @@ async function login(widget) {
return [status, contentType, data];
}
export default async function diskstationProxyHandler(req, res) {
export default async function downloadstationProxyHandler(req, res) {
const { group, service, endpoint } = req.query;
if (!group || !service) {
@@ -56,8 +54,28 @@ export default async function diskstationProxyHandler(req, res) {
const json = JSON.parse(data.toString());
if (json?.success !== true) {
logger.debug("Logging in to DiskStation");
[status, contentType, data] = await login(widget);
logger.debug("Attempting login to DownloadStation");
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) {
return res.status(status).end(data)
}

View File

@@ -1,8 +1,8 @@
import diskstationProxyHandler from "./proxy";
import downloadstationProxyHandler from "./proxy";
const widget = {
api: "{url}/webapi/DownloadStation/task.cgi?api=SYNO.DownloadStation.Task&version=1&method={endpoint}",
proxyHandler: diskstationProxyHandler,
proxyHandler: downloadstationProxyHandler,
mappings: {
"list": {

View File

@@ -0,0 +1,43 @@
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: statsData, error: statsError } = useWidgetAPI(widget, "system");
const { data: leasesData, error: leasesError } = useWidgetAPI(widget, "leases");
if (statsError || leasesError) {
const finalError = statsError ?? leasesError;
return <Container error={ finalError } />;
}
if (!statsData || !leasesData) {
return (
<Container service={service}>
<Block label="mikrotik.uptime" />
<Block label="mikrotik.cpuLoad" />
<Block label="mikrotik.memoryUsed" />
<Block label="mikrotik.numberOfLeases" />
</Container>
);
}
const memoryUsed = 100 - (statsData['free-memory'] / statsData['total-memory'])*100
const numberOfLeases = leasesData.length
return (
<Container service={service}>
<Block label="mikrotik.uptime" value={ statsData.uptime } />
<Block label="mikrotik.cpuLoad" value={t("common.percent", { value: statsData['cpu-load'] })} />
<Block label="mikrotik.memoryUsed" value={t("common.percent", { value: memoryUsed })} />
<Block label="mikrotik.numberOfLeases" value={t("common.number", { value: numberOfLeases })} />
</Container>
);
}

View File

@@ -0,0 +1,24 @@
import genericProxyHandler from "utils/proxy/handlers/generic";
const widget = {
api: "{url}/rest/{endpoint}",
proxyHandler: genericProxyHandler,
mappings: {
system: {
endpoint: "system/resource",
validate: [
"cpu-load",
"free-memory",
"total-memory",
"uptime"
]
},
leases: {
endpoint: "ip/dhcp-server/lease",
}
},
};
export default widget;

View File

@@ -0,0 +1,39 @@
import { useTranslation } from "next-i18next";
import useWidgetAPI from "../../utils/proxy/use-widget-api";
import Container from "../../components/services/widget/container";
import Block from "../../components/services/widget/block";
export default function Component({ service }) {
const { t } = useTranslation();
const { widget } = service;
const { data: omadaData, error: omadaAPIError } = useWidgetAPI(widget, {
refreshInterval: 5000,
});
if (omadaAPIError) {
return <Container error={omadaAPIError} />;
}
if (!omadaData) {
return (
<Container service={service}>
<Block label="omada.connectedAp" />
<Block label="omada.activeUser" />
<Block label="omada.alerts" />
</Container>
);
}
return (
<Container service={service}>
<Block label="omada.connectedAp" value={t( "common.number", { value: omadaData.connectedAp})} />
<Block label="omada.activeUser" value={t( "common.number", { value: omadaData.activeUser })} />
<Block label="omada.alerts" value={t( "common.number", { value: omadaData.alerts })} />
{ omadaData.connectedGateways > 0 && <Block label="omada.connectedGateway" value={t("common.number", { value: omadaData.connectedGateways})} /> }
{ omadaData.connectedSwitches > 0 && <Block label="omada.connectedSwitches" value={t("common.number", { value: omadaData.connectedSwitches})} /> }
</Container>
);
}

252
src/widgets/omada/proxy.js Normal file
View File

@@ -0,0 +1,252 @@
import { httpProxy } from "utils/proxy/http";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
const proxyName = "omadaProxyHandler";
const logger = createLogger(proxyName);
async function login(loginUrl, username, password, controllerVersionMajor) {
const params = {
username,
password
}
if (controllerVersionMajor === 3) {
params.method = "login";
params.params = {
name: username,
password
};
}
// eslint-disable-next-line no-unused-vars
const [status, contentType, data] = await httpProxy(loginUrl, {
method: "POST",
body: JSON.stringify(params),
headers: {
"Content-Type": "application/json",
},
});
return [status, JSON.parse(data.toString())];
}
export default async function omadaProxyHandler(req, res) {
const { group, service } = req.query;
if (group && service) {
const widget = await getServiceWidget(group, service);
if (widget) {
const { url } = widget;
const controllerInfoURL = `${url}/api/info`;
let [status, contentType, data] = await httpProxy(controllerInfoURL, {
headers: {
"Content-Type": "application/json",
},
});
if (status !== 200) {
logger.error("Unable to retrieve Omada controller info");
return res.status(status).json({error: {message: `HTTP Error ${status}`, url: controllerInfoURL, data}});
}
let cId;
let controllerVersion;
try {
cId = JSON.parse(data).result.omadacId;
controllerVersion = JSON.parse(data).result.controllerVer;
} catch (e) {
controllerVersion = "3.2.x"
}
const controllerVersionMajor = parseInt(controllerVersion.split('.')[0], 10)
if (![3,4,5].includes(controllerVersionMajor)) {
return res.status(500).json({error: {message: "Error determining controller version", data}});
}
let loginUrl;
switch (controllerVersionMajor) {
case 3:
loginUrl = `${url}/api/user/login?ajax`;
break;
case 4:
loginUrl = `${url}/api/v2/login`;
break;
case 5:
loginUrl = `${url}/${cId}/api/v2/login`;
break;
default:
break;
}
const [loginStatus, loginResponseData] = await login(loginUrl, widget.username, widget.password, controllerVersionMajor);
if (loginStatus !== 200 || loginResponseData.errorCode > 0) {
return res.status(status).json({error: {message: "Error logging in to Oamda controller", url: loginUrl, data: loginResponseData}});
}
const { token } = loginResponseData.result;
let sitesUrl;
let body = {};
let params = { token };
let headers = { "Csrf-Token": token };
let method = "GET";
switch (controllerVersionMajor) {
case 3:
sitesUrl = `${url}/web/v1/controller?ajax=&token=${token}`;
body = {
"method": "getUserSites",
"params": {
"userName": widget.username
}
};
method = "POST";
break;
case 4:
sitesUrl = `${url}/api/v2/sites?token=${token}&currentPage=1&currentPageSize=1000`;
break;
case 5:
sitesUrl = `${url}/${cId}/api/v2/sites?token=${token}&currentPage=1&currentPageSize=1000`;
break;
default:
break;
}
[status, contentType, data] = await httpProxy(sitesUrl, {
method,
params,
body: JSON.stringify(body),
headers,
});
const sitesResponseData = JSON.parse(data);
if (status !== 200 || sitesResponseData.errorCode > 0) {
logger.debug(`HTTTP ${status} getting sites list: ${sitesResponseData.msg}`);
return res.status(status).json({error: {message: "Error getting sites list", url, data: sitesResponseData}});
}
const site = (controllerVersionMajor === 3) ?
sitesResponseData.result.siteList.find(s => s.name === widget.site):
sitesResponseData.result.data.find(s => s.name === widget.site);
if (!site) {
return res.status(status).json({error: {message: `Site ${widget.site} is not found`, url: sitesUrl, data}});
}
let siteResponseData;
let connectedAp;
let activeUser;
let connectedSwitches;
let connectedGateways;
let alerts;
if (controllerVersionMajor === 3) {
// Omada v3 controller requires switching site
const switchUrl = `${url}/web/v1/controller?ajax=&token=${token}`;
method = "POST";
body = {
method: "switchSite",
params: {
siteName: site.siteName,
userName: widget.username
}
};
headers = { "Content-Type": "application/json" };
params = { token };
[status, contentType, data] = await httpProxy(switchUrl, {
method,
params,
body: JSON.stringify(body),
headers,
});
const switchResponseData = JSON.parse(data);
if (status !== 200 || switchResponseData.errorCode > 0) {
logger.error(`HTTP ${status} getting sites list: ${data}`);
return res.status(status).json({error: {message: "Error switching site", url: switchUrl, data}});
}
const statsUrl = `${url}/web/v1/controller?getGlobalStat=&token=${token}`;
[status, contentType, data] = await httpProxy(statsUrl, {
method,
params,
body: JSON.stringify({
"method": "getGlobalStat",
}),
headers
});
siteResponseData = JSON.parse(data);
if (status !== 200 || siteResponseData.errorCode > 0) {
return res.status(status).json({error: {message: "Error getting stats", url: statsUrl, data}});
}
connectedAp = siteResponseData.result.connectedAp;
activeUser = siteResponseData.result.activeUser;
alerts = siteResponseData.result.alerts;
} else if (controllerVersionMajor === 4 || controllerVersionMajor === 5) {
const siteName = (controllerVersionMajor === 5) ? site.id : site.key;
const siteStatsUrl = (controllerVersionMajor === 4) ?
`${url}/api/v2/sites/${siteName}/dashboard/overviewDiagram?token=${token}&currentPage=1&currentPageSize=1000` :
`${url}/${cId}/api/v2/sites/${siteName}/dashboard/overviewDiagram?token=${token}&currentPage=1&currentPageSize=1000`;
[status, contentType, data] = await httpProxy(siteStatsUrl, {
headers: {
"Csrf-Token": token,
},
});
siteResponseData = JSON.parse(data);
if (status !== 200 || siteResponseData.errorCode > 0) {
logger.debug(`HTTP ${status} getting stats for site ${widget.site} with message ${siteResponseData.msg}`);
return res.status(500).send(data);
}
const alertUrl = (controllerVersionMajor === 4) ?
`${url}/api/v2/sites/${siteName}/alerts/num?token=${token}&currentPage=1&currentPageSize=1000` :
`${url}/${cId}/api/v2/sites/${siteName}/alerts/num?token=${token}&currentPage=1&currentPageSize=1000`;
// eslint-disable-next-line no-unused-vars
[status, contentType, data] = await httpProxy(alertUrl, {
headers: {
"Csrf-Token": token,
},
});
const alertResponseData = JSON.parse(data);
activeUser = siteResponseData.result.totalClientNum;
connectedAp = siteResponseData.result.connectedApNum;
connectedGateways = siteResponseData.result.connectedGatewayNum;
connectedSwitches = siteResponseData.result.connectedSwitchNum;
alerts = alertResponseData.result.alertNum;
}
return res.send(JSON.stringify({
connectedAp,
activeUser,
alerts,
connectedGateways,
connectedSwitches,
}));
}
}
return res.status(400).json({ error: "Invalid proxy service type" });
}

View File

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

View File

@@ -0,0 +1,48 @@
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: activityData, error: activityError } = useWidgetAPI(widget, "activity");
const { data: interfaceData, error: interfaceError } = useWidgetAPI(widget, "interface");
if (activityError || interfaceError) {
const finalError = activityError ?? interfaceError;
return <Container error={ finalError } />;
}
if (!activityData || !interfaceData) {
return (
<Container service={service}>
<Block label="opnsense.cpu" />
<Block label="opnsense.memory" />
<Block label="opnsense.wanUpload" />
<Block label="opnsense.wanDownload" />
</Container>
);
}
const cpuIdle = activityData.headers[2].match(/ ([0-9.]+)% idle/)[1];
const cpu = 100 - parseFloat(cpuIdle);
const memory = activityData.headers[3].match(/Mem: (.+) Active,/)[1];
const wanUpload = interfaceData.interfaces.wan['bytes transmitted'];
const wanDownload = interfaceData.interfaces.wan['bytes received'];
return (
<Container service={service}>
<Block label="opnsense.cpu" value={t("common.percent", { value: cpu.toFixed(2) })} />
<Block label="opnsense.memory" value={memory} />
<Block label="opnsense.wanUpload" value={t("common.bytes", { value: wanUpload })} />
<Block label="opnsense.wanDownload" value={t("common.bytes", { value: wanDownload })} />
</Container>
);
}

View File

@@ -0,0 +1,24 @@
import genericProxyHandler from "utils/proxy/handlers/generic";
const widget = {
api: "{url}/api/{endpoint}",
proxyHandler: genericProxyHandler,
mappings: {
activity: {
endpoint: "diagnostics/activity/getActivity",
validate: [
"headers"
]
},
interface: {
endpoint: "diagnostics/traffic/interface",
validate: [
"interfaces"
]
}
},
};
export default widget;

View File

@@ -1,8 +1,11 @@
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: statsData, error: statsError } = useWidgetAPI(widget, "request/count");
@@ -24,10 +27,10 @@ export default function Component({ service }) {
return (
<Container service={service}>
<Block label="overseerr.pending" value={statsData.pending} />
<Block label="overseerr.processing" value={statsData.processing} />
<Block label="overseerr.approved" value={statsData.approved} />
<Block label="overseerr.available" value={statsData.available} />
<Block label="overseerr.pending" value={t("common.number", { value: statsData.pending })} />
<Block label="overseerr.processing" value={t("common.number", { value: statsData.processing })} />
<Block label="overseerr.approved" value={t("common.number", { value: statsData.approved })} />
<Block label="overseerr.available" value={t("common.number", { value: statsData.available })} />
</Container>
);
}

View File

@@ -9,7 +9,7 @@ export default function Component({ service }) {
const { widget } = service;
const { data: piholeData, error: piholeError } = useWidgetAPI(widget, "api.php");
const { data: piholeData, error: piholeError } = useWidgetAPI(widget, "summaryRaw");
if (piholeError) {
return <Container error={piholeError} />;
@@ -27,9 +27,9 @@ export default function Component({ service }) {
return (
<Container service={service}>
<Block label="pihole.queries" value={t("common.number", { value: piholeData.dns_queries_today })} />
<Block label="pihole.blocked" value={t("common.number", { value: piholeData.ads_blocked_today })} />
<Block label="pihole.gravity" value={t("common.number", { value: piholeData.domains_being_blocked })} />
<Block label="pihole.queries" value={t("common.number", { value: parseInt(piholeData.dns_queries_today, 10) })} />
<Block label="pihole.blocked" value={t("common.number", { value: parseInt(piholeData.ads_blocked_today, 10) })} />
<Block label="pihole.gravity" value={t("common.number", { value: parseInt(piholeData.domains_being_blocked, 10) })} />
</Container>
);
}

View File

@@ -1,12 +1,12 @@
import genericProxyHandler from "utils/proxy/handlers/generic";
const widget = {
api: "{url}/admin/{endpoint}",
api: "{url}/admin/api.php?{endpoint}&auth={key}",
proxyHandler: genericProxyHandler,
mappings: {
"api.php": {
endpoint: "api.php",
"summaryRaw": {
endpoint: "summaryRaw",
validate: [
"dns_queries_today",
"ads_blocked_today",

View File

@@ -1,8 +1,11 @@
import { useTranslation } from "react-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: indexersData, error: indexersError } = useWidgetAPI(widget, "indexer");
@@ -40,11 +43,11 @@ export default function Component({ service }) {
return (
<Container service={service}>
<Block label="prowlarr.enableIndexers" value={indexers.length} />
<Block label="prowlarr.numberOfGrabs" value={numberOfGrabs} />
<Block label="prowlarr.numberOfQueries" value={numberOfQueries} />
<Block label="prowlarr.numberOfFailGrabs" value={numberOfFailedGrabs} />
<Block label="prowlarr.numberOfFailQueries" value={numberOfFailedQueries} />
<Block label="prowlarr.enableIndexers" value={t("common.number", { value: indexers.length })} />
<Block label="prowlarr.numberOfGrabs" value={t("common.number", { value: numberOfGrabs })} />
<Block label="prowlarr.numberOfQueries" value={t("common.number", { value: numberOfQueries })} />
<Block label="prowlarr.numberOfFailGrabs" value={t("common.number", { value: numberOfFailedGrabs })} />
<Block label="prowlarr.numberOfFailQueries" value={t("common.number", { value: numberOfFailedQueries })} />
</Container>
);
}

View File

@@ -84,9 +84,9 @@ export default async function pyloadProxyHandler(req, res) {
if (data?.error || status !== 200) {
try {
return res.status(status).send({error: {message: "HTTP error communicating with Plex API", data: Buffer.from(data).toString()}});
return res.status(status).send({error: {message: "HTTP error communicating with Pyload API", data: Buffer.from(data).toString()}});
} catch (e) {
return res.status(status).send({error: {message: "HTTP error communicating with Plex API", data}});
return res.status(status).send({error: {message: "HTTP error communicating with Pyload API", data}});
}
}
@@ -95,7 +95,7 @@ export default async function pyloadProxyHandler(req, res) {
}
} catch (e) {
logger.error(e);
return res.status(500).send({error: {message: `Error communicating with Plex API: ${e.toString()}`}});
return res.status(500).send({error: {message: `Error communicating with Pyload API: ${e.toString()}`}});
}
return res.status(400).json({ error: 'Invalid proxy service type' });

View File

@@ -1,8 +1,11 @@
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: moviesData, error: moviesError } = useWidgetAPI(widget, "movie");
@@ -26,10 +29,10 @@ export default function Component({ service }) {
return (
<Container service={service}>
<Block label="radarr.wanted" value={moviesData.wanted} />
<Block label="radarr.missing" value={moviesData.missing} />
<Block label="radarr.queued" value={queuedData.totalCount} />
<Block label="radarr.movies" value={moviesData.have} />
<Block label="radarr.wanted" value={t("common.number", { value: moviesData.wanted })} />
<Block label="radarr.missing" value={t("common.number", { value: moviesData.missing })} />
<Block label="radarr.queued" value={t("common.number", { value: queuedData.totalCount })} />
<Block label="radarr.movies" value={t("common.number", { value: moviesData.have })} />
</Container>
);
}

View File

@@ -1,8 +1,11 @@
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: wantedData, error: wantedError } = useWidgetAPI(widget, "wanted/missing");
@@ -26,9 +29,9 @@ export default function Component({ service }) {
return (
<Container service={service}>
<Block label="sonarr.wanted" value={wantedData.totalRecords} />
<Block label="sonarr.queued" value={queuedData.totalRecords} />
<Block label="sonarr.series" value={seriesData.total} />
<Block label="sonarr.wanted" value={t("common.number", { value: wantedData.totalRecords })} />
<Block label="sonarr.queued" value={t("common.number", { value: queuedData.totalRecords })} />
<Block label="sonarr.series" value={t("common.number", { value: seriesData.total })} />
</Container>
);
}

View File

@@ -1,9 +1,31 @@
import { jsonArrayFilter } from "utils/proxy/api-helpers";
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
import genericProxyHandler from "utils/proxy/handlers/generic";
import getServiceWidget from "utils/config/service-helpers";
const widget = {
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: {
alerts: {

View File

@@ -5,7 +5,7 @@ import bazarr from "./bazarr/widget";
import changedetectionio from "./changedetectionio/widget";
import coinmarketcap from "./coinmarketcap/widget";
import deluge from "./deluge/widget";
import diskstation from "./diskstation/widget";
import downloadstation from "./downloadstation/widget";
import emby from "./emby/widget";
import flood from "./flood/widget";
import gluetun from "./gluetun/widget";
@@ -17,11 +17,14 @@ import jellyseerr from "./jellyseerr/widget";
import lidarr from "./lidarr/widget";
import mastodon from "./mastodon/widget";
import miniflux from "./miniflux/widget";
import mikrotik from "./mikrotik/widget";
import navidrome from "./navidrome/widget";
import nextdns from "./nextdns/widget";
import npm from "./npm/widget";
import nzbget from "./nzbget/widget";
import omada from "./omada/widget";
import ombi from "./ombi/widget";
import opnsense from "./opnsense/widget";
import overseerr from "./overseerr/widget";
import paperlessngx from "./paperlessngx/widget";
import pihole from "./pihole/widget";
@@ -47,6 +50,7 @@ import tubearchivist from "./tubearchivist/widget";
import truenas from "./truenas/widget";
import unifi from "./unifi/widget";
import watchtower from './watchtower/widget'
import xteve from './xteve/widget'
const widgets = {
adguard,
@@ -56,7 +60,8 @@ const widgets = {
changedetectionio,
coinmarketcap,
deluge,
diskstation,
diskstation: downloadstation,
downloadstation,
emby,
flood,
gluetun,
@@ -69,11 +74,14 @@ const widgets = {
lidarr,
mastodon,
miniflux,
mikrotik,
navidrome,
nextdns,
npm,
nzbget,
omada,
ombi,
opnsense,
overseerr,
paperlessngx,
pihole,
@@ -100,6 +108,7 @@ const widgets = {
unifi,
unifi_console: unifi,
watchtower,
xteve,
};
export default widgets;

View File

@@ -0,0 +1,35 @@
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: xteveData, error: xteveError } = useWidgetAPI(widget, "api");
if (xteveError) {
return <Container error={xteveError} />;
}
if (!xteveData) {
return (
<Container service={service}>
<Block label="xteve.streams_all" />
<Block label="xteve.streams_active " />
<Block label="xteve.streams_xepg" />
</Container>
);
}
return (
<Container service={service}>
<Block label="xteve.streams_all" value={t("common.number", { value: xteveData["streams.all"] ?? 0 })} />
<Block label="xteve.streams_active" value={t("common.number", { value: xteveData["streams.active"] ?? 0 })} />
<Block label="xteve.streams_xepg" value={t("common.number", { value: xteveData["streams.xepg"] ?? 0 })} />
</Container>
);
}

View File

@@ -0,0 +1,63 @@
import { formatApiCall } from "utils/proxy/api-helpers";
import { httpProxy } from "utils/proxy/http";
import createLogger from "utils/logger";
import widgets from "widgets/widgets";
import getServiceWidget from "utils/config/service-helpers";
const logger = createLogger("xteveProxyHandler");
export default async function xteveProxyHandler(req, res) {
const { group, service, endpoint } = req.query;
if (!group || !service) {
return res.status(400).json({ error: "Invalid proxy service type" });
}
const widget = await getServiceWidget(group, service);
const api = widgets?.[widget.type]?.api;
if (!api) {
return res.status(403).json({ error: "Service does not support API calls" });
}
const url = formatApiCall(api, { endpoint, ...widget });
const method = "POST";
const payload = { cmd: "status" };
if (widget.username && widget.password) {
// eslint-disable-next-line no-unused-vars
const [status, contentType, data] = await httpProxy(url, {
method,
body: JSON.stringify({
cmd: "login",
username: widget.username,
password: widget.password,
})
});
if (status !== 200) {
logger.debug("Error logging into xteve", status, url);
return res.status(status).json({error: {message: `HTTP Error ${status} logging into xteve`, url, data}});
}
const json = JSON.parse(data.toString());
if (json?.status !== true) {
return res.status(401).json({error: {message: "Authentication failed", url, data}});
}
payload.token = json.token;
}
const [status, contentType, data] = await httpProxy(url, {
method,
body: JSON.stringify(payload)
});
if (status !== 200) {
logger.debug("Error %d calling xteve endpoint %s", status, url);
return res.status(status).json({error: {message: `HTTP Error ${status}`, url, data}});
}
if (contentType) res.setHeader("Content-Type", contentType);
return res.status(status).send(data);
}

View File

@@ -0,0 +1,14 @@
import xteveProxyHandler from "./proxy";
const widget = {
api: "{url}/{endpoint}",
proxyHandler: xteveProxyHandler,
mappings: {
"api": {
endpoint: "api/",
},
},
};
export default widget;