mirror of
https://github.com/gethomepage/homepage.git
synced 2025-12-07 09:35:54 -08:00
Compare commits
239 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f8a0c69e4b | ||
|
|
b9b989fd11 | ||
|
|
3cbfd10df7 | ||
|
|
58fa62f926 | ||
|
|
15cd1bba5c | ||
|
|
bef2da4f96 | ||
|
|
4b1fd17e61 | ||
|
|
d501904913 | ||
|
|
e57b5c9af9 | ||
|
|
9ab9854c2c | ||
|
|
e195cc5276 | ||
|
|
bfa1e4ca5b | ||
|
|
6041e7349f | ||
|
|
eb04581a0e | ||
|
|
b70ab6ee27 | ||
|
|
5e0dbdb9ec | ||
|
|
30cb733dc9 | ||
|
|
471246a3ca | ||
|
|
b99fa9e140 | ||
|
|
eb6ac8f18d | ||
|
|
e4a980a222 | ||
|
|
3f608e52b5 | ||
|
|
8749c655d5 | ||
|
|
67ff299e1c | ||
|
|
ada3c9df0d | ||
|
|
f385c9ea9f | ||
|
|
608dcb05fc | ||
|
|
5a65b5a052 | ||
|
|
4dfa04251c | ||
|
|
393602eff7 | ||
|
|
1ec665ecf7 | ||
|
|
33c0d917fb | ||
|
|
165592b9be | ||
|
|
00bd1eee9a | ||
|
|
3591e46f0f | ||
|
|
fdbd5506a1 | ||
|
|
995ad4b59a | ||
|
|
c598fefde8 | ||
|
|
d8baad453f | ||
|
|
a5747c34b8 | ||
|
|
153dcf398e | ||
|
|
f53f975669 | ||
|
|
10097ab4fc | ||
|
|
95b416c243 | ||
|
|
3f0dcaff68 | ||
|
|
2da96f8610 | ||
|
|
2f2efb224f | ||
|
|
120566e22a | ||
|
|
a035ff2181 | ||
|
|
7c31c891a5 | ||
|
|
1c4814f7bf | ||
|
|
20a78af1f6 | ||
|
|
1ef7cb90e8 | ||
|
|
773b8ba7f4 | ||
|
|
19d329c53f | ||
|
|
14044aa64e | ||
|
|
73cc4f9b5f | ||
|
|
ba53edd1b7 | ||
|
|
9f4965141d | ||
|
|
4af9a611a3 | ||
|
|
d51fbc5f6d | ||
|
|
409e481b8c | ||
|
|
cf54837d05 | ||
|
|
292f7a64d8 | ||
|
|
4dfb1a1c5e | ||
|
|
098eec96e2 | ||
|
|
80834b6f30 | ||
|
|
8ae54777f6 | ||
|
|
ff1129ecd7 | ||
|
|
093c523ae6 | ||
|
|
9f2348ad39 | ||
|
|
7b2fb0279a | ||
|
|
9f67e82817 | ||
|
|
3d6821a463 | ||
|
|
43c4effc42 | ||
|
|
1830b7f277 | ||
|
|
bc2492c773 | ||
|
|
3bb18a746b | ||
|
|
baf40600dc | ||
|
|
a226f9de12 | ||
|
|
551f521edd | ||
|
|
b96045eb8c | ||
|
|
be5f1dd8e1 | ||
|
|
5aa88fcf06 | ||
|
|
876ddc8302 | ||
|
|
eaada4a406 | ||
|
|
91017fe71c | ||
|
|
6987f96d1d | ||
|
|
dec63583c8 | ||
|
|
9477dd1f3c | ||
|
|
b953c1089a | ||
|
|
2acceff22e | ||
|
|
701b97c1f8 | ||
|
|
5e917822c9 | ||
|
|
4b9f3c1e15 | ||
|
|
9314ac4760 | ||
|
|
5dd7094815 | ||
|
|
ff385b462a | ||
|
|
5addfc6ea8 | ||
|
|
397a340c47 | ||
|
|
0b75d07a2b | ||
|
|
6f434bbedd | ||
|
|
e91efab940 | ||
|
|
d737c57278 | ||
|
|
63c1a8e409 | ||
|
|
a15a264912 | ||
|
|
08b9b52f09 | ||
|
|
9a47a8517c | ||
|
|
405b00fbd8 | ||
|
|
02becf7dcf | ||
|
|
490e88a34a | ||
|
|
8f58132da1 | ||
|
|
ecddc5e1c8 | ||
|
|
e297caf516 | ||
|
|
cbc496c81f | ||
|
|
ea6c4ab0c2 | ||
|
|
46d4b3e19e | ||
|
|
11ae52df4a | ||
|
|
77e02e6729 | ||
|
|
58e8109856 | ||
|
|
52f15ab834 | ||
|
|
4cdf7317ec | ||
|
|
05818b5d1d | ||
|
|
d2a2fd99cc | ||
|
|
486b376dca | ||
|
|
2fae4acd4a | ||
|
|
2b20e2e17f | ||
|
|
cc0f2ca083 | ||
|
|
263cf6d6b1 | ||
|
|
72f4506f06 | ||
|
|
2183bf623f | ||
|
|
17ac3008aa | ||
|
|
db07b3e7a1 | ||
|
|
1b1b671080 | ||
|
|
ca295e0850 | ||
|
|
ec3fd692a8 | ||
|
|
9deaa48144 | ||
|
|
c725f9af38 | ||
|
|
4d3864c2ec | ||
|
|
8d69ab33aa | ||
|
|
fdc975d6df | ||
|
|
d4b7de9d0d | ||
|
|
4daa33ea63 | ||
|
|
10adefe2b4 | ||
|
|
4198fcf6b6 | ||
|
|
9466b652b9 | ||
|
|
f4a1700dc5 | ||
|
|
c1552228bf | ||
|
|
1106107094 | ||
|
|
b5e218bb1d | ||
|
|
d015ae1089 | ||
|
|
0eb7c77892 | ||
|
|
a3b2321837 | ||
|
|
f9f9f68c71 | ||
|
|
2e728aa207 | ||
|
|
f71f15bbf4 | ||
|
|
8037e78725 | ||
|
|
3878dd57a3 | ||
|
|
1411ab99a0 | ||
|
|
5f92a3084c | ||
|
|
a4ede7f8d7 | ||
|
|
f50f5c130e | ||
|
|
17ebdd8226 | ||
|
|
c2983197a0 | ||
|
|
e311866969 | ||
|
|
879da993b8 | ||
|
|
204e4ebac0 | ||
|
|
ff567bd543 | ||
|
|
b75d34d8c7 | ||
|
|
3a6be33c98 | ||
|
|
4c69d65e57 | ||
|
|
6678614e9c | ||
|
|
8971dc3169 | ||
|
|
c87618a9bb | ||
|
|
e84a3fa7dc | ||
|
|
4fc5a11a88 | ||
|
|
9a894b49d1 | ||
|
|
a778b5daed | ||
|
|
35e71a7ffd | ||
|
|
2312ca86ef | ||
|
|
aabe51ab7e | ||
|
|
0bdc22a4ff | ||
|
|
0e285a3d89 | ||
|
|
5c03482924 | ||
|
|
4b340c0167 | ||
|
|
459d3473fc | ||
|
|
e3fe95c2c2 | ||
|
|
2182412548 | ||
|
|
1b3e6fc289 | ||
|
|
5989e1dc52 | ||
|
|
4afd53f685 | ||
|
|
05ab215fd7 | ||
|
|
cb637e25ed | ||
|
|
449e393480 | ||
|
|
009fe33b9f | ||
|
|
d543430b06 | ||
|
|
18afde8478 | ||
|
|
2d7d082c3d | ||
|
|
52489c47f2 | ||
|
|
5b8972812d | ||
|
|
f851085ebf | ||
|
|
aee8ba1e1d | ||
|
|
c7a10cf204 | ||
|
|
d5af3140d5 | ||
|
|
2c8a120c9e | ||
|
|
36aed7b6cc | ||
|
|
c08272d7ed | ||
|
|
c93dd4d524 | ||
|
|
551bd5b07e | ||
|
|
9144a17b83 | ||
|
|
833cb2b32d | ||
|
|
276d14971e | ||
|
|
46163338c4 | ||
|
|
ea22bfca90 | ||
|
|
3ab248081e | ||
|
|
d9d277d161 | ||
|
|
a4e76d6fb3 | ||
|
|
f271be8848 | ||
|
|
3cf8cc3be5 | ||
|
|
0a553a3552 | ||
|
|
4c69351026 | ||
|
|
eb06e6563f | ||
|
|
9f16ff0e65 | ||
|
|
07c0978b6f | ||
|
|
07c84b349b | ||
|
|
212ee29cb5 | ||
|
|
b6fb6c9b57 | ||
|
|
25ce2437de | ||
|
|
34c6fe15cb | ||
|
|
2f3896a55d | ||
|
|
d6182ea641 | ||
|
|
01b08e4902 | ||
|
|
541d5a9f93 | ||
|
|
02dfbc193d | ||
|
|
2ed4ac8b77 | ||
|
|
4c17e3fd14 | ||
|
|
893b3f0986 | ||
|
|
e62952c2c1 | ||
|
|
2b3d4b388a |
@@ -22,7 +22,8 @@
|
||||
"total": "المجموع",
|
||||
"free": "متاح",
|
||||
"used": "مستخدم",
|
||||
"load": "الضغط"
|
||||
"load": "الضغط",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "المستخدمون",
|
||||
@@ -38,7 +39,8 @@
|
||||
"wlan_users": "WLAN مستخدمين",
|
||||
"up": "يعمل",
|
||||
"down": "لا يعمل",
|
||||
"wait": "الرجاء الإنتظار"
|
||||
"wait": "الرجاء الإنتظار",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"wmo": {
|
||||
"73-day": "ثلج",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"volumeAvailable": "Available",
|
||||
"uptime": "Uptime"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +32,8 @@
|
||||
"total": "Общо",
|
||||
"free": "Свободни",
|
||||
"used": "Заети",
|
||||
"load": "Натоварване"
|
||||
"load": "Натоварване",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Потребители",
|
||||
@@ -48,7 +49,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Devices",
|
||||
"lan_devices": "LAN Devices",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
"wlan_devices": "WLAN Devices",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"docker": {
|
||||
"offline": "Изключен",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"down": "Sites Down",
|
||||
"up": "Sites Up",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,7 +38,8 @@
|
||||
"free": "Lliure",
|
||||
"used": "Utilitzat",
|
||||
"load": "Càrrega",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "Rebut",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Dispositius",
|
||||
"lan_devices": "Dispositius LAN",
|
||||
"wlan_devices": "Dispositius WLAN"
|
||||
"wlan_devices": "Dispositius WLAN",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Transmissions actives",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"m": "m",
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,7 +34,8 @@
|
||||
"total": "Celkem",
|
||||
"free": "Volné",
|
||||
"used": "Využité",
|
||||
"load": "Vytížení"
|
||||
"load": "Vytížení",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Uživatelé",
|
||||
@@ -50,7 +51,8 @@
|
||||
"wlan_users": "WLAN Uživatelé",
|
||||
"up": "BĚŽÍ",
|
||||
"down": "NEBĚŽÍ",
|
||||
"wait": "Počkejte prosím"
|
||||
"wait": "Počkejte prosím",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -159,7 +159,8 @@
|
||||
"total": "Total",
|
||||
"free": "Fri",
|
||||
"used": "Brugt",
|
||||
"load": "Belastning"
|
||||
"load": "Belastning",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Brugere",
|
||||
@@ -175,7 +176,8 @@
|
||||
"wlan_users": "WLAN Brugere",
|
||||
"up": "Oppe",
|
||||
"down": "NED",
|
||||
"wait": "Vent venligst"
|
||||
"wait": "Vent venligst",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"docker": {
|
||||
"cpu": "CPU",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,8 @@
|
||||
"free": "Frei",
|
||||
"used": "Gebraucht",
|
||||
"load": "Last",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "Rx",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Geräte",
|
||||
"lan_devices": "LAN-Geräte",
|
||||
"wlan_devices": "WLAN Geräte"
|
||||
"wlan_devices": "WLAN Geräte",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Aktive Streams",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
},
|
||||
"resources": {
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM",
|
||||
"total": "Total",
|
||||
"free": "Free",
|
||||
"used": "Used",
|
||||
@@ -51,7 +52,8 @@
|
||||
"wlan_users": "WLAN Users",
|
||||
"up": "UP",
|
||||
"down": "DOWN",
|
||||
"wait": "Please wait"
|
||||
"wait": "Please wait",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -454,5 +456,26 @@
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
}
|
||||
}
|
||||
@@ -22,7 +22,8 @@
|
||||
"total": "Totalo",
|
||||
"free": "Libera",
|
||||
"used": "Uzata",
|
||||
"load": "Ŝarĝo"
|
||||
"load": "Ŝarĝo",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Uzantoj",
|
||||
@@ -38,7 +39,8 @@
|
||||
"wlan_users": "WLAN Users",
|
||||
"up": "UP",
|
||||
"down": "DOWN",
|
||||
"wait": "Please wait"
|
||||
"wait": "Please wait",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,8 @@
|
||||
"free": "Libre",
|
||||
"used": "Usado",
|
||||
"load": "Carga",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "Recibido",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Dispositivos",
|
||||
"lan_devices": "Dispositivos LAN",
|
||||
"wlan_devices": "Dispositivos WLAN"
|
||||
"wlan_devices": "Dispositivos WLAN",
|
||||
"empty_data": "Se desconoce el estado del subsistema"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Transmisiones activas",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Fotos",
|
||||
"videos": "Vídeos",
|
||||
"storage": "Almacenamiento"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Páginas web activas",
|
||||
"down": "Páginas web inactivas",
|
||||
"uptime": "Disponibilidad",
|
||||
"incident": "Incidencia",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Librerías",
|
||||
"series": "Series",
|
||||
"books": "Libros"
|
||||
},
|
||||
"mylar": {
|
||||
"issues": "Cuestiones",
|
||||
"series": "Series",
|
||||
"wanted": "Buscado"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Álbumes",
|
||||
"photos": "Fotos",
|
||||
"videos": "Vídeos",
|
||||
"people": "Personas"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,8 @@
|
||||
"total": "Yhteensä",
|
||||
"free": "Vapaana",
|
||||
"used": "Käytetty",
|
||||
"load": "Kuorma"
|
||||
"load": "Kuorma",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -203,7 +204,8 @@
|
||||
"lan_devices": "LAN Devices",
|
||||
"lan": "LAN",
|
||||
"wlan": "WLAN",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
"wlan_devices": "WLAN Devices",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,8 @@
|
||||
"free": "Libre",
|
||||
"used": "Utilisé",
|
||||
"load": "Charge",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "Rx",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Équipt.",
|
||||
"lan_devices": "Équipt. LAN",
|
||||
"wlan_devices": "Équipt. WLAN"
|
||||
"wlan_devices": "Équipt. WLAN",
|
||||
"empty_data": "Statut sous-système inconnu"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Flux actif",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Vidéos",
|
||||
"storage": "Stockage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "En ligne",
|
||||
"down": "Hors ligne",
|
||||
"uptime": "Dispo.",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Librairies",
|
||||
"series": "Séries",
|
||||
"books": "Livres"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Séries",
|
||||
"issues": "Issues",
|
||||
"wanted": "Demande"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Vidéos",
|
||||
"people": "Personnes"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,8 @@
|
||||
"free": "פנוי",
|
||||
"used": "בשימוש",
|
||||
"load": "עומס",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Devices",
|
||||
"lan_devices": "LAN Devices",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
"wlan_devices": "WLAN Devices",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,7 +56,8 @@
|
||||
"total": "Total",
|
||||
"free": "Free",
|
||||
"used": "Used",
|
||||
"load": "Load"
|
||||
"load": "Load",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Users",
|
||||
@@ -72,7 +73,8 @@
|
||||
"wlan_users": "WLAN Users",
|
||||
"up": "UP",
|
||||
"down": "DOWN",
|
||||
"wait": "Please wait"
|
||||
"wait": "Please wait",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,8 @@
|
||||
"free": "Slobodno",
|
||||
"used": "Korišteno",
|
||||
"load": "Opterećenje",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"sabnzbd": {
|
||||
"rate": "Stopa",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Uređaji",
|
||||
"lan_devices": "LAN uređaji",
|
||||
"wlan_devices": "WLAN uređaji"
|
||||
"wlan_devices": "WLAN uređaji",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Aktivni prijenosi",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"videos": "Videos",
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
"free": "Szabad",
|
||||
"used": "Használt",
|
||||
"load": "Terhelés",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Devices",
|
||||
"lan_devices": "LAN Devices",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
"wlan_devices": "WLAN Devices",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,7 +52,8 @@
|
||||
"free": "Libero",
|
||||
"used": "In utilizzo",
|
||||
"load": "Carico",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"rutorrent": {
|
||||
"active": "Attivo",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Dispositivi",
|
||||
"lan_devices": "Dispositivi LAN",
|
||||
"wlan_devices": "Dispositivi WLAN"
|
||||
"wlan_devices": "Dispositivi WLAN",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Trasmissioni attive",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,7 +57,8 @@
|
||||
"total": "Total",
|
||||
"free": "Free",
|
||||
"used": "Used",
|
||||
"load": "Load"
|
||||
"load": "Load",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Users",
|
||||
@@ -73,7 +74,8 @@
|
||||
"wlan_users": "WLAN Users",
|
||||
"up": "UP",
|
||||
"down": "DOWN",
|
||||
"wait": "Please wait"
|
||||
"wait": "Please wait",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,7 +26,8 @@
|
||||
"total": "Kopā",
|
||||
"free": "Brīvs",
|
||||
"used": "Izmantojas",
|
||||
"load": "Ielādē"
|
||||
"load": "Ielādē",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Lietotāji",
|
||||
@@ -42,7 +43,8 @@
|
||||
"wlan_users": "WLAN lietotāji",
|
||||
"up": "DARBOJAS",
|
||||
"down": "NEDARBOJAS",
|
||||
"wait": "Lūdzu, uzgaidiet"
|
||||
"wait": "Lūdzu, uzgaidiet",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
"total": "Jumlah",
|
||||
"free": "Bebas",
|
||||
"used": "Telah diguna",
|
||||
"load": "Beban"
|
||||
"load": "Beban",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"unifi": {
|
||||
"uptime": "Masa Operasi Sistem",
|
||||
@@ -20,7 +21,8 @@
|
||||
"wlan_users": "Pengguna WLAN",
|
||||
"up": "HIDUP",
|
||||
"down": "MATI",
|
||||
"wait": "Sila tunggu"
|
||||
"wait": "Sila tunggu",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"lidarr": {
|
||||
"queued": "Dibaris Gilir",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,8 @@
|
||||
"free": "Ledig",
|
||||
"used": "Brukt",
|
||||
"load": "Last inn",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "Mottatt",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Devices",
|
||||
"lan_devices": "LAN Devices",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
"wlan_devices": "WLAN Devices",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,8 @@
|
||||
"free": "Vrij",
|
||||
"used": "Gebruikt",
|
||||
"load": "Laadt",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Apparaten",
|
||||
"lan_devices": "LAN Apparaten",
|
||||
"wlan_devices": "WLAN Apparaten"
|
||||
"wlan_devices": "WLAN Apparaten",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"wanted": "Wanted",
|
||||
"series": "Series",
|
||||
"issues": "Issues"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,8 @@
|
||||
"load": "Obciążenie",
|
||||
"total": "Całkowite",
|
||||
"free": "Wolne",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"emby": {
|
||||
"no_active": "Brak aktywnych strumieni",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Urządzenia",
|
||||
"lan_devices": "Urządzenia LAN",
|
||||
"wlan_devices": "Urządzenia WLAN"
|
||||
"wlan_devices": "Urządzenia WLAN",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Aktywne strumienie",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available",
|
||||
"days": "Days"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,7 +50,8 @@
|
||||
"free": "Livre",
|
||||
"used": "Usado",
|
||||
"load": "Carregamento",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "Recebido",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Dispositivos",
|
||||
"lan_devices": "Dispositivos LAN",
|
||||
"wlan_devices": "Dispositivos WLAN"
|
||||
"wlan_devices": "Dispositivos WLAN",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Transmissões ativas",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"videos": "Videos",
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,8 @@
|
||||
"free": "Livre",
|
||||
"used": "Utilizado",
|
||||
"load": "Carga",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "Rx",
|
||||
@@ -216,7 +217,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Dispositivos",
|
||||
"lan_devices": "Dispositivos LAN",
|
||||
"wlan_devices": "Dispositivos WLAN"
|
||||
"wlan_devices": "Dispositivos WLAN",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Streams Ativas",
|
||||
@@ -447,5 +449,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
"load": "Sarcină",
|
||||
"total": "Total",
|
||||
"free": "Disponibili",
|
||||
"cpu": "Procesor"
|
||||
"cpu": "Procesor",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Devices",
|
||||
"lan_devices": "LAN Devices",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
"wlan_devices": "WLAN Devices",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Fluxuri active",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,8 @@
|
||||
"free": "Свободно",
|
||||
"used": "Использовано",
|
||||
"load": "Загрузка",
|
||||
"cpu": "Процессор"
|
||||
"cpu": "Процессор",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "Rx",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Устройства",
|
||||
"lan_devices": "Устройства подключённые по LAN",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
"wlan_devices": "WLAN Devices",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,8 @@
|
||||
"total": "Total",
|
||||
"free": "Free",
|
||||
"used": "Used",
|
||||
"load": "Load"
|
||||
"load": "Load",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Users",
|
||||
@@ -38,7 +39,8 @@
|
||||
"wlan_users": "WLAN Users",
|
||||
"up": "UP",
|
||||
"down": "DOWN",
|
||||
"wait": "Please wait"
|
||||
"wait": "Please wait",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,7 +19,8 @@
|
||||
"total": "Total",
|
||||
"free": "Ledigt",
|
||||
"used": "Använt",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Devices",
|
||||
"lan_devices": "LAN Devices",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
"wlan_devices": "WLAN Devices",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Aktiva strömmar",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,7 +39,8 @@
|
||||
"total": "మొత్తం",
|
||||
"free": "మిగిలింది",
|
||||
"used": "ఉపయోగించబడిన",
|
||||
"load": "లోడ్"
|
||||
"load": "లోడ్",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "పరికరాలు",
|
||||
"lan_devices": "LAN పరికరాలు",
|
||||
"wlan_devices": "WLAN పరికరాలు"
|
||||
"wlan_devices": "WLAN పరికరాలు",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "యాక్టివ్ స్ట్రీమ్లు",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,8 @@
|
||||
"total": "Toplam",
|
||||
"free": "Boşta",
|
||||
"used": "Kullanımda",
|
||||
"load": "Yük"
|
||||
"load": "Yük",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Kullanıcılar",
|
||||
@@ -38,7 +39,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Aygıtlar",
|
||||
"lan_devices": "LAN Aygıtları",
|
||||
"wlan_devices": "WLAN Aygıtları"
|
||||
"wlan_devices": "WLAN Aygıtları",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "Gelen Veri",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -127,7 +127,8 @@
|
||||
"total": "Всього",
|
||||
"free": "Вільно",
|
||||
"used": "Використано",
|
||||
"load": "Навантаження"
|
||||
"load": "Навантаження",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Користувачі",
|
||||
@@ -143,7 +144,8 @@
|
||||
"wlan_users": "WLAN користувачі",
|
||||
"up": "Відправка",
|
||||
"down": "Завантаження",
|
||||
"wait": "Будь ласка, зачекайте"
|
||||
"wait": "Будь ласка, зачекайте",
|
||||
"empty_data": "Статус підсистеми невідомий"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Фотографії",
|
||||
"videos": "Відео",
|
||||
"storage": "Сховище"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Активні сайти",
|
||||
"down": "Неактивні сайти",
|
||||
"uptime": "Час роботи",
|
||||
"incident": "Інцидент",
|
||||
"m": "хв"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Бібліотеки",
|
||||
"series": "Серії",
|
||||
"books": "Книжки"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Серії",
|
||||
"issues": "Питання",
|
||||
"wanted": "Розшукується"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Альбоми",
|
||||
"photos": "Фото",
|
||||
"videos": "Відео",
|
||||
"people": "Люди"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,8 @@
|
||||
"free": "Dư",
|
||||
"used": "Đã dùng",
|
||||
"load": "Load",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Devices",
|
||||
"lan_devices": "LAN Devices",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
"wlan_devices": "WLAN Devices",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People",
|
||||
"albums": "Albums"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,7 +40,8 @@
|
||||
"free": "剩餘",
|
||||
"used": "用咗",
|
||||
"load": "負荷",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "接收",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Devices",
|
||||
"lan_devices": "LAN Devices",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
"wlan_devices": "WLAN Devices",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,8 @@
|
||||
"free": "空闲",
|
||||
"used": "已用",
|
||||
"load": "负载",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "接收",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "无线局域网",
|
||||
"devices": "设备",
|
||||
"lan_devices": "局域网设备",
|
||||
"wlan_devices": "无线局域网设备"
|
||||
"wlan_devices": "无线局域网设备",
|
||||
"empty_data": "子系统状态未知"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "活动流",
|
||||
@@ -438,5 +440,33 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available",
|
||||
"days": "Days"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
"api_error": "API錯誤",
|
||||
"status": "狀態",
|
||||
"information": "資訊",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
"url": "網址",
|
||||
"raw_error": "原始錯誤",
|
||||
"response_data": "回復數據"
|
||||
},
|
||||
"weather": {
|
||||
"current": "目前位置",
|
||||
@@ -36,9 +36,9 @@
|
||||
"no_active": "無播放活動"
|
||||
},
|
||||
"jellyseerr": {
|
||||
"pending": "待定",
|
||||
"approved": "已接受",
|
||||
"available": "可用的"
|
||||
"pending": "待下載",
|
||||
"approved": "已核准",
|
||||
"available": "可觀看"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "搜尋…"
|
||||
@@ -48,7 +48,8 @@
|
||||
"free": "剩餘",
|
||||
"used": "已使用",
|
||||
"load": "負載",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"nzbget": {
|
||||
"rate": "速率",
|
||||
@@ -82,14 +83,14 @@
|
||||
"books": "書籍"
|
||||
},
|
||||
"ombi": {
|
||||
"pending": "待定",
|
||||
"approved": "已接受",
|
||||
"available": "可用的"
|
||||
"pending": "待下載",
|
||||
"approved": "已核准",
|
||||
"available": "可觀看"
|
||||
},
|
||||
"overseerr": {
|
||||
"pending": "待定",
|
||||
"approved": "已接受",
|
||||
"available": "可用的",
|
||||
"pending": "待下載",
|
||||
"approved": "已核准",
|
||||
"available": "可觀看",
|
||||
"processing": "處理中"
|
||||
},
|
||||
"pihole": {
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "設備",
|
||||
"lan_devices": "LAN設備",
|
||||
"wlan_devices": "WLAN設備"
|
||||
"wlan_devices": "WLAN設備",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "正在播放",
|
||||
@@ -280,8 +282,8 @@
|
||||
"quicklaunch": {
|
||||
"bookmark": "書籤",
|
||||
"service": "服務",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
"search": "搜尋",
|
||||
"custom": "自訂"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "系統",
|
||||
@@ -292,7 +294,7 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "接受",
|
||||
"approvedPushes": "已核准",
|
||||
"rejectedPushes": "拒絕",
|
||||
"filters": "篩選器",
|
||||
"indexers": "索引器"
|
||||
@@ -424,19 +426,47 @@
|
||||
"job_completion": "完成度"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
"origin_ip": "源頭IP",
|
||||
"status": "狀態"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"datastore_usage": "數據存儲",
|
||||
"failed_tasks_24h": "24小時內失敗任務",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
"memory_usage": "記憶體"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"users": "使用者",
|
||||
"photos": "照片",
|
||||
"videos": "影片",
|
||||
"storage": "儲存空間"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "在線網站",
|
||||
"down": "離線網站",
|
||||
"uptime": "在線時間",
|
||||
"incident": "事件",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "文庫",
|
||||
"series": "叢刊",
|
||||
"books": "書刊"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,18 @@ export default function Container({ error = false, children, service }) {
|
||||
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));
|
||||
// if the field contains a "." then it most likely contains a common loc value
|
||||
// logic now allows a fields array that can look like:
|
||||
// fields: [ "resources.cpu", "resources.mem", "field"]
|
||||
// or even
|
||||
// fields: [ "resources.cpu", "widget_type.field" ]
|
||||
visibleChildren = children.filter(child => fields.some(field => {
|
||||
let fullField = field;
|
||||
if (!field.includes(".")) {
|
||||
fullField = `${type}.${field}`;
|
||||
}
|
||||
return fullField === child?.props?.label;
|
||||
}));
|
||||
}
|
||||
|
||||
return <div className="relative flex flex-row w-full">{visibleChildren}</div>;
|
||||
|
||||
@@ -20,7 +20,6 @@ export default function Widget({ options }) {
|
||||
<BiError className="w-8 h-8 text-theme-800 dark:text-theme-200" />
|
||||
<div className="flex flex-col ml-3 text-left">
|
||||
<span className="text-theme-800 dark:text-theme-200 text-sm">{t("widget.api_error")}</span>
|
||||
<span className="text-theme-800 dark:text-theme-200 text-xs">-</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -28,7 +27,7 @@ export default function Widget({ options }) {
|
||||
);
|
||||
}
|
||||
|
||||
const defaultSite = statsData?.data?.find(s => s.name === "default");
|
||||
const defaultSite = options.site ? statsData?.data.find(s => s.desc === options.site) : statsData?.data?.find(s => s.name === "default");
|
||||
|
||||
if (!defaultSite) {
|
||||
return (
|
||||
@@ -55,6 +54,8 @@ export default function Widget({ options }) {
|
||||
const name = wan.gw_name ?? defaultSite.desc;
|
||||
const uptime = wan["gw_system-stats"] ? wan["gw_system-stats"].uptime : null;
|
||||
|
||||
const dataEmpty = !(wan.show || lan.show || wlan.show || uptime);
|
||||
|
||||
return (
|
||||
<div className="flex-none flex flex-row items-center mr-3 py-1.5">
|
||||
<div className="flex flex-col">
|
||||
@@ -64,6 +65,14 @@ export default function Widget({ options }) {
|
||||
{name}
|
||||
</div>
|
||||
</div>
|
||||
{dataEmpty && <div className="flex flex-row ml-3 text-[8px] justify-between">
|
||||
<div className="flex flex-row items-center justify-end">
|
||||
<div className="flex flex-row">
|
||||
<BiError className="w-4 h-4 text-theme-800 dark:text-theme-200" />
|
||||
<span className="text-theme-800 dark:text-theme-200 text-xs">{t("unifi.empty_data")}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>}
|
||||
<div className="flex flex-row ml-3 text-[10px] justify-between">
|
||||
{uptime && <div className="flex flex-row" title={t("unifi.uptime")}>
|
||||
<div className="pr-0.5 text-theme-800 dark:text-theme-200">
|
||||
|
||||
@@ -6,7 +6,6 @@ import Head from "next/head";
|
||||
import "styles/globals.css";
|
||||
import "styles/theme.css";
|
||||
import "styles/manrope.css";
|
||||
import "styles/custom.css";
|
||||
import nextI18nextConfig from "../../next-i18next.config";
|
||||
|
||||
import { ColorProvider } from "utils/contexts/color";
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
/*
|
||||
Mount this file and define your custom styles
|
||||
*/
|
||||
@@ -233,6 +233,7 @@ export function cleanServiceGroups(groups) {
|
||||
currency, // coinmarketcap widget
|
||||
symbols,
|
||||
defaultinterval,
|
||||
site, // unifi widget
|
||||
namespace, // kubernetes widget
|
||||
app,
|
||||
podSelector,
|
||||
@@ -256,6 +257,9 @@ export function cleanServiceGroups(groups) {
|
||||
if (server) cleanedService.widget.server = server;
|
||||
if (container) cleanedService.widget.container = container;
|
||||
}
|
||||
if (type === "unifi") {
|
||||
if (site) cleanedService.widget.site = site;
|
||||
}
|
||||
if (type === "kubernetes") {
|
||||
if (namespace) cleanedService.widget.namespace = namespace;
|
||||
if (app) cleanedService.widget.app = app;
|
||||
|
||||
176
src/utils/proxy/handlers/synology.js
Normal file
176
src/utils/proxy/handlers/synology.js
Normal file
@@ -0,0 +1,176 @@
|
||||
import cache from "memory-cache";
|
||||
|
||||
import getServiceWidget from "utils/config/service-helpers";
|
||||
import { asJson, formatApiCall } from "utils/proxy/api-helpers";
|
||||
import { httpProxy } from "utils/proxy/http";
|
||||
import createLogger from "utils/logger";
|
||||
import widgets from "widgets/widgets";
|
||||
|
||||
const INFO_ENDPOINT = "{url}/webapi/query.cgi?api=SYNO.API.Info&version=1&method=query";
|
||||
const AUTH_ENDPOINT = "{url}/webapi/{path}?api=SYNO.API.Auth&version={maxVersion}&method=login&account={username}&passwd={password}&session=DownloadStation&format=cookie";
|
||||
const AUTH_API_NAME = "SYNO.API.Auth";
|
||||
|
||||
const proxyName = "synologyProxyHandler";
|
||||
const logger = createLogger(proxyName);
|
||||
|
||||
async function login(loginUrl) {
|
||||
const [status, contentType, data] = await httpProxy(loginUrl);
|
||||
if (status !== 200) {
|
||||
return [status, contentType, data];
|
||||
}
|
||||
|
||||
const json = asJson(data);
|
||||
if (json?.success !== true) {
|
||||
// from page 16: https://global.download.synology.com/download/Document/Software/DeveloperGuide/Os/DSM/All/enu/DSM_Login_Web_API_Guide_enu.pdf
|
||||
/*
|
||||
Code Description
|
||||
400 No such account or incorrect password
|
||||
401 Account disabled
|
||||
402 Permission denied
|
||||
403 2-step verification code required
|
||||
404 Failed to authenticate 2-step verification code
|
||||
*/
|
||||
let message = "Authentication failed.";
|
||||
if (json?.error?.code >= 403) message += " 2FA enabled.";
|
||||
logger.warn("Unable to login. Code: %d", json?.error?.code);
|
||||
return [401, "application/json", JSON.stringify({ code: json?.error?.code, message })];
|
||||
}
|
||||
|
||||
return [status, contentType, data];
|
||||
}
|
||||
|
||||
async function getApiInfo(serviceWidget, apiName, serviceName) {
|
||||
const cacheKey = `${proxyName}__${apiName}__${serviceName}`
|
||||
let { cgiPath, maxVersion } = cache.get(cacheKey) ?? {};
|
||||
if (cgiPath && maxVersion) {
|
||||
return [cgiPath, maxVersion];
|
||||
}
|
||||
|
||||
const infoUrl = formatApiCall(INFO_ENDPOINT, serviceWidget);
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
const [status, contentType, data] = await httpProxy(infoUrl);
|
||||
|
||||
if (status === 200) {
|
||||
try {
|
||||
const json = asJson(data);
|
||||
if (json?.data?.[apiName]) {
|
||||
cgiPath = json.data[apiName].path;
|
||||
maxVersion = json.data[apiName].maxVersion;
|
||||
logger.debug(`Detected ${serviceWidget.type}: apiName '${apiName}', cgiPath '${cgiPath}', and maxVersion ${maxVersion}`);
|
||||
cache.put(cacheKey, { cgiPath, maxVersion });
|
||||
return [cgiPath, maxVersion];
|
||||
}
|
||||
}
|
||||
catch {
|
||||
logger.warn(`Error ${status} obtaining ${apiName} info`);
|
||||
}
|
||||
}
|
||||
|
||||
return [null, null];
|
||||
}
|
||||
|
||||
async function handleUnsuccessfulResponse(serviceWidget, url, serviceName) {
|
||||
logger.debug(`Attempting login to ${serviceWidget.type}`);
|
||||
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
const [apiPath, maxVersion] = await getApiInfo(serviceWidget, AUTH_API_NAME, serviceName);
|
||||
|
||||
const authArgs = { path: apiPath ?? "entry.cgi", maxVersion: maxVersion ?? 7, ...serviceWidget };
|
||||
const loginUrl = formatApiCall(AUTH_ENDPOINT, authArgs);
|
||||
|
||||
const [status, contentType, data] = await login(loginUrl);
|
||||
if (status !== 200) {
|
||||
return [status, contentType, data];
|
||||
}
|
||||
|
||||
return httpProxy(url);
|
||||
}
|
||||
|
||||
function toError(url, synologyError) {
|
||||
// commeon codes (100 => 199) from:
|
||||
// https://global.download.synology.com/download/Document/Software/DeveloperGuide/Os/DSM/All/enu/DSM_Login_Web_API_Guide_enu.pdf
|
||||
const code = synologyError.error?.code ?? synologyError.error ?? synologyError.code ?? 100;
|
||||
const error = { code };
|
||||
switch (code) {
|
||||
case 102:
|
||||
error.error = "The requested API does not exist.";
|
||||
break;
|
||||
|
||||
case 103:
|
||||
error.error = "The requested method does not exist.";
|
||||
break;
|
||||
|
||||
case 104:
|
||||
error.error = "The requested version does not support the functionality.";
|
||||
break;
|
||||
|
||||
case 105:
|
||||
error.error = "The logged in session does not have permission.";
|
||||
break;
|
||||
|
||||
case 106:
|
||||
error.error = "Session timeout.";
|
||||
break;
|
||||
|
||||
case 107:
|
||||
error.error = "Session interrupted by duplicated login.";
|
||||
break;
|
||||
|
||||
case 119:
|
||||
error.error = "Invalid session or SID not found.";
|
||||
break;
|
||||
|
||||
default:
|
||||
error.error = synologyError.message ?? "Unknown error.";
|
||||
break;
|
||||
}
|
||||
logger.warn(`Unable to call ${url}. code: ${code}, error: ${error.error}.`)
|
||||
return error;
|
||||
}
|
||||
|
||||
export default async function synologyProxyHandler(req, res) {
|
||||
const { group, service, endpoint } = req.query;
|
||||
|
||||
if (!group || !service) {
|
||||
return res.status(400).json({ error: "Invalid proxy service type" });
|
||||
}
|
||||
|
||||
const serviceWidget = await getServiceWidget(group, service);
|
||||
const widget = widgets?.[serviceWidget.type];
|
||||
const mapping = widget?.mappings?.[endpoint];
|
||||
if (!widget.api || !mapping) {
|
||||
return res.status(403).json({ error: "Service does not support API calls" });
|
||||
}
|
||||
|
||||
const [cgiPath, maxVersion] = await getApiInfo(serviceWidget, mapping.apiName, service);
|
||||
if (!cgiPath || !maxVersion) {
|
||||
return res.status(400).json({ error: `Unrecognized API name: ${mapping.apiName}`})
|
||||
}
|
||||
|
||||
const url = formatApiCall(widget.api, {
|
||||
apiName: mapping.apiName,
|
||||
apiMethod: mapping.apiMethod,
|
||||
cgiPath,
|
||||
maxVersion,
|
||||
...serviceWidget
|
||||
});
|
||||
let [status, contentType, data] = await httpProxy(url);
|
||||
if (status !== 200) {
|
||||
logger.debug("Error %d calling url %s", status, url);
|
||||
return res.status(status, data);
|
||||
}
|
||||
|
||||
let json = asJson(data);
|
||||
if (json?.success !== true) {
|
||||
logger.debug(`Attempting login to ${serviceWidget.type}`);
|
||||
[status, contentType, data] = await handleUnsuccessfulResponse(serviceWidget, url, service);
|
||||
json = asJson(data);
|
||||
}
|
||||
|
||||
if (json.success !== true) {
|
||||
data = toError(url, json);
|
||||
status = 500;
|
||||
}
|
||||
if (contentType) res.setHeader("Content-Type", contentType);
|
||||
return res.status(status).send(data);
|
||||
}
|
||||
@@ -9,6 +9,7 @@ const components = {
|
||||
cloudflared: dynamic(() => import("./cloudflared/component")),
|
||||
coinmarketcap: dynamic(() => import("./coinmarketcap/component")),
|
||||
deluge: dynamic(() => import("./deluge/component")),
|
||||
diskstation: dynamic(() => import("./diskstation/component")),
|
||||
downloadstation: dynamic(() => import("./downloadstation/component")),
|
||||
docker: dynamic(() => import("./docker/component")),
|
||||
kubernetes: dynamic(() => import("./kubernetes/component")),
|
||||
@@ -21,12 +22,14 @@ const components = {
|
||||
jackett: dynamic(() => import("./jackett/component")),
|
||||
jellyfin: dynamic(() => import("./emby/component")),
|
||||
jellyseerr: dynamic(() => import("./jellyseerr/component")),
|
||||
komga: dynamic(() => import("./komga/component")),
|
||||
lidarr: dynamic(() => import("./lidarr/component")),
|
||||
mastodon: dynamic(() => import("./mastodon/component")),
|
||||
medusa: dynamic(() => import("./medusa/component")),
|
||||
miniflux: dynamic(() => import("./miniflux/component")),
|
||||
mikrotik: dynamic(() => import("./mikrotik/component")),
|
||||
moonraker: dynamic(() => import("./moonraker/component")),
|
||||
mylar: dynamic(() => import("./mylar/component")),
|
||||
navidrome: dynamic(() => import("./navidrome/component")),
|
||||
nextdns: dynamic(() => import("./nextdns/component")),
|
||||
npm: dynamic(() => import("./npm/component")),
|
||||
@@ -37,6 +40,7 @@ const components = {
|
||||
opnsense: dynamic(() => import("./opnsense/component")),
|
||||
overseerr: dynamic(() => import("./overseerr/component")),
|
||||
paperlessngx: dynamic(() => import("./paperlessngx/component")),
|
||||
photoprism: dynamic(() => import("./photoprism/component")),
|
||||
proxmoxbackupserver: dynamic(() => import("./proxmoxbackupserver/component")),
|
||||
pihole: dynamic(() => import("./pihole/component")),
|
||||
plex: dynamic(() => import("./plex/component")),
|
||||
|
||||
55
src/widgets/diskstation/component.jsx
Normal file
55
src/widgets/diskstation/component.jsx
Normal file
@@ -0,0 +1,55 @@
|
||||
import { useTranslation } from "next-i18next";
|
||||
|
||||
import Container from "components/services/widget/container";
|
||||
import Block from "components/services/widget/block";
|
||||
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||
|
||||
export default function Component({ service }) {
|
||||
const { t } = useTranslation();
|
||||
const { widget } = service;
|
||||
const { data: infoData, error: infoError } = useWidgetAPI(widget, "system_info");
|
||||
const { data: storageData, error: storageError } = useWidgetAPI(widget, "system_storage");
|
||||
const { data: utilizationData, error: utilizationError } = useWidgetAPI(widget, "utilization");
|
||||
|
||||
if (storageError || infoError || utilizationError) {
|
||||
return <Container error={ storageError ?? infoError ?? utilizationError } />;
|
||||
}
|
||||
|
||||
if (!storageData || !infoData || !utilizationData) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="diskstation.uptime" />
|
||||
<Block label="diskstation.volumeAvailable" />
|
||||
<Block label="resources.cpu" />
|
||||
<Block label="resources.mem" />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
// uptime info
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
const [hour, minutes, seconds] = infoData.data.up_time.split(":");
|
||||
const days = Math.floor(hour / 24);
|
||||
const uptime = `${ t("common.number", { value: days }) } ${ t("diskstation.days") }`;
|
||||
|
||||
// storage info
|
||||
// TODO: figure out how to display info for more than one volume
|
||||
const volume = storageData.data.vol_info?.[0];
|
||||
const usedBytes = parseFloat(volume?.used_size);
|
||||
const totalBytes = parseFloat(volume?.total_size);
|
||||
const freeBytes = totalBytes - usedBytes;
|
||||
|
||||
// utilization info
|
||||
const { cpu, memory } = utilizationData.data;
|
||||
const cpuLoad = parseFloat(cpu.user_load) + parseFloat(cpu.system_load);
|
||||
const memoryUsage = 100 - ((100 * (parseFloat(memory.avail_real) + parseFloat(memory.cached))) / parseFloat(memory.total_real));
|
||||
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="diskstation.uptime" value={ uptime } />
|
||||
<Block label="diskstation.volumeAvailable" value={ t("common.bbytes", { value: freeBytes, maximumFractionDigits: 1 }) } />
|
||||
<Block label="resources.cpu" value={ t("common.percent", { value: cpuLoad }) } />
|
||||
<Block label="resources.mem" value={ t("common.percent", { value: memoryUsage }) } />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
27
src/widgets/diskstation/widget.js
Normal file
27
src/widgets/diskstation/widget.js
Normal file
@@ -0,0 +1,27 @@
|
||||
import synologyProxyHandler from '../../utils/proxy/handlers/synology'
|
||||
|
||||
const widget = {
|
||||
// cgiPath and maxVersion are discovered at runtime, don't supply
|
||||
api: "{url}/webapi/{cgiPath}?api={apiName}&version={maxVersion}&method={apiMethod}",
|
||||
proxyHandler: synologyProxyHandler,
|
||||
|
||||
mappings: {
|
||||
"system_storage": {
|
||||
apiName: "SYNO.Core.System",
|
||||
apiMethod: "info&type=\"storage\"",
|
||||
endpoint: "system_storage"
|
||||
},
|
||||
"system_info": {
|
||||
apiName: "SYNO.Core.System",
|
||||
apiMethod: "info",
|
||||
endpoint: "system_info"
|
||||
},
|
||||
"utilization": {
|
||||
apiName: "SYNO.Core.System.Utilization",
|
||||
apiMethod: "get",
|
||||
endpoint: "utilization"
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
export default widget;
|
||||
@@ -1,88 +0,0 @@
|
||||
import { formatApiCall } from "utils/proxy/api-helpers";
|
||||
import { httpProxy } from "utils/proxy/http";
|
||||
import createLogger from "utils/logger";
|
||||
import widgets from "widgets/widgets";
|
||||
import getServiceWidget from "utils/config/service-helpers";
|
||||
|
||||
const logger = createLogger("downloadstationProxyHandler");
|
||||
|
||||
async function login(loginUrl) {
|
||||
const [status, contentType, data] = await httpProxy(loginUrl);
|
||||
if (status !== 200) {
|
||||
return [status, contentType, data];
|
||||
}
|
||||
|
||||
const json = JSON.parse(data.toString());
|
||||
if (json?.success !== true) {
|
||||
// from https://global.download.synology.com/download/Document/Software/DeveloperGuide/Package/DownloadStation/All/enu/Synology_Download_Station_Web_API.pdf
|
||||
/*
|
||||
Code Description
|
||||
400 No such account or incorrect password
|
||||
401 Account disabled
|
||||
402 Permission denied
|
||||
403 2-step verification code required
|
||||
404 Failed to authenticate 2-step verification code
|
||||
*/
|
||||
let message = "Authentication failed.";
|
||||
if (json?.error?.code >= 403) message += " 2FA enabled.";
|
||||
logger.warn("Unable to login. Code: %d", json?.error?.code);
|
||||
return [401, "application/json", JSON.stringify({ code: json?.error?.code, message })];
|
||||
}
|
||||
|
||||
return [status, contentType, data];
|
||||
}
|
||||
|
||||
export default async function downloadstationProxyHandler(req, res) {
|
||||
const { group, service, endpoint } = req.query;
|
||||
|
||||
if (!group || !service) {
|
||||
return res.status(400).json({ error: "Invalid proxy service type" });
|
||||
}
|
||||
|
||||
const widget = await getServiceWidget(group, service);
|
||||
const api = widgets?.[widget.type]?.api;
|
||||
if (!api) {
|
||||
return res.status(403).json({ error: "Service does not support API calls" });
|
||||
}
|
||||
|
||||
const url = formatApiCall(api, { endpoint, ...widget });
|
||||
let [status, contentType, data] = await httpProxy(url);
|
||||
if (status !== 200) {
|
||||
logger.debug("Error %d calling endpoint %s", status, url);
|
||||
return res.status(status, data);
|
||||
}
|
||||
|
||||
const json = JSON.parse(data.toString());
|
||||
if (json?.success !== true) {
|
||||
logger.debug("Attempting login to DownloadStation");
|
||||
|
||||
const apiInfoUrl = formatApiCall("{url}/webapi/query.cgi?api=SYNO.API.Info&version=1&method=query", widget);
|
||||
let path = "entry.cgi";
|
||||
let maxVersion = 7;
|
||||
[status, contentType, data] = await httpProxy(apiInfoUrl);
|
||||
if (status === 200) {
|
||||
try {
|
||||
const apiAuthInfo = JSON.parse(data.toString()).data['SYNO.API.Auth'];
|
||||
if (apiAuthInfo) {
|
||||
path = apiAuthInfo.path;
|
||||
maxVersion = apiAuthInfo.maxVersion;
|
||||
logger.debug(`Deteceted Downloadstation auth API path: ${path} and maxVersion: ${maxVersion}`);
|
||||
}
|
||||
} catch {
|
||||
logger.debug(`Error ${status} obtaining DownloadStation API info`);
|
||||
}
|
||||
}
|
||||
|
||||
const authApi = `{url}/webapi/${path}?api=SYNO.API.Auth&version=${maxVersion}&method=login&account={username}&passwd={password}&session=DownloadStation&format=cookie`
|
||||
const loginUrl = formatApiCall(authApi, widget);
|
||||
[status, contentType, data] = await login(loginUrl);
|
||||
if (status !== 200) {
|
||||
return res.status(status).end(data)
|
||||
}
|
||||
|
||||
[status, contentType, data] = await httpProxy(url);
|
||||
}
|
||||
|
||||
if (contentType) res.setHeader("Content-Type", contentType);
|
||||
return res.status(status).send(data);
|
||||
}
|
||||
@@ -1,12 +1,15 @@
|
||||
import downloadstationProxyHandler from "./proxy";
|
||||
import synologyProxyHandler from '../../utils/proxy/handlers/synology'
|
||||
|
||||
const widget = {
|
||||
api: "{url}/webapi/DownloadStation/task.cgi?api=SYNO.DownloadStation.Task&version=1&method={endpoint}",
|
||||
proxyHandler: downloadstationProxyHandler,
|
||||
// cgiPath and maxVersion are discovered at runtime, don't supply
|
||||
api: "{url}/webapi/{cgiPath}?api={apiName}&version={maxVersion}&method={apiMethod}",
|
||||
proxyHandler: synologyProxyHandler,
|
||||
|
||||
mappings: {
|
||||
"list": {
|
||||
endpoint: "list&additional=transfer",
|
||||
apiName: "SYNO.DownloadStation.Task",
|
||||
apiMethod: "list&additional=transfer",
|
||||
endpoint: "list"
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
37
src/widgets/komga/component.jsx
Normal file
37
src/widgets/komga/component.jsx
Normal file
@@ -0,0 +1,37 @@
|
||||
import { useTranslation } from "next-i18next";
|
||||
|
||||
import Container from "components/services/widget/container";
|
||||
import Block from "components/services/widget/block";
|
||||
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||
|
||||
export default function Component({ service }) {
|
||||
const { t } = useTranslation();
|
||||
const { widget } = service;
|
||||
|
||||
const { data: libraryData, error: libraryError } = useWidgetAPI(widget, "libraries");
|
||||
const { data: seriesData, error: seriesError } = useWidgetAPI(widget, "series");
|
||||
const { data: bookData, error: bookError } = useWidgetAPI(widget, "books");
|
||||
|
||||
if (libraryError || seriesError || bookError) {
|
||||
const finalError = libraryError ?? seriesError ?? bookError;
|
||||
return <Container error={finalError} />;
|
||||
}
|
||||
|
||||
if (!libraryData || !seriesData || !bookData) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="komga.libraries" />
|
||||
<Block label="komga.series" />
|
||||
<Block label="komga.books" />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="komga.libraries" value={t("common.number", { value: libraryData.total })} />
|
||||
<Block label="komga.series" value={t("common.number", { value: seriesData.totalElements })} />
|
||||
<Block label="komga.books" value={t("common.number", { value: bookData.totalElements })} />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
30
src/widgets/komga/widget.js
Normal file
30
src/widgets/komga/widget.js
Normal file
@@ -0,0 +1,30 @@
|
||||
import genericProxyHandler from "utils/proxy/handlers/generic";
|
||||
import { jsonArrayFilter } from "utils/proxy/api-helpers";
|
||||
|
||||
const widget = {
|
||||
api: "{url}/api/v1/{endpoint}",
|
||||
proxyHandler: genericProxyHandler,
|
||||
|
||||
mappings: {
|
||||
libraries: {
|
||||
endpoint: "libraries",
|
||||
map: (data) => ({
|
||||
total: jsonArrayFilter(data, (item) => !item.unavailable).length,
|
||||
}),
|
||||
},
|
||||
series: {
|
||||
endpoint: "series",
|
||||
validate: [
|
||||
"totalElements"
|
||||
]
|
||||
},
|
||||
books: {
|
||||
endpoint: "books",
|
||||
validate: [
|
||||
"totalElements"
|
||||
]
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default widget;
|
||||
40
src/widgets/mylar/component.jsx
Normal file
40
src/widgets/mylar/component.jsx
Normal file
@@ -0,0 +1,40 @@
|
||||
import { useTranslation } from "next-i18next";
|
||||
|
||||
import Container from "components/services/widget/container";
|
||||
import Block from "components/services/widget/block";
|
||||
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||
|
||||
export default function Component({ service }) {
|
||||
const { t } = useTranslation();
|
||||
|
||||
const { widget } = service;
|
||||
|
||||
const { data: seriesData, error: seriesError } = useWidgetAPI(widget, "series");
|
||||
const { data: issuesData, error: issuesError } = useWidgetAPI(widget, "issues");
|
||||
const { data: wantedData, error: wantedError } = useWidgetAPI(widget, "wanted");
|
||||
|
||||
if (seriesError || issuesError || wantedError) {
|
||||
const finalError = seriesError ?? issuesError ?? wantedError;
|
||||
return <Container error={finalError} />;
|
||||
}
|
||||
|
||||
if (!seriesData || !issuesData || !wantedData) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="mylar.series" />
|
||||
<Block label="mylar.issues" />
|
||||
<Block label="mylar.wanted" />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
const totalIssues = issuesData.data.reduce((acc, series) => acc + series.totalIssues, 0);
|
||||
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="mylar.series" value={t("common.number", { value: seriesData.data.length })} />
|
||||
<Block label="mylar.issues" value={t("common.number", { value: totalIssues })} />
|
||||
<Block label="mylar.wanted" value={t("common.number", { value: wantedData.issues.length })} />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
20
src/widgets/mylar/widget.js
Normal file
20
src/widgets/mylar/widget.js
Normal file
@@ -0,0 +1,20 @@
|
||||
import genericProxyHandler from "utils/proxy/handlers/generic";
|
||||
|
||||
const widget = {
|
||||
api: "{url}/api?cmd={endpoint}&apikey={key}",
|
||||
proxyHandler: genericProxyHandler,
|
||||
|
||||
mappings: {
|
||||
issues: {
|
||||
endpoint: "getIndex"
|
||||
},
|
||||
series: {
|
||||
endpoint: "seriesjsonListing"
|
||||
},
|
||||
wanted: {
|
||||
endpoint: "getWanted"
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default widget;
|
||||
37
src/widgets/photoprism/component.jsx
Normal file
37
src/widgets/photoprism/component.jsx
Normal file
@@ -0,0 +1,37 @@
|
||||
import { useTranslation } from "next-i18next";
|
||||
|
||||
import Container from "components/services/widget/container";
|
||||
import Block from "components/services/widget/block";
|
||||
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||
|
||||
export default function Component({ service }) {
|
||||
const { t } = useTranslation();
|
||||
|
||||
const { widget } = service;
|
||||
|
||||
const { data: photoprismData, error: photoprismError } = useWidgetAPI(widget);
|
||||
|
||||
if (photoprismError) {
|
||||
return <Container error={photoprismError} />;
|
||||
}
|
||||
|
||||
if (!photoprismData) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="photoprism.albums" />
|
||||
<Block label="photoprism.photos" />
|
||||
<Block label="photoprism.videos" />
|
||||
<Block label="photoprism.people" />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="photoprism.albums" value={t("common.number", { value: photoprismData.albums })} />
|
||||
<Block label="photoprism.photos" value={t("common.number", { value: photoprismData.photos })} />
|
||||
<Block label="photoprism.videos" value={t("common.number", { value: photoprismData.videos })} />
|
||||
<Block label="photoprism.people" value={t("common.number", { value: photoprismData.people })} />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
48
src/widgets/photoprism/proxy.js
Normal file
48
src/widgets/photoprism/proxy.js
Normal file
@@ -0,0 +1,48 @@
|
||||
import { formatApiCall } from "utils/proxy/api-helpers";
|
||||
import { httpProxy } from "utils/proxy/http";
|
||||
import getServiceWidget from "utils/config/service-helpers";
|
||||
import createLogger from "utils/logger";
|
||||
|
||||
const logger = createLogger("photoprismProxyHandler");
|
||||
|
||||
export default async function photoprismProxyHandler(req, res) {
|
||||
const { group, service } = req.query;
|
||||
|
||||
if (!group || !service) {
|
||||
logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
|
||||
return res.status(400).json({ error: "Invalid proxy service type" });
|
||||
}
|
||||
|
||||
const widget = await getServiceWidget(group, service);
|
||||
|
||||
if (!widget) {
|
||||
logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
|
||||
return res.status(400).json({ error: "Invalid proxy service type" });
|
||||
}
|
||||
|
||||
const url = new URL(formatApiCall("{url}/api/v1/session", { ...widget }));
|
||||
const params = {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: null
|
||||
};
|
||||
|
||||
if (widget.username && widget.password) {
|
||||
params.body = JSON.stringify({
|
||||
"username": widget.username,
|
||||
"password": widget.password
|
||||
});
|
||||
}
|
||||
|
||||
const [status, contentType, data] = await httpProxy(url, params);
|
||||
|
||||
if (status !== 200) {
|
||||
logger.error("HTTP %d getting data from PhotoPrism. Data: %s", status, data);
|
||||
return res.status(status).json({error: {message: `HTTP Error ${status}`, url, data}});
|
||||
}
|
||||
|
||||
const json = JSON.parse(data.toString())
|
||||
|
||||
if (contentType) res.setHeader("Content-Type", contentType);
|
||||
return res.status(200).send(json?.config?.count);
|
||||
}
|
||||
7
src/widgets/photoprism/widget.js
Normal file
7
src/widgets/photoprism/widget.js
Normal file
@@ -0,0 +1,7 @@
|
||||
import photoprismProxyHandler from "./proxy";
|
||||
|
||||
const widget = {
|
||||
proxyHandler: photoprismProxyHandler,
|
||||
};
|
||||
|
||||
export default widget;
|
||||
@@ -24,8 +24,8 @@ export default function Component({ service }) {
|
||||
<Container service={service}>
|
||||
<Block label="proxmox.vms" />
|
||||
<Block label="proxmox.lxc" />
|
||||
<Block label="proxmox.cpu" />
|
||||
<Block label="proxmox.ram" />
|
||||
<Block label="resources.cpu" />
|
||||
<Block label="resources.ram" />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
@@ -46,8 +46,8 @@ export default function Component({ service }) {
|
||||
<Container service={service}>
|
||||
<Block label="proxmox.vms" value={`${runningVMs} / ${vms.length}`} />
|
||||
<Block label="proxmox.lxc" value={`${runningLXC} / ${lxc.length}`} />
|
||||
<Block label="proxmox.cpu" value={t("common.percent", { value: (node.cpu * 100) })} />
|
||||
<Block label="proxmox.mem" value={t("common.percent", { value: ((node.mem / node.maxmem) * 100) })} />
|
||||
<Block label="resources.cpu" value={t("common.percent", { value: (node.cpu * 100) })} />
|
||||
<Block label="resources.mem" value={t("common.percent", { value: ((node.mem / node.maxmem) * 100) })} />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ export default function Component({ service }) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="proxmoxbackupserver.datastore_usage" />
|
||||
<Block label="proxmoxbackupserver.failed_tasks" />
|
||||
<Block label="proxmoxbackupserver.failed_tasks_24h" />
|
||||
<Block label="proxmoxbackupserver.cpu_usage" />
|
||||
<Block label="proxmoxbackupserver.memory_usage" />
|
||||
</Container>
|
||||
|
||||
@@ -15,7 +15,7 @@ export default function Component({ service }) {
|
||||
return <Container error={statsError} />;
|
||||
}
|
||||
|
||||
const defaultSite = statsData?.data?.find(s => s.name === "default");
|
||||
const defaultSite = widget.site ? statsData?.data.find(s => s.desc === widget.site) : statsData?.data?.find(s => s.name === "default");
|
||||
|
||||
if (!defaultSite) {
|
||||
return (
|
||||
@@ -38,6 +38,14 @@ export default function Component({ service }) {
|
||||
|
||||
const uptime = wan["gw_system-stats"] ? `${t("common.number", { value: wan["gw_system-stats"].uptime / 86400, maximumFractionDigits: 1 })} ${t("unifi.days")}` : null;
|
||||
|
||||
if (!(wan.show || lan.show || wlan.show || uptime)) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block value={ t("unifi.empty_data") } />
|
||||
</Container>
|
||||
)
|
||||
}
|
||||
|
||||
return (
|
||||
<Container service={service}>
|
||||
{uptime && <Block label="unifi.uptime" value={ uptime } />}
|
||||
|
||||
@@ -6,6 +6,7 @@ import changedetectionio from "./changedetectionio/widget";
|
||||
import cloudflared from "./cloudflared/widget";
|
||||
import coinmarketcap from "./coinmarketcap/widget";
|
||||
import deluge from "./deluge/widget";
|
||||
import diskstation from "./diskstation/widget";
|
||||
import downloadstation from "./downloadstation/widget";
|
||||
import emby from "./emby/widget";
|
||||
import flood from "./flood/widget";
|
||||
@@ -15,12 +16,14 @@ import hdhomerun from "./hdhomerun/widget";
|
||||
import homebridge from "./homebridge/widget";
|
||||
import jackett from "./jackett/widget";
|
||||
import jellyseerr from "./jellyseerr/widget";
|
||||
import komga from "./komga/widget";
|
||||
import lidarr from "./lidarr/widget";
|
||||
import mastodon from "./mastodon/widget";
|
||||
import medusa from "./medusa/widget";
|
||||
import miniflux from "./miniflux/widget";
|
||||
import mikrotik from "./mikrotik/widget";
|
||||
import moonraker from "./moonraker/widget";
|
||||
import mylar from "./mylar/widget";
|
||||
import navidrome from "./navidrome/widget";
|
||||
import nextdns from "./nextdns/widget";
|
||||
import npm from "./npm/widget";
|
||||
@@ -31,6 +34,7 @@ import ombi from "./ombi/widget";
|
||||
import opnsense from "./opnsense/widget";
|
||||
import overseerr from "./overseerr/widget";
|
||||
import paperlessngx from "./paperlessngx/widget";
|
||||
import photoprism from "./photoprism/widget";
|
||||
import proxmoxbackupserver from "./proxmoxbackupserver/widget";
|
||||
import pihole from "./pihole/widget";
|
||||
import plex from "./plex/widget";
|
||||
@@ -68,7 +72,7 @@ const widgets = {
|
||||
cloudflared,
|
||||
coinmarketcap,
|
||||
deluge,
|
||||
diskstation: downloadstation,
|
||||
diskstation,
|
||||
downloadstation,
|
||||
emby,
|
||||
flood,
|
||||
@@ -79,12 +83,14 @@ const widgets = {
|
||||
jackett,
|
||||
jellyfin: emby,
|
||||
jellyseerr,
|
||||
komga,
|
||||
lidarr,
|
||||
mastodon,
|
||||
medusa,
|
||||
miniflux,
|
||||
mikrotik,
|
||||
moonraker,
|
||||
mylar,
|
||||
navidrome,
|
||||
nextdns,
|
||||
npm,
|
||||
@@ -95,6 +101,7 @@ const widgets = {
|
||||
opnsense,
|
||||
overseerr,
|
||||
paperlessngx,
|
||||
photoprism,
|
||||
proxmoxbackupserver,
|
||||
pihole,
|
||||
plex,
|
||||
|
||||
Reference in New Issue
Block a user