Compare commits

..

431 Commits

Author SHA1 Message Date
Anonymous
62e294a715 Translated using Weblate (Basque)
Currently translated at 6.6% (33 of 494 strings)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

* Add support for reporting total disk usage

* add support for "fields" from services.yaml

* fix field filtering, syntax

* Consolidate urbackup code, syntax changes

* Revert pnpm changes

* re-add urbackup-server-api

---------

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

* add creatorId

* rename azurePullrequests->azurePullRequests

* pass creatorId to FE

* expose userEmail to frontend

* tolower

* remove unused code

* merge to AzureDevOps

* fix userEmail

* remove whitespace in const and set true endpoint in widget

* use widget params in endpoint

* change approvedNotCompleted to Approved

* change to lower

* rename

* rename

* merge widgets together

* limit pipeline result to 1 result

* Better handle azuredevops PR call failures

* change to have repositoryId and not branchName

* Fix field filtering, avoid PR call if not needed

---------

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Adding Counter-Strike: Global Offensive (CSGO) widget

* Changed to GameDig

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

* Limited widget displayed fields to 4

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

Add custom refresh rate to uptime

Add custom refresh rate to memory

Add custom refresh rate to disk

Add custom refresh rate to cputemp

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

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

* Streamline code for custom icon colors in resolvedicon.jsx 

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

* Update resolvedicon.jsx

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

* Update resolvedicon.jsx - test for custom color suffix

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

* Update resolvedicon.jsx - DRY

Removed repetition, slimmed down if statement.

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

* Update resolvedicon.jsx - upper case color hex codes

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

* Refactor custom color code

