Compare commits

..

276 Commits

Author SHA1 Message Date
shamoon
3e01fc12e4 Merge pull request #1602 from benphelps/fix/issue-1599
Fix: Retrieve ping url from config rather than as query parameter
2023-06-11 10:04:34 -07:00
shamoon
1fb7be7457 Retrieve ping url from config rather than as query parameter 2023-06-11 09:50:41 -07:00
Dan
0d6ccb036e Translated using Weblate (Ukrainian)
Currently translated at 100.0% (465 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-06-11 16:47:46 +02:00
Nonoss117
7af36eb106 Translated using Weblate (French)
Currently translated at 100.0% (465 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-06-11 16:47:45 +02:00
gallegonovato
1d80955649 Translated using Weblate (Spanish)
Currently translated at 100.0% (465 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-06-11 16:47:45 +02:00
shamoon
a50e939123 Merge pull request #1596 from benphelps/revert-1574-widget-boxed
Revert "Added optional boxed styling for information widgets and refactored information widgets"
2023-06-10 23:30:55 -07:00
shamoon
6b2930ab8d Revert "Added optional boxed styling for information widgets and refactored information widgets" 2023-06-10 23:30:44 -07:00
Ben Phelps
347761fcad Merge pull request #1574 from denispapec/widget-boxed
Added optional boxed styling for information widgets and refactored information widgets
2023-06-11 08:02:20 +03:00
shamoon
2fabaa700b Merge pull request #1579 from denispapec/portainer-fix
Fixes for portainer and kubernetes and error component
2023-06-10 19:38:04 -07:00
shamoon
68b6192d8c Fix full height layout on tall screens 2023-06-09 09:01:19 -07:00
shamoon
0101e8ccb9 make portainer error detection more specific 2023-06-08 09:42:35 -07:00
shamoon
2da66b504b lint lidarr widget.js 2023-06-08 07:17:58 -07:00
Anonymous
b882065d5e Translated using Weblate (Indonesian)
Currently translated at 3.2% (15 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/id/
2023-06-08 16:17:16 +02:00
Anonymous
0be0fa71d3 Translated using Weblate (Slovenian)
Currently translated at 96.5% (449 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/
2023-06-08 16:17:16 +02:00
Anonymous
fe647fe67a Translated using Weblate (Greek)
Currently translated at 30.7% (143 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-06-08 16:17:16 +02:00
Anonymous
ee5fa003ee Translated using Weblate (Korean)
Currently translated at 37.2% (173 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ko/
2023-06-08 16:17:15 +02:00
Anonymous
19bcf40d31 Translated using Weblate (Slovak)
Currently translated at 1.9% (9 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sk/
2023-06-08 16:17:15 +02:00
Anonymous
d06d6f7e44 Translated using Weblate (Thai)
Currently translated at 10.1% (47 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/th/
2023-06-08 16:17:15 +02:00
Anonymous
b5c4e36a53 Translated using Weblate (Latvian)
Currently translated at 25.3% (118 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-06-08 16:17:14 +02:00
Anonymous
4382bab64b Translated using Weblate (Japanese)
Currently translated at 80.2% (373 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-06-08 16:17:14 +02:00
Anonymous
678819d065 Translated using Weblate (Ukrainian)
Currently translated at 99.7% (464 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-06-08 16:17:14 +02:00
Anonymous
1dea651d8b Translated using Weblate (Esperanto)
Currently translated at 31.1% (145 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-06-08 16:17:13 +02:00
Anonymous
c29e351afc Translated using Weblate (Hindi)
Currently translated at 1.9% (9 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-06-08 16:17:13 +02:00
Anonymous
2493e608e8 Translated using Weblate (Malay)
Currently translated at 53.9% (251 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-06-08 16:17:13 +02:00
Anonymous
bfb326bd73 Translated using Weblate (Danish)
Currently translated at 42.3% (197 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-06-08 16:17:12 +02:00
Anonymous
fabb65995c Translated using Weblate (Czech)
Currently translated at 95.4% (444 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-06-08 16:17:12 +02:00
Anonymous
1ca12714e0 Translated using Weblate (Arabic)
Currently translated at 55.9% (260 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-06-08 16:17:12 +02:00
Anonymous
36717ede61 Translated using Weblate (Serbian)
Currently translated at 1.9% (9 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-06-08 16:17:11 +02:00
Anonymous
7fc313cc73 Translated using Weblate (Turkish)
Currently translated at 84.5% (393 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-06-08 16:17:11 +02:00
Anonymous
6794fa1429 Translated using Weblate (Bulgarian)
Currently translated at 9.8% (46 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-06-08 16:17:11 +02:00
Anonymous
1097a46669 Translated using Weblate (Telugu)
Currently translated at 46.2% (215 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-06-08 16:17:10 +02:00
Anonymous
193582c8ae Translated using Weblate (Finnish)
Currently translated at 38.0% (177 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-06-08 16:17:10 +02:00
Anonymous
aacc2fae9d Translated using Weblate (Yue (Traditional))
Currently translated at 25.1% (117 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue_Hant/
2023-06-08 16:17:10 +02:00
Anonymous
ac99f65188 Translated using Weblate (Portuguese (Brazil))
Currently translated at 86.8% (404 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-06-08 16:17:09 +02:00
Anonymous
1f9ee368c6 Translated using Weblate (Romanian)
Currently translated at 32.2% (150 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-06-08 16:17:09 +02:00
Anonymous
4c4da54d99 Translated using Weblate (Hebrew)
Currently translated at 21.5% (100 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-06-08 16:17:09 +02:00
Anonymous
7d51a9b10c Translated using Weblate (Hungarian)
Currently translated at 23.0% (107 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-06-08 16:17:08 +02:00
Anonymous
e9722e8946 Translated using Weblate (Croatian)
Currently translated at 98.4% (458 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-06-08 16:17:08 +02:00
Anonymous
e03c891703 Translated using Weblate (Swedish)
Currently translated at 27.9% (130 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-06-08 16:17:08 +02:00
Anonymous
10cfe20e8a Translated using Weblate (Polish)
Currently translated at 80.4% (374 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-06-08 16:17:07 +02:00
Anonymous
fd74618b8f Translated using Weblate (Catalan)
Currently translated at 55.9% (260 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-06-08 16:17:07 +02:00
Anonymous
b72d894a30 Translated using Weblate (Chinese (Traditional))
Currently translated at 98.9% (460 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-06-08 16:17:07 +02:00
Anonymous
7ca6f36125 Translated using Weblate (Dutch)
Currently translated at 51.8% (241 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-06-08 16:17:06 +02:00
Anonymous
877a091fc0 Translated using Weblate (Vietnamese)
Currently translated at 9.4% (44 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-06-08 16:17:06 +02:00
Anonymous
6584a3194f Translated using Weblate (Norwegian Bokmål)
Currently translated at 16.9% (79 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-06-08 16:17:06 +02:00
Anonymous
8fa1831b31 Translated using Weblate (Italian)
Currently translated at 61.5% (286 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-06-08 16:17:05 +02:00
Anonymous
a01713c6e6 Translated using Weblate (Chinese (Simplified))
Currently translated at 95.2% (443 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-06-08 16:17:05 +02:00
Anonymous
637f745ee7 Translated using Weblate (Russian)
Currently translated at 88.8% (413 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-06-08 16:17:05 +02:00
Anonymous
8e89f39979 Translated using Weblate (Portuguese)
Currently translated at 86.8% (404 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-06-08 16:17:05 +02:00
Anonymous
2b0cddb05f Translated using Weblate (French)
Currently translated at 99.7% (464 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-06-08 16:17:04 +02:00
Anonymous
f780deca62 Translated using Weblate (Spanish)
Currently translated at 99.7% (464 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-06-08 16:17:04 +02:00
Anonymous
a19304e7e7 Translated using Weblate (German)
Currently translated at 98.2% (457 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-06-08 16:17:04 +02:00
Hosted Weblate
3d0cc6aeeb Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/
2023-06-08 16:16:16 +02:00
Dan
7588dd03db Translated using Weblate (Ukrainian)
Currently translated at 100.0% (465 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-06-08 16:16:12 +02:00
Nonoss117
b934fc429d Translated using Weblate (French)
Currently translated at 100.0% (465 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-06-08 16:16:12 +02:00
gallegonovato
07c0c0faf4 Translated using Weblate (Spanish)
Currently translated at 100.0% (465 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-06-08 16:16:12 +02:00
shamoon
350e27c32b Merge pull request #1587 from benphelps/fix/remove-lidarr-album
Change: lidarr use artist instead of album
2023-06-08 07:16:05 -07:00
shamoon
ea50a851f3 Change lidarr to artist instead of album 2023-06-08 07:15:35 -07:00
shamoon
27958c9f69 Merge pull request #1571 from rkokkelk/issue/1496
Fix: use service labels instead of container for service discovery with Docker Swarm
2023-06-08 00:35:22 -07:00
shamoon
3383b553d5 Merge pull request #1583 from benphelps/fix/issue-1577
Fix: potentially avoid `album` api call in lidarr widget, allow useWidgetAPI to not actually send a request
2023-06-07 14:23:49 -07:00
shamoon
4245f1070a fix docker service discovery, code styling 2023-06-07 14:06:23 -07:00
shamoon
c92d1caf80 Allow useWidgetAPI to not actually send a request 2023-06-07 13:43:53 -07:00
Denis Papec
91e0ec2f83 Fixes for portainer and kubernetes widget error messages, and error messages for services behind the reverse proxy
Signed-off-by: Denis Papec <denis.papec@gmail.com>
2023-06-07 00:54:51 +01:00
shamoon
774ca4b3b2 Merge pull request #1575 from nathan-sankbeil/feat/gzip
Support proxying compressed responses
2023-06-06 14:11:23 -07:00
Anonymous
bcd9289849 Translated using Weblate (Indonesian)
Currently translated at 3.2% (15 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/id/
2023-06-06 22:33:35 +02:00
Anonymous
0e9ca01c18 Translated using Weblate (Slovenian)
Currently translated at 96.7% (450 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/
2023-06-06 22:33:35 +02:00
Anonymous
614ce65871 Translated using Weblate (Greek)
Currently translated at 30.9% (144 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-06-06 22:33:34 +02:00
Anonymous
b085a1a2d1 Translated using Weblate (Korean)
Currently translated at 37.4% (174 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ko/
2023-06-06 22:33:34 +02:00
Anonymous
715f3d9d27 Translated using Weblate (Slovak)
Currently translated at 1.9% (9 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sk/
2023-06-06 22:33:34 +02:00
Anonymous
a1fedf98e5 Translated using Weblate (Thai)
Currently translated at 10.1% (47 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/th/
2023-06-06 22:33:33 +02:00
Anonymous
249dfa7a92 Translated using Weblate (Latvian)
Currently translated at 25.5% (119 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-06-06 22:33:33 +02:00
Anonymous
bb09d85d80 Translated using Weblate (Japanese)
Currently translated at 80.4% (374 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-06-06 22:33:32 +02:00
Anonymous
4f386bb2af Translated using Weblate (Ukrainian)
Currently translated at 99.1% (461 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-06-06 22:33:32 +02:00
Anonymous
d98607072c Translated using Weblate (Esperanto)
Currently translated at 31.3% (146 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-06-06 22:33:31 +02:00
Anonymous
93440ae8d1 Translated using Weblate (Hindi)
Currently translated at 1.9% (9 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-06-06 22:33:31 +02:00
Anonymous
0f5deba5e3 Translated using Weblate (Malay)
Currently translated at 54.1% (252 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-06-06 22:33:31 +02:00
Anonymous
e398e4acc5 Translated using Weblate (Danish)
Currently translated at 42.3% (197 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-06-06 22:33:30 +02:00
Anonymous
0447bb0413 Translated using Weblate (Czech)
Currently translated at 95.6% (445 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-06-06 22:33:30 +02:00
Anonymous
577f8fecfd Translated using Weblate (Arabic)
Currently translated at 56.1% (261 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-06-06 22:33:29 +02:00
Anonymous
9523f72c97 Translated using Weblate (Serbian)
Currently translated at 1.9% (9 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-06-06 22:33:29 +02:00
Anonymous
7bcd405f77 Translated using Weblate (Turkish)
Currently translated at 84.7% (394 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-06-06 22:33:29 +02:00
Anonymous
3ab5862bf1 Translated using Weblate (Bulgarian)
Currently translated at 9.8% (46 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-06-06 22:33:28 +02:00
Anonymous
a00ef03ce5 Translated using Weblate (Telugu)
Currently translated at 46.4% (216 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-06-06 22:33:28 +02:00
Anonymous
95ecc55467 Translated using Weblate (Finnish)
Currently translated at 38.2% (178 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-06-06 22:33:27 +02:00
Anonymous
db7fdd2a4f Translated using Weblate (Yue (Traditional))
Currently translated at 25.3% (118 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue_Hant/
2023-06-06 22:33:27 +02:00
Anonymous
a2a6cd150f Translated using Weblate (Portuguese (Brazil))
Currently translated at 87.0% (405 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-06-06 22:33:26 +02:00
Anonymous
26d17e9a3a Translated using Weblate (Romanian)
Currently translated at 32.4% (151 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-06-06 22:33:26 +02:00
Anonymous
46b988eeea Translated using Weblate (Hebrew)
Currently translated at 21.7% (101 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-06-06 22:33:26 +02:00
Anonymous
4682b5a9a2 Translated using Weblate (Hungarian)
Currently translated at 23.2% (108 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-06-06 22:33:25 +02:00
Anonymous
e2c8b2000f Translated using Weblate (Croatian)
Currently translated at 98.7% (459 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-06-06 22:33:25 +02:00
Anonymous
ff7ee31497 Translated using Weblate (Swedish)
Currently translated at 28.1% (131 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-06-06 22:33:24 +02:00
Anonymous
f66dc86e24 Translated using Weblate (Polish)
Currently translated at 80.6% (375 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-06-06 22:33:24 +02:00
Anonymous
a2204a3de9 Translated using Weblate (Catalan)
Currently translated at 56.1% (261 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-06-06 22:33:23 +02:00
Anonymous
4cf8302d4f Translated using Weblate (Chinese (Traditional))
Currently translated at 99.1% (461 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-06-06 22:33:23 +02:00
Anonymous
63247f3a9f Translated using Weblate (Dutch)
Currently translated at 52.0% (242 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-06-06 22:33:23 +02:00
Anonymous
51a1562ea9 Translated using Weblate (Vietnamese)
Currently translated at 9.4% (44 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-06-06 22:33:22 +02:00
Anonymous
ece83fd531 Translated using Weblate (Norwegian Bokmål)
Currently translated at 16.9% (79 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-06-06 22:33:22 +02:00
Anonymous
86cb124894 Translated using Weblate (Italian)
Currently translated at 61.7% (287 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-06-06 22:33:22 +02:00
Anonymous
4c55eee55b Translated using Weblate (Chinese (Simplified))
Currently translated at 95.4% (444 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-06-06 22:33:21 +02:00
Anonymous
3061654eeb Translated using Weblate (Russian)
Currently translated at 89.0% (414 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-06-06 22:33:21 +02:00
Anonymous
bcdbcb2cb7 Translated using Weblate (Portuguese)
Currently translated at 87.0% (405 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-06-06 22:33:21 +02:00
Anonymous
7367bd4a1f Translated using Weblate (French)
Currently translated at 99.1% (461 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-06-06 22:33:20 +02:00
Anonymous
fd0d644474 Translated using Weblate (Spanish)
Currently translated at 99.1% (461 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-06-06 22:33:20 +02:00
Anonymous
a054747285 Translated using Weblate (German)
Currently translated at 98.4% (458 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-06-06 22:33:19 +02:00
shamoon
2c62f180a9 Merge pull request #1560 from Schoggi0815/feature/sonarr-radarr-queue-list
Feature/sonarr radarr queue list
2023-06-06 13:31:13 -07:00
shamoon
dd4ee44302 Simplify sonarr / radarr queues, better handle some errors 2023-06-05 22:23:21 -07:00
nsankbeil
3a29262256 feat: support compressed responses 2023-06-05 21:44:58 -04:00
Matteo Bossi
5b3d1cc6e0 Make styling more consistent and add toggle to opt-in instead of opting out 2023-06-06 01:14:10 +02:00
Denis Papec
a55fe939cb Further improvements to simplify information widgets
Signed-off-by: Denis Papec <denis.papec@gmail.com>
2023-06-05 23:18:18 +01:00
shamoon
c1a68a79ee Merge pull request #1572 from Cyb3rzombie/paperlessngx_token
Enhancement: add support for auth token in paperless-ngx widget
2023-06-05 11:06:14 -07:00
Cyb3rzombie
8f0cd7e088 Add support for auth token 2023-06-05 18:26:11 +02:00
RoyK
f656c2b46d fix(service-helper): service detection with Docker Swarm
The current implementation of service detection focusses on containers.
However when using Docker Swarm this limits automatic service detection
to the containers running on the same node as homepage (or
docker-proxy). Detecting other services in the docker swarm is with the
current implementation not possible.

This commit fixes this by getting the appropriate labels from services
when Docker swarm is configured in the config file. This ensures that
the appropriate labels are gathered from the service definition instead
of the container definiation, thus allowing for automatic service
detection for the entire Docker swarm. Please note that in order for
this to function the homepage (or dockerproxy) should be running on a
manager node. Only the manager node is able to gather all the relevant
service labels.

Fixes: #752, #970, #955, #1255, #1045, #1496
2023-06-05 16:06:14 +02:00
Milo Ivir
f05ac3247d Translated using Weblate (Croatian)
Currently translated at 99.5% (459 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-06-04 17:50:52 +02:00
Nonoss117
7e54b80d73 Translated using Weblate (French)
Currently translated at 100.0% (461 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-06-04 17:50:51 +02:00
Denis Papec
d4fd923be5 Refactored information widgets, improve widget-boxed style
Signed-off-by: Denis Papec <denis.papec@gmail.com>
2023-06-03 03:01:21 +01:00
Denis Papec
c79d45f91e Add optional boxed styling and error component to information widgets
Signed-off-by: Denis Papec <denis.papec@gmail.com>
2023-06-03 02:14:38 +01:00
Matteo Bossi
0eab4e7943 Fix Mobile view 2023-06-02 15:46:43 +02:00
Matteo Bossi
28e39e46ae Add queue list 2023-06-02 14:57:27 +02:00
Yıldırım Manisalı
caa1b94fd6 Translated using Weblate (Turkish)
Currently translated at 85.4% (394 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-06-01 13:50:54 +02:00
KaiYi Chang
967fd6817a Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (461 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-05-31 05:50:39 +02:00
liimee
f3b5d73533 Translated using Weblate (Indonesian)
Currently translated at 3.2% (15 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/id/
2023-05-29 08:51:30 +02:00
shamoon
18cf4e7d5d Merge pull request #1554 from mscreations/dynamic_env_vars
Enhancement: substitute environment vars in container labels
2023-05-28 23:20:16 -07:00
shamoon
56644ac487 Support env substitution for k8s 2023-05-28 23:03:04 -07:00
Jon
e6d95e29ee Translate environment vars in labels 2023-05-29 01:14:03 -04:00
shamoon
8673548c88 Merge pull request #1552 from benphelps/fix/issue-1415
Fix: Handle k8s widget metrics call fails
2023-05-28 19:57:53 -07:00
shamoon
bd5c10e907 Handle k8s widget metrics call fails 2023-05-28 19:57:39 -07:00
shamoon
2bbe5b04c7 Update bug_report.yml 2023-05-28 19:49:02 -07:00
shamoon
498089a8fa Merge pull request #1551 from benphelps/fix/issue-1547
Fix: Properly encode qbittorrent credentials
2023-05-28 19:47:24 -07:00
shamoon
0a5eb1ae75 Properly encode qbittorrent credentials 2023-05-28 19:46:28 -07:00
shamoon
6dfddf739e Merge pull request #1548 from benphelps/fix/issue-1546
Enhancement: support settings layout as a list
2023-05-28 10:04:57 -07:00
shamoon
febb4cc6d5 Support settings layout as a list 2023-05-28 09:51:44 -07:00
Anonymous
7dfa7412ef Translated using Weblate (Indonesian)
Currently translated at 100.0% (0 of 0 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/id/
2023-05-28 08:26:01 +02:00
liimee
665ff66217 Added translation using Weblate (Indonesian) 2023-05-28 08:24:37 +02:00
gallegonovato
37d36750de Translated using Weblate (Spanish)
Currently translated at 100.0% (461 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-05-27 11:50:10 +02:00
shamoon
5850a48ec9 Include right margin on greeting widget
Closes #224

Co-Authored-By: David Moor <dave@ducks-n-tworms.co.uk>
2023-05-26 08:21:02 -07:00
shamoon
1f85da934f Merge pull request #1545 from benphelps/fix/hass-custom-label-support
Fix: support using docker labels for HASS widget custom
2023-05-25 23:20:59 -07:00
shamoon
4948485c50 Support using docker labels for HASS widget custom 2023-05-25 23:15:45 -07:00
Julian Ortlieb
fc668aa9d0 Translated using Weblate (German)
Currently translated at 99.3% (458 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-05-25 11:51:47 +02:00
shamoon
f28284fa77 Merge pull request #1542 from theshaun/support_older_qnap
Correctly use sys_tempc instead of cpu_tempc in QNAP widget
2023-05-24 07:14:51 -07:00
theshaun
cd14dbde58 Correctly use sys_tempc instead of cpu_tempc 2023-05-24 20:59:34 +10:00
Dan
5ee9f46a5a Translated using Weblate (Ukrainian)
Currently translated at 100.0% (461 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-05-24 06:52:52 +02:00
libook
73db271c87 Translated using Weblate (Chinese (Simplified))
Currently translated at 96.3% (444 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-05-24 06:52:52 +02:00
Nonoss117
864470b53c Translated using Weblate (French)
Currently translated at 100.0% (461 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-05-24 06:52:51 +02:00
shamoon
1b984abd91 Fix error port display, again 2023-05-23 03:37:56 -07:00
Anonymous
b960813ed9 Translated using Weblate (Slovenian)
Currently translated at 97.6% (450 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/
2023-05-22 19:52:52 +02:00
Anonymous
d6363d4636 Translated using Weblate (Greek)
Currently translated at 31.2% (144 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-05-22 19:52:52 +02:00
Anonymous
42681d8884 Translated using Weblate (Korean)
Currently translated at 37.7% (174 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ko/
2023-05-22 19:52:51 +02:00
Anonymous
7da1fd3a41 Translated using Weblate (Slovak)
Currently translated at 1.9% (9 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sk/
2023-05-22 19:52:51 +02:00
Anonymous
1de449f925 Translated using Weblate (Thai)
Currently translated at 10.1% (47 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/th/
2023-05-22 19:52:51 +02:00
Anonymous
e4a3570a77 Translated using Weblate (Latvian)
Currently translated at 25.8% (119 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-05-22 19:52:50 +02:00
Anonymous
0e83953ac7 Translated using Weblate (Japanese)
Currently translated at 81.1% (374 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-05-22 19:52:50 +02:00
Anonymous
8e548fb249 Translated using Weblate (Ukrainian)
Currently translated at 97.6% (450 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-05-22 19:52:50 +02:00
Anonymous
c3168df04b Translated using Weblate (Esperanto)
Currently translated at 31.6% (146 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-05-22 19:52:49 +02:00
Anonymous
4b915467f2 Translated using Weblate (Hindi)
Currently translated at 1.9% (9 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-05-22 19:52:49 +02:00
Anonymous
4f53c1e4e4 Translated using Weblate (Malay)
Currently translated at 54.6% (252 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-05-22 19:52:49 +02:00
Anonymous
f3f946a649 Translated using Weblate (Danish)
Currently translated at 42.7% (197 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-05-22 19:52:48 +02:00
Anonymous
d633f70c45 Translated using Weblate (Czech)
Currently translated at 96.5% (445 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-05-22 19:52:48 +02:00
Anonymous
c893a6e829 Translated using Weblate (Arabic)
Currently translated at 56.6% (261 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-05-22 19:52:48 +02:00
Anonymous
ae55441f44 Translated using Weblate (Serbian)
Currently translated at 1.9% (9 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-05-22 19:52:47 +02:00
Anonymous
d59dce8a36 Translated using Weblate (Turkish)
Currently translated at 68.5% (316 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-05-22 19:52:47 +02:00
Anonymous
fa3a438d30 Translated using Weblate (Bulgarian)
Currently translated at 9.9% (46 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-05-22 19:52:47 +02:00
Anonymous
c9a69c0c77 Translated using Weblate (Telugu)
Currently translated at 46.8% (216 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-05-22 19:52:46 +02:00
Anonymous
07cb004ecb Translated using Weblate (Finnish)
Currently translated at 38.6% (178 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-05-22 19:52:46 +02:00
Anonymous
678ddf9c11 Translated using Weblate (Yue (Traditional))
Currently translated at 25.5% (118 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue_Hant/
2023-05-22 19:52:46 +02:00
Anonymous
618b006350 Translated using Weblate (Portuguese (Brazil))
Currently translated at 87.8% (405 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-05-22 19:52:45 +02:00
Anonymous
60c423f7cf Translated using Weblate (Romanian)
Currently translated at 32.7% (151 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-05-22 19:52:45 +02:00
Anonymous
bccef494d7 Translated using Weblate (Hebrew)
Currently translated at 21.9% (101 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-05-22 19:52:45 +02:00
Anonymous
4539ef7bb0 Translated using Weblate (Hungarian)
Currently translated at 23.4% (108 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-05-22 19:52:44 +02:00
Anonymous
abb9a6f66f Translated using Weblate (Croatian)
Currently translated at 93.9% (433 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-05-22 19:52:44 +02:00
Anonymous
98e5ceb93a Translated using Weblate (Swedish)
Currently translated at 28.4% (131 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-05-22 19:52:44 +02:00
Anonymous
fa5b4f9ebe Translated using Weblate (Polish)
Currently translated at 81.3% (375 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-05-22 19:52:43 +02:00
Anonymous
06b24907b9 Translated using Weblate (Catalan)
Currently translated at 56.6% (261 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-05-22 19:52:43 +02:00
Anonymous
2f9bec8544 Translated using Weblate (Chinese (Traditional))
Currently translated at 95.6% (441 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-05-22 19:52:43 +02:00
Anonymous
43a3a71f72 Translated using Weblate (Dutch)
Currently translated at 52.4% (242 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-05-22 19:52:42 +02:00
Anonymous
8261a504e4 Translated using Weblate (Vietnamese)
Currently translated at 9.5% (44 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-05-22 19:52:42 +02:00
Anonymous
a0c29cdd05 Translated using Weblate (Norwegian Bokmål)
Currently translated at 17.1% (79 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-05-22 19:52:42 +02:00
Anonymous
4c6cf7da18 Translated using Weblate (Italian)
Currently translated at 62.2% (287 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-05-22 19:52:41 +02:00
Anonymous
8cf783bf43 Translated using Weblate (Chinese (Simplified))
Currently translated at 96.3% (444 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-05-22 19:52:41 +02:00
Anonymous
55732ccac6 Translated using Weblate (Russian)
Currently translated at 89.8% (414 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-05-22 19:52:41 +02:00
Anonymous
33bd39301e Translated using Weblate (Portuguese)
Currently translated at 87.8% (405 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-05-22 19:52:41 +02:00
Anonymous
200706d612 Translated using Weblate (French)
Currently translated at 98.9% (456 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-05-22 19:52:40 +02:00
Anonymous
891f770d1e Translated using Weblate (Spanish)
Currently translated at 98.9% (456 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-05-22 19:52:40 +02:00
Anonymous
7b8c84df5a Translated using Weblate (German)
Currently translated at 96.3% (444 of 461 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-05-22 19:52:39 +02:00
Hosted Weblate
f29b137a9e Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/
2023-05-22 19:51:09 +02:00
Nonoss117
e97bdb9ec4 Translated using Weblate (French)
Currently translated at 100.0% (457 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-05-22 19:51:05 +02:00
gallegonovato
1291707e2f Translated using Weblate (Spanish)
Currently translated at 100.0% (457 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-05-22 19:51:05 +02:00
Georges-Antoine Assi
cdd7b2d44b Enhanced glances widget (#1534)
* Enhanced glances widget (resource match)

* Make widget clickable + cleanup helperrs

* Prevent unused glances API calls

---------

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2023-05-22 10:50:58 -07:00
Anonymous
3bc750bfe7 Translated using Weblate (Slovenian)
Currently translated at 98.6% (451 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/
2023-05-21 18:14:14 +02:00
Anonymous
a5b041eb6f Translated using Weblate (Greek)
Currently translated at 31.5% (144 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-05-21 18:14:14 +02:00
Anonymous
f3dad538f3 Translated using Weblate (Korean)
Currently translated at 38.0% (174 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ko/
2023-05-21 18:14:13 +02:00
Anonymous
f61d8fb924 Translated using Weblate (Slovak)
Currently translated at 1.9% (9 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sk/
2023-05-21 18:14:13 +02:00
Anonymous
e3fd1dfc49 Translated using Weblate (Thai)
Currently translated at 10.2% (47 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/th/
2023-05-21 18:14:13 +02:00
Anonymous
d00a6efc41 Translated using Weblate (Latvian)
Currently translated at 26.0% (119 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-05-21 18:14:12 +02:00
Anonymous
73b5175294 Translated using Weblate (Japanese)
Currently translated at 81.8% (374 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-05-21 18:14:12 +02:00
Anonymous
94540f828b Translated using Weblate (Ukrainian)
Currently translated at 98.6% (451 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-05-21 18:14:12 +02:00
Anonymous
940bb01c12 Translated using Weblate (Esperanto)
Currently translated at 32.1% (147 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-05-21 18:14:12 +02:00
Anonymous
5d2d81d0dd Translated using Weblate (Hindi)
Currently translated at 1.9% (9 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-05-21 18:14:11 +02:00
Anonymous
48f2d4348d Translated using Weblate (Malay)
Currently translated at 55.3% (253 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-05-21 18:14:11 +02:00
Anonymous
16cf1cba98 Translated using Weblate (Danish)
Currently translated at 43.3% (198 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-05-21 18:14:10 +02:00
Anonymous
982f594040 Translated using Weblate (Czech)
Currently translated at 97.5% (446 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-05-21 18:14:10 +02:00
Anonymous
ea025cedf0 Translated using Weblate (Arabic)
Currently translated at 57.3% (262 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-05-21 18:14:10 +02:00
Anonymous
70519a53a5 Translated using Weblate (Serbian)
Currently translated at 1.9% (9 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-05-21 18:14:10 +02:00
Anonymous
551b53e143 Translated using Weblate (Turkish)
Currently translated at 69.3% (317 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-05-21 18:14:09 +02:00
Anonymous
9f75009f42 Translated using Weblate (Bulgarian)
Currently translated at 10.0% (46 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-05-21 18:14:09 +02:00
Anonymous
148710dfd8 Translated using Weblate (Telugu)
Currently translated at 47.4% (217 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-05-21 18:14:08 +02:00
Anonymous
319042ea19 Translated using Weblate (Finnish)
Currently translated at 38.9% (178 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-05-21 18:14:08 +02:00
Anonymous
a9a7a7d6b1 Translated using Weblate (Yue (Traditional))
Currently translated at 25.8% (118 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue_Hant/
2023-05-21 18:14:07 +02:00
Anonymous
0bd639cad8 Translated using Weblate (Portuguese (Brazil))
Currently translated at 88.8% (406 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-05-21 18:14:07 +02:00
Anonymous
febc8eaf73 Translated using Weblate (Romanian)
Currently translated at 33.2% (152 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-05-21 18:14:07 +02:00
Anonymous
268cdcab19 Translated using Weblate (Hebrew)
Currently translated at 22.1% (101 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-05-21 18:14:06 +02:00
Anonymous
1caf6126c8 Translated using Weblate (Hungarian)
Currently translated at 23.6% (108 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-05-21 18:14:06 +02:00
Anonymous
82ae597a23 Translated using Weblate (Croatian)
Currently translated at 94.9% (434 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-05-21 18:14:05 +02:00
Anonymous
be82a83f4d Translated using Weblate (Swedish)
Currently translated at 28.8% (132 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-05-21 18:14:05 +02:00
Anonymous
1e00867697 Translated using Weblate (Polish)
Currently translated at 82.2% (376 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-05-21 18:14:05 +02:00
Anonymous
db030f2e72 Translated using Weblate (Catalan)
Currently translated at 57.3% (262 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-05-21 18:14:04 +02:00
Anonymous
03ed353762 Translated using Weblate (Chinese (Traditional))
Currently translated at 96.7% (442 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-05-21 18:14:03 +02:00
Anonymous
d63d62885b Translated using Weblate (Dutch)
Currently translated at 52.9% (242 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-05-21 18:14:03 +02:00
Anonymous
b23ba74cce Translated using Weblate (Vietnamese)
Currently translated at 9.6% (44 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-05-21 18:14:03 +02:00
Anonymous
4150158b8d Translated using Weblate (Norwegian Bokmål)
Currently translated at 17.2% (79 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-05-21 18:14:02 +02:00
Anonymous
fde331a2c2 Translated using Weblate (Italian)
Currently translated at 63.0% (288 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-05-21 18:14:02 +02:00
Anonymous
e40e995f66 Translated using Weblate (Chinese (Simplified))
Currently translated at 97.3% (445 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-05-21 18:14:01 +02:00
Anonymous
f706e4eccd Translated using Weblate (Russian)
Currently translated at 90.8% (415 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-05-21 18:14:01 +02:00
Anonymous
e5d42a65c7 Translated using Weblate (Portuguese)
Currently translated at 88.8% (406 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-05-21 18:14:01 +02:00
Anonymous
9a5d9f241a Translated using Weblate (French)
Currently translated at 98.6% (451 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-05-21 18:14:00 +02:00
Anonymous
b3ecf152f0 Translated using Weblate (Spanish)
Currently translated at 98.4% (450 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-05-21 18:14:00 +02:00
Anonymous
715d3abdb5 Translated using Weblate (German)
Currently translated at 97.3% (445 of 457 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-05-21 18:13:59 +02:00
Salvatore Gabriele La Greca
36eaaafd88 Added PiAlert widget [WIP] (#1493)
* Added PiAlert widget

* pialert: comments clean

* Syntax changes to piAlert widget

---------

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2023-05-21 09:12:14 -07:00
Anonymous
c8eccc71a4 Translated using Weblate (Slovenian)
Currently translated at 99.5% (451 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/
2023-05-21 17:16:10 +02:00
Anonymous
abc4735b8f Translated using Weblate (Greek)
Currently translated at 31.7% (144 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-05-21 17:16:10 +02:00
Anonymous
2fe14dbd9a Translated using Weblate (Korean)
Currently translated at 38.4% (174 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ko/
2023-05-21 17:16:10 +02:00
Anonymous
1b9e0dbf41 Translated using Weblate (Slovak)
Currently translated at 1.9% (9 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sk/
2023-05-21 17:16:09 +02:00
Anonymous
edbfb857f1 Translated using Weblate (Thai)
Currently translated at 10.3% (47 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/th/
2023-05-21 17:16:09 +02:00
Anonymous
a94fe86fb9 Translated using Weblate (Latvian)
Currently translated at 26.2% (119 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-05-21 17:16:08 +02:00
Anonymous
4f5d6ed099 Translated using Weblate (Japanese)
Currently translated at 82.5% (374 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-05-21 17:16:08 +02:00
Anonymous
e964dd5f74 Translated using Weblate (Ukrainian)
Currently translated at 99.5% (451 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-05-21 17:16:08 +02:00
Anonymous
40c18f2a46 Translated using Weblate (Esperanto)
Currently translated at 32.4% (147 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-05-21 17:16:07 +02:00
Anonymous
defae64b65 Translated using Weblate (Hindi)
Currently translated at 1.9% (9 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-05-21 17:16:07 +02:00
Anonymous
7a7b695c6b Translated using Weblate (Malay)
Currently translated at 55.8% (253 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-05-21 17:16:07 +02:00
Anonymous
31178f2212 Translated using Weblate (Danish)
Currently translated at 43.7% (198 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-05-21 17:16:06 +02:00
Anonymous
2b8a120a9b Translated using Weblate (Czech)
Currently translated at 98.4% (446 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-05-21 17:16:06 +02:00
Anonymous
3742fee9c0 Translated using Weblate (Arabic)
Currently translated at 57.8% (262 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-05-21 17:16:06 +02:00
Anonymous
a8f48920a4 Translated using Weblate (Serbian)
Currently translated at 1.9% (9 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-05-21 17:16:05 +02:00
Anonymous
79a4130e1a Translated using Weblate (Turkish)
Currently translated at 69.9% (317 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-05-21 17:16:05 +02:00
Anonymous
477d48e6c7 Translated using Weblate (Bulgarian)
Currently translated at 10.1% (46 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-05-21 17:16:04 +02:00
Anonymous
fcf3499098 Translated using Weblate (Telugu)
Currently translated at 47.9% (217 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-05-21 17:16:04 +02:00
Anonymous
b3d4397961 Translated using Weblate (Finnish)
Currently translated at 39.2% (178 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-05-21 17:16:04 +02:00
Anonymous
a6e3d28cc3 Translated using Weblate (Yue (Traditional))
Currently translated at 26.0% (118 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue_Hant/
2023-05-21 17:16:03 +02:00
Anonymous
c1c9e70372 Translated using Weblate (Portuguese (Brazil))
Currently translated at 89.6% (406 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-05-21 17:16:03 +02:00
Anonymous
b027772787 Translated using Weblate (Romanian)
Currently translated at 33.5% (152 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-05-21 17:16:02 +02:00
Anonymous
99c6e6c43e Translated using Weblate (Hebrew)
Currently translated at 22.2% (101 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-05-21 17:16:02 +02:00
Anonymous
1d48cf4fdc Translated using Weblate (Hungarian)
Currently translated at 23.8% (108 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-05-21 17:16:02 +02:00
Anonymous
81d4c86368 Translated using Weblate (Croatian)
Currently translated at 95.8% (434 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-05-21 17:16:01 +02:00
Anonymous
4f6afc72fc Translated using Weblate (Swedish)
Currently translated at 29.1% (132 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-05-21 17:16:01 +02:00
Anonymous
269e70a086 Translated using Weblate (Polish)
Currently translated at 83.0% (376 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-05-21 17:16:00 +02:00
Anonymous
675aaba5d4 Translated using Weblate (Catalan)
Currently translated at 57.8% (262 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-05-21 17:16:00 +02:00
Anonymous
30dc155526 Translated using Weblate (Chinese (Traditional))
Currently translated at 97.5% (442 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-05-21 17:16:00 +02:00
Anonymous
c7a60f5645 Translated using Weblate (Dutch)
Currently translated at 53.4% (242 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-05-21 17:15:59 +02:00
Anonymous
e439c3e5da Translated using Weblate (Vietnamese)
Currently translated at 9.7% (44 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-05-21 17:15:59 +02:00
Anonymous
3a57f9f685 Translated using Weblate (Norwegian Bokmål)
Currently translated at 17.4% (79 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-05-21 17:15:59 +02:00
Anonymous
4b4537f532 Translated using Weblate (Italian)
Currently translated at 63.5% (288 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-05-21 17:15:58 +02:00
Anonymous
80fe8ef62e Translated using Weblate (Chinese (Simplified))
Currently translated at 98.2% (445 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-05-21 17:15:58 +02:00
Anonymous
99d859dc08 Translated using Weblate (Russian)
Currently translated at 91.6% (415 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-05-21 17:15:58 +02:00
Anonymous
49b4997245 Translated using Weblate (Portuguese)
Currently translated at 89.6% (406 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-05-21 17:15:57 +02:00
Anonymous
2d9cf1e06a Translated using Weblate (French)
Currently translated at 99.5% (451 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-05-21 17:15:57 +02:00
Anonymous
ff2177fa5e Translated using Weblate (Spanish)
Currently translated at 99.3% (450 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-05-21 17:15:57 +02:00
Anonymous
18a597617d Translated using Weblate (German)
Currently translated at 98.2% (445 of 453 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-05-21 17:15:56 +02:00
Smexhy
5443d17bf3 Translated using Weblate (Czech)
Currently translated at 98.8% (446 of 451 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-05-21 17:13:48 +02:00
KaiYi Chang
d31129ee03 Translated using Weblate (Chinese (Traditional))
Currently translated at 98.0% (442 of 451 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-05-21 17:13:48 +02:00
Shaun Walker
cf7c68261f Add support for QNAP instances with multiple volumes (#1528)
* Add support for pfSense API

* Fix linting issues

* remove a line

* rename cpu to load in default block

* Re-order container blocks to ensure defaults show

* clean up

* Add support for multiple volumes as well as defining the volume you want to track

* QNAP widget syntax corrections, translate invalid

---------

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2023-05-21 08:13:40 -07:00
shamoon
a59e8e6efd Merge pull request #1529 from benphelps/fix/issue-1527
Fix: Add try catch for ping
2023-05-20 09:49:36 -07:00
shamoon
f1a33f10ed Add try catch for ping 2023-05-20 09:48:18 -07:00
Antonis Triantafyllopoulos
cead87dcd0 Translated using Weblate (Greek)
Currently translated at 31.9% (144 of 451 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-05-20 14:51:01 +02:00
gallegonovato
cb7abb62b8 Translated using Weblate (Spanish)
Currently translated at 99.7% (450 of 451 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-05-20 14:51:00 +02:00
shamoon
7e005e51cc Fix background filters outside viewport 2023-05-20 03:17:47 -07:00
shamoon
1ed1ce4001 Merge pull request #1526 from benphelps/fix/issue-1524
Fix: background filters are not full height
2023-05-20 02:44:12 -07:00
shamoon
8a92d92b22 Make background wrapper full height 2023-05-20 02:43:07 -07:00
79 changed files with 2248 additions and 567 deletions

View File

@@ -1,7 +1,7 @@
name: Bug report name: Bug report
description: Create a report to help us improve description: Create a report to help us improve
title: "[Bug] " title: "[Bug] "
labels: ["bug"] labels: ["bug, unconfirmed"]
body: body:
- type: markdown - type: markdown
attributes: attributes:

View File

@@ -179,18 +179,22 @@
"sonarr": { "sonarr": {
"wanted": "مطلوب", "wanted": "مطلوب",
"queued": "في الإنتظار", "queued": "في الإنتظار",
"series": "سلسلة" "series": "سلسلة",
"queue": "Queue",
"unknown": "Unknown"
}, },
"radarr": { "radarr": {
"wanted": "مطلوب", "wanted": "مطلوب",
"missing": "مفقود", "missing": "مفقود",
"queued": "في الإنتظار", "queued": "في الإنتظار",
"movies": "أفلام" "movies": "أفلام",
"queue": "Queue",
"unknown": "Unknown"
}, },
"lidarr": { "lidarr": {
"wanted": "مطلوب", "wanted": "مطلوب",
"queued": "في الإنتظار", "queued": "في الإنتظار",
"albums": "ألبومات" "artists": "Artists"
}, },
"readarr": { "readarr": {
"wanted": "مطلوب", "wanted": "مطلوب",
@@ -296,12 +300,16 @@
}, },
"glances": { "glances": {
"cpu": "معالج", "cpu": "معالج",
"mem": "الذاكرة",
"wait": "الرجاء الإنتظار", "wait": "الرجاء الإنتظار",
"temp": "TEMP", "temp": "TEMP",
"uptime": "UP", "uptime": "UP",
"days": "d", "days": "d",
"hours": "h" "hours": "h",
"load": "Load",
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
}, },
"quicklaunch": { "quicklaunch": {
"bookmark": "مفضلة", "bookmark": "مفضلة",
@@ -604,7 +612,9 @@
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Usage" "poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"load": "Load Avg", "load": "Load Avg",
@@ -628,5 +638,11 @@
"home_power": "Consumption", "home_power": "Consumption",
"charge_power": "Charger", "charge_power": "Charger",
"watt_hour": "Wh" "watt_hour": "Wh"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
} }
} }

View File

@@ -117,18 +117,22 @@
"sonarr": { "sonarr": {
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series",
"queue": "Queue",
"unknown": "Unknown"
}, },
"radarr": { "radarr": {
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"movies": "Movies", "movies": "Movies",
"missing": "Missing" "missing": "Missing",
"queue": "Queue",
"unknown": "Unknown"
}, },
"lidarr": { "lidarr": {
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"albums": "Albums" "artists": "Artists"
}, },
"readarr": { "readarr": {
"wanted": "Wanted", "wanted": "Wanted",
@@ -234,12 +238,16 @@
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
"mem": "MEM",
"wait": "Please wait", "wait": "Please wait",
"temp": "TEMP", "temp": "TEMP",
"uptime": "UP", "uptime": "UP",
"days": "d", "days": "d",
"hours": "h" "hours": "h",
"load": "Load",
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "Total Observed", "totalObserved": "Total Observed",
@@ -604,7 +612,9 @@
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Usage" "poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"load": "Load Avg", "load": "Load Avg",
@@ -628,5 +638,11 @@
"grid_power": "Grid", "grid_power": "Grid",
"home_power": "Consumption", "home_power": "Consumption",
"watt_hour": "Wh" "watt_hour": "Wh"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
} }
} }

View File

@@ -26,7 +26,9 @@
"sonarr": { "sonarr": {
"wanted": "Volgut", "wanted": "Volgut",
"queued": "En cua", "queued": "En cua",
"series": "Sèries" "series": "Sèries",
"queue": "Queue",
"unknown": "Unknown"
}, },
"speedtest": { "speedtest": {
"ping": "Ping", "ping": "Ping",
@@ -99,7 +101,9 @@
"wanted": "Volgut", "wanted": "Volgut",
"queued": "En cua", "queued": "En cua",
"movies": "Pel·lícules", "movies": "Pel·lícules",
"missing": "Faltant" "missing": "Faltant",
"queue": "Queue",
"unknown": "Unknown"
}, },
"readarr": { "readarr": {
"wanted": "Volgut", "wanted": "Volgut",
@@ -173,7 +177,7 @@
"lidarr": { "lidarr": {
"wanted": "Volgut", "wanted": "Volgut",
"queued": "En cua", "queued": "En cua",
"albums": "Àlbums" "artists": "Artists"
}, },
"adguard": { "adguard": {
"queries": "Consultes", "queries": "Consultes",
@@ -234,12 +238,16 @@
}, },
"glances": { "glances": {
"cpu": "Processador", "cpu": "Processador",
"mem": "Memòria",
"wait": "Si us plau, espereu", "wait": "Si us plau, espereu",
"temp": "TEMP", "temp": "TEMP",
"uptime": "UP", "uptime": "UP",
"days": "d", "days": "d",
"hours": "h" "hours": "h",
"load": "Load",
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "Total d'observats", "totalObserved": "Total d'observats",
@@ -604,7 +612,9 @@
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Usage" "poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"load": "Load Avg", "load": "Load Avg",
@@ -628,5 +638,11 @@
"home_power": "Consumption", "home_power": "Consumption",
"charge_power": "Charger", "charge_power": "Charger",
"watt_hour": "Wh" "watt_hour": "Wh"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
} }
} }

View File

@@ -133,18 +133,22 @@
"sonarr": { "sonarr": {
"wanted": "Hledané", "wanted": "Hledané",
"queued": "Ve frontě", "queued": "Ve frontě",
"series": "Seriály" "series": "Seriály",
"unknown": "Unknown",
"queue": "Queue"
}, },
"radarr": { "radarr": {
"wanted": "Hledané", "wanted": "Hledané",
"missing": "Chybějící", "missing": "Chybějící",
"queued": "Ve frontě", "queued": "Ve frontě",
"movies": "Filmy" "movies": "Filmy",
"queue": "Queue",
"unknown": "Unknown"
}, },
"lidarr": { "lidarr": {
"wanted": "Hledané", "wanted": "Hledané",
"queued": "Ve frontě", "queued": "Ve frontě",
"albums": "Alba" "artists": "Artists"
}, },
"readarr": { "readarr": {
"wanted": "Hledané", "wanted": "Hledané",
@@ -308,12 +312,16 @@
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
"mem": "RAM",
"wait": "Prosím počkejte", "wait": "Prosím počkejte",
"temp": "TEPLOTA", "temp": "TEPLOTA",
"uptime": "BĚŽÍ", "uptime": "BĚŽÍ",
"days": "d", "days": "d",
"hours": "h" "hours": "h",
"total": "Total",
"free": "Free",
"used": "Used",
"load": "Load",
"warn": "Warn"
}, },
"quicklaunch": { "quicklaunch": {
"bookmark": "Záložka", "bookmark": "Záložka",
@@ -325,7 +333,7 @@
}, },
"homebridge": { "homebridge": {
"update_available": "Dostupná", "update_available": "Dostupná",
"up_to_date": "Všechno aktuální", "up_to_date": "Žádné",
"available_update": "Systém", "available_update": "Systém",
"updates": "Aktualizace", "updates": "Aktualizace",
"child_bridges": "Podřízené můstky", "child_bridges": "Podřízené můstky",
@@ -604,7 +612,9 @@
"memUsage": "Využití paměti", "memUsage": "Využití paměti",
"systemTempC": "Teplota systému", "systemTempC": "Teplota systému",
"poolUsage": "Využití fondu", "poolUsage": "Využití fondu",
"cpuUsage": "Využití procesoru" "cpuUsage": "Využití procesoru",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"load": "Prům. zatížení", "load": "Prům. zatížení",
@@ -628,5 +638,11 @@
"grid_power": "Grid", "grid_power": "Grid",
"home_power": "Consumption", "home_power": "Consumption",
"charge_power": "Charger" "charge_power": "Charger"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
} }
} }

View File

@@ -9,12 +9,14 @@
"queued": "I Kø", "queued": "I Kø",
"movies": "Film", "movies": "Film",
"wanted": "Ønskede", "wanted": "Ønskede",
"missing": "Mangler" "missing": "Mangler",
"queue": "Queue",
"unknown": "Unknown"
}, },
"lidarr": { "lidarr": {
"wanted": "Ønsket", "wanted": "Ønsket",
"queued": "I Kø", "queued": "I Kø",
"albums": "Albums" "artists": "Artists"
}, },
"jellyseerr": { "jellyseerr": {
"available": "Tilgængelig", "available": "Tilgængelig",
@@ -68,12 +70,16 @@
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
"mem": "RAM",
"wait": "Vent venligst", "wait": "Vent venligst",
"uptime": "UP", "uptime": "UP",
"days": "d", "days": "d",
"hours": "h", "hours": "h",
"temp": "TEMP" "temp": "TEMP",
"load": "Load",
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
}, },
"wmo": { "wmo": {
"1-day": "Hovedsageligt solrigt", "1-day": "Hovedsageligt solrigt",
@@ -260,7 +266,9 @@
"sonarr": { "sonarr": {
"wanted": "Ønsket", "wanted": "Ønsket",
"queued": "I Kø", "queued": "I Kø",
"series": "Serier" "series": "Serier",
"queue": "Queue",
"unknown": "Unknown"
}, },
"readarr": { "readarr": {
"wanted": "Ønskede", "wanted": "Ønskede",
@@ -604,7 +612,9 @@
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Usage" "poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"load": "Load Avg", "load": "Load Avg",
@@ -628,5 +638,11 @@
"home_power": "Consumption", "home_power": "Consumption",
"charge_power": "Charger", "charge_power": "Charger",
"watt_hour": "Wh" "watt_hour": "Wh"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
} }
} }

View File

@@ -66,13 +66,17 @@
"sonarr": { "sonarr": {
"wanted": "Gesucht", "wanted": "Gesucht",
"queued": "In Warteschlange", "queued": "In Warteschlange",
"series": "Serien" "series": "Serien",
"queue": "Queue",
"unknown": "Unknown"
}, },
"radarr": { "radarr": {
"wanted": "Gesucht", "wanted": "Gesucht",
"queued": "In Warteschlange", "queued": "In Warteschlange",
"movies": "Filme", "movies": "Filme",
"missing": "Fehlt" "missing": "Fehlt",
"queue": "Queue",
"unknown": "Unknown"
}, },
"readarr": { "readarr": {
"wanted": "Gesucht", "wanted": "Gesucht",
@@ -173,7 +177,7 @@
"lidarr": { "lidarr": {
"wanted": "Gesucht", "wanted": "Gesucht",
"queued": "In Warteschlange", "queued": "In Warteschlange",
"albums": "Alben" "artists": "Artists"
}, },
"adguard": { "adguard": {
"queries": "Anfragen", "queries": "Anfragen",
@@ -234,12 +238,16 @@
}, },
"glances": { "glances": {
"cpu": "Prozessor", "cpu": "Prozessor",
"mem": "RAM",
"wait": "Bitte warten", "wait": "Bitte warten",
"temp": "TEMP", "temp": "TEMP",
"uptime": "UP", "uptime": "UP",
"days": "T", "days": "T",
"hours": "S" "hours": "S",
"load": "Auslastung",
"warn": "Warnung",
"total": "Gesamt",
"free": "Frei",
"used": "Verwendet"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "Gesamt beobachtet", "totalObserved": "Gesamt beobachtet",
@@ -604,7 +612,9 @@
"cpuUsage": "CPU Nutzung", "cpuUsage": "CPU Nutzung",
"memUsage": "MEM Nutzung", "memUsage": "MEM Nutzung",
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Nutzung" "poolUsage": "Pool Nutzung",
"volumeUsage": "Volume Usage",
"invalid": "Ungültig"
}, },
"pfsense": { "pfsense": {
"load": "Durchschnittliche Last", "load": "Durchschnittliche Last",
@@ -623,10 +633,16 @@
}, },
"evcc": { "evcc": {
"watt_hour": "Wh", "watt_hour": "Wh",
"pv_power": "Production", "pv_power": "Produktion",
"battery_soc": "Battery", "battery_soc": "Batterie",
"grid_power": "Grid", "grid_power": "Grid",
"home_power": "Consumption", "home_power": "Verbrauch",
"charge_power": "Charger" "charge_power": "Ladegerät"
},
"pialert": {
"total": "Gesamt",
"connected": "Verbunden",
"new_devices": "Neue Geräte",
"down_alerts": "Down Alarme"
} }
} }

View File

@@ -159,21 +159,21 @@
"diffsDetected": "Εντοπίστηκαν διαφορές" "diffsDetected": "Εντοπίστηκαν διαφορές"
}, },
"tautulli": { "tautulli": {
"playing": "Παίζει", "playing": "Αναπαράγει",
"transcoding": "Διακωδικοποίηση", "transcoding": "Μετακωδικοποίηση",
"bitrate": "Ρυθμός bit", "bitrate": "Ρυθμός bit",
"no_active": "Δεν υπάρχουν ενεργές ροές" "no_active": "Δεν υπάρχουν ενεργές ροές"
}, },
"nzbget": { "nzbget": {
"rate": "βαθμός", "rate": "Ρυθμός",
"remaining": "Υπόλοιπο", "remaining": "Υπόλοιπο",
"downloaded": "Κατεβασμένο" "downloaded": "Κατεβασμένο"
}, },
"plex": { "plex": {
"streams": "Ενεργά Streams", "streams": "Ενεργές Ροές",
"movies": "Ταινίες", "movies": "Ταινίες",
"tv": "Σειρές", "tv": "Τηλεοπτικές εκπομπές",
"albums": "Δίσκοι" "albums": "Άλμπουμ"
}, },
"sabnzbd": { "sabnzbd": {
"rate": "Βαθμός", "rate": "Βαθμός",
@@ -199,14 +199,16 @@
}, },
"deluge": { "deluge": {
"download": "Κατέβασμα", "download": "Κατέβασμα",
"upload": "Φόρτωση", "upload": "Ανέβασμα",
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"sonarr": { "sonarr": {
"series": "Σειρές", "series": "Σειρές",
"wanted": "Επιθυμούντε", "wanted": "Επιθυμούντε",
"queued": "Σε σειρά" "queued": "Σε σειρά",
"queue": "Queue",
"unknown": "Unknown"
}, },
"downloadstation": { "downloadstation": {
"download": "Μεταφόρτωση", "download": "Μεταφόρτωση",
@@ -218,12 +220,14 @@
"wanted": "Επιθυμούντε", "wanted": "Επιθυμούντε",
"missing": "Απουσιάζει", "missing": "Απουσιάζει",
"queued": "Σε σειρά", "queued": "Σε σειρά",
"movies": "Ταινίες" "movies": "Ταινίες",
"queue": "Queue",
"unknown": "Unknown"
}, },
"lidarr": { "lidarr": {
"wanted": "Θέλετε", "wanted": "Θέλετε",
"queued": "Στη σειρά", "queued": "Στη σειρά",
"albums": "Δίσκοι" "artists": "Artists"
}, },
"readarr": { "readarr": {
"wanted": "Θέλετε", "wanted": "Θέλετε",
@@ -355,12 +359,16 @@
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
"mem": "MEM",
"wait": "Please wait", "wait": "Please wait",
"temp": "TEMP", "temp": "TEMP",
"uptime": "UP", "uptime": "UP",
"days": "d", "days": "d",
"hours": "h" "hours": "h",
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used",
"load": "Load"
}, },
"quicklaunch": { "quicklaunch": {
"bookmark": "Bookmark", "bookmark": "Bookmark",
@@ -604,7 +612,9 @@
"cpuUsage": "Χρήση επεξεργαστή", "cpuUsage": "Χρήση επεξεργαστή",
"memUsage": "Χρήση μνήμης", "memUsage": "Χρήση μνήμης",
"systemTempC": "Θερμοκρασία συστήματος", "systemTempC": "Θερμοκρασία συστήματος",
"poolUsage": "Χρήση πλειάδας" "poolUsage": "Χρήση πισίνας",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"load": "Load Avg", "load": "Load Avg",
@@ -618,8 +628,8 @@
}, },
"caddy": { "caddy": {
"upstreams": "Upstreams", "upstreams": "Upstreams",
"requests": "Current requests", "requests": "Τρέχοντα αιτήματα",
"requests_failed": "Failed requests" "requests_failed": "Αποτυχημένα αιτήματα"
}, },
"evcc": { "evcc": {
"watt_hour": "Wh", "watt_hour": "Wh",
@@ -627,6 +637,12 @@
"battery_soc": "Μπαταρία", "battery_soc": "Μπαταρία",
"grid_power": "Πλέγμα", "grid_power": "Πλέγμα",
"home_power": "Κατανάλωση", "home_power": "Κατανάλωση",
"charge_power": "Charger" "charge_power": "Φορτιστής"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
} }
} }

View File

@@ -175,7 +175,9 @@
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Usage" "poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"deluge": { "deluge": {
"download": "Download", "download": "Download",
@@ -192,18 +194,22 @@
"sonarr": { "sonarr": {
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series",
"queue": "Queue",
"unknown": "Unknown"
}, },
"radarr": { "radarr": {
"wanted": "Wanted", "wanted": "Wanted",
"missing": "Missing", "missing": "Missing",
"queued": "Queued", "queued": "Queued",
"movies": "Movies" "movies": "Movies",
"queue": "Queue",
"unknown": "Unknown"
}, },
"lidarr": { "lidarr": {
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"albums": "Albums" "artists": "Artists"
}, },
"readarr": { "readarr": {
"wanted": "Wanted", "wanted": "Wanted",
@@ -230,6 +236,12 @@
"approved": "Approved", "approved": "Approved",
"available": "Available" "available": "Available"
}, },
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
},
"pihole": { "pihole": {
"queries": "Queries", "queries": "Queries",
"blocked": "Blocked", "blocked": "Blocked",
@@ -349,10 +361,14 @@
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
"mem": "MEM", "load": "Load",
"wait": "Please wait", "wait": "Please wait",
"temp": "TEMP", "temp": "TEMP",
"warn": "Warn",
"uptime": "UP", "uptime": "UP",
"total": "Total",
"free": "Free",
"used": "Used",
"days": "d", "days": "d",
"hours": "h" "hours": "h"
}, },

View File

@@ -131,18 +131,22 @@
"sonarr": { "sonarr": {
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"series": "Serio" "series": "Serio",
"queue": "Queue",
"unknown": "Unknown"
}, },
"radarr": { "radarr": {
"wanted": "Wanted", "wanted": "Wanted",
"missing": "Missing", "missing": "Missing",
"queued": "Queued", "queued": "Queued",
"movies": "Filmoj" "movies": "Filmoj",
"queue": "Queue",
"unknown": "Unknown"
}, },
"lidarr": { "lidarr": {
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"albums": "Albumoj" "artists": "Artists"
}, },
"readarr": { "readarr": {
"wanted": "Wanted", "wanted": "Wanted",
@@ -252,12 +256,16 @@
}, },
"glances": { "glances": {
"cpu": "Ĉefprocesoro", "cpu": "Ĉefprocesoro",
"mem": "Memoro",
"wait": "Bonvolu atendi", "wait": "Bonvolu atendi",
"temp": "TEMP", "temp": "TEMP",
"uptime": "UP", "uptime": "UP",
"days": "d", "days": "d",
"hours": "h" "hours": "h",
"load": "Load",
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
}, },
"quicklaunch": { "quicklaunch": {
"bookmark": "Bookmark", "bookmark": "Bookmark",
@@ -604,7 +612,9 @@
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Usage" "poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"load": "Load Avg", "load": "Load Avg",
@@ -628,5 +638,11 @@
"home_power": "Consumption", "home_power": "Consumption",
"charge_power": "Charger", "charge_power": "Charger",
"watt_hour": "Wh" "watt_hour": "Wh"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
} }
} }

View File

@@ -66,13 +66,17 @@
"sonarr": { "sonarr": {
"wanted": "Buscando", "wanted": "Buscando",
"queued": "En cola", "queued": "En cola",
"series": "Series" "series": "Series",
"queue": "Poner a la cola",
"unknown": "Desconocido"
}, },
"radarr": { "radarr": {
"wanted": "Buscando", "wanted": "Buscando",
"queued": "En cola", "queued": "En cola",
"movies": "Películas", "movies": "Películas",
"missing": "Faltan" "missing": "Faltan",
"queue": "Poner a la cola",
"unknown": "Desconocido"
}, },
"readarr": { "readarr": {
"wanted": "Buscando", "wanted": "Buscando",
@@ -173,7 +177,7 @@
"lidarr": { "lidarr": {
"queued": "En cola", "queued": "En cola",
"wanted": "Buscando", "wanted": "Buscando",
"albums": "Álbumes" "artists": "Artistas"
}, },
"adguard": { "adguard": {
"queries": "Consultas", "queries": "Consultas",
@@ -234,12 +238,16 @@
}, },
"glances": { "glances": {
"cpu": "Procesador", "cpu": "Procesador",
"mem": "Memoria",
"wait": "Espera por favor", "wait": "Espera por favor",
"temp": "TEMPORAL", "temp": "TEMPORAL",
"uptime": "ARRIBA", "uptime": "ARRIBA",
"days": "Días", "days": "Días",
"hours": "Horas" "hours": "Horas",
"load": "Cargar",
"warn": "Advertir",
"total": "Total",
"free": "Libre",
"used": "Utilizado"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "Total Observados", "totalObserved": "Total Observados",
@@ -604,7 +612,9 @@
"cpuUsage": "Uso de la Cpu", "cpuUsage": "Uso de la Cpu",
"memUsage": "Uso de la memoria", "memUsage": "Uso de la memoria",
"systemTempC": "Temperatura del sistema", "systemTempC": "Temperatura del sistema",
"poolUsage": "Comprobación del uso del grupo de memoria" "poolUsage": "Comprobación del uso del grupo de memoria",
"volumeUsage": "Volumen utilizado",
"invalid": "No válido"
}, },
"pfsense": { "pfsense": {
"load": "Promedio de carga", "load": "Promedio de carga",
@@ -622,11 +632,17 @@
"requests_failed": "Peticiones fallidas" "requests_failed": "Peticiones fallidas"
}, },
"evcc": { "evcc": {
"pv_power": "Production", "pv_power": "Producción",
"battery_soc": "Battery", "battery_soc": "Batería",
"grid_power": "Grid", "grid_power": "Red",
"home_power": "Consumption", "home_power": "Consumo",
"charge_power": "Charger", "charge_power": "Cargador",
"watt_hour": "Wh" "watt_hour": "vatio-hora (Wh)"
},
"pialert": {
"total": "Total",
"connected": "Conectado",
"new_devices": "Nuevos dispositivos",
"down_alerts": "Alertas"
} }
} }

View File

@@ -94,18 +94,22 @@
"sonarr": { "sonarr": {
"wanted": "Haluttu", "wanted": "Haluttu",
"queued": "Jonossa", "queued": "Jonossa",
"series": "Sarja" "series": "Sarja",
"queue": "Queue",
"unknown": "Unknown"
}, },
"radarr": { "radarr": {
"wanted": "Haluttu", "wanted": "Haluttu",
"queued": "Jonossa", "queued": "Jonossa",
"movies": "Elokuvia", "movies": "Elokuvia",
"missing": "Missing" "missing": "Missing",
"queue": "Queue",
"unknown": "Unknown"
}, },
"lidarr": { "lidarr": {
"wanted": "Haluttu", "wanted": "Haluttu",
"queued": "Jonossa", "queued": "Jonossa",
"albums": "Albumeja" "artists": "Artists"
}, },
"readarr": { "readarr": {
"wanted": "Haluttu", "wanted": "Haluttu",
@@ -235,11 +239,15 @@
"glances": { "glances": {
"wait": "Please wait", "wait": "Please wait",
"cpu": "CPU", "cpu": "CPU",
"mem": "MEM",
"temp": "TEMP", "temp": "TEMP",
"uptime": "UP", "uptime": "UP",
"days": "d", "days": "d",
"hours": "h" "hours": "h",
"load": "Load",
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "Total Observed", "totalObserved": "Total Observed",
@@ -604,7 +612,9 @@
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Usage" "poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"load": "Load Avg", "load": "Load Avg",
@@ -628,5 +638,11 @@
"grid_power": "Grid", "grid_power": "Grid",
"home_power": "Consumption", "home_power": "Consumption",
"charge_power": "Charger" "charge_power": "Charger"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
} }
} }

View File

@@ -66,13 +66,17 @@
"sonarr": { "sonarr": {
"wanted": "Demande", "wanted": "Demande",
"queued": "Attente", "queued": "Attente",
"series": "Séries" "series": "Séries",
"queue": "Attente",
"unknown": "Inconnu"
}, },
"radarr": { "radarr": {
"wanted": "Demande", "wanted": "Demande",
"queued": "Attente", "queued": "Attente",
"movies": "Films", "movies": "Films",
"missing": "Manquant" "missing": "Manquant",
"queue": "Attente",
"unknown": "Inconnu"
}, },
"readarr": { "readarr": {
"wanted": "Demande", "wanted": "Demande",
@@ -173,7 +177,7 @@
"lidarr": { "lidarr": {
"wanted": "Demandé", "wanted": "Demandé",
"queued": "En queue", "queued": "En queue",
"albums": "Albums" "artists": "Artistes"
}, },
"adguard": { "adguard": {
"queries": "Requêtes", "queries": "Requêtes",
@@ -234,12 +238,16 @@
}, },
"glances": { "glances": {
"cpu": "Cpu", "cpu": "Cpu",
"mem": "Mém",
"wait": "Merci de patienter", "wait": "Merci de patienter",
"temp": "Temp", "temp": "Temp",
"uptime": "Up", "uptime": "Up",
"days": "j", "days": "j",
"hours": "h" "hours": "h",
"load": "Charge",
"warn": "Alerte",
"total": "Total",
"free": "Libre",
"used": "Utilisé"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "Total Observé", "totalObserved": "Total Observé",
@@ -393,7 +401,7 @@
"queue": "À traiter", "queue": "À traiter",
"processed": "Traité", "processed": "Traité",
"errored": "En erreur", "errored": "En erreur",
"saved": "Economisé" "saved": "Libéré"
}, },
"miniflux": { "miniflux": {
"read": "Lu", "read": "Lu",
@@ -604,7 +612,9 @@
"cpuUsage": "Cpu", "cpuUsage": "Cpu",
"memUsage": "Mém", "memUsage": "Mém",
"systemTempC": "Temp", "systemTempC": "Temp",
"poolUsage": "Pool" "poolUsage": "Pool",
"volumeUsage": "Volume",
"invalid": "Invalide"
}, },
"pfsense": { "pfsense": {
"load": "Charge moy.", "load": "Charge moy.",
@@ -628,5 +638,11 @@
"home_power": "Consommation", "home_power": "Consommation",
"charge_power": "Chargeur", "charge_power": "Chargeur",
"watt_hour": "Wh" "watt_hour": "Wh"
},
"pialert": {
"total": "Total",
"connected": "Connecté",
"new_devices": "Nouvel Appareil",
"down_alerts": "Alertes"
} }
} }

View File

@@ -94,18 +94,22 @@
"sonarr": { "sonarr": {
"wanted": "מבוקש", "wanted": "מבוקש",
"queued": "בתור", "queued": "בתור",
"series": "סדרות" "series": "סדרות",
"queue": "Queue",
"unknown": "Unknown"
}, },
"radarr": { "radarr": {
"wanted": "מבוקש", "wanted": "מבוקש",
"queued": "בתור", "queued": "בתור",
"movies": "סרטים", "movies": "סרטים",
"missing": "Missing" "missing": "Missing",
"queue": "Queue",
"unknown": "Unknown"
}, },
"lidarr": { "lidarr": {
"wanted": "מבוקש", "wanted": "מבוקש",
"queued": "בתור", "queued": "בתור",
"albums": "אלבומים" "artists": "Artists"
}, },
"readarr": { "readarr": {
"wanted": "מבוקש", "wanted": "מבוקש",
@@ -234,12 +238,16 @@
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
"mem": "MEM",
"wait": "Please wait", "wait": "Please wait",
"temp": "TEMP", "temp": "TEMP",
"uptime": "UP", "uptime": "UP",
"days": "d", "days": "d",
"hours": "h" "hours": "h",
"warn": "Warn",
"load": "Load",
"total": "Total",
"free": "Free",
"used": "Used"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "Total Observed", "totalObserved": "Total Observed",
@@ -604,7 +612,9 @@
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Usage" "poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"load": "Load Avg", "load": "Load Avg",
@@ -628,5 +638,11 @@
"home_power": "Consumption", "home_power": "Consumption",
"charge_power": "Charger", "charge_power": "Charger",
"watt_hour": "Wh" "watt_hour": "Wh"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
} }
} }

View File

@@ -155,18 +155,22 @@
"sonarr": { "sonarr": {
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series",
"queue": "Queue",
"unknown": "Unknown"
}, },
"radarr": { "radarr": {
"wanted": "Wanted", "wanted": "Wanted",
"missing": "Missing", "missing": "Missing",
"queued": "Queued", "queued": "Queued",
"movies": "Movies" "movies": "Movies",
"queue": "Queue",
"unknown": "Unknown"
}, },
"lidarr": { "lidarr": {
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"albums": "Albums" "artists": "Artists"
}, },
"overseerr": { "overseerr": {
"pending": "Pending", "pending": "Pending",
@@ -242,12 +246,16 @@
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
"mem": "MEM",
"wait": "Please wait", "wait": "Please wait",
"temp": "TEMP", "temp": "TEMP",
"uptime": "UP", "uptime": "UP",
"days": "d", "days": "d",
"hours": "h" "hours": "h",
"load": "Load",
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
}, },
"quicklaunch": { "quicklaunch": {
"bookmark": "Bookmark", "bookmark": "Bookmark",
@@ -604,7 +612,9 @@
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Usage" "poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"load": "Load Avg", "load": "Load Avg",
@@ -628,5 +638,11 @@
"home_power": "Consumption", "home_power": "Consumption",
"charge_power": "Charger", "charge_power": "Charger",
"watt_hour": "Wh" "watt_hour": "Wh"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
} }
} }

View File

@@ -125,18 +125,22 @@
"sonarr": { "sonarr": {
"wanted": "Zatraženo", "wanted": "Zatraženo",
"queued": "U redu čekanja", "queued": "U redu čekanja",
"series": "Serije" "series": "Serije",
"unknown": "Unknown",
"queue": "Queue"
}, },
"radarr": { "radarr": {
"wanted": "Zatraženo", "wanted": "Zatraženo",
"queued": "U redu čekanja", "queued": "U redu čekanja",
"movies": "Filmovi", "movies": "Filmovi",
"missing": "Nedostaje" "missing": "Nedostaje",
"queue": "Queue",
"unknown": "Unknown"
}, },
"lidarr": { "lidarr": {
"wanted": "Zatraženo", "wanted": "Zatraženo",
"queued": "U redu čekanja", "queued": "U redu čekanja",
"albums": "Albumi" "artists": "Artists"
}, },
"readarr": { "readarr": {
"wanted": "Zatraženo", "wanted": "Zatraženo",
@@ -234,12 +238,16 @@
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
"mem": "MEM",
"wait": "Pričekaj", "wait": "Pričekaj",
"temp": "TEMP", "temp": "TEMP",
"uptime": "UP", "uptime": "UP",
"days": "d", "days": "d",
"hours": "h" "hours": "h",
"used": "Korišteno",
"load": "Opterećenje",
"warn": "Upozori",
"total": "Ukupno",
"free": "Slobodno"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "Ukupno promatrano", "totalObserved": "Ukupno promatrano",
@@ -474,7 +482,7 @@
"up": "Aktivne stranice", "up": "Aktivne stranice",
"down": "Neaktivne stranice", "down": "Neaktivne stranice",
"uptime": "Radno vrijeme", "uptime": "Radno vrijeme",
"incident": "Incident", "incident": "Slučaj",
"m": "min" "m": "min"
}, },
"komga": { "komga": {
@@ -604,29 +612,37 @@
"systemTempC": "Temperatura sustava", "systemTempC": "Temperatura sustava",
"poolUsage": "Korištenje memorijskog skupa", "poolUsage": "Korištenje memorijskog skupa",
"cpuUsage": "Korištenje procesora", "cpuUsage": "Korištenje procesora",
"memUsage": "Korištenje memorije" "memUsage": "Korištenje memorije",
"volumeUsage": "Korištenje jedinice memorije",
"invalid": "Neispravno"
}, },
"pfsense": { "pfsense": {
"load": "Load Avg", "load": "Prosječno opterećenje",
"memory": "Mem Usage", "memory": "Korištenje memorije",
"wanStatus": "WAN Status", "wanStatus": "Stanje WAN-a",
"up": "Up", "up": "Up",
"down": "Down", "down": "Down",
"temp": "Temp", "temp": "Temperatura",
"disk": "Disk Usage", "disk": "Korištenje diska",
"wanIP": "WAN IP" "wanIP": "WAN IP"
}, },
"caddy": { "caddy": {
"upstreams": "Upstreams", "upstreams": "Glavne grane",
"requests": "Current requests", "requests": "Aktualni zahtjevi",
"requests_failed": "Failed requests" "requests_failed": "Neuspjeli zahtjevi"
}, },
"evcc": { "evcc": {
"pv_power": "Production", "pv_power": "Proizvodnja",
"battery_soc": "Battery", "battery_soc": "Baterija",
"grid_power": "Grid", "grid_power": "Raspored",
"home_power": "Consumption", "home_power": "Potrošnja",
"charge_power": "Charger", "charge_power": "Punjač",
"watt_hour": "Wh" "watt_hour": "Wh"
},
"pialert": {
"total": "Ukupno",
"connected": "Povezano",
"new_devices": "Novi uređaji",
"down_alerts": "Obavijest o rušenju"
} }
} }

View File

@@ -31,9 +31,9 @@
"healthy": "Healthy" "healthy": "Healthy"
}, },
"lidarr": { "lidarr": {
"albums": "Albumok",
"wanted": "Keresett", "wanted": "Keresett",
"queued": "Sorban áll" "queued": "Sorban áll",
"artists": "Artists"
}, },
"readarr": { "readarr": {
"wanted": "Keresett", "wanted": "Keresett",
@@ -108,13 +108,17 @@
"sonarr": { "sonarr": {
"wanted": "Keresett", "wanted": "Keresett",
"queued": "Sorban áll", "queued": "Sorban áll",
"series": "Sorozat" "series": "Sorozat",
"queue": "Queue",
"unknown": "Unknown"
}, },
"radarr": { "radarr": {
"wanted": "Keresett", "wanted": "Keresett",
"queued": "Sorban áll", "queued": "Sorban áll",
"movies": "Filmek", "movies": "Filmek",
"missing": "Missing" "missing": "Missing",
"queue": "Queue",
"unknown": "Unknown"
}, },
"ombi": { "ombi": {
"pending": "Függőben", "pending": "Függőben",
@@ -234,12 +238,16 @@
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
"mem": "MEM",
"wait": "Please wait", "wait": "Please wait",
"temp": "TEMP", "temp": "TEMP",
"uptime": "UP", "uptime": "UP",
"days": "d", "days": "d",
"hours": "h" "hours": "h",
"load": "Load",
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "Total Observed", "totalObserved": "Total Observed",
@@ -604,7 +612,9 @@
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Usage" "poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"load": "Load Avg", "load": "Load Avg",
@@ -628,5 +638,11 @@
"home_power": "Consumption", "home_power": "Consumption",
"charge_power": "Charger", "charge_power": "Charger",
"watt_hour": "Wh" "watt_hour": "Wh"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
} }
} }

View File

@@ -0,0 +1,648 @@
{
"nzbget": {
"downloaded": "Downloaded",
"rate": "Rate",
"remaining": "Remaining"
},
"plex": {
"streams": "Active Streams",
"albums": "Albums",
"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"
},
"qnap": {
"cpuUsage": "CPU Usage",
"memUsage": "MEM Usage",
"poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"systemTempC": "System Temp",
"invalid": "Invalid"
},
"deluge": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"sonarr": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series",
"queue": "Queue",
"unknown": "Unknown"
},
"radarr": {
"wanted": "Wanted",
"missing": "Missing",
"queued": "Queued",
"movies": "Movies",
"queue": "Queue",
"unknown": "Unknown"
},
"lidarr": {
"wanted": "Wanted",
"queued": "Queued",
"artists": "Artists"
},
"readarr": {
"wanted": "Wanted",
"queued": "Queued",
"books": "Books"
},
"bazarr": {
"missingEpisodes": "Missing Episodes",
"missingMovies": "Missing Movies"
},
"ombi": {
"pending": "Pending",
"approved": "Approved",
"available": "Available"
},
"jellyseerr": {
"approved": "Approved",
"pending": "Pending",
"available": "Available"
},
"overseerr": {
"approved": "Approved",
"available": "Available",
"pending": "Pending",
"processing": "Processing"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
},
"pihole": {
"queries": "Queries",
"blocked": "Blocked",
"blocked_percent": "Blocked %",
"gravity": "Gravity"
},
"adguard": {
"queries": "Queries",
"blocked": "Blocked",
"filtered": "Filtered",
"latency": "Latency"
},
"speedtest": {
"upload": "Upload",
"download": "Download",
"ping": "Ping"
},
"tailscale": {
"address": "Address",
"expires": "Expires",
"never": "Never",
"last_seen": "Last Seen",
"now": "Now",
"years": "{{number}}y",
"weeks": "{{number}}w",
"days": "{{number}}d",
"hours": "{{number}}h",
"minutes": "{{number}}m",
"seconds": "{{number}}s",
"ago": "{{value}} Ago"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
"traefik": {
"routers": "Routers",
"services": "Services",
"middleware": "Middleware"
},
"npm": {
"disabled": "Disabled",
"enabled": "Enabled",
"total": "Total"
},
"navidrome": {
"nothing_streaming": "No Active Streams",
"please_wait": "Please Wait"
},
"coinmarketcap": {
"configure": "Configure one or more crypto currencies to track",
"1hour": "1 Hour",
"1day": "1 Day",
"7days": "7 Days",
"30days": "30 Days"
},
"prowlarr": {
"numberOfGrabs": "Grabs",
"numberOfQueries": "Queries",
"enableIndexers": "Indexers",
"numberOfFailGrabs": "Fail Grabs",
"numberOfFailQueries": "Fail Queries"
},
"gotify": {
"apps": "Applications",
"clients": "Clients",
"messages": "Messages"
},
"jackett": {
"configured": "Configured",
"errored": "Errored"
},
"strelaysrv": {
"numActiveSessions": "Sessions",
"numConnections": "Connections",
"dataRelayed": "Relayed",
"transferRate": "Rate"
},
"mastodon": {
"user_count": "Users",
"status_count": "Posts",
"domain_count": "Domains"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"minecraft": {
"players": "Players",
"version": "Version",
"status": "Status",
"up": "Online",
"down": "Offline"
},
"authentik": {
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)",
"users": "Users"
},
"proxmox": {
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs",
"mem": "MEM"
},
"glances": {
"temp": "TEMP",
"warn": "Warn",
"uptime": "UP",
"total": "Total",
"free": "Free",
"cpu": "CPU",
"load": "Load",
"wait": "Please wait",
"used": "Used",
"days": "d",
"hours": "h"
},
"quicklaunch": {
"bookmark": "Bookmark",
"service": "Service",
"search": "Search",
"custom": "Custom",
"visit": "Visit",
"url": "URL"
},
"wmo": {
"0-night": "Clear",
"0-day": "Sunny",
"1-day": "Mainly Sunny",
"1-night": "Mainly Clear",
"2-day": "Partly Cloudy",
"2-night": "Partly Cloudy",
"56-day": "Light Freezing Drizzle",
"56-night": "Light Freezing Drizzle",
"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",
"57-day": "Freezing Drizzle",
"57-night": "Freezing Drizzle",
"61-day": "Light Rain",
"61-night": "Light Rain",
"63-day": "Rain",
"63-night": "Rain",
"71-day": "Light Snow",
"71-night": "Light Snow",
"73-day": "Snow",
"73-night": "Snow",
"65-day": "Heavy Rain",
"65-night": "Heavy Rain",
"66-day": "Freezing Rain",
"66-night": "Freezing Rain",
"67-day": "Freezing Rain",
"67-night": "Freezing Rain",
"75-day": "Heavy Snow",
"75-night": "Heavy Snow",
"77-day": "Snow Grains",
"77-night": "Snow Grains",
"80-day": "Light 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",
"99-day": "Thunderstorm With Hail",
"99-night": "Thunderstorm With Hail",
"80-night": "Light Showers",
"81-day": "Showers",
"81-night": "Showers",
"95-day": "Thunderstorm",
"95-night": "Thunderstorm",
"96-day": "Thunderstorm With Hail",
"96-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}}",
"up": "Up",
"pending": "Pending",
"down": "Down"
},
"healthchecks": {
"grace": "In Grace Period",
"down": "Offline",
"paused": "Paused",
"status": "Status",
"last_ping": "Last Ping",
"never": "No pings yet",
"new": "New",
"up": "Online"
},
"watchtower": {
"containers_scanned": "Scanned",
"containers_updated": "Updated",
"containers_failed": "Failed"
},
"autobrr": {
"approvedPushes": "Approved",
"rejectedPushes": "Rejected",
"filters": "Filters",
"indexers": "Indexers"
},
"tubearchivist": {
"downloads": "Queue",
"videos": "Videos",
"channels": "Channels",
"playlists": "Playlists"
},
"truenas": {
"load": "System Load",
"uptime": "Uptime",
"alerts": "Alerts",
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
},
"pyload": {
"speed": "Speed",
"active": "Active",
"queue": "Queue",
"total": "Total"
},
"gluetun": {
"public_ip": "Public IP",
"region": "Region",
"country": "Country"
},
"hdhomerun": {
"channels": "Channels",
"hd": "HD"
},
"paperlessngx": {
"inbox": "Inbox",
"total": "Total"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
},
"mikrotik": {
"cpuLoad": "CPU Load",
"memoryUsed": "Memory Used",
"uptime": "Uptime",
"numberOfLeases": "Leases"
},
"xteve": {
"streams_all": "All Streams",
"streams_active": "Active Streams",
"streams_xepg": "XEPG Channels"
},
"opnsense": {
"cpu": "CPU Load",
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
},
"moonraker": {
"print_status": "Print Status",
"printer_state": "Printer State",
"print_progress": "Progress",
"layers": "Layers"
},
"octoprint": {
"printer_state": "Status",
"temp_bed": "Bed temp",
"job_completion": "Completion",
"temp_tool": "Tool temp"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"pfsense": {
"load": "Load Avg",
"memory": "Mem Usage",
"wanStatus": "WAN Status",
"up": "Up",
"down": "Down",
"temp": "Temp",
"disk": "Disk Usage",
"wanIP": "WAN IP"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"videos": "Videos",
"storage": "Storage",
"users": "Users",
"photos": "Photos"
},
"uptimekuma": {
"up": "Sites Up",
"down": "Sites Down",
"uptime": "Uptime",
"incident": "Incident",
"m": "m"
},
"komga": {
"libraries": "Libraries",
"series": "Series",
"books": "Books"
},
"diskstation": {
"days": "Days",
"uptime": "Uptime",
"volumeAvailable": "Available"
},
"mylar": {
"series": "Series",
"issues": "Issues",
"wanted": "Wanted"
},
"photoprism": {
"people": "People",
"albums": "Albums",
"photos": "Photos",
"videos": "Videos"
},
"fileflows": {
"queue": "Queue",
"processing": "Processing",
"processed": "Processed",
"time": "Time"
},
"grafana": {
"dashboards": "Dashboards",
"datasources": "Data Sources",
"totalalerts": "Total Alerts",
"alertstriggered": "Alerts Triggered"
},
"nextcloud": {
"cpuload": "Cpu Load",
"memoryusage": "Memory Usage",
"freespace": "Free Space",
"activeusers": "Active Users",
"numfiles": "Files",
"numshares": "Shared Items"
},
"kopia": {
"status": "Status",
"nextrun": "Next Run",
"size": "Size",
"failed": "Failed",
"lastrun": "Last Run"
},
"unmanic": {
"active_workers": "Active Workers",
"total_workers": "Total Workers",
"records_total": "Queue Length"
},
"ghostfolio": {
"gross_percent_max": "All time",
"gross_percent_today": "Today",
"gross_percent_1y": "One year"
},
"audiobookshelf": {
"podcasts": "Podcasts",
"podcastsDuration": "Duration",
"books": "Books",
"booksDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
},
"weather": {
"wait": "Harap tunggu",
"current": "Current Location",
"allow": "Click to allow",
"updating": "Updating"
},
"search": {
"placeholder": "Telusuri…"
},
"unifi": {
"lan_devices": "LAN Devices",
"wlan_devices": "WLAN Devices",
"lan_users": "LAN Users",
"users": "Users",
"uptime": "System Uptime",
"days": "Days",
"wan": "WAN",
"lan": "LAN",
"wlan": "WLAN",
"devices": "Devices",
"wlan_users": "WLAN Users",
"up": "UP",
"down": "DOWN",
"wait": "Please wait",
"empty_data": "Subsystem status unknown"
},
"docker": {
"rx": "RX",
"tx": "TX",
"mem": "MEM",
"cpu": "CPU",
"running": "Running",
"offline": "Offline",
"error": "Error",
"unknown": "Unknown",
"healthy": "Healthy",
"starting": "Starting",
"unhealthy": "Unhealthy",
"not_found": "Not Found",
"exited": "Exited",
"partial": "Partial"
},
"freshrss": {
"unread": "Unread",
"subscriptions": "Subscriptions"
},
"caddy": {
"upstreams": "Upstreams",
"requests": "Current requests",
"requests_failed": "Failed requests"
},
"omada": {
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
},
"portainer": {
"running": "Running",
"stopped": "Stopped",
"total": "Total"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"scrutiny": {
"passed": "Passed",
"failed": "Failed",
"unknown": "Unknown"
},
"pterodactyl": {
"servers": "Servers",
"nodes": "Nodes"
},
"prometheus": {
"targets_up": "Targets Up",
"targets_down": "Targets Down",
"targets_total": "Total Targets"
},
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"widget": {
"missing_type": "Missing Widget Type: {{type}}",
"api_error": "API Error",
"information": "Informasi",
"status": "Status",
"url": "URL",
"raw_error": "Raw Error",
"response_data": "Response Data"
},
"resources": {
"cpu": "CPU",
"mem": "MEM",
"total": "Total",
"free": "Free",
"used": "Used",
"load": "Load",
"temp": "TEMP",
"max": "Max",
"uptime": "UP",
"months": "mo",
"hours": "h",
"days": "d",
"minutes": "m"
},
"ping": {
"error": "Error",
"ping": "Ping"
},
"emby": {
"playing": "Playing",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"no_active": "No Active Streams",
"movies": "Movies",
"series": "Series",
"episodes": "Episodes",
"songs": "Songs"
},
"evcc": {
"pv_power": "Production",
"home_power": "Consumption",
"charge_power": "Charger",
"battery_soc": "Battery",
"grid_power": "Grid",
"watt_hour": "Wh"
},
"flood": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"changedetectionio": {
"totalObserved": "Total Observed",
"diffsDetected": "Diffs Detected"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"tautulli": {
"playing": "Playing",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"no_active": "No Active Streams"
}
}

View File

@@ -81,13 +81,17 @@
"sonarr": { "sonarr": {
"series": "Serie", "series": "Serie",
"wanted": "Richiesti", "wanted": "Richiesti",
"queued": "In coda" "queued": "In coda",
"queue": "Queue",
"unknown": "Unknown"
}, },
"radarr": { "radarr": {
"wanted": "Richiesti", "wanted": "Richiesti",
"queued": "In coda", "queued": "In coda",
"movies": "Film", "movies": "Film",
"missing": "Mancanti" "missing": "Mancanti",
"queue": "Queue",
"unknown": "Unknown"
}, },
"readarr": { "readarr": {
"wanted": "Richiesti", "wanted": "Richiesti",
@@ -173,7 +177,7 @@
"lidarr": { "lidarr": {
"wanted": "Mancanti", "wanted": "Mancanti",
"queued": "In coda", "queued": "In coda",
"albums": "Album" "artists": "Artists"
}, },
"adguard": { "adguard": {
"queries": "Interrogazioni", "queries": "Interrogazioni",
@@ -234,12 +238,16 @@
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
"mem": "MEM",
"wait": "Attendere prego", "wait": "Attendere prego",
"temp": "TEMP", "temp": "TEMP",
"uptime": "UP", "uptime": "UP",
"days": "d", "days": "d",
"hours": "h" "hours": "h",
"load": "Load",
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "Totale Osservato", "totalObserved": "Totale Osservato",
@@ -604,7 +612,9 @@
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Usage" "poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"load": "Load Avg", "load": "Load Avg",
@@ -628,5 +638,11 @@
"home_power": "Consumption", "home_power": "Consumption",
"charge_power": "Charger", "charge_power": "Charger",
"watt_hour": "Wh" "watt_hour": "Wh"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
} }
} }

View File

@@ -15,13 +15,17 @@
"transferRate": "レート" "transferRate": "レート"
}, },
"glances": { "glances": {
"mem": "MEM",
"cpu": "CPU", "cpu": "CPU",
"wait": "お待ちください", "wait": "お待ちください",
"temp": "温度", "temp": "温度",
"uptime": "UP", "uptime": "UP",
"days": "日", "days": "日",
"hours": "時間" "hours": "時間",
"load": "Load",
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
}, },
"autobrr": { "autobrr": {
"filters": "フィルター", "filters": "フィルター",
@@ -189,18 +193,22 @@
"sonarr": { "sonarr": {
"wanted": "募集中", "wanted": "募集中",
"queued": "待機中", "queued": "待機中",
"series": "シリーズ" "series": "シリーズ",
"queue": "Queue",
"unknown": "Unknown"
}, },
"radarr": { "radarr": {
"wanted": "募集中", "wanted": "募集中",
"missing": "不明", "missing": "不明",
"queued": "キュー", "queued": "キュー",
"movies": "映画" "movies": "映画",
"queue": "Queue",
"unknown": "Unknown"
}, },
"lidarr": { "lidarr": {
"wanted": "募集中", "wanted": "募集中",
"queued": "キュー", "queued": "キュー",
"albums": "アルバム" "artists": "Artists"
}, },
"readarr": { "readarr": {
"wanted": "募集中", "wanted": "募集中",
@@ -604,7 +612,9 @@
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Usage" "poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"up": "Up", "up": "Up",
@@ -628,5 +638,11 @@
"grid_power": "Grid", "grid_power": "Grid",
"home_power": "Consumption", "home_power": "Consumption",
"charge_power": "Charger" "charge_power": "Charger"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
} }
} }

View File

@@ -163,18 +163,22 @@
"sonarr": { "sonarr": {
"wanted": "요청", "wanted": "요청",
"queued": "대기 중", "queued": "대기 중",
"series": "시리즈" "series": "시리즈",
"queue": "Queue",
"unknown": "Unknown"
}, },
"radarr": { "radarr": {
"wanted": "요청", "wanted": "요청",
"missing": "빠짐", "missing": "빠짐",
"queued": "대기 중", "queued": "대기 중",
"movies": "영화" "movies": "영화",
"queue": "Queue",
"unknown": "Unknown"
}, },
"lidarr": { "lidarr": {
"wanted": "요청", "wanted": "요청",
"queued": "대기 중", "queued": "대기 중",
"albums": "앨범" "artists": "Artists"
}, },
"readarr": { "readarr": {
"wanted": "요청", "wanted": "요청",
@@ -301,12 +305,16 @@
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
"mem": "MEM",
"wait": "Please wait", "wait": "Please wait",
"temp": "TEMP", "temp": "TEMP",
"uptime": "UP", "uptime": "UP",
"days": "d", "days": "d",
"hours": "h" "hours": "h",
"load": "Load",
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
}, },
"quicklaunch": { "quicklaunch": {
"bookmark": "Bookmark", "bookmark": "Bookmark",
@@ -604,7 +612,9 @@
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Usage" "poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"temp": "Temp", "temp": "Temp",
@@ -628,5 +638,11 @@
"home_power": "Consumption", "home_power": "Consumption",
"charge_power": "Charger", "charge_power": "Charger",
"watt_hour": "Wh" "watt_hour": "Wh"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"down_alerts": "Down Alerts",
"new_devices": "New Devices"
} }
} }

View File

@@ -154,18 +154,22 @@
"sonarr": { "sonarr": {
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series",
"queue": "Queue",
"unknown": "Unknown"
}, },
"radarr": { "radarr": {
"wanted": "Wanted", "wanted": "Wanted",
"missing": "Missing", "missing": "Missing",
"queued": "Queued", "queued": "Queued",
"movies": "Filmas" "movies": "Filmas",
"queue": "Queue",
"unknown": "Unknown"
}, },
"lidarr": { "lidarr": {
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"albums": "Albumi" "artists": "Artists"
}, },
"readarr": { "readarr": {
"wanted": "Wanted", "wanted": "Wanted",
@@ -290,12 +294,16 @@
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
"mem": "MEM",
"wait": "Please wait", "wait": "Please wait",
"uptime": "UP", "uptime": "UP",
"days": "d", "days": "d",
"hours": "h", "hours": "h",
"temp": "TEMP" "temp": "TEMP",
"load": "Load",
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
}, },
"quicklaunch": { "quicklaunch": {
"bookmark": "Bookmark", "bookmark": "Bookmark",
@@ -604,7 +612,9 @@
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Usage" "poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"load": "Load Avg", "load": "Load Avg",
@@ -628,5 +638,11 @@
"home_power": "Consumption", "home_power": "Consumption",
"charge_power": "Charger", "charge_power": "Charger",
"watt_hour": "Wh" "watt_hour": "Wh"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
} }
} }

View File

@@ -33,8 +33,8 @@
}, },
"lidarr": { "lidarr": {
"queued": "Dibaris Gilir", "queued": "Dibaris Gilir",
"albums": "Album", "wanted": "Mahu",
"wanted": "Mahu" "artists": "Artists"
}, },
"readarr": { "readarr": {
"wanted": "Mahu", "wanted": "Mahu",
@@ -66,12 +66,16 @@
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
"mem": "MEM",
"wait": "Sila tunggu", "wait": "Sila tunggu",
"temp": "TEMP", "temp": "TEMP",
"uptime": "UP", "uptime": "UP",
"days": "d", "days": "d",
"hours": "h" "hours": "h",
"load": "Load",
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
}, },
"quicklaunch": { "quicklaunch": {
"bookmark": "Tandabuku", "bookmark": "Tandabuku",
@@ -229,13 +233,17 @@
"sonarr": { "sonarr": {
"wanted": "Mahu", "wanted": "Mahu",
"queued": "Dibaris Gilir", "queued": "Dibaris Gilir",
"series": "Bersiri" "series": "Bersiri",
"queue": "Queue",
"unknown": "Unknown"
}, },
"radarr": { "radarr": {
"wanted": "Mahu", "wanted": "Mahu",
"missing": "Hilang", "missing": "Hilang",
"queued": "Dibaris Gilir", "queued": "Dibaris Gilir",
"movies": "Filem" "movies": "Filem",
"queue": "Queue",
"unknown": "Unknown"
}, },
"bazarr": { "bazarr": {
"missingEpisodes": "Episod Yang Hilang", "missingEpisodes": "Episod Yang Hilang",
@@ -604,7 +612,9 @@
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Usage" "poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"load": "Load Avg", "load": "Load Avg",
@@ -628,5 +638,11 @@
"home_power": "Consumption", "home_power": "Consumption",
"charge_power": "Charger", "charge_power": "Charger",
"watt_hour": "Wh" "watt_hour": "Wh"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
} }
} }

View File

@@ -66,13 +66,17 @@
"sonarr": { "sonarr": {
"wanted": "Ønsket", "wanted": "Ønsket",
"queued": "I kø", "queued": "I kø",
"series": "Serie" "series": "Serie",
"unknown": "Unknown",
"queue": "Queue"
}, },
"radarr": { "radarr": {
"wanted": "Ønsket", "wanted": "Ønsket",
"queued": "I kø", "queued": "I kø",
"movies": "Filmer", "movies": "Filmer",
"missing": "Missing" "missing": "Missing",
"queue": "Queue",
"unknown": "Unknown"
}, },
"readarr": { "readarr": {
"wanted": "Wanted", "wanted": "Wanted",
@@ -173,7 +177,7 @@
"lidarr": { "lidarr": {
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"albums": "Albums" "artists": "Artists"
}, },
"adguard": { "adguard": {
"queries": "Queries", "queries": "Queries",
@@ -234,12 +238,16 @@
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
"mem": "MEM",
"wait": "Please wait", "wait": "Please wait",
"temp": "TEMP", "temp": "TEMP",
"uptime": "UP", "uptime": "UP",
"days": "d", "days": "d",
"hours": "h" "hours": "h",
"load": "Load",
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "Total Observed", "totalObserved": "Total Observed",
@@ -604,7 +612,9 @@
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Usage" "poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"load": "Load Avg", "load": "Load Avg",
@@ -628,5 +638,11 @@
"home_power": "Consumption", "home_power": "Consumption",
"charge_power": "Charger", "charge_power": "Charger",
"watt_hour": "Wh" "watt_hour": "Wh"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
} }
} }

View File

@@ -82,13 +82,17 @@
"sonarr": { "sonarr": {
"wanted": "Gezocht", "wanted": "Gezocht",
"queued": "In de wachtrij", "queued": "In de wachtrij",
"series": "Series" "series": "Series",
"queue": "Queue",
"unknown": "Unknown"
}, },
"radarr": { "radarr": {
"movies": "Films", "movies": "Films",
"wanted": "Gezocht", "wanted": "Gezocht",
"queued": "In de wachtrij", "queued": "In de wachtrij",
"missing": "Missend" "missing": "Missend",
"queue": "Queue",
"unknown": "Unknown"
}, },
"readarr": { "readarr": {
"wanted": "Gezocht", "wanted": "Gezocht",
@@ -173,7 +177,7 @@
"lidarr": { "lidarr": {
"wanted": "Gezocht", "wanted": "Gezocht",
"queued": "In de wachtrij", "queued": "In de wachtrij",
"albums": "Albums" "artists": "Artists"
}, },
"adguard": { "adguard": {
"queries": "Queries", "queries": "Queries",
@@ -234,12 +238,16 @@
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
"mem": "MEM",
"wait": "Please wait", "wait": "Please wait",
"temp": "TEMP", "temp": "TEMP",
"uptime": "UP", "uptime": "UP",
"days": "d", "days": "d",
"hours": "h" "hours": "h",
"load": "Load",
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "Totaal waargenomen", "totalObserved": "Totaal waargenomen",
@@ -604,7 +612,9 @@
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Usage" "poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"load": "Load Avg", "load": "Load Avg",
@@ -628,5 +638,11 @@
"home_power": "Consumption", "home_power": "Consumption",
"charge_power": "Charger", "charge_power": "Charger",
"watt_hour": "Wh" "watt_hour": "Wh"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
} }
} }

View File

@@ -110,18 +110,22 @@
"sonarr": { "sonarr": {
"wanted": "Poszukiwane", "wanted": "Poszukiwane",
"queued": "W kolejce", "queued": "W kolejce",
"series": "Seriale" "series": "Seriale",
"queue": "Queue",
"unknown": "Unknown"
}, },
"radarr": { "radarr": {
"wanted": "Poszukiwane", "wanted": "Poszukiwane",
"queued": "W kolejce", "queued": "W kolejce",
"movies": "Filmy", "movies": "Filmy",
"missing": "Brakujące" "missing": "Brakujące",
"queue": "Queue",
"unknown": "Unknown"
}, },
"lidarr": { "lidarr": {
"wanted": "Poszukiwane", "wanted": "Poszukiwane",
"queued": "W kolejce", "queued": "W kolejce",
"albums": "Albumy" "artists": "Artists"
}, },
"readarr": { "readarr": {
"wanted": "Poszukiwane", "wanted": "Poszukiwane",
@@ -234,12 +238,16 @@
}, },
"glances": { "glances": {
"cpu": "Procesor", "cpu": "Procesor",
"mem": "Pamięć",
"wait": "Proszę czekać", "wait": "Proszę czekać",
"temp": "TEMP", "temp": "TEMP",
"uptime": "CZAS", "uptime": "CZAS",
"days": "dni", "days": "dni",
"hours": "godz" "hours": "godz",
"load": "Load",
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
}, },
"changedetectionio": { "changedetectionio": {
"diffsDetected": "Wykryto różnic", "diffsDetected": "Wykryto różnic",
@@ -604,7 +612,9 @@
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Usage" "poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"load": "Load Avg", "load": "Load Avg",
@@ -628,5 +638,11 @@
"home_power": "Consumption", "home_power": "Consumption",
"charge_power": "Charger", "charge_power": "Charger",
"watt_hour": "Wh" "watt_hour": "Wh"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
} }
} }

View File

@@ -112,18 +112,22 @@
"sonarr": { "sonarr": {
"wanted": "Desejado", "wanted": "Desejado",
"queued": "Na fila", "queued": "Na fila",
"series": "Séries" "series": "Séries",
"queue": "Queue",
"unknown": "Unknown"
}, },
"radarr": { "radarr": {
"wanted": "Desejado", "wanted": "Desejado",
"queued": "Na fila", "queued": "Na fila",
"movies": "Filmes", "movies": "Filmes",
"missing": "Faltando" "missing": "Faltando",
"queue": "Queue",
"unknown": "Unknown"
}, },
"lidarr": { "lidarr": {
"wanted": "Desejado", "wanted": "Desejado",
"queued": "Na fila", "queued": "Na fila",
"albums": "Álbuns" "artists": "Artists"
}, },
"readarr": { "readarr": {
"wanted": "Desejado", "wanted": "Desejado",
@@ -234,12 +238,16 @@
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
"mem": "MEM",
"wait": "Por favor aguarde", "wait": "Por favor aguarde",
"temp": "TEMP", "temp": "TEMP",
"uptime": "LIGADO", "uptime": "LIGADO",
"days": "d", "days": "d",
"hours": "h" "hours": "h",
"load": "Load",
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "Observados", "totalObserved": "Observados",
@@ -604,7 +612,9 @@
"systemTempC": "System Temp", "systemTempC": "System Temp",
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"poolUsage": "Pool Usage" "poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"load": "Load Avg", "load": "Load Avg",
@@ -628,5 +638,11 @@
"home_power": "Consumption", "home_power": "Consumption",
"charge_power": "Charger", "charge_power": "Charger",
"watt_hour": "Wh" "watt_hour": "Wh"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
} }
} }

View File

@@ -66,13 +66,17 @@
"sonarr": { "sonarr": {
"wanted": "Desejada", "wanted": "Desejada",
"queued": "Em fila", "queued": "Em fila",
"series": "Séries" "series": "Séries",
"queue": "Queue",
"unknown": "Unknown"
}, },
"radarr": { "radarr": {
"wanted": "Desejado", "wanted": "Desejado",
"queued": "Fila", "queued": "Fila",
"movies": "Filmes", "movies": "Filmes",
"missing": "Faltando" "missing": "Faltando",
"queue": "Queue",
"unknown": "Unknown"
}, },
"readarr": { "readarr": {
"wanted": "Desejados", "wanted": "Desejados",
@@ -186,7 +190,7 @@
"lidarr": { "lidarr": {
"queued": "Enfileirado", "queued": "Enfileirado",
"wanted": "Desejado", "wanted": "Desejado",
"albums": "Álbuns" "artists": "Artists"
}, },
"adguard": { "adguard": {
"queries": "Consultas", "queries": "Consultas",
@@ -247,12 +251,16 @@
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
"mem": "MEM",
"wait": "Por favor, aguarde", "wait": "Por favor, aguarde",
"temp": "TEMP", "temp": "TEMP",
"uptime": "Cima", "uptime": "Cima",
"days": "d", "days": "d",
"hours": "h" "hours": "h",
"load": "Load",
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "Total Observado", "totalObserved": "Total Observado",
@@ -613,7 +621,9 @@
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Usage" "poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"load": "Load Avg", "load": "Load Avg",
@@ -637,5 +647,11 @@
"home_power": "Consumption", "home_power": "Consumption",
"charge_power": "Charger", "charge_power": "Charger",
"watt_hour": "Wh" "watt_hour": "Wh"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
} }
} }

View File

@@ -134,18 +134,22 @@
"sonarr": { "sonarr": {
"wanted": "Dorite", "wanted": "Dorite",
"queued": "În coadă", "queued": "În coadă",
"series": "Seriale" "series": "Seriale",
"queue": "Queue",
"unknown": "Unknown"
}, },
"radarr": { "radarr": {
"queued": "În coadă", "queued": "În coadă",
"wanted": "Dorite", "wanted": "Dorite",
"movies": "Filme", "movies": "Filme",
"missing": "Missing" "missing": "Missing",
"queue": "Queue",
"unknown": "Unknown"
}, },
"lidarr": { "lidarr": {
"wanted": "Dorite", "wanted": "Dorite",
"queued": "În coadă", "queued": "În coadă",
"albums": "Albume" "artists": "Artists"
}, },
"readarr": { "readarr": {
"wanted": "Dorite", "wanted": "Dorite",
@@ -234,12 +238,16 @@
}, },
"glances": { "glances": {
"cpu": "Procesor", "cpu": "Procesor",
"mem": "Memorie",
"wait": "Te rugam sa astepti", "wait": "Te rugam sa astepti",
"temp": "TEMP", "temp": "TEMP",
"uptime": "UP", "uptime": "UP",
"days": "d", "days": "d",
"hours": "h" "hours": "h",
"load": "Load",
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "Total Observed", "totalObserved": "Total Observed",
@@ -604,7 +612,9 @@
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Usage" "poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"load": "Load Avg", "load": "Load Avg",
@@ -628,5 +638,11 @@
"home_power": "Consumption", "home_power": "Consumption",
"charge_power": "Charger", "charge_power": "Charger",
"watt_hour": "Wh" "watt_hour": "Wh"
},
"pialert": {
"new_devices": "New Devices",
"down_alerts": "Down Alerts",
"total": "Total",
"connected": "Connected"
} }
} }

View File

@@ -66,13 +66,17 @@
"sonarr": { "sonarr": {
"wanted": "Хотел", "wanted": "Хотел",
"queued": "В очереди", "queued": "В очереди",
"series": "Серии" "series": "Серии",
"queue": "Queue",
"unknown": "Unknown"
}, },
"radarr": { "radarr": {
"wanted": "Хотел", "wanted": "Хотел",
"queued": "В очереди", "queued": "В очереди",
"movies": "Фильмы", "movies": "Фильмы",
"missing": "Пропущено" "missing": "Пропущено",
"queue": "Queue",
"unknown": "Unknown"
}, },
"readarr": { "readarr": {
"wanted": "Хотел", "wanted": "Хотел",
@@ -173,7 +177,7 @@
"lidarr": { "lidarr": {
"wanted": "Хотел", "wanted": "Хотел",
"queued": "В очереди", "queued": "В очереди",
"albums": "Альбомы" "artists": "Artists"
}, },
"adguard": { "adguard": {
"queries": "Запросы", "queries": "Запросы",
@@ -234,12 +238,16 @@
}, },
"glances": { "glances": {
"cpu": "Процессор", "cpu": "Процессор",
"mem": "Память",
"wait": "Пожалуйста, подождите", "wait": "Пожалуйста, подождите",
"temp": "Температура", "temp": "Температура",
"uptime": "Работает", "uptime": "Работает",
"days": "д", "days": "д",
"hours": "ч" "hours": "ч",
"load": "Load",
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "Всего наблюдаемых", "totalObserved": "Всего наблюдаемых",
@@ -604,7 +612,9 @@
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Usage" "poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"disk": "Disk Usage", "disk": "Disk Usage",
@@ -628,5 +638,11 @@
"grid_power": "Grid", "grid_power": "Grid",
"charge_power": "Charger", "charge_power": "Charger",
"watt_hour": "Wh" "watt_hour": "Wh"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
} }
} }

View File

@@ -273,18 +273,22 @@
"sonarr": { "sonarr": {
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series",
"queue": "Queue",
"unknown": "Unknown"
}, },
"radarr": { "radarr": {
"wanted": "Wanted", "wanted": "Wanted",
"missing": "Missing", "missing": "Missing",
"queued": "Queued", "queued": "Queued",
"movies": "Movies" "movies": "Movies",
"queue": "Queue",
"unknown": "Unknown"
}, },
"lidarr": { "lidarr": {
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"albums": "Albums" "artists": "Artists"
}, },
"readarr": { "readarr": {
"wanted": "Wanted", "wanted": "Wanted",
@@ -398,12 +402,16 @@
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
"mem": "MEM",
"wait": "Please wait", "wait": "Please wait",
"temp": "TEMP", "temp": "TEMP",
"uptime": "UP", "uptime": "UP",
"days": "d", "days": "d",
"hours": "h" "hours": "h",
"load": "Load",
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
}, },
"quicklaunch": { "quicklaunch": {
"bookmark": "Bookmark", "bookmark": "Bookmark",
@@ -604,7 +612,9 @@
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Usage" "poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"load": "Load Avg", "load": "Load Avg",
@@ -628,5 +638,11 @@
"home_power": "Consumption", "home_power": "Consumption",
"charge_power": "Charger", "charge_power": "Charger",
"watt_hour": "Wh" "watt_hour": "Wh"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
} }
} }

View File

@@ -235,18 +235,22 @@
"sonarr": { "sonarr": {
"wanted": "Iskano", "wanted": "Iskano",
"queued": "V vrsti", "queued": "V vrsti",
"series": "Serije" "series": "Serije",
"queue": "Queue",
"unknown": "Unknown"
}, },
"radarr": { "radarr": {
"wanted": "Iskano", "wanted": "Iskano",
"missing": "Manjka", "missing": "Manjka",
"queued": "V vrsti", "queued": "V vrsti",
"movies": "Filmi" "movies": "Filmi",
"queue": "Queue",
"unknown": "Unknown"
}, },
"lidarr": { "lidarr": {
"wanted": "Iskano", "wanted": "Iskano",
"queued": "V vrsti", "queued": "V vrsti",
"albums": "Albumi" "artists": "Artists"
}, },
"readarr": { "readarr": {
"wanted": "Iskano", "wanted": "Iskano",
@@ -350,12 +354,16 @@
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
"mem": "MEM",
"wait": "Prosim počakajte", "wait": "Prosim počakajte",
"temp": "TEMP", "temp": "TEMP",
"uptime": "UP", "uptime": "UP",
"days": "d", "days": "d",
"hours": "u" "hours": "u",
"free": "Free",
"load": "Load",
"warn": "Warn",
"total": "Total",
"used": "Used"
}, },
"authentik": { "authentik": {
"users": "Uporabniki", "users": "Uporabniki",
@@ -604,7 +612,9 @@
"cpuUsage": "CPU", "cpuUsage": "CPU",
"memUsage": "MEM", "memUsage": "MEM",
"systemTempC": "Temperatura", "systemTempC": "Temperatura",
"poolUsage": "Prostor" "poolUsage": "Prostor",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"load": "Povp. obremenitev", "load": "Povp. obremenitev",
@@ -628,5 +638,11 @@
"home_power": "Poraba", "home_power": "Poraba",
"charge_power": "Polnilec", "charge_power": "Polnilec",
"watt_hour": "Wh" "watt_hour": "Wh"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
} }
} }

View File

@@ -117,18 +117,22 @@
"sonarr": { "sonarr": {
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series",
"queue": "Queue",
"unknown": "Unknown"
}, },
"radarr": { "radarr": {
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"movies": "Movies", "movies": "Movies",
"missing": "Missing" "missing": "Missing",
"queue": "Queue",
"unknown": "Unknown"
}, },
"lidarr": { "lidarr": {
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"albums": "Albums" "artists": "Artists"
}, },
"readarr": { "readarr": {
"wanted": "Wanted", "wanted": "Wanted",
@@ -234,12 +238,16 @@
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
"mem": "MEM",
"wait": "Please wait", "wait": "Please wait",
"temp": "TEMP", "temp": "TEMP",
"uptime": "UP", "uptime": "UP",
"days": "d", "days": "d",
"hours": "h" "hours": "h",
"load": "Load",
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "Total Observed", "totalObserved": "Total Observed",
@@ -604,7 +612,9 @@
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Usage" "poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"memory": "Mem Usage", "memory": "Mem Usage",
@@ -628,5 +638,11 @@
"home_power": "Consumption", "home_power": "Consumption",
"charge_power": "Charger", "charge_power": "Charger",
"watt_hour": "Wh" "watt_hour": "Wh"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
} }
} }

View File

@@ -88,18 +88,22 @@
"sonarr": { "sonarr": {
"wanted": "Eftersöker", "wanted": "Eftersöker",
"queued": "I kö", "queued": "I kö",
"series": "Serier" "series": "Serier",
"queue": "Queue",
"unknown": "Unknown"
}, },
"radarr": { "radarr": {
"wanted": "Eftersöker", "wanted": "Eftersöker",
"queued": "I kö", "queued": "I kö",
"movies": "Filmer", "movies": "Filmer",
"missing": "Missing" "missing": "Missing",
"queue": "Queue",
"unknown": "Unknown"
}, },
"lidarr": { "lidarr": {
"wanted": "Eftersöker", "wanted": "Eftersöker",
"queued": "I kö", "queued": "I kö",
"albums": "Album" "artists": "Artists"
}, },
"readarr": { "readarr": {
"wanted": "Eftersökt", "wanted": "Eftersökt",
@@ -234,12 +238,16 @@
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
"mem": "MEM",
"wait": "Vänligen vänta", "wait": "Vänligen vänta",
"temp": "TEMP", "temp": "TEMP",
"uptime": "UP", "uptime": "UP",
"days": "d", "days": "d",
"hours": "h" "hours": "h",
"load": "Load",
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "Total Observed", "totalObserved": "Total Observed",
@@ -604,7 +612,9 @@
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Usage" "poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"load": "Load Avg", "load": "Load Avg",
@@ -628,5 +638,11 @@
"home_power": "Consumption", "home_power": "Consumption",
"charge_power": "Charger", "charge_power": "Charger",
"watt_hour": "Wh" "watt_hour": "Wh"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
} }
} }

View File

@@ -111,18 +111,22 @@
"sonarr": { "sonarr": {
"wanted": "కావలెను", "wanted": "కావలెను",
"queued": "క్యూయూఎడ్", "queued": "క్యూయూఎడ్",
"series": "సిరీస్" "series": "సిరీస్",
"queue": "Queue",
"unknown": "Unknown"
}, },
"radarr": { "radarr": {
"wanted": "కావలెను", "wanted": "కావలెను",
"queued": "క్యూయూఎడ్", "queued": "క్యూయూఎడ్",
"movies": "సినిమాలు", "movies": "సినిమాలు",
"missing": "మిస్సింగ్" "missing": "మిస్సింగ్",
"queue": "Queue",
"unknown": "Unknown"
}, },
"lidarr": { "lidarr": {
"wanted": "కావలెను", "wanted": "కావలెను",
"queued": "క్యూయూఎడ్", "queued": "క్యూయూఎడ్",
"albums": "ఆల్బములు" "artists": "Artists"
}, },
"bazarr": { "bazarr": {
"missingEpisodes": "ఎపిసోడ్‌లు లేవు", "missingEpisodes": "ఎపిసోడ్‌లు లేవు",
@@ -234,12 +238,16 @@
}, },
"glances": { "glances": {
"cpu": "సీపియూ", "cpu": "సీపియూ",
"mem": "MEM",
"wait": "దయచేసి వేచి ఉండండి", "wait": "దయచేసి వేచి ఉండండి",
"temp": "TEMP", "temp": "TEMP",
"uptime": "UP", "uptime": "UP",
"days": "d", "days": "d",
"hours": "h" "hours": "h",
"load": "Load",
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "మొత్తం గమనించబడింది", "totalObserved": "మొత్తం గమనించబడింది",
@@ -604,7 +612,9 @@
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Usage" "poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"load": "Load Avg", "load": "Load Avg",
@@ -628,5 +638,11 @@
"home_power": "Consumption", "home_power": "Consumption",
"charge_power": "Charger", "charge_power": "Charger",
"watt_hour": "Wh" "watt_hour": "Wh"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
} }
} }

View File

@@ -190,7 +190,9 @@
"sonarr": { "sonarr": {
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series",
"queue": "Queue",
"unknown": "Unknown"
}, },
"readarr": { "readarr": {
"queued": "Queued", "queued": "Queued",
@@ -216,12 +218,14 @@
"wanted": "Wanted", "wanted": "Wanted",
"missing": "Missing", "missing": "Missing",
"queued": "Queued", "queued": "Queued",
"movies": "Movies" "movies": "Movies",
"queue": "Queue",
"unknown": "Unknown"
}, },
"lidarr": { "lidarr": {
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"albums": "Albums" "artists": "Artists"
}, },
"ombi": { "ombi": {
"pending": "Pending", "pending": "Pending",
@@ -310,12 +314,16 @@
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
"mem": "MEM",
"wait": "Please wait", "wait": "Please wait",
"temp": "TEMP", "temp": "TEMP",
"uptime": "UP", "uptime": "UP",
"days": "d", "days": "d",
"hours": "h" "hours": "h",
"load": "Load",
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
}, },
"quicklaunch": { "quicklaunch": {
"bookmark": "Bookmark", "bookmark": "Bookmark",
@@ -604,7 +612,9 @@
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Usage" "poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"load": "Load Avg", "load": "Load Avg",
@@ -628,5 +638,11 @@
"home_power": "Consumption", "home_power": "Consumption",
"charge_power": "Charger", "charge_power": "Charger",
"watt_hour": "Wh" "watt_hour": "Wh"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
} }
} }

View File

@@ -24,13 +24,13 @@
"used": "Kullanımda", "used": "Kullanımda",
"load": "Yük", "load": "Yük",
"mem": "MEM", "mem": "MEM",
"temp": "TEMP", "temp": "Geçici",
"max": "Max", "max": "En Yüksek",
"uptime": "UP", "uptime": "Çalışma Süresi",
"months": "mo", "months": "Ay",
"days": "d", "days": "Gün",
"hours": "h", "hours": "Saat",
"minutes": "m" "minutes": "Dakika"
}, },
"unifi": { "unifi": {
"users": "Kullanıcılar", "users": "Kullanıcılar",
@@ -57,23 +57,23 @@
"offline": "Çevrimdışı", "offline": "Çevrimdışı",
"error": "Hata", "error": "Hata",
"unknown": "Bilinmiyor", "unknown": "Bilinmiyor",
"running": "Running", "running": "Çalışan",
"starting": "Starting", "starting": "Başlatılıyor",
"unhealthy": "Unhealthy", "unhealthy": "Sağlıksız",
"not_found": "Not Found", "not_found": "Bulunamadı",
"exited": "Exited", "exited": "Durduruldu",
"partial": "Partial", "partial": "Parçalı",
"healthy": "Healthy" "healthy": "Sağlık"
}, },
"emby": { "emby": {
"playing": "Oynatılıyor", "playing": "Oynatılıyor",
"transcoding": "Dönüştürülüyor", "transcoding": "Dönüştürülüyor",
"bitrate": "Bit Oranı", "bitrate": "Bit Oranı",
"no_active": "Aktif akış yok", "no_active": "Aktif akış yok",
"movies": "Movies", "movies": "Filmler",
"series": "Series", "series": "Diziler",
"episodes": "Episodes", "episodes": "Bölümler",
"songs": "Songs" "songs": "Şarkılar"
}, },
"tautulli": { "tautulli": {
"playing": "Oynatılıyor", "playing": "Oynatılıyor",
@@ -90,7 +90,7 @@
"streams": "Aktif Akış", "streams": "Aktif Akış",
"movies": "Filmler", "movies": "Filmler",
"tv": "TV Showları", "tv": "TV Showları",
"albums": "Albums" "albums": "Albümler"
}, },
"sabnzbd": { "sabnzbd": {
"rate": "Oran", "rate": "Oran",
@@ -117,18 +117,22 @@
"sonarr": { "sonarr": {
"wanted": "Aranan", "wanted": "Aranan",
"queued": "Kuyrukta", "queued": "Kuyrukta",
"series": "Seriler" "series": "Seriler",
"queue": "Queue",
"unknown": "Unknown"
}, },
"radarr": { "radarr": {
"wanted": "Aranan", "wanted": "Aranan",
"queued": "Kuyrukta", "queued": "Kuyrukta",
"movies": "Filmler", "movies": "Filmler",
"missing": "Kayıp" "missing": "Kayıp",
"queue": "Queue",
"unknown": "Unknown"
}, },
"lidarr": { "lidarr": {
"wanted": "Aranan", "wanted": "Aranan",
"queued": "Kuyrukta", "queued": "Kuyrukta",
"albums": "Albümler" "artists": "Artists"
}, },
"readarr": { "readarr": {
"wanted": "Aranan", "wanted": "Aranan",
@@ -159,7 +163,7 @@
"queries": "Sorgular", "queries": "Sorgular",
"blocked": "Engellenen", "blocked": "Engellenen",
"gravity": "Yer Çekimi", "gravity": "Yer Çekimi",
"blocked_percent": "Blocked %" "blocked_percent": "Engellenen %"
}, },
"adguard": { "adguard": {
"queries": "Sorgular", "queries": "Sorgular",
@@ -234,12 +238,16 @@
}, },
"glances": { "glances": {
"cpu": "İşlemci", "cpu": "İşlemci",
"mem": "Bellek",
"wait": "Lütfen bekleyiniz", "wait": "Lütfen bekleyiniz",
"temp": "TEMP", "temp": "Sıcaklık",
"uptime": "UP", "uptime": "Çalışma Süresi",
"days": "d", "days": "Gün",
"hours": "h" "hours": "Saat",
"load": "Yük",
"warn": "Uyarı",
"total": "Toplam",
"free": "Boş",
"used": "Kullanım"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "Toplam Gözlenen", "totalObserved": "Toplam Gözlenen",
@@ -307,9 +315,9 @@
"bookmark": "Yer İmi", "bookmark": "Yer İmi",
"service": "Hizmet", "service": "Hizmet",
"search": "Ara", "search": "Ara",
"custom": "Custom", "custom": "Özel",
"visit": "Visit", "visit": "Ziyaret",
"url": "URL" "url": "Link"
}, },
"homebridge": { "homebridge": {
"available_update": "Sistem", "available_update": "Sistem",
@@ -380,14 +388,14 @@
"deluge": { "deluge": {
"download": "İndir", "download": "İndir",
"upload": "Yükle", "upload": "Yükle",
"leech": "Leech", "leech": "Tüketici",
"seed": "Tohum" "seed": "Tohum"
}, },
"flood": { "flood": {
"download": "İndir", "download": "İndir",
"upload": "Yükle", "upload": "Yükle",
"leech": "Leech", "leech": "Tüketici",
"seed": "Tohum" "seed": "Sağlayıcı"
}, },
"tdarr": { "tdarr": {
"queue": "Sıra", "queue": "Sıra",
@@ -417,7 +425,7 @@
"downloadstation": { "downloadstation": {
"download": "İndir", "download": "İndir",
"upload": "Yükle", "upload": "Yükle",
"leech": "Leech", "leech": "Tüketici",
"seed": "Tohum" "seed": "Tohum"
}, },
"mikrotik": { "mikrotik": {
@@ -444,7 +452,7 @@
"layers": "Katmanlar" "layers": "Katmanlar"
}, },
"medusa": { "medusa": {
"wanted": "Wanted", "wanted": "Aranan",
"queued": "Kuyrukta", "queued": "Kuyrukta",
"series": "Seri" "series": "Seri"
}, },
@@ -550,11 +558,11 @@
"targets_total": "Total Targets" "targets_total": "Total Targets"
}, },
"minecraft": { "minecraft": {
"players": "Players", "players": "Oyuncular",
"version": "Version", "version": "Versiyon",
"status": "Status", "status": "Durum",
"up": "Online", "up": "Çevrimiçi",
"down": "Offline" "down": "Çevrimdışı"
}, },
"ghostfolio": { "ghostfolio": {
"gross_percent_today": "Today", "gross_percent_today": "Today",
@@ -573,38 +581,40 @@
"switches_on": "Switches On" "switches_on": "Switches On"
}, },
"freshrss": { "freshrss": {
"subscriptions": "Subscriptions", "subscriptions": "Abonelikler",
"unread": "Unread" "unread": "Okunmamış"
}, },
"channelsdvrserver": { "channelsdvrserver": {
"shows": "Shows", "shows": "Diziler",
"recordings": "Recordings", "recordings": "Kayıtlar",
"scheduled": "Scheduled", "scheduled": "Planlanmış",
"passes": "Passes" "passes": "Geçilenler"
}, },
"whatsupdocker": { "whatsupdocker": {
"monitoring": "Monitoring", "monitoring": "Monitoring",
"updates": "Updates" "updates": "Updates"
}, },
"tailscale": { "tailscale": {
"never": "Never", "never": "Asla",
"last_seen": "Last Seen", "last_seen": "Son Görülme",
"now": "Now", "now": "Şimdi",
"years": "{{number}}y", "years": "{{number}} Yıl",
"weeks": "{{number}}w", "weeks": "{{number}} Hafta",
"days": "{{number}}d", "days": "{{number}} Gün",
"hours": "{{number}}h", "hours": "{{number}} Saat",
"minutes": "{{number}}m", "minutes": "{{number}} Dakika",
"seconds": "{{number}}s", "seconds": "{{number}} Saniye",
"ago": "{{value}} Ago", "ago": "{{value}} Önce",
"address": "Address", "address": "Adres",
"expires": "Expires" "expires": "Geciken"
}, },
"qnap": { "qnap": {
"cpuUsage": "CPU Usage", "cpuUsage": "İşlemci Kullanımı",
"memUsage": "MEM Usage", "memUsage": "Bellek Kullanımı",
"systemTempC": "System Temp", "systemTempC": "Sistem Sıcaklığı",
"poolUsage": "Pool Usage" "poolUsage": "Havuz Kullanımı",
"volumeUsage": "Alan Kullanımı",
"invalid": "Geçersiz"
}, },
"pfsense": { "pfsense": {
"load": "Load Avg", "load": "Load Avg",
@@ -617,16 +627,22 @@
"wanIP": "WAN IP" "wanIP": "WAN IP"
}, },
"caddy": { "caddy": {
"upstreams": "Upstreams", "upstreams": "Akış",
"requests": "Current requests", "requests": "Anlık İstekler",
"requests_failed": "Failed requests" "requests_failed": "Başarısız İstekler"
}, },
"evcc": { "evcc": {
"pv_power": "Production", "pv_power": "Üretim",
"battery_soc": "Battery", "battery_soc": "Batarya",
"grid_power": "Grid", "grid_power": "Güç",
"home_power": "Consumption", "home_power": "Tüketim",
"charge_power": "Charger", "charge_power": "Şarj",
"watt_hour": "Wh" "watt_hour": "Watt/Saat"
},
"pialert": {
"total": "Toplam",
"connected": "Bağlandı",
"new_devices": "Yeni Cihazlar",
"down_alerts": "Düşme Uyarıları"
} }
} }

View File

@@ -127,7 +127,7 @@
"total": "Всього", "total": "Всього",
"free": "Вільно", "free": "Вільно",
"used": "Використано", "used": "Використано",
"load": "Навантаження", "load": "Завантаження",
"mem": "Пам'ять", "mem": "Пам'ять",
"temp": "TEMP", "temp": "TEMP",
"max": "Max", "max": "Max",
@@ -232,18 +232,22 @@
"sonarr": { "sonarr": {
"wanted": "Розшукується", "wanted": "Розшукується",
"queued": "У черзі", "queued": "У черзі",
"series": "Серії" "series": "Серії",
"queue": "Черга",
"unknown": "Невідомо"
}, },
"radarr": { "radarr": {
"wanted": "Розшукується", "wanted": "Розшукується",
"missing": "Відсутній", "missing": "Відсутній",
"queued": "У черзі", "queued": "У черзі",
"movies": "Фільми" "movies": "Фільми",
"queue": "Черга",
"unknown": "Невідомо"
}, },
"lidarr": { "lidarr": {
"wanted": "Розшукується", "wanted": "Розшукується",
"queued": "У черзі", "queued": "У черзі",
"albums": "Альбоми" "artists": "Виконавці"
}, },
"traefik": { "traefik": {
"middleware": "Проміжне програмне забезпечення", "middleware": "Проміжне програмне забезпечення",
@@ -358,12 +362,16 @@
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
"mem": "Пам'ять",
"wait": "Будь ласка, зачекайте", "wait": "Будь ласка, зачекайте",
"temp": "TEMP", "temp": "TEMP",
"uptime": "Відправка", "uptime": "Відправка",
"days": "д", "days": "д",
"hours": "г" "hours": "г",
"load": "Завантаження",
"warn": "Увага",
"total": "Всього",
"free": "Вільний",
"used": "Використовується"
}, },
"quicklaunch": { "quicklaunch": {
"bookmark": "Закладка", "bookmark": "Закладка",
@@ -604,7 +612,9 @@
"cpuUsage": "Використання CPU", "cpuUsage": "Використання CPU",
"memUsage": "Використання пам'яті", "memUsage": "Використання пам'яті",
"systemTempC": "Температура системи", "systemTempC": "Температура системи",
"poolUsage": "Використання пулу" "poolUsage": "Використання пулу",
"volumeUsage": "Гучність",
"invalid": "Недійсний"
}, },
"pfsense": { "pfsense": {
"load": "Середнє завантаження", "load": "Середнє завантаження",
@@ -628,5 +638,11 @@
"home_power": "Споживання", "home_power": "Споживання",
"charge_power": "Зарядний пристрій", "charge_power": "Зарядний пристрій",
"watt_hour": "Вт/год" "watt_hour": "Вт/год"
},
"pialert": {
"total": "Всього",
"connected": "Підключено",
"new_devices": "Нові пристрої",
"down_alerts": "Сповіщення про збій"
} }
} }

View File

@@ -66,13 +66,17 @@
"sonarr": { "sonarr": {
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"series": "Series" "series": "Series",
"queue": "Queue",
"unknown": "Unknown"
}, },
"radarr": { "radarr": {
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"movies": "Phim", "movies": "Phim",
"missing": "Missing" "missing": "Missing",
"queue": "Queue",
"unknown": "Unknown"
}, },
"readarr": { "readarr": {
"wanted": "Đang tìm", "wanted": "Đang tìm",
@@ -173,7 +177,7 @@
"lidarr": { "lidarr": {
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"albums": "Albums" "artists": "Artists"
}, },
"adguard": { "adguard": {
"queries": "Queries", "queries": "Queries",
@@ -234,12 +238,16 @@
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
"mem": "MEM",
"wait": "Please wait", "wait": "Please wait",
"temp": "TEMP", "temp": "TEMP",
"uptime": "UP", "uptime": "UP",
"days": "d", "days": "d",
"hours": "h" "hours": "h",
"load": "Load",
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "Total Observed", "totalObserved": "Total Observed",
@@ -604,7 +612,9 @@
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Usage" "poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"load": "Load Avg", "load": "Load Avg",
@@ -628,5 +638,11 @@
"home_power": "Consumption", "home_power": "Consumption",
"charge_power": "Charger", "charge_power": "Charger",
"watt_hour": "Wh" "watt_hour": "Wh"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
} }
} }

View File

@@ -94,18 +94,22 @@
"sonarr": { "sonarr": {
"wanted": "想睇", "wanted": "想睇",
"queued": "排緊隊", "queued": "排緊隊",
"series": "電視劇" "series": "電視劇",
"queue": "Queue",
"unknown": "Unknown"
}, },
"radarr": { "radarr": {
"wanted": "想睇", "wanted": "想睇",
"queued": "排緊隊", "queued": "排緊隊",
"movies": "電影", "movies": "電影",
"missing": "Missing" "missing": "Missing",
"queue": "Queue",
"unknown": "Unknown"
}, },
"lidarr": { "lidarr": {
"wanted": "想睇", "wanted": "想睇",
"queued": "排緊隊", "queued": "排緊隊",
"albums": "專輯" "artists": "Artists"
}, },
"readarr": { "readarr": {
"wanted": "想睇", "wanted": "想睇",
@@ -234,12 +238,16 @@
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
"mem": "MEM",
"wait": "Please wait", "wait": "Please wait",
"temp": "TEMP", "temp": "TEMP",
"uptime": "UP", "uptime": "UP",
"days": "d", "days": "d",
"hours": "h" "hours": "h",
"load": "Load",
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "Total Observed", "totalObserved": "Total Observed",
@@ -604,7 +612,9 @@
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Usage", "poolUsage": "Pool Usage",
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage" "memUsage": "MEM Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"load": "Load Avg", "load": "Load Avg",
@@ -628,5 +638,11 @@
"home_power": "Consumption", "home_power": "Consumption",
"charge_power": "Charger", "charge_power": "Charger",
"watt_hour": "Wh" "watt_hour": "Wh"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
} }
} }

View File

@@ -66,13 +66,17 @@
"sonarr": { "sonarr": {
"wanted": "想看", "wanted": "想看",
"queued": "排队", "queued": "排队",
"series": "系列" "series": "系列",
"queue": "Queue",
"unknown": "Unknown"
}, },
"radarr": { "radarr": {
"wanted": "想看", "wanted": "想看",
"queued": "队列", "queued": "队列",
"movies": "电影", "movies": "电影",
"missing": "丢失" "missing": "丢失",
"queue": "Queue",
"unknown": "Unknown"
}, },
"readarr": { "readarr": {
"wanted": "订阅", "wanted": "订阅",
@@ -173,7 +177,7 @@
"lidarr": { "lidarr": {
"wanted": "订阅", "wanted": "订阅",
"queued": "队列", "queued": "队列",
"albums": "相册" "artists": "Artists"
}, },
"adguard": { "adguard": {
"queries": "查询", "queries": "查询",
@@ -234,12 +238,16 @@
}, },
"glances": { "glances": {
"cpu": "处理器", "cpu": "处理器",
"mem": "内存",
"wait": "请稍等", "wait": "请稍等",
"temp": "温度", "temp": "温度",
"uptime": "运行时间", "uptime": "运行时间",
"days": "天", "days": "天",
"hours": "时" "hours": "时",
"load": "Load",
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "观察到的总数", "totalObserved": "观察到的总数",
@@ -550,7 +558,7 @@
"targets_total": "总目标" "targets_total": "总目标"
}, },
"minecraft": { "minecraft": {
"players": "播放中", "players": "玩家",
"version": "版本", "version": "版本",
"status": "状态", "status": "状态",
"up": "在线的", "up": "在线的",
@@ -604,7 +612,9 @@
"cpuUsage": "处理器", "cpuUsage": "处理器",
"memUsage": "内存", "memUsage": "内存",
"systemTempC": "系统温度", "systemTempC": "系统温度",
"poolUsage": "存储池" "poolUsage": "存储池",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
"load": "平均负载", "load": "平均负载",
@@ -628,5 +638,11 @@
"home_power": "Consumption", "home_power": "Consumption",
"charge_power": "Charger", "charge_power": "Charger",
"watt_hour": "Wh" "watt_hour": "Wh"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
} }
} }

View File

@@ -6,7 +6,7 @@
"information": "資訊", "information": "資訊",
"url": "網址", "url": "網址",
"raw_error": "原始錯誤", "raw_error": "原始錯誤",
"response_data": "回復數據" "response_data": "回應資料"
}, },
"weather": { "weather": {
"current": "目前位置", "current": "目前位置",
@@ -21,14 +21,14 @@
"mem": "記憶體", "mem": "記憶體",
"cpu": "處理器", "cpu": "處理器",
"error": "錯誤", "error": "錯誤",
"unknown": "未知", "unknown": "未知",
"running": "執行中", "running": "執行中",
"starting": "啟動中", "starting": "啟動中",
"unhealthy": "不健康的", "unhealthy": "不健康的",
"not_found": "未找到", "not_found": "未找到",
"exited": "已退出", "exited": "已退出",
"partial": "部分", "partial": "部分",
"healthy": "健康" "healthy": "健康"
}, },
"emby": { "emby": {
"playing": "正在播放", "playing": "正在播放",
@@ -63,9 +63,9 @@
"mem": "記憶體", "mem": "記憶體",
"temp": "溫度", "temp": "溫度",
"max": "最大", "max": "最大",
"uptime": "運時間", "uptime": "運時間",
"months": "月", "months": "月",
"days": "", "days": "",
"hours": "時", "hours": "時",
"minutes": "分" "minutes": "分"
}, },
@@ -88,12 +88,16 @@
"movies": "電影", "movies": "電影",
"wanted": "關注中", "wanted": "關注中",
"queued": "已加入佇列", "queued": "已加入佇列",
"missing": "缺少" "missing": "缺少",
"queue": "Queue",
"unknown": "Unknown"
}, },
"sonarr": { "sonarr": {
"wanted": "關注中", "wanted": "關注中",
"queued": "已加入佇列", "queued": "已加入佇列",
"series": "影集" "series": "影集",
"queue": "Queue",
"unknown": "Unknown"
}, },
"readarr": { "readarr": {
"wanted": "關注中", "wanted": "關注中",
@@ -115,7 +119,7 @@
"queries": "查詢", "queries": "查詢",
"blocked": "已阻擋", "blocked": "已阻擋",
"gravity": "阻擋清單", "gravity": "阻擋清單",
"blocked_percent": "Blocked %" "blocked_percent": "已封鎖 %"
}, },
"speedtest": { "speedtest": {
"upload": "上行速率", "upload": "上行速率",
@@ -123,8 +127,8 @@
"ping": "Ping" "ping": "Ping"
}, },
"portainer": { "portainer": {
"running": "運中", "running": "運中",
"stopped": "未運行", "stopped": "已停止",
"total": "全部" "total": "全部"
}, },
"traefik": { "traefik": {
@@ -163,7 +167,7 @@
"seed": "已完成下載" "seed": "已完成下載"
}, },
"jackett": { "jackett": {
"configured": "已置", "configured": "已置",
"errored": "發生錯誤" "errored": "發生錯誤"
}, },
"bazarr": { "bazarr": {
@@ -173,7 +177,7 @@
"lidarr": { "lidarr": {
"wanted": "關注中", "wanted": "關注中",
"queued": "已加入佇列", "queued": "已加入佇列",
"albums": "專輯" "artists": "Artists"
}, },
"adguard": { "adguard": {
"queries": "查詢", "queries": "查詢",
@@ -200,8 +204,8 @@
}, },
"authentik": { "authentik": {
"users": "使用者", "users": "使用者",
"loginsLast24H": "登錄(24h)", "loginsLast24H": "登入 (過去 24 小時)",
"failedLoginsLast24H": "登失敗(24h)" "failedLoginsLast24H": "登失敗 (過去 24 小時)"
}, },
"proxmox": { "proxmox": {
"mem": "記憶體", "mem": "記憶體",
@@ -211,19 +215,19 @@
}, },
"unifi": { "unifi": {
"users": "使用者", "users": "使用者",
"uptime": "系統運時間", "uptime": "系統運時間",
"days": "天", "days": "天",
"wan": "WAN", "wan": "WAN",
"lan_users": "LAN使用者", "lan_users": "有線使用者",
"wlan_users": "WLAN使用者", "wlan_users": "無線使用者",
"up": "上線", "up": "上線",
"down": "離線", "down": "離線",
"wait": "請稍後", "wait": "請稍後",
"lan": "LAN", "lan": "LAN",
"wlan": "WLAN", "wlan": "WLAN",
"devices": "設備", "devices": "設備",
"lan_devices": "LAN設備", "lan_devices": "有線設備",
"wlan_devices": "WLAN設備", "wlan_devices": "無線設備",
"empty_data": "子系統狀態未知" "empty_data": "子系統狀態未知"
}, },
"plex": { "plex": {
@@ -234,19 +238,23 @@
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
"mem": "記憶體",
"wait": "請稍後", "wait": "請稍後",
"temp": "溫度", "temp": "溫度",
"uptime": "運行時間", "uptime": "運行時間",
"days": "天", "days": "天",
"hours": "時" "hours": "時",
"free": "未使用",
"used": "已使用",
"load": "負載量",
"warn": "警告",
"total": "總共"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "總監測數", "totalObserved": "總監測數",
"diffsDetected": "偵測到的變更" "diffsDetected": "偵測到的變更"
}, },
"wmo": { "wmo": {
"0-day": "晴", "0-day": "晴",
"0-night": "晴朗", "0-night": "晴朗",
"71-day": "小雪", "71-day": "小雪",
"71-night": "小雪", "71-night": "小雪",
@@ -308,7 +316,7 @@
"service": "服務", "service": "服務",
"search": "搜尋", "search": "搜尋",
"custom": "自訂", "custom": "自訂",
"visit": "訪", "visit": "訪",
"url": "網址" "url": "網址"
}, },
"homebridge": { "homebridge": {
@@ -351,7 +359,7 @@
}, },
"pyload": { "pyload": {
"speed": "速度", "speed": "速度",
"active": "行中", "active": "行中",
"queue": "佇列", "queue": "佇列",
"total": "全部" "total": "全部"
}, },
@@ -515,14 +523,14 @@
"memoryusage": "記憶體用量", "memoryusage": "記憶體用量",
"freespace": "可用空間", "freespace": "可用空間",
"activeusers": "活躍用戶", "activeusers": "活躍用戶",
"numfiles": "Files", "numfiles": "檔案",
"numshares": "Shared Items" "numshares": "已分享"
}, },
"kopia": { "kopia": {
"status": "狀態", "status": "狀態",
"size": "檔案大小", "size": "檔案大小",
"lastrun": "上次行", "lastrun": "上次行",
"nextrun": "下次行", "nextrun": "下次行",
"failed": "失敗" "failed": "失敗"
}, },
"unmanic": { "unmanic": {
@@ -587,46 +595,54 @@
"updates": "可更新" "updates": "可更新"
}, },
"tailscale": { "tailscale": {
"address": "Address", "address": "位址",
"expires": "Expires", "expires": "已失效",
"never": "Never", "never": "未曾",
"last_seen": "Last Seen", "last_seen": "上次連線",
"now": "Now", "now": "現在",
"years": "{{number}}y", "years": "{{number}}",
"hours": "{{number}}h", "hours": "{{number}} 小時",
"minutes": "{{number}}m", "minutes": "{{number}} 分鐘",
"seconds": "{{number}}s", "seconds": "{{number}}",
"ago": "{{value}} Ago", "ago": "{{value}} ",
"weeks": "{{number}}w", "weeks": "{{number}}",
"days": "{{number}}d" "days": "{{number}}"
}, },
"qnap": { "qnap": {
"cpuUsage": "CPU Usage", "cpuUsage": "CPU 使用率",
"memUsage": "MEM Usage", "memUsage": "記憶體使用率",
"systemTempC": "System Temp", "systemTempC": "系統溫度",
"poolUsage": "Pool Usage" "poolUsage": "儲存池使用率",
"volumeUsage": "儲存區用量",
"invalid": "無效的"
}, },
"pfsense": { "pfsense": {
"load": "Load Avg", "load": "平均負載量",
"memory": "Mem Usage", "memory": "記憶體使用率",
"wanStatus": "WAN Status", "wanStatus": "網際網路狀態",
"up": "Up", "up": "已連線",
"down": "Down", "down": "已離線",
"temp": "Temp", "temp": "溫度",
"disk": "Disk Usage", "disk": "硬碟使用率",
"wanIP": "WAN IP" "wanIP": "網際網路 IP"
}, },
"caddy": { "caddy": {
"upstreams": "Upstreams", "upstreams": "上行",
"requests": "Current requests", "requests": "目前請求數",
"requests_failed": "Failed requests" "requests_failed": "失敗請求"
}, },
"evcc": { "evcc": {
"grid_power": "Grid", "grid_power": "電網",
"home_power": "Consumption", "home_power": "電源使用率",
"charge_power": "Charger", "charge_power": "充電",
"pv_power": "Production", "pv_power": "正式環境",
"battery_soc": "Battery", "battery_soc": "電池",
"watt_hour": "Wh" "watt_hour": "瓦時 (Wh)"
},
"pialert": {
"total": "全部",
"connected": "已連線",
"new_devices": "新裝置",
"down_alerts": "離線警告"
} }
} }

View File

@@ -3,7 +3,7 @@ import classNames from "classnames";
import List from "components/services/list"; import List from "components/services/list";
import ResolvedIcon from "components/resolvedicon"; import ResolvedIcon from "components/resolvedicon";
export default function ServicesGroup({ services, layout, fiveColumns }) { export default function ServicesGroup({ group, services, layout, fiveColumns }) {
return ( return (
<div <div
key={services.name} key={services.name}
@@ -21,7 +21,7 @@ export default function ServicesGroup({ services, layout, fiveColumns }) {
} }
<h2 className="text-theme-800 dark:text-theme-300 text-xl font-medium">{services.name}</h2> <h2 className="text-theme-800 dark:text-theme-300 text-xl font-medium">{services.name}</h2>
</div> </div>
<List services={services.services} layout={layout} /> <List group={group} services={services.services} layout={layout} />
</div> </div>
); );
} }

View File

@@ -11,7 +11,7 @@ import Kubernetes from "widgets/kubernetes/component";
import { SettingsContext } from "utils/contexts/settings"; import { SettingsContext } from "utils/contexts/settings";
import ResolvedIcon from "components/resolvedicon"; import ResolvedIcon from "components/resolvedicon";
export default function Item({ service }) { export default function Item({ service, group }) {
const hasLink = service.href && service.href !== "#"; const hasLink = service.href && service.href !== "#";
const { settings } = useContext(SettingsContext); const { settings } = useContext(SettingsContext);
const showStats = (service.showStats === false) ? false : settings.showStats; const showStats = (service.showStats === false) ? false : settings.showStats;
@@ -77,7 +77,7 @@ export default function Item({ service }) {
<div className="absolute top-0 right-0 w-1/2 flex flex-row justify-end gap-2 mr-2"> <div className="absolute top-0 right-0 w-1/2 flex flex-row justify-end gap-2 mr-2">
{service.ping && ( {service.ping && (
<div className="flex-shrink-0 flex items-center justify-center cursor-pointer"> <div className="flex-shrink-0 flex items-center justify-center cursor-pointer">
<Ping service={service} /> <Ping group={group} service={service.name} />
<span className="sr-only">Ping status</span> <span className="sr-only">Ping status</span>
</div> </div>
)} )}

View File

@@ -14,7 +14,7 @@ const columnMap = [
"grid-cols-1 md:grid-cols-2 lg:grid-cols-8", "grid-cols-1 md:grid-cols-2 lg:grid-cols-8",
]; ];
export default function List({ services, layout }) { export default function List({ group, services, layout }) {
return ( return (
<ul <ul
className={classNames( className={classNames(
@@ -23,7 +23,7 @@ export default function List({ services, layout }) {
)} )}
> >
{services.map((service) => ( {services.map((service) => (
<Item key={service.container ?? service.app ?? service.name} service={service} /> <Item key={service.container ?? service.app ?? service.name} service={service} group={group} />
))} ))}
</ul> </ul>
); );

View File

@@ -1,9 +1,9 @@
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import useSWR from "swr"; import useSWR from "swr";
export default function Ping({ service }) { export default function Ping({ group, service }) {
const { t } = useTranslation(); const { t } = useTranslation();
const { data, error } = useSWR(`/api/ping?${new URLSearchParams({ping: service.ping}).toString()}`, { const { data, error } = useSWR(`/api/ping?${new URLSearchParams({ group, service }).toString()}`, {
refreshInterval: 30000 refreshInterval: 30000
}); });
@@ -23,7 +23,7 @@ export default function Ping({ service }) {
); );
} }
const statusText = `${service.ping}: HTTP status ${data.status}`; const statusText = `${service}: HTTP status ${data.status}`;
if (data.status > 403) { if (data.status > 403) {
return ( return (

View File

@@ -15,7 +15,9 @@ export default function Container({ error = false, children, service }) {
return <Error service={service} error={error} /> return <Error service={service} error={error} />
} }
let visibleChildren = children; const childrenArray = Array.isArray(children) ? children : [children];
let visibleChildren = childrenArray;
const fields = service?.widget?.fields; const fields = service?.widget?.fields;
const type = service?.widget?.type; const type = service?.widget?.type;
if (fields && type) { if (fields && type) {
@@ -24,7 +26,7 @@ export default function Container({ error = false, children, service }) {
// fields: [ "resources.cpu", "resources.mem", "field"] // fields: [ "resources.cpu", "resources.mem", "field"]
// or even // or even
// fields: [ "resources.cpu", "widget_type.field" ] // fields: [ "resources.cpu", "widget_type.field" ]
visibleChildren = children?.filter(child => fields.some(field => { visibleChildren = childrenArray?.filter(child => fields.some(field => {
let fullField = field; let fullField = field;
if (!field.includes(".")) { if (!field.includes(".")) {
fullField = `${type}.${field}`; fullField = `${type}.${field}`;

View File

@@ -9,10 +9,12 @@ function displayData(data) {
return (data.type === 'Buffer') ? Buffer.from(data).toString() : JSON.stringify(data, 4); return (data.type === 'Buffer') ? Buffer.from(data).toString() : JSON.stringify(data, 4);
} }
export default function Error({ error: err }) { export default function Error({ error }) {
const { t } = useTranslation(); const { t } = useTranslation();
const { error } = err?.data ?? { error: err }; if (error?.data?.error) {
error = error.data.error; // eslint-disable-line no-param-reassign
}
return ( return (
<details className="px-1 pb-1"> <details className="px-1 pb-1">

View File

@@ -1,11 +1,14 @@
import useSWR from "swr"; import useSWR from "swr";
import { useContext } from "react";
import { BiError } from "react-icons/bi"; import { BiError } from "react-icons/bi";
import { FaMemory, FaRegClock, FaThermometerHalf } from "react-icons/fa"; import { FaMemory, FaRegClock, FaThermometerHalf } from "react-icons/fa";
import { FiCpu } from "react-icons/fi"; import { FiCpu, FiHardDrive } from "react-icons/fi";
import { useTranslation } from "next-i18next"; import { useTranslation } from "next-i18next";
import UsageBar from "../resources/usage-bar"; import UsageBar from "../resources/usage-bar";
import { SettingsContext } from "utils/contexts/settings";
const cpuSensorLabels = ["cpu_thermal", "Core", "Tctl"]; const cpuSensorLabels = ["cpu_thermal", "Core", "Tctl"];
function convertToFahrenheit(t) { function convertToFahrenheit(t) {
@@ -14,6 +17,7 @@ function convertToFahrenheit(t) {
export default function Widget({ options }) { export default function Widget({ options }) {
const { t, i18n } = useTranslation(); const { t, i18n } = useTranslation();
const { settings } = useContext(SettingsContext);
const { data, error } = useSWR( const { data, error } = useSWR(
`/api/widgets/glances?${new URLSearchParams({ lang: i18n.language, ...options }).toString()}`, { `/api/widgets/glances?${new URLSearchParams({ lang: i18n.language, ...options }).toString()}`, {
@@ -88,8 +92,16 @@ export default function Widget({ options }) {
} }
const tempPercent = Math.round((mainTemp / maxTemp) * 100); const tempPercent = Math.round((mainTemp / maxTemp) * 100);
let disks = [];
if (options.disk) {
disks = Array.isArray(options.disk)
? options.disk.map((disk) => data.fs.find((d) => d.mnt_point === disk)).filter((d) => d)
: [data.fs.find((d) => d.mnt_point === options.disk)].filter((d) => d);
}
return ( return (
<div className="flex flex-col max-w:full sm:basis-auto self-center grow-0 flex-wrap ml-4"> <a href={options.url} target={settings.target ?? "_blank"} className="flex flex-col max-w:full sm:basis-auto self-center grow-0 flex-wrap">
<div className="flex flex-row self-center flex-wrap justify-between"> <div className="flex flex-row self-center flex-wrap justify-between">
<div className="flex-none flex flex-row items-center mr-3 py-1.5"> <div className="flex-none flex flex-row items-center mr-3 py-1.5">
<FiCpu className="text-theme-800 dark:text-theme-200 w-5 h-5" /> <FiCpu className="text-theme-800 dark:text-theme-200 w-5 h-5" />
@@ -97,7 +109,7 @@ export default function Widget({ options }) {
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between"> <div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5"> <div className="pl-0.5">
{t("common.number", { {t("common.number", {
value: data.quicklook.cpu, value: data.cpu.total,
style: "unit", style: "unit",
unit: "percent", unit: "percent",
maximumFractionDigits: 0, maximumFractionDigits: 0,
@@ -105,7 +117,20 @@ export default function Widget({ options }) {
</div> </div>
<div className="pr-1">{t("glances.cpu")}</div> <div className="pr-1">{t("glances.cpu")}</div>
</div> </div>
<UsageBar percent={data.quicklook.cpu} /> {options.expanded && (
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5 pr-1">
{t("common.number", {
value: data.load.min15,
style: "unit",
unit: "percent",
maximumFractionDigits: 0,
})}
</div>
<div className="pr-1">{t("glances.load")}</div>
</span>
)}
<UsageBar percent={data.cpu.total} />
</div> </div>
</div> </div>
<div className="flex-none flex flex-row items-center mr-3 py-1.5"> <div className="flex-none flex flex-row items-center mr-3 py-1.5">
@@ -113,18 +138,46 @@ export default function Widget({ options }) {
<div className="flex flex-col ml-3 text-left min-w-[85px]"> <div className="flex flex-col ml-3 text-left min-w-[85px]">
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between"> <div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5"> <div className="pl-0.5">
{t("common.number", { {t("common.bytes", {
value: data.quicklook.mem, value: data.mem.free,
style: "unit", maximumFractionDigits: 1,
unit: "percent", binary: true,
maximumFractionDigits: 0,
})} })}
</div> </div>
<div className="pr-1">{t("glances.mem")}</div> <div className="pr-1">{t("glances.free")}</div>
</div> </div>
<UsageBar percent={data.quicklook.mem} /> {options.expanded && (
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5 pr-1">
{t("common.bytes", {
value: data.mem.total,
maximumFractionDigits: 1,
binary: true,
})}
</div>
<div className="pr-1">{t("glances.total")}</div>
</span>
)}
<UsageBar percent={data.mem.percent} />
</div> </div>
</div> </div>
{disks.map((disk) => (
<div key={disk.mnt_point} className="flex-none flex flex-row items-center mr-3 py-1.5">
<FiHardDrive className="text-theme-800 dark:text-theme-200 w-5 h-5" />
<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: disk.free })}</div>
<div className="pr-1">{t("glances.free")}</div>
</span>
{options.expanded && (
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5 pr-1">{t("common.bytes", { value: disk.size })}</div>
<div className="pr-1">{t("glances.total")}</div>
</span>
)}
<UsageBar percent={disk.percent} />
</div>
</div>))}
{options.cputemp && mainTemp > 0 && {options.cputemp && mainTemp > 0 &&
(<div className="flex-none flex flex-row items-center mr-3 py-1.5"> (<div className="flex-none flex flex-row items-center mr-3 py-1.5">
<FaThermometerHalf className="text-theme-800 dark:text-theme-200 w-5 h-5" /> <FaThermometerHalf className="text-theme-800 dark:text-theme-200 w-5 h-5" />
@@ -140,6 +193,19 @@ export default function Widget({ options }) {
</div> </div>
<div className="pr-1">{t("glances.temp")}</div> <div className="pr-1">{t("glances.temp")}</div>
</span> </span>
{options.expanded && (
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5 pr-1">
{t("common.number", {
value: maxTemp,
maximumFractionDigits: 1,
style: "unit",
unit
})}
</div>
<div className="pr-1">{t("glances.warn")}</div>
</span>
)}
<UsageBar percent={tempPercent} /> <UsageBar percent={tempPercent} />
</div> </div>
</div>)} </div>)}
@@ -160,6 +226,6 @@ export default function Widget({ options }) {
{options.label && ( {options.label && (
<div className="pt-1 text-center text-theme-800 dark:text-theme-200 text-xs">{options.label}</div> <div className="pt-1 text-center text-theme-800 dark:text-theme-200 text-xs">{options.label}</div>
)} )}
</div> </a>
); );
} }

View File

@@ -13,7 +13,7 @@ export default function Greeting({ options }) {
if (options.text) { if (options.text) {
return ( return (
<div className="flex flex-row items-center justify-start"> <div className="flex flex-row items-center justify-start">
<span className={`text-theme-800 dark:text-theme-200 ${textSizes[options.text_size || "xl"]}`}> <span className={`text-theme-800 dark:text-theme-200 mr-3 ${textSizes[options.text_size || "xl"]}`}>
{options.text} {options.text}
</span> </span>
</div> </div>

View File

@@ -0,0 +1,18 @@
export default function QueueEntry({ title, activity, timeLeft, progress}) {
return (
<div className="text-theme-700 dark:text-theme-200 relative h-5 rounded-md bg-theme-200/50 dark:bg-theme-900/20 m-1 px-1 flex">
<div
className="absolute h-5 rounded-md bg-theme-200 dark:bg-theme-900/40 z-0 -ml-1"
style={{
width: `${progress}%`,
}}
/>
<div className="text-xs z-10 self-center ml-2 relative h-4 grow mr-2">
<div className="absolute w-full whitespace-nowrap text-ellipsis overflow-hidden text-left">{title}</div>
</div>
<div className="self-center text-xs flex justify-end mr-1.5 pl-1 z-10 text-ellipsis overflow-hidden whitespace-nowrap">
{timeLeft ? `${activity} - ${timeLeft}` : activity}
</div>
</div>
);
}

View File

@@ -1,12 +1,22 @@
import { performance } from "perf_hooks"; import { performance } from "perf_hooks";
import { getServiceItem } from "utils/config/service-helpers";
import createLogger from "utils/logger"; import createLogger from "utils/logger";
import { httpProxy } from "utils/proxy/http"; import { httpProxy } from "utils/proxy/http";
const logger = createLogger("ping"); const logger = createLogger("ping");
export default async function handler(req, res) { export default async function handler(req, res) {
const { ping: pingURL } = req.query; const { group, service } = req.query;
const serviceItem = await getServiceItem(group, service);
if (!serviceItem) {
logger.debug(`No service item found for group ${group} named ${service}`);
return res.status(400).send({
error: "Unable to find service, see log for details.",
});
}
const { ping: pingURL } = serviceItem;
if (!pingURL) { if (!pingURL) {
logger.debug("No ping URL specified"); logger.debug("No ping URL specified");
@@ -14,22 +24,29 @@ export default async function handler(req, res) {
error: "No ping URL given", error: "No ping URL given",
}); });
} }
let startTime = performance.now();
let [status] = await httpProxy(pingURL, {
method: "HEAD"
});
let endTime = performance.now();
if (status > 403) {
// 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({ try {
status, let startTime = performance.now();
latency: endTime - startTime let [status] = await httpProxy(pingURL, {
}); method: "HEAD"
});
let endTime = performance.now();
if (status > 403) {
// 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,
latency: endTime - startTime
});
} catch (e) {
logger.debug("Error attempting ping: %s", JSON.stringify(e));
return res.status(400).send({
error: 'Error attempting ping, see logs.',
});
}
} }

View File

@@ -40,20 +40,32 @@ async function retrieveFromGlancesAPI(privateWidgetOptions, endpoint) {
} }
export default async function handler(req, res) { export default async function handler(req, res) {
const { index } = req.query; const { index, cputemp: includeCpuTemp, uptime: includeUptime, disk: includeDisks } = req.query;
const privateWidgetOptions = await getPrivateWidgetOptions("glances", index); const privateWidgetOptions = await getPrivateWidgetOptions("glances", index);
try { try {
const quicklookData = await retrieveFromGlancesAPI(privateWidgetOptions, "quicklook"); const cpuData = await retrieveFromGlancesAPI(privateWidgetOptions, "cpu");
const loadData = await retrieveFromGlancesAPI(privateWidgetOptions, "load");
const memoryData = await retrieveFromGlancesAPI(privateWidgetOptions, "mem");
const data = { const data = {
quicklook: quicklookData cpu: cpuData,
load: loadData,
mem: memoryData,
}
// Disabled by default, dont call unless needed
if (includeUptime) {
data.uptime = await retrieveFromGlancesAPI(privateWidgetOptions, "uptime");
}
if (includeCpuTemp) {
data.sensors = await retrieveFromGlancesAPI(privateWidgetOptions, "sensors");
}
if (includeDisks) {
data.fs = await retrieveFromGlancesAPI(privateWidgetOptions, "fs");
} }
data.uptime = await retrieveFromGlancesAPI(privateWidgetOptions, "uptime");
data.sensors = await retrieveFromGlancesAPI(privateWidgetOptions, "sensors");
return res.status(200).send(data); return res.status(200).send(data);
} catch (e) { } catch (e) {

View File

@@ -52,18 +52,25 @@ export default async function handler(req, res) {
memTotal += mem; memTotal += mem;
}); });
const nodeMetrics = await metricsApi.getNodeMetrics(); try {
nodeMetrics.items.forEach((nodeMetric) => { const nodeMetrics = await metricsApi.getNodeMetrics();
const cpu = parseCpu(nodeMetric.usage.cpu); nodeMetrics.items.forEach((nodeMetric) => {
const mem = parseMemory(nodeMetric.usage.memory); const cpu = parseCpu(nodeMetric.usage.cpu);
cpuUsage += cpu; const mem = parseMemory(nodeMetric.usage.memory);
memUsage += mem; cpuUsage += cpu;
nodeMap[nodeMetric.metadata.name].cpu.load = cpu; memUsage += mem;
nodeMap[nodeMetric.metadata.name].cpu.percent = (cpu / nodeMap[nodeMetric.metadata.name].cpu.total) * 100; nodeMap[nodeMetric.metadata.name].cpu.load = cpu;
nodeMap[nodeMetric.metadata.name].memory.used = mem; nodeMap[nodeMetric.metadata.name].cpu.percent = (cpu / nodeMap[nodeMetric.metadata.name].cpu.total) * 100;
nodeMap[nodeMetric.metadata.name].memory.free = nodeMap[nodeMetric.metadata.name].memory.total - mem; nodeMap[nodeMetric.metadata.name].memory.used = mem;
nodeMap[nodeMetric.metadata.name].memory.percent = (mem / nodeMap[nodeMetric.metadata.name].memory.total) * 100; nodeMap[nodeMetric.metadata.name].memory.free = nodeMap[nodeMetric.metadata.name].memory.total - mem;
}); nodeMap[nodeMetric.metadata.name].memory.percent = (mem / nodeMap[nodeMetric.metadata.name].memory.total) * 100;
});
} catch (error) {
logger.error("Error getting metrics, ensure you have metrics-server installed: s", JSON.stringify(error));
return res.status(500).send({
error: "Error getting metrics, check logs for more details"
});
}
const cluster = { const cluster = {
cpu: { cpu: {

View File

@@ -252,7 +252,7 @@ function Home({ initialSettings }) {
/> />
<meta name="theme-color" content={themes[initialSettings.color || "slate"][initialSettings.theme || "dark"]} /> <meta name="theme-color" content={themes[initialSettings.color || "slate"][initialSettings.theme || "dark"]} />
</Head> </Head>
<div className="relative container m-auto flex flex-col justify-between z-10 h-full"> <div className="relative container m-auto flex flex-col justify-start z-10 h-full">
<div <div
className={classNames( className={classNames(
"flex flex-row flex-wrap justify-between", "flex flex-row flex-wrap justify-between",
@@ -289,7 +289,7 @@ function Home({ initialSettings }) {
{services?.length > 0 && ( {services?.length > 0 && (
<div className="flex flex-wrap p-4 sm:p-8 sm:pt-4 items-start pb-2"> <div className="flex flex-wrap p-4 sm:p-8 sm:pt-4 items-start pb-2">
{services.map((group) => ( {services.map((group) => (
<ServicesGroup key={group.name} services={group} layout={initialSettings.layout?.[group.name]} fiveColumns={settings.fiveColumns} /> <ServicesGroup key={group.name} group={group.name} services={group} layout={initialSettings.layout?.[group.name]} fiveColumns={settings.fiveColumns} />
))} ))}
</div> </div>
)} )}
@@ -302,14 +302,16 @@ function Home({ initialSettings }) {
</div> </div>
)} )}
<div className="flex p-8 pb-0 w-full justify-end"> <div className="flex flex-col mt-auto p-8 w-full">
{!initialSettings?.color && <ColorToggle />} <div className="flex w-full justify-end">
<Revalidate /> {!initialSettings?.color && <ColorToggle />}
{!initialSettings?.theme && <ThemeToggle />} <Revalidate />
</div> {!initialSettings?.theme && <ThemeToggle />}
</div>
<div className="flex p-8 pt-4 w-full justify-end"> <div className="flex mt-4 w-full justify-end">
{!initialSettings?.hideVersion && <Version />} {!initialSettings?.hideVersion && <Version />}
</div>
</div> </div>
</div> </div>
</> </>
@@ -359,6 +361,7 @@ export default function Wrapper({ initialSettings, fallback }) {
<div <div
id="inner_wrapper" id="inner_wrapper"
className={classNames( className={classNames(
'fixed overflow-auto w-full h-full',
backgroundBlur && `backdrop-blur${initialSettings.background.blur.length ? '-' : ""}${initialSettings.background.blur}`, backgroundBlur && `backdrop-blur${initialSettings.background.blur.length ? '-' : ""}${initialSettings.background.blur}`,
backgroundSaturate && `backdrop-saturate-${initialSettings.background.saturate}`, backgroundSaturate && `backdrop-saturate-${initialSettings.background.saturate}`,
backgroundBrightness && `backdrop-brightness-${initialSettings.background.brightness}`, backgroundBrightness && `backdrop-brightness-${initialSettings.background.brightness}`,

View File

@@ -65,5 +65,20 @@ export function getSettings() {
const settingsYaml = join(process.cwd(), "config", "settings.yaml"); const settingsYaml = join(process.cwd(), "config", "settings.yaml");
const rawFileContents = readFileSync(settingsYaml, "utf8"); const rawFileContents = readFileSync(settingsYaml, "utf8");
const fileContents = substituteEnvironmentVars(rawFileContents); const fileContents = substituteEnvironmentVars(rawFileContents);
return yaml.load(fileContents) ?? {}; const initialSettings = yaml.load(fileContents) ?? {};
if (initialSettings.layout) {
// support yaml list but old spec was object so convert to that
// see https://github.com/benphelps/homepage/issues/1546
if (Array.isArray(initialSettings.layout)) {
const layoutItems = initialSettings.layout
initialSettings.layout = {}
layoutItems.forEach(i => {
const name = Object.keys(i)[0]
initialSettings.layout[name] = i[name]
})
}
}
return initialSettings
} }

View File

@@ -63,10 +63,10 @@ export async function servicesFromDocker() {
const serviceServers = await Promise.all( const serviceServers = await Promise.all(
Object.keys(servers).map(async (serverName) => { Object.keys(servers).map(async (serverName) => {
try { try {
const isSwarm = !!servers[serverName].swarm;
const docker = new Docker(getDockerArguments(serverName).conn); const docker = new Docker(getDockerArguments(serverName).conn);
const containers = await docker.listContainers({ const listProperties = { all: true };
all: true, const containers = await ((isSwarm) ? docker.listServices(listProperties) : docker.listContainers(listProperties));
});
// bad docker connections can result in a <Buffer ...> object? // bad docker connections can result in a <Buffer ...> object?
// in any case, this ensures the result is the expected array // in any case, this ensures the result is the expected array
@@ -76,17 +76,19 @@ export async function servicesFromDocker() {
const discovered = containers.map((container) => { const discovered = containers.map((container) => {
let constructedService = null; let constructedService = null;
const containerLabels = isSwarm ? shvl.get(container, 'Spec.Labels') : container.Labels;
const containerName = isSwarm ? shvl.get(container, 'Spec.Name') : container.Names[0];
Object.keys(container.Labels).forEach((label) => { Object.keys(containerLabels).forEach((label) => {
if (label.startsWith("homepage.")) { if (label.startsWith("homepage.")) {
if (!constructedService) { if (!constructedService) {
constructedService = { constructedService = {
container: container.Names[0].replace(/^\//, ""), container: containerName.replace(/^\//, ""),
server: serverName, server: serverName,
type: 'service' type: 'service'
}; };
} }
shvl.set(constructedService, label.replace("homepage.", ""), container.Labels[label]); shvl.set(constructedService, label.replace("homepage.", ""), substituteEnvironmentVars(containerLabels[label]));
} }
}); });
@@ -168,14 +170,14 @@ export async function servicesFromKubernetes() {
.filter((ingress) => ingress.metadata.annotations && ingress.metadata.annotations[`${ANNOTATION_BASE}/href`]) .filter((ingress) => ingress.metadata.annotations && ingress.metadata.annotations[`${ANNOTATION_BASE}/href`])
ingressList.items.push(...traefikServices); ingressList.items.push(...traefikServices);
} }
if (!ingressList) { if (!ingressList) {
return []; return [];
} }
const services = ingressList.items const services = ingressList.items
.filter((ingress) => ingress.metadata.annotations && ingress.metadata.annotations[`${ANNOTATION_BASE}/enabled`] === 'true') .filter((ingress) => ingress.metadata.annotations && ingress.metadata.annotations[`${ANNOTATION_BASE}/enabled`] === 'true')
.map((ingress) => { .map((ingress) => {
const constructedService = { let constructedService = {
app: ingress.metadata.name, app: ingress.metadata.name,
namespace: ingress.metadata.namespace, namespace: ingress.metadata.namespace,
href: ingress.metadata.annotations[`${ANNOTATION_BASE}/href`] || getUrlFromIngress(ingress), href: ingress.metadata.annotations[`${ANNOTATION_BASE}/href`] || getUrlFromIngress(ingress),
@@ -202,6 +204,12 @@ export async function servicesFromKubernetes() {
} }
}); });
try {
constructedService = JSON.parse(substituteEnvironmentVars(JSON.stringify(constructedService)));
} catch (e) {
logger.error("Error attempting k8s environment variable substitution.");
}
return constructedService; return constructedService;
}); });
@@ -270,7 +278,8 @@ export function cleanServiceGroups(groups) {
wan, // opnsense widget, pfsense widget wan, // opnsense widget, pfsense widget
enableBlocks, // emby/jellyfin enableBlocks, // emby/jellyfin
enableNowPlaying, enableNowPlaying,
volume, // diskstation widget volume, // diskstation widget,
enableQueue, // sonarr/radarr
} = cleanedService.widget; } = cleanedService.widget;
const fieldsList = typeof fields === 'string' ? JSON.parse(fields) : fields; const fieldsList = typeof fields === 'string' ? JSON.parse(fields) : fields;
@@ -306,7 +315,10 @@ export function cleanServiceGroups(groups) {
if (enableBlocks !== undefined) cleanedService.widget.enableBlocks = JSON.parse(enableBlocks); if (enableBlocks !== undefined) cleanedService.widget.enableBlocks = JSON.parse(enableBlocks);
if (enableNowPlaying !== undefined) cleanedService.widget.enableNowPlaying = JSON.parse(enableNowPlaying); if (enableNowPlaying !== undefined) cleanedService.widget.enableNowPlaying = JSON.parse(enableNowPlaying);
} }
if (type === "diskstation") { if (["sonarr", "radarr"].includes(type)) {
if (enableQueue !== undefined) cleanedService.widget.enableQueue = JSON.parse(enableQueue);
}
if (["diskstation", "qnap"].includes(type)) {
if (volume) cleanedService.widget.volume = volume; if (volume) cleanedService.widget.volume = volume;
} }
} }
@@ -316,16 +328,13 @@ export function cleanServiceGroups(groups) {
})); }));
} }
export default async function getServiceWidget(group, service) { export async function getServiceItem(group, service) {
const configuredServices = await servicesFromConfig(); const configuredServices = await servicesFromConfig();
const serviceGroup = configuredServices.find((g) => g.name === group); const serviceGroup = configuredServices.find((g) => g.name === group);
if (serviceGroup) { if (serviceGroup) {
const serviceEntry = serviceGroup.services.find((s) => s.name === service); const serviceEntry = serviceGroup.services.find((s) => s.name === service);
if (serviceEntry) { if (serviceEntry) return serviceEntry;
const { widget } = serviceEntry;
return widget;
}
} }
const discoveredServices = await servicesFromDocker(); const discoveredServices = await servicesFromDocker();
@@ -333,20 +342,24 @@ export default async function getServiceWidget(group, service) {
const dockerServiceGroup = discoveredServices.find((g) => g.name === group); const dockerServiceGroup = discoveredServices.find((g) => g.name === group);
if (dockerServiceGroup) { if (dockerServiceGroup) {
const dockerServiceEntry = dockerServiceGroup.services.find((s) => s.name === service); const dockerServiceEntry = dockerServiceGroup.services.find((s) => s.name === service);
if (dockerServiceEntry) { if (dockerServiceEntry) return dockerServiceEntry;
const { widget } = dockerServiceEntry;
return widget;
}
} }
const kubernetesServices = await servicesFromKubernetes(); const kubernetesServices = await servicesFromKubernetes();
const kubernetesServiceGroup = kubernetesServices.find((g) => g.name === group); const kubernetesServiceGroup = kubernetesServices.find((g) => g.name === group);
if (kubernetesServiceGroup) { if (kubernetesServiceGroup) {
const kubernetesServiceEntry = kubernetesServiceGroup.services.find((s) => s.name === service); const kubernetesServiceEntry = kubernetesServiceGroup.services.find((s) => s.name === service);
if (kubernetesServiceEntry) { if (kubernetesServiceEntry) return kubernetesServiceEntry;
const { widget } = kubernetesServiceEntry; }
return widget;
} return false;
}
export default async function getServiceWidget(group, service) {
const serviceItem = await getServiceItem(group, service);
if (serviceItem) {
const { widget } = serviceItem;
return widget;
} }
return false; return false;

View File

@@ -5,8 +5,6 @@ import yaml from "js-yaml";
import checkAndCopyConfig, { substituteEnvironmentVars } from "utils/config/config"; import checkAndCopyConfig, { substituteEnvironmentVars } from "utils/config/config";
const exemptWidgets = ["search"];
export async function widgetsFromConfig() { export async function widgetsFromConfig() {
checkAndCopyConfig("widgets.yaml"); checkAndCopyConfig("widgets.yaml");
@@ -32,15 +30,17 @@ export async function cleanWidgetGroups(widgets) {
return widgets.map((widget, index) => { return widgets.map((widget, index) => {
const sanitizedOptions = widget.options; const sanitizedOptions = widget.options;
const optionKeys = Object.keys(sanitizedOptions); const optionKeys = Object.keys(sanitizedOptions);
if (!exemptWidgets.includes(widget.type)) {
["url", "username", "password", "key"].forEach((pO) => { // delete private options from the sanitized options
if (optionKeys.includes(pO)) { ["username", "password", "key"].forEach((pO) => {
// allow URL in search if (optionKeys.includes(pO)) {
if (widget.type !== "search" && pO !== "key") { delete sanitizedOptions[pO];
delete sanitizedOptions[pO]; }
} });
}
}); // delete url from the sanitized options if the widget is not a search or glances widgeth
if (widget.type !== "search" && widget.type !== "glances" && optionKeys.includes("url")) {
delete sanitizedOptions.url;
} }
return { return {
@@ -78,4 +78,4 @@ export async function getPrivateWidgetOptions(type, widgetIndex) {
}); });
return (type !== undefined && widgetIndex !== undefined) ? privateOptions.find(o => o.type === type && o.options.index === parseInt(widgetIndex, 10))?.options : privateOptions; return (type !== undefined && widgetIndex !== undefined) ? privateOptions.find(o => o.type === type && o.options.index === parseInt(widgetIndex, 10))?.options : privateOptions;
} }

View File

@@ -55,6 +55,12 @@ export default async function credentialedProxyHandler(req, res, map) {
} else { } else {
headers.Authorization = `Basic ${Buffer.from(`${widget.username}:${widget.password}`).toString("base64")}`; headers.Authorization = `Basic ${Buffer.from(`${widget.username}:${widget.password}`).toString("base64")}`;
} }
} else if (widget.type === "paperlessngx") {
if (widget.key) {
headers.Authorization = `Token ${widget.key}`;
} else {
headers.Authorization = `Basic ${Buffer.from(`${widget.username}:${widget.password}`).toString("base64")}`;
}
} else { } else {
headers["X-API-Key"] = `${widget.key}`; headers["X-API-Key"] = `${widget.key}`;
} }

View File

@@ -58,11 +58,11 @@ export default async function genericProxyHandler(req, res, map) {
if (status >= 400) { if (status >= 400) {
logger.debug( logger.debug(
"HTTP Error %d calling %s//%s:%s%s...", "HTTP Error %d calling %s//%s%s%s...",
status, status,
url.protocol, url.protocol,
url.hostname, url.hostname,
url.port, url.port ? `:${url.port}` : '',
url.pathname url.pathname
); );
return res.status(status).json({error: {message: "HTTP Error", url: sanitizeErrorURL(url), resultData}}); return res.status(status).json({error: {message: "HTTP Error", url: sanitizeErrorURL(url), resultData}});

View File

@@ -1,5 +1,7 @@
/* eslint-disable prefer-promise-reject-errors */ /* eslint-disable prefer-promise-reject-errors */
/* eslint-disable no-param-reassign */ /* eslint-disable no-param-reassign */
import { createUnzip } from "node:zlib";
import { http, https } from "follow-redirects"; import { http, https } from "follow-redirects";
import { addCookieToJar, setCookieHeader } from "./cookie-jar"; import { addCookieToJar, setCookieHeader } from "./cookie-jar";
@@ -28,12 +30,19 @@ function handleRequest(requestor, url, params) {
const request = requestor.request(url, params, (response) => { const request = requestor.request(url, params, (response) => {
const data = []; const data = [];
const contentEncoding = response.headers['content-encoding']?.trim().toLowerCase();
response.on("data", (chunk) => { let responseContent = response;
if (contentEncoding === 'gzip' || contentEncoding === 'deflate') {
responseContent = createUnzip();
response.pipe(responseContent);
}
responseContent.on("data", (chunk) => {
data.push(chunk); data.push(chunk);
}); });
response.on("end", () => { responseContent.on("end", () => {
addCookieToJar(url, response.headers); addCookieToJar(url, response.headers);
resolve([response.statusCode, response.headers["content-type"], Buffer.concat(data), response.headers]); resolve([response.statusCode, response.headers["content-type"], Buffer.concat(data), response.headers]);
}); });
@@ -82,10 +91,10 @@ export async function httpProxy(url, params = {}) {
} }
catch (err) { catch (err) {
logger.error( logger.error(
"Error calling %s//%s:%s%s...", "Error calling %s//%s%s%s...",
constructedUrl.protocol, constructedUrl.protocol,
constructedUrl.hostname, constructedUrl.hostname,
constructedUrl.port, constructedUrl.port ? `:${constructedUrl.port}` : '',
constructedUrl.pathname constructedUrl.pathname
); );
logger.error(err); logger.error(err);

View File

@@ -7,7 +7,11 @@ export default function useWidgetAPI(widget, ...options) {
if (options && options[1]?.refreshInterval) { if (options && options[1]?.refreshInterval) {
config.refreshInterval = options[1].refreshInterval; config.refreshInterval = options[1].refreshInterval;
} }
const { data, error, mutate } = useSWR(formatProxyUrl(widget, ...options), config); let url = formatProxyUrl(widget, ...options)
if (options[0] === "") {
url = null
}
const { data, error, mutate } = useSWR(url, config);
// make the data error the top-level error // make the data error the top-level error
return { data, error: data?.error ?? error, mutate } return { data, error: data?.error ?? error, mutate }
} }

View File

@@ -57,6 +57,7 @@ const components = {
pfsense: dynamic(() => import("./pfsense/component")), pfsense: dynamic(() => import("./pfsense/component")),
photoprism: dynamic(() => import("./photoprism/component")), photoprism: dynamic(() => import("./photoprism/component")),
proxmoxbackupserver: dynamic(() => import("./proxmoxbackupserver/component")), proxmoxbackupserver: dynamic(() => import("./proxmoxbackupserver/component")),
pialert: dynamic(() => import("./pialert/component")),
pihole: dynamic(() => import("./pihole/component")), pihole: dynamic(() => import("./pihole/component")),
plex: dynamic(() => import("./plex/component")), plex: dynamic(() => import("./plex/component")),
portainer: dynamic(() => import("./portainer/component")), portainer: dynamic(() => import("./portainer/component")),

View File

@@ -71,6 +71,14 @@ export default async function homeassistantProxyHandler(req, res) {
let queries = defaultQueries; let queries = defaultQueries;
if (!widget.fields && widget.custom) { if (!widget.fields && widget.custom) {
if (typeof widget.custom === 'string') {
try {
widget.custom = JSON.parse(widget.custom)
} catch (error) {
logger.debug("Error parsing HASS widget custom label: %s", JSON.stringify(error));
return res.status(400).json({ error: "Error parsing widget custom label" });
}
}
queries = widget.custom.slice(0, 4); queries = widget.custom.slice(0, 4);
} }

View File

@@ -16,7 +16,7 @@ export default function Component({ service }) {
`/api/kubernetes/stats/${widget.namespace}/${widget.app}?${podSelectorString}`); `/api/kubernetes/stats/${widget.namespace}/${widget.app}?${podSelectorString}`);
if (statsError || statusError) { if (statsError || statusError) {
return <Container service={service} error={t("widget.api_error")} />; return <Container service={service} error={statsError ?? statusError} />;
} }
if (statusData && statusData.status !== "running") { if (statusData && statusData.status !== "running") {

View File

@@ -9,21 +9,21 @@ export default function Component({ service }) {
const { widget } = service; const { widget } = service;
const { data: albumsData, error: albumsError } = useWidgetAPI(widget, "album"); const { data: artistsData, error: artistsError } = useWidgetAPI(widget, "artist");
const { data: wantedData, error: wantedError } = useWidgetAPI(widget, "wanted/missing"); const { data: wantedData, error: wantedError } = useWidgetAPI(widget, "wanted/missing");
const { data: queueData, error: queueError } = useWidgetAPI(widget, "queue/status"); const { data: queueData, error: queueError } = useWidgetAPI(widget, "queue/status");
if (albumsError || wantedError || queueError) { if (artistsError || wantedError || queueError) {
const finalError = albumsError ?? wantedError ?? queueError; const finalError = artistsError ?? wantedError ?? queueError;
return <Container service={service} error={finalError} />; return <Container service={service} error={finalError} />;
} }
if (!albumsData || !wantedData || !queueData) { if (!artistsData || !wantedData || !queueData) {
return ( return (
<Container service={service}> <Container service={service}>
<Block label="lidarr.wanted" /> <Block label="lidarr.wanted" />
<Block label="lidarr.queued" /> <Block label="lidarr.queued" />
<Block label="lidarr.albums" /> <Block label="lidarr.artists" />
</Container> </Container>
); );
} }
@@ -32,7 +32,7 @@ export default function Component({ service }) {
<Container service={service}> <Container service={service}>
<Block label="lidarr.wanted" value={t("common.number", { value: wantedData.totalRecords })} /> <Block label="lidarr.wanted" value={t("common.number", { value: wantedData.totalRecords })} />
<Block label="lidarr.queued" value={t("common.number", { value: queueData.totalCount })} /> <Block label="lidarr.queued" value={t("common.number", { value: queueData.totalCount })} />
<Block label="lidarr.albums" value={t("common.number", { value: albumsData.have })} /> <Block label="lidarr.artists" value={t("common.number", { value: artistsData.length })} />
</Container> </Container>
); );
} }

View File

@@ -1,16 +1,12 @@
import genericProxyHandler from "utils/proxy/handlers/generic"; import genericProxyHandler from "utils/proxy/handlers/generic";
import { jsonArrayFilter } from "utils/proxy/api-helpers";
const widget = { const widget = {
api: "{url}/api/v1/{endpoint}?apikey={key}", api: "{url}/api/v1/{endpoint}?apikey={key}",
proxyHandler: genericProxyHandler, proxyHandler: genericProxyHandler,
mappings: { mappings: {
album: { artist: {
endpoint: "album", endpoint: "artist",
map: (data) => ({
have: jsonArrayFilter(data, (item) => item?.statistics?.percentOfTracks === 100).length,
}),
}, },
"wanted/missing": { "wanted/missing": {
endpoint: "wanted/missing", endpoint: "wanted/missing",

View File

@@ -1,8 +1,8 @@
import genericProxyHandler from "utils/proxy/handlers/generic"; import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
const widget = { const widget = {
api: "{url}/api/{endpoint}", api: "{url}/api/{endpoint}",
proxyHandler: genericProxyHandler, proxyHandler: credentialedProxyHandler,
mappings: { mappings: {
"statistics": { "statistics": {

View File

@@ -0,0 +1,37 @@
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: pialertData, error: pialertError } = useWidgetAPI(widget, "data");
if (pialertError) {
return <Container service={service} error={pialertError} />;
}
if (!pialertData) {
return (
<Container service={service}>
<Block label="pialert.total" />
<Block label="pialert.connected" />
<Block label="pialert.new_devices" />
<Block label="pialert.down_alerts" />
</Container>
);
}
return (
<Container service={service}>
<Block label="pialert.total" value={t("common.number", { value: parseInt(pialertData[0], 10) })} />
<Block label="pialert.connected" value={t("common.number", { value: parseInt(pialertData[1], 10) })} />
<Block label="pialert.new_devices" value={t("common.number", { value: parseInt(pialertData[3], 10) })} />
<Block label="pialert.down_alerts" value={t("common.number", { value: parseInt(pialertData[4], 10) })} />
</Container>
);
}

View File

@@ -0,0 +1,14 @@
import genericProxyHandler from "utils/proxy/handlers/generic";
const widget = {
api: "{url}/php/server/devices.php?action=getDevicesTotals",
proxyHandler: genericProxyHandler,
mappings: {
"data": {
endpoint: "data",
},
},
};
export default widget;

View File

@@ -1,12 +1,8 @@
import { useTranslation } from "next-i18next";
import Container from "components/services/widget/container"; import Container from "components/services/widget/container";
import Block from "components/services/widget/block"; import Block from "components/services/widget/block";
import useWidgetAPI from "utils/proxy/use-widget-api"; import useWidgetAPI from "utils/proxy/use-widget-api";
export default function Component({ service }) { export default function Component({ service }) {
const { t } = useTranslation();
const { widget } = service; const { widget } = service;
const { data: containersData, error: containersError } = useWidgetAPI(widget, "docker/containers/json", { const { data: containersData, error: containersError } = useWidgetAPI(widget, "docker/containers/json", {
@@ -27,8 +23,9 @@ export default function Component({ service }) {
); );
} }
if (containersData.error) { if (containersData.error || containersData.message) {
return <Container service={service} error={t("widget.api_error")} />; // containersData can be itself an error object e.g. if environment fails
return <Container service={service} error={ containersData?.error ?? containersData } />;
} }
const running = containersData.filter((c) => c.State === "running").length; const running = containersData.filter((c) => c.State === "running").length;

View File

@@ -8,7 +8,7 @@ const logger = createLogger("qbittorrentProxyHandler");
async function login(widget) { async function login(widget) {
logger.debug("qBittorrent is rejecting the request, logging in."); logger.debug("qBittorrent is rejecting the request, logging in.");
const loginUrl = new URL(`${widget.url}/api/v2/auth/login`).toString(); const loginUrl = new URL(`${widget.url}/api/v2/auth/login`).toString();
const loginBody = `username=${encodeURI(widget.username)}&password=${encodeURI(widget.password)}`; const loginBody = `username=${encodeURIComponent(widget.username)}&password=${encodeURIComponent(widget.password)}`;
const loginParams = { const loginParams = {
method: "POST", method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" }, headers: { "Content-Type": "application/x-www-form-urlencoded" },

View File

@@ -23,7 +23,7 @@ export default function Component({ service }) {
<Block label="qnap.cpuUsage" /> <Block label="qnap.cpuUsage" />
<Block label="qnap.memUsage" /> <Block label="qnap.memUsage" />
<Block label="qnap.systemTempC" /> <Block label="qnap.systemTempC" />
<Block label="qnap.poolUsage" /> <Block label={(widget.volume) ? "qnap.volumeUsage" : "qnap.poolUsage" } />
</Container> </Container>
); );
} }
@@ -31,10 +31,30 @@ export default function Component({ service }) {
const cpuUsage = statusData.system.cpu_usage._cdata.replace(' %',''); const cpuUsage = statusData.system.cpu_usage._cdata.replace(' %','');
const totalMemory = statusData.system.total_memory._cdata; const totalMemory = statusData.system.total_memory._cdata;
const freeMemory = statusData.system.free_memory._cdata; const freeMemory = statusData.system.free_memory._cdata;
const systemTempC = statusData.system.cpu_tempc._text; const systemTempC = statusData.system.sys_tempc._text;
let volumeTotalSize = 0;
let volumeFreeSize = 0;
let validVolume = true;
const volumeTotalSize = statusData.volume.volumeUse.total_size._cdata; if (Array.isArray(statusData.volume.volumeUseList.volumeUse)) {
const volumeFreeSize = statusData.volume.volumeUse.free_size._cdata; if (widget.volume) {
const volumeSelected = statusData.volume.volumeList.volume.findIndex(vl => vl.volumeLabel._cdata === widget.volume);
if (volumeSelected !== -1) {
volumeTotalSize = statusData.volume.volumeUseList.volumeUse[volumeSelected].total_size._cdata;
volumeFreeSize = statusData.volume.volumeUseList.volumeUse[volumeSelected].free_size._cdata;
} else {
validVolume = false;
}
} else {
statusData.volume.volumeUseList.volumeUse.forEach((volume) => {
volumeTotalSize += parseInt(volume.total_size._cdata, 10);
volumeFreeSize += parseInt(volume.free_size._cdata, 10);
});
}
} else {
volumeTotalSize = statusData.volume.volumeUseList.volumeUse.total_size._cdata;
volumeFreeSize = statusData.volume.volumeUseList.volumeUse.free_size._cdata;
}
return ( return (
<Container service={service}> <Container service={service}>
@@ -51,8 +71,8 @@ export default function Component({ service }) {
value={t("common.number", { value: systemTempC, maximumFractionDigits: 1, style: "unit", unit: "celsius" })} value={t("common.number", { value: systemTempC, maximumFractionDigits: 1, style: "unit", unit: "celsius" })}
/> />
<Block <Block
label="qnap.poolUsage" label={(widget.volume) ? "qnap.volumeUsage" : "qnap.poolUsage" }
value={t("common.percent", { value: (((volumeTotalSize - volumeFreeSize) / volumeTotalSize) * 100).toFixed(0) })} value={(validVolume) ? t("common.percent", { value: (((volumeTotalSize - volumeFreeSize) / volumeTotalSize) * 100).toFixed(0) }) : t("qnap.invalid") }
/> />
</Container> </Container>
); );

View File

@@ -99,6 +99,6 @@ export default async function qnapProxyHandler(req, res) {
return res.status(200).send({ return res.status(200).send({
system: systemStatsData.QDocRoot.func.ownContent.root, system: systemStatsData.QDocRoot.func.ownContent.root,
volume: volumeStatsData.QDocRoot.volumeUseList volume: volumeStatsData.QDocRoot
}); });
} }

View File

@@ -1,22 +1,41 @@
import { useTranslation } from "next-i18next"; import { useTranslation } from "next-i18next";
import { useCallback } from 'react';
import QueueEntry from "../../components/widgets/queue/queueEntry";
import Container from "components/services/widget/container"; import Container from "components/services/widget/container";
import Block from "components/services/widget/block"; import Block from "components/services/widget/block";
import useWidgetAPI from "utils/proxy/use-widget-api"; import useWidgetAPI from "utils/proxy/use-widget-api";
function getProgress(sizeLeft, size) {
return sizeLeft === 0 ? 100 : (1 - sizeLeft / size) * 100
}
export default function Component({ service }) { export default function Component({ service }) {
const { t } = useTranslation(); const { t } = useTranslation();
const { widget } = service; const { widget } = service;
const { data: moviesData, error: moviesError } = useWidgetAPI(widget, "movie"); const { data: moviesData, error: moviesError } = useWidgetAPI(widget, "movie");
const { data: queuedData, error: queuedError } = useWidgetAPI(widget, "queue/status"); const { data: queuedData, error: queuedError } = useWidgetAPI(widget, "queue/status");
const { data: queueDetailsData, error: queueDetailsError } = useWidgetAPI(widget, "queue/details");
if (moviesError || queuedError) { const formatDownloadState = useCallback((downloadState) => {
const finalError = moviesError ?? queuedError; switch (downloadState) {
case "importPending":
return "import pending";
case "failedPending":
return "failed pending";
default:
return downloadState;
}
}, []);
if (moviesError || queuedError || queueDetailsError) {
const finalError = moviesError ?? queuedError ?? queueDetailsError;
return <Container service={service} error={finalError} />; return <Container service={service} error={finalError} />;
} }
if (!moviesData || !queuedData) { if (!moviesData || !queuedData || !queueDetailsData) {
return ( return (
<Container service={service}> <Container service={service}>
<Block label="radarr.wanted" /> <Block label="radarr.wanted" />
@@ -27,12 +46,27 @@ export default function Component({ service }) {
); );
} }
const enableQueue = widget?.enableQueue && Array.isArray(queueDetailsData) && queueDetailsData.length > 0;
return ( return (
<Container service={service}> <>
<Block label="radarr.wanted" value={t("common.number", { value: moviesData.wanted })} /> <Container service={service}>
<Block label="radarr.missing" value={t("common.number", { value: moviesData.missing })} /> <Block label="radarr.wanted" value={t("common.number", { value: moviesData.wanted })} />
<Block label="radarr.queued" value={t("common.number", { value: queuedData.totalCount })} /> <Block label="radarr.missing" value={t("common.number", { value: moviesData.missing })} />
<Block label="radarr.movies" value={t("common.number", { value: moviesData.have })} /> <Block label="radarr.queued" value={t("common.number", { value: queuedData.totalCount })} />
</Container> <Block label="radarr.movies" value={t("common.number", { value: moviesData.have })} />
</Container>
{enableQueue &&
queueDetailsData.map((queueEntry) => (
<QueueEntry
progress={getProgress(queueEntry.sizeLeft, queueEntry.size)}
timeLeft={queueEntry.timeLeft}
title={moviesData.all.find((entry) => entry.id === queueEntry.movieId)?.title ?? t("radarr.unknown")}
activity={formatDownloadState(queueEntry.trackedDownloadState)}
key={`${queueEntry.movieId}-${queueEntry.sizeLeft}`}
/>
))
}
</>
); );
} }

View File

@@ -1,5 +1,5 @@
import genericProxyHandler from "utils/proxy/handlers/generic"; import genericProxyHandler from "utils/proxy/handlers/generic";
import { jsonArrayFilter } from "utils/proxy/api-helpers"; import { asJson, jsonArrayFilter } from "utils/proxy/api-helpers";
const widget = { const widget = {
api: "{url}/api/v3/{endpoint}?apikey={key}", api: "{url}/api/v3/{endpoint}?apikey={key}",
@@ -12,6 +12,7 @@ const widget = {
wanted: jsonArrayFilter(data, (item) => item.monitored && !item.hasFile && item.isAvailable).length, wanted: jsonArrayFilter(data, (item) => item.monitored && !item.hasFile && item.isAvailable).length,
have: jsonArrayFilter(data, (item) => item.hasFile).length, have: jsonArrayFilter(data, (item) => item.hasFile).length,
missing: jsonArrayFilter(data, (item) => item.monitored && !item.hasFile).length, missing: jsonArrayFilter(data, (item) => item.monitored && !item.hasFile).length,
all: asJson(data),
}), }),
}, },
"queue/status": { "queue/status": {
@@ -20,6 +21,37 @@ const widget = {
"totalCount" "totalCount"
] ]
}, },
"queue/details": {
endpoint: "queue/details",
map: (data) => asJson(data).map((entry) => ({
trackedDownloadState: entry.trackedDownloadState,
trackedDownloadStatus: entry.trackedDownloadStatus,
timeLeft: entry.timeleft,
size: entry.size,
sizeLeft: entry.sizeleft,
movieId: entry.movieId ?? entry.id,
status: entry.status
})).sort((a, b) => {
const downloadingA = a.trackedDownloadState === "downloading"
const downloadingB = b.trackedDownloadState === "downloading"
if (downloadingA && !downloadingB) {
return -1;
}
if (downloadingB && !downloadingA) {
return 1;
}
const percentA = a.sizeLeft / a.size;
const percentB = b.sizeLeft / b.size;
if (percentA < percentB) {
return -1;
}
if (percentA > percentB) {
return 1;
}
return 0;
})
},
}, },
}; };

View File

@@ -1,9 +1,26 @@
import { useTranslation } from "next-i18next"; import { useTranslation } from "next-i18next";
import { useCallback } from 'react';
import QueueEntry from "../../components/widgets/queue/queueEntry";
import Container from "components/services/widget/container"; import Container from "components/services/widget/container";
import Block from "components/services/widget/block"; import Block from "components/services/widget/block";
import useWidgetAPI from "utils/proxy/use-widget-api"; import useWidgetAPI from "utils/proxy/use-widget-api";
function getProgress(sizeLeft, size) {
return sizeLeft === 0 ? 100 : (1 - sizeLeft / size) * 100
}
function getTitle(queueEntry, seriesData) {
let title = ''
const seriesTitle = seriesData.find((entry) => entry.id === queueEntry.seriesId)?.title;
if (seriesTitle) title += `${seriesTitle}: `;
const { episodeTitle } = queueEntry;
if (episodeTitle) title += episodeTitle;
if (title === '') return null;
return title;
}
export default function Component({ service }) { export default function Component({ service }) {
const { t } = useTranslation(); const { t } = useTranslation();
const { widget } = service; const { widget } = service;
@@ -11,13 +28,25 @@ export default function Component({ service }) {
const { data: wantedData, error: wantedError } = useWidgetAPI(widget, "wanted/missing"); const { data: wantedData, error: wantedError } = useWidgetAPI(widget, "wanted/missing");
const { data: queuedData, error: queuedError } = useWidgetAPI(widget, "queue"); const { data: queuedData, error: queuedError } = useWidgetAPI(widget, "queue");
const { data: seriesData, error: seriesError } = useWidgetAPI(widget, "series"); const { data: seriesData, error: seriesError } = useWidgetAPI(widget, "series");
const { data: queueDetailsData, error: queueDetailsError } = useWidgetAPI(widget, "queue/details");
if (wantedError || queuedError || seriesError) { const formatDownloadState = useCallback((downloadState) => {
const finalError = wantedError ?? queuedError ?? seriesError; switch (downloadState) {
case "importPending":
return "import pending";
case "failedPending":
return "failed pending";
default:
return downloadState;
}
}, []);
if (wantedError || queuedError || seriesError || queueDetailsError) {
const finalError = wantedError ?? queuedError ?? seriesError ?? queueDetailsError;
return <Container service={service} error={finalError} />; return <Container service={service} error={finalError} />;
} }
if (!wantedData || !queuedData || !seriesData) { if (!wantedData || !queuedData || !seriesData || !queueDetailsData) {
return ( return (
<Container service={service}> <Container service={service}>
<Block label="sonarr.wanted" /> <Block label="sonarr.wanted" />
@@ -27,11 +56,26 @@ export default function Component({ service }) {
); );
} }
const enableQueue = widget?.enableQueue && Array.isArray(queueDetailsData) && queueDetailsData.length > 0;
return ( return (
<Container service={service}> <>
<Block label="sonarr.wanted" value={t("common.number", { value: wantedData.totalRecords })} /> <Container service={service}>
<Block label="sonarr.queued" value={t("common.number", { value: queuedData.totalRecords })} /> <Block label="sonarr.wanted" value={t("common.number", { value: wantedData.totalRecords })} />
<Block label="sonarr.series" value={t("common.number", { value: seriesData.total })} /> <Block label="sonarr.queued" value={t("common.number", { value: queuedData.totalRecords })} />
</Container> <Block label="sonarr.series" value={t("common.number", { value: seriesData.length })} />
</Container>
{enableQueue &&
queueDetailsData.map((queueEntry) => (
<QueueEntry
progress={getProgress(queueEntry.sizeLeft, queueEntry.size)}
timeLeft={queueEntry.timeLeft}
title={getTitle(queueEntry, seriesData) ?? t("sonarr.unknown")}
activity={formatDownloadState(queueEntry.trackedDownloadState)}
key={`${queueEntry.seriesId}-${queueEntry.sizeLeft}`}
/>
))
}
</>
); );
} }

View File

@@ -8,9 +8,10 @@ const widget = {
mappings: { mappings: {
series: { series: {
endpoint: "series", endpoint: "series",
map: (data) => ({ map: (data) => asJson(data).map((entry) => ({
total: asJson(data).length, title: entry.title,
}) id: entry.id
}))
}, },
queue: { queue: {
endpoint: "queue", endpoint: "queue",
@@ -24,6 +25,39 @@ const widget = {
"totalRecords" "totalRecords"
] ]
}, },
"queue/details": {
endpoint: "queue/details",
map: (data) => asJson(data).map((entry) => ({
trackedDownloadState: entry.trackedDownloadState,
trackedDownloadStatus: entry.trackedDownloadStatus,
timeLeft: entry.timeleft,
size: entry.size,
sizeLeft: entry.sizeleft,
seriesId: entry.seriesId,
episodeTitle: entry.episode?.title ?? entry.title,
episodeId: entry.episodeId ?? entry.id,
status: entry.status,
})).sort((a, b) => {
const downloadingA = a.trackedDownloadState === "downloading"
const downloadingB = b.trackedDownloadState === "downloading"
if (downloadingA && !downloadingB) {
return -1;
}
if (downloadingB && !downloadingA) {
return 1;
}
const percentA = a.sizeLeft / a.size;
const percentB = b.sizeLeft / b.size;
if (percentA < percentB) {
return -1;
}
if (percentA > percentB) {
return 1;
}
return 0;
})
}
}, },
}; };

View File

@@ -51,6 +51,7 @@ import paperlessngx from "./paperlessngx/widget";
import pfsense from "./pfsense/widget"; import pfsense from "./pfsense/widget";
import photoprism from "./photoprism/widget"; import photoprism from "./photoprism/widget";
import proxmoxbackupserver from "./proxmoxbackupserver/widget"; import proxmoxbackupserver from "./proxmoxbackupserver/widget";
import pialert from "./pialert/widget";
import pihole from "./pihole/widget"; import pihole from "./pihole/widget";
import plex from "./plex/widget"; import plex from "./plex/widget";
import portainer from "./portainer/widget"; import portainer from "./portainer/widget";
@@ -138,6 +139,7 @@ const widgets = {
pfsense, pfsense,
photoprism, photoprism,
proxmoxbackupserver, proxmoxbackupserver,
pialert,
pihole, pihole,
plex, plex,
portainer, portainer,