Compare commits

...
536 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 ShamoonandBenoit SERRA 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 SERRAandshamoon 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
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 ShamoonandBenoit SERRA 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
Anonymous d16fd0cd05 Translated using Weblate (Esperanto)
Currently translated at 37.8% (103 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2022-12-17 07:59:16 +01:00
Anonymous 6dc6ee54ea Translated using Weblate (Hindi)
Currently translated at 3.3% (9 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2022-12-17 07:59:16 +01:00
Anonymous 5b515822d3 Translated using Weblate (Malay)
Currently translated at 93.0% (253 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2022-12-17 07:59:15 +01:00
Anonymous f81d754044 Translated using Weblate (Danish)
Currently translated at 72.7% (198 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2022-12-17 07:59:15 +01:00
Anonymous 483c5cf87a Translated using Weblate (Czech)
Currently translated at 82.7% (225 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2022-12-17 07:59:15 +01:00
Anonymous 6b634b4ef5 Translated using Weblate (Arabic)
Currently translated at 16.1% (44 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2022-12-17 07:59:15 +01:00
Anonymous f58ae97c6e Translated using Weblate (Serbian)
Currently translated at 3.3% (9 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2022-12-17 07:59:14 +01:00
Anonymous 5deb58f092 Translated using Weblate (Turkish)
Currently translated at 84.9% (231 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2022-12-17 07:59:14 +01:00
Anonymous 55cd4c5ada Translated using Weblate (Bulgarian)
Currently translated at 16.9% (46 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2022-12-17 07:59:14 +01:00
Anonymous 27a7adc282 Translated using Weblate (Telugu)
Currently translated at 79.7% (217 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2022-12-17 07:59:14 +01:00
Anonymous 6b72b60b5e Translated using Weblate (Finnish)
Currently translated at 45.2% (123 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2022-12-17 07:59:13 +01:00
Anonymous c2d6b9738f Translated using Weblate (Yue)
Currently translated at 43.3% (118 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2022-12-17 07:59:13 +01:00
Anonymous 44dbff308a Translated using Weblate (Portuguese (Brazil))
Currently translated at 43.0% (117 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2022-12-17 07:59:13 +01:00
Anonymous c224a26bc8 Translated using Weblate (Romanian)
Currently translated at 50.3% (137 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2022-12-17 07:59:13 +01:00
Anonymous a1e9afae85 Translated using Weblate (Hebrew)
Currently translated at 37.1% (101 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2022-12-17 07:59:13 +01:00
Anonymous bca6340ded Translated using Weblate (Hungarian)
Currently translated at 39.7% (108 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2022-12-17 07:59:12 +01:00
Anonymous f1e7df394e Translated using Weblate (Croatian)
Currently translated at 94.1% (256 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2022-12-17 07:59:12 +01:00
Anonymous a2bbcce69e Translated using Weblate (Swedish)
Currently translated at 47.7% (130 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2022-12-17 07:59:12 +01:00
Anonymous de8747c9f5 Translated using Weblate (Polish)
Currently translated at 94.8% (258 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2022-12-17 07:59:12 +01:00
Anonymous 0b8ce67e10 Translated using Weblate (Catalan)
Currently translated at 96.3% (262 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-12-17 07:59:11 +01:00
Anonymous 0de4d00d83 Translated using Weblate (Chinese (Traditional))
Currently translated at 3.3% (9 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2022-12-17 07:59:11 +01:00
Anonymous 0b47e083ea Translated using Weblate (Dutch)
Currently translated at 23.1% (63 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2022-12-17 07:59:11 +01:00
Anonymous 2e0b55bd37 Translated using Weblate (Vietnamese)
Currently translated at 16.1% (44 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2022-12-17 07:59:11 +01:00
Anonymous ee5bb5364b Translated using Weblate (Norwegian Bokmål)
Currently translated at 29.0% (79 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2022-12-17 07:59:11 +01:00
Anonymous bb3fd88a90 Translated using Weblate (Italian)
Currently translated at 84.1% (229 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2022-12-17 07:59:10 +01:00
Anonymous ac5dfe5a9c Translated using Weblate (Chinese (Simplified))
Currently translated at 61.7% (168 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-12-17 07:59:10 +01:00
Anonymous 0bc65e4345 Translated using Weblate (Russian)
Currently translated at 17.6% (48 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2022-12-17 07:59:10 +01:00
Anonymous 92b80d1e46 Translated using Weblate (Portuguese)
Currently translated at 60.2% (164 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2022-12-17 07:59:10 +01:00
Anonymous dab627e248 Translated using Weblate (French)
Currently translated at 97.7% (266 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-12-17 07:59:09 +01:00
Anonymous 70a77718db Translated using Weblate (Spanish)
Currently translated at 96.3% (262 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-12-17 07:59:09 +01:00
Anonymous 9a81c9a418 Translated using Weblate (German)
Currently translated at 83.8% (228 of 272 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2022-12-17 07:59:09 +01:00
shamoon 6ef05b8118 Merge pull request #648 from benphelps/fix-619
Fix rate unit displays
2022-12-16 22:58:30 -08:00
Anonymous 6fd187c54c Translated using Weblate (Esperanto)
Currently translated at 38.1% (103 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2022-12-17 07:47:44 +01:00
Anonymous abf65caba7 Translated using Weblate (Hindi)
Currently translated at 3.3% (9 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2022-12-17 07:47:43 +01:00
Anonymous 5470c68cb4 Translated using Weblate (Malay)
Currently translated at 93.7% (253 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2022-12-17 07:47:43 +01:00
Anonymous f0bca41c5e Translated using Weblate (Danish)
Currently translated at 73.3% (198 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2022-12-17 07:47:43 +01:00
Anonymous c985c4788b Translated using Weblate (Czech)
Currently translated at 83.3% (225 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2022-12-17 07:47:43 +01:00
Anonymous 2df5e8d791 Translated using Weblate (Arabic)
Currently translated at 16.2% (44 of 270 strings)

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

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

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

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2022-12-17 07:47:42 +01:00
Anonymous 216a67fc12 Translated using Weblate (Telugu)
Currently translated at 80.3% (217 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2022-12-17 07:47:41 +01:00
Anonymous 85d9b2fc8a Translated using Weblate (Finnish)
Currently translated at 45.5% (123 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2022-12-17 07:47:41 +01:00
Anonymous 65454014ef Translated using Weblate (Yue)
Currently translated at 43.7% (118 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2022-12-17 07:47:41 +01:00
Anonymous 4e23a931cd Translated using Weblate (Portuguese (Brazil))
Currently translated at 43.3% (117 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2022-12-17 07:47:41 +01:00
Anonymous 3446c9b2a1 Translated using Weblate (Romanian)
Currently translated at 50.7% (137 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2022-12-17 07:47:41 +01:00
Anonymous ccda10fca4 Translated using Weblate (Hebrew)
Currently translated at 37.4% (101 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2022-12-17 07:47:40 +01:00
Anonymous a14dfb9360 Translated using Weblate (Hungarian)
Currently translated at 40.0% (108 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2022-12-17 07:47:40 +01:00
Anonymous f3e52f0bdf Translated using Weblate (Croatian)
Currently translated at 94.8% (256 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2022-12-17 07:47:40 +01:00
Anonymous f7a666e8c5 Translated using Weblate (Swedish)
Currently translated at 48.1% (130 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2022-12-17 07:47:40 +01:00
Anonymous 1feaae7291 Translated using Weblate (Polish)
Currently translated at 95.5% (258 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2022-12-17 07:47:40 +01:00
Anonymous 112cbaf813 Translated using Weblate (Catalan)
Currently translated at 97.0% (262 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-12-17 07:47:39 +01:00
Anonymous 5263a66fbe Translated using Weblate (Chinese (Traditional))
Currently translated at 3.3% (9 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2022-12-17 07:47:39 +01:00
Anonymous d1971986ea Translated using Weblate (Dutch)
Currently translated at 23.3% (63 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2022-12-17 07:47:39 +01:00
Anonymous 988f3dfdd5 Translated using Weblate (Vietnamese)
Currently translated at 16.2% (44 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2022-12-17 07:47:39 +01:00
Anonymous 95794dc837 Translated using Weblate (Norwegian Bokmål)
Currently translated at 29.2% (79 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2022-12-17 07:47:39 +01:00
Anonymous 8bb716e1c5 Translated using Weblate (Italian)
Currently translated at 84.8% (229 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2022-12-17 07:47:38 +01:00
Anonymous ec3faa31a5 Translated using Weblate (Chinese (Simplified))
Currently translated at 62.2% (168 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-12-17 07:47:38 +01:00
Anonymous 09d7b8f5ed Translated using Weblate (Russian)
Currently translated at 17.7% (48 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2022-12-17 07:47:38 +01:00
Anonymous 60fcbbfeaf Translated using Weblate (Portuguese)
Currently translated at 60.7% (164 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2022-12-17 07:47:38 +01:00
Anonymous 6d1c9263b7 Translated using Weblate (French)
Currently translated at 98.5% (266 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-12-17 07:47:37 +01:00
Anonymous 5bd1dd71f6 Translated using Weblate (Spanish)
Currently translated at 97.0% (262 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-12-17 07:47:37 +01:00
Anonymous 4fcc8f004d Translated using Weblate (German)
Currently translated at 84.4% (228 of 270 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2022-12-17 07:47:37 +01:00
shamoon a11f22cd49 Merge pull request #688 from luiseduardobrito/feat-nextdns
Adds widget for NextDNS
2022-12-16 22:47:20 -08:00
Anonymous d79bf7ef80 Translated using Weblate (Esperanto)
Currently translated at 38.4% (103 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2022-12-17 07:41:49 +01:00
Anonymous a88a803d38 Translated using Weblate (Hindi)
Currently translated at 3.3% (9 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2022-12-17 07:41:48 +01:00
Anonymous 23b59dc542 Translated using Weblate (Malay)
Currently translated at 94.4% (253 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2022-12-17 07:41:48 +01:00
Anonymous 751167fb17 Translated using Weblate (Danish)
Currently translated at 73.8% (198 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2022-12-17 07:41:48 +01:00
Anonymous d1336c5b95 Translated using Weblate (Czech)
Currently translated at 83.9% (225 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2022-12-17 07:41:48 +01:00
Anonymous 18765f7b4d Translated using Weblate (Arabic)
Currently translated at 16.4% (44 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2022-12-17 07:41:48 +01:00
Anonymous 04f2d2a0e4 Translated using Weblate (Serbian)
Currently translated at 3.3% (9 of 268 strings)

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

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2022-12-17 07:41:47 +01:00
Anonymous 158bb0ae41 Translated using Weblate (Bulgarian)
Currently translated at 17.1% (46 of 268 strings)

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

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2022-12-17 07:41:46 +01:00
Anonymous 3e177ec39d Translated using Weblate (Finnish)
Currently translated at 45.8% (123 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2022-12-17 07:41:46 +01:00
Anonymous b7d9124228 Translated using Weblate (Yue)
Currently translated at 44.0% (118 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2022-12-17 07:41:46 +01:00
Anonymous 67ed9b294b Translated using Weblate (Portuguese (Brazil))
Currently translated at 43.6% (117 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2022-12-17 07:41:46 +01:00
Anonymous 931947bffc Translated using Weblate (Romanian)
Currently translated at 51.1% (137 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2022-12-17 07:41:46 +01:00
Anonymous de9ca09e70 Translated using Weblate (Hebrew)
Currently translated at 37.6% (101 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2022-12-17 07:41:46 +01:00
Anonymous 7ef294291a Translated using Weblate (Hungarian)
Currently translated at 40.2% (108 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2022-12-17 07:41:45 +01:00
Anonymous e44972ec44 Translated using Weblate (Croatian)
Currently translated at 95.5% (256 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2022-12-17 07:41:45 +01:00
Anonymous b7a45512cf Translated using Weblate (Swedish)
Currently translated at 48.5% (130 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2022-12-17 07:41:45 +01:00
Anonymous 4621724fc6 Translated using Weblate (Polish)
Currently translated at 96.2% (258 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2022-12-17 07:41:45 +01:00
Anonymous fb9c673130 Translated using Weblate (Catalan)
Currently translated at 97.7% (262 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-12-17 07:41:44 +01:00
Anonymous 15b08cdd44 Translated using Weblate (Chinese (Traditional))
Currently translated at 3.3% (9 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2022-12-17 07:41:44 +01:00
Anonymous 76db303368 Translated using Weblate (Dutch)
Currently translated at 23.5% (63 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2022-12-17 07:41:44 +01:00
Anonymous d5d0313b21 Translated using Weblate (Vietnamese)
Currently translated at 16.4% (44 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2022-12-17 07:41:44 +01:00
Anonymous f419b3753a Translated using Weblate (Norwegian Bokmål)
Currently translated at 29.4% (79 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2022-12-17 07:41:44 +01:00
Anonymous 705258d30d Translated using Weblate (Italian)
Currently translated at 85.4% (229 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2022-12-17 07:41:43 +01:00
Anonymous 413b7a7203 Translated using Weblate (Chinese (Simplified))
Currently translated at 62.6% (168 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-12-17 07:41:43 +01:00
Anonymous d3a8d27276 Translated using Weblate (Russian)
Currently translated at 17.9% (48 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2022-12-17 07:41:43 +01:00
Anonymous 725c1b7da4 Translated using Weblate (Portuguese)
Currently translated at 61.1% (164 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2022-12-17 07:41:43 +01:00
Anonymous 45767d4b27 Translated using Weblate (French)
Currently translated at 99.2% (266 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-12-17 07:41:42 +01:00
Anonymous 0e4d1da1cc Translated using Weblate (Spanish)
Currently translated at 97.7% (262 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-12-17 07:41:42 +01:00
Anonymous 55f9d77054 Translated using Weblate (German)
Currently translated at 85.0% (228 of 268 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2022-12-17 07:41:42 +01:00
Nonoss117 757ef40afc Translated using Weblate (French)
Currently translated at 100.0% (266 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-12-17 07:41:20 +01:00
shamoon ee95c23c3d Merge pull request #631 from henry40408/feature/miniflux
Miniflux widget
2022-12-16 22:41:17 -08:00
Michael Shamoon 93445a2831 Use credentialed proxy for miniflux 2022-12-16 22:33:24 -08:00
Heng-Yi Wu 3bef3dd6c6 feat: miniflux widget 2022-12-16 22:33:23 -08:00
Michael Shamoon db46931246 Allow map in credentialedproxy 2022-12-16 22:32:28 -08:00
shamoon 7ca7a9cc58 Merge pull request #660 from vinaydawani/features/basic-docker-swarm
Support for docker swarm services
2022-12-16 21:49:37 -08:00
Michael Shamoon f7d5582f57 Handle nextdns no devices setup, data pending 2022-12-16 14:29:13 -08:00
Anonymous 82486d1e13 Translated using Weblate (Esperanto)
Currently translated at 38.7% (103 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2022-12-16 22:51:14 +01:00
Anonymous 80cc9fc984 Translated using Weblate (Hindi)
Currently translated at 3.3% (9 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2022-12-16 22:51:14 +01:00
Anonymous 17b21eb029 Translated using Weblate (Malay)
Currently translated at 95.1% (253 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2022-12-16 22:51:14 +01:00
Anonymous 0a2528d476 Translated using Weblate (Danish)
Currently translated at 74.4% (198 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2022-12-16 22:51:13 +01:00
Anonymous db9afd4d7c Translated using Weblate (Czech)
Currently translated at 84.5% (225 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2022-12-16 22:51:13 +01:00
Anonymous 5f116226cf Translated using Weblate (Arabic)
Currently translated at 16.5% (44 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2022-12-16 22:51:13 +01:00
Anonymous 41ce91cf81 Translated using Weblate (Serbian)
Currently translated at 3.3% (9 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2022-12-16 22:51:13 +01:00
Anonymous a6599b1ea0 Translated using Weblate (Turkish)
Currently translated at 86.8% (231 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2022-12-16 22:51:12 +01:00
Anonymous aed29762fd Translated using Weblate (Bulgarian)
Currently translated at 17.2% (46 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2022-12-16 22:51:12 +01:00
Anonymous 411ca43729 Translated using Weblate (Telugu)
Currently translated at 81.5% (217 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2022-12-16 22:51:12 +01:00
Anonymous 5401896829 Translated using Weblate (Finnish)
Currently translated at 46.2% (123 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2022-12-16 22:51:12 +01:00
Anonymous 92a5e20c7e Translated using Weblate (Yue)
Currently translated at 44.3% (118 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2022-12-16 22:51:11 +01:00
Anonymous c6677d55da Translated using Weblate (Portuguese (Brazil))
Currently translated at 43.9% (117 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2022-12-16 22:51:11 +01:00
Anonymous 1168b301dd Translated using Weblate (Romanian)
Currently translated at 51.5% (137 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2022-12-16 22:51:11 +01:00
Anonymous e1d835259d Translated using Weblate (Hebrew)
Currently translated at 37.9% (101 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2022-12-16 22:51:11 +01:00
Anonymous 4b38db6380 Translated using Weblate (Hungarian)
Currently translated at 40.6% (108 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2022-12-16 22:51:10 +01:00
Anonymous d7f06dbfbb Translated using Weblate (Croatian)
Currently translated at 96.2% (256 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2022-12-16 22:51:10 +01:00
Anonymous 86485740eb Translated using Weblate (Swedish)
Currently translated at 48.8% (130 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2022-12-16 22:51:10 +01:00
Anonymous 97550a67b7 Translated using Weblate (Polish)
Currently translated at 96.9% (258 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2022-12-16 22:51:10 +01:00
Anonymous e8d50201a5 Translated using Weblate (Catalan)
Currently translated at 98.4% (262 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-12-16 22:51:09 +01:00
Anonymous 39e276644f Translated using Weblate (Chinese (Traditional))
Currently translated at 3.3% (9 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2022-12-16 22:51:09 +01:00
Anonymous d72cbb79f5 Translated using Weblate (Dutch)
Currently translated at 23.6% (63 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2022-12-16 22:51:09 +01:00
Anonymous 0a260db335 Translated using Weblate (Vietnamese)
Currently translated at 16.5% (44 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2022-12-16 22:51:09 +01:00
Anonymous 64a77ce04f Translated using Weblate (Norwegian Bokmål)
Currently translated at 29.6% (79 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2022-12-16 22:51:09 +01:00
Anonymous 5f33f061cc Translated using Weblate (Italian)
Currently translated at 86.0% (229 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2022-12-16 22:51:08 +01:00
Anonymous 7606763cc6 Translated using Weblate (Chinese (Simplified))
Currently translated at 63.1% (168 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-12-16 22:51:08 +01:00
Anonymous d73430b299 Translated using Weblate (Russian)
Currently translated at 18.0% (48 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2022-12-16 22:51:08 +01:00
Anonymous 0ab988119d Translated using Weblate (Portuguese)
Currently translated at 61.6% (164 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2022-12-16 22:51:08 +01:00
Anonymous 6d97ac77f6 Translated using Weblate (French)
Currently translated at 98.4% (262 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-12-16 22:51:07 +01:00
Anonymous cd2b9d2e0a Translated using Weblate (Spanish)
Currently translated at 98.4% (262 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-12-16 22:51:07 +01:00
Anonymous 32ef47e6d2 Translated using Weblate (German)
Currently translated at 85.7% (228 of 266 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2022-12-16 22:51:07 +01:00
shamoon cb3c20ecbd Merge pull request #687 from rshide/main
added tdarr widget
2022-12-16 13:50:32 -08:00
Michael Shamoon 12ed730897 Code cleanup + lint 2022-12-16 13:49:41 -08:00
Rickey Shideler aaa1f76176 added tdarr widget 2022-12-16 13:49:40 -08:00
Luis Brito fb2492e577 Adds widget for NextDNS 2022-12-16 14:38:48 -03:00
Zack e7b0fc1419 Translated using Weblate (German)
Currently translated at 87.0% (228 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2022-12-15 20:58:40 +01:00
guineu 7dd0b0e4eb Translated using Weblate (Catalan)
Currently translated at 100.0% (262 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-12-13 16:06:18 +01:00
Luis Silva 6b55a50b05 Translated using Weblate (Portuguese)
Currently translated at 62.5% (164 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2022-12-12 02:50:33 +01:00
shamoon 4f38c0ee80 Merge pull request #664 from Snekussaurier/feature-565
Add ability to use custom logo
2022-12-11 11:01:54 -08:00
Michael Shamoon 95dcb8802a Use ResolvedIcon, remove extra div 2022-12-11 10:30:04 -08:00
Vinay Dawani 9188f5cdd9 cleanup 2022-12-11 12:49:23 -05:00
Snekussaurier 645cf211dd Add ability to use custom logo 2022-12-11 17:31:59 +01:00
Vinay Dawani c720df0805 double negation instead of ternary. force boolean 2022-12-11 04:01:06 -05:00
Vinay Dawani b7722ed333 check swarm value before passing 2022-12-11 03:15:59 -05:00
Vinay Dawani fb883c7b27 added yaml file variable for swarm mode checks 2022-12-11 03:03:20 -05:00
Vinay Dawani f51e755216 Merge remote-tracking branch 'forkorigin/main' into features/basic-docker-swarm 2022-12-11 02:42:22 -05:00
Michael Shamoon 146326f427 fix plex proxy async bug 2022-12-10 22:26:35 -08:00
Michael Shamoon ccc1229098 fix intermittent loss of plex stats
closes #656
2022-12-10 08:42:32 -08:00
shamoon f6b6c64b93 Merge pull request #657 from benphelps/fix-649
Fix: allow multiple instances of certain widgets
2022-12-09 22:39:51 -08:00
Michael Shamoon 91d8e56471 append service name to cache keys 2022-12-09 22:39:10 -08:00
shamoon 702dbd8a82 Merge pull request #658 from benphelps/fix-656
Fix: plex widget error with 1 library
2022-12-09 22:37:50 -08:00
Michael Shamoon 5e722b4d11 Fix plex widget error with 1 library 2022-12-09 22:33:26 -08:00
Michael Shamoon 712fbb53c7 Fix rate unit displays 2022-12-08 15:54:01 -08:00
shamoon 88c437562b Merge pull request #640 from clbx/main
Correct stylized spelling of Authentik
2022-12-07 21:13:38 -08:00
clay 537fd0ac21 Correct spelling of Authentik 2022-12-08 00:05:33 -05:00
Diogo Gaspar 59cb7baf0b Translated using Weblate (Portuguese)
Currently translated at 52.2% (137 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2022-12-08 01:48:35 +01:00
Michael Shamoon 94af8044f1 fix minor flood without a backend error 2022-12-06 15:36:53 -08:00
Milo Ivir 5d8b937e9c Translated using Weblate (Croatian)
Currently translated at 97.7% (256 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2022-12-06 20:48:10 +01:00
Michael Shamoon f89093a067 Update openmeteo-condition-map.js 2022-12-05 09:57:32 -08:00
shamoon e303888119 Merge pull request #627 from benphelps/fix-openmeteo-icons
Fix weather icons for openmeteo, add optional tz parameter
2022-12-05 09:46:59 -08:00
Michael Shamoon a7676c4daa Update README.md 2022-12-05 09:41:54 -08:00
Michael Shamoon 535a7d2f2d Add optional tz 2022-12-05 09:41:19 -08:00
Michael Shamoon 656b818488 Fix conditions map for openmeteo 2022-12-05 08:52:45 -08:00
shamoon 249c3eab8c Merge pull request #626 from saxobroko/patch-1
Linked weather providers and added an attributi...
2022-12-05 07:37:08 -08:00
Saxo_Broko 6de0205d07 Linked weather providers and added an attributi...
attribution for Open-Meteo
2022-12-06 00:22:44 +11:00
shamoon 826fe15e15 Merge pull request #620 from Tarow/scrutiny-widget-thresholds
Respect scrutiny device status threshold setting
2022-12-04 23:33:24 -08:00
Niklas 0ce5311b5f fix lint errors 2022-12-05 08:13:41 +01:00
Niklas 90cb395dc6 change calculation of passed devices 2022-12-05 08:01:24 +01:00
shamoon cbf72eedab fix missing passing condition 2022-12-04 15:33:51 -08:00
Niklas 3f79a2fdda thresholdStatusMapping bugfix 2022-12-04 20:01:00 +01:00
Niklas 1a94453849 Respect scrutiny device status threshold setting 2022-12-04 19:33:15 +01:00
retmas-gh 6045e53207 Translated using Weblate (Polish)
Currently translated at 98.4% (258 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2022-12-04 16:47:38 +01:00
shamoon d3c6d1fe85 Merge pull request #610 from benphelps/fix-604
Fix: Hide docker memory stats when unsupported
2022-12-03 16:28:22 -08:00
gallegonovato 35a7ba77e3 Translated using Weblate (Spanish)
Currently translated at 100.0% (262 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-12-03 15:37:11 +01:00
Michael Shamoon 57d12c32fc Hide docker memory stats when unsupported 2022-12-03 01:43:53 -08:00
shamoon f09268230e Merge pull request #607 from benphelps/fix-590
Fix: unable to build from source on some installs
2022-12-02 21:00:08 -08:00
Nonoss117 98cefe37d2 Translated using Weblate (French)
Currently translated at 100.0% (262 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-12-02 15:08:38 +01:00
Michael Shamoon 01b55a17f1 fix flood lint 2022-12-01 16:53:57 -08:00
Anonymous aaacf2ea4b Translated using Weblate (Esperanto)
Currently translated at 39.3% (103 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2022-12-02 01:46:55 +01:00
Anonymous 8672998f08 Translated using Weblate (Hindi)
Currently translated at 3.4% (9 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2022-12-02 01:46:54 +01:00
Anonymous d8039031ca Translated using Weblate (Malay)
Currently translated at 96.5% (253 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2022-12-02 01:46:54 +01:00
Anonymous f5ad46f1e1 Translated using Weblate (Danish)
Currently translated at 75.5% (198 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2022-12-02 01:46:54 +01:00
Anonymous c1473b4045 Translated using Weblate (Czech)
Currently translated at 85.8% (225 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2022-12-02 01:46:53 +01:00
Anonymous 285ae970c8 Translated using Weblate (Arabic)
Currently translated at 16.7% (44 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2022-12-02 01:46:53 +01:00
Anonymous bf1c67a7ac Translated using Weblate (Serbian)
Currently translated at 3.4% (9 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2022-12-02 01:46:53 +01:00
Anonymous 98165bf9dd Translated using Weblate (Turkish)
Currently translated at 88.1% (231 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2022-12-02 01:46:53 +01:00
Anonymous 19e297e4c6 Translated using Weblate (Bulgarian)
Currently translated at 17.5% (46 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2022-12-02 01:46:52 +01:00
Anonymous 8eaa942572 Translated using Weblate (Telugu)
Currently translated at 82.8% (217 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2022-12-02 01:46:52 +01:00
Anonymous ce1be46c0b Translated using Weblate (Finnish)
Currently translated at 46.9% (123 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2022-12-02 01:46:52 +01:00
Anonymous da75b7b0d3 Translated using Weblate (Yue)
Currently translated at 45.0% (118 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2022-12-02 01:46:52 +01:00
Anonymous d70c618442 Translated using Weblate (Portuguese (Brazil))
Currently translated at 44.6% (117 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2022-12-02 01:46:51 +01:00
Anonymous f4e3cafa25 Translated using Weblate (Romanian)
Currently translated at 52.2% (137 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2022-12-02 01:46:51 +01:00
Anonymous dcafcb983e Translated using Weblate (Hebrew)
Currently translated at 38.5% (101 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2022-12-02 01:46:51 +01:00
Anonymous faac4518f5 Translated using Weblate (Hungarian)
Currently translated at 41.2% (108 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2022-12-02 01:46:51 +01:00
Anonymous 45ba9c6961 Translated using Weblate (Croatian)
Currently translated at 95.0% (249 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2022-12-02 01:46:50 +01:00
Anonymous 25c5f36a0c Translated using Weblate (Swedish)
Currently translated at 49.6% (130 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2022-12-02 01:46:50 +01:00
Anonymous 2ff06d12b0 Translated using Weblate (Polish)
Currently translated at 90.8% (238 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2022-12-02 01:46:50 +01:00
Anonymous c3305c2cd7 Translated using Weblate (Catalan)
Currently translated at 50.0% (131 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-12-02 01:46:50 +01:00
Anonymous 7cae96a77b Translated using Weblate (Chinese (Traditional))
Currently translated at 3.4% (9 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2022-12-02 01:46:49 +01:00
Anonymous 0a7616f0f6 Translated using Weblate (Dutch)
Currently translated at 24.0% (63 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2022-12-02 01:46:49 +01:00
Anonymous 5de93bcad2 Translated using Weblate (Vietnamese)
Currently translated at 16.7% (44 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2022-12-02 01:46:49 +01:00
Anonymous c72961573b Translated using Weblate (Norwegian Bokmål)
Currently translated at 30.1% (79 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2022-12-02 01:46:49 +01:00
Anonymous 2a9c39532a Translated using Weblate (Italian)
Currently translated at 87.4% (229 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2022-12-02 01:46:48 +01:00
Anonymous 2e6d760c53 Translated using Weblate (Chinese (Simplified))
Currently translated at 64.1% (168 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-12-02 01:46:48 +01:00
Anonymous d2f3098b2a Translated using Weblate (Russian)
Currently translated at 18.3% (48 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2022-12-02 01:46:48 +01:00
Anonymous 22dd4e5f77 Translated using Weblate (Portuguese)
Currently translated at 43.8% (115 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2022-12-02 01:46:48 +01:00
Anonymous 31e6c1fa86 Translated using Weblate (French)
Currently translated at 98.4% (258 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-12-02 01:46:47 +01:00
Anonymous ba44c0ae9d Translated using Weblate (Spanish)
Currently translated at 98.0% (257 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-12-02 01:46:47 +01:00
Anonymous 8c918f1ea6 Translated using Weblate (German)
Currently translated at 85.8% (225 of 262 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2022-12-02 01:46:47 +01:00
shamoon ff31b36b46 Merge pull request #598 from JigSawFr/widget/flood
Add flood widget
2022-12-01 16:46:17 -08:00
Jason Fischer 01704ec38b Merge pull request #600 from benphelps/fix-444
Feature: Add default interval setting for coinmarketcap
2022-12-01 16:30:00 -08:00
JigSawFr 8a84eba232 fix(widgets): move flood auth from BASIC to raw json body 2022-12-01 20:55:14 +01:00
Nonoss117 0d28fe25f8 Translated using Weblate (French)
Currently translated at 100.0% (258 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-12-01 20:47:17 +01:00
gallegonovato 97a3346ff6 Translated using Weblate (Spanish)
Currently translated at 99.6% (257 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-12-01 20:47:17 +01:00
shamoon 9d2f1ab8c8 Add default interval setting for coinmarketcap 2022-12-01 06:36:51 -08:00
JigSawFr 7087ed80cc Add flood widget 2022-12-01 12:40:19 +01:00
Michael Shamoon 1aeb3a3b63 Add a perfunctory key to <span> 2022-11-30 20:52:30 -08:00
shamoon df5ff48000 Merge pull request #594 from benphelps/fix-591
Fix: Add token expiration, tweak error handling for npm
2022-11-30 09:57:26 -08:00
Anonymous 1a29c1fc8f Translated using Weblate (Esperanto)
Currently translated at 39.9% (103 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2022-11-30 18:57:13 +01:00
Anonymous 458b16ff6d Translated using Weblate (Hindi)
Currently translated at 3.4% (9 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2022-11-30 18:57:13 +01:00
Anonymous a4e1a22783 Translated using Weblate (Malay)
Currently translated at 98.0% (253 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2022-11-30 18:57:12 +01:00
Anonymous 2725bcbbe1 Translated using Weblate (Danish)
Currently translated at 76.7% (198 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2022-11-30 18:57:12 +01:00
Anonymous 2c717636a6 Translated using Weblate (Czech)
Currently translated at 87.2% (225 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2022-11-30 18:57:12 +01:00
Anonymous 585fe5fb1c Translated using Weblate (Arabic)
Currently translated at 17.0% (44 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2022-11-30 18:57:11 +01:00
Anonymous 5b43b07e1f Translated using Weblate (Serbian)
Currently translated at 3.4% (9 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2022-11-30 18:57:11 +01:00
Anonymous 8e1b99ee32 Translated using Weblate (Turkish)
Currently translated at 89.5% (231 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2022-11-30 18:57:11 +01:00
Anonymous e238db9336 Translated using Weblate (Bulgarian)
Currently translated at 17.8% (46 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2022-11-30 18:57:11 +01:00
Anonymous 65e3d50367 Translated using Weblate (Telugu)
Currently translated at 84.1% (217 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2022-11-30 18:57:10 +01:00
Anonymous 6da0ebd11b Translated using Weblate (Finnish)
Currently translated at 47.6% (123 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2022-11-30 18:57:10 +01:00
Anonymous 531b1a91ba Translated using Weblate (Yue)
Currently translated at 45.7% (118 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2022-11-30 18:57:10 +01:00
Anonymous 77d523e2a4 Translated using Weblate (Portuguese (Brazil))
Currently translated at 45.3% (117 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2022-11-30 18:57:10 +01:00
Anonymous 5443c1e1cd Translated using Weblate (Romanian)
Currently translated at 53.1% (137 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2022-11-30 18:57:09 +01:00
Anonymous 25c0502e02 Translated using Weblate (Hebrew)
Currently translated at 39.1% (101 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2022-11-30 18:57:09 +01:00
Anonymous 16979dfcc4 Translated using Weblate (Hungarian)
Currently translated at 41.8% (108 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2022-11-30 18:57:09 +01:00
Anonymous 6225f3a6c1 Translated using Weblate (Croatian)
Currently translated at 96.5% (249 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2022-11-30 18:57:09 +01:00
Anonymous c1fd9559df Translated using Weblate (Swedish)
Currently translated at 50.3% (130 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2022-11-30 18:57:08 +01:00
Anonymous ff3e0bcbc8 Translated using Weblate (Polish)
Currently translated at 92.2% (238 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2022-11-30 18:57:08 +01:00
Anonymous a3bf7e2da7 Translated using Weblate (Catalan)
Currently translated at 50.7% (131 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-11-30 18:57:08 +01:00
Anonymous 70972d1b85 Translated using Weblate (Chinese (Traditional))
Currently translated at 3.4% (9 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2022-11-30 18:57:08 +01:00
Anonymous ebb1e330a2 Translated using Weblate (Dutch)
Currently translated at 24.4% (63 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2022-11-30 18:57:07 +01:00
Anonymous e0789cb4b6 Translated using Weblate (Vietnamese)
Currently translated at 17.0% (44 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2022-11-30 18:57:07 +01:00
Anonymous fe39bb3695 Translated using Weblate (Norwegian Bokmål)
Currently translated at 30.6% (79 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2022-11-30 18:57:07 +01:00
Anonymous 4efcedcee4 Translated using Weblate (Italian)
Currently translated at 88.7% (229 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2022-11-30 18:57:07 +01:00
Anonymous 323930c5d5 Translated using Weblate (Chinese (Simplified))
Currently translated at 65.1% (168 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-11-30 18:57:06 +01:00
Anonymous c5acca3e5a Translated using Weblate (Russian)
Currently translated at 18.6% (48 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2022-11-30 18:57:06 +01:00
Anonymous ac9023ecdb Translated using Weblate (Portuguese)
Currently translated at 44.5% (115 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2022-11-30 18:57:06 +01:00
Anonymous a8647db988 Translated using Weblate (French)
Currently translated at 98.4% (254 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-11-30 18:57:06 +01:00
Anonymous d5ff929c70 Translated using Weblate (Spanish)
Currently translated at 98.0% (253 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-11-30 18:57:06 +01:00
Anonymous 474f041578 Translated using Weblate (German)
Currently translated at 87.2% (225 of 258 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2022-11-30 18:57:05 +01:00
phlostically 4bf9fa08df Translated using Weblate (Esperanto)
Currently translated at 40.5% (103 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2022-11-30 18:56:37 +01:00
Nonoss117 1de017add9 Translated using Weblate (French)
Currently translated at 100.0% (254 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-11-30 18:56:37 +01:00
shamoon 537b1b344d Merge pull request #586 from benphelps/add-diskstation
Add Synology DiskStation widget
2022-11-30 09:56:32 -08:00
Michael Shamoon 98c8f2078d fix another react deps warning 2022-11-30 09:52:20 -08:00
Michael Shamoon 039d3df7d8 Add token expiration, tweak error handling for npm 2022-11-30 09:49:32 -08:00
Michael Shamoon 94678be85e retry ping > 500 too 2022-11-30 00:46:35 -08:00
shamoon b0cce6dbde Merge pull request #587 from benphelps/ping-fallback
Change: Add fallback to http GET for ping
2022-11-30 00:45:03 -08:00
Michael Shamoon 33bd349e43 Add fallback to HTTP GET for ping 2022-11-30 00:34:18 -08:00
Jason Fischer 4eabdc1e5e Add Synology DiskStation widget
closes #523
2022-11-29 20:11:50 -08:00
shamoon c880fb344f Merge pull request #583 from benphelps/fix-582
Fix quicklaunch z-index
2022-11-29 13:40:47 -08:00
Michael Shamoon c2230fb308 Fix quick-launch z-index
Closes #582
2022-11-29 13:26:35 -08:00
Anonymous de27b10cf9 Translated using Weblate (Esperanto)
Currently translated at 100.0% (0 of 0 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2022-11-29 21:17:53 +01:00
phlostically 7a390b38f5 Added translation using Weblate (Esperanto) 2022-11-29 21:17:40 +01:00
Anonymous d2d0341dd9 Translated using Weblate (Hindi)
Currently translated at 3.5% (9 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2022-11-29 19:34:55 +01:00
Anonymous 7fe542d2e9 Translated using Weblate (Malay)
Currently translated at 99.6% (253 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2022-11-29 19:34:55 +01:00
Anonymous 6a324f4554 Translated using Weblate (Danish)
Currently translated at 77.9% (198 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2022-11-29 19:34:55 +01:00
Anonymous 54de1ff256 Translated using Weblate (Czech)
Currently translated at 88.5% (225 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2022-11-29 19:34:55 +01:00
Anonymous a1fdc7b4a2 Translated using Weblate (Arabic)
Currently translated at 17.3% (44 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2022-11-29 19:34:54 +01:00
Anonymous 8d4c01354e Translated using Weblate (Serbian)
Currently translated at 3.5% (9 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2022-11-29 19:34:54 +01:00
Anonymous 5500b8a115 Translated using Weblate (Turkish)
Currently translated at 90.9% (231 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2022-11-29 19:34:54 +01:00
Anonymous c3280f0143 Translated using Weblate (Bulgarian)
Currently translated at 18.1% (46 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2022-11-29 19:34:54 +01:00
Anonymous d9002b6e41 Translated using Weblate (Telugu)
Currently translated at 85.4% (217 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2022-11-29 19:34:53 +01:00
Anonymous 38585d9d6d Translated using Weblate (Finnish)
Currently translated at 48.4% (123 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2022-11-29 19:34:53 +01:00
Anonymous f59b6b69d9 Translated using Weblate (Yue)
Currently translated at 46.4% (118 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2022-11-29 19:34:53 +01:00
Anonymous a81cc70722 Translated using Weblate (Portuguese (Brazil))
Currently translated at 46.0% (117 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2022-11-29 19:34:52 +01:00
Anonymous c185994c32 Translated using Weblate (Romanian)
Currently translated at 53.9% (137 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2022-11-29 19:34:52 +01:00
Anonymous acde90cf72 Translated using Weblate (Hebrew)
Currently translated at 39.7% (101 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2022-11-29 19:34:52 +01:00
Anonymous c7d8e3afdd Translated using Weblate (Hungarian)
Currently translated at 42.5% (108 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2022-11-29 19:34:52 +01:00
Anonymous b8da8509de Translated using Weblate (Croatian)
Currently translated at 98.0% (249 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2022-11-29 19:34:51 +01:00
Anonymous 0df4f63df1 Translated using Weblate (Swedish)
Currently translated at 51.1% (130 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2022-11-29 19:34:51 +01:00
Anonymous 257cf17c6d Translated using Weblate (Polish)
Currently translated at 93.7% (238 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2022-11-29 19:34:51 +01:00
Anonymous a7d37c559e Translated using Weblate (Catalan)
Currently translated at 51.5% (131 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-11-29 19:34:51 +01:00
Anonymous d08458c895 Translated using Weblate (Chinese (Traditional))
Currently translated at 3.5% (9 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2022-11-29 19:34:50 +01:00
Anonymous 66cd972949 Translated using Weblate (Dutch)
Currently translated at 24.8% (63 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2022-11-29 19:34:50 +01:00
Anonymous 0ba956f685 Translated using Weblate (Vietnamese)
Currently translated at 17.3% (44 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2022-11-29 19:34:50 +01:00
Anonymous 4a519233a2 Translated using Weblate (Norwegian Bokmål)
Currently translated at 31.1% (79 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2022-11-29 19:34:50 +01:00
Anonymous 541bb3cc2b Translated using Weblate (Italian)
Currently translated at 90.1% (229 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2022-11-29 19:34:49 +01:00
Anonymous d0b198d5e5 Translated using Weblate (Chinese (Simplified))
Currently translated at 66.1% (168 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-11-29 19:34:49 +01:00
Anonymous 4864eae23d Translated using Weblate (Russian)
Currently translated at 18.8% (48 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2022-11-29 19:34:49 +01:00
Anonymous 00e50283ee Translated using Weblate (Portuguese)
Currently translated at 45.2% (115 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2022-11-29 19:34:49 +01:00
Anonymous ea96fdabd9 Translated using Weblate (French)
Currently translated at 99.6% (253 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-11-29 19:34:48 +01:00
Anonymous d02c2cb244 Translated using Weblate (Spanish)
Currently translated at 99.6% (253 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-11-29 19:34:48 +01:00
Anonymous 9e41163d66 Translated using Weblate (German)
Currently translated at 88.5% (225 of 254 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2022-11-29 19:34:48 +01:00
shamoon b1bba66a6b Merge pull request #581 from myztillx/main
Added processing count to overseerr
2022-11-29 10:34:25 -08:00
Myztillx 2f523abe9d Added processing count to overseerr 2022-11-29 13:19:52 -05:00
Michael Shamoon 69b1049c17 Graceful fallback when build args not supplied
See #578
2022-11-29 10:11:03 -08:00
Michael Shamoon 44c2a1ecbd fix react dep warning 2022-11-29 10:06:47 -08:00
Jason Fischer 4f9df3c9e7 Merge pull request #575 from benphelps/fix-memory-rounding
Change: Show memory up to 1 decimal place
2022-11-28 18:52:30 -08:00
Michael Shamoon 4c70bff952 Show memory up to 1 decimal place 2022-11-28 17:35:04 -08:00
Jason Fischer bc4d662b2d Merge pull request #567 from benphelps/fix-563
Fix: deluge widget doesnt use username
2022-11-28 14:09:23 -08:00
Jason Fischer 8a1c0a5d06 Merge pull request #570 from benphelps/fix-datetime-render-error
Fix datetime react render error
2022-11-28 14:08:52 -08:00
Aiman Jalil 3e9e379712 Translated using Weblate (Malay)
Currently translated at 100.0% (253 of 253 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2022-11-28 20:14:51 +01:00
nicedc d65e919f57 Translated using Weblate (Chinese (Simplified))
Currently translated at 66.4% (168 of 253 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-11-28 20:14:51 +01:00
FunsKiTo b235a89dc7 Translated using Weblate (Spanish)
Currently translated at 100.0% (253 of 253 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-11-28 20:14:50 +01:00
Michael Shamoon 812eb3d70f Fix datetime react render error 2022-11-28 10:42:21 -08:00
Den Coder 9de82559ca Translated using Weblate (Russian)
Currently translated at 18.9% (48 of 253 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2022-11-28 11:11:06 +01:00
gallegonovato d26fbe589b Translated using Weblate (Spanish)
Currently translated at 100.0% (253 of 253 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-11-28 11:11:05 +01:00
Michael Shamoon c9f508d321 deluge doesnt use username 2022-11-27 22:56:47 -08:00
Ivan Bravo Bravo 99b2ba8944 added basic support for Docker Swarm services 2022-10-26 00:12:46 -05:00
103 changed files with 4960 additions and 580 deletions

No files matched your search

+13 -2
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
View File
@@ -41,3 +41,8 @@ next-env.d.ts
# homepage
/config
# IDEs
/.idea/
+11 -9
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, Authentic, 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 WeatherAPI.com or OpenWeatherMap
- Search Bar
- Weather via [OpenWeatherMap](https://openweathermap.org/) or [Open-Meteo](https://open-meteo.com/)
- 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.
+8 -7
View File
@@ -98,20 +98,21 @@ module.exports = {
);
i18next.services.formatter.add("rate", (value, lng, options) => {
if (value === 0) return "0 Bps";
const bits = options.bits ? value : value / 8;
const k = 1024;
const k = options.binary ? 1024 : 1000;
const sizes = options.bits ? (options.binary ? BIBIT_UNITS : BIT_UNITS) : (options.binary ? BIBYTE_UNITS : BYTE_UNITS);
if (value === 0) return `0 ${sizes[0]}/s`;
const dm = options.decimals ? options.decimals : 0;
const sizes = ["Bps", "KiBps", "MiBps", "GiBps", "TiBps", "PiBps", "EiBps", "ZiBps", "YiBps"];
const i = Math.floor(Math.log(bits) / Math.log(k));
const i = options.binary ? 2 : Math.floor(Math.log(value) / Math.log(k));
const formatted = new Intl.NumberFormat(lng, { maximumFractionDigits: dm, minimumFractionDigits: dm }).format(
parseFloat(bits / k ** i)
parseFloat(value / k ** i)
);
return `${formatted} ${sizes[i]}`;
return `${formatted} ${sizes[i]}/s`;
});
i18next.services.formatter.add("percent", (value, lng, options) =>
+56 -1
View File
@@ -193,7 +193,8 @@
"overseerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available"
"available": "Available",
"processing": "Processing"
},
"pihole": {
"queries": "Queries",
@@ -348,5 +349,59 @@
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
},
"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"
}
}
+56 -1
View File
@@ -131,7 +131,8 @@
"overseerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available"
"available": "Available",
"processing": "Processing"
},
"pihole": {
"queries": "Queries",
@@ -348,5 +349,59 @@
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"leech": "Leech",
"seed": "Seed",
"download": "Download",
"upload": "Upload"
},
"tdarr": {
"saved": "Saved",
"queue": "Queue",
"processed": "Processed",
"errored": "Errored"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
},
"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"
}
}
+172 -117
View File
@@ -3,10 +3,10 @@
"missing_type": "Falta el tipus de widget: {{type}}",
"api_error": "Error d'API",
"status": "Estat",
"information": "Information",
"information": "Informació",
"url": "URL",
"raw_error": "Raw Error",
"response_data": "Response Data"
"raw_error": "Error sense processar",
"response_data": "Dades de resposta"
},
"weather": {
"allow": "Feu clic per permetre",
@@ -20,8 +20,8 @@
"transmission": {
"seed": "Llavors",
"download": "Descàrrega",
"upload": "Càrrega",
"leech": "Companys"
"upload": "Pujada",
"leech": "Company"
},
"sonarr": {
"wanted": "Volgut",
@@ -30,13 +30,13 @@
},
"speedtest": {
"ping": "Ping",
"upload": "Càrrega",
"upload": "Pujada",
"download": "Descàrrega"
},
"resources": {
"total": "Total",
"free": "Lliure",
"used": "Usat",
"used": "Utilitzat",
"load": "Càrrega",
"cpu": "CPU"
},
@@ -47,13 +47,13 @@
"cpu": "Processador",
"offline": "Fora de línia",
"error": "Error",
"unknown": "Unknown"
"unknown": "Desconegut"
},
"emby": {
"playing": "Reproduint",
"transcoding": "Transcodificant",
"bitrate": "Taxa de bits",
"no_active": "Sense transmissions actives"
"no_active": "Sense reproduccions actives"
},
"tautulli": {
"playing": "Reproduint",
@@ -73,14 +73,14 @@
},
"rutorrent": {
"active": "Actiu",
"upload": "Càrrega",
"upload": "Pujada",
"download": "Descàrrega"
},
"radarr": {
"wanted": "Volgut",
"queued": "En cua",
"movies": "Pel·lícules",
"missing": "Missing"
"missing": "Faltant"
},
"readarr": {
"wanted": "Volgut",
@@ -100,7 +100,8 @@
"overseerr": {
"pending": "Pendent",
"approved": "Aprovat",
"available": "Disponible"
"available": "Disponible",
"processing": "Processant"
},
"pihole": {
"queries": "Consultes",
@@ -162,8 +163,8 @@
},
"qbittorrent": {
"download": "Descàrrega",
"upload": "Càrrega",
"leech": "Companys",
"upload": "Pujada",
"leech": "Company",
"seed": "Llavors"
},
"mastodon": {
@@ -183,26 +184,26 @@
"failedLoginsLast24H": "Errors d'inici de sessió (24h)"
},
"proxmox": {
"vms": "VMs",
"vms": "Màquines Virtuals",
"mem": "Memòria",
"cpu": "Processador",
"lxc": "LXC"
},
"unifi": {
"users": "Usuaris",
"uptime": "System Uptime",
"days": "Días",
"uptime": "Temps actiu",
"days": "Dies",
"wan": "WAN",
"lan_users": "LAN Users",
"wlan_users": "WLAN Users",
"up": "UP",
"down": "DOWN",
"lan_users": "Usuaris LAN",
"wlan_users": "Usuaris WLAN",
"up": "ACTIU",
"down": "INACTIU",
"wait": "Si us plau, espereu",
"lan": "LAN",
"wlan": "WLAN",
"devices": "Devices",
"lan_devices": "LAN Devices",
"wlan_devices": "WLAN Devices"
"devices": "Dispositius",
"lan_devices": "Dispositius LAN",
"wlan_devices": "Dispositius WLAN"
},
"plex": {
"streams": "Transmissions actives",
@@ -215,119 +216,119 @@
"wait": "Si us plau, espereu"
},
"changedetectionio": {
"totalObserved": "Total Observed",
"diffsDetected": "Diffs Detected"
"totalObserved": "Total d'observats",
"diffsDetected": "Diferències detectades"
},
"wmo": {
"66-day": "Freezing Rain",
"95-day": "Thunderstorm",
"95-night": "Thunderstorm",
"96-day": "Thunderstorm With Hail",
"0-day": "Sunny",
"0-night": "Clear",
"1-day": "Mainly Sunny",
"1-night": "Mainly Clear",
"2-day": "Partly Cloudy",
"2-night": "Partly Cloudy",
"3-day": "Cloudy",
"3-night": "Cloudy",
"45-day": "Foggy",
"45-night": "Foggy",
"48-day": "Foggy",
"48-night": "Foggy",
"51-day": "Light Drizzle",
"51-night": "Light Drizzle",
"53-day": "Drizzle",
"53-night": "Drizzle",
"55-day": "Heavy Drizzle",
"55-night": "Heavy Drizzle",
"56-day": "Light Freezing Drizzle",
"56-night": "Light Freezing Drizzle",
"65-night": "Heavy Rain",
"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",
"66-night": "Freezing Rain",
"67-day": "Freezing Rain",
"67-night": "Freezing Rain",
"71-day": "Light Snow",
"71-night": "Light Snow",
"73-day": "Snow",
"73-night": "Snow",
"75-day": "Heavy Snow",
"75-night": "Heavy Snow",
"77-day": "Snow Grains",
"77-night": "Snow Grains",
"80-day": "Light Showers",
"80-night": "Light Showers",
"81-day": "Showers",
"81-night": "Showers",
"82-day": "Heavy Showers",
"82-night": "Heavy Showers",
"85-day": "Snow Showers",
"85-night": "Snow Showers",
"86-day": "Snow Showers",
"86-night": "Snow Showers",
"96-night": "Thunderstorm With Hail",
"99-day": "Thunderstorm With Hail",
"99-night": "Thunderstorm With Hail"
"66-day": "Pluja gelada",
"95-day": "Tempesta",
"95-night": "Tempesta",
"96-day": "Tempesta amb calamarsa",
"0-day": "Assolellat",
"0-night": "Cel clar",
"1-day": "Majorment assolellat",
"1-night": "Majorment clar",
"2-day": "Parcialment ennuvolat",
"2-night": "Parcialment ennuvolat",
"3-day": "Ennuvolat",
"3-night": "Ennuvolat",
"45-day": "Boirós",
"45-night": "Boirós",
"48-day": "Boirós",
"48-night": "Boirós",
"51-day": "Ruixats lleugers",
"51-night": "Ruixats lleugers",
"53-day": "Ruixat",
"53-night": "Ruxiat",
"55-day": "Ruixat intens",
"55-night": "Ruixat intens",
"56-day": "Lleuger ruixat gelat",
"56-night": "Lleuger ruixat gelat",
"65-night": "Pluja intensa",
"57-day": "Ruixat gelat",
"57-night": "Ruixat gelat",
"61-day": "Pluja lleugera",
"61-night": "Pluja lleugera",
"63-day": "Pluja",
"63-night": "Pluja",
"65-day": "Pluja intensa",
"66-night": "Pluja gelada",
"67-day": "Pluja gelada",
"67-night": "Pluja gelada",
"71-day": "Neu lleugera",
"71-night": "Neu lleugera",
"73-day": "Neu",
"73-night": "Neu",
"75-day": "Neu intensa",
"75-night": "Neu intensa",
"77-day": "Neu lleugera",
"77-night": "Neu lleugera",
"80-day": "Plovisqueig",
"80-night": "Plovisqueig",
"81-day": "Xàfecs",
"81-night": "Xàfecs",
"82-day": "Xàfecs intensos",
"82-night": "Xàfecs intensos",
"85-day": "Xàfecs de neu",
"85-night": "Xàfecs de neu",
"86-day": "Xàfecs de neu",
"86-night": "Xàfecs de neu",
"96-night": "Tempesta amb calamarsa",
"99-day": "Tempesta amb calamarsa",
"99-night": "Tempesta amb calamarsa"
},
"quicklaunch": {
"bookmark": "Bookmark",
"service": "Service"
"bookmark": "Marcador",
"service": "Servei"
},
"homebridge": {
"available_update": "System",
"updates": "Updates",
"update_available": "Update Available",
"up_to_date": "Up to Date",
"available_update": "Sistema",
"updates": "Actualitzacions",
"update_available": "Actualització disponible",
"up_to_date": "Actualitzat",
"child_bridges": "Child Bridges",
"child_bridges_status": "{{ok}}/{{total}}"
},
"autobrr": {
"approvedPushes": "Approved",
"rejectedPushes": "Rejected",
"filters": "Filters",
"indexers": "Indexers"
"approvedPushes": "Aprovat",
"rejectedPushes": "Rebutjat",
"filters": "Filtres",
"indexers": "Indexadors"
},
"watchtower": {
"containers_scanned": "Scanned",
"containers_updated": "Updated",
"containers_failed": "Failed"
"containers_scanned": "Escanejat",
"containers_updated": "Actualitzat",
"containers_failed": "Error"
},
"tubearchivist": {
"downloads": "Queue",
"videos": "Videos",
"channels": "Channels",
"playlists": "Playlists"
"downloads": "Cua",
"videos": "Vídeos",
"channels": "Canals",
"playlists": "Llistes de reproducció"
},
"truenas": {
"load": "System Load",
"uptime": "Uptime",
"alerts": "Alerts",
"load": "Càrrega del sistema",
"uptime": "Temps actiu",
"alerts": "Alertes",
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
},
"navidrome": {
"nothing_streaming": "No Active Streams",
"please_wait": "Please Wait"
"nothing_streaming": "Cap reproducció activa",
"please_wait": "Espereu si us plau"
},
"pyload": {
"speed": "Speed",
"active": "Active",
"queue": "Queue",
"speed": "Velocitat",
"active": "Actiu",
"queue": "Cua",
"total": "Total"
},
"gluetun": {
"public_ip": "Public IP",
"region": "Region",
"country": "Country"
"public_ip": "IP Pública",
"region": "Regió",
"country": "País"
},
"hdhomerun": {
"channels": "Channels",
"channels": "Canals",
"hd": "HD"
},
"ping": {
@@ -335,18 +336,72 @@
"ping": "Ping"
},
"scrutiny": {
"passed": "Passed",
"failed": "Failed",
"unknown": "Unknown"
"passed": "Aprobat",
"failed": "Error",
"unknown": "Desconegut"
},
"paperlessngx": {
"inbox": "Inbox",
"inbox": "Safata d'entrada",
"total": "Total"
},
"deluge": {
"seed": "Seed",
"seed": "Llavor",
"download": "Descàrrega",
"upload": "Pujada",
"leech": "Company"
},
"flood": {
"download": "Descarregar",
"upload": "Pujada",
"leech": "Company",
"seed": "Llavor"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
},
"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"
"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"
}
}
+56 -1
View File
@@ -147,7 +147,8 @@
"overseerr": {
"pending": "Čeká",
"approved": "Schváleno",
"available": "Dostupný"
"available": "Dostupný",
"processing": "Processing"
},
"pihole": {
"queries": "Dotazy",
@@ -348,5 +349,59 @@
"leech": "Leech",
"seed": "Seed",
"download": "Download"
},
"flood": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
},
"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"
}
}
+56 -1
View File
@@ -23,7 +23,8 @@
"overseerr": {
"pending": "Afventer",
"approved": "Godkendt",
"available": "Tilgængelig"
"available": "Tilgængelig",
"processing": "Processing"
},
"adguard": {
"queries": "Forespørgsler",
@@ -348,5 +349,59 @@
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"leech": "Leech",
"download": "Download",
"upload": "Upload",
"seed": "Seed"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
},
"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"
}
}
+57 -2
View File
@@ -6,7 +6,7 @@
"url": "URL",
"information": "Information",
"raw_error": "Raw Error",
"response_data": "Response Data"
"response_data": "Empfangene Daten"
},
"search": {
"placeholder": "Suche…"
@@ -104,7 +104,8 @@
"overseerr": {
"pending": "Ausstehend",
"approved": "Genehmigt",
"available": "Verfügbar"
"available": "Verfügbar",
"processing": "Processing"
},
"sabnzbd": {
"rate": "Geschwindigkeit",
@@ -348,5 +349,59 @@
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
"miniflux": {
"unread": "Unread",
"read": "Read"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
},
"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"
}
}
+56 -3
View File
@@ -3,9 +3,11 @@
"bytes": "{{value, bytes}}",
"bits": "{{value, bytes(bits: true)}}",
"bbytes": "{{value, bytes(binary: true)}}",
"bbits": "{{value, bytes(bits: true, binary: true)}}",
"byterate": "{{value, rate}}",
"bbits": "{{value, bytes(bits: true; binary: true)}}",
"byterate": "{{value, rate(bits: false)}}",
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bitrate": "{{value, rate(bits: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}",
"percent": "{{value, percent}}",
"number": "{{value, number}}",
"ms": "{{value, number}}"
@@ -70,6 +72,12 @@
"bitrate": "Bitrate",
"no_active": "No Active Streams"
},
"flood": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"changedetectionio": {
"totalObserved": "Total Observed",
"diffsDetected": "Diffs Detected"
@@ -80,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",
@@ -118,6 +133,12 @@
"leech": "Leech",
"seed": "Seed"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"sonarr": {
"wanted": "Wanted",
"queued": "Queued",
@@ -155,6 +176,7 @@
},
"overseerr": {
"pending": "Pending",
"processing": "Processing",
"approved": "Approved",
"available": "Available"
},
@@ -179,6 +201,12 @@
"stopped": "Stopped",
"total": "Total"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
"traefik": {
"routers": "Routers",
"services": "Services",
@@ -227,6 +255,10 @@
"status_count": "Posts",
"domain_count": "Domains"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"authentik": {
"users": "Users",
"loginsLast24H": "Logins (24h)",
@@ -313,7 +345,7 @@
"child_bridges": "Child Bridges",
"child_bridges_status": "{{ok}}/{{total}}"
},
"watchtower":{
"watchtower": {
"containers_scanned": "Scanned",
"containers_updated": "Updated",
"containers_failed": "Failed"
@@ -359,5 +391,26 @@
"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"
}
}
+407
View File
@@ -0,0 +1,407 @@
{
"widget": {
"missing_type": "Missing Widget Type: {{type}}",
"api_error": "API Error",
"information": "Informo",
"status": "Stato",
"url": "URL",
"raw_error": "Raw Error",
"response_data": "Response Data"
},
"weather": {
"current": "Aktuala loko",
"allow": "Click to allow",
"updating": "Updating",
"wait": "Please wait"
},
"search": {
"placeholder": "Serĉi…"
},
"resources": {
"cpu": "Ĉefprocesoro",
"total": "Totalo",
"free": "Libera",
"used": "Uzata",
"load": "Ŝarĝo"
},
"unifi": {
"users": "Uzantoj",
"uptime": "System Uptime",
"days": "Tagoj",
"wan": "WAN",
"lan": "LAN",
"wlan": "WLAN",
"devices": "Aparatoj",
"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": "Memoro",
"cpu": "Ĉefprocesoro",
"offline": "Offline",
"error": "Eraro",
"unknown": "Nekonata"
},
"ping": {
"error": "Eraro",
"ping": "Ping"
},
"emby": {
"playing": "Ludante",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"no_active": "No Active Streams"
},
"changedetectionio": {
"totalObserved": "Total Observed",
"diffsDetected": "Diffs Detected"
},
"tautulli": {
"playing": "Playing",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"no_active": "No Active Streams"
},
"nzbget": {
"rate": "Rate",
"remaining": "Remaining",
"downloaded": "Downloaded"
},
"plex": {
"streams": "Active Streams",
"movies": "Filmoj",
"tv": "Televidprogramoj"
},
"sabnzbd": {
"rate": "Rate",
"queue": "Queue",
"timeleft": "Time Left"
},
"rutorrent": {
"active": "Active",
"upload": "Alŝuto",
"download": "Elŝuto"
},
"transmission": {
"download": "Elŝuto",
"upload": "Alŝuto",
"leech": "Leech",
"seed": "Seed"
},
"qbittorrent": {
"download": "Elŝuto",
"upload": "Alŝuto",
"leech": "Leech",
"seed": "Seed"
},
"deluge": {
"download": "Elŝuto",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"sonarr": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Serio"
},
"radarr": {
"wanted": "Wanted",
"missing": "Missing",
"queued": "Queued",
"movies": "Filmoj"
},
"lidarr": {
"wanted": "Wanted",
"queued": "Queued",
"albums": "Albumoj"
},
"readarr": {
"wanted": "Wanted",
"queued": "Queued",
"books": "Libroj"
},
"bazarr": {
"missingEpisodes": "Missing Episodes",
"missingMovies": "Missing Movies"
},
"ombi": {
"pending": "Pending",
"approved": "Aprobita",
"available": "Havebla"
},
"jellyseerr": {
"pending": "Pending",
"approved": "Aprobita",
"available": "Havebla"
},
"overseerr": {
"pending": "Pending",
"processing": "Processing",
"approved": "Aprobita",
"available": "Havebla"
},
"pihole": {
"queries": "Queries",
"blocked": "Blocked",
"gravity": "Gravity"
},
"adguard": {
"queries": "Queries",
"blocked": "Blokitaj",
"filtered": "Filtritaj",
"latency": "Latency"
},
"speedtest": {
"upload": "Upload",
"download": "Download",
"ping": "Ping"
},
"portainer": {
"running": "Running",
"stopped": "Stopped",
"total": "Totalo"
},
"traefik": {
"routers": "Routers",
"services": "Servoj",
"middleware": "Middleware"
},
"navidrome": {
"nothing_streaming": "No Active Streams",
"please_wait": "Please Wait"
},
"npm": {
"enabled": "Enabled",
"disabled": "Disabled",
"total": "Total"
},
"coinmarketcap": {
"configure": "Configure one or more crypto currencies to track",
"1hour": "1 horo",
"1day": "1 tago",
"7days": "7 tagoj",
"30days": "30 tagoj"
},
"gotify": {
"apps": "Applications",
"clients": "Klientoj",
"messages": "Mesaĝoj"
},
"prowlarr": {
"enableIndexers": "Indexers",
"numberOfGrabs": "Grabs",
"numberOfQueries": "Queries",
"numberOfFailGrabs": "Fail Grabs",
"numberOfFailQueries": "Fail Queries"
},
"jackett": {
"configured": "Configured",
"errored": "Errored"
},
"strelaysrv": {
"numActiveSessions": "Seancoj",
"numConnections": "Konektoj",
"dataRelayed": "Relayed",
"transferRate": "Rate"
},
"mastodon": {
"user_count": "Uzantoj",
"status_count": "Afiŝoj",
"domain_count": "Domains"
},
"authentik": {
"users": "Users",
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)"
},
"proxmox": {
"mem": "Memoro",
"cpu": "Ĉefprocesoro",
"lxc": "LXC",
"vms": "VMs"
},
"glances": {
"cpu": "Ĉefprocesoro",
"mem": "Memoro",
"wait": "Bonvolu atendi"
},
"quicklaunch": {
"bookmark": "Bookmark",
"service": "Servo"
},
"wmo": {
"0-day": "Suna",
"0-night": "Sennuba",
"1-day": "Mainly Sunny",
"1-night": "Mainly Clear",
"2-day": "Nubeta",
"2-night": "Nubeta",
"3-day": "Nuba",
"3-night": "Nuba",
"45-day": "Nebula",
"45-night": "Nebula",
"48-day": "Nebula",
"48-night": "Nebula",
"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": "Pluvo",
"63-night": "Pluvo",
"65-day": "Pluvego",
"65-night": "Pluvego",
"66-day": "Frosta pluvo",
"66-night": "Frosta pluvo",
"67-day": "Frosta pluvo",
"67-night": "Frosta pluvo",
"71-day": "Light Snow",
"71-night": "Light Snow",
"73-day": "Neĝo",
"73-night": "Neĝo",
"75-day": "Neĝego",
"75-night": "Neĝego",
"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": "Fulmotondro",
"95-night": "Fulmotondro",
"96-day": "Fulmotondro kun hajlo",
"96-night": "Fulmotondro kun hajlo",
"99-day": "Fulmotondro kun hajlo",
"99-night": "Fulmotondro kun hajlo"
},
"homebridge": {
"available_update": "Sistemo",
"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"
},
"autobrr": {
"approvedPushes": "Approved",
"rejectedPushes": "Rejected",
"filters": "Filtriloj",
"indexers": "Indexers"
},
"tubearchivist": {
"downloads": "Queue",
"videos": "Videos",
"channels": "Kanaloj",
"playlists": "Playlists"
},
"truenas": {
"load": "System Load",
"uptime": "Uptime",
"alerts": "Alerts",
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
},
"pyload": {
"speed": "Speed",
"active": "Aktiva",
"queue": "Queue",
"total": "Total"
},
"gluetun": {
"public_ip": "Public IP",
"region": "Regiono",
"country": "Lando"
},
"hdhomerun": {
"channels": "Kanaloj",
"hd": "HD"
},
"scrutiny": {
"passed": "Passed",
"failed": "Failed",
"unknown": "Unknown"
},
"paperlessngx": {
"inbox": "Inbox",
"total": "Totalo"
},
"flood": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
},
"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"
}
}
+59 -4
View File
@@ -53,7 +53,7 @@
"wanted": "Buscando",
"queued": "En cola",
"movies": "Películas",
"missing": "No Encontrado"
"missing": "Faltan"
},
"readarr": {
"wanted": "Buscando",
@@ -104,7 +104,8 @@
"overseerr": {
"pending": "Pendiente",
"approved": "Aprobado",
"available": "Disponible"
"available": "Disponible",
"processing": "Procesando"
},
"sabnzbd": {
"rate": "Tasa",
@@ -138,7 +139,7 @@
"transmission": {
"download": "Bajada",
"upload": "Subida",
"leech": "Compañeros",
"leech": "Leech",
"seed": "Semillas"
},
"jackett": {
@@ -163,7 +164,7 @@
"qbittorrent": {
"download": "Bajada",
"upload": "Subida",
"leech": "Compañeros",
"leech": "Leech",
"seed": "Semillas"
},
"mastodon": {
@@ -348,5 +349,59 @@
"upload": "Subida",
"leech": "Leech",
"seed": "Semilla"
},
"flood": {
"download": "Descargar",
"upload": "Subir",
"leech": "Leech",
"seed": "Seed"
},
"tdarr": {
"queue": "Cola",
"processed": "Procesado",
"saved": "Guardado",
"errored": "Error"
},
"miniflux": {
"read": "Leer",
"unread": "Sin leer"
},
"nextdns": {
"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"
}
}
+56 -1
View File
@@ -110,7 +110,8 @@
"overseerr": {
"pending": "Vireillä",
"approved": "Hyväksytty",
"available": "Saatavilla"
"available": "Saatavilla",
"processing": "Processing"
},
"pihole": {
"queries": "Kyselyjä",
@@ -348,5 +349,59 @@
"leech": "Leech",
"seed": "Seed",
"download": "Download"
},
"flood": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
},
"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"
}
}
+56 -1
View File
@@ -104,7 +104,8 @@
"overseerr": {
"pending": "En attente",
"approved": "Demande",
"available": "Disponible"
"available": "Disponible",
"processing": "En traitement"
},
"sabnzbd": {
"rate": "Débit",
@@ -348,5 +349,59 @@
"upload": "Envoi",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Récep.",
"upload": "Envoi",
"leech": "Leech",
"seed": "Seed"
},
"tdarr": {
"queue": "À traiter",
"processed": "Traité",
"errored": "En erreur",
"saved": "Enregistré"
},
"miniflux": {
"read": "Lu",
"unread": "Non lu"
},
"nextdns": {
"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."
}
}
+56 -1
View File
@@ -110,7 +110,8 @@
"overseerr": {
"pending": "ממתין",
"approved": "מאושר",
"available": "זמין"
"available": "זמין",
"processing": "Processing"
},
"pihole": {
"queries": "שאילתות",
@@ -348,5 +349,59 @@
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
},
"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"
}
}
+56 -1
View File
@@ -150,7 +150,8 @@
"overseerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available"
"available": "Available",
"processing": "Processing"
},
"pihole": {
"queries": "Queries",
@@ -348,5 +349,59 @@
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
},
"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"
}
}
+60 -5
View File
@@ -23,7 +23,8 @@
"overseerr": {
"available": "Dostupno",
"pending": "Predstoji",
"approved": "Odobreno"
"approved": "Odobreno",
"processing": "Obrada"
},
"pihole": {
"queries": "Upiti",
@@ -344,9 +345,63 @@
"total": "Ukupno"
},
"deluge": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
"download": "Preuzimanje",
"upload": "Prijenos",
"leech": "Korištenje tuđeg sadržaja",
"seed": "Prenošenje preuzetog sadržaja"
},
"flood": {
"download": "Preuzimanje",
"upload": "Prijenos",
"leech": "Korištenje tuđeg sadržaja",
"seed": "Prenošenje preuzetog sadržaja"
},
"tdarr": {
"queue": "Red čekanja",
"processed": "Obrađeno",
"errored": "S greškom",
"saved": "Spremljeno"
},
"miniflux": {
"read": "Pročitano",
"unread": "Nepročitano"
},
"nextdns": {
"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"
}
}
+56 -1
View File
@@ -110,7 +110,8 @@
"overseerr": {
"pending": "Függőben",
"approved": "Engedélyezett",
"available": "Elérhető"
"available": "Elérhető",
"processing": "Processing"
},
"pihole": {
"queries": "Lekérdezések",
@@ -348,5 +349,59 @@
"seed": "Seed",
"upload": "Upload",
"leech": "Leech"
},
"flood": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
},
"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"
}
}
+80 -25
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…"
@@ -104,7 +104,8 @@
"overseerr": {
"pending": "In attesa",
"approved": "Approvati",
"available": "Disponibili"
"available": "Disponibili",
"processing": "In lavorazione"
},
"sabnzbd": {
"rate": "Rapporto",
@@ -125,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"
},
@@ -152,10 +153,10 @@
"lidarr": {
"wanted": "Mancanti",
"queued": "In coda",
"albums": "Albums"
"albums": "Album"
},
"adguard": {
"queries": "Queries",
"queries": "Interrogazioni",
"blocked": "Bloccati",
"filtered": "Filtrati",
"latency": "Latenza"
@@ -303,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": {
@@ -322,31 +323,85 @@
"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",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"tdarr": {
"queue": "In coda",
"processed": "Elaborati",
"errored": "Errori",
"saved": "Salvati"
},
"miniflux": {
"unread": "Non letti",
"read": "Letti"
},
"nextdns": {
"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"
}
}
+407
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"
}
}
+71 -16
View File
@@ -126,10 +126,10 @@
"missing_type": "Jenis Widget Hilang: {{type}}",
"api_error": "Masalah API",
"status": "Status",
"information": "Information",
"information": "Informasi",
"url": "URL",
"raw_error": "Raw Error",
"response_data": "Response Data"
"raw_error": "Ralat Mentah",
"response_data": "Data Respon"
},
"weather": {
"current": "Lokasi Sekarang",
@@ -151,8 +151,8 @@
"mem": "MEM",
"cpu": "CPU",
"offline": "Luar talian",
"error": "Error",
"unknown": "Unknown"
"error": "Ralat",
"unknown": "Tidak Diketahui"
},
"changedetectionio": {
"totalObserved": "Jumlah Diperhatikan",
@@ -220,7 +220,8 @@
"overseerr": {
"pending": "Tertangguh",
"approved": "Lulus",
"available": "Sudah Ada"
"available": "Sudah Ada",
"processing": "Processing"
},
"pihole": {
"queries": "Permintaan",
@@ -322,31 +323,85 @@
"total": "Jumlah"
},
"gluetun": {
"public_ip": "Public IP",
"region": "Region",
"country": "Country"
"public_ip": "IP Awam",
"region": "Rantau",
"country": "Negara"
},
"hdhomerun": {
"channels": "Channels",
"channels": "Saluran",
"hd": "HD"
},
"ping": {
"error": "Error",
"error": "Ralat",
"ping": "Ping"
},
"scrutiny": {
"passed": "Passed",
"failed": "Failed",
"unknown": "Unknown"
"passed": "Lulus",
"failed": "Gagal",
"unknown": "Tidak Diketahui"
},
"paperlessngx": {
"inbox": "Inbox",
"total": "Total"
"inbox": "Peti Masuk",
"total": "Jumlah"
},
"deluge": {
"download": "Muat Turun",
"upload": "Muat Naik",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
},
"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"
}
}
+56 -1
View File
@@ -104,7 +104,8 @@
"overseerr": {
"pending": "Venter",
"approved": "Godkjent",
"available": "Tilgjengelig"
"available": "Tilgjengelig",
"processing": "Processing"
},
"sabnzbd": {
"rate": "Takt",
@@ -348,5 +349,59 @@
"download": "Download",
"upload": "Upload",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
},
"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"
}
}
+56 -1
View File
@@ -104,7 +104,8 @@
"overseerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available"
"available": "Available",
"processing": "Processing"
},
"sabnzbd": {
"rate": "Rate",
@@ -348,5 +349,59 @@
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
},
"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"
}
}
+63 -8
View File
@@ -126,7 +126,8 @@
"overseerr": {
"pending": "Oczekiwane",
"approved": "Zaakceptowane",
"available": "Dostępne"
"available": "Dostępne",
"processing": "Przetwarzane"
},
"pihole": {
"queries": "Zapytania",
@@ -335,18 +336,72 @@
"ping": "Ping"
},
"scrutiny": {
"passed": "Passed",
"failed": "Failed",
"unknown": "Unknown"
"passed": "Powodzenie",
"failed": "Niepowodzenie",
"unknown": "Nieznane"
},
"paperlessngx": {
"inbox": "Inbox",
"total": "Total"
"inbox": "Skrzynka odbiorcza",
"total": "W sumie"
},
"deluge": {
"download": "Download",
"upload": "Upload",
"download": "Pobieranie",
"upload": "Wysyłanie",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Pobieranie",
"upload": "Wysyłanie",
"leech": "Leech",
"seed": "Seed"
},
"tdarr": {
"queue": "Kolejka",
"processed": "Przetworzone",
"errored": "Błędne",
"saved": "Zapisane"
},
"miniflux": {
"read": "Przeczytane",
"unread": "Nieprzeczytane"
},
"nextdns": {
"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"
}
}
+56 -1
View File
@@ -128,7 +128,8 @@
"overseerr": {
"pending": "Pendente",
"approved": "Aprovado",
"available": "Disponível"
"available": "Disponível",
"processing": "Processing"
},
"pihole": {
"queries": "Consultas",
@@ -348,5 +349,59 @@
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
},
"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"
}
}
+168 -115
View File
@@ -1,12 +1,12 @@
{
"widget": {
"missing_type": "Widget ausente: {{type}}",
"missing_type": "Tipo de Widget ausente: {{type}}",
"api_error": "Erro da API",
"status": "Status",
"information": "Information",
"url": "URL",
"raw_error": "Raw Error",
"response_data": "Response Data"
"status": "Estado",
"information": "Informação",
"url": "Endereço URL",
"raw_error": "Erro",
"response_data": "Dados da Resposta"
},
"search": {
"placeholder": "Pesquisar…"
@@ -14,8 +14,8 @@
"resources": {
"total": "Total",
"free": "Livre",
"used": "Usado",
"load": "Carregar",
"used": "Utilizado",
"load": "Carga",
"cpu": "CPU"
},
"docker": {
@@ -24,8 +24,8 @@
"mem": "Mem",
"cpu": "CPU",
"offline": "Desligado",
"error": "Error",
"unknown": "Unknown"
"error": "Erro",
"unknown": "Desconhecido"
},
"emby": {
"playing": "A reproduzir",
@@ -53,7 +53,7 @@
"wanted": "Desejado",
"queued": "Fila",
"movies": "Filmes",
"missing": "Missing"
"missing": "Faltando"
},
"readarr": {
"wanted": "Desejados",
@@ -104,18 +104,21 @@
"byterate": "{{value, bytes}}",
"ms": "{{value, number}}",
"bitrate": "{{value, bytes(bits: true)}}",
"percent": "{{value, percent}}"
"percent": "{{value, percent}}",
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"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"
"available": "Disponível",
"processing": "Processando"
},
"sabnzbd": {
"rate": "Taxa",
@@ -149,7 +152,7 @@
"transmission": {
"download": "Baixando",
"upload": "Enviando",
"leech": "Sanguessugas",
"leech": "Leech",
"seed": "Semeadores"
},
"jackett": {
@@ -189,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",
@@ -200,164 +203,214 @@
"vms": "VMs"
},
"unifi": {
"users": "Users",
"uptime": "System Uptime",
"days": "Days",
"users": "Utilizadores",
"uptime": "Sistema Ativo",
"days": "Dias",
"wan": "WAN",
"lan_users": "LAN Users",
"wlan_users": "WLAN Users",
"up": "UP",
"down": "DOWN",
"wait": "Please wait",
"lan_users": "Utilizadores LAN",
"wlan_users": "Utilizadores WLAN",
"up": "Ligado",
"down": "Desligado",
"wait": "Por favor, aguarde",
"lan": "LAN",
"wlan": "WLAN",
"devices": "Devices",
"lan_devices": "LAN Devices",
"wlan_devices": "WLAN Devices"
"devices": "Dispositivos",
"lan_devices": "Dispositivos LAN",
"wlan_devices": "Dispositivos WLAN"
},
"plex": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
"streams": "Streams Ativas",
"movies": "Filmes",
"tv": "Series de TV"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait"
"wait": "Por favor, aguarde"
},
"changedetectionio": {
"totalObserved": "Total Observed",
"diffsDetected": "Diffs Detected"
"totalObserved": "Total Observado",
"diffsDetected": "Diferenças Detetadas"
},
"wmo": {
"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",
"99-night": "Thunderstorm With Hail",
"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",
"0-day": "Solarengo",
"0-night": "Limpo",
"1-day": "Maioritariamente ensolarado",
"1-night": "Maioritariamente Limpo",
"2-day": "Parcialmente Nublado",
"2-night": "Parcialmente nublado",
"3-day": "Nublado",
"3-night": "Nublado",
"99-night": "Trovoada com granizo",
"45-day": "Nevoeiro",
"45-night": "Nevoeiro",
"48-day": "Nevoeiro",
"48-night": "Nevoeiro",
"51-day": "Aguaceiros",
"51-night": "Aguaceiros",
"53-day": "Chuvisco",
"53-night": "Chuvisco",
"55-day": "Aguaceiro Forte",
"55-night": "Aguaceiro Forte",
"56-day": "Light Freezing Drizzle",
"56-night": "Light Freezing Drizzle",
"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": "Bookmark",
"service": "Service"
"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": "Error",
"ping": "Ping"
"error": "Erro",
"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"
"seed": "Semente"
},
"flood": {
"download": "Descarregar",
"upload": "Carregar",
"leech": "Leech",
"seed": "Semente"
},
"tdarr": {
"queue": "Fila",
"processed": "Processado",
"errored": "Erro",
"saved": "Guardado"
},
"miniflux": {
"read": "Lido",
"unread": "Não lido"
},
"nextdns": {
"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"
}
}
+56 -1
View File
@@ -23,7 +23,8 @@
"overseerr": {
"pending": "În așteptare",
"approved": "Aprobate",
"available": "Disponibile"
"available": "Disponibile",
"processing": "Processing"
},
"pihole": {
"queries": "Cereri",
@@ -348,5 +349,59 @@
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
},
"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"
}
}
+66 -11
View File
@@ -6,7 +6,7 @@
"information": "Информация",
"url": "URL",
"raw_error": "Raw Error",
"response_data": "Response Data"
"response_data": "Данные ответа"
},
"search": {
"placeholder": "Поиск…"
@@ -16,7 +16,7 @@
"free": "Свободно",
"used": "Использовано",
"load": "Загрузка",
"cpu": "CPU"
"cpu": "Процессор"
},
"docker": {
"rx": "Rx",
@@ -24,14 +24,14 @@
"mem": "Память",
"cpu": "Процессор",
"offline": "Не в сети",
"error": "Error",
"unknown": "Unknown"
"error": "Ошибка",
"unknown": "Неизвестный"
},
"emby": {
"playing": "Воспроизведение",
"transcoding": "Транскодирование",
"bitrate": "Битрейт",
"no_active": "No Active Streams"
"no_active": "Нет активных потоков"
},
"tautulli": {
"playing": "Воспроизведение",
@@ -104,7 +104,8 @@
"overseerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available"
"available": "Available",
"processing": "Processing"
},
"sabnzbd": {
"rate": "Rate",
@@ -197,7 +198,7 @@
"wlan_users": "Пользователи WLAN",
"up": "UP",
"down": "DOWN",
"wait": "Please wait",
"wait": "Подождите",
"lan": "LAN",
"wlan": "WLAN",
"devices": "Устройства",
@@ -215,8 +216,8 @@
"wait": "Please wait"
},
"changedetectionio": {
"totalObserved": "Total Observed",
"diffsDetected": "Diffs Detected"
"totalObserved": "Всего наблюдаемых",
"diffsDetected": "Обнаружены различия"
},
"wmo": {
"0-day": "Sunny",
@@ -331,8 +332,8 @@
"hd": "HD"
},
"ping": {
"error": "Error",
"ping": "Ping"
"error": "Ошибка",
"ping": "Пинг"
},
"scrutiny": {
"failed": "Failed",
@@ -348,5 +349,59 @@
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"upload": "Upload",
"download": "Download",
"leech": "Leech",
"seed": "Seed"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
},
"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"
}
}
+56 -1
View File
@@ -131,7 +131,8 @@
"overseerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available"
"available": "Available",
"processing": "Processing"
},
"pihole": {
"queries": "Queries",
@@ -348,5 +349,59 @@
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Download",
"seed": "Seed",
"upload": "Upload",
"leech": "Leech"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
},
"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"
}
}
+56 -1
View File
@@ -104,7 +104,8 @@
"overseerr": {
"pending": "Avvaktar",
"approved": "Godkända",
"available": "Tillgänglig"
"available": "Tillgänglig",
"processing": "Processing"
},
"pihole": {
"blocked": "Blockerad",
@@ -348,5 +349,59 @@
"leech": "Leech",
"upload": "Upload",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
},
"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"
}
}
+56 -1
View File
@@ -122,7 +122,8 @@
"overseerr": {
"pending": "పెండింగ్",
"approved": "ఆమోదించబడింది",
"available": "అందుబాటులో"
"available": "అందుబాటులో",
"processing": "Processing"
},
"pihole": {
"queries": "ప్రశ్నలు",
@@ -348,5 +349,59 @@
"download": "Download",
"upload": "Upload",
"leech": "Leech"
},
"flood": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
},
"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"
}
}
+56 -1
View File
@@ -131,7 +131,8 @@
"overseerr": {
"pending": "Bekliyor",
"approved": "Onaylı",
"available": "Kullanılabilir"
"available": "Kullanılabilir",
"processing": "Processing"
},
"pihole": {
"queries": "Sorgular",
@@ -348,5 +349,59 @@
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
},
"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"
}
}
+407
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"
}
}
+56 -1
View File
@@ -104,7 +104,8 @@
"overseerr": {
"pending": "Pending",
"approved": "Đã duyệt",
"available": "Available"
"available": "Available",
"processing": "Processing"
},
"sabnzbd": {
"rate": "Rate",
@@ -348,5 +349,59 @@
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
"seed": "Seed",
"leech": "Leech"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
},
"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"
}
}
+56 -1
View File
@@ -110,7 +110,8 @@
"overseerr": {
"pending": "待定",
"approved": "批准",
"available": "可用"
"available": "可用",
"processing": "Processing"
},
"pihole": {
"queries": "查詢",
@@ -348,5 +349,59 @@
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
},
"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"
}
}
+59 -4
View File
@@ -104,7 +104,8 @@
"overseerr": {
"pending": "待办",
"approved": "已批准",
"available": "可用"
"available": "可用",
"processing": "Processing"
},
"sabnzbd": {
"rate": "速率",
@@ -295,9 +296,9 @@
"indexers": "Indexers"
},
"watchtower": {
"containers_scanned": "Scanned",
"containers_updated": "Updated",
"containers_failed": "Failed"
"containers_scanned": "以扫描",
"containers_updated": "以升级",
"containers_failed": "失败"
},
"tubearchivist": {
"downloads": "Queue",
@@ -348,5 +349,59 @@
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"leech": "Leech",
"download": "Download",
"upload": "Upload",
"seed": "Seed"
},
"tdarr": {
"saved": "Saved",
"queue": "Queue",
"processed": "Processed",
"errored": "Errored"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
},
"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"
}
}
+56 -1
View File
@@ -89,7 +89,8 @@
"overseerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available"
"available": "Available",
"processing": "Processing"
},
"pihole": {
"queries": "Queries",
@@ -348,5 +349,59 @@
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"flood": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
},
"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"
}
}
+4 -3
View File
@@ -107,18 +107,19 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear
function highlightText(text) {
const parts = text.split(new RegExp(`(${searchString})`, 'gi'));
return <span>{parts.map(part => part.toLowerCase() === searchString.toLowerCase() ? <span className="bg-theme-300/10">{part}</span> : part)}</span>;
// eslint-disable-next-line react/no-array-index-key
return <span>{parts.map((part, i) => part.toLowerCase() === searchString.toLowerCase() ? <span key={`${searchString}_${i}`} className="bg-theme-300/10">{part}</span> : part)}</span>;
}
return (
<div className={classNames(
"relative z-10 ease-in-out duration-300 transition-opacity",
"relative z-20 ease-in-out duration-300 transition-opacity",
hidden && !isOpen && "hidden",
!hidden && isOpen && "opacity-100",
!isOpen && "opacity-0",
)} role="dialog" aria-modal="true">
<div className="fixed inset-0 bg-gray-500 bg-opacity-50" />
<div className="fixed inset-0 z-10 overflow-y-auto">
<div className="fixed inset-0 z-20 overflow-y-auto">
<div className="flex min-h-full min-w-full items-start justify-center text-center">
<dialog className="mt-[10%] min-w-[80%] max-w-[90%] md:min-w-[40%] rounded-md p-0 block font-medium text-theme-700 dark:text-theme-200 dark:hover:text-theme-300 shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-50 dark:bg-theme-800">
<input placeholder="Search" className={classNames(
+6 -6
View File
@@ -1,9 +1,9 @@
import Image from "next/future/image";
export default function ResolvedIcon({ icon }) {
export default function ResolvedIcon({ icon, width = 32, height = 32 }) {
// direct or relative URLs
if (icon.startsWith("http") || icon.startsWith("/")) {
return <Image src={`${icon}`} width={32} height={32} alt="logo" />;
return <Image src={`${icon}`} width={width} height={height} alt="logo" />;
}
// mdi- prefixed, material design icons
@@ -12,8 +12,8 @@ export default function ResolvedIcon({ icon }) {
return (
<div
style={{
width: 32,
height: 32,
width,
height,
maxWidth: '100%',
maxHeight: '100%',
background: "linear-gradient(180deg, rgb(var(--color-logo-start)), rgb(var(--color-logo-stop)))",
@@ -29,8 +29,8 @@ export default function ResolvedIcon({ icon }) {
return (
<Image
src={`https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/${iconName}.png`}
width={32}
height={32}
width={width}
height={height}
alt="logo"
/>
);
+5 -9
View File
@@ -3,18 +3,14 @@ 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();
const buildTime = process.env.NEXT_PUBLIC_BUILDTIME ?? new Date().toISOString();
const revision = process.env.NEXT_PUBLIC_REVISION ?? "dev";
const version = process.env.NEXT_PUBLIC_VERSION ?? "dev";
const buildTime = process.env.NEXT_PUBLIC_BUILDTIME?.length ? process.env.NEXT_PUBLIC_BUILDTIME : new Date().toISOString();
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}
+9 -9
View File
@@ -13,24 +13,24 @@ 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(new Date());
const [date, setDate] = useState("");
const dateLocale = locale ?? i18n.language;
useEffect(() => {
const dateFormat = new Intl.DateTimeFormat(dateLocale, { ...format });
const interval = setInterval(() => {
setDate(new Date());
setDate(dateFormat.format(new Date()));
}, 1000);
return () => clearInterval(interval);
}, [setDate]);
const dateFormat = new Intl.DateTimeFormat(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"]}`}>
{dateFormat.format(date)}
<span className={`text-theme-800 dark:text-theme-200 tabular-nums ${textSizes[textSize || "lg"]}`}>
{date}
</span>
</div>
</div>
+52 -46
View File
@@ -1,56 +1,62 @@
export default function Logo() {
import ResolvedIcon from "components/resolvedicon"
export default function Logo({ options }) {
return (
<div className="w-12 h-12 flex flex-row items-center align-middle mr-3 self-center">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 1024 1024"
style={{
enableBackground: "new 0 0 1024 1024",
}}
xmlSpace="preserve"
className="w-full h-full"
>
<style>
{
".st0{display:none}.st3{stroke-linecap:square}.st3,.st4{fill:none;stroke:#fff;stroke-miterlimit:10}.st6{display:inline;fill:#333}.st7{fill:#fff}"
}
</style>
<g id="Icon">
<path
d="M771.9 191c27.7 0 50.1 26.5 50.1 59.3v186.4l-100.2.3V250.3c0-32.8 22.4-59.3 50.1-59.3z"
style={{
fill: "rgba(var(--color-logo-start))",
}}
/>
<linearGradient
id="homepage_logo_gradient"
gradientUnits="userSpaceOnUse"
x1={200.746}
y1={225.015}
x2={764.986}
y2={789.255}
>
<stop
offset={0}
{options.icon ?
<ResolvedIcon icon={options.icon} width={48} height={48} /> :
// fallback to homepage logo
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 1024 1024"
style={{
enableBackground: "new 0 0 1024 1024",
}}
xmlSpace="preserve"
className="w-full h-full"
>
<style>
{
".st0{display:none}.st3{stroke-linecap:square}.st3,.st4{fill:none;stroke:#fff;stroke-miterlimit:10}.st6{display:inline;fill:#333}.st7{fill:#fff}"
}
</style>
<g id="Icon">
<path
d="M771.9 191c27.7 0 50.1 26.5 50.1 59.3v186.4l-100.2.3V250.3c0-32.8 22.4-59.3 50.1-59.3z"
style={{
stopColor: "rgba(var(--color-logo-start))",
fill: "rgba(var(--color-logo-start))",
}}
/>
<stop
offset={1}
<linearGradient
id="homepage_logo_gradient"
gradientUnits="userSpaceOnUse"
x1={200.746}
y1={225.015}
x2={764.986}
y2={789.255}
>
<stop
offset={0}
style={{
stopColor: "rgba(var(--color-logo-start))",
}}
/>
<stop
offset={1}
style={{
stopColor: "rgba(var(--color-logo-stop))",
}}
/>
</linearGradient>
<path
d="M721.8 250.3c0-32.7 22.4-59.3 50.1-59.3H253.1c-27.7 0-50.1 26.5-50.1 59.3v582.2l90.2-75.7-.1-130.3H375v61.8l88-73.8 258.8 217.9V250.6"
style={{
stopColor: "rgba(var(--color-logo-stop))",
fill: "url(#homepage_logo_gradient)",
}}
/>
</linearGradient>
<path
d="M721.8 250.3c0-32.7 22.4-59.3 50.1-59.3H253.1c-27.7 0-50.1 26.5-50.1 59.3v582.2l90.2-75.7-.1-130.3H375v61.8l88-73.8 258.8 217.9V250.6"
style={{
fill: "url(#homepage_logo_gradient)",
}}
/>
</g>
</svg>
</g>
</svg>
}
</div>
);
)
}
+1 -1
View File
@@ -1,4 +1,4 @@
import mapIcon from "utils/weather/owm-condition-map";
import mapIcon from "utils/weather/openmeteo-condition-map";
export default function Icon({ condition, timeOfDay }) {
const IconComponent = mapIcon(condition, timeOfDay);
+1 -1
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>
);
+1 -1
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>
);
+3 -3
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>
);
@@ -52,7 +52,7 @@ export default function Memory({ expanded }) {
<div className="flex flex-col ml-3 text-left min-w-[85px]">
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5">
{t("common.bytes", { value: data.memory.freeMemMb * 1024 * 1024, maximumFractionDigits: 0, binary: true })}
{t("common.bytes", { value: data.memory.freeMemMb * 1024 * 1024, maximumFractionDigits: 1, binary: true })}
</div>
<div className="pr-1">{t("resources.free")}</div>
</span>
@@ -61,7 +61,7 @@ export default function Memory({ expanded }) {
<div className="pl-0.5">
{t("common.bytes", {
value: data.memory.totalMemMb * 1024 * 1024,
maximumFractionDigits: 0,
maximumFractionDigits: 1,
binary: true,
})}
</div>
+35 -8
View File
@@ -14,7 +14,8 @@ export default async function handler(req, res) {
}
try {
const docker = new Docker(getDockerArguments(containerServer));
const dockerArgs = getDockerArguments(containerServer);
const docker = new Docker(dockerArgs.conn);
const containers = await docker.listContainers({
all: true,
});
@@ -31,18 +32,44 @@ export default async function handler(req, res) {
const containerNames = containers.map((container) => container.Names[0].replace(/^\//, ""));
const containerExists = containerNames.includes(containerName);
if (!containerExists) {
res.status(200).send({
error: "not found",
if (containerExists) {
const container = docker.getContainer(containerName);
const stats = await container.stats({ stream: false });
res.status(200).json({
stats,
});
return;
}
const container = docker.getContainer(containerName);
const stats = await container.stats({ stream: false });
// Try with a service deployed in Docker Swarm, if enabled
if (dockerArgs.swarm) {
const tasks = await docker.listTasks({
filters: {
service: [containerName],
// A service can have several offline containers, so we only look for an active one.
"desired-state": ["running"],
},
})
.catch(() => []);
res.status(200).json({
stats,
// For now we are only interested in the first one (in case replicas > 1).
// TODO: Show the result for all replicas/containers?
const taskContainerId = tasks.at(0)?.Status?.ContainerStatus?.ContainerID;
if (taskContainerId) {
const container = docker.getContainer(taskContainerId);
const stats = await container.stats({ stream: false });
res.status(200).json({
stats,
});
return;
}
}
res.status(200).send({
error: "not found",
});
} catch {
res.status(500).send({
+35 -9
View File
@@ -13,7 +13,8 @@ export default async function handler(req, res) {
}
try {
const docker = new Docker(getDockerArguments(containerServer));
const dockerArgs = getDockerArguments(containerServer);
const docker = new Docker(dockerArgs.conn);
const containers = await docker.listContainers({
all: true,
});
@@ -29,18 +30,43 @@ export default async function handler(req, res) {
const containerNames = containers.map((container) => container.Names[0].replace(/^\//, ""));
const containerExists = containerNames.includes(containerName);
if (!containerExists) {
return res.status(200).send({
error: "not found",
if (containerExists) {
const container = docker.getContainer(containerName);
const info = await container.inspect();
return res.status(200).json({
status: info.State.Status,
health: info.State.Health?.Status,
});
}
const container = docker.getContainer(containerName);
const info = await container.inspect();
if (dockerArgs.swarm) {
const tasks = await docker.listTasks({
filters: {
service: [containerName],
// A service can have several offline containers, we only look for an active one.
"desired-state": ["running"],
},
})
.catch(() => []);
return res.status(200).json({
status: info.State.Status,
health: info.State.Health?.Status
// For now we are only interested in the first one (in case replicas > 1).
// TODO: Show the result for all replicas/containers?
const taskContainerId = tasks.at(0)?.Status?.ContainerStatus?.ContainerID;
if (taskContainerId) {
const container = docker.getContainer(taskContainerId);
const info = await container.inspect();
return res.status(200).json({
status: info.State.Status,
health: info.State.Health?.Status,
});
}
}
return res.status(200).send({
error: "not found",
});
} catch {
return res.status(500).send({
+10 -3
View File
@@ -15,11 +15,18 @@ export default async function handler(req, res) {
});
}
const startTime = performance.now();
const [status] = await httpProxy(pingURL, {
let startTime = performance.now();
let [status] = await httpProxy(pingURL, {
method: "HEAD"
});
const endTime = performance.now();
let endTime = performance.now();
if (status >= 400) {
// try one more time as a GET in case HEAD is rejected for whatever reason
startTime = performance.now();
[status] = await httpProxy(pingURL);
endTime = performance.now();
}
return res.status(200).json({
status,
+6
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));
}
+3 -2
View File
@@ -1,8 +1,9 @@
import cachedFetch from "utils/proxy/cached-fetch";
export default async function handler(req, res) {
const { latitude, longitude, units, cache } = req.query;
const { latitude, longitude, units, cache, timezone } = req.query;
const degrees = units === "imperial" ? "fahrenheit" : "celsius";
const apiUrl = `https://api.open-meteo.com/v1/forecast?latitude=${latitude}&longitude=${longitude}&daily=sunrise,sunset&current_weather=true&temperature_unit=${degrees}&timezone=auto`;
const timezeone = timezone ?? 'auto'
const apiUrl = `https://api.open-meteo.com/v1/forecast?latitude=${latitude}&longitude=${longitude}&daily=sunrise,sunset&current_weather=true&temperature_unit=${degrees}&timezone=${timezeone}`;
return res.send(await cachedFetch(apiUrl, cache));
}
+6 -3
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 = {};
}
+5 -2
View File
@@ -22,11 +22,14 @@ export default function getDockerArguments(server) {
if (servers[server]) {
if (servers[server].socket) {
return { socketPath: servers[server].socket };
return { conn: { socketPath: servers[server].socket }, swarm: !!servers[server].swarm };
}
if (servers[server].host) {
return { host: servers[server].host, port: servers[server].port || null };
return {
conn: { host: servers[server].host, port: servers[server].port || null },
swarm: !!servers[server].swarm,
};
}
return servers[server];
+34 -27
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));
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: [] };
}
})
);
@@ -118,6 +123,7 @@ export function cleanServiceGroups(groups) {
container,
currency, // coinmarketcap widget
symbols,
defaultinterval
} = cleanedService.widget;
cleanedService.widget = {
@@ -129,6 +135,7 @@ export function cleanServiceGroups(groups) {
if (currency) cleanedService.widget.currency = currency;
if (symbols) cleanedService.widget.symbols = symbols;
if (defaultinterval) cleanedService.widget.defaultinterval = defaultinterval;
if (type === "docker") {
if (server) cleanedService.widget.server = server;
+12 -2
View File
@@ -7,7 +7,7 @@ import widgets from "widgets/widgets";
const logger = createLogger("credentialedProxyHandler");
export default async function credentialedProxyHandler(req, res) {
export default async function credentialedProxyHandler(req, res, map) {
const { group, service, endpoint } = req.query;
if (group && service) {
@@ -30,12 +30,16 @@ export default async function credentialedProxyHandler(req, res) {
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") {
headers["X-API-Token"] = `${widget.key}`;
} else if (widget.type === "tubearchivist") {
headers.Authorization = `Token ${widget.key}`;
} else if (widget.type === "miniflux") {
headers["X-Auth-Token"] = `${widget.key}`;
} else {
headers["X-API-Key"] = `${widget.key}`;
}
@@ -47,6 +51,8 @@ export default async function credentialedProxyHandler(req, res) {
headers,
});
let resultData = data;
if (status === 204 || status === 304) {
return res.status(status).end();
}
@@ -59,8 +65,12 @@ export default async function credentialedProxyHandler(req, res) {
return res.status(500).json({error: {message: "Invalid data", url, data}});
}
if (status === 200 && map) {
resultData = map(data);
}
if (contentType) res.setHeader("Content-Type", contentType);
return res.status(status).send(data);
return res.status(status).send(resultData);
}
}
@@ -0,0 +1,211 @@
import * as Icons from "react-icons/wi";
// see https://open-meteo.com/en/docs
const conditions = [
{
code: 1,
icon: {
day: Icons.WiDayCloudy,
night: Icons.WiNightAltCloudy,
},
},
{
code: 2,
icon: {
day: Icons.WiDayCloudy,
night: Icons.WiNightAltCloudy,
},
},
{
code: 3,
icon: {
day: Icons.WiDayCloudy,
night: Icons.WiNightAltCloudy,
},
},
{
code: 45,
icon: {
day: Icons.WiDayFog,
night: Icons.WiNightFog,
},
},
{
code: 48,
icon: {
day: Icons.WiDayFog,
night: Icons.WiNightFog,
},
},
{
code: 51,
icon: {
day: Icons.WiDaySprinkle,
night: Icons.WiNightAltSprinkle,
},
},
{
code: 53,
icon: {
day: Icons.WiDaySprinkle,
night: Icons.WiNightAltSprinkle,
},
},
{
code: 55,
icon: {
day: Icons.WiDaySprinkle,
night: Icons.WiNightAltSprinkle,
},
},
{
code: 56,
icon: {
day: Icons.WiDaySleet,
night: Icons.WiNightAltSleet,
},
},
{
code: 57,
icon: {
day: Icons.WiDaySleet,
night: Icons.WiNightAltSleet,
},
},
{
code: 61,
icon: {
day: Icons.WiDayShowers,
night: Icons.WiNightAltShowers,
},
},
{
code: 63,
icon: {
day: Icons.WiDayShowers,
night: Icons.WiNightAltShowers,
},
},
{
code: 65,
icon: {
day: Icons.WiDayShowers,
night: Icons.WiNightAltShowers,
},
},
{
code: 66,
icon: {
day: Icons.WiDaySleet,
night: Icons.WiNightAltSleet,
},
},
{
code: 67,
icon: {
day: Icons.WiDaySleet,
night: Icons.WiNightAltSleet,
},
},
{
code: 71,
icon: {
day: Icons.WiDaySnow,
night: Icons.WiNightAltSnow,
},
},
{
code: 73,
icon: {
day: Icons.WiDaySnow,
night: Icons.WiNightAltSnow,
},
},
{
code: 75,
icon: {
day: Icons.WiDaySnow,
night: Icons.WiNightAltSnow,
},
},
{
code: 77,
icon: {
day: Icons.WiDaySnow,
night: Icons.WiNightAltSnow,
},
},
{
code: 80,
icon: {
day: Icons.WiDaySnow,
night: Icons.WiNightAltSnow,
},
},
{
code: 81,
icon: {
day: Icons.WiDaySnow,
night: Icons.WiNightAltSnow,
},
},
{
code: 82,
icon: {
day: Icons.WiDaySnow,
night: Icons.WiNightAltSnow,
},
},
{
code: 85,
icon: {
day: Icons.WiDaySnow,
night: Icons.WiNightAltSnow,
},
},
{
code: 86,
icon: {
day: Icons.WiDaySnow,
night: Icons.WiNightAltSnow,
},
},
{
code: 95,
icon: {
day: Icons.WiDayThunderstorm,
night: Icons.WiNightAltThunderstorm,
},
},
{
code: 96,
icon: {
day: Icons.WiDayThunderstorm,
night: Icons.WiNightAltThunderstorm,
},
},
{
code: 99,
icon: {
day: Icons.WiDayThunderstorm,
night: Icons.WiNightAltThunderstorm,
},
},
];
export default function mapIcon(weatherStatusCode, timeOfDay) {
const mapping = conditions.find((condition) => condition.code === weatherStatusCode);
if (mapping) {
if (timeOfDay === "day") {
return mapping.icon.day;
}
if (timeOfDay === "night") {
return mapping.icon.night;
}
}
return Icons.WiDaySunny;
}
+3 -2
View File
@@ -17,11 +17,12 @@ export default function Component({ service }) {
{ label: t("coinmarketcap.30days"), value: "30d" },
];
const [dateRange, setDateRange] = useState(dateRangeOptions[0].value);
const { widget } = service;
const { symbols } = widget;
const currencyCode = widget.currency ?? "USD";
const interval = widget.defaultinterval ?? dateRangeOptions[0].value;
const [dateRange, setDateRange] = useState(interval);
const { data: statsData, error: statsError } = useWidgetAPI(widget, "v1/cryptocurrency/quotes/latest", {
symbol: `${symbols.join(",")}`,
+9
View File
@@ -8,8 +8,10 @@ const components = {
changedetectionio: dynamic(() => import("./changedetectionio/component")),
coinmarketcap: dynamic(() => import("./coinmarketcap/component")),
deluge: dynamic(() => import("./deluge/component")),
downloadstation: dynamic(() => import("./downloadstation/component")),
docker: dynamic(() => import("./docker/component")),
emby: dynamic(() => import("./emby/component")),
flood: dynamic(() => import("./flood/component")),
gluetun: dynamic(() => import("./gluetun/component")),
gotify: dynamic(() => import("./gotify/component")),
hdhomerun: dynamic(() => import("./hdhomerun/component")),
@@ -19,10 +21,15 @@ const components = {
jellyseerr: dynamic(() => import("./jellyseerr/component")),
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")),
@@ -41,12 +48,14 @@ const components = {
speedtest: dynamic(() => import("./speedtest/component")),
strelaysrv: dynamic(() => import("./strelaysrv/component")),
tautulli: dynamic(() => import("./tautulli/component")),
tdarr: dynamic(() => import("./tdarr/component")),
traefik: dynamic(() => import("./traefik/component")),
transmission: dynamic(() => import("./transmission/component")),
tubearchivist: dynamic(() => import("./tubearchivist/component")),
truenas: dynamic(() => import("./truenas/component")),
unifi: dynamic(() => import("./unifi/component")),
watchtower: dynamic(() => import("./watchtower/component")),
xteve: dynamic(() => import("./xteve/component")),
};
export default components;
+7 -7
View File
@@ -13,8 +13,8 @@ const dataParams = [
];
const loginMethod = "auth.login";
async function sendRpc(url, method, params, username, password) {
const [status, contentType, data] = await sendJsonRpcRequest(url, method, params, username, password);
async function sendRpc(url, method, params) {
const [status, contentType, data] = await sendJsonRpcRequest(url, method, params);
const json = JSON.parse(data.toString());
if (json?.error) {
if (json.error.code === 1) {
@@ -26,8 +26,8 @@ async function sendRpc(url, method, params, username, password) {
return [status, contentType, data];
}
function login(url, username, password) {
return sendRpc(url, loginMethod, [password], username, password);
function login(url, password) {
return sendRpc(url, loginMethod, [password]);
}
export default async function delugeProxyHandler(req, res) {
@@ -48,15 +48,15 @@ export default async function delugeProxyHandler(req, res) {
const api = widgets?.[widget.type]?.api
const url = new URL(formatApiCall(api, { ...widget }));
let [status, contentType, data] = await sendRpc(url, dataMethod, dataParams, widget.username, widget.password);
let [status, contentType, data] = await sendRpc(url, dataMethod, dataParams);
if (status === 403) {
[status, contentType, data] = await login(url, widget.username, widget.password);
[status, contentType, data] = await login(url, widget.password);
if (status !== 200) {
return res.status(status).end(data);
}
// eslint-disable-next-line no-unused-vars
[status, contentType, data] = await sendRpc(url, dataMethod, dataParams, widget.username, widget.password);
[status, contentType, data] = await sendRpc(url, dataMethod, dataParams);
}
return res.status(status).end(data);
+3 -1
View File
@@ -46,7 +46,9 @@ export default function Component({ service }) {
return (
<Container service={service}>
<Block label="docker.cpu" value={t("common.percent", { value: calculateCPUPercent(statsData.stats) })} />
<Block label="docker.mem" value={t("common.bytes", { value: statsData.stats.memory_stats.usage })} />
{statsData.stats.memory_stats.usage &&
<Block label="docker.mem" value={t("common.bytes", { value: statsData.stats.memory_stats.usage })} />
}
{network && (
<>
<Block label="docker.rx" value={t("common.bytes", { value: network.rx_bytes })} />
+41
View File
@@ -0,0 +1,41 @@
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: listData, error: listError } = useWidgetAPI(widget, "list");
if (listError) {
return <Container error={listError} />;
}
const tasks = listData?.data?.tasks;
if (!tasks) {
return (
<Container service={service}>
<Block label="downloadstation.leech" />
<Block label="downloadstation.download" />
<Block label="downloadstation.seed" />
<Block label="downloadstation.upload" />
</Container>
);
}
const rateDl = tasks.reduce((acc, task) => acc + (task?.additional?.transfer?.speed_download ?? 0), 0);
const rateUl = tasks.reduce((acc, task) => acc + (task?.additional?.transfer?.speed_upload ?? 0), 0);
const completed = tasks.filter((task) => task?.additional?.transfer?.size_downloaded === task?.size)?.length || 0;
const leech = tasks.length - completed || 0;
return (
<Container service={service}>
<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>
);
}
+88
View File
@@ -0,0 +1,88 @@
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("downloadstationProxyHandler");
async function login(loginUrl) {
const [status, contentType, data] = await httpProxy(loginUrl);
if (status !== 200) {
return [status, contentType, data];
}
const json = JSON.parse(data.toString());
if (json?.success !== true) {
// from https://global.download.synology.com/download/Document/Software/DeveloperGuide/Package/DownloadStation/All/enu/Synology_Download_Station_Web_API.pdf
/*
Code Description
400 No such account or incorrect password
401 Account disabled
402 Permission denied
403 2-step verification code required
404 Failed to authenticate 2-step verification code
*/
let message = "Authentication failed.";
if (json?.error?.code >= 403) message += " 2FA enabled.";
logger.warn("Unable to login. Code: %d", json?.error?.code);
return [401, "application/json", JSON.stringify({ code: json?.error?.code, message })];
}
return [status, contentType, data];
}
export default async function downloadstationProxyHandler(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 });
let [status, contentType, data] = await httpProxy(url);
if (status !== 200) {
logger.debug("Error %d calling endpoint %s", status, url);
return res.status(status, data);
}
const json = JSON.parse(data.toString());
if (json?.success !== true) {
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)
}
[status, contentType, data] = await httpProxy(url);
}
if (contentType) res.setHeader("Content-Type", contentType);
return res.status(status).send(data);
}
+14
View File
@@ -0,0 +1,14 @@
import downloadstationProxyHandler from "./proxy";
const widget = {
api: "{url}/webapi/DownloadStation/task.cgi?api=SYNO.DownloadStation.Task&version=1&method={endpoint}",
proxyHandler: downloadstationProxyHandler,
mappings: {
"list": {
endpoint: "list&additional=transfer",
},
},
};
export default widget;
+53
View File
@@ -0,0 +1,53 @@
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: torrentData, error: torrentError } = useWidgetAPI(widget, "torrents");
if (torrentError || !torrentData?.torrents) {
return <Container error={torrentError ?? {message: "No torrent data returned"}} />;
}
if (!torrentData || !torrentData.torrents) {
return (
<Container service={service}>
<Block label="flood.leech" />
<Block label="flood.download" />
<Block label="flood.seed" />
<Block label="flood.upload" />
</Container>
);
}
let rateDl = 0;
let rateUl = 0;
let completed = 0;
let leech = 0;
Object.values(torrentData.torrents).forEach(torrent => {
rateDl += torrent.downRate;
rateUl += torrent.upRate;
if(torrent.status.includes('complete')){
completed += 1;
}
if(torrent.status.includes('downloading')){
leech += 1;
}
})
return (
<Container service={service}>
<Block label="flood.leech" value={t("common.number", { value: leech })} />
<Block label="flood.download" value={t("common.bitrate", { value: rateDl })} />
<Block label="flood.seed" value={t("common.number", { value: completed })} />
<Block label="flood.upload" value={t("common.bitrate", { value: rateUl })} />
</Container>
);
}
+66
View File
@@ -0,0 +1,66 @@
import { formatApiCall } from "utils/proxy/api-helpers";
import { httpProxy } from "utils/proxy/http";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
const logger = createLogger("floodProxyHandler");
async function login(widget) {
logger.debug("flood is rejecting the request, logging in.");
const loginUrl = new URL(`${widget.url}/api/auth/authenticate`).toString();
const loginParams = {
method: "POST",
headers: { "Content-Type": "application/json" },
body: null
};
if (widget.username && widget.password) {
loginParams.body = JSON.stringify({
"username": widget.username,
"password": widget.password
});
}
// eslint-disable-next-line no-unused-vars
const [status, contentType, data] = await httpProxy(loginUrl, loginParams);
return [status, data];
}
export default async function floodProxyHandler(req, res) {
const { group, service, endpoint } = req.query;
if (!group || !service) {
logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
return res.status(400).json({ error: "Invalid proxy service type" });
}
const widget = await getServiceWidget(group, service);
if (!widget) {
logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
return res.status(400).json({ error: "Invalid proxy service type" });
}
const url = new URL(formatApiCall("{url}/api/{endpoint}", { endpoint, ...widget }));
const params = { method: "GET", headers: {} };
let [status, contentType, data] = await httpProxy(url, params);
if (status === 401) {
[status, data] = await login(widget);
if (status !== 200) {
logger.error("HTTP %d logging in to flood. Data: %s", status, data);
return res.status(status).end(data);
}
[status, contentType, data] = await httpProxy(url, params);
}
if (status !== 200) {
logger.error("HTTP %d getting data from flood. Data: %s", status, data);
}
if (contentType) res.setHeader("Content-Type", contentType);
return res.status(status).send(data);
}
+7
View File
@@ -0,0 +1,7 @@
import floodProxyHandler from "./proxy";
const widget = {
proxyHandler: floodProxyHandler,
};
export default widget;
+12 -11
View File
@@ -10,7 +10,7 @@ const proxyName = "homebridgeProxyHandler";
const sessionTokenCacheKey = `${proxyName}__sessionToken`;
const logger = createLogger(proxyName);
async function login(widget) {
async function login(widget, service) {
const endpoint = "auth/login";
const api = widgets?.[widget.type]?.api
const loginUrl = new URL(formatApiCall(api, { endpoint, ...widget }));
@@ -26,7 +26,7 @@ async function login(widget) {
try {
const { access_token: accessToken, expires_in: expiresIn } = JSON.parse(data.toString());
cache.put(sessionTokenCacheKey, accessToken, (expiresIn * 1000) - 5 * 60 * 1000); // expiresIn (s) - 5m
cache.put(`${sessionTokenCacheKey}.${service}`, accessToken, (expiresIn * 1000) - 5 * 60 * 1000); // expiresIn (s) - 5m
return { accessToken };
} catch (e) {
logger.error("Unable to login to Homebridge API: %s", e);
@@ -35,10 +35,11 @@ async function login(widget) {
return { accessToken: false };
}
async function apiCall(widget, endpoint) {
async function apiCall(widget, endpoint, service) {
const key = `${sessionTokenCacheKey}.${service}`;
const headers = {
"content-type": "application/json",
"Authorization": `Bearer ${cache.get(sessionTokenCacheKey)}`,
"Authorization": `Bearer ${cache.get(key)}`,
}
const url = new URL(formatApiCall(widgets[widget.type].api, { endpoint, ...widget }));
@@ -51,7 +52,7 @@ async function apiCall(widget, endpoint) {
if (status === 401) {
logger.debug("Homebridge API rejected the request, attempting to obtain new session token");
const { accessToken } = login(widget);
const { accessToken } = login(widget, service);
headers.Authorization = `Bearer ${accessToken}`;
// retry the request, now with the new session token
@@ -83,14 +84,14 @@ export default async function homebridgeProxyHandler(req, res) {
return res.status(400).json({ error: "Invalid proxy service type" });
}
if (!cache.get(sessionTokenCacheKey)) {
await login(widget);
if (!cache.get(`${sessionTokenCacheKey}.${service}`)) {
await login(widget, service);
}
const { data: statusData } = await apiCall(widget, "status/homebridge");
const { data: versionData } = await apiCall(widget, "status/homebridge-version");
const { data: childBridgeData } = await apiCall(widget, "status/homebridge/child-bridges");
const { data: pluginsData } = await apiCall(widget, "plugins");
const { data: statusData } = await apiCall(widget, "status/homebridge", service);
const { data: versionData } = await apiCall(widget, "status/homebridge-version", service);
const { data: childBridgeData } = await apiCall(widget, "status/homebridge/child-bridges", service);
const { data: pluginsData } = await apiCall(widget, "plugins", service);
return res.status(200).send({
status: statusData?.status,
+43
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>
);
}
+24
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;
+33
View File
@@ -0,0 +1,33 @@
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: minifluxData, error: minifluxError } = useWidgetAPI(widget, "counters");
if (minifluxError) {
return <Container error={minifluxError} />;
}
if (!minifluxData) {
return (
<Container service={service}>
<Block label="miniflux.unread" />
<Block label="miniflux.read" />
</Container>
);
}
return (
<Container service={service}>
<Block label="miniflux.unread" value={t("common.number", { value: minifluxData.unread })} />
<Block label="miniflux.read" value={t("common.number", { value: minifluxData.read })} />
</Container>
);
}
+19
View File
@@ -0,0 +1,19 @@
import { asJson } from "utils/proxy/api-helpers";
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
const widget = {
api: "{url}/v1/{endpoint}",
proxyHandler: credentialedProxyHandler,
mappings: {
counters: {
endpoint: "feeds/counters",
map: (data) => ({
read: Object.values(asJson(data).reads).reduce((acc, i) => acc + i, 0),
unread: Object.values(asJson(data).unreads).reduce((acc, i) => acc + i, 0)
}),
},
}
};
export default widget;
+39
View File
@@ -0,0 +1,39 @@
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: nextdnsData, error: nextdnsError } = useWidgetAPI(widget, "analytics/status");
if (nextdnsError) {
return <Container error={nextdnsError} />;
}
if (!nextdnsData) {
return (
<Container service={service}>
<Block key="status" label="widget.status" value={t("nextdns.wait")} />
</Container>
);
}
if (!nextdnsData?.data?.length) {
return (
<Container service={service}>
<Block key="status" label="widget.status" value={t("nextdns.no_devices")} />
</Container>
);
}
return (
<Container service={service}>
{nextdnsData.data.map(d => <Block key={d.status} label={d.status} value={t("common.number", { value: d.queries })} />)}
</Container>
);
}
+17
View File
@@ -0,0 +1,17 @@
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
const widget = {
api: "https://api.nextdns.io/profiles/{profile}/{endpoint}",
proxyHandler: credentialedProxyHandler,
mappings: {
"analytics/status": {
endpoint: "analytics/status",
validate: [
"data",
]
},
},
};
export default widget;
+17 -11
View File
@@ -10,7 +10,7 @@ const proxyName = "npmProxyHandler";
const tokenCacheKey = `${proxyName}__token`;
const logger = createLogger(proxyName);
async function login(loginUrl, username, password) {
async function login(loginUrl, username, password, service) {
const authResponse = await httpProxy(loginUrl, {
method: "POST",
body: JSON.stringify({ identity: username, secret: password }),
@@ -20,12 +20,18 @@ async function login(loginUrl, username, password) {
});
const status = authResponse[0];
const data = JSON.parse(Buffer.from(authResponse[2]).toString());
let data = authResponse[2];
if (status === 200) {
cache.put(tokenCacheKey, data.token);
try {
data = JSON.parse(Buffer.from(authResponse[2]).toString());
if (status === 200) {
const expiration = new Date(data.expires) - Date.now();
cache.put(`${tokenCacheKey}.${service}`, data.token, expiration - (5 * 60 * 1000)); // expiration -5 minutes
}
} catch (e) {
logger.error(`Error ${status} logging into npm`, authResponse[2]);
}
return [status, data.token ?? data];
}
@@ -47,12 +53,12 @@ export default async function npmProxyHandler(req, res) {
let contentType;
let data;
let token = cache.get(tokenCacheKey);
let token = cache.get(`${tokenCacheKey}.${service}`);
if (!token) {
[status, token] = await login(loginUrl, widget.username, widget.password);
[status, token] = await login(loginUrl, widget.username, widget.password, service);
if (status !== 200) {
logger.debug(`HTTTP ${status} logging into npm api: ${data}`);
return res.status(status).send(data);
logger.debug(`HTTTP ${status} logging into npm api: ${token}`);
return res.status(status).send(token);
}
}
@@ -66,8 +72,8 @@ export default async function npmProxyHandler(req, res) {
if (status === 403) {
logger.debug(`HTTTP ${status} retrieving data from npm api, logging in and trying again.`);
cache.del(tokenCacheKey);
[status, token] = await login(loginUrl, widget.username, widget.password);
cache.del(`${tokenCacheKey}.${service}`);
[status, token] = await login(loginUrl, widget.username, widget.password, service);
if (status !== 200) {
logger.debug(`HTTTP ${status} logging into npm api: ${data}`);
+39
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
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" });
}
+7
View File
@@ -0,0 +1,7 @@
import omadaProxyHandler from "./proxy";
const widget = {
proxyHandler: omadaProxyHandler,
};
export default widget;
+48
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>
);
}
+24
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;
+8 -3
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");
@@ -15,6 +18,7 @@ export default function Component({ service }) {
return (
<Container service={service}>
<Block label="overseerr.pending" />
<Block label="overseerr.processing" />
<Block label="overseerr.approved" />
<Block label="overseerr.available" />
</Container>
@@ -23,9 +27,10 @@ export default function Component({ service }) {
return (
<Container service={service}>
<Block label="overseerr.pending" value={statsData.pending} />
<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>
);
}
+1
View File
@@ -9,6 +9,7 @@ const widget = {
endpoint: "request/count",
validate: [
"pending",
"processing",
"approved",
"available",
],
+4 -4
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>
);
}
+3 -3
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",
+13 -9
View File
@@ -58,6 +58,9 @@ async function fetchFromPlexAPI(endpoint, widget) {
export default async function plexProxyHandler(req, res) {
const widget = await getWidget(req);
const { service } = req.query;
if (!widget) {
return res.status(400).json({ error: "Invalid proxy service type" });
}
@@ -74,23 +77,24 @@ export default async function plexProxyHandler(req, res) {
streams = apiData.MediaContainer._attributes.size;
}
let libraries = cache.get(librariesCacheKey);
let libraries = cache.get(`${librariesCacheKey}.${service}`);
if (libraries === null) {
logger.debug("Getting libraries from Plex API");
[status, apiData] = await fetchFromPlexAPI("/library/sections", widget);
if (apiData && apiData.MediaContainer) {
libraries = apiData.MediaContainer.Directory;
cache.put(librariesCacheKey, libraries, 1000 * 60 * 60 * 6);
libraries = [].concat(apiData.MediaContainer.Directory);
cache.put(`${librariesCacheKey}.${service}`, libraries, 1000 * 60 * 60 * 6);
}
}
let movies = cache.get(moviesCacheKey);
let tv = cache.get(tvCacheKey);
let movies = cache.get(`${moviesCacheKey}.${service}`);
let tv = cache.get(`${tvCacheKey}.${service}`);
if (movies === null || tv === null) {
movies = 0;
tv = 0;
logger.debug("Getting movie + tv counts from Plex API");
libraries.filter(l => ["movie", "show"].includes(l._attributes.type)).forEach(async (library) => {
const movieTVLibraries = libraries.filter(l => ["movie", "show"].includes(l._attributes.type));
await Promise.all(movieTVLibraries.map(async (library) => {
[status, apiData] = await fetchFromPlexAPI(`/library/sections/${library._attributes.key}/all`, widget);
if (apiData && apiData.MediaContainer) {
const size = parseInt(apiData.MediaContainer._attributes.size, 10);
@@ -100,9 +104,9 @@ export default async function plexProxyHandler(req, res) {
tv += size;
}
}
cache.put(tvCacheKey, tv, 1000 * 60 * 10);
cache.put(moviesCacheKey, movies, 1000 * 60 * 10);
});
}));
cache.put(`${tvCacheKey}.${service}`, tv, 1000 * 60 * 10);
cache.put(`${moviesCacheKey}.${service}`, movies, 1000 * 60 * 10);
}
const data = {
+8 -5
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>
);
}
+16 -16
View File
@@ -11,7 +11,7 @@ const logger = createLogger(proxyName);
const sessionCacheKey = `${proxyName}__sessionId`;
const isNgCacheKey = `${proxyName}__isNg`;
async function fetchFromPyloadAPI(url, sessionId, params) {
async function fetchFromPyloadAPI(url, sessionId, params, service) {
const options = {
body: params
? Object.keys(params)
@@ -25,10 +25,10 @@ async function fetchFromPyloadAPI(url, sessionId, params) {
};
// see https://github.com/benphelps/homepage/issues/517
const isNg = cache.get(isNgCacheKey);
const isNg = cache.get(`${isNgCacheKey}.${service}`);
if (isNg && !params) {
delete options.body;
options.headers.Cookie = cache.get(sessionCacheKey);
options.headers.Cookie = cache.get(`${sessionCacheKey}.${service}`);
}
// eslint-disable-next-line no-unused-vars
@@ -43,19 +43,19 @@ async function fetchFromPyloadAPI(url, sessionId, params) {
return [status, returnData, responseHeaders];
}
async function login(loginUrl, username, password = '') {
const [status, sessionId, responseHeaders] = await fetchFromPyloadAPI(loginUrl, null, { username, password });
async function login(loginUrl, service, username, password = '') {
const [status, sessionId, responseHeaders] = await fetchFromPyloadAPI(loginUrl, null, { username, password }, service);
// this API actually returns status 200 even on login failure
if (status !== 200 || sessionId === false) {
logger.error(`HTTP ${status} logging into Pyload API, returned: ${JSON.stringify(sessionId)}`);
} else if (responseHeaders['set-cookie']?.join().includes('pyload_session')) {
// Support pyload-ng, see https://github.com/benphelps/homepage/issues/517
cache.put(isNgCacheKey, true);
cache.put(`${isNgCacheKey}.${service}`, true);
const sessionCookie = responseHeaders['set-cookie'][0];
cache.put(sessionCacheKey, sessionCookie, 60 * 60 * 23 * 1000); // cache for 23h
cache.put(`${sessionCacheKey}.${service}`, sessionCookie, 60 * 60 * 23 * 1000); // cache for 23h
} else {
cache.put(sessionCacheKey, sessionId);
cache.put(`${sessionCacheKey}.${service}`, sessionId);
}
return sessionId;
@@ -72,21 +72,21 @@ export default async function pyloadProxyHandler(req, res) {
const url = new URL(formatApiCall(widgets[widget.type].api, { endpoint, ...widget }));
const loginUrl = `${widget.url}/api/login`;
let sessionId = cache.get(sessionCacheKey) ?? await login(loginUrl, widget.username, widget.password);
let [status, data] = await fetchFromPyloadAPI(url, sessionId);
let sessionId = cache.get(`${sessionCacheKey}.${service}`) ?? await login(loginUrl, service, widget.username, widget.password);
let [status, data] = await fetchFromPyloadAPI(url, sessionId, null, service);
if (status === 403 || status === 401) {
logger.info('Failed to retrieve data from Pyload API, trying to login again...');
cache.del(sessionCacheKey);
sessionId = await login(loginUrl, widget.username, widget.password);
[status, data] = await fetchFromPyloadAPI(url, sessionId);
cache.del(`${sessionCacheKey}.${service}`);
sessionId = await login(loginUrl, service, widget.username, widget.password);
[status, data] = await fetchFromPyloadAPI(url, sessionId, null, service);
}
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' });
+2 -2
View File
@@ -44,9 +44,9 @@ export default function Component({ service }) {
return (
<Container service={service}>
<Block label="qbittorrent.leech" value={t("common.number", { value: leech })} />
<Block label="qbittorrent.download" value={t("common.bitrate", { value: rateDl })} />
<Block label="qbittorrent.download" value={t("common.bibyterate", { value: rateDl, decimals: 1 })} />
<Block label="qbittorrent.seed" value={t("common.number", { value: completed })} />
<Block label="qbittorrent.upload" value={t("common.bitrate", { value: rateUl })} />
<Block label="qbittorrent.upload" value={t("common.bibyterate", { value: rateUl, decimals: 1 })} />
</Container>
);
}
+7 -4
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>
);
}
+33 -8
View File
@@ -2,16 +2,37 @@ import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
import useWidgetAPI from "utils/proxy/use-widget-api";
// @see https://github.com/AnalogJ/scrutiny/blob/d8d56f77f9e868127c4849dac74d65512db658e8/webapp/frontend/src/app/shared/device-status.pipe.ts
const DeviceStatus = {
passed: 0,
failed_smart: 1,
failed_scrutiny: 2,
failed_both: 3,
isFailed(s){ return s > this.passed && s <= this.failed_both},
isUnknown(s){ return s < this.passed || s > this.failed_both}
}
// @see https://github.com/AnalogJ/scrutiny/blob/d8d56f77f9e868127c4849dac74d65512db658e8/webapp/frontend/src/app/core/config/app.config.ts
const DeviceStatusThreshold = {
smart: 1,
scrutiny: 2,
both: 3
}
export default function Component({ service }) {
const { widget } = service;
const { data: scrutinySettings, error: scrutinySettingsError } = useWidgetAPI(widget, "settings");
const { data: scrutinyData, error: scrutinyError } = useWidgetAPI(widget, "summary");
if (scrutinyError) {
return <Container error={scrutinyError} />;
if (scrutinyError || scrutinySettingsError) {
const finalError = scrutinyError ?? scrutinySettingsError;
return <Container error={finalError} />;
}
if (!scrutinyData) {
if (!scrutinyData || !scrutinySettings) {
return (
<Container service={service}>
<Block label="scrutiny.passed" />
@@ -19,13 +40,14 @@ export default function Component({ service }) {
<Block label="scrutiny.unknown" />
</Container>
);
}
}
const deviceIds = Object.values(scrutinyData.data.summary);
const passed = deviceIds.filter(deviceId => deviceId.device.device_status === 0)?.length || 0;
const failed = deviceIds.filter(deviceId => deviceId.device.device_status > 0 && deviceId.device.device_status <= 3)?.length || 0;
const unknown = deviceIds.length - (passed + failed) || 0;
const statusThreshold = scrutinySettings.settings.metrics.status_threshold;
const failed = deviceIds.filter(deviceId => (DeviceStatus.isFailed(deviceId.device.device_status) && statusThreshold === DeviceStatusThreshold.both) || [statusThreshold, DeviceStatus.failed_both].includes(deviceId.device.device_status))?.length || 0;
const unknown = deviceIds.filter(deviceId => DeviceStatus.isUnknown(deviceId.device.device_status))?.length || 0;
const passed = deviceIds.length - (failed + unknown);
return (
<Container service={service}>
@@ -33,5 +55,8 @@ export default function Component({ service }) {
<Block label="scrutiny.failed" value={failed} />
<Block label="scrutiny.unknown" value={unknown} />
</Container>
);
}
+6
View File
@@ -11,6 +11,12 @@ const widget = {
"data",
]
},
settings: {
endpoint: "settings",
validate: [
"settings",
]
}
},
};
+6 -3
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>
);
}
+2 -2
View File
@@ -29,9 +29,9 @@ export default function Component({ service }) {
<Container service={service}>
<Block
label="speedtest.download"
value={t("common.bitrate", { value: speedtestData.data.download * 1024 * 1024 })}
value={t("common.bitrate", { value: speedtestData.data.download * 1000 * 1000 })}
/>
<Block label="speedtest.upload" value={t("common.bitrate", { value: speedtestData.data.upload * 1024 * 1024 })} />
<Block label="speedtest.upload" value={t("common.bitrate", { value: speedtestData.data.upload * 1000 * 1000 })} />
<Block
label="speedtest.ping"
value={t("common.ms", {
+42
View File
@@ -0,0 +1,42 @@
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: tdarrData, error: tdarrError } = useWidgetAPI(widget);
if (tdarrError) {
return <Container error={tdarrError} />;
}
if (!tdarrData) {
return (
<Container service={service}>
<Block label="tdarr.queue" />
<Block label="tdarr.processed" />
<Block label="tdarr.errored" />
<Block label="tdarr.saved" />
</Container>
);
}
const queue = parseInt(tdarrData.table1Count, 10) + parseInt(tdarrData.table4Count, 10);
const processed = parseInt(tdarrData.table2Count, 10) + parseInt(tdarrData.table5Count, 10);
const errored = parseInt(tdarrData.table3Count, 10) + parseInt(tdarrData.table6Count, 10);
const saved = parseFloat(tdarrData.sizeDiff, 10) * 1000000000;
return (
<Container service={service}>
<Block label="tdarr.queue" value={t("common.number", { value: queue })} />
<Block label="tdarr.processed" value={t("common.number", { value: processed })} />
<Block label="tdarr.errored" value={t("common.number", { value: errored })} />
<Block label="tdarr.saved" value={t("common.bytes", { value: saved })} />
</Container>
);
}
+48
View File
@@ -0,0 +1,48 @@
import { httpProxy } from "utils/proxy/http";
import { formatApiCall } from "utils/proxy/api-helpers";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
import widgets from "widgets/widgets";
const proxyName = "tdarrProxyHandler";
const logger = createLogger(proxyName);
export default async function tdarrProxyHandler(req, res) {
const { group, service, endpoint } = req.query;
if (!group || !service) {
logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
return res.status(400).json({ error: "Invalid proxy service type" });
}
const widget = await getServiceWidget(group, service);
if (!widget) {
logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
return res.status(400).json({ error: "Invalid proxy service type" });
}
const url = new URL(formatApiCall(widgets[widget.type].api, { endpoint, ...widget }));
const [status, contentType, data] = await httpProxy(url, {
method: "POST",
body: JSON.stringify({
"data": {
"collection": "StatisticsJSONDB",
"mode": "getById",
"docID": "statistics"
},
}),
headers: {
"content-type": "application/json",
},
});
if (status !== 200) {
logger.error("Error getting data from Tdarr: %d. Data: %s", status, data);
return res.status(500).send({error: {message:"Error getting data from Tdarr", url, data}});
}
if (contentType) res.setHeader("Content-Type", contentType);
return res.status(status).send(data);
}
+8
View File
@@ -0,0 +1,8 @@
import tdarrProxyHandler from "./proxy";
const widget = {
api: "{url}/api/v2/cruddb",
proxyHandler: tdarrProxyHandler,
};
export default widget;
+3 -3
View File
@@ -25,12 +25,12 @@ export default async function transmissionProxyHandler(req, res) {
return res.status(400).json({ error: "Invalid proxy service type" });
}
let headers = cache.get(headerCacheKey);
let headers = cache.get(`${headerCacheKey}.${service}`);
if (!headers) {
headers = {
"content-type": "application/json",
}
cache.put(headerCacheKey, headers);
cache.put(`${headerCacheKey}.${service}`, headers);
}
const url = new URL(formatApiCall(widgets[widget.type].api, { endpoint, ...widget }));
@@ -55,7 +55,7 @@ export default async function transmissionProxyHandler(req, res) {
if (status === 409) {
logger.debug("Transmission is rejecting the request, but returning a CSRF token");
headers[csrfHeaderName] = responseHeaders[csrfHeaderName];
cache.put(headerCacheKey, headers);
cache.put(`${headerCacheKey}.${service}`, headers);
// retry the request, now with the CSRF token
[status, contentType, data, responseHeaders] = await httpProxy(url, {
+23 -1
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: {
+3 -2
View File
@@ -58,6 +58,7 @@ async function login(widget) {
export default async function unifiProxyHandler(req, res) {
const widget = await getWidget(req);
const { service } = req.query;
if (!widget) {
return res.status(400).json({ error: "Invalid proxy service type" });
}
@@ -68,7 +69,7 @@ export default async function unifiProxyHandler(req, res) {
}
let [status, contentType, data, responseHeaders] = [];
let prefix = cache.get(prefixCacheKey);
let prefix = cache.get(`${prefixCacheKey}.${service}`);
if (prefix === null) {
// auto detect if we're talking to a UDM Pro, and cache the result so that we
// don't make two requests each time data from Unifi is required
@@ -77,7 +78,7 @@ export default async function unifiProxyHandler(req, res) {
if (responseHeaders?.["x-csrf-token"]) {
prefix = udmpPrefix;
}
cache.put(prefixCacheKey, prefix);
cache.put(`${prefixCacheKey}.${service}`, prefix);
}
widget.prefix = prefix;
+19
View File
@@ -5,7 +5,9 @@ import bazarr from "./bazarr/widget";
import changedetectionio from "./changedetectionio/widget";
import coinmarketcap from "./coinmarketcap/widget";
import deluge from "./deluge/widget";
import downloadstation from "./downloadstation/widget";
import emby from "./emby/widget";
import flood from "./flood/widget";
import gluetun from "./gluetun/widget";
import gotify from "./gotify/widget";
import hdhomerun from "./hdhomerun/widget";
@@ -14,10 +16,15 @@ import jackett from "./jackett/widget";
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";
@@ -36,12 +43,14 @@ import sonarr from "./sonarr/widget";
import speedtest from "./speedtest/widget";
import strelaysrv from "./strelaysrv/widget";
import tautulli from "./tautulli/widget";
import tdarr from "./tdarr/widget";
import traefik from "./traefik/widget";
import transmission from "./transmission/widget";
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,
@@ -51,7 +60,10 @@ const widgets = {
changedetectionio,
coinmarketcap,
deluge,
diskstation: downloadstation,
downloadstation,
emby,
flood,
gluetun,
gotify,
hdhomerun,
@@ -61,10 +73,15 @@ const widgets = {
jellyseerr,
lidarr,
mastodon,
miniflux,
mikrotik,
navidrome,
nextdns,
npm,
nzbget,
omada,
ombi,
opnsense,
overseerr,
paperlessngx,
pihole,
@@ -83,6 +100,7 @@ const widgets = {
speedtest,
strelaysrv,
tautulli,
tdarr,
traefik,
transmission,
tubearchivist,
@@ -90,6 +108,7 @@ const widgets = {
unifi,
unifi_console: unifi,
watchtower,
xteve,
};
export default widgets;
Loaded 100 of 103 files, more files were not shown because too many files have changed in this diff. Show more