---------

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-07-20 22:06:57 +02:00
shamoon
6e581913ea Merge pull request #1676 from markwalet/improve-proxmox
Improve proxmox
2023-07-20 06:12:40 -07:00
shamoon
77ac06993b Merge pull request #1699 from benphelps/fix/errors-in-1603
Fix more errors from PR #1603
2023-07-19 23:44:46 -07:00
shamoon
08ac9fe7c9 Fix glances widget key warnings 2023-07-19 23:43:23 -07:00
shamoon
6ceaf3686c Fix weather icon DOM warnings 2023-07-19 23:43:23 -07:00
shamoon
82c54f197d Merge pull request #1698 from benphelps/fix/issue-1697
Fixes oversized logo in 0.6.22
2023-07-19 22:58:58 -07:00
shamoon
597a8d8b9a Fixes oversized logo 2023-07-19 22:56:11 -07:00
Dan
2aeb3f4c89 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (472 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-07-18 17:02:15 +02:00
Ash Ed
29f3217abb Translated using Weblate (Russian)
Currently translated at 90.2% (426 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-07-18 17:02:15 +02:00
gallegonovato
7f83623ded Translated using Weblate (Spanish)
Currently translated at 100.0% (472 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-07-16 12:00:52 +02:00
Nonoss117
2843ae3f79 Translated using Weblate (French)
Currently translated at 100.0% (472 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-07-15 08:48:03 +02:00
Anonymous
ba1b075cb8 Translated using Weblate (Basque)
Currently translated at 6.9% (33 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eu/
2023-07-14 08:21:59 +02:00
Anonymous
f063e20dab Translated using Weblate (Indonesian)
Currently translated at 3.1% (15 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/id/
2023-07-14 08:21:59 +02:00
Anonymous
176b8fe6a9 Translated using Weblate (Slovenian)
Currently translated at 99.7% (471 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/
2023-07-14 08:21:59 +02:00
Anonymous
d71893903e Translated using Weblate (Greek)
Currently translated at 30.2% (143 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-07-14 08:21:58 +02:00
Anonymous
84d82309b0 Translated using Weblate (Korean)
Currently translated at 36.6% (173 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ko/
2023-07-14 08:21:58 +02:00
Anonymous
d7f6113fd9 Translated using Weblate (Slovak)
Currently translated at 1.9% (9 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sk/
2023-07-14 08:21:58 +02:00
Anonymous
cacdd2348a Translated using Weblate (Thai)
Currently translated at 9.9% (47 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/th/
2023-07-14 08:21:58 +02:00
Anonymous
f091f8a6ad Translated using Weblate (Latvian)
Currently translated at 25.0% (118 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-07-14 08:21:57 +02:00
Anonymous
5636537998 Translated using Weblate (Japanese)
Currently translated at 81.5% (385 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-07-14 08:21:57 +02:00
Anonymous
d49c3dfa06 Translated using Weblate (Ukrainian)
Currently translated at 99.7% (471 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-07-14 08:21:57 +02:00
Anonymous
d612c0073b Translated using Weblate (Esperanto)
Currently translated at 30.7% (145 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-07-14 08:21:57 +02:00
Anonymous
36e63e9736 Translated using Weblate (Hindi)
Currently translated at 1.9% (9 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-07-14 08:21:56 +02:00
Anonymous
328fd8b6b6 Translated using Weblate (Malay)
Currently translated at 53.1% (251 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-07-14 08:21:56 +02:00
Anonymous
5ef4638d88 Translated using Weblate (Danish)
Currently translated at 41.7% (197 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-07-14 08:21:56 +02:00
Anonymous
2251b0cb3e Translated using Weblate (Czech)
Currently translated at 94.0% (444 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-07-14 08:21:55 +02:00
Anonymous
d97e729e41 Translated using Weblate (Arabic)
Currently translated at 55.5% (262 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-07-14 08:21:55 +02:00
Anonymous
b6e8952d82 Translated using Weblate (Serbian)
Currently translated at 1.9% (9 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-07-14 08:21:55 +02:00
Anonymous
3d18618fc1 Translated using Weblate (Turkish)
Currently translated at 83.2% (393 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-07-14 08:21:55 +02:00
Anonymous
cc4bf9d221 Translated using Weblate (Bulgarian)
Currently translated at 9.7% (46 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-07-14 08:21:54 +02:00
Anonymous
96e9a5cc72 Translated using Weblate (Telugu)
Currently translated at 45.5% (215 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-07-14 08:21:54 +02:00
Anonymous
a8bb116ea1 Translated using Weblate (Finnish)
Currently translated at 37.5% (177 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-07-14 08:21:54 +02:00
Anonymous
7f8b66f72d Translated using Weblate (Yue (Traditional))
Currently translated at 24.7% (117 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue_Hant/
2023-07-14 08:21:54 +02:00
Anonymous
44fbc31dd6 Translated using Weblate (Portuguese (Brazil))
Currently translated at 85.5% (404 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-07-14 08:21:53 +02:00
Anonymous
449d170430 Translated using Weblate (Romanian)
Currently translated at 31.7% (150 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-07-14 08:21:53 +02:00
Anonymous
e34fd362d2 Translated using Weblate (Hebrew)
Currently translated at 21.1% (100 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-07-14 08:21:53 +02:00
Anonymous
e4392fc821 Translated using Weblate (Hungarian)
Currently translated at 25.4% (120 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-07-14 08:21:53 +02:00
Anonymous
4dc4ba9b2c Translated using Weblate (Croatian)
Currently translated at 99.3% (469 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-07-14 08:21:52 +02:00
Anonymous
9b33d1acf1 Translated using Weblate (Swedish)
Currently translated at 27.9% (132 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-07-14 08:21:52 +02:00
Anonymous
160352d436 Translated using Weblate (Polish)
Currently translated at 79.2% (374 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-07-14 08:21:52 +02:00
Anonymous
b3e9bb6cc2 Translated using Weblate (Catalan)
Currently translated at 55.0% (260 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-07-14 08:21:52 +02:00
Anonymous
ad1a3f8395 Translated using Weblate (Chinese (Traditional))
Currently translated at 97.4% (460 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-07-14 08:21:51 +02:00
Anonymous
b4af77d3c4 Translated using Weblate (Dutch)
Currently translated at 51.0% (241 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-07-14 08:21:51 +02:00
Anonymous
95f1c31e9c Translated using Weblate (Vietnamese)
Currently translated at 9.3% (44 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-07-14 08:21:51 +02:00
Anonymous
3b2f7561be Translated using Weblate (Norwegian Bokmål)
Currently translated at 16.9% (80 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-07-14 08:21:51 +02:00
Anonymous
2deae19940 Translated using Weblate (Italian)
Currently translated at 99.5% (470 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-07-14 08:21:50 +02:00
Anonymous
4e4e366e4e Translated using Weblate (Chinese (Simplified))
Currently translated at 94.0% (444 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-07-14 08:21:50 +02:00
Anonymous
de6e777312 Translated using Weblate (Russian)
Currently translated at 87.5% (413 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-07-14 08:21:50 +02:00
Anonymous
bd467ab01f Translated using Weblate (Portuguese)
Currently translated at 87.9% (415 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-07-14 08:21:50 +02:00
Anonymous
376ab9a6f3 Translated using Weblate (French)
Currently translated at 99.7% (471 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-07-14 08:21:49 +02:00
Anonymous
48f9bf4f7e Translated using Weblate (Spanish)
Currently translated at 99.7% (471 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-07-14 08:21:49 +02:00
Anonymous
23fd4a5a73 Translated using Weblate (German)
Currently translated at 96.8% (457 of 472 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-07-14 08:21:49 +02:00
shamoon
5a7e97222c Merge pull request #1685 from jonathann92/fix-tautulli-sort
Fix: Handle tautulli response when unable to connect to Plex
2023-07-13 23:19:11 -07:00
shamoon
7844991617 Show plex connection error 2023-07-13 23:03:10 -07:00
shamoon
ae4a2e3cf6 Merge pull request #1684 from benphelps/feature-coinmarketcap-slugs
Feature: support coinmarketcap slugs
2023-07-13 22:41:51 -07:00
jonathann92
aeac95db48 early exit if tautulli's data is an empty object
Fix for when tautulli cannot reach to plex
2023-07-13 22:08:00 -07:00
shamoon
1e60553904 Allow coinmarketcap slugs 2023-07-13 21:39:45 -07:00
shamoon
276edb2069 Better handle invalid coinmarketcap data 2023-07-13 17:14:47 -07:00
Mark Walet
43b5263f41 Improve proxmox widget 2023-07-13 18:39:11 +02:00
alpine8
d75505acc8 Translated using Weblate (Norwegian Bokmål)
Currently translated at 16.9% (80 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-07-12 02:52:27 +02:00
shamoon
2d8af6eaf6 Merge pull request #1673 from jnsgruk/conf-dir-override
Override config directory with env var.
2023-07-10 20:54:38 -07:00
antaanimosity
9f4ac4e41e Translated using Weblate (Basque)
Currently translated at 7.0% (33 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eu/
2023-07-10 21:48:24 +02:00
Jon Seager
ca396ce96b Override config directory with env var.
Until this change, the config directory was assumed
to be located at '/config'. This patch retains that
default behaviour, but enables users/devs to override
that behaviour by setting the HOMEPAGE_CONFIG_DIR
variable.
2023-07-10 15:48:51 +01:00
Anonymous
9c0bd8b07a Translated using Weblate (Basque)
Currently translated at 100.0% (0 of 0 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eu/
2023-07-09 20:32:29 +02:00
Smexhy
885058dd41 Translated using Weblate (Czech)
Currently translated at 94.2% (444 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-07-09 20:32:27 +02:00
antaanimosity
c6b6b4d71b Added translation using Weblate (Basque) 2023-07-09 20:31:43 +02:00
Andrej Kralj
8f953c0d16 Translated using Weblate (Slovenian)
Currently translated at 100.0% (471 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/
2023-07-06 13:47:58 +02:00
shamoon
d1f83c0359 Update http.js 2023-07-03 22:12:17 -07:00
shamoon
eb9721334d Merge pull request #1656 from nathan-sankbeil/fix/gzip
Handle missing EOF when decompressing responses
2023-07-03 22:10:50 -07:00
Vincenzo
2279dd37f0 Translated using Weblate (Italian)
Currently translated at 100.0% (471 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-07-03 22:30:47 +02:00
Nonoss117
10d9b2d831 Translated using Weblate (French)
Currently translated at 100.0% (471 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-07-03 22:30:45 +02:00
Denis Papec
1cda437120 Translated using Weblate (English)
Currently translated at 100.0% (471 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/en/
2023-07-03 22:30:44 +02:00
nsankbeil
5640798fe4 fix: handle missing EOF when decompressing response
Closes: #1609
2023-07-03 11:49:16 -04:00
My Random Thoughts
1439b6cc9c Translated using Weblate (English)
Currently translated at 100.0% (471 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/en/
2023-07-01 12:41:42 +02:00
shamoon
2e892ac906 Merge pull request #1640 from benphelps/feature/handle-invalid-service-fields
Handle invalid fields syntax in service labels
2023-06-28 08:50:04 -07:00
shamoon
a2fe1eef7a Handle invalid fields syntax in service labels 2023-06-28 08:49:25 -07:00
Milo Ivir
b04ed36adb Translated using Weblate (Croatian)
Currently translated at 99.5% (469 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-06-26 21:50:38 +02:00
Ado Nishimura
d734343b31 Translated using Weblate (Japanese)
Currently translated at 81.7% (385 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-06-23 17:53:02 +02:00
Dan
8ad0c9c171 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (471 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-06-23 17:53:02 +02:00
Nonoss117
b9edea5286 Translated using Weblate (French)
Currently translated at 100.0% (471 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-06-23 17:53:01 +02:00
Y0plait
27baf17e08 Translated using Weblate (French)
Currently translated at 100.0% (471 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-06-23 17:53:01 +02:00
gallegonovato
2a4c449b77 Translated using Weblate (Spanish)
Currently translated at 100.0% (471 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-06-23 17:53:00 +02:00
shamoon
04d9ceed1a Merge pull request #1629 from benphelps/collapsible-bookmarks
Feature: add collapsible feature to bookmarks
2023-06-22 11:52:07 -07:00
shamoon
b32d610532 Adds collapsible feature to bookmarks 2023-06-22 11:51:38 -07:00
shamoon
1b6e5c4a8d Update group.jsx 2023-06-22 11:51:12 -07:00
shamoon
33492bda3a Merge pull request #1626 from ionyx0/main
Feature: collapsible layout sections
2023-06-22 11:45:00 -07:00
shamoon
714e0a4517 Use Disclosure component for collapsible service groups, add transition
hide collapse arrow if disabled

dont break layout for icons in group title

no-shadow
2023-06-22 10:46:39 -07:00
Alex Higgins
041fae1fb3 Adds ability to collapse layout sections
Reverts pnpm lock file changes

Make entire section above list clickable.

Implement in headlessui instead of pulling in new library.

Remove unecessary packages and clean up ESLint errors
2023-06-22 10:00:04 -07:00
shamoon
0936ba2b6b Update package-lock.json 2023-06-22 09:57:21 -07:00
Anonymous
1d78881a5f Translated using Weblate (Indonesian)
Currently translated at 3.1% (15 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/id/
2023-06-20 19:47:24 +02:00
Anonymous
60463721b8 Translated using Weblate (Slovenian)
Currently translated at 95.3% (449 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/
2023-06-20 19:47:23 +02:00
Anonymous
68f755710e Translated using Weblate (Greek)
Currently translated at 30.3% (143 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-06-20 19:47:23 +02:00
Anonymous
84d12b0b21 Translated using Weblate (Korean)
Currently translated at 36.7% (173 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ko/
2023-06-20 19:47:23 +02:00
Anonymous
0598b8bcf5 Translated using Weblate (Slovak)
Currently translated at 1.9% (9 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sk/
2023-06-20 19:47:22 +02:00
Anonymous
ebca1050c4 Translated using Weblate (Thai)
Currently translated at 9.9% (47 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/th/
2023-06-20 19:47:22 +02:00
Anonymous
cc92890dca Translated using Weblate (Latvian)
Currently translated at 25.0% (118 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-06-20 19:47:22 +02:00
Anonymous
768db388cb Translated using Weblate (Japanese)
Currently translated at 81.5% (384 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-06-20 19:47:21 +02:00
Anonymous
03276eced4 Translated using Weblate (Ukrainian)
Currently translated at 99.5% (469 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-06-20 19:47:21 +02:00
Anonymous
2e34ab9f1e Translated using Weblate (Esperanto)
Currently translated at 30.7% (145 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-06-20 19:47:21 +02:00
Anonymous
c997b2c87c Translated using Weblate (Hindi)
Currently translated at 1.9% (9 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-06-20 19:47:20 +02:00
Anonymous
ef1be0bb3f Translated using Weblate (Malay)
Currently translated at 53.2% (251 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-06-20 19:47:20 +02:00
Anonymous
92f5bdf659 Translated using Weblate (Danish)
Currently translated at 41.8% (197 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-06-20 19:47:20 +02:00
Anonymous
4ba88229ae Translated using Weblate (Czech)
Currently translated at 94.2% (444 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-06-20 19:47:19 +02:00
Anonymous
5dde0ae1fa Translated using Weblate (Arabic)
Currently translated at 55.6% (262 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-06-20 19:47:19 +02:00
Anonymous
8f4d64913c Translated using Weblate (Serbian)
Currently translated at 1.9% (9 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-06-20 19:47:19 +02:00
Anonymous
ae060903a0 Translated using Weblate (Turkish)
Currently translated at 83.4% (393 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-06-20 19:47:18 +02:00
Anonymous
81cf03fa87 Translated using Weblate (Bulgarian)
Currently translated at 9.7% (46 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-06-20 19:47:18 +02:00
Anonymous
d9aa1dfdbf Translated using Weblate (Telugu)
Currently translated at 45.6% (215 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-06-20 19:47:18 +02:00
Anonymous
7e01545e14 Translated using Weblate (Finnish)
Currently translated at 37.5% (177 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-06-20 19:47:17 +02:00
Anonymous
5f21c20a59 Translated using Weblate (Yue (Traditional))
Currently translated at 24.8% (117 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue_Hant/
2023-06-20 19:47:17 +02:00
Anonymous
e552524d99 Translated using Weblate (Portuguese (Brazil))
Currently translated at 85.7% (404 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-06-20 19:47:16 +02:00
Anonymous
794902cbd5 Translated using Weblate (Romanian)
Currently translated at 31.8% (150 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-06-20 19:47:16 +02:00
Anonymous
58695dbe75 Translated using Weblate (Hebrew)
Currently translated at 21.2% (100 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-06-20 19:47:16 +02:00
Anonymous
514d827ff4 Translated using Weblate (Hungarian)
Currently translated at 25.4% (120 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-06-20 19:47:15 +02:00
Anonymous
25f7064286 Translated using Weblate (Croatian)
Currently translated at 97.2% (458 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-06-20 19:47:15 +02:00
Anonymous
112f376aa8 Translated using Weblate (Swedish)
Currently translated at 27.6% (130 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-06-20 19:47:15 +02:00
Anonymous
4fd107ab45 Translated using Weblate (Polish)
Currently translated at 79.4% (374 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-06-20 19:47:14 +02:00
Anonymous
197d8acbe8 Translated using Weblate (Catalan)
Currently translated at 55.2% (260 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-06-20 19:47:14 +02:00
Anonymous
0d8f6545dd Translated using Weblate (Chinese (Traditional))
Currently translated at 97.6% (460 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-06-20 19:47:14 +02:00
Anonymous
f83dd71682 Translated using Weblate (Dutch)
Currently translated at 51.1% (241 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-06-20 19:47:13 +02:00
Anonymous
a25f136628 Translated using Weblate (Vietnamese)
Currently translated at 9.3% (44 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-06-20 19:47:13 +02:00
Anonymous
958428db29 Translated using Weblate (Norwegian Bokmål)
Currently translated at 16.7% (79 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-06-20 19:47:13 +02:00
Anonymous
297c253c33 Translated using Weblate (Italian)
Currently translated at 70.7% (333 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-06-20 19:47:12 +02:00
Anonymous
3021190959 Translated using Weblate (Chinese (Simplified))
Currently translated at 94.2% (444 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-06-20 19:47:12 +02:00
Anonymous
3a8e9ece9b Translated using Weblate (Russian)
Currently translated at 87.6% (413 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-06-20 19:47:12 +02:00
Anonymous
8678c67d97 Translated using Weblate (Portuguese)
Currently translated at 88.1% (415 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-06-20 19:47:11 +02:00
Anonymous
2a7ca65907 Translated using Weblate (French)
Currently translated at 99.5% (469 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-06-20 19:47:11 +02:00
Anonymous
edcd7508c9 Translated using Weblate (Spanish)
Currently translated at 99.5% (469 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-06-20 19:47:11 +02:00
Anonymous
3e691ab446 Translated using Weblate (German)
Currently translated at 97.0% (457 of 471 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-06-20 19:47:10 +02:00
shamoon
dc85100e32 Merge pull request #1623 from dimitricappelle/kavita
Adding Kavita
2023-06-20 10:46:18 -07:00
Quan Dong
3161c459b8 Translated using Weblate (Chinese (Simplified))
Currently translated at 94.6% (444 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-06-20 17:51:17 +02:00
dimitricappelle
940ce359bf Adding Kavita 2023-06-20 17:05:07 +02:00
mikmik
bc2695323c Translated using Weblate (Hungarian)
Currently translated at 25.5% (120 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-06-19 06:14:47 +02:00
Dan
751777a4ad Translated using Weblate (Ukrainian)
Currently translated at 100.0% (469 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-06-18 10:48:01 +02:00
Daniele Luisetto
34b8689da7 Translated using Weblate (Italian)
Currently translated at 71.0% (333 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-06-18 10:48:01 +02:00
Nonoss117
58b7f8f79a Translated using Weblate (French)
Currently translated at 100.0% (469 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-06-18 10:48:00 +02:00
gallegonovato
93515578c0 Translated using Weblate (Spanish)
Currently translated at 100.0% (469 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-06-18 10:48:00 +02:00
Anonymous
009aae7a38 Translated using Weblate (Indonesian)
Currently translated at 3.1% (15 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/id/
2023-06-16 08:41:41 +02:00
Anonymous
15c8c5552c Translated using Weblate (Slovenian)
Currently translated at 95.7% (449 of 469 strings)

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

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-06-16 08:41:40 +02:00
Anonymous
3ecc6fbae9 Translated using Weblate (Korean)
Currently translated at 36.8% (173 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ko/
2023-06-16 08:41:40 +02:00
Anonymous
3f60fff12d Translated using Weblate (Slovak)
Currently translated at 1.9% (9 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sk/
2023-06-16 08:41:39 +02:00
Anonymous
f8e2e4bf79 Translated using Weblate (Thai)
Currently translated at 10.0% (47 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/th/
2023-06-16 08:41:39 +02:00
Anonymous
62026cfe9c Translated using Weblate (Latvian)
Currently translated at 25.1% (118 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-06-16 08:41:39 +02:00
Anonymous
3f8553ce7f Translated using Weblate (Japanese)
Currently translated at 81.8% (384 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-06-16 08:41:38 +02:00
Anonymous
39e30e87d7 Translated using Weblate (Ukrainian)
Currently translated at 99.1% (465 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-06-16 08:41:38 +02:00
Anonymous
9925865385 Translated using Weblate (Esperanto)
Currently translated at 30.9% (145 of 469 strings)

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

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-06-16 08:41:37 +02:00
Anonymous
3841642178 Translated using Weblate (Malay)
Currently translated at 53.5% (251 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-06-16 08:41:37 +02:00
Anonymous
d6c68415d1 Translated using Weblate (Danish)
Currently translated at 42.0% (197 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-06-16 08:41:37 +02:00
Anonymous
1184b5a2b9 Translated using Weblate (Czech)
Currently translated at 94.6% (444 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-06-16 08:41:36 +02:00
Anonymous
b506558754 Translated using Weblate (Arabic)
Currently translated at 55.8% (262 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-06-16 08:41:36 +02:00
Anonymous
4a08aee090 Translated using Weblate (Serbian)
Currently translated at 1.9% (9 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-06-16 08:41:35 +02:00
Anonymous
c4a7ac9dc6 Translated using Weblate (Turkish)
Currently translated at 83.7% (393 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-06-16 08:41:35 +02:00
Anonymous
283a52f843 Translated using Weblate (Bulgarian)
Currently translated at 9.8% (46 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-06-16 08:41:35 +02:00
Anonymous
bb2083b2ec Translated using Weblate (Telugu)
Currently translated at 45.8% (215 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-06-16 08:41:34 +02:00
Anonymous
444ef3f48b Translated using Weblate (Finnish)
Currently translated at 37.7% (177 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-06-16 08:41:34 +02:00
Anonymous
853e741bfa Translated using Weblate (Yue (Traditional))
Currently translated at 24.9% (117 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue_Hant/
2023-06-16 08:41:33 +02:00
Anonymous
cf55092ba6 Translated using Weblate (Portuguese (Brazil))
Currently translated at 86.1% (404 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-06-16 08:41:32 +02:00
Anonymous
6488e786e1 Translated using Weblate (Romanian)
Currently translated at 31.9% (150 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-06-16 08:41:32 +02:00
Anonymous
2260d250d6 Translated using Weblate (Hebrew)
Currently translated at 21.3% (100 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-06-16 08:41:32 +02:00
Anonymous
dcdc93cf06 Translated using Weblate (Hungarian)
Currently translated at 22.8% (107 of 469 strings)

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

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-06-16 08:41:31 +02:00
Anonymous
80c93a4e83 Translated using Weblate (Swedish)
Currently translated at 27.7% (130 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-06-16 08:41:31 +02:00
Anonymous
634077b5b6 Translated using Weblate (Polish)
Currently translated at 79.7% (374 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-06-16 08:41:30 +02:00
Anonymous
e4212074fe Translated using Weblate (Catalan)
Currently translated at 55.4% (260 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-06-16 08:41:30 +02:00
Anonymous
af9bca282d Translated using Weblate (Chinese (Traditional))
Currently translated at 98.0% (460 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-06-16 08:41:30 +02:00
Anonymous
4b4b871181 Translated using Weblate (Dutch)
Currently translated at 51.3% (241 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-06-16 08:41:29 +02:00
Anonymous
3065d95765 Translated using Weblate (Vietnamese)
Currently translated at 9.3% (44 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-06-16 08:41:29 +02:00
Anonymous
fe3f7ffdf3 Translated using Weblate (Norwegian Bokmål)
Currently translated at 16.8% (79 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-06-16 08:41:28 +02:00
Anonymous
2319a6ffb7 Translated using Weblate (Italian)
Currently translated at 60.9% (286 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-06-16 08:41:28 +02:00
Anonymous
d2c123e031 Translated using Weblate (Chinese (Simplified))
Currently translated at 94.4% (443 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-06-16 08:41:28 +02:00
Anonymous
91d359d5e6 Translated using Weblate (Russian)
Currently translated at 88.0% (413 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-06-16 08:41:27 +02:00
Anonymous
4abdce068e Translated using Weblate (Portuguese)
Currently translated at 88.4% (415 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-06-16 08:41:27 +02:00
Anonymous
98b4682bfe Translated using Weblate (French)
Currently translated at 99.1% (465 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-06-16 08:41:27 +02:00
Anonymous
af2cf43639 Translated using Weblate (Spanish)
Currently translated at 99.1% (465 of 469 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-06-16 08:41:26 +02:00
Anonymous
c29c92dafb Translated using Weblate (German)
Currently translated at 97.4% (457 of 469 strings)

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

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/
2023-06-16 08:40:19 +02:00
Karl0ss
8df11acbe8 JDownloader Widget - Add Total Queue and Remaining In Queue (#1612)
undefined
2023-06-15 23:40:10 -07:00
Dan
af00e44550 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (468 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-06-16 06:50:35 +02:00
Ali
19918ef68b Translated using Weblate (Arabic)
Currently translated at 55.9% (262 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-06-16 06:50:34 +02:00
Nonoss117
211c694e4e Translated using Weblate (French)
Currently translated at 100.0% (468 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-06-16 06:50:34 +02:00
gallegonovato
35499cffbc Translated using Weblate (Spanish)
Currently translated at 100.0% (468 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-06-16 06:50:33 +02:00
shamoon
9f265c4381 Merge pull request #1603 from denispapec/header-boxed-widget
Added boxed widgets header styling and error component to information widgets
2023-06-13 20:49:19 -07:00
Anonymous
2807575283 Translated using Weblate (Indonesian)
Currently translated at 3.2% (15 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/id/
2023-06-14 05:47:14 +02:00
Anonymous
315bda6ba1 Translated using Weblate (Slovenian)
Currently translated at 95.9% (449 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/
2023-06-14 05:47:14 +02:00
Anonymous
c5b044d196 Translated using Weblate (Greek)
Currently translated at 30.5% (143 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-06-14 05:47:13 +02:00
Anonymous
dbfa14cb51 Translated using Weblate (Korean)
Currently translated at 36.9% (173 of 468 strings)

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

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

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/th/
2023-06-14 05:47:12 +02:00
Anonymous
fb7f32589b Translated using Weblate (Latvian)
Currently translated at 25.2% (118 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-06-14 05:47:12 +02:00
Anonymous
3423bbc0ee Translated using Weblate (Japanese)
Currently translated at 82.0% (384 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-06-14 05:47:11 +02:00
Anonymous
3d1b18f660 Translated using Weblate (Ukrainian)
Currently translated at 99.3% (465 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-06-14 05:47:11 +02:00
Anonymous
d353166b59 Translated using Weblate (Esperanto)
Currently translated at 30.9% (145 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-06-14 05:47:11 +02:00
Anonymous
3d19d65cb6 Translated using Weblate (Hindi)
Currently translated at 1.9% (9 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-06-14 05:47:10 +02:00
Anonymous
a8d130d5cb Translated using Weblate (Malay)
Currently translated at 53.6% (251 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-06-14 05:47:10 +02:00
Anonymous
626d636aae Translated using Weblate (Danish)
Currently translated at 42.0% (197 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-06-14 05:47:10 +02:00
Anonymous
0f6a4c624c Translated using Weblate (Czech)
Currently translated at 94.8% (444 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-06-14 05:47:09 +02:00
Anonymous
543573fbdb Translated using Weblate (Arabic)
Currently translated at 55.5% (260 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-06-14 05:47:09 +02:00
Anonymous
211c723f04 Translated using Weblate (Serbian)
Currently translated at 1.9% (9 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-06-14 05:47:08 +02:00
Anonymous
f3708189ef Translated using Weblate (Turkish)
Currently translated at 83.9% (393 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-06-14 05:47:08 +02:00
Anonymous
91b828e97c Translated using Weblate (Bulgarian)
Currently translated at 9.8% (46 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-06-14 05:47:08 +02:00
Anonymous
a6320bc794 Translated using Weblate (Telugu)
Currently translated at 45.9% (215 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-06-14 05:47:07 +02:00
Anonymous
f3a7c1164b Translated using Weblate (Finnish)
Currently translated at 37.8% (177 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-06-14 05:47:07 +02:00
Anonymous
fd93df77aa Translated using Weblate (Yue (Traditional))
Currently translated at 25.0% (117 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue_Hant/
2023-06-14 05:47:06 +02:00
Anonymous
452d36c158 Translated using Weblate (Portuguese (Brazil))
Currently translated at 86.3% (404 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-06-14 05:47:05 +02:00
Anonymous
26cff34634 Translated using Weblate (Romanian)
Currently translated at 32.0% (150 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-06-14 05:47:05 +02:00
Anonymous
1021e562d8 Translated using Weblate (Hebrew)
Currently translated at 21.3% (100 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-06-14 05:47:04 +02:00
Anonymous
9d2df38391 Translated using Weblate (Hungarian)
Currently translated at 22.8% (107 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-06-14 05:47:04 +02:00
Anonymous
f3176a25ad Translated using Weblate (Croatian)
Currently translated at 97.8% (458 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-06-14 05:47:04 +02:00
Anonymous
f92c5aa1e3 Translated using Weblate (Swedish)
Currently translated at 27.7% (130 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-06-14 05:47:03 +02:00
Anonymous
e0a6a88ba1 Translated using Weblate (Polish)
Currently translated at 79.9% (374 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-06-14 05:47:03 +02:00
Anonymous
ae1d7e0866 Translated using Weblate (Catalan)
Currently translated at 55.5% (260 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-06-14 05:47:02 +02:00
Anonymous
8cc044544e Translated using Weblate (Chinese (Traditional))
Currently translated at 98.2% (460 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-06-14 05:47:02 +02:00
Anonymous
368032c931 Translated using Weblate (Dutch)
Currently translated at 51.4% (241 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-06-14 05:47:01 +02:00
Anonymous
03ba36c593 Translated using Weblate (Vietnamese)
Currently translated at 9.4% (44 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-06-14 05:47:01 +02:00
Anonymous
9a6a580953 Translated using Weblate (Norwegian Bokmål)
Currently translated at 16.8% (79 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-06-14 05:47:00 +02:00
Anonymous
1582ba9438 Translated using Weblate (Italian)
Currently translated at 61.1% (286 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-06-14 05:47:00 +02:00
Anonymous
a6a9180aa0 Translated using Weblate (Chinese (Simplified))
Currently translated at 94.6% (443 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-06-14 05:47:00 +02:00
Anonymous
8d41834c2a Translated using Weblate (Russian)
Currently translated at 88.2% (413 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-06-14 05:46:59 +02:00
Anonymous
28335ca3af Translated using Weblate (Portuguese)
Currently translated at 88.6% (415 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-06-14 05:46:59 +02:00
Anonymous
1e7a2cbbc4 Translated using Weblate (French)
Currently translated at 99.3% (465 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-06-14 05:46:58 +02:00
Anonymous
250b1a3c53 Translated using Weblate (Spanish)
Currently translated at 99.3% (465 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-06-14 05:46:58 +02:00
Anonymous
3f25df954f Translated using Weblate (German)
Currently translated at 97.6% (457 of 468 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-06-14 05:46:58 +02:00
shamoon
7afe62df2a Merge pull request #1608 from karl0ss/benphelpsJdownloader
Working Jdownloader
2023-06-13 20:45:57 -07:00
shamoon
b437ccde2f Another attempt to catch zlib decompression errors 2023-06-13 19:21:12 -07:00
shamoon
abcea88d0a Try to handle zlib errors 2023-06-13 15:23:19 -07:00
shamoon
3ee6650e6d fix homebridge proxy logging 2023-06-13 15:16:49 -07:00
shamoon
106eec8cdb Merge pull request #1607 from dan5py/fix/1606
Update Traefik API
2023-06-13 14:56:09 -07:00
Dan5py
4a97fce841 Support old traefik CRD group 2023-06-13 22:04:56 +02:00
Karl Hudgell
f1d6a990ac Working Jdownloader 2023-06-13 20:30:09 +01:00
Dan5py
fce680d981 Fixes #1606 2023-06-13 21:02:06 +02:00
Ado Nishimura
dcb3dccdc8 Translated using Weblate (Japanese)
Currently translated at 82.5% (384 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-06-13 13:52:29 +02:00
Danilo
7c8638467e Translated using Weblate (Portuguese)
Currently translated at 89.2% (415 of 465 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-06-13 13:52:28 +02:00
Denis Papec
1622069063 Fixes for existing header styles, fix for glances
Signed-off-by: Denis Papec <denis.papec@gmail.com>
2023-06-12 01:15:46 +01:00
Denis Papec
6f750dd83c Further improvements to simplify information widgets
Signed-off-by: Denis Papec <denis.papec@gmail.com>
2023-06-12 01:15:30 +01:00
Denis Papec
cd5162e39c Refactored information widgets, improve widget-boxed style
Signed-off-by: Denis Papec <denis.papec@gmail.com>
2023-06-12 01:15:19 +01:00
Denis Papec
c5b6dcc1e0 Add optional boxed styling and error component to information widgets
Signed-off-by: Denis Papec <denis.papec@gmail.com>
2023-06-12 01:15:09 +01:00
124 changed files with 5110 additions and 1664 deletions

View File

@@ -141,7 +141,7 @@ pnpm dev
Open [http://localhost:3000](http://localhost:3000) to start. 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 ## Contributors

1
package-lock.json generated
View File

@@ -21,7 +21,6 @@
"minecraft-ping-js": "^1.0.2", "minecraft-ping-js": "^1.0.2",
"next": "^12.3.1", "next": "^12.3.1",
"next-i18next": "^12.0.1", "next-i18next": "^12.0.1",
"osx-temperature-sensor": "*",
"pretty-bytes": "^6.0.0", "pretty-bytes": "^6.0.0",
"raw-body": "^2.5.1", "raw-body": "^2.5.1",
"react": "^18.2.0", "react": "^18.2.0",

View File

@@ -16,6 +16,7 @@
"compare-versions": "^5.0.1", "compare-versions": "^5.0.1",
"dockerode": "^3.3.4", "dockerode": "^3.3.4",
"follow-redirects": "^1.15.2", "follow-redirects": "^1.15.2",
"gamedig": "^4.0.6",
"i18next": "^21.9.2", "i18next": "^21.9.2",
"js-yaml": "^4.1.0", "js-yaml": "^4.1.0",
"json-rpc-2.0": "^1.4.1", "json-rpc-2.0": "^1.4.1",
@@ -33,6 +34,7 @@
"swr": "^1.3.0", "swr": "^1.3.0",
"systeminformation": "^5.17.12", "systeminformation": "^5.17.12",
"tough-cookie": "^4.1.2", "tough-cookie": "^4.1.2",
"urbackup-server-api": "^0.8.9",
"winston": "^3.8.2", "winston": "^3.8.2",
"xml-js": "^1.6.11" "xml-js": "^1.6.11"
}, },

420
pnpm-lock.yaml generated
View File

@@ -19,6 +19,9 @@ dependencies:
follow-redirects: follow-redirects:
specifier: ^1.15.2 specifier: ^1.15.2
version: 1.15.2 version: 1.15.2
gamedig:
specifier: ^4.0.6
version: 4.0.6
i18next: i18next:
specifier: ^21.9.2 specifier: ^21.9.2
version: 21.10.0 version: 21.10.0
@@ -70,6 +73,9 @@ dependencies:
tough-cookie: tough-cookie:
specifier: ^4.1.2 specifier: ^4.1.2
version: 4.1.2 version: 4.1.2
urbackup-server-api:
specifier: ^0.8.9
version: 0.8.9
winston: winston:
specifier: ^3.8.2 specifier: ^3.8.2
version: 3.8.2 version: 3.8.2
@@ -402,12 +408,24 @@ packages:
resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==} resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==}
dev: true dev: true
/@sindresorhus/is@5.4.1:
resolution: {integrity: sha512-axlrvsHlHlFmKKMEg4VyvMzFr93JWJj4eIfXY1STVuO2fsImCa7ncaiG5gC8HKOX590AW5RtRsC41/B+OfrSqw==}
engines: {node: '>=14.16'}
dev: false
/@swc/helpers@0.4.11: /@swc/helpers@0.4.11:
resolution: {integrity: sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==} resolution: {integrity: sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==}
dependencies: dependencies:
tslib: 2.5.0 tslib: 2.5.0
dev: false dev: false
/@szmarczak/http-timer@5.0.1:
resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==}
engines: {node: '>=14.16'}
dependencies:
defer-to-connect: 2.0.1
dev: false
/@tailwindcss/forms@0.5.3(tailwindcss@3.3.0): /@tailwindcss/forms@0.5.3(tailwindcss@3.3.0):
resolution: {integrity: sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==} resolution: {integrity: sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==}
peerDependencies: peerDependencies:
@@ -424,6 +442,10 @@ packages:
hoist-non-react-statics: 3.3.2 hoist-non-react-statics: 3.3.2
dev: false dev: false
/@types/http-cache-semantics@4.0.1:
resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==}
dev: false
/@types/json5@0.0.29: /@types/json5@0.0.29:
resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
dev: true dev: true
@@ -531,6 +553,11 @@ packages:
json-schema-traverse: 0.4.1 json-schema-traverse: 0.4.1
uri-js: 4.4.1 uri-js: 4.4.1
/amdefine@1.0.1:
resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==}
engines: {node: '>=0.4.2'}
dev: false
/ansi-regex@5.0.1: /ansi-regex@5.0.1:
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
engines: {node: '>=8'} engines: {node: '>=8'}
@@ -545,7 +572,6 @@ packages:
/any-promise@1.3.0: /any-promise@1.3.0:
resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
dev: true
/anymatch@3.1.3: /anymatch@3.1.3:
resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
@@ -636,6 +662,12 @@ packages:
resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==}
dev: true dev: true
/async-mutex@0.3.2:
resolution: {integrity: sha512-HuTK7E7MT7jZEh1P9GtRW9+aTWiDWWi9InbZ5hjxrnRa39KS4BW04+xLBhYNS2aXhHUIKZSw3gj4Pn1pj+qGAA==}
dependencies:
tslib: 2.5.0
dev: false
/async@3.2.4: /async@3.2.4:
resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==}
dev: false dev: false
@@ -687,6 +719,12 @@ packages:
/balanced-match@1.0.2: /balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
/barse@0.4.3:
resolution: {integrity: sha512-UEpvriJqAn8zuVinYICuKoPttZy3XxXEoqX/V2uYAL4zzJRuNzCK3+20nAu3YUIa2U7G53kf90wfBIp9/A+Odw==}
dependencies:
readable-stream: 1.0.34
dev: false
/base64-js@1.5.1: /base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
dev: false dev: false
@@ -710,6 +748,10 @@ packages:
readable-stream: 3.6.2 readable-stream: 3.6.2
dev: false dev: false
/boolbase@1.0.0:
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
dev: false
/brace-expansion@1.1.11: /brace-expansion@1.1.11:
resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
dependencies: dependencies:
@@ -756,6 +798,24 @@ packages:
engines: {node: '>= 0.8'} engines: {node: '>= 0.8'}
dev: false dev: false
/cacheable-lookup@7.0.0:
resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==}
engines: {node: '>=14.16'}
dev: false
/cacheable-request@10.2.12:
resolution: {integrity: sha512-qtWGB5kn2OLjx47pYUkWicyOpK1vy9XZhq8yRTXOy+KAmjjESSRLx6SiExnnaGGUP1NM6/vmygMu0fGylNh9tw==}
engines: {node: '>=14.16'}
dependencies:
'@types/http-cache-semantics': 4.0.1
get-stream: 6.0.1
http-cache-semantics: 4.1.1
keyv: 4.5.2
mimic-response: 4.0.0
normalize-url: 8.0.0
responselike: 3.0.0
dev: false
/call-bind@1.0.2: /call-bind@1.0.2:
resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
dependencies: dependencies:
@@ -788,6 +848,30 @@ packages:
supports-color: 7.2.0 supports-color: 7.2.0
dev: true dev: true
/cheerio-select@2.1.0:
resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==}
dependencies:
boolbase: 1.0.0
css-select: 5.1.0
css-what: 6.1.0
domelementtype: 2.3.0
domhandler: 5.0.3
domutils: 3.1.0
dev: false
/cheerio@1.0.0-rc.12:
resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==}
engines: {node: '>= 6'}
dependencies:
cheerio-select: 2.1.0
dom-serializer: 2.0.0
domhandler: 5.0.3
domutils: 3.1.0
htmlparser2: 8.0.2
parse5: 7.1.2
parse5-htmlparser2-tree-adapter: 7.0.0
dev: false
/chokidar@3.5.3: /chokidar@3.5.3:
resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
engines: {node: '>= 8.10.0'} engines: {node: '>= 8.10.0'}
@@ -868,6 +952,13 @@ packages:
delayed-stream: 1.0.0 delayed-stream: 1.0.0
dev: false dev: false
/commander@2.8.1:
resolution: {integrity: sha512-+pJLBFVk+9ZZdlAOB5WuIElVPPth47hILFkmGym57aq8kwxsowvByvB0DHs1vQAhyMZzdcpTtF0VDKGkSDR4ZQ==}
engines: {node: '>= 0.6.x'}
dependencies:
graceful-readlink: 1.0.1
dev: false
/commander@4.1.1: /commander@4.1.1:
resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
engines: {node: '>= 6'} engines: {node: '>= 6'}
@@ -877,6 +968,14 @@ packages:
resolution: {integrity: sha512-4UZlZP8Z99MGEY+Ovg/uJxJuvoXuN4M6B3hKaiackiHrgzQFEe3diJi1mf1PNHbFujM7FvLrK2bpgIaImbtZ1A==} resolution: {integrity: sha512-4UZlZP8Z99MGEY+Ovg/uJxJuvoXuN4M6B3hKaiackiHrgzQFEe3diJi1mf1PNHbFujM7FvLrK2bpgIaImbtZ1A==}
dev: false dev: false
/compressjs@1.0.3:
resolution: {integrity: sha512-jpKJjBTretQACTGLNuvnozP1JdP2ZLrjdGdBgk/tz1VfXlUcBhhSZW6vEsuThmeot/yjvSrPQKEgfF3X2Lpi8Q==}
hasBin: true
dependencies:
amdefine: 1.0.1
commander: 2.8.1
dev: false
/concat-map@0.0.1: /concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
@@ -911,6 +1010,21 @@ packages:
shebang-command: 2.0.0 shebang-command: 2.0.0
which: 2.0.2 which: 2.0.2
/css-select@5.1.0:
resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==}
dependencies:
boolbase: 1.0.0
css-what: 6.1.0
domhandler: 5.0.3
domutils: 3.1.0
nth-check: 2.1.1
dev: false
/css-what@6.1.0:
resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
engines: {node: '>= 6'}
dev: false
/cssesc@3.0.0: /cssesc@3.0.0:
resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
engines: {node: '>=4'} engines: {node: '>=4'}
@@ -953,6 +1067,13 @@ packages:
dependencies: dependencies:
ms: 2.1.2 ms: 2.1.2
/decompress-response@6.0.0:
resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
engines: {node: '>=10'}
dependencies:
mimic-response: 3.1.0
dev: false
/deep-equal@2.2.0: /deep-equal@2.2.0:
resolution: {integrity: sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==} resolution: {integrity: sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==}
dependencies: dependencies:
@@ -979,6 +1100,11 @@ packages:
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
dev: true dev: true
/defer-to-connect@2.0.1:
resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==}
engines: {node: '>=10'}
dev: false
/define-properties@1.2.0: /define-properties@1.2.0:
resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
@@ -1049,6 +1175,33 @@ packages:
esutils: 2.0.3 esutils: 2.0.3
dev: true dev: true
/dom-serializer@2.0.0:
resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
dependencies:
domelementtype: 2.3.0
domhandler: 5.0.3
entities: 4.5.0
dev: false
/domelementtype@2.3.0:
resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
dev: false
/domhandler@5.0.3:
resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
engines: {node: '>= 4'}
dependencies:
domelementtype: 2.3.0
dev: false
/domutils@3.1.0:
resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==}
dependencies:
dom-serializer: 2.0.0
domelementtype: 2.3.0
domhandler: 5.0.3
dev: false
/ecc-jsbn@0.1.2: /ecc-jsbn@0.1.2:
resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==}
dependencies: dependencies:
@@ -1074,6 +1227,11 @@ packages:
once: 1.4.0 once: 1.4.0
dev: false dev: false
/entities@4.5.0:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'}
dev: false
/es-abstract@1.21.2: /es-abstract@1.21.2:
resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
@@ -1491,6 +1649,11 @@ packages:
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dev: true dev: true
/event-to-promise@0.7.0:
resolution: {integrity: sha512-VOBBfyaADfe378ZzG0tgkzmsvzUyeU5arehrFzNRt5yaASUDshgctTwSrPI17ocAwR3+YftsxRClHF+GBKFByQ==}
deprecated: Use promise-toolbox/fromEvent instead
dev: false
/execa@5.0.0: /execa@5.0.0:
resolution: {integrity: sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==} resolution: {integrity: sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==}
engines: {node: '>=10'} engines: {node: '>=10'}
@@ -1608,6 +1771,11 @@ packages:
resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==}
dev: false dev: false
/form-data-encoder@2.1.4:
resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==}
engines: {node: '>= 14.17'}
dev: false
/form-data@2.3.3: /form-data@2.3.3:
resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==}
engines: {node: '>= 0.12'} engines: {node: '>= 0.12'}
@@ -1660,6 +1828,33 @@ packages:
resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
dev: true dev: true
/gamedig@4.0.6:
resolution: {integrity: sha512-h0k9n/e5vNrd9Mh2wyFUp2Vo7ABWbDkdBxKC6FNJLOZiU5d9Z29bntGeYbXtOkcRWoV6Q63wSAJ3jLWxYQkpZw==}
engines: {node: '>=14.0.0'}
hasBin: true
dependencies:
cheerio: 1.0.0-rc.12
compressjs: 1.0.3
gbxremote: 0.2.1
got: 12.6.1
iconv-lite: 0.6.3
long: 5.2.3
minimist: 1.2.8
punycode: 2.3.0
varint: 6.0.0
dev: false
/gbxremote@0.2.1:
resolution: {integrity: sha512-SMehu6Y6ndq2Qgp9VxAb8Np3f+UUD+RWoW2SAMaxzGS96rWXyr4T1GGkecO0HHtxeH1m7pEh4FJWB8a/6aM2XQ==}
engines: {node: '>=0.10'}
dependencies:
any-promise: 1.3.0
barse: 0.4.3
event-to-promise: 0.7.0
string-to-stream: 1.1.1
xmlrpc: 1.3.2
dev: false
/get-intrinsic@1.2.0: /get-intrinsic@1.2.0:
resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==}
dependencies: dependencies:
@@ -1765,6 +1960,27 @@ packages:
get-intrinsic: 1.2.0 get-intrinsic: 1.2.0
dev: true dev: true
/got@12.6.1:
resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==}
engines: {node: '>=14.16'}
dependencies:
'@sindresorhus/is': 5.4.1
'@szmarczak/http-timer': 5.0.1
cacheable-lookup: 7.0.0
cacheable-request: 10.2.12
decompress-response: 6.0.0
form-data-encoder: 2.1.4
get-stream: 6.0.1
http2-wrapper: 2.2.0
lowercase-keys: 3.0.0
p-cancelable: 3.0.0
responselike: 3.0.0
dev: false
/graceful-readlink@1.0.1:
resolution: {integrity: sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==}
dev: false
/grapheme-splitter@1.0.4: /grapheme-splitter@1.0.4:
resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==}
dev: true dev: true
@@ -1832,6 +2048,19 @@ packages:
void-elements: 3.1.0 void-elements: 3.1.0
dev: false dev: false
/htmlparser2@8.0.2:
resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==}
dependencies:
domelementtype: 2.3.0
domhandler: 5.0.3
domutils: 3.1.0
entities: 4.5.0
dev: false
/http-cache-semantics@4.1.1:
resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==}
dev: false
/http-errors@2.0.0: /http-errors@2.0.0:
resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
engines: {node: '>= 0.8'} engines: {node: '>= 0.8'}
@@ -1852,6 +2081,14 @@ packages:
sshpk: 1.17.0 sshpk: 1.17.0
dev: false dev: false
/http2-wrapper@2.2.0:
resolution: {integrity: sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==}
engines: {node: '>=10.19.0'}
dependencies:
quick-lru: 5.1.1
resolve-alpn: 1.2.1
dev: false
/human-signals@2.1.0: /human-signals@2.1.0:
resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
engines: {node: '>=10.17.0'} engines: {node: '>=10.17.0'}
@@ -1874,6 +2111,13 @@ packages:
safer-buffer: 2.1.2 safer-buffer: 2.1.2
dev: false dev: false
/iconv-lite@0.6.3:
resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
engines: {node: '>=0.10.0'}
dependencies:
safer-buffer: 2.1.2
dev: false
/ieee754@1.2.1: /ieee754@1.2.1:
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
dev: false dev: false
@@ -2084,6 +2328,14 @@ packages:
get-intrinsic: 1.2.0 get-intrinsic: 1.2.0
dev: true dev: true
/isarray@0.0.1:
resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==}
dev: false
/isarray@1.0.0:
resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
dev: false
/isarray@2.0.5: /isarray@2.0.5:
resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
dev: true dev: true
@@ -2128,6 +2380,10 @@ packages:
resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==}
dev: false dev: false
/json-buffer@3.0.1:
resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
dev: false
/json-rpc-2.0@1.5.1: /json-rpc-2.0@1.5.1:
resolution: {integrity: sha512-ZY/vYl/uUgKN3tNrZMq7w+CGLcoUT+8AzDO/HJZVa+K4XcwgfgES1QDa5y7ieAeh4NgRo3hLexMxgdaiEiK9aA==} resolution: {integrity: sha512-ZY/vYl/uUgKN3tNrZMq7w+CGLcoUT+8AzDO/HJZVa+K4XcwgfgES1QDa5y7ieAeh4NgRo3hLexMxgdaiEiK9aA==}
dev: false dev: false
@@ -2176,6 +2432,12 @@ packages:
object.assign: 4.1.4 object.assign: 4.1.4
dev: true dev: true
/keyv@4.5.2:
resolution: {integrity: sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==}
dependencies:
json-buffer: 3.0.1
dev: false
/kuler@2.0.0: /kuler@2.0.0:
resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==}
dev: false dev: false
@@ -2229,11 +2491,20 @@ packages:
triple-beam: 1.3.0 triple-beam: 1.3.0
dev: false dev: false
/long@5.2.3:
resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==}
dev: false
/loose-envify@1.4.0: /loose-envify@1.4.0:
resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
dependencies: dependencies:
js-tokens: 4.0.0 js-tokens: 4.0.0
/lowercase-keys@3.0.0:
resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
dev: false
/lru-cache@6.0.0: /lru-cache@6.0.0:
resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
engines: {node: '>=10'} engines: {node: '>=10'}
@@ -2278,6 +2549,16 @@ packages:
engines: {node: '>=6'} engines: {node: '>=6'}
dev: false dev: false
/mimic-response@3.1.0:
resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
engines: {node: '>=10'}
dev: false
/mimic-response@4.0.0:
resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
dev: false
/minecraft-ping-js@1.0.2: /minecraft-ping-js@1.0.2:
resolution: {integrity: sha512-h9QYG2n+fBKgp520tXBwR354XRzR/w5wXe8CJCmxKm6jbLpAoLODM8Nj5+ssuIVQF8rtxkAnjwv7PH+7ehFzQQ==} resolution: {integrity: sha512-h9QYG2n+fBKgp520tXBwR354XRzR/w5wXe8CJCmxKm6jbLpAoLODM8Nj5+ssuIVQF8rtxkAnjwv7PH+7ehFzQQ==}
dependencies: dependencies:
@@ -2296,7 +2577,6 @@ packages:
/minimist@1.2.8: /minimist@1.2.8:
resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
dev: true
/minipass@3.3.6: /minipass@3.3.6:
resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==}
@@ -2420,6 +2700,18 @@ packages:
- babel-plugin-macros - babel-plugin-macros
dev: false dev: false
/node-fetch@2.6.12:
resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==}
engines: {node: 4.x || >=6.0.0}
peerDependencies:
encoding: ^0.1.0
peerDependenciesMeta:
encoding:
optional: true
dependencies:
whatwg-url: 5.0.0
dev: false
/node-int64@0.4.0: /node-int64@0.4.0:
resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
dev: false dev: false
@@ -2438,6 +2730,11 @@ packages:
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dev: true dev: true
/normalize-url@8.0.0:
resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==}
engines: {node: '>=14.16'}
dev: false
/npm-run-path@4.0.1: /npm-run-path@4.0.1:
resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
engines: {node: '>=8'} engines: {node: '>=8'}
@@ -2445,6 +2742,12 @@ packages:
path-key: 3.1.1 path-key: 3.1.1
dev: false dev: false
/nth-check@2.1.1:
resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
dependencies:
boolbase: 1.0.0
dev: false
/oauth-sign@0.9.0: /oauth-sign@0.9.0:
resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==}
dev: false dev: false
@@ -2581,6 +2884,11 @@ packages:
dev: false dev: false
optional: true optional: true
/p-cancelable@3.0.0:
resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==}
engines: {node: '>=12.20'}
dev: false
/p-limit@3.1.0: /p-limit@3.1.0:
resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
engines: {node: '>=10'} engines: {node: '>=10'}
@@ -2602,6 +2910,19 @@ packages:
callsites: 3.1.0 callsites: 3.1.0
dev: true dev: true
/parse5-htmlparser2-tree-adapter@7.0.0:
resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==}
dependencies:
domhandler: 5.0.3
parse5: 7.1.2
dev: false
/parse5@7.1.2:
resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==}
dependencies:
entities: 4.5.0
dev: false
/path-exists@4.0.0: /path-exists@4.0.0:
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
engines: {node: '>=8'} engines: {node: '>=8'}
@@ -2746,6 +3067,10 @@ packages:
engines: {node: ^14.13.1 || >=16.0.0} engines: {node: ^14.13.1 || >=16.0.0}
dev: false dev: false
/process-nextick-args@2.0.1:
resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
dev: false
/prop-types@15.8.1: /prop-types@15.8.1:
resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
dependencies: dependencies:
@@ -2785,7 +3110,6 @@ packages:
/quick-lru@5.1.1: /quick-lru@5.1.1:
resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
engines: {node: '>=10'} engines: {node: '>=10'}
dev: true
/raw-body@2.5.2: /raw-body@2.5.2:
resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==}
@@ -2851,6 +3175,27 @@ packages:
pify: 2.3.0 pify: 2.3.0
dev: true dev: true
/readable-stream@1.0.34:
resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==}
dependencies:
core-util-is: 1.0.2
inherits: 2.0.4
isarray: 0.0.1
string_decoder: 0.10.31
dev: false
/readable-stream@2.3.8:
resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
dependencies:
core-util-is: 1.0.2
inherits: 2.0.4
isarray: 1.0.0
process-nextick-args: 2.0.1
safe-buffer: 5.1.2
string_decoder: 1.1.1
util-deprecate: 1.0.2
dev: false
/readable-stream@3.6.2: /readable-stream@3.6.2:
resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
engines: {node: '>= 6'} engines: {node: '>= 6'}
@@ -2916,6 +3261,10 @@ packages:
resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
dev: false dev: false
/resolve-alpn@1.2.1:
resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==}
dev: false
/resolve-from@4.0.0: /resolve-from@4.0.0:
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
engines: {node: '>=4'} engines: {node: '>=4'}
@@ -2936,6 +3285,13 @@ packages:
supports-preserve-symlinks-flag: 1.0.0 supports-preserve-symlinks-flag: 1.0.0
dev: true dev: true
/responselike@3.0.0:
resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==}
engines: {node: '>=14.16'}
dependencies:
lowercase-keys: 3.0.0
dev: false
/reusify@1.0.4: /reusify@1.0.4:
resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'} engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
@@ -2956,6 +3312,10 @@ packages:
queue-microtask: 1.2.3 queue-microtask: 1.2.3
dev: true dev: true
/safe-buffer@5.1.2:
resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
dev: false
/safe-buffer@5.2.1: /safe-buffer@5.2.1:
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
dev: false dev: false
@@ -3104,6 +3464,13 @@ packages:
engines: {node: '>= 0.10.0'} engines: {node: '>= 0.10.0'}
dev: false dev: false
/string-to-stream@1.1.1:
resolution: {integrity: sha512-QySF2+3Rwq0SdO3s7BAp4x+c3qsClpPQ6abAmb0DGViiSBAkT5kL6JT2iyzEVP+T1SmzHrQD1TwlP9QAHCc+Sw==}
dependencies:
inherits: 2.0.4
readable-stream: 2.3.8
dev: false
/string.prototype.matchall@4.0.8: /string.prototype.matchall@4.0.8:
resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==}
dependencies: dependencies:
@@ -3142,6 +3509,16 @@ packages:
es-abstract: 1.21.2 es-abstract: 1.21.2
dev: true dev: true
/string_decoder@0.10.31:
resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==}
dev: false
/string_decoder@1.1.1:
resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
dependencies:
safe-buffer: 5.1.2
dev: false
/string_decoder@1.3.0: /string_decoder@1.3.0:
resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
dependencies: dependencies:
@@ -3363,6 +3740,10 @@ packages:
url-parse: 1.5.10 url-parse: 1.5.10
dev: false dev: false
/tr46@0.0.3:
resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
dev: false
/triple-beam@1.3.0: /triple-beam@1.3.0:
resolution: {integrity: sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==} resolution: {integrity: sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==}
dev: false dev: false
@@ -3466,6 +3847,15 @@ packages:
picocolors: 1.0.0 picocolors: 1.0.0
dev: true dev: true
/urbackup-server-api@0.8.9:
resolution: {integrity: sha512-Igu6A0xSZeMsiN6PWT7zG4aD+iJR5fXT/j5+xwAvnD/vCNfvVrettIsXv6MftxOajvTmtlgaYu8KDoH1EJQ6DQ==}
dependencies:
async-mutex: 0.3.2
node-fetch: 2.6.12
transitivePeerDependencies:
- encoding
dev: false
/uri-js@4.4.1: /uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
dependencies: dependencies:
@@ -3511,6 +3901,17 @@ packages:
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dev: false dev: false
/webidl-conversions@3.0.1:
resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
dev: false
/whatwg-url@5.0.0:
resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
dependencies:
tr46: 0.0.3
webidl-conversions: 3.0.1
dev: false
/which-boxed-primitive@1.0.2: /which-boxed-primitive@1.0.2:
resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
dependencies: dependencies:
@@ -3601,6 +4002,19 @@ packages:
sax: 1.2.4 sax: 1.2.4
dev: false dev: false
/xmlbuilder@8.2.2:
resolution: {integrity: sha512-eKRAFz04jghooy8muekqzo8uCSVNeyRedbuJrp0fovbLIi7wlsYtdUn3vBAAPq2Y3/0xMz2WMEUQ8yhVVO9Stw==}
engines: {node: '>=4.0'}
dev: false
/xmlrpc@1.3.2:
resolution: {integrity: sha512-jQf5gbrP6wvzN71fgkcPPkF4bF/Wyovd7Xdff8d6/ihxYmgETQYSuTc+Hl+tsh/jmgPLro/Aro48LMFlIyEKKQ==}
engines: {node: '>=0.8', npm: '>=1.0.0'}
dependencies:
sax: 1.2.4
xmlbuilder: 8.2.2
dev: false
/yallist@4.0.0: /yallist@4.0.0:
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}

View File

@@ -23,7 +23,7 @@
"free": "متاح", "free": "متاح",
"used": "مستخدم", "used": "مستخدم",
"load": "الضغط", "load": "الضغط",
"mem": "MEM", "mem": "الذاكرة",
"temp": "TEMP", "temp": "TEMP",
"max": "Max", "max": "Max",
"uptime": "UP", "uptime": "UP",
@@ -134,14 +134,15 @@
"episodes": "Episodes" "episodes": "Episodes"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "Total Observed", "totalObserved": "مجموع الملاحظات",
"diffsDetected": "Diffs Detected" "diffsDetected": "Diffs Detected"
}, },
"tautulli": { "tautulli": {
"playing": "يشتغل", "playing": "يشتغل",
"transcoding": "التحويل", "transcoding": "التحويل",
"bitrate": "معدل البت", "bitrate": "معدل البت",
"no_active": "No Active Streams" "no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "معدل", "rate": "معدل",
@@ -644,5 +645,43 @@
"connected": "Connected", "connected": "Connected",
"new_devices": "New Devices", "new_devices": "New Devices",
"down_alerts": "Down Alerts" "down_alerts": "Down Alerts"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -89,7 +89,8 @@
"playing": "Възпроизвежда", "playing": "Възпроизвежда",
"transcoding": "Конвертира", "transcoding": "Конвертира",
"bitrate": "Честота", "bitrate": "Честота",
"no_active": "Няма активни потоци" "no_active": "Няма активни потоци",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "Rate", "rate": "Rate",
@@ -644,5 +645,43 @@
"connected": "Connected", "connected": "Connected",
"new_devices": "New Devices", "new_devices": "New Devices",
"down_alerts": "Down Alerts" "down_alerts": "Down Alerts"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -80,7 +80,8 @@
"playing": "Reproduint", "playing": "Reproduint",
"transcoding": "Transcodificant", "transcoding": "Transcodificant",
"bitrate": "Taxa de bits", "bitrate": "Taxa de bits",
"no_active": "Sense transmissions actives" "no_active": "Sense transmissions actives",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "Taxa", "rate": "Taxa",
@@ -644,5 +645,43 @@
"connected": "Connected", "connected": "Connected",
"new_devices": "New Devices", "new_devices": "New Devices",
"down_alerts": "Down Alerts" "down_alerts": "Down Alerts"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"totalUsed": "Used Storage",
"noRecent": "Out of Date"
} }
} }

View File

@@ -46,8 +46,8 @@
}, },
"unifi": { "unifi": {
"users": "Uživatelé", "users": "Uživatelé",
"uptime": "Doba provozu systému", "uptime": "Doba provozu",
"days": "Dnů", "days": "dní",
"wan": "WAN", "wan": "WAN",
"lan": "LAN", "lan": "LAN",
"wlan": "WLAN", "wlan": "WLAN",
@@ -56,8 +56,8 @@
"wlan_devices": "Zařízení WLAN", "wlan_devices": "Zařízení WLAN",
"lan_users": "Uživatelé LAN", "lan_users": "Uživatelé LAN",
"wlan_users": "Uživatelé WLAN", "wlan_users": "Uživatelé WLAN",
"up": "BĚŽÍ", "up": "FUNKČNÍ",
"down": "NEBĚŽÍ", "down": "NEFUNKČNÍ",
"wait": "Počkejte prosím", "wait": "Počkejte prosím",
"empty_data": "Stav podsystému neznámý" "empty_data": "Stav podsystému neznámý"
}, },
@@ -95,7 +95,8 @@
"playing": "Přehrává", "playing": "Přehrává",
"transcoding": "Překódovávání", "transcoding": "Překódovávání",
"bitrate": "Přenosová rychlost", "bitrate": "Přenosová rychlost",
"no_active": "Žádný aktivní stream" "no_active": "Žádný aktivní stream",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "Rychlost", "rate": "Rychlost",
@@ -644,5 +645,43 @@
"connected": "Connected", "connected": "Connected",
"new_devices": "New Devices", "new_devices": "New Devices",
"down_alerts": "Down Alerts" "down_alerts": "Down Alerts"
},
"jdownloader": {
"downloadSpeed": "Download Speed",
"downloadCount": "Queue Count",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"map": "Map",
"currentPlayers": "Current players",
"name": "Name",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -234,7 +234,8 @@
"playing": "Afspiller", "playing": "Afspiller",
"transcoding": "Transcoder", "transcoding": "Transcoder",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "Ingen Aktive Streams" "no_active": "Ingen Aktive Streams",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "Rate", "rate": "Rate",
@@ -644,5 +645,43 @@
"connected": "Connected", "connected": "Connected",
"new_devices": "New Devices", "new_devices": "New Devices",
"down_alerts": "Down Alerts" "down_alerts": "Down Alerts"
},
"jdownloader": {
"downloadSpeed": "Download Speed",
"downloadCount": "Queue Count",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -56,7 +56,8 @@
"playing": "Spielen", "playing": "Spielen",
"transcoding": "Transcodierung", "transcoding": "Transcodierung",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "Keine aktiven Streams" "no_active": "Keine aktiven Streams",
"plex_connection_error": "Check Plex Connection"
}, },
"rutorrent": { "rutorrent": {
"active": "Aktiv", "active": "Aktiv",
@@ -644,5 +645,43 @@
"connected": "Verbunden", "connected": "Verbunden",
"new_devices": "Neue Geräte", "new_devices": "Neue Geräte",
"down_alerts": "Down Alarme" "down_alerts": "Down Alarme"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"bots": "Bots",
"ping": "Ping",
"maxPlayers": "Max players"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved",
"inProgress": "In Progress"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -162,7 +162,8 @@
"playing": "Αναπαράγει", "playing": "Αναπαράγει",
"transcoding": "Μετακωδικοποίηση", "transcoding": "Μετακωδικοποίηση",
"bitrate": "Ρυθμός bit", "bitrate": "Ρυθμός bit",
"no_active": "Δεν υπάρχουν ενεργές ροές" "no_active": "Δεν υπάρχουν ενεργές ροές",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "Ρυθμός", "rate": "Ρυθμός",
@@ -644,5 +645,43 @@
"connected": "Connected", "connected": "Connected",
"new_devices": "New Devices", "new_devices": "New Devices",
"down_alerts": "Down Alerts" "down_alerts": "Down Alerts"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"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"
} }
} }

43
public/locales/en/common.json Executable file → Normal file
View File

@@ -92,7 +92,7 @@
"episodes": "Episodes", "episodes": "Episodes",
"songs": "Songs" "songs": "Songs"
}, },
"evcc": { "evcc": {
"pv_power": "Production", "pv_power": "Production",
"battery_soc": "Battery", "battery_soc": "Battery",
"grid_power": "Grid", "grid_power": "Grid",
@@ -129,7 +129,8 @@
"playing": "Playing", "playing": "Playing",
"transcoding": "Transcoding", "transcoding": "Transcoding",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "No Active Streams" "no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
}, },
"omada": { "omada": {
"connectedAp": "Connected APs", "connectedAp": "Connected APs",
@@ -653,5 +654,43 @@
"whatsupdocker": { "whatsupdocker": {
"monitoring": "Monitoring", "monitoring": "Monitoring",
"updates": "Updates" "updates": "Updates"
},
"jdownloader": {
"downloadCount": "Queue",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size",
"downloadSpeed": "Speed"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"urbackup": {
"ok" : "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -87,7 +87,8 @@
"playing": "Playing", "playing": "Playing",
"transcoding": "Transcoding", "transcoding": "Transcoding",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "No Active Streams" "no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "Rate", "rate": "Rate",
@@ -644,5 +645,43 @@
"connected": "Connected", "connected": "Connected",
"new_devices": "New Devices", "new_devices": "New Devices",
"down_alerts": "Down Alerts" "down_alerts": "Down Alerts"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -56,7 +56,8 @@
"playing": "Reproduciendo", "playing": "Reproduciendo",
"transcoding": "Transcodificando", "transcoding": "Transcodificando",
"bitrate": "Tasa de bits", "bitrate": "Tasa de bits",
"no_active": "Sin transmisiones activas" "no_active": "Sin transmisiones activas",
"plex_connection_error": "Comprueba la conexión a Plex"
}, },
"rutorrent": { "rutorrent": {
"active": "Activo", "active": "Activo",
@@ -644,5 +645,43 @@
"connected": "Conectado", "connected": "Conectado",
"new_devices": "Nuevos dispositivos", "new_devices": "Nuevos dispositivos",
"down_alerts": "Alertas" "down_alerts": "Alertas"
},
"jdownloader": {
"downloadCount": "Cola",
"downloadSpeed": "Velocidad",
"downloadBytesRemaining": "Restante",
"downloadTotalBytes": "Tamaño"
},
"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": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

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

View File

@@ -62,7 +62,8 @@
"playing": "Toistaa", "playing": "Toistaa",
"transcoding": "Transkoodaa", "transcoding": "Transkoodaa",
"bitrate": "Bittinopeus", "bitrate": "Bittinopeus",
"no_active": "Ei aktiivisia striimejä" "no_active": "Ei aktiivisia striimejä",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "Nopeus", "rate": "Nopeus",
@@ -644,5 +645,43 @@
"connected": "Connected", "connected": "Connected",
"new_devices": "New Devices", "new_devices": "New Devices",
"down_alerts": "Down Alerts" "down_alerts": "Down Alerts"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -5,8 +5,8 @@
"status": "Statut", "status": "Statut",
"information": "Information", "information": "Information",
"url": "URL", "url": "URL",
"raw_error": "Raw Error", "raw_error": "Erreur brute",
"response_data": "Response Data" "response_data": "Données de réponse"
}, },
"search": { "search": {
"placeholder": "Recherche…" "placeholder": "Recherche…"
@@ -56,7 +56,8 @@
"playing": "En lecture", "playing": "En lecture",
"transcoding": "Transcodage", "transcoding": "Transcodage",
"bitrate": "Débit", "bitrate": "Débit",
"no_active": "Aucun flux actif" "no_active": "Aucun flux actif",
"plex_connection_error": "Vérifier la connexion à Plex"
}, },
"rutorrent": { "rutorrent": {
"active": "Actif", "active": "Actif",
@@ -578,7 +579,7 @@
"homeassistant": { "homeassistant": {
"people_home": "People Home", "people_home": "People Home",
"lights_on": "Lumières allumées", "lights_on": "Lumières allumées",
"switches_on": "Switches On" "switches_on": "Commutateur On"
}, },
"freshrss": { "freshrss": {
"unread": "Non lu", "unread": "Non lu",
@@ -644,5 +645,43 @@
"connected": "Connecté", "connected": "Connecté",
"new_devices": "Nouvel Appareil", "new_devices": "Nouvel Appareil",
"down_alerts": "Alertes" "down_alerts": "Alertes"
},
"jdownloader": {
"downloadCount": "Total en attente",
"downloadSpeed": "Vitesse de téléchargement",
"downloadBytesRemaining": "Restant",
"downloadTotalBytes": "Taille"
},
"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": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -62,7 +62,8 @@
"playing": "מנגן", "playing": "מנגן",
"transcoding": "מקודד", "transcoding": "מקודד",
"bitrate": "סיביות", "bitrate": "סיביות",
"no_active": "אין הזרמות פעילות" "no_active": "אין הזרמות פעילות",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "יחס", "rate": "יחס",
@@ -644,5 +645,43 @@
"connected": "Connected", "connected": "Connected",
"new_devices": "New Devices", "new_devices": "New Devices",
"down_alerts": "Down Alerts" "down_alerts": "Down Alerts"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"myPrs": "My PRs",
"totalPrs": "Total PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -117,7 +117,8 @@
"playing": "Playing", "playing": "Playing",
"transcoding": "Transcoding", "transcoding": "Transcoding",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "No Active Streams" "no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "Rate", "rate": "Rate",
@@ -644,5 +645,43 @@
"connected": "Connected", "connected": "Connected",
"new_devices": "New Devices", "new_devices": "New Devices",
"down_alerts": "Down Alerts" "down_alerts": "Down Alerts"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"myPrs": "My PRs",
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -104,7 +104,8 @@
"playing": "Reprodukcija", "playing": "Reprodukcija",
"transcoding": "Prekodiranje", "transcoding": "Prekodiranje",
"bitrate": "Stopa bitova", "bitrate": "Stopa bitova",
"no_active": "Nema aktivnih prijenosa" "no_active": "Nema aktivnih prijenosa",
"plex_connection_error": "Provjeri Plex vezu"
}, },
"nzbget": { "nzbget": {
"rate": "Stopa", "rate": "Stopa",
@@ -126,21 +127,21 @@
"wanted": "Zatraženo", "wanted": "Zatraženo",
"queued": "U redu čekanja", "queued": "U redu čekanja",
"series": "Serije", "series": "Serije",
"unknown": "Unknown", "unknown": "Nepoznato",
"queue": "Queue" "queue": "Red čekanja"
}, },
"radarr": { "radarr": {
"wanted": "Zatraženo", "wanted": "Zatraženo",
"queued": "U redu čekanja", "queued": "U redu čekanja",
"movies": "Filmovi", "movies": "Filmovi",
"missing": "Nedostaje", "missing": "Nedostaje",
"queue": "Queue", "queue": "Red čekanja",
"unknown": "Unknown" "unknown": "Nepoznato"
}, },
"lidarr": { "lidarr": {
"wanted": "Zatraženo", "wanted": "Zatraženo",
"queued": "U redu čekanja", "queued": "U redu čekanja",
"artists": "Artists" "artists": "Umjetnici"
}, },
"readarr": { "readarr": {
"wanted": "Zatraženo", "wanted": "Zatraženo",
@@ -644,5 +645,43 @@
"connected": "Povezano", "connected": "Povezano",
"new_devices": "Novi uređaji", "new_devices": "Novi uređaji",
"down_alerts": "Obavijest o rušenju" "down_alerts": "Obavijest o rušenju"
},
"jdownloader": {
"downloadCount": "Red čekanja",
"downloadSpeed": "Brzina",
"downloadBytesRemaining": "Preostalo",
"downloadTotalBytes": "Veličina"
},
"kavita": {
"seriesCount": "Serije",
"totalFiles": "Datoteke"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"noRecent": "Out of Date",
"totalUsed": "Used Storage",
"ok": "Ok",
"errored": "Errors"
} }
} }

View File

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

View File

@@ -494,9 +494,9 @@
}, },
"weather": { "weather": {
"wait": "Harap tunggu", "wait": "Harap tunggu",
"current": "Current Location", "current": "Lokasi Saat Ini",
"allow": "Click to allow", "allow": "Klik untuk mengizinkan",
"updating": "Updating" "updating": "Memperbarui"
}, },
"search": { "search": {
"placeholder": "Telusuri…" "placeholder": "Telusuri…"
@@ -590,11 +590,11 @@
"cpu": "CPU", "cpu": "CPU",
"mem": "MEM", "mem": "MEM",
"total": "Total", "total": "Total",
"free": "Free", "free": "Luang",
"used": "Used", "used": "Digunakan",
"load": "Load", "load": "Load",
"temp": "TEMP", "temp": "TEMP",
"max": "Max", "max": "Maks",
"uptime": "UP", "uptime": "UP",
"months": "mo", "months": "mo",
"hours": "h", "hours": "h",
@@ -643,6 +643,45 @@
"playing": "Playing", "playing": "Playing",
"transcoding": "Transcoding", "transcoding": "Transcoding",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "No Active Streams" "no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -7,12 +7,12 @@
"rx": "RX", "rx": "RX",
"error": "Errore", "error": "Errore",
"unknown": "Sconosciuto", "unknown": "Sconosciuto",
"running": "Running", "running": "In esecuzione",
"starting": "Starting", "starting": "In avvio",
"unhealthy": "Unhealthy", "unhealthy": "Unhealthy",
"not_found": "Not Found", "not_found": "Non trovato",
"exited": "Exited", "exited": "Uscito",
"partial": "Partial", "partial": "Parziale",
"healthy": "Healthy" "healthy": "Healthy"
}, },
"emby": { "emby": {
@@ -20,16 +20,17 @@
"transcoding": "Transcodifica", "transcoding": "Transcodifica",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "Nessuno Stream Attivo", "no_active": "Nessuno Stream Attivo",
"movies": "Movies", "movies": "Film",
"series": "Series", "series": "Serie",
"episodes": "Episodes", "episodes": "Episodi",
"songs": "Songs" "songs": "Canzoni"
}, },
"tautulli": { "tautulli": {
"playing": "In riproduzione", "playing": "In riproduzione",
"transcoding": "Transcodifica", "transcoding": "Transcodifica",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "Nessuno Stream Attivo" "no_active": "Nessuno Stream Attivo",
"plex_connection_error": "Check Plex Connection"
}, },
"speedtest": { "speedtest": {
"upload": "Upload", "upload": "Upload",
@@ -82,16 +83,16 @@
"series": "Serie", "series": "Serie",
"wanted": "Richiesti", "wanted": "Richiesti",
"queued": "In coda", "queued": "In coda",
"queue": "Queue", "queue": "Coda",
"unknown": "Unknown" "unknown": "Sconosciuto"
}, },
"radarr": { "radarr": {
"wanted": "Richiesti", "wanted": "Richiesti",
"queued": "In coda", "queued": "In coda",
"movies": "Film", "movies": "Film",
"missing": "Mancanti", "missing": "Mancanti",
"queue": "Queue", "queue": "Coda",
"unknown": "Unknown" "unknown": "Sconosciuto"
}, },
"readarr": { "readarr": {
"wanted": "Richiesti", "wanted": "Richiesti",
@@ -112,7 +113,7 @@
"queries": "Richieste", "queries": "Richieste",
"blocked": "Bloccati", "blocked": "Bloccati",
"gravity": "Severità", "gravity": "Severità",
"blocked_percent": "Blocked %" "blocked_percent": "Bloccato %"
}, },
"npm": { "npm": {
"enabled": "Attivi", "enabled": "Attivi",
@@ -175,9 +176,9 @@
"missingMovies": "Film Mancanti" "missingMovies": "Film Mancanti"
}, },
"lidarr": { "lidarr": {
"wanted": "Mancanti", "wanted": "Richiesto",
"queued": "In coda", "queued": "In coda",
"artists": "Artists" "artists": "Artisti"
}, },
"adguard": { "adguard": {
"queries": "Interrogazioni", "queries": "Interrogazioni",
@@ -228,13 +229,13 @@
"devices": "Dispositivi", "devices": "Dispositivi",
"lan_devices": "Dispositivi LAN", "lan_devices": "Dispositivi LAN",
"wlan_devices": "Dispositivi WLAN", "wlan_devices": "Dispositivi WLAN",
"empty_data": "Subsystem status unknown" "empty_data": "Stato del sottosistema sconosciuto"
}, },
"plex": { "plex": {
"streams": "Trasmissioni attive", "streams": "Trasmissioni attive",
"movies": "Film", "movies": "Film",
"tv": "Programma televisivo", "tv": "Programma televisivo",
"albums": "Albums" "albums": "Album"
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
@@ -243,11 +244,11 @@
"uptime": "UP", "uptime": "UP",
"days": "d", "days": "d",
"hours": "h", "hours": "h",
"load": "Load", "load": "Carico",
"warn": "Warn", "warn": "Avviso",
"total": "Total", "total": "Totale",
"free": "Free", "free": "Libero",
"used": "Used" "used": "Usato"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "Totale Osservato", "totalObserved": "Totale Osservato",
@@ -314,9 +315,9 @@
"quicklaunch": { "quicklaunch": {
"bookmark": "Segnalibro", "bookmark": "Segnalibro",
"service": "Servizio", "service": "Servizio",
"search": "Search", "search": "Cerca",
"custom": "Custom", "custom": "Personalizzato",
"visit": "Visit", "visit": "Visita",
"url": "URL" "url": "URL"
}, },
"homebridge": { "homebridge": {
@@ -327,7 +328,7 @@
"child_bridges": "Child Bridges", "child_bridges": "Child Bridges",
"child_bridges_status": "{{ok}}/{{total}}", "child_bridges_status": "{{ok}}/{{total}}",
"up": "Up", "up": "Up",
"pending": "Pending", "pending": "In attesa",
"down": "Down" "down": "Down"
}, },
"autobrr": { "autobrr": {
@@ -432,7 +433,7 @@
"cpuLoad": "Carico della CPU", "cpuLoad": "Carico della CPU",
"memoryUsed": "Memoria Utilizzata", "memoryUsed": "Memoria Utilizzata",
"uptime": "Tempo di attività", "uptime": "Tempo di attività",
"numberOfLeases": "Lease" "numberOfLeases": "Rilasci"
}, },
"xteve": { "xteve": {
"streams_all": "Tutti gli stream", "streams_all": "Tutti gli stream",
@@ -440,209 +441,247 @@
"streams_xepg": "Canali XEPG" "streams_xepg": "Canali XEPG"
}, },
"opnsense": { "opnsense": {
"cpu": "Carico CPU", "cpu": "Carico della CPU",
"memory": "Memoria in uso", "memory": "Memoria in uso",
"wanUpload": "WAN Upload", "wanUpload": "WAN Upload",
"wanDownload": "WAN Download" "wanDownload": "WAN Download"
}, },
"moonraker": { "moonraker": {
"printer_state": "Printer State", "printer_state": "Stato stampante",
"print_status": "Print Status", "print_status": "Stato Stampante",
"print_progress": "Progress", "print_progress": "Avanzamento",
"layers": "Layers" "layers": "Livelli"
}, },
"medusa": { "medusa": {
"wanted": "Wanted", "wanted": "Richiesto",
"queued": "Queued", "queued": "In coda",
"series": "Series" "series": "Serie"
}, },
"octoprint": { "octoprint": {
"printer_state": "Status", "printer_state": "Stato",
"temp_tool": "Tool temp", "temp_tool": "Tool temp",
"temp_bed": "Bed temp", "temp_bed": "Bed temp",
"job_completion": "Completion" "job_completion": "Completamento"
}, },
"cloudflared": { "cloudflared": {
"origin_ip": "Origin IP", "origin_ip": "IP sorgente",
"status": "Status" "status": "Stato"
}, },
"proxmoxbackupserver": { "proxmoxbackupserver": {
"datastore_usage": "Datastore", "datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h", "failed_tasks_24h": "Attività Non Riuscite 24h",
"cpu_usage": "CPU", "cpu_usage": "CPU",
"memory_usage": "Memory" "memory_usage": "Memoria"
}, },
"immich": { "immich": {
"users": "Users", "users": "Utenti",
"photos": "Photos", "photos": "Foto",
"videos": "Videos", "videos": "Video",
"storage": "Storage" "storage": "Memoria"
}, },
"uptimekuma": { "uptimekuma": {
"up": "Sites Up", "up": "Siti On",
"down": "Sites Down", "down": "Siti Down",
"uptime": "Uptime", "uptime": "Uptime",
"incident": "Incident", "incident": "Incidente",
"m": "m" "m": "m"
}, },
"komga": { "komga": {
"libraries": "Libraries", "libraries": "Librerie",
"series": "Series", "series": "Serie",
"books": "Books" "books": "Libri"
}, },
"mylar": { "mylar": {
"series": "Series", "series": "Serie",
"issues": "Issues", "issues": "Problemi",
"wanted": "Wanted" "wanted": "Richiesto"
}, },
"photoprism": { "photoprism": {
"albums": "Albums", "albums": "Album",
"photos": "Photos", "photos": "Foto",
"videos": "Videos", "videos": "Video",
"people": "People" "people": "Persone"
}, },
"diskstation": { "diskstation": {
"days": "Days", "days": "Giorni",
"uptime": "Uptime", "uptime": "Uptime",
"volumeAvailable": "Available" "volumeAvailable": "Disponibile"
}, },
"fileflows": { "fileflows": {
"queue": "Queue", "queue": "Coda",
"processing": "Processing", "processing": "In Lavorazione",
"processed": "Processed", "processed": "Elaborato",
"time": "Time" "time": "Tempo"
}, },
"grafana": { "grafana": {
"dashboards": "Dashboards", "dashboards": "Dashboards",
"datasources": "Data Sources", "datasources": "Origine dei Dati",
"totalalerts": "Total Alerts", "totalalerts": "Avvisi Totali",
"alertstriggered": "Alerts Triggered" "alertstriggered": "Avvisi Attivati"
}, },
"nextcloud": { "nextcloud": {
"memoryusage": "Memory Usage", "memoryusage": "Uso della Memoria",
"cpuload": "Cpu Load", "cpuload": "Carico della CPU",
"freespace": "Free Space", "freespace": "Spazio Libero",
"activeusers": "Active Users", "activeusers": "Utenti Attivi",
"numfiles": "Files", "numfiles": "File",
"numshares": "Shared Items" "numshares": "Oggetti Condivisi"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Stato",
"size": "Size", "size": "Dimensione",
"lastrun": "Last Run", "lastrun": "Ultima esecuzione",
"nextrun": "Next Run", "nextrun": "Prossima esecuzione",
"failed": "Failed" "failed": "Fallito"
}, },
"unmanic": { "unmanic": {
"active_workers": "Active Workers", "active_workers": "Lavoratori Attivi",
"total_workers": "Total Workers", "total_workers": "Lavoratori Totali",
"records_total": "Queue Length" "records_total": "Lunghezza della Coda"
}, },
"healthchecks": { "healthchecks": {
"new": "New", "new": "Nuovo",
"up": "Online", "up": "Online",
"grace": "In Grace Period", "grace": "Periodo di Tolleranza",
"down": "Offline", "down": "Offline",
"paused": "Paused", "paused": "In Pausa",
"status": "Status", "status": "Stato",
"last_ping": "Last Ping", "last_ping": "Ultimo Ping",
"never": "No pings yet" "never": "Ancora nessun ping"
}, },
"pterodactyl": { "pterodactyl": {
"servers": "Servers", "servers": "Server",
"nodes": "Nodes" "nodes": "Nodi"
}, },
"prometheus": { "prometheus": {
"targets_up": "Targets Up", "targets_up": "Targets Up",
"targets_down": "Targets Down", "targets_down": "Targets Down",
"targets_total": "Total Targets" "targets_total": "Targets Totali"
}, },
"minecraft": { "minecraft": {
"players": "Players", "players": "Giocatori",
"version": "Version", "version": "Versione",
"status": "Status", "status": "Stato",
"up": "Online", "up": "Online",
"down": "Offline" "down": "Offline"
}, },
"ghostfolio": { "ghostfolio": {
"gross_percent_today": "Today", "gross_percent_today": "Oggi",
"gross_percent_1y": "One year", "gross_percent_1y": "Un anno",
"gross_percent_max": "All time" "gross_percent_max": "Sempre"
}, },
"audiobookshelf": { "audiobookshelf": {
"podcasts": "Podcasts", "podcasts": "Podcast",
"books": "Books", "books": "Libri",
"podcastsDuration": "Duration", "podcastsDuration": "Durata",
"booksDuration": "Duration" "booksDuration": "Durata"
}, },
"homeassistant": { "homeassistant": {
"people_home": "People Home", "people_home": "Persone a Casa",
"lights_on": "Lights On", "lights_on": "Luci Accese",
"switches_on": "Switches On" "switches_on": "Switch Accesi"
}, },
"freshrss": { "freshrss": {
"subscriptions": "Subscriptions", "subscriptions": "Iscrizioni",
"unread": "Unread" "unread": "Non letto"
}, },
"channelsdvrserver": { "channelsdvrserver": {
"shows": "Shows", "shows": "Spettacoli",
"recordings": "Recordings", "recordings": "Registrazioni",
"scheduled": "Scheduled", "scheduled": "Programmati",
"passes": "Passes" "passes": "Tessere"
}, },
"whatsupdocker": { "whatsupdocker": {
"monitoring": "Monitoring", "monitoring": "Monitoraggio",
"updates": "Updates" "updates": "Aggiornamenti"
}, },
"tailscale": { "tailscale": {
"never": "Never", "never": "Mai",
"address": "Address", "address": "Indirizzo",
"expires": "Expires", "expires": "Scade",
"last_seen": "Last Seen", "last_seen": "Ultima visualizzazione",
"now": "Now", "now": "Adesso",
"years": "{{number}}y", "years": "{{number}}y",
"weeks": "{{number}}w", "weeks": "{{number}}w",
"hours": "{{number}}h", "hours": "{{number}}h",
"minutes": "{{number}}m", "minutes": "{{number}}m",
"seconds": "{{number}}s", "seconds": "{{number}}s",
"ago": "{{value}} Ago", "ago": "{{value}} Fa",
"days": "{{number}}d" "days": "{{number}}d"
}, },
"qnap": { "qnap": {
"cpuUsage": "CPU Usage", "cpuUsage": "Utilizzo CPU",
"memUsage": "MEM Usage", "memUsage": "Utilizzo MEM",
"systemTempC": "System Temp", "systemTempC": "Temp sistema",
"poolUsage": "Pool Usage", "poolUsage": "Utilizzo Pool",
"volumeUsage": "Volume Usage", "volumeUsage": "Utilizzo Volume",
"invalid": "Invalid" "invalid": "Invalido"
}, },
"pfsense": { "pfsense": {
"load": "Load Avg", "load": "Carico Medio",
"memory": "Mem Usage", "memory": "Uso Memoria",
"wanStatus": "WAN Status", "wanStatus": "Stato WAN",
"up": "Up", "up": "Up",
"down": "Down", "down": "Down",
"temp": "Temp", "temp": "Temperatura",
"disk": "Disk Usage", "disk": "Uso Disco",
"wanIP": "WAN IP" "wanIP": "IP WAN"
}, },
"caddy": { "caddy": {
"upstreams": "Upstreams", "upstreams": "Upstream",
"requests": "Current requests", "requests": "Richieste correnti",
"requests_failed": "Failed requests" "requests_failed": "Richieste fallite"
}, },
"evcc": { "evcc": {
"pv_power": "Production", "pv_power": "Produzione",
"battery_soc": "Battery", "battery_soc": "Batteria",
"grid_power": "Grid", "grid_power": "Griglia",
"home_power": "Consumption", "home_power": "Consumo",
"charge_power": "Charger", "charge_power": "Caricatore",
"watt_hour": "Wh" "watt_hour": "Wh"
}, },
"pialert": { "pialert": {
"total": "Total", "total": "Totali",
"connected": "Connected", "connected": "Connesso",
"new_devices": "New Devices", "new_devices": "Nuovi Dispositivi",
"down_alerts": "Down Alerts" "down_alerts": "Avvisi di Disservizio"
},
"jdownloader": {
"downloadCount": "Coda",
"downloadSpeed": "Velocità Download",
"downloadBytesRemaining": "Residuo",
"downloadTotalBytes": "Dimensione"
},
"kavita": {
"seriesCount": "Serie",
"totalFiles": "File"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"myPrs": "My PRs",
"approved": "Approved",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -63,7 +63,7 @@
"resources": { "resources": {
"cpu": "CPU", "cpu": "CPU",
"total": "合計", "total": "合計",
"free": "フリー", "free": "Free",
"used": "使用", "used": "使用",
"load": "ロード", "load": "ロード",
"mem": "MEM", "mem": "MEM",
@@ -136,7 +136,8 @@
"playing": "再生中", "playing": "再生中",
"transcoding": "変換中", "transcoding": "変換中",
"bitrate": "ビットレート", "bitrate": "ビットレート",
"no_active": "アクティブストリームなし" "no_active": "アクティブストリームなし",
"plex_connection_error": "Check Plex Connection"
}, },
"omada": { "omada": {
"connectedAp": "接続されたAP", "connectedAp": "接続されたAP",
@@ -239,7 +240,7 @@
"queries": "クエリ", "queries": "クエリ",
"blocked": "ブロック中", "blocked": "ブロック中",
"gravity": "グラビティ", "gravity": "グラビティ",
"blocked_percent": "Blocked %" "blocked_percent": "ブロック %"
}, },
"adguard": { "adguard": {
"queries": "クエリ", "queries": "クエリ",
@@ -609,11 +610,11 @@
"ago": "{{value}} 前" "ago": "{{value}} 前"
}, },
"qnap": { "qnap": {
"cpuUsage": "CPU Usage", "cpuUsage": "CPU使用量",
"memUsage": "MEM Usage", "memUsage": "MEM使用量",
"systemTempC": "System Temp", "systemTempC": "システム温度",
"poolUsage": "Pool Usage", "poolUsage": "プール使用量",
"volumeUsage": "Volume Usage", "volumeUsage": "ボリューム使用量",
"invalid": "Invalid" "invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
@@ -633,16 +634,54 @@
}, },
"evcc": { "evcc": {
"watt_hour": "Wh", "watt_hour": "Wh",
"pv_power": "Production", "pv_power": "発電量",
"battery_soc": "Battery", "battery_soc": "バッテリー",
"grid_power": "Grid", "grid_power": "グリッド",
"home_power": "Consumption", "home_power": "消費",
"charge_power": "Charger" "charge_power": "チャージャー"
}, },
"pialert": { "pialert": {
"total": "Total", "total": "Total",
"connected": "Connected", "connected": "Connected",
"new_devices": "New Devices", "new_devices": "New Devices",
"down_alerts": "Down Alerts" "down_alerts": "Down Alerts"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -111,7 +111,8 @@
"playing": "재생 중", "playing": "재생 중",
"transcoding": "트랜스코딩", "transcoding": "트랜스코딩",
"bitrate": "비트레이트", "bitrate": "비트레이트",
"no_active": "활성 스트림 없음" "no_active": "활성 스트림 없음",
"plex_connection_error": "Check Plex Connection"
}, },
"omada": { "omada": {
"connectedAp": "연결된 AP", "connectedAp": "연결된 AP",
@@ -644,5 +645,43 @@
"connected": "Connected", "connected": "Connected",
"down_alerts": "Down Alerts", "down_alerts": "Down Alerts",
"new_devices": "New Devices" "new_devices": "New Devices"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"ping": "Ping",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -97,7 +97,8 @@
"playing": "Atskaņo", "playing": "Atskaņo",
"transcoding": "Pārkodē", "transcoding": "Pārkodē",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "Nav aktīvu straumju" "no_active": "Nav aktīvu straumju",
"plex_connection_error": "Check Plex Connection"
}, },
"omada": { "omada": {
"connectedAp": "Savienotie piekļuves punkti", "connectedAp": "Savienotie piekļuves punkti",
@@ -644,5 +645,43 @@
"connected": "Connected", "connected": "Connected",
"new_devices": "New Devices", "new_devices": "New Devices",
"down_alerts": "Down Alerts" "down_alerts": "Down Alerts"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -200,7 +200,8 @@
"playing": "Sedang Dimainkan", "playing": "Sedang Dimainkan",
"transcoding": "Transkoding", "transcoding": "Transkoding",
"bitrate": "Kadar bit", "bitrate": "Kadar bit",
"no_active": "Tiada Strim Aktif" "no_active": "Tiada Strim Aktif",
"plex_connection_error": "Check Plex Connection"
}, },
"plex": { "plex": {
"streams": "Strim Aktif", "streams": "Strim Aktif",
@@ -644,5 +645,43 @@
"connected": "Connected", "connected": "Connected",
"new_devices": "New Devices", "new_devices": "New Devices",
"down_alerts": "Down Alerts" "down_alerts": "Down Alerts"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -56,7 +56,8 @@
"playing": "Spiller", "playing": "Spiller",
"transcoding": "Transkoding", "transcoding": "Transkoding",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "Ingen aktive strømmer" "no_active": "Ingen aktive strømmer",
"plex_connection_error": "Check Plex Connection"
}, },
"rutorrent": { "rutorrent": {
"active": "Aktiv", "active": "Aktiv",
@@ -644,5 +645,43 @@
"connected": "Connected", "connected": "Connected",
"new_devices": "New Devices", "new_devices": "New Devices",
"down_alerts": "Down Alerts" "down_alerts": "Down Alerts"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Filer"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -72,7 +72,8 @@
"playing": "Afspelen", "playing": "Afspelen",
"transcoding": "Transcodering", "transcoding": "Transcodering",
"bitrate": "Bitsnelheid", "bitrate": "Bitsnelheid",
"no_active": "Geen Actieve Streams" "no_active": "Geen Actieve Streams",
"plex_connection_error": "Check Plex Connection"
}, },
"rutorrent": { "rutorrent": {
"active": "Actief", "active": "Actief",
@@ -644,5 +645,43 @@
"connected": "Connected", "connected": "Connected",
"new_devices": "New Devices", "new_devices": "New Devices",
"down_alerts": "Down Alerts" "down_alerts": "Down Alerts"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -37,7 +37,8 @@
"playing": "Odtwarzanie", "playing": "Odtwarzanie",
"transcoding": "Transkodowanie", "transcoding": "Transkodowanie",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "Brak aktywnych strumieni" "no_active": "Brak aktywnych strumieni",
"plex_connection_error": "Check Plex Connection"
}, },
"speedtest": { "speedtest": {
"download": "Pobieranie", "download": "Pobieranie",
@@ -644,5 +645,43 @@
"connected": "Connected", "connected": "Connected",
"new_devices": "New Devices", "new_devices": "New Devices",
"down_alerts": "Down Alerts" "down_alerts": "Down Alerts"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"myPrs": "My PRs",
"approved": "Approved",
"result": "Result",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

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

View File

@@ -56,7 +56,8 @@
"playing": "Reproduzindo", "playing": "Reproduzindo",
"transcoding": "Transcodificação", "transcoding": "Transcodificação",
"bitrate": "Taxa de bits", "bitrate": "Taxa de bits",
"no_active": "Sem streams ativas" "no_active": "Sem streams ativas",
"plex_connection_error": "Check Plex Connection"
}, },
"rutorrent": { "rutorrent": {
"active": "Ativo", "active": "Ativo",
@@ -590,12 +591,12 @@
"switches_on": "Interruptores Ligados" "switches_on": "Interruptores Ligados"
}, },
"freshrss": { "freshrss": {
"subscriptions": "Subscriptions", "subscriptions": "Assinaturas",
"unread": "Unread" "unread": "Não lida"
}, },
"channelsdvrserver": { "channelsdvrserver": {
"shows": "Shows", "shows": "Shows",
"recordings": "Recordings", "recordings": "Gravações",
"scheduled": "Scheduled", "scheduled": "Scheduled",
"passes": "Passes" "passes": "Passes"
}, },
@@ -637,21 +638,59 @@
}, },
"caddy": { "caddy": {
"upstreams": "Upstreams", "upstreams": "Upstreams",
"requests": "Current requests", "requests": "Solicitações atuais",
"requests_failed": "Failed requests" "requests_failed": "Solicitações com falha"
}, },
"evcc": { "evcc": {
"pv_power": "Production", "pv_power": "Produção",
"battery_soc": "Battery", "battery_soc": "Bateria",
"grid_power": "Grid", "grid_power": "Grade",
"home_power": "Consumption", "home_power": "Consumo",
"charge_power": "Charger", "charge_power": "Carregador",
"watt_hour": "Wh" "watt_hour": "Kw"
}, },
"pialert": { "pialert": {
"total": "Total", "total": "Total",
"connected": "Connected", "connected": "Connected",
"new_devices": "New Devices", "new_devices": "New Devices",
"down_alerts": "Down Alerts" "down_alerts": "Down Alerts"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"approved": "Approved",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -92,7 +92,8 @@
"no_active": "Niciun stream activ", "no_active": "Niciun stream activ",
"playing": "Activ", "playing": "Activ",
"transcoding": "Transcodare", "transcoding": "Transcodare",
"bitrate": "Bitrate" "bitrate": "Bitrate",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "Rată", "rate": "Rată",
@@ -644,5 +645,43 @@
"down_alerts": "Down Alerts", "down_alerts": "Down Alerts",
"total": "Total", "total": "Total",
"connected": "Connected" "connected": "Connected"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved",
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -56,7 +56,8 @@
"playing": "Воспроизведение", "playing": "Воспроизведение",
"transcoding": "Транскодирование", "transcoding": "Транскодирование",
"bitrate": "Битрейт", "bitrate": "Битрейт",
"no_active": "Нет активных трансляций" "no_active": "Нет активных трансляций",
"plex_connection_error": "Проверьте соединение с Plex"
}, },
"rutorrent": { "rutorrent": {
"active": "Активный", "active": "Активный",
@@ -64,22 +65,22 @@
"download": "Загрузка" "download": "Загрузка"
}, },
"sonarr": { "sonarr": {
"wanted": "Хотел", "wanted": "Желаемое",
"queued": "В очереди", "queued": "В очереди",
"series": "Серии", "series": "Серии",
"queue": "Queue", "queue": "Очередь",
"unknown": "Unknown" "unknown": "Unknown"
}, },
"radarr": { "radarr": {
"wanted": "Хотел", "wanted": "Желаемое",
"queued": "В очереди", "queued": "В очереди",
"movies": "Фильмы", "movies": "Фильмы",
"missing": "Пропущено", "missing": "Пропущено",
"queue": "Queue", "queue": "Очередь",
"unknown": "Unknown" "unknown": "Unknown"
}, },
"readarr": { "readarr": {
"wanted": "Хотел", "wanted": "Желаемое",
"queued": "В очереди", "queued": "В очереди",
"books": "Книги" "books": "Книги"
}, },
@@ -175,9 +176,9 @@
"missingMovies": "Отсутствующие фильмы" "missingMovies": "Отсутствующие фильмы"
}, },
"lidarr": { "lidarr": {
"wanted": "Хотел", "wanted": "Желаемое",
"queued": "В очереди", "queued": "В очереди",
"artists": "Artists" "artists": "Артисты"
}, },
"adguard": { "adguard": {
"queries": "Запросы", "queries": "Запросы",
@@ -612,8 +613,8 @@
"cpuUsage": "CPU Usage", "cpuUsage": "CPU Usage",
"memUsage": "MEM Usage", "memUsage": "MEM Usage",
"systemTempC": "System Temp", "systemTempC": "System Temp",
"poolUsage": "Pool Usage", "poolUsage": "Использование пула",
"volumeUsage": "Volume Usage", "volumeUsage": "Использование тома",
"invalid": "Invalid" "invalid": "Invalid"
}, },
"pfsense": { "pfsense": {
@@ -627,22 +628,60 @@
"temp": "Temp" "temp": "Temp"
}, },
"caddy": { "caddy": {
"upstreams": "Upstreams", "upstreams": "Апстримы",
"requests": "Current requests", "requests": "Текущие запросы",
"requests_failed": "Failed requests" "requests_failed": "Неудачные запросы"
}, },
"evcc": { "evcc": {
"home_power": "Consumption", "home_power": "Потребление",
"pv_power": "Production", "pv_power": "Production",
"battery_soc": "Battery", "battery_soc": "Battery",
"grid_power": "Grid", "grid_power": "Grid",
"charge_power": "Charger", "charge_power": "Зарядка",
"watt_hour": "Wh" "watt_hour": "Wh"
}, },
"pialert": { "pialert": {
"total": "Total", "total": "Total",
"connected": "Connected", "connected": "Connected",
"new_devices": "New Devices", "new_devices": "Новые устройства",
"down_alerts": "Down Alerts" "down_alerts": "Оповещения о сбоях"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -221,7 +221,8 @@
"playing": "Playing", "playing": "Playing",
"transcoding": "Transcoding", "transcoding": "Transcoding",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "No Active Streams" "no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
}, },
"omada": { "omada": {
"connectedAp": "Connected APs", "connectedAp": "Connected APs",
@@ -644,5 +645,43 @@
"connected": "Connected", "connected": "Connected",
"new_devices": "New Devices", "new_devices": "New Devices",
"down_alerts": "Down Alerts" "down_alerts": "Down Alerts"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"succeeded": "Succeeded",
"notStarted": "Not Started",
"inProgress": "In Progress",
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"failed": "Failed",
"canceled": "Canceled",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -168,7 +168,8 @@
"transcoding": "Transkodira", "transcoding": "Transkodira",
"bitrate": "Pasovna širina", "bitrate": "Pasovna širina",
"playing": "Predvaja", "playing": "Predvaja",
"no_active": "Ni aktivne vsebine" "no_active": "Ni aktivne vsebine",
"plex_connection_error": "Check Plex Connection"
}, },
"flood": { "flood": {
"download": "Prenos", "download": "Prenos",
@@ -236,21 +237,21 @@
"wanted": "Iskano", "wanted": "Iskano",
"queued": "V vrsti", "queued": "V vrsti",
"series": "Serije", "series": "Serije",
"queue": "Queue", "queue": "Vrsta",
"unknown": "Unknown" "unknown": "Neznano"
}, },
"radarr": { "radarr": {
"wanted": "Iskano", "wanted": "Iskano",
"missing": "Manjka", "missing": "Manjka",
"queued": "V vrsti", "queued": "V vrsti",
"movies": "Filmi", "movies": "Filmi",
"queue": "Queue", "queue": "Vrsta",
"unknown": "Unknown" "unknown": "Neznano"
}, },
"lidarr": { "lidarr": {
"wanted": "Iskano", "wanted": "Iskano",
"queued": "V vrsti", "queued": "V vrsti",
"artists": "Artists" "artists": "Avtorji"
}, },
"readarr": { "readarr": {
"wanted": "Iskano", "wanted": "Iskano",
@@ -359,11 +360,11 @@
"uptime": "UP", "uptime": "UP",
"days": "d", "days": "d",
"hours": "u", "hours": "u",
"free": "Free", "free": "Prosto",
"load": "Load", "load": "Obremenitev",
"warn": "Warn", "warn": "Opoz.",
"total": "Total", "total": "Skupaj",
"used": "Used" "used": "V uporabi"
}, },
"authentik": { "authentik": {
"users": "Uporabniki", "users": "Uporabniki",
@@ -613,8 +614,8 @@
"memUsage": "MEM", "memUsage": "MEM",
"systemTempC": "Temperatura", "systemTempC": "Temperatura",
"poolUsage": "Prostor", "poolUsage": "Prostor",
"volumeUsage": "Volume Usage", "volumeUsage": "Prostora",
"invalid": "Invalid" "invalid": "Neveljavno"
}, },
"pfsense": { "pfsense": {
"load": "Povp. obremenitev", "load": "Povp. obremenitev",
@@ -640,9 +641,47 @@
"watt_hour": "Wh" "watt_hour": "Wh"
}, },
"pialert": { "pialert": {
"total": "Total", "total": "Skupaj",
"connected": "Connected", "connected": "Povezanih",
"new_devices": "New Devices", "new_devices": "Nove naprave",
"down_alerts": "Down Alerts" "down_alerts": "Izključeno"
},
"jdownloader": {
"downloadCount": "Vrsta",
"downloadSpeed": "Hitrost prenosa",
"downloadBytesRemaining": "Še ostane",
"downloadTotalBytes": "Velikost"
},
"kavita": {
"seriesCount": "Serije",
"totalFiles": "Datoteke"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -79,7 +79,8 @@
"playing": "Playing", "playing": "Playing",
"transcoding": "Transcoding", "transcoding": "Transcoding",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "No Active Streams" "no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "Rate", "rate": "Rate",
@@ -644,5 +645,43 @@
"connected": "Connected", "connected": "Connected",
"new_devices": "New Devices", "new_devices": "New Devices",
"down_alerts": "Down Alerts" "down_alerts": "Down Alerts"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -62,7 +62,8 @@
"playing": "Spelar", "playing": "Spelar",
"transcoding": "Omkodning", "transcoding": "Omkodning",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "Inga aktiva strömmar" "no_active": "Inga aktiva strömmar",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "Hastighet", "rate": "Hastighet",
@@ -644,5 +645,43 @@
"connected": "Connected", "connected": "Connected",
"new_devices": "New Devices", "new_devices": "New Devices",
"down_alerts": "Down Alerts" "down_alerts": "Down Alerts"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"totalFiles": "Files",
"seriesCount": "Series"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"approved": "Approved",
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -79,7 +79,8 @@
"playing": "ఆడుతున్నారు", "playing": "ఆడుతున్నారు",
"transcoding": "ట్రాన్స్‌కోడింగ్", "transcoding": "ట్రాన్స్‌కోడింగ్",
"bitrate": "బిట్రేట్", "bitrate": "బిట్రేట్",
"no_active": "యాక్టివ్ స్ట్రీమ్‌లు లేవు" "no_active": "యాక్టివ్ స్ట్రీమ్‌లు లేవు",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "రేట్", "rate": "రేట్",
@@ -644,5 +645,43 @@
"connected": "Connected", "connected": "Connected",
"new_devices": "New Devices", "new_devices": "New Devices",
"down_alerts": "Down Alerts" "down_alerts": "Down Alerts"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"totalFiles": "Files",
"seriesCount": "Series"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"myPrs": "My PRs",
"approved": "Approved",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -139,7 +139,8 @@
"playing": "Playing", "playing": "Playing",
"transcoding": "Transcoding", "transcoding": "Transcoding",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "No Active Streams" "no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
}, },
"omada": { "omada": {
"connectedAp": "Connected APs", "connectedAp": "Connected APs",
@@ -644,5 +645,43 @@
"connected": "Connected", "connected": "Connected",
"new_devices": "New Devices", "new_devices": "New Devices",
"down_alerts": "Down Alerts" "down_alerts": "Down Alerts"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -79,7 +79,8 @@
"playing": "Oynatılıyor", "playing": "Oynatılıyor",
"transcoding": "Dönüştürülüyor", "transcoding": "Dönüştürülüyor",
"bitrate": "Bit Oranı", "bitrate": "Bit Oranı",
"no_active": "Aktif akış yok" "no_active": "Aktif akış yok",
"plex_connection_error": "Check Plex Connection"
}, },
"nzbget": { "nzbget": {
"rate": "Oran", "rate": "Oran",
@@ -644,5 +645,43 @@
"connected": "Bağlandı", "connected": "Bağlandı",
"new_devices": "Yeni Cihazlar", "new_devices": "Yeni Cihazlar",
"down_alerts": "Düşme Uyarıları" "down_alerts": "Düşme Uyarıları"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -198,7 +198,8 @@
"playing": "Відтворення", "playing": "Відтворення",
"transcoding": "Перекодування", "transcoding": "Перекодування",
"bitrate": "Бітрейт", "bitrate": "Бітрейт",
"no_active": "Немає активних потоків" "no_active": "Немає активних потоків",
"plex_connection_error": "Перевірте з'єднання Plex"
}, },
"nzbget": { "nzbget": {
"rate": "Швидкість", "rate": "Швидкість",
@@ -644,5 +645,43 @@
"connected": "Підключено", "connected": "Підключено",
"new_devices": "Нові пристрої", "new_devices": "Нові пристрої",
"down_alerts": "Сповіщення про збій" "down_alerts": "Сповіщення про збій"
},
"jdownloader": {
"downloadCount": "Черга",
"downloadSpeed": "Швидкість",
"downloadBytesRemaining": "Залишилося",
"downloadTotalBytes": "Розмір"
},
"kavita": {
"seriesCount": "Серій",
"totalFiles": "Файлів"
},
"gamedig": {
"name": "Назва",
"map": "Мапа",
"currentPlayers": "Поточні гравці",
"players": "Гравці",
"maxPlayers": "Максимум гравців",
"bots": "Ботів",
"ping": "Пінг"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -56,7 +56,8 @@
"playing": "Đang chơi", "playing": "Đang chơi",
"transcoding": "Chuyển định dạng", "transcoding": "Chuyển định dạng",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "No Active Streams" "no_active": "No Active Streams",
"plex_connection_error": "Check Plex Connection"
}, },
"rutorrent": { "rutorrent": {
"active": "Hoạt động", "active": "Hoạt động",
@@ -644,5 +645,43 @@
"connected": "Connected", "connected": "Connected",
"new_devices": "New Devices", "new_devices": "New Devices",
"down_alerts": "Down Alerts" "down_alerts": "Down Alerts"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -13,7 +13,8 @@
"playing": "播放緊", "playing": "播放緊",
"no_active": "無任何活動", "no_active": "無任何活動",
"transcoding": "轉碼緊", "transcoding": "轉碼緊",
"bitrate": "比特率" "bitrate": "比特率",
"plex_connection_error": "Check Plex Connection"
}, },
"transmission": { "transmission": {
"download": "下載速度", "download": "下載速度",
@@ -644,5 +645,43 @@
"connected": "Connected", "connected": "Connected",
"new_devices": "New Devices", "new_devices": "New Devices",
"down_alerts": "Down Alerts" "down_alerts": "Down Alerts"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -56,7 +56,8 @@
"playing": "播放中", "playing": "播放中",
"transcoding": "转码", "transcoding": "转码",
"bitrate": "比特率", "bitrate": "比特率",
"no_active": "暂无播放" "no_active": "暂无播放",
"plex_connection_error": "Check Plex Connection"
}, },
"rutorrent": { "rutorrent": {
"active": "活动中", "active": "活动中",
@@ -632,7 +633,7 @@
"requests_failed": "失败请求" "requests_failed": "失败请求"
}, },
"evcc": { "evcc": {
"pv_power": "Production", "pv_power": "正式环境",
"battery_soc": "Battery", "battery_soc": "Battery",
"grid_power": "Grid", "grid_power": "Grid",
"home_power": "Consumption", "home_power": "Consumption",
@@ -644,5 +645,43 @@
"connected": "Connected", "connected": "Connected",
"new_devices": "New Devices", "new_devices": "New Devices",
"down_alerts": "Down Alerts" "down_alerts": "Down Alerts"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"canceled": "Canceled",
"inProgress": "In Progress",
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -44,7 +44,8 @@
"playing": "正在播放", "playing": "正在播放",
"transcoding": "轉碼", "transcoding": "轉碼",
"bitrate": "位元率", "bitrate": "位元率",
"no_active": "無播放活動" "no_active": "無播放活動",
"plex_connection_error": "Check Plex Connection"
}, },
"jellyseerr": { "jellyseerr": {
"pending": "待下載", "pending": "待下載",
@@ -644,5 +645,43 @@
"connected": "已連線", "connected": "已連線",
"new_devices": "新裝置", "new_devices": "新裝置",
"down_alerts": "離線警告" "down_alerts": "離線警告"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
},
"azuredevops": {
"result": "Result",
"status": "Status",
"buildId": "Build ID",
"succeeded": "Succeeded",
"notStarted": "Not Started",
"failed": "Failed",
"canceled": "Canceled",
"inProgress": "In Progress",
"totalPrs": "Total PRs",
"myPrs": "My PRs",
"approved": "Approved"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
} }
} }

View File

@@ -1,13 +1,48 @@
import { useRef } from "react";
import classNames from "classnames";
import { Disclosure, Transition } from '@headlessui/react';
import { MdKeyboardArrowDown } from "react-icons/md";
import ErrorBoundary from "components/errorboundry"; import ErrorBoundary from "components/errorboundry";
import List from "components/bookmarks/list"; import List from "components/bookmarks/list";
export default function BookmarksGroup({ group }) { export default function BookmarksGroup({ group, disableCollapse }) {
const panel = useRef();
return ( return (
<div key={group.name} className="flex-1"> <div key={group.name} className="flex-1">
<h2 className="text-theme-800 dark:text-theme-300 text-xl font-medium">{group.name}</h2> <Disclosure defaultOpen>
<ErrorBoundary> {({ open }) => (
<List bookmarks={group.bookmarks} /> <>
</ErrorBoundary> <Disclosure.Button disabled={disableCollapse} className="flex w-full select-none items-center group">
<h2 className="text-theme-800 dark:text-theme-300 text-xl font-medium">{group.name}</h2>
<MdKeyboardArrowDown className={classNames(
disableCollapse ? 'hidden' : '',
'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
// 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 className="transition-all overflow-hidden duration-300 ease-out" ref={panel} static>
<ErrorBoundary>
<List bookmarks={group.bookmarks} />
</ErrorBoundary>
</Disclosure.Panel>
</Transition>
</>
)}
</Disclosure>
</div> </div>
); );
} }

View File

@@ -33,11 +33,22 @@ export default function ResolvedIcon({ icon, width = 32, height = 32, alt = "log
} }
// check mdi- or si- prefixed icons // check mdi- or si- prefixed icons
const prefix = icon.split("-")[0] const prefix = icon.split("-")[0];
if (prefix in iconSetURLs) { if (prefix in iconSetURLs) {
// get icon source // default to theme setting
const iconName = icon.replace(`${prefix}-`, "").replace(".svg", ""); 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`; const iconSource = `${iconSetURLs[prefix]}${iconName}.svg`;
return ( return (
@@ -47,16 +58,13 @@ export default function ResolvedIcon({ icon, width = 32, height = 32, alt = "log
height, height,
maxWidth: '100%', maxWidth: '100%',
maxHeight: '100%', maxHeight: '100%',
background: settings.iconStyle === "theme" ? background: `${iconColor}`,
`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)))",
mask: `url(${iconSource}) no-repeat center / contain`, mask: `url(${iconSource}) no-repeat center / contain`,
WebkitMask: `url(${iconSource}) no-repeat center / contain`, WebkitMask: `url(${iconSource}) no-repeat center / contain`,
}} }}
/> />
); );
} }
// fallback to dashboard-icons // fallback to dashboard-icons
if (icon.endsWith(".svg")) { if (icon.endsWith(".svg")) {

View File

@@ -1,9 +1,15 @@
import { useRef } from "react";
import classNames from "classnames"; import classNames from "classnames";
import { Disclosure, Transition } from '@headlessui/react';
import { MdKeyboardArrowDown } from "react-icons/md";
import List from "components/services/list"; import List from "components/services/list";
import ResolvedIcon from "components/resolvedicon"; import ResolvedIcon from "components/resolvedicon";
export default function ServicesGroup({ group, services, layout, fiveColumns }) { export default function ServicesGroup({ group, services, layout, fiveColumns, disableCollapse }) {
const panel = useRef();
return ( return (
<div <div
key={services.name} key={services.name}
@@ -13,15 +19,42 @@ export default function ServicesGroup({ group, services, layout, fiveColumns })
"flex-1 p-1" "flex-1 p-1"
)} )}
> >
<div className="flex select-none items-center"> <Disclosure defaultOpen>
{layout?.icon && {({ open }) => (
<div className="flex-shrink-0 mr-2 w-7 h-7"> <>
<ResolvedIcon icon={layout.icon} /> <Disclosure.Button disabled={disableCollapse} className="flex w-full select-none items-center group">
</div> {layout?.icon &&
} <div className="flex-shrink-0 mr-2 w-7 h-7">
<h2 className="text-theme-800 dark:text-theme-300 text-xl font-medium">{services.name}</h2> <ResolvedIcon icon={layout.icon} />
</div> </div>
<List group={group} services={services.services} layout={layout} /> }
<h2 className="flex text-theme-800 dark:text-theme-300 text-xl font-medium">{services.name}</h2>
<MdKeyboardArrowDown className={classNames(
disableCollapse ? 'hidden' : '',
'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
// 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 className="transition-all overflow-hidden duration-300 ease-out" ref={panel} static>
<List group={group} services={services.services} layout={layout} />
</Disclosure.Panel>
</Transition>
</>
)}
</Disclosure>
</div> </div>
); );
} }

View File

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

View File

@@ -1,6 +1,9 @@
import { useState, useEffect } from "react"; import { useState, useEffect } from "react";
import { useTranslation } from "next-i18next"; import { useTranslation } from "next-i18next";
import Container from "../widget/container";
import Raw from "../widget/raw";
const textSizes = { const textSizes = {
"4xl": "text-4xl", "4xl": "text-4xl",
"3xl": "text-3xl", "3xl": "text-3xl",
@@ -17,7 +20,7 @@ export default function DateTime({ options }) {
const { i18n } = useTranslation(); const { i18n } = useTranslation();
const [date, setDate] = useState(""); const [date, setDate] = useState("");
const dateLocale = locale ?? i18n.language; const dateLocale = locale ?? i18n.language;
useEffect(() => { useEffect(() => {
const dateFormat = new Intl.DateTimeFormat(dateLocale, { ...format }); const dateFormat = new Intl.DateTimeFormat(dateLocale, { ...format });
const interval = setInterval(() => { const interval = setInterval(() => {
@@ -27,12 +30,14 @@ export default function DateTime({ options }) {
}, [date, setDate, dateLocale, format]); }, [date, setDate, dateLocale, format]);
return ( return (
<div className="flex flex-col justify-center first:ml-0 ml-4"> <Container options={options}>
<div className="flex flex-row items-center grow justify-end"> <Raw>
<span className={`text-theme-800 dark:text-theme-200 tabular-nums ${textSizes[textSize || "lg"]}`}> <div className="flex flex-row items-center grow justify-end">
{date} <span className={`text-theme-800 dark:text-theme-200 tabular-nums ${textSizes[textSize || "lg"]}`}>
</span> {date}
</div> </span>
</div> </div>
</Raw>
</Container>
); );
} }

View File

@@ -1,11 +1,13 @@
import useSWR from "swr"; import useSWR from "swr";
import { useContext } from "react"; import { useContext } from "react";
import { BiError } from "react-icons/bi";
import { FaMemory, FaRegClock, FaThermometerHalf } from "react-icons/fa"; import { FaMemory, FaRegClock, FaThermometerHalf } from "react-icons/fa";
import { FiCpu, FiHardDrive } from "react-icons/fi"; import { FiCpu, FiHardDrive } from "react-icons/fi";
import { useTranslation } from "next-i18next"; import { useTranslation } from "next-i18next";
import UsageBar from "../resources/usage-bar"; import Error from "../widget/error";
import Resource from "../widget/resource";
import Resources from "../widget/resources";
import WidgetLabel from "../widget/widget_label";
import { SettingsContext } from "utils/contexts/settings"; import { SettingsContext } from "utils/contexts/settings";
@@ -26,52 +28,19 @@ export default function Widget({ options }) {
); );
if (error || data?.error) { if (error || data?.error) {
return ( return <Error options={options} />
<div className="flex flex-col justify-center first:ml-0 ml-4">
<div className="flex flex-row items-center justify-end">
<div className="flex flex-row items-center">
<BiError className="w-8 h-8 text-theme-800 dark:text-theme-200" />
<div className="flex flex-col ml-3 text-left">
<span className="text-theme-800 dark:text-theme-200 text-sm">{t("widget.api_error")}</span>
</div>
</div>
</div>
</div>
);
} }
if (!data) { if (!data) {
return ( return <Resources options={options}>
<div className="flex flex-col max-w:full sm:basis-auto self-center grow-0 flex-wrap ml-4"> <Resource icon={FiCpu} label={t("glances.wait")} percentage="0" />
<div className="flex flex-row self-center flex-wrap justify-between"> <Resource icon={FaMemory} label={t("glances.wait")} percentage="0" />
<div className="flex-none flex flex-row items-center mr-3 py-1.5"> { options.cputemp && <Resource icon={FaThermometerHalf} label={t("glances.wait")} percentage="0" /> }
<FiCpu className="text-theme-800 dark:text-theme-200 w-5 h-5" /> { options.disk && !Array.isArray(options.disk) && <Resource key={options.disk} icon={FiHardDrive} label={t("glances.wait")} percentage="0" /> }
<div className="flex flex-col ml-3 text-left min-w-[85px]"> { options.disk && Array.isArray(options.disk) && options.disk.map((disk) => <Resource key={`disk_${disk.mnt_point}`} icon={FiHardDrive} label={t("glances.wait")} percentage="0" /> ) }
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between"> { options.uptime && <Resource icon={FaRegClock} label={t("glances.wait")} percentage="0" /> }
<div className="pl-0.5 text-xs"> { options.label && <WidgetLabel label={options.label} /> }
{t("glances.wait")} </Resources>;
</div>
</div>
<UsageBar percent="0" />
</div>
</div>
<div className="flex-none flex flex-row items-center mr-3 py-1.5">
<FaMemory className="text-theme-800 dark:text-theme-200 w-5 h-5" />
<div className="flex flex-col ml-3 text-left min-w-[85px]">
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5 text-xs">
{t("glances.wait")}
</div>
</div>
<UsageBar percent="0" />
</div>
</div>
</div>
{options.label && (
<div className="ml-6 pt-1 text-center text-theme-800 dark:text-theme-200 text-xs">{options.label}</div>
)}
</div>
);
} }
const unit = options.units === "imperial" ? "fahrenheit" : "celsius"; const unit = options.units === "imperial" ? "fahrenheit" : "celsius";
@@ -81,7 +50,7 @@ export default function Widget({ options }) {
if (options.cputemp && cpuSensors) { if (options.cputemp && cpuSensors) {
try { try {
mainTemp = cpuSensors.reduce((acc, s) => acc + s.value, 0) / cpuSensors.length; 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") { if (unit === "fahrenheit") {
mainTemp = convertToFahrenheit(mainTemp); mainTemp = convertToFahrenheit(mainTemp);
maxTemp = convertToFahrenheit(maxTemp); maxTemp = convertToFahrenheit(maxTemp);
@@ -101,131 +70,84 @@ export default function Widget({ options }) {
} }
return ( return (
<a href={options.url} target={settings.target ?? "_blank"} className="flex flex-col max-w:full sm:basis-auto self-center grow-0 flex-wrap"> <Resources options={options} target={settings.target ?? "_blank"}>
<div className="flex flex-row self-center flex-wrap justify-between"> <Resource
<div className="flex-none flex flex-row items-center mr-3 py-1.5"> icon={FiCpu}
<FiCpu className="text-theme-800 dark:text-theme-200 w-5 h-5" /> value={t("common.number", {
<div className="flex flex-col ml-3 text-left min-w-[85px]"> value: data.cpu.total,
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between"> style: "unit",
<div className="pl-0.5"> unit: "percent",
{t("common.number", { maximumFractionDigits: 0,
value: data.cpu.total, })}
style: "unit", label={t("glances.cpu")}
unit: "percent", expandedValue={t("common.number", {
maximumFractionDigits: 0, value: data.load.min15,
})} style: "unit",
</div> unit: "percent",
<div className="pr-1">{t("glances.cpu")}</div> maximumFractionDigits: 0
</div> })}
{options.expanded && ( expandedLabel={t("glances.load")}
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between"> percentage={data.cpu.total}
<div className="pl-0.5 pr-1"> expanded={options.expanded}
{t("common.number", { />
value: data.load.min15, <Resource
style: "unit", icon={FaMemory}
unit: "percent", value={t("common.bytes", {
maximumFractionDigits: 0, value: data.mem.free,
})} maximumFractionDigits: 1,
</div> binary: true,
<div className="pr-1">{t("glances.load")}</div> })}
</span> label={t("glances.free")}
)} expandedValue={t("common.bytes", {
<UsageBar percent={data.cpu.total} /> value: data.mem.total,
</div> maximumFractionDigits: 1,
</div> binary: true,
<div className="flex-none flex flex-row items-center mr-3 py-1.5"> })}
<FaMemory className="text-theme-800 dark:text-theme-200 w-5 h-5" /> expandedLabel={t("glances.total")}
<div className="flex flex-col ml-3 text-left min-w-[85px]"> percentage={data.mem.percent}
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between"> expanded={options.expanded}
<div className="pl-0.5"> />
{t("common.bytes", { {disks.map((disk) => (
value: data.mem.free, <Resource key={`disk_${disk.mnt_point}`}
maximumFractionDigits: 1, icon={FiHardDrive}
binary: true, value={t("common.bytes", { value: disk.free })}
})} label={t("glances.free")}
</div> expandedValue={t("common.bytes", { value: disk.size })}
<div className="pr-1">{t("glances.free")}</div> expandedLabel={t("glances.total")}
</div> percentage={disk.percent}
{options.expanded && ( expanded={options.expanded}
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between"> />
<div className="pl-0.5 pr-1"> ))}
{t("common.bytes", { {options.cputemp && mainTemp > 0 &&
value: data.mem.total, <Resource
maximumFractionDigits: 1, icon={FaThermometerHalf}
binary: true, value={t("common.number", {
})} value: mainTemp,
</div> maximumFractionDigits: 1,
<div className="pr-1">{t("glances.total")}</div> style: "unit",
</span> unit
)} })}
<UsageBar percent={data.mem.percent} /> label={t("glances.temp")}
</div> expandedValue={t("common.number", {
</div> value: maxTemp,
{disks.map((disk) => ( maximumFractionDigits: 1,
<div key={disk.mnt_point} className="flex-none flex flex-row items-center mr-3 py-1.5"> style: "unit",
<FiHardDrive className="text-theme-800 dark:text-theme-200 w-5 h-5" /> unit
<div className="flex flex-col ml-3 text-left min-w-[85px]"> })}
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between"> expandedLabel={t("glances.warn")}
<div className="pl-0.5">{t("common.bytes", { value: disk.free })}</div> percentage={tempPercent}
<div className="pr-1">{t("glances.free")}</div> expanded={options.expanded}
</span> />
{options.expanded && ( }
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between"> {options.uptime && data.uptime &&
<div className="pl-0.5 pr-1">{t("common.bytes", { value: disk.size })}</div> <Resource
<div className="pr-1">{t("glances.total")}</div> icon={FaRegClock}
</span> value={data.uptime.replace(" days,", t("glances.days")).replace(/:\d\d:\d\d$/g, t("glances.hours"))}
)} label={t("glances.uptime")}
<UsageBar percent={disk.percent} /> percentage={Math.round((new Date().getSeconds() / 60) * 100).toString()}
</div> />
</div>))} }
{options.cputemp && mainTemp > 0 && {options.label && <WidgetLabel label={options.label} />}
(<div className="flex-none flex flex-row items-center mr-3 py-1.5"> </Resources>
<FaThermometerHalf className="text-theme-800 dark:text-theme-200 w-5 h-5" />
<div className="flex flex-col ml-3 text-left min-w-[85px]">
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5">
{t("common.number", {
value: mainTemp,
maximumFractionDigits: 1,
style: "unit",
unit
})}
</div>
<div className="pr-1">{t("glances.temp")}</div>
</span>
{options.expanded && (
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5 pr-1">
{t("common.number", {
value: maxTemp,
maximumFractionDigits: 1,
style: "unit",
unit
})}
</div>
<div className="pr-1">{t("glances.warn")}</div>
</span>
)}
<UsageBar percent={tempPercent} />
</div>
</div>)}
{options.uptime && data.uptime &&
(<div className="flex-none flex flex-row items-center mr-3 py-1.5">
<FaRegClock className="text-theme-800 dark:text-theme-200 w-5 h-5" />
<div className="flex flex-col ml-3 text-left min-w-[85px]">
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5">
{data.uptime.replace(" days,", t("glances.days")).replace(/:\d\d:\d\d$/g, t("glances.hours"))}
</div>
<div className="pr-1">{t("glances.uptime")}</div>
</span>
<UsageBar percent={Math.round((new Date().getSeconds() / 60) * 100)} />
</div>
</div>)}
</div>
{options.label && (
<div className="pt-1 text-center text-theme-800 dark:text-theme-200 text-xs">{options.label}</div>
)}
</a>
); );
} }

View File

@@ -1,3 +1,6 @@
import Container from "../widget/container";
import Raw from "../widget/raw";
const textSizes = { const textSizes = {
"4xl": "text-4xl", "4xl": "text-4xl",
"3xl": "text-3xl", "3xl": "text-3xl",
@@ -11,12 +14,12 @@ const textSizes = {
export default function Greeting({ options }) { export default function Greeting({ options }) {
if (options.text) { if (options.text) {
return ( return <Container options={options}>
<div className="flex flex-row items-center justify-start"> <Raw>
<span className={`text-theme-800 dark:text-theme-200 mr-3 ${textSizes[options.text_size || "xl"]}`}> <span className={`text-theme-800 dark:text-theme-200 mr-3 ${textSizes[options.text_size || "xl"]}`}>
{options.text} {options.text}
</span> </span>
</div> </Raw>
); </Container>;
} }
} }

View File

@@ -1,12 +1,15 @@
import useSWR from "swr"; import useSWR from "swr";
import { BiError } from "react-icons/bi";
import { useTranslation } from "next-i18next"; import { useTranslation } from "next-i18next";
import Error from "../widget/error";
import Container from "../widget/container";
import Raw from "../widget/raw";
import Node from "./node"; import Node from "./node";
export default function Widget({ options }) { export default function Widget({ options }) {
const { cluster, nodes } = options; const { cluster, nodes } = options;
const { t, i18n } = useTranslation(); const { i18n } = useTranslation();
const defaultData = { const defaultData = {
cpu: { cpu: {
@@ -18,7 +21,7 @@ export default function Widget({ options }) {
used: 0, used: 0,
total: 0, total: 0,
free: 0, free: 0,
precent: 0 percent: 0
} }
}; };
@@ -29,23 +32,12 @@ export default function Widget({ options }) {
); );
if (error || data?.error) { if (error || data?.error) {
return ( return <Error options={options} />
<div className="flex flex-col justify-center first:ml-0 ml-4">
<div className="flex flex-row items-center justify-end">
<div className="flex flex-row items-center">
<BiError className="w-8 h-8 text-theme-800 dark:text-theme-200" />
<div className="flex flex-col ml-3 text-left">
<span className="text-theme-800 dark:text-theme-200 text-sm">{t("widget.api_error")}</span>
</div>
</div>
</div>
</div>
);
} }
if (!data) { if (!data) {
return ( return <Container options={options}>
<div className="flex flex-col max-w:full sm:basis-auto self-center grow-0 flex-wrap"> <Raw>
<div className="flex flex-row self-center flex-wrap justify-between"> <div className="flex flex-row self-center flex-wrap justify-between">
{cluster.show && {cluster.show &&
<Node type="cluster" key="cluster" options={options.cluster} data={defaultData} /> <Node type="cluster" key="cluster" options={options.cluster} data={defaultData} />
@@ -54,12 +46,12 @@ export default function Widget({ options }) {
<Node type="node" key="nodes" options={options.nodes} data={defaultData} /> <Node type="node" key="nodes" options={options.nodes} data={defaultData} />
} }
</div> </div>
</div> </Raw>
); </Container>;
} }
return ( return <Container options={options}>
<div className="flex flex-col max-w:full sm:basis-auto self-center grow-0 flex-wrap"> <Raw>
<div className="flex flex-row self-center flex-wrap justify-between"> <div className="flex flex-row self-center flex-wrap justify-between">
{cluster.show && {cluster.show &&
<Node key="cluster" type="cluster" options={options.cluster} data={data.cluster} /> <Node key="cluster" type="cluster" options={options.cluster} data={data.cluster} />
@@ -69,6 +61,6 @@ export default function Widget({ options }) {
<Node key={node.name} type="node" options={options.nodes} data={node} />) <Node key={node.name} type="node" options={options.nodes} data={node} />)
} }
</div> </div>
</div> </Raw>
); </Container>;
} }

View File

@@ -3,8 +3,7 @@ import { FiAlertTriangle, FiCpu, FiServer } from "react-icons/fi";
import { SiKubernetes } from "react-icons/si"; import { SiKubernetes } from "react-icons/si";
import { useTranslation } from "next-i18next"; import { useTranslation } from "next-i18next";
import UsageBar from "./usage-bar"; import UsageBar from "../resources/usage-bar";
export default function Node({ type, options, data }) { export default function Node({ type, options, data }) {
const { t } = useTranslation(); const { t } = useTranslation();
@@ -29,7 +28,7 @@ export default function Node({ type, options, data }) {
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between"> <div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5"> <div className="pl-0.5">
{t("common.number", { {t("common.number", {
value: data.cpu.percent, value: data?.cpu?.percent ?? 0,
style: "unit", style: "unit",
unit: "percent", unit: "percent",
maximumFractionDigits: 0 maximumFractionDigits: 0
@@ -37,18 +36,18 @@ export default function Node({ type, options, data }) {
</div> </div>
<FiCpu className="text-theme-800 dark:text-theme-200 w-3 h-3" /> <FiCpu className="text-theme-800 dark:text-theme-200 w-3 h-3" />
</div> </div>
<UsageBar percent={data.cpu.percent} /> <UsageBar percent={data?.cpu?.percent ?? 0} />
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between"> <div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5"> <div className="pl-0.5">
{t("common.bytes", { {t("common.bytes", {
value: data.memory.free, value: data?.memory?.free ?? 0,
maximumFractionDigits: 0, maximumFractionDigits: 0,
binary: true binary: true
})} })}
</div> </div>
<FaMemory className="text-theme-800 dark:text-theme-200 w-3 h-3" /> <FaMemory className="text-theme-800 dark:text-theme-200 w-3 h-3" />
</div> </div>
<UsageBar percent={data.memory.percent} /> <UsageBar percent={data?.memory?.percent} />
{options.showLabel && ( {options.showLabel && (
<div className="pt-1 text-center text-theme-800 dark:text-theme-200 text-xs">{type === "cluster" ? options.label : data.name}</div> <div className="pt-1 text-center text-theme-800 dark:text-theme-200 text-xs">{type === "cluster" ? options.label : data.name}</div>
)} )}

View File

@@ -1,12 +0,0 @@
export default function UsageBar({ percent }) {
return (
<div className="mt-0.5 w-full bg-theme-800/30 rounded-full h-1 dark:bg-theme-200/20">
<div
className="bg-theme-800/70 h-1 rounded-full dark:bg-theme-200/50 transition-all duration-1000"
style={{
width: `${percent}%`,
}}
/>
</div>
);
}

View File

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

View File

@@ -1,37 +1,31 @@
import useSWR from "swr"; import useSWR from "swr";
import { BiError } from "react-icons/bi";
import { useTranslation } from "next-i18next"; import Error from "../widget/error";
import Container from "../widget/container";
import Raw from "../widget/raw";
import Node from "./node"; import Node from "./node";
export default function Longhorn({ options }) { export default function Longhorn({ options }) {
const { expanded, total, labels, include, nodes } = options; const { expanded, total, labels, include, nodes } = options;
const { t } = useTranslation();
const { data, error } = useSWR(`/api/widgets/longhorn`, { const { data, error } = useSWR(`/api/widgets/longhorn`, {
refreshInterval: 1500 refreshInterval: 1500
}); });
if (error || data?.error) { if (error || data?.error) {
return ( return <Error options={options} />
<div className="flex flex-col max-w:full sm:basis-auto self-center grow-0 flex-wrap">
<BiError className="text-theme-800 dark:text-theme-200 w-5 h-5" />
<div className="flex flex-col ml-3 text-left">
<span className="text-theme-800 dark:text-theme-200 text-xs">{t("widget.api_error")}</span>
</div>
</div>
);
} }
if (!data) { if (!data) {
return ( return <Container options={options}>
<div className="flex flex-col max-w:full sm:basis-auto self-center grow-0 flex-wrap"> <Raw>
<div className="flex flex-row self-center flex-wrap justify-between" /> <div className="flex flex-row self-center flex-wrap justify-between" />
</div> </Raw>
); </Container>;
} }
return ( return <Container options={options}>
<div className="flex flex-col max-w:full sm:basis-auto self-center grow-0 flex-wrap"> <Raw>
<div className="flex flex-row self-center flex-wrap justify-between"> <div className="flex flex-row self-center flex-wrap justify-between">
{data.nodes {data.nodes
.filter((node) => { .filter((node) => {
@@ -52,6 +46,6 @@ export default function Longhorn({ options }) {
</div> </div>
)} )}
</div> </div>
</div> </Raw>
); </Container>;
} }

View File

@@ -1,32 +1,20 @@
import { FiHardDrive } from "react-icons/fi";
import { useTranslation } from "next-i18next"; import { useTranslation } from "next-i18next";
import { FaThermometerHalf } from "react-icons/fa";
import UsageBar from "../resources/usage-bar"; import Resource from "../widget/resource";
import WidgetLabel from "../widget/widget_label";
export default function Node({ data, expanded, labels }) { export default function Node({ data, expanded, labels }) {
const { t } = useTranslation(); const { t } = useTranslation();
return ( return <Resource
<> icon={FaThermometerHalf}
<div className="flex-none flex flex-row items-center mr-3 py-1.5"> value={t("common.bytes", { value: data.node.available })}
<FiHardDrive className="text-theme-800 dark:text-theme-200 w-5 h-5" /> label={t("resources.free")}
<div className="flex flex-col ml-3 text-left min-w-[85px]"> expandedValue={t("common.bytes", { value: data.node.maximum })}
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between"> expandedLabel={t("resources.total")}
<div className="pl-0.5">{t("common.bytes", { value: data.node.available })}</div> percentage={Math.round(((data.node.maximum - data.node.available) / data.node.maximum) * 100)}
<div className="pr-1">{t("resources.free")}</div> expanded={expanded}
</span> >{ labels && <WidgetLabel label={data.node.id} /> }
{expanded && ( </Resource>
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5">{t("common.bytes", { value: data.node.maximum })}</div>
<div className="pr-1">{t("resources.total")}</div>
</span>
)}
<UsageBar percent={Math.round(((data.node.maximum - data.node.available) / data.node.maximum) * 100)} />
</div>
</div>
{labels && (
<div className="ml-6 pt-1 text-center text-theme-800 dark:text-theme-200 text-xs">{data.node.id}</div>
)}
</>
);
} }

View File

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

View File

@@ -1,11 +1,16 @@
import useSWR from "swr"; import useSWR from "swr";
import { useState } from "react"; import { useState } from "react";
import { BiError } from "react-icons/bi";
import { WiCloudDown } from "react-icons/wi"; import { WiCloudDown } from "react-icons/wi";
import { MdLocationDisabled, MdLocationSearching } from "react-icons/md"; import { MdLocationDisabled, MdLocationSearching } from "react-icons/md";
import { useTranslation } from "next-i18next"; import { useTranslation } from "next-i18next";
import Icon from "./icon"; import Error from "../widget/error";
import Container from "../widget/container";
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 mapIcon from "../../../utils/weather/openmeteo-condition-map";
function Widget({ options }) { function Widget({ options }) {
const { t } = useTranslation(); const { t } = useTranslation();
@@ -15,60 +20,33 @@ function Widget({ options }) {
); );
if (error || data?.error) { if (error || data?.error) {
return ( return <Error options={options} />
<div className="flex flex-col justify-center first:ml-0 ml-4 mr-2">
<div className="flex flex-row items-center justify-end">
<div className="flex flex-col items-center">
<BiError className="w-8 h-8 text-theme-800 dark:text-theme-200" />
<div className="flex flex-col ml-3 text-left">
<span className="text-theme-800 dark:text-theme-200 text-sm">{t("widget.api_error")}</span>
<span className="text-theme-800 dark:text-theme-200 text-xs">-</span>
</div>
</div>
</div>
</div>
);
} }
if (!data) { if (!data) {
return ( return <Container options={options}>
<div className="flex flex-col justify-center first:ml-0 ml-4 mr-2"> <PrimaryText>{t("weather.updating")}</PrimaryText>
<div className="flex flex-row items-center justify-end"> <SecondaryText>{t("weather.wait")}</SecondaryText>
<div className="flex flex-col items-center"> <WidgetIcon icon={WiCloudDown} size="l" />
<WiCloudDown className="w-8 h-8 text-theme-800 dark:text-theme-200" /> </Container>;
</div>
<div className="flex flex-col ml-3 text-left">
<span className="text-theme-800 dark:text-theme-200 text-sm">{t("weather.updating")}</span>
<span className="text-theme-800 dark:text-theme-200 text-xs">{t("weather.wait")}</span>
</div>
</div>
</div>
);
} }
const unit = options.units === "metric" ? "celsius" : "fahrenheit"; const unit = options.units === "metric" ? "celsius" : "fahrenheit";
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"; const timeOfDay = data.current_weather.time > data.daily.sunrise[0] && data.current_weather.time < data.daily.sunset[0] ? "day" : "night";
return ( return <Container options={options}>
<div className="flex flex-col justify-center first:ml-0 ml-4 mr-2"> <PrimaryText>
<div className="flex flex-row items-center justify-end"> {options.label && `${options.label}, `}
<div className="flex flex-col items-center"> {t("common.number", {
<Icon condition={data.current_weather.weathercode} timeOfDay={timeOfDay} /> value: data.current_weather.temperature,
</div> style: "unit",
<div className="flex flex-col ml-3 text-left"> unit,
<span className="text-theme-800 dark:text-theme-200 text-sm"> })}
{options.label && `${options.label}, `} </PrimaryText>
{t("common.number", { <SecondaryText>{t(`wmo.${data.current_weather.weathercode}-${timeOfDay}`)}</SecondaryText>
value: data.current_weather.temperature, <WidgetIcon icon={mapIcon(condition, timeOfDay)} size="xl" />
style: "unit", </Container>;
unit,
})}
</span>
<span className="text-theme-800 dark:text-theme-200 text-xs">{t(`wmo.${data.current_weather.weathercode}-${timeOfDay}`)}</span>
</div>
</div>
</div>
);
} }
export default function OpenMeteo({ options }) { export default function OpenMeteo({ options }) {
@@ -103,27 +81,11 @@ export default function OpenMeteo({ options }) {
// if (!requesting && !location) requestLocation(); // if (!requesting && !location) requestLocation();
if (!location) { if (!location) {
return ( return <ContainerButton options={options} callback={requestLocation} >
<button <PrimaryText>{t("weather.current")}</PrimaryText>
type="button" <SecondaryText>{t("weather.allow")}</SecondaryText>
onClick={() => requestLocation()} <WidgetIcon icon={ requesting ? MdLocationSearching : MdLocationDisabled} size="m" pulse />
className="flex flex-col justify-center first:ml-0 ml-4 mr-2" </ContainerButton>;
>
<div className="flex flex-row items-center justify-end">
<div className="flex flex-col items-center">
{requesting ? (
<MdLocationSearching className="w-6 h-6 text-theme-800 dark:text-theme-200 animate-pulse" />
) : (
<MdLocationDisabled className="w-6 h-6 text-theme-800 dark:text-theme-200" />
)}
</div>
<div className="flex flex-col ml-3 text-left">
<span className="text-theme-800 dark:text-theme-200 text-sm">{t("weather.current")}</span>
<span className="text-theme-800 dark:text-theme-200 text-xs">{t("weather.allow")}</span>
</div>
</div>
</button>
);
} }
return <Widget options={{ ...location, ...options }} />; return <Widget options={{ ...location, ...options }} />;

View File

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

View File

@@ -1,11 +1,16 @@
import useSWR from "swr"; import useSWR from "swr";
import { useState } from "react"; import { useState } from "react";
import { BiError } from "react-icons/bi";
import { WiCloudDown } from "react-icons/wi"; import { WiCloudDown } from "react-icons/wi";
import { MdLocationDisabled, MdLocationSearching } from "react-icons/md"; import { MdLocationDisabled, MdLocationSearching } from "react-icons/md";
import { useTranslation } from "next-i18next"; import { useTranslation } from "next-i18next";
import Icon from "./icon"; import Error from "../widget/error";
import Container from "../widget/container";
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 mapIcon from "../../../utils/weather/owm-condition-map";
function Widget({ options }) { function Widget({ options }) {
const { t, i18n } = useTranslation(); const { t, i18n } = useTranslation();
@@ -15,58 +20,27 @@ function Widget({ options }) {
); );
if (error || data?.cod === 401 || data?.error) { if (error || data?.cod === 401 || data?.error) {
return ( return <Error options={options} />
<div className="flex flex-col justify-center first:ml-auto ml-4 mr-2">
<div className="flex flex-row items-center justify-end">
<div className="hidden sm:flex flex-col items-center">
<BiError className="w-8 h-8 text-theme-800 dark:text-theme-200" />
<div className="flex flex-col ml-3 text-left">
<span className="text-theme-800 dark:text-theme-200 text-sm">{t("widget.api_error")}</span>
<span className="text-theme-800 dark:text-theme-200 text-xs">-</span>
</div>
</div>
</div>
</div>
);
} }
if (!data) { if (!data) {
return ( return <Container options={options}>
<div className="flex flex-col justify-center first:ml-auto ml-4 mr-2"> <PrimaryText>{t("weather.updating")}</PrimaryText>
<div className="flex flex-row items-center justify-end"> <SecondaryText>{t("weather.wait")}</SecondaryText>
<div className="hidden sm:flex flex-col items-center"> <WidgetIcon icon={WiCloudDown} size="l" />
<WiCloudDown className="w-8 h-8 text-theme-800 dark:text-theme-200" /> </Container>;
</div>
<div className="flex flex-col ml-3 text-left">
<span className="text-theme-800 dark:text-theme-200 text-sm">{t("weather.updating")}</span>
<span className="text-theme-800 dark:text-theme-200 text-xs">{t("weather.wait")}</span>
</div>
</div>
</div>
);
} }
const unit = options.units === "metric" ? "celsius" : "fahrenheit"; const unit = options.units === "metric" ? "celsius" : "fahrenheit";
return ( const condition = data.weather[0].id;
<div className="flex flex-col justify-center first:ml-auto ml-2 mr-2"> const timeOfDay = data.dt > data.sys.sunrise && data.dt < data.sys.sunset ? "day" : "night";
<div className="flex flex-row items-center justify-end">
<div className="hidden sm:flex flex-col items-center"> return <Container options={options}>
<Icon <PrimaryText>{options.label && `${options.label}, ` }{t("common.number", { value: data.main.temp, style: "unit", unit })}</PrimaryText>
condition={data.weather[0].id} <SecondaryText>{data.weather[0].description}</SecondaryText>
timeOfDay={data.dt > data.sys.sunrise && data.dt < data.sys.sunset ? "day" : "night"} <WidgetIcon icon={mapIcon(condition, timeOfDay)} size="xl" />
/> </Container>;
</div>
<div className="flex flex-col ml-3 text-left">
<span className="text-theme-800 dark:text-theme-200 text-sm">
{options.label && `${options.label}, `}
{t("common.number", { value: data.main.temp, style: "unit", unit })}
</span>
<span className="text-theme-800 dark:text-theme-200 text-xs">{data.weather[0].description}</span>
</div>
</div>
</div>
);
} }
export default function OpenWeatherMap({ options }) { export default function OpenWeatherMap({ options }) {
@@ -98,30 +72,12 @@ export default function OpenWeatherMap({ options }) {
} }
}; };
// if (!requesting && !location) requestLocation();
if (!location) { if (!location) {
return ( return <ContainerButton options={options} callback={requestLocation} >
<button <PrimaryText>{t("weather.current")}</PrimaryText>
type="button" <SecondaryText>{t("weather.allow")}</SecondaryText>
onClick={() => requestLocation()} <WidgetIcon icon={requesting ? MdLocationSearching : MdLocationDisabled} size="m" pulse />
className="flex flex-col justify-center first:ml-auto ml-4 mr-2" </ContainerButton>;
>
<div className="flex flex-row items-center justify-end">
<div className="hidden sm:flex flex-col items-center">
{requesting ? (
<MdLocationSearching className="w-6 h-6 text-theme-800 dark:text-theme-200 animate-pulse" />
) : (
<MdLocationDisabled className="w-6 h-6 text-theme-800 dark:text-theme-200" />
)}
</div>
<div className="flex flex-col ml-3 text-left">
<span className="text-theme-800 dark:text-theme-200 text-sm">{t("weather.current")}</span>
<span className="text-theme-800 dark:text-theme-200 text-xs">{t("weather.allow")}</span>
</div>
</div>
</button>
);
} }
return <Widget options={{ ...location, ...options }} />; return <Widget options={{ ...location, ...options }} />;

View File

@@ -1,79 +1,41 @@
import useSWR from "swr"; import useSWR from "swr";
import { FiCpu } from "react-icons/fi"; import { FiCpu } from "react-icons/fi";
import { BiError } from "react-icons/bi";
import { useTranslation } from "next-i18next"; import { useTranslation } from "next-i18next";
import UsageBar from "./usage-bar"; 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 { t } = useTranslation();
const { data, error } = useSWR(`/api/widgets/resources?type=cpu`, { const { data, error } = useSWR(`/api/widgets/resources?type=cpu`, {
refreshInterval: 1500, refreshInterval: refresh,
}); });
if (error || data?.error) { if (error || data?.error) {
return ( return <Error />
<div className="flex-none flex flex-row items-center mr-3 py-1.5">
<BiError className="text-theme-800 dark:text-theme-200 w-5 h-5" />
<div className="flex flex-col ml-3 text-left">
<span className="text-theme-800 dark:text-theme-200 text-xs">{t("widget.api_error")}</span>
</div>
</div>
);
} }
if (!data) { if (!data) {
return ( return <Resource icon={FiCpu} value="-" label={t("resources.cpu")} expandedValue="-"
<div className="flex-none flex flex-row items-center mr-3 py-1.5 animate-pulse"> expandedLabel={t("resources.load")} percentage="0" expanded={expanded} />
<FiCpu className="text-theme-800 dark:text-theme-200 w-5 h-5" />
<div className="flex flex-col ml-3 text-left min-w-[85px]">
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5 pr-1">-</div>
<div className="pr-1">{t("resources.cpu")}</div>
</div>
{expanded && (
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5 pr-1">-</div>
<div className="pr-1">{t("resources.load")}</div>
</div>
)}
<UsageBar percent={0} />
</div>
</div>
);
} }
const percent = data.cpu.usage; return <Resource
icon={FiCpu}
return ( value={t("common.number", {
<div className="flex-none flex flex-row items-center mr-3 py-1.5"> value: data.cpu.usage,
<FiCpu className="text-theme-800 dark:text-theme-200 w-5 h-5" /> style: "unit",
<div className="flex flex-col ml-3 text-left min-w-[85px]"> unit: "percent",
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between"> maximumFractionDigits: 0,
<div className="pl-0.5 pr-1"> })}
{t("common.number", { label={t("resources.cpu")}
value: data.cpu.usage, expandedValue={t("common.number", {
style: "unit", value: data.cpu.load,
unit: "percent", maximumFractionDigits: 2,
maximumFractionDigits: 0, })}
})} expandedLabel={t("resources.load")}
</div> percentage={data.cpu.usage}
<div className="pr-1">{t("resources.cpu")}</div> expanded={expanded}
</div> />
{expanded && (
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5 pr-1">
{t("common.number", {
value: data.cpu.load,
maximumFractionDigits: 2,
})}
</div>
<div className="pr-1">{t("resources.load")}</div>
</div>
)}
<UsageBar percent={percent} />
</div>
</div>
);
} }

View File

@@ -1,50 +1,34 @@
import useSWR from "swr"; import useSWR from "swr";
import { FaThermometerHalf } from "react-icons/fa"; import { FaThermometerHalf } from "react-icons/fa";
import { BiError } from "react-icons/bi";
import { useTranslation } from "next-i18next"; import { useTranslation } from "next-i18next";
import UsageBar from "./usage-bar"; import Resource from "../widget/resource";
import Error from "../widget/error";
function convertToFahrenheit(t) { function convertToFahrenheit(t) {
return t * 9/5 + 32 return t * 9/5 + 32
} }
export default function CpuTemp({ expanded, units }) { export default function CpuTemp({ expanded, units, refresh = 1500 }) {
const { t } = useTranslation(); const { t } = useTranslation();
const { data, error } = useSWR(`/api/widgets/resources?type=cputemp`, { const { data, error } = useSWR(`/api/widgets/resources?type=cputemp`, {
refreshInterval: 1500, refreshInterval: refresh,
}); });
if (error || data?.error) { if (error || data?.error) {
return ( return <Error />
<div className="flex-none flex flex-row items-center mr-3 py-1.5">
<BiError className="text-theme-800 dark:text-theme-200 w-5 h-5" />
<div className="flex flex-col ml-3 text-left">
<span className="text-theme-800 dark:text-theme-200 text-xs">{t("widget.api_error")}</span>
</div>
</div>
);
} }
if (!data || !data.cputemp) { if (!data || !data.cputemp) {
return ( return <Resource
<div className="flex-none flex flex-row items-center mr-3 py-1.5 animate-pulse"> icon={FaThermometerHalf}
<FaThermometerHalf className="text-theme-800 dark:text-theme-200 w-5 h-5" /> value="-"
<div className="flex flex-col ml-3 text-left min-w-[85px]"> label={t("resources.temp")}
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between"> expandedValue="-"
<div className="pl-0.5">-</div> expandedLabel={t("resources.max")}
<div className="pr-1">{t("resources.temp")}</div> expanded={expanded}
</span> />;
{expanded && (
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5">-</div>
<div className="pr-1">{t("resources.max")}</div>
</span>
)}
</div>
</div>
);
} }
let mainTemp = data.cputemp.main; let mainTemp = data.cputemp.main;
@@ -54,38 +38,24 @@ export default function CpuTemp({ expanded, units }) {
const unit = units === "imperial" ? "fahrenheit" : "celsius"; const unit = units === "imperial" ? "fahrenheit" : "celsius";
mainTemp = (unit === "celsius") ? mainTemp : convertToFahrenheit(mainTemp); mainTemp = (unit === "celsius") ? mainTemp : convertToFahrenheit(mainTemp);
const maxTemp = (unit === "celsius") ? data.cputemp.max : convertToFahrenheit(data.cputemp.max); const maxTemp = (unit === "celsius") ? data.cputemp.max : convertToFahrenheit(data.cputemp.max);
const percent = Math.round((mainTemp / maxTemp) * 100);
return ( return <Resource
<div className="flex-none flex flex-row items-center mr-3 py-1.5"> icon={FaThermometerHalf}
<FaThermometerHalf className="text-theme-800 dark:text-theme-200 w-5 h-5" /> value={t("common.number", {
<div className="flex flex-col ml-3 text-left min-w-[85px]"> value: mainTemp,
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between"> maximumFractionDigits: 1,
<div className="pl-0.5"> style: "unit",
{t("common.number", { unit
value: mainTemp, })}
maximumFractionDigits: 1, label={t("resources.temp")}
style: "unit", expandedValue={t("common.number", {
unit value: maxTemp,
})} maximumFractionDigits: 1,
</div> style: "unit",
<div className="pr-1">{t("resources.temp")}</div> unit
</span> })}
{expanded && ( expandedLabel={t("resources.max")}
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between"> percentage={Math.round((mainTemp / maxTemp) * 100)}
<div className="pl-0.5"> expanded={expanded}
{t("common.number", { />;
value: maxTemp,
maximumFractionDigits: 1,
style: "unit",
unit
})}
</div>
<div className="pr-1">{t("resources.max")}</div>
</span>
)}
<UsageBar percent={percent} />
</div>
</div>
);
} }

View File

@@ -1,68 +1,43 @@
import useSWR from "swr"; import useSWR from "swr";
import { FiHardDrive } from "react-icons/fi"; import { FiHardDrive } from "react-icons/fi";
import { BiError } from "react-icons/bi";
import { useTranslation } from "next-i18next"; import { useTranslation } from "next-i18next";
import UsageBar from "./usage-bar"; 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 { t } = useTranslation();
const { data, error } = useSWR(`/api/widgets/resources?type=disk&target=${options.disk}`, { const { data, error } = useSWR(`/api/widgets/resources?type=disk&target=${options.disk}`, {
refreshInterval: 1500, refreshInterval: refresh,
}); });
if (error || data?.error) { if (error || data?.error) {
return ( return <Error options={options} />
<div className="flex-none flex flex-row items-center mr-3 py-1.5">
<BiError className="text-theme-800 dark:text-theme-200 w-5 h-5" />
<div className="flex flex-col ml-3 text-left">
<span className="text-theme-800 dark:text-theme-200 text-xs">{t("widget.api_error")}</span>
</div>
</div>
);
} }
if (!data) { if (!data) {
return ( return <Resource
<div className="flex-none flex flex-row items-center mr-3 py-1.5 animate-pulse"> icon={FiHardDrive}
<FiHardDrive className="text-theme-800 dark:text-theme-200 w-5 h-5" /> value="-"
<div className="flex flex-col ml-3 text-left min-w-[85px]"> label={t("resources.free")}
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between"> expandedValue="-"
<div className="pl-0.5 pr-1">-</div> expandedLabel={t("resources.total")}
<div className="pr-1">{t("resources.free")}</div> expanded={expanded}
</span> percentage="0"
{expanded && ( />;
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5 pr-1">-</div>
<div className="pr-1">{t("resources.total")}</div>
</span>
)}
<UsageBar percent={0} />
</div>
</div>
);
} }
// data.drive.used not accurate? // data.drive.used not accurate?
const percent = Math.round(((data.drive.size - data.drive.available) / data.drive.size) * 100); const percent = Math.round(((data.drive.size - data.drive.available) / data.drive.size) * 100);
return ( return <Resource
<div className="flex-none flex flex-row items-center mr-3 py-1.5"> icon={FiHardDrive}
<FiHardDrive className="text-theme-800 dark:text-theme-200 w-5 h-5" /> value={t("common.bytes", { value: data.drive.available })}
<div className="flex flex-col ml-3 text-left min-w-[85px]"> label={t("resources.free")}
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between"> expandedValue={t("common.bytes", { value: data.drive.size })}
<div className="pl-0.5 pr-1">{t("common.bytes", { value: data.drive.available })}</div> expandedLabel={t("resources.total")}
<div className="pr-1">{t("resources.free")}</div> percentage={percent}
</span> expanded={expanded}
{expanded && ( />;
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5 pr-1">{t("common.bytes", { value: data.drive.size })}</div>
<div className="pr-1">{t("resources.total")}</div>
</span>
)}
<UsageBar percent={percent} />
</div>
</div>
);
} }

View File

@@ -1,75 +1,42 @@
import useSWR from "swr"; import useSWR from "swr";
import { FaMemory } from "react-icons/fa"; import { FaMemory } from "react-icons/fa";
import { BiError } from "react-icons/bi";
import { useTranslation } from "next-i18next"; import { useTranslation } from "next-i18next";
import UsageBar from "./usage-bar"; 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 { t } = useTranslation();
const { data, error } = useSWR(`/api/widgets/resources?type=memory`, { const { data, error } = useSWR(`/api/widgets/resources?type=memory`, {
refreshInterval: 1500, refreshInterval: refresh,
}); });
if (error || data?.error) { if (error || data?.error) {
return ( return <Error />
<div className="flex-none flex flex-row items-center mr-3 py-1.5">
<BiError className="text-theme-800 dark:text-theme-200 w-5 h-5" />
<div className="flex flex-col ml-3 text-left">
<span className="text-theme-800 dark:text-theme-200 text-xs">{t("widget.api_error")}</span>
</div>
</div>
);
} }
if (!data) { if (!data) {
return ( return <Resource
<div className="flex-none flex flex-row items-center mr-3 py-1.5 animate-pulse"> icon={FaMemory}
<FaMemory className="text-theme-800 dark:text-theme-200 w-5 h-5" /> value="-"
<div className="flex flex-col ml-3 text-left min-w-[85px]"> label={t("resources.free")}
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between"> expandedValue="-"
<div className="pl-0.5 pr-1">-</div> expandedLabel={t("resources.total")}
<div className="pr-1">{t("resources.free")}</div> expanded={expanded}
</span> percentage="0"
{expanded && ( />;
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5 pr-1">-</div>
<div className="pr-1">{t("resources.total")}</div>
</span>
)}
<UsageBar percent={0} />
</div>
</div>
);
} }
const percent = Math.round((data.memory.active / data.memory.total) * 100); const percent = Math.round((data.memory.active / data.memory.total) * 100);
return ( return <Resource
<div className="flex-none flex flex-row items-center mr-3 py-1.5"> icon={FaMemory}
<FaMemory className="text-theme-800 dark:text-theme-200 w-5 h-5" /> value={t("common.bytes", { value: data.memory.available, maximumFractionDigits: 1, binary: true })}
<div className="flex flex-col ml-3 text-left min-w-[85px]"> label={t("resources.free")}
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between"> expandedValue={t("common.bytes", { value: data.memory.total, maximumFractionDigits: 1, binary: true })}
<div className="pl-0.5 pr-1"> expandedLabel={t("resources.total")}
{t("common.bytes", { value: data.memory.available, maximumFractionDigits: 1, binary: true })} percentage={percent}
</div> expanded={expanded}
<div className="pr-1">{t("resources.free")}</div> />;
</span>
{expanded && (
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5 pr-1">
{t("common.bytes", {
value: data.memory.total,
maximumFractionDigits: 1,
binary: true,
})}
</div>
<div className="pr-1">{t("resources.total")}</div>
</span>
)}
<UsageBar percent={percent} />
</div>
</div>
);
} }

View File

@@ -1,3 +1,6 @@
import Container from "../widget/container";
import Raw from "../widget/raw";
import Disk from "./disk"; import Disk from "./disk";
import Cpu from "./cpu"; import Cpu from "./cpu";
import Memory from "./memory"; import Memory from "./memory";
@@ -6,20 +9,22 @@ import Uptime from "./uptime";
export default function Resources({ options }) { export default function Resources({ options }) {
const { expanded, units } = options; const { expanded, units } = options;
return ( let { refresh } = options;
<div className="flex flex-col max-w:full sm:basis-auto self-center grow-0 flex-wrap"> refresh = Math.max(refresh, 1000);
return <Container options={options}>
<Raw>
<div className="flex flex-row self-center flex-wrap justify-between"> <div className="flex flex-row self-center flex-wrap justify-between">
{options.cpu && <Cpu expanded={expanded} />} {options.cpu && <Cpu expanded={expanded} refresh={refresh} />}
{options.memory && <Memory expanded={expanded} />} {options.memory && <Memory expanded={expanded} refresh={refresh} />}
{Array.isArray(options.disk) {Array.isArray(options.disk)
? options.disk.map((disk) => <Disk key={disk} options={{ disk }} expanded={expanded} />) ? options.disk.map((disk) => <Disk key={disk} options={{ disk }} expanded={expanded} refresh={refresh} />)
: options.disk && <Disk options={options} expanded={expanded} />} : options.disk && <Disk options={options} expanded={expanded} refresh={refresh} />}
{options.cputemp && <CpuTemp expanded={expanded} units={units} />} {options.cputemp && <CpuTemp expanded={expanded} units={units} refresh={refresh} />}
{options.uptime && <Uptime />} {options.uptime && <Uptime refresh={refresh} />}
</div> </div>
{options.label && ( {options.label && (
<div className="ml-6 pt-1 text-center text-theme-800 dark:text-theme-200 text-xs">{options.label}</div> <div className="ml-6 pt-1 text-center text-theme-800 dark:text-theme-200 text-xs">{options.label}</div>
)} )}
</div> </Raw>
); </Container>;
} }

View File

@@ -1,66 +1,36 @@
import useSWR from "swr"; import useSWR from "swr";
import { FaRegClock } from "react-icons/fa"; import { FaRegClock } from "react-icons/fa";
import { BiError } from "react-icons/bi";
import { useTranslation } from "next-i18next"; import { useTranslation } from "next-i18next";
import UsageBar from "./usage-bar"; import Resource from "../widget/resource";
import Error from "../widget/error";
export default function Uptime() { export default function Uptime({ refresh = 1500 }) {
const { t } = useTranslation(); const { t } = useTranslation();
const { data, error } = useSWR(`/api/widgets/resources?type=uptime`, { const { data, error } = useSWR(`/api/widgets/resources?type=uptime`, {
refreshInterval: 1500, refreshInterval: refresh,
}); });
if (error || data?.error) { if (error || data?.error) {
return ( return <Error />
<div className="flex-none flex flex-row items-center mr-3 py-1.5">
<BiError className="text-theme-800 dark:text-theme-200 w-5 h-5" />
<div className="flex flex-col ml-3 text-left">
<span className="text-theme-800 dark:text-theme-200 text-xs">{t("widget.api_error")}</span>
</div>
</div>
);
} }
if (!data) { if (!data) {
return ( return <Resource icon={FaRegClock} value="-" label={t("resources.uptime")} percentage="0" />;
<div className="flex-none flex flex-row items-center mr-3 py-1.5 animate-pulse">
<FaRegClock className="text-theme-800 dark:text-theme-200 w-5 h-5" />
<div className="flex flex-col ml-3 text-left min-w-[85px]">
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5">-</div>
<div className="pr-1">{t("resources.temp")}</div>
</span>
</div>
</div>
);
} }
const mo = Math.floor(data.uptime / (3600 * 24 * 31)); const mo = Math.floor(data.uptime / (3600 * 24 * 31));
const d = Math.floor(data.uptime % (3600 * 24 * 31) / (3600 * 24)); const d = Math.floor(data.uptime % (3600 * 24 * 31) / (3600 * 24));
const h = Math.floor(data.uptime % (3600 * 24) / 3600); const h = Math.floor(data.uptime % (3600 * 24) / 3600);
const m = Math.floor(data.uptime % 3600 / 60); const m = Math.floor(data.uptime % 3600 / 60);
let uptime; let uptime;
if (mo > 0) uptime = `${mo}${t("resources.months")} ${d}${t("resources.days")}`; if (mo > 0) uptime = `${mo}${t("resources.months")} ${d}${t("resources.days")}`;
else if (d > 0) uptime = `${d}${t("resources.days")} ${h}${t("resources.hours")}`; else if (d > 0) uptime = `${d}${t("resources.days")} ${h}${t("resources.hours")}`;
else uptime = `${h}${t("resources.hours")} ${m}${t("resources.minutes")}`; else uptime = `${h}${t("resources.hours")} ${m}${t("resources.minutes")}`;
const percent = Math.round((new Date().getSeconds() / 60) * 100); const percent = Math.round((new Date().getSeconds() / 60) * 100).toString();
return ( return <Resource icon={FaRegClock} value={uptime} label={t("resources.uptime")} percentage={percent} />;
<div className="flex-none flex flex-row items-center mr-3 py-1.5">
<FaRegClock className="text-theme-800 dark:text-theme-200 w-5 h-5" />
<div className="flex flex-col ml-3 text-left min-w-[85px]">
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5">
{uptime}
</div>
<div className="pr-1">{t("resources.uptime")}</div>
</span>
<UsageBar percent={percent} />
</div>
</div>
);
} }

View File

@@ -1,10 +1,13 @@
import { useState, useEffect, Fragment } from "react"; import { useState, useEffect, useCallback, Fragment } from "react";
import { useTranslation } from "next-i18next"; import { useTranslation } from "next-i18next";
import { FiSearch } from "react-icons/fi"; import { FiSearch } from "react-icons/fi";
import { SiDuckduckgo, SiMicrosoftbing, SiGoogle, SiBaidu, SiBrave } from "react-icons/si"; import { SiDuckduckgo, SiMicrosoftbing, SiGoogle, SiBaidu, SiBrave } from "react-icons/si";
import { Listbox, Transition } from "@headlessui/react"; import { Listbox, Transition } from "@headlessui/react";
import classNames from "classnames"; import classNames from "classnames";
import ContainerForm from "../widget/container_form";
import Raw from "../widget/raw";
export const searchProviders = { export const searchProviders = {
google: { google: {
name: "Google", name: "Google",
@@ -76,14 +79,9 @@ export default function Search({ options }) {
setSelectedProvider(storedProvider); setSelectedProvider(storedProvider);
} }
}, [availableProviderIds]); }, [availableProviderIds]);
if (!availableProviderIds) {
return null;
}
function handleSubmit(event) { const submitCallback = useCallback(event => {
const q = encodeURIComponent(query); const q = encodeURIComponent(query);
const { url } = selectedProvider; const { url } = selectedProvider;
if (url) { if (url) {
window.open(`${url}${q}`, options.target || "_blank"); window.open(`${url}${q}`, options.target || "_blank");
@@ -94,6 +92,10 @@ export default function Search({ options }) {
event.preventDefault(); event.preventDefault();
event.target.reset(); event.target.reset();
setQuery(""); setQuery("");
}, [options.target, options.url, query, selectedProvider]);
if (!availableProviderIds) {
return null;
} }
const onChangeProvider = (provider) => { const onChangeProvider = (provider) => {
@@ -101,77 +103,79 @@ export default function Search({ options }) {
localStorage.setItem(localStorageKey, provider.name); localStorage.setItem(localStorageKey, provider.name);
} }
return ( return <ContainerForm options={options} callback={submitCallback} additionalClassNames="grow" >
<form className="flex-col relative h-8 my-4 min-w-fit grow first:ml-0 ml-4" onSubmit={handleSubmit}> <Raw>
<div className="flex absolute inset-y-0 left-0 items-center pl-3 pointer-events-none w-full text-theme-800 dark:text-white" /> <div className="flex-col relative h-8 my-4 min-w-fit">
<input <div className="flex absolute inset-y-0 left-0 items-center pl-3 pointer-events-none w-full text-theme-800 dark:text-white" />
type="text" <input
className=" type="text"
overflow-hidden w-full h-full rounded-md className="
text-xs text-theme-900 dark:text-white overflow-hidden w-full h-full rounded-md
placeholder-theme-900 dark:placeholder-white/80 text-xs text-theme-900 dark:text-white
bg-white/50 dark:bg-white/10 placeholder-theme-900 dark:placeholder-white/80
focus:ring-theme-500 dark:focus:ring-white/50 bg-white/50 dark:bg-white/10
focus:border-theme-500 dark:focus:border-white/50 focus:ring-theme-500 dark:focus:ring-white/50
border border-theme-300 dark:border-theme-200/50" focus:border-theme-500 dark:focus:border-white/50
placeholder={t("search.placeholder")} border border-theme-300 dark:border-theme-200/50"
onChange={(s) => setQuery(s.currentTarget.value)} placeholder={t("search.placeholder")}
required onChange={(s) => setQuery(s.currentTarget.value)}
autoCapitalize="off" required
autoCorrect="off" autoCapitalize="off"
autoComplete="off" autoCorrect="off"
// eslint-disable-next-line jsx-a11y/no-autofocus autoComplete="off"
autoFocus={options.focus} // eslint-disable-next-line jsx-a11y/no-autofocus
/> autoFocus={options.focus}
<Listbox as="div" value={selectedProvider} onChange={onChangeProvider} className="relative text-left" disabled={availableProviderIds?.length === 1}> />
<div> <Listbox as="div" value={selectedProvider} onChange={onChangeProvider} className="relative text-left" disabled={availableProviderIds?.length === 1}>
<Listbox.Button <div>
className=" <Listbox.Button
absolute right-0.5 bottom-0.5 rounded-r-md px-4 py-2 border-1 className="
text-white font-medium text-sm absolute right-0.5 bottom-0.5 rounded-r-md px-4 py-2 border-1
bg-theme-600/40 dark:bg-white/10 text-white font-medium text-sm
focus:ring-theme-500 dark:focus:ring-white/50" bg-theme-600/40 dark:bg-white/10
focus:ring-theme-500 dark:focus:ring-white/50"
>
<selectedProvider.icon className="text-white w-3 h-3" />
<span className="sr-only">{t("search.search")}</span>
</Listbox.Button>
</div>
<Transition
as={Fragment}
enter="transition ease-out duration-100"
enterFrom="transform opacity-0 scale-95"
enterTo="transform opacity-100 scale-100"
leave="transition ease-in duration-75"
leaveFrom="transform opacity-100 scale-100"
leaveTo="transform opacity-0 scale-95"
> >
<selectedProvider.icon className="text-white w-3 h-3" /> <Listbox.Options
<span className="sr-only">{t("search.search")}</span> className="absolute right-0 z-10 mt-1 origin-top-right rounded-md
</Listbox.Button> bg-theme-100 dark:bg-theme-600 shadow-lg
</div> ring-1 ring-black ring-opacity-5 focus:outline-none"
<Transition >
as={Fragment} <div className="flex flex-col">
enter="transition ease-out duration-100" {availableProviderIds.map((providerId) => {
enterFrom="transform opacity-0 scale-95" const p = searchProviders[providerId];
enterTo="transform opacity-100 scale-100" return (
leave="transition ease-in duration-75" <Listbox.Option key={providerId} value={p} as={Fragment}>
leaveFrom="transform opacity-100 scale-100" {({ active }) => (
leaveTo="transform opacity-0 scale-95" <li
> className={classNames(
<Listbox.Options "rounded-md cursor-pointer",
className="absolute right-0 z-10 mt-1 origin-top-right rounded-md active ? "bg-theme-600/10 dark:bg-white/10 dark:text-gray-900" : "dark:text-gray-100"
bg-theme-100 dark:bg-theme-600 shadow-lg )}
ring-1 ring-black ring-opacity-5 focus:outline-none" >
> <p.icon className="h-4 w-4 mx-4 my-2" />
<div className="flex flex-col"> </li>
{availableProviderIds.map((providerId) => { )}
const p = searchProviders[providerId]; </Listbox.Option>
return ( );
<Listbox.Option key={providerId} value={p} as={Fragment}> })}
{({ active }) => ( </div>
<li </Listbox.Options>
className={classNames( </Transition>
"rounded-md cursor-pointer", </Listbox>
active ? "bg-theme-600/10 dark:bg-white/10 dark:text-gray-900" : "dark:text-gray-100" </div>
)} </Raw>
> </ContainerForm>;
<p.icon className="h-4 w-4 mx-4 my-2" />
</li>
)}
</Listbox.Option>
);
})}
</div>
</Listbox.Options>
</Transition>
</Listbox>
</form>
);
} }

View File

@@ -3,6 +3,12 @@ import { MdSettingsEthernet } from "react-icons/md";
import { useTranslation } from "next-i18next"; import { useTranslation } from "next-i18next";
import { SiUbiquiti } from "react-icons/si"; import { SiUbiquiti } from "react-icons/si";
import Error from "../widget/error";
import Container from "../widget/container";
import Raw from "../widget/raw";
import WidgetIcon from "../widget/widget_icon";
import PrimaryText from "../widget/primary_text";
import useWidgetAPI from "utils/proxy/use-widget-api"; import useWidgetAPI from "utils/proxy/use-widget-api";
export default function Widget({ options }) { export default function Widget({ options }) {
@@ -13,35 +19,16 @@ export default function Widget({ options }) {
const { data: statsData, error: statsError } = useWidgetAPI(options, "stat/sites", { index: options.index }); const { data: statsData, error: statsError } = useWidgetAPI(options, "stat/sites", { index: options.index });
if (statsError) { if (statsError) {
return ( return <Error options={options} />
<div className="flex flex-col justify-center first:ml-0 ml-4">
<div className="flex flex-row items-center justify-end">
<div className="flex flex-col items-center">
<BiError className="w-8 h-8 text-theme-800 dark:text-theme-200" />
<div className="flex flex-col ml-3 text-left">
<span className="text-theme-800 dark:text-theme-200 text-sm">{t("widget.api_error")}</span>
</div>
</div>
</div>
</div>
);
} }
const defaultSite = options.site ? statsData?.data.find(s => s.desc === options.site) : statsData?.data?.find(s => s.name === "default"); const defaultSite = options.site ? statsData?.data.find(s => s.desc === options.site) : statsData?.data?.find(s => s.name === "default");
if (!defaultSite) { if (!defaultSite) {
return ( return <Container options={options}>
<div className="flex flex-col justify-center first:ml-0 ml-4"> <PrimaryText>{t("unifi.wait")}</PrimaryText>
<div className="flex flex-row items-center justify-end"> <WidgetIcon icon={SiUbiquiti} />
<div className="flex flex-col items-center"> </Container>;
<SiUbiquiti className="w-5 h-5 text-theme-800 dark:text-theme-200" />
</div>
<div className="flex flex-col ml-3 text-left">
<span className="text-theme-800 dark:text-theme-200 text-xs">{t("unifi.wait")}</span>
</div>
</div>
</div>
);
} }
const wan = defaultSite.health.find(h => h.subsystem === "wan"); const wan = defaultSite.health.find(h => h.subsystem === "wan");
@@ -56,8 +43,9 @@ export default function Widget({ options }) {
const dataEmpty = !(wan.show || lan.show || wlan.show || uptime); const dataEmpty = !(wan.show || lan.show || wlan.show || uptime);
return ( return <Container options={options}>
<div className="flex-none flex flex-row items-center mr-3 py-1.5"> <Raw>
<div className="flex-none flex flex-row items-center mr-3 py-1.5">
<div className="flex flex-col"> <div className="flex flex-col">
<div className="flex flex-row ml-3 mb-0.5"> <div className="flex flex-row ml-3 mb-0.5">
<SiUbiquiti className="text-theme-800 dark:text-theme-200 w-3 h-3 mr-1" /> <SiUbiquiti className="text-theme-800 dark:text-theme-200 w-3 h-3 mr-1" />
@@ -141,6 +129,7 @@ export default function Widget({ options }) {
</div> </div>
</div>} </div>}
</div> </div>
</div> </div>
); </Raw>
</Container>
} }

View File

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

View File

@@ -1,11 +1,16 @@
import useSWR from "swr"; import useSWR from "swr";
import { useState } from "react"; import { useState } from "react";
import { BiError } from "react-icons/bi";
import { WiCloudDown } from "react-icons/wi"; import { WiCloudDown } from "react-icons/wi";
import { MdLocationDisabled, MdLocationSearching } from "react-icons/md"; import { MdLocationDisabled, MdLocationSearching } from "react-icons/md";
import { useTranslation } from "next-i18next"; import { useTranslation } from "next-i18next";
import Icon from "./icon"; import Error from "../widget/error";
import Container from "../widget/container";
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 mapIcon from "../../../utils/weather/condition-map";
function Widget({ options }) { function Widget({ options }) {
const { t, i18n } = useTranslation(); const { t, i18n } = useTranslation();
@@ -15,59 +20,33 @@ function Widget({ options }) {
); );
if (error || data?.error) { if (error || data?.error) {
return ( return <Error options={options} />
<div className="flex flex-col justify-center first:ml-0 ml-4 mr-2">
<div className="flex flex-row items-center justify-end">
<div className="flex flex-col items-center">
<BiError className="w-8 h-8 text-theme-800 dark:text-theme-200" />
<div className="flex flex-col ml-3 text-left">
<span className="text-theme-800 dark:text-theme-200 text-sm">{t("widget.api_error")}</span>
<span className="text-theme-800 dark:text-theme-200 text-xs">-</span>
</div>
</div>
</div>
</div>
);
} }
if (!data) { if (!data) {
return ( return <Container options={options}>
<div className="flex flex-col justify-center first:ml-0 ml-4 mr-2"> <PrimaryText>{t("weather.updating")}</PrimaryText>
<div className="flex flex-row items-center justify-end"> <SecondaryText>{t("weather.wait")}</SecondaryText>
<div className="flex flex-col items-center"> <WidgetIcon icon={WiCloudDown} size="l" />
<WiCloudDown className="w-8 h-8 text-theme-800 dark:text-theme-200" /> </Container>;
</div>
<div className="flex flex-col ml-3 text-left">
<span className="text-theme-800 dark:text-theme-200 text-sm">{t("weather.updating")}</span>
<span className="text-theme-800 dark:text-theme-200 text-xs">{t("weather.wait")}</span>
</div>
</div>
</div>
);
} }
const unit = options.units === "metric" ? "celsius" : "fahrenheit"; const unit = options.units === "metric" ? "celsius" : "fahrenheit";
const condition = data.current.condition.code;
const timeOfDay = data.current.is_day ? "day" : "night";
return ( return <Container options={options}>
<div className="flex flex-col justify-center first:ml-0 ml-4 mr-2"> <PrimaryText>
<div className="flex flex-row items-center justify-end"> {options.label && `${options.label}, `}
<div className="flex flex-col items-center"> {t("common.number", {
<Icon condition={data.current.condition.code} timeOfDay={data.current.is_day ? "day" : "night"} /> value: options.units === "metric" ? data.current.temp_c : data.current.temp_f,
</div> style: "unit",
<div className="flex flex-col ml-3 text-left"> unit,
<span className="text-theme-800 dark:text-theme-200 text-sm"> })}
{options.label && `${options.label}, `} </PrimaryText>
{t("common.number", { <SecondaryText>{data.current.condition.text}</SecondaryText>
value: options.units === "metric" ? data.current.temp_c : data.current.temp_f, <WidgetIcon icon={mapIcon(condition, timeOfDay)} size="xl" />
style: "unit", </Container>;
unit,
})}
</span>
<span className="text-theme-800 dark:text-theme-200 text-xs">{data.current.condition.text}</span>
</div>
</div>
</div>
);
} }
export default function WeatherApi({ options }) { export default function WeatherApi({ options }) {
@@ -99,30 +78,12 @@ export default function WeatherApi({ options }) {
} }
}; };
// if (!requesting && !location) requestLocation();
if (!location) { if (!location) {
return ( return <ContainerButton options={options} callback={requestLocation} >
<button <PrimaryText>{t("weather.current")}</PrimaryText>
type="button" <SecondaryText>{t("weather.allow")}</SecondaryText>
onClick={() => requestLocation()} <WidgetIcon icon={requesting ? MdLocationSearching : MdLocationDisabled} size="m" pulse />
className="flex flex-col justify-center first:ml-0 ml-4 mr-2" </ContainerButton>;
>
<div className="flex flex-row items-center justify-end">
<div className="flex flex-col items-center">
{requesting ? (
<MdLocationSearching className="w-6 h-6 text-theme-800 dark:text-theme-200 animate-pulse" />
) : (
<MdLocationDisabled className="w-6 h-6 text-theme-800 dark:text-theme-200" />
)}
</div>
<div className="flex flex-col ml-3 text-left">
<span className="text-theme-800 dark:text-theme-200 text-sm">{t("weather.current")}</span>
<span className="text-theme-800 dark:text-theme-200 text-xs">{t("weather.allow")}</span>
</div>
</div>
</button>
);
} }
return <Widget options={{ ...location, ...options }} />; return <Widget options={{ ...location, ...options }} />;

View File

@@ -17,13 +17,13 @@ const widgetMappings = {
kubernetes: dynamic(() => import("components/widgets/kubernetes/kubernetes")), kubernetes: dynamic(() => import("components/widgets/kubernetes/kubernetes")),
}; };
export default function Widget({ widget }) { export default function Widget({ widget, style }) {
const InfoWidget = widgetMappings[widget.type]; const InfoWidget = widgetMappings[widget.type];
if (InfoWidget) { if (InfoWidget) {
return ( return (
<ErrorBoundary> <ErrorBoundary>
<InfoWidget options={widget.options} /> <InfoWidget options={{ ...widget.options, style }} />
</ErrorBoundary> </ErrorBoundary>
); );
} }

View File

@@ -0,0 +1,54 @@
import classNames from "classnames";
import WidgetIcon from "./widget_icon";
import PrimaryText from "./primary_text";
import SecondaryText from "./secondary_text";
import Raw from "./raw";
export function getAllClasses(options, additionalClassNames = '') {
if (options?.style?.header === "boxedWidgets") {
return classNames(
"flex flex-col justify-center first:ml-0 ml-2 mr-2",
"mt-2 m:mb-0 rounded-md shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 dark:bg-white/5 p-2 pl-3 pr-3",
additionalClassNames
);
}
let widgetAlignedClasses = "flex flex-col max-w:full sm:basis-auto self-center grow-0 flex-wrap";
if (options?.style?.isRightAligned) {
widgetAlignedClasses = "flex flex-col justify-center first:ml-auto ml-2 mr-2 ";
}
return classNames(
widgetAlignedClasses,
additionalClassNames
);
}
export function getInnerBlock(children) {
// children won't be an array if it's Raw component
return Array.isArray(children) && <div className="flex flex-row items-center justify-end">
<div className="flex flex-col items-center">{children.find(child => child.type === WidgetIcon)}</div>
<div className="flex flex-col ml-3 text-left">
{children.find(child => child.type === PrimaryText)}
{children.find(child => child.type === SecondaryText)}
</div>
</div>;
}
export function getBottomBlock(children) {
if (children.type !== Raw) {
return children.find(child => child.type === Raw) || [];
}
return [children];
}
export default function Container({ children = [], options, additionalClassNames = '' }) {
return (
<div className={getAllClasses(options, additionalClassNames)}>
{getInnerBlock(children)}
{getBottomBlock(children)}
</div>
);
}

View File

@@ -0,0 +1,10 @@
import { getAllClasses, getInnerBlock, getBottomBlock } from "./container";
export default function ContainerButton ({ children = [], options, additionalClassNames = '', callback }) {
return (
<button type="button" onClick={callback} className={getAllClasses(options, additionalClassNames)}>
{getInnerBlock(children)}
{getBottomBlock(children)}
</button>
);
}

View File

@@ -0,0 +1,10 @@
import { getAllClasses, getInnerBlock, getBottomBlock } from "./container";
export default function ContainerForm ({ children = [], options, additionalClassNames = '', callback }) {
return (
<form type="button" onSubmit={callback} className={getAllClasses(options, additionalClassNames)}>
{getInnerBlock(children)}
{getBottomBlock(children)}
</form>
);
}

View File

@@ -0,0 +1,10 @@
import { getAllClasses, getInnerBlock, getBottomBlock } from "./container";
export default function ContainerLink ({ children = [], options, additionalClassNames = '', target }) {
return (
<a href={options.url} target={target} className={getAllClasses(options, additionalClassNames)}>
{getInnerBlock(children)}
{getBottomBlock(children)}
</a>
);
}

View File

@@ -0,0 +1,15 @@
import { useTranslation } from "react-i18next";
import { BiError } from "react-icons/bi";
import Container from "./container";
import PrimaryText from "./primary_text";
import WidgetIcon from "./widget_icon";
export default function Error({ options }) {
const { t } = useTranslation();
return <Container options={options}>
<PrimaryText>{t("widget.api_error")}</PrimaryText>
<WidgetIcon icon={BiError} size="l" />
</Container>;
}

View File

@@ -0,0 +1,5 @@
export default function PrimaryText({ children }) {
return (
<span className="text-theme-800 dark:text-theme-200 text-sm">{children}</span>
);
}

View File

@@ -0,0 +1,7 @@
export default function Raw({ children }) {
if (children.type === Raw) {
return [children];
}
return children;
}

View File

@@ -0,0 +1,22 @@
import UsageBar from "../resources/usage-bar";
export default function Resource({ children, icon, value, label, expandedValue = "", expandedLabel = "", percentage, expanded = false }) {
const Icon = icon;
return <div className="flex-none flex flex-row items-center mr-3 py-1.5">
<Icon className="text-theme-800 dark:text-theme-200 w-5 h-5"/>
<div className="flex flex-col ml-3 text-left min-w-[85px]">
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5">{value}</div>
<div className="pr-1">{label}</div>
</div>
{ expanded && <div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5">{expandedValue}</div>
<div className="pr-1">{expandedLabel}</div>
</div>
}
{ percentage && <UsageBar percent={percentage} /> }
{ children }
</div>
</div>;
}

View File

@@ -0,0 +1,17 @@
import ContainerLink from "./container_link";
import Resource from "./resource";
import Raw from "./raw";
import WidgetLabel from "./widget_label";
export default function Resources({ options, children, target }) {
const widgetParts = [].concat(...children);
return <ContainerLink options={options} target={target}>
<Raw>
<div className="flex flex-row self-center flex-wrap justify-between">
{ widgetParts.filter(child => child && child.type === Resource) }
</div>
{ widgetParts.filter(child => child && child.type === WidgetLabel) }
</Raw>
</ContainerLink>;
}

View File

@@ -0,0 +1,5 @@
export default function SecondaryText({ children }) {
return (
<span className="text-theme-800 dark:text-theme-200 text-xs">{children}</span>
);
}

View File

@@ -0,0 +1,17 @@
export default function WidgetIcon({ icon, size = "s", pulse = false }) {
const Icon = icon;
let additionalClasses = "text-theme-800 dark:text-theme-200 ";
switch (size) {
case "m": additionalClasses += "w-6 h-6 "; break;
case "l": additionalClasses += "w-8 h-8 "; break;
case "xl": additionalClasses += "w-10 h-10 "; break;
default: additionalClasses += "w-5 h-5 ";
}
if (pulse) {
additionalClasses += "animate-pulse ";
}
return <Icon className={additionalClasses} />;
}

View File

@@ -0,0 +1,3 @@
export default function WidgetLabel({ label = "" }) {
return <div className="pt-1 text-center text-theme-800 dark:text-theme-200 text-xs">{label}</div>
}

View File

@@ -2,7 +2,7 @@ import { join } from "path";
import { createHash } from "crypto"; import { createHash } from "crypto";
import { readFileSync } from "fs"; import { readFileSync } from "fs";
import checkAndCopyConfig from "utils/config/config"; import checkAndCopyConfig, { CONF_DIR } from "utils/config/config";
const configs = ["docker.yaml", "settings.yaml", "services.yaml", "bookmarks.yaml", "widgets.yaml"]; const configs = ["docker.yaml", "settings.yaml", "services.yaml", "bookmarks.yaml", "widgets.yaml"];
@@ -15,7 +15,7 @@ function hash(buffer) {
export default async function handler(req, res) { export default async function handler(req, res) {
const hashes = configs.map((config) => { const hashes = configs.map((config) => {
checkAndCopyConfig(config); checkAndCopyConfig(config);
const configYaml = join(process.cwd(), "config", config); const configYaml = join(CONF_DIR, config);
return hash(readFileSync(configYaml, "utf8")); return hash(readFileSync(configYaml, "utf8"));
}); });

View File

@@ -22,6 +22,7 @@ export default async function handler(req, res) {
if (widget?.mappings) { if (widget?.mappings) {
const mapping = widget?.mappings?.[req.query.endpoint]; const mapping = widget?.mappings?.[req.query.endpoint];
const mappingParams = mapping?.params; const mappingParams = mapping?.params;
const optionalParams = mapping?.optionalParams;
const map = mapping?.map; const map = mapping?.map;
const endpoint = mapping?.endpoint; const endpoint = mapping?.endpoint;
const endpointProxy = mapping?.proxyHandler || serviceProxyHandler; const endpointProxy = mapping?.proxyHandler || serviceProxyHandler;
@@ -40,9 +41,17 @@ export default async function handler(req, res) {
req.query.endpoint = formatApiCall(endpoint, segments); req.query.endpoint = formatApiCall(endpoint, segments);
} }
if (req.query.query && mappingParams) { if (req.query.query && (mappingParams || optionalParams)) {
const queryParams = JSON.parse(req.query.query); const queryParams = JSON.parse(req.query.query);
const query = new URLSearchParams(mappingParams.map((p) => [p, queryParams[p]]));
let filteredOptionalParams = []
if (optionalParams) filteredOptionalParams = optionalParams.filter(p => queryParams[p] !== undefined);
let params = [];
if (mappingParams) params = params.concat(mappingParams);
if (filteredOptionalParams) params = params.concat(filteredOptionalParams);
const query = new URLSearchParams(params.map((p) => [p, queryParams[p]]));
req.query.endpoint = `${req.query.endpoint}?${query}`; req.query.endpoint = `${req.query.endpoint}?${query}`;
} }

View File

@@ -46,7 +46,7 @@ function parseLonghornData(data) {
export default async function handler(req, res) { export default async function handler(req, res) {
const settings = getSettings(); const settings = getSettings();
const longhornSettings = settings?.providers?.longhorn; const longhornSettings = settings?.providers?.longhorn || {};
const {url, username, password} = longhornSettings; const {url, username, password} = longhornSettings;
if (!url) { if (!url) {

View File

@@ -160,6 +160,7 @@ const headerStyles = {
"m-4 mb-0 sm:m-8 sm:mb-0 rounded-md shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 dark:bg-white/5 p-3", "m-4 mb-0 sm:m-8 sm:mb-0 rounded-md shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 dark:bg-white/5 p-3",
underlined: "m-4 mb-0 sm:m-8 sm:mb-1 border-b-2 pb-4 border-theme-800 dark:border-theme-200/50", underlined: "m-4 mb-0 sm:m-8 sm:mb-1 border-b-2 pb-4 border-theme-800 dark:border-theme-200/50",
clean: "m-4 mb-0 sm:m-8 sm:mb-0", clean: "m-4 mb-0 sm:m-8 sm:mb-0",
boxedWidgets: "m-4 mb-0 sm:m-8 sm:mb-0 sm:mt-1",
}; };
function Home({ initialSettings }) { function Home({ initialSettings }) {
@@ -208,6 +209,7 @@ function Home({ initialSettings }) {
searchProvider = searchProviders[searchWidget.options?.provider]; searchProvider = searchProviders[searchWidget.options?.provider];
} }
} }
const headerStyle = initialSettings?.headerStyle || "underlined";
useEffect(() => { useEffect(() => {
function handleKeyDown(e) { function handleKeyDown(e) {
@@ -256,7 +258,7 @@ function Home({ initialSettings }) {
<div <div
className={classNames( className={classNames(
"flex flex-row flex-wrap justify-between", "flex flex-row flex-wrap justify-between",
headerStyles[initialSettings.headerStyle || "underlined"] headerStyles[headerStyle]
)} )}
> >
<QuickLaunch <QuickLaunch
@@ -272,14 +274,17 @@ function Home({ initialSettings }) {
{widgets {widgets
.filter((widget) => !rightAlignedWidgets.includes(widget.type)) .filter((widget) => !rightAlignedWidgets.includes(widget.type))
.map((widget, i) => ( .map((widget, i) => (
<Widget key={i} widget={widget} /> <Widget key={i} widget={widget} style={{ header: headerStyle, isRightAligned: false}} />
))} ))}
<div className="m-auto sm:ml-2 flex flex-wrap grow sm:basis-auto justify-between md:justify-end"> <div className={classNames(
"m-auto flex flex-wrap grow sm:basis-auto justify-between md:justify-end",
headerStyle === "boxedWidgets" ? "sm:ml-4" : "sm:ml-2"
)}>
{widgets {widgets
.filter((widget) => rightAlignedWidgets.includes(widget.type)) .filter((widget) => rightAlignedWidgets.includes(widget.type))
.map((widget, i) => ( .map((widget, i) => (
<Widget key={i} widget={widget} /> <Widget key={i} widget={widget} style={{ header: headerStyle, isRightAligned: true}} />
))} ))}
</div> </div>
</> </>
@@ -289,7 +294,13 @@ function Home({ initialSettings }) {
{services?.length > 0 && ( {services?.length > 0 && (
<div className="flex flex-wrap p-4 sm:p-8 sm:pt-4 items-start pb-2"> <div className="flex flex-wrap p-4 sm:p-8 sm:pt-4 items-start pb-2">
{services.map((group) => ( {services.map((group) => (
<ServicesGroup key={group.name} group={group.name} services={group} layout={initialSettings.layout?.[group.name]} fiveColumns={settings.fiveColumns} /> <ServicesGroup
key={group.name}
group={group.name}
services={group}
layout={initialSettings.layout?.[group.name]}
fiveColumns={settings.fiveColumns}
disableCollapse={settings.disableCollapse} />
))} ))}
</div> </div>
)} )}
@@ -297,7 +308,10 @@ function Home({ initialSettings }) {
{bookmarks?.length > 0 && ( {bookmarks?.length > 0 && (
<div className={`grow flex flex-wrap pt-0 p-4 sm:p-8 gap-2 grid-cols-1 lg:grid-cols-2 lg:grid-cols-${Math.min(6, bookmarks.length)}`}> <div className={`grow flex flex-wrap pt-0 p-4 sm:p-8 gap-2 grid-cols-1 lg:grid-cols-2 lg:grid-cols-${Math.min(6, bookmarks.length)}`}>
{bookmarks.map((group) => ( {bookmarks.map((group) => (
<BookmarksGroup key={group.name} group={group} /> <BookmarksGroup
key={group.name}
group={group}
disableCollapse={settings.disableCollapse} />
))} ))}
</div> </div>
)} )}
@@ -359,7 +373,7 @@ export default function Wrapper({ initialSettings, fallback }) {
style={wrappedStyle} style={wrappedStyle}
> >
<div <div
id="inner_wrapper" id="inner_wrapper"
className={classNames( className={classNames(
'fixed overflow-auto w-full h-full', 'fixed overflow-auto w-full h-full',
backgroundBlur && `backdrop-blur${initialSettings.background.blur.length ? '-' : ""}${initialSettings.background.blur}`, backgroundBlur && `backdrop-blur${initialSettings.background.blur.length ? '-' : ""}${initialSettings.background.blur}`,

View File

@@ -4,7 +4,7 @@ import path from "path";
import yaml from "js-yaml"; import yaml from "js-yaml";
import checkAndCopyConfig, { getSettings, substituteEnvironmentVars } from "utils/config/config"; import checkAndCopyConfig, { getSettings, substituteEnvironmentVars, CONF_DIR } from "utils/config/config";
import { import {
servicesFromConfig, servicesFromConfig,
servicesFromDocker, servicesFromDocker,
@@ -27,7 +27,7 @@ function compareServices(service1, service2) {
export async function bookmarksResponse() { export async function bookmarksResponse() {
checkAndCopyConfig("bookmarks.yaml"); checkAndCopyConfig("bookmarks.yaml");
const bookmarksYaml = path.join(process.cwd(), "config", "bookmarks.yaml"); const bookmarksYaml = path.join(CONF_DIR, "bookmarks.yaml");
const rawFileContents = await fs.readFile(bookmarksYaml, "utf8"); const rawFileContents = await fs.readFile(bookmarksYaml, "utf8");
const fileContents = substituteEnvironmentVars(rawFileContents); const fileContents = substituteEnvironmentVars(rawFileContents);
const bookmarks = yaml.load(fileContents); const bookmarks = yaml.load(fileContents);

View File

@@ -1,6 +1,6 @@
/* eslint-disable no-console */ /* eslint-disable no-console */
import { join } from "path"; import { join } from "path";
import { existsSync, readFileSync, copyFileSync } from "fs"; import { copyFileSync, existsSync, mkdirSync, readFileSync } from "fs";
import cache from "memory-cache"; import cache from "memory-cache";
import yaml from "js-yaml"; import yaml from "js-yaml";
@@ -9,8 +9,14 @@ const cacheKey = "homepageEnvironmentVariables";
const homepageVarPrefix = "HOMEPAGE_VAR_"; const homepageVarPrefix = "HOMEPAGE_VAR_";
const homepageFilePrefix = "HOMEPAGE_FILE_"; const homepageFilePrefix = "HOMEPAGE_FILE_";
export const CONF_DIR = process.env.HOMEPAGE_CONFIG_DIR ? process.env.HOMEPAGE_CONFIG_DIR : join(process.cwd(), "config");
export default function checkAndCopyConfig(config) { export default function checkAndCopyConfig(config) {
const configYaml = join(process.cwd(), "config", config); if (!existsSync(CONF_DIR)) {
mkdirSync(CONF_DIR, { recursive: true });
}
const configYaml = join(CONF_DIR, config);
if (!existsSync(configYaml)) { if (!existsSync(configYaml)) {
const configSkeleton = join(process.cwd(), "src", "skeleton", config); const configSkeleton = join(process.cwd(), "src", "skeleton", config);
try { try {
@@ -62,7 +68,7 @@ export function substituteEnvironmentVars(str) {
export function getSettings() { export function getSettings() {
checkAndCopyConfig("settings.yaml"); checkAndCopyConfig("settings.yaml");
const settingsYaml = join(process.cwd(), "config", "settings.yaml"); const settingsYaml = join(CONF_DIR, "settings.yaml");
const rawFileContents = readFileSync(settingsYaml, "utf8"); const rawFileContents = readFileSync(settingsYaml, "utf8");
const fileContents = substituteEnvironmentVars(rawFileContents); const fileContents = substituteEnvironmentVars(rawFileContents);
const initialSettings = yaml.load(fileContents) ?? {}; const initialSettings = yaml.load(fileContents) ?? {};
@@ -79,6 +85,5 @@ export function getSettings() {
}) })
} }
} }
return initialSettings return initialSettings
} }

View File

@@ -3,12 +3,12 @@ import { readFileSync } from "fs";
import yaml from "js-yaml"; import yaml from "js-yaml";
import checkAndCopyConfig, { substituteEnvironmentVars } from "utils/config/config"; import checkAndCopyConfig, { CONF_DIR, substituteEnvironmentVars } from "utils/config/config";
export default function getDockerArguments(server) { export default function getDockerArguments(server) {
checkAndCopyConfig("docker.yaml"); checkAndCopyConfig("docker.yaml");
const configFile = path.join(process.cwd(), "config", "docker.yaml"); const configFile = path.join(CONF_DIR, "docker.yaml");
const rawConfigData = readFileSync(configFile, "utf8"); const rawConfigData = readFileSync(configFile, "utf8");
const configData = substituteEnvironmentVars(rawConfigData); const configData = substituteEnvironmentVars(rawConfigData);
const servers = yaml.load(configData); const servers = yaml.load(configData);
@@ -37,9 +37,9 @@ export default function getDockerArguments(server) {
} }
if (servers[server].tls){ if (servers[server].tls){
res.conn.ca = readFileSync(path.join(process.cwd(), "config", servers[server].tls.caFile)); res.conn.ca = readFileSync(path.join(CONF_DIR, servers[server].tls.caFile));
res.conn.cert = readFileSync(path.join(process.cwd(), "config", servers[server].tls.certFile)); res.conn.cert = readFileSync(path.join(CONF_DIR, servers[server].tls.certFile));
res.conn.key = readFileSync(path.join(process.cwd(), "config", servers[server].tls.keyFile)); res.conn.key = readFileSync(path.join(CONF_DIR, servers[server].tls.keyFile));
} }
return res; return res;

View File

@@ -4,12 +4,12 @@ import { readFileSync } from "fs";
import yaml from "js-yaml"; import yaml from "js-yaml";
import { KubeConfig } from "@kubernetes/client-node"; import { KubeConfig } from "@kubernetes/client-node";
import checkAndCopyConfig, { substituteEnvironmentVars } from "utils/config/config"; import checkAndCopyConfig, { CONF_DIR, substituteEnvironmentVars } from "utils/config/config";
export default function getKubeConfig() { export default function getKubeConfig() {
checkAndCopyConfig("kubernetes.yaml"); checkAndCopyConfig("kubernetes.yaml");
const configFile = path.join(process.cwd(), "config", "kubernetes.yaml"); const configFile = path.join(CONF_DIR, "kubernetes.yaml");
const rawConfigData = readFileSync(configFile, "utf8"); const rawConfigData = readFileSync(configFile, "utf8");
const configData = substituteEnvironmentVars(rawConfigData); const configData = substituteEnvironmentVars(rawConfigData);
const config = yaml.load(configData); const config = yaml.load(configData);

View File

@@ -7,7 +7,7 @@ import * as shvl from "shvl";
import { CustomObjectsApi, NetworkingV1Api } from "@kubernetes/client-node"; import { CustomObjectsApi, NetworkingV1Api } from "@kubernetes/client-node";
import createLogger from "utils/logger"; import createLogger from "utils/logger";
import checkAndCopyConfig, { substituteEnvironmentVars } from "utils/config/config"; import checkAndCopyConfig, { CONF_DIR, substituteEnvironmentVars } from "utils/config/config";
import getDockerArguments from "utils/config/docker"; import getDockerArguments from "utils/config/docker";
import getKubeConfig from "utils/config/kubernetes"; import getKubeConfig from "utils/config/kubernetes";
@@ -17,7 +17,7 @@ const logger = createLogger("service-helpers");
export async function servicesFromConfig() { export async function servicesFromConfig() {
checkAndCopyConfig("services.yaml"); checkAndCopyConfig("services.yaml");
const servicesYaml = path.join(process.cwd(), "config", "services.yaml"); const servicesYaml = path.join(CONF_DIR, "services.yaml");
const rawFileContents = await fs.readFile(servicesYaml, "utf8"); const rawFileContents = await fs.readFile(servicesYaml, "utf8");
const fileContents = substituteEnvironmentVars(rawFileContents); const fileContents = substituteEnvironmentVars(rawFileContents);
const services = yaml.load(fileContents); const services = yaml.load(fileContents);
@@ -51,7 +51,7 @@ export async function servicesFromConfig() {
export async function servicesFromDocker() { export async function servicesFromDocker() {
checkAndCopyConfig("docker.yaml"); checkAndCopyConfig("docker.yaml");
const dockerYaml = path.join(process.cwd(), "config", "docker.yaml"); const dockerYaml = path.join(CONF_DIR, "docker.yaml");
const rawDockerFileContents = await fs.readFile(dockerYaml, "utf8"); const rawDockerFileContents = await fs.readFile(dockerYaml, "utf8");
const dockerFileContents = substituteEnvironmentVars(rawDockerFileContents); const dockerFileContents = substituteEnvironmentVars(rawDockerFileContents);
const servers = yaml.load(dockerFileContents); const servers = yaml.load(dockerFileContents);
@@ -158,11 +158,20 @@ export async function servicesFromKubernetes() {
return null; return null;
}); });
const traefikIngressList = await crd.listClusterCustomObject("traefik.containo.us", "v1alpha1", "ingressroutes") const traefikIngressList = await crd.listClusterCustomObject("traefik.io", "v1alpha1", "ingressroutes")
.then((response) => response.body) .then((response) => response.body)
.catch((error) => { .catch(async (error) => {
logger.error("Error getting traefik ingresses: %d %s %s", error.statusCode, error.body, error.response); logger.error("Error getting traefik ingresses from traefik.io: %d %s %s", error.statusCode, error.body, error.response);
return null;
// Fallback to the old traefik CRD group
const fallbackIngressList = await crd.listClusterCustomObject("traefik.containo.us", "v1alpha1", "ingressroutes")
.then((response) => response.body)
.catch((fallbackError) => {
logger.error("Error getting traefik ingresses from traefik.containo.us: %d %s %s", fallbackError.statusCode, fallbackError.body, fallbackError.response);
return null;
});
return fallbackIngressList;
}); });
if (traefikIngressList && traefikIngressList.items.length > 0) { if (traefikIngressList && traefikIngressList.items.length > 0) {
@@ -270,6 +279,7 @@ export function cleanServiceGroups(groups) {
container, container,
currency, // coinmarketcap widget currency, // coinmarketcap widget
symbols, symbols,
slugs,
defaultinterval, defaultinterval,
site, // unifi widget site, // unifi widget
namespace, // kubernetes widget namespace, // kubernetes widget
@@ -280,9 +290,21 @@ export function cleanServiceGroups(groups) {
enableNowPlaying, enableNowPlaying,
volume, // diskstation widget, volume, // diskstation widget,
enableQueue, // sonarr/radarr enableQueue, // sonarr/radarr
node, // Proxmox
snapshotHost, // kopia
snapshotPath,
userEmail, // azuredevops
repositoryId
} = cleanedService.widget; } = cleanedService.widget;
const fieldsList = typeof fields === 'string' ? JSON.parse(fields) : fields; let fieldsList = fields;
if (typeof fields === 'string') {
try { JSON.parse(fields) }
catch (e) {
logger.error("Invalid fields list detected in config for service '%s'", service.name);
fieldsList = null;
}
}
cleanedService.widget = { cleanedService.widget = {
type, type,
@@ -292,9 +314,17 @@ export function cleanServiceGroups(groups) {
service_group: serviceGroup.name, service_group: serviceGroup.name,
}; };
if (currency) cleanedService.widget.currency = currency; if (type === "azuredevops") {
if (symbols) cleanedService.widget.symbols = symbols; if (userEmail) cleanedService.widget.userEmail = userEmail;
if (defaultinterval) cleanedService.widget.defaultinterval = defaultinterval; if (repositoryId) cleanedService.widget.repositoryId = repositoryId;
}
if (type === "coinmarketcap") {
if (currency) cleanedService.widget.currency = currency;
if (symbols) cleanedService.widget.symbols = symbols;
if (slugs) cleanedService.widget.slugs = slugs;
if (defaultinterval) cleanedService.widget.defaultinterval = defaultinterval;
}
if (type === "docker") { if (type === "docker") {
if (server) cleanedService.widget.server = server; if (server) cleanedService.widget.server = server;
@@ -303,6 +333,9 @@ export function cleanServiceGroups(groups) {
if (type === "unifi") { if (type === "unifi") {
if (site) cleanedService.widget.site = site; if (site) cleanedService.widget.site = site;
} }
if (type === "proxmox") {
if (node) cleanedService.widget.node = node;
}
if (type === "kubernetes") { if (type === "kubernetes") {
if (namespace) cleanedService.widget.namespace = namespace; if (namespace) cleanedService.widget.namespace = namespace;
if (app) cleanedService.widget.app = app; if (app) cleanedService.widget.app = app;
@@ -321,6 +354,10 @@ export function cleanServiceGroups(groups) {
if (["diskstation", "qnap"].includes(type)) { if (["diskstation", "qnap"].includes(type)) {
if (volume) cleanedService.widget.volume = volume; if (volume) cleanedService.widget.volume = volume;
} }
if (type === "kopia") {
if (snapshotHost) cleanedService.widget.snapshotHost = snapshotHost;
if (snapshotPath) cleanedService.widget.snapshotPath = snapshotPath;
}
} }
return cleanedService; return cleanedService;

View File

@@ -3,12 +3,12 @@ import path from "path";
import yaml from "js-yaml"; import yaml from "js-yaml";
import checkAndCopyConfig, { substituteEnvironmentVars } from "utils/config/config"; import checkAndCopyConfig, { CONF_DIR, substituteEnvironmentVars } from "utils/config/config";
export async function widgetsFromConfig() { export async function widgetsFromConfig() {
checkAndCopyConfig("widgets.yaml"); checkAndCopyConfig("widgets.yaml");
const widgetsYaml = path.join(process.cwd(), "config", "widgets.yaml"); const widgetsYaml = path.join(CONF_DIR, "widgets.yaml");
const rawFileContents = await fs.readFile(widgetsYaml, "utf8"); const rawFileContents = await fs.readFile(widgetsYaml, "utf8");
const fileContents = substituteEnvironmentVars(rawFileContents); const fileContents = substituteEnvironmentVars(rawFileContents);
const widgets = yaml.load(fileContents); const widgets = yaml.load(fileContents);

View File

@@ -1,18 +1,17 @@
/* eslint-disable no-console */ /* eslint-disable no-console */
import { join } from "path";
import { format as utilFormat } from "node:util"; import { format as utilFormat } from "node:util";
import winston from "winston"; import winston from "winston";
import checkAndCopyConfig, { getSettings } from "utils/config/config"; import checkAndCopyConfig, { getSettings, CONF_DIR } from "utils/config/config";
let winstonLogger; let winstonLogger;
function init() { function init() {
const configPath = join(process.cwd(), "config");
checkAndCopyConfig("settings.yaml"); checkAndCopyConfig("settings.yaml");
const settings = getSettings(); const settings = getSettings();
const logpath = settings.logpath || configPath; const logpath = settings.logpath || CONF_DIR;
function combineMessageAndSplat() { function combineMessageAndSplat() {
return { return {

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
/* eslint-disable prefer-promise-reject-errors */ /* eslint-disable prefer-promise-reject-errors */
/* eslint-disable no-param-reassign */ /* eslint-disable no-param-reassign */
import { createUnzip } from "node:zlib"; import { createUnzip, constants as zlibConstants } from "node:zlib";
import { http, https } from "follow-redirects"; import { http, https } from "follow-redirects";
@@ -34,7 +34,19 @@ function handleRequest(requestor, url, params) {
let responseContent = response; let responseContent = response;
if (contentEncoding === 'gzip' || contentEncoding === 'deflate') { if (contentEncoding === 'gzip' || contentEncoding === 'deflate') {
responseContent = createUnzip(); // https://github.com/request/request/blob/3c0cddc7c8eb60b470e9519da85896ed7ee0081e/request.js#L1018-L1025
// Be more lenient with decoding compressed responses, in case of invalid gzip responses that are still accepted
// by common browsers.
responseContent = createUnzip({
flush: zlibConstants.Z_SYNC_FLUSH,
finishFlush: zlibConstants.Z_SYNC_FLUSH
});
// zlib errors
responseContent.on("error", (e) => {
logger.error(e);
responseContent = response; // fallback
});
response.pipe(responseContent); response.pipe(responseContent);
} }
@@ -98,6 +110,6 @@ export async function httpProxy(url, params = {}) {
constructedUrl.pathname constructedUrl.pathname
); );
logger.error(err); logger.error(err);
return [500, "application/json", { error: {message: err?.message ?? "Unknown error", url, rawError: err} }, null]; return [500, "application/json", { error: { message: err?.message ?? "Unknown error", url, rawError: err } }, null];
} }
} }

Some files were not shown because too many files have changed in this diff Show More