Compare commits

..
271 Commits
Author SHA1 Message Date
shamoon 63a56225bb Merge pull request #1777 from benphelps/fix/issue-1774
Fix glances metrics widget memory units
2023-08-03 21:28:26 -07:00
shamoon 952c72a3a5 Fix glances metrics widget memory units 2023-08-03 21:27:30 -07:00
Nick Remijnandshamoon 552f2c4a98 Feature: card blur background option (#1772)
* Add cardBlur option to settings

* add blur option to bookmarks

---------

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2023-08-03 21:09:35 -07:00
shamoon ec165b8c74 Merge pull request #1771 from benphelps/fix/issue-1766
Fix: Handle urbackup clients with images disabled
2023-08-03 08:51:44 -07:00
shamoon cf05a85ad6 Handle urbackup clients with images disabled 2023-08-03 08:50:45 -07:00
shamoon 69d828ec8e Merge pull request #1770 from benphelps/fix/issue-1768
Fix: glances widget disk loading blocks remain after load
2023-08-03 08:37:16 -07:00
shamoon b6072200a2 Fix incorrect disk key on loading block 2023-08-03 08:34:21 -07:00
Nonoss117 fab975062d Translated using Weblate (French)
Currently translated at 100.0% (500 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-08-03 06:53:52 +02:00
gallegonovato 5f01196b21 Translated using Weblate (Spanish)
Currently translated at 99.8% (499 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-08-03 06:53:52 +02:00
shamoon 2faaaf5a9c Merge pull request #1763 from jnsgruk/main
chore: update package-lock.json
2023-08-02 17:54:12 -07:00
Jon Seager 8d91aeaf9d chore: update package-lock.json 2023-08-02 17:34:21 +01:00
shamoon 2609694dd7 Merge pull request #1762 from benphelps/fix/issue-1757
Fix: handle service container stopped causes crash in v0.6.24
2023-08-02 08:05:26 -07:00
shamoon 9c5521ba35 Fix: handle service object not found 2023-08-02 08:04:16 -07:00
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 Donchezandshamoon 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
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-Voltiandshamoon 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
Mark Walet 43b5263f41 Improve proxmox widget 2023-07-13 18:39:11 +02:00
101 changed files with 4940 additions and 548 deletions

No files matched your search

+1 -1
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
+964 -6
View File
File diff suppressed because it is too large. Load diff
+3
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"
},
+675 -5
View File
File diff suppressed because it is too large. Load diff
+35 -1
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"
}
}
+35 -1
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"
}
}
+35 -1
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"
}
}
+35 -1
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"
}
}
+35 -1
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"
}
}
+35 -1
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"
}
}
+35 -1
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"
}
}
+35 -1
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"
}
}
+35 -1
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"
}
}
+35 -1
View File
@@ -248,7 +248,13 @@
"warn": "Advertir",
"total": "Total",
"free": "Libre",
"used": "Utilizado"
"used": "Utilizado",
"crit": "Crit",
"read": "Leer",
"write": "Escribir",
"gpu": "GPU",
"mem": "Memoria",
"swap": "Intercambiar"
},
"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"
}
}
+35 -1
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"
}
}
+35 -1
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"
}
}
+35 -1
View File
@@ -248,7 +248,13 @@
"warn": "Alerte",
"total": "Total",
"free": "Libre",
"used": "Utilisé"
"used": "Utilisé",
"crit": "Crit.",
"read": "Lect.",
"write": "Écrit.",
"gpu": "GPU",
"mem": "Mém.",
"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é"
}
}
+35 -1
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"
}
}
+35 -1
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"
}
}
+36 -2
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"
}
}
+354 -320
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": "hó",
"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érjük 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": "Hó",
"73-night": "Hó",
"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"
}
}
+41 -7
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"
}
}
+35 -1
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"
}
}
+35 -1
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"
}
}
+35 -1
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"
}
}
+35 -1
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"
}
}
+35 -1
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"
}
}
+35 -1
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"
}
}
+35 -1
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"
}
}
+35 -1
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"
}
}
+84 -50
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"
}
}
+35 -1
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"
}
}
+35 -1
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"
}
}
+35 -1
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"
}
}
+35 -1
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"
}
}
+35 -1
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"
}
}
+35 -1
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"
}
}
+35 -1
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"
}
}
+35 -1
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"
}
}
+35 -1
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"
}
}
+35 -1
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"
}
}
+35 -1
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"
}
}
+35 -1
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"
}
}
+35 -1
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"
}
}
+35 -1
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"
}
}
+35 -1
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"
}
}
+16 -9
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>
+9 -2
View File
@@ -1,4 +1,5 @@
import { useContext } from "react";
import classNames from "classnames";
import { SettingsContext } from "utils/contexts/settings";
import ResolvedIcon from "components/resolvedicon";
@@ -16,7 +17,10 @@ export default function Item({ bookmark }) {
className="block w-full text-left cursor-pointer transition-all h-15 mb-3 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"
>
<div className="flex">
<div className="flex-shrink-0 flex items-center justify-center w-11 bg-theme-500/10 dark:bg-theme-900/50 text-theme-700 hover:text-theme-700 dark:text-theme-200 text-sm font-medium rounded-l-md">
<div className={classNames(
settings.cardBlur !== undefined && `backdrop-blur${settings.cardBlur.length ? '-' : ""}${settings.cardBlur}`,
"flex-shrink-0 flex items-center justify-center w-11 bg-theme-500/10 dark:bg-theme-900/50 text-theme-700 hover:text-theme-700 dark:text-theme-200 text-sm font-medium rounded-l-md"
)}>
{bookmark.icon &&
<div className="flex-shrink-0 w-5 h-5">
<ResolvedIcon icon={bookmark.icon} alt={bookmark.abbr} />
@@ -24,7 +28,10 @@ export default function Item({ bookmark }) {
}
{!bookmark.icon && bookmark.abbr}
</div>
<div className="flex-1 flex items-center justify-between rounded-r-md ">
<div className={classNames(
settings.cardBlur !== undefined && `backdrop-blur${settings.cardBlur.length ? '-' : ""}${settings.cardBlur}`,
"flex-1 flex items-center justify-between rounded-r-md"
)}>
<div className="flex-1 grow pl-3 py-2 text-xs">{bookmark.name}</div>
<div className="px-2 py-2 truncate text-theme-500 dark:text-theme-300 text-xs">{hostname}</div>
</div>
+1 -1
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",
+15 -7
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")) {
+17 -9
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>
+9 -7
View File
@@ -32,11 +32,13 @@ export default function Item({ service, group }) {
return (
<li key={service.name}>
<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`}
className={classNames(
settings.cardBlur !== undefined && `backdrop-blur${settings.cardBlur.length ? '-' : ""}${settings.cardBlur}`,
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 overflow-clip'
)}
>
<div className="flex select-none">
<div className="flex select-none z-0">
{service.icon &&
(hasLink ? (
<a
@@ -60,21 +62,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} />
+2 -1
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 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
+3 -3
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}`} 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 ?? disk.device_name}`}
icon={FiHardDrive}
value={t("common.bytes", { value: disk.free })}
label={t("glances.free")}
+3 -1
View File
@@ -8,7 +8,9 @@ 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
<div className="w-12 h-12">
<svg
@@ -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" />;
}
@@ -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>;
}
@@ -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" />;
}
@@ -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>;
}
+2 -2
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) {
+2 -2
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) {
+2 -2
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) {
+2 -2
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) {
@@ -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>
+2 -2
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) {
-7
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" />;
}
+4 -7
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>;
}
+1 -1
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>;
@@ -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} />;
}
+22 -1
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;
+1 -1
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) {
+5
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}`;
}
+2 -2
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",
},
},
};
+65
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>
);
}
+18
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;
+4
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")),
+59
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>
);
}
+37
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
});
}
}
+7
View File
@@ -0,0 +1,7 @@
import gamedigProxyHandler from "./proxy";
const widget = {
proxyHandler: gamedigProxyHandler
}
export default widget;
+44
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} />;
}
}
+7
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>
);
}
+48
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;
@@ -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;
@@ -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>
);
}
@@ -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;
};
+9
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>;
}
+91
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>
);
}
+102
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>
);
}
+104
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>
);
}
+115
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>
);
}
+92
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 [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,
binary: true,
})}
/>
{data && !error && (
<Block position="bottom-3 left-3">
{data.free && (
<div className="text-xs opacity-50">
{t("common.bytes", {
value: data.free,
maximumFractionDigits: 0,
binary: true,
})} {t("resources.free")}
</div>
)}
{data.total && (
<div className="text-xs opacity-50">
{t("common.bytes", {
value: data.total,
maximumFractionDigits: 0,
binary: true,
})} {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,
binary: true,
})} {t("resources.used")}
</div>
</Block>
</Container>
);
}
+92
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>
);
}
+66
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>
);
}
+88
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>
);
}
+8
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;
+6 -1
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 (
+22 -10
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>
);
}
+93
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.image_not_supported || client.image_disabled || (client.lastbackup_image > (Date.now() / 1000 - diffTime));
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 || client.image_disabled)) ? 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>
);
}
+33
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: "Error communicating with UrBackup server" })
}
})();
}
+7
View File
@@ -0,0 +1,7 @@
import urbackupProxyHandler from "./proxy";
const widget = {
proxyHandler: urbackupProxyHandler,
};
export default widget;
Loaded 100 of 101 files, more files were not shown because too many files have changed in this diff. Show more