Compare commits

...

296 Commits

Author SHA1 Message Date
Denis Papec
fc7e73eba2 Added custom API widget (#1858)
* Added custom API widget

* Rename custom widget to customapi

---------

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2023-08-25 23:39:15 -07:00
Anonymous
14b886793c Translated using Weblate (Basque)
Currently translated at 6.5% (34 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eu/
2023-08-26 08:26:04 +02:00
Anonymous
c460b7594f Translated using Weblate (Indonesian)
Currently translated at 4.6% (24 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/id/
2023-08-26 08:26:03 +02:00
Anonymous
6cfb150c9a Translated using Weblate (Slovenian)
Currently translated at 90.4% (471 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/
2023-08-26 08:26:03 +02:00
Anonymous
f107481da2 Translated using Weblate (Greek)
Currently translated at 34.5% (180 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-08-26 08:26:03 +02:00
Anonymous
96891e3205 Translated using Weblate (Korean)
Currently translated at 33.2% (173 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ko/
2023-08-26 08:26:02 +02:00
Anonymous
582f916379 Translated using Weblate (Slovak)
Currently translated at 1.9% (10 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sk/
2023-08-26 08:26:02 +02:00
Anonymous
b4d12cad9d Translated using Weblate (Thai)
Currently translated at 9.2% (48 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/th/
2023-08-26 08:26:02 +02:00
Anonymous
2c9225cde2 Translated using Weblate (Latvian)
Currently translated at 22.6% (118 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-08-26 08:26:01 +02:00
Anonymous
26715edbd0 Translated using Weblate (Japanese)
Currently translated at 73.8% (385 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-08-26 08:26:01 +02:00
Anonymous
4a11c34db6 Translated using Weblate (Ukrainian)
Currently translated at 97.1% (506 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-08-26 08:26:01 +02:00
Anonymous
de3ff0b3ba Translated using Weblate (Esperanto)
Currently translated at 27.8% (145 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-08-26 08:26:01 +02:00
Anonymous
338715fe58 Translated using Weblate (Hindi)
Currently translated at 1.9% (10 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-08-26 08:26:00 +02:00
Anonymous
8dbe0d7fe1 Translated using Weblate (Malay)
Currently translated at 48.3% (252 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-08-26 08:26:00 +02:00
Anonymous
f63d9ea7c1 Translated using Weblate (Danish)
Currently translated at 38.0% (198 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-08-26 08:26:00 +02:00
Anonymous
00b590ed2a Translated using Weblate (Czech)
Currently translated at 85.2% (444 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-08-26 08:25:59 +02:00
Anonymous
e72d58a382 Translated using Weblate (Arabic)
Currently translated at 50.2% (262 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-08-26 08:25:59 +02:00
Anonymous
ad87faa7ed Translated using Weblate (Serbian)
Currently translated at 1.9% (10 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-08-26 08:25:59 +02:00
Anonymous
fc41d144f6 Translated using Weblate (Turkish)
Currently translated at 75.4% (393 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-08-26 08:25:58 +02:00
Anonymous
6c64295505 Translated using Weblate (Bulgarian)
Currently translated at 9.0% (47 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-08-26 08:25:58 +02:00
Anonymous
ebd48e4081 Translated using Weblate (Telugu)
Currently translated at 41.4% (216 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-08-26 08:25:58 +02:00
Anonymous
71439eb689 Translated using Weblate (Finnish)
Currently translated at 33.9% (177 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-08-26 08:25:57 +02:00
Anonymous
9c33a30fb1 Translated using Weblate (Yue (Traditional))
Currently translated at 22.6% (118 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue_Hant/
2023-08-26 08:25:57 +02:00
Anonymous
f8e1207abc Translated using Weblate (Portuguese (Brazil))
Currently translated at 88.4% (461 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-08-26 08:25:57 +02:00
Anonymous
93f2bc7773 Translated using Weblate (Romanian)
Currently translated at 28.9% (151 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-08-26 08:25:56 +02:00
Anonymous
04f947b920 Translated using Weblate (Hebrew)
Currently translated at 19.3% (101 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-08-26 08:25:56 +02:00
Anonymous
d1ebfde45c Translated using Weblate (Hungarian)
Currently translated at 90.4% (471 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-08-26 08:25:56 +02:00
Anonymous
b22fdb42f4 Translated using Weblate (Croatian)
Currently translated at 90.2% (470 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-08-26 08:25:56 +02:00
Anonymous
c79d57775f Translated using Weblate (Swedish)
Currently translated at 25.3% (132 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-08-26 08:25:55 +02:00
Anonymous
caaf6c86ba Translated using Weblate (Polish)
Currently translated at 71.7% (374 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-08-26 08:25:55 +02:00
Anonymous
9484e9f963 Translated using Weblate (Catalan)
Currently translated at 50.0% (261 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-08-26 08:25:55 +02:00
Anonymous
2d13648e01 Translated using Weblate (Chinese (Traditional))
Currently translated at 95.7% (499 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-08-26 08:25:54 +02:00
Anonymous
2ddddf5cfe Translated using Weblate (Dutch)
Currently translated at 46.6% (243 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-08-26 08:25:54 +02:00
Anonymous
9086fcadc9 Translated using Weblate (Vietnamese)
Currently translated at 8.6% (45 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-08-26 08:25:54 +02:00
Anonymous
4502dba6ca Translated using Weblate (Norwegian Bokmål)
Currently translated at 15.5% (81 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-08-26 08:25:53 +02:00
Anonymous
92d1ad2d9d Translated using Weblate (Italian)
Currently translated at 90.2% (470 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-08-26 08:25:53 +02:00
Anonymous
eb15ab054f Translated using Weblate (Chinese (Simplified))
Currently translated at 85.2% (444 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-08-26 08:25:53 +02:00
Anonymous
1047da8e23 Translated using Weblate (Russian)
Currently translated at 81.9% (427 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-08-26 08:25:52 +02:00
Anonymous
69ded4bd2f Translated using Weblate (Portuguese)
Currently translated at 79.6% (415 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-08-26 08:25:52 +02:00
Anonymous
6898ed3676 Translated using Weblate (French)
Currently translated at 99.2% (517 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-08-26 08:25:52 +02:00
Anonymous
e12184863a Translated using Weblate (Spanish)
Currently translated at 99.2% (517 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-08-26 08:25:51 +02:00
Anonymous
81f2906ae7 Translated using Weblate (German)
Currently translated at 87.7% (457 of 521 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-08-26 08:25:51 +02:00
Sander Hoeve
84296e573f Translated using Weblate (Dutch)
Currently translated at 47.0% (243 of 517 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-08-26 08:24:34 +02:00
Georges-Antoine Assi
4b4c63d562 Calibre web widget (#1855)
* Add widget for calibre-web with reverse-proxy auth

* Add custom proxy

* Get it working

* Fix lint issues

* Calibreweb widget: Handle empty series / authors / books

* Switch to new opds stats endpoint

* Remove calibre-web custom proxy handler

---------

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2023-08-25 23:24:25 -07:00
Stathis Kefalas
1faaa1466a Translated using Weblate (Greek)
Currently translated at 34.8% (180 of 517 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-08-25 10:00:43 +02:00
gallegonovato
3a75fbb77d Translated using Weblate (Spanish)
Currently translated at 100.0% (517 of 517 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-08-25 10:00:43 +02:00
Atsumeru Developer
ad586f3853 Translated using Weblate (Ukrainian)
Currently translated at 97.8% (506 of 517 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-08-23 13:56:10 +02:00
Atsumeru Developer
5800957ec1 Translated using Weblate (Russian)
Currently translated at 82.5% (427 of 517 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-08-23 13:56:09 +02:00
shamoon
a58eabdb9b Merge pull request #1852 from benphelps:enhancement/extra-headers
Enhancement: support extra headers in widgets
2023-08-22 21:44:28 -07:00
shamoon
7cede1318e Support extra headers in widgets 2023-08-22 21:42:53 -07:00
João Paulo dos Santos Portela
a234eeffb1 Add user and restart options to docker-compose (#1844)
* Add user and restart options to docker-compose

Add user:group 1000:1000 to the docker compose, to match host user.
Restart container unless stopped.

* Update README.md

---------

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2023-08-21 19:50:09 -07:00
Hosted Weblate
38bb974c64 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/
2023-08-22 04:32:16 +02:00
Nonoss117
0976c21fa4 Translated using Weblate (French)
Currently translated at 100.0% (520 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-08-22 04:32:12 +02:00
shamoon
a4c046c3e1 Merge pull request #1848 from benphelps/revert-1829-calibre-web-widget
Revert "Calibre web widget"
2023-08-21 19:32:06 -07:00
shamoon
eb67cf1d6f Revert "Calibre web widget (#1829)"
This reverts commit 4c49767a0f.
2023-08-21 19:31:48 -07:00
Anonymous
fb04972701 Translated using Weblate (Basque)
Currently translated at 6.3% (33 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eu/
2023-08-21 18:31:44 +02:00
Anonymous
4a80b32bb6 Translated using Weblate (Indonesian)
Currently translated at 4.6% (24 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/id/
2023-08-21 18:31:44 +02:00
Anonymous
d00d9ffee3 Translated using Weblate (Slovenian)
Currently translated at 90.5% (471 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/
2023-08-21 18:31:43 +02:00
Anonymous
c0af877e91 Translated using Weblate (Greek)
Currently translated at 34.6% (180 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-08-21 18:31:43 +02:00
Anonymous
f8586a9df6 Translated using Weblate (Korean)
Currently translated at 33.2% (173 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ko/
2023-08-21 18:31:43 +02:00
Anonymous
8cc19daf24 Translated using Weblate (Slovak)
Currently translated at 1.9% (10 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sk/
2023-08-21 18:31:43 +02:00
Anonymous
9f57f45816 Translated using Weblate (Thai)
Currently translated at 9.0% (47 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/th/
2023-08-21 18:31:42 +02:00
Anonymous
a11df88d8a Translated using Weblate (Latvian)
Currently translated at 22.6% (118 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-08-21 18:31:42 +02:00
Anonymous
ff81233772 Translated using Weblate (Japanese)
Currently translated at 74.0% (385 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-08-21 18:31:42 +02:00
Anonymous
7cec116b11 Translated using Weblate (Ukrainian)
Currently translated at 96.5% (502 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-08-21 18:31:41 +02:00
Anonymous
4dc84201a0 Translated using Weblate (Esperanto)
Currently translated at 27.8% (145 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-08-21 18:31:41 +02:00
Anonymous
9abdcc56a0 Translated using Weblate (Hindi)
Currently translated at 1.7% (9 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-08-21 18:31:41 +02:00
Anonymous
5b5fc60a0c Translated using Weblate (Malay)
Currently translated at 48.2% (251 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-08-21 18:31:40 +02:00
Anonymous
63b59c3964 Translated using Weblate (Danish)
Currently translated at 37.8% (197 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-08-21 18:31:40 +02:00
Anonymous
15d30abc93 Translated using Weblate (Czech)
Currently translated at 85.3% (444 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-08-21 18:31:40 +02:00
Anonymous
a7d73828e6 Translated using Weblate (Arabic)
Currently translated at 50.3% (262 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-08-21 18:31:39 +02:00
Anonymous
749d039896 Translated using Weblate (Serbian)
Currently translated at 1.7% (9 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-08-21 18:31:39 +02:00
Anonymous
651243cd9f Translated using Weblate (Turkish)
Currently translated at 75.5% (393 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-08-21 18:31:39 +02:00
Anonymous
b5ae79e1d3 Translated using Weblate (Bulgarian)
Currently translated at 8.8% (46 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-08-21 18:31:38 +02:00
Anonymous
5d81b56189 Translated using Weblate (Telugu)
Currently translated at 41.3% (215 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-08-21 18:31:38 +02:00
Anonymous
c7c600b47d Translated using Weblate (Finnish)
Currently translated at 34.0% (177 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-08-21 18:31:38 +02:00
Anonymous
8907a9cecf Translated using Weblate (Yue (Traditional))
Currently translated at 22.5% (117 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue_Hant/
2023-08-21 18:31:37 +02:00
Anonymous
529927bc8b Translated using Weblate (Portuguese (Brazil))
Currently translated at 88.6% (461 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-08-21 18:31:37 +02:00
Anonymous
f27f7b3fa6 Translated using Weblate (Romanian)
Currently translated at 28.8% (150 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-08-21 18:31:37 +02:00
Anonymous
a755a0ae83 Translated using Weblate (Hebrew)
Currently translated at 19.2% (100 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-08-21 18:31:36 +02:00
Anonymous
0d1a7f1717 Translated using Weblate (Hungarian)
Currently translated at 90.5% (471 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-08-21 18:31:36 +02:00
Anonymous
ebf036c241 Translated using Weblate (Croatian)
Currently translated at 90.3% (470 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-08-21 18:31:36 +02:00
Anonymous
3fd83f9f2d Translated using Weblate (Swedish)
Currently translated at 25.3% (132 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-08-21 18:31:36 +02:00
Anonymous
67d64264bc Translated using Weblate (Polish)
Currently translated at 71.9% (374 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-08-21 18:31:35 +02:00
Anonymous
69e187f574 Translated using Weblate (Catalan)
Currently translated at 50.0% (260 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-08-21 18:31:35 +02:00
Anonymous
83e27aa41a Translated using Weblate (Chinese (Traditional))
Currently translated at 95.9% (499 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-08-21 18:31:35 +02:00
Anonymous
37b6aba1d4 Translated using Weblate (Dutch)
Currently translated at 46.3% (241 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-08-21 18:31:34 +02:00
Anonymous
33d4b4d43d Translated using Weblate (Vietnamese)
Currently translated at 8.4% (44 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-08-21 18:31:34 +02:00
Anonymous
4e230fb76a Translated using Weblate (Norwegian Bokmål)
Currently translated at 15.3% (80 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-08-21 18:31:34 +02:00
Anonymous
04ac922cfe Translated using Weblate (Italian)
Currently translated at 90.3% (470 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-08-21 18:31:33 +02:00
Anonymous
59c22820c0 Translated using Weblate (Chinese (Simplified))
Currently translated at 85.3% (444 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-08-21 18:31:33 +02:00
Anonymous
f463f99cbe Translated using Weblate (Russian)
Currently translated at 81.3% (423 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-08-21 18:31:33 +02:00
Anonymous
1e27da0024 Translated using Weblate (Portuguese)
Currently translated at 79.8% (415 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-08-21 18:31:33 +02:00
Anonymous
bc9e331ac5 Translated using Weblate (French)
Currently translated at 98.6% (513 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-08-21 18:31:32 +02:00
Anonymous
f7f1aa88b1 Translated using Weblate (Spanish)
Currently translated at 98.6% (513 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-08-21 18:31:32 +02:00
Anonymous
da3541cafe Translated using Weblate (German)
Currently translated at 87.8% (457 of 520 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-08-21 18:31:31 +02:00
AtsumeruDev
a6dac34b24 Add widget for Atsumeru self-hosted media server (#1839)
* Add widget for Atsumeru self-hosted media server

* Revert localization

* Update widget.js

---------

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2023-08-21 09:30:22 -07:00
Anonymous
7bd433922f Translated using Weblate (Basque)
Currently translated at 6.3% (33 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eu/
2023-08-21 18:24:22 +02:00
Anonymous
deaacc3b05 Translated using Weblate (Indonesian)
Currently translated at 4.6% (24 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/id/
2023-08-21 18:24:22 +02:00
Anonymous
2e4808db63 Translated using Weblate (Slovenian)
Currently translated at 91.2% (471 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/
2023-08-21 18:24:22 +02:00
Anonymous
b033869345 Translated using Weblate (Greek)
Currently translated at 34.8% (180 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-08-21 18:24:22 +02:00
Anonymous
b56de26a2f Translated using Weblate (Korean)
Currently translated at 33.5% (173 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ko/
2023-08-21 18:24:21 +02:00
Anonymous
6bc9c4d861 Translated using Weblate (Slovak)
Currently translated at 1.9% (10 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sk/
2023-08-21 18:24:21 +02:00
Anonymous
78622d368e Translated using Weblate (Thai)
Currently translated at 9.1% (47 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/th/
2023-08-21 18:24:20 +02:00
Anonymous
491bf0f3a9 Translated using Weblate (Latvian)
Currently translated at 22.8% (118 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-08-21 18:24:20 +02:00
Anonymous
ea1435cd87 Translated using Weblate (Japanese)
Currently translated at 74.6% (385 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-08-21 18:24:20 +02:00
Anonymous
f25f834809 Translated using Weblate (Ukrainian)
Currently translated at 97.2% (502 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-08-21 18:24:20 +02:00
Anonymous
7d66b5c895 Translated using Weblate (Esperanto)
Currently translated at 28.1% (145 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-08-21 18:24:19 +02:00
Anonymous
0dc473909e Translated using Weblate (Hindi)
Currently translated at 1.7% (9 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-08-21 18:24:19 +02:00
Anonymous
d54230745b Translated using Weblate (Malay)
Currently translated at 48.6% (251 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-08-21 18:24:19 +02:00
Anonymous
c4cbd870d1 Translated using Weblate (Danish)
Currently translated at 38.1% (197 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-08-21 18:24:18 +02:00
Anonymous
8229d28c41 Translated using Weblate (Czech)
Currently translated at 86.0% (444 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-08-21 18:24:18 +02:00
Anonymous
861f726079 Translated using Weblate (Arabic)
Currently translated at 50.7% (262 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-08-21 18:24:18 +02:00
Anonymous
0065311f33 Translated using Weblate (Serbian)
Currently translated at 1.7% (9 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-08-21 18:24:17 +02:00
Anonymous
de064fd883 Translated using Weblate (Turkish)
Currently translated at 76.1% (393 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-08-21 18:24:17 +02:00
Anonymous
f93d66dc44 Translated using Weblate (Bulgarian)
Currently translated at 8.9% (46 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-08-21 18:24:17 +02:00
Anonymous
24ed90f3a6 Translated using Weblate (Telugu)
Currently translated at 41.6% (215 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-08-21 18:24:16 +02:00
Anonymous
727a4f41f1 Translated using Weblate (Finnish)
Currently translated at 34.3% (177 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-08-21 18:24:16 +02:00
Anonymous
b1e8bbfb56 Translated using Weblate (Yue (Traditional))
Currently translated at 22.6% (117 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue_Hant/
2023-08-21 18:24:15 +02:00
Anonymous
702b8683c0 Translated using Weblate (Portuguese (Brazil))
Currently translated at 89.3% (461 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-08-21 18:24:15 +02:00
Anonymous
3ee96372fd Translated using Weblate (Romanian)
Currently translated at 29.0% (150 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-08-21 18:24:14 +02:00
Anonymous
c405cfe574 Translated using Weblate (Hebrew)
Currently translated at 19.3% (100 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-08-21 18:24:14 +02:00
Anonymous
4906d21c84 Translated using Weblate (Hungarian)
Currently translated at 91.2% (471 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-08-21 18:24:14 +02:00
Anonymous
a650f7689d Translated using Weblate (Croatian)
Currently translated at 91.0% (470 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-08-21 18:24:13 +02:00
Anonymous
6410fcbaa2 Translated using Weblate (Swedish)
Currently translated at 25.5% (132 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-08-21 18:24:13 +02:00
Anonymous
aa31922681 Translated using Weblate (Polish)
Currently translated at 72.4% (374 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-08-21 18:24:12 +02:00
Anonymous
1cb0012a5a Translated using Weblate (Catalan)
Currently translated at 50.3% (260 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-08-21 18:24:12 +02:00
Anonymous
9a7a2f25f2 Translated using Weblate (Chinese (Traditional))
Currently translated at 96.7% (499 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-08-21 18:24:12 +02:00
Anonymous
a201e0fb7f Translated using Weblate (Dutch)
Currently translated at 46.7% (241 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-08-21 18:24:11 +02:00
Anonymous
0913ef74c2 Translated using Weblate (Vietnamese)
Currently translated at 8.5% (44 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-08-21 18:24:11 +02:00
Anonymous
96e887fa25 Translated using Weblate (Norwegian Bokmål)
Currently translated at 15.5% (80 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-08-21 18:24:11 +02:00
Anonymous
36b95e68ce Translated using Weblate (Italian)
Currently translated at 91.0% (470 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-08-21 18:24:10 +02:00
Anonymous
3d2905b63c Translated using Weblate (Chinese (Simplified))
Currently translated at 86.0% (444 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-08-21 18:24:10 +02:00
Anonymous
375011bbea Translated using Weblate (Russian)
Currently translated at 81.9% (423 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-08-21 18:24:10 +02:00
Anonymous
56bd321f03 Translated using Weblate (Portuguese)
Currently translated at 80.4% (415 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-08-21 18:24:10 +02:00
Anonymous
b07fd98fc6 Translated using Weblate (French)
Currently translated at 99.4% (513 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-08-21 18:24:09 +02:00
Anonymous
6744ef49c9 Translated using Weblate (Spanish)
Currently translated at 99.4% (513 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-08-21 18:24:09 +02:00
Anonymous
25672a0147 Translated using Weblate (German)
Currently translated at 88.5% (457 of 516 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-08-21 18:24:08 +02:00
Georges-Antoine Assi
4c49767a0f Calibre web widget (#1829)
* Add widget for calibre-web with reverse-proxy auth

---------

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2023-08-21 09:22:15 -07:00
shamoon
bb8ad4747c Update container.jsx 2023-08-21 09:14:05 -07:00
shamoon
80f26676d7 Merge pull request #1843 from benphelps/fix/issue-1828
Fix: apply cardBlur to header boxed / boxedWidgets
2023-08-21 08:54:00 -07:00
shamoon
70b4f4e1e6 Apply cardBlur to header boxed / boxedWidgets 2023-08-21 08:51:35 -07:00
Nonoss117
dce89f0c01 Translated using Weblate (French)
Currently translated at 100.0% (513 of 513 strings)

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

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-08-19 22:51:24 +02:00
Anonymous
31aff205e0 Translated using Weblate (Basque)
Currently translated at 6.4% (33 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eu/
2023-08-18 04:54:42 +02:00
Anonymous
1136d7d2cb Translated using Weblate (Indonesian)
Currently translated at 4.6% (24 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/id/
2023-08-18 04:54:41 +02:00
Anonymous
74a2245c29 Translated using Weblate (Slovenian)
Currently translated at 91.8% (471 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/
2023-08-18 04:54:41 +02:00
Anonymous
0e1a41fdd1 Translated using Weblate (Greek)
Currently translated at 35.0% (180 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-08-18 04:54:41 +02:00
Anonymous
7a51b62e43 Translated using Weblate (Korean)
Currently translated at 33.7% (173 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ko/
2023-08-18 04:54:40 +02:00
Anonymous
75ecf3eba5 Translated using Weblate (Slovak)
Currently translated at 1.9% (10 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sk/
2023-08-18 04:54:40 +02:00
Anonymous
f18146063f Translated using Weblate (Thai)
Currently translated at 9.1% (47 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/th/
2023-08-18 04:54:40 +02:00
Anonymous
0af60d06c2 Translated using Weblate (Latvian)
Currently translated at 23.0% (118 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-08-18 04:54:39 +02:00
Anonymous
1f00b3828b Translated using Weblate (Japanese)
Currently translated at 75.0% (385 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-08-18 04:54:39 +02:00
Anonymous
9e96738487 Translated using Weblate (Ukrainian)
Currently translated at 97.8% (502 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-08-18 04:54:39 +02:00
Anonymous
d2fb93f7e9 Translated using Weblate (Esperanto)
Currently translated at 28.2% (145 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-08-18 04:54:38 +02:00
Anonymous
7834f2fecb Translated using Weblate (Hindi)
Currently translated at 1.7% (9 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-08-18 04:54:38 +02:00
Anonymous
9cd25d541f Translated using Weblate (Malay)
Currently translated at 48.9% (251 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-08-18 04:54:38 +02:00
Anonymous
95707d527f Translated using Weblate (Danish)
Currently translated at 38.4% (197 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-08-18 04:54:38 +02:00
Anonymous
b64bcdb817 Translated using Weblate (Czech)
Currently translated at 86.5% (444 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-08-18 04:54:37 +02:00
Anonymous
4cc113697c Translated using Weblate (Arabic)
Currently translated at 51.0% (262 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-08-18 04:54:37 +02:00
Anonymous
65115cf6dc Translated using Weblate (Serbian)
Currently translated at 1.7% (9 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-08-18 04:54:37 +02:00
Anonymous
1af888934e Translated using Weblate (Turkish)
Currently translated at 76.6% (393 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-08-18 04:54:36 +02:00
Anonymous
7281f6d3a1 Translated using Weblate (Bulgarian)
Currently translated at 8.9% (46 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-08-18 04:54:36 +02:00
Anonymous
804b69d5a6 Translated using Weblate (Telugu)
Currently translated at 41.9% (215 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-08-18 04:54:36 +02:00
Anonymous
4cb18f7129 Translated using Weblate (Finnish)
Currently translated at 34.5% (177 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-08-18 04:54:35 +02:00
Anonymous
7558a24242 Translated using Weblate (Yue (Traditional))
Currently translated at 22.8% (117 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue_Hant/
2023-08-18 04:54:35 +02:00
Anonymous
e17f594101 Translated using Weblate (Portuguese (Brazil))
Currently translated at 89.8% (461 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-08-18 04:54:34 +02:00
Anonymous
ed6000262d Translated using Weblate (Romanian)
Currently translated at 29.2% (150 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-08-18 04:54:34 +02:00
Anonymous
f2900ac859 Translated using Weblate (Hebrew)
Currently translated at 19.4% (100 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-08-18 04:54:34 +02:00
Anonymous
e9c5aa13de Translated using Weblate (Hungarian)
Currently translated at 91.8% (471 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-08-18 04:54:33 +02:00
Anonymous
ede5a53b7f Translated using Weblate (Croatian)
Currently translated at 91.6% (470 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-08-18 04:54:33 +02:00
Anonymous
11fa395b76 Translated using Weblate (Swedish)
Currently translated at 25.7% (132 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-08-18 04:54:32 +02:00
Anonymous
63bc0c971e Translated using Weblate (Polish)
Currently translated at 72.9% (374 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-08-18 04:54:32 +02:00
Anonymous
6712219d59 Translated using Weblate (Catalan)
Currently translated at 50.6% (260 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-08-18 04:54:32 +02:00
Anonymous
dbfd92b643 Translated using Weblate (Chinese (Traditional))
Currently translated at 97.2% (499 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-08-18 04:54:31 +02:00
Anonymous
c30f2ec4ca Translated using Weblate (Dutch)
Currently translated at 46.9% (241 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-08-18 04:54:31 +02:00
Anonymous
ff620cebf1 Translated using Weblate (Vietnamese)
Currently translated at 8.5% (44 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-08-18 04:54:30 +02:00
Anonymous
73c30cc3b5 Translated using Weblate (Norwegian Bokmål)
Currently translated at 15.5% (80 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-08-18 04:54:30 +02:00
Anonymous
6eb8d6a93d Translated using Weblate (Italian)
Currently translated at 91.6% (470 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-08-18 04:54:29 +02:00
Anonymous
5786b8b895 Translated using Weblate (Chinese (Simplified))
Currently translated at 86.5% (444 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-08-18 04:54:29 +02:00
Anonymous
1015005086 Translated using Weblate (Russian)
Currently translated at 82.4% (423 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-08-18 04:54:29 +02:00
Anonymous
51db779007 Translated using Weblate (Portuguese)
Currently translated at 80.8% (415 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-08-18 04:54:28 +02:00
Anonymous
eb06eaf292 Translated using Weblate (French)
Currently translated at 99.2% (509 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-08-18 04:54:28 +02:00
Anonymous
46d34040af Translated using Weblate (Spanish)
Currently translated at 99.2% (509 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-08-18 04:54:28 +02:00
Anonymous
e567d6b6b6 Translated using Weblate (German)
Currently translated at 89.0% (457 of 513 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-08-18 04:54:27 +02:00
shamoon
70ffe63e59 Merge pull request #1820 from joncrangle/feature/mealie-widget
Feature: mealie widget
2023-08-17 19:53:31 -07:00
joncrangle
39a94190cf Merge branch 'main' into feature/mealie-widget 2023-08-16 23:43:20 -04:00
Nonoss117
a8dfdcdac0 Translated using Weblate (French)
Currently translated at 100.0% (509 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-08-15 13:57:37 +02:00
gallegonovato
5dcfd555cb Translated using Weblate (Spanish)
Currently translated at 100.0% (509 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-08-15 13:57:37 +02:00
fredodiable
583494f27a Fix: GameDig widget missing lib (#1811) 2023-08-14 20:00:23 -07:00
Anonymous
af43b62e2f Translated using Weblate (Basque)
Currently translated at 6.4% (33 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eu/
2023-08-14 02:34:59 +02:00
Anonymous
dfb1e25877 Translated using Weblate (Indonesian)
Currently translated at 4.7% (24 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/id/
2023-08-14 02:34:59 +02:00
Anonymous
5765d48bba Translated using Weblate (Slovenian)
Currently translated at 92.5% (471 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/
2023-08-14 02:34:58 +02:00
Anonymous
15f1d0ecd2 Translated using Weblate (Greek)
Currently translated at 35.3% (180 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-08-14 02:34:58 +02:00
Anonymous
2da13e3cd4 Translated using Weblate (Korean)
Currently translated at 33.9% (173 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ko/
2023-08-14 02:34:58 +02:00
Anonymous
32b139a436 Translated using Weblate (Slovak)
Currently translated at 1.9% (10 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sk/
2023-08-14 02:34:57 +02:00
Anonymous
8b6f174c51 Translated using Weblate (Thai)
Currently translated at 9.2% (47 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/th/
2023-08-14 02:34:57 +02:00
Anonymous
33b0aefd8a Translated using Weblate (Latvian)
Currently translated at 23.1% (118 of 509 strings)

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

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-08-14 02:34:56 +02:00
Anonymous
6cfd08bb85 Translated using Weblate (Ukrainian)
Currently translated at 98.6% (502 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-08-14 02:34:56 +02:00
Anonymous
deaf49ce8b Translated using Weblate (Esperanto)
Currently translated at 28.4% (145 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-08-14 02:34:56 +02:00
Anonymous
4cafb8decd Translated using Weblate (Hindi)
Currently translated at 1.7% (9 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-08-14 02:34:55 +02:00
Anonymous
a4cc538388 Translated using Weblate (Malay)
Currently translated at 49.3% (251 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-08-14 02:34:55 +02:00
Anonymous
828c52d90a Translated using Weblate (Danish)
Currently translated at 38.7% (197 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-08-14 02:34:55 +02:00
Anonymous
52bf9718ca Translated using Weblate (Czech)
Currently translated at 87.2% (444 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-08-14 02:34:54 +02:00
Anonymous
48bd6e8436 Translated using Weblate (Arabic)
Currently translated at 51.4% (262 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-08-14 02:34:54 +02:00
Anonymous
5e9d2d8439 Translated using Weblate (Serbian)
Currently translated at 1.7% (9 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-08-14 02:34:53 +02:00
Anonymous
08dbd59f1b Translated using Weblate (Turkish)
Currently translated at 77.2% (393 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-08-14 02:34:53 +02:00
Anonymous
b1706e79be Translated using Weblate (Bulgarian)
Currently translated at 9.0% (46 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-08-14 02:34:53 +02:00
Anonymous
62c914c57e Translated using Weblate (Telugu)
Currently translated at 42.2% (215 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-08-14 02:34:52 +02:00
Anonymous
d55e328c90 Translated using Weblate (Finnish)
Currently translated at 34.7% (177 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-08-14 02:34:52 +02:00
Anonymous
f80e7c4f25 Translated using Weblate (Yue (Traditional))
Currently translated at 22.9% (117 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue_Hant/
2023-08-14 02:34:51 +02:00
Anonymous
0d38cbae8e Translated using Weblate (Portuguese (Brazil))
Currently translated at 90.5% (461 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-08-14 02:34:51 +02:00
Anonymous
6e5f15b6ec Translated using Weblate (Romanian)
Currently translated at 29.4% (150 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-08-14 02:34:51 +02:00
Anonymous
6f6f06ed38 Translated using Weblate (Hebrew)
Currently translated at 19.6% (100 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-08-14 02:34:50 +02:00
Anonymous
7a930d2173 Translated using Weblate (Hungarian)
Currently translated at 92.5% (471 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-08-14 02:34:50 +02:00
Anonymous
d71e316b5d Translated using Weblate (Croatian)
Currently translated at 92.3% (470 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-08-14 02:34:50 +02:00
Anonymous
63f8e1e5b1 Translated using Weblate (Swedish)
Currently translated at 25.9% (132 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-08-14 02:34:49 +02:00
Anonymous
c542ca1d0c Translated using Weblate (Polish)
Currently translated at 73.4% (374 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-08-14 02:34:48 +02:00
Anonymous
3f3f315e19 Translated using Weblate (Catalan)
Currently translated at 51.0% (260 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-08-14 02:34:48 +02:00
Anonymous
9f632c58fc Translated using Weblate (Chinese (Traditional))
Currently translated at 98.0% (499 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-08-14 02:34:48 +02:00
Anonymous
7e0ed2b8a7 Translated using Weblate (Dutch)
Currently translated at 47.3% (241 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-08-14 02:34:47 +02:00
Anonymous
22a2649b6e Translated using Weblate (Vietnamese)
Currently translated at 8.6% (44 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-08-14 02:34:47 +02:00
Anonymous
2ea780435a Translated using Weblate (Norwegian Bokmål)
Currently translated at 15.7% (80 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-08-14 02:34:46 +02:00
Anonymous
7174b0ab24 Translated using Weblate (Italian)
Currently translated at 92.3% (470 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-08-14 02:34:46 +02:00
Anonymous
112d1e77b9 Translated using Weblate (Chinese (Simplified))
Currently translated at 87.2% (444 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-08-14 02:34:45 +02:00
Anonymous
f89cccf209 Translated using Weblate (Russian)
Currently translated at 83.1% (423 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-08-14 02:34:45 +02:00
Anonymous
41b1589347 Translated using Weblate (Portuguese)
Currently translated at 81.5% (415 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-08-14 02:34:45 +02:00
Anonymous
4896cc9457 Translated using Weblate (French)
Currently translated at 98.8% (503 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-08-14 02:34:44 +02:00
Anonymous
b9d523f0c4 Translated using Weblate (Spanish)
Currently translated at 98.8% (503 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-08-14 02:34:44 +02:00
Anonymous
d1a8523630 Translated using Weblate (German)
Currently translated at 89.7% (457 of 509 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-08-14 02:34:44 +02:00
George Stefanakis
46b2fc029d Translated using Weblate (Greek)
Currently translated at 35.7% (180 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-08-14 02:33:37 +02:00
Dan
f2f199124f Translated using Weblate (Ukrainian)
Currently translated at 99.8% (502 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-08-14 02:33:37 +02:00
Xinos
8d6f3b82f3 Translated using Weblate (Russian)
Currently translated at 84.0% (423 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-08-14 02:33:37 +02:00
shamoon
b0f29709c2 Merge pull request #1807 from userXinos/omv-widget
OpenMediaVault widget
2023-08-13 17:33:30 -07:00
Xinos
bf8c10bb61 OMV widget implementation 2023-08-13 09:24:03 -07:00
joncrangle
dc19ce4d38 Merge branch 'benphelps:main' into feature/mealie-widget 2023-08-11 15:10:16 -04:00
shamoon
3b1c9a69a4 Merge pull request #1802 from benphelps/fix/issue-1747
Fix jobStats potentially accessed before instantiated
2023-08-11 08:00:22 -07:00
shamoon
5c25279439 Fix jobStats potentially accessed before instantiated 2023-08-11 07:59:47 -07:00
Nonoss117
19bf7a0e5a Translated using Weblate (French)
Currently translated at 100.0% (503 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-08-10 21:49:41 +02:00
gallegonovato
9a3eb5a2b3 Translated using Weblate (Spanish)
Currently translated at 100.0% (503 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-08-10 21:49:41 +02:00
Jonathan Crangle
58f4cf6edd Add mealie widget 2023-08-09 15:13:17 -04:00
shamoon
63d4c6bdf8 Merge pull request #1784 from benphelps/mjpeg
Feature: mjpeg stream widget
2023-08-09 00:14:49 -07:00
Anonymous
369031a5e1 Translated using Weblate (Basque)
Currently translated at 6.5% (33 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eu/
2023-08-09 09:13:08 +02:00
Anonymous
3bf59245a6 Translated using Weblate (Indonesian)
Currently translated at 4.7% (24 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/id/
2023-08-09 09:13:08 +02:00
Anonymous
ef04ae8abe Translated using Weblate (Slovenian)
Currently translated at 93.6% (471 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/
2023-08-09 09:13:07 +02:00
Anonymous
64c0e9909d Translated using Weblate (Greek)
Currently translated at 30.2% (152 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-08-09 09:13:07 +02:00
Anonymous
2e6a146cb6 Translated using Weblate (Korean)
Currently translated at 34.3% (173 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ko/
2023-08-09 09:13:07 +02:00
Anonymous
a605b64d18 Translated using Weblate (Slovak)
Currently translated at 1.7% (9 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sk/
2023-08-09 09:13:06 +02:00
Anonymous
747cc147cb Translated using Weblate (Thai)
Currently translated at 9.3% (47 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/th/
2023-08-09 09:13:06 +02:00
Anonymous
3986634e0d Translated using Weblate (Latvian)
Currently translated at 23.4% (118 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-08-09 09:13:06 +02:00
Anonymous
022dff6b99 Translated using Weblate (Japanese)
Currently translated at 76.5% (385 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-08-09 09:13:06 +02:00
Anonymous
828d1a5a3a Translated using Weblate (Ukrainian)
Currently translated at 99.2% (499 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-08-09 09:13:05 +02:00
Anonymous
1b629aed4f Translated using Weblate (Esperanto)
Currently translated at 28.8% (145 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-08-09 09:13:05 +02:00
Anonymous
77eaf00c06 Translated using Weblate (Hindi)
Currently translated at 1.7% (9 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-08-09 09:13:05 +02:00
Anonymous
247d46bbbc Translated using Weblate (Malay)
Currently translated at 49.9% (251 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-08-09 09:13:04 +02:00
Anonymous
7f8782732d Translated using Weblate (Danish)
Currently translated at 39.1% (197 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-08-09 09:13:04 +02:00
Anonymous
ffae7e1058 Translated using Weblate (Czech)
Currently translated at 88.2% (444 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-08-09 09:13:04 +02:00
Anonymous
6414b7c61d Translated using Weblate (Arabic)
Currently translated at 52.0% (262 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-08-09 09:13:04 +02:00
Anonymous
a0b6a90042 Translated using Weblate (Serbian)
Currently translated at 1.7% (9 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-08-09 09:13:03 +02:00
Anonymous
b6141c7235 Translated using Weblate (Turkish)
Currently translated at 78.1% (393 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-08-09 09:13:03 +02:00
Anonymous
719f6c8a3a Translated using Weblate (Bulgarian)
Currently translated at 9.1% (46 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-08-09 09:13:03 +02:00
Anonymous
6d22e1b283 Translated using Weblate (Telugu)
Currently translated at 42.7% (215 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-08-09 09:13:03 +02:00
Anonymous
64025ddb1b Translated using Weblate (Finnish)
Currently translated at 35.1% (177 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-08-09 09:13:02 +02:00
Anonymous
338a9da697 Translated using Weblate (Yue (Traditional))
Currently translated at 23.2% (117 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue_Hant/
2023-08-09 09:13:02 +02:00
Anonymous
af9dc9311c Translated using Weblate (Portuguese (Brazil))
Currently translated at 91.6% (461 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-08-09 09:13:02 +02:00
Anonymous
b63977a129 Translated using Weblate (Romanian)
Currently translated at 29.8% (150 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-08-09 09:13:01 +02:00
Anonymous
8058736918 Translated using Weblate (Hebrew)
Currently translated at 19.8% (100 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-08-09 09:13:01 +02:00
Anonymous
e805ed2e88 Translated using Weblate (Hungarian)
Currently translated at 93.6% (471 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-08-09 09:13:01 +02:00
Anonymous
3ebc302f02 Translated using Weblate (Croatian)
Currently translated at 93.4% (470 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-08-09 09:13:00 +02:00
Anonymous
61cb50e12a Translated using Weblate (Swedish)
Currently translated at 26.2% (132 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-08-09 09:13:00 +02:00
Anonymous
56c1627c7e Translated using Weblate (Polish)
Currently translated at 74.3% (374 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-08-09 09:13:00 +02:00
Anonymous
d41abd7126 Translated using Weblate (Catalan)
Currently translated at 51.6% (260 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-08-09 09:13:00 +02:00
Anonymous
781dc4b02c Translated using Weblate (Chinese (Traditional))
Currently translated at 99.2% (499 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-08-09 09:12:59 +02:00
Anonymous
fa78735f12 Translated using Weblate (Dutch)
Currently translated at 47.9% (241 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-08-09 09:12:59 +02:00
Anonymous
a6dc7db96e Translated using Weblate (Vietnamese)
Currently translated at 8.7% (44 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-08-09 09:12:59 +02:00
Anonymous
ab8e4e21a1 Translated using Weblate (Norwegian Bokmål)
Currently translated at 15.9% (80 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-08-09 09:12:58 +02:00
Anonymous
ae124e49b3 Translated using Weblate (Italian)
Currently translated at 93.4% (470 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-08-09 09:12:58 +02:00
Anonymous
e4c7a90d14 Translated using Weblate (Chinese (Simplified))
Currently translated at 88.2% (444 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-08-09 09:12:58 +02:00
Anonymous
db6b5bb175 Translated using Weblate (Russian)
Currently translated at 84.6% (426 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-08-09 09:12:58 +02:00
Anonymous
a96e875944 Translated using Weblate (Portuguese)
Currently translated at 82.5% (415 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-08-09 09:12:57 +02:00
Anonymous
b0ae89c4ba Translated using Weblate (French)
Currently translated at 99.4% (500 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-08-09 09:12:57 +02:00
Anonymous
3802b54593 Translated using Weblate (Spanish)
Currently translated at 99.4% (500 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-08-09 09:12:57 +02:00
Anonymous
f2fdd77f96 Translated using Weblate (German)
Currently translated at 90.8% (457 of 503 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-08-09 09:12:56 +02:00
George Stefanakis
75ae5a9cf1 Translated using Weblate (Greek)
Currently translated at 30.4% (152 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-08-09 09:12:13 +02:00
Dan
715ceed97b Translated using Weblate (Ukrainian)
Currently translated at 99.8% (499 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-08-09 09:12:13 +02:00
shamoon
1db38e5ca2 Merge pull request #1789 from fredodiable/main
Added status field for GameDig widget
2023-08-09 00:12:06 -07:00
fredodiable
70ea5ad60d Added status field for GameDig widget 2023-08-09 00:08:11 -07:00
Nitzan Miranda
12736cc003 Fix(AzureDevOps): PR approved count and Pipeline running status (#1788)
* fix pr-votes for approved with suggestions counts

* remove top1 result

top1 result prevent from running pipeline to show in request

* Update src/widgets/azuredevops/component.jsx

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>

---------

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2023-08-09 00:05:34 -07:00
shamoon
5611baa0b8 Merge pull request #1783 from benphelps/hidden-headers
allow hiding section headers
2023-08-06 07:36:05 -07:00
shamoon
f8c382c480 Allow specify object fit for mjpeg widget 2023-08-06 07:33:08 -07:00
Ben Phelps
ba19f77b8f add mjpeg stream widget 2023-08-06 14:21:01 +03:00
Ben Phelps
167ecb42de allow hiding section headers 2023-08-06 04:38:37 +03:00
Chun Chi Hsieh
15bf55952b Translated using Weblate (Chinese (Traditional))
Currently translated at 99.8% (499 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-08-05 06:06:02 +02:00
Nonoss117
0f8f5e15a3 Translated using Weblate (French)
Currently translated at 100.0% (500 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-08-05 06:06:02 +02:00
gallegonovato
33e3603d26 Translated using Weblate (Spanish)
Currently translated at 100.0% (500 of 500 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-08-05 06:06:01 +02:00
74 changed files with 2004 additions and 187 deletions

View File

@@ -16,6 +16,7 @@
**/compose*
**/Dockerfile*
**/node_modules
!**/node_modules/.pnpm/compressjs@*/**
**/npm-debug.log
**/obj
**/secrets.dev.yaml

View File

@@ -52,6 +52,8 @@ COPY --link --chown=1000:1000 /public ./public/
# Copy files from builder
COPY --link --from=builder --chown=1000:1000 /app/.next/standalone ./
COPY --link --from=builder --chown=1000:1000 /app/.next/static/ ./.next/static/
# see https://github.com/benphelps/homepage/issues/1795
COPY --link --from=builder /app/node_modules/.pnpm/compressjs@1.0.3/node_modules/compressjs/lib/ ./node_modules/.pnpm/compressjs@1.0.3/node_modules/compressjs/lib/
COPY --link --chmod=755 docker-entrypoint.sh /usr/local/bin/
RUN apk add --no-cache su-exec

View File

@@ -85,6 +85,8 @@ services:
volumes:
- /path/to/config:/app/config # Make sure your local config directory exists
- /var/run/docker.sock:/var/run/docker.sock:ro # (optional) For docker integrations
# user: 1000:1000 optional, not compatibile with direct socket see https://gethomepage.dev/en/configs/docker/#using-socket-directly
restart: unless-stopped
```
or docker run:

View File

@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"result": "Result",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories",
"series": "Series"
},
"calibreweb": {
"categories": "Categories",
"series": "Series",
"books": "Books",
"authors": "Authors"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"result": "Result",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"result": "Result",
@@ -689,5 +692,31 @@
"errored": "Errors",
"totalUsed": "Used Storage",
"noRecent": "Out of Date"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"result": "Result",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"result": "Result",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Players",
"bots": "Bots",
"ping": "Ping",
"maxPlayers": "Max players"
"maxPlayers": "Max players",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"result": "Result",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -150,9 +150,9 @@
},
"flood": {
"download": "Λήξη",
"upload": "Φόρτωση",
"leech": "Αφαίμαξη",
"seed": "Σπείρε"
"upload": "Μεταφόρτωση",
"leech": "Leech",
"seed": "Seed"
},
"changedetectionio": {
"totalObserved": "Συνολικά παρατηρηθείσα",
@@ -163,7 +163,7 @@
"transcoding": "Μετακωδικοποίηση",
"bitrate": "Ρυθμός bit",
"no_active": "Δεν υπάρχουν ενεργές ροές",
"plex_connection_error": "Check Plex Connection"
"plex_connection_error": "Έλεγχος Σύνδεσης με Plex"
},
"nzbget": {
"rate": "Ρυθμός",
@@ -208,12 +208,12 @@
"series": "Σειρές",
"wanted": "Επιθυμούντε",
"queued": "Σε σειρά",
"queue": "Queue",
"unknown": "Unknown"
"queue": "Ούρα",
"unknown": "Άγνωστο"
},
"downloadstation": {
"download": "Μεταφόρτωση",
"upload": "Φόρτωση",
"download": "Λήψη",
"upload": "Μεταφόρτωση",
"leech": "Leech",
"seed": "Seed"
},
@@ -222,13 +222,13 @@
"missing": "Απουσιάζει",
"queued": "Σε σειρά",
"movies": "Ταινίες",
"queue": "Queue",
"unknown": "Unknown"
"queue": "Ουρά",
"unknown": "Άγνωστο"
},
"lidarr": {
"wanted": "Θέλετε",
"queued": "Στη σειρά",
"artists": "Artists"
"artists": "Καλλιτέχνες"
},
"readarr": {
"wanted": "Θέλετε",
@@ -237,17 +237,17 @@
},
"bazarr": {
"missingEpisodes": "Επεισόδια που λείπουν",
"missingMovies": "Missing Movies"
"missingMovies": "Ταινίες που Λείπουν"
},
"ombi": {
"pending": "Pending",
"approved": "Approved",
"available": "Available"
"pending": "Σε εκκρεμότητα",
"approved": "Εγκρίθηκε",
"available": "Διαθέσιμο"
},
"jellyseerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available"
"pending": "Σε εκκρεμότητα",
"approved": "Εγκρίθηκε",
"available": "Διαθέσιμο"
},
"overseerr": {
"pending": "Pending",
@@ -257,25 +257,25 @@
},
"pihole": {
"queries": "Queries",
"blocked": "Blocked",
"blocked": "Αποκλεισμένο",
"gravity": "Gravity",
"blocked_percent": "Blocked %"
"blocked_percent": "Αποκλεισμένο %"
},
"adguard": {
"queries": "Queries",
"blocked": "Blocked",
"filtered": "Filtered",
"latency": "Latency"
"queries": "Αναζητήσεις",
"blocked": "Αποκλεισμένο",
"filtered": "Φιλτραρισμένα",
"latency": "Καθυστέρηση"
},
"speedtest": {
"upload": "Upload",
"download": "Download",
"upload": "Ανέβασμα",
"download": "Λήψη",
"ping": "Ping"
},
"portainer": {
"running": "Running",
"stopped": "Stopped",
"total": "Total"
"stopped": "Σταματημένο",
"total": "Σύνολο"
},
"tdarr": {
"queue": "Queue",
@@ -563,7 +563,7 @@
"records_total": "Queue Length"
},
"pterodactyl": {
"servers": "Servers",
"servers": "Διακομιστές",
"nodes": "Nodes"
},
"prometheus": {
@@ -589,28 +589,28 @@
},
"freshrss": {
"subscriptions": "Συνδρομές",
"unread": "Αδιάβαστο"
"unread": "Μη Διαβασμένο"
},
"channelsdvrserver": {
"shows": "Εκπομπές",
"recordings": "Εγγραφές",
"scheduled": "Προγραμματισμένα",
"passes": "Passes"
"passes": "Περάσματα"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
},
"tailscale": {
"address": "Address",
"never": "Never",
"address": "Διεύθυνση",
"never": "Ποτέ",
"years": "{{number}}y",
"weeks": "{{number}}w",
"days": "{{number}}d",
"hours": "{{number}}h",
"expires": "Expires",
"expires": "Λήγει",
"last_seen": "Last Seen",
"now": "Now",
"now": "Τώρα",
"minutes": "{{number}}m",
"seconds": "{{number}}s",
"ago": "{{value}} Ago"
@@ -621,7 +621,7 @@
"systemTempC": "Θερμοκρασία συστήματος",
"poolUsage": "Χρήση πισίνας",
"volumeUsage": "Volume Usage",
"invalid": "Invalid"
"invalid": "Μη έγκυρο"
},
"pfsense": {
"load": "Load Avg",
@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"myPrs": "My PRs",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -579,6 +579,12 @@
"incident": "Incident",
"m": "m"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"komga": {
"libraries": "Libraries",
"series": "Series",
@@ -661,6 +667,12 @@
"monitoring": "Monitoring",
"updates": "Updates"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
},
"jdownloader": {
"downloadCount": "Queue",
"downloadBytesRemaining": "Remaining",
@@ -685,6 +697,9 @@
"approved": "Approved"
},
"gamedig": {
"status": "Status",
"online": "Online",
"offline": "Offline",
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
@@ -698,5 +713,19 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"result": "Result",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"categories": "Categories",
"authors": "Authors",
"series": "Series"
}
}

View File

@@ -249,7 +249,7 @@
"total": "Total",
"free": "Libre",
"used": "Utilizado",
"crit": "Crit",
"crit": "Crít.",
"read": "Leer",
"write": "Escribir",
"gpu": "GPU",
@@ -669,7 +669,10 @@
"players": "Jugadores",
"maxPlayers": "Jugadores máximos",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Estado",
"online": "En línea",
"offline": "Sin conexión"
},
"azuredevops": {
"result": "Resultado",
@@ -689,5 +692,31 @@
"errored": "Errores",
"noRecent": "Caducado",
"totalUsed": "Almacenamiento usado"
},
"openmediavault": {
"running": "Ejecutando",
"downloading": "Descargando",
"total": "Total",
"stopped": "Detenido",
"passed": "Aprobado",
"failed": "Fallido"
},
"mealie": {
"recipes": "Recetas",
"users": "Usuarios",
"categories": "Categorías",
"tags": "Etiquetas"
},
"atsumeru": {
"series": "Series",
"archives": "Archivos",
"chapters": "Capítulos",
"categories": "Categorías"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"notStarted": "Not Started",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"result": "Result",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories",
"series": "Series"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Joueurs",
"maxPlayers": "Joueurs max",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Statut",
"online": "En ligne",
"offline": "Hors ligne"
},
"azuredevops": {
"result": "Résultat",
@@ -686,8 +689,34 @@
},
"urbackup": {
"ok": "Ok",
"errored": "Erreurs",
"errored": "Erreur",
"noRecent": "Obsolète",
"totalUsed": "Esp. Utilisé"
},
"openmediavault": {
"downloading": "Téléchargement",
"total": "Total",
"running": "Démarré",
"stopped": "Arrêté",
"passed": "Réussi",
"failed": "Échoué"
},
"mealie": {
"recipes": "Recettes",
"users": "Utilisateurs",
"categories": "Catégories",
"tags": "Étiquettes"
},
"atsumeru": {
"series": "Séries",
"archives": "Archives",
"chapters": "Chapitres",
"categories": "Catégories"
},
"calibreweb": {
"series": "Series",
"books": "Books",
"authors": "Authors",
"categories": "Categories"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"result": "Result",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"myPrs": "My PRs",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"chapters": "Chapters",
"categories": "Categories",
"series": "Series",
"archives": "Archives"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"result": "Result",
@@ -689,5 +692,31 @@
"totalUsed": "Used Storage",
"ok": "Ok",
"errored": "Errors"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"categories": "Categories",
"series": "Series",
"authors": "Authors"
}
}

View File

@@ -669,7 +669,10 @@
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots"
"bots": "Bots",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"status": "Status",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"series": "Series",
"categories": "Categories"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"result": "Result",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"result": "Result",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"total": "Total",
"running": "Running",
"downloading": "Downloading",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"result": "Result",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -669,7 +669,10 @@
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots"
"bots": "Bots",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"result": "Result",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"chapters": "Chapters",
"categories": "Categories",
"series": "Series",
"archives": "Archives"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"online": "Online",
"status": "Status",
"offline": "Offline"
},
"azuredevops": {
"result": "Result",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"chapters": "Chapters",
"series": "Series",
"archives": "Archives",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"result": "Result",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"downloading": "Downloading",
"total": "Total",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"result": "Result",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -229,7 +229,7 @@
"devices": "Apparaten",
"lan_devices": "LAN Apparaten",
"wlan_devices": "WLAN Apparaten",
"empty_data": "Subsystem status unknown"
"empty_data": "Subsystem status onbekend"
},
"plex": {
"streams": "Actieve Streams",
@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"online": "Online",
"status": "Status",
"offline": "Offline"
},
"azuredevops": {
"result": "Result",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"status": "Status",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Jogadores",
"maxPlayers": "Jogadores Max",
"bots": "Robos",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"result": "Result",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -678,7 +678,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"result": "Result",
@@ -698,5 +701,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"canceled": "Canceled",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -16,11 +16,11 @@
"free": "Свободно",
"used": "Использовано",
"load": "Загрузка",
"cpu": роцессор",
"mem": "Память",
"temp": "Температура",
"cpu": "ЦП",
"mem": "ОЗУ",
"temp": "Темпер.",
"max": "Макс.",
"uptime": "UP",
"uptime": "Работает",
"months": "мес",
"days": "д",
"hours": "ч",
@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"result": "Result",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"passed": "Passed",
"failed": "Failed",
"running": "Running",
"stopped": "Stopped"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Серии",
"archives": "Архивы",
"chapters": "Главы",
"categories": "Категории"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"succeeded": "Succeeded",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"total": "Total",
"downloading": "Downloading",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"result": "Result",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"result": "Result",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed",
"downloading": "Downloading"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"approved": "Approved",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"result": "Result",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"failed": "Failed",
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"result": "Result",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"result": "Result",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -374,11 +374,11 @@
"free": "Вільний",
"used": "Використовується",
"crit": "Crit",
"read": "Read",
"write": "Write",
"read": "Прочитати",
"write": "Написати",
"gpu": "GPU",
"mem": "Mem",
"swap": "Swap"
"mem": "Пам'ять",
"swap": "Обмін"
},
"quicklaunch": {
"bookmark": "Закладка",
@@ -669,25 +669,54 @@
"players": "Гравці",
"maxPlayers": "Максимум гравців",
"bots": "Ботів",
"ping": "Пінг"
"ping": "Пінг",
"status": "Статус",
"online": "В мережі",
"offline": "Не в мережі"
},
"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"
"result": "Результат",
"status": "Статус",
"buildId": "ID збірки",
"succeeded": "Успішно",
"notStarted": "Не розпочато",
"failed": "Невдача",
"canceled": "Скасовано",
"inProgress": "В процесі",
"totalPrs": "Всього PR",
"myPrs": "Мій PR",
"approved": "Затверджено"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
"ok": "Добре",
"errored": "Помилки",
"noRecent": "Застарілий",
"totalUsed": "Використовувана пам'ять"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Серії",
"archives": "Архіви",
"chapters": "Глави",
"categories": "Категорії"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"result": "Result",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"result": "Result",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -669,7 +669,10 @@
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"azuredevops": {
"canceled": "Canceled",
@@ -689,5 +692,31 @@
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -45,7 +45,7 @@
"transcoding": "轉碼",
"bitrate": "位元率",
"no_active": "無播放活動",
"plex_connection_error": "Check Plex Connection"
"plex_connection_error": "檢查Plex的連接狀態"
},
"jellyseerr": {
"pending": "待下載",
@@ -90,15 +90,15 @@
"wanted": "關注中",
"queued": "已加入佇列",
"missing": "缺少",
"queue": "Queue",
"unknown": "Unknown"
"queue": "佇列",
"unknown": "未知的"
},
"sonarr": {
"wanted": "關注中",
"queued": "已加入佇列",
"series": "影集",
"queue": "Queue",
"unknown": "Unknown"
"queue": "佇列",
"unknown": "未知的"
},
"readarr": {
"wanted": "關注中",
@@ -178,7 +178,7 @@
"lidarr": {
"wanted": "關注中",
"queued": "已加入佇列",
"artists": "Artists"
"artists": "創作者"
},
"adguard": {
"queries": "查詢",
@@ -250,10 +250,10 @@
"warn": "警告",
"total": "總共",
"crit": "Crit",
"read": "Read",
"write": "Write",
"read": "讀取",
"write": "寫入",
"gpu": "GPU",
"mem": "Mem",
"mem": "記憶體",
"swap": "Swap"
},
"changedetectionio": {
@@ -653,41 +653,70 @@
"down_alerts": "離線警告"
},
"jdownloader": {
"downloadCount": "Queue Count",
"downloadSpeed": "Download Speed",
"downloadBytesRemaining": "Remaining",
"downloadTotalBytes": "Size"
"downloadCount": "下載佇列",
"downloadSpeed": "下載速率",
"downloadBytesRemaining": "剩餘",
"downloadTotalBytes": "總下載量"
},
"kavita": {
"seriesCount": "Series",
"totalFiles": "Files"
"seriesCount": "叢刊",
"totalFiles": "檔案"
},
"gamedig": {
"name": "Name",
"map": "Map",
"currentPlayers": "Current players",
"players": "Players",
"maxPlayers": "Max players",
"bots": "Bots",
"ping": "Ping"
"name": "名稱",
"map": "地圖",
"currentPlayers": "當前玩家數",
"players": "玩家",
"maxPlayers": "玩家數上限",
"bots": "機器人",
"ping": "Ping",
"status": "Status",
"online": "Online",
"offline": "Offline"
},
"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"
"result": "結果",
"status": "狀態",
"buildId": "組建編號",
"succeeded": "成功",
"notStarted": "尚未啟用",
"failed": "失敗",
"canceled": "取消",
"inProgress": "執行中",
"totalPrs": "總提取要求",
"myPrs": "我的提取要求",
"approved": "已核准"
},
"urbackup": {
"ok": "Ok",
"errored": "Errors",
"noRecent": "Out of Date",
"totalUsed": "Used Storage"
"errored": "錯誤",
"noRecent": "已過時",
"totalUsed": "已使用空間"
},
"openmediavault": {
"downloading": "Downloading",
"total": "Total",
"running": "Running",
"stopped": "Stopped",
"passed": "Passed",
"failed": "Failed"
},
"mealie": {
"recipes": "Recipes",
"users": "Users",
"categories": "Categories",
"tags": "Tags"
},
"atsumeru": {
"series": "Series",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
},
"calibreweb": {
"books": "Books",
"authors": "Authors",
"categories": "Categories",
"series": "Series"
}
}

View File

@@ -16,45 +16,47 @@ export default function ServicesGroup({ group, services, layout, fiveColumns, di
className={classNames(
layout?.style === "row" ? "basis-full" : "basis-full md:basis-1/2 lg:basis-1/3 xl:basis-1/4",
layout?.style !== "row" && fiveColumns ? "3xl:basis-1/5" : "",
"flex-1 p-1"
layout?.header === false ? "flex-1 px-1 -my-1" : "flex-1 p-1",
)}
>
<Disclosure defaultOpen>
{({ open }) => (
<>
<Disclosure.Button disabled={disableCollapse} className="flex w-full select-none items-center group">
{layout?.icon &&
<div className="flex-shrink-0 mr-2 w-7 h-7">
<ResolvedIcon icon={layout.icon} />
</div>
<Disclosure defaultOpen>
{({ open }) => (
<>
{ layout?.header !== false &&
<Disclosure.Button disabled={disableCollapse} className="flex w-full select-none items-center group">
{layout?.icon &&
<div className="flex-shrink-0 mr-2 w-7 h-7">
<ResolvedIcon icon={layout.icon} />
</div>
}
<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>
}
<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>
<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>
);
}

View File

@@ -7,6 +7,11 @@ import Raw from "./raw";
export function getAllClasses(options, additionalClassNames = '') {
if (options?.style?.header === "boxedWidgets") {
if (options?.style?.cardBlur !== undefined) {
// eslint-disable-next-line no-param-reassign
additionalClassNames = additionalClassNames.concat(additionalClassNames, ` backdrop-blur${options.style.cardBlur.length ? '-' : ""}${options.style.cardBlur}`)
}
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",

View File

@@ -55,6 +55,10 @@ export default async function handler(req, res) {
req.query.endpoint = `${req.query.endpoint}?${query}`;
}
if (mapping?.headers) {
req.extraHeaders = mapping.headers;
}
if (endpointProxy instanceof Function) {
return endpointProxy(req, res, map);
}

View File

@@ -257,8 +257,9 @@ function Home({ initialSettings }) {
<div className="relative container m-auto flex flex-col justify-start z-10 h-full">
<div
className={classNames(
"flex flex-row flex-wrap justify-between",
headerStyles[headerStyle]
"flex flex-row flex-wrap justify-between",
headerStyles[headerStyle],
initialSettings.cardBlur !== undefined && headerStyle === "boxed" && `backdrop-blur${initialSettings.cardBlur.length ? '-' : ""}${initialSettings.cardBlur}`
)}
>
<QuickLaunch
@@ -274,7 +275,7 @@ function Home({ initialSettings }) {
{widgets
.filter((widget) => !rightAlignedWidgets.includes(widget.type))
.map((widget, i) => (
<Widget key={i} widget={widget} style={{ header: headerStyle, isRightAligned: false}} />
<Widget key={i} widget={widget} style={{ header: headerStyle, isRightAligned: false, cardBlur: initialSettings.cardBlur }} />
))}
<div className={classNames(
@@ -284,7 +285,7 @@ function Home({ initialSettings }) {
{widgets
.filter((widget) => rightAlignedWidgets.includes(widget.type))
.map((widget, i) => (
<Widget key={i} widget={widget} style={{ header: headerStyle, isRightAligned: true}} />
<Widget key={i} widget={widget} style={{ header: headerStyle, isRightAligned: true, cardBlur: initialSettings.cardBlur }} />
))}
</div>
</>

View File

@@ -296,6 +296,11 @@ export function cleanServiceGroups(groups) {
userEmail, // azuredevops
repositoryId,
metric, // glances
stream, // mjpeg
fit,
method, // openmediavault widget
mappings, // customapi widget
refreshInterval,
} = cleanedService.widget;
let fieldsList = fields;
@@ -362,6 +367,17 @@ export function cleanServiceGroups(groups) {
if (type === "glances") {
if (metric) cleanedService.widget.metric = metric;
}
if (type === "mjpeg") {
if (stream) cleanedService.widget.stream = stream;
if (fit) cleanedService.widget.fit = fit;
}
if (type === "openmediavault") {
if (method) cleanedService.widget.method = method;
}
if (type === "customapi") {
if (mappings) cleanedService.widget.mappings = mappings;
if (refreshInterval) cleanedService.widget.refreshInterval = refreshInterval;
}
}
return cleanedService;

View File

@@ -32,6 +32,7 @@ export default async function credentialedProxyHandler(req, res, map) {
"authentik",
"cloudflared",
"ghostfolio",
"mealie",
"tailscale",
"truenas",
"pterodactyl",

View File

@@ -20,11 +20,10 @@ export default async function genericProxyHandler(req, res, map) {
if (widget) {
const url = new URL(formatApiCall(widgets[widget.type].api, { endpoint, ...widget }));
let headers;
const headers = req.extraHeaders ?? {};
if (widget.username && widget.password) {
headers = {
Authorization: `Basic ${Buffer.from(`${widget.username}:${widget.password}`).toString("base64")}`,
};
headers.Authorization = `Basic ${Buffer.from(`${widget.username}:${widget.password}`).toString("base64")}`;
}
const params = {

View File

@@ -0,0 +1,36 @@
import { useTranslation } from "next-i18next";
import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
import useWidgetAPI from "utils/proxy/use-widget-api";
export default function Component({ service }) {
const { t } = useTranslation();
const { widget } = service;
const { data: infoData, error: infoError } = useWidgetAPI(widget, "info");
if (infoError) {
return <Container service={service} error={infoError} />;
}
if (!infoData) {
return (
<Container service={service}>
<Block label="atsumeru.series" />
<Block label="atsumeru.archives" />
<Block label="atsumeru.chapters" />
<Block label="atsumeru.categories" />
</Container>
);
}
return (
<Container service={service}>
<Block label="atsumeru.series" value={t("common.number", { value: infoData.stats.total_series })} />
<Block label="atsumeru.archives" value={t("common.number", { value: infoData.stats.total_archives })} />
<Block label="atsumeru.chapters" value={t("common.number", { value: infoData.stats.total_chapters })} />
<Block label="atsumeru.categories" value={t("common.number", { value: infoData.stats.total_categories })} />
</Container>
);
}

View File

@@ -0,0 +1,14 @@
import genericProxyHandler from "utils/proxy/handlers/generic";
const widget = {
api: "{url}/api/server/{endpoint}",
proxyHandler: genericProxyHandler,
mappings: {
info: {
endpoint: "info"
}
},
};
export default widget;

View File

@@ -56,7 +56,7 @@ export default function Component({ service }) {
value={t("common.number", {
value: prData.value
?.filter((item) => item.createdBy.uniqueName.toLowerCase() === userEmail.toLowerCase())
.filter((item) => item.reviewers.some((reviewer) => reviewer.vote === 10)).length,
.filter((item) => item.reviewers.some((reviewer) => [5,10].includes(reviewer.vote))).length
})}
/>}

View File

@@ -10,7 +10,7 @@ const widget = {
},
pipeline: {
endpoint: "build/Builds?branchName={branchName}&definitions={definitionId}&$top=1"
endpoint: "build/Builds?branchName={branchName}&definitions={definitionId}"
},
},
};

View File

@@ -0,0 +1,36 @@
import { useTranslation } from "next-i18next";
import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
import useWidgetAPI from "utils/proxy/use-widget-api";
export default function Component({ service }) {
const { t } = useTranslation();
const { widget } = service;
const { data, error } = useWidgetAPI(widget, "stats");
if (error) {
return <Container service={service} error={error} />;
}
if (!data) {
return (
<Container service={service}>
<Block label="calibreweb.books" />
<Block label="calibreweb.authors" />
<Block label="calibreweb.categories" />
<Block label="calibreweb.series" />
</Container>
);
}
return (
<Container service={service}>
<Block label="calibreweb.books" value={t("common.number", { value: data.books })} />
<Block label="calibreweb.authors" value={t("common.number", { value: data.authors })} />
<Block label="calibreweb.categories" value={t("common.number", { value: data.categories })} />
<Block label="calibreweb.series" value={t("common.number", { value: data.series })} />
</Container>
);
}

View File

@@ -0,0 +1,14 @@
import genericProxyHandler from "../../utils/proxy/handlers/generic";
const widget = {
api: "{url}/{endpoint}",
proxyHandler: genericProxyHandler,
mappings: {
stats: {
endpoint: "opds/stats",
},
},
};
export default widget;

View File

@@ -2,16 +2,19 @@ import dynamic from "next/dynamic";
const components = {
adguard: dynamic(() => import("./adguard/component")),
atsumeru: dynamic(() => import("./atsumeru/component")),
audiobookshelf: dynamic(() => import("./audiobookshelf/component")),
authentik: dynamic(() => import("./authentik/component")),
autobrr: dynamic(() => import("./autobrr/component")),
azuredevops: dynamic(() => import("./azuredevops/component")),
bazarr: dynamic(() => import("./bazarr/component")),
caddy: dynamic(() => import("./caddy/component")),
calibreweb: dynamic(() => import("./calibreweb/component")),
changedetectionio: dynamic(() => import("./changedetectionio/component")),
channelsdvrserver: dynamic(() => import("./channelsdvrserver/component")),
cloudflared: dynamic(() => import("./cloudflared/component")),
coinmarketcap: dynamic(() => import("./coinmarketcap/component")),
customapi: dynamic(() => import("./customapi/component")),
deluge: dynamic(() => import("./deluge/component")),
diskstation: dynamic(() => import("./diskstation/component")),
downloadstation: dynamic(() => import("./downloadstation/component")),
@@ -42,10 +45,12 @@ const components = {
kopia: dynamic(() => import("./kopia/component")),
lidarr: dynamic(() => import("./lidarr/component")),
mastodon: dynamic(() => import("./mastodon/component")),
mealie: dynamic(() => import("./mealie/component")),
medusa: dynamic(() => import("./medusa/component")),
minecraft: dynamic(() => import("./minecraft/component")),
miniflux: dynamic(() => import("./miniflux/component")),
mikrotik: dynamic(() => import("./mikrotik/component")),
mjpeg: dynamic(() => import("./mjpeg/component")),
moonraker: dynamic(() => import("./moonraker/component")),
mylar: dynamic(() => import("./mylar/component")),
navidrome: dynamic(() => import("./navidrome/component")),
@@ -58,6 +63,7 @@ const components = {
ombi: dynamic(() => import("./ombi/component")),
opnsense: dynamic(() => import("./opnsense/component")),
overseerr: dynamic(() => import("./overseerr/component")),
openmediavault: dynamic(() => import("./openmediavault/component")),
paperlessngx: dynamic(() => import("./paperlessngx/component")),
pfsense: dynamic(() => import("./pfsense/component")),
photoprism: dynamic(() => import("./photoprism/component")),

View File

@@ -0,0 +1,75 @@
import { useTranslation } from "next-i18next";
import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
import useWidgetAPI from "utils/proxy/use-widget-api";
function getValue(field, data) {
let value = data;
let lastField = field;
let key = '';
while (typeof lastField === "object") {
key = Object.keys(lastField)[0] ?? null;
if (key === null) {
break;
}
value = value[key];
lastField = lastField[key];
}
if (typeof value === 'undefined') {
return null;
}
return value[lastField] ?? null;
}
function formatValue(t, mapping, value) {
switch (mapping?.format) {
case 'number':
return t("common.number", { value: parseInt(value, 10) });
case 'float':
return t("common.number", { value });
case 'percent':
return t("common.percent", { value });
case 'text':
default:
return value;
}
}
export default function Component({ service }) {
const { t } = useTranslation();
const { widget } = service;
const { mappings = [], refreshInterval = 10000 } = widget;
const { data: customData, error: customError } = useWidgetAPI(widget, null, {
refreshInterval: Math.max(1000, refreshInterval),
});
if (customError) {
return <Container service={service} error={customError} />;
}
if (!customData) {
return (
<Container service={service}>
{ mappings.slice(0,4).map(item => <Block label={item.label} key={item.field} />) }
</Container>
);
}
return (
<Container service={service}>
{ mappings.slice(0,4).map(mapping => <Block
label={mapping.label}
key={mapping.field}
value={formatValue(t, mapping, getValue(mapping.field, customData))}
/>) }
</Container>
);
}

View File

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

View File

@@ -26,6 +26,7 @@ export default function Component({ service }) {
if (!serverData) {
return (
<Container service={service}>
<Block label="gamedig.status"/>
<Block label="gamedig.name"/>
<Block label="gamedig.map"/>
<Block label="gamedig.currentPlayers" />
@@ -37,23 +38,25 @@ export default function Component({ service }) {
);
}
const status = serverData.online ? <span className="text-green-500">{t("gamedig.online")}</span> : <span className="text-red-500">{t("gamedig.offline")}</span>;
const name = serverData.online ? serverData.name : "-";
const map = serverData.online ? serverData.map : "-";
const currentPlayers = serverData.online ? `${serverData.players} / ${serverData.maxplayers}` : "-";
const players = serverData.online ? `${serverData.players}` : "-";
const maxPlayers = serverData.online ? `${serverData.maxplayers}` : "-";
const bots = serverData.online ? `${serverData.bots}` : "-";
const ping = serverData.online ? `${serverData.ping}` : 0;
const ping = serverData.online ? `${t("common.ms", { value: serverData.ping, style: "unit", unit: "millisecond" })}` : "-";
return (
<Container service={service}>
<Block label="gamedig.status" value={status} />
<Block label="gamedig.name" value={name} />
<Block label="gamedig.map" value={map} />
<Block label="gamedig.currentPlayers" value={currentPlayers} />
<Block label="gamedig.players" value={players} />
<Block label="gamedig.maxPlayers" value={maxPlayers} />
<Block label="gamedig.bots" value={bots} />
<Block label="gamedig.ping" value={t("common.ms", { value: ping, style: "unit", unit: "millisecond" })} />
<Block label="gamedig.ping" value={ping} />
</Container>
);
}

View File

@@ -0,0 +1,33 @@
import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
import useWidgetAPI from "utils/proxy/use-widget-api";
export default function Component({ service }) {
const { widget } = service;
const { data: mealieData, error: mealieError } = useWidgetAPI(widget);
if (mealieError || mealieData?.statusCode === 401) {
return <Container service={service} error={mealieError ?? mealieData} />;
}
if (!mealieData) {
return (
<Container service={service}>
<Block label="mealie.recipes" />
<Block label="mealie.users" />
<Block label="mealie.categories" />
<Block label="mealie.tags" />
</Container>
);
}
return (
<Container service={service}>
<Block label="mealie.recipes" value={mealieData.totalRecipes} />
<Block label="mealie.users" value={mealieData.totalUsers} />
<Block label="mealie.categories" value={mealieData.totalCategories} />
<Block label="mealie.tags" value={mealieData.totalTags} />
</Container>
);
}

View File

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

View File

@@ -0,0 +1,17 @@
import Image from "next/image";
export default function Component({ service }) {
const { widget } = service;
const { stream, fit = "contain" } = widget;
return (
<div>
<div className="absolute top-0 bottom-0 right-0 left-0">
<Image layout="fill" objectFit="fill" className="blur-md" src={stream} alt="stream" />
<Image layout="fill" objectFit={fit} className="drop-shadow-2xl" src={stream} alt="stream" />
</div>
<div className="absolute top-0 right-0 bottom-0 left-0 overflow-clip shadow-[inset_0_0_200px_#000] shadow-theme-700/10 dark:shadow-theme-900/10" />
<div className="h-[68px] overflow-clip" />
</div>
);
}

View File

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

View File

@@ -31,7 +31,7 @@ export default function Component({ service }) {
const printingStateFalgs = ["Printing", "Paused", "Pausing", "Resuming"];
if (printingStateFalgs.includes(state)) {
const { completion } = jobStats.progress;
const { completion } = jobStats?.progress ?? undefined;
if (!jobStats || !completion) {
return (

View File

@@ -0,0 +1,16 @@
import ServicesGetStatus from "./methods/services_get_status";
import SmartGetList from "./methods/smart_get_list";
import DownloaderGetDownloadList from "./methods/downloader_get_downloadlist";
export default function Component({ service }) {
switch (service.widget.method) {
case "services.getStatus":
return <ServicesGetStatus service={service} />;
case "smart.getListBg":
return <SmartGetList service={service} />;
case "downloader.getDownloadList":
return <DownloaderGetDownloadList service={service} />;
default:
return null;
}
}

View File

@@ -0,0 +1,36 @@
import useWidgetAPI from "utils/proxy/use-widget-api";
import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
const downloadReduce = (acc, e) => {
if (e.downloading) {
return acc + 1;
}
return acc;
};
const items = [
{ label: "openmediavault.downloading", getNumber: (data) => (!data ? null : data.reduce(downloadReduce, 0)) },
{ label: "openmediavault.total", getNumber: (data) => (!data ? null : data?.length) },
];
export default function Component({ service }) {
const { data, error } = useWidgetAPI(service.widget);
if (error) {
return <Container service={service} error={error} />;
}
const itemsWithData = items.map((item) => ({
...item,
number: item.getNumber(data?.response?.data),
}));
return (
<Container service={service}>
{itemsWithData.map((e) => (
<Block key={e.label} label={e.label} value={e.number} />
))}
</Container>
);
}

View File

@@ -0,0 +1,43 @@
import useWidgetAPI from "utils/proxy/use-widget-api";
import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
const isRunningReduce = (acc, e) => {
if (e.running) {
return acc + 1;
}
return acc;
};
const notRunningReduce = (acc, e) => {
if (!e.running) {
return acc + 1;
}
return acc;
};
const items = [
{ label: "openmediavault.running", getNumber: (data) => (!data ? null : data.reduce(isRunningReduce, 0)) },
{ label: "openmediavault.stopped", getNumber: (data) => (!data ? null : data.reduce(notRunningReduce, 0)) },
{ label: "openmediavault.total", getNumber: (data) => (!data ? null : data?.length) },
];
export default function Component({ service }) {
const { data, error } = useWidgetAPI(service.widget);
if (error) {
return <Container service={service} error={error} />;
}
const itemsWithData = items.map((item) => ({
...item,
number: item.getNumber(data?.response?.data),
}));
return (
<Container service={service}>
{itemsWithData.map((e) => (
<Block key={e.label} label={e.label} value={e.number} />
))}
</Container>
);
}

View File

@@ -0,0 +1,42 @@
import useWidgetAPI from "utils/proxy/use-widget-api";
import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
const passedReduce = (acc, e) => {
if (e.overallstatus === "GOOD") {
return acc + 1;
}
return acc;
};
const failedReduce = (acc, e) => {
if (e.overallstatus !== "GOOD") {
return acc + 1;
}
return acc;
};
const items = [
{ label: "openmediavault.passed", getNumber: (data) => (!data ? null : data.reduce(passedReduce, 0)) },
{ label: "openmediavault.failed", getNumber: (data) => (!data ? null : data.reduce(failedReduce, 0)) },
];
export default function Component({ service }) {
const { data, error } = useWidgetAPI(service.widget);
if (error) {
return <Container service={service} error={error} />;
}
const itemsWithData = items.map((item) => ({
...item,
number: item.getNumber(JSON.parse(data?.response?.output || "{}")?.data),
}));
return (
<Container service={service}>
{itemsWithData.map((e) => (
<Block key={e.label} label={e.label} value={e.number} />
))}
</Container>
);
}

View File

@@ -0,0 +1,151 @@
import { formatApiCall } from "utils/proxy/api-helpers";
import { httpProxy } from "utils/proxy/http";
import getServiceWidget from "utils/config/service-helpers";
import { addCookieToJar, setCookieHeader } from "utils/proxy/cookie-jar";
import createLogger from "utils/logger";
import widgets from "widgets/widgets";
const PROXY_NAME = "OMVProxyHandler";
const BG_MAX_RETRIES = 50;
const BG_POLL_PERIOD = 500;
const logger = createLogger(PROXY_NAME);
async function getWidget(req) {
const { group, service } = req.query;
if (!group || !service) {
logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
return null;
}
const widget = await getServiceWidget(group, service);
if (!widget) {
logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
return null;
}
return widget;
}
async function rpc(url, request) {
const params = {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(request),
};
setCookieHeader(url, params);
const [status, contentType, data, headers] = await httpProxy(url, params);
return { status, contentType, data, headers };
}
async function poll(attemptsLeft, makeReqByPos, pos = 0) {
if (attemptsLeft <= 0) {
return null;
}
const resp = await makeReqByPos(pos);
const data = JSON.parse(resp.data.toString()).response;
if (data.running === true || data.outputPending) {
await new Promise((resolve) => {
setTimeout(resolve, BG_POLL_PERIOD);
});
return poll(attemptsLeft - 1, makeReqByPos, data.pos);
}
return resp;
}
async function tryLogin(widget) {
const url = new URL(formatApiCall(widgets?.[widget.type]?.api, { ...widget }));
const { username, password } = widget;
const resp = await rpc(url, {
method: "login",
service: "session",
params: { username, password },
});
if (resp.status !== 200) {
logger.error("HTTP %d logging in to OpenMediaVault. Data: %s", resp.status, resp.data);
return [false, resp];
}
const json = JSON.parse(resp.data.toString());
if (json.response.authenticated !== true) {
logger.error("Login error in OpenMediaVault. Data: %s", resp.data);
resp.status = 401;
return [false, resp];
}
return [true, resp];
}
async function processBg(url, filename) {
const resp = await poll(BG_MAX_RETRIES, (pos) =>
rpc(url, {
service: "exec",
method: "getOutput",
params: { pos, filename },
})
);
if (resp == null) {
const errText = "The maximum number of attempts to receive a response from Bg data has been exceeded.";
logger.error(errText);
return errText;
}
if (resp.status !== 200) {
logger.error("HTTP %d getting Bg data from OpenMediaVault RPC. Data: %s", resp.status, resp.data);
}
return resp;
}
export default async function proxyHandler(req, res) {
const widget = await getWidget(req);
if (!widget) {
return res.status(400).json({ error: "Invalid proxy service type" });
}
const api = widgets?.[widget.type]?.api;
if (!api) {
return res.status(403).json({ error: "Service does not support RPC calls" });
}
const url = new URL(formatApiCall(api, { ...widget }));
const [service, method] = widget.method.split(".");
const rpcReq = { params: { limit: -1, start: 0 }, service, method };
let resp = await rpc(url, rpcReq);
if (resp.status === 401) {
logger.debug("Session not authenticated.");
const [success, lResp] = await tryLogin(widget);
if (success) {
addCookieToJar(url, lResp.headers);
} else {
res.status(lResp.status).json({ error: { message: `HTTP Error ${lResp.status}`, url, data: lResp.data } });
}
logger.debug("Retrying OpenMediaVault request after login.");
resp = await rpc(url, rpcReq);
}
if (resp.status !== 200) {
logger.error("HTTP %d getting data from OpenMediaVault RPC. Data: %s", resp.status, resp.data);
return res.status(resp.status).json({ error: { message: `HTTP Error ${resp.status}`, url, data: resp.data } });
}
if (method.endsWith("Bg")) {
const json = JSON.parse(resp.data.toString());
const bgResp = await processBg(url, json.response);
if (typeof bgResp === "string") {
return res.status(400).json({ error: bgResp });
}
return res.status(bgResp.status).send(bgResp.data);
}
return res.status(resp.status).send(resp.data);
}

View File

@@ -0,0 +1,8 @@
import proxyHandler from "./proxy";
const widget = {
api: "{url}/rpc.php",
proxyHandler,
};
export default widget;

View File

@@ -1,14 +1,17 @@
import adguard from "./adguard/widget";
import atsumeru from "./atsumeru/widget";
import audiobookshelf from "./audiobookshelf/widget";
import authentik from "./authentik/widget";
import autobrr from "./autobrr/widget";
import azuredevops from "./azuredevops/widget";
import bazarr from "./bazarr/widget";
import caddy from "./caddy/widget";
import calibreweb from "./calibreweb/widget";
import changedetectionio from "./changedetectionio/widget";
import channelsdvrserver from "./channelsdvrserver/widget";
import cloudflared from "./cloudflared/widget";
import coinmarketcap from "./coinmarketcap/widget";
import customapi from "./customapi/widget";
import deluge from "./deluge/widget";
import diskstation from "./diskstation/widget";
import downloadstation from "./downloadstation/widget";
@@ -36,10 +39,12 @@ import komga from "./komga/widget";
import kopia from "./kopia/widget";
import lidarr from "./lidarr/widget";
import mastodon from "./mastodon/widget";
import mealie from "./mealie/widget";
import medusa from "./medusa/widget";
import minecraft from "./minecraft/widget";
import miniflux from "./miniflux/widget";
import mikrotik from "./mikrotik/widget";
import mjpeg from "./mjpeg/widget";
import moonraker from "./moonraker/widget";
import mylar from "./mylar/widget";
import navidrome from "./navidrome/widget";
@@ -52,6 +57,7 @@ import omada from "./omada/widget";
import ombi from "./ombi/widget";
import opnsense from "./opnsense/widget";
import overseerr from "./overseerr/widget";
import openmediavault from "./openmediavault/widget";
import paperlessngx from "./paperlessngx/widget";
import pfsense from "./pfsense/widget";
import photoprism from "./photoprism/widget";
@@ -92,16 +98,19 @@ import urbackup from "./urbackup/widget";
const widgets = {
adguard,
atsumeru,
audiobookshelf,
authentik,
autobrr,
azuredevops,
bazarr,
caddy,
calibreweb,
changedetectionio,
channelsdvrserver,
cloudflared,
coinmarketcap,
customapi,
deluge,
diskstation,
downloadstation,
@@ -130,10 +139,12 @@ const widgets = {
kopia,
lidarr,
mastodon,
mealie,
medusa,
minecraft,
miniflux,
mikrotik,
mjpeg,
moonraker,
mylar,
navidrome,
@@ -146,6 +157,7 @@ const widgets = {
ombi,
opnsense,
overseerr,
openmediavault,
paperlessngx,
pfsense,
photoprism,