Compare commits

..

312 Commits

Author SHA1 Message Date
David
f692e71991 Add Support for Simple Icons + Add optional theme colors for icons (#1438)
* add support for simple-icons si- prefix

* add iconStyle setting

* lowercase comment

* add supported prefix comment

* Apply suggestions from code review

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

---------

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2023-05-01 11:06:05 -07:00
shamoon
f4ffc2d29b Merge pull request #1437 from GAntoine/hide-widget-on-error-setting
Add setting to hide widgets on failure
2023-05-01 08:18:36 -07:00
Tirarex
8141f38807 Translated using Weblate (Russian)
Currently translated at 64.8% (269 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-05-01 08:11:49 +02:00
Jag_k
c3e57f7235 Translated using Weblate (Russian)
Currently translated at 64.8% (269 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-05-01 08:11:49 +02:00
Игорь Бесчастнов
9913bfb31b Translated using Weblate (Russian)
Currently translated at 31.0% (129 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-05-01 07:34:51 +02:00
Tirarex
ac331f51d8 Translated using Weblate (Russian)
Currently translated at 31.0% (129 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-05-01 07:34:51 +02:00
Jag_k
9aeb392197 Translated using Weblate (Russian)
Currently translated at 31.0% (129 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-05-01 07:34:51 +02:00
Georges-Antoine Assi
bd1c2b1881 Add setting to hide widgets on failure 2023-04-30 19:09:37 -04:00
Dan
8600718c1d Translated using Weblate (Ukrainian)
Currently translated at 100.0% (415 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-04-30 16:50:59 +02:00
Milo Ivir
f1a1bc573e Translated using Weblate (Croatian)
Currently translated at 100.0% (415 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-04-30 16:50:59 +02:00
Juan Manuel Bennàssar Carretero
cf466f2f8f Translated using Weblate (Catalan)
Currently translated at 63.1% (262 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-04-30 16:50:58 +02:00
饶方瞳
9c2db44226 Translated using Weblate (Chinese (Simplified))
Currently translated at 98.5% (409 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-04-30 16:50:58 +02:00
Nonoss117
1f89c6e699 Translated using Weblate (French)
Currently translated at 100.0% (415 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-04-30 16:50:58 +02:00
gallegonovato
1a7dd88a41 Translated using Weblate (Spanish)
Currently translated at 100.0% (415 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-04-30 16:50:57 +02:00
shamoon
eb8229b75c Merge pull request #1433 from CiyLei/docker_multiple_names
solving docker multiple names
2023-04-30 07:12:37 -07:00
Ciy
1b34db1109 solving docker multiple names 2023-04-30 14:45:27 +08:00
shamoon
3d654e03c6 Update CONTRIBUTING.md 2023-04-27 14:29:11 -07:00
Anonymous
863fd797a2 Translated using Weblate (Slovenian)
Currently translated at 99.2% (412 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/
2023-04-27 20:23:43 +02:00
Anonymous
f320f1a9fc Translated using Weblate (Greek)
Currently translated at 26.5% (110 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-04-27 20:23:43 +02:00
Anonymous
d078a72a0b Translated using Weblate (Korean)
Currently translated at 41.9% (174 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ko/
2023-04-27 20:23:42 +02:00
Anonymous
86d14e3617 Translated using Weblate (Slovak)
Currently translated at 2.1% (9 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sk/
2023-04-27 20:23:42 +02:00
Anonymous
2626429159 Translated using Weblate (Thai)
Currently translated at 11.3% (47 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/th/
2023-04-27 20:23:42 +02:00
Anonymous
b5098f6a9d Translated using Weblate (Latvian)
Currently translated at 28.6% (119 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-04-27 20:23:41 +02:00
Anonymous
c78275bac5 Translated using Weblate (Japanese)
Currently translated at 3.6% (15 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-04-27 20:23:41 +02:00
Anonymous
ca03b3e829 Translated using Weblate (Ukrainian)
Currently translated at 99.5% (413 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-04-27 20:23:41 +02:00
Anonymous
ce4535077b Translated using Weblate (Esperanto)
Currently translated at 35.4% (147 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-04-27 20:23:40 +02:00
Anonymous
010d643a0b Translated using Weblate (Hindi)
Currently translated at 2.1% (9 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-04-27 20:23:40 +02:00
Anonymous
b038e857ee Translated using Weblate (Malay)
Currently translated at 60.9% (253 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-04-27 20:23:40 +02:00
Anonymous
fb344c546c Translated using Weblate (Danish)
Currently translated at 47.7% (198 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-04-27 20:23:39 +02:00
Anonymous
49284289e6 Translated using Weblate (Czech)
Currently translated at 94.4% (392 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-04-27 20:23:39 +02:00
Anonymous
095061ab1b Translated using Weblate (Arabic)
Currently translated at 63.1% (262 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-04-27 20:23:39 +02:00
Anonymous
7d9da4f6e2 Translated using Weblate (Serbian)
Currently translated at 2.1% (9 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-04-27 20:23:38 +02:00
Anonymous
f21df70a68 Translated using Weblate (Turkish)
Currently translated at 76.3% (317 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-04-27 20:23:35 +02:00
Anonymous
85ba5fde70 Translated using Weblate (Bulgarian)
Currently translated at 11.0% (46 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-04-27 20:23:34 +02:00
Anonymous
b323ba6561 Translated using Weblate (Telugu)
Currently translated at 52.2% (217 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-04-27 20:23:31 +02:00
Anonymous
a5ed55e723 Translated using Weblate (Finnish)
Currently translated at 42.8% (178 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-04-27 20:23:26 +02:00
Anonymous
2b2a001d7c Translated using Weblate (Yue (Traditional))
Currently translated at 28.4% (118 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue_Hant/
2023-04-27 20:23:26 +02:00
Anonymous
0146872514 Translated using Weblate (Portuguese (Brazil))
Currently translated at 97.8% (406 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-04-27 20:23:25 +02:00
Anonymous
73c03a21e1 Translated using Weblate (Romanian)
Currently translated at 36.3% (151 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-04-27 20:23:25 +02:00
Anonymous
9e29be6445 Translated using Weblate (Hebrew)
Currently translated at 24.3% (101 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-04-27 20:23:16 +02:00
Anonymous
e44faf6e9b Translated using Weblate (Hungarian)
Currently translated at 26.0% (108 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-04-27 20:23:16 +02:00
Anonymous
72215b115b Translated using Weblate (Croatian)
Currently translated at 99.2% (412 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-04-27 20:23:15 +02:00
Anonymous
d8d3e199d3 Translated using Weblate (Swedish)
Currently translated at 31.8% (132 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-04-27 20:23:15 +02:00
Anonymous
a04efd512e Translated using Weblate (Polish)
Currently translated at 70.3% (292 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-04-27 20:23:15 +02:00
Anonymous
99163f63cd Translated using Weblate (Catalan)
Currently translated at 62.6% (260 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-04-27 20:23:14 +02:00
Anonymous
3836ae31c8 Translated using Weblate (Chinese (Traditional))
Currently translated at 86.5% (359 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-04-27 20:23:14 +02:00
Anonymous
88a2f213a1 Translated using Weblate (Dutch)
Currently translated at 58.3% (242 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-04-27 20:23:14 +02:00
Anonymous
14957bed15 Translated using Weblate (Vietnamese)
Currently translated at 10.6% (44 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-04-27 20:23:13 +02:00
Anonymous
19d227db28 Translated using Weblate (Norwegian Bokmål)
Currently translated at 19.0% (79 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-04-27 20:23:13 +02:00
Anonymous
7213912ab3 Translated using Weblate (Italian)
Currently translated at 69.3% (288 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-04-27 20:23:13 +02:00
Anonymous
943b405fca Translated using Weblate (Chinese (Simplified))
Currently translated at 96.3% (400 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-04-27 20:23:12 +02:00
Anonymous
76d386c417 Translated using Weblate (Russian)
Currently translated at 11.5% (48 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-04-27 20:23:12 +02:00
Anonymous
83771e53c4 Translated using Weblate (Portuguese)
Currently translated at 97.8% (406 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-04-27 20:23:12 +02:00
Anonymous
274f78312b Translated using Weblate (French)
Currently translated at 99.5% (413 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-04-27 20:23:07 +02:00
Anonymous
550336957d Translated using Weblate (Spanish)
Currently translated at 99.5% (413 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-04-27 20:23:06 +02:00
Anonymous
e7ed506346 Translated using Weblate (German)
Currently translated at 87.4% (363 of 415 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-04-27 20:23:06 +02:00
Dan
025db434a9 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (413 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-04-27 20:22:31 +02:00
Juan Manuel Bennàssar Carretero
22bb5471a1 Translated using Weblate (Catalan)
Currently translated at 62.9% (260 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-04-27 20:22:31 +02:00
Juan Manuel Bennàssar Carretero
9d8768f4a7 Translated using Weblate (Spanish)
Currently translated at 100.0% (413 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-04-27 20:22:31 +02:00
Richy HBM
f4f58409a2 Add Whats Up Docker widget (#1150)
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2023-04-27 11:21:57 -07:00
shamoon
dc3019da80 Merge pull request #1419 from juanmanuelbc/mb
Fix: align services and widgets
2023-04-27 02:24:04 -07:00
Anonymous
adab1734fc Translated using Weblate (Slovenian)
Currently translated at 99.7% (412 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/
2023-04-27 11:23:14 +02:00
Anonymous
3549dfe1da Translated using Weblate (Greek)
Currently translated at 26.6% (110 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-04-27 11:23:14 +02:00
Anonymous
1afcc32ee3 Translated using Weblate (Korean)
Currently translated at 42.1% (174 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ko/
2023-04-27 11:23:13 +02:00
Anonymous
72af36b761 Translated using Weblate (Slovak)
Currently translated at 2.1% (9 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sk/
2023-04-27 11:23:13 +02:00
Anonymous
e7e71fd05d Translated using Weblate (Thai)
Currently translated at 11.3% (47 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/th/
2023-04-27 11:23:13 +02:00
Anonymous
db9638654e Translated using Weblate (Latvian)
Currently translated at 28.8% (119 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-04-27 11:23:13 +02:00
Anonymous
308257fad9 Translated using Weblate (Japanese)
Currently translated at 3.6% (15 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-04-27 11:23:12 +02:00
Anonymous
f44b83913b Translated using Weblate (Ukrainian)
Currently translated at 99.7% (412 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-04-27 11:23:12 +02:00
Anonymous
efaf2d87fb Translated using Weblate (Esperanto)
Currently translated at 35.5% (147 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-04-27 11:23:12 +02:00
Anonymous
dc9d984251 Translated using Weblate (Hindi)
Currently translated at 2.1% (9 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-04-27 11:23:11 +02:00
Anonymous
46a2706c6c Translated using Weblate (Malay)
Currently translated at 61.2% (253 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-04-27 11:23:11 +02:00
Anonymous
9899bb5ef7 Translated using Weblate (Danish)
Currently translated at 47.9% (198 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-04-27 11:23:11 +02:00
Anonymous
91f0cdfdca Translated using Weblate (Czech)
Currently translated at 94.9% (392 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-04-27 11:23:10 +02:00
Anonymous
660cbcba64 Translated using Weblate (Arabic)
Currently translated at 63.4% (262 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-04-27 11:23:10 +02:00
Anonymous
a05fba0bae Translated using Weblate (Serbian)
Currently translated at 2.1% (9 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-04-27 11:23:10 +02:00
Anonymous
3e80b0e6dc Translated using Weblate (Turkish)
Currently translated at 76.7% (317 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-04-27 11:23:09 +02:00
Anonymous
d2a3bf7227 Translated using Weblate (Bulgarian)
Currently translated at 11.1% (46 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-04-27 11:23:09 +02:00
Anonymous
e9d633a7f4 Translated using Weblate (Telugu)
Currently translated at 52.5% (217 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-04-27 11:23:09 +02:00
Anonymous
0e4c63f8d3 Translated using Weblate (Finnish)
Currently translated at 43.0% (178 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-04-27 11:23:08 +02:00
Anonymous
d12ee3eb46 Translated using Weblate (Yue (Traditional))
Currently translated at 28.5% (118 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue_Hant/
2023-04-27 11:23:08 +02:00
Anonymous
97dbc6412f Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.3% (406 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-04-27 11:23:07 +02:00
Anonymous
042d3640d7 Translated using Weblate (Romanian)
Currently translated at 36.5% (151 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-04-27 11:23:07 +02:00
Anonymous
878ceebecb Translated using Weblate (Hebrew)
Currently translated at 24.4% (101 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-04-27 11:23:07 +02:00
Anonymous
21b8166a7a Translated using Weblate (Hungarian)
Currently translated at 26.1% (108 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-04-27 11:23:06 +02:00
Anonymous
99afd9af8b Translated using Weblate (Croatian)
Currently translated at 99.7% (412 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-04-27 11:23:06 +02:00
Anonymous
c197d67fb9 Translated using Weblate (Swedish)
Currently translated at 31.9% (132 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-04-27 11:23:06 +02:00
Anonymous
f9a4fedb6a Translated using Weblate (Polish)
Currently translated at 70.7% (292 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-04-27 11:23:05 +02:00
Anonymous
a458561d58 Translated using Weblate (Catalan)
Currently translated at 62.7% (259 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-04-27 11:23:05 +02:00
Anonymous
51a0ee4882 Translated using Weblate (Chinese (Traditional))
Currently translated at 86.9% (359 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-04-27 11:23:05 +02:00
Anonymous
8b8238d672 Translated using Weblate (Dutch)
Currently translated at 58.5% (242 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-04-27 11:23:04 +02:00
Anonymous
eaa76cd61a Translated using Weblate (Vietnamese)
Currently translated at 10.6% (44 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-04-27 11:23:04 +02:00
Anonymous
7ad47f005b Translated using Weblate (Norwegian Bokmål)
Currently translated at 19.1% (79 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-04-27 11:23:04 +02:00
Anonymous
00ee97aad3 Translated using Weblate (Italian)
Currently translated at 69.7% (288 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-04-27 11:23:03 +02:00
Anonymous
c9eef883d2 Translated using Weblate (Chinese (Simplified))
Currently translated at 96.8% (400 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-04-27 11:23:03 +02:00
Anonymous
b9d16c8383 Translated using Weblate (Russian)
Currently translated at 11.6% (48 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-04-27 11:23:03 +02:00
Anonymous
71adb8eb83 Translated using Weblate (Portuguese)
Currently translated at 98.3% (406 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-04-27 11:23:02 +02:00
Anonymous
a8ef543934 Translated using Weblate (French)
Currently translated at 99.7% (412 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-04-27 11:23:02 +02:00
Anonymous
c9c8625a74 Translated using Weblate (Spanish)
Currently translated at 99.7% (412 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-04-27 11:23:01 +02:00
Anonymous
b64a94e7de Translated using Weblate (German)
Currently translated at 87.8% (363 of 413 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-04-27 11:23:01 +02:00
shamoon
abe8b3a5ee Merge pull request #1418 from juanmanuelbc/plex_albums
Feature: add albums to Plex service widget
2023-04-27 02:19:31 -07:00
shamoon
9de376d51c simplify plex music logic 2023-04-27 02:12:21 -07:00
Juan Manuel Bennàssar Carretero
3e02823980 Fix: align services and widgets 2023-04-27 11:04:45 +02:00
Juan Manuel Bennàssar Carretero
de11f81234 Feature: add albums to Plex service widget 2023-04-27 10:12:12 +02:00
Andrej Kralj
830d4687cd Translated using Weblate (Slovenian)
Currently translated at 100.0% (412 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/
2023-04-25 14:48:12 +02:00
Dan
df6058967f Translated using Weblate (Ukrainian)
Currently translated at 100.0% (412 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-04-25 14:48:11 +02:00
shamoon
cf3fc1d64b Merge pull request #1405 from ervwalter/square-icons
force icons to fit withing a 32x32 square
2023-04-23 21:15:59 -07:00
Andrej Kralj
8cc36a2fb4 Translated using Weblate (Slovenian)
Currently translated at 28.1% (116 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/
2023-04-23 18:48:28 +02:00
Erv Walter
5080301efe force icons to fit withing a 32x32 square 2023-04-23 16:12:08 +00:00
shamoon
0313140d5b Merge pull request #1401 from mynameisbogdan/prowlarr-grabs 2023-04-22 09:09:17 -07:00
Milo Ivir
415d846c40 Translated using Weblate (Croatian)
Currently translated at 100.0% (412 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-04-22 16:48:45 +02:00
Nonoss117
5182dad983 Translated using Weblate (French)
Currently translated at 100.0% (412 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-04-22 16:48:45 +02:00
gallegonovato
ef942c1485 Translated using Weblate (Spanish)
Currently translated at 100.0% (412 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-04-22 16:48:44 +02:00
Bogdan
08edae7713 Fix grabs data for Prowlarr 2023-04-22 09:31:35 +03:00
shamoon
dd6a870998 Try to get unique name for service item key and in quicklaunch 2023-04-21 17:55:35 -07:00
shamoon
26b78641d4 Merge pull request #1397 from benphelps/fix/issue-1395
Fix: quick launch services show as bookmarks
2023-04-21 08:56:56 -07:00
shamoon
b5ada5ef11 Add type field to services from api 2023-04-21 08:50:15 -07:00
Anonymous
9b21adbf39 Translated using Weblate (Slovenian)
Currently translated at 24.7% (102 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/
2023-04-20 20:58:14 +02:00
Anonymous
9f6639d63e Translated using Weblate (Greek)
Currently translated at 26.6% (110 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-04-20 20:58:13 +02:00
Anonymous
19947b7a74 Translated using Weblate (Korean)
Currently translated at 42.2% (174 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ko/
2023-04-20 20:58:12 +02:00
Anonymous
dd02b1675b Translated using Weblate (Slovak)
Currently translated at 2.1% (9 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sk/
2023-04-20 20:58:12 +02:00
Anonymous
db7d987f6c Translated using Weblate (Thai)
Currently translated at 11.4% (47 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/th/
2023-04-20 20:58:11 +02:00
Anonymous
41013f5ba3 Translated using Weblate (Latvian)
Currently translated at 28.8% (119 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-04-20 20:58:11 +02:00
Anonymous
bbe6779a0e Translated using Weblate (Japanese)
Currently translated at 3.6% (15 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-04-20 20:58:11 +02:00
Anonymous
8104d12674 Translated using Weblate (Ukrainian)
Currently translated at 98.5% (406 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-04-20 20:58:10 +02:00
Anonymous
657e3d30be Translated using Weblate (Esperanto)
Currently translated at 35.6% (147 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-04-20 20:58:10 +02:00
Anonymous
1372befc72 Translated using Weblate (Hindi)
Currently translated at 2.1% (9 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-04-20 20:58:10 +02:00
Anonymous
39a44a4266 Translated using Weblate (Malay)
Currently translated at 61.4% (253 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-04-20 20:58:09 +02:00
Anonymous
c6e4db338a Translated using Weblate (Danish)
Currently translated at 48.0% (198 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-04-20 20:58:09 +02:00
Anonymous
6976d9a7e3 Translated using Weblate (Czech)
Currently translated at 95.1% (392 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-04-20 20:58:09 +02:00
Anonymous
3a26d99029 Translated using Weblate (Arabic)
Currently translated at 63.5% (262 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-04-20 20:58:08 +02:00
Anonymous
c65c4d0780 Translated using Weblate (Serbian)
Currently translated at 2.1% (9 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-04-20 20:58:08 +02:00
Anonymous
1770599ef7 Translated using Weblate (Turkish)
Currently translated at 76.9% (317 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-04-20 20:58:07 +02:00
Anonymous
f5d39dd993 Translated using Weblate (Bulgarian)
Currently translated at 11.1% (46 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-04-20 20:58:07 +02:00
Anonymous
50083334d6 Translated using Weblate (Telugu)
Currently translated at 52.6% (217 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-04-20 20:58:06 +02:00
Anonymous
ccc0fa5b03 Translated using Weblate (Finnish)
Currently translated at 43.2% (178 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-04-20 20:58:06 +02:00
Anonymous
043ed57bbe Translated using Weblate (Yue (Traditional))
Currently translated at 28.6% (118 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue_Hant/
2023-04-20 20:58:05 +02:00
Anonymous
a007e12c0f Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.5% (406 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-04-20 20:58:05 +02:00
Anonymous
88efb402c5 Translated using Weblate (Romanian)
Currently translated at 36.6% (151 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-04-20 20:58:04 +02:00
Anonymous
b93605d8e3 Translated using Weblate (Hebrew)
Currently translated at 24.5% (101 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-04-20 20:58:04 +02:00
Anonymous
5be4743507 Translated using Weblate (Hungarian)
Currently translated at 26.2% (108 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-04-20 20:58:03 +02:00
Anonymous
adb394ade6 Translated using Weblate (Croatian)
Currently translated at 99.0% (408 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-04-20 20:58:03 +02:00
Anonymous
d7374384ad Translated using Weblate (Swedish)
Currently translated at 32.0% (132 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-04-20 20:58:02 +02:00
Anonymous
bc964c853a Translated using Weblate (Polish)
Currently translated at 70.8% (292 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-04-20 20:58:02 +02:00
Anonymous
ba350f438b Translated using Weblate (Catalan)
Currently translated at 62.8% (259 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-04-20 20:58:02 +02:00
Anonymous
6c0dc966af Translated using Weblate (Chinese (Traditional))
Currently translated at 87.1% (359 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-04-20 20:58:01 +02:00
Anonymous
ce370ea2ce Translated using Weblate (Dutch)
Currently translated at 58.7% (242 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-04-20 20:58:01 +02:00
Anonymous
0d823c707d Translated using Weblate (Vietnamese)
Currently translated at 10.6% (44 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-04-20 20:58:00 +02:00
Anonymous
9807e38a54 Translated using Weblate (Norwegian Bokmål)
Currently translated at 19.1% (79 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-04-20 20:58:00 +02:00
Anonymous
808acb9751 Translated using Weblate (Italian)
Currently translated at 69.9% (288 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-04-20 20:58:00 +02:00
Anonymous
791d84d714 Translated using Weblate (Chinese (Simplified))
Currently translated at 97.0% (400 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-04-20 20:57:59 +02:00
Anonymous
7b04263e2b Translated using Weblate (Russian)
Currently translated at 11.6% (48 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-04-20 20:57:59 +02:00
Anonymous
57dea7593e Translated using Weblate (Portuguese)
Currently translated at 98.5% (406 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-04-20 20:57:58 +02:00
Anonymous
e5d9eae9f1 Translated using Weblate (French)
Currently translated at 99.0% (408 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-04-20 20:57:58 +02:00
Anonymous
3e00793907 Translated using Weblate (Spanish)
Currently translated at 99.0% (408 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-04-20 20:57:57 +02:00
Anonymous
af6198737b Translated using Weblate (German)
Currently translated at 88.1% (363 of 412 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-04-20 20:57:57 +02:00
Milo Ivir
91cd423e5b Translated using Weblate (Croatian)
Currently translated at 100.0% (408 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-04-20 20:55:58 +02:00
Juan Manuel Bennàssar Carretero
e4b0e9dc37 Translated using Weblate (Catalan)
Currently translated at 63.4% (259 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-04-20 20:55:58 +02:00
Nonoss117
876e6c4040 Translated using Weblate (French)
Currently translated at 100.0% (408 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-04-20 20:55:58 +02:00
gallegonovato
541d2c1f8b Translated using Weblate (Spanish)
Currently translated at 100.0% (408 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-04-20 20:55:58 +02:00
Juan Manuel Bennàssar Carretero
30fccfe8b7 Translated using Weblate (Spanish)
Currently translated at 100.0% (408 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-04-20 20:55:58 +02:00
shamoon
7b697a88de Merge pull request #1384 from fancybits/add-channels
Add Channels DVR Server widget
2023-04-20 11:55:51 -07:00
shamoon
656cb4ba30 Merge pull request #1383 from mcclurec/transmission-rpc-url
Allow setting rpcUrl path for Transmission widget
2023-04-20 10:09:50 -07:00
Jon Maddox
3acbdda45e add Channels DVR Server widget 2023-04-19 16:24:02 -04:00
Colin
66dabe9872 Allow setting Transmission rpcUrl 2023-04-19 11:08:18 -07:00
shamoon
0904776971 Merge pull request #1380 from benphelps/feature/background-filters
Feature: support blur, saturation & brightness filters for background images
2023-04-19 08:30:18 -07:00
Anonymous
9dbce59417 Translated using Weblate (Slovenian)
Currently translated at 25.0% (102 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/
2023-04-19 17:28:35 +02:00
Anonymous
7b82dfc4be Translated using Weblate (Greek)
Currently translated at 26.9% (110 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-04-19 17:28:35 +02:00
Anonymous
dca8996285 Translated using Weblate (Korean)
Currently translated at 42.6% (174 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ko/
2023-04-19 17:28:34 +02:00
Anonymous
4452ca77d8 Translated using Weblate (Slovak)
Currently translated at 2.2% (9 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sk/
2023-04-19 17:28:34 +02:00
Anonymous
03197f2eb2 Translated using Weblate (Thai)
Currently translated at 11.5% (47 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/th/
2023-04-19 17:28:34 +02:00
Anonymous
fef65e8440 Translated using Weblate (Latvian)
Currently translated at 29.1% (119 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-04-19 17:28:33 +02:00
Anonymous
27805862c8 Translated using Weblate (Japanese)
Currently translated at 3.6% (15 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-04-19 17:28:33 +02:00
Anonymous
ea7d5828d5 Translated using Weblate (Ukrainian)
Currently translated at 99.5% (406 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-04-19 17:28:33 +02:00
Anonymous
0829a21b48 Translated using Weblate (Esperanto)
Currently translated at 36.0% (147 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-04-19 17:28:32 +02:00
Anonymous
6b3ca6ac9a Translated using Weblate (Hindi)
Currently translated at 2.2% (9 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-04-19 17:28:32 +02:00
Anonymous
ada24eb069 Translated using Weblate (Malay)
Currently translated at 62.0% (253 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-04-19 17:28:32 +02:00
Anonymous
023e6bbe23 Translated using Weblate (Danish)
Currently translated at 48.5% (198 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-04-19 17:28:31 +02:00
Anonymous
517bba8ed4 Translated using Weblate (Czech)
Currently translated at 96.0% (392 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-04-19 17:28:31 +02:00
Anonymous
61fd5d2fcc Translated using Weblate (Arabic)
Currently translated at 64.2% (262 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-04-19 17:28:31 +02:00
Anonymous
e133be83db Translated using Weblate (Serbian)
Currently translated at 2.2% (9 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-04-19 17:28:30 +02:00
Anonymous
eae0b25c0f Translated using Weblate (Turkish)
Currently translated at 77.6% (317 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-04-19 17:28:30 +02:00
Anonymous
2518d9ca5f Translated using Weblate (Bulgarian)
Currently translated at 11.2% (46 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-04-19 17:28:29 +02:00
Anonymous
c362c928c2 Translated using Weblate (Telugu)
Currently translated at 53.1% (217 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-04-19 17:28:29 +02:00
Anonymous
bc0af4128d Translated using Weblate (Finnish)
Currently translated at 43.6% (178 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-04-19 17:28:28 +02:00
Anonymous
a07175b49c Translated using Weblate (Yue (Traditional))
Currently translated at 28.9% (118 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue_Hant/
2023-04-19 17:28:28 +02:00
Anonymous
46b31e752b Translated using Weblate (Portuguese (Brazil))
Currently translated at 99.5% (406 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-04-19 17:28:27 +02:00
Anonymous
cfe10b061f Translated using Weblate (Romanian)
Currently translated at 37.0% (151 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-04-19 17:28:27 +02:00
Anonymous
e2e7d82dc6 Translated using Weblate (Hebrew)
Currently translated at 24.7% (101 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-04-19 17:28:27 +02:00
Anonymous
18d1e40604 Translated using Weblate (Hungarian)
Currently translated at 26.4% (108 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-04-19 17:28:26 +02:00
Anonymous
f53176d5b2 Translated using Weblate (Croatian)
Currently translated at 99.5% (406 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-04-19 17:28:26 +02:00
Anonymous
f0bdc9df8a Translated using Weblate (Swedish)
Currently translated at 32.3% (132 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-04-19 17:28:26 +02:00
Anonymous
6947be08da Translated using Weblate (Polish)
Currently translated at 71.5% (292 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-04-19 17:28:25 +02:00
Anonymous
ec71540547 Translated using Weblate (Catalan)
Currently translated at 63.4% (259 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-04-19 17:28:25 +02:00
Anonymous
46e228c4a1 Translated using Weblate (Chinese (Traditional))
Currently translated at 87.9% (359 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-04-19 17:28:25 +02:00
Anonymous
d5c8b48363 Translated using Weblate (Dutch)
Currently translated at 59.3% (242 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-04-19 17:28:24 +02:00
Anonymous
e0b4ce05c8 Translated using Weblate (Vietnamese)
Currently translated at 10.7% (44 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-04-19 17:28:24 +02:00
Anonymous
bbefa459ee Translated using Weblate (Norwegian Bokmål)
Currently translated at 19.3% (79 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-04-19 17:28:24 +02:00
Anonymous
162e79d867 Translated using Weblate (Italian)
Currently translated at 70.5% (288 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-04-19 17:28:23 +02:00
Anonymous
197bc5327d Translated using Weblate (Chinese (Simplified))
Currently translated at 98.0% (400 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-04-19 17:28:23 +02:00
Anonymous
ac6242e2f2 Translated using Weblate (Russian)
Currently translated at 11.7% (48 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-04-19 17:28:23 +02:00
Anonymous
6d3d6fe302 Translated using Weblate (Portuguese)
Currently translated at 99.5% (406 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-04-19 17:28:22 +02:00
Anonymous
f0eb695070 Translated using Weblate (French)
Currently translated at 99.5% (406 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-04-19 17:28:22 +02:00
Anonymous
c168a93f72 Translated using Weblate (Spanish)
Currently translated at 99.5% (406 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-04-19 17:28:21 +02:00
Anonymous
415710cdb3 Translated using Weblate (German)
Currently translated at 88.9% (363 of 408 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-04-19 17:28:21 +02:00
Andrej Kralj
291eba01ab Translated using Weblate (Slovenian)
Currently translated at 25.1% (102 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/
2023-04-19 17:27:04 +02:00
Heng-Yi Wu
e8713a95c0 Add FreshRSS widget (#1377)
* feat: add FreshRSS widget

* refactor: revert credentialed.js

* refactor: custom proxy handler for FreshRSS

* refactor: cache the token as long as possible

During installation, the salt is generated and remains constant unless
the user re-installs the FreshRSS instance.
2023-04-19 08:26:58 -07:00
shamoon
1aa559537a Update proxy.js 2023-04-19 07:02:33 -07:00
shamoon
55bc247c9e Support blur, saturation & brightness filters for background images 2023-04-18 22:51:46 -07:00
Anonymous
4794c8e2ed Translated using Weblate (Slovenian)
Currently translated at 100.0% (0 of 0 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/
2023-04-19 06:46:08 +02:00
Andrej Kralj
56ad8cb927 Added translation using Weblate (Slovenian) 2023-04-19 06:45:24 +02:00
shamoon
063950af05 Merge pull request #1379 from benphelps/fix/issue-1375
Fix: Glances include cpu tempts labeled `Tctl`
2023-04-18 15:42:21 -07:00
shamoon
f2fc78b63f Glances include cpu tempts labeled Tctl 2023-04-18 12:09:02 -07:00
Dan
9f91cd27f3 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (406 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-04-18 12:48:39 +02:00
SekoiaTree
932c479729 Translated using Weblate (Esperanto)
Currently translated at 36.2% (147 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-04-18 12:48:38 +02:00
Henrique Miraldo
db9ccaae2e Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (406 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-04-18 12:48:38 +02:00
Milo Ivir
188ca3186f Translated using Weblate (Croatian)
Currently translated at 100.0% (406 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-04-18 12:48:37 +02:00
Mateusz Sarna
58f35f0940 Translated using Weblate (Polish)
Currently translated at 71.9% (292 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-04-18 12:48:37 +02:00
Henrique Miraldo
af61aa23c1 Translated using Weblate (Portuguese)
Currently translated at 100.0% (406 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-04-18 12:48:36 +02:00
Juan Manuel Bennàssar Carretero
d5812d8c81 Translated using Weblate (Spanish)
Currently translated at 100.0% (406 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-04-18 12:48:36 +02:00
shamoon
9b6755e87e Merge pull request #1362 from benphelps/feature/ping-4xx
Accept http 401 / 403 for ping
2023-04-14 12:49:50 -07:00
gallegonovato
a47e481330 Translated using Weblate (Spanish)
Currently translated at 100.0% (406 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-04-14 21:49:12 +02:00
shamoon
6d1db78709 Accept http 401 / 403 for ping 2023-04-14 12:05:28 -07:00
Dan
1132ac90fb Translated using Weblate (Ukrainian)
Currently translated at 99.7% (405 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-04-13 15:48:17 +02:00
Nonoss117
6debae1a20 Translated using Weblate (French)
Currently translated at 100.0% (406 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-04-13 15:48:17 +02:00
Anonymous
a074d4b15f Translated using Weblate (Greek)
Currently translated at 27.0% (110 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-04-12 10:14:58 +02:00
Anonymous
e98bc2de0f Translated using Weblate (Korean)
Currently translated at 42.8% (174 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ko/
2023-04-12 10:14:58 +02:00
Anonymous
45934cea88 Translated using Weblate (Slovak)
Currently translated at 2.2% (9 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sk/
2023-04-12 10:14:58 +02:00
Anonymous
bdc6d8d746 Translated using Weblate (Thai)
Currently translated at 11.5% (47 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/th/
2023-04-12 10:14:57 +02:00
Anonymous
07277d76f2 Translated using Weblate (Latvian)
Currently translated at 29.3% (119 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/
2023-04-12 10:14:57 +02:00
Anonymous
af58c5ceee Translated using Weblate (Japanese)
Currently translated at 3.6% (15 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/
2023-04-12 10:14:57 +02:00
Anonymous
09d4a50aeb Translated using Weblate (Ukrainian)
Currently translated at 99.2% (403 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/
2023-04-12 10:14:56 +02:00
Anonymous
0bbea6d9d0 Translated using Weblate (Esperanto)
Currently translated at 25.3% (103 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/
2023-04-12 10:14:56 +02:00
Anonymous
69e355cc3c Translated using Weblate (Hindi)
Currently translated at 2.2% (9 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/
2023-04-12 10:14:56 +02:00
Anonymous
12b26049b0 Translated using Weblate (Malay)
Currently translated at 62.3% (253 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/
2023-04-12 10:14:55 +02:00
Anonymous
5ddff35d71 Translated using Weblate (Danish)
Currently translated at 48.7% (198 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/
2023-04-12 10:14:55 +02:00
Anonymous
0ab28e93bd Translated using Weblate (Czech)
Currently translated at 96.5% (392 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/
2023-04-12 10:14:55 +02:00
Anonymous
2dd2cabf3e Translated using Weblate (Arabic)
Currently translated at 64.5% (262 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/
2023-04-12 10:14:54 +02:00
Anonymous
9a55199cd3 Translated using Weblate (Serbian)
Currently translated at 2.2% (9 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/
2023-04-12 10:14:54 +02:00
Anonymous
0223cf7ae3 Translated using Weblate (Turkish)
Currently translated at 78.0% (317 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/
2023-04-12 10:14:53 +02:00
Anonymous
043f787b21 Translated using Weblate (Bulgarian)
Currently translated at 11.3% (46 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2023-04-12 10:14:53 +02:00
Anonymous
6ccc6f2f17 Translated using Weblate (Telugu)
Currently translated at 53.4% (217 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2023-04-12 10:14:52 +02:00
Anonymous
1771ba1f5e Translated using Weblate (Finnish)
Currently translated at 43.8% (178 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2023-04-12 10:14:52 +02:00
Anonymous
d0b673ab5c Translated using Weblate (Yue)
Currently translated at 29.0% (118 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2023-04-12 10:14:52 +02:00
Anonymous
359dd39e85 Translated using Weblate (Portuguese (Brazil))
Currently translated at 97.2% (395 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-04-12 10:14:51 +02:00
Anonymous
0fe31d7a69 Translated using Weblate (Romanian)
Currently translated at 37.1% (151 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2023-04-12 10:14:51 +02:00
Anonymous
ad1a04035b Translated using Weblate (Hebrew)
Currently translated at 24.8% (101 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2023-04-12 10:14:50 +02:00
Anonymous
9678ad45dc Translated using Weblate (Hungarian)
Currently translated at 26.6% (108 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2023-04-12 10:14:50 +02:00
Anonymous
cc7cc6ae9d Translated using Weblate (Croatian)
Currently translated at 99.2% (403 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-04-12 10:14:50 +02:00
Anonymous
5e80c31e31 Translated using Weblate (Swedish)
Currently translated at 32.5% (132 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2023-04-12 10:14:49 +02:00
Anonymous
8e895db576 Translated using Weblate (Polish)
Currently translated at 71.6% (291 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-04-12 10:14:49 +02:00
Anonymous
b780c9e460 Translated using Weblate (Catalan)
Currently translated at 63.5% (258 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-04-12 10:14:49 +02:00
Anonymous
ae3ee655bf Translated using Weblate (Chinese (Traditional))
Currently translated at 88.4% (359 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2023-04-12 10:14:48 +02:00
Anonymous
bf511f555a Translated using Weblate (Dutch)
Currently translated at 59.6% (242 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2023-04-12 10:14:48 +02:00
Anonymous
fff5abb60e Translated using Weblate (Vietnamese)
Currently translated at 10.8% (44 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2023-04-12 10:14:47 +02:00
Anonymous
69060a7c59 Translated using Weblate (Norwegian Bokmål)
Currently translated at 19.4% (79 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2023-04-12 10:14:47 +02:00
Anonymous
ee00a4b352 Translated using Weblate (Italian)
Currently translated at 70.9% (288 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2023-04-12 10:14:46 +02:00
Anonymous
c9ccb82a54 Translated using Weblate (Chinese (Simplified))
Currently translated at 98.5% (400 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-04-12 10:14:46 +02:00
Anonymous
f29e96758c Translated using Weblate (Russian)
Currently translated at 11.8% (48 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2023-04-12 10:14:45 +02:00
Anonymous
99e889b3cb Translated using Weblate (Portuguese)
Currently translated at 97.2% (395 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-04-12 10:14:45 +02:00
Anonymous
4d25cd2580 Translated using Weblate (French)
Currently translated at 99.2% (403 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-04-12 10:14:45 +02:00
Anonymous
488e1349d8 Translated using Weblate (Spanish)
Currently translated at 99.2% (403 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-04-12 10:14:44 +02:00
Anonymous
2f9cbe657a Translated using Weblate (German)
Currently translated at 89.4% (363 of 406 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2023-04-12 10:14:44 +02:00
shamoon
4367319478 Merge pull request #1350 from hen-ter/homeassistant-widget
Added homeassistant widget
2023-04-12 01:14:04 -07:00
shamoon
352b4146f7 homeassistant widget minor code cleanup / changes
- limit to 4 blocks
- allow container to handle field filtering
2023-04-12 01:06:48 -07:00
henter
59448b7277 Added homeassistant widget 2023-04-11 20:54:13 +02:00
shamoon
dacb038126 Further widget validation cleanup 2023-04-11 11:15:08 -07:00
shamoon
a83d105764 Cleanup data validation 2023-04-11 11:05:30 -07:00
Milo Ivir
8476b97f7d Translated using Weblate (Croatian)
Currently translated at 100.0% (403 of 403 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-04-10 10:01:36 +02:00
Milo Ivir
d0905b9c44 Translated using Weblate (Croatian)
Currently translated at 71.4% (288 of 403 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2023-04-09 15:25:32 +02:00
shamoon
0ae13d8ed3 Merge pull request #1335 from benphelps/5th-column-setting
Move 5th column behind setting
2023-04-07 22:42:42 -07:00
shamoon
91646888cd Move 5th column behind setting 2023-04-07 22:35:42 -07:00
shamoon
0416f53c04 Update group.jsx 2023-04-07 22:28:19 -07:00
shamoon
6dcec48669 Merge pull request #1334 from benphelps/feature-stats-control
Feature: Global & per-service docker stats control
2023-04-07 21:55:17 -07:00
shamoon
7e012993d8 Support per-service stats control 2023-04-07 21:34:33 -07:00
G. Petrakis
1a374dec3c Translated using Weblate (Greek)
Currently translated at 27.2% (110 of 403 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-04-08 04:49:31 +02:00
Felipe Nogueira
e6dd4f20a3 Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.0% (395 of 403 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2023-04-08 04:49:30 +02:00
zxb0303
336aa26263 Translated using Weblate (Chinese (Simplified))
Currently translated at 99.2% (400 of 403 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2023-04-08 04:49:30 +02:00
Felipe Nogueira
fc05808fb2 Translated using Weblate (Portuguese)
Currently translated at 98.0% (395 of 403 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2023-04-08 04:49:30 +02:00
David Tornero
612d533a38 Translated using Weblate (Spanish)
Currently translated at 100.0% (403 of 403 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-04-08 04:49:29 +02:00
shamoon
7aa496f66f Update item.jsx 2023-04-06 21:53:49 -07:00
shamoon
48224f89a4 Allow show docker stats by default 2023-04-06 20:38:39 -07:00
shamoon
e4788cc7f6 Fix widget option boolean parsing with docker labels 2023-04-06 20:18:06 -07:00
shamoon
4824ed1a2c Fix data buffer parsing error 2023-04-06 07:03:06 -07:00
shamoon
cd95c93e68 Increase breakpoint for 5 columns 2023-04-05 23:25:08 -07:00
shamoon
379d2e59f1 preserve swr mutate 2023-04-05 22:45:27 -07:00
shamoon
64b43871c6 Try to fix false data parse errors 2023-04-05 22:17:52 -07:00
shamoon
5c84b90634 Rename discussion template 2023-04-05 16:19:27 -07:00
shamoon
4e138e3d0f Move FR template to discussion ,add config 2023-04-05 16:13:22 -07:00
Anonymous
8b38f12452 Translated using Weblate (Greek)
Currently translated at 100.0% (0 of 0 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/
2023-04-05 21:34:11 +02:00
Przemek
b3ea7b816d Translated using Weblate (Polish)
Currently translated at 72.2% (291 of 403 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2023-04-05 21:33:57 +02:00
Juan Manuel Bennàssar Carretero
1bec7897f0 Translated using Weblate (Catalan)
Currently translated at 64.0% (258 of 403 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2023-04-05 21:33:56 +02:00
Nonoss117
98422a0727 Translated using Weblate (French)
Currently translated at 99.5% (401 of 403 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2023-04-05 21:33:56 +02:00
David Tornero
57c145c3d2 Translated using Weblate (Spanish)
Currently translated at 100.0% (403 of 403 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-04-05 21:33:56 +02:00
Juan Manuel Bennàssar Carretero
43233cf446 Translated using Weblate (Spanish)
Currently translated at 100.0% (403 of 403 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2023-04-05 21:33:55 +02:00
G. Petrakis
187df778bf Added translation using Weblate (Greek) 2023-04-05 21:32:53 +02:00
shamoon
d7dc328cdc Merge pull request #1191 from benphelps/feature/987
Add 5th column for 2xl screens
2023-04-05 08:54:41 -07:00
shamoon
066995702b Add 5th column for 2xl screens 2023-04-05 08:53:28 -07:00
shamoon
777c78363d Merge pull request #1187 from benphelps/fix-576-final
True fix for settings revert after container creation
2023-04-04 23:08:13 -07:00
shamoon
6701e3bd77 Use HOMEPAGE_BUILDTIME to revalidate container restart/recreate 2023-04-04 22:55:26 -07:00
shamoon
a42c50f1cc fix emby widget options interpolation 2023-04-04 19:08:52 -07:00
shamoon
2fbe4e5f24 Update cputemp.jsx 2023-04-04 17:05:22 -07:00
shamoon
a0fa6367ca Merge pull request #1161 from MrLemur/add-traefik-ingressroute
Feature: Add Traefik IngressRoute support for Kubernetes
2023-04-04 15:56:38 -07:00
shamoon
8378066bd4 Merge pull request #1182 from benphelps/fix-1181
Fix emby/jellyfin now playing > 1
2023-04-04 15:04:16 -07:00
shamoon
db85193bbf Fix emby/jellyfin now playing > 1 2023-04-04 15:00:09 -07:00
shamoon
364c7ce183 make osx-temperature-sensor optional 2023-04-04 14:27:44 -07:00
shamoon
48180604f9 Fix jellyfin / emby blocks boolean evaluation 2023-04-04 00:55:05 -07:00
shamoon
88089a8a11 Merge pull request #1174 from benphelps/fix-memory-calc
Fix memory display in v0.6.11
2023-04-03 23:29:12 -07:00
shamoon
2829f0b649 Update memory.jsx 2023-04-03 23:22:28 -07:00
shamoon
0d5856db1e Merge pull request #1172 from benphelps/cpu-temp-fixes
Fix glances cpu temp detection & fahrenheit conversion
2023-04-03 21:50:23 -07:00
shamoon
f3ec238a2c Fix glances cpu temp detection & fahrenheit conversion 2023-04-03 21:49:28 -07:00
Kassim Benhaddad
df714c7556 feat: add Traefik IngressRoute support for k8s 2023-03-29 23:19:56 +01:00
164 changed files with 3047 additions and 596 deletions

View File

@@ -1,5 +1,3 @@
name: Feature request
description: Suggest an idea for this project
title: "[Feature Request] " title: "[Feature Request] "
labels: ["enhancement"] labels: ["enhancement"]
body: body:

11
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1,11 @@
blank_issues_enabled: false
contact_links:
- name: 🤔 Questions and Help
url: https://github.com/benphelps/homepage/discussions
about: This issue tracker is for bugs only, not general support questions. Please refer to our Discussions.
- name: 💬 Chat
url: https://discord.gg/k4ruYNrudu
about: Want to discuss homepage with others? Check out our chat.
- name: 🚀 Feature Request
url: https://github.com/benphelps/homepage/discussions/new?category=feature-requests
about: Remember to search for existing feature requests and "up-vote" any you like

View File

@@ -31,6 +31,9 @@ Homepage includes a lot of configuration options and is often deploying in large
People *love* thorough bug reports. I'm not even kidding. People *love* thorough bug reports. I'm not even kidding.
## Development Guidelines
Please see the [documentation regarding development](https://gethomepage.dev/en/more/development/) and specifically the [guidelines for new service widgets](https://gethomepage.dev/en/more/development/#service-widget-guidelines) if you are considering making one.
## Use a Consistent Coding Style ## Use a Consistent Coding Style
This project follows the [Airbnb JavaScript Style Guide](https://github.com/airbnb/javascript), please follow it when submitting pull requests. This project follows the [Airbnb JavaScript Style Guide](https://github.com/airbnb/javascript), please follow it when submitting pull requests.

View File

@@ -29,7 +29,7 @@ COPY . .
SHELL ["/bin/ash", "-xeo", "pipefail", "-c"] SHELL ["/bin/ash", "-xeo", "pipefail", "-c"]
RUN npm run telemetry \ RUN npm run telemetry \
&& mkdir config && echo '---' > config/settings.yaml \ && mkdir config \
&& NEXT_PUBLIC_BUILDTIME=$BUILDTIME NEXT_PUBLIC_VERSION=$VERSION NEXT_PUBLIC_REVISION=$REVISION npm run build && NEXT_PUBLIC_BUILDTIME=$BUILDTIME NEXT_PUBLIC_VERSION=$VERSION NEXT_PUBLIC_REVISION=$REVISION npm run build
# Production image, copy all the files and run next # Production image, copy all the files and run next

View File

@@ -10,6 +10,8 @@ export PGID=${PGID:-0}
# while also supporting the lscr.io /config directory # while also supporting the lscr.io /config directory
[ ! -d "/app/config" ] && ln -s /config /app/config [ ! -d "/app/config" ] && ln -s /config /app/config
export HOMEPAGE_BUILDTIME=$(date +%s)
# Set privileges for /app but only if pid 1 user is root and we are dropping privileges. # Set privileges for /app but only if pid 1 user is root and we are dropping privileges.
# If container is run as an unprivileged user, it means owner already handled ownership setup on their own. # If container is run as an unprivileged user, it means owner already handled ownership setup on their own.
# Running chown in that case (as non-root) will cause error # Running chown in that case (as non-root) will cause error

6
package-lock.json generated
View File

@@ -21,7 +21,7 @@
"minecraft-ping-js": "^1.0.2", "minecraft-ping-js": "^1.0.2",
"next": "^12.3.1", "next": "^12.3.1",
"next-i18next": "^12.0.1", "next-i18next": "^12.0.1",
"osx-temperature-sensor": "^1.0.8", "osx-temperature-sensor": "*",
"pretty-bytes": "^6.0.0", "pretty-bytes": "^6.0.0",
"raw-body": "^2.5.1", "raw-body": "^2.5.1",
"react": "^18.2.0", "react": "^18.2.0",
@@ -52,6 +52,9 @@
"tailwind-scrollbar": "^2.0.1", "tailwind-scrollbar": "^2.0.1",
"tailwindcss": "^3.1.8", "tailwindcss": "^3.1.8",
"typescript": "^4.8.3" "typescript": "^4.8.3"
},
"optionalDependencies": {
"osx-temperature-sensor": "^1.0.8"
} }
}, },
"node_modules/@babel/runtime": { "node_modules/@babel/runtime": {
@@ -4034,6 +4037,7 @@
"resolved": "https://registry.npmjs.org/osx-temperature-sensor/-/osx-temperature-sensor-1.0.8.tgz", "resolved": "https://registry.npmjs.org/osx-temperature-sensor/-/osx-temperature-sensor-1.0.8.tgz",
"integrity": "sha512-Gl3b+bn7+oDDnqPa+4v/cg3yg9lnE8ppS7ivL3opBZh4i7h99JNmkm6zWmo0m2a83UUJu+C9D7lGP0OS8IlehA==", "integrity": "sha512-Gl3b+bn7+oDDnqPa+4v/cg3yg9lnE8ppS7ivL3opBZh4i7h99JNmkm6zWmo0m2a83UUJu+C9D7lGP0OS8IlehA==",
"hasInstallScript": true, "hasInstallScript": true,
"optional": true,
"os": [ "os": [
"darwin" "darwin"
], ],

View File

@@ -23,7 +23,6 @@
"minecraft-ping-js": "^1.0.2", "minecraft-ping-js": "^1.0.2",
"next": "^12.3.1", "next": "^12.3.1",
"next-i18next": "^12.0.1", "next-i18next": "^12.0.1",
"osx-temperature-sensor": "^1.0.8",
"pretty-bytes": "^6.0.0", "pretty-bytes": "^6.0.0",
"raw-body": "^2.5.1", "raw-body": "^2.5.1",
"react": "^18.2.0", "react": "^18.2.0",
@@ -54,5 +53,8 @@
"tailwind-scrollbar": "^2.0.1", "tailwind-scrollbar": "^2.0.1",
"tailwindcss": "^3.1.8", "tailwindcss": "^3.1.8",
"typescript": "^4.8.3" "typescript": "^4.8.3"
},
"optionalDependencies": {
"osx-temperature-sensor": "^1.0.8"
} }
} }

14
pnpm-lock.yaml generated
View File

@@ -40,9 +40,6 @@ dependencies:
next-i18next: next-i18next:
specifier: ^12.0.1 specifier: ^12.0.1
version: 12.1.0(next@12.3.4)(react-dom@18.2.0)(react@18.2.0) version: 12.1.0(next@12.3.4)(react-dom@18.2.0)(react@18.2.0)
osx-temperature-sensor:
specifier: ^1.0.8
version: 1.0.8
pretty-bytes: pretty-bytes:
specifier: ^6.0.0 specifier: ^6.0.0
version: 6.1.0 version: 6.1.0
@@ -80,6 +77,11 @@ dependencies:
specifier: ^1.6.11 specifier: ^1.6.11
version: 1.6.11 version: 1.6.11
optionalDependencies:
osx-temperature-sensor:
specifier: ^1.0.8
version: 1.0.8
devDependencies: devDependencies:
'@tailwindcss/forms': '@tailwindcss/forms':
specifier: ^0.5.3 specifier: ^0.5.3
@@ -645,6 +647,7 @@ packages:
/autoprefixer@10.4.14(postcss@8.4.21): /autoprefixer@10.4.14(postcss@8.4.21):
resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==}
engines: {node: ^10 || ^12 || >=14} engines: {node: ^10 || ^12 || >=14}
hasBin: true
peerDependencies: peerDependencies:
postcss: ^8.1.0 postcss: ^8.1.0
dependencies: dependencies:
@@ -1221,6 +1224,7 @@ packages:
/eslint-config-prettier@8.8.0(eslint@8.37.0): /eslint-config-prettier@8.8.0(eslint@8.37.0):
resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==} resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==}
hasBin: true
peerDependencies: peerDependencies:
eslint: '>=7.0.0' eslint: '>=7.0.0'
dependencies: dependencies:
@@ -2374,6 +2378,7 @@ packages:
/next@12.3.4(react-dom@18.2.0)(react@18.2.0): /next@12.3.4(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-VcyMJUtLZBGzLKo3oMxrEF0stxh8HwuW976pAzlHhI3t8qJ4SROjCrSh1T24bhrbjw55wfZXAbXPGwPt5FLRfQ==} resolution: {integrity: sha512-VcyMJUtLZBGzLKo3oMxrEF0stxh8HwuW976pAzlHhI3t8qJ4SROjCrSh1T24bhrbjw55wfZXAbXPGwPt5FLRfQ==}
engines: {node: '>=12.22.0'} engines: {node: '>=12.22.0'}
hasBin: true
peerDependencies: peerDependencies:
fibers: '>= 3.1.0' fibers: '>= 3.1.0'
node-sass: ^6.0.0 || ^7.0.0 node-sass: ^6.0.0 || ^7.0.0
@@ -2574,6 +2579,7 @@ packages:
os: [darwin] os: [darwin]
requiresBuild: true requiresBuild: true
dev: false dev: false
optional: true
/p-limit@3.1.0: /p-limit@3.1.0:
resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
@@ -3229,6 +3235,7 @@ packages:
/tailwindcss@3.3.0(postcss@8.4.21): /tailwindcss@3.3.0(postcss@8.4.21):
resolution: {integrity: sha512-hOXlFx+YcklJ8kXiCAfk/FMyr4Pm9ck477G0m/us2344Vuj355IpoEDB5UmGAsSpTBmr+4ZhjzW04JuFXkb/fw==} resolution: {integrity: sha512-hOXlFx+YcklJ8kXiCAfk/FMyr4Pm9ck477G0m/us2344Vuj355IpoEDB5UmGAsSpTBmr+4ZhjzW04JuFXkb/fw==}
engines: {node: '>=12.13.0'} engines: {node: '>=12.13.0'}
hasBin: true
peerDependencies: peerDependencies:
postcss: ^8.0.9 postcss: ^8.0.9
dependencies: dependencies:
@@ -3450,6 +3457,7 @@ packages:
/update-browserslist-db@1.0.10(browserslist@4.21.5): /update-browserslist-db@1.0.10(browserslist@4.21.5):
resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==}
hasBin: true
peerDependencies: peerDependencies:
browserslist: '>= 4.21.0' browserslist: '>= 4.21.0'
dependencies: dependencies:

View File

@@ -151,7 +151,8 @@
"plex": { "plex": {
"streams": "Active Streams", "streams": "Active Streams",
"movies": "أفلام", "movies": "أفلام",
"tv": "مسلسلات" "tv": "مسلسلات",
"albums": "Albums"
}, },
"sabnzbd": { "sabnzbd": {
"rate": "معدل", "rate": "معدل",
@@ -562,5 +563,24 @@
"books": "Books", "books": "Books",
"podcastsDuration": "Duration", "podcastsDuration": "Duration",
"booksDuration": "Duration" "booksDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"scheduled": "Scheduled",
"passes": "Passes",
"shows": "Shows",
"recordings": "Recordings"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -99,7 +99,8 @@
"plex": { "plex": {
"streams": "Активни Потоци", "streams": "Активни Потоци",
"movies": "Филми", "movies": "Филми",
"tv": "Сериали" "tv": "Сериали",
"albums": "Albums"
}, },
"transmission": { "transmission": {
"download": "Сваляне", "download": "Сваляне",
@@ -562,5 +563,24 @@
"books": "Books", "books": "Books",
"podcastsDuration": "Duration", "podcastsDuration": "Duration",
"booksDuration": "Duration" "booksDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -183,7 +183,7 @@
"qbittorrent": { "qbittorrent": {
"download": "Descàrrega", "download": "Descàrrega",
"upload": "Pujada", "upload": "Pujada",
"leech": "Company", "leech": "Clients",
"seed": "Llavors" "seed": "Llavors"
}, },
"mastodon": { "mastodon": {
@@ -228,7 +228,8 @@
"plex": { "plex": {
"streams": "Transmissions actives", "streams": "Transmissions actives",
"movies": "Pel·lícules", "movies": "Pel·lícules",
"tv": "Programes de TV" "tv": "Sèries",
"albums": "Àlbums"
}, },
"glances": { "glances": {
"cpu": "Processador", "cpu": "Processador",
@@ -562,5 +563,24 @@
"books": "Books", "books": "Books",
"podcastsDuration": "Duration", "podcastsDuration": "Duration",
"booksDuration": "Duration" "booksDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Supervisió",
"updates": "Actualitzacions"
} }
} }

View File

@@ -105,7 +105,8 @@
"plex": { "plex": {
"streams": "Aktivní streamy", "streams": "Aktivní streamy",
"movies": "Filmy", "movies": "Filmy",
"tv": "Seriály" "tv": "Seriály",
"albums": "Albums"
}, },
"sabnzbd": { "sabnzbd": {
"rate": "Rychlost", "rate": "Rychlost",
@@ -562,5 +563,24 @@
"books": "Knihy", "books": "Knihy",
"podcastsDuration": "Trvání", "podcastsDuration": "Trvání",
"booksDuration": "Trvání" "booksDuration": "Trvání"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -2,7 +2,8 @@
"plex": { "plex": {
"movies": "Film", "movies": "Film",
"tv": "TV-Shows", "tv": "TV-Shows",
"streams": "Aktive Streams" "streams": "Aktive Streams",
"albums": "Albums"
}, },
"radarr": { "radarr": {
"queued": "I Kø", "queued": "I Kø",
@@ -562,5 +563,24 @@
"podcasts": "Podcasts", "podcasts": "Podcasts",
"books": "Books", "books": "Books",
"podcastsDuration": "Duration" "podcastsDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -228,7 +228,8 @@
"plex": { "plex": {
"streams": "Aktive Streams", "streams": "Aktive Streams",
"movies": "Filme", "movies": "Filme",
"tv": "TV Sendungen" "tv": "TV Sendungen",
"albums": "Albums"
}, },
"glances": { "glances": {
"cpu": "Prozessor", "cpu": "Prozessor",
@@ -562,5 +563,24 @@
"books": "Books", "books": "Books",
"podcastsDuration": "Duration", "podcastsDuration": "Duration",
"booksDuration": "Duration" "booksDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -0,0 +1,586 @@
{
"resources": {
"used": "χρησιμοποιημένο",
"load": "Φόρτωση",
"cpu": "CPU",
"mem": "MEM",
"temp": "ΘΕΡΜΟΚΡΑΣΪΑ",
"total": "Σύνολο",
"free": "Δωρεάν",
"max": "Μέγιστο",
"uptime": "ΠΑΝΩ",
"months": "mo",
"days": "d",
"hours": "h",
"minutes": "m"
},
"omada": {
"activeUser": "Ενεργές συσκευές",
"alerts": "Ειδοποιήσεις",
"connectedAp": "Συνδεδεμένα APs",
"connectedGateway": "Συνδεδεμένα gateways",
"connectedSwitches": "Συνδεδεμένα switches"
},
"wmo": {
"0-night": "Clear",
"65-day": "Heavy Rain",
"65-night": "Heavy Rain",
"0-day": "Sunny",
"1-day": "Mainly Sunny",
"1-night": "Mainly Clear",
"2-day": "Partly Cloudy",
"2-night": "Partly Cloudy",
"3-day": "Cloudy",
"3-night": "Cloudy",
"45-day": "Foggy",
"45-night": "Foggy",
"48-day": "Foggy",
"48-night": "Foggy",
"51-day": "Light Drizzle",
"51-night": "Light Drizzle",
"53-day": "Drizzle",
"53-night": "Drizzle",
"55-day": "Heavy Drizzle",
"55-night": "Heavy Drizzle",
"56-day": "Light Freezing Drizzle",
"56-night": "Light Freezing Drizzle",
"57-day": "Freezing Drizzle",
"57-night": "Freezing Drizzle",
"61-day": "Light Rain",
"61-night": "Light Rain",
"63-day": "Rain",
"63-night": "Rain",
"66-day": "Freezing Rain",
"66-night": "Freezing Rain",
"67-day": "Freezing Rain",
"67-night": "Freezing Rain",
"71-day": "Light Snow",
"71-night": "Light Snow",
"73-day": "Snow",
"73-night": "Snow",
"75-day": "Heavy Snow",
"75-night": "Heavy Snow",
"77-day": "Snow Grains",
"77-night": "Snow Grains",
"80-day": "Light Showers",
"80-night": "Light Showers",
"81-day": "Showers",
"81-night": "Showers",
"82-day": "Heavy Showers",
"82-night": "Heavy Showers",
"85-day": "Snow Showers",
"85-night": "Snow Showers",
"86-day": "Snow Showers",
"86-night": "Snow Showers",
"95-day": "Thunderstorm",
"95-night": "Thunderstorm",
"96-day": "Thunderstorm With Hail",
"96-night": "Thunderstorm With Hail",
"99-day": "Thunderstorm With Hail",
"99-night": "Thunderstorm With Hail"
},
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"widget": {
"missing_type": "Λείπει ο τύπος widget: {{type}}",
"api_error": "Σφάλμα API",
"information": "Πληροφορία",
"status": "Κατάσταση",
"url": "URL",
"raw_error": "Ανεπεξέργαστο σφάλμα",
"response_data": "Δεδομένα απόκρισης"
},
"weather": {
"current": "Τωρινή τοποθεσία",
"allow": "Κάντε κλικ για να επιτρέψετε",
"updating": "Ενημέρωση",
"wait": "Παρακαλώ περιμένετε"
},
"search": {
"placeholder": "Αναζήτηση…"
},
"unifi": {
"users": "Χρήστες",
"uptime": "Χρόνος λειτουργίας συστήματος",
"days": "Ημέρες",
"wan": "WAN",
"lan": "LAN",
"wlan": "WLAN",
"devices": "Συσκευές",
"lan_devices": "LAN Συσκευές",
"wlan_devices": "WLAN Συσκευές",
"lan_users": "LAN Χρήστες",
"wlan_users": "WLAN Χρήστες",
"up": "ΠΑΝΩ",
"down": "ΚΑΤΩ",
"wait": "Παρακαλώ περιμένετε",
"empty_data": "Άγνωστη κατάσταση υποσυστήματος"
},
"docker": {
"rx": "RX",
"tx": "TX",
"mem": "MEM",
"cpu": "CPU",
"running": "Τρέχων",
"offline": "Εκτός σύνδεσης",
"error": "Σφάλμα",
"unknown": "Άγνωστο",
"healthy": "Υγειές",
"exited": "Έκλεισε",
"starting": "Ξεκινάει",
"partial": "Μερικό",
"unhealthy": "Άρρωστο",
"not_found": "Δεν βρέθηκε"
},
"ping": {
"error": "Σφάλμα",
"ping": "Ping"
},
"emby": {
"playing": "Παίζει",
"transcoding": "Διακωδικοποίηση",
"bitrate": "Ρυθμός bit",
"no_active": "Δεν υπάρχουν ενεργές ροές",
"movies": "Ταινίες",
"series": "Σειρές",
"episodes": "Επεισόδια",
"songs": "Τραγούδια"
},
"flood": {
"download": "Κατέβασμα",
"upload": "Ανέβασμα",
"leech": "Αφαίμαξη",
"seed": "Σπείρε"
},
"changedetectionio": {
"totalObserved": "Συνολικά παρατηρηθείσα",
"diffsDetected": "Εντοπίστηκαν διαφορές"
},
"tautulli": {
"playing": "Παίζει",
"transcoding": "Διακωδικοποίηση",
"bitrate": "Ρυθμός bit",
"no_active": "Δεν υπάρχουν ενεργές ροές"
},
"nzbget": {
"rate": "βαθμός",
"remaining": "Υπόλοιπο",
"downloaded": "Κατεβασμένο"
},
"plex": {
"streams": "Ενεργά Streams",
"movies": "Ταινίες",
"tv": "Σειρές",
"albums": "Albums"
},
"sabnzbd": {
"rate": "Βαθμός",
"queue": "Ουρά",
"timeleft": "Χρόνος που απομένει"
},
"rutorrent": {
"active": "Ενεργό",
"upload": "Ανέβασμα",
"download": "Κατέβασμα"
},
"transmission": {
"download": "Κατέβασμα",
"upload": "Ανέβασμα",
"leech": "Leech",
"seed": "Seed"
},
"qbittorrent": {
"download": "Κατέβασμα",
"upload": "Ανέβασμα",
"leech": "Leech",
"seed": "Seed"
},
"deluge": {
"download": "Κατέβασμα",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"sonarr": {
"series": "Series",
"wanted": "Wanted",
"queued": "Queued"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"radarr": {
"wanted": "Wanted",
"missing": "Missing",
"queued": "Queued",
"movies": "Movies"
},
"lidarr": {
"wanted": "Wanted",
"queued": "Queued",
"albums": "Albums"
},
"readarr": {
"wanted": "Wanted",
"queued": "Queued",
"books": "Books"
},
"bazarr": {
"missingEpisodes": "Missing Episodes",
"missingMovies": "Missing Movies"
},
"ombi": {
"pending": "Pending",
"approved": "Approved",
"available": "Available"
},
"jellyseerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available"
},
"overseerr": {
"pending": "Pending",
"processing": "Processing",
"approved": "Approved",
"available": "Available"
},
"pihole": {
"queries": "Queries",
"blocked": "Blocked",
"gravity": "Gravity"
},
"adguard": {
"queries": "Queries",
"blocked": "Blocked",
"filtered": "Filtered",
"latency": "Latency"
},
"speedtest": {
"upload": "Upload",
"download": "Download",
"ping": "Ping"
},
"portainer": {
"running": "Running",
"stopped": "Stopped",
"total": "Total"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
},
"traefik": {
"routers": "Routers",
"services": "Services",
"middleware": "Middleware"
},
"navidrome": {
"nothing_streaming": "No Active Streams",
"please_wait": "Please Wait"
},
"npm": {
"enabled": "Enabled",
"disabled": "Disabled",
"total": "Total"
},
"coinmarketcap": {
"configure": "Configure one or more crypto currencies to track",
"1hour": "1 Hour",
"1day": "1 Day",
"7days": "7 Days",
"30days": "30 Days"
},
"gotify": {
"apps": "Applications",
"clients": "Clients",
"messages": "Messages"
},
"prowlarr": {
"enableIndexers": "Indexers",
"numberOfGrabs": "Grabs",
"numberOfQueries": "Queries",
"numberOfFailGrabs": "Fail Grabs",
"numberOfFailQueries": "Fail Queries"
},
"strelaysrv": {
"numActiveSessions": "Sessions",
"numConnections": "Connections",
"dataRelayed": "Relayed",
"transferRate": "Rate"
},
"jackett": {
"configured": "Configured",
"errored": "Errored"
},
"mastodon": {
"user_count": "Users",
"status_count": "Posts",
"domain_count": "Domains"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"minecraft": {
"players": "Players",
"version": "Version",
"down": "Offline",
"status": "Status",
"up": "Online"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
},
"authentik": {
"users": "Users",
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)"
},
"proxmox": {
"mem": "MEM",
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait",
"temp": "TEMP",
"uptime": "UP",
"days": "d",
"hours": "h"
},
"quicklaunch": {
"bookmark": "Bookmark",
"service": "Service",
"search": "Search",
"custom": "Custom",
"visit": "Visit",
"url": "URL"
},
"homebridge": {
"available_update": "System",
"updates": "Updates",
"update_available": "Update Available",
"up_to_date": "Up to Date",
"child_bridges": "Child Bridges",
"child_bridges_status": "{{ok}}/{{total}}",
"up": "Up",
"pending": "Pending",
"down": "Down"
},
"healthchecks": {
"new": "New",
"up": "Online",
"grace": "In Grace Period",
"down": "Offline",
"paused": "Paused",
"status": "Status",
"last_ping": "Last Ping",
"never": "No pings yet"
},
"watchtower": {
"containers_scanned": "Scanned",
"containers_updated": "Updated",
"containers_failed": "Failed"
},
"autobrr": {
"approvedPushes": "Approved",
"rejectedPushes": "Rejected",
"filters": "Filters",
"indexers": "Indexers"
},
"tubearchivist": {
"downloads": "Queue",
"videos": "Videos",
"channels": "Channels",
"playlists": "Playlists"
},
"truenas": {
"load": "System Load",
"uptime": "Uptime",
"alerts": "Alerts",
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
},
"pyload": {
"speed": "Speed",
"active": "Active",
"queue": "Queue",
"total": "Total"
},
"gluetun": {
"public_ip": "Public IP",
"region": "Region",
"country": "Country"
},
"hdhomerun": {
"channels": "Channels",
"hd": "HD"
},
"scrutiny": {
"passed": "Passed",
"failed": "Failed",
"unknown": "Unknown"
},
"paperlessngx": {
"inbox": "Inbox",
"total": "Total"
},
"nextdns": {
"wait": "Please Wait",
"no_devices": "No Device Data Received"
},
"mikrotik": {
"cpuLoad": "CPU Load",
"memoryUsed": "Memory Used",
"uptime": "Uptime",
"numberOfLeases": "Leases"
},
"xteve": {
"streams_all": "All Streams",
"streams_active": "Active Streams",
"streams_xepg": "XEPG Channels"
},
"opnsense": {
"cpu": "CPU Load",
"memory": "Active Memory",
"wanUpload": "WAN Upload",
"wanDownload": "WAN Download"
},
"moonraker": {
"printer_state": "Printer State",
"print_status": "Print Status",
"print_progress": "Progress",
"layers": "Layers"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
},
"uptimekuma": {
"up": "Sites Up",
"down": "Sites Down",
"uptime": "Uptime",
"incident": "Incident",
"m": "m"
},
"komga": {
"libraries": "Libraries",
"series": "Series",
"books": "Books"
},
"diskstation": {
"days": "Days",
"uptime": "Uptime",
"volumeAvailable": "Available"
},
"mylar": {
"series": "Series",
"issues": "Issues",
"wanted": "Wanted"
},
"photoprism": {
"albums": "Albums",
"photos": "Photos",
"videos": "Videos",
"people": "People"
},
"fileflows": {
"processed": "Processed",
"queue": "Queue",
"processing": "Processing",
"time": "Time"
},
"grafana": {
"dashboards": "Dashboards",
"datasources": "Data Sources",
"totalalerts": "Total Alerts",
"alertstriggered": "Alerts Triggered"
},
"nextcloud": {
"cpuload": "Cpu Load",
"memoryusage": "Memory Usage",
"freespace": "Free Space",
"activeusers": "Active Users"
},
"kopia": {
"status": "Status",
"size": "Size",
"lastrun": "Last Run",
"nextrun": "Next Run",
"failed": "Failed"
},
"unmanic": {
"active_workers": "Active Workers",
"total_workers": "Total Workers",
"records_total": "Queue Length"
},
"pterodactyl": {
"servers": "Servers",
"nodes": "Nodes"
},
"prometheus": {
"targets_up": "Targets Up",
"targets_down": "Targets Down",
"targets_total": "Total Targets"
},
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "One year",
"gross_percent_max": "All time"
},
"audiobookshelf": {
"podcasts": "Podcasts",
"books": "Books",
"podcastsDuration": "Duration",
"booksDuration": "Διάρκεια"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
}
}

View File

@@ -98,10 +98,20 @@
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"changedetectionio": { "changedetectionio": {
"totalObserved": "Total Observed", "totalObserved": "Total Observed",
"diffsDetected": "Diffs Detected" "diffsDetected": "Diffs Detected"
}, },
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"tautulli": { "tautulli": {
"playing": "Playing", "playing": "Playing",
"transcoding": "Transcoding", "transcoding": "Transcoding",
@@ -122,6 +132,7 @@
}, },
"plex": { "plex": {
"streams": "Active Streams", "streams": "Active Streams",
"albums": "Albums",
"movies": "Movies", "movies": "Movies",
"tv": "TV Shows" "tv": "TV Shows"
}, },
@@ -571,5 +582,14 @@
"books": "Books", "books": "Books",
"podcastsDuration": "Duration", "podcastsDuration": "Duration",
"booksDuration": "Duration" "booksDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -1,18 +1,18 @@
{ {
"widget": { "widget": {
"missing_type": "Missing Widget Type: {{type}}", "missing_type": "Manka Tipo de Fenestraĵo: {{type}}",
"api_error": "API Error", "api_error": "Eraro de API",
"information": "Informo", "information": "Informo",
"status": "Stato", "status": "Stato",
"url": "URL", "url": "URL",
"raw_error": "Raw Error", "raw_error": "Kruda Eraro",
"response_data": "Response Data" "response_data": "Respondoj de Demandoj"
}, },
"weather": { "weather": {
"current": "Aktuala loko", "current": "Aktuala loko",
"allow": "Click to allow", "allow": "Klaku por permesi",
"updating": "Updating", "updating": "Ĝisdatiganta",
"wait": "Please wait" "wait": "Bonvolu atendi"
}, },
"search": { "search": {
"placeholder": "Serĉi…" "placeholder": "Serĉi…"
@@ -26,58 +26,58 @@
"mem": "MEM", "mem": "MEM",
"temp": "TEMP", "temp": "TEMP",
"months": "mo", "months": "mo",
"max": "Max", "max": "Maks",
"uptime": "UP", "uptime": "UP",
"days": "d", "days": "t",
"hours": "h", "hours": "h",
"minutes": "m" "minutes": "m"
}, },
"unifi": { "unifi": {
"users": "Uzantoj", "users": "Uzantoj",
"uptime": "System Uptime", "uptime": "Uptempo de la Sistemo",
"days": "Tagoj", "days": "Tagoj",
"wan": "WAN", "wan": "WAN",
"lan": "LAN", "lan": "LAN",
"wlan": "WLAN", "wlan": "WLAN",
"devices": "Aparatoj", "devices": "Aparatoj",
"lan_devices": "LAN Devices", "lan_devices": "LAN-Aparatoj",
"wlan_devices": "WLAN Devices", "wlan_devices": "WLAN-Aparatoj",
"lan_users": "LAN Users", "lan_users": "LAN-Uzantoj",
"wlan_users": "WLAN Users", "wlan_users": "WLAN-Uzantoj",
"up": "UP", "up": "UP",
"down": "DOWN", "down": "DOWN",
"wait": "Please wait", "wait": "Bonvolu atendi",
"empty_data": "Subsystem status unknown" "empty_data": "Subsistemostatuso nekonata"
}, },
"docker": { "docker": {
"rx": "RX", "rx": "RX",
"tx": "TX", "tx": "TX",
"mem": "Memoro", "mem": "MEM",
"cpu": "Ĉefprocesoro", "cpu": "CPO",
"offline": "Offline", "offline": "Malkonekta",
"error": "Eraro", "error": "Eraro",
"unknown": "Nekonata", "unknown": "Nekonata",
"running": "Running", "running": "Rulata",
"starting": "Starting", "starting": "Lanĉante",
"unhealthy": "Unhealthy", "unhealthy": "Malsana",
"not_found": "Not Found", "not_found": "Ne trovita",
"exited": "Exited", "exited": "Eliris",
"partial": "Partial", "partial": "Parta",
"healthy": "Healthy" "healthy": "Sana"
}, },
"ping": { "ping": {
"error": "Eraro", "error": "Eraro",
"ping": "Ping" "ping": "Sondaĵo"
}, },
"emby": { "emby": {
"playing": "Ludante", "playing": "Ludante",
"transcoding": "Transcoding", "transcoding": "Transkodigo",
"bitrate": "Bitrate", "bitrate": "Bitrapido",
"no_active": "No Active Streams", "no_active": "No Active Streams",
"movies": "Movies", "movies": "Filmoj",
"series": "Series", "series": "Serioj",
"episodes": "Episodes", "episodes": "Epizodoj",
"songs": "Songs" "songs": "Kantoj"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "Total Observed", "totalObserved": "Total Observed",
@@ -97,7 +97,8 @@
"plex": { "plex": {
"streams": "Active Streams", "streams": "Active Streams",
"movies": "Filmoj", "movies": "Filmoj",
"tv": "Televidprogramoj" "tv": "Televidprogramoj",
"albums": "Albums"
}, },
"sabnzbd": { "sabnzbd": {
"rate": "Rate", "rate": "Rate",
@@ -382,8 +383,8 @@
"total": "Totalo" "total": "Totalo"
}, },
"flood": { "flood": {
"download": "Download", "download": "Elŝuti",
"upload": "Upload", "upload": "Alŝuti",
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
@@ -562,5 +563,24 @@
"books": "Books", "books": "Books",
"podcastsDuration": "Duration", "podcastsDuration": "Duration",
"booksDuration": "Duration" "booksDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -18,8 +18,8 @@
"load": "Carga", "load": "Carga",
"cpu": "CPU", "cpu": "CPU",
"mem": "MEM", "mem": "MEM",
"temp": "TEMPORAL", "temp": "TEMP",
"max": "Máximo", "max": "Máx.",
"uptime": "ARRIBA", "uptime": "ARRIBA",
"months": "Meses", "months": "Meses",
"days": "Días", "days": "Días",
@@ -118,7 +118,7 @@
"current": "Ubicación actual", "current": "Ubicación actual",
"allow": "Clic para permitir", "allow": "Clic para permitir",
"updating": "Actualizando", "updating": "Actualizando",
"wait": "Espere, por favor" "wait": "Espera, por favor"
}, },
"overseerr": { "overseerr": {
"pending": "Pendiente", "pending": "Pendiente",
@@ -158,7 +158,7 @@
"transmission": { "transmission": {
"download": "Bajada", "download": "Bajada",
"upload": "Subida", "upload": "Subida",
"leech": "Sanguijuela", "leech": "Compañeros",
"seed": "Semillas" "seed": "Semillas"
}, },
"jackett": { "jackett": {
@@ -183,7 +183,7 @@
"qbittorrent": { "qbittorrent": {
"download": "Bajada", "download": "Bajada",
"upload": "Subida", "upload": "Subida",
"leech": "Depender", "leech": "Pares",
"seed": "Semillas" "seed": "Semillas"
}, },
"mastodon": { "mastodon": {
@@ -213,11 +213,11 @@
"users": "Usuarios", "users": "Usuarios",
"uptime": "Tiempo de actividad", "uptime": "Tiempo de actividad",
"days": "Días", "days": "Días",
"wan": "Red WAN", "wan": "WAN",
"lan_users": "Usuarios LAN", "lan_users": "Usuarios LAN",
"wlan_users": "Usuarios WLAN", "wlan_users": "Usuarios WLAN",
"down": "CAÍDO", "down": "CAÍDO",
"wait": "Espere por favor", "wait": "Espera por favor",
"lan": "LAN", "lan": "LAN",
"wlan": "WLAN", "wlan": "WLAN",
"devices": "Dispositivos", "devices": "Dispositivos",
@@ -228,12 +228,13 @@
"plex": { "plex": {
"streams": "Transmisiones activas", "streams": "Transmisiones activas",
"movies": "Películas", "movies": "Películas",
"tv": "Programas de TV" "tv": "Series",
"albums": "Álbumes"
}, },
"glances": { "glances": {
"cpu": "Procesador", "cpu": "Procesador",
"mem": "Memoria", "mem": "Memoria",
"wait": "Espere por favor", "wait": "Espera por favor",
"temp": "TEMPORAL", "temp": "TEMPORAL",
"uptime": "ARRIBA", "uptime": "ARRIBA",
"days": "Días", "days": "Días",
@@ -277,20 +278,20 @@
"66-night": "Granizo", "66-night": "Granizo",
"67-night": "Granizo", "67-night": "Granizo",
"71-day": "Nevada Leve", "71-day": "Nevada Leve",
"71-night": "Nevada Leva", "71-night": "Nevada Leve",
"73-day": "Nevada", "73-day": "Nevada",
"73-night": "Nevada", "73-night": "Nevada",
"75-day": "Fuertes Nevadas", "75-day": "Fuertes Nevadas",
"75-night": "Fuertes Nevadas", "75-night": "Fuertes Nevadas",
"77-day": "Nevada Leve", "77-day": "Nevada Leve",
"77-night": "Nevada Leve", "77-night": "Nevada Leve",
"80-day": "llovizna", "80-day": "Llovizna",
"80-night": "Llovizna", "80-night": "Llovizna",
"81-day": "Lluvia", "81-day": "Lluvia",
"81-night": "Lluvia", "81-night": "Lluvia",
"82-day": "Chubascos", "82-day": "Chubascos",
"82-night": "Chubascos", "82-night": "Chubascos",
"85-day": "Chubascos", "85-day": "Lluvia de nieve",
"85-night": "Lluvia de nieve", "85-night": "Lluvia de nieve",
"86-day": "Lluvia de nieve", "86-day": "Lluvia de nieve",
"86-night": "Lluvia de nieve", "86-night": "Lluvia de nieve",
@@ -378,12 +379,12 @@
"deluge": { "deluge": {
"download": "Descarga", "download": "Descarga",
"upload": "Subida", "upload": "Subida",
"leech": "Depender", "leech": "Compañeros",
"seed": "Semilla" "seed": "Semillas"
}, },
"flood": { "flood": {
"download": "Descargar", "download": "Descarga",
"upload": "Subir", "upload": "Subida",
"leech": "Depender", "leech": "Depender",
"seed": "Semillas" "seed": "Semillas"
}, },
@@ -398,7 +399,7 @@
"unread": "Sin leer" "unread": "Sin leer"
}, },
"nextdns": { "nextdns": {
"wait": "Espere, por favor", "wait": "Espera, por favor",
"no_devices": "No se reciben datos del dispositivo" "no_devices": "No se reciben datos del dispositivo"
}, },
"common": { "common": {
@@ -415,7 +416,7 @@
"downloadstation": { "downloadstation": {
"download": "Descargar", "download": "Descargar",
"upload": "Subir", "upload": "Subir",
"leech": "Sanguijuela", "leech": "Compañeros",
"seed": "Semilla" "seed": "Semilla"
}, },
"mikrotik": { "mikrotik": {
@@ -425,8 +426,8 @@
"numberOfLeases": "Alquileres" "numberOfLeases": "Alquileres"
}, },
"xteve": { "xteve": {
"streams_all": "Todas las corrientes", "streams_all": "Todas las transmisiones",
"streams_active": "Corrientes activas", "streams_active": "Transmisiones activas",
"streams_xepg": "Canales XEPG" "streams_xepg": "Canales XEPG"
}, },
"opnsense": { "opnsense": {
@@ -437,7 +438,7 @@
}, },
"moonraker": { "moonraker": {
"printer_state": "Estado de la impresora", "printer_state": "Estado de la impresora",
"print_status": "Estado de la impresora", "print_status": "Estado de la impresión",
"print_progress": "Progreso", "print_progress": "Progreso",
"layers": "Capas" "layers": "Capas"
}, },
@@ -447,9 +448,9 @@
"series": "Serie" "series": "Serie"
}, },
"octoprint": { "octoprint": {
"temp_bed": "temperatura de la plataforma", "temp_bed": "Temperatura de la plataforma",
"printer_state": "Status", "printer_state": "Estado",
"temp_tool": "Herramienta de temperatura", "temp_tool": "Temperatura de la herramienta",
"job_completion": "Finalización" "job_completion": "Finalización"
}, },
"cloudflared": { "cloudflared": {
@@ -533,7 +534,7 @@
"grace": "En Periodo de Gracia", "grace": "En Periodo de Gracia",
"paused": "Pausado", "paused": "Pausado",
"status": "Estado", "status": "Estado",
"last_ping": "Último Ping", "last_ping": "Último ping",
"never": "Aún no hay pings" "never": "Aún no hay pings"
}, },
"pterodactyl": { "pterodactyl": {
@@ -562,5 +563,24 @@
"books": "Libros", "books": "Libros",
"podcastsDuration": "Duración", "podcastsDuration": "Duración",
"booksDuration": "Duración" "booksDuration": "Duración"
},
"homeassistant": {
"people_home": "Inicio de personas",
"lights_on": "Luces encendidas",
"switches_on": "Encendido"
},
"freshrss": {
"subscriptions": "Suscripciones",
"unread": "Sin leer"
},
"channelsdvrserver": {
"shows": "Espectáculos",
"recordings": "Grabaciones",
"scheduled": "Programado",
"passes": "Pases"
},
"whatsupdocker": {
"monitoring": "Supervisión",
"updates": "Actualizaciones"
} }
} }

View File

@@ -228,7 +228,8 @@
"plex": { "plex": {
"streams": "Active Streams", "streams": "Active Streams",
"movies": "Movies", "movies": "Movies",
"tv": "TV Shows" "tv": "TV Shows",
"albums": "Albums"
}, },
"glances": { "glances": {
"wait": "Please wait", "wait": "Please wait",
@@ -562,5 +563,24 @@
"books": "Books", "books": "Books",
"podcastsDuration": "Duration", "podcastsDuration": "Duration",
"booksDuration": "Duration" "booksDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -24,7 +24,7 @@
"months": "mo", "months": "mo",
"days": "d", "days": "d",
"hours": "h", "hours": "h",
"minutes": "m" "minutes": "mn"
}, },
"docker": { "docker": {
"rx": "Rx", "rx": "Rx",
@@ -228,15 +228,16 @@
"plex": { "plex": {
"streams": "Flux actif", "streams": "Flux actif",
"movies": "Films", "movies": "Films",
"tv": "Séries TV" "tv": "Séries TV",
"albums": "Albums"
}, },
"glances": { "glances": {
"cpu": "Cpu", "cpu": "Cpu",
"mem": "Mém", "mem": "Mém",
"wait": "Merci de patienter", "wait": "Merci de patienter",
"temp": "TEMP", "temp": "Temp",
"uptime": "UP", "uptime": "Up",
"days": "d", "days": "j",
"hours": "h" "hours": "h"
}, },
"changedetectionio": { "changedetectionio": {
@@ -562,5 +563,24 @@
"books": "Livres", "books": "Livres",
"podcastsDuration": "Durée", "podcastsDuration": "Durée",
"booksDuration": "Durée" "booksDuration": "Durée"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lumières allumées",
"switches_on": "Switches On"
},
"freshrss": {
"unread": "Non lu",
"subscriptions": "Abonnements"
},
"channelsdvrserver": {
"shows": "Affichages",
"recordings": "Enregistrements",
"scheduled": "Planifié",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Conteneurs",
"updates": "Mises à jour"
} }
} }

View File

@@ -228,7 +228,8 @@
"plex": { "plex": {
"streams": "Active Streams", "streams": "Active Streams",
"movies": "Movies", "movies": "Movies",
"tv": "TV Shows" "tv": "TV Shows",
"albums": "Albums"
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
@@ -562,5 +563,24 @@
"books": "Books", "books": "Books",
"podcastsDuration": "Duration", "podcastsDuration": "Duration",
"booksDuration": "Duration" "booksDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -127,7 +127,8 @@
"plex": { "plex": {
"streams": "Active Streams", "streams": "Active Streams",
"movies": "Movies", "movies": "Movies",
"tv": "TV Shows" "tv": "TV Shows",
"albums": "Albums"
}, },
"sabnzbd": { "sabnzbd": {
"rate": "Rate", "rate": "Rate",
@@ -562,5 +563,24 @@
"books": "Books", "books": "Books",
"podcastsDuration": "Duration", "podcastsDuration": "Duration",
"booksDuration": "Duration" "booksDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -15,10 +15,10 @@
"load": "Opterećenje", "load": "Opterećenje",
"cpu": "CPU", "cpu": "CPU",
"mem": "MEM", "mem": "MEM",
"minutes": "m", "minutes": "min",
"max": "Max", "max": "Maks",
"uptime": "UP", "uptime": "UP",
"months": "mo", "months": "mj",
"temp": "TEMP", "temp": "TEMP",
"days": "d", "days": "d",
"hours": "h" "hours": "h"
@@ -37,7 +37,7 @@
"pihole": { "pihole": {
"queries": "Upiti", "queries": "Upiti",
"blocked": "Blokirano", "blocked": "Blokirano",
"gravity": "Čuvanje podataka" "gravity": "Gravity"
}, },
"adguard": { "adguard": {
"latency": "Kašnjenje", "latency": "Kašnjenje",
@@ -78,26 +78,26 @@
"tx": "TX", "tx": "TX",
"mem": "MEM", "mem": "MEM",
"cpu": "CPU", "cpu": "CPU",
"offline": "Nepovezan", "offline": "Offline",
"error": "Greška", "error": "Greška",
"unknown": "Nepoznato", "unknown": "Nepoznato",
"running": "Running", "running": "Pokrenuto",
"starting": "Starting", "starting": "Pokretanje",
"unhealthy": "Unhealthy", "unhealthy": "Nefunkcionalno",
"not_found": "Not Found", "not_found": "Nepronađeno",
"exited": "Exited", "exited": "Zatoreno",
"partial": "Partial", "partial": "Djelomično",
"healthy": "Healthy" "healthy": "Funkcionalno"
}, },
"emby": { "emby": {
"playing": "Reprodukcija", "playing": "Reprodukcija",
"transcoding": "Prekodiranje", "transcoding": "Prekodiranje",
"bitrate": "Stopa bitova", "bitrate": "Stopa bitova",
"no_active": "Nema aktivnih prijenosa", "no_active": "Nema aktivnih prijenosa",
"movies": "Movies", "movies": "Filmovi",
"series": "Series", "series": "Serije",
"episodes": "Episodes", "episodes": "Epizode",
"songs": "Songs" "songs": "Pjesme"
}, },
"tautulli": { "tautulli": {
"playing": "Reprodukcija", "playing": "Reprodukcija",
@@ -223,12 +223,13 @@
"devices": "Uređaji", "devices": "Uređaji",
"lan_devices": "LAN uređaji", "lan_devices": "LAN uređaji",
"wlan_devices": "WLAN uređaji", "wlan_devices": "WLAN uređaji",
"empty_data": "Subsystem status unknown" "empty_data": "Stanje podsustava nepoznato"
}, },
"plex": { "plex": {
"streams": "Aktivni prijenosi", "streams": "Aktivni prijenosi",
"movies": "Filmovi", "movies": "Filmovi",
"tv": "TV emisije" "tv": "TV emisije",
"albums": "Albumi"
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
@@ -304,9 +305,9 @@
"quicklaunch": { "quicklaunch": {
"bookmark": "Straničnik", "bookmark": "Straničnik",
"service": "Usluga", "service": "Usluga",
"search": "Search", "search": "Traži",
"custom": "Custom", "custom": "Prilagođeno",
"visit": "Visit", "visit": "Posjeti",
"url": "URL" "url": "URL"
}, },
"homebridge": { "homebridge": {
@@ -317,7 +318,7 @@
"child_bridges": "Podređeni mosotvi", "child_bridges": "Podređeni mosotvi",
"child_bridges_status": "{{ok}}/{{total}}", "child_bridges_status": "{{ok}}/{{total}}",
"up": "Up", "up": "Up",
"pending": "Pending", "pending": "Predstoji",
"down": "Down" "down": "Down"
}, },
"autobrr": { "autobrr": {
@@ -367,7 +368,7 @@
"ping": "Ping" "ping": "Ping"
}, },
"scrutiny": { "scrutiny": {
"passed": "Prošlo", "passed": "Uspjelo",
"failed": "Neuspjelo", "failed": "Neuspjelo",
"unknown": "Nepoznato" "unknown": "Nepoznato"
}, },
@@ -399,7 +400,7 @@
}, },
"nextdns": { "nextdns": {
"wait": "Pričekaj", "wait": "Pričekaj",
"no_devices": "Podaci o uređaju nisu primljeni" "no_devices": "Podaci uređaja nisu primljeni"
}, },
"common": { "common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}", "bibyterate": "{{value, rate(bits: false; binary: true)}}",
@@ -436,131 +437,150 @@
"wanDownload": "WAN preuzimanje" "wanDownload": "WAN preuzimanje"
}, },
"moonraker": { "moonraker": {
"printer_state": "Printer State", "printer_state": "Stanje pisača",
"print_status": "Print Status", "print_status": "Stanje ispisa",
"print_progress": "Progress", "print_progress": "Napredak",
"layers": "Layers" "layers": "Slojevi"
}, },
"medusa": { "medusa": {
"wanted": "Wanted", "wanted": "Zatraženo",
"queued": "Queued", "queued": "U redu čekanja",
"series": "Series" "series": "Serije"
}, },
"octoprint": { "octoprint": {
"printer_state": "Status", "printer_state": "Stanje",
"temp_tool": "Tool temp", "temp_tool": "Temperatura alata",
"temp_bed": "Bed temp", "temp_bed": "Temperatura platforme",
"job_completion": "Completion" "job_completion": "Dovršenost"
}, },
"cloudflared": { "cloudflared": {
"origin_ip": "Origin IP", "origin_ip": "IP izvora",
"status": "Status" "status": "Stanje"
}, },
"proxmoxbackupserver": { "proxmoxbackupserver": {
"datastore_usage": "Datastore", "datastore_usage": "Spremište podataka",
"failed_tasks_24h": "Failed Tasks 24h", "failed_tasks_24h": "Neuspjeli zadaci 24 h",
"cpu_usage": "CPU", "cpu_usage": "CPU",
"memory_usage": "Memory" "memory_usage": "Memorija"
}, },
"immich": { "immich": {
"users": "Users", "users": "Korisnici",
"photos": "Photos", "photos": "Fotografije",
"videos": "Videos", "videos": "Videa",
"storage": "Storage" "storage": "Spremište"
}, },
"uptimekuma": { "uptimekuma": {
"up": "Sites Up", "up": "Aktivne stranice",
"down": "Sites Down", "down": "Neaktivne stranice",
"uptime": "Uptime", "uptime": "Radno vrijeme",
"incident": "Incident", "incident": "Incident",
"m": "m" "m": "min"
}, },
"komga": { "komga": {
"libraries": "Libraries", "libraries": "Biblioteke",
"series": "Series", "series": "Serije",
"books": "Books" "books": "Knjige"
}, },
"mylar": { "mylar": {
"series": "Series", "series": "Serije",
"issues": "Issues", "issues": "Problemi",
"wanted": "Wanted" "wanted": "Zatraženo"
}, },
"photoprism": { "photoprism": {
"videos": "Videos", "videos": "Videa",
"albums": "Albums", "albums": "Albumi",
"photos": "Photos", "photos": "Fotografije",
"people": "People" "people": "Osobe"
}, },
"diskstation": { "diskstation": {
"days": "Days", "days": "Dani",
"uptime": "Uptime", "uptime": "Radno vrijeme",
"volumeAvailable": "Available" "volumeAvailable": "Dostupno"
}, },
"fileflows": { "fileflows": {
"queue": "Queue", "queue": "Red čekanja",
"processing": "Processing", "processing": "Obrada",
"processed": "Processed", "processed": "Obrađeno",
"time": "Time" "time": "Vrijeme"
}, },
"grafana": { "grafana": {
"alertstriggered": "Alerts Triggered", "alertstriggered": "Aktivirana upozorenja",
"dashboards": "Dashboards", "dashboards": "Pregledne ploče",
"datasources": "Data Sources", "datasources": "Izvori podataka",
"totalalerts": "Total Alerts" "totalalerts": "Ukupno upozorenja"
}, },
"nextcloud": { "nextcloud": {
"cpuload": "Cpu Load", "cpuload": "Cpu opterećenje",
"memoryusage": "Memory Usage", "memoryusage": "Korištenje memorije",
"freespace": "Free Space", "freespace": "Slobodna memorija",
"activeusers": "Active Users" "activeusers": "Aktivni korisnici"
}, },
"kopia": { "kopia": {
"status": "Status", "status": "Stanje",
"size": "Size", "size": "Veličina",
"lastrun": "Last Run", "lastrun": "Zadnje pokretanje",
"nextrun": "Next Run", "nextrun": "Sljedeće pokretanje",
"failed": "Failed" "failed": "Neuspjelo"
}, },
"unmanic": { "unmanic": {
"active_workers": "Active Workers", "active_workers": "Aktivni radnici",
"total_workers": "Total Workers", "total_workers": "Ukupni radnici",
"records_total": "Queue Length" "records_total": "Količina zapisa u redu čekanja"
}, },
"healthchecks": { "healthchecks": {
"new": "New", "new": "Novo",
"up": "Online", "up": "Online",
"grace": "In Grace Period", "grace": "U razdoblju odgode",
"down": "Offline", "down": "Offline",
"paused": "Paused", "paused": "Zaustavljeno",
"status": "Status", "status": "Stanje",
"last_ping": "Last Ping", "last_ping": "Zadnji ping",
"never": "No pings yet" "never": "Još nema pingova"
}, },
"pterodactyl": { "pterodactyl": {
"servers": "Servers", "servers": "Serveri",
"nodes": "Nodes" "nodes": "Čvorovi"
}, },
"prometheus": { "prometheus": {
"targets_up": "Targets Up", "targets_up": "Aktivni ciljevi",
"targets_down": "Targets Down", "targets_down": "Neaktivni ciljevi",
"targets_total": "Total Targets" "targets_total": "Ukupno ciljeva"
}, },
"minecraft": { "minecraft": {
"players": "Players", "players": "Igrači",
"version": "Version", "version": "Verzija",
"status": "Status", "status": "Stanje",
"up": "Online", "up": "Online",
"down": "Offline" "down": "Offline"
}, },
"ghostfolio": { "ghostfolio": {
"gross_percent_today": "Today", "gross_percent_today": "Danas",
"gross_percent_1y": "One year", "gross_percent_1y": "Jedna godina",
"gross_percent_max": "All time" "gross_percent_max": "Svo vrijeme"
}, },
"audiobookshelf": { "audiobookshelf": {
"podcasts": "Podcasts", "podcasts": "Podcasti",
"books": "Books", "books": "Knjige",
"podcastsDuration": "Duration", "podcastsDuration": "Trajanje",
"booksDuration": "Duration" "booksDuration": "Trajanje"
},
"homeassistant": {
"people_home": "Ljudi doma",
"lights_on": "Upaljena svjetla",
"switches_on": "Prekidači uključeni"
},
"freshrss": {
"subscriptions": "Pretplate",
"unread": "Nepročitano"
},
"channelsdvrserver": {
"scheduled": "Planirano",
"passes": "Prolazi",
"shows": "Emisije",
"recordings": "Snimanja"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Aktualiziranja"
} }
} }

View File

@@ -228,7 +228,8 @@
"plex": { "plex": {
"streams": "Active Streams", "streams": "Active Streams",
"movies": "Movies", "movies": "Movies",
"tv": "TV Shows" "tv": "TV Shows",
"albums": "Albums"
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
@@ -562,5 +563,24 @@
"books": "Books", "books": "Books",
"podcastsDuration": "Duration", "podcastsDuration": "Duration",
"booksDuration": "Duration" "booksDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -228,7 +228,8 @@
"plex": { "plex": {
"streams": "Trasmissioni attive", "streams": "Trasmissioni attive",
"movies": "Film", "movies": "Film",
"tv": "Programma televisivo" "tv": "Programma televisivo",
"albums": "Albums"
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
@@ -562,5 +563,24 @@
"books": "Books", "books": "Books",
"podcastsDuration": "Duration", "podcastsDuration": "Duration",
"booksDuration": "Duration" "booksDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -149,7 +149,8 @@
"plex": { "plex": {
"streams": "Active Streams", "streams": "Active Streams",
"movies": "Movies", "movies": "Movies",
"tv": "TV Shows" "tv": "TV Shows",
"albums": "Albums"
}, },
"sabnzbd": { "sabnzbd": {
"rate": "Rate", "rate": "Rate",
@@ -562,5 +563,24 @@
"books": "Books", "books": "Books",
"podcastsDuration": "Duration", "podcastsDuration": "Duration",
"booksDuration": "Duration" "booksDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -128,7 +128,8 @@
"plex": { "plex": {
"streams": "활성 스트림", "streams": "활성 스트림",
"movies": "영화", "movies": "영화",
"tv": "TV 쇼" "tv": "TV 쇼",
"albums": "Albums"
}, },
"sabnzbd": { "sabnzbd": {
"rate": "비율", "rate": "비율",
@@ -562,5 +563,24 @@
"books": "Books", "books": "Books",
"podcastsDuration": "Duration", "podcastsDuration": "Duration",
"booksDuration": "Duration" "booksDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -114,7 +114,8 @@
"plex": { "plex": {
"streams": "Aktīvās straumes", "streams": "Aktīvās straumes",
"movies": "Filmas", "movies": "Filmas",
"tv": "TV pārraides" "tv": "TV pārraides",
"albums": "Albums"
}, },
"sabnzbd": { "sabnzbd": {
"rate": "Rate", "rate": "Rate",
@@ -562,5 +563,24 @@
"books": "Books", "books": "Books",
"podcastsDuration": "Duration", "podcastsDuration": "Duration",
"booksDuration": "Duration" "booksDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -201,7 +201,8 @@
"plex": { "plex": {
"streams": "Strim Aktif", "streams": "Strim Aktif",
"movies": "Filem", "movies": "Filem",
"tv": "Rancangan TV" "tv": "Rancangan TV",
"albums": "Albums"
}, },
"sabnzbd": { "sabnzbd": {
"rate": "Kadar", "rate": "Kadar",
@@ -562,5 +563,24 @@
"books": "Books", "books": "Books",
"podcastsDuration": "Duration", "podcastsDuration": "Duration",
"booksDuration": "Duration" "booksDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -228,7 +228,8 @@
"plex": { "plex": {
"streams": "Active Streams", "streams": "Active Streams",
"movies": "Movies", "movies": "Movies",
"tv": "TV Shows" "tv": "TV Shows",
"albums": "Albums"
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
@@ -562,5 +563,24 @@
"books": "Books", "books": "Books",
"podcastsDuration": "Duration", "podcastsDuration": "Duration",
"booksDuration": "Duration" "booksDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -228,7 +228,8 @@
"plex": { "plex": {
"streams": "Actieve Streams", "streams": "Actieve Streams",
"movies": "Films", "movies": "Films",
"tv": "TV Series" "tv": "TV Series",
"albums": "Albums"
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
@@ -562,5 +563,24 @@
"books": "Boeken", "books": "Boeken",
"podcastsDuration": "Duur", "podcastsDuration": "Duur",
"booksDuration": "Duur" "booksDuration": "Duur"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -15,13 +15,13 @@
"free": "Wolne", "free": "Wolne",
"cpu": "CPU", "cpu": "CPU",
"mem": "PAM", "mem": "PAM",
"temp": "TEMP", "temp": "TEMP.",
"max": "Max", "max": "Max",
"uptime": "UP", "uptime": "UP",
"months": "mo", "months": "miesiąc",
"days": "d", "days": "dni",
"hours": "h", "hours": "h",
"minutes": "m" "minutes": "minuty"
}, },
"emby": { "emby": {
"no_active": "Brak aktywnych strumieni", "no_active": "Brak aktywnych strumieni",
@@ -79,7 +79,7 @@
"error": "Błąd", "error": "Błąd",
"unknown": "Nieznany", "unknown": "Nieznany",
"running": "Działa", "running": "Działa",
"starting": "Starting", "starting": "Startować",
"unhealthy": "Unhealthy", "unhealthy": "Unhealthy",
"not_found": "Not Found", "not_found": "Not Found",
"exited": "Exited", "exited": "Exited",
@@ -228,7 +228,8 @@
"plex": { "plex": {
"streams": "Aktywne strumienie", "streams": "Aktywne strumienie",
"movies": "Filmy", "movies": "Filmy",
"tv": "Seriale" "tv": "Seriale",
"albums": "Albums"
}, },
"glances": { "glances": {
"cpu": "Procesor", "cpu": "Procesor",
@@ -562,5 +563,24 @@
"books": "Books", "books": "Books",
"podcastsDuration": "Duration", "podcastsDuration": "Duration",
"booksDuration": "Duration" "booksDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -52,10 +52,10 @@
"load": "Carregamento", "load": "Carregamento",
"cpu": "CPU", "cpu": "CPU",
"mem": "MEM", "mem": "MEM",
"max": "Max", "max": "Máximo",
"temp": "TEMP", "temp": "TEMP",
"uptime": "UP", "uptime": "LIGADO",
"months": "mo", "months": "mês",
"days": "d", "days": "d",
"hours": "h", "hours": "h",
"minutes": "m" "minutes": "m"
@@ -228,14 +228,15 @@
"plex": { "plex": {
"streams": "Transmissões ativas", "streams": "Transmissões ativas",
"movies": "Filmes", "movies": "Filmes",
"tv": "Séries de TV" "tv": "Séries de TV",
"albums": "Albums"
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
"mem": "MEM", "mem": "MEM",
"wait": "Por favor aguarde", "wait": "Por favor aguarde",
"temp": "TEMP", "temp": "TEMP",
"uptime": "UP", "uptime": "LIGADO",
"days": "d", "days": "d",
"hours": "h" "hours": "h"
}, },
@@ -316,9 +317,9 @@
"up_to_date": "Atualizado", "up_to_date": "Atualizado",
"child_bridges": "Pontes Filhas", "child_bridges": "Pontes Filhas",
"child_bridges_status": "{{ok}}/{{total}}", "child_bridges_status": "{{ok}}/{{total}}",
"up": "Up", "up": "Ligado",
"pending": "Pendente", "pending": "Pendente",
"down": "Down" "down": "Desligado"
}, },
"autobrr": { "autobrr": {
"approvedPushes": "Aprovado", "approvedPushes": "Aprovado",
@@ -562,5 +563,24 @@
"books": "Livros", "books": "Livros",
"podcastsDuration": "Duração", "podcastsDuration": "Duração",
"booksDuration": "Duração" "booksDuration": "Duração"
},
"homeassistant": {
"people_home": "Pessoas em Casa",
"lights_on": "Luzes Ligadas",
"switches_on": "Interruptores Ligados"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -18,10 +18,10 @@
"load": "Carga", "load": "Carga",
"cpu": "CPU", "cpu": "CPU",
"mem": "MEM", "mem": "MEM",
"max": "Max", "max": "Máximo",
"temp": "TEMP", "temp": "TEMP",
"uptime": "UP", "uptime": "CIMA",
"months": "mo", "months": "mês",
"days": "d", "days": "d",
"hours": "h", "hours": "h",
"minutes": "m" "minutes": "m"
@@ -241,14 +241,15 @@
"plex": { "plex": {
"streams": "Streams Ativas", "streams": "Streams Ativas",
"movies": "Filmes", "movies": "Filmes",
"tv": "Series de TV" "tv": "Series de TV",
"albums": "Albums"
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
"mem": "MEM", "mem": "MEM",
"wait": "Por favor, aguarde", "wait": "Por favor, aguarde",
"temp": "TEMP", "temp": "TEMP",
"uptime": "UP", "uptime": "Cima",
"days": "d", "days": "d",
"hours": "h" "hours": "h"
}, },
@@ -331,7 +332,7 @@
"child_bridges_status": "{{ok}}/{{total}}", "child_bridges_status": "{{ok}}/{{total}}",
"up": "Up", "up": "Up",
"pending": "Pendente", "pending": "Pendente",
"down": "Down" "down": "Baixo"
}, },
"autobrr": { "autobrr": {
"approvedPushes": "Aprovado", "approvedPushes": "Aprovado",
@@ -550,8 +551,8 @@
"nodes": "Nós" "nodes": "Nós"
}, },
"prometheus": { "prometheus": {
"targets_up": "Targets Up", "targets_up": "Alvo ativo",
"targets_down": "Targets Down", "targets_down": "Alvo inativo",
"targets_total": "Total de Alvos" "targets_total": "Total de Alvos"
}, },
"minecraft": { "minecraft": {
@@ -571,5 +572,24 @@
"books": "Livros", "books": "Livros",
"podcastsDuration": "Duração", "podcastsDuration": "Duração",
"booksDuration": "Duração" "booksDuration": "Duração"
},
"homeassistant": {
"people_home": "Pessoas em Casa",
"lights_on": "Luzes Acesas",
"switches_on": "Interruptores Ligados"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -228,7 +228,8 @@
"plex": { "plex": {
"streams": "Fluxuri active", "streams": "Fluxuri active",
"movies": "Filme", "movies": "Filme",
"tv": "Seriale" "tv": "Seriale",
"albums": "Albums"
}, },
"glances": { "glances": {
"cpu": "Procesor", "cpu": "Procesor",
@@ -562,5 +563,24 @@
"books": "Books", "books": "Books",
"podcastsDuration": "Duration", "podcastsDuration": "Duration",
"booksDuration": "Duration" "booksDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -17,14 +17,14 @@
"used": "Использовано", "used": "Использовано",
"load": "Загрузка", "load": "Загрузка",
"cpu": "Процессор", "cpu": "Процессор",
"mem": "MEM", "mem": "Память",
"temp": "TEMP", "temp": "Температура",
"max": "Max", "max": "Макс.",
"uptime": "UP", "uptime": "UP",
"months": "mo", "months": "мес",
"days": "d", "days": "д",
"hours": "h", "hours": "ч",
"minutes": "m" "minutes": "м"
}, },
"docker": { "docker": {
"rx": "Rx", "rx": "Rx",
@@ -34,34 +34,34 @@
"offline": "Не в сети", "offline": "Не в сети",
"error": "Ошибка", "error": "Ошибка",
"unknown": "Неизвестный", "unknown": "Неизвестный",
"running": "Running", "running": "Запущенно",
"starting": "Starting", "starting": "Запускается",
"unhealthy": "Unhealthy", "unhealthy": "Не живой",
"not_found": "Not Found", "not_found": "Не найден",
"exited": "Exited", "exited": "Существует",
"partial": "Partial", "partial": "Частично",
"healthy": "Healthy" "healthy": "Живой"
}, },
"emby": { "emby": {
"playing": "Воспроизведение", "playing": "Воспроизведение",
"transcoding": "Транскодирование", "transcoding": "Транскодирование",
"bitrate": "Битрейт", "bitrate": "Битрейт",
"no_active": "Нет активных потоков", "no_active": "Нет активных потоков",
"movies": "Movies", "movies": "Фильмы",
"series": "Series", "series": "Сериалы",
"episodes": "Episodes", "episodes": "Эпизоды",
"songs": "Songs" "songs": "Песни"
}, },
"tautulli": { "tautulli": {
"playing": "Воспроизведение", "playing": "Воспроизведение",
"transcoding": "Транскодирование", "transcoding": "Транскодирование",
"bitrate": "Битрейт", "bitrate": "Битрейт",
"no_active": "No Active Streams" "no_active": "Нет активных трансляций"
}, },
"rutorrent": { "rutorrent": {
"active": "Активный", "active": "Активный",
"upload": "Загрузить", "upload": "Загрузка",
"download": "Скачать" "download": "Загрузка"
}, },
"sonarr": { "sonarr": {
"wanted": "Хотел", "wanted": "Хотел",
@@ -72,7 +72,7 @@
"wanted": "Хотел", "wanted": "Хотел",
"queued": "В очереди", "queued": "В очереди",
"movies": "Фильмы", "movies": "Фильмы",
"missing": "Missing" "missing": "Пропущено"
}, },
"readarr": { "readarr": {
"wanted": "Wanted", "wanted": "Wanted",
@@ -95,12 +95,12 @@
"gravity": "Сила тяжести" "gravity": "Сила тяжести"
}, },
"speedtest": { "speedtest": {
"upload": "Загрузка", "upload": "Отдача",
"download": "Скачать", "download": "Загрузка",
"ping": "пинг" "ping": "Пинг"
}, },
"portainer": { "portainer": {
"running": "Запущено", "running": "Запущенно",
"stopped": "Остановлено", "stopped": "Остановлено",
"total": "Всего" "total": "Всего"
}, },
@@ -121,92 +121,92 @@
"updating": "Обновление" "updating": "Обновление"
}, },
"overseerr": { "overseerr": {
"pending": "Pending", "pending": "Ожидание",
"approved": "Approved", "approved": "Одобрено",
"available": "Available", "available": "Доступно",
"processing": "Processing" "processing": "Обработка"
}, },
"sabnzbd": { "sabnzbd": {
"rate": "Rate", "rate": "Оценка",
"queue": "Queue", "queue": "Очередь",
"timeleft": "Time Left" "timeleft": "Осталось времени"
}, },
"nzbget": { "nzbget": {
"rate": "Rate", "rate": "Оценка",
"remaining": "Remaining", "remaining": "Осталось",
"downloaded": "Downloaded" "downloaded": "Загружено"
}, },
"coinmarketcap": { "coinmarketcap": {
"configure": "Configure one or more crypto currencies to track", "configure": "Настройте одну или несколько криптовалют для отслеживания",
"1hour": "1 Hour", "1hour": "1 Час",
"1day": "1 Day", "1day": "1 День",
"7days": "7 Days", "7days": "7 Дней",
"30days": "30 Дней" "30days": "30 Дней"
}, },
"gotify": { "gotify": {
"apps": "Applications", "apps": "Приложения",
"clients": "Clients", "clients": "Клиенты",
"messages": "Messages" "messages": "Сообщения"
}, },
"prowlarr": { "prowlarr": {
"enableIndexers": "Indexers", "enableIndexers": "Индексаторы",
"numberOfGrabs": "Grabs", "numberOfGrabs": "Grabs",
"numberOfQueries": "Queries", "numberOfQueries": "Запросы",
"numberOfFailGrabs": "Fail Grabs", "numberOfFailGrabs": "Fail Grabs",
"numberOfFailQueries": "Fail Queries" "numberOfFailQueries": "Fail Queries"
}, },
"transmission": { "transmission": {
"download": "Download", "download": "Загрузка",
"upload": "Upload", "upload": "Отдача",
"leech": "Leech", "leech": "Пиры",
"seed": "Seed" "seed": "Сиды"
}, },
"jackett": { "jackett": {
"configured": "Configured", "configured": "Настроено",
"errored": "Errored" "errored": "Ошибочно"
}, },
"bazarr": { "bazarr": {
"missingEpisodes": "Missing Episodes", "missingEpisodes": "Отсутствующие эпизоды",
"missingMovies": "Missing Movies" "missingMovies": "Отсутствующие фильмы"
}, },
"lidarr": { "lidarr": {
"wanted": "Wanted", "wanted": "Хотел",
"queued": "Queued", "queued": "В очереди",
"albums": "Albums" "albums": "Альбомы"
}, },
"adguard": { "adguard": {
"queries": "Queries", "queries": "Запросы",
"blocked": "Blocked", "blocked": "Заблокировано",
"filtered": "Filtered", "filtered": "Отсортировано",
"latency": "Latency" "latency": "Задержка"
}, },
"qbittorrent": { "qbittorrent": {
"download": "Download", "download": "Загрузка",
"upload": "Upload", "upload": "Отдача",
"leech": "Leech", "leech": "Пиры",
"seed": "Seed" "seed": "Сиды"
}, },
"mastodon": { "mastodon": {
"user_count": "Users", "user_count": "Пользователи",
"status_count": "Posts", "status_count": "Посты",
"domain_count": "Domains" "domain_count": "Домены"
}, },
"strelaysrv": { "strelaysrv": {
"numConnections": "Connections", "numConnections": "Соединения",
"dataRelayed": "Relayed", "dataRelayed": "Ретранслировано",
"transferRate": "Rate", "transferRate": "Оценка",
"numActiveSessions": "Sessions" "numActiveSessions": "Сессий"
}, },
"authentik": { "authentik": {
"users": "Users", "users": "Пользователи",
"loginsLast24H": "Logins (24h)", "loginsLast24H": "Входы (24ч)",
"failedLoginsLast24H": "Failed Logins (24h)" "failedLoginsLast24H": "Неудачные входы (24ч)"
}, },
"proxmox": { "proxmox": {
"mem": "MEM", "mem": "Память",
"cpu": "CPU", "cpu": "Процессор",
"lxc": "LXC", "lxc": "LXC",
"vms": "VMs" "vms": "Виртуальные машины"
}, },
"unifi": { "unifi": {
"users": "Пользователи", "users": "Пользователи",
@@ -215,37 +215,38 @@
"wan": "WAN", "wan": "WAN",
"lan_users": "Пользователи LAN", "lan_users": "Пользователи LAN",
"wlan_users": "Пользователи WLAN", "wlan_users": "Пользователи WLAN",
"up": "UP", "up": "Работает",
"down": "DOWN", "down": "Не работает",
"wait": "Подождите", "wait": "Пожалуйста, подождите",
"lan": "LAN", "lan": "LAN",
"wlan": "WLAN", "wlan": "WLAN",
"devices": "Устройства", "devices": "Устройства",
"lan_devices": "Устройства подключённые по LAN", "lan_devices": "Устройства подключённые по LAN",
"wlan_devices": "WLAN Devices", "wlan_devices": "Подключения WLAN",
"empty_data": "Subsystem status unknown" "empty_data": "Статус системы неизвестен"
}, },
"plex": { "plex": {
"streams": "Active Streams", "streams": "Активные трансляции",
"movies": "Movies", "movies": "Фильмы",
"tv": "TV Shows" "tv": "Передачи",
"albums": "Альбомы"
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "Процессор",
"mem": "MEM", "mem": "Память",
"wait": "Please wait", "wait": "Пожалуйста, подождите",
"temp": "TEMP", "temp": "Температура",
"uptime": "UP", "uptime": "Работает",
"days": "d", "days": "д",
"hours": "h" "hours": "ч"
}, },
"changedetectionio": { "changedetectionio": {
"totalObserved": "Всего наблюдаемых", "totalObserved": "Всего наблюдаемых",
"diffsDetected": "Обнаружены различия" "diffsDetected": "Обнаружены различия"
}, },
"wmo": { "wmo": {
"0-day": "Sunny", "0-day": "Солнечно",
"0-night": "Clear", "0-night": "Ясно",
"71-night": "Light Snow", "71-night": "Light Snow",
"73-day": "Snow", "73-day": "Snow",
"73-night": "Snow", "73-night": "Snow",
@@ -256,22 +257,22 @@
"80-day": "Light Showers", "80-day": "Light Showers",
"80-night": "Light Showers", "80-night": "Light Showers",
"81-day": "Showers", "81-day": "Showers",
"1-day": "Mainly Sunny", "1-day": "Преимущественно солнечно",
"1-night": "Mainly Clear", "1-night": "Преимущественно ясно",
"2-day": "Partly Cloudy", "2-day": "Переменная облачность",
"2-night": "Partly Cloudy", "2-night": "Переменная облачность",
"3-day": "Cloudy", "3-day": "Облачно",
"3-night": "Cloudy", "3-night": "Облачно",
"45-day": "Foggy", "45-day": "Туманно",
"45-night": "Foggy", "45-night": "Туманно",
"48-day": "Foggy", "48-day": "Туманно",
"48-night": "Foggy", "48-night": "Туманно",
"51-day": "Light Drizzle", "51-day": "Слегка моросит",
"51-night": "Light Drizzle", "51-night": "Слегка моросит",
"53-day": "Drizzle", "53-day": "Моросит",
"53-night": "Drizzle", "53-night": "Моросит",
"55-day": "Heavy Drizzle", "55-day": "Сильно моросит",
"55-night": "Heavy Drizzle", "55-night": "Сильно моросит",
"56-day": "Light Freezing Drizzle", "56-day": "Light Freezing Drizzle",
"56-night": "Light Freezing Drizzle", "56-night": "Light Freezing Drizzle",
"57-day": "Freezing Drizzle", "57-day": "Freezing Drizzle",
@@ -302,55 +303,55 @@
"99-night": "Thunderstorm With Hail" "99-night": "Thunderstorm With Hail"
}, },
"quicklaunch": { "quicklaunch": {
"bookmark": "Bookmark", "bookmark": "Закладка",
"service": "Service", "service": "Сервис",
"search": "Search", "search": "Поиск",
"custom": "Custom", "custom": "Пользовательский",
"visit": "Visit", "visit": "Visit",
"url": "URL" "url": "URL"
}, },
"homebridge": { "homebridge": {
"available_update": "System", "available_update": "Система",
"updates": "Updates", "updates": "Обновления",
"update_available": "Update Available", "update_available": "Доступные обновления",
"up_to_date": "Up to Date", "up_to_date": "Обновлено",
"child_bridges_status": "{{ok}}/{{total}}", "child_bridges_status": "{{ok}}/{{total}}",
"child_bridges": "Child Bridges", "child_bridges": "Дочерние мосты",
"up": "Up", "up": "Up",
"pending": "Pending", "pending": "В ожидании",
"down": "Down" "down": "Down"
}, },
"autobrr": { "autobrr": {
"approvedPushes": "Approved", "approvedPushes": "Одобрено",
"rejectedPushes": "Rejected", "rejectedPushes": "Отклонено",
"filters": "Filters", "filters": "Фильтры",
"indexers": "Indexers" "indexers": "Индексаторы"
}, },
"watchtower": { "watchtower": {
"containers_scanned": "Scanned", "containers_scanned": "Отсканировано",
"containers_updated": "Updated", "containers_updated": "Обновлено",
"containers_failed": "Failed" "containers_failed": "Failed"
}, },
"tubearchivist": { "tubearchivist": {
"downloads": "Queue", "downloads": "Очередь",
"videos": "Videos", "videos": "Видео",
"channels": "Channels", "channels": "Каналы",
"playlists": "Playlists" "playlists": "Плейлисты"
}, },
"truenas": { "truenas": {
"load": "System Load", "load": "Загрузка системы",
"uptime": "Uptime", "uptime": "Время работы",
"alerts": "Alerts", "alerts": "Уведомления",
"time": "{{value, number(style: unit; unitDisplay: long;)}}" "time": "{{value, number(style: unit; unitDisplay: long;)}}"
}, },
"navidrome": { "navidrome": {
"nothing_streaming": "No Active Streams", "nothing_streaming": "Нет активных трансляций",
"please_wait": "Please Wait" "please_wait": "Пожалуйста, подождите"
}, },
"pyload": { "pyload": {
"speed": "Speed", "speed": "Скорость",
"active": "Active", "active": "Active",
"queue": "Queue", "queue": "Очередь",
"total": "Total" "total": "Total"
}, },
"gluetun": { "gluetun": {
@@ -373,29 +374,29 @@
}, },
"paperlessngx": { "paperlessngx": {
"inbox": "Inbox", "inbox": "Inbox",
"total": "Total" "total": "Всего"
}, },
"deluge": { "deluge": {
"download": "Download", "download": "Загрузка",
"upload": "Upload", "upload": "Отдача",
"leech": "Leech", "leech": "Пиры",
"seed": "Seed" "seed": "Сиды"
}, },
"flood": { "flood": {
"upload": "Upload", "upload": "Отдача",
"download": "Download", "download": "Загрузка",
"leech": "Leech", "leech": "Пиры",
"seed": "Seed" "seed": "Сиды"
}, },
"tdarr": { "tdarr": {
"queue": "Queue", "queue": "Очередь",
"processed": "Processed", "processed": "Обработано",
"errored": "Errored", "errored": "Ошибочно",
"saved": "Saved" "saved": "Сохранено"
}, },
"miniflux": { "miniflux": {
"read": "Read", "read": "Прочитанные",
"unread": "Unread" "unread": "Непрочитанные"
}, },
"nextdns": { "nextdns": {
"wait": "Please Wait", "wait": "Please Wait",
@@ -406,17 +407,17 @@
"bibitrate": "{{value, rate(bits: true; binary: true)}}" "bibitrate": "{{value, rate(bits: true; binary: true)}}"
}, },
"omada": { "omada": {
"connectedSwitches": "Connected switches", "connectedSwitches": "Подключенные свитчи",
"connectedAp": "Connected APs", "connectedAp": "Подключенные точки доступа",
"activeUser": "Active devices", "activeUser": "Активные устройства",
"alerts": "Alerts", "alerts": "Оповещения",
"connectedGateway": "Connected gateways" "connectedGateway": "Подключенные шлюзы"
}, },
"downloadstation": { "downloadstation": {
"download": "Download", "download": "Загрузка",
"upload": "Upload", "upload": "Отдача",
"leech": "Leech", "leech": "Пиры",
"seed": "Seed" "seed": "Сиды"
}, },
"mikrotik": { "mikrotik": {
"cpuLoad": "CPU Load", "cpuLoad": "CPU Load",
@@ -442,9 +443,9 @@
"layers": "Layers" "layers": "Layers"
}, },
"medusa": { "medusa": {
"wanted": "Wanted", "wanted": "Хотел",
"queued": "Queued", "queued": "В очереди",
"series": "Series" "series": "Сериалы"
}, },
"octoprint": { "octoprint": {
"printer_state": "Status", "printer_state": "Status",
@@ -527,14 +528,14 @@
"records_total": "Queue Length" "records_total": "Queue Length"
}, },
"healthchecks": { "healthchecks": {
"new": "New", "new": "Новые",
"up": "Online", "up": "Онлайн",
"grace": "In Grace Period", "grace": "In Grace Period",
"down": "Offline", "down": "Офлайн",
"paused": "Paused", "paused": "Приостановлено",
"status": "Status", "status": "Статус",
"last_ping": "Last Ping", "last_ping": "Последний пинг",
"never": "No pings yet" "never": "Пока нет пингов"
}, },
"pterodactyl": { "pterodactyl": {
"servers": "Servers", "servers": "Servers",
@@ -546,11 +547,11 @@
"targets_total": "Total Targets" "targets_total": "Total Targets"
}, },
"minecraft": { "minecraft": {
"players": "Players", "players": "Игроков",
"version": "Version", "version": "Версия",
"status": "Status", "status": "Статус",
"up": "Online", "up": "Онлайн",
"down": "Offline" "down": "Офлайн"
}, },
"ghostfolio": { "ghostfolio": {
"gross_percent_today": "Today", "gross_percent_today": "Today",
@@ -562,5 +563,24 @@
"books": "Books", "books": "Books",
"podcastsDuration": "Duration", "podcastsDuration": "Duration",
"booksDuration": "Duration" "booksDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Подписки",
"unread": "Непрочитанные"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Записи",
"scheduled": "Запланировано",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -238,7 +238,8 @@
"plex": { "plex": {
"streams": "Active Streams", "streams": "Active Streams",
"movies": "Movies", "movies": "Movies",
"tv": "TV Shows" "tv": "TV Shows",
"albums": "Albums"
}, },
"sabnzbd": { "sabnzbd": {
"rate": "Rate", "rate": "Rate",
@@ -562,5 +563,24 @@
"books": "Books", "books": "Books",
"podcastsDuration": "Duration", "podcastsDuration": "Duration",
"booksDuration": "Duration" "booksDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -0,0 +1,586 @@
{
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"jellyseerr": {
"available": "Na voljo",
"pending": "V teku",
"approved": "Odobreno"
},
"overseerr": {
"pending": "V teku",
"processing": "Procesiram",
"approved": "Odobreno",
"available": "Na voljo"
},
"pihole": {
"queries": "Poizvedbe",
"blocked": "Blokirano",
"gravity": "Gravitacija"
},
"adguard": {
"filtered": "Filtrirano",
"latency": "Zakasnitev",
"queries": "Poizvedbe",
"blocked": "Blokirano"
},
"opnsense": {
"wanUpload": "WAN naloženo",
"wanDownload": "WAN prejeto",
"cpu": "CPU obremenitev",
"memory": "Aktiven spomin"
},
"octoprint": {
"temp_bed": "Temperatura postelje",
"job_completion": "Končano",
"printer_state": "Status",
"temp_tool": "Temperatura orodja"
},
"cloudflared": {
"origin_ip": "Izvorni IP",
"status": "Status"
},
"proxmoxbackupserver": {
"datastore_usage": "Shramba podatkov",
"failed_tasks_24h": "Opravila z napako 24h",
"cpu_usage": "CPU",
"memory_usage": "Spomin"
},
"mylar": {
"wanted": "Želeno",
"series": "Serije",
"issues": "Težave"
},
"photoprism": {
"albums": "Albumi",
"photos": "Slike",
"videos": "Videi",
"people": "Ljudje"
},
"grafana": {
"alertstriggered": "Sproženi alarmi",
"dashboards": "Nadzorne plošče",
"datasources": "Viri podatkov",
"totalalerts": "Skupaj alarmov"
},
"nextcloud": {
"cpuload": "CPU obremenitev",
"memoryusage": "Uporabljen spomin",
"freespace": "Prostor na voljo",
"activeusers": "Aktivni uporabniki"
},
"kopia": {
"status": "Stanje",
"size": "Velikost",
"lastrun": "Zadnji zagon",
"nextrun": "Naslednji zagon",
"failed": "Neuspešno"
},
"pterodactyl": {
"nodes": "Vozlišča",
"servers": "Strežniki"
},
"widget": {
"missing_type": "Manjka tip widgeta: {{type}}",
"api_error": "API napaka",
"information": "Informacija",
"raw_error": "Surova napaka",
"response_data": "Podatki iz odgovora",
"status": "Stanje",
"url": "URL"
},
"weather": {
"current": "Trenutna lokacija",
"allow": "Kliknite za dovolitev",
"updating": "Posodabljam",
"wait": "Prosimo počakajte"
},
"search": {
"placeholder": "Iskanje…"
},
"resources": {
"cpu": "CPU",
"mem": "MEM",
"total": "Skupaj",
"free": "Prosto",
"used": "V uporabi",
"load": "Bremenitev",
"temp": "TEMP",
"max": "Maks.",
"uptime": "Gor",
"months": "me",
"days": "d",
"hours": "u",
"minutes": "u"
},
"unifi": {
"devices": "Naprave",
"lan_devices": "LAN naprave",
"wlan_devices": "WLAN naprave",
"lan_users": "LAN uporabniki",
"wlan_users": "WLAN uporabniki",
"up": "Gor",
"down": "Dol",
"wait": "Prosimo počakajte",
"users": "Uporabniki",
"uptime": "Čas delovanja",
"days": "Dni",
"wan": "WAN",
"lan": "LAN",
"wlan": "WLAN",
"empty_data": "Neznani status podsistema"
},
"docker": {
"rx": "RX",
"tx": "TX",
"mem": "MEM",
"cpu": "CPU",
"running": "Deluje",
"offline": "Ni povezan",
"error": "Napaka",
"unknown": "Neznano",
"healthy": "Zdrav",
"starting": "Se zaganja",
"unhealthy": "Ni zdrav",
"not_found": "Ni najden",
"exited": "V izhodu",
"partial": "Delni"
},
"ping": {
"error": "Napaka",
"ping": "Ping"
},
"emby": {
"playing": "Predvaja",
"transcoding": "Transkodira",
"bitrate": "Pasovna širina",
"no_active": "Ni aktivne vsebine",
"movies": "Filmi",
"series": "Serije",
"episodes": "Epizode",
"songs": "Pesmi"
},
"tautulli": {
"transcoding": "Transkodira",
"bitrate": "Pasovna širina",
"playing": "Predvaja",
"no_active": "Ni aktivne vsebine"
},
"flood": {
"download": "Prenos",
"upload": "Nalaganje",
"leech": "Pijavka",
"seed": "Sejanje"
},
"changedetectionio": {
"totalObserved": "Skupaj opazovano",
"diffsDetected": "Zaznanih sprememb"
},
"omada": {
"connectedAp": "Povezanih AP",
"activeUser": "Aktivne naprave",
"alerts": "Opozorila",
"connectedGateway": "Povezan prehod",
"connectedSwitches": "Povezana stikala"
},
"nzbget": {
"rate": "Razmerje",
"remaining": "Še preostane",
"downloaded": "Preneseno"
},
"plex": {
"streams": "Aktivna vsebina",
"movies": "Filmi",
"tv": "TV serije",
"albums": "Albums"
},
"sabnzbd": {
"rate": "Hitrost prenosa",
"queue": "Vrsta",
"timeleft": "Preostali čas"
},
"rutorrent": {
"active": "Aktiven",
"upload": "Nalaganje",
"download": "Prenašanje"
},
"transmission": {
"download": "Prenašanje",
"upload": "Nalaganje",
"leech": "Pijavk",
"seed": "Sejanje"
},
"qbittorrent": {
"download": "Prenos",
"upload": "Nalaganje",
"leech": "Pijavk",
"seed": "Sejanje"
},
"deluge": {
"download": "Prenos",
"upload": "Nalaganje",
"leech": "Pijavka",
"seed": "Sejanje"
},
"downloadstation": {
"download": "Prenos",
"upload": "Nalaganje",
"leech": "Pijavka",
"seed": "Sejanje"
},
"sonarr": {
"wanted": "Iskano",
"queued": "V vrsti",
"series": "Serije"
},
"radarr": {
"wanted": "Iskano",
"missing": "Manjkajoče",
"queued": "V vrsti",
"movies": "Filmi"
},
"lidarr": {
"wanted": "Iskano",
"queued": "V vrsti",
"albums": "Albumi"
},
"readarr": {
"wanted": "Iskano",
"queued": "V vrsti",
"books": "Knjige"
},
"bazarr": {
"missingEpisodes": "Manjkajoče epizode",
"missingMovies": "Manjkajoči filmi"
},
"ombi": {
"pending": "V teku",
"approved": "Odobreno",
"available": "Na voljo"
},
"speedtest": {
"upload": "Nalaganje",
"download": "Prenašanje",
"ping": "Ping"
},
"portainer": {
"running": "Deluje",
"stopped": "Ustavljen",
"total": "Skupaj"
},
"tdarr": {
"queue": "Vrsta",
"processed": "Procesiran",
"errored": "Z napako",
"saved": "Shranjen"
},
"npm": {
"disabled": "Onemogočen",
"total": "Skupaj",
"enabled": "Omogočen"
},
"coinmarketcap": {
"configure": "Konfigurirajte eno ali več kripto valut za sledenje",
"1hour": "1 ura",
"1day": "1 dan",
"7days": "7 dni",
"30days": "30 dni"
},
"traefik": {
"routers": "Usmerjevalniki",
"services": "Servisi",
"middleware": "Vmesna programska oprema"
},
"gotify": {
"apps": "Aplikacije",
"clients": "Klienti",
"messages": "Sporočila"
},
"navidrome": {
"nothing_streaming": "Ni aktivnega pretoka",
"please_wait": "Prosim počakajte"
},
"prowlarr": {
"enableIndexers": "Indekserji",
"numberOfGrabs": "Zajemi",
"numberOfQueries": "Poizvedbe",
"numberOfFailGrabs": "Neuspešni zajemi",
"numberOfFailQueries": "Neuspešne poizvedbe"
},
"jackett": {
"configured": "Nastavljeno",
"errored": "Z napakami"
},
"strelaysrv": {
"numActiveSessions": "Seje",
"numConnections": "Povezave",
"dataRelayed": "Preusmerjeno",
"transferRate": "Razmerje"
},
"mastodon": {
"user_count": "Uporabniki",
"status_count": "Objave",
"domain_count": "Domene"
},
"medusa": {
"wanted": "Želeno",
"queued": "V vrsti",
"series": "Serije"
},
"minecraft": {
"players": "Igralci",
"version": "Verzija",
"status": "Status",
"up": "Na spletu",
"down": "Brez povezave"
},
"miniflux": {
"read": "Prebrano",
"unread": "Neprebrano"
},
"proxmox": {
"lxc": "LXC",
"vms": "VM-ji",
"mem": "MEM",
"cpu": "CPU"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Prosim počakajte",
"temp": "TEMP",
"uptime": "UP",
"days": "d",
"hours": "u"
},
"authentik": {
"users": "Uporabniki",
"loginsLast24H": "Prijave (24h)",
"failedLoginsLast24H": "Neveljavne prijave (24h)"
},
"quicklaunch": {
"bookmark": "Zaznamek",
"service": "Storitev",
"search": "Iskanje",
"custom": "Po meri",
"url": "URL",
"visit": "Obišči"
},
"wmo": {
"3-night": "Oblačno",
"45-day": "Megleno",
"0-day": "Sončno",
"0-night": "Jasno",
"1-day": "Večinoma sončno",
"1-night": "Večinoma jasno",
"45-night": "Megleno",
"2-day": "Delno oblačno",
"2-night": "Delno oblačno",
"3-day": "Oblačno",
"48-day": "Megleno",
"48-night": "Megleno",
"51-day": "Rahlo rosenje",
"51-night": "Rahlo rosenje",
"53-day": "Rosenje",
"53-night": "Rosenje",
"55-day": "Močnejše rosenje",
"55-night": "Močnejše rosenje",
"56-day": "Lahko zmrzovano pršenje",
"56-night": "Lahko zmrzovano pršenje",
"57-day": "Zmrzovano pršenje",
"63-night": "Dež",
"65-day": "Močnejši dež",
"65-night": "Močnejši dež",
"66-day": "Zmrznjen dež",
"66-night": "Zmrznjen dež",
"57-night": "Zmrzovano pršenje",
"61-day": "Rahel dež",
"61-night": "Rahel dež",
"67-day": "Zmrznjen dež",
"63-day": "Dež",
"67-night": "Zmrznjen dež",
"71-day": "Rahlo sneženje",
"71-night": "Rahlo sneženje",
"73-day": "Sneg",
"73-night": "Sneg",
"75-day": "Močnejši sneg",
"75-night": "Močnejši sneg",
"77-day": "Snežna zrna",
"77-night": "Snežna zrna",
"80-day": "Rahlo pršenje",
"85-night": "Snežne plohe",
"86-day": "Snežne plohe",
"80-night": "Rahlo pršenje",
"81-day": "Nalivi",
"81-night": "Nalivi",
"82-day": "Močnejši nalivi",
"82-night": "Močnejši nalivi",
"85-day": "Snežne plohe",
"86-night": "Snežne plohe",
"95-day": "Nevihta",
"95-night": "Nevihta",
"96-day": "Nevihta s točo",
"96-night": "Nevihta s točo",
"99-day": "Nevihta s točo",
"99-night": "Nevihta s točo"
},
"homebridge": {
"child_bridges": "Otroški mostovi",
"child_bridges_status": "{{ok}}/{{total}}",
"up": "Gor",
"available_update": "Sistem",
"updates": "Posodobitve",
"update_available": "Posodobitve na voljo",
"up_to_date": "Posodobljeno",
"pending": "V teku",
"down": "Dol"
},
"healthchecks": {
"new": "Nov",
"up": "Povezan",
"grace": "V podaljšanem roku",
"down": "Ni povezan",
"paused": "Pavziran",
"status": "Status",
"last_ping": "Zadnji Ping",
"never": "Še ni pinga"
},
"watchtower": {
"containers_scanned": "Skeniran",
"containers_updated": "Posodobljen",
"containers_failed": "Neuspešno"
},
"autobrr": {
"approvedPushes": "Potrjen",
"rejectedPushes": "Zavrnjen",
"filters": "Filtri",
"indexers": "Indekserji"
},
"tubearchivist": {
"downloads": "Vrsta",
"videos": "Videi",
"channels": "Kanali",
"playlists": "Seznami predvajanja"
},
"truenas": {
"load": "Obremenitev sistema",
"uptime": "Čas delovanja",
"alerts": "Alarmi",
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
},
"pyload": {
"speed": "Hitrost",
"active": "Aktiven",
"queue": "V vrsti",
"total": "Skupaj"
},
"gluetun": {
"public_ip": "Javni IP",
"region": "Regija",
"country": "Država"
},
"hdhomerun": {
"channels": "Kanali",
"hd": "HD"
},
"scrutiny": {
"passed": "Opravljeno",
"failed": "Z napako",
"unknown": "Neznano"
},
"paperlessngx": {
"inbox": "Prejeto",
"total": "Skupaj"
},
"nextdns": {
"wait": "Prosim počakajte",
"no_devices": "Podatki o napravi niso prejeti"
},
"mikrotik": {
"cpuLoad": "CPU obremenitev",
"memoryUsed": "Uporabljen spomin",
"uptime": "Čas delovanja",
"numberOfLeases": "Najemi"
},
"xteve": {
"streams_all": "Vsi pretoki",
"streams_active": "Aktivni pretoki",
"streams_xepg": "XEPG kanali"
},
"moonraker": {
"printer_state": "Stanje tiskalnika",
"print_status": "Stanje tiskanja",
"print_progress": "Napredek",
"layers": "Sloji"
},
"immich": {
"users": "Uporabniki",
"photos": "Slike",
"videos": "Videi",
"storage": "Shramba"
},
"uptimekuma": {
"up": "Povezanih strani",
"down": "Nepovezanih strani",
"uptime": "Čas delovanja",
"incident": "Težave",
"m": "m"
},
"komga": {
"libraries": "Knjižnice",
"series": "Serije",
"books": "Knjige"
},
"diskstation": {
"days": "Dni",
"uptime": "Čas delovanja",
"volumeAvailable": "Na voljo"
},
"fileflows": {
"queue": "Vrsta",
"processing": "Procesiram",
"processed": "Procesirano",
"time": "Čas"
},
"prometheus": {
"targets_up": "Tarče gor",
"targets_down": "Tarče dol",
"targets_total": "Skupaj tarč"
},
"unmanic": {
"active_workers": "Aktivne niti",
"total_workers": "Skupaj niti",
"records_total": "Dolžina vrste"
},
"ghostfolio": {
"gross_percent_today": "Danes",
"gross_percent_1y": "Eno leto",
"gross_percent_max": "Celoten čas"
},
"audiobookshelf": {
"podcasts": "Podcasti",
"books": "Knjige",
"podcastsDuration": "Dolžina",
"booksDuration": "Dolžina"
},
"homeassistant": {
"people_home": "Ljudi doma",
"lights_on": "Vklopljene luči",
"switches_on": "Vklopljena stikala"
},
"freshrss": {
"subscriptions": "Naročnine",
"unread": "Neprebrano"
},
"channelsdvrserver": {
"shows": "Epizode",
"recordings": "Posnetki",
"scheduled": "Načrtovano",
"passes": "Prehodi"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
}
}

View File

@@ -89,7 +89,8 @@
"plex": { "plex": {
"streams": "Active Streams", "streams": "Active Streams",
"movies": "Movies", "movies": "Movies",
"tv": "TV Shows" "tv": "TV Shows",
"albums": "Albums"
}, },
"sabnzbd": { "sabnzbd": {
"rate": "Rate", "rate": "Rate",
@@ -562,5 +563,24 @@
"books": "Books", "books": "Books",
"podcastsDuration": "Duration", "podcastsDuration": "Duration",
"booksDuration": "Duration" "booksDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -228,7 +228,8 @@
"plex": { "plex": {
"streams": "Aktiva strömmar", "streams": "Aktiva strömmar",
"movies": "Filmer", "movies": "Filmer",
"tv": "TV-serier" "tv": "TV-serier",
"albums": "Albums"
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
@@ -562,5 +563,24 @@
"books": "Books", "books": "Books",
"podcastsDuration": "Duration", "podcastsDuration": "Duration",
"booksDuration": "Duration" "booksDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -228,7 +228,8 @@
"plex": { "plex": {
"streams": "యాక్టివ్ స్ట్రీమ్‌లు", "streams": "యాక్టివ్ స్ట్రీమ్‌లు",
"movies": "సినిమాలు", "movies": "సినిమాలు",
"tv": "దూరదర్శిని కార్యక్రమాలు" "tv": "దూరదర్శిని కార్యక్రమాలు",
"albums": "Albums"
}, },
"glances": { "glances": {
"cpu": "సీపియూ", "cpu": "సీపియూ",
@@ -562,5 +563,24 @@
"books": "Books", "books": "Books",
"podcastsDuration": "Duration", "podcastsDuration": "Duration",
"booksDuration": "Duration" "booksDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -156,7 +156,8 @@
"plex": { "plex": {
"streams": "Active Streams", "streams": "Active Streams",
"movies": "Movies", "movies": "Movies",
"tv": "TV Shows" "tv": "TV Shows",
"albums": "Albums"
}, },
"sabnzbd": { "sabnzbd": {
"rate": "Rate", "rate": "Rate",
@@ -562,5 +563,24 @@
"books": "Books", "books": "Books",
"podcastsDuration": "Duration", "podcastsDuration": "Duration",
"booksDuration": "Duration" "booksDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"scheduled": "Scheduled",
"passes": "Passes",
"shows": "Shows",
"recordings": "Recordings"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -89,7 +89,8 @@
"plex": { "plex": {
"streams": "Aktif Akış", "streams": "Aktif Akış",
"movies": "Filmler", "movies": "Filmler",
"tv": "TV Showları" "tv": "TV Showları",
"albums": "Albums"
}, },
"sabnzbd": { "sabnzbd": {
"rate": "Oran", "rate": "Oran",
@@ -562,5 +563,24 @@
"books": "Books", "books": "Books",
"podcastsDuration": "Duration", "podcastsDuration": "Duration",
"booksDuration": "Duration" "booksDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -208,7 +208,8 @@
"plex": { "plex": {
"streams": "Активні потоки", "streams": "Активні потоки",
"movies": "Фільми", "movies": "Фільми",
"tv": "TБ шоу" "tv": "TБ шоу",
"albums": "Альбоми"
}, },
"transmission": { "transmission": {
"download": "Завантаження", "download": "Завантаження",
@@ -562,5 +563,24 @@
"books": "Книжки", "books": "Книжки",
"podcastsDuration": "Тривалість", "podcastsDuration": "Тривалість",
"booksDuration": "Тривалість" "booksDuration": "Тривалість"
},
"homeassistant": {
"people_home": "Люди вдома",
"lights_on": "Світло ввімкнено",
"switches_on": "Вмикається"
},
"freshrss": {
"subscriptions": "Передплата",
"unread": "Не прочитано"
},
"channelsdvrserver": {
"shows": "Вистави",
"recordings": "Записи",
"scheduled": "Заплановано",
"passes": "Перепустки"
},
"whatsupdocker": {
"monitoring": "Спостереження",
"updates": "Оновлення"
} }
} }

View File

@@ -228,7 +228,8 @@
"plex": { "plex": {
"streams": "Active Streams", "streams": "Active Streams",
"movies": "Movies", "movies": "Movies",
"tv": "TV Shows" "tv": "TV Shows",
"albums": "Albums"
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
@@ -562,5 +563,24 @@
"books": "Books", "books": "Books",
"podcastsDuration": "Duration", "podcastsDuration": "Duration",
"booksDuration": "Duration" "booksDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -228,7 +228,8 @@
"plex": { "plex": {
"streams": "Active Streams", "streams": "Active Streams",
"movies": "Movies", "movies": "Movies",
"tv": "TV Shows" "tv": "TV Shows",
"albums": "Albums"
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
@@ -562,5 +563,24 @@
"books": "Books", "books": "Books",
"podcastsDuration": "Duration", "podcastsDuration": "Duration",
"booksDuration": "Duration" "booksDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -228,14 +228,15 @@
"plex": { "plex": {
"streams": "活动流", "streams": "活动流",
"movies": "电影", "movies": "电影",
"tv": "电视节目" "tv": "电视节目",
"albums": "专辑"
}, },
"glances": { "glances": {
"cpu": "处理器", "cpu": "处理器",
"mem": "内存", "mem": "内存",
"wait": "请稍等", "wait": "请稍等",
"temp": "TEMP", "temp": "温度",
"uptime": "UP", "uptime": "运行时间",
"days": "天", "days": "天",
"hours": "时" "hours": "时"
}, },
@@ -260,8 +261,8 @@
"45-night": "有雾", "45-night": "有雾",
"48-night": "有雾", "48-night": "有雾",
"51-night": "小雨", "51-night": "小雨",
"53-day": "Drizzle", "53-day": "小雨",
"53-night": "Drizzle", "53-night": "小雨",
"55-day": "毛毛雨", "55-day": "毛毛雨",
"55-night": "毛毛雨", "55-night": "毛毛雨",
"56-day": "小冻毛雨", "56-day": "小冻毛雨",
@@ -541,9 +542,9 @@
"nodes": "节点" "nodes": "节点"
}, },
"prometheus": { "prometheus": {
"targets_up": "Targets Up", "targets_up": "目标离线",
"targets_down": "Targets Down", "targets_down": "目标在线",
"targets_total": "Total Targets" "targets_total": "总目标"
}, },
"minecraft": { "minecraft": {
"players": "播放中", "players": "播放中",
@@ -562,5 +563,24 @@
"books": "图书", "books": "图书",
"podcastsDuration": "持续时间", "podcastsDuration": "持续时间",
"booksDuration": "持续时间" "booksDuration": "持续时间"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "订阅",
"unread": "未读"
},
"channelsdvrserver": {
"shows": "节目",
"recordings": "录像",
"scheduled": "已计划的",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -228,7 +228,8 @@
"plex": { "plex": {
"streams": "正在播放", "streams": "正在播放",
"movies": "電影", "movies": "電影",
"tv": "影集" "tv": "影集",
"albums": "Albums"
}, },
"glances": { "glances": {
"cpu": "CPU", "cpu": "CPU",
@@ -562,5 +563,24 @@
"books": "Books", "books": "Books",
"podcastsDuration": "Duration", "podcastsDuration": "Duration",
"booksDuration": "Duration" "booksDuration": "Duration"
},
"homeassistant": {
"people_home": "People Home",
"lights_on": "Lights On",
"switches_on": "Switches On"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"whatsupdocker": {
"monitoring": "Monitoring",
"updates": "Updates"
} }
} }

View File

@@ -161,7 +161,7 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear
)} type="text" autoCorrect="false" ref={searchField} value={searchString} onChange={handleSearchChange} onKeyDown={handleSearchKeyDown} /> )} type="text" autoCorrect="false" ref={searchField} value={searchString} onChange={handleSearchChange} onKeyDown={handleSearchKeyDown} />
{results.length > 0 && <ul className="max-h-[60vh] overflow-y-auto m-2"> {results.length > 0 && <ul className="max-h-[60vh] overflow-y-auto m-2">
{results.map((r, i) => ( {results.map((r, i) => (
<li key={r.name}> <li key={r.container ?? r.app ?? r.name}>
<button type="button" data-index={i} onMouseEnter={handleItemHover} className={classNames( <button type="button" data-index={i} onMouseEnter={handleItemHover} className={classNames(
"flex flex-row w-full items-center justify-between rounded-md text-sm md:text-xl py-2 px-4 cursor-pointer text-theme-700 dark:text-theme-200", "flex flex-row w-full items-center justify-between rounded-md text-sm md:text-xl py-2 px-4 cursor-pointer text-theme-700 dark:text-theme-200",
i === currentItemIndex && "bg-theme-300/50 dark:bg-theme-700/50", i === currentItemIndex && "bg-theme-300/50 dark:bg-theme-700/50",

View File

@@ -1,14 +1,43 @@
import { useContext } from "react";
import Image from "next/future/image"; import Image from "next/future/image";
import { SettingsContext } from "utils/contexts/settings";
import { ThemeContext } from "utils/contexts/theme";
const iconSetURLs = {
'mdi': "https://cdn.jsdelivr.net/npm/@mdi/svg@latest/svg/",
'si' : "https://cdn.jsdelivr.net/npm/simple-icons@latest/icons/",
};
export default function ResolvedIcon({ icon, width = 32, height = 32, alt = "logo" }) { export default function ResolvedIcon({ icon, width = 32, height = 32, alt = "logo" }) {
const { settings } = useContext(SettingsContext);
const { theme } = useContext(ThemeContext);
// direct or relative URLs // direct or relative URLs
if (icon.startsWith("http") || icon.startsWith("/")) { if (icon.startsWith("http") || icon.startsWith("/")) {
return <Image src={`${icon}`} width={width} height={height} alt={alt} />; return (
<Image
src={`${icon}`}
width={width}
height={height}
style={{
width,
height,
objectFit: "contain",
}}
alt={alt}
/>
);
} }
// mdi- prefixed, material design icons // check mdi- or si- prefixed icons
if (icon.startsWith("mdi-")) { const prefix = icon.split("-")[0]
const iconName = icon.replace("mdi-", "").replace(".svg", "");
if (prefix in iconSetURLs) {
// get icon source
const iconName = icon.replace(`${prefix}-`, "").replace(".svg", "");
const iconSource = `${iconSetURLs[prefix]}${iconName}.svg`;
return ( return (
<div <div
style={{ style={{
@@ -16,9 +45,11 @@ export default function ResolvedIcon({ icon, width = 32, height = 32, alt = "log
height, height,
maxWidth: '100%', maxWidth: '100%',
maxHeight: '100%', maxHeight: '100%',
background: "linear-gradient(180deg, rgb(var(--color-logo-start)), rgb(var(--color-logo-stop)))", background: settings.iconStyle === "theme" ?
mask: `url(https://cdn.jsdelivr.net/npm/@mdi/svg@latest/svg/${iconName}.svg) no-repeat center / contain`, `rgb(var(--color-${ theme === "dark" ? 300 : 900 }) / var(--tw-text-opacity))` :
WebkitMask: `url(https://cdn.jsdelivr.net/npm/@mdi/svg@latest/svg/${iconName}.svg) no-repeat center / contain`, "linear-gradient(180deg, rgb(var(--color-logo-start)), rgb(var(--color-logo-stop)))",
mask: `url(${iconSource}) no-repeat center / contain`,
WebkitMask: `url(${iconSource}) no-repeat center / contain`,
}} }}
/> />
); );
@@ -31,6 +62,11 @@ export default function ResolvedIcon({ icon, width = 32, height = 32, alt = "log
src={`https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/${iconName}.png`} src={`https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/${iconName}.png`}
width={width} width={width}
height={height} height={height}
style={{
width,
height,
objectFit: "contain",
}}
alt={alt} alt={alt}
/> />
); );

View File

@@ -3,12 +3,13 @@ import classNames from "classnames";
import List from "components/services/list"; import List from "components/services/list";
import ResolvedIcon from "components/resolvedicon"; import ResolvedIcon from "components/resolvedicon";
export default function ServicesGroup({ services, layout }) { export default function ServicesGroup({ services, layout, fiveColumns }) {
return ( return (
<div <div
key={services.name} key={services.name}
className={classNames( className={classNames(
layout?.style === "row" ? "basis-full" : "basis-full md:basis-1/2 lg:basis-1/3 xl:basis-1/4", 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" "flex-1 p-1"
)} )}
> >

View File

@@ -14,7 +14,8 @@ import ResolvedIcon from "components/resolvedicon";
export default function Item({ service }) { export default function Item({ service }) {
const hasLink = service.href && service.href !== "#"; const hasLink = service.href && service.href !== "#";
const { settings } = useContext(SettingsContext); const { settings } = useContext(SettingsContext);
const [statsOpen, setStatsOpen] = useState(false); const showStats = (service.showStats === false) ? false : settings.showStats;
const [statsOpen, setStatsOpen] = useState(service.showStats);
const [statsClosing, setStatsClosing] = useState(false); const [statsClosing, setStatsClosing] = useState(false);
// set stats to closed after 300ms // set stats to closed after 300ms
@@ -33,7 +34,7 @@ export default function Item({ service }) {
<div <div
className={`${ className={`${
hasLink ? "cursor-pointer " : " " hasLink ? "cursor-pointer " : " "
}transition-all h-15 mb-3 p-1 rounded-md font-medium text-theme-700 dark:text-theme-200 dark:hover:text-theme-300 shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 hover:bg-theme-300/20 dark:bg-white/5 dark:hover:bg-white/10 relative`} }transition-all h-15 mb-2 p-1 rounded-md font-medium text-theme-700 dark:text-theme-200 dark:hover:text-theme-300 shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 hover:bg-theme-300/20 dark:bg-white/5 dark:hover:bg-white/10 relative`}
> >
<div className="flex select-none"> <div className="flex select-none">
{service.icon && {service.icon &&
@@ -107,21 +108,21 @@ export default function Item({ service }) {
{service.container && service.server && ( {service.container && service.server && (
<div <div
className={classNames( className={classNames(
statsOpen && !statsClosing ? "max-h-[110px] opacity-100" : " max-h-[0] opacity-0", showStats || (statsOpen && !statsClosing) ? "max-h-[110px] opacity-100" : " max-h-[0] opacity-0",
"w-full overflow-hidden transition-all duration-300 ease-in-out" "w-full overflow-hidden transition-all duration-300 ease-in-out"
)} )}
> >
{statsOpen && <Docker service={{ widget: { container: service.container, server: service.server } }} />} {(showStats || statsOpen) && <Docker service={{ widget: { container: service.container, server: service.server } }} />}
</div> </div>
)} )}
{service.app && ( {service.app && (
<div <div
className={classNames( className={classNames(
statsOpen && !statsClosing ? "max-h-[55px] opacity-100" : " max-h-[0] opacity-0", showStats || (statsOpen && !statsClosing) ? "max-h-[55px] opacity-100" : " max-h-[0] opacity-0",
"w-full overflow-hidden transition-all duration-300 ease-in-out" "w-full overflow-hidden transition-all duration-300 ease-in-out"
)} )}
> >
{statsOpen && <Kubernetes service={{ widget: { namespace: service.namespace, app: service.app, podSelector: service.podSelector } }} />} {(showStats || statsOpen) && <Kubernetes service={{ widget: { namespace: service.namespace, app: service.app, podSelector: service.podSelector } }} />}
</div> </div>
)} )}

View File

@@ -23,7 +23,7 @@ export default function List({ services, layout }) {
)} )}
> >
{services.map((service) => ( {services.map((service) => (
<Item key={service.name} service={service} /> <Item key={service.container ?? service.app ?? service.name} service={service} />
))} ))}
</ul> </ul>
); );

View File

@@ -25,7 +25,7 @@ export default function Ping({ service }) {
const statusText = `${service.ping}: HTTP status ${data.status}`; const statusText = `${service.ping}: HTTP status ${data.status}`;
if (data && data.status !== 200) { if (data.status > 403) {
return ( return (
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden" title={statusText}> <div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden" title={statusText}>
<div className="text-[8px] font-bold text-rose-500/80">{data.status}</div> <div className="text-[8px] font-bold text-rose-500/80">{data.status}</div>
@@ -33,12 +33,10 @@ export default function Ping({ service }) {
); );
} }
if (data && data.status === 200) { return (
return ( <div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden" title={statusText}>
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden" title={statusText}> <div className="text-[8px] font-bold text-emerald-500/80">{t("common.ms", { value: data.latency, style: "unit", unit: "millisecond", unitDisplay: "narrow", maximumFractionDigits: 0 })}</div>
<div className="text-[8px] font-bold text-emerald-500/80">{t("common.ms", { value: data.latency, style: "unit", unit: "millisecond", unitDisplay: "narrow", maximumFractionDigits: 0 })}</div> </div>
</div> );
);
}
} }

View File

@@ -1,8 +1,18 @@
import { useContext } from "react";
import Error from "./error"; import Error from "./error";
import { SettingsContext } from "utils/contexts/settings";
export default function Container({ error = false, children, service }) { export default function Container({ error = false, children, service }) {
const { settings } = useContext(SettingsContext);
if (error) { if (error) {
return <Error error={error} /> if (settings.hideErrors || service.widget.hide_errors) {
return null;
}
return <Error service={service} error={error} />
} }
let visibleChildren = children; let visibleChildren = children;
@@ -14,7 +24,7 @@ export default function Container({ error = false, children, service }) {
// fields: [ "resources.cpu", "resources.mem", "field"] // fields: [ "resources.cpu", "resources.mem", "field"]
// or even // or even
// fields: [ "resources.cpu", "widget_type.field" ] // fields: [ "resources.cpu", "widget_type.field" ]
visibleChildren = children.filter(child => fields.some(field => { visibleChildren = children?.filter(child => fields.some(field => {
let fullField = field; let fullField = field;
if (!field.includes(".")) { if (!field.includes(".")) {
fullField = `${type}.${field}`; fullField = `${type}.${field}`;

View File

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

View File

@@ -6,6 +6,12 @@ import { useTranslation } from "next-i18next";
import UsageBar from "../resources/usage-bar"; import UsageBar from "../resources/usage-bar";
const cpuSensorLabels = ["cpu_thermal", "Core", "Tctl"];
function convertToFahrenheit(t) {
return t * 9/5 + 32
}
export default function Widget({ options }) { export default function Widget({ options }) {
const { t, i18n } = useTranslation(); const { t, i18n } = useTranslation();
@@ -65,11 +71,20 @@ export default function Widget({ options }) {
} }
const unit = options.units === "imperial" ? "fahrenheit" : "celsius"; const unit = options.units === "imperial" ? "fahrenheit" : "celsius";
let mainTemp; let mainTemp = 0;
let maxTemp = 80; let maxTemp = 80;
if (options.cputemp && data.sensors) { const cpuSensors = data.sensors?.filter(s => cpuSensorLabels.some(label => s.label.startsWith(label)) && s.type === "temperature_core");
mainTemp = unit === "celsius" ? data.sensors.find(s => s.label.includes("cpu_thermal")).value : data.sensors.find(s => s.label.includes("cpu_thermal")).value * 5/9 + 32; if (options.cputemp && cpuSensors) {
if (data.sensors.warning) maxTemp = data.sensors.warning; try {
mainTemp = cpuSensors.reduce((acc, s) => acc + s.value, 0) / cpuSensors.length;
maxTemp = Math.max(cpuSensors.reduce((acc, s) => acc + s.warning, 0) / cpuSensors.length, maxTemp);
if (unit === "fahrenheit") {
mainTemp = convertToFahrenheit(mainTemp);
maxTemp = convertToFahrenheit(maxTemp);
}
} catch (e) {
// cpu sensor retrieval failed
}
} }
const tempPercent = Math.round((mainTemp / maxTemp) * 100); const tempPercent = Math.round((mainTemp / maxTemp) * 100);
@@ -110,7 +125,7 @@ export default function Widget({ options }) {
<UsageBar percent={data.quicklook.mem} /> <UsageBar percent={data.quicklook.mem} />
</div> </div>
</div> </div>
{options.cputemp && mainTemp && {options.cputemp && mainTemp > 0 &&
(<div className="flex-none flex flex-row items-center mr-3 py-1.5"> (<div className="flex-none flex flex-row items-center mr-3 py-1.5">
<FaThermometerHalf className="text-theme-800 dark:text-theme-200 w-5 h-5" /> <FaThermometerHalf className="text-theme-800 dark:text-theme-200 w-5 h-5" />
<div className="flex flex-col ml-3 text-left min-w-[85px]"> <div className="flex flex-col ml-3 text-left min-w-[85px]">

View File

@@ -6,7 +6,7 @@ import { useTranslation } from "next-i18next";
import UsageBar from "./usage-bar"; import UsageBar from "./usage-bar";
function convertToFahrenheit(t) { function convertToFahrenheit(t) {
return t * 5/9 + 32 return t * 9/5 + 32
} }
export default function CpuTemp({ expanded, units }) { export default function CpuTemp({ expanded, units }) {
@@ -47,16 +47,14 @@ export default function CpuTemp({ expanded, units }) {
); );
} }
let minTemp = 0;
let mainTemp = data.cputemp.main; let mainTemp = data.cputemp.main;
if (data.cputemp.cores?.length) { if (data.cputemp.cores?.length) {
mainTemp = data.cputemp.cores.reduce((a, b) => a + b) / data.cputemp.cores.length; mainTemp = data.cputemp.cores.reduce((a, b) => a + b) / data.cputemp.cores.length;
minTemp = Math.min(...data.cputemp.cores);
} }
const unit = units === "imperial" ? "fahrenheit" : "celsius"; const unit = units === "imperial" ? "fahrenheit" : "celsius";
mainTemp = (unit === "celsius") ? mainTemp : convertToFahrenheit(mainTemp); mainTemp = (unit === "celsius") ? mainTemp : convertToFahrenheit(mainTemp);
const maxTemp = (unit === "celsius") ? data.cputemp.max : convertToFahrenheit(data.cputemp.max); const maxTemp = (unit === "celsius") ? data.cputemp.max : convertToFahrenheit(data.cputemp.max);
const percent = Math.round(((mainTemp - minTemp) / (maxTemp - minTemp)) * 100); const percent = Math.round((mainTemp / maxTemp) * 100);
return ( return (
<div className="flex-none flex flex-row items-center mr-3 py-1.5"> <div className="flex-none flex flex-row items-center mr-3 py-1.5">

View File

@@ -44,7 +44,7 @@ export default function Memory({ expanded }) {
); );
} }
const percent = Math.round((data.memory.used / data.memory.total) * 100); const percent = Math.round((data.memory.active / data.memory.total) * 100);
return ( return (
<div className="flex-none flex flex-row items-center mr-3 py-1.5"> <div className="flex-none flex flex-row items-center mr-3 py-1.5">
@@ -52,7 +52,7 @@ export default function Memory({ expanded }) {
<div className="flex flex-col ml-3 text-left min-w-[85px]"> <div className="flex flex-col ml-3 text-left min-w-[85px]">
<span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between"> <span className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5 pr-1"> <div className="pl-0.5 pr-1">
{t("common.bytes", { value: data.memory.free, maximumFractionDigits: 1, binary: true })} {t("common.bytes", { value: data.memory.available, maximumFractionDigits: 1, binary: true })}
</div> </div>
<div className="pr-1">{t("resources.free")}</div> <div className="pr-1">{t("resources.free")}</div>
</span> </span>

View File

@@ -30,7 +30,7 @@ export default async function handler(req, res) {
}); });
} }
const containerNames = containers.map((container) => container.Names[0]?.replace(/^\//, "")); const containerNames = containers.flatMap((container) => container.Names.map((name) => name.replace(/^\//, "")));
const containerExists = containerNames.includes(containerName); const containerExists = containerNames.includes(containerName);
if (containerExists) { if (containerExists) {

View File

@@ -30,7 +30,7 @@ export default async function handler(req, res) {
}); });
} }
const containerNames = containers.map((container) => container.Names[0]?.replace(/^\//, "")); const containerNames = containers.flatMap((container) => container.Names.map((name) => name.replace(/^\//, "")));
const containerExists = containerNames.includes(containerName); const containerExists = containerNames.includes(containerName);
if (containerExists) { if (containerExists) {

View File

@@ -19,8 +19,8 @@ export default async function handler(req, res) {
return hash(readFileSync(configYaml, "utf8")); return hash(readFileSync(configYaml, "utf8"));
}); });
// this ties hash to specific build which should force revaliation between versions // set to date by docker entrypoint, will force revalidation between restarts/recreates
const buildTime = process.env.NEXT_PUBLIC_BUILDTIME?.length ? process.env.NEXT_PUBLIC_BUILDTIME : ''; const buildTime = process.env.HOMEPAGE_BUILDTIME?.length ? process.env.HOMEPAGE_BUILDTIME : '';
const combinedHash = hash(hashes.join("") + buildTime); const combinedHash = hash(hashes.join("") + buildTime);

View File

@@ -21,7 +21,7 @@ export default async function handler(req, res) {
}); });
let endTime = performance.now(); let endTime = performance.now();
if (status >= 400) { if (status > 403) {
// try one more time as a GET in case HEAD is rejected for whatever reason // try one more time as a GET in case HEAD is rejected for whatever reason
startTime = performance.now(); startTime = performance.now();
[status] = await httpProxy(pingURL); [status] = await httpProxy(pingURL);

View File

@@ -289,7 +289,7 @@ function Home({ initialSettings }) {
{services && ( {services && (
<div className="flex flex-wrap p-4 sm:p-8 sm:pt-4 items-start pb-2"> <div className="flex flex-wrap p-4 sm:p-8 sm:pt-4 items-start pb-2">
{services.map((group) => ( {services.map((group) => (
<ServicesGroup key={group.name} services={group} layout={initialSettings.layout?.[group.name]} /> <ServicesGroup key={group.name} services={group} layout={initialSettings.layout?.[group.name]} fiveColumns={settings.fiveColumns} />
))} ))}
</div> </div>
)} )}
@@ -318,15 +318,26 @@ function Home({ initialSettings }) {
export default function Wrapper({ initialSettings, fallback }) { export default function Wrapper({ initialSettings, fallback }) {
const wrappedStyle = {}; const wrappedStyle = {};
let backgroundBlur = false;
let backgroundSaturate = false;
let backgroundBrightness = false;
if (initialSettings && initialSettings.background) { if (initialSettings && initialSettings.background) {
const opacity = initialSettings.backgroundOpacity ?? 1; let opacity = initialSettings.backgroundOpacity ?? 1;
let backgroundImage = initialSettings.background;
if (typeof initialSettings.background === 'object') {
backgroundImage = initialSettings.background.image;
backgroundBlur = initialSettings.background.blur !== undefined;
backgroundSaturate = initialSettings.background.saturate !== undefined;
backgroundBrightness = initialSettings.background.brightness !== undefined;
if (initialSettings.background.opacity !== undefined) opacity = initialSettings.background.opacity / 100;
}
const opacityValue = 1 - opacity; const opacityValue = 1 - opacity;
wrappedStyle.backgroundImage = ` wrappedStyle.backgroundImage = `
linear-gradient( linear-gradient(
rgb(var(--bg-color) / ${opacityValue}), rgb(var(--bg-color) / ${opacityValue}),
rgb(var(--bg-color) / ${opacityValue}) rgb(var(--bg-color) / ${opacityValue})
), ),
url(${initialSettings.background})`; url(${backgroundImage})`;
wrappedStyle.backgroundPosition = "center"; wrappedStyle.backgroundPosition = "center";
wrappedStyle.backgroundSize = "cover"; wrappedStyle.backgroundSize = "cover";
} }
@@ -345,7 +356,15 @@ export default function Wrapper({ initialSettings, fallback }) {
className="fixed overflow-auto w-full h-full bg-theme-50 dark:bg-theme-800 transition-all" className="fixed overflow-auto w-full h-full bg-theme-50 dark:bg-theme-800 transition-all"
style={wrappedStyle} style={wrappedStyle}
> >
<Index initialSettings={initialSettings} fallback={fallback} /> <div
id="inner_wrapper"
className={classNames(
backgroundBlur && `backdrop-blur${initialSettings.background.blur.length ? '-' : ""}${initialSettings.background.blur}`,
backgroundSaturate && `backdrop-saturate-${initialSettings.background.saturate}`,
backgroundBrightness && `backdrop-brightness-${initialSettings.background.brightness}`,
)}>
<Index initialSettings={initialSettings} fallback={fallback} />
</div>
</div> </div>
</div> </div>
); );

View File

@@ -1,6 +1,6 @@
/* eslint-disable no-console */ /* eslint-disable no-console */
import { join } from "path"; import { join } from "path";
import { existsSync, copyFile, readFileSync } from "fs"; import { existsSync, readFileSync, copyFileSync } from "fs";
import cache from "memory-cache"; import cache from "memory-cache";
import yaml from "js-yaml"; import yaml from "js-yaml";
@@ -13,13 +13,13 @@ export default function checkAndCopyConfig(config) {
const configYaml = join(process.cwd(), "config", config); const configYaml = join(process.cwd(), "config", config);
if (!existsSync(configYaml)) { if (!existsSync(configYaml)) {
const configSkeleton = join(process.cwd(), "src", "skeleton", config); const configSkeleton = join(process.cwd(), "src", "skeleton", config);
copyFile(configSkeleton, configYaml, (err) => { try {
if (err) { copyFileSync(configSkeleton, configYaml)
console.info("%s was copied to the config folder", config);
} catch (err) {
console.error("error copying config", err); console.error("error copying config", err);
throw err; throw err;
} }
console.info("%s was copied to the config folder", config);
});
return true; return true;
} }

View File

@@ -4,7 +4,7 @@ import path from "path";
import yaml from "js-yaml"; import yaml from "js-yaml";
import Docker from "dockerode"; import Docker from "dockerode";
import * as shvl from "shvl"; import * as shvl from "shvl";
import { NetworkingV1Api } from "@kubernetes/client-node"; import { CustomObjectsApi, NetworkingV1Api } from "@kubernetes/client-node";
import createLogger from "utils/logger"; import createLogger from "utils/logger";
import checkAndCopyConfig, { substituteEnvironmentVars } from "utils/config/config"; import checkAndCopyConfig, { substituteEnvironmentVars } from "utils/config/config";
@@ -32,6 +32,7 @@ export async function servicesFromConfig() {
services: servicesGroup[Object.keys(servicesGroup)[0]].map((entries) => ({ services: servicesGroup[Object.keys(servicesGroup)[0]].map((entries) => ({
name: Object.keys(entries)[0], name: Object.keys(entries)[0],
...entries[Object.keys(entries)[0]], ...entries[Object.keys(entries)[0]],
type: 'service'
})), })),
})); }));
@@ -82,6 +83,7 @@ export async function servicesFromDocker() {
constructedService = { constructedService = {
container: container.Names[0].replace(/^\//, ""), container: container.Names[0].replace(/^\//, ""),
server: serverName, server: serverName,
type: 'service'
}; };
} }
shvl.set(constructedService, label.replace("homepage.", ""), container.Labels[label]); shvl.set(constructedService, label.replace("homepage.", ""), container.Labels[label]);
@@ -145,6 +147,7 @@ export async function servicesFromKubernetes() {
return []; return [];
} }
const networking = kc.makeApiClient(NetworkingV1Api); const networking = kc.makeApiClient(NetworkingV1Api);
const crd = kc.makeApiClient(CustomObjectsApi);
const ingressList = await networking.listIngressForAllNamespaces(null, null, null, null) const ingressList = await networking.listIngressForAllNamespaces(null, null, null, null)
.then((response) => response.body) .then((response) => response.body)
@@ -152,6 +155,20 @@ export async function servicesFromKubernetes() {
logger.error("Error getting ingresses: %d %s %s", error.statusCode, error.body, error.response); logger.error("Error getting ingresses: %d %s %s", error.statusCode, error.body, error.response);
return null; return null;
}); });
const traefikIngressList = await crd.listClusterCustomObject("traefik.containo.us", "v1alpha1", "ingressroutes")
.then((response) => response.body)
.catch((error) => {
logger.error("Error getting traefik ingresses: %d %s %s", error.statusCode, error.body, error.response);
return null;
});
if (traefikIngressList && traefikIngressList.items.length > 0) {
const traefikServices = traefikIngressList.items
.filter((ingress) => ingress.metadata.annotations && ingress.metadata.annotations[`${ANNOTATION_BASE}/href`])
ingressList.items.push(...traefikServices);
}
if (!ingressList) { if (!ingressList) {
return []; return [];
} }
@@ -168,6 +185,7 @@ export async function servicesFromKubernetes() {
icon: ingress.metadata.annotations[`${ANNOTATION_BASE}/icon`] || '', icon: ingress.metadata.annotations[`${ANNOTATION_BASE}/icon`] || '',
description: ingress.metadata.annotations[`${ANNOTATION_BASE}/description`] || '', description: ingress.metadata.annotations[`${ANNOTATION_BASE}/description`] || '',
external: false, external: false,
type: 'service'
}; };
if (ingress.metadata.annotations[`${ANNOTATION_BASE}/external`]) { if (ingress.metadata.annotations[`${ANNOTATION_BASE}/external`]) {
constructedService.external = String(ingress.metadata.annotations[`${ANNOTATION_BASE}/external`]).toLowerCase() === "true" constructedService.external = String(ingress.metadata.annotations[`${ANNOTATION_BASE}/external`]).toLowerCase() === "true"
@@ -221,6 +239,7 @@ export function cleanServiceGroups(groups) {
name: serviceGroup.name, name: serviceGroup.name,
services: serviceGroup.services.map((service) => { services: serviceGroup.services.map((service) => {
const cleanedService = { ...service }; const cleanedService = { ...service };
if (cleanedService.showStats !== undefined) cleanedService.showStats = JSON.parse(cleanedService.showStats);
if (typeof service.weight === 'string') { if (typeof service.weight === 'string') {
const weight = parseInt(service.weight, 10); const weight = parseInt(service.weight, 10);
if (Number.isNaN(weight)) { if (Number.isNaN(weight)) {
@@ -238,6 +257,7 @@ export function cleanServiceGroups(groups) {
const { const {
type, // all widgets type, // all widgets
fields, fields,
hideErrors,
server, // docker widget server, // docker widget
container, container,
currency, // coinmarketcap widget currency, // coinmarketcap widget
@@ -250,7 +270,7 @@ export function cleanServiceGroups(groups) {
wan, // opnsense widget, wan, // opnsense widget,
enableBlocks, // emby/jellyfin enableBlocks, // emby/jellyfin
enableNowPlaying, enableNowPlaying,
volume // diskstation widget volume, // diskstation widget
} = cleanedService.widget; } = cleanedService.widget;
const fieldsList = typeof fields === 'string' ? JSON.parse(fields) : fields; const fieldsList = typeof fields === 'string' ? JSON.parse(fields) : fields;
@@ -258,6 +278,7 @@ export function cleanServiceGroups(groups) {
cleanedService.widget = { cleanedService.widget = {
type, type,
fields: fieldsList || null, fields: fieldsList || null,
hide_errors: hideErrors || false,
service_name: service.name, service_name: service.name,
service_group: serviceGroup.name, service_group: serviceGroup.name,
}; };
@@ -282,8 +303,8 @@ export function cleanServiceGroups(groups) {
if (wan) cleanedService.widget.wan = wan; if (wan) cleanedService.widget.wan = wan;
} }
if (type === "emby" || type === "jellyfin") { if (type === "emby" || type === "jellyfin") {
if (enableBlocks) cleanedService.widget.enableBlocks = enableBlocks === 'true'; if (enableBlocks !== undefined) cleanedService.widget.enableBlocks = JSON.parse(enableBlocks);
if (enableNowPlaying) cleanedService.widget.enableNowPlaying = enableNowPlaying === 'true'; if (enableNowPlaying !== undefined) cleanedService.widget.enableNowPlaying = JSON.parse(enableNowPlaying);
} }
if (type === "diskstation") { if (type === "diskstation") {
if (volume) cleanedService.widget.volume = volume; if (volume) cleanedService.widget.volume = volume;

View File

@@ -67,6 +67,10 @@ export default async function credentialedProxyHandler(req, res, map) {
let resultData = data; let resultData = data;
if (resultData.error?.url) {
resultData.error.url = sanitizeErrorURL(url);
}
if (status === 204 || status === 304) { if (status === 204 || status === 304) {
return res.status(status).end(); return res.status(status).end();
} }
@@ -74,16 +78,12 @@ export default async function credentialedProxyHandler(req, res, map) {
if (status >= 400) { if (status >= 400) {
logger.error("HTTP Error %d calling %s", status, url.toString()); logger.error("HTTP Error %d calling %s", status, url.toString());
} }
if (!validateWidgetData(widget, endpoint, data)) { if (status === 200) {
if (data.error && data.error.url) { if (!validateWidgetData(widget, endpoint, resultData)) {
data.error.url = sanitizeErrorURL(url); return res.status(500).json({error: {message: "Invalid data", url: sanitizeErrorURL(url), data: resultData}});
} }
return res.status(500).json({error: {message: "Invalid data", url: sanitizeErrorURL(url), data}}); if (map) resultData = map(resultData);
}
if (status === 200 && map) {
resultData = map(data);
} }
if (contentType) res.setHeader("Content-Type", contentType); if (contentType) res.setHeader("Content-Type", contentType);

View File

@@ -39,15 +39,15 @@ export default async function genericProxyHandler(req, res, map) {
let resultData = data; let resultData = data;
if (!validateWidgetData(widget, endpoint, resultData)) { if (resultData.error?.url) {
if (resultData.error && resultData.error.url) { resultData.error.url = sanitizeErrorURL(url);
resultData.error.url = sanitizeErrorURL(url);
}
return res.status(status).json({error: {message: "Invalid data", url: sanitizeErrorURL(url), data: resultData}});
} }
if (status === 200 && map) { if (status === 200) {
resultData = map(data); if (!validateWidgetData(widget, endpoint, resultData)) {
return res.status(status).json({error: {message: "Invalid data", url: sanitizeErrorURL(url), data: resultData}});
}
if (map) resultData = map(resultData);
} }
if (contentType) res.setHeader("Content-Type", contentType); if (contentType) res.setHeader("Content-Type", contentType);
@@ -58,7 +58,7 @@ export default async function genericProxyHandler(req, res, map) {
if (status >= 400) { if (status >= 400) {
logger.debug("HTTP Error %d calling %s//%s%s...", status, url.protocol, url.hostname, url.pathname); logger.debug("HTTP Error %d calling %s//%s%s...", status, url.protocol, url.hostname, url.pathname);
return res.status(status).json({error: {message: "HTTP Error", url: sanitizeErrorURL(url), data}}); return res.status(status).json({error: {message: "HTTP Error", url: sanitizeErrorURL(url), resultData}});
} }
return res.status(status).send(resultData); return res.status(status).send(resultData);

View File

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

View File

@@ -1,21 +1,34 @@
/* eslint-disable no-console */
import widgets from "widgets/widgets"; import widgets from "widgets/widgets";
export default function validateWidgetData(widget, endpoint, data) { export default function validateWidgetData(widget, endpoint, data) {
let valid = true; let valid = true;
let dataParsed; let dataParsed = data;
try { let error;
dataParsed = JSON.parse(data); let mapping;
} catch (e) { if (Buffer.isBuffer(data)) {
valid = false; try {
dataParsed = JSON.parse(data);
} catch (e) {
error = e;
valid = false;
}
} }
if (dataParsed && Object.entries(dataParsed).length) { if (dataParsed && Object.entries(dataParsed).length) {
const validate = widgets[widget.type]?.mappings?.[endpoint]?.validate; const mappings = widgets[widget.type]?.mappings;
validate?.forEach(key => { if (mappings) {
if (dataParsed[key] === undefined) { mapping = Object.values(mappings).find(m => m.endpoint === endpoint);
valid = false; mapping?.validate?.forEach(key => {
} if (dataParsed[key] === undefined) {
}); valid = false;
}
});
}
}
if (!valid) {
console.warn(`Invalid data for widget '${widget.type}' endpoint '${endpoint}':\nExpected:${mapping?.validate}\nParse error: ${error ?? "none"}\nData: ${JSON.stringify(data)}`);
} }
return valid; return valid;

View File

@@ -12,7 +12,7 @@ export default function Component({ service }) {
const { data: adguardData, error: adguardError } = useWidgetAPI(widget, "stats"); const { data: adguardData, error: adguardError } = useWidgetAPI(widget, "stats");
if (adguardError) { if (adguardError) {
return <Container error={adguardError} />; return <Container service={service} error={adguardError} />;
} }
if (!adguardData) { if (!adguardData) {

View File

@@ -12,7 +12,7 @@ export default function Component({ service }) {
if (librariesError) { if (librariesError) {
return <Container error={librariesError} />; return <Container service={service} error={librariesError} />;
} }
if (!librariesData) { if (!librariesData) {

View File

@@ -15,7 +15,7 @@ export default function Component({ service }) {
if (usersError || loginsError || failedLoginsError) { if (usersError || loginsError || failedLoginsError) {
const finalError = usersError ?? loginsError ?? failedLoginsError; const finalError = usersError ?? loginsError ?? failedLoginsError;
return <Container error={finalError} />; return <Container service={service} error={finalError} />;
} }
if (!usersData || !loginsData || !failedLoginsData) { if (!usersData || !loginsData || !failedLoginsData) {

View File

@@ -15,7 +15,7 @@ export default function Component({ service }) {
if (statsError || filtersError || indexersError) { if (statsError || filtersError || indexersError) {
const finalError = statsError ?? filtersError ?? indexersError; const finalError = statsError ?? filtersError ?? indexersError;
return <Container error={finalError} />; return <Container service={service} error={finalError} />;
} }
if (!statsData || !filtersData || !indexersData) { if (!statsData || !filtersData || !indexersData) {

View File

@@ -14,7 +14,7 @@ export default function Component({ service }) {
if (moviesError || episodesError) { if (moviesError || episodesError) {
const finalError = moviesError ?? episodesError; const finalError = moviesError ?? episodesError;
return <Container error={finalError} />; return <Container service={service} error={finalError} />;
} }
if (!episodesData || !moviesData) { if (!episodesData || !moviesData) {

View File

@@ -12,7 +12,7 @@ export default function Component({ service }) {
const { data, error } = useWidgetAPI(widget, "info"); const { data, error } = useWidgetAPI(widget, "info");
if (error) { if (error) {
return <Container error={error} />; return <Container service={service} error={error} />;
} }
if (!data) { if (!data) {

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: channelsData, error: channelsError } = useWidgetAPI(widget, "status");
if (channelsError) {
return <Container service={service} error={channelsError} />;
}
if (!channelsData) {
return (
<Container service={service}>
<Block label="channelsdvrserver.shows" />
<Block label="channelsdvrserver.recordings" />
<Block label="channelsdvrserver.scheduled" />
<Block label="channelsdvrserver.passes" />
</Container>
);
}
return (
<Container service={service}>
<Block label="channelsdvrserver.shows" value={t("common.number", { value: channelsData.stats.groups })} />
<Block label="channelsdvrserver.recordings" value={t("common.number", { value: channelsData.stats.files })} />
<Block label="channelsdvrserver.scheduled" value={t("common.number", { value: channelsData.stats.jobs })} />
<Block label="channelsdvrserver.passes" value={t("common.number", { value: channelsData.stats.rules })} />
</Container>
);
}

View File

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

View File

@@ -8,7 +8,7 @@ export default function Component({ service }) {
const { data: statsData, error: statsError } = useWidgetAPI(widget, "cfd_tunnel"); const { data: statsData, error: statsError } = useWidgetAPI(widget, "cfd_tunnel");
if (statsError) { if (statsError) {
return <Container error={statsError} />; return <Container service={service} error={statsError} />;
} }
if (!statsData) { if (!statsData) {
@@ -28,4 +28,4 @@ export default function Component({ service }) {
<Block label="cloudflared.origin_ip" value={originIP} /> <Block label="cloudflared.origin_ip" value={originIP} />
</Container> </Container>
); );
} }

View File

@@ -38,7 +38,7 @@ export default function Component({ service }) {
} }
if (statsError) { if (statsError) {
return <Container error={statsError} />; return <Container service={service} error={statsError} />;
} }
if (!statsData || !dateRange) { if (!statsData || !dateRange) {

View File

@@ -7,6 +7,7 @@ const components = {
autobrr: dynamic(() => import("./autobrr/component")), autobrr: dynamic(() => import("./autobrr/component")),
bazarr: dynamic(() => import("./bazarr/component")), bazarr: dynamic(() => import("./bazarr/component")),
changedetectionio: dynamic(() => import("./changedetectionio/component")), changedetectionio: dynamic(() => import("./changedetectionio/component")),
channelsdvrserver: dynamic(() => import("./channelsdvrserver/component")),
cloudflared: dynamic(() => import("./cloudflared/component")), cloudflared: dynamic(() => import("./cloudflared/component")),
coinmarketcap: dynamic(() => import("./coinmarketcap/component")), coinmarketcap: dynamic(() => import("./coinmarketcap/component")),
deluge: dynamic(() => import("./deluge/component")), deluge: dynamic(() => import("./deluge/component")),
@@ -17,11 +18,13 @@ const components = {
emby: dynamic(() => import("./emby/component")), emby: dynamic(() => import("./emby/component")),
fileflows: dynamic(() => import("./fileflows/component")), fileflows: dynamic(() => import("./fileflows/component")),
flood: dynamic(() => import("./flood/component")), flood: dynamic(() => import("./flood/component")),
freshrss: dynamic(() => import("./freshrss/component")),
ghostfolio: dynamic(() => import("./ghostfolio/component")), ghostfolio: dynamic(() => import("./ghostfolio/component")),
gluetun: dynamic(() => import("./gluetun/component")), gluetun: dynamic(() => import("./gluetun/component")),
gotify: dynamic(() => import("./gotify/component")), gotify: dynamic(() => import("./gotify/component")),
grafana: dynamic(() => import("./grafana/component")), grafana: dynamic(() => import("./grafana/component")),
hdhomerun: dynamic(() => import("./hdhomerun/component")), hdhomerun: dynamic(() => import("./hdhomerun/component")),
homeassistant: dynamic(() => import("./homeassistant/component")),
homebridge: dynamic(() => import("./homebridge/component")), homebridge: dynamic(() => import("./homebridge/component")),
healthchecks: dynamic(() => import("./healthchecks/component")), healthchecks: dynamic(() => import("./healthchecks/component")),
immich: dynamic(() => import("./immich/component")), immich: dynamic(() => import("./immich/component")),
@@ -78,6 +81,7 @@ const components = {
unmanic: dynamic(() => import("./unmanic/component")), unmanic: dynamic(() => import("./unmanic/component")),
uptimekuma: dynamic(() => import("./uptimekuma/component")), uptimekuma: dynamic(() => import("./uptimekuma/component")),
watchtower: dynamic(() => import("./watchtower/component")), watchtower: dynamic(() => import("./watchtower/component")),
whatsupdocker: dynamic(() => import("./whatsupdocker/component")),
xteve: dynamic(() => import("./xteve/component")), xteve: dynamic(() => import("./xteve/component")),
}; };

View File

@@ -12,7 +12,7 @@ export default function Component({ service }) {
const { data: torrentData, error: torrentError } = useWidgetAPI(widget); const { data: torrentData, error: torrentError } = useWidgetAPI(widget);
if (torrentError) { if (torrentError) {
return <Container error={torrentError} />; return <Container service={service} error={torrentError} />;
} }
if (!torrentData) { if (!torrentData) {

View File

@@ -12,7 +12,7 @@ export default function Component({ service }) {
const { data: utilizationData, error: utilizationError } = useWidgetAPI(widget, "utilization"); const { data: utilizationData, error: utilizationError } = useWidgetAPI(widget, "utilization");
if (storageError || infoError || utilizationError) { if (storageError || infoError || utilizationError) {
return <Container error={ storageError ?? infoError ?? utilizationError } />; return <Container service={service} error={ storageError ?? infoError ?? utilizationError } />;
} }
if (!storageData || !infoData || !utilizationData) { if (!storageData || !infoData || !utilizationData) {

View File

@@ -19,7 +19,7 @@ export default function Component({ service }) {
if (statsError || statsData?.error || statusError || statusData?.error) { if (statsError || statsData?.error || statusError || statusData?.error) {
const finalError = statsError ?? statsData?.error ?? statusError ?? statusData?.error; const finalError = statsError ?? statsData?.error ?? statusError ?? statusData?.error;
return <Container error={finalError} />; return <Container service={service} error={finalError} />;
} }
if (statusData && !(statusData.status.includes("running") || statusData.status.includes("partial"))) { if (statusData && !(statusData.status.includes("running") || statusData.status.includes("partial"))) {

View File

@@ -10,7 +10,7 @@ export default function Component({ service }) {
const { data: listData, error: listError } = useWidgetAPI(widget, "list"); const { data: listData, error: listError } = useWidgetAPI(widget, "list");
if (listError) { if (listError) {
return <Container error={listError} />; return <Container service={service} error={listError} />;
} }
const tasks = listData?.data?.tasks; const tasks = listData?.data?.tasks;

View File

@@ -206,7 +206,7 @@ export default function Component({ service }) {
} }
if (sessionsError || countError) { if (sessionsError || countError) {
return <Container error={sessionsError ?? countError} />; return <Container service={service} error={sessionsError ?? countError} />;
} }
const enableBlocks = service.widget?.enableBlocks const enableBlocks = service.widget?.enableBlocks
@@ -272,7 +272,7 @@ export default function Component({ service }) {
); );
} }
if (playing.length === -1) if (playing.length > 0)
return ( return (
<> <>
{enableBlocks && <CountBlocks service={service} countData={countData} />} {enableBlocks && <CountBlocks service={service} countData={countData} />}

View File

@@ -12,7 +12,7 @@ export default function Component({ service }) {
const { data: fileflowsData, error: fileflowsError } = useWidgetAPI(widget, "status"); const { data: fileflowsData, error: fileflowsError } = useWidgetAPI(widget, "status");
if (fileflowsError) { if (fileflowsError) {
return <Container error={fileflowsError} />; return <Container service={service} error={fileflowsError} />;
} }
if (!fileflowsData) { if (!fileflowsData) {

View File

@@ -12,7 +12,7 @@ export default function Component({ service }) {
const { data: torrentData, error: torrentError } = useWidgetAPI(widget, "torrents"); const { data: torrentData, error: torrentError } = useWidgetAPI(widget, "torrents");
if (torrentError || !torrentData?.torrents) { if (torrentError || !torrentData?.torrents) {
return <Container error={torrentError ?? {message: "No torrent data returned"}} />; return <Container service={service} error={torrentError ?? {message: "No torrent data returned"}} />;
} }
if (!torrentData || !torrentData.torrents) { if (!torrentData || !torrentData.torrents) {

View File

@@ -0,0 +1,33 @@
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: freshrssData, error: freshrssError } = useWidgetAPI(widget, "info");
if (freshrssError) {
return <Container service={service} error={freshrssError} />;
}
if (!freshrssData) {
return (
<Container service={service}>
<Block label="freshrss.unread" />
<Block label="freshrss.subscriptions" />
</Container>
);
}
return (
<Container service={service}>
<Block label="freshrss.unread" value={t("common.number", { value: freshrssData.unread })} />
<Block label="freshrss.subscriptions" value={t("common.number", { value: freshrssData.subscriptions })} />
</Container>
);
}

View File

@@ -0,0 +1,97 @@
import cache from "memory-cache";
import { httpProxy } from "utils/proxy/http";
import { formatApiCall } from "utils/proxy/api-helpers";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
import widgets from "widgets/widgets";
const proxyName = "freshrssProxyHandler";
const sessionTokenCacheKey = `${proxyName}__sessionToken`;
const logger = createLogger(proxyName);
async function login(widget, service) {
const endpoint = "accounts/ClientLogin";
const api = widgets?.[widget.type]?.api
const loginUrl = new URL(formatApiCall(api, { endpoint, ...widget }));
const headers = { "Content-Type": "application/x-www-form-urlencoded" };
const [, , data,] = await httpProxy(loginUrl, {
method: "POST",
body: new URLSearchParams({
Email: widget.username,
Passwd: widget.password
}).toString(),
headers,
});
try {
const [, token] = data.toString().split("\n").find(line => line.startsWith("Auth=")).split("=")
cache.put(`${sessionTokenCacheKey}.${service}`, token);
return { token };
} catch (e) {
logger.error("Unable to login to FreshRSS API: %s", e);
}
return { token: false };
}
async function apiCall(widget, endpoint, service) {
const key = `${sessionTokenCacheKey}.${service}`;
const headers = {
"Authorization": `GoogleLogin auth=${cache.get(key)}`,
}
const url = new URL(formatApiCall(widgets[widget.type].api, { endpoint, ...widget }));
const method = "GET";
let [status, contentType, data, responseHeaders] = await httpProxy(url, {
method,
headers,
});
if (status === 401) {
logger.debug("FreshRSS API rejected the request, attempting to obtain new session token");
const { token } = await login(widget, service);
headers.Authorization = `GoogleLogin auth=${token}`;
// retry the request, now with the new session token
[status, contentType, data, responseHeaders] = await httpProxy(url, {
method,
headers,
});
}
if (status !== 200) {
logger.error("Error getting data from FreshRSS: %s status %d. Data: %s", url, status, data);
return { status, contentType, data: null, responseHeaders };
}
return { status, contentType, data: JSON.parse(data.toString()), responseHeaders };
}
export default async function freshrssProxyHandler(req, res) {
const { group, service } = req.query;
if (!group || !service) {
logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
return res.status(400).json({ error: "Invalid proxy service type" });
}
const widget = await getServiceWidget(group, service);
if (!widget) {
logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
return res.status(400).json({ error: "Invalid proxy service type" });
}
if (!cache.get(`${sessionTokenCacheKey}.${service}`)) {
await login(widget, service);
}
const { data: subscriptionData } = await apiCall(widget, "reader/api/0/subscription/list", service);
const { data: unreadCountData } = await apiCall(widget, "reader/api/0/unread-count", service);
return res.status(200).send({
subscriptions: subscriptionData?.subscriptions.length,
unread: unreadCountData?.max
});
}

View File

@@ -0,0 +1,13 @@
import freshrssProxyHandler from "./proxy";
const widget = {
api: "{url}/api/greader.php/{endpoint}?output=json",
proxyHandler: freshrssProxyHandler,
mappings: {
info: {
endpoint: "/"
}
}
};
export default widget;

View File

@@ -18,7 +18,7 @@ export default function Component({ service }) {
if (ghostfolioErrorToday || ghostfolioErrorYear || ghostfolioErrorMax) { if (ghostfolioErrorToday || ghostfolioErrorYear || ghostfolioErrorMax) {
const finalError = ghostfolioErrorToday ?? ghostfolioErrorYear ?? ghostfolioErrorMax const finalError = ghostfolioErrorToday ?? ghostfolioErrorYear ?? ghostfolioErrorMax
return <Container error={finalError} />; return <Container service={service} error={finalError} />;
} }
if (!performanceToday || !performanceYear || !performanceMax) { if (!performanceToday || !performanceYear || !performanceMax) {

View File

@@ -8,7 +8,7 @@ export default function Component({ service }) {
const { data: gluetunData, error: gluetunError } = useWidgetAPI(widget, "ip"); const { data: gluetunData, error: gluetunError } = useWidgetAPI(widget, "ip");
if (gluetunError) { if (gluetunError) {
return <Container error={gluetunError} />; return <Container service={service} error={gluetunError} />;
} }
if (!gluetunData) { if (!gluetunData) {

View File

@@ -11,7 +11,7 @@ export default function Component({ service }) {
if (appsError || messagesError || clientsError) { if (appsError || messagesError || clientsError) {
const finalError = appsError ?? messagesError ?? clientsError; const finalError = appsError ?? messagesError ?? clientsError;
return <Container error={finalError} />; return <Container service={service} error={finalError} />;
} }

View File

@@ -12,7 +12,7 @@ export default function Component({ service }) {
const { data: alertsData, error: alertsError } = useWidgetAPI(widget, "alerts"); const { data: alertsData, error: alertsError } = useWidgetAPI(widget, "alerts");
if (statsError || alertsError) { if (statsError || alertsError) {
return <Container error={statsError ?? alertsError} />; return <Container service={service} error={statsError ?? alertsError} />;
} }
if (!statsData || !alertsData) { if (!statsData || !alertsData) {

View File

@@ -8,7 +8,7 @@ export default function Component({ service }) {
const { data: channelsData, error: channelsError } = useWidgetAPI(widget, "lineup"); const { data: channelsData, error: channelsError } = useWidgetAPI(widget, "lineup");
if (channelsError) { if (channelsError) {
return <Container error={channelsError} />; return <Container service={service} error={channelsError} />;
} }
if (!channelsData) { if (!channelsData) {

View File

@@ -30,7 +30,7 @@ export default function Component({ service }) {
const { data, error } = useWidgetAPI(widget, "checks"); const { data, error } = useWidgetAPI(widget, "checks");
if (error) { if (error) {
return <Container error={error} />; return <Container service={service} error={error} />;
} }
if (!data) { if (!data) {

View File

@@ -0,0 +1,16 @@
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, error } = useWidgetAPI(widget, null, { refreshInterval: 60000 });
if (error) {
return <Container service={service} error={error} />;
}
return <Container service={service}>
{data?.map(d => <Block label={d.label} value={d.value} key={d.label} />)}
</Container>;
}

View File

@@ -0,0 +1,89 @@
import { httpProxy } from "utils/proxy/http";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
const logger = createLogger("homeassistantProxyHandler");
const defaultQueries = [
{
template: "{{ states.person|selectattr('state','equalto','home')|list|length }} / {{ states.person|list|length }}",
label: "homeassistant.people_home"
},
{
template: "{{ states.light|selectattr('state','equalto','on')|list|length }} / {{ states.light|list|length }}",
label: "homeassistant.lights_on"
},
{
template: "{{ states.switch|selectattr('state','equalto','on')|list|length }} / {{ states.switch|list|length }}",
label: "homeassistant.switches_on"
}
];
function formatOutput(output, data) {
return output.replace(/\{.*?\}/g,
(match) => match.replace(/\{|\}/g, "").split(".").reduce((o, p) => o ? o[p] : "", data) ?? "");
}
async function getQuery(query, { url, key }) {
const headers = { Authorization: `Bearer ${key}` };
const { state, template, label, value } = query;
if (state) {
return {
result: await httpProxy(new URL(`${url}/api/states/${state}`), {
headers,
method: "GET"
}),
output: (data) => {
const jsonData = JSON.parse(data);
return {
label: formatOutput(label ?? "{attributes.friendly_name}", jsonData),
value: formatOutput(value ?? "{state} {attributes.unit_of_measurement}", jsonData)
};
}
};
}
if (template) {
return {
result: await httpProxy(new URL(`${url}/api/template`), {
headers,
method: "POST",
body: JSON.stringify({ template })
}),
output: (data) => ({ label, value: data.toString() })
};
}
return { result: [500, null, { error: { message: `invalid query ${JSON.stringify(query)}` } }] };
}
export default async function homeassistantProxyHandler(req, res) {
const { group, service } = req.query;
if (!group || !service) {
logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
return res.status(400).json({ error: "Invalid proxy service type" });
}
const widget = await getServiceWidget(group, service);
if (!widget) {
logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
return res.status(400).json({ error: "Invalid proxy service type" });
}
let queries = defaultQueries;
if (!widget.fields && widget.custom) {
queries = widget.custom.slice(0, 4);
}
const results = await Promise.all(queries.map(q => getQuery(q, widget)));
const err = results.find(r => r.result[2]?.error);
if (err) {
const [status, , data] = err.result;
return res.status(status).send(data);
}
return res.status(200).send(results.map(r => {
const [status, , data] = r.result;
return status === 200 ? r.output(data) : { label: status, value: data.toString() };
}));
}

View File

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

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