Compare commits

..

480 Commits

Author SHA1 Message Date
Ben Phelps
4ea279856f Merge pull request #377 from shamoon/unified-infowidget-settings
Feature: Unified info widget settings
2022-10-13 16:13:43 +03:00
GodD6366
c7d1c05e6e Fix the page auto zoom when ios input focus (#379) 2022-10-12 18:03:09 +03:00
Michael Shamoon
48a09e5a99 Refactor info widget sanitizing / privateOptions 2022-10-12 01:53:57 -07:00
Michael Shamoon
dced918804 Update unifi_console to use private widget options 2022-10-12 01:53:57 -07:00
Anonymous
9dd259654a Translated using Weblate (Bulgarian)
Currently translated at 33.3% (46 of 138 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2022-10-12 10:20:27 +02:00
Anonymous
8f644ef7a4 Translated using Weblate (Telugu)
Currently translated at 97.8% (135 of 138 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2022-10-12 10:20:27 +02:00
Anonymous
61e82e2b2c Translated using Weblate (Finnish)
Currently translated at 89.1% (123 of 138 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2022-10-12 10:20:26 +02:00
Anonymous
17ec656b9b Translated using Weblate (Yue)
Currently translated at 85.5% (118 of 138 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2022-10-12 10:20:26 +02:00
Anonymous
9669c463da Translated using Weblate (Portuguese (Brazil))
Currently translated at 83.3% (115 of 138 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2022-10-12 10:20:26 +02:00
Anonymous
02dd6d08b4 Translated using Weblate (Romanian)
Currently translated at 85.5% (118 of 138 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2022-10-12 10:20:26 +02:00
Anonymous
a8bd84467c Translated using Weblate (Hebrew)
Currently translated at 73.1% (101 of 138 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2022-10-12 10:20:25 +02:00
Anonymous
770d52cbae Translated using Weblate (Hungarian)
Currently translated at 78.2% (108 of 138 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2022-10-12 10:20:25 +02:00
Anonymous
73a200994c Translated using Weblate (Croatian)
Currently translated at 83.3% (115 of 138 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2022-10-12 10:20:25 +02:00
Anonymous
c1d14e3b16 Translated using Weblate (Swedish)
Currently translated at 77.5% (107 of 138 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2022-10-12 10:20:25 +02:00
Anonymous
e7215feee1 Translated using Weblate (Polish)
Currently translated at 71.0% (98 of 138 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2022-10-12 10:20:25 +02:00
Anonymous
be4d02f5e9 Translated using Weblate (Catalan)
Currently translated at 88.4% (122 of 138 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-10-12 10:20:24 +02:00
Anonymous
92e47c45f9 Translated using Weblate (Chinese (Traditional))
Currently translated at 6.5% (9 of 138 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2022-10-12 10:20:24 +02:00
Anonymous
73b44c3a2e Translated using Weblate (Dutch)
Currently translated at 45.6% (63 of 138 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2022-10-12 10:20:24 +02:00
Anonymous
bf666b3ec4 Translated using Weblate (Vietnamese)
Currently translated at 31.8% (44 of 138 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2022-10-12 10:20:24 +02:00
Anonymous
69a67f450d Translated using Weblate (Norwegian Bokmål)
Currently translated at 57.2% (79 of 138 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2022-10-12 10:20:23 +02:00
Anonymous
73e1d3dc20 Translated using Weblate (Italian)
Currently translated at 55.7% (77 of 138 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2022-10-12 10:20:23 +02:00
Anonymous
95f811e4c1 Translated using Weblate (Chinese (Simplified))
Currently translated at 89.1% (123 of 138 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-10-12 10:20:23 +02:00
Anonymous
65447f2b97 Translated using Weblate (Russian)
Currently translated at 16.6% (23 of 138 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2022-10-12 10:20:23 +02:00
Anonymous
b6dd2975e7 Translated using Weblate (Portuguese)
Currently translated at 83.3% (115 of 138 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2022-10-12 10:20:23 +02:00
Anonymous
911bd31c14 Translated using Weblate (French)
Currently translated at 97.8% (135 of 138 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-10-12 10:20:22 +02:00
Anonymous
072e29025e Translated using Weblate (Spanish)
Currently translated at 87.6% (121 of 138 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-10-12 10:20:22 +02:00
Anonymous
7bb8274b95 Translated using Weblate (German)
Currently translated at 85.5% (118 of 138 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2022-10-12 10:20:22 +02:00
hunkyn
280c8b0147 Translated using Weblate (Telugu)
Currently translated at 100.0% (135 of 135 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2022-10-12 10:20:13 +02:00
GM
46a29ea7d6 Translated using Weblate (Chinese (Simplified))
Currently translated at 91.1% (123 of 135 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-10-12 10:20:13 +02:00
Ben Phelps
b259ecf870 Merge pull request #369 from shamoon/glances-info-widget
Feature: Glances info widget
2022-10-12 11:17:25 +03:00
Michael Shamoon
c1a55ff6d3 Update glances to use private widget options API 2022-10-11 12:16:18 -07:00
Michael Shamoon
7c39cd8960 Private widget options API 2022-10-11 12:16:18 -07:00
Ben Phelps
2bdd9eaa88 remove shortcuts from manifest 2022-10-11 21:56:48 +03:00
Michael Shamoon
8e2ff61f1c Allow multiple glances widgets with optional id property 2022-10-11 10:21:57 -07:00
Michael Shamoon
99b70f96e4 Allow username + password for glances 2022-10-11 10:21:57 -07:00
Michael Shamoon
802fe0f721 Glances widget use settings for URL 2022-10-11 10:21:57 -07:00
Michael Shamoon
080bc44a6f Lint glances info widget 2022-10-11 10:21:57 -07:00
Michael Shamoon
321efd08cc Glances info widget 2022-10-11 10:21:57 -07:00
Jason Fischer
37fed0ce01 Merge pull request #372 from shamoon/plex-service-widget-key
Fix: change Plex service widget to use "key" not "token"
2022-10-11 08:12:16 -07:00
Michael Shamoon
778261f67e Change Plex service widget to use key not token 2022-10-11 07:08:29 -07:00
Ben Phelps
c95422b682 impl. mdi icons with the possibility for others 2022-10-11 15:02:38 +03:00
Lalyu Lalev
248c18d978 Translated using Weblate (Bulgarian)
Currently translated at 34.0% (46 of 135 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2022-10-11 02:17:31 +02:00
hunkyn
add17be5ba Translated using Weblate (Telugu)
Currently translated at 100.0% (135 of 135 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2022-10-11 02:17:31 +02:00
Anonymous
c7b5ec33a8 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (0 of 0 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/
2022-10-10 16:55:08 +02:00
Nonoss117
0625ce2bb9 Translated using Weblate (French)
Currently translated at 100.0% (135 of 135 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-10-10 16:55:06 +02:00
Lalyu Lalev
860ae7f0f7 Added translation using Weblate (Bulgarian) 2022-10-10 16:54:57 +02:00
Anonymous
094b916c9e Translated using Weblate (Telugu)
Currently translated at 86.6% (117 of 135 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2022-10-10 15:33:21 +02:00
Anonymous
f50130971d Translated using Weblate (Finnish)
Currently translated at 91.1% (123 of 135 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2022-10-10 15:33:21 +02:00
Anonymous
05183a8861 Translated using Weblate (Yue)
Currently translated at 87.4% (118 of 135 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2022-10-10 15:33:21 +02:00
Anonymous
92ffb8d082 Translated using Weblate (Portuguese (Brazil))
Currently translated at 85.1% (115 of 135 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2022-10-10 15:33:21 +02:00
Anonymous
9d79e7e72d Translated using Weblate (Romanian)
Currently translated at 87.4% (118 of 135 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2022-10-10 15:33:20 +02:00
Anonymous
6b201028cd Translated using Weblate (Hebrew)
Currently translated at 74.8% (101 of 135 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2022-10-10 15:33:20 +02:00
Anonymous
46e0732bd1 Translated using Weblate (Hungarian)
Currently translated at 80.0% (108 of 135 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2022-10-10 15:33:20 +02:00
Anonymous
375e513246 Translated using Weblate (Croatian)
Currently translated at 85.1% (115 of 135 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2022-10-10 15:33:20 +02:00
Anonymous
2c80dc63d1 Translated using Weblate (Swedish)
Currently translated at 79.2% (107 of 135 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2022-10-10 15:33:19 +02:00
Anonymous
d8a4d1ef5d Translated using Weblate (Polish)
Currently translated at 72.5% (98 of 135 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2022-10-10 15:33:19 +02:00
Anonymous
2e4e998654 Translated using Weblate (Catalan)
Currently translated at 90.3% (122 of 135 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-10-10 15:33:19 +02:00
Anonymous
5b66941774 Translated using Weblate (Chinese (Traditional))
Currently translated at 6.6% (9 of 135 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2022-10-10 15:33:18 +02:00
Anonymous
6f34ca50e0 Translated using Weblate (Dutch)
Currently translated at 46.6% (63 of 135 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2022-10-10 15:33:18 +02:00
Anonymous
59af5e1eb8 Translated using Weblate (Vietnamese)
Currently translated at 32.5% (44 of 135 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2022-10-10 15:33:17 +02:00
Anonymous
b34a44cf9f Translated using Weblate (Norwegian Bokmål)
Currently translated at 58.5% (79 of 135 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2022-10-10 15:33:17 +02:00
Anonymous
45c92ef2f7 Translated using Weblate (Italian)
Currently translated at 57.0% (77 of 135 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2022-10-10 15:33:17 +02:00
Anonymous
8854fcdb9b Translated using Weblate (Chinese (Simplified))
Currently translated at 90.3% (122 of 135 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-10-10 15:33:17 +02:00
Anonymous
8299c6ce8d Translated using Weblate (Russian)
Currently translated at 17.0% (23 of 135 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2022-10-10 15:33:16 +02:00
Anonymous
d5861ea52b Translated using Weblate (Portuguese)
Currently translated at 85.1% (115 of 135 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2022-10-10 15:33:16 +02:00
Anonymous
855665689c Translated using Weblate (French)
Currently translated at 91.1% (123 of 135 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-10-10 15:33:16 +02:00
Anonymous
a4795c21dc Translated using Weblate (Spanish)
Currently translated at 89.6% (121 of 135 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-10-10 15:33:16 +02:00
Anonymous
2e2aeef77b Translated using Weblate (German)
Currently translated at 87.4% (118 of 135 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2022-10-10 15:33:15 +02:00
Ben Phelps
5198b056cc Merge pull request #366 from shamoon/plex-service-widget
Feature: Plex service widget without Tautulli
2022-10-10 15:39:03 +03:00
Michael Shamoon
3c23e59a70 lint 2022-10-10 01:15:30 -07:00
Michael Shamoon
2440da8e08 Plex service widget without Tautulli 2022-10-10 00:31:50 -07:00
Anonymous
91795f2d07 Translated using Weblate (Telugu)
Currently translated at 88.6% (117 of 132 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2022-10-10 07:12:53 +02:00
Anonymous
9f55ec9a63 Translated using Weblate (Finnish)
Currently translated at 93.1% (123 of 132 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2022-10-10 07:12:53 +02:00
Anonymous
efeaa995e2 Translated using Weblate (Yue)
Currently translated at 89.3% (118 of 132 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2022-10-10 07:12:53 +02:00
Anonymous
1524a6a6cf Translated using Weblate (Portuguese (Brazil))
Currently translated at 87.1% (115 of 132 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2022-10-10 07:12:52 +02:00
Anonymous
702ede8b9b Translated using Weblate (Romanian)
Currently translated at 89.3% (118 of 132 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2022-10-10 07:12:52 +02:00
Anonymous
7e6fcd8418 Translated using Weblate (Hebrew)
Currently translated at 76.5% (101 of 132 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2022-10-10 07:12:52 +02:00
Anonymous
1f006a4093 Translated using Weblate (Hungarian)
Currently translated at 81.8% (108 of 132 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2022-10-10 07:12:51 +02:00
Anonymous
d4a5245d1a Translated using Weblate (Croatian)
Currently translated at 87.1% (115 of 132 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2022-10-10 07:12:51 +02:00
Anonymous
60519a2881 Translated using Weblate (Swedish)
Currently translated at 81.0% (107 of 132 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2022-10-10 07:12:51 +02:00
Anonymous
182b66b53f Translated using Weblate (Polish)
Currently translated at 74.2% (98 of 132 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2022-10-10 07:12:50 +02:00
Anonymous
4b110cf7a8 Translated using Weblate (Catalan)
Currently translated at 92.4% (122 of 132 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-10-10 07:12:50 +02:00
Anonymous
dc0744f9d7 Translated using Weblate (Chinese (Traditional))
Currently translated at 6.8% (9 of 132 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2022-10-10 07:12:50 +02:00
Anonymous
90cd18735a Translated using Weblate (Dutch)
Currently translated at 47.7% (63 of 132 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2022-10-10 07:12:49 +02:00
Anonymous
494b2ebd08 Translated using Weblate (Vietnamese)
Currently translated at 33.3% (44 of 132 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2022-10-10 07:12:49 +02:00
Anonymous
797b966267 Translated using Weblate (Norwegian Bokmål)
Currently translated at 59.8% (79 of 132 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2022-10-10 07:12:49 +02:00
Anonymous
b13754f174 Translated using Weblate (Italian)
Currently translated at 58.3% (77 of 132 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2022-10-10 07:12:48 +02:00
Anonymous
c9e7845154 Translated using Weblate (Chinese (Simplified))
Currently translated at 92.4% (122 of 132 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-10-10 07:12:48 +02:00
Anonymous
a6f7c48cc3 Translated using Weblate (Russian)
Currently translated at 17.4% (23 of 132 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2022-10-10 07:12:47 +02:00
Anonymous
7874eb1467 Translated using Weblate (Portuguese)
Currently translated at 87.1% (115 of 132 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2022-10-10 07:12:47 +02:00
Anonymous
69626157ed Translated using Weblate (French)
Currently translated at 93.1% (123 of 132 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-10-10 07:12:47 +02:00
Anonymous
6dc0eac9f8 Translated using Weblate (Spanish)
Currently translated at 91.6% (121 of 132 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-10-10 07:12:46 +02:00
Anonymous
a6fc171539 Translated using Weblate (German)
Currently translated at 89.3% (118 of 132 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2022-10-10 07:12:46 +02:00
hunkyn
a8a715dd30 Translated using Weblate (Telugu)
Currently translated at 95.1% (117 of 123 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2022-10-10 07:11:36 +02:00
Anonymous
4ac6e43343 Translated using Weblate (Telugu)
Currently translated at 100.0% (0 of 0 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/
2022-10-10 07:11:36 +02:00
Kai Huuhko
13ee38bd12 Translated using Weblate (Finnish)
Currently translated at 100.0% (123 of 123 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2022-10-10 07:11:36 +02:00
Juan Manuel Bennàssar Carretero
d186ff16dd Translated using Weblate (Catalan)
Currently translated at 99.1% (122 of 123 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-10-10 07:11:36 +02:00
yahoo~~
49a3f3e249 Translated using Weblate (Chinese (Simplified))
Currently translated at 99.1% (122 of 123 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-10-10 07:11:36 +02:00
Nonoss117
2d14230763 Translated using Weblate (French)
Currently translated at 100.0% (123 of 123 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-10-10 07:11:36 +02:00
Juan Manuel Bennàssar Carretero
ce86d06006 Translated using Weblate (Spanish)
Currently translated at 98.3% (121 of 123 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-10-10 07:11:36 +02:00
hunkyn
c1d476997b Added translation using Weblate (Telugu) 2022-10-10 07:11:36 +02:00
Jason Fischer
a79e9cd342 Merge pull request #364 from JazzFisch/fix-unifi-field-visibility
Decompose i18n labels for Unifi widget
2022-10-09 20:21:08 -07:00
Jason Fischer
260201c2b4 Decompose i18n labels for Unifi widget
- Needed to decompose i18n labels for Unifi widget in order for field visibility setting to work correctly
- Fixed weird edge case where a call to cached-fetch would fail if no duration was passed
- Have VS Code hide the .next and node_modules folders from tree view
2022-10-09 20:05:28 -07:00
Jason Fischer
85df467fdb Merge pull request #341 from shamoon/main
Feature: UniFi Console Info & Service Widgets
2022-10-09 15:37:32 -07:00
Michael Shamoon
04da8f3925 lint 2022-10-09 15:13:27 -07:00
Michael Shamoon
86b12debc5 Revert "Infer unifi port" 2022-10-09 09:18:12 -07:00
Michael Shamoon
69c9a449b1 Revert "Rename unifi_console info widget to unifi" 2022-10-09 09:18:12 -07:00
Jason Fischer
0c20040f57 Merge pull request #360 from pacoculebras/patch-1
Update README.md
2022-10-09 08:57:00 -07:00
Paco Culebras
dedd725fae Update README.md
Add Catalan translation
2022-10-09 16:47:21 +02:00
Ben Phelps
fe7fa5c060 fix network stats when using podman #254 2022-10-09 13:34:08 +03:00
Ben Phelps
d2dc51d49c add services and bookmarks as manifest shortcuts 2022-10-09 13:31:00 +03:00
Ben Phelps
d26ae30fa6 remove old code 2022-10-09 13:30:37 +03:00
Michael Shamoon
fbac27f504 Fix unifi service lan/wlan labels 2022-10-08 17:47:52 -07:00
Michael Shamoon
d1b6dad14d Infer unifi port, use api widget property for login 2022-10-08 14:36:08 -07:00
Michael Shamoon
fe1064b173 Rename unifi_console info widget to unifi 2022-10-08 14:02:12 -07:00
Jason Fischer
42da3eca28 Standardize on double quoted strings 2022-10-08 13:59:09 -07:00
Jason Fischer
7ee3113d8a Rename unifi_console service widget to unifi
- This rename is necessary as the Unifi service widet gets its config data from a different location than the unifi_console information widget
2022-10-08 13:58:19 -07:00
Jason Fischer
2bd9c8eddc Cache console version check result 2022-10-08 13:52:22 -07:00
shamoon
1249ecaa68 Merge branch 'main' into main 2022-10-08 13:20:09 -07:00
Ben Phelps
ba428cf3ae fix docker service discovery #343 2022-10-08 23:10:41 +03:00
Ben Phelps
f06be8ca94 update readme 2022-10-08 23:02:09 +03:00
Ben Phelps
94a518f4a8 add styled headers option 2022-10-08 16:40:36 +03:00
Ben Phelps
e56dccc7f1 new logo and styling tweaks 2022-10-08 16:04:24 +03:00
Michael Shamoon
e03822df6e Add UniFI console service widget 2022-10-08 00:45:00 -07:00
Michael Shamoon
ad1d1e751d Refactor unifi proxy for udm-pro compatibility 2022-10-07 23:26:16 -07:00
Jason Fischer
ac4dcd3222 Remove node-unifi package dependency
- Add custom Unifi proxy built on existing cookie jar and httpProxy
- Change formatApiCall to emit empty string instead of undefined on missing key
2022-10-07 17:12:29 -07:00
Michael Shamoon
952f0295cc uptime label 2022-10-05 21:44:15 -07:00
Michael Shamoon
5ba75bc62d support wan down too 2022-10-05 21:41:39 -07:00
Michael Shamoon
b9b9449cd3 Add unifi_console widget, API endpoint 2022-10-05 21:36:43 -07:00
Anonymous
adf601c572 Translated using Weblate (Finnish)
Currently translated at 96.7% (119 of 123 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2022-10-05 17:56:15 +02:00
Anonymous
00eb768cdf Translated using Weblate (Yue)
Currently translated at 95.9% (118 of 123 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2022-10-05 17:56:14 +02:00
Anonymous
b8d00f24f7 Translated using Weblate (Portuguese (Brazil))
Currently translated at 93.4% (115 of 123 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2022-10-05 17:56:14 +02:00
Anonymous
031f11c5c1 Translated using Weblate (Romanian)
Currently translated at 95.9% (118 of 123 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2022-10-05 17:56:14 +02:00
Anonymous
1ffe7da9b7 Translated using Weblate (Hebrew)
Currently translated at 82.1% (101 of 123 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2022-10-05 17:56:14 +02:00
Anonymous
292c6dd6b0 Translated using Weblate (Hungarian)
Currently translated at 87.8% (108 of 123 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2022-10-05 17:56:13 +02:00
Anonymous
6f5a0ea6b8 Translated using Weblate (Croatian)
Currently translated at 93.4% (115 of 123 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2022-10-05 17:56:13 +02:00
Anonymous
f44b564bb5 Translated using Weblate (Swedish)
Currently translated at 86.9% (107 of 123 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2022-10-05 17:56:13 +02:00
Anonymous
b380fd2306 Translated using Weblate (Polish)
Currently translated at 79.6% (98 of 123 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2022-10-05 17:56:13 +02:00
Anonymous
528ce1a5fe Translated using Weblate (Catalan)
Currently translated at 96.7% (119 of 123 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-10-05 17:56:12 +02:00
Anonymous
593d8a1cbc Translated using Weblate (Chinese (Traditional))
Currently translated at 7.3% (9 of 123 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2022-10-05 17:56:12 +02:00
Anonymous
8f6ea7b49f Translated using Weblate (Dutch)
Currently translated at 51.2% (63 of 123 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2022-10-05 17:56:12 +02:00
Anonymous
01d005dbbe Translated using Weblate (Vietnamese)
Currently translated at 35.7% (44 of 123 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2022-10-05 17:56:11 +02:00
Anonymous
45fb059e71 Translated using Weblate (Norwegian Bokmål)
Currently translated at 64.2% (79 of 123 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2022-10-05 17:56:11 +02:00
Anonymous
40a11bd9ce Translated using Weblate (Italian)
Currently translated at 62.6% (77 of 123 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2022-10-05 17:56:11 +02:00
Anonymous
935f97415f Translated using Weblate (Chinese (Simplified))
Currently translated at 88.6% (109 of 123 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-10-05 17:56:10 +02:00
Anonymous
969dab9971 Translated using Weblate (Russian)
Currently translated at 18.6% (23 of 123 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2022-10-05 17:56:10 +02:00
Anonymous
193b548d0b Translated using Weblate (Portuguese)
Currently translated at 93.4% (115 of 123 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2022-10-05 17:56:10 +02:00
Anonymous
6dacd1bdd6 Translated using Weblate (French)
Currently translated at 96.7% (119 of 123 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-10-05 17:56:09 +02:00
Anonymous
6a0a872790 Translated using Weblate (Spanish)
Currently translated at 96.7% (119 of 123 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-10-05 17:56:09 +02:00
Anonymous
fa71586a50 Translated using Weblate (German)
Currently translated at 95.9% (118 of 123 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2022-10-05 17:56:09 +02:00
Jason Fischer
65c5828456 Merge pull request #335 from JazzFisch/add-proxmox-widget
Add Proxmox widget
2022-10-05 08:55:56 -07:00
Kai Huuhko
892c68856f Translated using Weblate (Finnish)
Currently translated at 100.0% (119 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2022-10-05 15:24:22 +02:00
Ben Phelps
ea96999377 place error boundaries closer to the source 2022-10-05 13:43:22 +03:00
Jason Fischer
a9fb458f19 Add Proxmox widget 2022-10-04 21:46:48 -07:00
Ben Phelps
88c774339d Merge pull request #333 from JazzFisch/add-error-boundary
Add ErrorBoundary component
2022-10-05 04:22:26 +03:00
Jason Fischer
962e6e576c Add ErrorBoundary component
- wrap a myriad of components in ErrorBoundary

resolves #270
2022-10-04 13:15:49 -07:00
Anonymous
07a28c0841 Translated using Weblate (Finnish)
Currently translated at 100.0% (0 of 0 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2022-10-04 14:32:40 +02:00
Juan Manuel Bennàssar Carretero
1e7ef54c05 Translated using Weblate (Catalan)
Currently translated at 100.0% (119 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-10-04 14:32:39 +02:00
Juan Manuel Bennàssar Carretero
701270b020 Translated using Weblate (Spanish)
Currently translated at 100.0% (119 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-10-04 14:32:38 +02:00
Kai Huuhko
84f142683f Added translation using Weblate (Finnish) 2022-10-04 14:32:32 +02:00
Ben Phelps
7033652508 Merge pull request #328 from JazzFisch/disable-open-proxy
Remove pages/api/proxy.js as it was an open proxy
2022-10-04 09:41:49 +03:00
Anonymous
6c3489aa3d Translated using Weblate (Yue)
Currently translated at 99.1% (118 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2022-10-04 08:41:21 +02:00
Anonymous
82f18c7cff Translated using Weblate (Portuguese (Brazil))
Currently translated at 96.6% (115 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2022-10-04 08:41:20 +02:00
Anonymous
875eefe71f Translated using Weblate (Romanian)
Currently translated at 99.1% (118 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2022-10-04 08:41:20 +02:00
Anonymous
1972f2b6db Translated using Weblate (Hebrew)
Currently translated at 84.8% (101 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2022-10-04 08:41:20 +02:00
Anonymous
dd080d9a04 Translated using Weblate (Hungarian)
Currently translated at 90.7% (108 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2022-10-04 08:41:20 +02:00
Anonymous
933414934c Translated using Weblate (Croatian)
Currently translated at 96.6% (115 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2022-10-04 08:41:20 +02:00
Anonymous
dec25762f0 Translated using Weblate (Swedish)
Currently translated at 89.9% (107 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2022-10-04 08:41:19 +02:00
Anonymous
a2c9754560 Translated using Weblate (Polish)
Currently translated at 82.3% (98 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2022-10-04 08:41:19 +02:00
Anonymous
0f107d8648 Translated using Weblate (Catalan)
Currently translated at 99.1% (118 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-10-04 08:41:19 +02:00
Anonymous
1b7b6af84d Translated using Weblate (Chinese (Traditional))
Currently translated at 7.5% (9 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2022-10-04 08:41:19 +02:00
Anonymous
5e38e71229 Translated using Weblate (Dutch)
Currently translated at 52.9% (63 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2022-10-04 08:41:19 +02:00
Anonymous
83983d772d Translated using Weblate (Vietnamese)
Currently translated at 36.9% (44 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2022-10-04 08:41:18 +02:00
Anonymous
3e133c10d2 Translated using Weblate (Norwegian Bokmål)
Currently translated at 66.3% (79 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2022-10-04 08:41:18 +02:00
Anonymous
6a67873c10 Translated using Weblate (Italian)
Currently translated at 64.7% (77 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2022-10-04 08:41:18 +02:00
Anonymous
588ea9b04e Translated using Weblate (Chinese (Simplified))
Currently translated at 91.5% (109 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-10-04 08:41:18 +02:00
Anonymous
68b7fe2b35 Translated using Weblate (Russian)
Currently translated at 19.3% (23 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2022-10-04 08:41:18 +02:00
Anonymous
5643af9845 Translated using Weblate (Portuguese)
Currently translated at 96.6% (115 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2022-10-04 08:41:17 +02:00
Anonymous
ad3752650b Translated using Weblate (French)
Currently translated at 99.1% (118 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-10-04 08:41:17 +02:00
Anonymous
8718b4bcee Translated using Weblate (Spanish)
Currently translated at 99.1% (118 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-10-04 08:41:17 +02:00
Anonymous
f29154cfa4 Translated using Weblate (German)
Currently translated at 99.1% (118 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2022-10-04 08:41:17 +02:00
Ben Phelps
da948f83a1 Merge pull request #326 from juanmanuelbc/main
Fix resources CPU label...
2022-10-04 09:41:01 +03:00
Jason Fischer
84bb98b007 Update component.jsx 2022-10-03 15:20:30 -07:00
Jason Fischer
c3a623c329 Remove pages/api/proxy.js as it was an open proxy
- The only location pages/api/proxy was used was for icon loading in item.jsx, simply returning the icon URL instead worked just fine.  There was no need to proxy icon requests.

fixes: #327
2022-10-03 15:17:56 -07:00
Juan Manuel Bennàssar Carretero
1249724f8a Fix resources CPU label... 2022-10-03 15:47:46 +02:00
Ángel Fernández Sánchez
4503612bf0 Translated using Weblate (Spanish)
Currently translated at 100.0% (118 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-10-03 11:21:53 +02:00
Juan Manuel Bennàssar Carretero
9c7a9eb326 Translated using Weblate (Spanish)
Currently translated at 100.0% (118 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-10-03 11:21:53 +02:00
Ben Phelps
07e99768e6 speedtest widget, catch api errors 2022-10-03 10:45:45 +03:00
Juan Manuel Bennàssar Carretero
a63f71d3ee Translated using Weblate (Catalan)
Currently translated at 100.0% (118 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-10-01 16:04:04 +02:00
Juan Manuel Bennàssar Carretero
76f6b3a4a7 Translated using Weblate (Spanish)
Currently translated at 100.0% (118 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-10-01 16:04:03 +02:00
Ángel Fernández Sánchez
7052951a43 Translated using Weblate (Spanish)
Currently translated at 100.0% (118 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-10-01 16:04:03 +02:00
Ben Phelps
09b4de08e3 hopefully improve font rendering 2022-10-01 15:21:13 +03:00
Ben Phelps
82b490c524 fix formatting typos 2022-10-01 10:33:04 +03:00
Ben Phelps
e0bc45f37e Update README.md 2022-10-01 10:31:22 +03:00
Ben Phelps
6e2197a254 update readme 2022-10-01 10:30:54 +03:00
Ben Phelps
de4ce73a9a fix hidden scrollbars
this was an adventure
2022-09-30 23:34:48 +03:00
Ben Phelps
f52c6f3b41 improved static styles and x-browser scrollbars 2022-09-30 22:13:37 +03:00
Ben Phelps
2271cc0044 cache github response for 5 min 2022-09-30 21:56:22 +03:00
Ben Phelps
931ffe4c84 Merge pull request #309 from JazzFisch/configurable-widget-fields
Allow widget field visibility to be configurable
2022-09-30 21:51:34 +03:00
lok
45f39120da Translated using Weblate (Yue)
Currently translated at 100.0% (118 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2022-09-30 09:22:30 +02:00
FunsKiTo
000e15640a Translated using Weblate (Spanish)
Currently translated at 100.0% (118 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-09-30 09:22:30 +02:00
Jason Fischer
d4ad11a63f Slightly simplify container.jsx 2022-09-29 21:20:01 -07:00
Jason Fischer
c533966050 Merge branch 'main' into configurable-widget-fields 2022-09-29 21:15:56 -07:00
Jason Fischer
9b7d6b196f Allow widget field visibility to be configurable 2022-09-29 21:15:25 -07:00
C8opmBM
512a6cd4b9 Translated using Weblate (Romanian)
Currently translated at 100.0% (118 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2022-09-29 10:41:07 +02:00
Nonoss117
6b0659af1f Translated using Weblate (French)
Currently translated at 100.0% (118 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-09-29 10:41:07 +02:00
Sascha Jelinek
12279e9bda Translated using Weblate (German)
Currently translated at 100.0% (118 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2022-09-29 10:41:07 +02:00
Ben Phelps
dadd501843 fix case with empty bookmarks and widgets 2022-09-29 11:40:09 +03:00
Jason Fischer
756f6310af Merge pull request #302 from JazzFisch/fix-prowlarr
Fix Prowlarr show API Error
2022-09-28 16:06:46 -07:00
Jason Fischer
7a19bedc25 Fix Prowlarr show API Error 2022-09-28 15:36:08 -07:00
Ben Phelps
a10a30a22c fix some error edge cases 2022-09-28 22:40:54 +03:00
Ben Phelps
57e4ca355b add widgets to config hash 2022-09-28 21:58:43 +03:00
Anonymous
fed3102492 Translated using Weblate (Yue)
Currently translated at 97.4% (115 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2022-09-28 19:17:58 +02:00
Anonymous
64e0e256ce Translated using Weblate (Portuguese (Brazil))
Currently translated at 97.4% (115 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2022-09-28 19:17:58 +02:00
Anonymous
287581025e Translated using Weblate (Romanian)
Currently translated at 97.4% (115 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2022-09-28 19:17:58 +02:00
Anonymous
3184b9ea0d Translated using Weblate (Hebrew)
Currently translated at 85.5% (101 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2022-09-28 19:17:57 +02:00
Anonymous
233eb7e785 Translated using Weblate (Hungarian)
Currently translated at 91.5% (108 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2022-09-28 19:17:57 +02:00
Anonymous
a801f8f65f Translated using Weblate (Croatian)
Currently translated at 97.4% (115 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2022-09-28 19:17:57 +02:00
Anonymous
4afe654bcc Translated using Weblate (Swedish)
Currently translated at 90.6% (107 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2022-09-28 19:17:57 +02:00
Anonymous
926be245a9 Translated using Weblate (Polish)
Currently translated at 83.0% (98 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2022-09-28 19:17:57 +02:00
Anonymous
f1615e6660 Translated using Weblate (Catalan)
Currently translated at 97.4% (115 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-09-28 19:17:56 +02:00
Anonymous
ac6ecf21a0 Translated using Weblate (Chinese (Traditional))
Currently translated at 7.6% (9 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2022-09-28 19:17:56 +02:00
Anonymous
8629f0a26d Translated using Weblate (Dutch)
Currently translated at 53.3% (63 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2022-09-28 19:17:56 +02:00
Anonymous
7a6ef23adb Translated using Weblate (Vietnamese)
Currently translated at 37.2% (44 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2022-09-28 19:17:56 +02:00
Anonymous
dfa19c96b9 Translated using Weblate (Norwegian Bokmål)
Currently translated at 66.9% (79 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2022-09-28 19:17:55 +02:00
Anonymous
334c023b4f Translated using Weblate (Italian)
Currently translated at 65.2% (77 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2022-09-28 19:17:55 +02:00
Anonymous
1f373e0b3e Translated using Weblate (Chinese (Simplified))
Currently translated at 92.3% (109 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-09-28 19:17:55 +02:00
Anonymous
47fc4040d5 Translated using Weblate (Russian)
Currently translated at 19.4% (23 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2022-09-28 19:17:54 +02:00
Anonymous
f5e47ab61a Translated using Weblate (Portuguese)
Currently translated at 97.4% (115 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2022-09-28 19:17:54 +02:00
Anonymous
83cdb2ed2b Translated using Weblate (French)
Currently translated at 97.4% (115 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-09-28 19:17:54 +02:00
Anonymous
d67eca8882 Translated using Weblate (Spanish)
Currently translated at 97.4% (115 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-09-28 19:17:54 +02:00
Anonymous
a0044dd3ad Translated using Weblate (German)
Currently translated at 97.4% (115 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2022-09-28 19:17:53 +02:00
Jason Fischer
149ed8c266 Fix transmission leech and seed showing NaN 2022-09-28 09:58:01 -07:00
Jason Fischer
65755a08aa Better login strategy for qbittorrent proxy
- Additional logging in httpProxy
2022-09-28 09:55:18 -07:00
Jason Fischer
1ea8e38372 Fix Transmission proxy error with URL and CSRF caching 2022-09-28 08:57:04 -07:00
Ben Phelps
69adb3fde2 Merge branch 'main' into widget-refactor 2022-09-28 17:51:30 +03:00
lok
28be9b5988 Translated using Weblate (Yue)
Currently translated at 100.0% (115 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2022-09-28 16:18:58 +02:00
Ben Phelps
0590896453 display as ms, not millisec or milliseconds 2022-09-28 10:15:18 +03:00
Ben Phelps
8f59c4a236 trim url trailing slashes 2022-09-28 10:14:44 +03:00
Jason Fischer
550af91030 Add Lidarr as a recognized widget type 2022-09-27 21:22:26 -07:00
Ben Phelps
bb5721c473 ui polish 2022-09-28 02:32:39 +03:00
Ben Phelps
68c93c65e6 bring all transfer rates inline, using bitrate 2022-09-28 02:32:30 +03:00
Ben Phelps
d36efa5796 styled scollbars
lets see how this one lands
2022-09-27 22:59:29 +03:00
Ben Phelps
0a58f259ff wrapped proxy calls via useWidgetAPI 2022-09-27 22:59:14 +03:00
Ben Phelps
649f0038bc update images 2022-09-27 20:49:49 +03:00
Ben Phelps
9697e302d7 add a little more spacing 2022-09-27 20:41:19 +03:00
Ben Phelps
415d59eeb3 header spacing 2022-09-27 20:40:50 +03:00
Ben Phelps
3cb06eb526 smaller text 2022-09-27 20:40:21 +03:00
Ben Phelps
2087c775fc actually styling 2022-09-27 20:38:10 +03:00
Ben Phelps
4dd4363e91 readme styling 2022-09-27 20:37:13 +03:00
Ben Phelps
314050b568 Merge branch 'main' into widget-refactor 2022-09-27 19:26:37 +03:00
Jason Fischer
1765a97f31 Merge pull request #284 from josways/main
support Baidu search engine
2022-09-27 08:48:38 -07:00
Ben Phelps
30ac8cb41c new preview image 2022-09-27 17:44:50 +03:00
Anonymous
959b778cd7 Translated using Weblate (Yue)
Currently translated at 100.0% (0 of 0 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2022-09-27 15:38:18 +02:00
Juan Manuel Bennàssar Carretero
ca87a5527d Translated using Weblate (Spanish)
Currently translated at 100.0% (115 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-09-27 15:38:17 +02:00
lok
711c3d1b67 Added translation using Weblate (Yue) 2022-09-27 15:38:07 +02:00
Ben Phelps
5210a68cc6 remove debug 2022-09-27 10:51:00 +03:00
Ben Phelps
616e56e3f5 fix qbittorrent widget 2022-09-27 10:49:03 +03:00
Ben Phelps
8e0075ff90 expire all cookies after 1 hour 2022-09-27 10:48:52 +03:00
Ben Phelps
c980c70798 revalidate config changes, check on focus changes 2022-09-26 22:54:12 +03:00
Josway
fa2763d8cd support Baidu search engine 2022-09-26 23:06:42 +08:00
Josway
d18e472623 support Baidu search engine 2022-09-26 23:02:59 +08:00
Ben Phelps
5f0c1ec70a tweak styles 2022-09-26 16:56:20 +03:00
Ben Phelps
4386999c38 further restructuring 2022-09-26 15:25:10 +03:00
Ben Phelps
9b07f3eb90 Merge branch 'main' into widget-refactor 2022-09-26 15:06:26 +03:00
Ben Phelps
b280e18651 fix nightly issue 2022-09-26 15:06:14 +03:00
Ben Phelps
086bfa310f lighthouse requirements 2022-09-26 15:03:02 +03:00
Ben Phelps
990ae8464e only render en by default 2022-09-26 14:43:03 +03:00
Ben Phelps
e4c82b5e8d fix always loading docker stats block 2022-09-26 14:42:40 +03:00
Ben Phelps
4d790feaae formatting cleanup 2022-09-26 14:42:31 +03:00
Ben Phelps
b72dca0e2e only create each logger once 2022-09-26 14:42:13 +03:00
Ben Phelps
e1a3a82f75 utils cleanup, initial static generation 2022-09-26 12:04:37 +03:00
Ben Phelps
ec8700f3e9 fix widgets without mappings 2022-09-26 10:58:31 +03:00
Ben Phelps
d999bb3f09 fix portainer widget 2022-09-26 10:58:22 +03:00
Ben Phelps
a83d5132d9 refactor lidarr widget 2022-09-26 10:58:14 +03:00
Jason Fischer
1840e9a57a Add authentik 2022-09-25 17:42:16 -07:00
Jason Fischer
d876ba30d4 Merge branch 'main' into widget-refactor 2022-09-25 16:23:31 -07:00
Ben Phelps
47bc073fb4 widget refactoring and cleanup 2022-09-26 02:23:02 +03:00
Jason Fischer
808e79e2ac Add Docker, Emby, Gotify, Jackett, and JellySeerr widgets 2022-09-25 16:15:47 -07:00
Mauricio Kalil
371eacb354 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (115 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2022-09-26 00:26:59 +02:00
Ben Phelps
f04f5921e1 fix fr number formatting 2022-09-26 01:26:55 +03:00
Ben Phelps
035dd25ece widget refactoring 2022-09-26 00:35:54 +03:00
Jason Fischer
03fa2f86d7 Add AdGuard, Bazarr, and Coin Market Cap widgets
- Allow setting HTTP method in widget.js
- Allow sending allow listed query params to proxy
2022-09-25 14:31:41 -07:00
Jason Fischer
f999f4a467 Add Sonarr refactor 2022-09-25 10:13:31 -07:00
Ben Phelps
5cfadaea7f Merge branch 'main' into widget-refactor 2022-09-25 19:44:22 +03:00
Ben Phelps
562235f828 starting of widget refactoring 2022-09-25 19:43:47 +03:00
Ben Phelps
d6f6ea9dba add meta tag 2022-09-25 19:43:27 +03:00
Ben Phelps
8bc240b934 refactor i18n to be server side 2022-09-25 19:43:00 +03:00
Ben Phelps
3ae4113043 refactor docker stats open/close 2022-09-25 19:38:02 +03:00
Anonymous
1f52435bc1 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (0 of 0 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2022-09-25 15:20:25 +02:00
Mauricio Kalil
4d0dfcca61 Added translation using Weblate (Portuguese (Brazil)) 2022-09-25 15:20:17 +02:00
C8opmBM
ea9076652a Translated using Weblate (Romanian)
Currently translated at 100.0% (115 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2022-09-25 15:18:08 +02:00
Milo Ivir
af1a464d87 Translated using Weblate (Croatian)
Currently translated at 100.0% (115 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2022-09-25 15:18:08 +02:00
Ben Phelps
50fe6041f0 better fallback support 2022-09-24 15:13:14 +03:00
Ben Phelps
555a4b6b05 extralight is extra… light 2022-09-24 14:54:37 +03:00
Ben Phelps
7709be8118 fix Head 2022-09-24 14:53:46 +03:00
Ben Phelps
130ac76e0c update packages 2022-09-24 14:52:54 +03:00
Ben Phelps
ae315f1789 use new Manrope font, remove external font dep 2022-09-24 14:51:12 +03:00
Ben Phelps
4782e72d88 remove unused font 2022-09-24 14:49:14 +03:00
C8opmBM
d69cafee01 Translated using Weblate (Romanian)
Currently translated at 10.4% (12 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2022-09-24 13:45:23 +02:00
Anonymous
e066ed58ca Translated using Weblate (Romanian)
Currently translated at 100.0% (0 of 0 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2022-09-24 13:42:48 +02:00
C8opmBM
05a65cbf9d Added translation using Weblate (Romanian) 2022-09-24 13:42:39 +02:00
Ben Phelps
ea6a668a84 add version information 2022-09-24 01:18:37 +03:00
Ben Phelps
08615fe9f6 Update docker-publish.yml 2022-09-24 00:17:23 +03:00
SuperDOS
f8ef5ddf5a Translated using Weblate (Swedish)
Currently translated at 93.0% (107 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2022-09-23 13:44:01 +02:00
XNRavenZen
595d81dd2f Translated using Weblate (Chinese (Simplified))
Currently translated at 94.7% (109 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-09-23 13:44:01 +02:00
nicedc
00c654953d Translated using Weblate (Chinese (Simplified))
Currently translated at 94.7% (109 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-09-23 13:44:01 +02:00
Bruno Rossetto
bf2f3a7d17 Translated using Weblate (Portuguese)
Currently translated at 100.0% (115 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2022-09-23 13:44:01 +02:00
Nonoss117
612f0fde2d Translated using Weblate (French)
Currently translated at 100.0% (115 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-09-23 13:44:00 +02:00
Ángel Fernández Sánchez
a701e031a7 Translated using Weblate (Spanish)
Currently translated at 100.0% (115 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-09-23 13:44:00 +02:00
Juan Manuel Bennàssar Carretero
d51854e663 Translated using Weblate (Spanish)
Currently translated at 100.0% (115 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-09-23 13:44:00 +02:00
Moritz Neumann
cb9a18fd40 Translated using Weblate (German)
Currently translated at 100.0% (115 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2022-09-23 13:44:00 +02:00
Ben Phelps
ed28d69d76 Merge pull request #251 from JazzFisch/patch-nextjs-logging
Patch console object to instead use homepage's logger for logging
2022-09-23 11:51:15 +03:00
Jason Fischer
5667cedafc Merge branch 'main' into patch-nextjs-logging 2022-09-21 23:38:53 -07:00
Jason Fischer
42fe535df7 Patch console object to instead use winston for logging
- Allow setting labels via new createLogger method
- Make logger initialization more robust
2022-09-21 23:37:17 -07:00
Ben Phelps
0e1e2bde22 Update FUNDING.yml 2022-09-22 03:01:00 +03:00
Ben Phelps
1a5e2f3cda Update FUNDING.yml 2022-09-22 03:00:39 +03:00
Ben Phelps
32cb113014 Create FUNDING.yml 2022-09-22 02:57:58 +03:00
Ben Phelps
559af0cd56 Update README.md 2022-09-21 22:53:19 +03:00
Ben Phelps
0e5477eecf experiment with lazily loaded widgets 2022-09-21 22:26:58 +03:00
Jason Fischer
ab631fa26e Merge pull request #246 from JazzFisch/fix-log-folder
Write homepage.log into config folder
2022-09-21 08:46:21 -07:00
Jason Fischer
5776544c20 Write homepage.log into config folder
This will make it easier for people to find their log file(s)
2022-09-21 08:32:37 -07:00
Ben Phelps
666e2a42cf fix context state race 2022-09-21 17:39:46 +03:00
Ben Phelps
2fc1dda122 add tailwind-scollbars 2022-09-21 16:11:48 +03:00
Juan Manuel Bennàssar Carretero
0115b594d6 Translated using Weblate (Catalan)
Currently translated at 100.0% (115 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-09-21 11:32:07 +02:00
Juan Manuel Bennàssar Carretero
c5828978b2 Translated using Weblate (Spanish)
Currently translated at 100.0% (115 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-09-21 11:32:07 +02:00
Ben Phelps
3ff756e057 update readme 2022-09-21 10:09:24 +03:00
Anonymous
1c405ff4ec Translated using Weblate (Hebrew)
Currently translated at 87.8% (101 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2022-09-21 08:06:43 +02:00
Anonymous
5d1041d564 Translated using Weblate (Hungarian)
Currently translated at 93.9% (108 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2022-09-21 08:06:42 +02:00
Anonymous
9e8942398c Translated using Weblate (Croatian)
Currently translated at 7.8% (9 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2022-09-21 08:06:42 +02:00
Anonymous
a5b7c8439d Translated using Weblate (Swedish)
Currently translated at 83.4% (96 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2022-09-21 08:06:42 +02:00
Anonymous
9131a8f118 Translated using Weblate (Polish)
Currently translated at 85.2% (98 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2022-09-21 08:06:42 +02:00
Anonymous
8687fe6b26 Translated using Weblate (Catalan)
Currently translated at 93.9% (108 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-09-21 08:06:41 +02:00
Anonymous
1d38fd8dea Translated using Weblate (Chinese (Traditional))
Currently translated at 7.8% (9 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2022-09-21 08:06:41 +02:00
Anonymous
4186bbb3c3 Translated using Weblate (Dutch)
Currently translated at 54.7% (63 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2022-09-21 08:06:41 +02:00
Anonymous
897c71f36e Translated using Weblate (Vietnamese)
Currently translated at 38.2% (44 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2022-09-21 08:06:41 +02:00
Anonymous
f9ce9b7716 Translated using Weblate (Norwegian Bokmål)
Currently translated at 68.6% (79 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2022-09-21 08:06:40 +02:00
Anonymous
ec230ba249 Translated using Weblate (Italian)
Currently translated at 66.9% (77 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2022-09-21 08:06:40 +02:00
Anonymous
6bfa49689e Translated using Weblate (Chinese (Simplified))
Currently translated at 93.9% (108 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-09-21 08:06:39 +02:00
Anonymous
177acf86d7 Translated using Weblate (Russian)
Currently translated at 20.0% (23 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2022-09-21 08:06:39 +02:00
Anonymous
c89ed904cc Translated using Weblate (Portuguese)
Currently translated at 76.5% (88 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2022-09-21 08:06:39 +02:00
Anonymous
6add7c3d82 Translated using Weblate (French)
Currently translated at 96.5% (111 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-09-21 08:06:39 +02:00
Anonymous
c562035776 Translated using Weblate (Spanish)
Currently translated at 93.9% (108 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-09-21 08:06:38 +02:00
Anonymous
4757e25fdc Translated using Weblate (German)
Currently translated at 90.4% (104 of 115 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2022-09-21 08:06:38 +02:00
Nonoss117
077bc356b8 Translated using Weblate (French)
Currently translated at 100.0% (111 of 111 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-09-21 08:06:30 +02:00
Ben Phelps
1dff880a93 Merge pull request #230 from DevPGSV/feature/widget_strelaysrv
Add Syncthing Relay Server widget
2022-09-21 09:06:26 +03:00
Ben Phelps
122b987fa3 Merge branch 'main' into feature/widget_strelaysrv 2022-09-21 09:05:42 +03:00
Ben Phelps
c024c4f01c Merge pull request #241 from JazzFisch/add-logger
Add Winston for log handling
2022-09-21 09:03:52 +03:00
Ben Phelps
a677fbefbf add global settings context
will be useful going forward, and simplify widget props being passed around all over the place
2022-09-21 09:00:57 +03:00
Ben Phelps
244a76de0b fix bookmark styling 2022-09-21 08:58:24 +03:00
Ben Phelps
20ac15b18c allow setting a global link target 2022-09-21 08:40:19 +03:00
Anonymous
75244cc40e Translated using Weblate (Hebrew)
Currently translated at 90.9% (101 of 111 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2022-09-21 07:39:32 +02:00
Anonymous
3e731298a5 Translated using Weblate (Hungarian)
Currently translated at 97.2% (108 of 111 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2022-09-21 07:39:32 +02:00
Anonymous
ed0bf027fc Translated using Weblate (Croatian)
Currently translated at 8.1% (9 of 111 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2022-09-21 07:39:31 +02:00
Anonymous
7a10131768 Translated using Weblate (Swedish)
Currently translated at 86.4% (96 of 111 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2022-09-21 07:39:31 +02:00
Anonymous
19522b8712 Translated using Weblate (Polish)
Currently translated at 88.2% (98 of 111 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2022-09-21 07:39:31 +02:00
Anonymous
af79061a45 Translated using Weblate (Catalan)
Currently translated at 97.2% (108 of 111 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-09-21 07:39:31 +02:00
Anonymous
d56d9f7a50 Translated using Weblate (Chinese (Traditional))
Currently translated at 8.1% (9 of 111 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2022-09-21 07:39:30 +02:00
Anonymous
45a1a9ed5a Translated using Weblate (Dutch)
Currently translated at 56.7% (63 of 111 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2022-09-21 07:39:30 +02:00
Anonymous
50954cf3d4 Translated using Weblate (Vietnamese)
Currently translated at 39.6% (44 of 111 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2022-09-21 07:39:30 +02:00
Anonymous
6beefbf39a Translated using Weblate (Norwegian Bokmål)
Currently translated at 71.1% (79 of 111 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2022-09-21 07:39:30 +02:00
Anonymous
8f21d1ae31 Translated using Weblate (Italian)
Currently translated at 69.3% (77 of 111 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2022-09-21 07:39:29 +02:00
Anonymous
e4825531c4 Translated using Weblate (Chinese (Simplified))
Currently translated at 97.2% (108 of 111 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-09-21 07:39:29 +02:00
Anonymous
6174f53f37 Translated using Weblate (Russian)
Currently translated at 20.7% (23 of 111 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2022-09-21 07:39:29 +02:00
Anonymous
42baa4b188 Translated using Weblate (Portuguese)
Currently translated at 79.2% (88 of 111 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2022-09-21 07:39:28 +02:00
Anonymous
52eaddae37 Translated using Weblate (French)
Currently translated at 97.2% (108 of 111 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-09-21 07:39:28 +02:00
Anonymous
f43ce0db44 Translated using Weblate (Spanish)
Currently translated at 97.2% (108 of 111 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-09-21 07:39:28 +02:00
Anonymous
b46cb0a1f7 Translated using Weblate (German)
Currently translated at 93.6% (104 of 111 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2022-09-21 07:39:28 +02:00
Juan Manuel Bennàssar Carretero
e4e5ad7eba Translated using Weblate (Catalan)
Currently translated at 100.0% (108 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-09-21 07:39:20 +02:00
Ben Phelps
0e6ea57023 Merge pull request #229 from DevPGSV/feature/widget_mastodon
Add Mastodon widget
2022-09-21 08:39:16 +03:00
Jason Fischer
280bb5fc81 Add Winston for log handling
- write log data to 'homepage.log'
2022-09-20 20:16:04 -07:00
Pablo Garcia de los Salmones Valencia
077d21eb7e Updated stat literals to single words 2022-09-21 02:15:25 +02:00
Pablo Garcia de los Salmones Valencia
f281d86e8a Fixed missing text 2022-09-20 05:29:24 +02:00
Pablo Garcia de los Salmones Valencia
f7000a280e Add Syncthing Relay Server widget 2022-09-20 04:42:04 +02:00
Pablo Garcia de los Salmones Valencia
586ded6b3f Add Mastodon widget 2022-09-20 03:41:10 +02:00
3vilson
539e0f005a Translated using Weblate (German)
Currently translated at 96.2% (104 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2022-09-19 19:16:41 +02:00
Ben Phelps
330575bab3 fix links 2022-09-18 18:49:50 +03:00
Ben Phelps
30ec4aed28 Translated using Weblate (Dutch)
Currently translated at 58.3% (63 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2022-09-18 16:53:21 +02:00
Ben Phelps
ee456fd8e5 Translated using Weblate (Italian)
Currently translated at 71.2% (77 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2022-09-18 16:53:21 +02:00
Ben Phelps
ed25c8a84b Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (108 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-09-18 16:53:21 +02:00
Ben Phelps
b0a45fe09c Translated using Weblate (Russian)
Currently translated at 21.2% (23 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2022-09-18 16:53:20 +02:00
Nonoss117
50f0f46ad9 Translated using Weblate (French)
Currently translated at 100.0% (108 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-09-18 16:53:20 +02:00
Ben Phelps
bd61d459ad Translated using Weblate (Spanish)
Currently translated at 100.0% (108 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-09-18 16:53:20 +02:00
Ben Phelps
4f73c60d37 Translated using Weblate (German)
Currently translated at 62.0% (67 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2022-09-18 16:53:20 +02:00
Ben Phelps
7c536f0cb0 update attribution sorting 2022-09-18 17:05:31 +03:00
Ben Phelps
d5a489198a update readme 2022-09-18 17:00:40 +03:00
Ben Phelps
17f54da524 yaml validation 2022-09-18 16:41:01 +03:00
ShlomiPorush
b5065673ab Translated using Weblate (Hebrew)
Currently translated at 93.5% (101 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2022-09-18 15:13:10 +02:00
Pacux
610b0f63e0 Translated using Weblate (Catalan)
Currently translated at 100.0% (108 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-09-18 15:13:09 +02:00
yahoo~~
73317bda67 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (108 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-09-18 15:13:09 +02:00
Nonoss117
f690f3acba Translated using Weblate (French)
Currently translated at 100.0% (108 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-09-18 15:13:09 +02:00
Anonymous
eea9f1f6cb Translated using Weblate (Hebrew)
Currently translated at 100.0% (0 of 0 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2022-09-18 08:37:27 +02:00
Daniel Varga
d9089e8d1c Translated using Weblate (Hungarian)
Currently translated at 100.0% (108 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2022-09-18 08:37:26 +02:00
Nonoss117
bed5acc9d5 Translated using Weblate (French)
Currently translated at 100.0% (108 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-09-18 08:37:25 +02:00
Ángel Fernández Sánchez
f46feff445 Translated using Weblate (Spanish)
Currently translated at 100.0% (108 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-09-18 08:37:25 +02:00
Daniel Varga
d46a98c7d5 Translated using Weblate (German)
Currently translated at 62.0% (67 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2022-09-18 08:37:25 +02:00
ShlomiPorush
05af60df4f Added translation using Weblate (Hebrew) 2022-09-18 08:37:17 +02:00
Ben Phelps
5fc266ed81 better status icon logic for tautulli 2022-09-18 02:12:24 +03:00
Ben Phelps
38356c31b0 handle when structure differs from expectation 2022-09-18 01:38:41 +03:00
Ben Phelps
2703cfb81e update attributions and features 2022-09-17 22:03:21 +03:00
Ben Phelps
8a226ca473 Merge pull request #198 from JazzFisch/fix-incorrect-widget-values
Fix issues with incorrect values in widgets
2022-09-17 19:21:26 +03:00
Jason Fischer
33e6d54fd2 Fix issues with incorrect values in widgets
associated: #180
associated: #194
2022-09-17 09:17:03 -07:00
Ben Phelps
d36f37a4ed remove as it’s causing troubles 2022-09-17 17:23:45 +03:00
Ben Phelps
f3ebbb6547 pass errors 2022-09-17 16:55:18 +03:00
Ben Phelps
28b2f79e5b use aggregate mapped data
to reduce the size of the API responses
2022-09-17 13:05:44 +03:00
Anonymous
9a77115a30 Translated using Weblate (Hungarian)
Currently translated at 100.0% (0 of 0 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2022-09-17 09:25:24 +02:00
Daniel Varga
2d899e364d Added translation using Weblate (Hungarian) 2022-09-17 09:25:17 +02:00
Anonymous
32b881891c Translated using Weblate (Croatian)
Currently translated at 8.3% (9 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2022-09-17 09:06:55 +02:00
Anonymous
9eefc07c7c Translated using Weblate (Swedish)
Currently translated at 88.8% (96 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2022-09-17 09:06:55 +02:00
Anonymous
792accffb6 Translated using Weblate (Polish)
Currently translated at 82.4% (89 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2022-09-17 09:06:54 +02:00
Anonymous
03af88aba5 Translated using Weblate (Catalan)
Currently translated at 92.5% (100 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-09-17 09:06:54 +02:00
Anonymous
f56b6b4ad0 Translated using Weblate (Chinese (Traditional))
Currently translated at 8.3% (9 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2022-09-17 09:06:54 +02:00
Anonymous
4ce1681e79 Translated using Weblate (Dutch)
Currently translated at 57.4% (62 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2022-09-17 09:06:54 +02:00
Anonymous
7570fa71f0 Translated using Weblate (Vietnamese)
Currently translated at 40.7% (44 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2022-09-17 09:06:53 +02:00
Anonymous
8a61c76cd9 Translated using Weblate (Norwegian Bokmål)
Currently translated at 73.1% (79 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2022-09-17 09:06:53 +02:00
Anonymous
fbf5381699 Translated using Weblate (Italian)
Currently translated at 63.8% (69 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2022-09-17 09:06:53 +02:00
Anonymous
ff77f0db4f Translated using Weblate (Chinese (Simplified))
Currently translated at 76.8% (83 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-09-17 09:06:52 +02:00
Anonymous
2e30abedc9 Translated using Weblate (Russian)
Currently translated at 19.4% (21 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2022-09-17 09:06:52 +02:00
Anonymous
c4cb4f7475 Translated using Weblate (Portuguese)
Currently translated at 81.4% (88 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2022-09-17 09:06:52 +02:00
Anonymous
7432bb813e Translated using Weblate (French)
Currently translated at 96.2% (104 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-09-17 09:06:52 +02:00
Anonymous
572a104779 Translated using Weblate (Spanish)
Currently translated at 96.2% (104 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-09-17 09:06:51 +02:00
Anonymous
f77dc23d92 Translated using Weblate (German)
Currently translated at 59.2% (64 of 108 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2022-09-17 09:06:51 +02:00
nicedc
e92fc74dd3 Translated using Weblate (Chinese (Simplified))
Currently translated at 79.8% (83 of 104 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-09-17 09:06:42 +02:00
Nonoss117
9479c3d5c3 Translated using Weblate (French)
Currently translated at 100.0% (104 of 104 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-09-17 09:06:42 +02:00
Ángel Fernández Sánchez
cfc37a64e1 Translated using Weblate (Spanish)
Currently translated at 100.0% (104 of 104 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-09-17 09:06:42 +02:00
Ben Phelps
2d5294804c Merge pull request #192 from JazzFisch/add-qbittorrent
Add qBittorrent Widget
2022-09-17 10:06:38 +03:00
Jason Fischer
6c01a85077 Merge branch 'main' into add-qbittorrent 2022-09-16 23:19:24 -07:00
Ben Phelps
cf41e988eb fix error with no map 2022-09-17 08:38:53 +03:00
Ben Phelps
d7a161c088 remove map for now 2022-09-17 08:34:32 +03:00
Ben Phelps
379c4040fe Merge branch 'JazzFisch-proxy-with-mapping' 2022-09-17 08:32:48 +03:00
Ben Phelps
3f17618ad5 allow endpoint specific maps 2022-09-17 08:32:40 +03:00
Andy
d7be64c3d9 add backgroundOpacity option 2022-09-17 08:24:12 +03:00
Juan Manuel Bennàssar Carretero
ef7737e9be Translated using Weblate (Spanish)
Currently translated at 100.0% (104 of 104 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-09-17 08:24:12 +03:00
Ben Phelps
51ad3184b6 Merge pull request #183 from andrii-kryvoviaz/add-background-image-opacity
Add backgroundOpacity option
2022-09-17 07:33:35 +03:00
Jason Fischer
efc8fd878a Merge branch 'main' into add-qbittorrent 2022-09-16 19:12:41 -07:00
Jason Fischer
6da1e98c83 Add qBittorrent Widget
- extract cookie jar functionality into its own file
- use i18n for more strings in existing widgets

completes: #152
associated: #123
2022-09-16 19:11:57 -07:00
Juan Manuel Bennàssar Carretero
513a06740c Translated using Weblate (Spanish)
Currently translated at 100.0% (104 of 104 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-09-16 21:23:35 +02:00
Jason Fischer
743a070724 Proposal to add ability to map data in a proxy 2022-09-16 11:33:11 -07:00
Andy
5fb0e76669 add backgroundOpacity option 2022-09-16 15:31:13 +03:00
Anonymous
bedeab686e Translated using Weblate (Croatian)
Currently translated at 100.0% (0 of 0 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2022-09-16 14:31:03 +02:00
Nonoss117
9d9fa352ce Translated using Weblate (French)
Currently translated at 100.0% (104 of 104 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-09-16 14:31:02 +02:00
sheep
1bfa6ce862 Added translation using Weblate (Croatian) 2022-09-16 14:30:39 +02:00
Ben Phelps
755b29c859 update readme 2022-09-16 14:18:27 +03:00
Anonymous
aab5b0247a Translated using Weblate (Swedish)
Currently translated at 92.3% (96 of 104 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2022-09-16 13:06:38 +02:00
Anonymous
d7e4b0bd17 Translated using Weblate (Polish)
Currently translated at 85.5% (89 of 104 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2022-09-16 13:06:38 +02:00
Anonymous
3bacdadb80 Translated using Weblate (Catalan)
Currently translated at 96.1% (100 of 104 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-09-16 13:06:38 +02:00
Anonymous
1d75ee44ed Translated using Weblate (Chinese (Traditional))
Currently translated at 8.6% (9 of 104 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2022-09-16 13:06:37 +02:00
Anonymous
230cc343af Translated using Weblate (Dutch)
Currently translated at 59.6% (62 of 104 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2022-09-16 13:06:37 +02:00
Anonymous
b318ee165c Translated using Weblate (Vietnamese)
Currently translated at 42.3% (44 of 104 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2022-09-16 13:06:37 +02:00
Anonymous
f677646365 Translated using Weblate (Norwegian Bokmål)
Currently translated at 75.9% (79 of 104 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2022-09-16 13:06:36 +02:00
Anonymous
8db7d820d7 Translated using Weblate (Italian)
Currently translated at 66.3% (69 of 104 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2022-09-16 13:06:36 +02:00
Anonymous
adb0632566 Translated using Weblate (Chinese (Simplified))
Currently translated at 79.8% (83 of 104 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-09-16 13:06:36 +02:00
Anonymous
4d5c8db333 Translated using Weblate (Russian)
Currently translated at 20.1% (21 of 104 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2022-09-16 13:06:35 +02:00
Anonymous
01d6a3d5f8 Translated using Weblate (Portuguese)
Currently translated at 84.6% (88 of 104 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2022-09-16 13:06:35 +02:00
Anonymous
fbeadbc32f Translated using Weblate (French)
Currently translated at 96.1% (100 of 104 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-09-16 13:06:35 +02:00
Anonymous
1289be888f Translated using Weblate (Spanish)
Currently translated at 96.1% (100 of 104 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-09-16 13:06:35 +02:00
Anonymous
aa7e3a955c Translated using Weblate (German)
Currently translated at 61.5% (64 of 104 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2022-09-16 13:06:34 +02:00
SuperDOS
2823f3b921 Translated using Weblate (Swedish)
Currently translated at 96.0% (96 of 100 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2022-09-16 13:06:26 +02:00
Ben Phelps
ddb2a74540 add AdGuard widget 2022-09-16 14:05:56 +03:00
Ben Phelps
37d8d7a2f8 fix indentation 2022-09-16 14:05:43 +03:00
Ben Phelps
578b715a1f allow HTTP basic auth on generic proxy 2022-09-16 14:05:27 +03:00
Anonymous
f14a811ce9 Translated using Weblate (Swedish)
Currently translated at 100.0% (0 of 0 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2022-09-16 11:02:49 +02:00
SuperDOS
06dd6d2213 Added translation using Weblate (Swedish) 2022-09-16 11:02:42 +02:00
Pacux
72471c47f4 Translated using Weblate (Catalan)
Currently translated at 100.0% (100 of 100 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-09-16 10:56:30 +02:00
Nonoss117
aec5f7173c Translated using Weblate (French)
Currently translated at 100.0% (100 of 100 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-09-16 10:56:29 +02:00
Ángel Fernández Sánchez
f7b68789ac Translated using Weblate (Spanish)
Currently translated at 100.0% (100 of 100 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-09-16 10:56:29 +02:00
Ángel Fernández Sánchez
0672da621e Translated using Weblate (Spanish)
Currently translated at 100.0% (100 of 100 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-09-16 10:40:37 +02:00
Juan Manuel Bennàssar Carretero
a7f9b78533 Translated using Weblate (Spanish)
Currently translated at 100.0% (100 of 100 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-09-16 10:40:36 +02:00
Ben Phelps
0075429e08 add greeting and datetime info widgets 2022-09-16 10:53:12 +03:00
Ben Phelps
43f7ccd166 update readme attributions 2022-09-16 10:49:20 +03:00
Ángel Fernández Sánchez
8c64e0f288 Translated using Weblate (Spanish)
Currently translated at 100.0% (100 of 100 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-09-16 09:10:38 +02:00
Juan Manuel Bennàssar Carretero
c91a387833 Translated using Weblate (Spanish)
Currently translated at 100.0% (100 of 100 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-09-16 09:10:38 +02:00
Ben Phelps
93d5dd88ba add options for layout, theme and color settings 2022-09-15 19:58:41 +03:00
Ben Phelps
05427253b9 tweak streaming widget spacings 2022-09-15 19:53:48 +03:00
Ben Phelps
e2bc541089 show transcoding info on streaming widgets 2022-09-15 19:48:23 +03:00
Kamil Ganczarek
9a959bab16 Translated using Weblate (Polish)
Currently translated at 89.0% (89 of 100 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2022-09-15 11:30:42 +02:00
Anonymous
45ca4a15f7 Translated using Weblate (Polish)
Currently translated at 100.0% (0 of 0 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2022-09-15 11:01:12 +02:00
Kamil Ganczarek
ddd2ff53ff Added translation using Weblate (Polish) 2022-09-15 11:01:05 +02:00
Nonoss117
5c3266b48f Translated using Weblate (French)
Currently translated at 100.0% (100 of 100 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-09-15 10:58:49 +02:00
Ben Phelps
0da6db9d9f update readme with supported integrations 2022-09-15 09:00:40 +03:00
244 changed files with 8448 additions and 4256 deletions

View File

@@ -2,6 +2,12 @@
"extends": ["airbnb", "next/core-web-vitals", "prettier"], "extends": ["airbnb", "next/core-web-vitals", "prettier"],
"plugins": ["prettier"], "plugins": ["prettier"],
"rules": { "rules": {
"import/no-cycle": [
"error",
{
"maxDepth": 1
}
],
"import/order": [ "import/order": [
"error", "error",
{ {

3
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,3 @@
github: benphelps
ko_fi: benphelps
custom: ["https://paypal.me/phelpsben"]

View File

@@ -94,6 +94,10 @@ jobs:
push: ${{ github.event_name != 'pull_request' }} push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }} tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }} labels: ${{ steps.meta.outputs.labels }}
build-args: |
BUILDTIME=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] }}
VERSION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.version'] }}
REVISION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }}
# https://github.com/docker/setup-qemu-action#about # https://github.com/docker/setup-qemu-action#about
# platforms: linux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6 # platforms: linux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6
platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/arm/v6 platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/arm/v6

4
.gitignore vendored
View File

@@ -19,6 +19,10 @@
.DS_Store .DS_Store
*.pem *.pem
# log files
error.log
homepage.log
# debug # debug
npm-debug.log* npm-debug.log*
yarn-debug.log* yarn-debug.log*

19
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,19 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Next.js: debug full stack",
"type": "node",
"request": "launch",
"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/next",
"serverReadyAction": {
"pattern": "started server on .+, url: (https?://.+)",
"uriFormat": "%s",
"action": "debugWithChrome"
}
}
]
}

6
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,6 @@
{
"files.exclude": {
"**/.next": true,
"**/node_modules": true
}
}

View File

@@ -22,6 +22,10 @@ RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store pnpm i
FROM node:current-alpine AS builder FROM node:current-alpine AS builder
WORKDIR /app WORKDIR /app
ARG BUILDTIME
ARG VERSION
ARG REVISION
COPY --link --from=deps /app/node_modules ./node_modules/ COPY --link --from=deps /app/node_modules ./node_modules/
COPY . . COPY . .
@@ -29,7 +33,7 @@ RUN <<EOF
set -xe set -xe
yarn next telemetry disable yarn next telemetry disable
mkdir config && echo '-' > config/settings.yaml mkdir config && echo '-' > config/settings.yaml
npm run build NEXT_PUBLIC_BUILDTIME=$BUILDTIME NEXT_PUBLIC_VERSION=$VERSION NEXT_PUBLIC_REVISION=$REVISION npm run build
EOF EOF
# Production image, copy all the files and run next # Production image, copy all the files and run next

View File

@@ -1,34 +1,63 @@
![Homepage Preview](/images/preview.png) <p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="images/banner_light@2x.png">
<img src="images/banner_dark@2x.png" width="65%">
</picture>
</p>
[![Docker](https://github.com/benphelps/homepage/actions/workflows/docker-publish.yml/badge.svg)](https://github.com/benphelps/homepage/actions/workflows/docker-publish.yml) <p align="center">
[![Weblate](https://hosted.weblate.org/widgets/homepage/-/homepage/svg-badge.svg)](https://hosted.weblate.org/engage/homepage/) A modern <em>(fully static, fast)</em>, secure <em>(fully proxied)</em>, highly customizable application dashboard with integrations for more than 25 services and translations for over 15 languages. Easily configured via YAML files (or discovery via docker labels).
</p>
<p align="center">
<img src="images/1.png" />
</p>
<p align="center">
<img src="images/2.png" width="19%" />
<img src="images/3.png" width="19%" />
<img src="images/4.png" width="19%" />
<img src="images/5.png" width="19%" />
<img src="images/6.png" width="19%" />
</p>
<p align="center">
<a href="https://discord.gg/k4ruYNrudu"><img src="https://img.shields.io/badge/Discord - Chat-blue?logo=discord&logoColor=white" /></a>
<a href="https://paypal.me/phelpsben" title="Donate"><img src="https://img.shields.io/badge/PayPal - Donate-blue?logo=paypal&logoColor=white" alt="Linkedin - phelpsben"></a>
</p>
<p align="center">
<a href="https://github.com/benphelps/homepage/actions/workflows/docker-publish.yml"><img src="https://github.com/benphelps/homepage/actions/workflows/docker-publish.yml/badge.svg" alt="Docker"></a>
<a href="https://hosted.weblate.org/engage/homepage/"><img src="https://hosted.weblate.org/widgets/homepage/-/homepage/svg-badge.svg" alt="Weblate"></a>
</p>
## Features ## Features
- Fast! The entire site is statically generated at build time, so you can expect instant load times - **Fast!** The entire site is statically generated at build time, so you can expect instant load times
- **Secure!** Every API request to backend services goes through a proxy server, so your API keys are never exposed to the frontend client.
- Images built for AMD64 (x86_64), ARM64, ARMv7 and ARMv6 - Images built for AMD64 (x86_64), ARM64, ARMv7 and ARMv6
- Supports all Raspberry Pi's, most SBCs & Apple Silicon - Supports all Raspberry Pi's, most SBCs & Apple Silicon
- Full i18n support with automatic language detection - Full i18n support with automatic language detection
- Translations for Chinese, Dutch, French, German, Norwegian Bokmål, Portuguese, Russian and Spanish - Translantions for Catalan, Chinese, Dutch, Finnish, French, German, Hebrew, Hungarian, Norwegian Bokmål, Polish, Portuguese, Portuguese (Brazil), Romainian, Russian, Spanish, Swedish and Yue
- Want to help translate? [Join the Weblate project](https://hosted.weblate.org/engage/homepage/) - Want to help translate? [Join the Weblate project](https://hosted.weblate.org/engage/homepage/)
- Service & Web Bookmarks - Service & Web Bookmarks
- Docker Integration - Docker Integration
- Container status (Running / Stopped) & statistics (CPU, Memory, Network) - Container status (Running / Stopped) & statistics (CPU, Memory, Network)
- Automatic service discovery (via labels) - Automatic service discovery (via labels)
- Service Integration - Service Integration
- Sonarr, Radarr, Readarr, Prowlarr, Emby, Jellyfin, Tautulli (Plex) - Sonarr, Radarr, Readarr, Prowlarr, Bazarr, Lidarr, Emby, Jellyfin, Tautulli (Plex)
- Ombi, Overseerr, Jellyseerr, NZBGet, SABnzbd, ruTorrent, Transmission - Ombi, Overseerr, Jellyseerr, Jackett, NZBGet, SABnzbd, ruTorrent, Transmission, qBittorrent
- Portainer, Traefik, Speedtest Tracker, PiHole, Nginx Proxy Manager, Gotify - Portainer, Traefik, Speedtest Tracker, PiHole, AdGuard Home, Nginx Proxy Manager, Gotify, Syncthing Relay Server, Authentic, Proxmox
- Information Providers - Information Providers
- Coin Market Cap - Coin Market Cap, Mastodon
- Information & Utility Widgets - Information & Utility Widgets
- System Stats (Disk, CPU, Memory) - System Stats (Disk, CPU, Memory)
- Weather via WeatherAPI.com or OpenWeatherMap - Weather via WeatherAPI.com or OpenWeatherMap
- Automatic location detection (with HTTPS), or manual location selection
- Search Bar - Search Bar
- Customizable - Customizable
- 21 theme colors with light and dark mode support - 21 theme colors with light and dark mode support
- Background image support - Background image support
- Column and Row layout options
## Support & Suggestions ## Support & Suggestions
@@ -50,11 +79,10 @@ services:
homepage: homepage:
image: ghcr.io/benphelps/homepage:latest image: ghcr.io/benphelps/homepage:latest
container_name: homepage container_name: homepage
user: 1000:1000 # Optional, change to your user and group IDs for permissions
ports: ports:
- 3000:3000 - 3000:3000
volumes: volumes:
- /path/to/config:/app/config # Make sure your local config directory is exists - /path/to/config:/app/config # Make sure your local config directory exists
- /var/run/docker.sock:/var/run/docker.sock # (optional) For docker integrations - /var/run/docker.sock:/var/run/docker.sock # (optional) For docker integrations
``` ```
@@ -120,18 +148,43 @@ Huge thanks to the all the contributors who have helped make this project what i
- [aidenpwnz](https://github.com/benphelps/homepage/commits?author=aidenpwnz) - Nginx Proxy Manager, Search Bar Widget - [aidenpwnz](https://github.com/benphelps/homepage/commits?author=aidenpwnz) - Nginx Proxy Manager, Search Bar Widget
- [AlexFullmoon](https://github.com/benphelps/homepage/commits?author=AlexFullmoon) - OpenWeatherMap Widget - [AlexFullmoon](https://github.com/benphelps/homepage/commits?author=AlexFullmoon) - OpenWeatherMap Widget
- [AmadeusGraves](https://github.com/benphelps/homepage/commits?author=AmadeusGraves) - Spanish Translation - [andrii-kryvoviaz](https://github.com/benphelps/homepage/commits?author=andrii-kryvoviaz) - Background opacity option
- [boerniee](https://github.com/benphelps/homepage/commits?author=boerniee) - German Translation - [DevPGSV](https://github.com/benphelps/homepage/commits?author=DevPGSV) - Syncthing Relay Server & Mastodon widgets
- [comradekingu](https://github.com/benphelps/homepage/commits?author=comradekingu) - Norwegian Bokmål Translation
- [deffcolony](https://github.com/benphelps/homepage/commits?author=deffcolony) - Dutch Translation
- [desolaris](https://github.com/benphelps/homepage/commits?author=desolaris) - Russian Translation
- [ilusi0n](https://github.com/benphelps/homepage/commits?author=ilusi0n) - Jellyseerr Integration - [ilusi0n](https://github.com/benphelps/homepage/commits?author=ilusi0n) - Jellyseerr Integration
- [ItsJustMeChris](https://github.com/benphelps/homepage/commits?author=ItsJustMeChris) - Coin Market Cap Widget - [ItsJustMeChris](https://github.com/benphelps/homepage/commits?author=ItsJustMeChris) - Coin Market Cap Widget
- [jackblk](https://github.com/benphelps/homepage/commits?author=jackblk) - Vietnamese Translation - [JazzFisch](https://github.com/benphelps/homepage/commits?author=JazzFisch) - Readarr, Bazarr, Lidarr, SABnzbd, Transmission, qBittorrent, Proxmox Integrations & countless more improvements
- [JazzFisch](https://github.com/benphelps/homepage/commits?author=JazzFisch) - Readarr, Bazarr, Lidarr, SABnzbd & Transmission Integrations - [josways](https://github.com/benphelps/homepage/commits?author=josways) - Baidu search provider
- [mauricio-kalil](https://github.com/benphelps/homepage/commits?author=mauricio-kalil) - Portuguese (Brazil)
- [modem7](https://github.com/benphelps/homepage/commits?author=modem7) - Impvoed Docker Image - [modem7](https://github.com/benphelps/homepage/commits?author=modem7) - Impvoed Docker Image
- [nicedc](https://github.com/benphelps/homepage/commits?author=nicedc) - Chinese Translation - [MountainGod2](https://github.com/benphelps/homepage/discussions/243) - Homepage Logo
- [Nonoss117](https://github.com/benphelps/homepage/commits?author=Nonoss117) - French Translation
- [quod](https://github.com/benphelps/homepage/commits?author=quod) - Fixed Typos - [quod](https://github.com/benphelps/homepage/commits?author=quod) - Fixed Typos
- [schklom](https://github.com/benphelps/homepage/commits?author=schklom) - ARM64, ARMv7 and ARMv6 - [schklom](https://github.com/benphelps/homepage/commits?author=schklom) - ARM64, ARMv7 and ARMv6
- [xicopitz](https://github.com/benphelps/homepage/commits?author=xicopitz) - Gotify & Prowlarr Integration - [xicopitz](https://github.com/benphelps/homepage/commits?author=xicopitz) - Gotify & Prowlarr Integration
### Translators
- [3vilson](https://github.com/benphelps/homepage/commits?author=3vilson) - German
- [4lenz1](https://github.com/benphelps/homepage/commits?author=4lenz1) - Chinese
- [AmadeusGraves](https://github.com/benphelps/homepage/commits?author=AmadeusGraves) - Spanish
- [boerniee](https://github.com/benphelps/homepage/commits?author=boerniee) - German
- [brunoccr](https://github.com/benphelps/homepage/commits?author=brunoccr) - Portuguese (Brazil)
- [C8opmBM](https://github.com/benphelps/homepage/commits?author=C8opmBM) - Romainian
- [comradekingu](https://github.com/benphelps/homepage/commits?author=comradekingu) - Norwegian Bokmål
- Daniel Varga - German & Hungarian
- [deffcolony](https://github.com/benphelps/homepage/commits?author=deffcolony) - Dutch
- [desolaris](https://github.com/benphelps/homepage/commits?author=desolaris) - Russian
- [ericlokz](https://github.com/benphelps/homepage/commits?author=ericlokz) - Yue
- [FunsKiTo](https://github.com/benphelps/homepage/commits?author=FunsKiTo) - Spanish
- [jackblk](https://github.com/benphelps/homepage/commits?author=jackblk) - Vietnamese
- [juanmanuelbc](https://github.com/benphelps/homepage/commits?author=juanmanuelbc) - Spanish and Catalan
- [ling0412](https://github.com/benphelps/homepage/commits?author=ling0412) - Chinese
- [milotype](https://github.com/benphelps/homepage/commits?author=milotype) - Croatian
- [nicedc](https://github.com/benphelps/homepage/commits?author=nicedc) - Chinese
- [Nonoss117](https://github.com/benphelps/homepage/commits?author=Nonoss117) - French
- [pacoculebras](https://github.com/benphelps/homepage/commits?author=pacoculebras) - Catalan
- [Prilann](https://github.com/benphelps/homepage/commits?author=Prilann) - German
- [psychodracon](https://github.com/benphelps/homepage/commits?author=psychodracon) - Polish
- Sascha Jelinek - German
- [ShlomiPorush](https://github.com/benphelps/homepage/commits?author=ShlomiPorush) - Hebrew
- [SuperDOS](https://github.com/benphelps/homepage/commits?author=SuperDOS) - Swedish
- [kaihu](https://github.com/benphelps/homepage/commits?author=kaihu) - Finnish

BIN
images/1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 345 KiB

BIN
images/2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB

BIN
images/3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 KiB

BIN
images/4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

BIN
images/5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 423 KiB

BIN
images/6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 533 KiB

BIN
images/banner_dark@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

BIN
images/banner_light@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 777 KiB

124
next-i18next.config.js Normal file
View File

@@ -0,0 +1,124 @@
// prettyBytes taken from https://github.com/sindresorhus/pretty-bytes
/* eslint-disable no-param-reassign */
const BYTE_UNITS = ["B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
const BIBYTE_UNITS = ["B", "kiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"];
const BIT_UNITS = ["b", "kbit", "Mbit", "Gbit", "Tbit", "Pbit", "Ebit", "Zbit", "Ybit"];
const BIBIT_UNITS = ["b", "kibit", "Mibit", "Gibit", "Tibit", "Pibit", "Eibit", "Zibit", "Yibit"];
/*
Formats the given number using `Number#toLocaleString`.
- If locale is a string, the value is expected to be a locale-key (for example: `de`).
- If locale is true, the system default locale is used for translation.
- If no value for locale is specified, the number is returned unmodified.
*/
const toLocaleString = (number, locale, options) => {
let result = number;
if (typeof locale === "string" || Array.isArray(locale)) {
result = number.toLocaleString(locale, options);
} else if (locale === true || options !== undefined) {
result = number.toLocaleString(undefined, options);
}
return result;
};
function prettyBytes(number, options) {
if (!Number.isFinite(number)) {
throw new TypeError(`Expected a finite number, got ${typeof number}: ${number}`);
}
options = {
bits: false,
binary: false,
...options,
};
// eslint-disable-next-line no-nested-ternary
const UNITS = options.bits ? (options.binary ? BIBIT_UNITS : BIT_UNITS) : options.binary ? BIBYTE_UNITS : BYTE_UNITS;
if (options.signed && number === 0) {
return ` 0 ${UNITS[0]}`;
}
const isNegative = number < 0;
// eslint-disable-next-line no-nested-ternary
const prefix = isNegative ? "-" : options.signed ? "+" : "";
if (isNegative) {
number = -number;
}
let localeOptions;
if (options.minimumFractionDigits !== undefined) {
localeOptions = { minimumFractionDigits: options.minimumFractionDigits };
}
if (options.maximumFractionDigits !== undefined) {
localeOptions = { maximumFractionDigits: options.maximumFractionDigits, ...localeOptions };
}
if (number < 1) {
const numberString = toLocaleString(number, options.locale, localeOptions);
return `${prefix + numberString} ${UNITS[0]}`;
}
const exponent = Math.min(
Math.floor(options.binary ? Math.log(number) / Math.log(1024) : Math.log10(number) / 3),
UNITS.length - 1
);
number /= (options.binary ? 1024 : 1000) ** exponent;
if (!localeOptions) {
number = number.toPrecision(3);
}
const numberString = toLocaleString(Number(number), options.locale, localeOptions);
const unit = UNITS[exponent];
return `${prefix + numberString} ${unit}`;
}
module.exports = {
i18n: {
defaultLocale: "en",
locales: ["en"],
},
serializeConfig: false,
use: [
{
init: (i18next) => {
i18next.services.formatter.add("bytes", (value, lng, options) =>
prettyBytes(parseFloat(value), { locale: lng, ...options })
);
i18next.services.formatter.add("rate", (value, lng, options) => {
if (value === 0) return "0 Bps";
const bits = options.bits ? value : value / 8;
const k = 1024;
const dm = options.decimals ? options.decimals : 0;
const sizes = ["Bps", "Kbps", "Mbps", "Gbps", "Tbps", "Pbps", "Ebps", "Zbps", "Ybps"];
const i = Math.floor(Math.log(bits) / Math.log(k));
const formatted = new Intl.NumberFormat(lng, { maximumFractionDigits: dm, minimumFractionDigits: dm }).format(
parseFloat(bits / k ** i)
);
return `${formatted} ${sizes[i]}`;
});
i18next.services.formatter.add("percent", (value, lng, options) =>
new Intl.NumberFormat(lng, { style: "percent", ...options }).format(parseFloat(value) / 100.0)
);
},
type: "3rdParty",
},
],
};

View File

@@ -1,3 +1,5 @@
const { i18n } = require("./next-i18next.config");
/** @type {import('next').NextConfig} */ /** @type {import('next').NextConfig} */
const nextConfig = { const nextConfig = {
reactStrictMode: true, reactStrictMode: true,
@@ -7,6 +9,7 @@ const nextConfig = {
domains: ["cdn.jsdelivr.net"], domains: ["cdn.jsdelivr.net"],
unoptimized: true, unoptimized: true,
}, },
i18n,
}; };
module.exports = nextConfig; module.exports = nextConfig;

View File

@@ -10,18 +10,17 @@
"telemetry": "next telemetry disable" "telemetry": "next telemetry disable"
}, },
"dependencies": { "dependencies": {
"@headlessui/react": "^1.7.0", "@headlessui/react": "^1.7.2",
"@tailwindcss/forms": "^0.5.3", "classnames": "^2.3.2",
"classnames": "^2.3.1", "compare-versions": "^5.0.1",
"dockerode": "^3.3.4", "dockerode": "^3.3.4",
"follow-redirects": "^1.15.2", "follow-redirects": "^1.15.2",
"i18next": "^21.9.1", "i18next": "^21.9.2",
"i18next-browser-languagedetector": "^6.1.5",
"i18next-http-backend": "^1.4.1",
"js-yaml": "^4.1.0", "js-yaml": "^4.1.0",
"json-rpc-2.0": "^1.4.1", "json-rpc-2.0": "^1.4.1",
"memory-cache": "^0.2.0", "memory-cache": "^0.2.0",
"next": "^12.3.0", "next": "^12.3.1",
"next-i18next": "^12.0.1",
"node-os-utils": "^1.3.7", "node-os-utils": "^1.3.7",
"pretty-bytes": "^6.0.0", "pretty-bytes": "^6.0.0",
"raw-body": "^2.5.1", "raw-body": "^2.5.1",
@@ -32,13 +31,16 @@
"rutorrent-promise": "^2.0.0", "rutorrent-promise": "^2.0.0",
"shvl": "^3.0.0", "shvl": "^3.0.0",
"swr": "^1.3.0", "swr": "^1.3.0",
"tough-cookie": "^4.1.2" "tough-cookie": "^4.1.2",
"winston": "^3.8.2",
"xml-js": "^1.6.11"
}, },
"devDependencies": { "devDependencies": {
"autoprefixer": "^10.4.9", "@tailwindcss/forms": "^0.5.3",
"eslint": "^8.23.1", "autoprefixer": "^10.4.12",
"eslint": "^8.24.0",
"eslint-config-airbnb": "^19.0.4", "eslint-config-airbnb": "^19.0.4",
"eslint-config-next": "^12.3.0", "eslint-config-next": "^12.3.1",
"eslint-config-prettier": "^8.5.0", "eslint-config-prettier": "^8.5.0",
"eslint-plugin-import": "^2.26.0", "eslint-plugin-import": "^2.26.0",
"eslint-plugin-jsx-a11y": "^6.6.1", "eslint-plugin-jsx-a11y": "^6.6.1",
@@ -47,6 +49,7 @@
"eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-hooks": "^4.6.0",
"postcss": "^8.4.16", "postcss": "^8.4.16",
"prettier": "^2.7.1", "prettier": "^2.7.1",
"tailwind-scrollbar": "^2.0.1",
"tailwindcss": "^3.1.8", "tailwindcss": "^3.1.8",
"typescript": "^4.8.3" "typescript": "^4.8.3"
} }

742
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

BIN
public/apple-touch-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
public/favicon-16x16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 465 B

BIN
public/favicon-32x32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 595 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

BIN
public/homepage.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -0,0 +1,205 @@
{
"sabnzbd": {
"queue": "Опашка",
"timeleft": "Оставащо Време",
"rate": "Rate"
},
"rutorrent": {
"active": "Акитивен",
"upload": "Споделяне",
"download": "Сваляне"
},
"widget": {
"missing_type": "Липсваща приставка: {{type}}",
"api_error": "API Грешка",
"status": "Статус"
},
"weather": {
"current": "Текущо местоположение",
"allow": "Разреши",
"updating": "Обновяване",
"wait": "Моля изчакайте"
},
"search": {
"placeholder": "Търсене…"
},
"resources": {
"cpu": "CPU",
"total": "Общо",
"free": "Свободни",
"used": "Заети",
"load": "Натоварване"
},
"unifi": {
"users": "Потребители",
"uptime": "Активен от",
"days": "Дни",
"wan": "WAN",
"lan_users": "LAN Потребители",
"wlan_users": "WLAN Потребители",
"up": "UP",
"down": "DOWN",
"wait": "Моля изчакайте"
},
"docker": {
"offline": "Изключен",
"rx": "RX",
"tx": "TX",
"mem": "MEM",
"cpu": "CPU"
},
"emby": {
"playing": "Възпроизвежда",
"transcoding": "Конвертира",
"bitrate": "Bitrate",
"no_active": "Няма активни потоци"
},
"tautulli": {
"playing": "Възпроизвежда",
"transcoding": "Конвертира",
"bitrate": "Честота",
"no_active": "Няма активни потоци"
},
"nzbget": {
"rate": "Rate",
"remaining": "Остава",
"downloaded": "Изтеглени"
},
"plex": {
"streams": "Активни Потоци",
"movies": "Филми",
"tv": "Сериали"
},
"transmission": {
"download": "Сваляне",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"qbittorrent": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"sonarr": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"radarr": {
"wanted": "Wanted",
"queued": "Queued",
"movies": "Movies"
},
"lidarr": {
"wanted": "Wanted",
"queued": "Queued",
"albums": "Albums"
},
"readarr": {
"wanted": "Wanted",
"queued": "Queued",
"books": "Books"
},
"bazarr": {
"missingEpisodes": "Missing Episodes",
"missingMovies": "Missing Movies"
},
"ombi": {
"pending": "Pending",
"approved": "Approved",
"available": "Available"
},
"jellyseerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available"
},
"overseerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available"
},
"pihole": {
"queries": "Queries",
"blocked": "Blocked",
"gravity": "Gravity"
},
"adguard": {
"queries": "Queries",
"blocked": "Blocked",
"filtered": "Filtered",
"latency": "Latency"
},
"speedtest": {
"upload": "Upload",
"download": "Download",
"ping": "Ping"
},
"portainer": {
"running": "Running",
"stopped": "Stopped",
"total": "Total"
},
"traefik": {
"routers": "Routers",
"services": "Services",
"middleware": "Middleware"
},
"npm": {
"enabled": "Enabled",
"disabled": "Disabled",
"total": "Total"
},
"coinmarketcap": {
"configure": "Configure one or more crypto currencies to track",
"1hour": "1 Hour",
"1day": "1 Day",
"7days": "7 Days",
"30days": "30 Days"
},
"gotify": {
"apps": "Applications",
"clients": "Clients",
"messages": "Messages"
},
"prowlarr": {
"enableIndexers": "Indexers",
"numberOfGrabs": "Grabs",
"numberOfQueries": "Queries",
"numberOfFailGrabs": "Fail Grabs",
"numberOfFailQueries": "Fail Queries"
},
"authentik": {
"loginsLast24H": "Logins (24h)",
"users": "Users",
"failedLoginsLast24H": "Failed Logins (24h)"
},
"jackett": {
"configured": "Configured",
"errored": "Errored"
},
"strelaysrv": {
"numActiveSessions": "Sessions",
"numConnections": "Connections",
"dataRelayed": "Relayed",
"transferRate": "Rate"
},
"mastodon": {
"user_count": "Users",
"status_count": "Posts",
"domain_count": "Domains"
},
"proxmox": {
"mem": "MEM",
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait"
}
}

View File

@@ -33,13 +33,14 @@
"total": "Total", "total": "Total",
"free": "Lliure", "free": "Lliure",
"used": "Usat", "used": "Usat",
"load": "Càrrega" "load": "Càrrega",
"cpu": "CPU"
}, },
"docker": { "docker": {
"rx": "RX", "rx": "Rebut",
"tx": "TX", "tx": "Transmès",
"mem": "MEM", "mem": "Memòria",
"cpu": "CPU", "cpu": "Processador",
"offline": "Fora de línia" "offline": "Fora de línia"
}, },
"emby": { "emby": {
@@ -97,7 +98,7 @@
"pihole": { "pihole": {
"queries": "Consultes", "queries": "Consultes",
"blocked": "Bloquejat", "blocked": "Bloquejat",
"gravity": "Gravetat" "gravity": "Gravity"
}, },
"portainer": { "portainer": {
"running": "Executant", "running": "Executant",
@@ -134,16 +135,71 @@
"numberOfFailQueries": "Consultes fallides" "numberOfFailQueries": "Consultes fallides"
}, },
"jackett": { "jackett": {
"configured": "Configured", "configured": "Configurat",
"errored": "Errored" "errored": "Amb errors"
}, },
"bazarr": { "bazarr": {
"missingEpisodes": "Missing Episodes", "missingEpisodes": "Episodis que falten",
"missingMovies": "Missing Movies" "missingMovies": "Pel·lícules que falten"
}, },
"lidarr": { "lidarr": {
"wanted": "Wanted", "wanted": "Volgut",
"queued": "Queued", "queued": "En cua",
"albums": "Albums" "albums": "Àlbums"
},
"adguard": {
"queries": "Consultes",
"blocked": "Bloquejat",
"filtered": "Filtrat",
"latency": "Latència"
},
"qbittorrent": {
"download": "Descàrrega",
"upload": "Càrrega",
"leech": "Companys",
"seed": "Llavors"
},
"mastodon": {
"user_count": "Usuaris",
"status_count": "Publicacions",
"domain_count": "Dominis"
},
"strelaysrv": {
"numActiveSessions": "Sessions",
"numConnections": "Connexions",
"dataRelayed": "Transmès",
"transferRate": "Velocitat"
},
"authentik": {
"users": "Usuaris",
"loginsLast24H": "Inicis de sessió (24h)",
"failedLoginsLast24H": "Errors d'inici de sessió (24h)"
},
"proxmox": {
"vms": "VMs",
"mem": "Memòria",
"cpu": "Processador",
"lxc": "LXC"
},
"unifi": {
"users": "Users",
"uptime": "System Uptime",
"days": "Days",
"wan": "WAN",
"lan_users": "LAN Users",
"wlan_users": "WLAN Users",
"up": "UP",
"down": "DOWN",
"wait": "Please wait"
},
"plex": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait"
} }
} }

View File

@@ -11,7 +11,8 @@
"total": "Gesamt", "total": "Gesamt",
"free": "Frei", "free": "Frei",
"used": "Gebraucht", "used": "Gebraucht",
"load": "Load" "load": "Belastung",
"cpu": "CPU"
}, },
"docker": { "docker": {
"rx": "Rx", "rx": "Rx",
@@ -24,13 +25,13 @@
"playing": "Spielen", "playing": "Spielen",
"transcoding": "Transcodierung", "transcoding": "Transcodierung",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "No Active Streams" "no_active": "Keine aktive Streams"
}, },
"tautulli": { "tautulli": {
"playing": "Spielen", "playing": "Spielen",
"transcoding": "Transcodierung", "transcoding": "Transcodierung",
"bitrate": "Bitrate", "bitrate": "Bitrate",
"no_active": "No Active Streams" "no_active": "Keine aktiven streamen"
}, },
"rutorrent": { "rutorrent": {
"active": "Aktiv", "active": "Aktiv",
@@ -48,9 +49,9 @@
"movies": "Filme" "movies": "Filme"
}, },
"readarr": { "readarr": {
"wanted": "Wanted", "wanted": "Gesucht",
"queued": "Queued", "queued": "In Warteschlange",
"books": "Books" "books": "Bücher"
}, },
"ombi": { "ombi": {
"pending": "Ausstehend", "pending": "Ausstehend",
@@ -79,8 +80,8 @@
}, },
"traefik": { "traefik": {
"routers": "Router", "routers": "Router",
"services": "Services", "services": "Dienste",
"middleware": "Middleware" "middleware": "Zwischenanwendung"
}, },
"npm": { "npm": {
"enabled": "Aktiviert", "enabled": "Aktiviert",
@@ -94,56 +95,111 @@
"wait": "Bitte warten" "wait": "Bitte warten"
}, },
"overseerr": { "overseerr": {
"pending": "Pending", "pending": "Ausstehend",
"approved": "Approved", "approved": "Genehmigt",
"available": "Available" "available": "Verfügbar"
}, },
"sabnzbd": { "sabnzbd": {
"rate": "Rate", "rate": "Geschwindigkeit",
"queue": "Queue", "queue": "Warteschlange",
"timeleft": "Time Left" "timeleft": "Verbleibende Zeit"
}, },
"nzbget": { "nzbget": {
"rate": "Rate", "rate": "Geschwindigkeit",
"remaining": "Remaining", "remaining": "Verbleibend",
"downloaded": "Downloaded" "downloaded": "Heruntergeladen"
}, },
"coinmarketcap": { "coinmarketcap": {
"configure": "Configure one or more crypto currencies to track", "configure": "Konfiguriere eine oder mehrere Kryptowährungen zur Verfolgung",
"1hour": "1 Hour", "1hour": "1 Stunde",
"1day": "1 Day", "1day": "1 Tag",
"7days": "7 Days", "7days": "7 Tage",
"30days": "30 Days" "30days": "30 Tage"
}, },
"gotify": { "gotify": {
"apps": "Applications", "apps": "Programme",
"clients": "Clients", "clients": "Benutzer",
"messages": "Messages" "messages": "Nachrichten"
}, },
"prowlarr": { "prowlarr": {
"enableIndexers": "Indexers", "enableIndexers": "Indexer",
"numberOfGrabs": "Grabs", "numberOfGrabs": "Abrufungen",
"numberOfQueries": "Queries", "numberOfQueries": "Anfragen",
"numberOfFailGrabs": "Fail Grabs", "numberOfFailGrabs": "Fehlgeschlagene Abrufungen",
"numberOfFailQueries": "Fail Queries" "numberOfFailQueries": "Fehlgeschlagene Anfragen"
}, },
"transmission": { "transmission": {
"download": "Download", "download": "Herunterladen",
"upload": "Upload", "upload": "Hochladen",
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"jackett": { "jackett": {
"configured": "Configured", "configured": "Konfiguriert",
"errored": "Errored" "errored": "Fehlerhaft"
}, },
"bazarr": { "bazarr": {
"missingEpisodes": "Missing Episodes", "missingEpisodes": "Fehlende Episoden",
"missingMovies": "Missing Movies" "missingMovies": "Fehlende Filme"
}, },
"lidarr": { "lidarr": {
"wanted": "Wanted", "wanted": "Gesucht",
"queued": "Queued", "queued": "In Warteschlange",
"albums": "Albums" "albums": "Alben"
},
"adguard": {
"queries": "Anfragen",
"blocked": "Blockiert",
"filtered": "Gefiltert",
"latency": "Latenz"
},
"qbittorrent": {
"download": "Herunterladen",
"upload": "Hochladen",
"leech": "Leech",
"seed": "Seed"
},
"mastodon": {
"user_count": "Nutzer",
"status_count": "Beiträge",
"domain_count": "Domänen"
},
"strelaysrv": {
"numActiveSessions": "Sitzungen",
"numConnections": "Verbindungen",
"dataRelayed": "Weitergeleitet",
"transferRate": "Bewerten"
},
"authentik": {
"users": "Benutzer",
"loginsLast24H": "Anmeldungen (24h)",
"failedLoginsLast24H": "fehlerhafte Anmeldungen (24h)"
},
"proxmox": {
"mem": "MEM",
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
},
"unifi": {
"users": "Users",
"uptime": "System Uptime",
"days": "Days",
"wan": "WAN",
"lan_users": "LAN Users",
"wlan_users": "WLAN Users",
"up": "UP",
"down": "DOWN",
"wait": "Please wait"
},
"plex": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait"
} }
} }

View File

@@ -25,11 +25,23 @@
"placeholder": "Search…" "placeholder": "Search…"
}, },
"resources": { "resources": {
"cpu": "CPU",
"total": "Total", "total": "Total",
"free": "Free", "free": "Free",
"used": "Used", "used": "Used",
"load": "Load" "load": "Load"
}, },
"unifi": {
"users": "Users",
"uptime": "System Uptime",
"days": "Days",
"wan": "WAN",
"lan_users": "LAN Users",
"wlan_users": "WLAN Users",
"up": "UP",
"down": "DOWN",
"wait": "Please wait"
},
"docker": { "docker": {
"rx": "RX", "rx": "RX",
"tx": "TX", "tx": "TX",
@@ -54,6 +66,11 @@
"remaining": "Remaining", "remaining": "Remaining",
"downloaded": "Downloaded" "downloaded": "Downloaded"
}, },
"plex": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
},
"sabnzbd": { "sabnzbd": {
"rate": "Rate", "rate": "Rate",
"queue": "Queue", "queue": "Queue",
@@ -70,6 +87,12 @@
"leech": "Leech", "leech": "Leech",
"seed": "Seed" "seed": "Seed"
}, },
"qbittorrent": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"sonarr": { "sonarr": {
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
@@ -108,12 +131,18 @@
"pending": "Pending", "pending": "Pending",
"approved": "Approved", "approved": "Approved",
"available": "Available" "available": "Available"
}, },
"pihole": { "pihole": {
"queries": "Queries", "queries": "Queries",
"blocked": "Blocked", "blocked": "Blocked",
"gravity": "Gravity" "gravity": "Gravity"
}, },
"adguard": {
"queries": "Queries",
"blocked": "Blocked",
"filtered": "Filtered",
"latency": "Latency"
},
"speedtest": { "speedtest": {
"upload": "Upload", "upload": "Upload",
"download": "Download", "download": "Download",
@@ -156,5 +185,32 @@
"jackett": { "jackett": {
"configured": "Configured", "configured": "Configured",
"errored": "Errored" "errored": "Errored"
},
"strelaysrv": {
"numActiveSessions": "Sessions",
"numConnections": "Connections",
"dataRelayed": "Relayed",
"transferRate": "Rate"
},
"mastodon": {
"user_count": "Users",
"status_count": "Posts",
"domain_count": "Domains"
},
"authentik": {
"users": "Users",
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)"
},
"proxmox": {
"mem": "MEM",
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait"
} }
} }

View File

@@ -11,7 +11,8 @@
"total": "Total", "total": "Total",
"free": "Libre", "free": "Libre",
"used": "Usado", "used": "Usado",
"load": "Carga" "load": "Carga",
"cpu": "CPU"
}, },
"docker": { "docker": {
"rx": "Recibido", "rx": "Recibido",
@@ -21,35 +22,35 @@
"offline": "Desconectado" "offline": "Desconectado"
}, },
"emby": { "emby": {
"playing": "En ejecución", "playing": "Reproduciendo",
"transcoding": "Transcodificando", "transcoding": "Transcodificando",
"bitrate": "Tasa de Bits", "bitrate": "Tasa de bits",
"no_active": "No hay streams activos" "no_active": "Sin transmisiones activas"
}, },
"tautulli": { "tautulli": {
"playing": "En ejecución", "playing": "Reproduciendo",
"transcoding": "Transcodificación", "transcoding": "Transcodificando",
"bitrate": "Tasa de bits", "bitrate": "Tasa de bits",
"no_active": "No hay streams activos" "no_active": "Sin transmisiones activas"
}, },
"rutorrent": { "rutorrent": {
"active": "Activo", "active": "Activo",
"upload": "Subida", "upload": "Subida",
"download": "Descarga" "download": "Bajada"
}, },
"sonarr": { "sonarr": {
"wanted": "Más deseado", "wanted": "Buscando",
"queued": "Puesto en cola", "queued": "En cola",
"series": "Series" "series": "Series"
}, },
"radarr": { "radarr": {
"wanted": "Más deseado", "wanted": "Buscando",
"queued": "Puesto en cola", "queued": "En cola",
"movies": "Películas" "movies": "Películas"
}, },
"readarr": { "readarr": {
"wanted": "Más deseado", "wanted": "Buscando",
"queued": "Puesto en cola", "queued": "En cola",
"books": "Libros" "books": "Libros"
}, },
"ombi": { "ombi": {
@@ -68,8 +69,8 @@
"gravity": "Gravedad" "gravity": "Gravedad"
}, },
"speedtest": { "speedtest": {
"upload": "Subir", "upload": "Subida",
"download": "Descarga", "download": "Bajada",
"ping": "Ping" "ping": "Ping"
}, },
"portainer": { "portainer": {
@@ -88,8 +89,8 @@
"total": "Total" "total": "Total"
}, },
"weather": { "weather": {
"current": "Ubicación Actual", "current": "Ubicación actual",
"allow": "Haga clic para permitir", "allow": "Clic para permitir",
"updating": "Actualizando", "updating": "Actualizando",
"wait": "Espere, por favor" "wait": "Espere, por favor"
}, },
@@ -99,21 +100,21 @@
"available": "Disponible" "available": "Disponible"
}, },
"sabnzbd": { "sabnzbd": {
"rate": "Tasa de descarga", "rate": "Tasa",
"queue": "Puesto en cola", "queue": "En cola",
"timeleft": "Tiempo Restante" "timeleft": "Tiempo restante"
}, },
"nzbget": { "nzbget": {
"rate": "Tasa de descarga", "rate": "Tasa",
"remaining": "Restante", "remaining": "Restante",
"downloaded": "Descargado" "downloaded": "Descargado"
}, },
"coinmarketcap": { "coinmarketcap": {
"configure": "Configurar una o varias criptomonedas para su seguimiento", "configure": "Configurar una o s criptomonedas para rastrear",
"1hour": "1 Hora", "1hour": "1 Hora",
"1day": "1 Día", "1day": "1 Día",
"7days": "7 Dias", "7days": "7 Días",
"30days": "30 Dias" "30days": "30 Días"
}, },
"gotify": { "gotify": {
"apps": "Aplicaciones", "apps": "Aplicaciones",
@@ -124,26 +125,81 @@
"enableIndexers": "Indexadores", "enableIndexers": "Indexadores",
"numberOfGrabs": "Capturas", "numberOfGrabs": "Capturas",
"numberOfQueries": "Consultas", "numberOfQueries": "Consultas",
"numberOfFailGrabs": "Capturas Fallidas", "numberOfFailGrabs": "Capturas fallidas",
"numberOfFailQueries": "Consultas Fallidas" "numberOfFailQueries": "Consultas fallidas"
}, },
"transmission": { "transmission": {
"download": "Descarga", "download": "Bajada",
"upload": "Subida", "upload": "Subida",
"leech": "Egoístas (Leech)", "leech": "Compañeros",
"seed": "Semillas" "seed": "Semillas"
}, },
"jackett": { "jackett": {
"configured": "Configured", "configured": "Configurado",
"errored": "Errored" "errored": "Con errores"
}, },
"bazarr": { "bazarr": {
"missingEpisodes": "Missing Episodes", "missingEpisodes": "Episodios perdidos",
"missingMovies": "Missing Movies" "missingMovies": "Películas perdidas"
}, },
"lidarr": { "lidarr": {
"queued": "Queued", "queued": "En cola",
"wanted": "Wanted", "wanted": "Buscando",
"albums": "Albums" "albums": "Álbumes"
},
"adguard": {
"queries": "Consultas",
"blocked": "Bloqueado",
"filtered": "Filtrado",
"latency": "Latencia"
},
"qbittorrent": {
"download": "Bajada",
"upload": "Subida",
"leech": "Compañeros",
"seed": "Semillas"
},
"mastodon": {
"user_count": "Usuarios",
"status_count": "Publicaciones",
"domain_count": "Dominios"
},
"strelaysrv": {
"numActiveSessions": "Sesiones",
"numConnections": "Conexiones",
"dataRelayed": "Retransmitido",
"transferRate": "Velocidad"
},
"authentik": {
"users": "Usuarios",
"loginsLast24H": "Inicios de sesión (24h)",
"failedLoginsLast24H": "Inicios de sesión fallidos (24h)"
},
"proxmox": {
"mem": "Memoria",
"cpu": "Procesador",
"lxc": "LXC",
"vms": "VMs"
},
"unifi": {
"up": "UP",
"users": "Users",
"uptime": "System Uptime",
"days": "Days",
"wan": "WAN",
"lan_users": "LAN Users",
"wlan_users": "WLAN Users",
"down": "DOWN",
"wait": "Please wait"
},
"plex": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait"
} }
} }

View File

@@ -0,0 +1,205 @@
{
"widget": {
"missing_type": "Puuttuva härpäkkeen tyyppi: {{type}}",
"api_error": "API-virhe",
"status": "Tila"
},
"weather": {
"current": "Nykyinen sijainti",
"allow": "Klikkaa salliaksesi",
"updating": "Päivitetään",
"wait": "Odota, ole hyvä"
},
"search": {
"placeholder": "Hae…"
},
"resources": {
"cpu": "CPU",
"total": "Yhteensä",
"free": "Vapaana",
"used": "Käytetty",
"load": "Kuorma"
},
"docker": {
"rx": "RX",
"tx": "TX",
"mem": "RAM",
"cpu": "CPU",
"offline": "Offline"
},
"emby": {
"playing": "Toistaa",
"transcoding": "Transkoodaa",
"bitrate": "Bittinopeus",
"no_active": "Ei aktiivisia striimejä"
},
"tautulli": {
"playing": "Toistaa",
"transcoding": "Transkoodaa",
"bitrate": "Bittinopeus",
"no_active": "Ei aktiivisia striimejä"
},
"nzbget": {
"rate": "Nopeus",
"remaining": "Jäljellä",
"downloaded": "Ladattu"
},
"sabnzbd": {
"rate": "Nopeus",
"queue": "Jono",
"timeleft": "Aikaa jäljellä"
},
"rutorrent": {
"active": "Aktiivinen",
"upload": "Lähetys",
"download": "Lataus"
},
"transmission": {
"download": "Lataus",
"upload": "Lähetys",
"leech": "Lataajia",
"seed": "Lähettäjiä"
},
"qbittorrent": {
"download": "Lataus",
"upload": "Lähetys",
"leech": "Lataajia",
"seed": "Lähettäjiä"
},
"sonarr": {
"wanted": "Haluttu",
"queued": "Jonossa",
"series": "Sarja"
},
"radarr": {
"wanted": "Haluttu",
"queued": "Jonossa",
"movies": "Elokuvia"
},
"lidarr": {
"wanted": "Haluttu",
"queued": "Jonossa",
"albums": "Albumeja"
},
"readarr": {
"wanted": "Haluttu",
"queued": "Jonossa",
"books": "Kirjoja"
},
"bazarr": {
"missingEpisodes": "Puuttuvia jaksoja",
"missingMovies": "Puuttuvia elokuvia"
},
"ombi": {
"pending": "Vireillä",
"approved": "Hyväksytty",
"available": "Saatavilla"
},
"jellyseerr": {
"pending": "Vireillä",
"approved": "Hyväksytty",
"available": "Saatavilla"
},
"overseerr": {
"pending": "Vireillä",
"approved": "Hyväksytty",
"available": "Saatavilla"
},
"pihole": {
"queries": "Kyselyjä",
"blocked": "Estetty",
"gravity": "Vakavuus"
},
"adguard": {
"queries": "Kyselyjä",
"blocked": "Estetty",
"filtered": "Suodatettu",
"latency": "Viive"
},
"speedtest": {
"upload": "Lähetys",
"download": "Lataus",
"ping": "Viive"
},
"portainer": {
"running": "Käynnissä",
"stopped": "Pysäytetty",
"total": "Yhteensä"
},
"traefik": {
"routers": "Reitittimiä",
"services": "Palveluja",
"middleware": "Middlewareja"
},
"npm": {
"enabled": "Käytössä",
"disabled": "Poissa käytöstä",
"total": "Yhteensä"
},
"coinmarketcap": {
"configure": "Määritä yksi tai useampi kryptovaluutta seurattavaksi",
"1hour": "1 tunti",
"1day": "1 päivä",
"7days": "7 päivää",
"30days": "30 päivää"
},
"gotify": {
"apps": "Sovelluksia",
"clients": "Asiakasohjelmia",
"messages": "Viestejä"
},
"prowlarr": {
"enableIndexers": "Indeksoijia",
"numberOfGrabs": "Nappauksia",
"numberOfQueries": "Hakuja",
"numberOfFailGrabs": "Epäonnistuneita nappauksia",
"numberOfFailQueries": "Epäonnistuneita kyselyjä"
},
"jackett": {
"configured": "Määritettyjä",
"errored": "Virheellisiä"
},
"strelaysrv": {
"numActiveSessions": "Istuntoja",
"numConnections": "Yhteyksiä",
"dataRelayed": "Välitetty",
"transferRate": "Nopeus"
},
"mastodon": {
"user_count": "Käyttäjiä",
"status_count": "Kirjoituksia",
"domain_count": "Verkkotunnuksia"
},
"authentik": {
"users": "Käyttäjiä",
"loginsLast24H": "Kirjautumisia (24h)",
"failedLoginsLast24H": "Epäonnistuneita kirjautumisia (24h)"
},
"proxmox": {
"mem": "RAM",
"cpu": "CPU",
"lxc": "LXC",
"vms": "VKt"
},
"unifi": {
"users": "Users",
"uptime": "System Uptime",
"lan_users": "LAN Users",
"wlan_users": "WLAN Users",
"wait": "Please wait",
"days": "Days",
"wan": "WAN",
"up": "UP",
"down": "DOWN"
},
"plex": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
},
"glances": {
"wait": "Please wait",
"cpu": "CPU",
"mem": "MEM"
}
}

View File

@@ -11,7 +11,8 @@
"total": "Total", "total": "Total",
"free": "Libre", "free": "Libre",
"used": "Utilisé", "used": "Utilisé",
"load": "Charge" "load": "Charge",
"cpu": "CPU"
}, },
"docker": { "docker": {
"rx": "Rx", "rx": "Rx",
@@ -34,22 +35,22 @@
}, },
"rutorrent": { "rutorrent": {
"active": "Actif", "active": "Actif",
"upload": "Téléverser", "upload": "Envoi",
"download": "Télécharger" "download": "Réception"
}, },
"sonarr": { "sonarr": {
"wanted": "Demandé", "wanted": "Demande",
"queued": "En queue", "queued": "En attente",
"series": "Séries" "series": "Séries"
}, },
"radarr": { "radarr": {
"wanted": "Demandé", "wanted": "Demande",
"queued": "En queue", "queued": "En attente",
"movies": "Films" "movies": "Films"
}, },
"readarr": { "readarr": {
"wanted": "Demandé", "wanted": "Demande",
"queued": "En Queue", "queued": "Attente",
"books": "Livres" "books": "Livres"
}, },
"ombi": { "ombi": {
@@ -68,8 +69,8 @@
"gravity": "Listes dom. bloqués" "gravity": "Listes dom. bloqués"
}, },
"speedtest": { "speedtest": {
"upload": "Téléversement", "upload": "Envoi",
"download": "Téléchargement", "download": "Récep.",
"ping": "Ping" "ping": "Ping"
}, },
"portainer": { "portainer": {
@@ -87,17 +88,6 @@
"disabled": "Désactivé", "disabled": "Désactivé",
"total": "Total" "total": "Total"
}, },
"common": {
"bbytes": "{{value, bytes(binary: true)}}",
"bytes": "{{value, bytes}}",
"bits": "{{value, bytes(bits: true)}}",
"bbits": "{{value, bytes(bits: true, binary: true)}}",
"number": "{{value, number}}",
"byterate": "{{value, bytes}}",
"bitrate": "{{value, bytes(bits: true)}}",
"percent": "{{value, percent}}",
"ms": "{{value, number}}"
},
"weather": { "weather": {
"current": "Localisation actuelle", "current": "Localisation actuelle",
"allow": "Cliquez pour autoriser", "allow": "Cliquez pour autoriser",
@@ -106,7 +96,7 @@
}, },
"overseerr": { "overseerr": {
"pending": "En attente", "pending": "En attente",
"approved": "Validé", "approved": "Demande",
"available": "Disponible" "available": "Disponible"
}, },
"sabnzbd": { "sabnzbd": {
@@ -127,16 +117,16 @@
"30days": "30 Jours" "30days": "30 Jours"
}, },
"gotify": { "gotify": {
"apps": "Applications", "apps": "Applis",
"clients": "Clients", "clients": "Clients",
"messages": "Messages" "messages": "Msg"
}, },
"prowlarr": { "prowlarr": {
"enableIndexers": "Indexeurs", "enableIndexers": "Indexeur",
"numberOfGrabs": "Capture", "numberOfGrabs": "Capture",
"numberOfQueries": "Demandes", "numberOfQueries": "Demande",
"numberOfFailGrabs": "Capture échouée", "numberOfFailGrabs": "Capt. échouée",
"numberOfFailQueries": "Demande échouée" "numberOfFailQueries": "Dem. échouée"
}, },
"transmission": { "transmission": {
"download": "Réception", "download": "Réception",
@@ -149,12 +139,67 @@
"errored": "En erreur" "errored": "En erreur"
}, },
"bazarr": { "bazarr": {
"missingEpisodes": "Missing Episodes", "missingEpisodes": "Épisodes manquants",
"missingMovies": "Missing Movies" "missingMovies": "Films manquants"
}, },
"lidarr": { "lidarr": {
"wanted": "Wanted", "wanted": "Demandé",
"queued": "Queued", "queued": "En queue",
"albums": "Albums" "albums": "Albums"
},
"adguard": {
"queries": "Requêtes",
"blocked": "Bloquées",
"filtered": "Filtrées",
"latency": "Latence"
},
"qbittorrent": {
"download": "Récep.",
"upload": "Envoi",
"leech": "Leech",
"seed": "Seed"
},
"mastodon": {
"user_count": "Utilisateurs",
"status_count": "Messages",
"domain_count": "Domaines"
},
"strelaysrv": {
"numActiveSessions": "Sessions",
"numConnections": "Cnx",
"dataRelayed": "Relayé",
"transferRate": "Débit"
},
"authentik": {
"users": "Utilisateurs",
"loginsLast24H": "Cnx. (24h)",
"failedLoginsLast24H": "Cnx. échouées (24h)"
},
"proxmox": {
"mem": "Mém",
"cpu": "Cpu",
"lxc": "LxC",
"vms": "VMs"
},
"unifi": {
"users": "Utilisateurs",
"uptime": "Disponibilité du système",
"days": "Jours",
"wan": "WAN",
"lan_users": "Utilisateurs LAN",
"wlan_users": "Utilisateurs WLAN",
"up": "UP",
"down": "DOWN",
"wait": "Merci de patienter"
},
"plex": {
"streams": "Flux actif",
"movies": "Films",
"tv": "Séries TV"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait"
} }
} }

View File

@@ -0,0 +1,205 @@
{
"widget": {
"missing_type": "סוג ווידג'ט חסר: {{type}}",
"api_error": "שגיאת API",
"status": "סטטוס"
},
"weather": {
"current": "מיקום נוכחי",
"allow": "יש ללחוץ כדי לאשר",
"updating": "מעדכן",
"wait": "המתן בבקשה"
},
"search": {
"placeholder": "חיפוש…"
},
"resources": {
"total": "סה\"כ",
"free": "פנוי",
"used": "בשימוש",
"load": "עומס",
"cpu": "CPU"
},
"docker": {
"rx": "RX",
"tx": "TX",
"mem": "זיכרון",
"cpu": "מעבד",
"offline": "כבוי"
},
"emby": {
"playing": "מנגן",
"transcoding": "מקודד",
"bitrate": "סיביות",
"no_active": "אין הזרמות פעילות"
},
"tautulli": {
"playing": "מנגן",
"transcoding": "מקודד",
"bitrate": "סיביות",
"no_active": "אין הזרמות פעילות"
},
"nzbget": {
"rate": "יחס",
"remaining": "נותר",
"downloaded": "הורד"
},
"sabnzbd": {
"rate": "יחס",
"queue": "תור",
"timeleft": "זמן שנותר"
},
"rutorrent": {
"active": "פעיל",
"upload": "העלאה",
"download": "הורדה"
},
"transmission": {
"download": "הורדה",
"upload": "העלאה",
"leech": "בהורדה",
"seed": "בשיתוף"
},
"qbittorrent": {
"download": "הורדה",
"upload": "העלאה",
"leech": "בהורדה",
"seed": "בשיתוף"
},
"sonarr": {
"wanted": "מבוקש",
"queued": "בתור",
"series": "סדרות"
},
"radarr": {
"wanted": "מבוקש",
"queued": "בתור",
"movies": "סרטים"
},
"lidarr": {
"wanted": "מבוקש",
"queued": "בתור",
"albums": "אלבומים"
},
"readarr": {
"wanted": "מבוקש",
"queued": "בתור",
"books": "ספרים"
},
"bazarr": {
"missingEpisodes": "פרקים חסרים",
"missingMovies": "סרטים חסרים"
},
"ombi": {
"pending": "ממתין",
"approved": "מאושר",
"available": "זמין"
},
"jellyseerr": {
"pending": "ממתין",
"approved": "מאושר",
"available": "זמין"
},
"overseerr": {
"pending": "ממתין",
"approved": "מאושר",
"available": "זמין"
},
"pihole": {
"queries": "שאילתות",
"blocked": "נחסם",
"gravity": "Gravity"
},
"adguard": {
"queries": "שאילתות",
"blocked": "נחסם",
"filtered": "מסונן",
"latency": "השהיה"
},
"speedtest": {
"upload": "העלאה",
"download": "הורדה",
"ping": "פינג"
},
"portainer": {
"running": "פעיל",
"stopped": "נעצר",
"total": "סה\"כ"
},
"traefik": {
"routers": "ניתובים",
"services": "שירותים",
"middleware": "מתווך"
},
"npm": {
"enabled": "מופעל",
"disabled": "מבוטל",
"total": "סה\"כ"
},
"coinmarketcap": {
"configure": "קבע את התצורה של מטבע קריפטו אחד או יותר למעקב",
"1hour": "שעה אחת",
"1day": "יום 1",
"7days": "7 יום",
"30days": "30 יום"
},
"gotify": {
"apps": "אפליקציות",
"clients": "לקוחות",
"messages": "הודעות"
},
"prowlarr": {
"enableIndexers": "אינדקסים",
"numberOfGrabs": "Grabs",
"numberOfQueries": "שאילתות",
"numberOfFailGrabs": "Fail Grabs",
"numberOfFailQueries": "Fail Queries"
},
"jackett": {
"configured": "מוגדר",
"errored": "שגיאה"
},
"mastodon": {
"user_count": "Users",
"status_count": "Posts",
"domain_count": "Domains"
},
"strelaysrv": {
"numActiveSessions": "Sessions",
"numConnections": "Connections",
"dataRelayed": "Relayed",
"transferRate": "Rate"
},
"authentik": {
"users": "Users",
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)"
},
"proxmox": {
"mem": "MEM",
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
},
"unifi": {
"users": "Users",
"uptime": "System Uptime",
"days": "Days",
"wan": "WAN",
"lan_users": "LAN Users",
"wlan_users": "WLAN Users",
"up": "UP",
"down": "DOWN",
"wait": "Please wait"
},
"plex": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait"
}
}

View File

@@ -0,0 +1,205 @@
{
"weather": {
"current": "Tranutačna lokacija",
"allow": "Pritisni za dozvoljavanje",
"updating": "Aktualiziranje",
"wait": "Pričekaj"
},
"search": {
"placeholder": "Traži …"
},
"resources": {
"total": "Ukupno",
"free": "Slobodno",
"used": "Korišteno",
"load": "Opterećenje",
"cpu": "CPU"
},
"sabnzbd": {
"rate": "Stopa",
"queue": "Red",
"timeleft": "Preostalo vrijeme"
},
"overseerr": {
"available": "Dostupno",
"pending": "Predstoji",
"approved": "Odobreno"
},
"pihole": {
"queries": "Upiti",
"blocked": "Blokirano",
"gravity": "Ozbiljnost"
},
"adguard": {
"latency": "Kašnjenje",
"queries": "Upiti",
"blocked": "Blokirano",
"filtered": "Filtrirano"
},
"npm": {
"total": "Ukupno",
"enabled": "Aktivirano",
"disabled": "Deaktivirano"
},
"coinmarketcap": {
"configure": "Konfiguriraj jednu ili više kripto valuta za praćenje",
"1hour": "1 sat",
"1day": "1 dan",
"7days": "7 dana",
"30days": "30 dana"
},
"prowlarr": {
"enableIndexers": "Indeksatori",
"numberOfGrabs": "Dohvaćanja",
"numberOfQueries": "Upiti",
"numberOfFailGrabs": "Neuspjela dohvaćanja",
"numberOfFailQueries": "Neuspjeli upiti"
},
"widget": {
"missing_type": "Nedostajuća vrsta widgeta: {{type}}",
"api_error": "API greška",
"status": "Stanje"
},
"docker": {
"rx": "RX",
"tx": "TX",
"mem": "MEM",
"cpu": "CPU",
"offline": "Odspojen"
},
"emby": {
"playing": "Reprodukcija",
"transcoding": "Prekodiranje",
"bitrate": "Brzina prijenosa",
"no_active": "Nema aktivnih prijenosa"
},
"tautulli": {
"playing": "Reprodukcija",
"transcoding": "Prekodiranje",
"bitrate": "Brzina prijenosa",
"no_active": "Nema aktivnih prijenosa"
},
"nzbget": {
"rate": "Stopa",
"remaining": "Preostalo",
"downloaded": "Preuzeto"
},
"rutorrent": {
"upload": "Prijenos",
"download": "Preuzimanje",
"active": "Aktivno"
},
"transmission": {
"download": "Preuzimanje",
"upload": "Prijenos",
"leech": "Krvopija",
"seed": "Prijenos preuzetog sadržaja"
},
"sonarr": {
"wanted": "Željeno",
"queued": "U redu čekanja",
"series": "Serije"
},
"radarr": {
"wanted": "Željeno",
"queued": "U redu čekanja",
"movies": "Filmovi"
},
"lidarr": {
"wanted": "Željeno",
"queued": "U redu čekanja",
"albums": "Albumi"
},
"readarr": {
"wanted": "Željeno",
"queued": "U redu čekanja",
"books": "Knjige"
},
"bazarr": {
"missingEpisodes": "Nedostajuće epizode",
"missingMovies": "Nedostajući filmovi"
},
"ombi": {
"pending": "Predstoji",
"approved": "Odobreno",
"available": "Dostupno"
},
"jellyseerr": {
"pending": "Predstoji",
"approved": "Odobreno",
"available": "Dostupno"
},
"speedtest": {
"upload": "Prijenos",
"download": "Preuzimanje",
"ping": "Ping"
},
"portainer": {
"running": "Pokrenuto",
"stopped": "Prekinuto",
"total": "Ukupno"
},
"traefik": {
"routers": "Ruteri",
"services": "Usluge",
"middleware": "Middleware"
},
"gotify": {
"clients": "Klijenti",
"messages": "Poruke",
"apps": "Programi"
},
"jackett": {
"configured": "Konfigurirano",
"errored": "S greškom"
},
"qbittorrent": {
"download": "Preuzimanje",
"upload": "Prijenos",
"leech": "Krvopija",
"seed": "Prijenos preuzetog sadržaja"
},
"mastodon": {
"user_count": "Korisnici",
"status_count": "Objave",
"domain_count": "Domene"
},
"strelaysrv": {
"numActiveSessions": "Sesije",
"numConnections": "Veze",
"dataRelayed": "Proslijeđeno",
"transferRate": "Stopa"
},
"authentik": {
"users": "Users",
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)"
},
"proxmox": {
"mem": "MEM",
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
},
"unifi": {
"users": "Users",
"uptime": "System Uptime",
"days": "Days",
"wan": "WAN",
"lan_users": "LAN Users",
"wlan_users": "WLAN Users",
"up": "UP",
"down": "DOWN",
"wait": "Please wait"
},
"plex": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait"
}
}

View File

@@ -0,0 +1,205 @@
{
"resources": {
"total": "Összes",
"free": "Szabad",
"used": "Használt",
"load": "Terhelés",
"cpu": "CPU"
},
"docker": {
"rx": "RX",
"tx": "TX",
"mem": "MEM",
"cpu": "CPU",
"offline": "Offline"
},
"lidarr": {
"albums": "Albumok",
"wanted": "Keresett",
"queued": "Sorban áll"
},
"readarr": {
"wanted": "Keresett",
"queued": "Sorban áll",
"books": "Könyvek"
},
"bazarr": {
"missingEpisodes": "Hiányzó epizódok",
"missingMovies": "Hiányzó filmek"
},
"widget": {
"missing_type": "Hiányzó Widget Típus: {{type}}",
"api_error": "API Hiba",
"status": "Státusz"
},
"weather": {
"current": "Aktuális hely",
"allow": "Kattints az engedélyezéshez",
"updating": "Frissítés",
"wait": "Kérlek várj"
},
"search": {
"placeholder": "Keresés…"
},
"emby": {
"playing": "Lejátszás",
"transcoding": "Átkódolás",
"bitrate": "Bitráta",
"no_active": "Nincs aktív lejátszás"
},
"tautulli": {
"playing": "Lejátszás folyamatban",
"transcoding": "Átkódolás",
"bitrate": "Bitráta",
"no_active": "Nincs aktív lejátszás"
},
"nzbget": {
"rate": "Ráta",
"remaining": "Hátralévő",
"downloaded": "Letöltött"
},
"sabnzbd": {
"rate": "Ráta",
"queue": "Sor",
"timeleft": "Hátralévő idő"
},
"rutorrent": {
"active": "Aktív",
"upload": "Feltöltés",
"download": "Letöltés"
},
"transmission": {
"leech": "Leechelés",
"seed": "Seedelés",
"download": "Letöltés",
"upload": "Feltöltés"
},
"qbittorrent": {
"download": "Letöltés",
"upload": "Feltöltés",
"leech": "Leechelés",
"seed": "Seedelés"
},
"sonarr": {
"wanted": "Keresett",
"queued": "Sorban áll",
"series": "Sorozat"
},
"radarr": {
"wanted": "Keresett",
"queued": "Sorban áll",
"movies": "Filmek"
},
"ombi": {
"pending": "Függőben",
"approved": "Engedélyezett",
"available": "Elérhető"
},
"jellyseerr": {
"pending": "Függőben",
"approved": "Engedélyezett",
"available": "Elérhető"
},
"overseerr": {
"pending": "Függőben",
"approved": "Engedélyezett",
"available": "Elérhető"
},
"pihole": {
"queries": "Lekérdezések",
"blocked": "Blokkolt",
"gravity": "Gravitáció"
},
"adguard": {
"queries": "Lekérdezések",
"blocked": "Blokkolt",
"filtered": "Szűrt",
"latency": "Késleltetés"
},
"speedtest": {
"upload": "Feltöltés",
"download": "Letöltés",
"ping": "Ping"
},
"portainer": {
"running": "Futó",
"stopped": "Megállított",
"total": "Összes"
},
"traefik": {
"routers": "Routerek",
"services": "Folyamatok",
"middleware": "Közvetítő"
},
"npm": {
"enabled": "Bekapcsolva",
"disabled": "Kikapcsolva",
"total": "Összes"
},
"coinmarketcap": {
"configure": "Állíts be egy vagy több Cryptovalutát a követéshez",
"1hour": "1 Óra",
"1day": "1 Nap",
"7days": "7 Nap",
"30days": "30 Nap"
},
"gotify": {
"apps": "Applikációk",
"clients": "Kliensek",
"messages": "Üzenetek"
},
"prowlarr": {
"enableIndexers": "Indexerek",
"numberOfGrabs": "Fogott",
"numberOfFailGrabs": "Hibás fogások",
"numberOfQueries": "Lekérdezések",
"numberOfFailQueries": "Hibás lekérdezések"
},
"jackett": {
"configured": "Beállított",
"errored": "Hibás"
},
"mastodon": {
"user_count": "Users",
"status_count": "Posts",
"domain_count": "Domains"
},
"strelaysrv": {
"numActiveSessions": "Sessions",
"numConnections": "Connections",
"dataRelayed": "Relayed",
"transferRate": "Rate"
},
"authentik": {
"users": "Users",
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)"
},
"proxmox": {
"mem": "MEM",
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
},
"unifi": {
"users": "Users",
"uptime": "System Uptime",
"days": "Days",
"wan": "WAN",
"lan_users": "LAN Users",
"wlan_users": "WLAN Users",
"up": "UP",
"down": "DOWN",
"wait": "Please wait"
},
"plex": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait"
}
}

View File

@@ -45,7 +45,8 @@
"total": "Totale", "total": "Totale",
"free": "Libero", "free": "Libero",
"used": "In utilizzo", "used": "In utilizzo",
"load": "Load" "load": "Load",
"cpu": "CPU"
}, },
"rutorrent": { "rutorrent": {
"active": "Attivo", "active": "Attivo",
@@ -99,14 +100,14 @@
"available": "Disponibili" "available": "Disponibili"
}, },
"sabnzbd": { "sabnzbd": {
"rate": "Rate", "rate": "Rapporto",
"queue": "Queue", "queue": "Coda",
"timeleft": "Time Left" "timeleft": "Tempo Rimanente"
}, },
"nzbget": { "nzbget": {
"rate": "Rate", "rate": "Rapporto",
"remaining": "Remaining", "remaining": "Rimanente",
"downloaded": "Downloaded" "downloaded": "Scaricato"
}, },
"coinmarketcap": { "coinmarketcap": {
"configure": "Configure one or more crypto currencies to track", "configure": "Configure one or more crypto currencies to track",
@@ -116,9 +117,9 @@
"30days": "30 Days" "30days": "30 Days"
}, },
"gotify": { "gotify": {
"apps": "Applications", "apps": "Applicazioni",
"clients": "Clients", "clients": "Clients",
"messages": "Messages" "messages": "Messaggi"
}, },
"prowlarr": { "prowlarr": {
"enableIndexers": "Indexers", "enableIndexers": "Indexers",
@@ -145,5 +146,60 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"albums": "Albums" "albums": "Albums"
},
"adguard": {
"queries": "Queries",
"blocked": "Blocked",
"filtered": "Filtered",
"latency": "Latency"
},
"qbittorrent": {
"download": "Download",
"leech": "Leech",
"upload": "Upload",
"seed": "Seed"
},
"mastodon": {
"user_count": "Users",
"status_count": "Posts",
"domain_count": "Domains"
},
"strelaysrv": {
"numActiveSessions": "Sessions",
"numConnections": "Connections",
"dataRelayed": "Relayed",
"transferRate": "Rate"
},
"authentik": {
"users": "Users",
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)"
},
"proxmox": {
"mem": "MEM",
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
},
"unifi": {
"users": "Users",
"uptime": "System Uptime",
"days": "Days",
"wan": "WAN",
"lan_users": "LAN Users",
"wait": "Please wait",
"wlan_users": "WLAN Users",
"up": "UP",
"down": "DOWN"
},
"plex": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait"
} }
} }

View File

@@ -11,7 +11,8 @@
"total": "Totalt", "total": "Totalt",
"free": "Ledig", "free": "Ledig",
"used": "Brukt", "used": "Brukt",
"load": "Last inn" "load": "Last inn",
"cpu": "CPU"
}, },
"docker": { "docker": {
"rx": "Mottatt", "rx": "Mottatt",
@@ -145,5 +146,60 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"albums": "Albums" "albums": "Albums"
},
"adguard": {
"queries": "Queries",
"blocked": "Blocked",
"filtered": "Filtered",
"latency": "Latency"
},
"qbittorrent": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"mastodon": {
"user_count": "Users",
"status_count": "Posts",
"domain_count": "Domains"
},
"strelaysrv": {
"numActiveSessions": "Sessions",
"numConnections": "Connections",
"dataRelayed": "Relayed",
"transferRate": "Rate"
},
"authentik": {
"users": "Users",
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)"
},
"proxmox": {
"mem": "MEM",
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
},
"unifi": {
"users": "Users",
"uptime": "System Uptime",
"days": "Days",
"wan": "WAN",
"lan_users": "LAN Users",
"wlan_users": "WLAN Users",
"up": "UP",
"down": "DOWN",
"wait": "Please wait"
},
"plex": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait"
} }
} }

View File

@@ -8,7 +8,8 @@
"total": "Totaal", "total": "Totaal",
"free": "Vrij", "free": "Vrij",
"used": "Gebruikt", "used": "Gebruikt",
"load": "Load" "load": "Load",
"cpu": "CPU"
}, },
"docker": { "docker": {
"rx": "RX", "rx": "RX",
@@ -40,7 +41,7 @@
"playing": "Afspelen", "playing": "Afspelen",
"transcoding": "Transcodering", "transcoding": "Transcodering",
"bitrate": "Bitsnelheid", "bitrate": "Bitsnelheid",
"no_active": "No Active Streams" "no_active": "Geen Actieve Steams"
}, },
"tautulli": { "tautulli": {
"playing": "Afspelen", "playing": "Afspelen",
@@ -145,5 +146,60 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"albums": "Albums" "albums": "Albums"
},
"adguard": {
"queries": "Queries",
"blocked": "Blocked",
"filtered": "Filtered",
"latency": "Latency"
},
"qbittorrent": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"mastodon": {
"user_count": "Users",
"status_count": "Posts",
"domain_count": "Domains"
},
"strelaysrv": {
"numActiveSessions": "Sessions",
"numConnections": "Connections",
"dataRelayed": "Relayed",
"transferRate": "Rate"
},
"authentik": {
"users": "Users",
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)"
},
"proxmox": {
"mem": "MEM",
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
},
"unifi": {
"users": "Users",
"lan_users": "LAN Users",
"uptime": "System Uptime",
"days": "Days",
"wan": "WAN",
"wlan_users": "WLAN Users",
"up": "UP",
"down": "DOWN",
"wait": "Please wait"
},
"plex": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait"
} }
} }

View File

@@ -0,0 +1,205 @@
{
"weather": {
"allow": "Kliknij, aby zezwolić",
"updating": "Aktualizacja",
"wait": "Proszę czekać",
"current": "Aktualna lokalizacja"
},
"search": {
"placeholder": "Szukaj…"
},
"resources": {
"used": "Użyte",
"load": "Obciążenie",
"total": "Całkowite",
"free": "Wolne",
"cpu": "CPU"
},
"emby": {
"no_active": "Brak aktywnych strumieni",
"playing": "Odtwarzanie",
"transcoding": "Transkodowanie",
"bitrate": "Bitrate"
},
"tautulli": {
"playing": "Odtwarzanie",
"transcoding": "Transkodowanie",
"bitrate": "Bitrate",
"no_active": "Brak aktywnych strumieni"
},
"speedtest": {
"download": "Pobieranie",
"ping": "Ping",
"upload": "Wysyłanie"
},
"portainer": {
"running": "Działające",
"stopped": "Zatrzymane",
"total": "Ogólnie"
},
"coinmarketcap": {
"1day": "1 dzień",
"7days": "7 dni",
"30days": "30 dni",
"1hour": "1 godzina",
"configure": "Wybierz jedną lub więcej kryptowalut do śledzenia"
},
"gotify": {
"apps": "Aplikacje",
"clients": "Klienci",
"messages": "Wiadomości"
},
"widget": {
"missing_type": "Brakujący typ widżetu: {{type}}",
"api_error": "Błąd API",
"status": "Stan"
},
"docker": {
"rx": "RX",
"tx": "TX",
"mem": "MEM",
"cpu": "CPU",
"offline": "Offline"
},
"nzbget": {
"rate": "Szybkość",
"remaining": "Pozostało",
"downloaded": "Pobrano"
},
"sabnzbd": {
"rate": "Szybkość",
"queue": "Kolejka",
"timeleft": "Pozostało"
},
"rutorrent": {
"active": "Aktywny",
"upload": "Wysyłanie",
"download": "Pobieranie"
},
"transmission": {
"download": "Pobieranie",
"upload": "Wysyłanie",
"leech": "Leech",
"seed": "Seed"
},
"sonarr": {
"wanted": "Poszukiwane",
"queued": "W kolejce",
"series": "Seriale"
},
"radarr": {
"wanted": "Poszukiwane",
"queued": "W kolejce",
"movies": "Filmy"
},
"lidarr": {
"wanted": "Poszukiwane",
"queued": "W kolejce",
"albums": "Albumy"
},
"readarr": {
"wanted": "Poszukiwane",
"queued": "W kolejce",
"books": "Książki"
},
"bazarr": {
"missingEpisodes": "Brakujące odcinki",
"missingMovies": "Brakujące filmy"
},
"ombi": {
"pending": "Oczekiwane",
"approved": "Zaakceptowane",
"available": "Dostępne"
},
"jellyseerr": {
"pending": "Oczekiwane",
"approved": "Zaakceptowane",
"available": "Dostępne"
},
"overseerr": {
"pending": "Oczekiwane",
"approved": "Zaakceptowane",
"available": "Dostępne"
},
"pihole": {
"queries": "Zapytania",
"blocked": "Zablokowane",
"gravity": "Gravity"
},
"traefik": {
"routers": "Routery",
"services": "Serwisy",
"middleware": "Pośrednicy"
},
"npm": {
"enabled": "Włączone",
"disabled": "Wyłączone",
"total": "Ogólnie"
},
"prowlarr": {
"enableIndexers": "Indeksery",
"numberOfGrabs": "Pochwycenia",
"numberOfQueries": "Zapytania",
"numberOfFailGrabs": "Nieudane pochwycenia",
"numberOfFailQueries": "Nieudane zapytania"
},
"jackett": {
"configured": "Skonfigurowane",
"errored": "Błędne"
},
"adguard": {
"queries": "Queries",
"blocked": "Blocked",
"filtered": "Filtered",
"latency": "Latency"
},
"qbittorrent": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"mastodon": {
"user_count": "Users",
"status_count": "Posts",
"domain_count": "Domains"
},
"strelaysrv": {
"numActiveSessions": "Sessions",
"numConnections": "Connections",
"dataRelayed": "Relayed",
"transferRate": "Rate"
},
"authentik": {
"users": "Users",
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)"
},
"proxmox": {
"mem": "MEM",
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
},
"unifi": {
"users": "Users",
"uptime": "System Uptime",
"days": "Days",
"wan": "WAN",
"lan_users": "LAN Users",
"wlan_users": "WLAN Users",
"up": "UP",
"down": "DOWN",
"wait": "Please wait"
},
"plex": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait"
}
}

View File

@@ -0,0 +1,205 @@
{
"sabnzbd": {
"timeleft": "Tempo restante",
"rate": "Taxa",
"queue": "Fila"
},
"rutorrent": {
"active": "Ativo",
"upload": "Envio",
"download": "Download"
},
"portainer": {
"total": "Total",
"running": "Funcionando",
"stopped": "Parado"
},
"coinmarketcap": {
"7days": "7 Dias",
"configure": "Configure uma ou mais criptomoedas para rastrear",
"1hour": "1 Hora",
"1day": "1 Dia",
"30days": "30 Dias"
},
"strelaysrv": {
"numConnections": "Conexões",
"numActiveSessions": "Sessões",
"dataRelayed": "Retransmitido",
"transferRate": "Taxa"
},
"widget": {
"missing_type": "Tipo de Widget ausente: {{type}}",
"api_error": "Erro da API",
"status": "Status"
},
"weather": {
"current": "Localização atual",
"allow": "Clique para permitir",
"updating": "Atualizando",
"wait": "Aguarde, por favor"
},
"search": {
"placeholder": "Buscar…"
},
"resources": {
"total": "Total",
"free": "Livre",
"used": "Usado",
"load": "Carregamento",
"cpu": "CPU"
},
"docker": {
"rx": "Rx",
"tx": "Tx",
"mem": "Mem",
"cpu": "CPU",
"offline": "Desligado"
},
"emby": {
"playing": "Reproduzindo",
"transcoding": "Transcodificando",
"bitrate": "Taxa de bits",
"no_active": "Sem transmissões ativas"
},
"tautulli": {
"playing": "Reproduzindo",
"transcoding": "Transcodificando",
"bitrate": "Taxa de bits",
"no_active": "Sem transmissões ativas"
},
"nzbget": {
"rate": "Taxa",
"remaining": "Restando",
"downloaded": "Baixado"
},
"transmission": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"qbittorrent": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"sonarr": {
"wanted": "Desejado",
"queued": "Na fila",
"series": "Séries"
},
"radarr": {
"wanted": "Desejado",
"queued": "Na fila",
"movies": "Filmes"
},
"lidarr": {
"wanted": "Desejado",
"queued": "Na fila",
"albums": "Álbuns"
},
"readarr": {
"wanted": "Desejado",
"queued": "Na fila",
"books": "Livros"
},
"bazarr": {
"missingEpisodes": "Episódios Ausentes",
"missingMovies": "Filmes Ausentes"
},
"ombi": {
"pending": "Pendente",
"approved": "Aprovado",
"available": "Disponível"
},
"jellyseerr": {
"pending": "Pendente",
"approved": "Aprovado",
"available": "Disponível"
},
"overseerr": {
"pending": "Pendente",
"approved": "Aprovado",
"available": "Disponível"
},
"pihole": {
"queries": "Consultas",
"blocked": "Bloquado",
"gravity": "Gravity"
},
"adguard": {
"queries": "Consultas",
"blocked": "Bloqueado",
"filtered": "Filtrado",
"latency": "Latência"
},
"speedtest": {
"upload": "Envio",
"download": "Receber",
"ping": "Ping"
},
"traefik": {
"routers": "Rotas",
"services": "Serviços",
"middleware": "Middleware"
},
"npm": {
"enabled": "Habilitado",
"disabled": "Desabilitado",
"total": "Total"
},
"gotify": {
"apps": "Aplicações",
"clients": "Clientes",
"messages": "Mensagens"
},
"prowlarr": {
"enableIndexers": "Indexadores",
"numberOfGrabs": "Grabs",
"numberOfQueries": "Queries",
"numberOfFailGrabs": "Fail Grabs",
"numberOfFailQueries": "Fail Queries"
},
"jackett": {
"configured": "Configurado",
"errored": "Erro"
},
"mastodon": {
"user_count": "Usuários",
"status_count": "Postagens",
"domain_count": "Domínios"
},
"authentik": {
"users": "Users",
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)"
},
"proxmox": {
"mem": "MEM",
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
},
"unifi": {
"users": "Users",
"uptime": "System Uptime",
"days": "Days",
"wan": "WAN",
"lan_users": "LAN Users",
"wlan_users": "WLAN Users",
"up": "UP",
"down": "DOWN",
"wait": "Please wait"
},
"plex": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait"
}
}

View File

@@ -11,7 +11,8 @@
"total": "Total", "total": "Total",
"free": "Livre", "free": "Livre",
"used": "Usado", "used": "Usado",
"load": "Load" "load": "Carregar",
"cpu": "CPU"
}, },
"docker": { "docker": {
"rx": "Rx", "rx": "Rx",
@@ -23,7 +24,7 @@
"emby": { "emby": {
"playing": "A reproduzir", "playing": "A reproduzir",
"transcoding": "Transcodificação", "transcoding": "Transcodificação",
"bitrate": "Bitrate", "bitrate": "Taxa de bits",
"no_active": "Sem streams ativas" "no_active": "Sem streams ativas"
}, },
"tautulli": { "tautulli": {
@@ -34,8 +35,8 @@
}, },
"rutorrent": { "rutorrent": {
"active": "Ativo", "active": "Ativo",
"upload": "Envio", "upload": "Enviando",
"download": "ReceçãoDownload" "download": "Baixando"
}, },
"sonarr": { "sonarr": {
"wanted": "Desejada", "wanted": "Desejada",
@@ -48,7 +49,7 @@
"movies": "Filmes" "movies": "Filmes"
}, },
"readarr": { "readarr": {
"wanted": "Wanted", "wanted": "Desejados",
"queued": "Em fila", "queued": "Em fila",
"books": "Livros" "books": "Livros"
}, },
@@ -65,7 +66,7 @@
"pihole": { "pihole": {
"queries": "Consultas", "queries": "Consultas",
"blocked": "Bloqueado", "blocked": "Bloqueado",
"gravity": "Gravity" "gravity": "Gravidade"
}, },
"speedtest": { "speedtest": {
"upload": "Envio", "upload": "Envio",
@@ -78,7 +79,7 @@
"total": "Total" "total": "Total"
}, },
"traefik": { "traefik": {
"routers": "Routers", "routers": "Roteadores",
"services": "Serviços", "services": "Serviços",
"middleware": "Middleware" "middleware": "Middleware"
}, },
@@ -110,21 +111,21 @@
"available": "Disponível" "available": "Disponível"
}, },
"sabnzbd": { "sabnzbd": {
"rate": "Rate", "rate": "Taxa",
"queue": "Fila", "queue": "Fila",
"timeleft": "Tempo restante" "timeleft": "Tempo restante"
}, },
"nzbget": { "nzbget": {
"rate": "Rate", "rate": "Taxa",
"remaining": "Restante", "remaining": "Restante",
"downloaded": "Downloaded" "downloaded": "Baixado"
}, },
"coinmarketcap": { "coinmarketcap": {
"configure": "Configurar uma ou mais moedas", "configure": "Configurar uma ou mais moedas",
"1hour": "1 Hour", "1hour": "1 Hora",
"1day": "1 Day", "1day": "1 Dia",
"7days": "7 Days", "7days": "7 Dias",
"30days": "30 Days" "30days": "30 Dias"
}, },
"gotify": { "gotify": {
"apps": "Aplicações", "apps": "Aplicações",
@@ -132,29 +133,84 @@
"messages": "Mensagens" "messages": "Mensagens"
}, },
"prowlarr": { "prowlarr": {
"enableIndexers": "Indexers", "enableIndexers": "Indexadores",
"numberOfGrabs": "Grabs", "numberOfGrabs": "Agarrados",
"numberOfQueries": "Queries", "numberOfQueries": "Consultas",
"numberOfFailGrabs": "Falhados", "numberOfFailGrabs": "Falhados",
"numberOfFailQueries": "Pesquisas falhadas" "numberOfFailQueries": "Pesquisas falhadas"
}, },
"transmission": { "transmission": {
"download": "Download", "download": "Baixando",
"upload": "Envio", "upload": "Enviando",
"leech": "Leech", "leech": "Sanguessugas",
"seed": "Seed" "seed": "Semeadores"
}, },
"jackett": { "jackett": {
"configured": "Configured", "configured": "Configurado",
"errored": "Errored" "errored": "Errado"
}, },
"bazarr": { "bazarr": {
"missingEpisodes": "Missing Episodes", "missingEpisodes": "Episódios Faltantes",
"missingMovies": "Missing Movies" "missingMovies": "Filmes Faltantes"
}, },
"lidarr": { "lidarr": {
"queued": "Queued", "queued": "Enfileirado",
"wanted": "Wanted", "wanted": "Desejado",
"albums": "Albums" "albums": "Álbuns"
},
"adguard": {
"queries": "Consultas",
"blocked": "Bloqueado",
"filtered": "Filtrado",
"latency": "Latência"
},
"qbittorrent": {
"download": "Baixando",
"upload": "Enviando",
"leech": "Sanguessugas",
"seed": "Semeadores"
},
"mastodon": {
"user_count": "Usuários",
"status_count": "Postagens",
"domain_count": "Domínios"
},
"strelaysrv": {
"numActiveSessions": "Sessões",
"numConnections": "Conexões",
"dataRelayed": "Retransmitido",
"transferRate": "Taxa"
},
"authentik": {
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)",
"users": "Users"
},
"proxmox": {
"mem": "MEM",
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
},
"unifi": {
"users": "Users",
"uptime": "System Uptime",
"days": "Days",
"wan": "WAN",
"lan_users": "LAN Users",
"wlan_users": "WLAN Users",
"up": "UP",
"down": "DOWN",
"wait": "Please wait"
},
"plex": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait"
} }
} }

View File

@@ -0,0 +1,205 @@
{
"resources": {
"used": "Utilizați",
"load": "Sarcină",
"total": "Total",
"free": "Disponibili",
"cpu": "CPU"
},
"docker": {
"rx": "RX",
"tx": "TX",
"mem": "MEM",
"cpu": "CPU",
"offline": "Offline"
},
"jellyseerr": {
"approved": "Aprobate",
"available": "Disponibile",
"pending": "În așteptare"
},
"overseerr": {
"pending": "În așteptare",
"approved": "Aprobate",
"available": "Disponibile"
},
"pihole": {
"queries": "Cereri",
"blocked": "Blocate",
"gravity": "Gravity"
},
"adguard": {
"blocked": "Blocate",
"filtered": "Filtrate",
"queries": "Cereri",
"latency": "Latentă"
},
"traefik": {
"services": "Servicii",
"middleware": "Middleware",
"routers": "Routere"
},
"npm": {
"enabled": "Activat",
"disabled": "Dezactivat",
"total": "Total"
},
"coinmarketcap": {
"configure": "Configurați una sau mai multe criptomonede pe care să le urmăriți",
"1hour": "1 Oră",
"1day": "1 Zi",
"7days": "7 Zile",
"30days": "30 Zile"
},
"weather": {
"allow": "Click pentru a permite",
"updating": "Se actualizează",
"current": "Locația Curentă",
"wait": "Va rugăm așteptați"
},
"widget": {
"missing_type": "Lipsește Tipul de Widget: {{type}}",
"api_error": "Eroare API",
"status": "Status"
},
"search": {
"placeholder": "Caută…"
},
"tautulli": {
"no_active": "Niciun stream activ",
"playing": "Activ",
"transcoding": "Transcodare",
"bitrate": "Bitrate"
},
"nzbget": {
"rate": "Rată",
"remaining": "Rămas",
"downloaded": "Descărcat"
},
"emby": {
"playing": "Activ",
"transcoding": "Transcodare",
"bitrate": "Bitrate",
"no_active": "Niciun stream activ"
},
"sabnzbd": {
"rate": "Rată",
"queue": "Coadă",
"timeleft": "Timp rămas"
},
"transmission": {
"leech": "Leech",
"seed": "Seed",
"download": "Descarcă",
"upload": "Încarcă"
},
"rutorrent": {
"active": "Activ",
"upload": "Încarcă",
"download": "Descarcă"
},
"qbittorrent": {
"download": "Descarcă",
"upload": "Încarcă",
"leech": "Leech",
"seed": "Seed"
},
"sonarr": {
"wanted": "Dorite",
"queued": "În coadă",
"series": "Seriale"
},
"radarr": {
"queued": "În coadă",
"wanted": "Dorite",
"movies": "Filme"
},
"lidarr": {
"wanted": "Dorite",
"queued": "În coadă",
"albums": "Albume"
},
"readarr": {
"wanted": "Dorite",
"queued": "În coadă",
"books": "Cărți"
},
"bazarr": {
"missingEpisodes": "Episoade lipsă",
"missingMovies": "Filme lipsă"
},
"ombi": {
"pending": "În așteptare",
"approved": "Aprobate",
"available": "Disponibile"
},
"speedtest": {
"upload": "Încarcă",
"download": "Descarcă",
"ping": "Ping"
},
"portainer": {
"running": "Activ",
"stopped": "Oprit",
"total": "Total"
},
"gotify": {
"apps": "Aplicații",
"clients": "Clienți",
"messages": "Mesaje"
},
"prowlarr": {
"numberOfFailGrabs": "Descărcări eșuate",
"numberOfFailQueries": "Cereri eșuate",
"enableIndexers": "Indexatori",
"numberOfGrabs": "Descărcate",
"numberOfQueries": "Cereri"
},
"jackett": {
"configured": "Configurat",
"errored": "Cu erori"
},
"strelaysrv": {
"numActiveSessions": "Sesiuni",
"numConnections": "Conexiuni",
"dataRelayed": "Retransmise",
"transferRate": "Rată"
},
"mastodon": {
"user_count": "Utilizatori",
"status_count": "Postări",
"domain_count": "Domenii"
},
"authentik": {
"users": "Utilizatori",
"loginsLast24H": "Autentificări (24h)",
"failedLoginsLast24H": "Conectări eșuate (24h)"
},
"proxmox": {
"vms": "VMs",
"mem": "MEM",
"cpu": "CPU",
"lxc": "LXC"
},
"unifi": {
"users": "Users",
"uptime": "System Uptime",
"days": "Days",
"wan": "WAN",
"lan_users": "LAN Users",
"wlan_users": "WLAN Users",
"up": "UP",
"down": "DOWN",
"wait": "Please wait"
},
"plex": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait"
}
}

View File

@@ -11,7 +11,8 @@
"total": "Всего", "total": "Всего",
"free": "Свободно", "free": "Свободно",
"used": "Использовано", "used": "Использовано",
"load": "Load" "load": "Load",
"cpu": "CPU"
}, },
"docker": { "docker": {
"rx": "Rx", "rx": "Rx",
@@ -113,7 +114,7 @@
"1hour": "1 Hour", "1hour": "1 Hour",
"1day": "1 Day", "1day": "1 Day",
"7days": "7 Days", "7days": "7 Days",
"30days": "30 Days" "30days": "30 Дней"
}, },
"gotify": { "gotify": {
"apps": "Applications", "apps": "Applications",
@@ -145,5 +146,60 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"albums": "Albums" "albums": "Albums"
},
"adguard": {
"queries": "Queries",
"blocked": "Blocked",
"filtered": "Filtered",
"latency": "Latency"
},
"qbittorrent": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"mastodon": {
"user_count": "Users",
"status_count": "Posts",
"domain_count": "Domains"
},
"strelaysrv": {
"numConnections": "Connections",
"dataRelayed": "Relayed",
"transferRate": "Rate",
"numActiveSessions": "Sessions"
},
"authentik": {
"users": "Users",
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)"
},
"proxmox": {
"mem": "MEM",
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
},
"unifi": {
"users": "Users",
"uptime": "System Uptime",
"days": "Days",
"wan": "WAN",
"lan_users": "LAN Users",
"wlan_users": "WLAN Users",
"up": "UP",
"down": "DOWN",
"wait": "Please wait"
},
"plex": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait"
} }
} }

View File

@@ -0,0 +1,205 @@
{
"widget": {
"missing_type": "Saknar Widget-typ: {{type}}",
"api_error": "API-fel",
"status": "Status"
},
"weather": {
"current": "Nuvarande plats",
"allow": "Klicka för att tillåta",
"updating": "Uppdaterar",
"wait": "Vänligen vänta"
},
"resources": {
"load": "Laddar",
"total": "Total",
"free": "Ledigt",
"used": "Använt",
"cpu": "CPU"
},
"docker": {
"rx": "RX",
"tx": "TX",
"mem": "MEM",
"cpu": "CPU",
"offline": "Offline"
},
"search": {
"placeholder": "Sök…"
},
"emby": {
"playing": "Spelar",
"transcoding": "Omkodning",
"bitrate": "Bitrate",
"no_active": "Inga aktiva strömmar"
},
"tautulli": {
"playing": "Spelar",
"transcoding": "Omkodning",
"bitrate": "Bitrate",
"no_active": "Inga aktiva strömmar"
},
"nzbget": {
"rate": "Hastighet",
"remaining": "Återstående",
"downloaded": "Nedladdat"
},
"sabnzbd": {
"rate": "Hastighet",
"queue": "Kö",
"timeleft": "Tid kvar"
},
"rutorrent": {
"active": "Aktiva",
"upload": "Uppladdning",
"download": "Nedladdning"
},
"transmission": {
"download": "Nedladdning",
"upload": "Uppladdning",
"leech": "Leech",
"seed": "Seed"
},
"sonarr": {
"wanted": "Eftersöker",
"queued": "I kö",
"series": "Serier"
},
"radarr": {
"wanted": "Eftersöker",
"queued": "I kö",
"movies": "Filmer"
},
"lidarr": {
"wanted": "Eftersöker",
"queued": "I kö",
"albums": "Album"
},
"readarr": {
"wanted": "Eftersökt",
"queued": "I kö",
"books": "Böcker"
},
"bazarr": {
"missingEpisodes": "Saknade program",
"missingMovies": "Saknade filmer"
},
"ombi": {
"pending": "Avvaktar",
"approved": "Godkända",
"available": "Tillgänglig"
},
"jellyseerr": {
"pending": "Avvaktar",
"approved": "Godkända",
"available": "Tillgänglig"
},
"overseerr": {
"pending": "Avvaktar",
"approved": "Godkända",
"available": "Tillgänglig"
},
"pihole": {
"blocked": "Blockerad",
"queries": "Förfrågningar",
"gravity": "Gravity"
},
"speedtest": {
"upload": "Uppladdning",
"download": "Nedladdning",
"ping": "Svarstid"
},
"portainer": {
"running": "Körs",
"stopped": "Stoppade",
"total": "Totalt"
},
"traefik": {
"routers": "Routers",
"services": "Tjänster",
"middleware": "Middleware"
},
"npm": {
"enabled": "Aktiverad",
"disabled": "Inaktiverad",
"total": "Totalt"
},
"coinmarketcap": {
"configure": "Konfigurera en eller flera kryptovalutor att följa",
"1hour": "1 timme",
"1day": "1 dag",
"7days": "7 dagar",
"30days": "30 dagar"
},
"gotify": {
"apps": "Program",
"clients": "Klienter",
"messages": "Meddelande"
},
"prowlarr": {
"enableIndexers": "Indexerare",
"numberOfGrabs": "Hämtningar",
"numberOfQueries": "Hämtningar",
"numberOfFailGrabs": "Misslyckade hämtningar",
"numberOfFailQueries": "Misslyckade hämtningar"
},
"jackett": {
"configured": "Konfigurerade",
"errored": "Felaktiga"
},
"adguard": {
"queries": "Förfrågningar",
"blocked": "Blockerad",
"filtered": "Filtrerad",
"latency": "Svarstid"
},
"qbittorrent": {
"download": "Nedladdning",
"upload": "Uppladdning",
"leech": "Leech",
"seed": "Seed"
},
"mastodon": {
"user_count": "Användare",
"status_count": "Posts",
"domain_count": "Domains"
},
"strelaysrv": {
"numActiveSessions": "Sessioner",
"numConnections": "Anslutningar",
"dataRelayed": "Relayed",
"transferRate": "Rate"
},
"authentik": {
"users": "Users",
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)"
},
"proxmox": {
"mem": "MEM",
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
},
"unifi": {
"users": "Users",
"uptime": "System Uptime",
"days": "Days",
"wan": "WAN",
"lan_users": "LAN Users",
"wlan_users": "WLAN Users",
"up": "UP",
"down": "DOWN",
"wait": "Please wait"
},
"plex": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait"
}
}

View File

@@ -0,0 +1,205 @@
{
"readarr": {
"books": "పుస్తకాలు",
"wanted": "కావలెను",
"queued": "క్యూయూఎడ్"
},
"adguard": {
"blocked": "నిరోధించబడింది",
"filtered": "ఫిల్టర్ చేయబడింది",
"latency": "జాప్యం",
"queries": "ప్రశ్నలు"
},
"strelaysrv": {
"numActiveSessions": "సెషన్స్",
"numConnections": "కనెక్షన్లు",
"dataRelayed": "రెలయెడఁ",
"transferRate": "రేటు"
},
"widget": {
"missing_type": "విడ్జెట్ లేదు: {{type}}",
"api_error": "API లోపం",
"status": "హోదా"
},
"weather": {
"current": "ప్రస్తుత స్తలం",
"allow": "అనుమతించడానికి క్లిక్ చేయండి",
"updating": "నవీకరిస్తోంది",
"wait": "దయచేసి వేచి ఉండండి"
},
"search": {
"placeholder": "వెతకండి…"
},
"resources": {
"cpu": "సీపియూ",
"total": "మొత్తం",
"free": "మిగిలింది",
"used": "ఉపయోగించబడిన",
"load": "లోడ్"
},
"docker": {
"rx": "RX",
"tx": "TX",
"mem": "MEM",
"cpu": "సీపియూ",
"offline": "ఆఫ్‌లైన్"
},
"emby": {
"playing": "ఆడుతున్నారు",
"transcoding": "ట్రాన్స్‌కోడింగ్",
"bitrate": "బిట్రేట్",
"no_active": "యాక్టివ్ స్ట్రీమ్‌లు లేవు"
},
"tautulli": {
"playing": "ఆడుతున్నారు",
"transcoding": "ట్రాన్స్‌కోడింగ్",
"bitrate": "బిట్రేట్",
"no_active": "యాక్టివ్ స్ట్రీమ్‌లు లేవు"
},
"nzbget": {
"rate": "రేట్",
"remaining": "మిగిలింది",
"downloaded": "డౌన్‌లోడ్ చేయబడింది"
},
"sabnzbd": {
"rate": "రేట్",
"queue": "వరుస",
"timeleft": "మిగిలి వున్న సమయం"
},
"rutorrent": {
"active": "చురుకుగా",
"upload": "అప్‌లోడ్",
"download": "డౌన్‌లోడ్"
},
"transmission": {
"download": "డౌన్‌లోడ్",
"upload": "అప్‌లోడ్",
"leech": "జలగ",
"seed": "సీడ్"
},
"qbittorrent": {
"download": "డౌన్‌లోడ్",
"upload": "అప్లోడ్",
"leech": "లీచ్",
"seed": "సీడ్"
},
"sonarr": {
"wanted": "కావలెను",
"queued": "క్యూయూఎడ్",
"series": "సిరీస్"
},
"radarr": {
"wanted": "కావలెను",
"queued": "క్యూయూఎడ్",
"movies": "సినిమాలు"
},
"lidarr": {
"wanted": "కావలెను",
"queued": "క్యూయూఎడ్",
"albums": "ఆల్బములు"
},
"bazarr": {
"missingEpisodes": "ఎపిసోడ్‌లు లేవు",
"missingMovies": "సినిమాలు లేవు"
},
"ombi": {
"pending": "పెండింగ్",
"approved": "ఆమోదించబడింది",
"available": "అందుబాటులో వున్నవి"
},
"jellyseerr": {
"pending": "పెండింగ్",
"approved": "ఆమోదించబడింది",
"available": "అందుబాటులో"
},
"overseerr": {
"pending": "పెండింగ్",
"approved": "ఆమోదించబడింది",
"available": "అందుబాటులో"
},
"pihole": {
"queries": "ప్రశ్నలు",
"blocked": "నిరోధించబడింది",
"gravity": "గురుత్వాకర్షణ"
},
"speedtest": {
"upload": "అప్లోడ్",
"download": "డౌన్‌లోడ్",
"ping": "పింగ్"
},
"portainer": {
"running": "నడుస్తున్నవి",
"stopped": "ఆగిపోయినవి",
"total": "మొత్తం"
},
"traefik": {
"routers": "రౌటర్లు",
"services": "సేవలు",
"middleware": "మిడిల్వేర్"
},
"npm": {
"enabled": "ప్రారంభించబడింది",
"disabled": "డిసేబ్లెడ్",
"total": "మొత్తం"
},
"coinmarketcap": {
"configure": "ట్రాక్ చేయడానికి ఒకటి లేదా అంతకంటే ఎక్కువ క్రిప్టో కరెన్సీలను కాన్ఫిగర్ చేయండి",
"1hour": "1 గంట",
"1day": "1 రోజు",
"7days": "7 రోజులు",
"30days": "30 రోజులు"
},
"gotify": {
"apps": "అప్లికేషన్లు",
"clients": "ఖాతాదారులు",
"messages": "సందేశాలు"
},
"prowlarr": {
"enableIndexers": "సూచికలు",
"numberOfGrabs": "గ్రాబ్స్",
"numberOfQueries": "ప్రశ్నలు",
"numberOfFailGrabs": "ఫెయిల్ గ్రాబ్స్",
"numberOfFailQueries": "విఫలమైన ప్రశ్నలు"
},
"jackett": {
"configured": "కాన్ఫిగర్ చేయబడింది",
"errored": "పొరపాటు జరిగింది"
},
"mastodon": {
"user_count": "వినియోగదారులు",
"status_count": "పోస్ట్‌లు",
"domain_count": "డొమైన్‌లు"
},
"authentik": {
"users": "వినియోగదారులు",
"loginsLast24H": "లాగిన్లు (24గ)",
"failedLoginsLast24H": "విఫలమైన లాగిన్‌లు (24గ)"
},
"proxmox": {
"mem": "MEM",
"cpu": "సీపియూ",
"lxc": "LXC",
"vms": "విఎంలు"
},
"unifi": {
"users": "వినియోగదారులు",
"uptime": "సిస్టమ్ సమయము",
"days": "రోజులు",
"wan": "WAN",
"lan_users": "LAN వినియోగదారులు",
"wlan_users": "WLAN వినియోగదారులు",
"up": "అప్",
"down": "డౌన్",
"wait": "దయచేసి వేచి ఉండండి"
},
"plex": {
"streams": "యాక్టివ్ స్ట్రీమ్‌లు",
"movies": "సినిమాలు",
"tv": "దూరదర్శిని కార్యక్రమాలు"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait"
}
}

View File

@@ -11,7 +11,8 @@
"total": "Tổng", "total": "Tổng",
"free": "Dư", "free": "Dư",
"used": "Đã dùng", "used": "Đã dùng",
"load": "Load" "load": "Load",
"cpu": "CPU"
}, },
"docker": { "docker": {
"rx": "RX", "rx": "RX",
@@ -145,5 +146,60 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"albums": "Albums" "albums": "Albums"
},
"adguard": {
"queries": "Queries",
"blocked": "Blocked",
"filtered": "Filtered",
"latency": "Latency"
},
"qbittorrent": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"mastodon": {
"user_count": "Users",
"status_count": "Posts",
"domain_count": "Domains"
},
"strelaysrv": {
"numActiveSessions": "Sessions",
"numConnections": "Connections",
"dataRelayed": "Relayed",
"transferRate": "Rate"
},
"authentik": {
"users": "Users",
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)"
},
"proxmox": {
"mem": "MEM",
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
},
"unifi": {
"users": "Users",
"uptime": "System Uptime",
"days": "Days",
"wan": "WAN",
"lan_users": "LAN Users",
"wlan_users": "WLAN Users",
"up": "UP",
"down": "DOWN",
"wait": "Please wait"
},
"plex": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait"
} }
} }

View File

@@ -0,0 +1,205 @@
{
"emby": {
"transcoding": "轉碼緊",
"bitrate": "比特率",
"playing": "播放緊",
"no_active": "無任何活動"
},
"tautulli": {
"playing": "播放緊",
"no_active": "無任何活動",
"transcoding": "轉碼緊",
"bitrate": "比特率"
},
"transmission": {
"download": "下載速度",
"upload": "上傳速度",
"leech": "下載緊",
"seed": "做種緊"
},
"widget": {
"missing_type": "缺少小部件類型:{{type}}",
"api_error": "API 錯誤",
"status": "狀況"
},
"weather": {
"current": "依家位置",
"allow": "點擊允許",
"updating": "更新緊",
"wait": "請稍後"
},
"search": {
"placeholder": "搜索緊…"
},
"resources": {
"total": "全部",
"free": "剩餘",
"used": "用咗",
"load": "負荷",
"cpu": "CPU"
},
"docker": {
"rx": "接收",
"tx": "發送",
"mem": "內存",
"cpu": "處理器",
"offline": "離線"
},
"nzbget": {
"rate": "速度",
"remaining": "剩餘",
"downloaded": "下載咗"
},
"sabnzbd": {
"rate": "速度",
"queue": "隊列",
"timeleft": "用時"
},
"rutorrent": {
"active": "激活",
"upload": "上傳",
"download": "下載"
},
"qbittorrent": {
"download": "下載速度",
"upload": "上傳速度",
"leech": "下載緊",
"seed": "做種緊"
},
"sonarr": {
"wanted": "想睇",
"queued": "排緊隊",
"series": "電視劇"
},
"radarr": {
"wanted": "想睇",
"queued": "排緊隊",
"movies": "電影"
},
"lidarr": {
"wanted": "想睇",
"queued": "排緊隊",
"albums": "專輯"
},
"readarr": {
"wanted": "想睇",
"queued": "排緊隊",
"books": "書"
},
"bazarr": {
"missingEpisodes": "缺少嘅劇集",
"missingMovies": "缺少電影"
},
"ombi": {
"pending": "待定",
"approved": "批准",
"available": "可用"
},
"jellyseerr": {
"pending": "提交咗",
"approved": "批准咗",
"available": "可睇嘅總量"
},
"overseerr": {
"pending": "待定",
"approved": "批准",
"available": "可用"
},
"pihole": {
"queries": "查詢",
"blocked": "封鎖",
"gravity": "重力"
},
"adguard": {
"queries": "查詢",
"blocked": "封鎖",
"filtered": "過濾",
"latency": "延遲"
},
"speedtest": {
"upload": "上傳速率",
"download": "下載速率",
"ping": "Ping值"
},
"portainer": {
"running": "運行緊",
"stopped": "暫停",
"total": "全部"
},
"traefik": {
"routers": "路由器",
"services": "服務項",
"middleware": "中間件"
},
"coinmarketcap": {
"1day": "1 日",
"configure": "配置一個或多個加密貨幣以進行跟蹤",
"1hour": "1 個鐘",
"7days": "7 日",
"30days": "30日"
},
"npm": {
"enabled": "啟用",
"disabled": "停用咗",
"total": "全部"
},
"gotify": {
"apps": "應用",
"clients": "客戶端",
"messages": "消息"
},
"prowlarr": {
"enableIndexers": "索引",
"numberOfGrabs": "抓住",
"numberOfQueries": "查詢",
"numberOfFailGrabs": "失敗抓取",
"numberOfFailQueries": "查詢失敗"
},
"jackett": {
"configured": "配置",
"errored": "已錯誤"
},
"strelaysrv": {
"numActiveSessions": "會話",
"numConnections": "連接",
"dataRelayed": "傳遞",
"transferRate": "速度"
},
"mastodon": {
"user_count": "用戶",
"status_count": "職位",
"domain_count": "域"
},
"authentik": {
"users": "用戶",
"loginsLast24H": "登錄( 24小时",
"failedLoginsLast24H": "登錄失敗( 24鐘頭"
},
"proxmox": {
"mem": "MEM",
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
},
"unifi": {
"users": "Users",
"uptime": "System Uptime",
"days": "Days",
"wan": "WAN",
"lan_users": "LAN Users",
"wlan_users": "WLAN Users",
"up": "UP",
"down": "DOWN",
"wait": "Please wait"
},
"plex": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait"
}
}

View File

@@ -2,7 +2,7 @@
"widget": { "widget": {
"missing_type": "缺少小部件类型:{{type}}", "missing_type": "缺少小部件类型:{{type}}",
"api_error": "API错误", "api_error": "API错误",
"status": "地位" "status": "状态"
}, },
"search": { "search": {
"placeholder": "搜索…" "placeholder": "搜索…"
@@ -11,7 +11,8 @@
"total": "共", "total": "共",
"free": "空闲", "free": "空闲",
"used": "已用", "used": "已用",
"load": "负载" "load": "负载",
"cpu": "CPU"
}, },
"docker": { "docker": {
"rx": "接收", "rx": "接收",
@@ -21,13 +22,13 @@
"offline": "离线" "offline": "离线"
}, },
"emby": { "emby": {
"playing": "正在播放", "playing": "播放",
"transcoding": "转码", "transcoding": "转码",
"bitrate": "比特率", "bitrate": "比特率",
"no_active": "暂无播放" "no_active": "暂无播放"
}, },
"tautulli": { "tautulli": {
"playing": "正在播放", "playing": "播放",
"transcoding": "转码", "transcoding": "转码",
"bitrate": "比特率", "bitrate": "比特率",
"no_active": "暂无播放" "no_active": "暂无播放"
@@ -38,12 +39,12 @@
"download": "下载" "download": "下载"
}, },
"sonarr": { "sonarr": {
"wanted": "通缉", "wanted": "想看",
"queued": "排队", "queued": "排队",
"series": "系列" "series": "系列"
}, },
"radarr": { "radarr": {
"wanted": "订阅", "wanted": "想看",
"queued": "队列", "queued": "队列",
"movies": "电影" "movies": "电影"
}, },
@@ -74,7 +75,7 @@
}, },
"portainer": { "portainer": {
"running": "运行中", "running": "运行中",
"stopped": "停止", "stopped": "停止",
"total": "总计" "total": "总计"
}, },
"traefik": { "traefik": {
@@ -88,10 +89,10 @@
"total": "全部的" "total": "全部的"
}, },
"weather": { "weather": {
"current": "当前位", "current": "当前位",
"allow": "点击并允许", "allow": "点击并允许",
"updating": "更新中", "updating": "更新中",
"wait": "请等待" "wait": "请稍候"
}, },
"overseerr": { "overseerr": {
"pending": "待办", "pending": "待办",
@@ -110,10 +111,10 @@
}, },
"coinmarketcap": { "coinmarketcap": {
"configure": "配置一个或多个需要追踪的加密", "configure": "配置一个或多个需要追踪的加密",
"1hour": "1 Hour", "1hour": "1小时",
"1day": "1 Day", "1day": "1",
"7days": "7 Days", "7days": "7",
"30days": "30 Days" "30days": "30"
}, },
"gotify": { "gotify": {
"apps": "应用", "apps": "应用",
@@ -121,29 +122,84 @@
"messages": "信息" "messages": "信息"
}, },
"prowlarr": { "prowlarr": {
"enableIndexers": "Indexers", "enableIndexers": "索引器",
"numberOfGrabs": "Grabs", "numberOfGrabs": "抓取",
"numberOfQueries": "Queries", "numberOfQueries": "查询",
"numberOfFailGrabs": "Fail Grabs", "numberOfFailGrabs": "抓取失败",
"numberOfFailQueries": "Fail Queries" "numberOfFailQueries": "查询失败"
}, },
"transmission": { "transmission": {
"download": "下载", "download": "下载",
"upload": "上传", "upload": "上传",
"leech": "Leech", "leech": "下载中",
"seed": "做种" "seed": "做种"
}, },
"jackett": { "jackett": {
"configured": "Configured", "configured": "已配置",
"errored": "Errored" "errored": "出错了"
}, },
"bazarr": { "bazarr": {
"missingEpisodes": "Missing Episodes", "missingEpisodes": "缺少的剧集",
"missingMovies": "Missing Movies" "missingMovies": "缺少的电影"
}, },
"lidarr": { "lidarr": {
"wanted": "Wanted", "wanted": "订阅",
"queued": "Queued", "queued": "队列",
"albums": "Albums" "albums": "相册"
},
"adguard": {
"queries": "查询",
"blocked": "阻止",
"filtered": "过滤",
"latency": "延迟"
},
"qbittorrent": {
"download": "下载",
"upload": "上传",
"leech": "下载中",
"seed": "做种"
},
"mastodon": {
"user_count": "用户",
"status_count": "Posts",
"domain_count": "域"
},
"strelaysrv": {
"numActiveSessions": "会话",
"dataRelayed": "中继",
"numConnections": "连接",
"transferRate": "速度"
},
"authentik": {
"users": "用户",
"loginsLast24H": "登录 (24h)",
"failedLoginsLast24H": "登录失败 (24h)"
},
"proxmox": {
"mem": "内存",
"cpu": "处理器",
"lxc": "LXC",
"vms": "VMs"
},
"unifi": {
"users": "Users",
"uptime": "System Uptime",
"days": "Days",
"wan": "WAN",
"lan_users": "LAN Users",
"wlan_users": "WLAN Users",
"up": "UP",
"down": "DOWN",
"wait": "请稍候"
},
"plex": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait"
} }
} }

View File

@@ -41,7 +41,8 @@
"total": "Total", "total": "Total",
"free": "Free", "free": "Free",
"used": "Used", "used": "Used",
"load": "Load" "load": "Load",
"cpu": "CPU"
}, },
"nzbget": { "nzbget": {
"rate": "Rate", "rate": "Rate",
@@ -145,5 +146,60 @@
"wanted": "Wanted", "wanted": "Wanted",
"queued": "Queued", "queued": "Queued",
"albums": "Albums" "albums": "Albums"
},
"adguard": {
"queries": "Queries",
"blocked": "Blocked",
"filtered": "Filtered",
"latency": "Latency"
},
"qbittorrent": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"mastodon": {
"user_count": "Users",
"status_count": "Posts",
"domain_count": "Domains"
},
"strelaysrv": {
"numActiveSessions": "Sessions",
"numConnections": "Connections",
"dataRelayed": "Relayed",
"transferRate": "Rate"
},
"authentik": {
"users": "Users",
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)"
},
"proxmox": {
"mem": "MEM",
"cpu": "CPU",
"lxc": "LXC",
"vms": "VMs"
},
"unifi": {
"users": "Users",
"uptime": "System Uptime",
"days": "Days",
"wan": "WAN",
"lan_users": "LAN Users",
"wlan_users": "WLAN Users",
"up": "UP",
"down": "DOWN",
"wait": "Please wait"
},
"plex": {
"streams": "Active Streams",
"movies": "Movies",
"tv": "TV Shows"
},
"glances": {
"cpu": "CPU",
"mem": "MEM",
"wait": "Please wait"
} }
} }

BIN
public/mstile-144x144.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
public/mstile-150x150.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
public/mstile-310x150.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
public/mstile-310x310.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

BIN
public/mstile-70x70.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 958 B

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="700.000000pt" height="700.000000pt" viewBox="0 0 700.000000 700.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.14, written by Peter Selinger 2001-2017
</metadata>
<g transform="translate(0.000000,700.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M1682 5688 c-141 -24 -253 -147 -287 -316 -5 -24 -10 -3658 -5 -4029
0 -33 0 -33 168 108 92 77 178 151 192 162 14 12 75 64 136 114 62 51 114 99
116 105 2 7 4 209 3 449 l-1 436 276 0 c151 0 277 -4 280 -8 3 -4 5 -98 4
-208 0 -111 2 -201 4 -201 3 0 117 95 132 110 3 3 73 61 155 130 168 140 167
139 250 209 51 43 62 48 75 37 13 -12 524 -441 654 -550 28 -22 68 -57 91 -76
23 -19 66 -55 95 -80 30 -25 86 -72 125 -105 38 -33 140 -118 225 -190 85 -71
166 -139 180 -151 14 -13 70 -60 124 -106 55 -46 133 -111 174 -145 41 -35 77
-61 80 -59 4 2 7 607 7 1344 -1 1197 1 1341 15 1344 8 2 163 3 343 3 l328 0
-4 685 c-1 377 -6 695 -9 706 -26 90 -93 186 -161 233 -86 58 30 55 -1924 55
-991 1 -1819 -2 -1841 -6z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -1,15 +1,13 @@
import ErrorBoundary from "components/errorboundry";
import List from "components/bookmarks/list"; import List from "components/bookmarks/list";
export default function BookmarksGroup({ group }) { export default function BookmarksGroup({ group }) {
return ( return (
<div <div key={group.name} className="basis-full md:basis-1/2 lg:basis-1/3 xl:basis-1/4 flex-1">
key={group.name} <h2 className="text-theme-800 dark:text-theme-300 text-xl font-medium">{group.name}</h2>
className="basis-full md:basis-1/2 lg:basis-1/3 xl:basis-1/4 flex-1 p-1" <ErrorBoundary>
> <List bookmarks={group.bookmarks} />
<h2 className="text-theme-800 dark:text-theme-300 text-xl font-medium"> </ErrorBoundary>
{group.name}
</h2>
<List bookmarks={group.bookmarks} />
</div> </div>
); );
} }

View File

@@ -1,12 +1,18 @@
import { useContext } from "react";
import { SettingsContext } from "utils/contexts/settings";
export default function Item({ bookmark }) { export default function Item({ bookmark }) {
const { hostname } = new URL(bookmark.href); const { hostname } = new URL(bookmark.href);
const { settings } = useContext(SettingsContext);
return ( return (
<li key={bookmark.name}> <li key={bookmark.name}>
<button <a
type="button" href={bookmark.href}
onClick={() => window.open(bookmark.href, "_blank").focus()} title={bookmark.name}
className="w-full text-left mb-3 cursor-pointer rounded-md font-medium text-theme-700 hover:text-theme-700 dark:text-theme-200 dark:hover:text-theme-300 shadow-md shadow-black/10 dark:shadow-black/20 bg-white/50 hover:bg-theme-300/10 dark:bg-white/10 dark:hover:bg-white/20" target={settings.target ?? "_blank"}
className="block w-full text-left cursor-pointer transition-all h-15 mb-3 rounded-md font-medium text-theme-700 dark:text-theme-200 dark:hover:text-theme-300 shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 hover:bg-theme-300/20 dark:bg-white/5 dark:hover:bg-white/10"
> >
<div className="flex"> <div className="flex">
<div className="flex-shrink-0 flex items-center justify-center w-11 bg-theme-500/10 dark:bg-theme-900/50 text-theme-700 hover:text-theme-700 dark:text-theme-200 text-sm font-medium rounded-l-md"> <div className="flex-shrink-0 flex items-center justify-center w-11 bg-theme-500/10 dark:bg-theme-900/50 text-theme-700 hover:text-theme-700 dark:text-theme-200 text-sm font-medium rounded-l-md">
@@ -14,10 +20,10 @@ export default function Item({ bookmark }) {
</div> </div>
<div className="flex-1 flex items-center justify-between rounded-r-md "> <div className="flex-1 flex items-center justify-between rounded-r-md ">
<div className="flex-1 grow pl-3 py-2 text-xs">{bookmark.name}</div> <div className="flex-1 grow pl-3 py-2 text-xs">{bookmark.name}</div>
<div className="px-2 py-2 truncate text-theme-500 dark:text-theme-400 opacity-50 text-xs">{hostname}</div> <div className="px-2 py-2 truncate text-theme-500 dark:text-theme-300 text-xs">{hostname}</div>
</div> </div>
</div> </div>
</button> </a>
</li> </li>
); );
} }

View File

@@ -0,0 +1,40 @@
import React from "react";
export default class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { error: null, errorInfo: null };
}
componentDidCatch(error, errorInfo) {
// Catch errors in any components below and re-render with error message
this.setState({
error,
errorInfo,
});
// You can also log error messages to an error reporting service here
// eslint-disable-next-line no-console
console.error(error, errorInfo);
}
render() {
const { error, errorInfo } = this.state;
if (errorInfo) {
// Error path
return (
<div className="inline-block text-sm bg-rose-100 text-rose-900 dark:bg-rose-900 dark:text-rose-100 rounded-md p-2 m-1">
<div className="font-medium mb-1">Something went wrong.</div>
<details className="text-xs font-mono whitespace-pre">
<summary>{error && error.toString()}</summary>
{errorInfo.componentStack}
</details>
</div>
);
}
// Normally, just render children
const { children } = this.props;
return children;
}
}

114
src/components/favicon.jsx Normal file
View File

@@ -0,0 +1,114 @@
/* eslint-disable @next/next/no-img-element */
/* eslint-disable jsx-a11y/alt-text */
import { useRef, useEffect, useContext } from "react";
import themes from "utils/styles/themes";
import { ColorContext } from "utils/contexts/color";
export function Svg({ svgRef = null }) {
const { color } = useContext(ColorContext);
const { iconStart, iconEnd } = themes[color];
return (
<svg
ref={svgRef}
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 1024 1024"
style={{
enableBackground: "new 0 0 1024 1024",
}}
xmlSpace="preserve"
className="w-full h-full"
>
<style>
{
".st0{display:none}.st3{stroke-linecap:square}.st3,.st4{fill:none;stroke:#fff;stroke-miterlimit:10}.st6{display:inline;fill:#333}.st7{fill:#fff}"
}
</style>
<g id="Icon">
<path
d="M771.9 191c27.7 0 50.1 26.5 50.1 59.3v186.4l-100.2.3V250.3c0-32.8 22.4-59.3 50.1-59.3z"
style={{
fill: iconStart,
}}
/>
<linearGradient
id="homepage_favicon_gradient"
gradientUnits="userSpaceOnUse"
x1={200.746}
y1={225.015}
x2={764.986}
y2={789.255}
>
<stop
offset={0}
style={{
stopColor: iconStart,
}}
/>
<stop
offset={1}
style={{
stopColor: iconEnd,
}}
/>
</linearGradient>
<path
d="M721.8 250.3c0-32.7 22.4-59.3 50.1-59.3H253.1c-27.7 0-50.1 26.5-50.1 59.3v582.2l90.2-75.7-.1-130.3H375v61.8l88-73.8 258.8 217.9V250.6"
style={{
fill: "url(#homepage_favicon_gradient})",
}}
/>
</g>
</svg>
);
}
export default function Favicon() {
const svgRef = useRef();
const imgRef = useRef();
const canvasRef = useRef();
useEffect(() => {
const svg = svgRef.current;
const img = imgRef.current;
const canvas = canvasRef.current;
if (!svg || !img || !canvas) {
return;
}
const xml = new XMLSerializer().serializeToString(svg);
const svg64 = Buffer.from(xml).toString("base64");
const b64Start = "data:image/svg+xml;base64,";
// prepend a "header"
const image64 = b64Start + svg64;
// set it as the source of the img element
img.onload = () => {
// draw the image onto the canvas
canvas.getContext("2d").drawImage(img, 0, 0);
// canvas.width = 256;
// canvas.height = 256;
const link = window.document.createElement("link");
link.type = "image/x-icon";
link.rel = "shortcut icon";
link.href = canvas.toDataURL("image/x-icon");
document.getElementsByTagName("head")[0].appendChild(link);
};
img.src = image64;
}, []);
return (
<div className="hidden">
<Svg svgRef={svgRef} />
<img width={64} height={64} ref={imgRef} />
<canvas width={64} height={64} ref={canvasRef} />
</div>
);
}

View File

@@ -1,15 +1,18 @@
import classNames from "classnames";
import List from "components/services/list"; import List from "components/services/list";
export default function ServicesGroup({ services }) { export default function ServicesGroup({ services, layout }) {
return ( return (
<div <div
key={services.name} key={services.name}
className="basis-full md:basis-1/2 lg:basis-1/3 xl:basis-1/4 flex-1 p-1" className={classNames(
layout?.style === "row" ? "basis-full" : "basis-full md:basis-1/2 lg:basis-1/3 xl:basis-1/4",
"flex-1 p-1"
)}
> >
<h2 className="text-theme-800 dark:text-theme-300 text-xl font-medium"> <h2 className="text-theme-800 dark:text-theme-300 text-xl font-medium">{services.name}</h2>
{services.name} <List services={services.services} layout={layout} />
</h2>
<List services={services.services} />
</div> </div>
); );
} }

View File

@@ -1,98 +1,132 @@
import Image from "next/future/image"; import Image from "next/future/image";
import { Disclosure } from "@headlessui/react"; import classNames from "classnames";
import { useContext, useState } from "react";
import Status from "./status"; import Status from "./status";
import Widget from "./widget"; import Widget from "./widget";
import Docker from "./widgets/service/docker";
import Docker from "widgets/docker/component";
import { SettingsContext } from "utils/contexts/settings";
function resolveIcon(icon) { function resolveIcon(icon) {
if (icon.startsWith("http")) { // direct or relative URLs
return `/api/proxy?url=${encodeURIComponent(icon)}`; if (icon.startsWith("http") || icon.startsWith("/")) {
return <Image src={`${icon}`} width={32} height={32} alt="logo" />;
} }
if (icon.startsWith("/")) { // mdi- prefixed, material design icons
return icon; if (icon.startsWith("mdi-")) {
const iconName = icon.replace("mdi-", "").replace(".svg", "");
return (
<div
style={{
width: 32,
height: 32,
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`,
}}
/>
);
} }
if (icon.endsWith(".png")) { // fallback to dashboard-icons
return `https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/${icon}`; const iconName = icon.replace(".png", "");
} return (
<Image
return `https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/${icon}.png`; src={`https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/${iconName}.png`}
width={32}
height={32}
alt="logo"
/>
);
} }
export default function Item({ service }) { export default function Item({ service }) {
const handleOnClick = () => { const hasLink = service.href && service.href !== "#";
if (service.href && service.href !== "#") { const { settings } = useContext(SettingsContext);
window.open(service.href, "_blank").focus(); const [statsOpen, setStatsOpen] = useState(false);
const [statsClosing, setStatsClosing] = useState(false);
// set stats to closed after 300ms
const closeStats = () => {
if (statsOpen) {
setStatsClosing(true);
setTimeout(() => {
setStatsOpen(false);
setStatsClosing(false);
}, 300);
} }
}; };
const hasLink = service.href && service.href !== "#";
return ( return (
<li key={service.name}> <li key={service.name}>
<Disclosure> <div
<div className={`${
className={`${ hasLink ? "cursor-pointer " : " "
hasLink ? "cursor-pointer " : " " }transition-all h-15 mb-3 p-1 rounded-md font-medium text-theme-700 dark:text-theme-200 dark:hover:text-theme-300 shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 hover:bg-theme-300/20 dark:bg-white/5 dark:hover:bg-white/10`}
}transition-all h-15 mb-3 p-1 rounded-md font-medium text-theme-700 hover:text-theme-700/70 dark:text-theme-200 dark:hover:text-theme-300 shadow-md shadow-black/10 dark:shadow-black/20 bg-white/50 hover:bg-theme-300/20 dark:bg-white/10 dark:hover:bg-white/20`} >
> <div className="flex select-none">
<div className="flex select-none"> {service.icon &&
{service.icon && (hasLink ? (
(hasLink ? ( <a
<button href={service.href}
type="button" target={settings.target ?? "_blank"}
onClick={handleOnClick} rel="noreferrer"
className="flex-shrink-0 flex items-center justify-center w-12 " className="flex-shrink-0 flex items-center justify-center w-12 "
>
<Image src={resolveIcon(service.icon)} width={32} height={32} alt="logo" />
</button>
) : (
<div className="flex-shrink-0 flex items-center justify-center w-12 ">
<Image src={resolveIcon(service.icon)} width={32} height={32} alt="logo" />
</div>
))}
{hasLink ? (
<button
type="button"
onClick={handleOnClick}
className="flex-1 flex items-center justify-between rounded-r-md "
> >
<div className="flex-1 px-2 py-2 text-sm text-left"> {resolveIcon(service.icon)}
{service.name} </a>
<p className="text-theme-500 dark:text-theme-400 text-xs font-extralight">{service.description}</p>
</div>
</button>
) : ( ) : (
<div className="flex-1 flex items-center justify-between rounded-r-md "> <div className="flex-shrink-0 flex items-center justify-center w-12 ">{resolveIcon(service.icon)}</div>
<div className="flex-1 px-2 py-2 text-sm text-left"> ))}
{service.name}
<p className="text-theme-500 dark:text-theme-400 text-xs font-extralight">{service.description}</p> {hasLink ? (
</div> <a
href={service.href}
target={settings.target ?? "_blank"}
rel="noreferrer"
className="flex-1 flex items-center justify-between rounded-r-md "
>
<div className="flex-1 px-2 py-2 text-sm text-left">
{service.name}
<p className="text-theme-500 dark:text-theme-300 text-xs font-light">{service.description}</p>
</div>
</a>
) : (
<div className="flex-1 flex items-center justify-between rounded-r-md ">
<div className="flex-1 px-2 py-2 text-sm text-left">
{service.name}
<p className="text-theme-500 dark:text-theme-300 text-xs font-light">{service.description}</p>
</div> </div>
)}
{service.container && (
<Disclosure.Button
as="div"
className="flex-shrink-0 flex items-center justify-center w-12 cursor-pointer"
>
<Status service={service} />
</Disclosure.Button>
)}
</div>
<Disclosure.Panel>
<div className="w-full">
<Docker service={{ widget: { container: service.container, server: service.server } }} />
</div> </div>
</Disclosure.Panel> )}
{service.widget && <Widget service={service} />} {service.container && (
<button
type="button"
onClick={() => (statsOpen ? closeStats() : setStatsOpen(true))}
className="flex-shrink-0 flex items-center justify-center w-12 cursor-pointer"
>
<Status service={service} />
<span className="sr-only">View container stats</span>
</button>
)}
</div> </div>
</Disclosure>
{service.container && service.server && (
<div
className={classNames(
statsOpen && !statsClosing ? "max-h-[55px] opacity-100" : " max-h-[0] opacity-0",
"w-full overflow-hidden transition-all duration-300 ease-in-out"
)}
>
{statsOpen && <Docker service={{ widget: { container: service.container, server: service.server } }} />}
</div>
)}
{service.widget && <Widget service={service} />}
</div>
</li> </li>
); );
} }

View File

@@ -1,8 +1,27 @@
import classNames from "classnames";
import Item from "components/services/item"; import Item from "components/services/item";
export default function List({ services }) { const columnMap = [
"grid-cols-1 md:grid-cols-1 lg:grid-cols-1",
"grid-cols-1 md:grid-cols-1 lg:grid-cols-1",
"grid-cols-1 md:grid-cols-2 lg:grid-cols-2",
"grid-cols-1 md:grid-cols-2 lg:grid-cols-3",
"grid-cols-1 md:grid-cols-2 lg:grid-cols-4",
"grid-cols-1 md:grid-cols-2 lg:grid-cols-5",
"grid-cols-1 md:grid-cols-2 lg:grid-cols-6",
"grid-cols-1 md:grid-cols-2 lg:grid-cols-7",
"grid-cols-1 md:grid-cols-2 lg:grid-cols-8",
];
export default function List({ services, layout }) {
return ( return (
<ul className="mt-3 flex flex-col"> <ul
className={classNames(
layout?.style === "row" ? `grid ${columnMap[layout?.columns]} gap-x-2` : "flex flex-col",
"mt-3"
)}
>
{services.map((service) => ( {services.map((service) => (
<Item key={service.name} service={service} /> <Item key={service.name} service={service} />
))} ))}

View File

@@ -1,66 +1,19 @@
import { useTranslation } from "react-i18next"; import { useTranslation } from "next-i18next";
import Sonarr from "./widgets/service/sonarr"; import ErrorBoundary from "components/errorboundry";
import Radarr from "./widgets/service/radarr"; import components from "widgets/components";
import Lidarr from "./widgets/service/lidarr";
import Readarr from "./widgets/service/readarr";
import Bazarr from "./widgets/service/bazarr";
import Ombi from "./widgets/service/ombi";
import Portainer from "./widgets/service/portainer";
import Emby from "./widgets/service/emby";
import Nzbget from "./widgets/service/nzbget";
import SABnzbd from "./widgets/service/sabnzbd";
import Transmission from "./widgets/service/transmission";
import Docker from "./widgets/service/docker";
import Pihole from "./widgets/service/pihole";
import Rutorrent from "./widgets/service/rutorrent";
import Jellyfin from "./widgets/service/jellyfin";
import Speedtest from "./widgets/service/speedtest";
import Traefik from "./widgets/service/traefik";
import Jellyseerr from "./widgets/service/jellyseerr";
import Overseerr from "./widgets/service/overseerr";
import Npm from "./widgets/service/npm";
import Tautulli from "./widgets/service/tautulli";
import CoinMarketCap from "./widgets/service/coinmarketcap";
import Gotify from "./widgets/service/gotify";
import Prowlarr from "./widgets/service/prowlarr";
import Jackett from "./widgets/service/jackett";
const widgetMappings = {
docker: Docker,
sonarr: Sonarr,
radarr: Radarr,
lidarr: Lidarr,
readarr: Readarr,
bazarr: Bazarr,
ombi: Ombi,
portainer: Portainer,
emby: Emby,
jellyfin: Jellyfin,
nzbget: Nzbget,
sabnzbd: SABnzbd,
transmission: Transmission,
pihole: Pihole,
rutorrent: Rutorrent,
speedtest: Speedtest,
traefik: Traefik,
jellyseerr: Jellyseerr,
overseerr: Overseerr,
coinmarketcap: CoinMarketCap,
npm: Npm,
tautulli: Tautulli,
gotify: Gotify,
prowlarr: Prowlarr,
jackett: Jackett,
};
export default function Widget({ service }) { export default function Widget({ service }) {
const { t } = useTranslation("common"); const { t } = useTranslation("common");
const ServiceWidget = widgetMappings[service.widget.type]; const ServiceWidget = components[service.widget.type];
if (ServiceWidget) { if (ServiceWidget) {
return <ServiceWidget service={service} />; return (
<ErrorBoundary>
<ServiceWidget service={service} />
</ErrorBoundary>
);
} }
return ( return (

View File

@@ -0,0 +1,18 @@
import { useTranslation } from "next-i18next";
import classNames from "classnames";
export default function Block({ value, label }) {
const { t } = useTranslation();
return (
<div
className={classNames(
"bg-theme-200/50 dark:bg-theme-900/20 rounded m-1 flex-1 flex flex-col items-center justify-center p-1",
value === undefined ? "animate-pulse" : ""
)}
>
<div className="font-thin text-sm">{value === undefined || value === null ? "-" : value}</div>
<div className="font-bold text-xs uppercase">{t(label)}</div>
</div>
);
}

View File

@@ -0,0 +1,18 @@
export default function Container({ error = false, children, service }) {
if (error) {
return (
<div className="bg-theme-200/50 dark:bg-theme-900/20 rounded m-1 flex-1 flex flex-col items-center justify-center p-1">
<div className="font-thin text-sm">{error}</div>
</div>
);
}
let visibleChildren = children;
const fields = service?.widget?.fields;
const type = service?.widget?.type;
if (fields && type) {
visibleChildren = children.filter(child => fields.some(field => `${type}.${field}` === child.props?.label));
}
return <div className="relative flex flex-row w-full">{visibleChildren}</div>;
}

View File

@@ -1,8 +0,0 @@
export default function Block({ value, label }) {
return (
<div className="bg-theme-200/50 dark:bg-theme-900/20 rounded m-1 flex-1 flex flex-col items-center justify-center p-1">
<div className="font-thin text-sm">{value === undefined || value === null ? "-" : value}</div>
<div className="font-bold text-xs uppercase">{label}</div>
</div>
);
}

View File

@@ -1,36 +0,0 @@
import useSWR from "swr";
import { useTranslation } from "react-i18next";
import Widget from "../widget";
import Block from "../block";
import { formatApiUrl } from "utils/api-helpers";
export default function Bazarr({ service }) {
const { t } = useTranslation();
const config = service.widget;
const { data: episodesData, error: episodesError } = useSWR(formatApiUrl(config, "episodes"));
const { data: moviesData, error: moviesError } = useSWR(formatApiUrl(config, "movies"));
if (episodesError || moviesError) {
return <Widget error={t("widget.api_error")} />;
}
if (!episodesData || !moviesData) {
return (
<Widget>
<Block label={t("bazarr.missingEpisodes")} />
<Block label={t("bazarr.missingMovies")} />
</Widget>
);
}
return (
<Widget>
<Block label={t("bazarr.missingEpisodes")} value={episodesData.total} />
<Block label={t("bazarr.missingMovies")} value={moviesData.total} />
</Widget>
);
}

View File

@@ -1,63 +0,0 @@
import useSWR from "swr";
import { useTranslation } from "react-i18next";
import Widget from "../widget";
import Block from "../block";
import calculateCPUPercent from "utils/stats-helpers";
export default function Docker({ service }) {
const { t } = useTranslation();
const config = service.widget;
const { data: statusData, error: statusError } = useSWR(
`/api/docker/status/${config.container}/${config.server || ""}`,
{
refreshInterval: 5000,
}
);
const { data: statsData, error: statsError } = useSWR(
`/api/docker/stats/${config.container}/${config.server || ""}`,
{
refreshInterval: 5000,
}
);
if (statsError || statusError) {
return <Widget error={t("widget.api_error")} />;
}
if (statusData && statusData.status !== "running") {
return (
<Widget>
<Block label={t("widget.status")} value={t("docker.offline")} />
</Widget>
);
}
if (!statsData || !statusData) {
return (
<Widget>
<Block label={t("docker.cpu")} />
<Block label={t("docker.mem")} />
<Block label={t("docker.rx")} />
<Block label={t("docker.tx")} />
</Widget>
);
}
return (
<Widget>
<Block label={t("docker.cpu")} value={t("common.percent", { value: calculateCPUPercent(statsData.stats) })} />
<Block label={t("docker.mem")} value={t("common.bytes", { value: statsData.stats.memory_stats.usage })} />
{statsData.stats.networks && (
<>
<Block label={t("docker.rx")} value={t("common.bytes", { value: statsData.stats.networks.eth0.rx_bytes })} />
<Block label={t("docker.tx")} value={t("common.bytes", { value: statsData.stats.networks.eth0.tx_bytes })} />
</>
)}
</Widget>
);
}

View File

@@ -1,29 +0,0 @@
import useSWR from "swr";
import { useTranslation } from "react-i18next";
import Widget from "../widget";
import Block from "../block";
import { formatApiUrl } from "utils/api-helpers";
export default function Gotify({ service }) {
const { t } = useTranslation();
const config = service.widget;
const { data: appsData, error: appsError } = useSWR(formatApiUrl(config, `application`));
const { data: messagesData, error: messagesError } = useSWR(formatApiUrl(config, `message`));
const { data: clientsData, error: clientsError } = useSWR(formatApiUrl(config, `client`));
if (appsError || messagesError || clientsError) {
return <Widget error={t("widget.api_error")} />;
}
return (
<Widget>
<Block label={t("gotify.apps")} value={appsData?.length} />
<Block label={t("gotify.clients")} value={clientsData?.length} />
<Block label={t("gotify.messages")} value={messagesData?.messages?.length} />
</Widget>
);
}

View File

@@ -1,37 +0,0 @@
import useSWR from "swr";
import { useTranslation } from "react-i18next";
import Widget from "../widget";
import Block from "../block";
import { formatApiUrl } from "utils/api-helpers";
export default function Jackett({ service }) {
const { t } = useTranslation();
const config = service.widget;
const { data: indexersData, error: indexersError } = useSWR(formatApiUrl(config, "indexers"));
if (indexersError) {
return <Widget error={t("widget.api_error")} />;
}
if (!indexersData) {
return (
<Widget>
<Block label={t("jackett.configured")} />
<Block label={t("jackett.errored")} />
</Widget>
);
}
const errored = indexersData.filter((indexer) => indexer.last_error);
return (
<Widget>
<Block label={t("jackett.configured")} value={indexersData.length} />
<Block label={t("jackett.errored")} value={errored.length} />
</Widget>
);
}

View File

@@ -1,5 +0,0 @@
import Emby from "./emby";
export default function Jellyfin({ service }) {
return <Emby service={service} />;
}

View File

@@ -1,37 +0,0 @@
import useSWR from "swr";
import { useTranslation } from "react-i18next";
import Widget from "../widget";
import Block from "../block";
import { formatApiUrl } from "utils/api-helpers";
export default function Jellyseerr({ service }) {
const { t } = useTranslation();
const config = service.widget;
const { data: statsData, error: statsError } = useSWR(formatApiUrl(config, `request/count`));
if (statsError) {
return <Widget error={t("widget.api_error")} />;
}
if (!statsData) {
return (
<Widget>
<Block label={t("jellyseerr.pending")} />
<Block label={t("jellyseerr.approved")} />
<Block label={t("jellyseerr.available")} />
</Widget>
);
}
return (
<Widget>
<Block label={t("jellyseerr.pending")} value={statsData.pending} />
<Block label={t("jellyseerr.approved")} value={statsData.approved} />
<Block label={t("jellyseerr.available")} value={statsData.available} />
</Widget>
);
}

View File

@@ -1,41 +0,0 @@
import useSWR from "swr";
import { useTranslation } from "react-i18next";
import Widget from "../widget";
import Block from "../block";
import { formatApiUrl } from "utils/api-helpers";
export default function Lidarr({ service }) {
const { t } = useTranslation();
const config = service.widget;
const { data: albumsData, error: albumsError } = useSWR(formatApiUrl(config, "album"));
const { data: wantedData, error: wantedError } = useSWR(formatApiUrl(config, "wanted/missing"));
const { data: queueData, error: queueError } = useSWR(formatApiUrl(config, "queue/status"));
if (albumsError || wantedError || queueError) {
return <Widget error={t("widget.api_error")} />;
}
if (!albumsData || !wantedData || !queueData) {
return (
<Widget>
<Block label={t("lidarr.wanted")} />
<Block label={t("lidarr.queued")} />
<Block label={t("lidarr.albums")} />
</Widget>
);
}
const have = albumsData.filter((album) => album.statistics.percentOfTracks === 100);
return (
<Widget>
<Block label={t("lidarr.wanted")} value={wantedData.totalRecords} />
<Block label={t("lidarr.queued")} value={queueData.totalCount} />
<Block label={t("lidarr.albums")} value={have.length} />
</Widget>
);
}

View File

@@ -1,41 +0,0 @@
import useSWR from "swr";
import { useTranslation } from "react-i18next";
import Widget from "../widget";
import Block from "../block";
import { formatApiUrl } from "utils/api-helpers";
export default function Npm({ service }) {
const { t } = useTranslation();
const config = service.widget;
const { data: infoData, error: infoError } = useSWR(formatApiUrl(config, "nginx/proxy-hosts"));
if (infoError) {
return <Widget error={t("widget.api_error")} />;
}
if (!infoData) {
return (
<Widget>
<Block label={t("npm.enabled")} />
<Block label={t("npm.disabled")} />
<Block label={t("npm.total")} />
</Widget>
);
}
const enabled = infoData.filter((c) => c.enabled === 1).length;
const disabled = infoData.filter((c) => c.enabled === 0).length;
const total = infoData.length;
return (
<Widget>
<Block label={t("npm.enabled")} value={enabled} />
<Block label={t("npm.disabled")} value={disabled} />
<Block label={t("npm.total")} value={total} />
</Widget>
);
}

View File

@@ -1,43 +0,0 @@
import useSWR from "swr";
import { useTranslation } from "react-i18next";
import Widget from "../widget";
import Block from "../block";
import { formatApiUrl } from "utils/api-helpers";
export default function Nzbget({ service }) {
const { t } = useTranslation("common");
const config = service.widget;
const { data: statusData, error: statusError } = useSWR(formatApiUrl(config, "status"));
if (statusError) {
return <Widget error={t("widget.api_error")} />;
}
if (!statusData) {
return (
<Widget>
<Block label={t("nzbget.rate")} />
<Block label={t("nzbget.remaining")} />
<Block label={t("nzbget.downloaded")} />
</Widget>
);
}
return (
<Widget>
<Block label={t("nzbget.rate")} value={t("common.bitrate", { value: statusData.DownloadRate })} />
<Block
label={t("nzbget.remaining")}
value={t("common.bytes", { value: statusData.RemainingSizeMB * 1024 * 1024 })}
/>
<Block
label={t("nzbget.downloaded")}
value={t("common.bytes", { value: statusData.DownloadedSizeMB * 1024 * 1024 })}
/>
</Widget>
);
}

View File

@@ -1,37 +0,0 @@
import useSWR from "swr";
import { useTranslation } from "react-i18next";
import Widget from "../widget";
import Block from "../block";
import { formatApiUrl } from "utils/api-helpers";
export default function Ombi({ service }) {
const { t } = useTranslation();
const config = service.widget;
const { data: statsData, error: statsError } = useSWR(formatApiUrl(config, `Request/count`));
if (statsError) {
return <Widget error={t("widget.api_error")} />;
}
if (!statsData) {
return (
<Widget>
<Block label={t("ombi.pending")} />
<Block label={t("ombi.approved")} />
<Block label={t("ombi.available")} />
</Widget>
);
}
return (
<Widget>
<Block label={t("ombi.pending")} value={statsData.pending} />
<Block label={t("ombi.approved")} value={statsData.approved} />
<Block label={t("ombi.available")} value={statsData.available} />
</Widget>
);
}

View File

@@ -1,37 +0,0 @@
import useSWR from "swr";
import { useTranslation } from "react-i18next";
import Widget from "../widget";
import Block from "../block";
import { formatApiUrl } from "utils/api-helpers";
export default function Overseerr({ service }) {
const { t } = useTranslation();
const config = service.widget;
const { data: statsData, error: statsError } = useSWR(formatApiUrl(config, `request/count`));
if (statsError) {
return <Widget error={t("widget.api_error")} />;
}
if (!statsData) {
return (
<Widget>
<Block label={t("overseerr.pending")} />
<Block label={t("overseerr.approved")} />
<Block label={t("overseerr.available")} />
</Widget>
);
}
return (
<Widget>
<Block label={t("overseerr.pending")} value={statsData.pending} />
<Block label={t("overseerr.approved")} value={statsData.approved} />
<Block label={t("overseerr.available")} value={statsData.available} />
</Widget>
);
}

View File

@@ -1,37 +0,0 @@
import useSWR from "swr";
import { useTranslation } from "react-i18next";
import Widget from "../widget";
import Block from "../block";
import { formatApiUrl } from "utils/api-helpers";
export default function Pihole({ service }) {
const { t } = useTranslation();
const config = service.widget;
const { data: piholeData, error: piholeError } = useSWR(formatApiUrl(config, "api.php"));
if (piholeError) {
return <Widget error={t("widget.api_error")} />;
}
if (!piholeData) {
return (
<Widget>
<Block label={t("pihole.queries")} />
<Block label={t("pihole.blocked")} />
<Block label={t("pihole.gravity")} />
</Widget>
);
}
return (
<Widget>
<Block label={t("pihole.queries")} value={t("common.number", { value: piholeData.dns_queries_today })} />
<Block label={t("pihole.blocked")} value={t("common.number", { value: piholeData.ads_blocked_today })} />
<Block label={t("pihole.gravity")} value={t("common.number", { value: piholeData.domains_being_blocked })} />
</Widget>
);
}

View File

@@ -1,45 +0,0 @@
import useSWR from "swr";
import { useTranslation } from "react-i18next";
import Widget from "../widget";
import Block from "../block";
import { formatApiUrl } from "utils/api-helpers";
export default function Portainer({ service }) {
const { t } = useTranslation();
const config = service.widget;
const { data: containersData, error: containersError } = useSWR(formatApiUrl(config, `docker/containers/json?all=1`));
if (containersError) {
return <Widget error={t("widget.api_error")} />;
}
if (!containersData) {
return (
<Widget>
<Block label={t("portainer.running")} />
<Block label={t("portainer.stopped")} />
<Block label={t("portainer.total")} />
</Widget>
);
}
if (containersData.error) {
return <Widget error={t("widget.api_error")} />;
}
const running = containersData.filter((c) => c.State === "running").length;
const stopped = containersData.filter((c) => c.State === "exited").length;
const total = containersData.length;
return (
<Widget>
<Block label={t("portainer.running")} value={running} />
<Block label={t("portainer.stopped")} value={stopped} />
<Block label={t("portainer.total")} value={total} />
</Widget>
);
}

View File

@@ -1,55 +0,0 @@
import useSWR from "swr";
import { useTranslation } from "react-i18next";
import Widget from "../widget";
import Block from "../block";
import { formatApiUrl } from "utils/api-helpers";
export default function Prowlarr({ service }) {
const { t } = useTranslation();
const config = service.widget;
const { data: indexersData, error: indexersError } = useSWR(formatApiUrl(config, "indexer"));
const { data: grabsData, error: grabsError } = useSWR(formatApiUrl(config, "indexerstats"));
if (indexersError || grabsError) {
return <Widget error={t("widget.api_error")} />;
}
if (!indexersData || !grabsData) {
return (
<Widget>
<Block label={t("prowlarr.enableIndexers")} />
<Block label={t("prowlarr.numberOfGrabs")} />
<Block label={t("prowlarr.numberOfQueries")} />
<Block label={t("prowlarr.numberOfFailGrabs")} />
<Block label={t("prowlarr.numberOfFailQueries")} />
</Widget>
);
}
const indexers = indexersData?.filter((indexer) => indexer.enable === true);
let numberOfGrabs = 0
let numberOfQueries = 0
let numberOfFailedGrabs = 0
let numberOfFailedQueries = 0
grabsData?.indexers?.forEach(element => {
numberOfGrabs += element.numberOfGrabs;
numberOfQueries += element.numberOfQueries;
numberOfFailedGrabs += numberOfFailedGrabs + element.numberOfFailedGrabs;
numberOfFailedQueries += numberOfFailedQueries + element.numberOfFailedQueries;
});
return (
<Widget>
<Block label={t("prowlarr.enableIndexers")} value={indexers.length} />
<Block label={t("prowlarr.numberOfGrabs")} value={numberOfGrabs} />
<Block label={t("prowlarr.numberOfQueries")} value={numberOfQueries} />
<Block label={t("prowlarr.numberOfFailGrabs")} value={numberOfFailedGrabs} />
<Block label={t("prowlarr.numberOfFailQueries")} value={numberOfFailedQueries} />
</Widget>
);
}

View File

@@ -1,41 +0,0 @@
import useSWR from "swr";
import { useTranslation } from "react-i18next";
import Widget from "../widget";
import Block from "../block";
import { formatApiUrl } from "utils/api-helpers";
export default function Radarr({ service }) {
const { t } = useTranslation();
const config = service.widget;
const { data: moviesData, error: moviesError } = useSWR(formatApiUrl(config, "movie"));
const { data: queuedData, error: queuedError } = useSWR(formatApiUrl(config, "queue/status"));
if (moviesError || queuedError) {
return <Widget error={t("widget.api_error")} />;
}
if (!moviesData || !queuedData) {
return (
<Widget>
<Block label={t("radarr.wanted")} />
<Block label={t("radarr.queued")} />
<Block label={t("radarr.movies")} />
</Widget>
);
}
const wanted = moviesData.filter((movie) => movie.isAvailable === false);
const have = moviesData.filter((movie) => movie.isAvailable === true);
return (
<Widget>
<Block label={t("radarr.wanted")} value={wanted.length} />
<Block label={t("radarr.queued")} value={queuedData.totalCount} />
<Block label={t("radarr.movies")} value={have.length} />
</Widget>
);
}

View File

@@ -1,41 +0,0 @@
import useSWR from "swr";
import { useTranslation } from "react-i18next";
import Widget from "../widget";
import Block from "../block";
import { formatApiUrl } from "utils/api-helpers";
export default function Readarr({ service }) {
const { t } = useTranslation();
const config = service.widget;
const { data: booksData, error: booksError } = useSWR(formatApiUrl(config, "book"));
const { data: wantedData, error: wantedError } = useSWR(formatApiUrl(config, "wanted/missing"));
const { data: queueData, error: queueError } = useSWR(formatApiUrl(config, "queue/status"));
if (booksError || wantedError || queueError) {
return <Widget error={t("widget.api_error")} />;
}
if (!booksData || !wantedData || !queueData) {
return (
<Widget>
<Block label={t("readarr.wanted")} />
<Block label={t("readarr.queued")} />
<Block label={t("readarr.books")} />
</Widget>
);
}
const have = booksData.filter((book) => book.statistics.bookFileCount > 0);
return (
<Widget>
<Block label={t("readarr.wanted")} value={wantedData.totalRecords} />
<Block label={t("readarr.queued")} value={queueData.totalCount} />
<Block label={t("readarr.books")} value={have.length} />
</Widget>
);
}

View File

@@ -1,43 +0,0 @@
import useSWR from "swr";
import { useTranslation } from "react-i18next";
import Widget from "../widget";
import Block from "../block";
import { formatApiUrl } from "utils/api-helpers";
export default function Rutorrent({ service }) {
const { t } = useTranslation();
const config = service.widget;
const { data: statusData, error: statusError } = useSWR(formatApiUrl(config));
if (statusError) {
return <Widget error={t("widget.api_error")} />;
}
if (!statusData) {
return (
<Widget>
<Block label={t("rutorrent.active")} />
<Block label={t("rutorrent.upload")} />
<Block label={t("rutorrent.download")} />
</Widget>
);
}
const upload = statusData.reduce((acc, torrent) => acc + parseInt(torrent["d.get_up_rate"], 10), 0);
const download = statusData.reduce((acc, torrent) => acc + parseInt(torrent["d.get_down_rate"], 10), 0);
const active = statusData.filter((torrent) => torrent["d.get_state"] === "1");
return (
<Widget>
<Block label={t("rutorrent.active")} value={active.length} />
<Block label={t("rutorrent.upload")} value={t("common.bitrate", { value: upload })} />
<Block label={t("rutorrent.download")} value={t("common.bitrate", { value: download })} />
</Widget>
);
}

View File

@@ -1,37 +0,0 @@
import useSWR from "swr";
import { useTranslation } from "react-i18next";
import Widget from "../widget";
import Block from "../block";
import { formatApiUrl } from "utils/api-helpers";
export default function SABnzbd({ service }) {
const { t } = useTranslation();
const config = service.widget;
const { data: queueData, error: queueError } = useSWR(formatApiUrl(config, "queue"));
if (queueError) {
return <Widget error={t("widget.api_error")} />;
}
if (!queueData) {
return (
<Widget>
<Block label={t("sabnzbd.rate")} />
<Block label={t("sabnzbd.queue")} />
<Block label={t("sabnzbd.timeleft")} />
</Widget>
);
}
return (
<Widget>
<Block label={t("sabnzbd.rate")} value={`${queueData.queue.speed}B/s`} />
<Block label={t("sabnzbd.queue")} value={queueData.queue.noofslots} />
<Block label={t("sabnzbd.timeleft")} value={queueData.queue.timeleft} />
</Widget>
);
}

View File

@@ -1,39 +0,0 @@
import useSWR from "swr";
import { useTranslation } from "react-i18next";
import Widget from "../widget";
import Block from "../block";
import { formatApiUrl } from "utils/api-helpers";
export default function Sonarr({ service }) {
const { t } = useTranslation();
const config = service.widget;
const { data: wantedData, error: wantedError } = useSWR(formatApiUrl(config, "wanted/missing"));
const { data: queuedData, error: queuedError } = useSWR(formatApiUrl(config, "queue"));
const { data: seriesData, error: seriesError } = useSWR(formatApiUrl(config, "series"));
if (wantedError || queuedError || seriesError) {
return <Widget error={t("widget.api_error")} />;
}
if (!wantedData || !queuedData || !seriesData) {
return (
<Widget>
<Block label={t("sonarr.wanted")} />
<Block label={t("sonarr.queued")} />
<Block label={t("sonarr.series")} />
</Widget>
);
}
return (
<Widget>
<Block label={t("sonarr.wanted")} value={wantedData.totalRecords} />
<Block label={t("sonarr.queued")} value={queuedData.totalRecords} />
<Block label={t("sonarr.series")} value={seriesData.length} />
</Widget>
);
}

View File

@@ -1,46 +0,0 @@
import useSWR from "swr";
import { useTranslation } from "react-i18next";
import Widget from "../widget";
import Block from "../block";
import { formatApiUrl } from "utils/api-helpers";
export default function Speedtest({ service }) {
const { t } = useTranslation();
const config = service.widget;
const { data: speedtestData, error: speedtestError } = useSWR(formatApiUrl(config, "speedtest/latest"));
if (speedtestError) {
return <Widget error={t("widget.api_error")} />;
}
if (!speedtestData) {
return (
<Widget>
<Block label={t("speedtest.download")} />
<Block label={t("speedtest.upload")} />
<Block label={t("speedtest.ping")} />
</Widget>
);
}
return (
<Widget>
<Block
label={t("speedtest.download")}
value={t("common.bitrate", { value: speedtestData.data.download * 1024 * 1024 })}
/>
<Block
label={t("speedtest.upload")}
value={t("common.bitrate", { value: speedtestData.data.upload * 1024 * 1024 })}
/>
<Block
label={t("speedtest.ping")}
value={t("common.ms", { value: speedtestData.data.ping, style: "unit", unit: "millisecond" })}
/>
</Widget>
);
}

View File

@@ -1,37 +0,0 @@
import useSWR from "swr";
import { useTranslation } from "react-i18next";
import Widget from "../widget";
import Block from "../block";
import { formatApiUrl } from "utils/api-helpers";
export default function Traefik({ service }) {
const { t } = useTranslation();
const config = service.widget;
const { data: traefikData, error: traefikError } = useSWR(formatApiUrl(config, "overview"));
if (traefikError) {
return <Widget error={t("widget.api_error")} />;
}
if (!traefikData) {
return (
<Widget>
<Block label={t("traefik.routers")} />
<Block label={t("traefik.services")} />
<Block label={t("traefik.middleware")} />
</Widget>
);
}
return (
<Widget>
<Block label={t("traefik.routers")} value={traefikData.http.routers.total} />
<Block label={t("traefik.services")} value={traefikData.http.services.total} />
<Block label={t("traefik.middleware")} value={traefikData.http.middlewares.total} />
</Widget>
);
}

View File

@@ -1,70 +0,0 @@
import useSWR from "swr";
import { useTranslation } from "react-i18next";
import Widget from "../widget";
import Block from "../block";
import { formatApiUrl } from "utils/api-helpers";
export default function Transmission({ service }) {
const { t } = useTranslation();
const config = service.widget;
const { data: torrentData, error: torrentError } = useSWR(formatApiUrl(config));
if (torrentError) {
return <Widget error={t("widget.api_error")} />;
}
if (!torrentData) {
return (
<Widget>
<Block label={t("transmission.leech")} />
<Block label={t("transmission.download")} />
<Block label={t("transmission.seed")} />
<Block label={t("transmission.upload")} />
</Widget>
);
}
const { torrents } = torrentData.arguments;
let rateDl = 0;
let rateUl = 0;
let completed = 0;
for (let i = 0; i < torrents.length; i += 1) {
const torrent = torrents[i];
rateDl += torrent.rateDownload;
rateUl += torrent.rateUpload;
if (torrent.percentDone === 1) {
completed += 1;
}
}
const leech = torrents.length - completed;
let unitsDl = "KB/s";
let unitsUl = "KB/s";
rateDl /= 1024;
rateUl /= 1024;
if (rateDl > 1024) {
rateDl /= 1024;
unitsDl = "MB/s";
}
if (rateUl > 1024) {
rateUl /= 1024;
unitsUl = "MB/s";
}
return (
<Widget>
<Block label={t("transmission.leech")} value={leech} />
<Block label={t("transmission.download")} value={`${rateDl.toFixed(2)} ${unitsDl}`} />
<Block label={t("transmission.seed")} value={completed} />
<Block label={t("transmission.upload")} value={`${rateUl.toFixed(2)} ${unitsUl}`} />
</Widget>
);
}

View File

@@ -1,11 +0,0 @@
export default function Widget({ error = false, children }) {
if (error) {
return (
<div className="bg-theme-200/50 dark:bg-theme-900/20 rounded m-1 flex-1 flex flex-col items-center justify-center p-1">
<div className="font-thin text-sm">{error}</div>
</div>
);
}
return <div className="relative flex flex-row w-full">{children}</div>;
}

View File

@@ -3,7 +3,7 @@ import { IoColorPalette } from "react-icons/io5";
import { Popover, Transition } from "@headlessui/react"; import { Popover, Transition } from "@headlessui/react";
import classNames from "classnames"; import classNames from "classnames";
import { ColorContext } from "utils/color-context"; import { ColorContext } from "utils/contexts/color";
const colors = [ const colors = [
"slate", "slate",
@@ -45,6 +45,7 @@ export default function ColorToggle() {
className="h-5 w-5 text-theme-800 dark:text-theme-200 transition duration-150 ease-in-out" className="h-5 w-5 text-theme-800 dark:text-theme-200 transition duration-150 ease-in-out"
aria-hidden="true" aria-hidden="true"
/> />
<span className="sr-only">Change color</span>
</Popover.Button> </Popover.Button>
<Transition <Transition
as={Fragment} as={Fragment}
@@ -61,11 +62,13 @@ export default function ColorToggle() {
{colors.map((color) => ( {colors.map((color) => (
<button type="button" onClick={() => setColor(color)} key={color}> <button type="button" onClick={() => setColor(color)} key={color}>
<div <div
title={color}
className={classNames( className={classNames(
active === color ? "border-2" : "border-0", active === color ? "border-2" : "border-0",
`rounded-md w-5 h-5 border-black/50 dark:border-white/50 theme-${color} bg-theme-400` `rounded-md w-5 h-5 border-black/50 dark:border-white/50 theme-${color} bg-theme-400`
)} )}
/> />
<span className="sr-only">{color}</span>
</button> </button>
))} ))}
</div> </div>

View File

@@ -1,7 +1,7 @@
import { useContext } from "react"; import { useContext } from "react";
import { MdDarkMode, MdLightMode, MdToggleOff, MdToggleOn } from "react-icons/md"; import { MdDarkMode, MdLightMode, MdToggleOff, MdToggleOn } from "react-icons/md";
import { ThemeContext } from "utils/theme-context"; import { ThemeContext } from "utils/contexts/theme";
export default function ThemeToggle() { export default function ThemeToggle() {
const { theme, setTheme } = useContext(ThemeContext); const { theme, setTheme } = useContext(ThemeContext);

View File

@@ -0,0 +1,51 @@
import { useTranslation } from "next-i18next";
import useSWR from "swr";
import { compareVersions } from "compare-versions";
import { MdNewReleases } from "react-icons/md";
import cachedFetch from "utils/proxy/cached-fetch";
export default function Version() {
const { t, i18n } = useTranslation();
const buildTime = process.env.NEXT_PUBLIC_BUILDTIME ?? new Date().toISOString();
const revision = process.env.NEXT_PUBLIC_REVISION ?? "dev";
const version = process.env.NEXT_PUBLIC_VERSION ?? "dev";
const cachedFetcher = (resource) => cachedFetch(resource, 5).then((res) => res.json());
const { data: releaseData } = useSWR("https://api.github.com/repos/benphelps/homepage/releases", cachedFetcher);
// use Intl.DateTimeFormat to format the date
const formatDate = (date) => {
const options = {
year: "numeric",
month: "short",
day: "numeric",
};
return new Intl.DateTimeFormat(i18n.language, options).format(new Date(date));
};
const latestRelease = releaseData?.[0];
return (
<div className="flex flex-row items-center">
<span className="text-xs text-theme-500 dark:text-theme-400">
{version} ({revision.substring(0, 7)}, {formatDate(buildTime)})
</span>
{version === "main" || version === "dev" || version === "nightly"
? null
: releaseData &&
compareVersions(latestRelease.tag_name, version) > 0 && (
<a
href={latestRelease.html_url}
target="_blank"
rel="noopener noreferrer"
className="ml-2 text-xs text-theme-500 dark:text-theme-400 flex flex-row items-center"
>
<MdNewReleases className="mr-1" /> {t("Update Available")}
</a>
)}
</div>
);
}

View File

@@ -1,26 +0,0 @@
import WeatherApi from "components/widgets/weather/weather";
import OpenWeatherMap from "components/widgets/openweathermap/weather";
import Resources from "components/widgets/resources/resources";
import Search from "components/widgets/search/search";
const widgetMappings = {
weather: WeatherApi, // This key will be deprecated in the future
weatherapi: WeatherApi,
openweathermap: OpenWeatherMap,
resources: Resources,
search: Search,
};
export default function Widget({ widget }) {
const ServiceWidget = widgetMappings[widget.type];
if (ServiceWidget) {
return <ServiceWidget options={widget.options} />;
}
return (
<div className="flex-none flex flex-row items-center justify-center">
Missing <strong>{widget.type}</strong>
</div>
);
}

View File

@@ -0,0 +1,36 @@
import { useState, useEffect } from "react";
import { useTranslation } from "next-i18next";
const textSizes = {
"4xl": "text-4xl",
"3xl": "text-3xl",
"2xl": "text-2xl",
xl: "text-xl",
lg: "text-lg",
md: "text-md",
sm: "text-sm",
xs: "text-xs",
};
export default function DateTime({ options }) {
const { text_size: textSize, format } = options;
const { i18n } = useTranslation();
const [date, setDate] = useState(new Date());
useEffect(() => {
const interval = setInterval(() => {
setDate(new Date());
}, 1000);
return () => clearInterval(interval);
}, [setDate]);
const dateFormat = new Intl.DateTimeFormat(i18n.language, { ...format });
return (
<div className="flex flex-row items-center grow justify-end">
<span className={`text-theme-800 dark:text-theme-200 ${textSizes[textSize || "lg"]}`}>
{dateFormat.format(date)}
</span>
</div>
);
}

View File

@@ -0,0 +1,110 @@
import useSWR from "swr";
import { BiError } from "react-icons/bi";
import { FaMemory } from "react-icons/fa";
import { FiCpu } from "react-icons/fi";
import { useTranslation } from "next-i18next";
import UsageBar from "../resources/usage-bar";
export default function Widget({ options }) {
const { t, i18n } = useTranslation();
const { data, error } = useSWR(
`/api/widgets/glances?${new URLSearchParams({ lang: i18n.language, ...options }).toString()}`, {
refreshInterval: 1500,
}
);
if (error || data?.error) {
return (
<div className="flex flex-col justify-center first:ml-0 ml-4">
<div className="flex flex-row items-center justify-end">
<div className="flex flex-row items-center">
<BiError className="w-8 h-8 text-theme-800 dark:text-theme-200" />
<div className="flex flex-col ml-3 text-left">
<span className="text-theme-800 dark:text-theme-200 text-sm">{t("widget.api_error")}</span>
</div>
</div>
</div>
</div>
);
}
if (!data) {
return (
<div className="flex flex-col max-w:full sm:basis-auto self-center grow-0 flex-wrap ml-4">
<div className="flex flex-row self-center flex-wrap justify-between">
<div className="flex-none flex flex-row items-center mr-3 py-1.5">
<FiCpu className="text-theme-800 dark:text-theme-200 w-5 h-5" />
<div className="flex flex-col ml-3 text-left min-w-[85px]">
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5 text-xs">
{t("glances.wait")}
</div>
</div>
<UsageBar percent="0" />
</div>
</div>
<div className="flex-none flex flex-row items-center mr-3 py-1.5">
<FaMemory className="text-theme-800 dark:text-theme-200 w-5 h-5" />
<div className="flex flex-col ml-3 text-left min-w-[85px]">
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5 text-xs">
{t("glances.wait")}
</div>
</div>
<UsageBar percent="0" />
</div>
</div>
</div>
{options.label && (
<div className="ml-6 pt-1 text-center text-theme-800 dark:text-theme-200 text-xs">{options.label}</div>
)}
</div>
);
}
return (
<div className="flex flex-col max-w:full sm:basis-auto self-center grow-0 flex-wrap ml-4">
<div className="flex flex-row self-center flex-wrap justify-between">
<div className="flex-none flex flex-row items-center mr-3 py-1.5">
<FiCpu className="text-theme-800 dark:text-theme-200 w-5 h-5" />
<div className="flex flex-col ml-3 text-left min-w-[85px]">
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5">
{t("common.number", {
value: data.cpu,
style: "unit",
unit: "percent",
maximumFractionDigits: 0,
})}
</div>
<div className="pr-1">{t("glances.cpu")}</div>
</div>
<UsageBar percent={data.cpu} />
</div>
</div>
<div className="flex-none flex flex-row items-center mr-3 py-1.5">
<FaMemory className="text-theme-800 dark:text-theme-200 w-5 h-5" />
<div className="flex flex-col ml-3 text-left min-w-[85px]">
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5">
{t("common.number", {
value: data.mem,
style: "unit",
unit: "percent",
maximumFractionDigits: 0,
})}
</div>
<div className="pr-1">{t("glances.mem")}</div>
</div>
<UsageBar percent={data.mem} />
</div>
</div>
</div>
{options.label && (
<div className="pt-1 text-center text-theme-800 dark:text-theme-200 text-xs">{options.label}</div>
)}
</div>
);
}

View File

@@ -0,0 +1,22 @@
const textSizes = {
"4xl": "text-4xl",
"3xl": "text-3xl",
"2xl": "text-2xl",
xl: "text-xl",
lg: "text-lg",
md: "text-md",
sm: "text-sm",
xs: "text-xs",
};
export default function Greeting({ options }) {
if (options.text) {
return (
<div className="flex flex-row items-center justify-start">
<span className={`text-theme-800 dark:text-theme-200 ${textSizes[options.text_size || "xl"]}`}>
{options.text}
</span>
</div>
);
}
}

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