Compare commits

..

270 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
150 changed files with 2339 additions and 516 deletions

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.
## 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
This project follows the [Airbnb JavaScript Style Guide](https://github.com/airbnb/javascript), please follow it when submitting pull requests.

View File

@@ -151,7 +151,8 @@
"plex": {
"streams": "Active Streams",
"movies": "أفلام",
"tv": "مسلسلات"
"tv": "مسلسلات",
"albums": "Albums"
},
"sabnzbd": {
"rate": "معدل",
@@ -562,5 +563,24 @@
"books": "Books",
"podcastsDuration": "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": {
"streams": "Активни Потоци",
"movies": "Филми",
"tv": "Сериали"
"tv": "Сериали",
"albums": "Albums"
},
"transmission": {
"download": "Сваляне",
@@ -562,5 +563,24 @@
"books": "Books",
"podcastsDuration": "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": {
"download": "Descàrrega",
"upload": "Pujada",
"leech": "Companys",
"leech": "Clients",
"seed": "Llavors"
},
"mastodon": {
@@ -228,7 +228,8 @@
"plex": {
"streams": "Transmissions actives",
"movies": "Pel·lícules",
"tv": "Programes de TV"
"tv": "Sèries",
"albums": "Àlbums"
},
"glances": {
"cpu": "Processador",
@@ -562,5 +563,24 @@
"books": "Books",
"podcastsDuration": "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": {
"streams": "Aktivní streamy",
"movies": "Filmy",
"tv": "Seriály"
"tv": "Seriály",
"albums": "Albums"
},
"sabnzbd": {
"rate": "Rychlost",
@@ -562,5 +563,24 @@
"books": "Knihy",
"podcastsDuration": "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": {
"movies": "Film",
"tv": "TV-Shows",
"streams": "Aktive Streams"
"streams": "Aktive Streams",
"albums": "Albums"
},
"radarr": {
"queued": "I Kø",
@@ -562,5 +563,24 @@
"podcasts": "Podcasts",
"books": "Books",
"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": {
"streams": "Aktive Streams",
"movies": "Filme",
"tv": "TV Sendungen"
"tv": "TV Sendungen",
"albums": "Albums"
},
"glances": {
"cpu": "Prozessor",
@@ -562,5 +563,24 @@
"books": "Books",
"podcastsDuration": "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

@@ -172,7 +172,8 @@
"plex": {
"streams": "Ενεργά Streams",
"movies": "Ταινίες",
"tv": "Σειρές"
"tv": "Σειρές",
"albums": "Albums"
},
"sabnzbd": {
"rate": "Βαθμός",
@@ -562,5 +563,24 @@
"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",
"seed": "Seed"
},
"freshrss": {
"subscriptions": "Subscriptions",
"unread": "Unread"
},
"changedetectionio": {
"totalObserved": "Total Observed",
"diffsDetected": "Diffs Detected"
},
"channelsdvrserver": {
"shows": "Shows",
"recordings": "Recordings",
"scheduled": "Scheduled",
"passes": "Passes"
},
"tautulli": {
"playing": "Playing",
"transcoding": "Transcoding",
@@ -122,6 +132,7 @@
},
"plex": {
"streams": "Active Streams",
"albums": "Albums",
"movies": "Movies",
"tv": "TV Shows"
},
@@ -571,5 +582,14 @@
"books": "Books",
"podcastsDuration": "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": {
"missing_type": "Missing Widget Type: {{type}}",
"api_error": "API Error",
"missing_type": "Manka Tipo de Fenestraĵo: {{type}}",
"api_error": "Eraro de API",
"information": "Informo",
"status": "Stato",
"url": "URL",
"raw_error": "Raw Error",
"response_data": "Response Data"
"raw_error": "Kruda Eraro",
"response_data": "Respondoj de Demandoj"
},
"weather": {
"current": "Aktuala loko",
"allow": "Click to allow",
"updating": "Updating",
"wait": "Please wait"
"allow": "Klaku por permesi",
"updating": "Ĝisdatiganta",
"wait": "Bonvolu atendi"
},
"search": {
"placeholder": "Serĉi…"
@@ -26,58 +26,58 @@
"mem": "MEM",
"temp": "TEMP",
"months": "mo",
"max": "Max",
"max": "Maks",
"uptime": "UP",
"days": "d",
"days": "t",
"hours": "h",
"minutes": "m"
},
"unifi": {
"users": "Uzantoj",
"uptime": "System Uptime",
"uptime": "Uptempo de la Sistemo",
"days": "Tagoj",
"wan": "WAN",
"lan": "LAN",
"wlan": "WLAN",
"devices": "Aparatoj",
"lan_devices": "LAN Devices",
"wlan_devices": "WLAN Devices",
"lan_users": "LAN Users",
"wlan_users": "WLAN Users",
"lan_devices": "LAN-Aparatoj",
"wlan_devices": "WLAN-Aparatoj",
"lan_users": "LAN-Uzantoj",
"wlan_users": "WLAN-Uzantoj",
"up": "UP",
"down": "DOWN",
"wait": "Please wait",
"empty_data": "Subsystem status unknown"
"wait": "Bonvolu atendi",
"empty_data": "Subsistemostatuso nekonata"
},
"docker": {
"rx": "RX",
"tx": "TX",
"mem": "Memoro",
"cpu": "Ĉefprocesoro",
"offline": "Offline",
"mem": "MEM",
"cpu": "CPO",
"offline": "Malkonekta",
"error": "Eraro",
"unknown": "Nekonata",
"running": "Running",
"starting": "Starting",
"unhealthy": "Unhealthy",
"not_found": "Not Found",
"exited": "Exited",
"partial": "Partial",
"healthy": "Healthy"
"running": "Rulata",
"starting": "Lanĉante",
"unhealthy": "Malsana",
"not_found": "Ne trovita",
"exited": "Eliris",
"partial": "Parta",
"healthy": "Sana"
},
"ping": {
"error": "Eraro",
"ping": "Ping"
"ping": "Sondaĵo"
},
"emby": {
"playing": "Ludante",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"transcoding": "Transkodigo",
"bitrate": "Bitrapido",
"no_active": "No Active Streams",
"movies": "Movies",
"series": "Series",
"episodes": "Episodes",
"songs": "Songs"
"movies": "Filmoj",
"series": "Serioj",
"episodes": "Epizodoj",
"songs": "Kantoj"
},
"changedetectionio": {
"totalObserved": "Total Observed",
@@ -97,7 +97,8 @@
"plex": {
"streams": "Active Streams",
"movies": "Filmoj",
"tv": "Televidprogramoj"
"tv": "Televidprogramoj",
"albums": "Albums"
},
"sabnzbd": {
"rate": "Rate",
@@ -382,8 +383,8 @@
"total": "Totalo"
},
"flood": {
"download": "Download",
"upload": "Upload",
"download": "Elŝuti",
"upload": "Alŝuti",
"leech": "Leech",
"seed": "Seed"
},
@@ -562,5 +563,24 @@
"books": "Books",
"podcastsDuration": "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,7 +18,7 @@
"load": "Carga",
"cpu": "CPU",
"mem": "MEM",
"temp": "TEMPORAL",
"temp": "TEMP",
"max": "Máx.",
"uptime": "ARRIBA",
"months": "Meses",
@@ -183,7 +183,7 @@
"qbittorrent": {
"download": "Bajada",
"upload": "Subida",
"leech": "Compañeros",
"leech": "Pares",
"seed": "Semillas"
},
"mastodon": {
@@ -228,7 +228,8 @@
"plex": {
"streams": "Transmisiones activas",
"movies": "Películas",
"tv": "Series"
"tv": "Series",
"albums": "Álbumes"
},
"glances": {
"cpu": "Procesador",
@@ -562,5 +563,24 @@
"books": "Libros",
"podcastsDuration": "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": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
"tv": "TV Shows",
"albums": "Albums"
},
"glances": {
"wait": "Please wait",
@@ -562,5 +563,24 @@
"books": "Books",
"podcastsDuration": "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,15 +228,16 @@
"plex": {
"streams": "Flux actif",
"movies": "Films",
"tv": "Séries TV"
"tv": "Séries TV",
"albums": "Albums"
},
"glances": {
"cpu": "Cpu",
"mem": "Mém",
"wait": "Merci de patienter",
"temp": "TEMP",
"uptime": "UP",
"days": "d",
"temp": "Temp",
"uptime": "Up",
"days": "j",
"hours": "h"
},
"changedetectionio": {
@@ -562,5 +563,24 @@
"books": "Livres",
"podcastsDuration": "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": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
"tv": "TV Shows",
"albums": "Albums"
},
"glances": {
"cpu": "CPU",
@@ -562,5 +563,24 @@
"books": "Books",
"podcastsDuration": "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": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
"tv": "TV Shows",
"albums": "Albums"
},
"sabnzbd": {
"rate": "Rate",
@@ -562,5 +563,24 @@
"books": "Books",
"podcastsDuration": "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",
"cpu": "CPU",
"mem": "MEM",
"minutes": "m",
"max": "Max",
"minutes": "min",
"max": "Maks",
"uptime": "UP",
"months": "mo",
"months": "mj",
"temp": "TEMP",
"days": "d",
"hours": "h"
@@ -37,7 +37,7 @@
"pihole": {
"queries": "Upiti",
"blocked": "Blokirano",
"gravity": "Čuvanje podataka"
"gravity": "Gravity"
},
"adguard": {
"latency": "Kašnjenje",
@@ -78,26 +78,26 @@
"tx": "TX",
"mem": "MEM",
"cpu": "CPU",
"offline": "Nepovezan",
"offline": "Offline",
"error": "Greška",
"unknown": "Nepoznato",
"running": "Running",
"starting": "Starting",
"unhealthy": "Unhealthy",
"not_found": "Not Found",
"exited": "Exited",
"partial": "Partial",
"healthy": "Healthy"
"running": "Pokrenuto",
"starting": "Pokretanje",
"unhealthy": "Nefunkcionalno",
"not_found": "Nepronađeno",
"exited": "Zatoreno",
"partial": "Djelomično",
"healthy": "Funkcionalno"
},
"emby": {
"playing": "Reprodukcija",
"transcoding": "Prekodiranje",
"bitrate": "Stopa bitova",
"no_active": "Nema aktivnih prijenosa",
"movies": "Movies",
"series": "Series",
"episodes": "Episodes",
"songs": "Songs"
"movies": "Filmovi",
"series": "Serije",
"episodes": "Epizode",
"songs": "Pjesme"
},
"tautulli": {
"playing": "Reprodukcija",
@@ -223,12 +223,13 @@
"devices": "Uređaji",
"lan_devices": "LAN uređaji",
"wlan_devices": "WLAN uređaji",
"empty_data": "Subsystem status unknown"
"empty_data": "Stanje podsustava nepoznato"
},
"plex": {
"streams": "Aktivni prijenosi",
"movies": "Filmovi",
"tv": "TV emisije"
"tv": "TV emisije",
"albums": "Albumi"
},
"glances": {
"cpu": "CPU",
@@ -304,9 +305,9 @@
"quicklaunch": {
"bookmark": "Straničnik",
"service": "Usluga",
"search": "Search",
"custom": "Custom",
"visit": "Visit",
"search": "Traži",
"custom": "Prilagođeno",
"visit": "Posjeti",
"url": "URL"
},
"homebridge": {
@@ -317,7 +318,7 @@
"child_bridges": "Podređeni mosotvi",
"child_bridges_status": "{{ok}}/{{total}}",
"up": "Up",
"pending": "Pending",
"pending": "Predstoji",
"down": "Down"
},
"autobrr": {
@@ -367,7 +368,7 @@
"ping": "Ping"
},
"scrutiny": {
"passed": "Prošlo",
"passed": "Uspjelo",
"failed": "Neuspjelo",
"unknown": "Nepoznato"
},
@@ -399,7 +400,7 @@
},
"nextdns": {
"wait": "Pričekaj",
"no_devices": "Podaci o uređaju nisu primljeni"
"no_devices": "Podaci uređaja nisu primljeni"
},
"common": {
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
@@ -436,131 +437,150 @@
"wanDownload": "WAN preuzimanje"
},
"moonraker": {
"printer_state": "Printer State",
"print_status": "Print Status",
"print_progress": "Progress",
"layers": "Layers"
"printer_state": "Stanje pisača",
"print_status": "Stanje ispisa",
"print_progress": "Napredak",
"layers": "Slojevi"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
"wanted": "Zatraženo",
"queued": "U redu čekanja",
"series": "Serije"
},
"octoprint": {
"printer_state": "Status",
"temp_tool": "Tool temp",
"temp_bed": "Bed temp",
"job_completion": "Completion"
"printer_state": "Stanje",
"temp_tool": "Temperatura alata",
"temp_bed": "Temperatura platforme",
"job_completion": "Dovršenost"
},
"cloudflared": {
"origin_ip": "Origin IP",
"status": "Status"
"origin_ip": "IP izvora",
"status": "Stanje"
},
"proxmoxbackupserver": {
"datastore_usage": "Datastore",
"failed_tasks_24h": "Failed Tasks 24h",
"datastore_usage": "Spremište podataka",
"failed_tasks_24h": "Neuspjeli zadaci 24 h",
"cpu_usage": "CPU",
"memory_usage": "Memory"
"memory_usage": "Memorija"
},
"immich": {
"users": "Users",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
"users": "Korisnici",
"photos": "Fotografije",
"videos": "Videa",
"storage": "Spremište"
},
"uptimekuma": {
"up": "Sites Up",
"down": "Sites Down",
"uptime": "Uptime",
"up": "Aktivne stranice",
"down": "Neaktivne stranice",
"uptime": "Radno vrijeme",
"incident": "Incident",
"m": "m"
"m": "min"
},
"komga": {
"libraries": "Libraries",
"series": "Series",
"books": "Books"
"libraries": "Biblioteke",
"series": "Serije",
"books": "Knjige"
},
"mylar": {
"series": "Series",
"issues": "Issues",
"wanted": "Wanted"
"series": "Serije",
"issues": "Problemi",
"wanted": "Zatraženo"
},
"photoprism": {
"videos": "Videos",
"albums": "Albums",
"photos": "Photos",
"people": "People"
"videos": "Videa",
"albums": "Albumi",
"photos": "Fotografije",
"people": "Osobe"
},
"diskstation": {
"days": "Days",
"uptime": "Uptime",
"volumeAvailable": "Available"
"days": "Dani",
"uptime": "Radno vrijeme",
"volumeAvailable": "Dostupno"
},
"fileflows": {
"queue": "Queue",
"processing": "Processing",
"processed": "Processed",
"time": "Time"
"queue": "Red čekanja",
"processing": "Obrada",
"processed": "Obrađeno",
"time": "Vrijeme"
},
"grafana": {
"alertstriggered": "Alerts Triggered",
"dashboards": "Dashboards",
"datasources": "Data Sources",
"totalalerts": "Total Alerts"
"alertstriggered": "Aktivirana upozorenja",
"dashboards": "Pregledne ploče",
"datasources": "Izvori podataka",
"totalalerts": "Ukupno upozorenja"
},
"nextcloud": {
"cpuload": "Cpu Load",
"memoryusage": "Memory Usage",
"freespace": "Free Space",
"activeusers": "Active Users"
"cpuload": "Cpu opterećenje",
"memoryusage": "Korištenje memorije",
"freespace": "Slobodna memorija",
"activeusers": "Aktivni korisnici"
},
"kopia": {
"status": "Status",
"size": "Size",
"lastrun": "Last Run",
"nextrun": "Next Run",
"failed": "Failed"
"status": "Stanje",
"size": "Veličina",
"lastrun": "Zadnje pokretanje",
"nextrun": "Sljedeće pokretanje",
"failed": "Neuspjelo"
},
"unmanic": {
"active_workers": "Active Workers",
"total_workers": "Total Workers",
"records_total": "Queue Length"
"active_workers": "Aktivni radnici",
"total_workers": "Ukupni radnici",
"records_total": "Količina zapisa u redu čekanja"
},
"healthchecks": {
"new": "New",
"new": "Novo",
"up": "Online",
"grace": "In Grace Period",
"grace": "U razdoblju odgode",
"down": "Offline",
"paused": "Paused",
"status": "Status",
"last_ping": "Last Ping",
"never": "No pings yet"
"paused": "Zaustavljeno",
"status": "Stanje",
"last_ping": "Zadnji ping",
"never": "Još nema pingova"
},
"pterodactyl": {
"servers": "Servers",
"nodes": "Nodes"
"servers": "Serveri",
"nodes": "Čvorovi"
},
"prometheus": {
"targets_up": "Targets Up",
"targets_down": "Targets Down",
"targets_total": "Total Targets"
"targets_up": "Aktivni ciljevi",
"targets_down": "Neaktivni ciljevi",
"targets_total": "Ukupno ciljeva"
},
"minecraft": {
"players": "Players",
"version": "Version",
"status": "Status",
"players": "Igrači",
"version": "Verzija",
"status": "Stanje",
"up": "Online",
"down": "Offline"
},
"ghostfolio": {
"gross_percent_today": "Today",
"gross_percent_1y": "One year",
"gross_percent_max": "All time"
"gross_percent_today": "Danas",
"gross_percent_1y": "Jedna godina",
"gross_percent_max": "Svo vrijeme"
},
"audiobookshelf": {
"podcasts": "Podcasts",
"books": "Books",
"podcastsDuration": "Duration",
"booksDuration": "Duration"
"podcasts": "Podcasti",
"books": "Knjige",
"podcastsDuration": "Trajanje",
"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": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
"tv": "TV Shows",
"albums": "Albums"
},
"glances": {
"cpu": "CPU",
@@ -562,5 +563,24 @@
"books": "Books",
"podcastsDuration": "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": {
"streams": "Trasmissioni attive",
"movies": "Film",
"tv": "Programma televisivo"
"tv": "Programma televisivo",
"albums": "Albums"
},
"glances": {
"cpu": "CPU",
@@ -562,5 +563,24 @@
"books": "Books",
"podcastsDuration": "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": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
"tv": "TV Shows",
"albums": "Albums"
},
"sabnzbd": {
"rate": "Rate",
@@ -562,5 +563,24 @@
"books": "Books",
"podcastsDuration": "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": {
"streams": "활성 스트림",
"movies": "영화",
"tv": "TV 쇼"
"tv": "TV 쇼",
"albums": "Albums"
},
"sabnzbd": {
"rate": "비율",
@@ -562,5 +563,24 @@
"books": "Books",
"podcastsDuration": "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": {
"streams": "Aktīvās straumes",
"movies": "Filmas",
"tv": "TV pārraides"
"tv": "TV pārraides",
"albums": "Albums"
},
"sabnzbd": {
"rate": "Rate",
@@ -562,5 +563,24 @@
"books": "Books",
"podcastsDuration": "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": {
"streams": "Strim Aktif",
"movies": "Filem",
"tv": "Rancangan TV"
"tv": "Rancangan TV",
"albums": "Albums"
},
"sabnzbd": {
"rate": "Kadar",
@@ -562,5 +563,24 @@
"books": "Books",
"podcastsDuration": "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": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
"tv": "TV Shows",
"albums": "Albums"
},
"glances": {
"cpu": "CPU",
@@ -562,5 +563,24 @@
"books": "Books",
"podcastsDuration": "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": {
"streams": "Actieve Streams",
"movies": "Films",
"tv": "TV Series"
"tv": "TV Series",
"albums": "Albums"
},
"glances": {
"cpu": "CPU",
@@ -562,5 +563,24 @@
"books": "Boeken",
"podcastsDuration": "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,10 +15,10 @@
"free": "Wolne",
"cpu": "CPU",
"mem": "PAM",
"temp": "TYMCZASOWE",
"temp": "TEMP.",
"max": "Max",
"uptime": "UP",
"months": "misiąc",
"months": "miesiąc",
"days": "dni",
"hours": "h",
"minutes": "minuty"
@@ -228,7 +228,8 @@
"plex": {
"streams": "Aktywne strumienie",
"movies": "Filmy",
"tv": "Seriale"
"tv": "Seriale",
"albums": "Albums"
},
"glances": {
"cpu": "Procesor",
@@ -562,5 +563,24 @@
"books": "Books",
"podcastsDuration": "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

@@ -54,8 +54,8 @@
"mem": "MEM",
"max": "Máximo",
"temp": "TEMP",
"uptime": "CIMA",
"months": "mo",
"uptime": "LIGADO",
"months": "mês",
"days": "d",
"hours": "h",
"minutes": "m"
@@ -228,14 +228,15 @@
"plex": {
"streams": "Transmissões ativas",
"movies": "Filmes",
"tv": "Séries de TV"
"tv": "Séries de TV",
"albums": "Albums"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Por favor aguarde",
"temp": "TEMP",
"uptime": "CIMA",
"uptime": "LIGADO",
"days": "d",
"hours": "h"
},
@@ -316,9 +317,9 @@
"up_to_date": "Atualizado",
"child_bridges": "Pontes Filhas",
"child_bridges_status": "{{ok}}/{{total}}",
"up": "Cima",
"up": "Ligado",
"pending": "Pendente",
"down": "Baixo"
"down": "Desligado"
},
"autobrr": {
"approvedPushes": "Aprovado",
@@ -562,5 +563,24 @@
"books": "Livros",
"podcastsDuration": "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

@@ -21,7 +21,7 @@
"max": "Máximo",
"temp": "TEMP",
"uptime": "CIMA",
"months": "mo",
"months": "mês",
"days": "d",
"hours": "h",
"minutes": "m"
@@ -241,7 +241,8 @@
"plex": {
"streams": "Streams Ativas",
"movies": "Filmes",
"tv": "Series de TV"
"tv": "Series de TV",
"albums": "Albums"
},
"glances": {
"cpu": "CPU",
@@ -571,5 +572,24 @@
"books": "Livros",
"podcastsDuration": "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": {
"streams": "Fluxuri active",
"movies": "Filme",
"tv": "Seriale"
"tv": "Seriale",
"albums": "Albums"
},
"glances": {
"cpu": "Procesor",
@@ -562,5 +563,24 @@
"books": "Books",
"podcastsDuration": "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": "Использовано",
"load": "Загрузка",
"cpu": "Процессор",
"mem": "MEM",
"temp": "TEMP",
"max": "Max",
"mem": "Память",
"temp": "Температура",
"max": "Макс.",
"uptime": "UP",
"months": "mo",
"days": "d",
"hours": "h",
"minutes": "m"
"months": "мес",
"days": "д",
"hours": "ч",
"minutes": "м"
},
"docker": {
"rx": "Rx",
@@ -34,34 +34,34 @@
"offline": "Не в сети",
"error": "Ошибка",
"unknown": "Неизвестный",
"running": "Running",
"starting": "Starting",
"unhealthy": "Unhealthy",
"not_found": "Not Found",
"exited": "Exited",
"partial": "Partial",
"healthy": "Healthy"
"running": "Запущенно",
"starting": "Запускается",
"unhealthy": "Не живой",
"not_found": "Не найден",
"exited": "Существует",
"partial": "Частично",
"healthy": "Живой"
},
"emby": {
"playing": "Воспроизведение",
"transcoding": "Транскодирование",
"bitrate": "Битрейт",
"no_active": "Нет активных потоков",
"movies": "Movies",
"series": "Series",
"episodes": "Episodes",
"songs": "Songs"
"movies": "Фильмы",
"series": "Сериалы",
"episodes": "Эпизоды",
"songs": "Песни"
},
"tautulli": {
"playing": "Воспроизведение",
"transcoding": "Транскодирование",
"bitrate": "Битрейт",
"no_active": "No Active Streams"
"no_active": "Нет активных трансляций"
},
"rutorrent": {
"active": "Активный",
"upload": "Загрузить",
"download": "Скачать"
"upload": "Загрузка",
"download": "Загрузка"
},
"sonarr": {
"wanted": "Хотел",
@@ -72,7 +72,7 @@
"wanted": "Хотел",
"queued": "В очереди",
"movies": "Фильмы",
"missing": "Missing"
"missing": "Пропущено"
},
"readarr": {
"wanted": "Wanted",
@@ -95,12 +95,12 @@
"gravity": "Сила тяжести"
},
"speedtest": {
"upload": "Загрузка",
"download": "Скачать",
"ping": "пинг"
"upload": "Отдача",
"download": "Загрузка",
"ping": "Пинг"
},
"portainer": {
"running": "Запущено",
"running": "Запущенно",
"stopped": "Остановлено",
"total": "Всего"
},
@@ -121,92 +121,92 @@
"updating": "Обновление"
},
"overseerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available",
"processing": "Processing"
"pending": "Ожидание",
"approved": "Одобрено",
"available": "Доступно",
"processing": "Обработка"
},
"sabnzbd": {
"rate": "Rate",
"queue": "Queue",
"timeleft": "Time Left"
"rate": "Оценка",
"queue": "Очередь",
"timeleft": "Осталось времени"
},
"nzbget": {
"rate": "Rate",
"remaining": "Remaining",
"downloaded": "Downloaded"
"rate": "Оценка",
"remaining": "Осталось",
"downloaded": "Загружено"
},
"coinmarketcap": {
"configure": "Configure one or more crypto currencies to track",
"1hour": "1 Hour",
"1day": "1 Day",
"7days": "7 Days",
"configure": "Настройте одну или несколько криптовалют для отслеживания",
"1hour": "1 Час",
"1day": "1 День",
"7days": "7 Дней",
"30days": "30 Дней"
},
"gotify": {
"apps": "Applications",
"clients": "Clients",
"messages": "Messages"
"apps": "Приложения",
"clients": "Клиенты",
"messages": "Сообщения"
},
"prowlarr": {
"enableIndexers": "Indexers",
"enableIndexers": "Индексаторы",
"numberOfGrabs": "Grabs",
"numberOfQueries": "Queries",
"numberOfQueries": "Запросы",
"numberOfFailGrabs": "Fail Grabs",
"numberOfFailQueries": "Fail Queries"
},
"transmission": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
"download": "Загрузка",
"upload": "Отдача",
"leech": "Пиры",
"seed": "Сиды"
},
"jackett": {
"configured": "Configured",
"errored": "Errored"
"configured": "Настроено",
"errored": "Ошибочно"
},
"bazarr": {
"missingEpisodes": "Missing Episodes",
"missingMovies": "Missing Movies"
"missingEpisodes": "Отсутствующие эпизоды",
"missingMovies": "Отсутствующие фильмы"
},
"lidarr": {
"wanted": "Wanted",
"queued": "Queued",
"albums": "Albums"
"wanted": "Хотел",
"queued": "В очереди",
"albums": "Альбомы"
},
"adguard": {
"queries": "Queries",
"blocked": "Blocked",
"filtered": "Filtered",
"latency": "Latency"
"queries": "Запросы",
"blocked": "Заблокировано",
"filtered": "Отсортировано",
"latency": "Задержка"
},
"qbittorrent": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
"download": "Загрузка",
"upload": "Отдача",
"leech": "Пиры",
"seed": "Сиды"
},
"mastodon": {
"user_count": "Users",
"status_count": "Posts",
"domain_count": "Domains"
"user_count": "Пользователи",
"status_count": "Посты",
"domain_count": "Домены"
},
"strelaysrv": {
"numConnections": "Connections",
"dataRelayed": "Relayed",
"transferRate": "Rate",
"numActiveSessions": "Sessions"
"numConnections": "Соединения",
"dataRelayed": "Ретранслировано",
"transferRate": "Оценка",
"numActiveSessions": "Сессий"
},
"authentik": {
"users": "Users",
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)"
"users": "Пользователи",
"loginsLast24H": "Входы (24ч)",
"failedLoginsLast24H": "Неудачные входы (24ч)"
},
"proxmox": {
"mem": "MEM",
"cpu": "CPU",
"mem": "Память",
"cpu": "Процессор",
"lxc": "LXC",
"vms": "VMs"
"vms": "Виртуальные машины"
},
"unifi": {
"users": "Пользователи",
@@ -215,37 +215,38 @@
"wan": "WAN",
"lan_users": "Пользователи LAN",
"wlan_users": "Пользователи WLAN",
"up": "UP",
"down": "DOWN",
"wait": "Подождите",
"up": "Работает",
"down": "Не работает",
"wait": "Пожалуйста, подождите",
"lan": "LAN",
"wlan": "WLAN",
"devices": "Устройства",
"lan_devices": "Устройства подключённые по LAN",
"wlan_devices": "WLAN Devices",
"empty_data": "Subsystem status unknown"
"wlan_devices": "Подключения WLAN",
"empty_data": "Статус системы неизвестен"
},
"plex": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
"streams": "Активные трансляции",
"movies": "Фильмы",
"tv": "Передачи",
"albums": "Альбомы"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait",
"temp": "TEMP",
"uptime": "UP",
"days": "d",
"hours": "h"
"cpu": "Процессор",
"mem": "Память",
"wait": "Пожалуйста, подождите",
"temp": "Температура",
"uptime": "Работает",
"days": "д",
"hours": "ч"
},
"changedetectionio": {
"totalObserved": "Всего наблюдаемых",
"diffsDetected": "Обнаружены различия"
},
"wmo": {
"0-day": "Sunny",
"0-night": "Clear",
"0-day": "Солнечно",
"0-night": "Ясно",
"71-night": "Light Snow",
"73-day": "Snow",
"73-night": "Snow",
@@ -256,22 +257,22 @@
"80-day": "Light Showers",
"80-night": "Light Showers",
"81-day": "Showers",
"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",
"1-day": "Преимущественно солнечно",
"1-night": "Преимущественно ясно",
"2-day": "Переменная облачность",
"2-night": "Переменная облачность",
"3-day": "Облачно",
"3-night": "Облачно",
"45-day": "Туманно",
"45-night": "Туманно",
"48-day": "Туманно",
"48-night": "Туманно",
"51-day": "Слегка моросит",
"51-night": "Слегка моросит",
"53-day": "Моросит",
"53-night": "Моросит",
"55-day": "Сильно моросит",
"55-night": "Сильно моросит",
"56-day": "Light Freezing Drizzle",
"56-night": "Light Freezing Drizzle",
"57-day": "Freezing Drizzle",
@@ -302,55 +303,55 @@
"99-night": "Thunderstorm With Hail"
},
"quicklaunch": {
"bookmark": "Bookmark",
"service": "Service",
"search": "Search",
"custom": "Custom",
"bookmark": "Закладка",
"service": "Сервис",
"search": "Поиск",
"custom": "Пользовательский",
"visit": "Visit",
"url": "URL"
},
"homebridge": {
"available_update": "System",
"updates": "Updates",
"update_available": "Update Available",
"up_to_date": "Up to Date",
"available_update": "Система",
"updates": "Обновления",
"update_available": "Доступные обновления",
"up_to_date": "Обновлено",
"child_bridges_status": "{{ok}}/{{total}}",
"child_bridges": "Child Bridges",
"child_bridges": "Дочерние мосты",
"up": "Up",
"pending": "Pending",
"pending": "В ожидании",
"down": "Down"
},
"autobrr": {
"approvedPushes": "Approved",
"rejectedPushes": "Rejected",
"filters": "Filters",
"indexers": "Indexers"
"approvedPushes": "Одобрено",
"rejectedPushes": "Отклонено",
"filters": "Фильтры",
"indexers": "Индексаторы"
},
"watchtower": {
"containers_scanned": "Scanned",
"containers_updated": "Updated",
"containers_scanned": "Отсканировано",
"containers_updated": "Обновлено",
"containers_failed": "Failed"
},
"tubearchivist": {
"downloads": "Queue",
"videos": "Videos",
"channels": "Channels",
"playlists": "Playlists"
"downloads": "Очередь",
"videos": "Видео",
"channels": "Каналы",
"playlists": "Плейлисты"
},
"truenas": {
"load": "System Load",
"uptime": "Uptime",
"alerts": "Alerts",
"load": "Загрузка системы",
"uptime": "Время работы",
"alerts": "Уведомления",
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
},
"navidrome": {
"nothing_streaming": "No Active Streams",
"please_wait": "Please Wait"
"nothing_streaming": "Нет активных трансляций",
"please_wait": "Пожалуйста, подождите"
},
"pyload": {
"speed": "Speed",
"speed": "Скорость",
"active": "Active",
"queue": "Queue",
"queue": "Очередь",
"total": "Total"
},
"gluetun": {
@@ -373,29 +374,29 @@
},
"paperlessngx": {
"inbox": "Inbox",
"total": "Total"
"total": "Всего"
},
"deluge": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
"download": "Загрузка",
"upload": "Отдача",
"leech": "Пиры",
"seed": "Сиды"
},
"flood": {
"upload": "Upload",
"download": "Download",
"leech": "Leech",
"seed": "Seed"
"upload": "Отдача",
"download": "Загрузка",
"leech": "Пиры",
"seed": "Сиды"
},
"tdarr": {
"queue": "Queue",
"processed": "Processed",
"errored": "Errored",
"saved": "Saved"
"queue": "Очередь",
"processed": "Обработано",
"errored": "Ошибочно",
"saved": "Сохранено"
},
"miniflux": {
"read": "Read",
"unread": "Unread"
"read": "Прочитанные",
"unread": "Непрочитанные"
},
"nextdns": {
"wait": "Please Wait",
@@ -406,17 +407,17 @@
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
},
"omada": {
"connectedSwitches": "Connected switches",
"connectedAp": "Connected APs",
"activeUser": "Active devices",
"alerts": "Alerts",
"connectedGateway": "Connected gateways"
"connectedSwitches": "Подключенные свитчи",
"connectedAp": "Подключенные точки доступа",
"activeUser": "Активные устройства",
"alerts": "Оповещения",
"connectedGateway": "Подключенные шлюзы"
},
"downloadstation": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
"download": "Загрузка",
"upload": "Отдача",
"leech": "Пиры",
"seed": "Сиды"
},
"mikrotik": {
"cpuLoad": "CPU Load",
@@ -442,9 +443,9 @@
"layers": "Layers"
},
"medusa": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
"wanted": "Хотел",
"queued": "В очереди",
"series": "Сериалы"
},
"octoprint": {
"printer_state": "Status",
@@ -527,14 +528,14 @@
"records_total": "Queue Length"
},
"healthchecks": {
"new": "New",
"up": "Online",
"new": "Новые",
"up": "Онлайн",
"grace": "In Grace Period",
"down": "Offline",
"paused": "Paused",
"status": "Status",
"last_ping": "Last Ping",
"never": "No pings yet"
"down": "Офлайн",
"paused": "Приостановлено",
"status": "Статус",
"last_ping": "Последний пинг",
"never": "Пока нет пингов"
},
"pterodactyl": {
"servers": "Servers",
@@ -546,11 +547,11 @@
"targets_total": "Total Targets"
},
"minecraft": {
"players": "Players",
"version": "Version",
"status": "Status",
"up": "Online",
"down": "Offline"
"players": "Игроков",
"version": "Версия",
"status": "Статус",
"up": "Онлайн",
"down": "Офлайн"
},
"ghostfolio": {
"gross_percent_today": "Today",
@@ -562,5 +563,24 @@
"books": "Books",
"podcastsDuration": "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": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
"tv": "TV Shows",
"albums": "Albums"
},
"sabnzbd": {
"rate": "Rate",
@@ -562,5 +563,24 @@
"books": "Books",
"podcastsDuration": "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": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
"tv": "TV Shows",
"albums": "Albums"
},
"sabnzbd": {
"rate": "Rate",
@@ -562,5 +563,24 @@
"books": "Books",
"podcastsDuration": "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": {
"streams": "Aktiva strömmar",
"movies": "Filmer",
"tv": "TV-serier"
"tv": "TV-serier",
"albums": "Albums"
},
"glances": {
"cpu": "CPU",
@@ -562,5 +563,24 @@
"books": "Books",
"podcastsDuration": "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": {
"streams": "యాక్టివ్ స్ట్రీమ్‌లు",
"movies": "సినిమాలు",
"tv": "దూరదర్శిని కార్యక్రమాలు"
"tv": "దూరదర్శిని కార్యక్రమాలు",
"albums": "Albums"
},
"glances": {
"cpu": "సీపియూ",
@@ -562,5 +563,24 @@
"books": "Books",
"podcastsDuration": "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": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
"tv": "TV Shows",
"albums": "Albums"
},
"sabnzbd": {
"rate": "Rate",
@@ -562,5 +563,24 @@
"books": "Books",
"podcastsDuration": "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": {
"streams": "Aktif Akış",
"movies": "Filmler",
"tv": "TV Showları"
"tv": "TV Showları",
"albums": "Albums"
},
"sabnzbd": {
"rate": "Oran",
@@ -562,5 +563,24 @@
"books": "Books",
"podcastsDuration": "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": {
"streams": "Активні потоки",
"movies": "Фільми",
"tv": "TБ шоу"
"tv": "TБ шоу",
"albums": "Альбоми"
},
"transmission": {
"download": "Завантаження",
@@ -562,5 +563,24 @@
"books": "Книжки",
"podcastsDuration": "Тривалість",
"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": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
"tv": "TV Shows",
"albums": "Albums"
},
"glances": {
"cpu": "CPU",
@@ -562,5 +563,24 @@
"books": "Books",
"podcastsDuration": "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": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
"tv": "TV Shows",
"albums": "Albums"
},
"glances": {
"cpu": "CPU",
@@ -562,5 +563,24 @@
"books": "Books",
"podcastsDuration": "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": {
"streams": "活动流",
"movies": "电影",
"tv": "电视节目"
"tv": "电视节目",
"albums": "专辑"
},
"glances": {
"cpu": "处理器",
@@ -541,9 +542,9 @@
"nodes": "节点"
},
"prometheus": {
"targets_up": "Targets Up",
"targets_down": "Targets Down",
"targets_total": "Total Targets"
"targets_up": "目标离线",
"targets_down": "目标在线",
"targets_total": "总目标"
},
"minecraft": {
"players": "播放中",
@@ -562,5 +563,24 @@
"books": "图书",
"podcastsDuration": "持续时间",
"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": {
"streams": "正在播放",
"movies": "電影",
"tv": "影集"
"tv": "影集",
"albums": "Albums"
},
"glances": {
"cpu": "CPU",
@@ -562,5 +563,24 @@
"books": "Books",
"podcastsDuration": "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} />
{results.length > 0 && <ul className="max-h-[60vh] overflow-y-auto m-2">
{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(
"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",

View File

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

View File

@@ -34,7 +34,7 @@ export default function Item({ service }) {
<div
className={`${
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">
{service.icon &&

View File

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

View File

@@ -25,7 +25,7 @@ export default function Ping({ service }) {
const statusText = `${service.ping}: HTTP status ${data.status}`;
if (data && data.status !== 200) {
if (data.status > 403) {
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="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 (
<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>
);
}
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="text-[8px] font-bold text-emerald-500/80">{t("common.ms", { value: data.latency, style: "unit", unit: "millisecond", unitDisplay: "narrow", maximumFractionDigits: 0 })}</div>
</div>
);
}

View File

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

View File

@@ -9,12 +9,10 @@ function displayData(data) {
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();
if (error?.data?.error) {
error = error.data.error; // eslint-disable-line no-param-reassign
}
const { error } = err?.data ?? { error: err };
return (
<details className="px-1 pb-1">

View File

@@ -6,7 +6,7 @@ import { useTranslation } from "next-i18next";
import UsageBar from "../resources/usage-bar";
const cpuSensorLabels = ["cpu_thermal", "Core"];
const cpuSensorLabels = ["cpu_thermal", "Core", "Tctl"];
function convertToFahrenheit(t) {
return t * 9/5 + 32

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);
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);
if (containerExists) {

View File

@@ -21,7 +21,7 @@ export default async function handler(req, res) {
});
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
startTime = performance.now();
[status] = await httpProxy(pingURL);

View File

@@ -318,15 +318,26 @@ function Home({ initialSettings }) {
export default function Wrapper({ initialSettings, fallback }) {
const wrappedStyle = {};
let backgroundBlur = false;
let backgroundSaturate = false;
let backgroundBrightness = false;
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;
wrappedStyle.backgroundImage = `
linear-gradient(
rgb(var(--bg-color) / ${opacityValue}),
rgb(var(--bg-color) / ${opacityValue})
),
url(${initialSettings.background})`;
url(${backgroundImage})`;
wrappedStyle.backgroundPosition = "center";
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"
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>
);

View File

@@ -32,6 +32,7 @@ export async function servicesFromConfig() {
services: servicesGroup[Object.keys(servicesGroup)[0]].map((entries) => ({
name: Object.keys(entries)[0],
...entries[Object.keys(entries)[0]],
type: 'service'
})),
}));
@@ -82,6 +83,7 @@ export async function servicesFromDocker() {
constructedService = {
container: container.Names[0].replace(/^\//, ""),
server: serverName,
type: 'service'
};
}
shvl.set(constructedService, label.replace("homepage.", ""), container.Labels[label]);
@@ -183,6 +185,7 @@ export async function servicesFromKubernetes() {
icon: ingress.metadata.annotations[`${ANNOTATION_BASE}/icon`] || '',
description: ingress.metadata.annotations[`${ANNOTATION_BASE}/description`] || '',
external: false,
type: 'service'
};
if (ingress.metadata.annotations[`${ANNOTATION_BASE}/external`]) {
constructedService.external = String(ingress.metadata.annotations[`${ANNOTATION_BASE}/external`]).toLowerCase() === "true"
@@ -254,6 +257,7 @@ export function cleanServiceGroups(groups) {
const {
type, // all widgets
fields,
hideErrors,
server, // docker widget
container,
currency, // coinmarketcap widget
@@ -266,7 +270,7 @@ export function cleanServiceGroups(groups) {
wan, // opnsense widget,
enableBlocks, // emby/jellyfin
enableNowPlaying,
volume // diskstation widget
volume, // diskstation widget
} = cleanedService.widget;
const fieldsList = typeof fields === 'string' ? JSON.parse(fields) : fields;
@@ -274,6 +278,7 @@ export function cleanServiceGroups(groups) {
cleanedService.widget = {
type,
fields: fieldsList || null,
hide_errors: hideErrors || false,
service_name: service.name,
service_group: serviceGroup.name,
};

View File

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

View File

@@ -39,15 +39,15 @@ export default async function genericProxyHandler(req, res, map) {
let resultData = data;
if (!validateWidgetData(widget, endpoint, resultData)) {
if (resultData.error && resultData.error.url) {
resultData.error.url = sanitizeErrorURL(url);
}
return res.status(status).json({error: {message: "Invalid data", url: sanitizeErrorURL(url), data: resultData}});
if (resultData.error?.url) {
resultData.error.url = sanitizeErrorURL(url);
}
if (status === 200 && map) {
resultData = map(data);
if (status === 200) {
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);
@@ -58,7 +58,7 @@ export default async function genericProxyHandler(req, res, map) {
if (status >= 400) {
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);

View File

@@ -1,23 +1,34 @@
/* eslint-disable no-console */
import widgets from "widgets/widgets";
export default function validateWidgetData(widget, endpoint, data) {
let valid = true;
let dataParsed = data;
let error;
let mapping;
if (Buffer.isBuffer(data)) {
try {
dataParsed = JSON.parse(data);
} catch (e) {
error = e;
valid = false;
}
}
if (dataParsed && Object.entries(dataParsed).length) {
const validate = widgets[widget.type]?.mappings?.[endpoint]?.validate;
validate?.forEach(key => {
if (dataParsed[key] === undefined) {
valid = false;
}
});
const mappings = widgets[widget.type]?.mappings;
if (mappings) {
mapping = Object.values(mappings).find(m => m.endpoint === endpoint);
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;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -19,7 +19,7 @@ export default function Component({ service }) {
if (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"))) {

View File

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

View File

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

View File

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

View File

@@ -12,7 +12,7 @@ export default function Component({ service }) {
const { data: torrentData, error: torrentError } = useWidgetAPI(widget, "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) {

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) {
const finalError = ghostfolioErrorToday ?? ghostfolioErrorYear ?? ghostfolioErrorMax
return <Container error={finalError} />;
return <Container service={service} error={finalError} />;
}
if (!performanceToday || !performanceYear || !performanceMax) {

View File

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

View File

@@ -11,7 +11,7 @@ export default function Component({ service }) {
if (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");
if (statsError || alertsError) {
return <Container error={statsError ?? alertsError} />;
return <Container service={service} error={statsError ?? alertsError} />;
}
if (!statsData || !alertsData) {

View File

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

View File

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

View File

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

View File

@@ -52,7 +52,7 @@ async function apiCall(widget, endpoint, service) {
if (status === 401 || status === 403) {
logger.debug("Homebridge API rejected the request, attempting to obtain new session token");
const { accessToken } = login(widget, service);
const { accessToken } = await login(widget, service);
headers.Authorization = `Bearer ${accessToken}`;
// retry the request, now with the new session token

View File

@@ -11,7 +11,7 @@ export default function Component({ service }) {
const { data: immichData, error: immichError } = useWidgetAPI(widget);
if (immichError || immichData?.statusCode === 401) {
return <Container error={immichError ?? immichData} />;
return <Container service={service} error={immichError ?? immichData} />;
}
if (!immichData) {

View File

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

View File

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

View File

@@ -14,7 +14,7 @@ export default function Component({ service }) {
if (libraryError || seriesError || bookError) {
const finalError = libraryError ?? seriesError ?? bookError;
return <Container error={finalError} />;
return <Container service={service} error={finalError} />;
}
if (!libraryData || !seriesData || !bookData) {
@@ -34,4 +34,4 @@ export default function Component({ service }) {
<Block label="komga.books" value={t("common.number", { value: bookData.totalElements })} />
</Container>
);
}
}

View File

@@ -38,7 +38,7 @@ export default function Component({ service }) {
const { data: statusData, error: statusError } = useWidgetAPI(widget, "status");
if (statusError) {
return <Container error={statusError} />;
return <Container service={service} error={statusError} />;
}
const source = statusData?.sources[0];
@@ -65,4 +65,4 @@ export default function Component({ service }) {
{nextTime && <Block label="kopia.nextrun" value={ relativeDate(nextTime) } />}
</Container>
);
}
}

View File

@@ -16,7 +16,7 @@ export default function Component({ service }) {
`/api/kubernetes/stats/${widget.namespace}/${widget.app}?${podSelectorString}`);
if (statsError || statusError) {
return <Container error={t("widget.api_error")} />;
return <Container service={service} error={t("widget.api_error")} />;
}
if (statusData && statusData.status !== "running") {

View File

@@ -15,7 +15,7 @@ export default function Component({ service }) {
if (albumsError || wantedError || queueError) {
const finalError = albumsError ?? wantedError ?? queueError;
return <Container error={finalError} />;
return <Container service={service} error={finalError} />;
}
if (!albumsData || !wantedData || !queueData) {

View File

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

View File

@@ -13,7 +13,7 @@ export default function Component({ service }) {
if (statsError || futureError) {
const finalError = statsError ?? futureError;
return <Container error={finalError} />;
return <Container service={service} error={finalError} />;
}
if (!statsData || !futureData) {

View File

@@ -14,7 +14,7 @@ export default function Component({ service }) {
if (statsError || leasesError) {
const finalError = statsError ?? leasesError;
return <Container error={ finalError } />;
return <Container service={service} error={ finalError } />;
}
if (!statsData || !leasesData) {

View File

@@ -10,7 +10,7 @@ export default function Component({ service }) {
const { t } = useTranslation();
if(serverError){
return <Container error={serverError} />;
return <Container service={service} error={serverError} />;
}
if (!serverData) {
return (

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