Compare commits

..

260 Commits

Author SHA1 Message Date
Anonymous
6ae351b2ba Translated using Weblate (Basque)
Currently translated at 6.6% (33 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eu/
2023-08-02 07:31:53 +02:00
Anonymous
7116b093cb Translated using Weblate (Indonesian)
Currently translated at 4.8% (24 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/id/
2023-08-02 07:31:53 +02:00
Anonymous
c5aa89e533 Translated using Weblate (Slovenian)
Currently translated at 94.2% (471 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/
2023-08-02 07:31:53 +02:00
Anonymous
69b660b829 Translated using Weblate (Greek)
Currently translated at 28.6% (143 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-08-02 07:31:52 +02:00
Anonymous
ceca1d8ae7 Translated using Weblate (Korean)
Currently translated at 34.6% (173 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ko/
2023-08-02 07:31:52 +02:00
Anonymous
1369a356a8 Translated using Weblate (Slovak)
Currently translated at 1.8% (9 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sk/
2023-08-02 07:31:51 +02:00
Anonymous
a6014d3d06 Translated using Weblate (Thai)
Currently translated at 9.4% (47 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/th/
2023-08-02 07:31:51 +02:00
Anonymous
5de0f4f61e Translated using Weblate (Latvian)
Currently translated at 23.6% (118 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-08-02 07:31:51 +02:00
Anonymous
1371767481 Translated using Weblate (Japanese)
Currently translated at 77.0% (385 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-08-02 07:31:50 +02:00
Anonymous
8534fcfa58 Translated using Weblate (Ukrainian)
Currently translated at 95.8% (479 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-08-02 07:31:50 +02:00
Anonymous
0bc8d74694 Translated using Weblate (Esperanto)
Currently translated at 29.0% (145 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-08-02 07:31:50 +02:00
Anonymous
11b2bd6db1 Translated using Weblate (Hindi)
Currently translated at 1.8% (9 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-08-02 07:31:49 +02:00
Anonymous
3b943cabed Translated using Weblate (Malay)
Currently translated at 50.2% (251 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-08-02 07:31:49 +02:00
Anonymous
5a14917aa7 Translated using Weblate (Danish)
Currently translated at 39.4% (197 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-08-02 07:31:49 +02:00
Anonymous
7583b3dfd1 Translated using Weblate (Czech)
Currently translated at 88.8% (444 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-08-02 07:31:48 +02:00
Anonymous
ec61e2dd23 Translated using Weblate (Arabic)
Currently translated at 52.4% (262 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-08-02 07:31:48 +02:00
Anonymous
5bda68d51d Translated using Weblate (Serbian)
Currently translated at 1.8% (9 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-08-02 07:31:48 +02:00
Anonymous
c75e3cdf40 Translated using Weblate (Turkish)
Currently translated at 78.6% (393 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-08-02 07:31:47 +02:00
Anonymous
2029df1ed0 Translated using Weblate (Bulgarian)
Currently translated at 9.2% (46 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-08-02 07:31:47 +02:00
Anonymous
eb475e8655 Translated using Weblate (Telugu)
Currently translated at 43.0% (215 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-08-02 07:31:47 +02:00
Anonymous
bfada0f5f3 Translated using Weblate (Finnish)
Currently translated at 35.4% (177 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-08-02 07:31:46 +02:00
Anonymous
6e33e62540 Translated using Weblate (Yue (Traditional))
Currently translated at 23.4% (117 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue_Hant/
2023-08-02 07:31:46 +02:00
Anonymous
b6ff3da1f0 Translated using Weblate (Portuguese (Brazil))
Currently translated at 92.2% (461 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-08-02 07:31:45 +02:00
Anonymous
ae14158f35 Translated using Weblate (Romanian)
Currently translated at 30.0% (150 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-08-02 07:31:45 +02:00
Anonymous
149e653e59 Translated using Weblate (Hebrew)
Currently translated at 20.0% (100 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-08-02 07:31:45 +02:00
Anonymous
05a90e83ef Translated using Weblate (Hungarian)
Currently translated at 94.2% (471 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-08-02 07:31:44 +02:00
Anonymous
e7430af074 Translated using Weblate (Croatian)
Currently translated at 94.0% (470 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-08-02 07:31:44 +02:00
Anonymous
0752ffce90 Translated using Weblate (Swedish)
Currently translated at 26.4% (132 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-08-02 07:31:44 +02:00
Anonymous
2451fae52a Translated using Weblate (Polish)
Currently translated at 74.8% (374 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-08-02 07:31:43 +02:00
Anonymous
fa45d09568 Translated using Weblate (Catalan)
Currently translated at 52.0% (260 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-08-02 07:31:43 +02:00
Anonymous
5806ac91b0 Translated using Weblate (Chinese (Traditional))
Currently translated at 92.0% (460 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-08-02 07:31:42 +02:00
Anonymous
92114046dd Translated using Weblate (Dutch)
Currently translated at 48.2% (241 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-08-02 07:31:42 +02:00
Anonymous
4fee35d05a Translated using Weblate (Vietnamese)
Currently translated at 8.8% (44 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-08-02 07:31:41 +02:00
Anonymous
2685f92229 Translated using Weblate (Norwegian Bokmål)
Currently translated at 16.0% (80 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-08-02 07:31:41 +02:00
Anonymous
bb1f9f162a Translated using Weblate (Italian)
Currently translated at 94.0% (470 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-08-02 07:31:41 +02:00
Anonymous
687dda0665 Translated using Weblate (Chinese (Simplified))
Currently translated at 88.8% (444 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-08-02 07:31:40 +02:00
Anonymous
23a06ec87e Translated using Weblate (Russian)
Currently translated at 85.2% (426 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-08-02 07:31:40 +02:00
Anonymous
3002dd2531 Translated using Weblate (Portuguese)
Currently translated at 83.0% (415 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-08-02 07:31:39 +02:00
Anonymous
068150b603 Translated using Weblate (French)
Currently translated at 98.8% (494 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-08-02 07:31:39 +02:00
Anonymous
e97af12f69 Translated using Weblate (Spanish)
Currently translated at 98.8% (494 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-08-02 07:31:39 +02:00
Anonymous
93566320db Translated using Weblate (German)
Currently translated at 91.4% (457 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-08-02 07:31:38 +02:00
Ben Phelps
9c4d1cf108 Merge pull request #1749 from benphelps/charts-widget
Glances Charts Widget
2023-08-02 08:29:53 +03:00
Ben Phelps
daa7ef2a3d add pure info metric 2023-08-02 06:04:54 +03:00
Ben Phelps
09d44da087 add effect overlay target 2023-08-02 06:04:20 +03:00
Ben Phelps
9d10de9949 update placeholder blocks 2023-08-02 06:04:04 +03:00
Ben Phelps
a0ffb46a6f bump up quicklook z 2023-08-02 03:54:34 +03:00
gallegonovato
3e8a8c649b Translated using Weblate (Spanish)
Currently translated at 100.0% (494 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-08-01 20:06:35 +02:00
Ben Phelps
0c8131f27e add gpu metric 2023-08-01 16:45:09 +03:00
Ben Phelps
cd2c24d47b rework position prop 2023-08-01 16:39:46 +03:00
Ben Phelps
b77909a360 refactor widget 2023-08-01 13:05:17 +03:00
Ben Phelps
3fa72e48cc Merge branch 'main' into charts-widget 2023-08-01 04:46:44 +03:00
Ben Phelps
9aba70d214 glances widget test 1 2023-08-01 03:54:19 +03:00
Nonoss117
302bff865c Translated using Weblate (French)
Currently translated at 100.0% (494 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-07-31 18:09:32 +02:00
shamoon
7cb5bcd468 Merge pull request #1746 from benphelps/fix/issue-1743
Fix: authentik queries failing
2023-07-31 09:03:47 -07:00
shamoon
804d9f66de Fix authentik queries 2023-07-31 09:01:55 -07:00
shamoon
489cfb5f10 Merge pull request #1744 from benphelps/fix/resources-0-percent
Fix: usage bar 0% displays '0'
2023-07-31 08:32:28 -07:00
shamoon
45ee37c86d Fix for usage bar percent is 0 2023-07-31 08:31:15 -07:00
shamoon
5221ed06ed Merge pull request #1742 from benphelps/fix/issue-1741
Fix: default resources refresh rate
2023-07-30 22:23:10 -07:00
shamoon
206e5034c5 Include default resource refresh rate 2023-07-30 22:22:30 -07:00
Anonymous
62e294a715 Translated using Weblate (Basque)
Currently translated at 6.6% (33 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eu/
2023-07-30 16:20:40 +02:00
Anonymous
f7aa4f13c8 Translated using Weblate (Indonesian)
Currently translated at 4.8% (24 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/id/
2023-07-30 16:20:40 +02:00
Anonymous
e9c7118e53 Translated using Weblate (Slovenian)
Currently translated at 95.3% (471 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/
2023-07-30 16:20:40 +02:00
Anonymous
43ee714fb0 Translated using Weblate (Greek)
Currently translated at 28.9% (143 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-07-30 16:20:39 +02:00
Anonymous
a4b5cb490c Translated using Weblate (Korean)
Currently translated at 35.0% (173 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ko/
2023-07-30 16:20:39 +02:00
Anonymous
f3eefd917c Translated using Weblate (Slovak)
Currently translated at 1.8% (9 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sk/
2023-07-30 16:20:39 +02:00
Anonymous
d2d2041dd1 Translated using Weblate (Thai)
Currently translated at 9.5% (47 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/th/
2023-07-30 16:20:38 +02:00
Anonymous
962c345083 Translated using Weblate (Latvian)
Currently translated at 23.8% (118 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-07-30 16:20:38 +02:00
Anonymous
34bea0c076 Translated using Weblate (Japanese)
Currently translated at 77.9% (385 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-07-30 16:20:38 +02:00
Anonymous
32d803c54b Translated using Weblate (Ukrainian)
Currently translated at 96.9% (479 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-07-30 16:20:37 +02:00
Anonymous
e884707bfc Translated using Weblate (Esperanto)
Currently translated at 29.3% (145 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-07-30 16:20:37 +02:00
Anonymous
00b0265350 Translated using Weblate (Hindi)
Currently translated at 1.8% (9 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-07-30 16:20:37 +02:00
Anonymous
c987df8f81 Translated using Weblate (Malay)
Currently translated at 50.8% (251 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-07-30 16:20:36 +02:00
Anonymous
94b2c9c822 Translated using Weblate (Danish)
Currently translated at 39.8% (197 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-07-30 16:20:36 +02:00
Anonymous
ee4b0ca450 Translated using Weblate (Czech)
Currently translated at 89.8% (444 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-07-30 16:20:36 +02:00
Anonymous
70ab398432 Translated using Weblate (Arabic)
Currently translated at 53.0% (262 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-07-30 16:20:35 +02:00
Anonymous
4b752bb63a Translated using Weblate (Serbian)
Currently translated at 1.8% (9 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-07-30 16:20:35 +02:00
Anonymous
7a18ec05f1 Translated using Weblate (Turkish)
Currently translated at 79.5% (393 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-07-30 16:20:35 +02:00
Anonymous
1666034f1f Translated using Weblate (Bulgarian)
Currently translated at 9.3% (46 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-07-30 16:20:34 +02:00
Anonymous
d935cb35bf Translated using Weblate (Telugu)
Currently translated at 43.5% (215 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-07-30 16:20:34 +02:00
Anonymous
f5d1ae2c4e Translated using Weblate (Finnish)
Currently translated at 35.8% (177 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-07-30 16:20:33 +02:00
Anonymous
0482e86cd1 Translated using Weblate (Yue (Traditional))
Currently translated at 23.6% (117 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue_Hant/
2023-07-30 16:20:33 +02:00
Anonymous
67608ef79f Translated using Weblate (Portuguese (Brazil))
Currently translated at 93.3% (461 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-07-30 16:20:32 +02:00
Anonymous
59520e4a69 Translated using Weblate (Romanian)
Currently translated at 30.3% (150 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-07-30 16:20:32 +02:00
Anonymous
1ae33d6925 Translated using Weblate (Hebrew)
Currently translated at 20.2% (100 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-07-30 16:20:31 +02:00
Anonymous
aecf77c0ef Translated using Weblate (Hungarian)
Currently translated at 95.3% (471 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-07-30 16:20:31 +02:00
Anonymous
ea8514fc19 Translated using Weblate (Croatian)
Currently translated at 95.1% (470 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-07-30 16:20:31 +02:00
Anonymous
e338328c23 Translated using Weblate (Swedish)
Currently translated at 26.7% (132 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-07-30 16:20:30 +02:00
Anonymous
8138dd832d Translated using Weblate (Polish)
Currently translated at 75.7% (374 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-07-30 16:20:30 +02:00
Anonymous
1a63587ceb Translated using Weblate (Catalan)
Currently translated at 52.6% (260 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-07-30 16:20:30 +02:00
Anonymous
e5490fd5e8 Translated using Weblate (Chinese (Traditional))
Currently translated at 93.1% (460 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-07-30 16:20:29 +02:00
Anonymous
16ecd7b426 Translated using Weblate (Dutch)
Currently translated at 48.7% (241 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-07-30 16:20:29 +02:00
Anonymous
9053ef53f3 Translated using Weblate (Vietnamese)
Currently translated at 8.9% (44 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-07-30 16:20:28 +02:00
Anonymous
0071cadfac Translated using Weblate (Norwegian Bokmål)
Currently translated at 16.1% (80 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-07-30 16:20:28 +02:00
Anonymous
791e9fd95a Translated using Weblate (Italian)
Currently translated at 95.1% (470 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-07-30 16:20:28 +02:00
Anonymous
f1ad45a010 Translated using Weblate (Chinese (Simplified))
Currently translated at 89.8% (444 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-07-30 16:20:27 +02:00
Anonymous
e4a4c64c2b Translated using Weblate (Russian)
Currently translated at 86.2% (426 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-07-30 16:20:27 +02:00
Anonymous
c3dce716ee Translated using Weblate (Portuguese)
Currently translated at 84.0% (415 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-07-30 16:20:26 +02:00
Anonymous
ec12139da2 Translated using Weblate (French)
Currently translated at 99.1% (490 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-07-30 16:20:26 +02:00
Anonymous
e957a03334 Translated using Weblate (Spanish)
Currently translated at 96.9% (479 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-07-30 16:20:26 +02:00
Anonymous
e64a4108b2 Translated using Weblate (German)
Currently translated at 92.5% (457 of 494 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-07-30 16:20:25 +02:00
Nonoss117
31ec795c61 Translated using Weblate (French)
Currently translated at 100.0% (490 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-07-30 16:19:36 +02:00
Stephen Donchez
992516cebd Feature: UrBackup Widget (#1735)
* Add initial UrBackup widget with counts of ok, errored, and out-of date clients

* Add configurable number of days since last backup before a client is considered out-of-date

* Don't count a lack of recent (or error free) image backup if image backup isn't supported.

* Add support for reporting total disk usage

* add support for "fields" from services.yaml

* fix field filtering, syntax

* Consolidate urbackup code, syntax changes

* Revert pnpm changes

* re-add urbackup-server-api

---------

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2023-07-30 07:19:31 -07:00
Anonymous
2f4d4e52be Translated using Weblate (Basque)
Currently translated at 6.7% (33 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eu/
2023-07-30 07:19:10 +02:00
Anonymous
1f0d1bc393 Translated using Weblate (Indonesian)
Currently translated at 4.8% (24 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/id/
2023-07-30 07:19:09 +02:00
Anonymous
d3c0ad2190 Translated using Weblate (Slovenian)
Currently translated at 96.1% (471 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/
2023-07-30 07:19:09 +02:00
Anonymous
523909f63b Translated using Weblate (Greek)
Currently translated at 29.1% (143 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-07-30 07:19:08 +02:00
Anonymous
fbf20d5b8e Translated using Weblate (Korean)
Currently translated at 35.3% (173 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ko/
2023-07-30 07:19:08 +02:00
Anonymous
9bbb28dbc2 Translated using Weblate (Slovak)
Currently translated at 1.8% (9 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sk/
2023-07-30 07:19:08 +02:00
Anonymous
8aeff333d8 Translated using Weblate (Thai)
Currently translated at 9.5% (47 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/th/
2023-07-30 07:19:07 +02:00
Anonymous
e4e822a1e2 Translated using Weblate (Latvian)
Currently translated at 24.0% (118 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-07-30 07:19:07 +02:00
Anonymous
5ec8a1204d Translated using Weblate (Japanese)
Currently translated at 78.5% (385 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-07-30 07:19:06 +02:00
Anonymous
f6484bb23c Translated using Weblate (Ukrainian)
Currently translated at 97.7% (479 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-07-30 07:19:06 +02:00
Anonymous
0996cba02e Translated using Weblate (Esperanto)
Currently translated at 29.5% (145 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-07-30 07:19:06 +02:00
Anonymous
291baa97b7 Translated using Weblate (Hindi)
Currently translated at 1.8% (9 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-07-30 07:19:05 +02:00
Anonymous
cc7b5350ac Translated using Weblate (Malay)
Currently translated at 51.2% (251 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-07-30 07:19:05 +02:00
Anonymous
8e41853d58 Translated using Weblate (Danish)
Currently translated at 40.2% (197 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-07-30 07:19:04 +02:00
Anonymous
eb08d989ad Translated using Weblate (Czech)
Currently translated at 90.6% (444 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-07-30 07:19:04 +02:00
Anonymous
c142991a21 Translated using Weblate (Arabic)
Currently translated at 53.4% (262 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-07-30 07:19:04 +02:00
Anonymous
6d403511ce Translated using Weblate (Serbian)
Currently translated at 1.8% (9 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-07-30 07:19:03 +02:00
Anonymous
40d6afcec2 Translated using Weblate (Turkish)
Currently translated at 80.2% (393 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-07-30 07:19:03 +02:00
Anonymous
634e169d0d Translated using Weblate (Bulgarian)
Currently translated at 9.3% (46 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-07-30 07:19:02 +02:00
Anonymous
25d7fb8930 Translated using Weblate (Telugu)
Currently translated at 43.8% (215 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-07-30 07:19:02 +02:00
Anonymous
04ff059379 Translated using Weblate (Finnish)
Currently translated at 36.1% (177 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-07-30 07:19:02 +02:00
Anonymous
8d347d8b26 Translated using Weblate (Yue (Traditional))
Currently translated at 23.8% (117 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue_Hant/
2023-07-30 07:19:01 +02:00
Anonymous
61aac831cb Translated using Weblate (Portuguese (Brazil))
Currently translated at 94.0% (461 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-07-30 07:19:01 +02:00
Anonymous
6bdad76366 Translated using Weblate (Romanian)
Currently translated at 30.6% (150 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-07-30 07:19:00 +02:00
Anonymous
36f48cf863 Translated using Weblate (Hebrew)
Currently translated at 20.4% (100 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-07-30 07:19:00 +02:00
Anonymous
771f5493fd Translated using Weblate (Hungarian)
Currently translated at 96.1% (471 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-07-30 07:18:59 +02:00
Anonymous
84cca259a6 Translated using Weblate (Croatian)
Currently translated at 95.9% (470 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-07-30 07:18:59 +02:00
Anonymous
5a3f141f9d Translated using Weblate (Swedish)
Currently translated at 26.9% (132 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-07-30 07:18:59 +02:00
Anonymous
f5855514fa Translated using Weblate (Polish)
Currently translated at 76.3% (374 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-07-30 07:18:58 +02:00
Anonymous
76ff3d142c Translated using Weblate (Catalan)
Currently translated at 53.0% (260 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-07-30 07:18:57 +02:00
Anonymous
b5ec54b319 Translated using Weblate (Chinese (Traditional))
Currently translated at 93.8% (460 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-07-30 07:18:57 +02:00
Anonymous
4545b785f0 Translated using Weblate (Dutch)
Currently translated at 49.1% (241 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-07-30 07:18:57 +02:00
Anonymous
f66a4e4a42 Translated using Weblate (Vietnamese)
Currently translated at 8.9% (44 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-07-30 07:18:56 +02:00
Anonymous
1590029aec Translated using Weblate (Norwegian Bokmål)
Currently translated at 16.3% (80 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-07-30 07:18:56 +02:00
Anonymous
cf8efb38f7 Translated using Weblate (Italian)
Currently translated at 95.9% (470 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-07-30 07:18:55 +02:00
Anonymous
9058613b97 Translated using Weblate (Chinese (Simplified))
Currently translated at 90.6% (444 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-07-30 07:18:55 +02:00
Anonymous
fcecdd3c4a Translated using Weblate (Russian)
Currently translated at 86.9% (426 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-07-30 07:18:55 +02:00
Anonymous
7fbac755bc Translated using Weblate (Portuguese)
Currently translated at 84.6% (415 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-07-30 07:18:54 +02:00
Anonymous
99a55c85bb Translated using Weblate (French)
Currently translated at 97.7% (479 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-07-30 07:18:54 +02:00
Anonymous
19c56de8b0 Translated using Weblate (Spanish)
Currently translated at 97.7% (479 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-07-30 07:18:53 +02:00
Anonymous
59c7bcb392 Translated using Weblate (German)
Currently translated at 93.2% (457 of 490 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-07-30 07:18:53 +02:00
Hosted Weblate
556cb0f039 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/
2023-07-30 07:17:41 +02:00
liimee
9054561212 Translated using Weblate (Indonesian)
Currently translated at 4.9% (24 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/id/
2023-07-30 07:17:37 +02:00
Robert
d2c565da27 Translated using Weblate (Portuguese (Brazil))
Currently translated at 95.8% (467 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-07-30 07:17:37 +02:00
Nitzan Miranda
7e05adc02a Add Azure DevOps (#1715)
* add azure pullrequrests

* add creatorId

* rename azurePullrequests->azurePullRequests

* pass creatorId to FE

* expose userEmail to frontend

* tolower

* remove unused code

* merge to AzureDevOps

* fix userEmail

* remove whitespace in const and set true endpoint in widget

* use widget params in endpoint

* change approvedNotCompleted to Approved

* change to lower

* rename

* rename

* merge widgets together

* limit pipeline result to 1 result

* Better handle azuredevops PR call failures

* change to have repositoryId and not branchName

* Fix field filtering, avoid PR call if not needed

---------

Co-authored-by: Nitzan Miranda <Nitzan.Miranda@bagirasys.com>
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2023-07-29 22:17:30 -07:00
Dan
ac61dc5d0c Translated using Weblate (Ukrainian)
Currently translated at 100.0% (487 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-07-28 04:28:33 +02:00
gallegonovato
e9ebf67cda Translated using Weblate (Spanish)
Currently translated at 100.0% (487 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-07-28 04:28:33 +02:00
Anonymous
4d50ca21dc Translated using Weblate (Basque)
Currently translated at 6.7% (33 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eu/
2023-07-27 07:07:59 +02:00
Anonymous
4a051bdaed Translated using Weblate (Indonesian)
Currently translated at 3.0% (15 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/id/
2023-07-27 07:07:59 +02:00
Anonymous
846181eaeb Translated using Weblate (Slovenian)
Currently translated at 96.7% (471 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/
2023-07-27 07:07:58 +02:00
Anonymous
6de158897c Translated using Weblate (Greek)
Currently translated at 29.3% (143 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-07-27 07:07:58 +02:00
Anonymous
3f1fdc2426 Translated using Weblate (Korean)
Currently translated at 35.5% (173 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ko/
2023-07-27 07:07:58 +02:00
Anonymous
970842cee2 Translated using Weblate (Slovak)
Currently translated at 1.8% (9 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sk/
2023-07-27 07:07:57 +02:00
Anonymous
4203d2d45c Translated using Weblate (Thai)
Currently translated at 9.6% (47 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/th/
2023-07-27 07:07:57 +02:00
Anonymous
51c386e9b3 Translated using Weblate (Latvian)
Currently translated at 24.2% (118 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-07-27 07:07:57 +02:00
Anonymous
e39734e101 Translated using Weblate (Japanese)
Currently translated at 79.0% (385 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-07-27 07:07:56 +02:00
Anonymous
29a7336b74 Translated using Weblate (Ukrainian)
Currently translated at 98.5% (480 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-07-27 07:07:56 +02:00
Anonymous
4863bf9249 Translated using Weblate (Esperanto)
Currently translated at 29.7% (145 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-07-27 07:07:55 +02:00
Anonymous
f7ffb87e7c Translated using Weblate (Hindi)
Currently translated at 1.8% (9 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-07-27 07:07:55 +02:00
Anonymous
5b9a478a0f Translated using Weblate (Malay)
Currently translated at 51.5% (251 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-07-27 07:07:55 +02:00
Anonymous
28acc9207c Translated using Weblate (Danish)
Currently translated at 40.4% (197 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-07-27 07:07:54 +02:00
Anonymous
5aa82ae928 Translated using Weblate (Czech)
Currently translated at 91.1% (444 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-07-27 07:07:54 +02:00
Anonymous
7aa3220e50 Translated using Weblate (Arabic)
Currently translated at 53.7% (262 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-07-27 07:07:54 +02:00
Anonymous
de47fc6e7f Translated using Weblate (Serbian)
Currently translated at 1.8% (9 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-07-27 07:07:53 +02:00
Anonymous
8658d24d15 Translated using Weblate (Turkish)
Currently translated at 80.6% (393 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-07-27 07:07:53 +02:00
Anonymous
9dfc9f261b Translated using Weblate (Bulgarian)
Currently translated at 9.4% (46 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-07-27 07:07:52 +02:00
Anonymous
bd229a7f8f Translated using Weblate (Telugu)
Currently translated at 44.1% (215 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-07-27 07:07:52 +02:00
Anonymous
bb2b2de97e Translated using Weblate (Finnish)
Currently translated at 36.3% (177 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-07-27 07:07:52 +02:00
Anonymous
b94a4834c1 Translated using Weblate (Yue (Traditional))
Currently translated at 24.0% (117 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue_Hant/
2023-07-27 07:07:51 +02:00
Anonymous
078b1cbfd6 Translated using Weblate (Portuguese (Brazil))
Currently translated at 82.9% (404 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-07-27 07:07:51 +02:00
Anonymous
70aab41ffc Translated using Weblate (Romanian)
Currently translated at 30.8% (150 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-07-27 07:07:50 +02:00
Anonymous
8ebc7937c1 Translated using Weblate (Hebrew)
Currently translated at 20.5% (100 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-07-27 07:07:50 +02:00
Anonymous
f28ce55e42 Translated using Weblate (Hungarian)
Currently translated at 98.3% (479 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-07-27 07:07:49 +02:00
Anonymous
d7be22c7c8 Translated using Weblate (Croatian)
Currently translated at 96.5% (470 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-07-27 07:07:49 +02:00
Anonymous
f1e7b2b92f Translated using Weblate (Swedish)
Currently translated at 27.1% (132 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-07-27 07:07:48 +02:00
Anonymous
05ca31ecb6 Translated using Weblate (Polish)
Currently translated at 76.7% (374 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-07-27 07:07:48 +02:00
Anonymous
c379f3592e Translated using Weblate (Catalan)
Currently translated at 53.3% (260 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-07-27 07:07:48 +02:00
Anonymous
c43cec32d0 Translated using Weblate (Chinese (Traditional))
Currently translated at 94.4% (460 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-07-27 07:07:47 +02:00
Anonymous
c48d10adcb Translated using Weblate (Dutch)
Currently translated at 49.4% (241 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-07-27 07:07:47 +02:00
Anonymous
28026a7fa1 Translated using Weblate (Vietnamese)
Currently translated at 9.0% (44 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-07-27 07:07:47 +02:00
Anonymous
16daf4e97c Translated using Weblate (Norwegian Bokmål)
Currently translated at 16.4% (80 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-07-27 07:07:46 +02:00
Anonymous
374e0c215e Translated using Weblate (Italian)
Currently translated at 96.5% (470 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-07-27 07:07:46 +02:00
Anonymous
2c84b378ef Translated using Weblate (Chinese (Simplified))
Currently translated at 91.1% (444 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-07-27 07:07:45 +02:00
Anonymous
2b21d50ce2 Translated using Weblate (Russian)
Currently translated at 87.4% (426 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-07-27 07:07:45 +02:00
Anonymous
3572b53ad6 Translated using Weblate (Portuguese)
Currently translated at 85.2% (415 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-07-27 07:07:45 +02:00
Anonymous
fc39c1b45a Translated using Weblate (Spanish)
Currently translated at 98.5% (480 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-07-27 07:07:44 +02:00
Anonymous
259cb955d0 Translated using Weblate (German)
Currently translated at 93.8% (457 of 487 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-07-27 07:07:44 +02:00
fredodiable
420aa896d7 Feature: GameDig Widget (#1717)
* Adding Counter-Strike: Global Offensive (CSGO)

Adding Counter-Strike: Global Offensive (CSGO) widget

* Changed to GameDig

Converted csgo widget to gamedig
Added game server type as widget parameter
Added more fields

* Limited widget displayed fields to 4

* Moved fields limit to gamedig widget
2023-07-26 22:06:45 -07:00
shamoon
6586af17a3 Merge pull request #1729 from Mega-Volti/main
Enable custom refresh rate for resource widget
2023-07-26 21:54:41 -07:00
Mega-Volti
454d8d03c2 Add custom refresh rate setting to resources
Simplify resources refresh variable, enforce minimum

Add custom refresh rate to uptime

Add custom refresh rate to memory

Add custom refresh rate to disk

Add custom refresh rate to cputemp

Add custom refresh rate to CPU
2023-07-26 21:54:00 -07:00
Mega-Volti
1560bb7762 Support custom colors for icons (#1724)
* Add custom colors to resolvedicon.jsx

Enables appending a color code (e.g. "#123456") to all mdi and si icons, in order to change their color to a per-icon custom one.

* Streamline code for custom icon colors in resolvedicon.jsx 

Removed redundant if statement when defaulting to theme colors if no custom icon color code is provided

* Update resolvedicon.jsx

Remove unnecessary variable, restoring the fallback code in case no custom icon color is provided.

* Update resolvedicon.jsx - test for custom color suffix

Changed if condition from string.match to string.test and expanded regex to also include upper case letters.

* Update resolvedicon.jsx - DRY

Removed repetition, slimmed down if statement.

Also reverse previous commit as it did not work as intended.

* Update resolvedicon.jsx - upper case color hex codes

Update regular expression to also allow for upper case letters as part of the hex color code, as either are valid when describing an objects color.

* Refactor custom color code

---------

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2023-07-25 17:31:42 -07:00
shamoon
e23dc8f277 Merge pull request #1725 from benphelps/fix/issue-1720
Ensure spacing with custom logo
2023-07-25 12:03:27 -07:00
shamoon
115bb432ff Ensure spacing with custom logo 2023-07-25 12:02:13 -07:00
shamoon
f4fa098f6b Merge pull request #1718 from artstorm/kopia-source
Add snapshot host and path to Kopia widget
2023-07-24 09:29:12 -07:00
Johan Steen
92ed6dc1cb Add snapshot host and path to Kopia widget 2023-07-24 12:28:03 +07:00
shamoon
e265a7c645 Merge pull request #1714 from FabyoSK/patch-1
Update README.md
2023-07-23 08:05:29 -07:00
Fábio Alves
aa9b682f5f Update README.md 2023-07-23 13:58:03 -01:00
Dan
d2c1226d74 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (480 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-07-23 12:04:55 +02:00
The Re
c749c02ff5 Translated using Weblate (Hungarian)
Currently translated at 99.7% (479 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-07-23 12:04:55 +02:00
Nonoss117
a6c6b6f4c7 Translated using Weblate (French)
Currently translated at 100.0% (480 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-07-23 12:04:52 +02:00
gallegonovato
7022ae9be2 Translated using Weblate (Spanish)
Currently translated at 100.0% (480 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-07-23 12:04:52 +02:00
shamoon
e4e6bbab93 Merge pull request #1704 from rauenzi/disclosure-collapse
Improve disclosure collapse animation
2023-07-22 00:55:06 -07:00
Zack Rauen
2d1aed4252 Improve disclosure collapse animation 2023-07-22 00:50:54 -07:00
shamoon
0adf5e69e0 Merge pull request #1706 from benphelps/fix/issue-1702
Fix: error when fields specified via labels in 0.6.23
2023-07-20 23:04:16 -07:00
shamoon
f410dd302b Fixes handling of fields specified via labels 2023-07-20 23:03:15 -07:00
Anonymous
89e3857773 Translated using Weblate (Basque)
Currently translated at 6.8% (33 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eu/
2023-07-20 23:48:08 +02:00
Anonymous
376a665591 Translated using Weblate (Indonesian)
Currently translated at 3.1% (15 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/id/
2023-07-20 23:48:08 +02:00
Anonymous
f230260633 Translated using Weblate (Slovenian)
Currently translated at 98.1% (471 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/
2023-07-20 23:48:08 +02:00
Anonymous
d223687e07 Translated using Weblate (Greek)
Currently translated at 29.7% (143 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-07-20 23:48:07 +02:00
Anonymous
a8c2e6500b Translated using Weblate (Korean)
Currently translated at 36.0% (173 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ko/
2023-07-20 23:48:07 +02:00
Anonymous
5f3a657eba Translated using Weblate (Slovak)
Currently translated at 1.8% (9 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sk/
2023-07-20 23:48:06 +02:00
Anonymous
f76d3509ce Translated using Weblate (Thai)
Currently translated at 9.7% (47 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/th/
2023-07-20 23:48:06 +02:00
Anonymous
f313be4e41 Translated using Weblate (Latvian)
Currently translated at 24.5% (118 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-07-20 23:48:05 +02:00
Anonymous
38235a05fb Translated using Weblate (Japanese)
Currently translated at 80.2% (385 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-07-20 23:48:05 +02:00
Anonymous
b49d9ca409 Translated using Weblate (Ukrainian)
Currently translated at 98.3% (472 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-07-20 23:48:05 +02:00
Anonymous
80432b88b1 Translated using Weblate (Esperanto)
Currently translated at 30.2% (145 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-07-20 23:48:04 +02:00
Anonymous
54ad99d83f Translated using Weblate (Hindi)
Currently translated at 1.8% (9 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-07-20 23:48:04 +02:00
Anonymous
687f992b56 Translated using Weblate (Malay)
Currently translated at 52.2% (251 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-07-20 23:48:03 +02:00
Anonymous
b880b3496b Translated using Weblate (Danish)
Currently translated at 41.0% (197 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-07-20 23:48:03 +02:00
Anonymous
9879b3e272 Translated using Weblate (Czech)
Currently translated at 92.5% (444 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-07-20 23:48:03 +02:00
Anonymous
308d1e16c6 Translated using Weblate (Arabic)
Currently translated at 54.5% (262 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-07-20 23:48:02 +02:00
Anonymous
a898be0bd7 Translated using Weblate (Serbian)
Currently translated at 1.8% (9 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-07-20 23:48:02 +02:00
Anonymous
095acc098e Translated using Weblate (Turkish)
Currently translated at 81.8% (393 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-07-20 23:48:02 +02:00
Anonymous
feaf1ed503 Translated using Weblate (Bulgarian)
Currently translated at 9.5% (46 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-07-20 23:48:01 +02:00
Anonymous
ab03d4b1ec Translated using Weblate (Telugu)
Currently translated at 44.7% (215 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-07-20 23:48:01 +02:00
Anonymous
8633db187f Translated using Weblate (Finnish)
Currently translated at 36.8% (177 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-07-20 23:48:00 +02:00
Anonymous
9952123468 Translated using Weblate (Yue (Traditional))
Currently translated at 24.3% (117 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue_Hant/
2023-07-20 23:48:00 +02:00
Anonymous
d1fc7a0e07 Translated using Weblate (Portuguese (Brazil))
Currently translated at 84.1% (404 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-07-20 23:48:00 +02:00
Anonymous
b03a0103e8 Translated using Weblate (Romanian)
Currently translated at 31.2% (150 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-07-20 23:47:59 +02:00
Anonymous
d0f5d0bbb0 Translated using Weblate (Hebrew)
Currently translated at 20.8% (100 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-07-20 23:47:59 +02:00
Anonymous
972a9ab395 Translated using Weblate (Hungarian)
Currently translated at 25.0% (120 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-07-20 23:47:58 +02:00
Anonymous
b9f144f576 Translated using Weblate (Croatian)
Currently translated at 97.9% (470 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-07-20 23:47:58 +02:00
Anonymous
b98131cdac Translated using Weblate (Swedish)
Currently translated at 27.5% (132 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-07-20 23:47:58 +02:00
Anonymous
b404337e1f Translated using Weblate (Polish)
Currently translated at 77.9% (374 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-07-20 23:47:57 +02:00
Anonymous
7ff8ba7c6a Translated using Weblate (Catalan)
Currently translated at 54.1% (260 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-07-20 23:47:57 +02:00
Anonymous
027b85997b Translated using Weblate (Chinese (Traditional))
Currently translated at 95.8% (460 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-07-20 23:47:57 +02:00
Anonymous
b5c1b54168 Translated using Weblate (Dutch)
Currently translated at 50.2% (241 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-07-20 23:47:56 +02:00
Anonymous
d6201a670b Translated using Weblate (Vietnamese)
Currently translated at 9.1% (44 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-07-20 23:47:55 +02:00
Anonymous
f412b988b6 Translated using Weblate (Norwegian Bokmål)
Currently translated at 16.6% (80 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-07-20 23:47:55 +02:00
Anonymous
b9f468bcd9 Translated using Weblate (Italian)
Currently translated at 97.9% (470 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-07-20 23:47:55 +02:00
Anonymous
8386dc2774 Translated using Weblate (Chinese (Simplified))
Currently translated at 92.5% (444 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-07-20 23:47:54 +02:00
Anonymous
492e8fa5fd Translated using Weblate (Russian)
Currently translated at 88.7% (426 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-07-20 23:47:54 +02:00
Anonymous
3b0cd4c3d6 Translated using Weblate (Portuguese)
Currently translated at 86.4% (415 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-07-20 23:47:54 +02:00
Anonymous
8571209026 Translated using Weblate (French)
Currently translated at 98.3% (472 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-07-20 23:47:53 +02:00
Anonymous
0a2dd3f740 Translated using Weblate (Spanish)
Currently translated at 98.3% (472 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-07-20 23:47:53 +02:00
Anonymous
b957f57dc5 Translated using Weblate (German)
Currently translated at 95.2% (457 of 480 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-07-20 23:47:52 +02:00
shamoon
460c67be77 Merge pull request #1701 from Nizzan943/feat/add-azure-pipelines
Adding Azure Pipelines
2023-07-20 14:46:48 -07:00
Nitzan Miranda
04cccfdd60 Adds azure pipelines widget
Add translation for result and status
remove buildId value translation
Fixes syntax in azure pipelines
hide running status if finished
2023-07-20 14:45:10 -07:00
shamoon
179512672a Merge pull request #1705 from benphelps/fix/issue-1703
Fix: Handle cpu sensors without `warning` property
2023-07-20 14:41:12 -07:00
shamoon
60fa4205d3 Handle sensors without warning property 2023-07-20 14:40:27 -07:00
Milo Ivir
dfa9e3b8fa Translated using Weblate (Croatian)
Currently translated at 99.5% (470 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-07-20 22:06:57 +02:00
shamoon
6e581913ea Merge pull request #1676 from markwalet/improve-proxmox
Improve proxmox
2023-07-20 06:12:40 -07:00
shamoon
77ac06993b Merge pull request #1699 from benphelps/fix/errors-in-1603
Fix more errors from PR #1603
2023-07-19 23:44:46 -07:00
shamoon
08ac9fe7c9 Fix glances widget key warnings 2023-07-19 23:43:23 -07:00
shamoon
6ceaf3686c Fix weather icon DOM warnings 2023-07-19 23:43:23 -07:00
shamoon
82c54f197d Merge pull request #1698 from benphelps/fix/issue-1697
Fixes oversized logo in 0.6.22
2023-07-19 22:58:58 -07:00
shamoon
597a8d8b9a Fixes oversized logo 2023-07-19 22:56:11 -07:00
Mark Walet
43b5263f41 Improve proxmox widget 2023-07-13 18:39:11 +02:00
99 changed files with 4005 additions and 582 deletions

View File

@@ -141,7 +141,7 @@ pnpm dev
Open [http://localhost:3000](http://localhost:3000) to start.
This is a [Next.js](https://nextjs.org/) application, see their doucmentation for more information:
This is a [Next.js](https://nextjs.org/) application, see their documentation for more information:
## Contributors

View File

@@ -16,6 +16,7 @@
"compare-versions": "^5.0.1",
"dockerode": "^3.3.4",
"follow-redirects": "^1.15.2",
"gamedig": "^4.0.6",
"i18next": "^21.9.2",
"js-yaml": "^4.1.0",
"json-rpc-2.0": "^1.4.1",
@@ -29,10 +30,12 @@
"react-dom": "^18.2.0",
"react-i18next": "^11.18.6",
"react-icons": "^4.4.0",
"recharts": "^2.7.2",
"shvl": "^3.0.0",
"swr": "^1.3.0",
"systeminformation": "^5.17.12",
"tough-cookie": "^4.1.2",
"urbackup-server-api": "^0.8.9",
"winston": "^3.8.2",
"xml-js": "^1.6.11"
},

680
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -310,7 +310,13 @@
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
"used": "Used",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"quicklaunch": {
"bookmark": "مفضلة",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -248,7 +248,13 @@
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
"used": "Used",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"changedetectionio": {
"totalObserved": "Total Observed",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -248,7 +248,13 @@
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
"used": "Used",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"changedetectionio": {
"totalObserved": "Total d'observats",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"totalUsed": "Used Storage",
"noRecent": "Out of Date"
}
}

View File

@@ -322,7 +322,13 @@
"free": "Free",
"used": "Used",
"load": "Load",
"warn": "Warn"
"warn": "Warn",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"quicklaunch": {
"bookmark": "Záložka",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"map": "Map",
"currentPlayers": "Current players",
"name": "Name",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -79,7 +79,13 @@
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
"used": "Used",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"wmo": {
"1-day": "Hovedsageligt solrigt",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -248,7 +248,13 @@
"warn": "Warnung",
"total": "Gesamt",
"free": "Frei",
"used": "Verwendet"
"used": "Verwendet",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap",
"crit": "Crit",
"read": "Read"
},
"changedetectionio": {
"totalObserved": "Gesamt beobachtet",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"bots": "Bots",
"ping": "Ping",
"maxPlayers": "Max players"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved",
"inProgress": "In Progress"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -369,7 +369,13 @@
"total": "Total",
"free": "Free",
"used": "Used",
"load": "Load"
"load": "Load",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"quicklaunch": {
"bookmark": "Bookmark",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"myPrs": "My PRs",
"approved": "Approved",
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -371,7 +371,13 @@
"free": "Free",
"used": "Used",
"days": "d",
"hours": "h"
"hours": "h",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"quicklaunch": {
"bookmark": "Bookmark",
@@ -664,5 +670,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"urbackup": {
"ok" : "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -266,7 +266,13 @@
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
"used": "Used",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"quicklaunch": {
"bookmark": "Bookmark",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -248,7 +248,13 @@
"warn": "Advertir",
"total": "Total",
"free": "Libre",
"used": "Utilizado"
"used": "Utilizado",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"changedetectionio": {
"totalObserved": "Total Observados",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Serie",
"totalFiles": "Archivos"
},
"gamedig": {
"name": "Nombre",
"map": "Mapa",
"currentPlayers": "Jugadores actuales",
"players": "Jugadores",
"maxPlayers": "Jugadores máximos",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Resultado",
"status": "Estado",
"buildId": "Identificador de la construcción",
"succeeded": "Exitoso",
"notStarted": "Sin empezar",
"failed": "Fallido",
"canceled": "Cancelado",
"inProgress": "En curso",
"totalPrs": "RP totales",
"myPrs": "Mis logros",
"approved": "Aprobados"
},
"urbackup": {
"ok": "De acuerdo",
"errored": "Errores",
"noRecent": "Caducado",
"totalUsed": "Almacenamiento usado"
}
}

View File

@@ -431,7 +431,13 @@
"free": "Free",
"used": "Used",
"days": "d",
"hours": "h"
"hours": "h",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"quicklaunch": {
"bookmark": "Bookmark",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"currentPlayers": "Current players",
"name": "Name",
"map": "Map",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"notStarted": "Not Started",
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -248,7 +248,13 @@
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
"used": "Used",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"changedetectionio": {
"totalObserved": "Total Observed",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -248,7 +248,13 @@
"warn": "Alerte",
"total": "Total",
"free": "Libre",
"used": "Utilisé"
"used": "Utilisé",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"changedetectionio": {
"totalObserved": "Total Observé",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Séries",
"totalFiles": "Fichiers"
},
"gamedig": {
"name": "Nom",
"map": "Carte",
"currentPlayers": "Joueurs actuels",
"players": "Joueurs",
"maxPlayers": "Joueurs max",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Résultat",
"status": "Statut",
"buildId": "Build ID",
"succeeded": "Réussi",
"notStarted": "Arrêté",
"failed": "Échoué",
"canceled": "Annulé",
"inProgress": "En cours",
"totalPrs": "PRs Total",
"myPrs": "Mes PRs",
"approved": "Approuvé"
},
"urbackup": {
"ok": "Ok",
"errored": "Erreurs",
"noRecent": "Obsolète",
"totalUsed": "Esp. Utilisé"
}
}

View File

@@ -248,7 +248,13 @@
"load": "Load",
"total": "Total",
"free": "Free",
"used": "Used"
"used": "Used",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"changedetectionio": {
"totalObserved": "Total Observed",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"myPrs": "My PRs",
"totalPrs": "Total PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -256,7 +256,13 @@
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
"used": "Used",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"quicklaunch": {
"bookmark": "Bookmark",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"myPrs": "My PRs",
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -105,7 +105,7 @@
"transcoding": "Prekodiranje",
"bitrate": "Stopa bitova",
"no_active": "Nema aktivnih prijenosa",
"plex_connection_error": "Check Plex Connection"
"plex_connection_error": "Provjeri Plex vezu"
},
"nzbget": {
"rate": "Stopa",
@@ -248,7 +248,13 @@
"load": "Opterećenje",
"warn": "Upozori",
"total": "Ukupno",
"free": "Slobodno"
"free": "Slobodno",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"changedetectionio": {
"totalObserved": "Ukupno promatrano",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Serije",
"totalFiles": "Datoteke"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"noRecent": "Out of Date",
"totalUsed": "Used Storage",
"ok": "Ok",
"errored": "Errors"
}
}

View File

@@ -4,15 +4,15 @@
"free": "Szabad",
"used": "Használt",
"load": "Terhelés",
"cpu": "CPU",
"cpu": "Processzor",
"mem": "MEM",
"temp": "TEMP",
"max": "Max",
"uptime": "UP",
"months": "mo",
"days": "d",
"hours": "h",
"minutes": "m"
"uptime": "FUT",
"months": "",
"days": "n",
"hours": "ó",
"minutes": "p"
},
"docker": {
"rx": "RX",
@@ -20,20 +20,20 @@
"mem": "MEM",
"cpu": "CPU",
"offline": "Offline",
"error": "Error",
"unknown": "Unknown",
"unhealthy": "Unhealthy",
"running": "Running",
"starting": "Starting",
"not_found": "Not Found",
"exited": "Exited",
"partial": "Partial",
"healthy": "Healthy"
"error": "Hiba",
"unknown": "Ismeretlen",
"unhealthy": "Egészségtelen",
"running": "Futó",
"starting": "Indul",
"not_found": "Nem található",
"exited": "Kilépett",
"partial": "Részleges",
"healthy": "Egészséges"
},
"lidarr": {
"wanted": "Keresett",
"queued": "Sorban áll",
"artists": "Artists"
"artists": "Előadók"
},
"readarr": {
"wanted": "Keresett",
@@ -48,16 +48,16 @@
"missing_type": "Hiányzó Widget Típus: {{type}}",
"api_error": "API Hiba",
"status": "Státusz",
"information": "Information",
"information": "Információ",
"url": "URL",
"raw_error": "Raw Error",
"response_data": "Response Data"
"raw_error": "Nyers hiba",
"response_data": "Válaszadatok"
},
"weather": {
"current": "Aktuális hely",
"allow": "Kattints az engedélyezéshez",
"updating": "Frissítés",
"wait": "Kérlek várj"
"wait": "Kérk várjon"
},
"search": {
"placeholder": "Keresés…"
@@ -77,7 +77,7 @@
"transcoding": "Átkódolás",
"bitrate": "Bitráta",
"no_active": "Nincs aktív lejátszás",
"plex_connection_error": "Check Plex Connection"
"plex_connection_error": "Plex kapcsolat ellenőrzése"
},
"nzbget": {
"rate": "Ráta",
@@ -110,16 +110,16 @@
"wanted": "Keresett",
"queued": "Sorban áll",
"series": "Sorozat",
"queue": "Queue",
"unknown": "Unknown"
"queue": "Várólista",
"unknown": "Ismeretlen"
},
"radarr": {
"wanted": "Keresett",
"queued": "Sorban áll",
"movies": "Filmek",
"missing": "Missing",
"queue": "Queue",
"unknown": "Unknown"
"missing": "Hiányzik",
"queue": "Várólista",
"unknown": "Ismeretlen"
},
"ombi": {
"pending": "Függőben",
@@ -135,13 +135,13 @@
"pending": "Függőben",
"approved": "Engedélyezett",
"available": "Elérhető",
"processing": "Processing"
"processing": "Feldolgozás"
},
"pihole": {
"queries": "Lekérdezések",
"blocked": "Blokkolt",
"gravity": "Gravitáció",
"blocked_percent": "Blocked %"
"blocked_percent": "Blokkolt %"
},
"adguard": {
"queries": "Lekérdezések",
@@ -193,184 +193,190 @@
"errored": "Hibás"
},
"mastodon": {
"user_count": "Users",
"status_count": "Posts",
"domain_count": "Domains"
"user_count": "Felhasználók",
"status_count": "Posztok",
"domain_count": "Domainek"
},
"strelaysrv": {
"numActiveSessions": "Sessions",
"numConnections": "Connections",
"dataRelayed": "Relayed",
"transferRate": "Rate"
"numActiveSessions": "Munkamenetek",
"numConnections": "Csatlakozások",
"dataRelayed": "Átirányított",
"transferRate": "Ráta"
},
"authentik": {
"users": "Users",
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)"
"users": "Felhasználók",
"loginsLast24H": "Bejelentkezések (24 óra)",
"failedLoginsLast24H": "Sikertelen bejelentkezések (24h)"
},
"proxmox": {
"mem": "MEM",
"cpu": "CPU",
"mem": "RAM",
"cpu": "Processzor",
"lxc": "LXC",
"vms": "VMs"
"vms": "VM-ek"
},
"unifi": {
"users": "Users",
"uptime": "System Uptime",
"days": "Days",
"users": "Felhasználók",
"uptime": "Rendszer üzemidő",
"days": "Napok",
"wan": "WAN",
"lan_users": "LAN Users",
"wlan_users": "WLAN Users",
"up": "UP",
"down": "DOWN",
"wait": "Please wait",
"lan_users": "LAN Felhasználók",
"wlan_users": "WLAN Felhasználók",
"up": "FUT",
"down": "ÁLL",
"wait": "Kérjük várjon",
"lan": "LAN",
"wlan": "WLAN",
"devices": "Devices",
"lan_devices": "LAN Devices",
"wlan_devices": "WLAN Devices",
"empty_data": "Subsystem status unknown"
"devices": "Eszközök",
"lan_devices": "LAN Eszközök",
"wlan_devices": "WLAN Eszközök",
"empty_data": "Az alrendszer állapota ismeretlen"
},
"plex": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows",
"albums": "Albums"
"streams": "Aktív Stream-ek",
"movies": "Filmek",
"tv": "TV műsorok",
"albums": "Albumok"
},
"glances": {
"cpu": "CPU",
"wait": "Please wait",
"temp": "TEMP",
"uptime": "UP",
"days": "d",
"hours": "h",
"load": "Load",
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
"cpu": "Processzor",
"wait": "Kérjük várjon",
"temp": "HŐMÉRSÉKLET",
"uptime": "FUT",
"days": "n",
"hours": "ó",
"load": "Kapacitáskihasználás",
"warn": "Figyelmeztet",
"total": "Összes",
"free": "Szabad",
"used": "Felhasznált",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"changedetectionio": {
"totalObserved": "Total Observed",
"diffsDetected": "Diffs Detected"
"totalObserved": "Összes Megfigyelt",
"diffsDetected": "Észlelt különbségek"
},
"wmo": {
"0-day": "Napos",
"0-night": "Derült",
"3-day": "Cloudy",
"3-night": "Cloudy",
"45-day": "Foggy",
"53-day": "Drizzle",
"56-night": "Light Freezing Drizzle",
"57-day": "Freezing Drizzle",
"3-day": "Felhős",
"3-night": "Felhős",
"45-day": "Ködös",
"53-day": "Szitálás",
"56-night": "Enyhe fagyos szitálás",
"57-day": "Fagyos szitálás",
"1-day": "Többnyire napos",
"1-night": "Többnyire derült",
"2-day": "Partly Cloudy",
"2-night": "Partly Cloudy",
"45-night": "Foggy",
"48-day": "Foggy",
"48-night": "Foggy",
"51-day": "Light Drizzle",
"51-night": "Light Drizzle",
"57-night": "Freezing Drizzle",
"61-day": "Light Rain",
"61-night": "Light Rain",
"53-night": "Drizzle",
"55-day": "Heavy Drizzle",
"55-night": "Heavy Drizzle",
"56-day": "Light Freezing Drizzle",
"63-day": "Rain",
"63-night": "Rain",
"65-day": "Heavy Rain",
"65-night": "Heavy Rain",
"66-day": "Freezing Rain",
"66-night": "Freezing Rain",
"67-day": "Freezing Rain",
"67-night": "Freezing Rain",
"71-day": "Light Snow",
"71-night": "Light Snow",
"73-day": "Snow",
"73-night": "Snow",
"75-day": "Heavy Snow",
"75-night": "Heavy Snow",
"77-day": "Snow Grains",
"77-night": "Snow Grains",
"80-day": "Light Showers",
"80-night": "Light Showers",
"81-day": "Showers",
"81-night": "Showers",
"82-day": "Heavy Showers",
"82-night": "Heavy Showers",
"85-day": "Snow Showers",
"85-night": "Snow Showers",
"86-day": "Snow Showers",
"86-night": "Snow Showers",
"95-day": "Thunderstorm",
"95-night": "Thunderstorm",
"96-day": "Thunderstorm With Hail",
"96-night": "Thunderstorm With Hail",
"99-day": "Thunderstorm With Hail",
"99-night": "Thunderstorm With Hail"
"2-day": "Részben felhős",
"2-night": "Részben felhős",
"45-night": "Ködös",
"48-day": "Ködös",
"48-night": "Ködös",
"51-day": "Enyhe szitálás",
"51-night": "Enyhe szitálás",
"57-night": "Fagyos szitálás",
"61-day": "Enyhe eső",
"61-night": "Enyhe eső",
"53-night": "Szitálás",
"55-day": "Erős szitálás",
"55-night": "Erős szitálás",
"56-day": "Enyhe fagyos szitálás",
"63-day": "Eső",
"63-night": "Eső",
"65-day": "Heves eső",
"65-night": "Heves eső",
"66-day": "Ónos eső",
"66-night": "Ónos eső",
"67-day": "Ónos eső",
"67-night": "Ónos eső",
"71-day": "Enyhe havazás",
"71-night": "Enyhe havazás",
"73-day": "",
"73-night": "",
"75-day": "Erős havazás",
"75-night": "Erős havazás",
"77-day": "Hódara",
"77-night": "Hódara",
"80-day": "Enyhe záporok",
"80-night": "Enyhe záporok",
"81-day": "Záporok",
"81-night": "Záporok",
"82-day": "Heves záporok",
"82-night": "Heves záporok",
"85-day": "Hózáporok",
"85-night": "Hózáporok",
"86-day": "Hózáporok",
"86-night": "Hózáporok",
"95-day": "Zivatar",
"95-night": "Zivatar",
"96-day": "Zivatar jégesővel",
"96-night": "Zivatar jégesővel",
"99-day": "Zivatar jégesővel",
"99-night": "Zivatar jégesővel"
},
"quicklaunch": {
"bookmark": "Bookmark",
"service": "Service",
"search": "Search",
"custom": "Custom",
"visit": "Visit",
"bookmark": "Könyvjelző",
"service": "Szolgáltatás",
"search": "Keresés",
"custom": "Egyedi",
"visit": "Megnéz",
"url": "URL"
},
"homebridge": {
"available_update": "System",
"updates": "Updates",
"update_available": "Update Available",
"up_to_date": "Up to Date",
"child_bridges": "Child Bridges",
"available_update": "Rendszer",
"updates": "Frissítések",
"update_available": "Elérhető Frissítés",
"up_to_date": "Naprakész",
"child_bridges": "Gyerek Hidak",
"child_bridges_status": "{{ok}}/{{total}}",
"up": "Up",
"pending": "Pending",
"down": "Down"
"up": "Fut",
"pending": "Függőben",
"down": "Áll"
},
"autobrr": {
"approvedPushes": "Approved",
"rejectedPushes": "Rejected",
"filters": "Filters",
"indexers": "Indexers"
"approvedPushes": "Jóváhagyott",
"rejectedPushes": "Elutasított",
"filters": "Szűrők",
"indexers": "Indexelők"
},
"watchtower": {
"containers_scanned": "Scanned",
"containers_updated": "Updated",
"containers_failed": "Failed"
"containers_scanned": "Beolvasott",
"containers_updated": "Frissített",
"containers_failed": "Sikertelen"
},
"tubearchivist": {
"downloads": "Queue",
"videos": "Videos",
"channels": "Channels",
"playlists": "Playlists"
"downloads": "Várólista",
"videos": "Videók",
"channels": "Csatornák",
"playlists": "Lejátszási listák"
},
"truenas": {
"load": "System Load",
"uptime": "Uptime",
"alerts": "Alerts",
"load": "Rendszerterheltség",
"uptime": "Üzemidő",
"alerts": "Riasztások",
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
},
"navidrome": {
"nothing_streaming": "No Active Streams",
"please_wait": "Please Wait"
"nothing_streaming": "Nincsenek Aktív Stream-ek",
"please_wait": "Kérjük Várjon"
},
"pyload": {
"speed": "Speed",
"active": "Active",
"queue": "Queue",
"total": "Total"
"speed": "Sebesség",
"active": "Aktív",
"queue": "Várólista",
"total": "Összes"
},
"gluetun": {
"public_ip": "Public IP",
"region": "Region",
"country": "Country"
"public_ip": "Nyilvános IP-cím",
"region": "Régió",
"country": "Ország"
},
"hdhomerun": {
"channels": "Channels",
"channels": "Csatornák",
"hd": "HD"
},
"ping": {
@@ -378,197 +384,197 @@
"ping": "Ping"
},
"scrutiny": {
"passed": "Passed",
"failed": "Failed",
"unknown": "Unknown"
"passed": "Megfelelt",
"failed": "Sikertelen",
"unknown": "Ismeretlen"
},
"paperlessngx": {
"inbox": "Inbox",
"total": "Total"
"inbox": "Beérkezett",
"total": "Összes"
},
"deluge": {
"download": "Download",
"download": "Letöltés",
"seed": "Seed",
"upload": "Upload",
"upload": "Feltöltés",
"leech": "Leech"
},
"flood": {
"download": "Download",
"upload": "Upload",
"download": "Letöltés",
"upload": "Feltöltés",
"leech": "Leech",
"seed": "Seed"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
"queue": "Várólista",
"processed": "Feldolgozott",
"errored": "Hibás",
"saved": "Mentett"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
"read": "Olvasott",
"unread": "Olvasatlan"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
"wait": "Kérjük Várjon",
"no_devices": "Nincs fogadott eszközadat"
},
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedAp": "Connected APs",
"connectedGateway": "Connected gateways",
"connectedSwitches": "Connected switches"
"activeUser": "Aktív eszközök",
"alerts": "Riasztások",
"connectedAp": "Csatlakoztatott AP-k",
"connectedGateway": "Csatlakoztatott gateway-ek",
"connectedSwitches": "Csatlakoztatott switch-ek"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"download": "Letöltés",
"upload": "Feltöltés",
"leech": "Leech",
"seed": "Seed"
},
"mikrotik": {
"cpuLoad": "CPU Load",
"memoryUsed": "Memory Used",
"uptime": "Uptime",
"numberOfLeases": "Leases"
"cpuLoad": "Processzor Terhelés",
"memoryUsed": "Felhasznált Memória",
"uptime": "Üzemidő",
"numberOfLeases": "Bérletek"
},
"xteve": {
"streams_all": "All Streams",
"streams_active": "Active Streams",
"streams_xepg": "XEPG Channels"
"streams_all": "Minden Stream",
"streams_active": "Aktív Stream-ek",
"streams_xepg": "XEPG Csatornák"
},
"opnsense": {
"cpu": "CPU Load",
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
"cpu": "Processzor Terhelés",
"memory": "Aktív Memória",
"wanUpload": "WAN Feltöltés",
"wanDownload": "WAN Letöltés"
},
"moonraker": {
"layers": "Layers",
"printer_state": "Printer State",
"print_status": "Print Status",
"print_progress": "Progress"
"layers": "Rétegek",
"printer_state": "Nyomtató Állapota",
"print_status": "Nyomtatás Állapota",
"print_progress": "Folyamat"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
"wanted": "Keresett",
"queued": "Sorba állítva",
"series": "Sorozatok"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
"printer_state": "Állapot",
"temp_tool": "Szerszám hőmérséklet",
"temp_bed": "Ágy Hőmérséklet",
"job_completion": "Teljesítés"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
"origin_ip": "Eredeti IP",
"status": "Állapot"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
"datastore_usage": "Adattár",
"failed_tasks_24h": "Sikertelen feladatok 24h",
"cpu_usage": "Processzor",
"memory_usage": "Memória"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
"users": "Felhasználók",
"photos": "Fényképek",
"videos": "Videók",
"storage": "Tárhely"
},
"uptimekuma": {
"up": "Sites Up",
"down": "Sites Down",
"uptime": "Uptime",
"incident": "Incident",
"m": "m"
"up": "Futó Webhelyek",
"down": "Nem Elérhető Webhelyek",
"uptime": "Üzemidő",
"incident": "Incidens",
"m": "perc"
},
"komga": {
"libraries": "Libraries",
"series": "Series",
"books": "Books"
"libraries": "Könyvtárak",
"series": "Sorozatok",
"books": "Könyvek"
},
"mylar": {
"series": "Series",
"issues": "Issues",
"wanted": "Wanted"
"series": "Sorozatok",
"issues": "Problémák",
"wanted": "Keresett"
},
"photoprism": {
"albums": "Albums",
"photos": "Photos",
"videos": "Videos",
"people": "People"
"albums": "Albumok",
"photos": "Fényképek",
"videos": "Videók",
"people": "Emberek"
},
"diskstation": {
"days": "Days",
"uptime": "Uptime",
"volumeAvailable": "Available"
"days": "Napok",
"uptime": "Üzemidő",
"volumeAvailable": "Elérhető"
},
"fileflows": {
"queue": "Queue",
"processing": "Processing",
"processed": "Processed",
"time": "Time"
"queue": "Várólista",
"processing": "Feldolgozás",
"processed": "Feldolgozott",
"time": "Idő"
},
"grafana": {
"dashboards": "Dashboards",
"datasources": "Data Sources",
"totalalerts": "Total Alerts",
"alertstriggered": "Alerts Triggered"
"dashboards": "Műszerfalak",
"datasources": "Adatforrások",
"totalalerts": "Összes Riasztás",
"alertstriggered": "Aktivált riasztások"
},
"nextcloud": {
"cpuload": "Cpu Load",
"memoryusage": "Memory Usage",
"freespace": "Free Space",
"activeusers": "Active Users",
"numfiles": "Files",
"numshares": "Shared Items"
"cpuload": "Processzor Terhelés",
"memoryusage": "Memória Használat",
"freespace": "Szabad hely",
"activeusers": "Aktív Felhasználók",
"numfiles": "Fájlok",
"numshares": "Megosztott Elemek"
},
"kopia": {
"status": "Status",
"size": "Size",
"lastrun": "Last Run",
"nextrun": "Next Run",
"failed": "Failed"
"status": "Állapot",
"size": "Méret",
"lastrun": "Legutóbbi futtatás",
"nextrun": "Következő Futtatás",
"failed": "Sikertelen"
},
"unmanic": {
"active_workers": "Active Workers",
"total_workers": "Total Workers",
"records_total": "Queue Length"
"active_workers": "Aktív Dolgozók",
"total_workers": "Összes Dolgozó",
"records_total": "Várólista Hossza"
},
"healthchecks": {
"new": "New",
"new": "Új",
"up": "Online",
"grace": "In Grace Period",
"grace": "Türelmi idő alatt",
"down": "Offline",
"paused": "Paused",
"status": "Status",
"last_ping": "Last Ping",
"never": "No pings yet"
"paused": "Szünetel",
"status": "Állapot",
"last_ping": "Legutóbbi Ping",
"never": "Még nincsenek ping-ek"
},
"pterodactyl": {
"servers": "Servers",
"nodes": "Nodes"
"servers": "Szerverek",
"nodes": "Node-ok"
},
"prometheus": {
"targets_up": "Targets Up",
"targets_down": "Targets Down",
"targets_total": "Total Targets"
"targets_up": "Célpontok Futnak",
"targets_down": "Célpontok Állnak",
"targets_total": "Összes Célpont"
},
"minecraft": {
"players": "Players",
"version": "Version",
"status": "Status",
"players": "Lejátszók",
"version": "Verzió",
"status": "Állapot",
"up": "Online",
"down": "Offline"
},
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "One year",
"gross_percent_max": "All time"
"gross_percent_today": "Ma",
"gross_percent_1y": "Egy év",
"gross_percent_max": "Mindig"
},
"audiobookshelf": {
"podcasts": "Podcast",
@@ -577,83 +583,111 @@
"booksDuration": "Időtartam"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
"people_home": "Emberek otthon",
"lights_on": "Fények bekapcsolva",
"switches_on": "Kapcsolók felkapcsolva"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
"subscriptions": "Előfizetések",
"unread": "Olvasatlan"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
"shows": "Műsorok",
"recordings": "Felvételek",
"scheduled": "Ütemezett",
"passes": "Engedélyek"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
"monitoring": "Nyomonkövetés",
"updates": "Frissítések"
},
"tailscale": {
"address": "Address",
"expires": "Expires",
"never": "Never",
"last_seen": "Last Seen",
"now": "Now",
"address": "Cím",
"expires": "Lejár",
"never": "Soha",
"last_seen": "Utoljára látott",
"now": "Most",
"years": "{{number}}y",
"weeks": "{{number}}w",
"days": "{{number}}d",
"minutes": "{{number}}m",
"seconds": "{{number}}s",
"ago": "{{value}} Ago",
"ago": "{{value}} Ezelőtt",
"hours": "{{number}}h"
},
"qnap": {
"cpuUsage": "CPU Usage",
"memUsage": "MEM Usage",
"systemTempC": "System Temp",
"poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
"cpuUsage": "Processzor Használat",
"memUsage": "Memória Használat",
"systemTempC": "Rendszerhőmérséklet",
"poolUsage": "Pool Használat",
"volumeUsage": "Kötet Használat",
"invalid": "Érvénytelen"
},
"pfsense": {
"load": "Load Avg",
"memory": "Mem Usage",
"wanStatus": "WAN Status",
"up": "Up",
"down": "Down",
"temp": "Temp",
"disk": "Disk Usage",
"load": "Átlagos terhelés",
"memory": "RAM Használat",
"wanStatus": "WAN Állapot",
"up": "Fut",
"down": "Áll",
"temp": "Hőmérséklet",
"disk": "Lemezhasználat",
"wanIP": "WAN IP"
},
"caddy": {
"upstreams": "Upstreams",
"requests": "Current requests",
"requests_failed": "Failed requests"
"upstreams": "Upstreamek",
"requests": "Jelenlegi kérelmek",
"requests_failed": "Sikertelen kérelmek"
},
"evcc": {
"pv_power": "Production",
"battery_soc": "Battery",
"grid_power": "Grid",
"home_power": "Consumption",
"charge_power": "Charger",
"pv_power": "Termelés",
"battery_soc": "Akkumulátor",
"grid_power": "Rács",
"home_power": "Fogyasztás",
"charge_power": "Töltő",
"watt_hour": "Wh"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
"total": "Összes",
"connected": "Csatlakoztatott",
"new_devices": "Új Eszközök",
"down_alerts": "Leállási Figyelmeztetések"
},
"jdownloader": {
"downloadSpeed": "Download Speed",
"downloadCount": "Queue Count",
"downloadTotalBytes": "Size",
"downloadBytesRemaining": "Remaining"
"downloadSpeed": "Sebesség",
"downloadCount": "Összes függőben lévő",
"downloadTotalBytes": "Méret",
"downloadBytesRemaining": "Fennmaradó"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
"seriesCount": "Sorozatok",
"totalFiles": "Fájlok"
},
"gamedig": {
"ping": "Ping",
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots"
},
"azuredevops": {
"status": "Status",
"myPrs": "My PRs",
"approved": "Approved",
"result": "Result",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -222,7 +222,13 @@
"wait": "Please wait",
"used": "Used",
"days": "d",
"hours": "h"
"hours": "h",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"quicklaunch": {
"bookmark": "Bookmark",
@@ -494,9 +500,9 @@
},
"weather": {
"wait": "Harap tunggu",
"current": "Current Location",
"allow": "Click to allow",
"updating": "Updating"
"current": "Lokasi Saat Ini",
"allow": "Klik untuk mengizinkan",
"updating": "Memperbarui"
},
"search": {
"placeholder": "Telusuri…"
@@ -590,11 +596,11 @@
"cpu": "CPU",
"mem": "MEM",
"total": "Total",
"free": "Free",
"used": "Used",
"free": "Luang",
"used": "Digunakan",
"load": "Load",
"temp": "TEMP",
"max": "Max",
"max": "Maks",
"uptime": "UP",
"months": "mo",
"hours": "h",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -248,7 +248,13 @@
"warn": "Avviso",
"total": "Totale",
"free": "Libero",
"used": "Usato"
"used": "Usato",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"changedetectionio": {
"totalObserved": "Totale Osservato",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Serie",
"totalFiles": "File"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"myPrs": "My PRs",
"approved": "Approved",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -25,7 +25,13 @@
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
"used": "Used",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"autobrr": {
"filters": "フィルター",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -315,7 +315,13 @@
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
"used": "Used",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"quicklaunch": {
"bookmark": "Bookmark",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"ping": "Ping",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -304,7 +304,13 @@
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
"used": "Used",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"quicklaunch": {
"bookmark": "Bookmark",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -75,7 +75,13 @@
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
"used": "Used",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"quicklaunch": {
"bookmark": "Tandabuku",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -248,7 +248,13 @@
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
"used": "Used",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"changedetectionio": {
"totalObserved": "Total Observed",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Filer"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -248,7 +248,13 @@
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
"used": "Used",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"changedetectionio": {
"totalObserved": "Totaal waargenomen",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -248,7 +248,13 @@
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
"used": "Used",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"changedetectionio": {
"diffsDetected": "Wykryto różnic",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"myPrs": "My PRs",
"approved": "Approved",
"result": "Result",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -91,7 +91,7 @@
"transcoding": "Transcodificando",
"bitrate": "Taxa de bits",
"no_active": "Sem transmissões ativas",
"plex_connection_error": "Check Plex Connection"
"plex_connection_error": "Verifique a conexão do Plex"
},
"nzbget": {
"rate": "Taxa",
@@ -114,21 +114,21 @@
"wanted": "Desejado",
"queued": "Na fila",
"series": "Séries",
"queue": "Queue",
"unknown": "Unknown"
"queue": "Fila",
"unknown": "Desconhecido"
},
"radarr": {
"wanted": "Desejado",
"queued": "Na fila",
"movies": "Filmes",
"missing": "Faltando",
"queue": "Queue",
"unknown": "Unknown"
"queue": "Fila",
"unknown": "Desconhecido"
},
"lidarr": {
"wanted": "Desejado",
"queued": "Na fila",
"artists": "Artists"
"artists": "Artistas"
},
"readarr": {
"wanted": "Desejado",
@@ -159,7 +159,7 @@
"queries": "Consultas",
"blocked": "Bloqueados",
"gravity": "Gravidade",
"blocked_percent": "Blocked %"
"blocked_percent": "Bloqueado %"
},
"adguard": {
"queries": "Consultas",
@@ -244,11 +244,17 @@
"uptime": "LIGADO",
"days": "d",
"hours": "h",
"load": "Load",
"warn": "Warn",
"load": "Carga",
"warn": "Aviso",
"total": "Total",
"free": "Free",
"used": "Used"
"free": "Livre",
"used": "Usado",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"changedetectionio": {
"totalObserved": "Observados",
@@ -524,8 +530,8 @@
"memoryusage": "Memória Utilizada",
"freespace": "Espaço Livre",
"activeusers": "Usuários Ativos",
"numfiles": "Files",
"numshares": "Shared Items"
"numfiles": "Arquivos",
"numshares": "Itens Compartilhados"
},
"kopia": {
"status": "Status",
@@ -582,78 +588,106 @@
"switches_on": "Interruptores Ligados"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
"subscriptions": "Assinaturas",
"unread": "Não lida"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"recordings": "Gravações",
"scheduled": "Agendado",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
"monitoring": "Monitorando",
"updates": "Atualizações"
},
"tailscale": {
"address": "Address",
"expires": "Expires",
"never": "Never",
"last_seen": "Last Seen",
"now": "Now",
"years": "{{number}}y",
"weeks": "{{number}}w",
"address": "Endereço",
"expires": "Expira",
"never": "Nunca",
"last_seen": "Visto pela última vez",
"now": "Agora",
"years": "{{number}}a",
"weeks": "{{number}}s",
"hours": "{{number}}h",
"days": "{{number}}d",
"minutes": "{{number}}m",
"seconds": "{{number}}s",
"ago": "{{value}} Ago"
"ago": "{{value}} Atrás"
},
"qnap": {
"systemTempC": "System Temp",
"cpuUsage": "CPU Usage",
"memUsage": "MEM Usage",
"systemTempC": "Temp Sistema",
"cpuUsage": "Uso CPU",
"memUsage": "Uso MEM",
"poolUsage": "Pool Usage",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
"volumeUsage": "Uso Volume",
"invalid": "Invalido"
},
"pfsense": {
"load": "Load Avg",
"memory": "Mem Usage",
"load": "Média de carga",
"memory": "Uso Mem",
"wanStatus": "WAN Status",
"up": "Up",
"down": "Down",
"temp": "Temp",
"disk": "Disk Usage",
"disk": "Uso de disco",
"wanIP": "WAN IP"
},
"caddy": {
"upstreams": "Upstreams",
"requests": "Current requests",
"requests_failed": "Failed requests"
"requests": "Solicitações atuais",
"requests_failed": "Solicitações com falha"
},
"evcc": {
"pv_power": "Production",
"battery_soc": "Battery",
"grid_power": "Grid",
"home_power": "Consumption",
"charge_power": "Charger",
"pv_power": "Produção",
"battery_soc": "Bateria",
"grid_power": "Grade",
"home_power": "Consumo",
"charge_power": "Carregador",
"watt_hour": "Wh"
},
"pialert": {
"total": "Total",
"connected": "Connected",
"new_devices": "New Devices",
"down_alerts": "Down Alerts"
"connected": "Conectado",
"new_devices": "Novos dispositivos",
"down_alerts": "Alertas de Quedas"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
"downloadCount": "Fila",
"downloadSpeed": "Velocidade de download",
"downloadBytesRemaining": "Restante",
"downloadTotalBytes": "Tamanho"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
"totalFiles": "Arquivos"
},
"gamedig": {
"name": "Nome",
"map": "Mapa",
"currentPlayers": "Jogadores atuais",
"players": "Jogadores",
"maxPlayers": "Jogadores Max",
"bots": "Robos",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -261,7 +261,13 @@
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
"used": "Used",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"changedetectionio": {
"totalObserved": "Total Observado",
@@ -664,5 +670,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"approved": "Approved",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -248,7 +248,13 @@
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
"used": "Used",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"changedetectionio": {
"totalObserved": "Total Observed",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved",
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -248,7 +248,13 @@
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
"used": "Used",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"changedetectionio": {
"totalObserved": "Всего наблюдаемых",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -412,7 +412,13 @@
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
"used": "Used",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"quicklaunch": {
"bookmark": "Bookmark",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"succeeded": "Succeeded",
"notStarted": "Not Started",
"inProgress": "In Progress",
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"failed": "Failed",
"canceled": "Canceled",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -364,7 +364,13 @@
"load": "Obremenitev",
"warn": "Opoz.",
"total": "Skupaj",
"used": "V uporabi"
"used": "V uporabi",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"authentik": {
"users": "Uporabniki",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Serije",
"totalFiles": "Datoteke"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -248,7 +248,13 @@
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
"used": "Used",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"changedetectionio": {
"totalObserved": "Total Observed",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -248,7 +248,13 @@
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
"used": "Used",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"changedetectionio": {
"totalObserved": "Total Observed",
@@ -655,5 +661,33 @@
"kavita": {
"totalFiles": "Files",
"seriesCount": "Series"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"approved": "Approved",
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -248,7 +248,13 @@
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
"used": "Used",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"changedetectionio": {
"totalObserved": "మొత్తం గమనించబడింది",
@@ -655,5 +661,33 @@
"kavita": {
"totalFiles": "Files",
"seriesCount": "Series"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"myPrs": "My PRs",
"approved": "Approved",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -324,7 +324,13 @@
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
"used": "Used",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"quicklaunch": {
"bookmark": "Bookmark",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -248,7 +248,13 @@
"warn": "Uyarı",
"total": "Toplam",
"free": "Boş",
"used": "Kullanım"
"used": "Kullanım",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"changedetectionio": {
"totalObserved": "Toplam Gözlenen",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -372,7 +372,13 @@
"warn": "Увага",
"total": "Всього",
"free": "Вільний",
"used": "Використовується"
"used": "Використовується",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"quicklaunch": {
"bookmark": "Закладка",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Серій",
"totalFiles": "Файлів"
},
"gamedig": {
"name": "Назва",
"map": "Мапа",
"currentPlayers": "Поточні гравці",
"players": "Гравці",
"maxPlayers": "Максимум гравців",
"bots": "Ботів",
"ping": "Пінг"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -248,7 +248,13 @@
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
"used": "Used",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"changedetectionio": {
"totalObserved": "Total Observed",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -248,7 +248,13 @@
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
"used": "Used",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"changedetectionio": {
"totalObserved": "Total Observed",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -248,7 +248,13 @@
"warn": "Warn",
"total": "Total",
"free": "Free",
"used": "Used"
"used": "Used",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"changedetectionio": {
"totalObserved": "观察到的总数",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"canceled": "Canceled",
"inProgress": "In Progress",
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -248,7 +248,13 @@
"used": "已使用",
"load": "負載量",
"warn": "警告",
"total": "總共"
"total": "總共",
"crit": "Crit",
"read": "Read",
"write": "Write",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
},
"changedetectionio": {
"totalObserved": "總監測數",
@@ -655,5 +661,33 @@
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
}
}

View File

@@ -1,3 +1,4 @@
import { useRef } from "react";
import classNames from "classnames";
import { Disclosure, Transition } from '@headlessui/react';
import { MdKeyboardArrowDown } from "react-icons/md";
@@ -6,6 +7,7 @@ import ErrorBoundary from "components/errorboundry";
import List from "components/bookmarks/list";
export default function BookmarksGroup({ group, disableCollapse }) {
const panel = useRef();
return (
<div key={group.name} className="flex-1">
<Disclosure defaultOpen>
@@ -15,19 +17,24 @@ export default function BookmarksGroup({ group, disableCollapse }) {
<h2 className="text-theme-800 dark:text-theme-300 text-xl font-medium">{group.name}</h2>
<MdKeyboardArrowDown className={classNames(
disableCollapse ? 'hidden' : '',
'transition-opacity opacity-0 group-hover:opacity-100 ml-auto text-theme-800 dark:text-theme-300 text-xl',
open ? 'rotate-180 transform' : ''
'transition-all opacity-0 group-hover:opacity-100 ml-auto text-theme-800 dark:text-theme-300 text-xl',
open ? '' : 'rotate-90'
)} />
</Disclosure.Button>
<Transition
enter="transition duration-200 ease-out"
enterFrom="transform scale-75 opacity-0"
enterTo="transform scale-100 opacity-100"
leave="transition duration-75 ease-out"
leaveFrom="transform scale-100 opacity-100"
leaveTo="transform scale-75 opacity-0"
// Otherwise the transition group does display: none and cancels animation
className="!block"
unmount={false}
beforeLeave={() => {
panel.current.style.height = `${panel.current.scrollHeight}px`;
setTimeout(() => {panel.current.style.height = `0`}, 1);
}}
beforeEnter={() => {
panel.current.style.height = `0px`;
setTimeout(() => {panel.current.style.height = `${panel.current.scrollHeight}px`}, 1);
}}
>
<Disclosure.Panel>
<Disclosure.Panel className="transition-all overflow-hidden duration-300 ease-out" ref={panel} static>
<ErrorBoundary>
<List bookmarks={group.bookmarks} />
</ErrorBoundary>

View File

@@ -145,7 +145,7 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear
return (
<div className={classNames(
"relative z-20 ease-in-out duration-300 transition-opacity",
"relative z-40 ease-in-out duration-300 transition-opacity",
hidden && !isOpen && "hidden",
!hidden && isOpen && "opacity-100",
!isOpen && "opacity-0",

View File

@@ -33,11 +33,22 @@ export default function ResolvedIcon({ icon, width = 32, height = 32, alt = "log
}
// check mdi- or si- prefixed icons
const prefix = icon.split("-")[0]
const prefix = icon.split("-")[0];
if (prefix in iconSetURLs) {
// get icon source
const iconName = icon.replace(`${prefix}-`, "").replace(".svg", "");
// default to theme setting
let iconName = icon.replace(`${prefix}-`, "").replace(".svg", "");
let iconColor = settings.iconStyle === "theme" ?
`rgb(var(--color-${ theme === "dark" ? 300 : 900 }) / var(--tw-text-opacity, 1))` :
"linear-gradient(180deg, rgb(var(--color-logo-start)), rgb(var(--color-logo-stop)))";
// use custom hex color if provided
const colorMatches = icon.match(/[#][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9]$/i)
if (colorMatches?.length) {
iconName = icon.replace(`${prefix}-`, "").replace(".svg", "").replace(`-${colorMatches[0]}`, "");
iconColor = `${colorMatches[0]}`;
}
const iconSource = `${iconSetURLs[prefix]}${iconName}.svg`;
return (
@@ -47,16 +58,13 @@ export default function ResolvedIcon({ icon, width = 32, height = 32, alt = "log
height,
maxWidth: '100%',
maxHeight: '100%',
background: settings.iconStyle === "theme" ?
`rgb(var(--color-${ theme === "dark" ? 300 : 900 }) / var(--tw-text-opacity, 1))` :
"linear-gradient(180deg, rgb(var(--color-logo-start)), rgb(var(--color-logo-stop)))",
background: `${iconColor}`,
mask: `url(${iconSource}) no-repeat center / contain`,
WebkitMask: `url(${iconSource}) no-repeat center / contain`,
}}
/>
);
}
// fallback to dashboard-icons
if (icon.endsWith(".svg")) {

View File

@@ -1,3 +1,4 @@
import { useRef } from "react";
import classNames from "classnames";
import { Disclosure, Transition } from '@headlessui/react';
import { MdKeyboardArrowDown } from "react-icons/md";
@@ -7,6 +8,8 @@ import ResolvedIcon from "components/resolvedicon";
export default function ServicesGroup({ group, services, layout, fiveColumns, disableCollapse }) {
const panel = useRef();
return (
<div
key={services.name}
@@ -28,19 +31,24 @@ export default function ServicesGroup({ group, services, layout, fiveColumns, di
<h2 className="flex text-theme-800 dark:text-theme-300 text-xl font-medium">{services.name}</h2>
<MdKeyboardArrowDown className={classNames(
disableCollapse ? 'hidden' : '',
'transition-opacity opacity-0 group-hover:opacity-100 ml-auto text-theme-800 dark:text-theme-300 text-xl',
open ? 'rotate-180 transform' : ''
'transition-all opacity-0 group-hover:opacity-100 ml-auto text-theme-800 dark:text-theme-300 text-xl',
open ? '' : 'rotate-90'
)} />
</Disclosure.Button>
<Transition
enter="transition duration-200 ease-out"
enterFrom="transform scale-75 opacity-0"
enterTo="transform scale-100 opacity-100"
leave="transition duration-75 ease-out"
leaveFrom="transform scale-100 opacity-100"
leaveTo="transform scale-75 opacity-0"
// Otherwise the transition group does display: none and cancels animation
className="!block"
unmount={false}
beforeLeave={() => {
panel.current.style.height = `${panel.current.scrollHeight}px`;
setTimeout(() => {panel.current.style.height = `0`}, 1);
}}
beforeEnter={() => {
panel.current.style.height = `0px`;
setTimeout(() => {panel.current.style.height = `${panel.current.scrollHeight}px`}, 1);
}}
>
<Disclosure.Panel>
<Disclosure.Panel className="transition-all overflow-hidden duration-300 ease-out" ref={panel} static>
<List group={group} services={services.services} layout={layout} />
</Disclosure.Panel>
</Transition>

View File

@@ -34,9 +34,9 @@ export default function Item({ service, group }) {
<div
className={`${
hasLink ? "cursor-pointer " : " "
}transition-all h-15 mb-2 p-1 rounded-md font-medium text-theme-700 dark:text-theme-200 dark:hover:text-theme-300 shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 hover:bg-theme-300/20 dark:bg-white/5 dark:hover:bg-white/10 relative`}
}transition-all h-15 mb-2 p-1 rounded-md font-medium text-theme-700 dark:text-theme-200 dark:hover:text-theme-300 shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 hover:bg-theme-300/20 dark:bg-white/5 dark:hover:bg-white/10 relative overflow-clip`}
>
<div className="flex select-none">
<div className="flex select-none z-0">
{service.icon &&
(hasLink ? (
<a
@@ -60,21 +60,21 @@ export default function Item({ service, group }) {
rel="noreferrer"
className="flex-1 flex items-center justify-between rounded-r-md "
>
<div className="flex-1 px-2 py-2 text-sm text-left">
<div className="flex-1 px-2 py-2 text-sm text-left z-10">
{service.name}
<p className="text-theme-500 dark:text-theme-300 text-xs font-light">{service.description}</p>
</div>
</a>
) : (
<div className="flex-1 flex items-center justify-between rounded-r-md ">
<div className="flex-1 px-2 py-2 text-sm text-left">
<div className="flex-1 px-2 py-2 text-sm text-left z-10">
{service.name}
<p className="text-theme-500 dark:text-theme-300 text-xs font-light">{service.description}</p>
</div>
</div>
)}
<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 z-30">
{service.ping && (
<div className="flex-shrink-0 flex items-center justify-center cursor-pointer">
<Ping group={group} service={service.name} />

View File

@@ -18,7 +18,8 @@ export default function Container({ error = false, children, service }) {
const childrenArray = Array.isArray(children) ? children : [children];
let visibleChildren = childrenArray;
const fields = service?.widget?.fields;
let fields = service?.widget?.fields;
if (typeof service.widget.fields === 'string') fields = JSON.parse(service.widget.fields);
const type = service?.widget?.type;
if (fields && type) {
// if the field contains a "." then it most likely contains a common loc value

View File

@@ -37,7 +37,7 @@ export default function Widget({ options }) {
<Resource icon={FaMemory} label={t("glances.wait")} percentage="0" />
{ options.cputemp && <Resource icon={FaThermometerHalf} label={t("glances.wait")} percentage="0" /> }
{ options.disk && !Array.isArray(options.disk) && <Resource key={options.disk} icon={FiHardDrive} label={t("glances.wait")} percentage="0" /> }
{ options.disk && Array.isArray(options.disk) && options.disk.map((disk) => <Resource key={disk.mnt_point} icon={FiHardDrive} label={t("glances.wait")} percentage="0" /> )}
{ options.disk && Array.isArray(options.disk) && options.disk.map((disk) => <Resource key={`disk_${disk.mnt_point}`} icon={FiHardDrive} label={t("glances.wait")} percentage="0" /> ) }
{ options.uptime && <Resource icon={FaRegClock} label={t("glances.wait")} percentage="0" /> }
{ options.label && <WidgetLabel label={options.label} /> }
</Resources>;
@@ -50,7 +50,7 @@ export default function Widget({ options }) {
if (options.cputemp && cpuSensors) {
try {
mainTemp = cpuSensors.reduce((acc, s) => acc + s.value, 0) / cpuSensors.length;
maxTemp = Math.max(cpuSensors.reduce((acc, s) => acc + s.warning, 0) / cpuSensors.length, maxTemp);
maxTemp = Math.max(cpuSensors.reduce((acc, s) => acc + (s.warning > 0 ? s.warning : 0), 0) / cpuSensors.length, maxTemp);
if (unit === "fahrenheit") {
mainTemp = convertToFahrenheit(mainTemp);
maxTemp = convertToFahrenheit(maxTemp);
@@ -108,7 +108,7 @@ export default function Widget({ options }) {
expanded={options.expanded}
/>
{disks.map((disk) => (
<Resource key={disk.mnt_point}
<Resource key={`disk_${disk.mnt_point}`}
icon={FiHardDrive}
value={t("common.bytes", { value: disk.free })}
label={t("glances.free")}

View File

@@ -8,58 +8,62 @@ export default function Logo({ options }) {
<Container options={options}>
<Raw>
{options.icon ?
<ResolvedIcon icon={options.icon} width={48} height={48} /> :
<div className="mr-3">
<ResolvedIcon icon={options.icon} width={48} height={48} />
</div> :
// fallback to homepage logo
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 1024 1024"
style={{
enableBackground: "new 0 0 1024 1024",
}}
xmlSpace="preserve"
className="w-full h-full"
>
<style>
{
".st0{display:none}.st3{stroke-linecap:square}.st3,.st4{fill:none;stroke:#fff;stroke-miterlimit:10}.st6{display:inline;fill:#333}.st7{fill:#fff}"
}
</style>
<g id="Icon">
<path
d="M771.9 191c27.7 0 50.1 26.5 50.1 59.3v186.4l-100.2.3V250.3c0-32.8 22.4-59.3 50.1-59.3z"
style={{
fill: "rgba(var(--color-logo-start))",
}}
/>
<linearGradient
id="homepage_logo_gradient"
gradientUnits="userSpaceOnUse"
x1={200.746}
y1={225.015}
x2={764.986}
y2={789.255}
>
<stop
offset={0}
<div className="w-12 h-12">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 1024 1024"
style={{
enableBackground: "new 0 0 1024 1024",
}}
xmlSpace="preserve"
className="w-full h-full"
>
<style>
{
".st0{display:none}.st3{stroke-linecap:square}.st3,.st4{fill:none;stroke:#fff;stroke-miterlimit:10}.st6{display:inline;fill:#333}.st7{fill:#fff}"
}
</style>
<g id="Icon">
<path
d="M771.9 191c27.7 0 50.1 26.5 50.1 59.3v186.4l-100.2.3V250.3c0-32.8 22.4-59.3 50.1-59.3z"
style={{
stopColor: "rgba(var(--color-logo-start))",
fill: "rgba(var(--color-logo-start))",
}}
/>
<stop
offset={1}
<linearGradient
id="homepage_logo_gradient"
gradientUnits="userSpaceOnUse"
x1={200.746}
y1={225.015}
x2={764.986}
y2={789.255}
>
<stop
offset={0}
style={{
stopColor: "rgba(var(--color-logo-start))",
}}
/>
<stop
offset={1}
style={{
stopColor: "rgba(var(--color-logo-stop))",
}}
/>
</linearGradient>
<path
d="M721.8 250.3c0-32.7 22.4-59.3 50.1-59.3H253.1c-27.7 0-50.1 26.5-50.1 59.3v582.2l90.2-75.7-.1-130.3H375v61.8l88-73.8 258.8 217.9V250.6"
style={{
stopColor: "rgba(var(--color-logo-stop))",
fill: "url(#homepage_logo_gradient)",
}}
/>
</linearGradient>
<path
d="M721.8 250.3c0-32.7 22.4-59.3 50.1-59.3H253.1c-27.7 0-50.1 26.5-50.1 59.3v582.2l90.2-75.7-.1-130.3H375v61.8l88-73.8 258.8 217.9V250.6"
style={{
fill: "url(#homepage_logo_gradient)",
}}
/>
</g>
</svg>
</g>
</svg>
</div>
}
</Raw>
</Container>

View File

@@ -1,7 +0,0 @@
import mapIcon from "utils/weather/openmeteo-condition-map";
export default function Icon({ condition, timeOfDay }) {
const IconComponent = mapIcon(condition, timeOfDay);
return <IconComponent className="w-10 h-10 text-theme-800 dark:text-theme-200" />;
}

View File

@@ -10,8 +10,7 @@ import ContainerButton from "../widget/container_button";
import WidgetIcon from "../widget/widget_icon";
import PrimaryText from "../widget/primary_text";
import SecondaryText from "../widget/secondary_text";
import Icon from "./icon";
import mapIcon from "../../../utils/weather/openmeteo-condition-map";
function Widget({ options }) {
const { t } = useTranslation();
@@ -33,10 +32,8 @@ function Widget({ options }) {
}
const unit = options.units === "metric" ? "celsius" : "fahrenheit";
const weatherInfo = {
condition: data.current_weather.weathercode,
timeOfDay: data.current_weather.time > data.daily.sunrise[0] && data.current_weather.time < data.daily.sunset[0] ? "day" : "night"
};
const condition = data.current_weather.weathercode;
const timeOfDay = data.current_weather.time > data.daily.sunrise[0] && data.current_weather.time < data.daily.sunset[0] ? "day" : "night";
return <Container options={options}>
<PrimaryText>
@@ -47,8 +44,8 @@ function Widget({ options }) {
unit,
})}
</PrimaryText>
<SecondaryText>{t(`wmo.${data.current_weather.weathercode}-${weatherInfo.timeOfDay}`)}</SecondaryText>
<WidgetIcon icon={Icon} size="xl" weatherInfo={weatherInfo} />
<SecondaryText>{t(`wmo.${data.current_weather.weathercode}-${timeOfDay}`)}</SecondaryText>
<WidgetIcon icon={mapIcon(condition, timeOfDay)} size="xl" />
</Container>;
}

View File

@@ -1,7 +0,0 @@
import mapIcon from "utils/weather/owm-condition-map";
export default function Icon({ condition, timeOfDay }) {
const IconComponent = mapIcon(condition, timeOfDay);
return <IconComponent className="w-10 h-10 text-theme-800 dark:text-theme-200" />;
}

View File

@@ -10,9 +10,7 @@ import ContainerButton from "../widget/container_button";
import PrimaryText from "../widget/primary_text";
import SecondaryText from "../widget/secondary_text";
import WidgetIcon from "../widget/widget_icon";
import Icon from "./icon";
import mapIcon from "../../../utils/weather/owm-condition-map";
function Widget({ options }) {
const { t, i18n } = useTranslation();
@@ -35,15 +33,13 @@ function Widget({ options }) {
const unit = options.units === "metric" ? "celsius" : "fahrenheit";
const weatherInfo = {
condition: data.weather[0].id,
timeOfDay: data.dt > data.sys.sunrise && data.dt < data.sys.sunset ? "day" : "night"
};
const condition = data.weather[0].id;
const timeOfDay = data.dt > data.sys.sunrise && data.dt < data.sys.sunset ? "day" : "night";
return <Container options={options}>
<PrimaryText>{options.label && `${options.label}, ` }{t("common.number", { value: data.main.temp, style: "unit", unit })}</PrimaryText>
<SecondaryText>{data.weather[0].description}</SecondaryText>
<WidgetIcon icon={Icon} size="xl" weatherInfo={weatherInfo} />
<WidgetIcon icon={mapIcon(condition, timeOfDay)} size="xl" />
</Container>;
}

View File

@@ -5,11 +5,11 @@ import { useTranslation } from "next-i18next";
import Resource from "../widget/resource";
import Error from "../widget/error";
export default function Cpu({ expanded }) {
export default function Cpu({ expanded, refresh = 1500 }) {
const { t } = useTranslation();
const { data, error } = useSWR(`/api/widgets/resources?type=cpu`, {
refreshInterval: 1500,
refreshInterval: refresh,
});
if (error || data?.error) {

View File

@@ -9,11 +9,11 @@ function convertToFahrenheit(t) {
return t * 9/5 + 32
}
export default function CpuTemp({ expanded, units }) {
export default function CpuTemp({ expanded, units, refresh = 1500 }) {
const { t } = useTranslation();
const { data, error } = useSWR(`/api/widgets/resources?type=cputemp`, {
refreshInterval: 1500,
refreshInterval: refresh,
});
if (error || data?.error) {

View File

@@ -5,11 +5,11 @@ import { useTranslation } from "next-i18next";
import Resource from "../widget/resource";
import Error from "../widget/error";
export default function Disk({ options, expanded }) {
export default function Disk({ options, expanded, refresh = 1500 }) {
const { t } = useTranslation();
const { data, error } = useSWR(`/api/widgets/resources?type=disk&target=${options.disk}`, {
refreshInterval: 1500,
refreshInterval: refresh,
});
if (error || data?.error) {

View File

@@ -5,11 +5,11 @@ import { useTranslation } from "next-i18next";
import Resource from "../widget/resource";
import Error from "../widget/error";
export default function Memory({ expanded }) {
export default function Memory({ expanded, refresh = 1500 }) {
const { t } = useTranslation();
const { data, error } = useSWR(`/api/widgets/resources?type=memory`, {
refreshInterval: 1500,
refreshInterval: refresh,
});
if (error || data?.error) {

View File

@@ -9,16 +9,19 @@ import Uptime from "./uptime";
export default function Resources({ options }) {
const { expanded, units } = options;
let { refresh } = options;
if (!refresh) refresh = 1500;
refresh = Math.max(refresh, 1000);
return <Container options={options}>
<Raw>
<div className="flex flex-row self-center flex-wrap justify-between">
{options.cpu && <Cpu expanded={expanded} />}
{options.memory && <Memory expanded={expanded} />}
{options.cpu && <Cpu expanded={expanded} refresh={refresh} />}
{options.memory && <Memory expanded={expanded} refresh={refresh} />}
{Array.isArray(options.disk)
? options.disk.map((disk) => <Disk key={disk} options={{ disk }} expanded={expanded} />)
: options.disk && <Disk options={options} expanded={expanded} />}
{options.cputemp && <CpuTemp expanded={expanded} units={units} />}
{options.uptime && <Uptime />}
? options.disk.map((disk) => <Disk key={disk} options={{ disk }} expanded={expanded} refresh={refresh} />)
: options.disk && <Disk options={options} expanded={expanded} refresh={refresh} />}
{options.cputemp && <CpuTemp expanded={expanded} units={units} refresh={refresh} />}
{options.uptime && <Uptime refresh={refresh} />}
</div>
{options.label && (
<div className="ml-6 pt-1 text-center text-theme-800 dark:text-theme-200 text-xs">{options.label}</div>

View File

@@ -5,11 +5,11 @@ import { useTranslation } from "next-i18next";
import Resource from "../widget/resource";
import Error from "../widget/error";
export default function Uptime() {
export default function Uptime({ refresh = 1500 }) {
const { t } = useTranslation();
const { data, error } = useSWR(`/api/widgets/resources?type=uptime`, {
refreshInterval: 1500,
refreshInterval: refresh,
});
if (error || data?.error) {

View File

@@ -1,7 +0,0 @@
import mapIcon from "utils/weather/condition-map";
export default function Icon({ condition, timeOfDay }) {
const IconComponent = mapIcon(condition, timeOfDay);
return <IconComponent className="w-10 h-10 text-theme-800 dark:text-theme-200" />;
}

View File

@@ -10,8 +10,7 @@ import PrimaryText from "../widget/primary_text";
import SecondaryText from "../widget/secondary_text";
import WidgetIcon from "../widget/widget_icon";
import ContainerButton from "../widget/container_button";
import Icon from "./icon";
import mapIcon from "../../../utils/weather/condition-map";
function Widget({ options }) {
const { t, i18n } = useTranslation();
@@ -33,10 +32,8 @@ function Widget({ options }) {
}
const unit = options.units === "metric" ? "celsius" : "fahrenheit";
const weatherInfo = {
condition: data.current.condition.code,
timeOfDay: data.current.is_day ? "day" : "night",
};
const condition = data.current.condition.code;
const timeOfDay = data.current.is_day ? "day" : "night";
return <Container options={options}>
<PrimaryText>
@@ -48,7 +45,7 @@ function Widget({ options }) {
})}
</PrimaryText>
<SecondaryText>{data.current.condition.text}</SecondaryText>
<WidgetIcon icon={Icon} size="xl" weatherInfo={weatherInfo} />
<WidgetIcon icon={mapIcon(condition, timeOfDay)} size="xl" />
</Container>;
}

View File

@@ -15,7 +15,7 @@ export default function Resource({ children, icon, value, label, expandedValue =
<div className="pr-1">{expandedLabel}</div>
</div>
}
{ percentage && <UsageBar percent={percentage} /> }
{ percentage >= 0 && <UsageBar percent={percentage} /> }
{ children }
</div>
</div>;

View File

@@ -1,6 +1,5 @@
export default function WidgetIcon({ icon, size = "s", pulse = false, weatherInfo = {} }) {
export default function WidgetIcon({ icon, size = "s", pulse = false }) {
const Icon = icon;
const { condition, timeOfDay } = weatherInfo;
let additionalClasses = "text-theme-800 dark:text-theme-200 ";
switch (size) {
@@ -14,5 +13,5 @@ export default function WidgetIcon({ icon, size = "s", pulse = false, weatherInf
additionalClasses += "animate-pulse ";
}
return <Icon className={additionalClasses} condition={condition} timeOfDay={timeOfDay} />;
return <Icon className={additionalClasses} />;
}

View File

@@ -290,6 +290,12 @@ export function cleanServiceGroups(groups) {
enableNowPlaying,
volume, // diskstation widget,
enableQueue, // sonarr/radarr
node, // Proxmox
snapshotHost, // kopia
snapshotPath,
userEmail, // azuredevops
repositoryId,
metric, // glances
} = cleanedService.widget;
let fieldsList = fields;
@@ -300,7 +306,7 @@ export function cleanServiceGroups(groups) {
fieldsList = null;
}
}
cleanedService.widget = {
type,
fields: fieldsList || null,
@@ -309,6 +315,11 @@ export function cleanServiceGroups(groups) {
service_group: serviceGroup.name,
};
if (type === "azuredevops") {
if (userEmail) cleanedService.widget.userEmail = userEmail;
if (repositoryId) cleanedService.widget.repositoryId = repositoryId;
}
if (type === "coinmarketcap") {
if (currency) cleanedService.widget.currency = currency;
if (symbols) cleanedService.widget.symbols = symbols;
@@ -323,6 +334,9 @@ export function cleanServiceGroups(groups) {
if (type === "unifi") {
if (site) cleanedService.widget.site = site;
}
if (type === "proxmox") {
if (node) cleanedService.widget.node = node;
}
if (type === "kubernetes") {
if (namespace) cleanedService.widget.namespace = namespace;
if (app) cleanedService.widget.app = app;
@@ -341,6 +355,13 @@ export function cleanServiceGroups(groups) {
if (["diskstation", "qnap"].includes(type)) {
if (volume) cleanedService.widget.volume = volume;
}
if (type === "kopia") {
if (snapshotHost) cleanedService.widget.snapshotHost = snapshotHost;
if (snapshotPath) cleanedService.widget.snapshotPath = snapshotPath;
}
if (type === "glances") {
if (metric) cleanedService.widget.metric = metric;
}
}
return cleanedService;

View File

@@ -5,7 +5,7 @@ export function formatApiCall(url, args) {
return args[key] || "";
};
return url.replace(/\/+$/, "").replace(find, replace);
return url.replace(/\/+$/, "").replace(find, replace).replace(find,replace);
}
function getURLSearchParams(widget, endpoint) {

View File

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

View File

@@ -9,10 +9,10 @@ const widget = {
endpoint: "core/users?page_size=1",
},
login: {
endpoint: "events/events/per_month/?action=login&query={}",
endpoint: "events/events/per_month/?action=login",
},
login_failed: {
endpoint: "events/events/per_month/?action=login_failed&query={}",
endpoint: "events/events/per_month/?action=login_failed",
},
},
};

View File

@@ -0,0 +1,65 @@
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 { userEmail, repositoryId } = widget;
const includePR = userEmail !== undefined && repositoryId !== undefined;
const { data: prData, error: prError } = useWidgetAPI(widget, includePR ? "pr" : null);
const { data: pipelineData, error: pipelineError } = useWidgetAPI(widget, "pipeline");
if (
pipelineError ||
(includePR && (prError || prData?.errorCode !== undefined))
) {
let finalError = pipelineError ?? prError;
if (includePR && prData?.errorCode !== null) {
// pr call failed possibly with more specific message
finalError = { message: prData?.message ?? 'Error communicating with Azure API' }
}
return <Container service={service} error={finalError} />;
}
if (!pipelineData || !Array.isArray(pipelineData.value) || (includePR && !prData)) {
return (
<Container service={service}>
<Block label="azuredevops.result" />
<Block label="azuredevops.totalPrs" />
<Block label="azuredevops.myPrs" />
<Block label="azuredevops.approved" />
</Container>
);
}
return (
<Container service={service}>
{pipelineData.value[0].result ? (
<Block label="azuredevops.result" value={t(`azuredevops.${pipelineData.value[0].result.toString()}`)} />
) : (
<Block label="azuredevops.status" value={t(`azuredevops.${pipelineData.value[0].status.toString()}`)} />
)}
{includePR && <Block label="azuredevops.totalPrs" value={t("common.number", { value: prData.count })} />}
{includePR && <Block
label="azuredevops.myPrs"
value={t("common.number", {
value: prData.value?.filter((item) => item.createdBy.uniqueName.toLowerCase() === userEmail.toLowerCase())
.length,
})}
/>}
{includePR && <Block
label="azuredevops.approved"
value={t("common.number", {
value: prData.value
?.filter((item) => item.createdBy.uniqueName.toLowerCase() === userEmail.toLowerCase())
.filter((item) => item.reviewers.some((reviewer) => reviewer.vote === 10)).length,
})}
/>}
</Container>
);
}

View File

@@ -0,0 +1,18 @@
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
const widget = {
api: "https://dev.azure.com/{organization}/{project}/_apis/{endpoint}",
proxyHandler: credentialedProxyHandler,
mappings: {
pr: {
endpoint: "git/repositories/{repositoryId}/pullrequests"
},
pipeline: {
endpoint: "build/Builds?branchName={branchName}&definitions={definitionId}&$top=1"
},
},
};
export default widget;

View File

@@ -5,6 +5,7 @@ const components = {
audiobookshelf: dynamic(() => import("./audiobookshelf/component")),
authentik: dynamic(() => import("./authentik/component")),
autobrr: dynamic(() => import("./autobrr/component")),
azuredevops: dynamic(() => import("./azuredevops/component")),
bazarr: dynamic(() => import("./bazarr/component")),
caddy: dynamic(() => import("./caddy/component")),
changedetectionio: dynamic(() => import("./changedetectionio/component")),
@@ -21,7 +22,9 @@ const components = {
fileflows: dynamic(() => import("./fileflows/component")),
flood: dynamic(() => import("./flood/component")),
freshrss: dynamic(() => import("./freshrss/component")),
gamedig: dynamic(() => import("./gamedig/component")),
ghostfolio: dynamic(() => import("./ghostfolio/component")),
glances: dynamic(() => import("./glances/component")),
gluetun: dynamic(() => import("./gluetun/component")),
gotify: dynamic(() => import("./gotify/component")),
grafana: dynamic(() => import("./grafana/component")),
@@ -88,6 +91,7 @@ const components = {
unifi: dynamic(() => import("./unifi/component")),
unmanic: dynamic(() => import("./unmanic/component")),
uptimekuma: dynamic(() => import("./uptimekuma/component")),
urbackup: dynamic(() => import("./urbackup/component")),
watchtower: dynamic(() => import("./watchtower/component")),
whatsupdocker: dynamic(() => import("./whatsupdocker/component")),
xteve: dynamic(() => import("./xteve/component")),

View File

@@ -0,0 +1,59 @@
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 { widget } = service;
const { data: serverData, error: serverError } = useWidgetAPI(widget, "status");
const { t } = useTranslation();
if(serverError){
return <Container service={service} error={serverError} />;
}
// Default fields
if (widget.fields == null || widget.fields.length === 0) {
widget.fields = ["map", "currentPlayers", "ping"];
}
const MAX_ALLOWED_FIELDS = 4;
// Limits max number of displayed fields
if (widget.fields != null && widget.fields.length > MAX_ALLOWED_FIELDS) {
widget.fields = widget.fields.slice(0, MAX_ALLOWED_FIELDS);
}
if (!serverData) {
return (
<Container service={service}>
<Block label="gamedig.name"/>
<Block label="gamedig.map"/>
<Block label="gamedig.currentPlayers" />
<Block label="gamedig.players" />
<Block label="gamedig.maxPlayers" />
<Block label="gamedig.bots" />
<Block label="gamedig.ping" />
</Container>
);
}
const name = serverData.online ? serverData.name : "-";
const map = serverData.online ? serverData.map : "-";
const currentPlayers = serverData.online ? `${serverData.players} / ${serverData.maxplayers}` : "-";
const players = serverData.online ? `${serverData.players}` : "-";
const maxPlayers = serverData.online ? `${serverData.maxplayers}` : "-";
const bots = serverData.online ? `${serverData.bots}` : "-";
const ping = serverData.online ? `${serverData.ping}` : 0;
return (
<Container service={service}>
<Block label="gamedig.name" value={name} />
<Block label="gamedig.map" value={map} />
<Block label="gamedig.currentPlayers" value={currentPlayers} />
<Block label="gamedig.players" value={players} />
<Block label="gamedig.maxPlayers" value={maxPlayers} />
<Block label="gamedig.bots" value={bots} />
<Block label="gamedig.ping" value={t("common.ms", { value: ping, style: "unit", unit: "millisecond" })} />
</Container>
);
}

View File

@@ -0,0 +1,37 @@
import createLogger from "utils/logger";
import getServiceWidget from "utils/config/service-helpers";
const proxyName = "gamedigProxyHandler";
const logger = createLogger(proxyName);
const gamedig = require("gamedig");
export default async function gamedigProxyHandler(req, res) {
const { group, service } = req.query;
const serviceWidget = await getServiceWidget(group, service);
const url = new URL(serviceWidget.url);
try {
const serverData = await gamedig.query({
type: serviceWidget.serverType,
host: url.hostname,
port: url.port,
givenPortOnly: true,
});
res.status(200).send({
online: true,
name: serverData.name,
map: serverData.map,
players: serverData.players.length,
maxplayers: serverData.maxplayers,
bots: serverData.bots.length,
ping: serverData.ping,
});
} catch (e) {
logger.error(e);
res.status(200).send({
online: false
});
}
}

View File

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

View File

@@ -0,0 +1,44 @@
import Memory from "./metrics/memory";
import Cpu from "./metrics/cpu";
import Sensor from "./metrics/sensor";
import Net from "./metrics/net";
import Process from "./metrics/process";
import Disk from "./metrics/disk";
import GPU from "./metrics/gpu";
import Info from "./metrics/info";
export default function Component({ service }) {
const { widget } = service;
if (widget.metric === "info") {
return <Info service={service} />;
}
if (widget.metric === "memory") {
return <Memory service={service} />;
}
if (widget.metric === "process") {
return <Process service={service} />;
}
if (widget.metric.match(/^network:/)) {
return <Net service={service} />;
}
if (widget.metric.match(/^sensor:/)) {
return <Sensor service={service} />;
}
if (widget.metric.match(/^disk:/)) {
return <Disk service={service} />;
}
if (widget.metric.match(/^gpu:/)) {
return <GPU service={service} />;
}
if (widget.metric === "cpu") {
return <Cpu service={service} />;
}
}

View File

@@ -0,0 +1,7 @@
export default function Block({ position, children }) {
return (
<div className={`absolute ${position} z-20 text-sm pointer-events-none`}>
{children}
</div>
);
}

View File

@@ -0,0 +1,48 @@
import { PureComponent } from "react";
import { AreaChart, Area, ResponsiveContainer, Tooltip } from "recharts";
import CustomTooltip from "./custom_tooltip";
class Chart extends PureComponent {
render() {
const { dataPoints, formatter, label } = this.props;
return (
<div className="absolute -top-1 -left-1 h-[120px] w-[calc(100%+0.5em)] z-0">
<div className="overflow-clip z-10 w-full h-full">
<ResponsiveContainer width="100%" height="100%">
<AreaChart data={dataPoints}>
<defs>
<linearGradient id="color" x1="0" y1="0" x2="0" y2="1">
<stop offset="5%" stopColor="rgb(var(--color-500))" stopOpacity={0.4}/>
<stop offset="95%" stopColor="rgb(var(--color-500))" stopOpacity={0.1}/>
</linearGradient>
</defs>
<Area
name={label[0]}
isAnimationActive={false}
type="monotoneX"
dataKey="value"
stroke="rgb(var(--color-500))"
fillOpacity={1} fill="url(#color)"
baseLine={0}
/>
<Tooltip
allowEscapeViewBox={{ x: false, y: false }}
formatter={formatter}
content={<CustomTooltip formatter={formatter} />}
classNames="rounded-md text-xs p-0.5"
contentStyle={{
backgroundColor: "rgb(var(--color-800))",
color: "rgb(var(--color-100))"
}}
/>
</AreaChart>
</ResponsiveContainer>
</div>
</div>
);
}
}
export default Chart;

View File

@@ -0,0 +1,63 @@
import { PureComponent } from "react";
import { AreaChart, Area, ResponsiveContainer, Tooltip } from "recharts";
import CustomTooltip from "./custom_tooltip";
class ChartDual extends PureComponent {
render() {
const { dataPoints, formatter, stack, label, stackOffset } = this.props;
return (
<div className="absolute -top-1 -left-1 h-[120px] w-[calc(100%+0.5em)] z-0">
<div className="overflow-clip z-10 w-full h-full">
<ResponsiveContainer width="100%" height="100%">
<AreaChart data={dataPoints} stackOffset={stackOffset ?? "none"}>
<defs>
<linearGradient id="colorA" x1="0" y1="0" x2="0" y2="1">
<stop offset="5%" stopColor="rgb(var(--color-800))" stopOpacity={0.8}/>
<stop offset="95%" stopColor="rgb(var(--color-800))" stopOpacity={0.5}/>
</linearGradient>
<linearGradient id="colorB" x1="0" y1="0" x2="0" y2="1">
<stop offset="5%" stopColor="rgb(var(--color-500))" stopOpacity={0.4}/>
<stop offset="95%" stopColor="rgb(var(--color-500))" stopOpacity={0.1}/>
</linearGradient>
</defs>
<Area
name={label[0]}
stackId={(stack && stack[0]) ?? "1"}
isAnimationActive={false}
type="monotoneX"
dataKey="a"
stroke="rgb(var(--color-700))"
fillOpacity={1} fill="url(#colorA)"
/>
<Area
name={label[1]}
stackId={(stack && stack[1]) ?? "1"}
isAnimationActive={false}
type="monotoneX"
dataKey="b"
stroke="rgb(var(--color-500))"
fillOpacity={1} fill="url(#colorB)"
/>
<Tooltip
allowEscapeViewBox={{ x: false, y: false }}
formatter={formatter}
content={<CustomTooltip formatter={formatter} />}
classNames="rounded-md text-xs p-0.5"
contentStyle={{
backgroundColor: "rgb(var(--color-800))",
color: "rgb(var(--color-100))"
}}
/>
</AreaChart>
</ResponsiveContainer>
</div>
</div>
);
}
}
export default ChartDual;

View File

@@ -0,0 +1,9 @@
export default function Container({ children, className = "" }) {
return (
<div>
{children}
<div className={`absolute top-0 right-0 bottom-0 left-0 overflow-clip pointer-events-none ${className}`} />
<div className="h-[68px] overflow-clip" />
</div>
);
}

View File

@@ -0,0 +1,15 @@
export default function Tooltip({ active, payload, formatter }) {
if (active && payload && payload.length) {
return (
<div className="bg-theme-800/80 rounded-md text-theme-200 px-2 py-0">
{payload.map((pld, id) => (
<div key={Math.random()} className="first-of-type:pt-0 pt-0.5">
<div>{formatter(pld.value)} {payload[id].name}</div>
</div>
))}
</div>
);
}
return null;
};

View File

@@ -0,0 +1,9 @@
import { useTranslation } from "next-i18next";
export default function Error() {
const { t } = useTranslation();
return <div className="absolute bottom-2 left-2 z-20 text-red-400 text-xs opacity-75">
{t("widget.api_error")}
</div>;
}

View File

@@ -0,0 +1,91 @@
import dynamic from "next/dynamic";
import { useState, useEffect } from "react";
import { useTranslation } from "next-i18next";
import Error from "../components/error";
import Container from "../components/container";
import Block from "../components/block";
import useWidgetAPI from "utils/proxy/use-widget-api";
const Chart = dynamic(() => import("../components/chart"), { ssr: false });
const pointsLimit = 15;
export default function Component({ service }) {
const { t } = useTranslation();
const [dataPoints, setDataPoints] = useState(new Array(pointsLimit).fill({ value: 0 }, 0, pointsLimit));
const { data, error } = useWidgetAPI(service.widget, 'cpu', {
refreshInterval: 1000,
});
const { data: systemData, error: systemError } = useWidgetAPI(service.widget, 'system');
useEffect(() => {
if (data) {
setDataPoints((prevDataPoints) => {
const newDataPoints = [...prevDataPoints, { value: data.total }];
if (newDataPoints.length > pointsLimit) {
newDataPoints.shift();
}
return newDataPoints;
});
}
}, [data]);
if (error) {
return <Container><Error error={error} /></Container>;
}
if (!data) {
return <Container><Block position="bottom-3 left-3">-</Block></Container>;
}
return (
<Container>
<Chart
dataPoints={dataPoints}
label={[t("resources.used")]}
formatter={(value) => t("common.number", {
value,
style: "unit",
unit: "percent",
maximumFractionDigits: 0,
})}
/>
{systemData && !systemError && (
<Block position="bottom-3 left-3">
{systemData.linux_distro && (
<div className="text-xs opacity-50">
{systemData.linux_distro}
</div>
)}
{systemData.os_version && (
<div className="text-xs opacity-50">
{systemData.os_version}
</div>
)}
{systemData.hostname && (
<div className="text-xs opacity-75">
{systemData.hostname}
</div>
)}
</Block>
)}
<Block position="bottom-3 right-3">
<div className="text-xs font-bold opacity-75">
{t("common.number", {
value: data.total,
style: "unit",
unit: "percent",
maximumFractionDigits: 0,
})} {t("resources.used")}
</div>
</Block>
</Container>
);
}

View File

@@ -0,0 +1,102 @@
import dynamic from "next/dynamic";
import { useState, useEffect } from "react";
import { useTranslation } from "next-i18next";
import Error from "../components/error";
import Container from "../components/container";
import Block from "../components/block";
import useWidgetAPI from "utils/proxy/use-widget-api";
const ChartDual = dynamic(() => import("../components/chart_dual"), { ssr: false });
const pointsLimit = 15;
export default function Component({ service }) {
const { t } = useTranslation();
const { widget } = service;
const [, diskName] = widget.metric.split(':');
const [dataPoints, setDataPoints] = useState(new Array(pointsLimit).fill({ read_bytes: 0, write_bytes: 0, time_since_update: 0 }, 0, pointsLimit));
const [ratePoints, setRatePoints] = useState(new Array(pointsLimit).fill({ a: 0, b: 0 }, 0, pointsLimit));
const { data, error } = useWidgetAPI(service.widget, 'diskio', {
refreshInterval: 1000,
});
const calculateRates = (d) => d.map(item => ({
a: item.read_bytes / item.time_since_update,
b: item.write_bytes / item.time_since_update
}));
useEffect(() => {
if (data) {
const diskData = data.find((item) => item.disk_name === diskName);
setDataPoints((prevDataPoints) => {
const newDataPoints = [...prevDataPoints, diskData];
if (newDataPoints.length > pointsLimit) {
newDataPoints.shift();
}
return newDataPoints;
});
}
}, [data, diskName]);
useEffect(() => {
setRatePoints(calculateRates(dataPoints));
}, [dataPoints]);
if (error) {
return <Container><Error error={error} /></Container>;
}
if (!data) {
return <Container><Block position="bottom-3 left-3">-</Block></Container>;
}
const diskData = data.find((item) => item.disk_name === diskName);
if (!diskData) {
return <Container><Block position="bottom-3 left-3">-</Block></Container>;
}
const diskRates = calculateRates(dataPoints);
const currentRate = diskRates[diskRates.length - 1];
return (
<Container>
<ChartDual
dataPoints={ratePoints}
label={[t("glances.read"), t("glances.write")]}
max={diskData.critical}
formatter={(value) => t("common.bitrate", {
value,
})}
/>
{currentRate && !error && (
<Block position="bottom-3 left-3">
<div className="text-xs opacity-50">
{t("common.bitrate", {
value: currentRate.a,
})} {t("glances.read")}
</div>
<div className="text-xs opacity-50">
{t("common.bitrate", {
value: currentRate.b,
})} {t("glances.write")}
</div>
</Block>
)}
<Block position="bottom-3 right-3">
<div className="text-xs opacity-75">
{t("common.bitrate", {
value: currentRate.a + currentRate.b,
})}
</div>
</Block>
</Container>
);
}

View File

@@ -0,0 +1,104 @@
import dynamic from "next/dynamic";
import { useState, useEffect } from "react";
import { useTranslation } from "next-i18next";
import Error from "../components/error";
import Container from "../components/container";
import Block from "../components/block";
import useWidgetAPI from "utils/proxy/use-widget-api";
const ChartDual = dynamic(() => import("../components/chart_dual"), { ssr: false });
const pointsLimit = 15;
export default function Component({ service }) {
const { t } = useTranslation();
const { widget } = service;
const [, gpuName] = widget.metric.split(':');
const [dataPoints, setDataPoints] = useState(new Array(pointsLimit).fill({ a: 0, b: 0 }, 0, pointsLimit));
const { data, error } = useWidgetAPI(widget, 'gpu', {
refreshInterval: 1000,
});
useEffect(() => {
if (data) {
// eslint-disable-next-line eqeqeq
const gpuData = data.find((item) => item[item.key] == gpuName);
if (gpuData) {
setDataPoints((prevDataPoints) => {
const newDataPoints = [...prevDataPoints, { a: gpuData.mem, b: gpuData.proc }];
if (newDataPoints.length > pointsLimit) {
newDataPoints.shift();
}
return newDataPoints;
});
}
}
}, [data, gpuName]);
if (error) {
return <Container><Error error={error} /></Container>;
}
if (!data) {
return <Container><Block position="bottom-3 left-3">-</Block></Container>;
}
// eslint-disable-next-line eqeqeq
const gpuData = data.find((item) => item[item.key] == gpuName);
if (!gpuData) {
return <Container><Block position="bottom-3 left-3">-</Block></Container>;
}
return (
<Container>
<ChartDual
dataPoints={dataPoints}
label={[t("glances.mem"), t("glances.gpu")]}
stack={['mem', 'proc']}
formatter={(value) => t("common.percent", {
value,
maximumFractionDigits: 1,
})}
/>
<Block position="bottom-3 left-3">
{gpuData && gpuData.name && (
<div className="text-xs opacity-50">
{gpuData.name}
</div>
)}
<div className="text-xs opacity-75">
{t("common.number", {
value: gpuData.mem,
maximumFractionDigits: 1,
})}% {t("glances.mem")} {t("resources.used")}
</div>
</Block>
<Block position="bottom-3 right-3">
<div className="text-xs opacity-75">
{t("common.number", {
value: gpuData.proc,
maximumFractionDigits: 1,
})}% {t("glances.gpu")}
</div>
</Block>
<Block position="top-3 right-3">
<div className="text-xs opacity-75">
{t("common.number", {
value: gpuData.temperature,
maximumFractionDigits: 1,
})}&deg;
</div>
</Block>
</Container>
);
}

View File

@@ -0,0 +1,115 @@
import { useTranslation } from "next-i18next";
import Error from "../components/error";
import Container from "../components/container";
import Block from "../components/block";
import useWidgetAPI from "utils/proxy/use-widget-api";
export default function Component({ service }) {
const { t } = useTranslation();
const { data: quicklookData, errorL: quicklookError } = useWidgetAPI(service.widget, 'quicklook', {
refreshInterval: 1000,
});
const { data: systemData, errorL: systemError } = useWidgetAPI(service.widget, 'system', {
refreshInterval: 30000,
});
if (quicklookError) {
return <Container><Error error={quicklookError} /></Container>;
}
if (systemError) {
return <Container><Error error={systemError} /></Container>;
}
const dataCharts = [];
if (quicklookData) {
quicklookData.percpu.forEach((cpu, index) => {
dataCharts.push({
name: `CPU ${index}`,
cpu: cpu.total,
mem: quicklookData.mem,
swap: quicklookData.swap,
proc: quicklookData.cpu,
});
});
}
return (
<Container className="bg-gradient-to-br from-theme-500/30 via-theme-600/20 to-theme-700/10">
<Block position="top-3 right-3">
{quicklookData && quicklookData.cpu_name && (
<div className="text-[0.6rem] opacity-50">
{quicklookData.cpu_name}
</div>
)}
</Block>
<Block position="bottom-3 left-3">
{systemData && systemData.linux_distro && (
<div className="text-xs opacity-50">
{systemData.linux_distro}
</div>
)}
{systemData && systemData.os_version && (
<div className="text-xs opacity-50">
{systemData.os_version}
</div>
)}
{systemData && systemData.hostname && (
<div className="text-xs opacity-75">
{systemData.hostname}
</div>
)}
</Block>
<Block position="bottom-3 right-3 w-[4rem]">
{quicklookData && quicklookData.cpu && (
<div className="text-xs opacity-25 flex place-content-between">
<div>{t("glances.cpu")}</div>
<div className="opacity-75">
{t("common.number", {
value: quicklookData.cpu,
style: "unit",
unit: "percent",
maximumFractionDigits: 0,
})}
</div>
</div>
)}
{quicklookData && quicklookData.mem && (
<div className="text-xs opacity-25 flex place-content-between">
<div>{t("glances.mem")}</div>
<div className="opacity-75">
{t("common.number", {
value: quicklookData.mem,
style: "unit",
unit: "percent",
maximumFractionDigits: 0,
})}
</div>
</div>
)}
{quicklookData && quicklookData.swap && (
<div className="text-xs opacity-25 flex place-content-between">
<div>{t("glances.swap")}</div>
<div className="opacity-75">
{t("common.number", {
value: quicklookData.swap,
style: "unit",
unit: "percent",
maximumFractionDigits: 0,
})}
</div>
</div>
)}
</Block>
</Container>
);
}

View File

@@ -0,0 +1,88 @@
import dynamic from "next/dynamic";
import { useState, useEffect } from "react";
import { useTranslation } from "next-i18next";
import Error from "../components/error";
import Container from "../components/container";
import Block from "../components/block";
import useWidgetAPI from "utils/proxy/use-widget-api";
const ChartDual = dynamic(() => import("../components/chart_dual"), { ssr: false });
const pointsLimit = 15;
export default function Component({ service }) {
const { t } = useTranslation();
const [dataPoints, setDataPoints] = useState(new Array(pointsLimit).fill({ value: 0 }, 0, pointsLimit));
const { data, error } = useWidgetAPI(service.widget, 'mem', {
refreshInterval: 1000,
});
useEffect(() => {
if (data) {
setDataPoints((prevDataPoints) => {
const newDataPoints = [...prevDataPoints, { a: data.used, b: data.free }];
if (newDataPoints.length > pointsLimit) {
newDataPoints.shift();
}
return newDataPoints;
});
}
}, [data]);
if (error) {
return <Container><Error error={error} /></Container>;
}
if (!data) {
return <Container><Block position="bottom-3 left-3">-</Block></Container>;
}
return (
<Container>
<ChartDual
dataPoints={dataPoints}
max={data.total}
label={[t("resources.used"), t("resources.free")]}
formatter={(value) => t("common.bytes", {
value,
maximumFractionDigits: 0,
})}
/>
{data && !error && (
<Block position="bottom-3 left-3">
{data.free && (
<div className="text-xs opacity-50">
{t("common.bytes", {
value: data.free,
maximumFractionDigits: 0,
})} {t("resources.free")}
</div>
)}
{data.total && (
<div className="text-xs opacity-50">
{t("common.bytes", {
value: data.total,
maximumFractionDigits: 0,
})} {t("resources.total")}
</div>
)}
</Block>
)}
<Block position="bottom-3 right-3">
<div className="text-xs font-bold opacity-75">
{t("common.bytes", {
value: data.used,
maximumFractionDigits: 0,
})} {t("resources.used")}
</div>
</Block>
</Container>
);
}

View File

@@ -0,0 +1,92 @@
import dynamic from "next/dynamic";
import { useState, useEffect } from "react";
import { useTranslation } from "next-i18next";
import Error from "../components/error";
import Container from "../components/container";
import Block from "../components/block";
import useWidgetAPI from "utils/proxy/use-widget-api";
const ChartDual = dynamic(() => import("../components/chart_dual"), { ssr: false });
const pointsLimit = 15;
export default function Component({ service }) {
const { t } = useTranslation();
const { widget } = service;
const [, interfaceName] = widget.metric.split(':');
const [dataPoints, setDataPoints] = useState(new Array(pointsLimit).fill({ value: 0 }, 0, pointsLimit));
const { data, error } = useWidgetAPI(widget, 'network', {
refreshInterval: 1000,
});
useEffect(() => {
if (data) {
const interfaceData = data.find((item) => item[item.key] === interfaceName);
if (interfaceData) {
setDataPoints((prevDataPoints) => {
const newDataPoints = [...prevDataPoints, { a: interfaceData.tx, b: interfaceData.rx }];
if (newDataPoints.length > pointsLimit) {
newDataPoints.shift();
}
return newDataPoints;
});
}
}
}, [data, interfaceName]);
if (error) {
return <Container><Error error={error} /></Container>;
}
if (!data) {
return <Container><Block position="bottom-3 left-3">-</Block></Container>;
}
const interfaceData = data.find((item) => item[item.key] === interfaceName);
if (!interfaceData) {
return <Container><Block position="bottom-3 left-3">-</Block></Container>;
}
return (
<Container>
<ChartDual
dataPoints={dataPoints}
label={[t("docker.tx"), t("docker.rx")]}
formatter={(value) => t("common.byterate", {
value,
maximumFractionDigits: 0,
})}
/>
<Block position="bottom-3 left-3">
{interfaceData && interfaceData.interface_name && (
<div className="text-xs opacity-50">
{interfaceData.interface_name}
</div>
)}
<div className="text-xs opacity-75">
{t("common.bitrate", {
value: interfaceData.tx,
maximumFractionDigits: 0,
})} {t("docker.tx")}
</div>
</Block>
<Block position="bottom-3 right-3">
<div className="text-xs opacity-75">
{t("common.bitrate", {
value: interfaceData.rx,
maximumFractionDigits: 0,
})} {t("docker.rx")}
</div>
</Block>
</Container>
);
}

View File

@@ -0,0 +1,66 @@
import { useTranslation } from "next-i18next";
import Error from "../components/error";
import Container from "../components/container";
import Block from "../components/block";
import useWidgetAPI from "utils/proxy/use-widget-api";
import ResolvedIcon from "components/resolvedicon";
const statusMap = {
"R": <ResolvedIcon icon="mdi-circle" width={32} height={32} />, // running
"S": <ResolvedIcon icon="mdi-circle-outline" width={32} height={32} />, // sleeping
"D": <ResolvedIcon icon="mdi-circle-double" width={32} height={32} />, // disk sleep
"Z": <ResolvedIcon icon="mdi-circle-opacity" width={32} height={32} />, // zombie
"T": <ResolvedIcon icon="mdi-decagram-outline" width={32} height={32} />, // traced
"t": <ResolvedIcon icon="mdi-hexagon-outline" width={32} height={32} />, // traced
"X": <ResolvedIcon icon="mdi-rhombus-outline" width={32} height={32} />, // dead
};
export default function Component({ service }) {
const { t } = useTranslation();
const { data, error } = useWidgetAPI(service.widget, 'processlist', {
refreshInterval: 1000,
});
if (error) {
return <Container><Error error={error} /></Container>;
}
if (!data) {
return <Container><Block position="bottom-3 left-3">-</Block></Container>;
}
data.splice(5);
return (
<Container>
<Block position="top-4 right-3 left-3">
<div className="flex items-center text-xs">
<div className="grow" />
<div className="w-14 text-right italic">{t("resources.cpu")}</div>
<div className="w-14 text-right">{t("resources.mem")}</div>
</div>
</Block>
<Block position="bottom-4 right-3 left-3">
<div className="pointer-events-none text-theme-900 dark:text-theme-200">
{ data.map((item) => <div key={item.pid} className="text-[0.75rem] h-[0.8rem]">
<div className="flex items-center">
<div className="w-3 h-3 mr-1.5 opacity-50">
{statusMap[item.status]}
</div>
<div className="opacity-75 grow">{item.name}</div>
<div className="opacity-25 w-14 text-right">{item.cpu_percent.toFixed(1)}%</div>
<div className="opacity-25 w-14 text-right">{t("common.bytes", {
value: item.memory_info[0],
maximumFractionDigits: 0,
})}</div>
</div>
</div>) }
</div>
</Block>
</Container>
);
}

View File

@@ -0,0 +1,88 @@
import dynamic from "next/dynamic";
import { useState, useEffect } from "react";
import { useTranslation } from "next-i18next";
import Error from "../components/error";
import Container from "../components/container";
import Block from "../components/block";
import useWidgetAPI from "utils/proxy/use-widget-api";
const Chart = dynamic(() => import("../components/chart"), { ssr: false });
const pointsLimit = 15;
export default function Component({ service }) {
const { t } = useTranslation();
const { widget } = service;
const [, sensorName] = widget.metric.split(':');
const [dataPoints, setDataPoints] = useState(new Array(pointsLimit).fill({ value: 0 }, 0, pointsLimit));
const { data, error } = useWidgetAPI(service.widget, 'sensors', {
refreshInterval: 1000,
});
useEffect(() => {
if (data) {
const sensorData = data.find((item) => item.label === sensorName);
setDataPoints((prevDataPoints) => {
const newDataPoints = [...prevDataPoints, { value: sensorData.value }];
if (newDataPoints.length > pointsLimit) {
newDataPoints.shift();
}
return newDataPoints;
});
}
}, [data, sensorName]);
if (error) {
return <Container><Error error={error} /></Container>;
}
if (!data) {
return <Container><Block position="bottom-3 left-3">-</Block></Container>;
}
const sensorData = data.find((item) => item.label === sensorName);
if (!sensorData) {
return <Container><Block position="bottom-3 left-3">-</Block></Container>;
}
return (
<Container>
<Chart
dataPoints={dataPoints}
label={[sensorData.unit]}
max={sensorData.critical}
formatter={(value) => t("common.number", {
value,
})}
/>
{sensorData && !error && (
<Block position="bottom-3 left-3">
{sensorData.warning && (
<div className="text-xs opacity-50">
{sensorData.warning}{sensorData.unit} {t("glances.warn")}
</div>
)}
{sensorData.critical && (
<div className="text-xs opacity-50">
{sensorData.critical} {sensorData.unit} {t("glances.crit")}
</div>
)}
</Block>
)}
<Block position="bottom-3 right-3">
<div className="text-xs opacity-75">
{t("common.number", {
value: sensorData.value,
})} {sensorData.unit}
</div>
</Block>
</Container>
);
}

View File

@@ -0,0 +1,8 @@
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
const widget = {
api: "{url}/api/3/{endpoint}",
proxyHandler: credentialedProxyHandler,
};
export default widget;

View File

@@ -41,7 +41,12 @@ export default function Component({ service }) {
return <Container service={service} error={statusError} />;
}
const source = statusData?.sources[0];
const snapshotHost = service.widget?.snapshotHost;
const snapshotPath = service.widget?.snapshotPath;
const source = statusData?.sources
.filter(el => snapshotHost ? el.source.host === snapshotHost : true)
.filter(el => snapshotPath ? el.source.path === snapshotPath : true)[0];
if (!statusData || !source) {
return (

View File

@@ -4,6 +4,7 @@ import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
import useWidgetAPI from "utils/proxy/use-widget-api";
function calcRunning(total, current) {
return current.status === "running" ? total + 1 : total;
}
@@ -25,29 +26,40 @@ export default function Component({ service }) {
<Block label="proxmox.vms" />
<Block label="proxmox.lxc" />
<Block label="resources.cpu" />
<Block label="resources.ram" />
<Block label="resources.mem" />
</Container>
);
}
const { data } = clusterData ;
const vms = data.filter(item => item.type === "qemu" && item.template === 0) || [];
const lxc = data.filter(item => item.type === "lxc" && item.template === 0) || [];
const nodes = data.filter(item => item.type === "node") || [];
const vms = data.filter(item => item.type === "qemu" && item.template === 0 && (widget.node === undefined || widget.node === item.node)) || [];
const lxc = data.filter(item => item.type === "lxc" && item.template === 0 && (widget.node === undefined || widget.node === item.node)) || [];
const nodes = data.filter(item => item.type === "node" && (widget.node === undefined || widget.node === item.node)) || [];
const runningVMs = vms.reduce(calcRunning, 0);
const runningLXC = lxc.reduce(calcRunning, 0);
// TODO: support more than one node
// TODO: better handling of cluster with zero nodes
const node = nodes.length > 0 ? nodes[0] : { cpu: 0.0, mem: 0, maxmem: 0 };
if (nodes.length === 0) {
return (
<Container service={service}>
<Block label="proxmox.vms" value={`${runningVMs} / ${vms.length}`} />
<Block label="proxmox.lxc" value={`${runningLXC} / ${lxc.length}`} />
<Block label="resources.cpu" />
<Block label="resources.mem" />
</Container>
);
}
const maxMemory = nodes.reduce((sum, n) => n.maxmem + sum, 0);
const usedMemory = nodes.reduce((sum, n) => n.mem + sum, 0);
const maxCpu = nodes.reduce((sum, n) => n.maxcpu + sum, 0);
const usedCpu = nodes.reduce((sum, n) => (n.cpu * n.maxcpu) + sum, 0);
return (
<Container service={service}>
<Block label="proxmox.vms" value={`${runningVMs} / ${vms.length}`} />
<Block label="proxmox.lxc" value={`${runningLXC} / ${lxc.length}`} />
<Block label="resources.cpu" value={t("common.percent", { value: (node.cpu * 100) })} />
<Block label="resources.mem" value={t("common.percent", { value: ((node.mem / node.maxmem) * 100) })} />
<Block label="resources.cpu" value={t("common.percent", { value: ((usedCpu / maxCpu) * 100) })} />
<Block label="resources.mem" value={t("common.percent", { value: ((usedMemory / maxMemory) * 100) })} />
</Container>
);
}

View File

@@ -0,0 +1,93 @@
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";
const Status = Object.freeze({
ok: Symbol("Ok"),
errored: Symbol("Errored"),
noRecent: Symbol("No Recent Backups")
});
function hasRecentBackups(client, maxDays){
const days = maxDays || 3;
const diffTime = days*24*60*60 // 7 days
const recentFile = (client.lastbackup > (Date.now() / 1000 - diffTime));
const recentImage = ((client.lastbackup_image > (Date.now() / 1000 - diffTime)||client.image_not_supported));
return (recentFile && recentImage);
}
function determineStatuses(urbackupData) {
let ok = 0;
let errored = 0;
let noRecent = 0;
let status;
urbackupData.clientStatuses.forEach((client) => {
status = Status.noRecent;
if (hasRecentBackups(client, urbackupData.maxDays)) {
status = (client.file_ok && (client.image_ok || client.image_not_supported)) ? Status.ok : Status.errored;
}
switch (status) {
case Status.ok:
ok += 1;
break;
case Status.errored:
errored += 1;
break;
case Status.noRecent:
noRecent += 1;
break;
default:
break;
}
});
let totalUsage = false;
// calculate total disk space if provided
if (urbackupData.diskUsage) {
totalUsage = 0.0;
urbackupData.diskUsage.forEach((client) => {
totalUsage += client.used;
});
}
return { ok, errored, noRecent, totalUsage };
}
export default function Component({ service }) {
const { t } = useTranslation();
const { widget } = service;
const showDiskUsage = widget.fields?.includes('totalUsed')
const { data: urbackupData, error: urbackupError } = useWidgetAPI(widget, "status");
if (urbackupError) {
return <Container service={service} error={urbackupError} />;
}
if (!urbackupData) {
return (
<Container service={service}>
<Block label="urbackup.ok" />
<Block label="urbackup.errored" />
<Block label="urbackup.noRecent" />
{showDiskUsage && <Block label="urbackup.totalUsed" />}
</Container>
);
}
const statusData = determineStatuses(urbackupData, widget);
return (
<Container service={service}>
<Block label="urbackup.ok" value={t("common.number", { value: parseInt(statusData.ok, 10) })} />
<Block label="urbackup.errored" value={t("common.number", { value: parseInt(statusData.errored, 10) })} />
<Block label="urbackup.noRecent" value={t("common.number", { value: parseInt(statusData.noRecent, 10) })} />
{showDiskUsage && <Block label="urbackup.totalUsed" value={t("common.bbytes", {value: parseFloat(statusData.totalUsage, 10)})} />}
</Container>
);
}

View File

@@ -0,0 +1,33 @@
import {UrbackupServer} from "urbackup-server-api";
import getServiceWidget from "utils/config/service-helpers";
export default async function urbackupProxyHandler(req, res) {
const {group, service} = req.query;
const serviceWidget = await getServiceWidget(group, service);
const server = new UrbackupServer({
url: serviceWidget.url,
username: serviceWidget.username,
password: serviceWidget.password
});
await (async () => {
try {
const allClients = await server.getStatus({includeRemoved: false});
let diskUsage = false
if (serviceWidget.fields?.includes("totalUsed")) {
diskUsage = await server.getUsage();
}
res.status(200).send({
clientStatuses: allClients,
diskUsage,
maxDays: serviceWidget.maxDays
});
} catch (error) {
res.status(500).json({ error: "Something Broke" })
}
})();
}

View File

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

View File

@@ -2,6 +2,7 @@ import adguard from "./adguard/widget";
import audiobookshelf from "./audiobookshelf/widget";
import authentik from "./authentik/widget";
import autobrr from "./autobrr/widget";
import azuredevops from "./azuredevops/widget";
import bazarr from "./bazarr/widget";
import caddy from "./caddy/widget";
import changedetectionio from "./changedetectionio/widget";
@@ -16,7 +17,9 @@ import evcc from "./evcc/widget";
import fileflows from "./fileflows/widget";
import flood from "./flood/widget";
import freshrss from "./freshrss/widget";
import gamedig from "./gamedig/widget";
import ghostfolio from "./ghostfolio/widget";
import glances from "./glances/widget";
import gluetun from "./gluetun/widget";
import gotify from "./gotify/widget";
import grafana from "./grafana/widget";
@@ -85,12 +88,14 @@ import uptimekuma from "./uptimekuma/widget";
import watchtower from "./watchtower/widget";
import whatsupdocker from "./whatsupdocker/widget";
import xteve from "./xteve/widget";
import urbackup from "./urbackup/widget";
const widgets = {
adguard,
audiobookshelf,
authentik,
autobrr,
azuredevops,
bazarr,
caddy,
changedetectionio,
@@ -105,7 +110,9 @@ const widgets = {
fileflows,
flood,
freshrss,
gamedig,
ghostfolio,
glances,
gluetun,
gotify,
grafana,
@@ -173,6 +180,7 @@ const widgets = {
unifi_console: unifi,
unmanic,
uptimekuma,
urbackup,
watchtower,
whatsupdocker,
xteve,