mirror of
https://github.com/gethomepage/homepage.git
synced 2025-12-05 21:47:48 +01:00
Compare commits
661 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
767fc1ec39 | ||
|
|
09fa08b037 | ||
|
|
fe204dd0c3 | ||
|
|
93fe847667 | ||
|
|
f474b746d3 | ||
|
|
b69bb94253 | ||
|
|
9df4ba0881 | ||
|
|
b2f26e1a43 | ||
|
|
f9282180db | ||
|
|
794fcaf3c3 | ||
|
|
ea9b7de1c9 | ||
|
|
aef672f1bb | ||
|
|
c0ad65b3b1 | ||
|
|
062dd5b79c | ||
|
|
085e485e7c | ||
|
|
c227b70f32 | ||
|
|
e06a992437 | ||
|
|
f9a96e10d6 | ||
|
|
0c52bf02eb | ||
|
|
ae7a938245 | ||
|
|
1c749bf93e | ||
|
|
72b21b5d0e | ||
|
|
4762177ef2 | ||
|
|
418578c795 | ||
|
|
d2335eb4cc | ||
|
|
520965c7fd | ||
|
|
7b36e071ea | ||
|
|
3ea68caf53 | ||
|
|
e36ab158f7 | ||
|
|
b5dedbdbf1 | ||
|
|
abc44e3fe1 | ||
|
|
32aeae0c41 | ||
|
|
b0c443f982 | ||
|
|
890b9a97cb | ||
|
|
034a30a29c | ||
|
|
b651fb84c4 | ||
|
|
4354698b15 | ||
|
|
01210bcbc9 | ||
|
|
810bae42fc | ||
|
|
bfb8b703dc | ||
|
|
2ab980e658 | ||
|
|
509a4e5460 | ||
|
|
030aec3908 | ||
|
|
26e4216780 | ||
|
|
08d7636165 | ||
|
|
9fcc6cae36 | ||
|
|
893c443f21 | ||
|
|
594f47fa68 | ||
|
|
5def5dd508 | ||
|
|
0e2b474540 | ||
|
|
4855aa762f | ||
|
|
96507e4eba | ||
|
|
08f56b54f5 | ||
|
|
9662c29374 | ||
|
|
14e1a9a4ed | ||
|
|
45946ddfe1 | ||
|
|
651b8d8ef7 | ||
|
|
8e53dff5dc | ||
|
|
c84a75ce77 | ||
|
|
21106e4bbd | ||
|
|
af6f867e41 | ||
|
|
deaa4e5a13 | ||
|
|
fff96b6ab7 | ||
|
|
7648f2d409 | ||
|
|
6461578fc5 | ||
|
|
9d97b6e231 | ||
|
|
71109db50f | ||
|
|
f7294131b7 | ||
|
|
271aee139e | ||
|
|
3d9e739cb4 | ||
|
|
ada39bb876 | ||
|
|
160b936206 | ||
|
|
5874598a36 | ||
|
|
938d03e4ba | ||
|
|
4314013b2e | ||
|
|
acfeaae8c6 | ||
|
|
b70fa0e844 | ||
|
|
b7dcd3e9cd | ||
|
|
f697c9b9dd | ||
|
|
06fa779966 | ||
|
|
6eefa34741 | ||
|
|
4bd2fda6ae | ||
|
|
ec701d9fd7 | ||
|
|
6476094ce4 | ||
|
|
57940c1519 | ||
|
|
4b494efcd1 | ||
|
|
bb8796000c | ||
|
|
e49478085c | ||
|
|
db5a7beb57 | ||
|
|
0b7b1c4c9e | ||
|
|
4a85caca50 | ||
|
|
410054347d | ||
|
|
05b056d18e | ||
|
|
080d684089 | ||
|
|
0666268d91 | ||
|
|
b45d6240ae | ||
|
|
e35a66d3f1 | ||
|
|
2367564041 | ||
|
|
0223e8828f | ||
|
|
408533ee24 | ||
|
|
0c745d6d58 | ||
|
|
35cbe9e69b | ||
|
|
91511edcfb | ||
|
|
df8cf8cb20 | ||
|
|
8c1b95cb0a | ||
|
|
264f2fb84b | ||
|
|
13fe3f6e73 | ||
|
|
c7a927fe7d | ||
|
|
446d06b538 | ||
|
|
a2d88bd30f | ||
|
|
bbde2876e2 | ||
|
|
161dcf70ab | ||
|
|
1544d6cb37 | ||
|
|
b6b716c95f | ||
|
|
f0b32e7d14 | ||
|
|
27eb036996 | ||
|
|
65cee0ec2b | ||
|
|
735cf18dd8 | ||
|
|
a4a0d293cd | ||
|
|
bcc7852e25 | ||
|
|
724fc07610 | ||
|
|
2f0cf218fc | ||
|
|
534b28259f | ||
|
|
61db2fd57d | ||
|
|
0a926a322a | ||
|
|
386df61ed7 | ||
|
|
467f42e0f6 | ||
|
|
5dd4df8a05 | ||
|
|
0a4116425b | ||
|
|
e26e7f8559 | ||
|
|
0b30764b89 | ||
|
|
97669a98a9 | ||
|
|
addf0911a0 | ||
|
|
806b7f3cab | ||
|
|
9b037ce349 | ||
|
|
79d199b321 | ||
|
|
5289476937 | ||
|
|
08f5cd8ef2 | ||
|
|
7634e41652 | ||
|
|
321c7c95f8 | ||
|
|
5697037550 | ||
|
|
bb43d30d81 | ||
|
|
7f0db24203 | ||
|
|
89699cabb1 | ||
|
|
5e51a16959 | ||
|
|
babc73c74e | ||
|
|
a8391db069 | ||
|
|
e9b8b50b24 | ||
|
|
d52d31a2bd | ||
|
|
890d392b29 | ||
|
|
77b5879602 | ||
|
|
1b643d8572 | ||
|
|
d7544e9b9f | ||
|
|
1c71b8872f | ||
|
|
c1865592de | ||
|
|
6d3dc81692 | ||
|
|
95caacce41 | ||
|
|
caf2d2c63b | ||
|
|
7bed5604ca | ||
|
|
5ff206565c | ||
|
|
976bcdd794 | ||
|
|
bdbd570fbc | ||
|
|
1fdcc95ab1 | ||
|
|
b0113908a6 | ||
|
|
b9c823decb | ||
|
|
a23ec1d4f3 | ||
|
|
58b3706d5d | ||
|
|
4d1c01b9f9 | ||
|
|
edb94b7499 | ||
|
|
dd43b02e92 | ||
|
|
daaeedf3e5 | ||
|
|
10f7d9cbfe | ||
|
|
21a4751289 | ||
|
|
ad6eeaaf75 | ||
|
|
5d5ddfec1b | ||
|
|
3d3dcd2a63 | ||
|
|
ede631e487 | ||
|
|
ed96c46fa5 | ||
|
|
5a8b1b587b | ||
|
|
e1176e9e3b | ||
|
|
a25606cfe9 | ||
|
|
ae7a77d247 | ||
|
|
be51be60a2 | ||
|
|
07f7025dde | ||
|
|
bd62195c60 | ||
|
|
2af8f5f36b | ||
|
|
52ab10a17b | ||
|
|
6cec2f0d0d | ||
|
|
d953b52938 | ||
|
|
7d43d23d84 | ||
|
|
34653dd286 | ||
|
|
3d0a53f4ae | ||
|
|
f704acc3b1 | ||
|
|
db4d812a12 | ||
|
|
e8fcb8add2 | ||
|
|
54bfecd59a | ||
|
|
5bf2b816c8 | ||
|
|
8cfa880f5c | ||
|
|
30af03a7ce | ||
|
|
6aaf82418e | ||
|
|
d4b46eb18c | ||
|
|
a5a0a0c510 | ||
|
|
613e40a900 | ||
|
|
248b5759a0 | ||
|
|
5c35aee418 | ||
|
|
2f9cf474dd | ||
|
|
378be50c35 | ||
|
|
49c55e04e9 | ||
|
|
c1250d0ab6 | ||
|
|
b7e9a69345 | ||
|
|
1210add0ff | ||
|
|
e235790d68 | ||
|
|
31a6408583 | ||
|
|
0a5276b12d | ||
|
|
d440126c45 | ||
|
|
6a3f096d44 | ||
|
|
1b5f7ac3e2 | ||
|
|
e56d29febb | ||
|
|
610ad9819a | ||
|
|
2c6b2a1474 | ||
|
|
460983b741 | ||
|
|
c1f22b3e2c | ||
|
|
cd7d7ba729 | ||
|
|
f74275293a | ||
|
|
8a6343dee7 | ||
|
|
d7671149b7 | ||
|
|
db2063a3ee | ||
|
|
ed2e15f8c3 | ||
|
|
69640fea19 | ||
|
|
7b6a0aa86f | ||
|
|
aa3d3ff208 | ||
|
|
a8c3ecb00c | ||
|
|
35b533b3f0 | ||
|
|
e433c195e8 | ||
|
|
c799f1207f | ||
|
|
ab7a73dae6 | ||
|
|
8ec4291753 | ||
|
|
d5c99a9582 | ||
|
|
e729a75975 | ||
|
|
55f3a68b5f | ||
|
|
33a3d9bcff | ||
|
|
b5e8284d7f | ||
|
|
1497e4dbd5 | ||
|
|
615a0c419c | ||
|
|
26b4e8adea | ||
|
|
10d5f11a9c | ||
|
|
e241e4c683 | ||
|
|
049dda86e3 | ||
|
|
78088afb9c | ||
|
|
75e310c19e | ||
|
|
eed83c4a98 | ||
|
|
9d22af1166 | ||
|
|
06761a38c0 | ||
|
|
338d723ffd | ||
|
|
5d57892db4 | ||
|
|
107993821a | ||
|
|
6f6b35d790 | ||
|
|
e362ed129d | ||
|
|
65065fed17 | ||
|
|
ebe58769f6 | ||
|
|
2e54f586a2 | ||
|
|
d07b508990 | ||
|
|
598815ba5c | ||
|
|
6bb94dc185 | ||
|
|
aabd05a0cb | ||
|
|
f558d27e8c | ||
|
|
220f662d10 | ||
|
|
2fb33d048b | ||
|
|
a3d56e2d4b | ||
|
|
caecfaa87d | ||
|
|
7cf92d5a92 | ||
|
|
b619fe95d1 | ||
|
|
e1f0e3814a | ||
|
|
8d7f41388c | ||
|
|
b4cdb03228 | ||
|
|
0de278802b | ||
|
|
64704a1559 | ||
|
|
668df2d773 | ||
|
|
3600e5487d | ||
|
|
f109ffa9bc | ||
|
|
73c8ff7ee6 | ||
|
|
7b474d4cef | ||
|
|
02b0604ad7 | ||
|
|
845c7bbdcc | ||
|
|
1d23cad458 | ||
|
|
babaa0705a | ||
|
|
6a8f0f7814 | ||
|
|
23f3a5f404 | ||
|
|
f8a0c69e4b | ||
|
|
b2211bcdfd | ||
|
|
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 | ||
|
|
29e0b309e5 | ||
|
|
ce644afe9e | ||
|
|
c5ac34a6b5 | ||
|
|
015d7dac52 | ||
|
|
c3d15a61c3 | ||
|
|
f517d704b8 | ||
|
|
167f3a4f84 | ||
|
|
e411e2ac0d | ||
|
|
ff27b1ef51 | ||
|
|
41a2e5932f | ||
|
|
fb1e11b6cb | ||
|
|
dfc787b004 | ||
|
|
224d5da982 | ||
|
|
713344132a | ||
|
|
49d2dabe53 | ||
|
|
147a165bbc | ||
|
|
4c17e3fd14 | ||
|
|
046f2986a8 | ||
|
|
ad299e9c94 | ||
|
|
7a5a3a6608 | ||
|
|
87dbbcb1e0 | ||
|
|
3bc0522812 | ||
|
|
adea9da881 | ||
|
|
1ccf0b3c7a | ||
|
|
3c44e49b76 | ||
|
|
711eedfc84 | ||
|
|
348833e682 | ||
|
|
fe128a976f | ||
|
|
7ca1839287 | ||
|
|
7ac98d010c | ||
|
|
4af1f1bb7d | ||
|
|
69a86bc5dc | ||
|
|
98ca15c962 | ||
|
|
4837f26aa1 | ||
|
|
3c06637dd7 | ||
|
|
076c2fbb0d | ||
|
|
3034b78772 | ||
|
|
bddbe890f8 | ||
|
|
f7520f2fdf | ||
|
|
158dcf0098 | ||
|
|
6e5efc6804 | ||
|
|
329985927b | ||
|
|
c648e106db | ||
|
|
2356745e15 | ||
|
|
c52bc57190 | ||
|
|
2e43b93eb6 | ||
|
|
6d779355b3 | ||
|
|
10fb1be641 | ||
|
|
10a4cb8552 | ||
|
|
2951574caa | ||
|
|
4e0a1fdcdd | ||
|
|
d38948bb6a | ||
|
|
53743119b8 | ||
|
|
38d1ecc7c0 | ||
|
|
b31e64d1dc | ||
|
|
8f5dcd5175 | ||
|
|
1f5912c232 | ||
|
|
9b8e01971f | ||
|
|
7b12c9e24a | ||
|
|
e079587d89 | ||
|
|
6a0a5ff1f7 | ||
|
|
e3e5c0274b | ||
|
|
de70ce620e | ||
|
|
56d9ec64fd | ||
|
|
bca597febe | ||
|
|
579cac73e0 | ||
|
|
c29b174dcf | ||
|
|
c693a5e690 | ||
|
|
e4724690b2 | ||
|
|
eb679d615b | ||
|
|
a9e70b815d | ||
|
|
96b00f9207 | ||
|
|
fb5ebb0ca0 | ||
|
|
9550071dab | ||
|
|
4581833ed4 | ||
|
|
fe148d4cd0 | ||
|
|
9076de919b | ||
|
|
5cf95eb383 | ||
|
|
1785206df0 | ||
|
|
1805b43816 | ||
|
|
f406af59bc | ||
|
|
98b4280a02 | ||
|
|
9699481b9a | ||
|
|
ab436152dd | ||
|
|
cacbe6d17b | ||
|
|
50b435b7e3 | ||
|
|
4e47b19fb9 | ||
|
|
66620c5d42 | ||
|
|
f1aa9444c1 | ||
|
|
908ee43375 | ||
|
|
c2e52f8821 | ||
|
|
3194e5af85 | ||
|
|
2fae3243a7 | ||
|
|
adce18d023 | ||
|
|
11d03be4de | ||
|
|
4e17628f97 | ||
|
|
893b3f0986 | ||
|
|
e62952c2c1 | ||
|
|
cf072933a1 | ||
|
|
f8a57b1a5f | ||
|
|
385e935533 | ||
|
|
eaa7f1bf6d | ||
|
|
fb7ad30dfc | ||
|
|
95fcd821be | ||
|
|
a4e1083d02 | ||
|
|
7e9ed86441 | ||
|
|
c76d750e18 | ||
|
|
b75617e2f2 | ||
|
|
cf7ba59f0f | ||
|
|
14377962f2 | ||
|
|
aab38e1b5f | ||
|
|
1449c5a0a3 | ||
|
|
72481876f8 | ||
|
|
7f207692ce | ||
|
|
dab31b2feb | ||
|
|
13d2213ceb | ||
|
|
2a77bb11c5 | ||
|
|
fcf9c6417b | ||
|
|
e08ce475f5 | ||
|
|
ba96ab8b50 | ||
|
|
0743095093 | ||
|
|
0bb40d7ad1 | ||
|
|
33467a5c63 | ||
|
|
f88de790a9 | ||
|
|
85afbcb86c | ||
|
|
c502f65d07 | ||
|
|
6baf028d6d | ||
|
|
8441838065 | ||
|
|
901be4ff60 | ||
|
|
c9e8b13c37 | ||
|
|
ac1a3e95ca | ||
|
|
9978bf6fdc | ||
|
|
7f5996cb58 | ||
|
|
8468ffb243 | ||
|
|
a7927b4873 | ||
|
|
c9439eafa2 | ||
|
|
2b3d4b388a |
26
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
26
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
## Proposed change
|
||||
|
||||
<!--
|
||||
Please include a summary of the change. Screenshots and / or videos can also be helpful if appropriate.
|
||||
|
||||
New service widgets should include example(s) of relevant relevant API output as well as a PR to the docs for the new widget. See the development guidelines for new widgets: https://gethomepage.dev/en/more/development/#service-widget-guidelines
|
||||
-->
|
||||
|
||||
Closes # (issue)
|
||||
|
||||
## Type of change
|
||||
|
||||
<!--
|
||||
What type of change does your PR introduce to Homepage?
|
||||
-->
|
||||
|
||||
- [ ] New service widget
|
||||
- [ ] Bug fix (non-breaking change which fixes an issue)
|
||||
- [ ] New feature (non-breaking change which adds functionality)
|
||||
- [ ] Other (please explain)
|
||||
|
||||
## Checklist:
|
||||
|
||||
- [ ] If adding a service widget or a change that requires it, I have added a corresponding PR to the [documentation](https://github.com/benphelps/homepage-docs) here:
|
||||
- [ ] If applicable, I have checked that all tests pass with e.g. `pnpm lint`.
|
||||
- [ ] If applicable, I have tested my code for new features & regressions on both mobile & desktop devices, using the latest version of major browsers.
|
||||
2
.github/workflows/docker-publish.yml
vendored
2
.github/workflows/docker-publish.yml
vendored
@@ -88,7 +88,7 @@ jobs:
|
||||
# https://github.com/docker/build-push-action
|
||||
- name: Build and push Docker image
|
||||
id: build-and-push
|
||||
uses: docker/build-push-action@v3
|
||||
uses: docker/build-push-action@v4
|
||||
with:
|
||||
context: .
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
|
||||
@@ -29,7 +29,6 @@
|
||||
"react-dom": "^18.2.0",
|
||||
"react-i18next": "^11.18.6",
|
||||
"react-icons": "^4.4.0",
|
||||
"rutorrent-promise": "^2.0.0",
|
||||
"shvl": "^3.0.0",
|
||||
"swr": "^1.3.0",
|
||||
"tough-cookie": "^4.1.2",
|
||||
|
||||
47
pnpm-lock.yaml
generated
47
pnpm-lock.yaml
generated
@@ -33,7 +33,6 @@ specifiers:
|
||||
react-dom: ^18.2.0
|
||||
react-i18next: ^11.18.6
|
||||
react-icons: ^4.4.0
|
||||
rutorrent-promise: ^2.0.0
|
||||
shvl: ^3.0.0
|
||||
swr: ^1.3.0
|
||||
tailwind-scrollbar: ^2.0.1
|
||||
@@ -63,7 +62,6 @@ dependencies:
|
||||
react-dom: 18.2.0_react@18.2.0
|
||||
react-i18next: 11.18.6_ulhmqqxshznzmtuvahdi5nasbq
|
||||
react-icons: 4.4.0_react@18.2.0
|
||||
rutorrent-promise: 2.0.0
|
||||
shvl: 3.0.0
|
||||
swr: 1.3.0_react@18.2.0
|
||||
tough-cookie: 4.1.2
|
||||
@@ -1582,15 +1580,6 @@ packages:
|
||||
mime-types: 2.1.35
|
||||
dev: false
|
||||
|
||||
/form-data/3.0.1:
|
||||
resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==}
|
||||
engines: {node: '>= 6'}
|
||||
dependencies:
|
||||
asynckit: 0.4.0
|
||||
combined-stream: 1.0.8
|
||||
mime-types: 2.1.35
|
||||
dev: false
|
||||
|
||||
/fraction.js/4.2.0:
|
||||
resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==}
|
||||
dev: true
|
||||
@@ -2299,18 +2288,6 @@ packages:
|
||||
- babel-plugin-macros
|
||||
dev: false
|
||||
|
||||
/node-fetch/2.6.7:
|
||||
resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==}
|
||||
engines: {node: 4.x || >=6.0.0}
|
||||
peerDependencies:
|
||||
encoding: ^0.1.0
|
||||
peerDependenciesMeta:
|
||||
encoding:
|
||||
optional: true
|
||||
dependencies:
|
||||
whatwg-url: 5.0.0
|
||||
dev: false
|
||||
|
||||
/node-os-utils/1.3.7:
|
||||
resolution: {integrity: sha512-fvnX9tZbR7WfCG5BAy3yO/nCLyjVWD6MghEq0z5FDfN+ZXpLWNITBdbifxQkQ25ebr16G0N7eRWJisOcMEHG3Q==}
|
||||
dev: false
|
||||
@@ -2836,15 +2813,6 @@ packages:
|
||||
queue-microtask: 1.2.3
|
||||
dev: true
|
||||
|
||||
/rutorrent-promise/2.0.0:
|
||||
resolution: {integrity: sha512-ip6FxYM/BFxRgYSWr+2gZ0ao9LsJ1vJYWyFVnTkSmZrp4Cwa3CFpdxMi/5aZsUf1qve2CY9P4GLvrACx+PZ6yQ==}
|
||||
dependencies:
|
||||
form-data: 3.0.1
|
||||
node-fetch: 2.6.7
|
||||
transitivePeerDependencies:
|
||||
- encoding
|
||||
dev: false
|
||||
|
||||
/safe-buffer/5.2.1:
|
||||
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
|
||||
dev: false
|
||||
@@ -3207,10 +3175,6 @@ packages:
|
||||
url-parse: 1.5.10
|
||||
dev: false
|
||||
|
||||
/tr46/0.0.3:
|
||||
resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
|
||||
dev: false
|
||||
|
||||
/triple-beam/1.3.0:
|
||||
resolution: {integrity: sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==}
|
||||
dev: false
|
||||
@@ -3346,17 +3310,6 @@ packages:
|
||||
engines: {node: '>=0.10.0'}
|
||||
dev: false
|
||||
|
||||
/webidl-conversions/3.0.1:
|
||||
resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
|
||||
dev: false
|
||||
|
||||
/whatwg-url/5.0.0:
|
||||
resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
|
||||
dependencies:
|
||||
tr46: 0.0.3
|
||||
webidl-conversions: 3.0.1
|
||||
dev: false
|
||||
|
||||
/which-boxed-primitive/1.0.2:
|
||||
resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
|
||||
dependencies:
|
||||
|
||||
@@ -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": "ثلج",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "مفضلة",
|
||||
"service": "خدمة"
|
||||
"service": "خدمة",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "نظام",
|
||||
@@ -430,5 +434,79 @@
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"volumeAvailable": "Available",
|
||||
"uptime": "Uptime"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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": "Изключен",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
@@ -430,5 +434,79 @@
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"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"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"down": "Offline",
|
||||
"grace": "In Grace Period",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Marcador",
|
||||
"service": "Servei"
|
||||
"service": "Servei",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "Sistema",
|
||||
@@ -430,5 +434,79 @@
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"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"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,10 +15,10 @@
|
||||
"missing_type": "Chybí typ widgetu: {{type}}",
|
||||
"api_error": "Chyba API",
|
||||
"status": "Status",
|
||||
"information": "Information",
|
||||
"information": "Informace",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
"raw_error": "",
|
||||
"response_data": "Data odpovědi"
|
||||
},
|
||||
"weather": {
|
||||
"current": "Aktuální poloha",
|
||||
@@ -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": "Status podsystému neznámý"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -58,8 +60,8 @@
|
||||
"mem": "RAM",
|
||||
"cpu": "CPU",
|
||||
"offline": "Offline",
|
||||
"error": "Error",
|
||||
"unknown": "Unknown"
|
||||
"error": "Chyba",
|
||||
"unknown": "Neznámý"
|
||||
},
|
||||
"emby": {
|
||||
"playing": "Přehrává",
|
||||
@@ -148,7 +150,7 @@
|
||||
"pending": "Čeká",
|
||||
"approved": "Schváleno",
|
||||
"available": "Dostupný",
|
||||
"processing": "Processing"
|
||||
"processing": "Zpracováváno"
|
||||
},
|
||||
"pihole": {
|
||||
"queries": "Dotazy",
|
||||
@@ -291,7 +293,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Záložka",
|
||||
"service": "Služba"
|
||||
"service": "Služba",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"update_available": "Dostupná aktualizace",
|
||||
@@ -313,8 +317,8 @@
|
||||
"indexers": "Indexery"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "No Active Streams",
|
||||
"please_wait": "Please Wait"
|
||||
"nothing_streaming": "Žádné aktivní streams",
|
||||
"please_wait": "Prosím vyčkejte"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Speed",
|
||||
@@ -332,8 +336,8 @@
|
||||
"hd": "HD"
|
||||
},
|
||||
"ping": {
|
||||
"error": "Error",
|
||||
"ping": "Ping"
|
||||
"error": "Chyba",
|
||||
"ping": "Odezva"
|
||||
},
|
||||
"scrutiny": {
|
||||
"passed": "Passed",
|
||||
@@ -345,22 +349,22 @@
|
||||
"total": "Total"
|
||||
},
|
||||
"deluge": {
|
||||
"upload": "Upload",
|
||||
"upload": "Nahrávání",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed",
|
||||
"download": "Download"
|
||||
"download": "Stahování"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"download": "Stahování",
|
||||
"upload": "Nahrávání",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
},
|
||||
"tdarr": {
|
||||
"queue": "Queue",
|
||||
"processed": "Processed",
|
||||
"errored": "Errored",
|
||||
"saved": "Saved"
|
||||
"queue": "Fronta",
|
||||
"processed": "Zpracováno",
|
||||
"errored": "Chybné",
|
||||
"saved": "Uložené"
|
||||
},
|
||||
"miniflux": {
|
||||
"read": "Read",
|
||||
@@ -371,19 +375,19 @@
|
||||
"no_devices": "No Device Data Received"
|
||||
},
|
||||
"common": {
|
||||
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
|
||||
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
|
||||
"bibyterate": "",
|
||||
"bibitrate": ""
|
||||
},
|
||||
"omada": {
|
||||
"connectedAp": "Connected APs",
|
||||
"activeUser": "Active devices",
|
||||
"alerts": "Alerts",
|
||||
"connectedGateway": "Connected gateways",
|
||||
"connectedSwitches": "Connected switches"
|
||||
"connectedAp": "Připojené APs",
|
||||
"activeUser": "Aktivní zařízení",
|
||||
"alerts": "Upozornění",
|
||||
"connectedGateway": "Připojené brány",
|
||||
"connectedSwitches": "Připojené přepínače"
|
||||
},
|
||||
"downloadstation": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"download": "Stahování",
|
||||
"upload": "Nahrávání",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
},
|
||||
@@ -430,5 +434,79 @@
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
@@ -287,7 +289,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bogmærker",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Scannet",
|
||||
@@ -430,5 +434,79 @@
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"totalalerts": "Total Alerts",
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"memoryusage": "Memory Usage",
|
||||
"cpuload": "Cpu Load",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Lesezeichen",
|
||||
"service": "Dienst"
|
||||
"service": "Dienst",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
@@ -430,5 +434,79 @@
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"grace": "In Grace Period",
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
|
||||
78
public/locales/en/common.json
Normal file → Executable file
78
public/locales/en/common.json
Normal file → Executable file
@@ -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",
|
||||
@@ -282,7 +284,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"wmo": {
|
||||
"0-day": "Sunny",
|
||||
@@ -350,6 +354,16 @@
|
||||
"child_bridges": "Child Bridges",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Scanned",
|
||||
"containers_updated": "Updated",
|
||||
@@ -432,7 +446,7 @@
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
@@ -445,5 +459,63 @@
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
}
|
||||
}
|
||||
@@ -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",
|
||||
@@ -235,7 +237,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Servo"
|
||||
"service": "Servo",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"wmo": {
|
||||
"0-day": "Suna",
|
||||
@@ -430,5 +434,79 @@
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"activeusers": "Active Users",
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,8 @@
|
||||
"free": "Libre",
|
||||
"used": "Usado",
|
||||
"load": "Carga",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "Recibido",
|
||||
@@ -139,7 +140,7 @@
|
||||
"transmission": {
|
||||
"download": "Bajada",
|
||||
"upload": "Subida",
|
||||
"leech": "Leech",
|
||||
"leech": "Sanguijuela",
|
||||
"seed": "Semillas"
|
||||
},
|
||||
"jackett": {
|
||||
@@ -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",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Marcadores",
|
||||
"service": "Servicio"
|
||||
"service": "Servicio",
|
||||
"search": "Buscar",
|
||||
"custom": "Personalizado"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "Sistema",
|
||||
@@ -416,10 +420,10 @@
|
||||
"series": "Serie"
|
||||
},
|
||||
"octoprint": {
|
||||
"temp_bed": "Bed temp",
|
||||
"temp_bed": "temperatura de la plataforma",
|
||||
"printer_state": "Status",
|
||||
"temp_tool": "Tool temp",
|
||||
"job_completion": "Completion"
|
||||
"temp_tool": "Herramienta de temperatura",
|
||||
"job_completion": "Finalización"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "IP de origen",
|
||||
@@ -427,8 +431,82 @@
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"cpu_usage": "CPU",
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"memory_usage": "Memory"
|
||||
"datastore_usage": "Almacén de datos",
|
||||
"failed_tasks_24h": "Tareas fallidas en 24h",
|
||||
"memory_usage": "Memoria"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Usuarios",
|
||||
"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": "Días",
|
||||
"uptime": "Funcionando",
|
||||
"volumeAvailable": "Disponible"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Cola",
|
||||
"processing": "Procesando",
|
||||
"processed": "Procesado",
|
||||
"time": "Tiempo"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Fuentes de datos",
|
||||
"totalalerts": "Alertas totales",
|
||||
"alertstriggered": "Alertas activadas"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Carga de la CPU",
|
||||
"memoryusage": "Uso de la memoria",
|
||||
"freespace": "Espacio libre",
|
||||
"activeusers": "Usuarios activos"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Estado",
|
||||
"size": "Tamaño",
|
||||
"lastrun": "Última ejecución",
|
||||
"nextrun": "Siguiente ejecución",
|
||||
"failed": "Fallido"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Trabajadores en activo",
|
||||
"total_workers": "Total de trabajadores",
|
||||
"records_total": "Duración de la cola"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "Nuevo",
|
||||
"up": "Conectado",
|
||||
"down": "Desconectado",
|
||||
"grace": "En Periodo de Gracia",
|
||||
"paused": "Pausado",
|
||||
"status": "Estado",
|
||||
"last_ping": "Último Ping",
|
||||
"never": "Aún no hay pings"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
@@ -430,5 +434,79 @@
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,8 @@
|
||||
"free": "Libre",
|
||||
"used": "Utilisé",
|
||||
"load": "Charge",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MÉM"
|
||||
},
|
||||
"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",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Signet",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Recherche",
|
||||
"custom": "Personnalisé"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "Système",
|
||||
@@ -427,8 +431,82 @@
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"failed_tasks_24h": "Tâches échouées 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
"memory_usage": "Mémoire"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Utilisateurs",
|
||||
"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": "Jours",
|
||||
"uptime": "Fonctionnement",
|
||||
"volumeAvailable": "Disponible"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Traitement",
|
||||
"processed": "Traité",
|
||||
"time": "Temps"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Tableau de bord",
|
||||
"datasources": "Sources données",
|
||||
"totalalerts": "Total alertes",
|
||||
"alertstriggered": "Alertes déclenchées"
|
||||
},
|
||||
"nextcloud": {
|
||||
"freespace": "Espace Libre",
|
||||
"activeusers": "Utilisateurs Actifs",
|
||||
"cpuload": "Charge Cpu",
|
||||
"memoryusage": "Utilisation Mémoire"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Statut",
|
||||
"size": "Taille",
|
||||
"lastrun": "Dernière exécution",
|
||||
"nextrun": "Prochaine exécution",
|
||||
"failed": "En erreur"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "En cours",
|
||||
"total_workers": "Total",
|
||||
"records_total": "En attente"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "Nouveau",
|
||||
"up": "En ligne",
|
||||
"grace": "En Période de Grâce",
|
||||
"down": "Hors ligne",
|
||||
"paused": "En Pause",
|
||||
"status": "Statut",
|
||||
"last_ping": "Dernier Ping",
|
||||
"never": "Pas de Ping"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
@@ -430,5 +434,79 @@
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
@@ -225,7 +227,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"wmo": {
|
||||
"0-day": "Sunny",
|
||||
@@ -430,5 +434,79 @@
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Straničnik",
|
||||
"service": "Usluga"
|
||||
"service": "Usluga",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "Sustav",
|
||||
@@ -430,5 +434,79 @@
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"videos": "Videos",
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"alertstriggered": "Alerts Triggered",
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
@@ -430,5 +434,79 @@
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Segnalibro",
|
||||
"service": "Servizio"
|
||||
"service": "Servizio",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "Sistema",
|
||||
@@ -430,5 +434,79 @@
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"memoryusage": "Memory Usage",
|
||||
"cpuload": "Cpu Load",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"wmo": {
|
||||
"0-day": "Sunny",
|
||||
@@ -430,5 +434,79 @@
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"never": "No pings yet",
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
@@ -273,7 +275,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"wmo": {
|
||||
"0-day": "Saulains",
|
||||
@@ -430,5 +434,79 @@
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
@@ -62,7 +64,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Tandabuku",
|
||||
"service": "Servis"
|
||||
"service": "Servis",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"wmo": {
|
||||
"0-day": "Terik",
|
||||
@@ -430,5 +434,79 @@
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
@@ -430,5 +434,79 @@
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
@@ -430,5 +434,79 @@
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"wanted": "Wanted",
|
||||
"series": "Series",
|
||||
"issues": "Issues"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Zakładka",
|
||||
"service": "Usługi"
|
||||
"service": "Usługi",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
@@ -430,5 +434,79 @@
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available",
|
||||
"days": "Days"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,10 +31,10 @@
|
||||
"missing_type": "Tipo de Widget ausente: {{type}}",
|
||||
"api_error": "Erro da API",
|
||||
"status": "Status",
|
||||
"information": "Information",
|
||||
"information": "Informação",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
"response_data": "Dados de Resposta"
|
||||
},
|
||||
"weather": {
|
||||
"current": "Localização atual",
|
||||
@@ -50,16 +50,17 @@
|
||||
"free": "Livre",
|
||||
"used": "Usado",
|
||||
"load": "Carregamento",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "Rx",
|
||||
"tx": "Tx",
|
||||
"mem": "Mem",
|
||||
"rx": "Recebido",
|
||||
"tx": "Transmitido",
|
||||
"mem": "Memória",
|
||||
"cpu": "CPU",
|
||||
"offline": "Desligado",
|
||||
"error": "Error",
|
||||
"unknown": "Unknown"
|
||||
"error": "Erro",
|
||||
"unknown": "Desconhecido"
|
||||
},
|
||||
"emby": {
|
||||
"playing": "Reproduzindo",
|
||||
@@ -99,7 +100,7 @@
|
||||
"wanted": "Desejado",
|
||||
"queued": "Na fila",
|
||||
"movies": "Filmes",
|
||||
"missing": "Missing"
|
||||
"missing": "Faltando"
|
||||
},
|
||||
"lidarr": {
|
||||
"wanted": "Desejado",
|
||||
@@ -129,7 +130,7 @@
|
||||
"pending": "Pendente",
|
||||
"approved": "Aprovado",
|
||||
"available": "Disponível",
|
||||
"processing": "Processing"
|
||||
"processing": "Processando"
|
||||
},
|
||||
"pihole": {
|
||||
"queries": "Consultas",
|
||||
@@ -148,9 +149,9 @@
|
||||
"ping": "Ping"
|
||||
},
|
||||
"traefik": {
|
||||
"routers": "Rotas",
|
||||
"routers": "Roteadores",
|
||||
"services": "Serviços",
|
||||
"middleware": "Middleware"
|
||||
"middleware": "Software intermediario"
|
||||
},
|
||||
"npm": {
|
||||
"enabled": "Habilitado",
|
||||
@@ -164,10 +165,10 @@
|
||||
},
|
||||
"prowlarr": {
|
||||
"enableIndexers": "Indexadores",
|
||||
"numberOfGrabs": "Grabs",
|
||||
"numberOfQueries": "Queries",
|
||||
"numberOfGrabs": "Pegos",
|
||||
"numberOfQueries": "Consultas",
|
||||
"numberOfFailGrabs": "Fail Grabs",
|
||||
"numberOfFailQueries": "Fail Queries"
|
||||
"numberOfFailQueries": "Consultas Falhas"
|
||||
},
|
||||
"jackett": {
|
||||
"configured": "Configurado",
|
||||
@@ -179,36 +180,37 @@
|
||||
"domain_count": "Domínios"
|
||||
},
|
||||
"authentik": {
|
||||
"users": "Users",
|
||||
"users": "Usuários",
|
||||
"loginsLast24H": "Logins (24h)",
|
||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||
},
|
||||
"proxmox": {
|
||||
"mem": "MEM",
|
||||
"cpu": "CPU",
|
||||
"mem": "Memória",
|
||||
"cpu": "Processador",
|
||||
"lxc": "LXC",
|
||||
"vms": "VMs"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Users",
|
||||
"uptime": "System Uptime",
|
||||
"days": "Days",
|
||||
"users": "Usuários",
|
||||
"uptime": "Tempo de Funcionamento",
|
||||
"days": "Dias",
|
||||
"wan": "WAN",
|
||||
"lan_users": "LAN Users",
|
||||
"wlan_users": "WLAN Users",
|
||||
"up": "UP",
|
||||
"down": "DOWN",
|
||||
"wait": "Please wait",
|
||||
"lan_users": "Usuarios locais",
|
||||
"wlan_users": "Usuarios WLAN",
|
||||
"up": "LIGADO",
|
||||
"down": "CÁIDO",
|
||||
"wait": "Por favor guarde",
|
||||
"lan": "LAN",
|
||||
"wlan": "WLAN",
|
||||
"devices": "Devices",
|
||||
"lan_devices": "LAN Devices",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
"devices": "Dispositivos",
|
||||
"lan_devices": "Dispositivos LAN",
|
||||
"wlan_devices": "Dispositivos WLAN",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
"movies": "Movies",
|
||||
"tv": "TV Shows"
|
||||
"streams": "Transmissões ativas",
|
||||
"movies": "Filmes",
|
||||
"tv": "Séries de TV"
|
||||
},
|
||||
"glances": {
|
||||
"cpu": "CPU",
|
||||
@@ -222,10 +224,10 @@
|
||||
"wmo": {
|
||||
"1-night": "Mainly Clear",
|
||||
"2-day": "Partly Cloudy",
|
||||
"2-night": "Partly Cloudy",
|
||||
"3-day": "Cloudy",
|
||||
"3-night": "Cloudy",
|
||||
"45-day": "Foggy",
|
||||
"2-night": "Parcialmente nublado",
|
||||
"3-day": "Nublado",
|
||||
"3-night": "Nublado",
|
||||
"45-day": "Névoa",
|
||||
"45-night": "Foggy",
|
||||
"48-day": "Foggy",
|
||||
"48-night": "Foggy",
|
||||
@@ -233,9 +235,9 @@
|
||||
"57-day": "Freezing Drizzle",
|
||||
"99-day": "Thunderstorm With Hail",
|
||||
"99-night": "Thunderstorm With Hail",
|
||||
"0-day": "Sunny",
|
||||
"0-day": "Ensolarado",
|
||||
"53-day": "Drizzle",
|
||||
"0-night": "Clear",
|
||||
"0-night": "Limpo",
|
||||
"1-day": "Mainly Sunny",
|
||||
"51-day": "Light Drizzle",
|
||||
"51-night": "Light Drizzle",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
@@ -313,8 +317,8 @@
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "No Active Streams",
|
||||
"please_wait": "Please Wait"
|
||||
"nothing_streaming": "Sem transmissões ativas",
|
||||
"please_wait": "Por favor aguarde"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Speed",
|
||||
@@ -332,7 +336,7 @@
|
||||
"hd": "HD"
|
||||
},
|
||||
"ping": {
|
||||
"error": "Error",
|
||||
"error": "Erro",
|
||||
"ping": "Ping"
|
||||
},
|
||||
"scrutiny": {
|
||||
@@ -357,14 +361,14 @@
|
||||
"seed": "Seed"
|
||||
},
|
||||
"tdarr": {
|
||||
"queue": "Queue",
|
||||
"processed": "Processed",
|
||||
"errored": "Errored",
|
||||
"saved": "Saved"
|
||||
"queue": "Fila",
|
||||
"processed": "Processado",
|
||||
"errored": "Erro",
|
||||
"saved": "Salvo"
|
||||
},
|
||||
"miniflux": {
|
||||
"read": "Read",
|
||||
"unread": "Unread"
|
||||
"read": "Lidos",
|
||||
"unread": "Não Lidos"
|
||||
},
|
||||
"nextdns": {
|
||||
"wait": "Please Wait",
|
||||
@@ -375,11 +379,11 @@
|
||||
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
|
||||
},
|
||||
"omada": {
|
||||
"connectedAp": "Connected APs",
|
||||
"activeUser": "Active devices",
|
||||
"alerts": "Alerts",
|
||||
"connectedGateway": "Connected gateways",
|
||||
"connectedSwitches": "Connected switches"
|
||||
"connectedAp": "Pontos de acesso conectados",
|
||||
"activeUser": "Dispositivos ativos",
|
||||
"alerts": "Alertas",
|
||||
"connectedGateway": "Gateways conectados",
|
||||
"connectedSwitches": "Interruptores conectados"
|
||||
},
|
||||
"downloadstation": {
|
||||
"download": "Download",
|
||||
@@ -430,5 +434,79 @@
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"videos": "Videos",
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
@@ -292,7 +294,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Marcador",
|
||||
"service": "Serviço"
|
||||
"service": "Serviço",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "Sistema",
|
||||
@@ -439,5 +443,79 @@
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"never": "No pings yet",
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"update_available": "Update Available",
|
||||
@@ -430,5 +434,79 @@
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"activeusers": "Active Users",
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
@@ -430,5 +434,79 @@
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
@@ -430,5 +434,79 @@
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
@@ -430,5 +434,79 @@
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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": "యాక్టివ్ స్ట్రీమ్లు",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "బుక్మార్క్",
|
||||
"service": "సేవ"
|
||||
"service": "సేవ",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "వ్యవస్థ",
|
||||
@@ -430,5 +434,79 @@
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"cpuload": "Cpu Load",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
|
||||
512
public/locales/th/common.json
Normal file
512
public/locales/th/common.json
Normal file
@@ -0,0 +1,512 @@
|
||||
{
|
||||
"navidrome": {
|
||||
"nothing_streaming": "No Active Streams",
|
||||
"please_wait": "Please Wait"
|
||||
},
|
||||
"npm": {
|
||||
"enabled": "Enabled",
|
||||
"disabled": "Disabled",
|
||||
"total": "Total"
|
||||
},
|
||||
"coinmarketcap": {
|
||||
"configure": "Configure one or more crypto currencies to track",
|
||||
"1hour": "1 Hour",
|
||||
"1day": "1 Day",
|
||||
"7days": "7 Days",
|
||||
"30days": "30 Days"
|
||||
},
|
||||
"pyload": {
|
||||
"queue": "Queue",
|
||||
"total": "Total",
|
||||
"speed": "Speed",
|
||||
"active": "Active"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"hd": "HD"
|
||||
},
|
||||
"scrutiny": {
|
||||
"passed": "Passed",
|
||||
"failed": "Failed",
|
||||
"unknown": "Unknown"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
"tx": "TX",
|
||||
"mem": "เมม",
|
||||
"cpu": "ซีพียู",
|
||||
"offline": "ออฟไลน์",
|
||||
"error": "ข้อผิดพลาด",
|
||||
"unknown": "ไม่ทราบ"
|
||||
},
|
||||
"common": {
|
||||
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
|
||||
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
|
||||
},
|
||||
"unifi": {
|
||||
"days": "วัน",
|
||||
"wan": "WAN",
|
||||
"lan": "แลน",
|
||||
"wlan": "WLAN",
|
||||
"devices": "อุปกรณ์",
|
||||
"lan_devices": "อุปกรณ์แลน",
|
||||
"wlan_devices": "WLAN Devices",
|
||||
"lan_users": "LAN Users",
|
||||
"wlan_users": "WLAN Users",
|
||||
"up": "UP",
|
||||
"down": "DOWN",
|
||||
"wait": "Please wait",
|
||||
"empty_data": "Subsystem status unknown",
|
||||
"users": "ผู้ใช้",
|
||||
"uptime": "เวลาทำงานของระบบ"
|
||||
},
|
||||
"widget": {
|
||||
"missing_type": "Missing Widget Type: {{type}}",
|
||||
"api_error": "API มีข้อผิดพลาด",
|
||||
"information": "ข้อมูล",
|
||||
"status": "สถานะ",
|
||||
"url": "URL",
|
||||
"raw_error": "ข้อมูลต้นฉบับผิดพลาด",
|
||||
"response_data": "ข้อมูลการตอบกลับ"
|
||||
},
|
||||
"weather": {
|
||||
"current": "สถานที่ปัจจุบัน",
|
||||
"allow": "คลิกเพื่ออนุญาต",
|
||||
"updating": "กำลังปรับปรุง",
|
||||
"wait": "โปรดรอ"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "ค้นหา…"
|
||||
},
|
||||
"resources": {
|
||||
"cpu": "ซีพียู",
|
||||
"mem": "เมม",
|
||||
"total": "ทั้งหมด",
|
||||
"free": "ฟรี",
|
||||
"used": "ใช้แล้ว",
|
||||
"load": "โหลด"
|
||||
},
|
||||
"ping": {
|
||||
"error": "ข้อผิดพลาด",
|
||||
"ping": "ปิง"
|
||||
},
|
||||
"emby": {
|
||||
"playing": "กำลังเล่น",
|
||||
"transcoding": "การแปลงรหัส",
|
||||
"bitrate": "อัตราบิต",
|
||||
"no_active": "ไม่มีสตรีมที่ใช้งานอยู่"
|
||||
},
|
||||
"deluge": {
|
||||
"download": "ดาวน์โหลด",
|
||||
"upload": "Upload",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
},
|
||||
"flood": {
|
||||
"download": "ดาวน์โหลด",
|
||||
"upload": "อัพโหลด",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
},
|
||||
"changedetectionio": {
|
||||
"totalObserved": "Total Observed",
|
||||
"diffsDetected": "Diffs Detected"
|
||||
},
|
||||
"tautulli": {
|
||||
"playing": "Playing",
|
||||
"transcoding": "Transcoding",
|
||||
"bitrate": "Bitrate",
|
||||
"no_active": "No Active Streams"
|
||||
},
|
||||
"omada": {
|
||||
"connectedAp": "Connected APs",
|
||||
"activeUser": "Active devices",
|
||||
"alerts": "Alerts",
|
||||
"connectedGateway": "Connected gateways",
|
||||
"connectedSwitches": "Connected switches"
|
||||
},
|
||||
"nzbget": {
|
||||
"rate": "Rate",
|
||||
"remaining": "Remaining",
|
||||
"downloaded": "Downloaded"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
"movies": "Movies",
|
||||
"tv": "TV Shows"
|
||||
},
|
||||
"sabnzbd": {
|
||||
"rate": "Rate",
|
||||
"queue": "Queue",
|
||||
"timeleft": "Time Left"
|
||||
},
|
||||
"rutorrent": {
|
||||
"active": "Active",
|
||||
"upload": "Upload",
|
||||
"download": "Download"
|
||||
},
|
||||
"transmission": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
},
|
||||
"qbittorrent": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
},
|
||||
"downloadstation": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
},
|
||||
"sonarr": {
|
||||
"wanted": "Wanted",
|
||||
"queued": "Queued",
|
||||
"series": "Series"
|
||||
},
|
||||
"readarr": {
|
||||
"queued": "Queued",
|
||||
"books": "Books",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"tdarr": {
|
||||
"queue": "Queue",
|
||||
"processed": "Processed",
|
||||
"errored": "Errored",
|
||||
"saved": "Saved"
|
||||
},
|
||||
"traefik": {
|
||||
"routers": "Routers",
|
||||
"services": "Services",
|
||||
"middleware": "Middleware"
|
||||
},
|
||||
"bazarr": {
|
||||
"missingEpisodes": "Missing Episodes",
|
||||
"missingMovies": "Missing Movies"
|
||||
},
|
||||
"radarr": {
|
||||
"wanted": "Wanted",
|
||||
"missing": "Missing",
|
||||
"queued": "Queued",
|
||||
"movies": "Movies"
|
||||
},
|
||||
"lidarr": {
|
||||
"wanted": "Wanted",
|
||||
"queued": "Queued",
|
||||
"albums": "Albums"
|
||||
},
|
||||
"ombi": {
|
||||
"pending": "Pending",
|
||||
"approved": "Approved",
|
||||
"available": "Available"
|
||||
},
|
||||
"jellyseerr": {
|
||||
"pending": "Pending",
|
||||
"approved": "Approved",
|
||||
"available": "Available"
|
||||
},
|
||||
"overseerr": {
|
||||
"pending": "Pending",
|
||||
"processing": "Processing",
|
||||
"approved": "Approved",
|
||||
"available": "Available"
|
||||
},
|
||||
"pihole": {
|
||||
"queries": "Queries",
|
||||
"blocked": "Blocked",
|
||||
"gravity": "Gravity"
|
||||
},
|
||||
"adguard": {
|
||||
"queries": "Queries",
|
||||
"blocked": "Blocked",
|
||||
"filtered": "Filtered",
|
||||
"latency": "Latency"
|
||||
},
|
||||
"speedtest": {
|
||||
"upload": "Upload",
|
||||
"download": "Download",
|
||||
"ping": "Ping"
|
||||
},
|
||||
"portainer": {
|
||||
"running": "Running",
|
||||
"stopped": "Stopped",
|
||||
"total": "Total"
|
||||
},
|
||||
"gotify": {
|
||||
"apps": "Applications",
|
||||
"clients": "Clients",
|
||||
"messages": "Messages"
|
||||
},
|
||||
"prowlarr": {
|
||||
"enableIndexers": "Indexers",
|
||||
"numberOfGrabs": "Grabs",
|
||||
"numberOfQueries": "Queries",
|
||||
"numberOfFailGrabs": "Fail Grabs",
|
||||
"numberOfFailQueries": "Fail Queries"
|
||||
},
|
||||
"jackett": {
|
||||
"configured": "Configured",
|
||||
"errored": "Errored"
|
||||
},
|
||||
"strelaysrv": {
|
||||
"numActiveSessions": "Sessions",
|
||||
"numConnections": "Connections",
|
||||
"dataRelayed": "Relayed",
|
||||
"transferRate": "Rate"
|
||||
},
|
||||
"mastodon": {
|
||||
"user_count": "Users",
|
||||
"status_count": "Posts",
|
||||
"domain_count": "Domains"
|
||||
},
|
||||
"medusa": {
|
||||
"wanted": "Wanted",
|
||||
"queued": "Queued",
|
||||
"series": "Series"
|
||||
},
|
||||
"miniflux": {
|
||||
"read": "Read",
|
||||
"unread": "Unread"
|
||||
},
|
||||
"authentik": {
|
||||
"users": "Users",
|
||||
"loginsLast24H": "Logins (24h)",
|
||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||
},
|
||||
"proxmox": {
|
||||
"mem": "MEM",
|
||||
"cpu": "CPU",
|
||||
"lxc": "LXC",
|
||||
"vms": "VMs"
|
||||
},
|
||||
"glances": {
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM",
|
||||
"wait": "Please wait"
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"wmo": {
|
||||
"67-day": "Freezing Rain",
|
||||
"0-day": "Sunny",
|
||||
"0-night": "Clear",
|
||||
"1-day": "Mainly Sunny",
|
||||
"1-night": "Mainly Clear",
|
||||
"65-day": "Heavy Rain",
|
||||
"65-night": "Heavy Rain",
|
||||
"66-day": "Freezing Rain",
|
||||
"66-night": "Freezing Rain",
|
||||
"2-day": "Partly Cloudy",
|
||||
"2-night": "Partly Cloudy",
|
||||
"3-day": "Cloudy",
|
||||
"3-night": "Cloudy",
|
||||
"45-day": "Foggy",
|
||||
"45-night": "Foggy",
|
||||
"48-day": "Foggy",
|
||||
"48-night": "Foggy",
|
||||
"51-day": "Light Drizzle",
|
||||
"51-night": "Light Drizzle",
|
||||
"53-day": "Drizzle",
|
||||
"53-night": "Drizzle",
|
||||
"55-day": "Heavy Drizzle",
|
||||
"55-night": "Heavy Drizzle",
|
||||
"56-day": "Light Freezing Drizzle",
|
||||
"56-night": "Light Freezing Drizzle",
|
||||
"57-day": "Freezing Drizzle",
|
||||
"57-night": "Freezing Drizzle",
|
||||
"61-day": "Light Rain",
|
||||
"61-night": "Light Rain",
|
||||
"63-day": "Rain",
|
||||
"63-night": "Rain",
|
||||
"67-night": "Freezing Rain",
|
||||
"75-night": "Heavy Snow",
|
||||
"77-day": "Snow Grains",
|
||||
"77-night": "Snow Grains",
|
||||
"80-day": "Light Showers",
|
||||
"80-night": "Light Showers",
|
||||
"81-day": "Showers",
|
||||
"81-night": "Showers",
|
||||
"82-day": "Heavy Showers",
|
||||
"82-night": "Heavy Showers",
|
||||
"85-day": "Snow Showers",
|
||||
"85-night": "Snow Showers",
|
||||
"71-day": "Light Snow",
|
||||
"71-night": "Light Snow",
|
||||
"73-day": "Snow",
|
||||
"73-night": "Snow",
|
||||
"75-day": "Heavy Snow",
|
||||
"86-day": "Snow Showers",
|
||||
"86-night": "Snow Showers",
|
||||
"95-day": "Thunderstorm",
|
||||
"95-night": "Thunderstorm",
|
||||
"96-day": "Thunderstorm With Hail",
|
||||
"96-night": "Thunderstorm With Hail",
|
||||
"99-day": "Thunderstorm With Hail",
|
||||
"99-night": "Thunderstorm With Hail"
|
||||
},
|
||||
"homebridge": {
|
||||
"updates": "Updates",
|
||||
"update_available": "Update Available",
|
||||
"up_to_date": "Up to Date",
|
||||
"child_bridges": "Child Bridges",
|
||||
"child_bridges_status": "{{ok}}/{{total}}",
|
||||
"available_update": "System"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Scanned",
|
||||
"containers_updated": "Updated",
|
||||
"containers_failed": "Failed"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Approved",
|
||||
"rejectedPushes": "Rejected",
|
||||
"filters": "Filters",
|
||||
"indexers": "Indexers"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Queue",
|
||||
"videos": "Videos",
|
||||
"channels": "Channels",
|
||||
"playlists": "Playlists"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "System Load",
|
||||
"uptime": "Uptime",
|
||||
"alerts": "Alerts",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"paperlessngx": {
|
||||
"inbox": "Inbox",
|
||||
"total": "Total"
|
||||
},
|
||||
"nextdns": {
|
||||
"wait": "Please Wait",
|
||||
"no_devices": "No Device Data Received"
|
||||
},
|
||||
"mikrotik": {
|
||||
"cpuLoad": "CPU Load",
|
||||
"memoryUsed": "Memory Used",
|
||||
"uptime": "Uptime",
|
||||
"numberOfLeases": "Leases"
|
||||
},
|
||||
"xteve": {
|
||||
"streams_all": "All Streams",
|
||||
"streams_active": "Active Streams",
|
||||
"streams_xepg": "XEPG Channels"
|
||||
},
|
||||
"opnsense": {
|
||||
"cpu": "CPU Load",
|
||||
"memory": "Active Memory",
|
||||
"wanUpload": "WAN Upload",
|
||||
"wanDownload": "WAN Download"
|
||||
},
|
||||
"moonraker": {
|
||||
"printer_state": "Printer State",
|
||||
"print_status": "Print Status",
|
||||
"print_progress": "Progress",
|
||||
"layers": "Layers"
|
||||
},
|
||||
"octoprint": {
|
||||
"printer_state": "Status",
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "เว็บไซต์ ล่ม",
|
||||
"uptime": "เวลาทำงาน",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
@@ -3,10 +3,10 @@
|
||||
"missing_type": "Kayıp Araç Türü: {{type}}",
|
||||
"api_error": "API Hatası",
|
||||
"status": "Durum",
|
||||
"information": "Information",
|
||||
"information": "Bilgi",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
"raw_error": "Ham Hata",
|
||||
"response_data": "Yanıt Verisi"
|
||||
},
|
||||
"weather": {
|
||||
"current": "Mevcut Konum",
|
||||
@@ -18,11 +18,12 @@
|
||||
"placeholder": "Ara…"
|
||||
},
|
||||
"resources": {
|
||||
"cpu": "İşlemci",
|
||||
"cpu": "CPU",
|
||||
"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": "Alt sistem durumu bilinmiyor"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "Gelen Veri",
|
||||
@@ -46,8 +48,8 @@
|
||||
"mem": "Bellek",
|
||||
"cpu": "İşlemci",
|
||||
"offline": "Çevrimdışı",
|
||||
"error": "Error",
|
||||
"unknown": "Unknown"
|
||||
"error": "Hata",
|
||||
"unknown": "Bilinmiyor"
|
||||
},
|
||||
"emby": {
|
||||
"playing": "Oynatılıyor",
|
||||
@@ -89,7 +91,7 @@
|
||||
},
|
||||
"qbittorrent": {
|
||||
"download": "İndirme",
|
||||
"upload": "Yükleme",
|
||||
"upload": "Yükle",
|
||||
"leech": "İsteyen",
|
||||
"seed": "Sunan"
|
||||
},
|
||||
@@ -132,7 +134,7 @@
|
||||
"pending": "Bekliyor",
|
||||
"approved": "Onaylı",
|
||||
"available": "Kullanılabilir",
|
||||
"processing": "Processing"
|
||||
"processing": "İşleniyor"
|
||||
},
|
||||
"pihole": {
|
||||
"queries": "Sorgular",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Yer İmi",
|
||||
"service": "Hizmet"
|
||||
"service": "Hizmet",
|
||||
"search": "Ara",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "Sistem",
|
||||
@@ -323,112 +327,186 @@
|
||||
"total": "Toplam"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
"public_ip": "Açık IP",
|
||||
"region": "Bölge",
|
||||
"country": "Ülke"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"channels": "Kanallar",
|
||||
"hd": "HD"
|
||||
},
|
||||
"ping": {
|
||||
"error": "Error",
|
||||
"error": "Hata",
|
||||
"ping": "Ping"
|
||||
},
|
||||
"scrutiny": {
|
||||
"passed": "Passed",
|
||||
"failed": "Failed",
|
||||
"unknown": "Unknown"
|
||||
"passed": "Geçti",
|
||||
"failed": "Başarısız",
|
||||
"unknown": "Bilinmeyen"
|
||||
},
|
||||
"paperlessngx": {
|
||||
"inbox": "Inbox",
|
||||
"total": "Total"
|
||||
"inbox": "Gelen Kutusu",
|
||||
"total": "Toplam"
|
||||
},
|
||||
"deluge": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"download": "İndir",
|
||||
"upload": "Yükle",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
"seed": "Tohum"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"download": "İndir",
|
||||
"upload": "Yükle",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
"seed": "Tohum"
|
||||
},
|
||||
"tdarr": {
|
||||
"queue": "Queue",
|
||||
"processed": "Processed",
|
||||
"errored": "Errored",
|
||||
"saved": "Saved"
|
||||
"queue": "Sıra",
|
||||
"processed": "İşlendi",
|
||||
"errored": "Hatalı",
|
||||
"saved": "Kaydedildi"
|
||||
},
|
||||
"miniflux": {
|
||||
"read": "Read",
|
||||
"unread": "Unread"
|
||||
"read": "Oku",
|
||||
"unread": "Okunmamış"
|
||||
},
|
||||
"nextdns": {
|
||||
"wait": "Please Wait",
|
||||
"no_devices": "No Device Data Received"
|
||||
"wait": "Lütfen Bekle",
|
||||
"no_devices": "Cihaz Verisi Alınamadı"
|
||||
},
|
||||
"common": {
|
||||
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
|
||||
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
|
||||
},
|
||||
"omada": {
|
||||
"connectedAp": "Connected APs",
|
||||
"activeUser": "Active devices",
|
||||
"alerts": "Alerts",
|
||||
"connectedGateway": "Connected gateways",
|
||||
"connectedSwitches": "Connected switches"
|
||||
"connectedAp": "Bağlı AP'ler",
|
||||
"activeUser": "Aktif cihazlar",
|
||||
"alerts": "Alarmlar",
|
||||
"connectedGateway": "Bağlı ağ geçitleri",
|
||||
"connectedSwitches": "Bağlı anahtarlar"
|
||||
},
|
||||
"downloadstation": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"download": "İndir",
|
||||
"upload": "Yükle",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
"seed": "Tohum"
|
||||
},
|
||||
"mikrotik": {
|
||||
"cpuLoad": "CPU Load",
|
||||
"memoryUsed": "Memory Used",
|
||||
"uptime": "Uptime",
|
||||
"cpuLoad": "CPU Yükü",
|
||||
"memoryUsed": "Bellek Kullanımı",
|
||||
"uptime": "Çalışma Süresi",
|
||||
"numberOfLeases": "Leases"
|
||||
},
|
||||
"xteve": {
|
||||
"streams_all": "All Streams",
|
||||
"streams_active": "Active Streams",
|
||||
"streams_xepg": "XEPG Channels"
|
||||
"streams_all": "Tüm Akışlar",
|
||||
"streams_active": "Aktif Akışlar",
|
||||
"streams_xepg": "XEPG Kanalları"
|
||||
},
|
||||
"opnsense": {
|
||||
"cpu": "CPU Load",
|
||||
"memory": "Active Memory",
|
||||
"wanUpload": "WAN Upload",
|
||||
"wanDownload": "WAN Download"
|
||||
"cpu": "CPU Yükü",
|
||||
"memory": "Aktif Bellek",
|
||||
"wanUpload": "WAN Yükleme",
|
||||
"wanDownload": "WAN İndirme"
|
||||
},
|
||||
"moonraker": {
|
||||
"printer_state": "Printer State",
|
||||
"print_status": "Print Status",
|
||||
"print_progress": "Progress",
|
||||
"layers": "Layers"
|
||||
"printer_state": "Yazıcı Durumu",
|
||||
"print_status": "Yazıcı Durumu",
|
||||
"print_progress": "İlerleme",
|
||||
"layers": "Katmanlar"
|
||||
},
|
||||
"medusa": {
|
||||
"wanted": "Wanted",
|
||||
"queued": "Queued",
|
||||
"series": "Series"
|
||||
"queued": "Kuyrukta",
|
||||
"series": "Seri"
|
||||
},
|
||||
"octoprint": {
|
||||
"printer_state": "Status",
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"printer_state": "Durum",
|
||||
"temp_tool": "Araç sıcaklığı",
|
||||
"temp_bed": "Yatak sıcaklığı",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
"status": "Durum"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
"memory_usage": "Bellek"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Kullanıcılar",
|
||||
"photos": "Fotoğraflar",
|
||||
"videos": "Videolar",
|
||||
"storage": "Depo"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Çalışma Süresi",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Kütüphane",
|
||||
"series": "Series",
|
||||
"books": "Kitaplar"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Seriler",
|
||||
"issues": "Sorunlar",
|
||||
"wanted": "Aranan"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albümler",
|
||||
"photos": "Fotoğraflar",
|
||||
"videos": "Videolar",
|
||||
"people": "İnsan"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Gün",
|
||||
"uptime": "Çalışma Süresi",
|
||||
"volumeAvailable": "Mevcut"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -127,7 +127,8 @@
|
||||
"total": "Всього",
|
||||
"free": "Вільно",
|
||||
"used": "Використано",
|
||||
"load": "Навантаження"
|
||||
"load": "Навантаження",
|
||||
"mem": "Пам'ять"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Користувачі",
|
||||
@@ -143,7 +144,8 @@
|
||||
"wlan_users": "WLAN користувачі",
|
||||
"up": "Відправка",
|
||||
"down": "Завантаження",
|
||||
"wait": "Будь ласка, зачекайте"
|
||||
"wait": "Будь ласка, зачекайте",
|
||||
"empty_data": "Статус підсистеми невідомий"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -341,7 +343,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Закладка",
|
||||
"service": "Сервіс"
|
||||
"service": "Сервіс",
|
||||
"search": "Пошук",
|
||||
"custom": "Користувацький"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "Система",
|
||||
@@ -426,9 +430,83 @@
|
||||
"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": "Користувачі",
|
||||
"photos": "Фотографії",
|
||||
"videos": "Відео",
|
||||
"storage": "Сховище"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Активні сайти",
|
||||
"down": "Неактивні сайти",
|
||||
"uptime": "Час роботи",
|
||||
"incident": "Інцидент",
|
||||
"m": "хв"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Бібліотеки",
|
||||
"series": "Серії",
|
||||
"books": "Книжки"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Серії",
|
||||
"issues": "Питання",
|
||||
"wanted": "Розшукується"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Альбоми",
|
||||
"photos": "Фото",
|
||||
"videos": "Відео",
|
||||
"people": "Люди"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Днів",
|
||||
"uptime": "Час роботи",
|
||||
"volumeAvailable": "Доступно"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Черга",
|
||||
"processing": "Обробка",
|
||||
"processed": "Оброблено",
|
||||
"time": "Час"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Інформаційні панелі",
|
||||
"datasources": "Джерела даних",
|
||||
"totalalerts": "Всього сповіщень",
|
||||
"alertstriggered": "Спрацювали сповіщення"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Навантаження Cpu",
|
||||
"memoryusage": "Використання пам'яті",
|
||||
"freespace": "Вільного місця",
|
||||
"activeusers": "Активні користувачі"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Статус",
|
||||
"size": "Розмір",
|
||||
"lastrun": "Останній запуск",
|
||||
"nextrun": "Наступний запуск",
|
||||
"failed": "Помилка"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Активні працівники",
|
||||
"total_workers": "Всього робітників",
|
||||
"records_total": "Довжина черги"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"down": "Offline",
|
||||
"grace": "In Grace Period",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
@@ -430,5 +434,79 @@
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People",
|
||||
"albums": "Albums"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
@@ -430,5 +434,79 @@
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processed": "Processed",
|
||||
"time": "Time",
|
||||
"processing": "Processing"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed",
|
||||
"status": "Status",
|
||||
"size": "Size"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,20 +3,21 @@
|
||||
"missing_type": "缺少小部件类型:{{type}}",
|
||||
"api_error": "API错误",
|
||||
"status": "状态",
|
||||
"information": "Information",
|
||||
"information": "信息",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
"raw_error": "原始错误",
|
||||
"response_data": "返回数据"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "搜索…"
|
||||
},
|
||||
"resources": {
|
||||
"total": "共",
|
||||
"total": "总计",
|
||||
"free": "空闲",
|
||||
"used": "已用",
|
||||
"load": "负载",
|
||||
"cpu": "CPU"
|
||||
"cpu": "处理器",
|
||||
"mem": "内存"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "接收",
|
||||
@@ -24,8 +25,8 @@
|
||||
"mem": "内存",
|
||||
"cpu": "处理器",
|
||||
"offline": "离线",
|
||||
"error": "Error",
|
||||
"unknown": "Unknown"
|
||||
"error": "错误",
|
||||
"unknown": "未知"
|
||||
},
|
||||
"emby": {
|
||||
"playing": "播放中",
|
||||
@@ -186,8 +187,8 @@
|
||||
"proxmox": {
|
||||
"mem": "内存",
|
||||
"cpu": "处理器",
|
||||
"lxc": "LXC",
|
||||
"vms": "VMs"
|
||||
"lxc": "容器",
|
||||
"vms": "虚拟机"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "用户",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "无线局域网",
|
||||
"devices": "设备",
|
||||
"lan_devices": "局域网设备",
|
||||
"wlan_devices": "无线局域网设备"
|
||||
"wlan_devices": "无线局域网设备",
|
||||
"empty_data": "子系统状态未知"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "活动流",
|
||||
@@ -228,8 +230,8 @@
|
||||
"45-day": "有雾",
|
||||
"48-day": "有雾",
|
||||
"51-day": "小雨",
|
||||
"73-night": "Snow",
|
||||
"75-day": "Heavy Snow",
|
||||
"73-night": "中雪",
|
||||
"75-day": "大雪",
|
||||
"1-night": "大部晴朗",
|
||||
"2-day": "多云",
|
||||
"2-night": "多云",
|
||||
@@ -254,10 +256,10 @@
|
||||
"66-night": "Freezing Rain",
|
||||
"67-day": "Freezing Rain",
|
||||
"67-night": "Freezing Rain",
|
||||
"71-day": "Light Snow",
|
||||
"71-night": "Light Snow",
|
||||
"73-day": "Snow",
|
||||
"75-night": "Heavy Snow",
|
||||
"71-day": "小雪",
|
||||
"71-night": "小雪",
|
||||
"73-day": "中雪",
|
||||
"75-night": "大雪",
|
||||
"77-day": "Snow Grains",
|
||||
"77-night": "Snow Grains",
|
||||
"80-day": "Light Showers",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "书签",
|
||||
"service": "服务"
|
||||
"service": "服务",
|
||||
"search": "搜索",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
@@ -307,8 +311,8 @@
|
||||
"playlists": "Playlists"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "System Load",
|
||||
"uptime": "Uptime",
|
||||
"load": "系统负载",
|
||||
"uptime": "运行时间",
|
||||
"alerts": "警报",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
@@ -332,7 +336,7 @@
|
||||
"hd": "HD"
|
||||
},
|
||||
"ping": {
|
||||
"error": "Error",
|
||||
"error": "错误",
|
||||
"ping": "Ping"
|
||||
},
|
||||
"scrutiny": {
|
||||
@@ -345,22 +349,22 @@
|
||||
"total": "Total"
|
||||
},
|
||||
"deluge": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
"download": "下载",
|
||||
"upload": "上传",
|
||||
"leech": "下载中",
|
||||
"seed": "做种"
|
||||
},
|
||||
"flood": {
|
||||
"leech": "Leech",
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"seed": "Seed"
|
||||
"leech": "下载中",
|
||||
"download": "下载",
|
||||
"upload": "上传",
|
||||
"seed": "做种"
|
||||
},
|
||||
"tdarr": {
|
||||
"saved": "Saved",
|
||||
"queue": "Queue",
|
||||
"queue": "队列",
|
||||
"processed": "Processed",
|
||||
"errored": "Errored"
|
||||
"errored": "出错"
|
||||
},
|
||||
"miniflux": {
|
||||
"read": "Read",
|
||||
@@ -376,22 +380,22 @@
|
||||
},
|
||||
"omada": {
|
||||
"connectedAp": "Connected APs",
|
||||
"activeUser": "Active devices",
|
||||
"alerts": "Alerts",
|
||||
"connectedGateway": "Connected gateways",
|
||||
"connectedSwitches": "Connected switches"
|
||||
"activeUser": "活跃设备",
|
||||
"alerts": "警报",
|
||||
"connectedGateway": "已连接网关",
|
||||
"connectedSwitches": "已连接开关"
|
||||
},
|
||||
"downloadstation": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
"download": "下载",
|
||||
"upload": "上传",
|
||||
"leech": "下载中",
|
||||
"seed": "做种"
|
||||
},
|
||||
"mikrotik": {
|
||||
"cpuLoad": "CPU Load",
|
||||
"memoryUsed": "Memory Used",
|
||||
"uptime": "Uptime",
|
||||
"numberOfLeases": "Leases"
|
||||
"cpuLoad": "处理器负载",
|
||||
"memoryUsed": "内存使用",
|
||||
"uptime": "运行时间",
|
||||
"numberOfLeases": "已连接"
|
||||
},
|
||||
"xteve": {
|
||||
"streams_all": "All Streams",
|
||||
@@ -399,10 +403,10 @@
|
||||
"streams_xepg": "XEPG Channels"
|
||||
},
|
||||
"opnsense": {
|
||||
"cpu": "CPU Load",
|
||||
"memory": "Active Memory",
|
||||
"wanUpload": "WAN Upload",
|
||||
"wanDownload": "WAN Download"
|
||||
"cpu": "处理器负载",
|
||||
"memory": "空闲内存",
|
||||
"wanUpload": "WAN上传",
|
||||
"wanDownload": "WAN下载"
|
||||
},
|
||||
"moonraker": {
|
||||
"printer_state": "Printer State",
|
||||
@@ -426,9 +430,83 @@
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
"datastore_usage": "数据存储",
|
||||
"failed_tasks_24h": "24h失败任务",
|
||||
"cpu_usage": "处理器",
|
||||
"memory_usage": "内存"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "在线网站",
|
||||
"down": "离线网站",
|
||||
"uptime": "运行时间",
|
||||
"incident": "严重事件",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "书库",
|
||||
"series": "系列",
|
||||
"books": "书刊"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "系列",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "相册",
|
||||
"photos": "照片",
|
||||
"videos": "视频",
|
||||
"people": "人物"
|
||||
},
|
||||
"diskstation": {
|
||||
"uptime": "运行时间",
|
||||
"volumeAvailable": "剩余存储",
|
||||
"days": "天"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"totalalerts": "Total Alerts",
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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": "正在播放",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "書籤",
|
||||
"service": "服務"
|
||||
"service": "服務",
|
||||
"search": "搜尋",
|
||||
"custom": "自訂"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "系統",
|
||||
@@ -290,7 +294,7 @@
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "接受",
|
||||
"approvedPushes": "已核准",
|
||||
"rejectedPushes": "拒絕",
|
||||
"filters": "篩選器",
|
||||
"indexers": "索引器"
|
||||
@@ -422,13 +426,87 @@
|
||||
"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": "使用者",
|
||||
"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",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
},
|
||||
"fileflows": {
|
||||
"queue": "Queue",
|
||||
"processing": "Processing",
|
||||
"processed": "Processed",
|
||||
"time": "Time"
|
||||
},
|
||||
"grafana": {
|
||||
"dashboards": "Dashboards",
|
||||
"datasources": "Data Sources",
|
||||
"totalalerts": "Total Alerts",
|
||||
"alertstriggered": "Alerts Triggered"
|
||||
},
|
||||
"nextcloud": {
|
||||
"cpuload": "Cpu Load",
|
||||
"memoryusage": "Memory Usage",
|
||||
"freespace": "Free Space",
|
||||
"activeusers": "Active Users"
|
||||
},
|
||||
"kopia": {
|
||||
"status": "Status",
|
||||
"size": "Size",
|
||||
"lastrun": "Last Run",
|
||||
"nextrun": "Next Run",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"unmanic": {
|
||||
"active_workers": "Active Workers",
|
||||
"total_workers": "Total Workers",
|
||||
"records_total": "Queue Length"
|
||||
},
|
||||
"healthchecks": {
|
||||
"new": "New",
|
||||
"up": "Online",
|
||||
"grace": "In Grace Period",
|
||||
"down": "Offline",
|
||||
"paused": "Paused",
|
||||
"status": "Status",
|
||||
"last_ping": "Last Ping",
|
||||
"never": "No pings yet"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ import ResolvedIcon from "./resolvedicon";
|
||||
|
||||
import { SettingsContext } from "utils/contexts/settings";
|
||||
|
||||
export default function QuickLaunch({servicesAndBookmarks, searchString, setSearchString, isOpen, close, searchDescriptions}) {
|
||||
export default function QuickLaunch({servicesAndBookmarks, searchString, setSearchString, isOpen, close, searchDescriptions, searchProvider}) {
|
||||
const { t } = useTranslation();
|
||||
const { settings } = useContext(SettingsContext);
|
||||
|
||||
@@ -34,7 +34,7 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear
|
||||
|
||||
function handleSearchKeyDown(event) {
|
||||
if (!isOpen) return;
|
||||
|
||||
|
||||
if (event.key === "Escape") {
|
||||
closeAndReset();
|
||||
event.preventDefault();
|
||||
@@ -50,6 +50,7 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function handleItemHover(event) {
|
||||
setCurrentItemIndex(parseInt(event.target?.dataset?.index, 10));
|
||||
}
|
||||
@@ -75,6 +76,15 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear
|
||||
if (searchDescriptions) {
|
||||
newResults = newResults.sort((a, b) => b.priority - a.priority);
|
||||
}
|
||||
if (searchProvider) {
|
||||
newResults.push(
|
||||
{
|
||||
href: searchProvider.url + encodeURIComponent(searchString),
|
||||
name: `${searchProvider.name ?? t("quicklaunch.custom")} ${t("quicklaunch.search")} `,
|
||||
type: 'search',
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
setResults(newResults);
|
||||
|
||||
@@ -82,7 +92,7 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear
|
||||
setCurrentItemIndex(0);
|
||||
}
|
||||
}
|
||||
}, [searchString, servicesAndBookmarks, searchDescriptions]);
|
||||
}, [searchString, servicesAndBookmarks, searchDescriptions, searchProvider, t]);
|
||||
|
||||
|
||||
const [hidden, setHidden] = useState(true);
|
||||
@@ -90,7 +100,7 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear
|
||||
function handleBackdropClick(event) {
|
||||
if (event.target?.tagName === "DIV") closeAndReset();
|
||||
}
|
||||
|
||||
|
||||
if (isOpen) {
|
||||
searchField.current.focus();
|
||||
document.body.addEventListener('click', handleBackdropClick);
|
||||
@@ -135,20 +145,20 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear
|
||||
i === currentItemIndex && "bg-theme-300/50 dark:bg-theme-700/50",
|
||||
)} onClick={handleItemClick}>
|
||||
<div className="flex flex-row items-center mr-4 pointer-events-none">
|
||||
<div className="w-5 text-xs mr-4">
|
||||
{(r.icon || r.abbr) && <div className="w-5 text-xs mr-4">
|
||||
{r.icon && <ResolvedIcon icon={r.icon} />}
|
||||
{r.abbr && r.abbr}
|
||||
</div>
|
||||
</div>}
|
||||
<div className="flex flex-col md:flex-row text-left items-baseline mr-4 pointer-events-none">
|
||||
<span className="mr-4">{r.name}</span>
|
||||
{r.description &&
|
||||
{r.description &&
|
||||
<span className="text-xs text-theme-600 text-light">
|
||||
{searchDescriptions && r.priority < 2 ? highlightText(r.description) : r.description}
|
||||
</span>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
<div className="text-xs text-theme-600 font-bold pointer-events-none">{r.type === 'service' ? t("quicklaunch.service") : t("quicklaunch.bookmark")}</div>
|
||||
<div className="text-xs text-theme-600 font-bold pointer-events-none">{t(`quicklaunch.${r.type ? r.type.toLowerCase() : 'bookmark'}`)}</div>
|
||||
</button>
|
||||
</li>
|
||||
))}
|
||||
|
||||
@@ -12,7 +12,7 @@ export default function Status({ service }) {
|
||||
</div>
|
||||
}
|
||||
|
||||
if (data && data.status === "running") {
|
||||
if (data && data.status?.includes("running")) {
|
||||
if (data.health === "starting") {
|
||||
return (
|
||||
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden" title={data.health}>
|
||||
@@ -30,13 +30,13 @@ export default function Status({ service }) {
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden" title={data.health ?? data.status}>
|
||||
<div className="text-[8px] font-bold text-emerald-500/80 uppercase">{data.health ?? data.status}</div>
|
||||
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden" title={data.health || data.status}>
|
||||
<div className="text-[8px] font-bold text-emerald-500/80 uppercase">{data.health || data.status}</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
if (data && (data.status === "not found" || data.status === "exited")) {
|
||||
if (data && (data.status === "not found" || data.status === "exited" || data.status?.startsWith("partial"))) {
|
||||
return (
|
||||
<div className="w-auto px-1.5 py-0.5 text-center bg-theme-500/10 dark:bg-theme-900/50 rounded-b-[3px] overflow-hidden" title={data.status}>
|
||||
<div className="text-[8px] font-bold text-orange-400/50 dark:text-orange-400/80 uppercase">{data.status}</div>
|
||||
|
||||
@@ -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>;
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
import { useState } from "react";
|
||||
import { useState, useEffect, Fragment } from "react";
|
||||
import { useTranslation } from "next-i18next";
|
||||
import { FiSearch } from "react-icons/fi";
|
||||
import { SiDuckduckgo, SiMicrosoftbing, SiGoogle, SiBaidu, SiBrave } from "react-icons/si";
|
||||
import { Listbox, Transition } from "@headlessui/react";
|
||||
import classNames from "classnames";
|
||||
|
||||
const providers = {
|
||||
export const searchProviders = {
|
||||
google: {
|
||||
name: "Google",
|
||||
url: "https://www.google.com/search?q=",
|
||||
@@ -36,21 +38,55 @@ const providers = {
|
||||
},
|
||||
};
|
||||
|
||||
function getAvailableProviderIds(options) {
|
||||
if (options.provider && Array.isArray(options.provider)) {
|
||||
return Object.keys(searchProviders).filter((value) => options.provider.includes(value));
|
||||
}
|
||||
if (options.provider && searchProviders[options.provider]) {
|
||||
return [options.provider];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
const localStorageKey = "search-name";
|
||||
|
||||
export function getStoredProvider() {
|
||||
if (typeof window !== 'undefined') {
|
||||
const storedName = localStorage.getItem(localStorageKey);
|
||||
if (storedName) {
|
||||
return Object.values(searchProviders).find((el) => el.name === storedName);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
export default function Search({ options }) {
|
||||
const { t } = useTranslation();
|
||||
|
||||
const provider = providers[options.provider];
|
||||
const [query, setQuery] = useState("");
|
||||
const availableProviderIds = getAvailableProviderIds(options);
|
||||
|
||||
if (!provider) {
|
||||
const [query, setQuery] = useState("");
|
||||
const [selectedProvider, setSelectedProvider] = useState(searchProviders[availableProviderIds[0] ?? searchProviders.google]);
|
||||
|
||||
useEffect(() => {
|
||||
const storedProvider = getStoredProvider();
|
||||
let storedProviderKey = null;
|
||||
storedProviderKey = Object.keys(searchProviders).find((pkey) => searchProviders[pkey] === storedProvider);
|
||||
if (storedProvider && availableProviderIds.includes(storedProviderKey)) {
|
||||
setSelectedProvider(storedProvider);
|
||||
}
|
||||
}, [availableProviderIds]);
|
||||
|
||||
if (!availableProviderIds) {
|
||||
return null;
|
||||
}
|
||||
|
||||
function handleSubmit(event) {
|
||||
const q = encodeURIComponent(query);
|
||||
|
||||
if (provider.url) {
|
||||
window.open(`${provider.url}${q}`, options.target || "_blank");
|
||||
const { url } = selectedProvider;
|
||||
if (url) {
|
||||
window.open(`${url}${q}`, options.target || "_blank");
|
||||
} else {
|
||||
window.open(`${options.url}${q}`, options.target || "_blank");
|
||||
}
|
||||
@@ -60,6 +96,11 @@ export default function Search({ options }) {
|
||||
setQuery("");
|
||||
}
|
||||
|
||||
const onChangeProvider = (provider) => {
|
||||
setSelectedProvider(provider);
|
||||
localStorage.setItem(localStorageKey, provider.name);
|
||||
}
|
||||
|
||||
return (
|
||||
<form className="flex-col relative h-8 my-4 min-w-fit grow first:ml-0 ml-4" onSubmit={handleSubmit}>
|
||||
<div className="flex absolute inset-y-0 left-0 items-center pl-3 pointer-events-none w-full text-theme-800 dark:text-white" />
|
||||
@@ -82,17 +123,55 @@ export default function Search({ options }) {
|
||||
// eslint-disable-next-line jsx-a11y/no-autofocus
|
||||
autoFocus={options.focus}
|
||||
/>
|
||||
<button
|
||||
type="submit"
|
||||
className="
|
||||
<Listbox as="div" value={selectedProvider} onChange={onChangeProvider} className="relative text-left" disabled={availableProviderIds?.length === 1}>
|
||||
<div>
|
||||
<Listbox.Button
|
||||
className="
|
||||
absolute right-0.5 bottom-0.5 rounded-r-md px-4 py-2 border-1
|
||||
text-white font-medium text-sm
|
||||
bg-theme-600/40 dark:bg-white/10
|
||||
focus:ring-theme-500 dark:focus:ring-white/50"
|
||||
>
|
||||
<provider.icon className="text-white w-3 h-3" />
|
||||
<span className="sr-only">{t("search.search")}</span>
|
||||
</button>
|
||||
>
|
||||
<selectedProvider.icon className="text-white w-3 h-3" />
|
||||
<span className="sr-only">{t("search.search")}</span>
|
||||
</Listbox.Button>
|
||||
</div>
|
||||
<Transition
|
||||
as={Fragment}
|
||||
enter="transition ease-out duration-100"
|
||||
enterFrom="transform opacity-0 scale-95"
|
||||
enterTo="transform opacity-100 scale-100"
|
||||
leave="transition ease-in duration-75"
|
||||
leaveFrom="transform opacity-100 scale-100"
|
||||
leaveTo="transform opacity-0 scale-95"
|
||||
>
|
||||
<Listbox.Options
|
||||
className="absolute right-0 z-10 mt-1 origin-top-right rounded-md
|
||||
bg-theme-100 dark:bg-theme-600 shadow-lg
|
||||
ring-1 ring-black ring-opacity-5 focus:outline-none"
|
||||
>
|
||||
<div className="flex flex-col">
|
||||
{availableProviderIds.map((providerId) => {
|
||||
const p = searchProviders[providerId];
|
||||
return (
|
||||
<Listbox.Option key={providerId} value={p} as={Fragment}>
|
||||
{({ active }) => (
|
||||
<li
|
||||
className={classNames(
|
||||
"rounded-md cursor-pointer",
|
||||
active ? "bg-theme-600/10 dark:bg-white/10 dark:text-gray-900" : "dark:text-gray-100"
|
||||
)}
|
||||
>
|
||||
<p.icon className="h-4 w-4 mx-4 my-2" />
|
||||
</li>
|
||||
)}
|
||||
</Listbox.Option>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
</Listbox.Options>
|
||||
</Transition>
|
||||
</Listbox>
|
||||
</form>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -53,17 +53,25 @@ export default async function handler(req, res) {
|
||||
})
|
||||
.catch(() => []);
|
||||
|
||||
// For now we are only interested in the first one (in case replicas > 1).
|
||||
// TODO: Show the result for all replicas/containers?
|
||||
const taskContainerId = tasks.at(0)?.Status?.ContainerStatus?.ContainerID;
|
||||
|
||||
// We can only get stats for 'local' containers so try to find one
|
||||
const localContainerIDs = containers.map(c => c.Id);
|
||||
const task = tasks.find(t => localContainerIDs.includes(t.Status?.ContainerStatus?.ContainerID)) ?? tasks.at(0);
|
||||
const taskContainerId = task?.Status?.ContainerStatus?.ContainerID;
|
||||
|
||||
if (taskContainerId) {
|
||||
const container = docker.getContainer(taskContainerId);
|
||||
const stats = await container.stats({ stream: false });
|
||||
try {
|
||||
const container = docker.getContainer(taskContainerId);
|
||||
const stats = await container.stats({ stream: false });
|
||||
|
||||
return res.status(200).json({
|
||||
stats,
|
||||
});
|
||||
return res.status(200).json({
|
||||
stats,
|
||||
});
|
||||
} catch (e) {
|
||||
return res.status(200).json({
|
||||
error: "Unable to retrieve stats"
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -44,32 +44,65 @@ export default async function handler(req, res) {
|
||||
}
|
||||
|
||||
if (dockerArgs.swarm) {
|
||||
const tasks = await docker.listTasks({
|
||||
const serviceInfo = await docker.getService(containerName).inspect()
|
||||
.catch(() => undefined);
|
||||
|
||||
if (!serviceInfo) {
|
||||
return res.status(404).send({
|
||||
status: "not found",
|
||||
});
|
||||
}
|
||||
|
||||
const tasks = await docker
|
||||
.listTasks({
|
||||
filters: {
|
||||
service: [containerName],
|
||||
// A service can have several offline containers, we only look for an active one.
|
||||
"desired-state": ["running"],
|
||||
},
|
||||
})
|
||||
.catch(() => []);
|
||||
|
||||
// For now we are only interested in the first one (in case replicas > 1).
|
||||
// TODO: Show the result for all replicas/containers?
|
||||
const taskContainerId = tasks.at(0)?.Status?.ContainerStatus?.ContainerID;
|
||||
|
||||
if (taskContainerId) {
|
||||
const container = docker.getContainer(taskContainerId);
|
||||
const info = await container.inspect();
|
||||
|
||||
return res.status(200).json({
|
||||
status: info.State.Status,
|
||||
health: info.State.Health?.Status,
|
||||
});
|
||||
if (serviceInfo.Spec.Mode?.Replicated) {
|
||||
// Replicated service, check n replicas
|
||||
const replicas = parseInt(serviceInfo.Spec.Mode?.Replicated?.Replicas, 10);
|
||||
if (tasks.length === replicas) {
|
||||
return res.status(200).json({
|
||||
status: `running ${tasks.length}/${replicas}`,
|
||||
});
|
||||
}
|
||||
if (tasks.length > 0) {
|
||||
return res.status(200).json({
|
||||
status: `partial ${tasks.length}/${replicas}`,
|
||||
});
|
||||
}
|
||||
} else {
|
||||
// Global service, prefer 'local' containers
|
||||
const localContainerIDs = containers.map(c => c.Id);
|
||||
const task = tasks.find(t => localContainerIDs.includes(t.Status?.ContainerStatus?.ContainerID)) ?? tasks.at(0);
|
||||
const taskContainerId = task?.Status?.ContainerStatus?.ContainerID;
|
||||
|
||||
if (taskContainerId) {
|
||||
try {
|
||||
const container = docker.getContainer(taskContainerId);
|
||||
const info = await container.inspect();
|
||||
|
||||
return res.status(200).json({
|
||||
status: info.State.Status,
|
||||
health: info.State.Health?.Status,
|
||||
});
|
||||
} catch (e) {
|
||||
if (task) {
|
||||
return res.status(200).json({
|
||||
status: task.Status.State
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return res.status(200).send({
|
||||
error: "not found",
|
||||
return res.status(404).send({
|
||||
status: "not found",
|
||||
});
|
||||
} catch (e) {
|
||||
logger.error(e);
|
||||
|
||||
@@ -19,7 +19,10 @@ export default async function handler(req, res) {
|
||||
return hash(readFileSync(configYaml, "utf8"));
|
||||
});
|
||||
|
||||
const combinedHash = hash(hashes.join(""));
|
||||
// this ties hash to specific build which should force revaliation between versions
|
||||
const buildTime = process.env.NEXT_PUBLIC_BUILDTIME?.length ? process.env.NEXT_PUBLIC_BUILDTIME : '';
|
||||
|
||||
const combinedHash = hash(hashes.join("") + buildTime);
|
||||
|
||||
res.send({
|
||||
hash: combinedHash,
|
||||
|
||||
@@ -32,6 +32,7 @@ export default async function handler(req, res) {
|
||||
}
|
||||
|
||||
req.method = mapping?.method || "GET";
|
||||
if (mapping?.body) req.body = mapping?.body;
|
||||
req.query.endpoint = endpoint;
|
||||
|
||||
if (req.query.segments) {
|
||||
|
||||
@@ -22,6 +22,7 @@ import { bookmarksResponse, servicesResponse, widgetsResponse } from "utils/conf
|
||||
import ErrorBoundary from "components/errorboundry";
|
||||
import themes from "utils/styles/themes";
|
||||
import QuickLaunch from "components/quicklaunch";
|
||||
import { getStoredProvider, searchProviders } from "components/widgets/search/search";
|
||||
|
||||
const ThemeToggle = dynamic(() => import("components/toggles/theme"), {
|
||||
ssr: false,
|
||||
@@ -99,7 +100,7 @@ function Index({ initialSettings, fallback }) {
|
||||
localStorage.setItem("hash", hashData.hash);
|
||||
}
|
||||
|
||||
if (!initialSettings.isValid || (previousHash && previousHash !== hashData.hash)) {
|
||||
if (previousHash && previousHash !== hashData.hash) {
|
||||
setStale(true);
|
||||
localStorage.setItem("hash", hashData.hash);
|
||||
|
||||
@@ -111,7 +112,7 @@ function Index({ initialSettings, fallback }) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}, [hashData, initialSettings]);
|
||||
}, [hashData]);
|
||||
|
||||
if (stale) {
|
||||
return (
|
||||
@@ -193,6 +194,20 @@ function Home({ initialSettings }) {
|
||||
|
||||
const [searching, setSearching] = useState(false);
|
||||
const [searchString, setSearchString] = useState("");
|
||||
let searchProvider = null;
|
||||
const searchWidget = Object.values(widgets).find(w => w.type === "search");
|
||||
if (searchWidget) {
|
||||
if (Array.isArray(searchWidget.options?.provider)) {
|
||||
// if search provider is a list, try to retrieve from localstorage, fall back to the first
|
||||
searchProvider = getStoredProvider() ?? searchProviders[searchWidget.options.provider[0]];
|
||||
} else if (searchWidget.options?.provider === 'custom') {
|
||||
searchProvider = {
|
||||
url: searchWidget.options.url
|
||||
}
|
||||
} else {
|
||||
searchProvider = searchProviders[searchWidget.options?.provider];
|
||||
}
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
function handleKeyDown(e) {
|
||||
@@ -237,7 +252,7 @@ function Home({ initialSettings }) {
|
||||
/>
|
||||
<meta name="theme-color" content={themes[initialSettings.color || "slate"][initialSettings.theme || "dark"]} />
|
||||
</Head>
|
||||
<div className="relative container m-auto flex flex-col justify-between z-10">
|
||||
<div className="relative container m-auto flex flex-col justify-between z-10 h-full">
|
||||
<div
|
||||
className={classNames(
|
||||
"flex flex-row flex-wrap justify-between",
|
||||
@@ -251,6 +266,7 @@ function Home({ initialSettings }) {
|
||||
isOpen={searching}
|
||||
close={setSearching}
|
||||
searchDescriptions={settings.quicklaunch?.searchDescriptions}
|
||||
searchProvider={settings.quicklaunch?.hideInternetSearch ? null : searchProvider}
|
||||
/>
|
||||
{widgets && (
|
||||
<>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* eslint-disable no-console */
|
||||
import { join } from "path";
|
||||
import { existsSync, copyFile, readFileSync, statSync } from "fs";
|
||||
import { existsSync, copyFile, readFileSync } from "fs";
|
||||
|
||||
import yaml from "js-yaml";
|
||||
|
||||
@@ -32,18 +32,5 @@ export function getSettings() {
|
||||
|
||||
const settingsYaml = join(process.cwd(), "config", "settings.yaml");
|
||||
const fileContents = readFileSync(settingsYaml, "utf8");
|
||||
|
||||
let stats;
|
||||
try {
|
||||
stats = statSync(settingsYaml);
|
||||
} catch (e) {
|
||||
stats = {};
|
||||
}
|
||||
|
||||
const yamlLoaded = yaml.load(fileContents) ?? {};
|
||||
|
||||
return {
|
||||
...yamlLoaded,
|
||||
isValid: fileContents !== "-\n" && stats.size !== 2 // see https://github.com/benphelps/homepage/pull/609
|
||||
};
|
||||
return yaml.load(fileContents) ?? {};
|
||||
}
|
||||
@@ -168,6 +168,9 @@ export async function servicesFromKubernetes() {
|
||||
if (ingress.metadata.annotations[ANNOTATION_POD_SELECTOR]) {
|
||||
constructedService.podSelector = ingress.metadata.annotations[ANNOTATION_POD_SELECTOR];
|
||||
}
|
||||
if (ingress.metadata.annotations[`${ANNOTATION_BASE}/ping`]) {
|
||||
constructedService.ping = ingress.metadata.annotations[`${ANNOTATION_BASE}/ping`];
|
||||
}
|
||||
Object.keys(ingress.metadata.annotations).forEach((annotation) => {
|
||||
if (annotation.startsWith(ANNOTATION_WIDGET_BASE)) {
|
||||
shvl.set(constructedService, annotation.replace(`${ANNOTATION_BASE}/`, ""), ingress.metadata.annotations[annotation]);
|
||||
@@ -233,6 +236,7 @@ export function cleanServiceGroups(groups) {
|
||||
currency, // coinmarketcap widget
|
||||
symbols,
|
||||
defaultinterval,
|
||||
site, // unifi widget
|
||||
namespace, // kubernetes widget
|
||||
app,
|
||||
podSelector,
|
||||
@@ -256,6 +260,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;
|
||||
|
||||
@@ -53,3 +53,12 @@ export function jsonArrayTransform(data, transform) {
|
||||
export function jsonArrayFilter(data, filter) {
|
||||
return jsonArrayTransform(data, (items) => items.filter(filter));
|
||||
}
|
||||
|
||||
export function sanitizeErrorURL(errorURL) {
|
||||
// Dont display sensitive params on frontend
|
||||
const url = new URL(errorURL);
|
||||
["apikey", "api_key", "token", "t"].forEach(key => {
|
||||
if (url.searchParams.has(key)) url.searchParams.set(key, "***")
|
||||
});
|
||||
return url.toString();
|
||||
}
|
||||
@@ -34,6 +34,6 @@ export function addCookieToJar(url, headers) {
|
||||
}
|
||||
|
||||
for (let i = 0; i < cookies.length; i += 1) {
|
||||
cookieJar.setCookieSync(cookies[i], url.toString());
|
||||
cookieJar.setCookieSync(cookies[i], url.toString(), { ignoreError: true });
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import getServiceWidget from "utils/config/service-helpers";
|
||||
import { formatApiCall } from "utils/proxy/api-helpers";
|
||||
import { formatApiCall, sanitizeErrorURL } from "utils/proxy/api-helpers";
|
||||
import validateWidgetData from "utils/proxy/validate-widget-data";
|
||||
import { httpProxy } from "utils/proxy/http";
|
||||
import createLogger from "utils/logger";
|
||||
@@ -68,7 +68,10 @@ export default async function credentialedProxyHandler(req, res, map) {
|
||||
}
|
||||
|
||||
if (!validateWidgetData(widget, endpoint, data)) {
|
||||
return res.status(500).json({error: {message: "Invalid data", url, data}});
|
||||
if (data.error && data.error.url) {
|
||||
data.error.url = sanitizeErrorURL(url);
|
||||
}
|
||||
return res.status(500).json({error: {message: "Invalid data", url: sanitizeErrorURL(url), data}});
|
||||
}
|
||||
|
||||
if (status === 200 && map) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import getServiceWidget from "utils/config/service-helpers";
|
||||
import { formatApiCall } from "utils/proxy/api-helpers";
|
||||
import { formatApiCall, sanitizeErrorURL } from "utils/proxy/api-helpers";
|
||||
import validateWidgetData from "utils/proxy/validate-widget-data";
|
||||
import { httpProxy } from "utils/proxy/http";
|
||||
import createLogger from "utils/logger";
|
||||
@@ -27,15 +27,23 @@ export default async function genericProxyHandler(req, res, map) {
|
||||
};
|
||||
}
|
||||
|
||||
const [status, contentType, data] = await httpProxy(url, {
|
||||
const params = {
|
||||
method: req.method,
|
||||
headers,
|
||||
});
|
||||
}
|
||||
if (req.body) {
|
||||
params.body = req.body;
|
||||
}
|
||||
|
||||
const [status, contentType, data] = await httpProxy(url, params);
|
||||
|
||||
let resultData = data;
|
||||
|
||||
if (!validateWidgetData(widget, endpoint, resultData)) {
|
||||
return res.status(status).json({error: {message: "Invalid data", url, data: resultData}});
|
||||
if (resultData.error && resultData.error.url) {
|
||||
resultData.error.url = sanitizeErrorURL(url);
|
||||
}
|
||||
return res.status(status).json({error: {message: "Invalid data", url: sanitizeErrorURL(url), data: resultData}});
|
||||
}
|
||||
|
||||
if (status === 200 && map) {
|
||||
@@ -50,7 +58,7 @@ export default async function genericProxyHandler(req, res, map) {
|
||||
|
||||
if (status >= 400) {
|
||||
logger.debug("HTTP Error %d calling %s//%s%s...", status, url.protocol, url.hostname, url.pathname);
|
||||
return res.status(status).json({error: {message: "HTTP Error", url, data}});
|
||||
return res.status(status).json({error: {message: "HTTP Error", url: sanitizeErrorURL(url), data}});
|
||||
}
|
||||
|
||||
return res.status(status).send(resultData);
|
||||
|
||||
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,25 +9,33 @@ 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")),
|
||||
emby: dynamic(() => import("./emby/component")),
|
||||
fileflows: dynamic(() => import("./fileflows/component")),
|
||||
flood: dynamic(() => import("./flood/component")),
|
||||
gluetun: dynamic(() => import("./gluetun/component")),
|
||||
gotify: dynamic(() => import("./gotify/component")),
|
||||
grafana: dynamic(() => import("./grafana/component")),
|
||||
hdhomerun: dynamic(() => import("./hdhomerun/component")),
|
||||
homebridge: dynamic(() => import("./homebridge/component")),
|
||||
healthchecks: dynamic(() => import("./healthchecks/component")),
|
||||
jackett: dynamic(() => import("./jackett/component")),
|
||||
jellyfin: dynamic(() => import("./emby/component")),
|
||||
jellyseerr: dynamic(() => import("./jellyseerr/component")),
|
||||
komga: dynamic(() => import("./komga/component")),
|
||||
kopia: dynamic(() => import("./kopia/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")),
|
||||
nextcloud: dynamic(() => import("./nextcloud/component")),
|
||||
nextdns: dynamic(() => import("./nextdns/component")),
|
||||
npm: dynamic(() => import("./npm/component")),
|
||||
nzbget: dynamic(() => import("./nzbget/component")),
|
||||
@@ -37,6 +45,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")),
|
||||
@@ -60,9 +69,11 @@ const components = {
|
||||
tubearchivist: dynamic(() => import("./tubearchivist/component")),
|
||||
truenas: dynamic(() => import("./truenas/component")),
|
||||
unifi: dynamic(() => import("./unifi/component")),
|
||||
unmanic: dynamic(() => import("./unmanic/component")),
|
||||
watchtower: dynamic(() => import("./watchtower/component")),
|
||||
xteve: dynamic(() => import("./xteve/component")),
|
||||
immich: dynamic(() => import("./immich/component")),
|
||||
uptimekuma: dynamic(() => import("./uptimekuma/component")),
|
||||
};
|
||||
|
||||
export default components;
|
||||
export default components;
|
||||
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;
|
||||
@@ -22,7 +22,7 @@ export default function Component({ service }) {
|
||||
return <Container error={finalError} />;
|
||||
}
|
||||
|
||||
if (statusData && statusData.status !== "running") {
|
||||
if (statusData && !(statusData.status.includes("running") || statusData.status.includes("partial"))) {
|
||||
return (
|
||||
<Container>
|
||||
<Block label={t("widget.status")} value={t("docker.offline")} />
|
||||
|
||||
@@ -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/fileflows/component.jsx
Executable file
37
src/widgets/fileflows/component.jsx
Executable 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: fileflowsData, error: fileflowsError } = useWidgetAPI(widget, "status");
|
||||
|
||||
if (fileflowsError) {
|
||||
return <Container error={fileflowsError} />;
|
||||
}
|
||||
|
||||
if (!fileflowsData) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="fileflows.queue" />
|
||||
<Block label="fileflows.processing" />
|
||||
<Block label="fileflows.processed" />
|
||||
<Block label="fileflows.time" />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="fileflows.queue" value={t("common.number", { value: fileflowsData.queue })} />
|
||||
<Block label="fileflows.processing" value={t("common.number", { value: fileflowsData.processing })} />
|
||||
<Block label="fileflows.processed" value={t("common.number", { value: fileflowsData.processed })} />
|
||||
<Block label="fileflows.time" value={fileflowsData.time?.length ? fileflowsData.time : "0:00"} />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
14
src/widgets/fileflows/widget.js
Executable file
14
src/widgets/fileflows/widget.js
Executable file
@@ -0,0 +1,14 @@
|
||||
import genericProxyHandler from "utils/proxy/handlers/generic";
|
||||
|
||||
const widget = {
|
||||
api: "{url}/api/{endpoint}",
|
||||
proxyHandler: genericProxyHandler,
|
||||
|
||||
mappings: {
|
||||
"status": {
|
||||
endpoint: "status",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default widget;
|
||||
@@ -45,9 +45,9 @@ export default function Component({ service }) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="flood.leech" value={t("common.number", { value: leech })} />
|
||||
<Block label="flood.download" value={t("common.bitrate", { value: rateDl })} />
|
||||
<Block label="flood.download" value={t("common.byterate", { value: rateDl })} />
|
||||
<Block label="flood.seed" value={t("common.number", { value: completed })} />
|
||||
<Block label="flood.upload" value={t("common.bitrate", { value: rateUl })} />
|
||||
<Block label="flood.upload" value={t("common.byterate", { value: rateUl })} />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
37
src/widgets/grafana/component.jsx
Executable file
37
src/widgets/grafana/component.jsx
Executable 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: statsData, error: statsError } = useWidgetAPI(widget, "stats");
|
||||
const { data: alertsData, error: alertsError } = useWidgetAPI(widget, "alerts");
|
||||
|
||||
if (statsError || alertsError) {
|
||||
return <Container error={statsError ?? alertsError} />;
|
||||
}
|
||||
|
||||
if (!statsData || !alertsData) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="grafana.dashboards" />
|
||||
<Block label="grafana.datasources" />
|
||||
<Block label="grafana.totalalerts" />
|
||||
<Block label="grafana.alertstriggered" />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="grafana.dashboards" value={t("common.number", { value: statsData.dashboards })} />
|
||||
<Block label="grafana.datasources" value={t("common.number", { value: statsData.datasources })} />
|
||||
<Block label="grafana.totalalerts" value={t("common.number", { value: statsData.alerts })} />
|
||||
<Block label="grafana.alertstriggered" value={t("common.number", { value: alertsData.filter(a => a.state === "alerting").length })} />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
20
src/widgets/grafana/widget.js
Executable file
20
src/widgets/grafana/widget.js
Executable file
@@ -0,0 +1,20 @@
|
||||
import genericProxyHandler from "utils/proxy/handlers/generic";
|
||||
|
||||
const widget = {
|
||||
api: "{url}/api/{endpoint}",
|
||||
proxyHandler: genericProxyHandler,
|
||||
|
||||
mappings: {
|
||||
alerts: {
|
||||
endpoint: "alerts",
|
||||
},
|
||||
stats: {
|
||||
endpoint: "admin/stats",
|
||||
validate: [
|
||||
"dashboards"
|
||||
]
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default widget;
|
||||
54
src/widgets/healthchecks/component.jsx
Normal file
54
src/widgets/healthchecks/component.jsx
Normal file
@@ -0,0 +1,54 @@
|
||||
import { useTranslation } from "next-i18next";
|
||||
|
||||
import { i18n } from "../../../next-i18next.config";
|
||||
|
||||
import Block from "components/services/widget/block";
|
||||
import Container from "components/services/widget/container";
|
||||
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||
|
||||
function formatDate(dateString) {
|
||||
const date = new Date(dateString);
|
||||
const now = new Date();
|
||||
let dateOptions = {
|
||||
month: "numeric",
|
||||
day: "numeric",
|
||||
hour: "numeric",
|
||||
minute: "numeric",
|
||||
};
|
||||
|
||||
if (date.getFullYear() === now.getFullYear() && date.getMonth() === now.getMonth() && date.getDate() === now.getDate()) {
|
||||
dateOptions = { timeStyle: "short" };
|
||||
}
|
||||
|
||||
return new Intl.DateTimeFormat(i18n.language, dateOptions).format(date);
|
||||
}
|
||||
|
||||
export default function Component({ service }) {
|
||||
const { t } = useTranslation();
|
||||
const { widget } = service;
|
||||
|
||||
const { data, error } = useWidgetAPI(widget, "checks");
|
||||
|
||||
if (error) {
|
||||
return <Container error={error} />;
|
||||
}
|
||||
|
||||
if (!data) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label={t("healthchecks.status")} />
|
||||
<Block label={t("healthchecks.last_ping")} />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label={t("healthchecks.status")} value={t(`healthchecks.${data.status}`)} />
|
||||
<Block
|
||||
label={t("healthchecks.last_ping")}
|
||||
value={data.last_ping ? formatDate(data.last_ping) : t("healthchecks.never")}
|
||||
/>
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
18
src/widgets/healthchecks/widget.js
Normal file
18
src/widgets/healthchecks/widget.js
Normal file
@@ -0,0 +1,18 @@
|
||||
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
|
||||
|
||||
const widget = {
|
||||
api: "https://healthchecks.io/api/v2/{endpoint}/{uuid}",
|
||||
proxyHandler: credentialedProxyHandler,
|
||||
|
||||
mappings: {
|
||||
checks: {
|
||||
endpoint: "checks",
|
||||
validate: [
|
||||
"status",
|
||||
"last_ping",
|
||||
]
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default widget;
|
||||
@@ -50,7 +50,7 @@ async function apiCall(widget, endpoint, service) {
|
||||
headers,
|
||||
});
|
||||
|
||||
if (status === 401) {
|
||||
if (status === 401 || status === 403) {
|
||||
logger.debug("Homebridge API rejected the request, attempting to obtain new session token");
|
||||
const { accessToken } = login(widget, service);
|
||||
headers.Authorization = `Bearer ${accessToken}`;
|
||||
@@ -63,7 +63,8 @@ async function apiCall(widget, endpoint, service) {
|
||||
}
|
||||
|
||||
if (status !== 200) {
|
||||
logger.error("Error getting data from Homebridge: %d. Data: %s", status, data);
|
||||
logger.error("Error getting data from Homebridge: %s status %d. Data: %s", url, status, data);
|
||||
return { status, contentType, data: null, responseHeaders };
|
||||
}
|
||||
|
||||
return { status, contentType, data: JSON.parse(data.toString()), responseHeaders };
|
||||
|
||||
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;
|
||||
68
src/widgets/kopia/component.jsx
Executable file
68
src/widgets/kopia/component.jsx
Executable file
@@ -0,0 +1,68 @@
|
||||
import { useTranslation } from "next-i18next";
|
||||
|
||||
import Container from "components/services/widget/container";
|
||||
import Block from "components/services/widget/block";
|
||||
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||
|
||||
function relativeDate(date) {
|
||||
const seconds = Math.abs(Math.floor((new Date() - date) / 1000));
|
||||
|
||||
let interval = Math.abs(seconds / 31536000);
|
||||
|
||||
if (interval > 1) {
|
||||
return `${Math.floor(interval)} y`;
|
||||
}
|
||||
interval = seconds / 2592000;
|
||||
if (interval > 1) {
|
||||
return `${Math.floor(interval)} mo`;
|
||||
}
|
||||
interval = seconds / 86400;
|
||||
if (interval > 1) {
|
||||
return `${Math.floor(interval)} d`;
|
||||
}
|
||||
interval = seconds / 3600;
|
||||
if (interval > 1) {
|
||||
return `${Math.floor(interval)} h`;
|
||||
}
|
||||
interval = seconds / 60;
|
||||
if (interval > 1) {
|
||||
return `${Math.floor(interval)} m`;
|
||||
}
|
||||
return `${Math.floor(seconds)} s`;
|
||||
}
|
||||
|
||||
export default function Component({ service }) {
|
||||
const { t } = useTranslation();
|
||||
|
||||
const { widget } = service;
|
||||
const { data: statusData, error: statusError } = useWidgetAPI(widget, "status");
|
||||
|
||||
if (statusError) {
|
||||
return <Container error={statusError} />;
|
||||
}
|
||||
|
||||
const source = statusData?.sources[0];
|
||||
|
||||
if (!statusData || !source) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="kopia.status" />
|
||||
<Block label="kopia.size" />
|
||||
<Block label="kopia.lastrun" />
|
||||
<Block label="kopia.nextrun" />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
const lastRun = source.lastSnapshot.stats.errorCount === 0 ? new Date(source.lastSnapshot.startTime) : t("kopia.failed");
|
||||
const nextTime = source.nextSnapshotTime ? new Date(source.nextSnapshotTime) : null;
|
||||
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="kopia.status" value={ source.status } />
|
||||
<Block label="kopia.size" value={t("common.bbytes", { value: source.lastSnapshot.stats.totalSize, maximumFractionDigits: 1 })} />
|
||||
<Block label="kopia.lastrun" value={ relativeDate(lastRun) } />
|
||||
{nextTime && <Block label="kopia.nextrun" value={ relativeDate(nextTime) } />}
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
14
src/widgets/kopia/widget.js
Executable file
14
src/widgets/kopia/widget.js
Executable file
@@ -0,0 +1,14 @@
|
||||
import genericProxyHandler from "utils/proxy/handlers/generic";
|
||||
|
||||
const widget = {
|
||||
api: "{url}/{endpoint}",
|
||||
proxyHandler: genericProxyHandler,
|
||||
|
||||
mappings: {
|
||||
status: {
|
||||
endpoint: "api/v1/sources",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
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;
|
||||
39
src/widgets/nextcloud/component.jsx
Executable file
39
src/widgets/nextcloud/component.jsx
Executable file
@@ -0,0 +1,39 @@
|
||||
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: nextcloudData, error: nextcloudError } = useWidgetAPI(widget, "serverinfo");
|
||||
|
||||
if (nextcloudError) {
|
||||
return <Container error={nextcloudError} />;
|
||||
}
|
||||
|
||||
if (!nextcloudData) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="nextcloud.cpuload" />
|
||||
<Block label="nextcloud.memoryusage" />
|
||||
<Block label="nextcloud.freespace" />
|
||||
<Block label="nextcloud.activeusers" />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
const nextcloudInfo = nextcloudData.ocs.data.nextcloud;
|
||||
const memoryUsage = 100 * ((parseFloat(nextcloudInfo.system.mem_total) - parseFloat(nextcloudInfo.system.mem_free)) / parseFloat(nextcloudInfo.system.mem_total));
|
||||
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="nextcloud.cpuload" value={t("common.percent", { value: nextcloudInfo.system.cpuload[0] })} />
|
||||
<Block label="nextcloud.memoryusage" value={t("common.percent", { value:memoryUsage })} />
|
||||
<Block label="nextcloud.freespace" value={t("common.bbytes", { value: nextcloudInfo.system.freespace, maximumFractionDigits: 1 })} />
|
||||
<Block label="nextcloud.activeusers" value={t("common.number", { value: nextcloudData.ocs.data.activeUsers.last5minutes })} />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
14
src/widgets/nextcloud/widget.js
Executable file
14
src/widgets/nextcloud/widget.js
Executable file
@@ -0,0 +1,14 @@
|
||||
import genericProxyHandler from "utils/proxy/handlers/generic";
|
||||
|
||||
const widget = {
|
||||
api: "{url}/{endpoint}",
|
||||
proxyHandler: genericProxyHandler,
|
||||
|
||||
mappings: {
|
||||
serverinfo: {
|
||||
endpoint: "ocs/v2.php/apps/serverinfo/api/v1/info?format=json",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default widget;
|
||||
@@ -33,7 +33,6 @@ export default function Component({ service }) {
|
||||
<Block label="omada.activeUser" value={t( "common.number", { value: omadaData.activeUser })} />
|
||||
<Block label="omada.alerts" value={t( "common.number", { value: omadaData.alerts })} />
|
||||
{ omadaData.connectedGateways > 0 && <Block label="omada.connectedGateway" value={t("common.number", { value: omadaData.connectedGateways})} /> }
|
||||
{ omadaData.connectedSwitches > 0 && <Block label="omada.connectedSwitches" value={t("common.number", { value: omadaData.connectedSwitches})} /> }
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
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;
|
||||
@@ -8,18 +8,15 @@ export default function Component({ service }) {
|
||||
const { t } = useTranslation();
|
||||
const { widget } = service;
|
||||
|
||||
const { data: indexersData, error: indexersError } = useWidgetAPI(widget, "indexer");
|
||||
const { data: grabsData, error: grabsError } = useWidgetAPI(widget, "indexerstats");
|
||||
|
||||
if (indexersError || grabsError) {
|
||||
const finalError = indexersError ?? grabsError;
|
||||
return <Container error={finalError} />;
|
||||
if (grabsError) {
|
||||
return <Container error={grabsError} />;
|
||||
}
|
||||
|
||||
if (!indexersData || !grabsData) {
|
||||
if (!grabsData) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="prowlarr.enableIndexers" />
|
||||
<Block label="prowlarr.numberOfGrabs" />
|
||||
<Block label="prowlarr.numberOfQueries" />
|
||||
<Block label="prowlarr.numberOfFailGrabs" />
|
||||
@@ -28,8 +25,6 @@ export default function Component({ service }) {
|
||||
);
|
||||
}
|
||||
|
||||
const indexers = indexersData?.filter((indexer) => indexer.enable === true);
|
||||
|
||||
let numberOfGrabs = 0;
|
||||
let numberOfQueries = 0;
|
||||
let numberOfFailedGrabs = 0;
|
||||
@@ -43,7 +38,6 @@ export default function Component({ service }) {
|
||||
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="prowlarr.enableIndexers" value={t("common.number", { value: indexers.length })} />
|
||||
<Block label="prowlarr.numberOfGrabs" value={t("common.number", { value: numberOfGrabs })} />
|
||||
<Block label="prowlarr.numberOfQueries" value={t("common.number", { value: numberOfQueries })} />
|
||||
<Block label="prowlarr.numberOfFailGrabs" value={t("common.number", { value: numberOfFailedGrabs })} />
|
||||
|
||||
@@ -24,14 +24,14 @@ 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>
|
||||
);
|
||||
}
|
||||
|
||||
const { data } = clusterData ;
|
||||
const vms = data.filter(item => item.type === "qemu") || [];
|
||||
const vms = data.filter(item => item.type === "qemu" && item.template === 0) || [];
|
||||
const lxc = data.filter(item => item.type === "lxc" && item.template === 0) || [];
|
||||
const nodes = data.filter(item => item.type === "node") || [];
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -1,6 +1,48 @@
|
||||
import RuTorrent from "rutorrent-promise";
|
||||
|
||||
import getServiceWidget from "utils/config/service-helpers";
|
||||
import { httpProxy } from "utils/proxy/http";
|
||||
import widgets from "widgets/widgets";
|
||||
import { formatApiCall } from "utils/proxy/api-helpers";
|
||||
import createLogger from "utils/logger";
|
||||
|
||||
const logger = createLogger("rutorrentProxyHandler");
|
||||
|
||||
// from https://github.com/ctessier/node-rutorrent-promise/blob/next/utils.js
|
||||
const getTorrentInfo = (data) => ({
|
||||
'd.is_open': data[0],
|
||||
'd.is_hash_checking': data[1],
|
||||
'd.is_hash_checked': data[2],
|
||||
'd.get_state': data[3],
|
||||
'd.get_name': data[4],
|
||||
'd.get_size_bytes': data[5],
|
||||
'd.get_completed_chunks': data[6],
|
||||
'd.get_size_chunks': data[7],
|
||||
'd.get_bytes_done': data[8],
|
||||
'd.get_up_total': data[9],
|
||||
'd.get_ratio': data[10],
|
||||
'd.get_up_rate': data[11],
|
||||
'd.get_down_rate': data[12],
|
||||
'd.get_chunk_size': data[13],
|
||||
'd.get_custom1': data[14],
|
||||
'd.get_peers_accounted': data[15],
|
||||
'd.get_peers_not_connected': data[16],
|
||||
'd.get_peers_connected': data[17],
|
||||
'd.get_peers_complete': data[18],
|
||||
'd.get_left_bytes': data[19],
|
||||
'd.get_priority': data[20],
|
||||
'd.get_state_changed': data[21],
|
||||
'd.get_skip_total': data[22],
|
||||
'd.get_hashing': data[23],
|
||||
'd.get_chunks_hashed': data[24],
|
||||
'd.get_base_path': data[25],
|
||||
'd.get_creation_date': data[26],
|
||||
'd.get_tracker_focus': data[27],
|
||||
'd.is_active': data[28],
|
||||
'd.get_message': data[29],
|
||||
'd.get_custom2': data[30],
|
||||
'd.get_free_diskspace': data[31],
|
||||
'd.is_private': data[32],
|
||||
'd.is_multi_file': data[33],
|
||||
});
|
||||
|
||||
export default async function rutorrentProxyHandler(req, res) {
|
||||
const { group, service } = req.query;
|
||||
@@ -9,27 +51,35 @@ export default async function rutorrentProxyHandler(req, res) {
|
||||
const widget = await getServiceWidget(group, service);
|
||||
|
||||
if (widget) {
|
||||
const constructedUrl = new URL(widget.url);
|
||||
const api = widgets?.[widget.type]?.api;
|
||||
const url = new URL(formatApiCall(api, { ...widget }));
|
||||
|
||||
let rtPort = constructedUrl.port;
|
||||
if (rtPort === '') {
|
||||
rtPort = constructedUrl.protocol === "https:" ? 443 : 80;
|
||||
const headers = {}
|
||||
if (widget.username) {
|
||||
headers.Authorization = `Basic ${Buffer.from(`${widget.username}:${widget.password}`).toString("base64")}`;
|
||||
}
|
||||
|
||||
const rutorrent = new RuTorrent({
|
||||
host: constructedUrl.hostname,
|
||||
port: rtPort,
|
||||
path: constructedUrl.pathname,
|
||||
ssl: constructedUrl.protocol === "https:",
|
||||
username: widget.username,
|
||||
password: widget.password,
|
||||
const [status, , data] = await httpProxy(url, {
|
||||
method: "POST",
|
||||
headers,
|
||||
body: 'mode=list'
|
||||
});
|
||||
|
||||
const data = await rutorrent.get(["d.get_down_rate", "d.get_up_rate", "d.get_state"]);
|
||||
if (status !== 200) {
|
||||
logger.error("HTTP Error %d calling %s", status, url.toString());
|
||||
return res.status(status).json({error: {message: "HTTP Error", url, data}});
|
||||
}
|
||||
|
||||
return res.status(200).send(data);
|
||||
try {
|
||||
const rawData = JSON.parse(data);
|
||||
const parsedData = Object.keys(rawData.t).map((hashString) => getTorrentInfo(rawData.t[hashString]));
|
||||
|
||||
return res.status(200).send(parsedData);
|
||||
} catch (e) {
|
||||
return res.status(500).json({error: {message: e?.toString() ?? 'Error parsing rutorrent data', url, data}});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return res.status(400).json({ error: "Invalid proxy service type" });
|
||||
return res.status(500).json({ error: "Invalid proxy service type" });
|
||||
}
|
||||
|
||||
@@ -36,9 +36,9 @@ export default function Component({ service }) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="transmission.leech" value={t("common.number", { value: leech })} />
|
||||
<Block label="transmission.download" value={t("common.bitrate", { value: rateDl * 8 })} />
|
||||
<Block label="transmission.download" value={t("common.byterate", { value: rateDl })} />
|
||||
<Block label="transmission.seed" value={t("common.number", { value: completed })} />
|
||||
<Block label="transmission.upload" value={t("common.bitrate", { value: rateUl * 8 })} />
|
||||
<Block label="transmission.upload" value={t("common.byterate", { value: rateUl })} />
|
||||
</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 } />}
|
||||
|
||||
@@ -42,12 +42,15 @@ async function getWidget(req) {
|
||||
return widget;
|
||||
}
|
||||
|
||||
async function login(widget) {
|
||||
async function login(widget, csrfToken) {
|
||||
const endpoint = (widget.prefix === udmpPrefix) ? "auth/login" : "login";
|
||||
const api = widgets?.[widget.type]?.api?.replace("{prefix}", ""); // no prefix for login url
|
||||
const loginUrl = new URL(formatApiCall(api, { endpoint, ...widget }));
|
||||
const loginBody = { username: widget.username, password: widget.password, remember: true };
|
||||
const headers = { "Content-Type": "application/json" };
|
||||
if (csrfToken) {
|
||||
headers["X-CSRF-TOKEN"] = csrfToken;
|
||||
}
|
||||
const [status, contentType, data, responseHeaders] = await httpProxy(loginUrl, {
|
||||
method: "POST",
|
||||
body: JSON.stringify(loginBody),
|
||||
@@ -70,6 +73,7 @@ export default async function unifiProxyHandler(req, res) {
|
||||
|
||||
let [status, contentType, data, responseHeaders] = [];
|
||||
let prefix = cache.get(`${prefixCacheKey}.${service}`);
|
||||
let csrfToken;
|
||||
if (prefix === null) {
|
||||
// auto detect if we're talking to a UDM Pro, and cache the result so that we
|
||||
// don't make two requests each time data from Unifi is required
|
||||
@@ -77,12 +81,12 @@ export default async function unifiProxyHandler(req, res) {
|
||||
prefix = "";
|
||||
if (responseHeaders?.["x-csrf-token"]) {
|
||||
prefix = udmpPrefix;
|
||||
csrfToken = responseHeaders["x-csrf-token"];
|
||||
}
|
||||
cache.put(`${prefixCacheKey}.${service}`, prefix);
|
||||
}
|
||||
|
||||
widget.prefix = prefix;
|
||||
|
||||
const { endpoint } = req.query;
|
||||
const url = new URL(formatApiCall(api, { endpoint, ...widget }));
|
||||
const params = { method: "GET", headers: {} };
|
||||
@@ -92,7 +96,10 @@ export default async function unifiProxyHandler(req, res) {
|
||||
|
||||
if (status === 401) {
|
||||
logger.debug("Unifi isn't logged in or rejected the reqeust, attempting login.");
|
||||
[status, contentType, data, responseHeaders] = await login(widget);
|
||||
if (responseHeaders?.["x-csrf-token"]) {
|
||||
csrfToken = responseHeaders["x-csrf-token"];
|
||||
}
|
||||
[status, contentType, data, responseHeaders] = await login(widget, csrfToken);
|
||||
|
||||
if (status !== 200) {
|
||||
logger.error("HTTP %d logging in to Unifi. Data: %s", status, data);
|
||||
|
||||
33
src/widgets/unmanic/component.jsx
Normal file
33
src/widgets/unmanic/component.jsx
Normal file
@@ -0,0 +1,33 @@
|
||||
import Container from "components/services/widget/container";
|
||||
import Block from "components/services/widget/block";
|
||||
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||
|
||||
export default function Component({ service }) {
|
||||
const { widget } = service;
|
||||
|
||||
const { data: workersData, error: workersError } = useWidgetAPI(widget, "workers");
|
||||
const { data: pendingData, error: pendingError } = useWidgetAPI(widget, "pending");
|
||||
|
||||
if (workersError || pendingError) {
|
||||
const finalError = workersError ?? pendingError;
|
||||
return <Container error={finalError} />;
|
||||
}
|
||||
|
||||
if (!workersData || !pendingData) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="unmanic.active_workers" />
|
||||
<Block label="unmanic.total_workers" />
|
||||
<Block label="unmanic.records_total" />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="unmanic.active_workers" value={workersData.active_workers} />
|
||||
<Block label="unmanic.total_workers" value={workersData.total_workers} />
|
||||
<Block label="unmanic.records_total" value={pendingData.recordsTotal} />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
27
src/widgets/unmanic/widget.js
Normal file
27
src/widgets/unmanic/widget.js
Normal file
@@ -0,0 +1,27 @@
|
||||
import genericProxyHandler from "utils/proxy/handlers/generic";
|
||||
import { asJson } from "utils/proxy/api-helpers";
|
||||
|
||||
const widget = {
|
||||
api: "{url}/unmanic/api/v2/{endpoint}",
|
||||
proxyHandler: genericProxyHandler,
|
||||
|
||||
mappings: {
|
||||
workers: {
|
||||
endpoint: "workers/status",
|
||||
map: (data) => ({
|
||||
total_workers: (asJson(data).workers_status).length,
|
||||
active_workers: (asJson(data).workers_status).filter(worker => !worker.idle).length,
|
||||
})
|
||||
},
|
||||
pending: {
|
||||
method: "POST",
|
||||
body: "{}",
|
||||
endpoint: "pending/tasks",
|
||||
validate: [
|
||||
"recordsTotal"
|
||||
]
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default widget;
|
||||
55
src/widgets/uptimekuma/component.jsx
Normal file
55
src/widgets/uptimekuma/component.jsx
Normal file
@@ -0,0 +1,55 @@
|
||||
import { useTranslation } from "next-i18next";
|
||||
|
||||
import Container from "components/services/widget/container";
|
||||
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||
import Block from "components/services/widget/block";
|
||||
|
||||
export default function Component({ service }) {
|
||||
const { t } = useTranslation();
|
||||
|
||||
const { widget } = service;
|
||||
|
||||
const { data: statusData, error: statusError } = useWidgetAPI(widget, "status_page");
|
||||
const { data: heartbeatData, error: heartbeatError } = useWidgetAPI(widget, "heartbeat");
|
||||
|
||||
if (statusError || heartbeatError) {
|
||||
return <Container error={statusError ?? heartbeatError} />;
|
||||
}
|
||||
|
||||
if (!statusData || !heartbeatData) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="uptimekuma.up"/>
|
||||
<Block label="uptimekuma.down"/>
|
||||
<Block label="uptimekuma.uptime"/>
|
||||
<Block label="uptimekuma.incidents"/>
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
let sitesUp = 0;
|
||||
let sitesDown = 0;
|
||||
Object.values(heartbeatData.heartbeatList).forEach((siteList) => {
|
||||
const lastHeartbeat = siteList[siteList.length - 1];
|
||||
if (lastHeartbeat?.status === 1) {
|
||||
sitesUp += 1;
|
||||
} else {
|
||||
sitesDown += 1;
|
||||
}
|
||||
});
|
||||
|
||||
// Adapted from https://github.com/bastienwirtz/homer/blob/b7cd8f9482e6836a96b354b11595b03b9c3d67cd/src/components/services/UptimeKuma.vue#L105
|
||||
const uptimeList = Object.values(heartbeatData.uptimeList);
|
||||
const percent = uptimeList.reduce((a, b) => a + b, 0) / uptimeList.length || 0;
|
||||
const uptime = (percent * 100).toFixed(1);
|
||||
const incidentTime = statusData.incident ? (Math.abs(new Date(statusData.incident?.createdDate) - new Date()) / 1000) / (60 * 60) : null;
|
||||
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="uptimekuma.up" value={t("common.number", { value: sitesUp })} />
|
||||
<Block label="uptimekuma.down" value={t("common.number", { value: sitesDown })} />
|
||||
<Block label="uptimekuma.uptime" value={t("common.percent", { value: uptime })} />
|
||||
{incidentTime && <Block label="uptimekuma.incident" value={t("common.number", { value: Math.round(incidentTime) }) + t("uptimekuma.m")} />}
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
18
src/widgets/uptimekuma/widget.js
Normal file
18
src/widgets/uptimekuma/widget.js
Normal file
@@ -0,0 +1,18 @@
|
||||
// import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
|
||||
import genericProxyHandler from "utils/proxy/handlers/generic";
|
||||
|
||||
const widget = {
|
||||
api: "{url}/api/{endpoint}/{slug}",
|
||||
proxyHandler: genericProxyHandler,
|
||||
|
||||
mappings: {
|
||||
status_page: {
|
||||
endpoint: "status-page",
|
||||
},
|
||||
heartbeat: {
|
||||
endpoint: "status-page/heartbeat",
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
export default widget;
|
||||
@@ -6,22 +6,30 @@ 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 fileflows from "./fileflows/widget";
|
||||
import flood from "./flood/widget";
|
||||
import gluetun from "./gluetun/widget";
|
||||
import gotify from "./gotify/widget";
|
||||
import grafana from "./grafana/widget";
|
||||
import hdhomerun from "./hdhomerun/widget";
|
||||
import homebridge from "./homebridge/widget";
|
||||
import healthchecks from "./healthchecks/widget";
|
||||
import jackett from "./jackett/widget";
|
||||
import jellyseerr from "./jellyseerr/widget";
|
||||
import komga from "./komga/widget";
|
||||
import kopia from "./kopia/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 nextcloud from "./nextcloud/widget";
|
||||
import nextdns from "./nextdns/widget";
|
||||
import npm from "./npm/widget";
|
||||
import nzbget from "./nzbget/widget";
|
||||
@@ -31,6 +39,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";
|
||||
@@ -57,6 +66,8 @@ import unifi from "./unifi/widget";
|
||||
import watchtower from "./watchtower/widget";
|
||||
import xteve from "./xteve/widget";
|
||||
import immich from "./immich/widget";
|
||||
import uptimekuma from "./uptimekuma/widget";
|
||||
import unmanic from "./unmanic/widget";
|
||||
|
||||
const widgets = {
|
||||
adguard,
|
||||
@@ -67,24 +78,31 @@ const widgets = {
|
||||
cloudflared,
|
||||
coinmarketcap,
|
||||
deluge,
|
||||
diskstation: downloadstation,
|
||||
diskstation,
|
||||
downloadstation,
|
||||
emby,
|
||||
fileflows,
|
||||
flood,
|
||||
gluetun,
|
||||
gotify,
|
||||
grafana,
|
||||
hdhomerun,
|
||||
homebridge,
|
||||
healthchecks,
|
||||
jackett,
|
||||
jellyfin: emby,
|
||||
jellyseerr,
|
||||
komga,
|
||||
kopia,
|
||||
lidarr,
|
||||
mastodon,
|
||||
medusa,
|
||||
miniflux,
|
||||
mikrotik,
|
||||
moonraker,
|
||||
mylar,
|
||||
navidrome,
|
||||
nextcloud,
|
||||
nextdns,
|
||||
npm,
|
||||
nzbget,
|
||||
@@ -94,6 +112,7 @@ const widgets = {
|
||||
opnsense,
|
||||
overseerr,
|
||||
paperlessngx,
|
||||
photoprism,
|
||||
proxmoxbackupserver,
|
||||
pihole,
|
||||
plex,
|
||||
@@ -118,9 +137,11 @@ const widgets = {
|
||||
truenas,
|
||||
unifi,
|
||||
unifi_console: unifi,
|
||||
unmanic,
|
||||
watchtower,
|
||||
xteve,
|
||||
immich,
|
||||
uptimekuma,
|
||||
};
|
||||
|
||||
export default widgets;
|
||||
export default widgets;
|
||||
Reference in New Issue
Block a user