mirror of
https://github.com/gethomepage/homepage.git
synced 2025-12-05 21:47:48 +01:00
Compare commits
467 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f8a0c69e4b | ||
|
|
b9b989fd11 | ||
|
|
3cbfd10df7 | ||
|
|
58fa62f926 | ||
|
|
15cd1bba5c | ||
|
|
bef2da4f96 | ||
|
|
4b1fd17e61 | ||
|
|
d501904913 | ||
|
|
e57b5c9af9 | ||
|
|
9ab9854c2c | ||
|
|
e195cc5276 | ||
|
|
bfa1e4ca5b | ||
|
|
6041e7349f | ||
|
|
eb04581a0e | ||
|
|
b70ab6ee27 | ||
|
|
5e0dbdb9ec | ||
|
|
30cb733dc9 | ||
|
|
471246a3ca | ||
|
|
b99fa9e140 | ||
|
|
eb6ac8f18d | ||
|
|
e4a980a222 | ||
|
|
3f608e52b5 | ||
|
|
8749c655d5 | ||
|
|
67ff299e1c | ||
|
|
ada3c9df0d | ||
|
|
f385c9ea9f | ||
|
|
608dcb05fc | ||
|
|
5a65b5a052 | ||
|
|
4dfa04251c | ||
|
|
393602eff7 | ||
|
|
1ec665ecf7 | ||
|
|
33c0d917fb | ||
|
|
165592b9be | ||
|
|
00bd1eee9a | ||
|
|
3591e46f0f | ||
|
|
fdbd5506a1 | ||
|
|
995ad4b59a | ||
|
|
c598fefde8 | ||
|
|
d8baad453f | ||
|
|
a5747c34b8 | ||
|
|
153dcf398e | ||
|
|
f53f975669 | ||
|
|
10097ab4fc | ||
|
|
95b416c243 | ||
|
|
3f0dcaff68 | ||
|
|
2da96f8610 | ||
|
|
2f2efb224f | ||
|
|
120566e22a | ||
|
|
a035ff2181 | ||
|
|
7c31c891a5 | ||
|
|
1c4814f7bf | ||
|
|
20a78af1f6 | ||
|
|
1ef7cb90e8 | ||
|
|
773b8ba7f4 | ||
|
|
19d329c53f | ||
|
|
14044aa64e | ||
|
|
73cc4f9b5f | ||
|
|
ba53edd1b7 | ||
|
|
9f4965141d | ||
|
|
4af9a611a3 | ||
|
|
d51fbc5f6d | ||
|
|
409e481b8c | ||
|
|
cf54837d05 | ||
|
|
292f7a64d8 | ||
|
|
4dfb1a1c5e | ||
|
|
098eec96e2 | ||
|
|
80834b6f30 | ||
|
|
8ae54777f6 | ||
|
|
ff1129ecd7 | ||
|
|
093c523ae6 | ||
|
|
9f2348ad39 | ||
|
|
7b2fb0279a | ||
|
|
9f67e82817 | ||
|
|
3d6821a463 | ||
|
|
43c4effc42 | ||
|
|
1830b7f277 | ||
|
|
bc2492c773 | ||
|
|
3bb18a746b | ||
|
|
baf40600dc | ||
|
|
a226f9de12 | ||
|
|
551f521edd | ||
|
|
b96045eb8c | ||
|
|
be5f1dd8e1 | ||
|
|
5aa88fcf06 | ||
|
|
876ddc8302 | ||
|
|
eaada4a406 | ||
|
|
91017fe71c | ||
|
|
6987f96d1d | ||
|
|
dec63583c8 | ||
|
|
9477dd1f3c | ||
|
|
b953c1089a | ||
|
|
2acceff22e | ||
|
|
701b97c1f8 | ||
|
|
5e917822c9 | ||
|
|
4b9f3c1e15 | ||
|
|
9314ac4760 | ||
|
|
5dd7094815 | ||
|
|
ff385b462a | ||
|
|
5addfc6ea8 | ||
|
|
397a340c47 | ||
|
|
0b75d07a2b | ||
|
|
6f434bbedd | ||
|
|
e91efab940 | ||
|
|
d737c57278 | ||
|
|
63c1a8e409 | ||
|
|
a15a264912 | ||
|
|
08b9b52f09 | ||
|
|
9a47a8517c | ||
|
|
405b00fbd8 | ||
|
|
02becf7dcf | ||
|
|
490e88a34a | ||
|
|
8f58132da1 | ||
|
|
ecddc5e1c8 | ||
|
|
e297caf516 | ||
|
|
cbc496c81f | ||
|
|
ea6c4ab0c2 | ||
|
|
46d4b3e19e | ||
|
|
11ae52df4a | ||
|
|
77e02e6729 | ||
|
|
58e8109856 | ||
|
|
52f15ab834 | ||
|
|
4cdf7317ec | ||
|
|
05818b5d1d | ||
|
|
d2a2fd99cc | ||
|
|
486b376dca | ||
|
|
2fae4acd4a | ||
|
|
2b20e2e17f | ||
|
|
cc0f2ca083 | ||
|
|
263cf6d6b1 | ||
|
|
72f4506f06 | ||
|
|
2183bf623f | ||
|
|
17ac3008aa | ||
|
|
db07b3e7a1 | ||
|
|
1b1b671080 | ||
|
|
ca295e0850 | ||
|
|
ec3fd692a8 | ||
|
|
9deaa48144 | ||
|
|
c725f9af38 | ||
|
|
4d3864c2ec | ||
|
|
8d69ab33aa | ||
|
|
fdc975d6df | ||
|
|
d4b7de9d0d | ||
|
|
4daa33ea63 | ||
|
|
10adefe2b4 | ||
|
|
4198fcf6b6 | ||
|
|
9466b652b9 | ||
|
|
f4a1700dc5 | ||
|
|
c1552228bf | ||
|
|
1106107094 | ||
|
|
b5e218bb1d | ||
|
|
d015ae1089 | ||
|
|
0eb7c77892 | ||
|
|
a3b2321837 | ||
|
|
f9f9f68c71 | ||
|
|
2e728aa207 | ||
|
|
f71f15bbf4 | ||
|
|
8037e78725 | ||
|
|
3878dd57a3 | ||
|
|
1411ab99a0 | ||
|
|
5f92a3084c | ||
|
|
a4ede7f8d7 | ||
|
|
f50f5c130e | ||
|
|
17ebdd8226 | ||
|
|
c2983197a0 | ||
|
|
e311866969 | ||
|
|
879da993b8 | ||
|
|
204e4ebac0 | ||
|
|
ff567bd543 | ||
|
|
b75d34d8c7 | ||
|
|
3a6be33c98 | ||
|
|
4c69d65e57 | ||
|
|
6678614e9c | ||
|
|
8971dc3169 | ||
|
|
c87618a9bb | ||
|
|
e84a3fa7dc | ||
|
|
4fc5a11a88 | ||
|
|
9a894b49d1 | ||
|
|
a778b5daed | ||
|
|
35e71a7ffd | ||
|
|
2312ca86ef | ||
|
|
aabe51ab7e | ||
|
|
0bdc22a4ff | ||
|
|
0e285a3d89 | ||
|
|
5c03482924 | ||
|
|
4b340c0167 | ||
|
|
459d3473fc | ||
|
|
e3fe95c2c2 | ||
|
|
2182412548 | ||
|
|
1b3e6fc289 | ||
|
|
5989e1dc52 | ||
|
|
4afd53f685 | ||
|
|
05ab215fd7 | ||
|
|
cb637e25ed | ||
|
|
449e393480 | ||
|
|
009fe33b9f | ||
|
|
d543430b06 | ||
|
|
18afde8478 | ||
|
|
2d7d082c3d | ||
|
|
52489c47f2 | ||
|
|
5b8972812d | ||
|
|
f851085ebf | ||
|
|
aee8ba1e1d | ||
|
|
c7a10cf204 | ||
|
|
d5af3140d5 | ||
|
|
2c8a120c9e | ||
|
|
36aed7b6cc | ||
|
|
c08272d7ed | ||
|
|
c93dd4d524 | ||
|
|
551bd5b07e | ||
|
|
9144a17b83 | ||
|
|
833cb2b32d | ||
|
|
276d14971e | ||
|
|
46163338c4 | ||
|
|
ea22bfca90 | ||
|
|
3ab248081e | ||
|
|
d9d277d161 | ||
|
|
a4e76d6fb3 | ||
|
|
f271be8848 | ||
|
|
3cf8cc3be5 | ||
|
|
0a553a3552 | ||
|
|
4c69351026 | ||
|
|
eb06e6563f | ||
|
|
9f16ff0e65 | ||
|
|
07c0978b6f | ||
|
|
07c84b349b | ||
|
|
212ee29cb5 | ||
|
|
b6fb6c9b57 | ||
|
|
25ce2437de | ||
|
|
34c6fe15cb | ||
|
|
2f3896a55d | ||
|
|
d6182ea641 | ||
|
|
01b08e4902 | ||
|
|
541d5a9f93 | ||
|
|
02dfbc193d | ||
|
|
2ed4ac8b77 | ||
|
|
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 | ||
|
|
5af01d2436 | ||
|
|
19cf9969b9 | ||
|
|
dbcd6f5df7 | ||
|
|
6b5e8ab0c7 | ||
|
|
e5d65f410c | ||
|
|
f2b3a12569 | ||
|
|
3df03ecaab | ||
|
|
0fdab8cffc | ||
|
|
7d23b0199c | ||
|
|
0ae6d7e182 | ||
|
|
2b8af9546f | ||
|
|
8713ef4d6a | ||
|
|
0d5c878c29 | ||
|
|
bb823140e1 | ||
|
|
749e78864e | ||
|
|
6199c2e3b0 | ||
|
|
935681bd70 | ||
|
|
dc7f563fff | ||
|
|
8c3b8e2cbc | ||
|
|
60df0ab4ff | ||
|
|
436650d8ef | ||
|
|
6e6fcb33ce | ||
|
|
ba25e74add | ||
|
|
59c524726a | ||
|
|
7e3620f86f | ||
|
|
b11fa21d4a | ||
|
|
3fdae79c88 | ||
|
|
933619aa8e | ||
|
|
63616e0a79 | ||
|
|
c933e40e92 | ||
|
|
347e28ea3f | ||
|
|
f6fdbd0426 | ||
|
|
5d82f5f7d8 | ||
|
|
4c9f1041ef | ||
|
|
6d133b3889 | ||
|
|
d94f1ce3e7 | ||
|
|
1e8b257dbe | ||
|
|
0190c18a6b | ||
|
|
56331b3efd | ||
|
|
c3561e8fce | ||
|
|
910582fbc0 | ||
|
|
2a42d89d08 | ||
|
|
b0f16f6612 | ||
|
|
0d5f8f6e7c | ||
|
|
e368717c70 | ||
|
|
1e5a6f8eff | ||
|
|
945d13ee3c | ||
|
|
cc09e44890 | ||
|
|
29b6fefdff | ||
|
|
e96036e076 | ||
|
|
8d016629d3 | ||
|
|
555f9f7b14 | ||
|
|
02e9df8f28 | ||
|
|
5ecb9466ae | ||
|
|
9c9c0e2b64 | ||
|
|
2d87c7c1d2 | ||
|
|
cdbf02edae | ||
|
|
b630b14504 | ||
|
|
e0bf277741 | ||
|
|
351993234e | ||
|
|
192a4f4d14 | ||
|
|
bfb882d03d | ||
|
|
9ee86f1c5a | ||
|
|
6d3c71a72e | ||
|
|
ad273ce5ad | ||
|
|
799c9ecb17 | ||
|
|
a5c8f08f4b | ||
|
|
9f2476f419 | ||
|
|
942a61aa4b | ||
|
|
099f3726e8 | ||
|
|
14310bf2ed | ||
|
|
176811da9b | ||
|
|
f8d35e7f5d | ||
|
|
ce94636a54 | ||
|
|
7e659b2dbc | ||
|
|
cb92e82fd0 | ||
|
|
d7d5f46820 | ||
|
|
23b8f25f07 | ||
|
|
dc55da38c6 | ||
|
|
aa35eb5c5e | ||
|
|
8c800eb032 | ||
|
|
cdfb7e7d73 | ||
|
|
48298cc4e8 | ||
|
|
ce786fb765 | ||
|
|
50939069af | ||
|
|
ec8a73751c | ||
|
|
a994d5379e | ||
|
|
f9e27a6bb5 | ||
|
|
6d61cb5aaa | ||
|
|
89c6528f24 | ||
|
|
2836ee1f3b | ||
|
|
d71a1f9345 | ||
|
|
c8116fc9e8 | ||
|
|
ca4b5b131d | ||
|
|
2b3d4b388a | ||
|
|
fa1792cd5f |
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' }}
|
||||
|
||||
@@ -3,16 +3,16 @@
|
||||
"missing_type": "نوع القطعة مفقود: {{type}}",
|
||||
"api_error": "API خطأ",
|
||||
"status": "الحالة",
|
||||
"information": "Information",
|
||||
"information": "معلومات",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
"response_data": "بيانات الاستجابة"
|
||||
},
|
||||
"weather": {
|
||||
"current": "الموقع الحالي",
|
||||
"allow": "اضغط للسماح",
|
||||
"allow": "أنقر للسماح",
|
||||
"updating": "جاري التحديث",
|
||||
"wait": "الرجاء الانتظار"
|
||||
"wait": "الرجاء الإنتظار"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "بحث …"
|
||||
@@ -22,93 +22,95 @@
|
||||
"total": "المجموع",
|
||||
"free": "متاح",
|
||||
"used": "مستخدم",
|
||||
"load": "الضغط"
|
||||
"load": "الضغط",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "المستخدمون",
|
||||
"uptime": "مدة تشغيل النظام",
|
||||
"days": "ايام",
|
||||
"days": "أيام",
|
||||
"wan": "WAN",
|
||||
"lan": "LAN",
|
||||
"wlan": "WLAN",
|
||||
"devices": "الاجهزة",
|
||||
"lan_devices": "LAN اجهزة",
|
||||
"wlan_devices": "WLAN احهزة",
|
||||
"devices": "الأجهزة",
|
||||
"lan_devices": "LAN أجهزة",
|
||||
"wlan_devices": "WLAN أجهزة",
|
||||
"lan_users": "LAN مستخدمين",
|
||||
"wlan_users": "WLAN مستخدمين",
|
||||
"up": "اعلي",
|
||||
"down": "اسفل",
|
||||
"wait": "الرجاء الانتظار"
|
||||
"up": "يعمل",
|
||||
"down": "لا يعمل",
|
||||
"wait": "الرجاء الإنتظار",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"wmo": {
|
||||
"73-day": "Snow",
|
||||
"0-day": "Sunny",
|
||||
"0-night": "Clear",
|
||||
"1-day": "Mainly Sunny",
|
||||
"1-night": "Mainly Clear",
|
||||
"2-day": "Partly Cloudy",
|
||||
"2-night": "Partly Cloudy",
|
||||
"3-day": "Cloudy",
|
||||
"3-night": "Cloudy",
|
||||
"45-day": "Foggy",
|
||||
"45-night": "Foggy",
|
||||
"48-day": "Foggy",
|
||||
"48-night": "Foggy",
|
||||
"51-day": "Light Drizzle",
|
||||
"51-night": "Light Drizzle",
|
||||
"53-day": "Drizzle",
|
||||
"53-night": "Drizzle",
|
||||
"55-day": "Heavy Drizzle",
|
||||
"55-night": "Heavy Drizzle",
|
||||
"56-day": "Light Freezing Drizzle",
|
||||
"56-night": "Light Freezing Drizzle",
|
||||
"57-day": "Freezing Drizzle",
|
||||
"57-night": "Freezing Drizzle",
|
||||
"61-day": "Light Rain",
|
||||
"61-night": "Light Rain",
|
||||
"63-day": "Rain",
|
||||
"63-night": "Rain",
|
||||
"65-day": "Heavy Rain",
|
||||
"65-night": "Heavy Rain",
|
||||
"66-day": "Freezing Rain",
|
||||
"66-night": "Freezing Rain",
|
||||
"67-day": "Freezing Rain",
|
||||
"67-night": "Freezing Rain",
|
||||
"71-day": "Light Snow",
|
||||
"71-night": "Light Snow",
|
||||
"73-night": "Snow",
|
||||
"75-day": "Heavy Snow",
|
||||
"75-night": "Heavy Snow",
|
||||
"77-day": "Snow Grains",
|
||||
"77-night": "Snow Grains",
|
||||
"80-day": "Light Showers",
|
||||
"80-night": "Light Showers",
|
||||
"81-day": "Showers",
|
||||
"81-night": "Showers",
|
||||
"82-day": "Heavy Showers",
|
||||
"82-night": "Heavy Showers",
|
||||
"85-day": "Snow Showers",
|
||||
"85-night": "Snow Showers",
|
||||
"86-day": "Snow Showers",
|
||||
"86-night": "Snow Showers",
|
||||
"95-day": "Thunderstorm",
|
||||
"95-night": "Thunderstorm",
|
||||
"96-day": "Thunderstorm With Hail",
|
||||
"96-night": "Thunderstorm With Hail",
|
||||
"99-day": "Thunderstorm With Hail",
|
||||
"99-night": "Thunderstorm With Hail"
|
||||
"73-day": "ثلج",
|
||||
"0-day": "مشمس",
|
||||
"0-night": "صافي",
|
||||
"1-day": "مشمس غالباً",
|
||||
"1-night": "صافي غالباً",
|
||||
"2-day": "غائم جزئياً",
|
||||
"2-night": "غائم جزئياً",
|
||||
"3-day": "غائم",
|
||||
"3-night": "غائم",
|
||||
"45-day": "ضبابي",
|
||||
"45-night": "ضبابي",
|
||||
"48-day": "ضبابي",
|
||||
"48-night": "ضبابي",
|
||||
"51-day": "رذاذ خفيف",
|
||||
"51-night": "رذاذ خفيف",
|
||||
"53-day": "رذاذ",
|
||||
"53-night": "رذاذ",
|
||||
"55-day": "رذاذ كثيف",
|
||||
"55-night": "رذاذ كثيف",
|
||||
"56-day": "رذاذ متجمد خفيف",
|
||||
"56-night": "رذاذ متجمد خفيف",
|
||||
"57-day": "رذاذ متجمد",
|
||||
"57-night": "رذاذ متجمد",
|
||||
"61-day": "مطر خفيف",
|
||||
"61-night": "مطر خفيف",
|
||||
"63-day": "مطر",
|
||||
"63-night": "مطر",
|
||||
"65-day": "مطر شديد",
|
||||
"65-night": "مطر شديد",
|
||||
"66-day": "مطر متجمد",
|
||||
"66-night": "مطر متجمد",
|
||||
"67-day": "مطر متجمد",
|
||||
"67-night": "مطر متجمد",
|
||||
"71-day": "ثلج خفيف",
|
||||
"71-night": "ثلج خفيف",
|
||||
"73-night": "ثلج",
|
||||
"75-day": "ثلج شديد",
|
||||
"75-night": "ثلج شديد",
|
||||
"77-day": "حبيبات الثلج",
|
||||
"77-night": "حبيبات الثلج",
|
||||
"80-day": "أمطار خفيفة",
|
||||
"80-night": "أمطار خفيفة",
|
||||
"81-day": "أمطار",
|
||||
"81-night": "أمطار",
|
||||
"82-day": "أمطار شديدة",
|
||||
"82-night": "أمطار شديدة",
|
||||
"85-day": "زخات الثلوج",
|
||||
"85-night": "زخات الثلوج",
|
||||
"86-day": "زخات الثلوج",
|
||||
"86-night": "زخات الثلوج",
|
||||
"95-day": "عاصفة رعدية",
|
||||
"95-night": "عاصفة رعدية",
|
||||
"96-day": "عاصفة رعدية مع مطر",
|
||||
"96-night": "عاصفة رعدية مع مطر",
|
||||
"99-day": "عاصفة رعدية مع مطر",
|
||||
"99-night": "عاصفة رعدية مع مطر"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
"tx": "TX",
|
||||
"mem": "الرام",
|
||||
"mem": "الذاكرة",
|
||||
"cpu": "المعالج",
|
||||
"offline": "غير متصل",
|
||||
"error": "Error",
|
||||
"unknown": "Unknown"
|
||||
"error": "خطأ",
|
||||
"unknown": "مجهول"
|
||||
},
|
||||
"emby": {
|
||||
"playing": "يعمل الان",
|
||||
"playing": "يعمل الآن",
|
||||
"transcoding": "التحويل",
|
||||
"bitrate": "معدل البت",
|
||||
"no_active": "No Active Streams"
|
||||
@@ -118,307 +120,353 @@
|
||||
"diffsDetected": "Diffs Detected"
|
||||
},
|
||||
"tautulli": {
|
||||
"playing": "Playing",
|
||||
"transcoding": "Transcoding",
|
||||
"bitrate": "Bitrate",
|
||||
"playing": "يشتغل",
|
||||
"transcoding": "التحويل",
|
||||
"bitrate": "معدل البت",
|
||||
"no_active": "No Active Streams"
|
||||
},
|
||||
"nzbget": {
|
||||
"rate": "Rate",
|
||||
"remaining": "Remaining",
|
||||
"downloaded": "Downloaded"
|
||||
"rate": "معدل",
|
||||
"remaining": "متبقي",
|
||||
"downloaded": "مُنزل"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
"movies": "Movies",
|
||||
"tv": "TV Shows"
|
||||
"movies": "أفلام",
|
||||
"tv": "مسلسلات"
|
||||
},
|
||||
"sabnzbd": {
|
||||
"rate": "Rate",
|
||||
"queue": "Queue",
|
||||
"timeleft": "Time Left"
|
||||
"rate": "معدل",
|
||||
"queue": "إنتظار",
|
||||
"timeleft": "الوقت المتبقي"
|
||||
},
|
||||
"rutorrent": {
|
||||
"active": "Active",
|
||||
"upload": "Upload",
|
||||
"download": "Download"
|
||||
"active": "نشط",
|
||||
"upload": "تحميل",
|
||||
"download": "تنزيل"
|
||||
},
|
||||
"transmission": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"download": "تنزيل",
|
||||
"upload": "تحميل",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
},
|
||||
"qbittorrent": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"download": "تنزيل",
|
||||
"upload": "تحميل",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
},
|
||||
"sonarr": {
|
||||
"wanted": "Wanted",
|
||||
"queued": "Queued",
|
||||
"series": "Series"
|
||||
"wanted": "مطلوب",
|
||||
"queued": "في الإنتظار",
|
||||
"series": "سلسلة"
|
||||
},
|
||||
"radarr": {
|
||||
"wanted": "Wanted",
|
||||
"missing": "Missing",
|
||||
"queued": "Queued",
|
||||
"movies": "Movies"
|
||||
"wanted": "مطلوب",
|
||||
"missing": "مفقود",
|
||||
"queued": "في الإنتظار",
|
||||
"movies": "أفلام"
|
||||
},
|
||||
"lidarr": {
|
||||
"wanted": "Wanted",
|
||||
"queued": "Queued",
|
||||
"albums": "Albums"
|
||||
"wanted": "مطلوب",
|
||||
"queued": "في الإنتظار",
|
||||
"albums": "ألبومات"
|
||||
},
|
||||
"readarr": {
|
||||
"wanted": "Wanted",
|
||||
"queued": "Queued",
|
||||
"books": "Books"
|
||||
"wanted": "مطلوب",
|
||||
"queued": "في الإنتظار",
|
||||
"books": "كتب"
|
||||
},
|
||||
"bazarr": {
|
||||
"missingEpisodes": "Missing Episodes",
|
||||
"missingMovies": "Missing Movies"
|
||||
"missingEpisodes": "حلقات مفقودة",
|
||||
"missingMovies": "أفلام مفقودة"
|
||||
},
|
||||
"ombi": {
|
||||
"pending": "Pending",
|
||||
"approved": "Approved",
|
||||
"available": "Available"
|
||||
"pending": "معلق",
|
||||
"approved": "مصدق",
|
||||
"available": "متاح"
|
||||
},
|
||||
"jellyseerr": {
|
||||
"pending": "Pending",
|
||||
"approved": "Approved",
|
||||
"available": "Available"
|
||||
"pending": "معلق",
|
||||
"approved": "مصدق",
|
||||
"available": "متاح"
|
||||
},
|
||||
"overseerr": {
|
||||
"pending": "Pending",
|
||||
"approved": "Approved",
|
||||
"available": "Available",
|
||||
"processing": "Processing"
|
||||
"pending": "معلق",
|
||||
"approved": "مصدق",
|
||||
"available": "متاح",
|
||||
"processing": "معالجة"
|
||||
},
|
||||
"pihole": {
|
||||
"queries": "Queries",
|
||||
"blocked": "Blocked",
|
||||
"gravity": "Gravity"
|
||||
"queries": "الاستعلامات",
|
||||
"blocked": "محظور",
|
||||
"gravity": "الجاذبية"
|
||||
},
|
||||
"adguard": {
|
||||
"queries": "Queries",
|
||||
"blocked": "Blocked",
|
||||
"filtered": "Filtered",
|
||||
"latency": "Latency"
|
||||
"queries": "الاستعلامات",
|
||||
"blocked": "محظور",
|
||||
"filtered": "مرشح",
|
||||
"latency": "الإستجابة"
|
||||
},
|
||||
"speedtest": {
|
||||
"upload": "Upload",
|
||||
"download": "Download",
|
||||
"upload": "التحميل",
|
||||
"download": "تنزيل",
|
||||
"ping": "Ping"
|
||||
},
|
||||
"portainer": {
|
||||
"running": "Running",
|
||||
"stopped": "Stopped",
|
||||
"total": "Total"
|
||||
"running": "يعمل",
|
||||
"stopped": "متوقف",
|
||||
"total": "مجموع"
|
||||
},
|
||||
"traefik": {
|
||||
"routers": "Routers",
|
||||
"services": "Services",
|
||||
"middleware": "Middleware"
|
||||
"routers": "راوتر",
|
||||
"services": "خدمات",
|
||||
"middleware": "الوسيطة"
|
||||
},
|
||||
"npm": {
|
||||
"enabled": "Enabled",
|
||||
"disabled": "Disabled",
|
||||
"total": "Total"
|
||||
"enabled": "مفعل",
|
||||
"disabled": "معطل",
|
||||
"total": "مجموع"
|
||||
},
|
||||
"coinmarketcap": {
|
||||
"configure": "Configure one or more crypto currencies to track",
|
||||
"1hour": "1 Hour",
|
||||
"1day": "1 Day",
|
||||
"7days": "7 Days",
|
||||
"30days": "30 Days"
|
||||
"configure": "قم بأنشاء عملة تشفير واحدة أو أكثر للتتبع",
|
||||
"1hour": "١ ساعة",
|
||||
"1day": "١ يوم",
|
||||
"7days": "٧ أيام",
|
||||
"30days": "٣٠ يوم"
|
||||
},
|
||||
"gotify": {
|
||||
"apps": "Applications",
|
||||
"clients": "Clients",
|
||||
"messages": "Messages"
|
||||
"apps": "التطبيقات",
|
||||
"clients": "العملاء",
|
||||
"messages": "الرسائل"
|
||||
},
|
||||
"prowlarr": {
|
||||
"enableIndexers": "Indexers",
|
||||
"enableIndexers": "مفهرسات",
|
||||
"numberOfGrabs": "Grabs",
|
||||
"numberOfQueries": "Queries",
|
||||
"numberOfQueries": "الاستعلامات",
|
||||
"numberOfFailGrabs": "Fail Grabs",
|
||||
"numberOfFailQueries": "Fail Queries"
|
||||
"numberOfFailQueries": "فشل الاستعلامات"
|
||||
},
|
||||
"jackett": {
|
||||
"configured": "Configured",
|
||||
"errored": "Errored"
|
||||
"errored": "خطأ"
|
||||
},
|
||||
"strelaysrv": {
|
||||
"numActiveSessions": "Sessions",
|
||||
"numConnections": "Connections",
|
||||
"numActiveSessions": "الجلسات",
|
||||
"numConnections": "التوصيلات",
|
||||
"dataRelayed": "Relayed",
|
||||
"transferRate": "Rate"
|
||||
"transferRate": "معدل"
|
||||
},
|
||||
"mastodon": {
|
||||
"user_count": "Users",
|
||||
"user_count": "المستخدمين",
|
||||
"status_count": "Posts",
|
||||
"domain_count": "Domains"
|
||||
},
|
||||
"authentik": {
|
||||
"users": "Users",
|
||||
"loginsLast24H": "Logins (24h)",
|
||||
"failedLoginsLast24H": "Failed Logins (24h)"
|
||||
"users": "المستخدمين",
|
||||
"loginsLast24H": "تسجيلات الدخول (٢٤س)",
|
||||
"failedLoginsLast24H": "فشل تسجيلات الدخول (٢٤س)"
|
||||
},
|
||||
"proxmox": {
|
||||
"mem": "MEM",
|
||||
"cpu": "CPU",
|
||||
"mem": "الذاكرة",
|
||||
"cpu": "المعالج",
|
||||
"lxc": "LXC",
|
||||
"vms": "VMs"
|
||||
},
|
||||
"glances": {
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM",
|
||||
"wait": "Please wait"
|
||||
"cpu": "معالج",
|
||||
"mem": "الذاكرة",
|
||||
"wait": "الرجاء الإنتظار"
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"bookmark": "مفضلة",
|
||||
"service": "خدمة",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
"updates": "Updates",
|
||||
"update_available": "Update Available",
|
||||
"up_to_date": "Up to Date",
|
||||
"available_update": "نظام",
|
||||
"updates": "تحديثات",
|
||||
"update_available": "تحديث متاح",
|
||||
"up_to_date": "حتى الآن",
|
||||
"child_bridges": "Child Bridges",
|
||||
"child_bridges_status": "{{ok}}/{{total}}"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Scanned",
|
||||
"containers_updated": "Updated",
|
||||
"containers_failed": "Failed"
|
||||
"containers_updated": "محدث",
|
||||
"containers_failed": "فشل"
|
||||
},
|
||||
"autobrr": {
|
||||
"approvedPushes": "Approved",
|
||||
"rejectedPushes": "Rejected",
|
||||
"filters": "Filters",
|
||||
"indexers": "Indexers"
|
||||
"approvedPushes": "مصدق",
|
||||
"rejectedPushes": "مرفوض",
|
||||
"filters": "المرشحات",
|
||||
"indexers": "مفهرسات"
|
||||
},
|
||||
"tubearchivist": {
|
||||
"downloads": "Queue",
|
||||
"videos": "Videos",
|
||||
"channels": "Channels",
|
||||
"playlists": "Playlists"
|
||||
"downloads": "إنتظار",
|
||||
"videos": "الفيديوهات",
|
||||
"channels": "القنوات",
|
||||
"playlists": "قوائم التشغيل"
|
||||
},
|
||||
"truenas": {
|
||||
"load": "System Load",
|
||||
"uptime": "Uptime",
|
||||
"alerts": "Alerts",
|
||||
"load": "حمل النظام",
|
||||
"uptime": "مدة التشغيل",
|
||||
"alerts": "تنبيهات",
|
||||
"time": "{{value, number(style: unit; unitDisplay: long;)}}"
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "No Active Streams",
|
||||
"please_wait": "Please Wait"
|
||||
"please_wait": "الرجاء الإنتظار"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Speed",
|
||||
"active": "Active",
|
||||
"queue": "Queue",
|
||||
"total": "Total"
|
||||
"speed": "السرعة",
|
||||
"active": "نشط",
|
||||
"queue": "إنتظار",
|
||||
"total": "مجموع"
|
||||
},
|
||||
"gluetun": {
|
||||
"public_ip": "Public IP",
|
||||
"region": "Region",
|
||||
"country": "Country"
|
||||
"public_ip": "العام IP",
|
||||
"region": "منطقة",
|
||||
"country": "الدولة"
|
||||
},
|
||||
"hdhomerun": {
|
||||
"channels": "Channels",
|
||||
"channels": "قنوات",
|
||||
"hd": "HD"
|
||||
},
|
||||
"ping": {
|
||||
"error": "Error",
|
||||
"error": "خطأ",
|
||||
"ping": "Ping"
|
||||
},
|
||||
"scrutiny": {
|
||||
"passed": "Passed",
|
||||
"failed": "Failed",
|
||||
"unknown": "Unknown"
|
||||
"passed": "إجتاز",
|
||||
"failed": "فشل",
|
||||
"unknown": "مجهول"
|
||||
},
|
||||
"paperlessngx": {
|
||||
"inbox": "Inbox",
|
||||
"total": "Total"
|
||||
"inbox": "صندوق الوارد",
|
||||
"total": "المجموع"
|
||||
},
|
||||
"deluge": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"download": "تنزيل",
|
||||
"upload": "تحميل",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
},
|
||||
"flood": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"download": "التنزيل",
|
||||
"upload": "التحميل",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
},
|
||||
"tdarr": {
|
||||
"queue": "Queue",
|
||||
"processed": "Processed",
|
||||
"errored": "Errored",
|
||||
"saved": "Saved"
|
||||
"queue": "إنتظار",
|
||||
"processed": "معالجة",
|
||||
"errored": "خطأ",
|
||||
"saved": "حفظ"
|
||||
},
|
||||
"miniflux": {
|
||||
"read": "Read",
|
||||
"unread": "Unread"
|
||||
"read": "قراءة",
|
||||
"unread": "غير مقروء"
|
||||
},
|
||||
"nextdns": {
|
||||
"wait": "Please Wait",
|
||||
"no_devices": "No Device Data Received"
|
||||
"wait": "الرجاء الإنتظار",
|
||||
"no_devices": "لم يتم استلام بيانات الجهاز"
|
||||
},
|
||||
"common": {
|
||||
"bibyterate": "{{value, rate(bits: false; binary: true)}}",
|
||||
"bibitrate": "{{value, rate(bits: true; binary: true)}}"
|
||||
},
|
||||
"omada": {
|
||||
"connectedAp": "Connected APs",
|
||||
"activeUser": "Active devices",
|
||||
"alerts": "Alerts",
|
||||
"connectedAp": "المتصلة APs",
|
||||
"activeUser": "الأجهزة النشطة",
|
||||
"alerts": "تنبيهات",
|
||||
"connectedGateway": "Connected gateways",
|
||||
"connectedSwitches": "Connected switches"
|
||||
},
|
||||
"downloadstation": {
|
||||
"download": "Download",
|
||||
"upload": "Upload",
|
||||
"download": "تنزيل",
|
||||
"upload": "تحميل",
|
||||
"leech": "Leech",
|
||||
"seed": "Seed"
|
||||
},
|
||||
"mikrotik": {
|
||||
"cpuLoad": "CPU Load",
|
||||
"memoryUsed": "Memory Used",
|
||||
"uptime": "Uptime",
|
||||
"cpuLoad": "حمل المعالج",
|
||||
"memoryUsed": "الذاكرة الستخدمة",
|
||||
"uptime": "مدة التشغيل",
|
||||
"numberOfLeases": "Leases"
|
||||
},
|
||||
"xteve": {
|
||||
"streams_all": "All Streams",
|
||||
"streams_active": "Active Streams",
|
||||
"streams_xepg": "XEPG Channels"
|
||||
"streams_xepg": "XEPG قنوات"
|
||||
},
|
||||
"opnsense": {
|
||||
"cpu": "CPU Load",
|
||||
"memory": "Active Memory",
|
||||
"wanUpload": "WAN Upload",
|
||||
"wanDownload": "WAN Download"
|
||||
"cpu": "حمل المعالج",
|
||||
"memory": "الذاكرة النشطة",
|
||||
"wanUpload": "WAN التحميل",
|
||||
"wanDownload": "WAN التنزيل"
|
||||
},
|
||||
"moonraker": {
|
||||
"printer_state": "Printer State",
|
||||
"print_status": "Print Status",
|
||||
"print_progress": "Progress",
|
||||
"layers": "Layers"
|
||||
"printer_state": "حالة الطابعة",
|
||||
"print_status": "حالة الطابعة",
|
||||
"print_progress": "تقدم",
|
||||
"layers": "طبقات"
|
||||
},
|
||||
"medusa": {
|
||||
"wanted": "Wanted",
|
||||
"queued": "Queued",
|
||||
"series": "Series"
|
||||
"wanted": "مطلوب",
|
||||
"queued": "في الإنتظار",
|
||||
"series": "سلسلة"
|
||||
},
|
||||
"octoprint": {
|
||||
"printer_state": "Status",
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
"printer_state": "حالة",
|
||||
"temp_tool": "أداة درجة الحرارة",
|
||||
"temp_bed": "درجة حرارة السرير",
|
||||
"job_completion": "إتمام"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "حالة"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"volumeAvailable": "Available",
|
||||
"uptime": "Uptime"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +32,8 @@
|
||||
"total": "Общо",
|
||||
"free": "Свободни",
|
||||
"used": "Заети",
|
||||
"load": "Натоварване"
|
||||
"load": "Натоварване",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Потребители",
|
||||
@@ -48,7 +49,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Devices",
|
||||
"lan_devices": "LAN Devices",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
"wlan_devices": "WLAN Devices",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"docker": {
|
||||
"offline": "Изключен",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
@@ -420,5 +424,49 @@
|
||||
"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": {
|
||||
"down": "Sites Down",
|
||||
"up": "Sites Up",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,7 +38,8 @@
|
||||
"free": "Lliure",
|
||||
"used": "Utilitzat",
|
||||
"load": "Càrrega",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "Rebut",
|
||||
@@ -184,7 +185,7 @@
|
||||
"failedLoginsLast24H": "Errors d'inici de sessió (24h)"
|
||||
},
|
||||
"proxmox": {
|
||||
"vms": "Màquines Virtuals",
|
||||
"vms": "VMs",
|
||||
"mem": "Memòria",
|
||||
"cpu": "Processador",
|
||||
"lxc": "LXC"
|
||||
@@ -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",
|
||||
@@ -420,5 +424,49 @@
|
||||
"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": {
|
||||
"m": "m",
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,7 +34,8 @@
|
||||
"total": "Celkem",
|
||||
"free": "Volné",
|
||||
"used": "Využité",
|
||||
"load": "Vytížení"
|
||||
"load": "Vytížení",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Uživatelé",
|
||||
@@ -50,7 +51,8 @@
|
||||
"wlan_users": "WLAN Uživatelé",
|
||||
"up": "BĚŽÍ",
|
||||
"down": "NEBĚŽÍ",
|
||||
"wait": "Počkejte prosím"
|
||||
"wait": "Počkejte prosím",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -291,7 +293,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Záložka",
|
||||
"service": "Služba"
|
||||
"service": "Služba",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"update_available": "Dostupná aktualizace",
|
||||
@@ -420,5 +424,49 @@
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -159,7 +159,8 @@
|
||||
"total": "Total",
|
||||
"free": "Fri",
|
||||
"used": "Brugt",
|
||||
"load": "Belastning"
|
||||
"load": "Belastning",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Brugere",
|
||||
@@ -175,7 +176,8 @@
|
||||
"wlan_users": "WLAN Brugere",
|
||||
"up": "Oppe",
|
||||
"down": "NED",
|
||||
"wait": "Vent venligst"
|
||||
"wait": "Vent venligst",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"docker": {
|
||||
"cpu": "CPU",
|
||||
@@ -287,7 +289,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bogmærker",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"watchtower": {
|
||||
"containers_scanned": "Scannet",
|
||||
@@ -420,5 +424,49 @@
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,8 @@
|
||||
"free": "Frei",
|
||||
"used": "Gebraucht",
|
||||
"load": "Last",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "Rx",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Geräte",
|
||||
"lan_devices": "LAN-Geräte",
|
||||
"wlan_devices": "WLAN Geräte"
|
||||
"wlan_devices": "WLAN Geräte",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Aktive Streams",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Lesezeichen",
|
||||
"service": "Dienst"
|
||||
"service": "Dienst",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
@@ -420,5 +424,49 @@
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"cpu_usage": "CPU",
|
||||
"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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
@@ -429,5 +433,49 @@
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
}
|
||||
}
|
||||
@@ -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",
|
||||
@@ -420,5 +424,49 @@
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,8 @@
|
||||
"free": "Libre",
|
||||
"used": "Usado",
|
||||
"load": "Carga",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "Recibido",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Dispositivos",
|
||||
"lan_devices": "Dispositivos LAN",
|
||||
"wlan_devices": "Dispositivos WLAN"
|
||||
"wlan_devices": "Dispositivos WLAN",
|
||||
"empty_data": "Se desconoce el estado del subsistema"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Transmisiones activas",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Marcadores",
|
||||
"service": "Servicio"
|
||||
"service": "Servicio",
|
||||
"search": "Buscar",
|
||||
"custom": "Personalizado"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "Sistema",
|
||||
@@ -420,5 +424,49 @@
|
||||
"printer_state": "Status",
|
||||
"temp_tool": "Tool temp",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "IP de origen",
|
||||
"status": "Estado"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"cpu_usage": "CPU",
|
||||
"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": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,8 @@
|
||||
"total": "Yhteensä",
|
||||
"free": "Vapaana",
|
||||
"used": "Käytetty",
|
||||
"load": "Kuorma"
|
||||
"load": "Kuorma",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -194,7 +195,7 @@
|
||||
"uptime": "System Uptime",
|
||||
"lan_users": "LAN Users",
|
||||
"wlan_users": "WLAN Users",
|
||||
"wait": "Please wait",
|
||||
"wait": "Odota, ole hyvä",
|
||||
"days": "Days",
|
||||
"wan": "WAN",
|
||||
"up": "UP",
|
||||
@@ -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",
|
||||
@@ -314,7 +318,7 @@
|
||||
},
|
||||
"navidrome": {
|
||||
"nothing_streaming": "No Active Streams",
|
||||
"please_wait": "Please Wait"
|
||||
"please_wait": "Odota, ole hyvä"
|
||||
},
|
||||
"pyload": {
|
||||
"speed": "Speed",
|
||||
@@ -411,14 +415,58 @@
|
||||
"layers": "Layers"
|
||||
},
|
||||
"medusa": {
|
||||
"wanted": "Wanted",
|
||||
"queued": "Queued",
|
||||
"series": "Series"
|
||||
"wanted": "Haluttu",
|
||||
"queued": "Jonossa",
|
||||
"series": "Sarja"
|
||||
},
|
||||
"octoprint": {
|
||||
"printer_state": "Status",
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,8 @@
|
||||
"free": "Libre",
|
||||
"used": "Utilisé",
|
||||
"load": "Charge",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "Rx",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Équipt.",
|
||||
"lan_devices": "Équipt. LAN",
|
||||
"wlan_devices": "Équipt. WLAN"
|
||||
"wlan_devices": "Équipt. WLAN",
|
||||
"empty_data": "Statut sous-système inconnu"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Flux actif",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Signet",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Recherche",
|
||||
"custom": "Personnalisé"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "Système",
|
||||
@@ -419,6 +423,50 @@
|
||||
"printer_state": "Status",
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
"job_completion": "Achèvement"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "IP Publique",
|
||||
"status": "Statut"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Tâches échouées 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"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": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,8 @@
|
||||
"free": "פנוי",
|
||||
"used": "בשימוש",
|
||||
"load": "עומס",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Devices",
|
||||
"lan_devices": "LAN Devices",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
"wlan_devices": "WLAN Devices",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
@@ -420,5 +424,49 @@
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,7 +56,8 @@
|
||||
"total": "Total",
|
||||
"free": "Free",
|
||||
"used": "Used",
|
||||
"load": "Load"
|
||||
"load": "Load",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Users",
|
||||
@@ -72,7 +73,8 @@
|
||||
"wlan_users": "WLAN Users",
|
||||
"up": "UP",
|
||||
"down": "DOWN",
|
||||
"wait": "Please wait"
|
||||
"wait": "Please wait",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -225,7 +227,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"wmo": {
|
||||
"0-day": "Sunny",
|
||||
@@ -420,5 +424,49 @@
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,8 @@
|
||||
"free": "Slobodno",
|
||||
"used": "Korišteno",
|
||||
"load": "Opterećenje",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"sabnzbd": {
|
||||
"rate": "Stopa",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Uređaji",
|
||||
"lan_devices": "LAN uređaji",
|
||||
"wlan_devices": "WLAN uređaji"
|
||||
"wlan_devices": "WLAN uređaji",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Aktivni prijenosi",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Straničnik",
|
||||
"service": "Usluga"
|
||||
"service": "Usluga",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "Sustav",
|
||||
@@ -420,5 +424,49 @@
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"videos": "Videos",
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
"free": "Szabad",
|
||||
"used": "Használt",
|
||||
"load": "Terhelés",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Devices",
|
||||
"lan_devices": "LAN Devices",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
"wlan_devices": "WLAN Devices",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
@@ -420,5 +424,49 @@
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,7 +52,8 @@
|
||||
"free": "Libero",
|
||||
"used": "In utilizzo",
|
||||
"load": "Carico",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"rutorrent": {
|
||||
"active": "Attivo",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Dispositivi",
|
||||
"lan_devices": "Dispositivi LAN",
|
||||
"wlan_devices": "Dispositivi WLAN"
|
||||
"wlan_devices": "Dispositivi WLAN",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Trasmissioni attive",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Segnalibro",
|
||||
"service": "Servizio"
|
||||
"service": "Servizio",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "Sistema",
|
||||
@@ -420,5 +424,49 @@
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,7 +57,8 @@
|
||||
"total": "Total",
|
||||
"free": "Free",
|
||||
"used": "Used",
|
||||
"load": "Load"
|
||||
"load": "Load",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Users",
|
||||
@@ -73,7 +74,8 @@
|
||||
"wlan_users": "WLAN Users",
|
||||
"up": "UP",
|
||||
"down": "DOWN",
|
||||
"wait": "Please wait"
|
||||
"wait": "Please wait",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"wmo": {
|
||||
"0-day": "Sunny",
|
||||
@@ -420,5 +424,49 @@
|
||||
"printer_state": "Status",
|
||||
"temp_tool": "Tool temp",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,7 +26,8 @@
|
||||
"total": "Kopā",
|
||||
"free": "Brīvs",
|
||||
"used": "Izmantojas",
|
||||
"load": "Ielādē"
|
||||
"load": "Ielādē",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Lietotāji",
|
||||
@@ -42,7 +43,8 @@
|
||||
"wlan_users": "WLAN lietotāji",
|
||||
"up": "DARBOJAS",
|
||||
"down": "NEDARBOJAS",
|
||||
"wait": "Lūdzu, uzgaidiet"
|
||||
"wait": "Lūdzu, uzgaidiet",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -273,7 +275,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"wmo": {
|
||||
"0-day": "Saulains",
|
||||
@@ -420,5 +424,49 @@
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
"total": "Jumlah",
|
||||
"free": "Bebas",
|
||||
"used": "Telah diguna",
|
||||
"load": "Beban"
|
||||
"load": "Beban",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"unifi": {
|
||||
"uptime": "Masa Operasi Sistem",
|
||||
@@ -20,7 +21,8 @@
|
||||
"wlan_users": "Pengguna WLAN",
|
||||
"up": "HIDUP",
|
||||
"down": "MATI",
|
||||
"wait": "Sila tunggu"
|
||||
"wait": "Sila tunggu",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"lidarr": {
|
||||
"queued": "Dibaris Gilir",
|
||||
@@ -62,7 +64,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Tandabuku",
|
||||
"service": "Servis"
|
||||
"service": "Servis",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"wmo": {
|
||||
"0-day": "Terik",
|
||||
@@ -420,5 +424,49 @@
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,8 @@
|
||||
"free": "Ledig",
|
||||
"used": "Brukt",
|
||||
"load": "Last inn",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "Mottatt",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Devices",
|
||||
"lan_devices": "LAN Devices",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
"wlan_devices": "WLAN Devices",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
@@ -420,5 +424,49 @@
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,8 @@
|
||||
"free": "Vrij",
|
||||
"used": "Gebruikt",
|
||||
"load": "Laadt",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Apparaten",
|
||||
"lan_devices": "LAN Apparaten",
|
||||
"wlan_devices": "WLAN Apparaten"
|
||||
"wlan_devices": "WLAN Apparaten",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
@@ -420,5 +424,49 @@
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"wanted": "Wanted",
|
||||
"series": "Series",
|
||||
"issues": "Issues"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,8 @@
|
||||
"load": "Obciążenie",
|
||||
"total": "Całkowite",
|
||||
"free": "Wolne",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"emby": {
|
||||
"no_active": "Brak aktywnych strumieni",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Urządzenia",
|
||||
"lan_devices": "Urządzenia LAN",
|
||||
"wlan_devices": "Urządzenia WLAN"
|
||||
"wlan_devices": "Urządzenia WLAN",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Aktywne strumienie",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Zakładka",
|
||||
"service": "Usługi"
|
||||
"service": "Usługi",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
@@ -420,5 +424,49 @@
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available",
|
||||
"days": "Days"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
@@ -420,5 +424,49 @@
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"videos": "Videos",
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,8 @@
|
||||
"free": "Livre",
|
||||
"used": "Utilizado",
|
||||
"load": "Carga",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "Rx",
|
||||
@@ -216,7 +217,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Dispositivos",
|
||||
"lan_devices": "Dispositivos LAN",
|
||||
"wlan_devices": "Dispositivos WLAN"
|
||||
"wlan_devices": "Dispositivos WLAN",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Streams Ativas",
|
||||
@@ -292,7 +294,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Marcador",
|
||||
"service": "Serviço"
|
||||
"service": "Serviço",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "Sistema",
|
||||
@@ -429,5 +433,49 @@
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
"load": "Sarcină",
|
||||
"total": "Total",
|
||||
"free": "Disponibili",
|
||||
"cpu": "Procesor"
|
||||
"cpu": "Procesor",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Devices",
|
||||
"lan_devices": "LAN Devices",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
"wlan_devices": "WLAN Devices",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Fluxuri active",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"update_available": "Update Available",
|
||||
@@ -420,5 +424,49 @@
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,8 @@
|
||||
"free": "Свободно",
|
||||
"used": "Использовано",
|
||||
"load": "Загрузка",
|
||||
"cpu": "Процессор"
|
||||
"cpu": "Процессор",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "Rx",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Устройства",
|
||||
"lan_devices": "Устройства подключённые по LAN",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
"wlan_devices": "WLAN Devices",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
@@ -420,5 +424,49 @@
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,8 @@
|
||||
"total": "Total",
|
||||
"free": "Free",
|
||||
"used": "Used",
|
||||
"load": "Load"
|
||||
"load": "Load",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Users",
|
||||
@@ -38,7 +39,8 @@
|
||||
"wlan_users": "WLAN Users",
|
||||
"up": "UP",
|
||||
"down": "DOWN",
|
||||
"wait": "Please wait"
|
||||
"wait": "Please wait",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
@@ -420,5 +424,49 @@
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,7 +19,8 @@
|
||||
"total": "Total",
|
||||
"free": "Ledigt",
|
||||
"used": "Använt",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Devices",
|
||||
"lan_devices": "LAN Devices",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
"wlan_devices": "WLAN Devices",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Aktiva strömmar",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
@@ -420,5 +424,49 @@
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,7 +39,8 @@
|
||||
"total": "మొత్తం",
|
||||
"free": "మిగిలింది",
|
||||
"used": "ఉపయోగించబడిన",
|
||||
"load": "లోడ్"
|
||||
"load": "లోడ్",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "పరికరాలు",
|
||||
"lan_devices": "LAN పరికరాలు",
|
||||
"wlan_devices": "WLAN పరికరాలు"
|
||||
"wlan_devices": "WLAN పరికరాలు",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "యాక్టివ్ స్ట్రీమ్లు",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "బుక్మార్క్",
|
||||
"service": "సేవ"
|
||||
"service": "సేవ",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "వ్యవస్థ",
|
||||
@@ -420,5 +424,49 @@
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,8 @@
|
||||
"total": "Toplam",
|
||||
"free": "Boşta",
|
||||
"used": "Kullanımda",
|
||||
"load": "Yük"
|
||||
"load": "Yük",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Kullanıcılar",
|
||||
@@ -38,7 +39,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Aygıtlar",
|
||||
"lan_devices": "LAN Aygıtları",
|
||||
"wlan_devices": "WLAN Aygıtları"
|
||||
"wlan_devices": "WLAN Aygıtları",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "Gelen Veri",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Yer İmi",
|
||||
"service": "Hizmet"
|
||||
"service": "Hizmet",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "Sistem",
|
||||
@@ -420,5 +424,49 @@
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -127,7 +127,8 @@
|
||||
"total": "Всього",
|
||||
"free": "Вільно",
|
||||
"used": "Використано",
|
||||
"load": "Навантаження"
|
||||
"load": "Навантаження",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"unifi": {
|
||||
"users": "Користувачі",
|
||||
@@ -143,7 +144,8 @@
|
||||
"wlan_users": "WLAN користувачі",
|
||||
"up": "Відправка",
|
||||
"down": "Завантаження",
|
||||
"wait": "Будь ласка, зачекайте"
|
||||
"wait": "Будь ласка, зачекайте",
|
||||
"empty_data": "Статус підсистеми невідомий"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -341,7 +343,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Закладка",
|
||||
"service": "Сервіс"
|
||||
"service": "Сервіс",
|
||||
"search": "Пошук",
|
||||
"custom": "Користувацький"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "Система",
|
||||
@@ -416,9 +420,53 @@
|
||||
"series": "Серії"
|
||||
},
|
||||
"octoprint": {
|
||||
"printer_state": "Status",
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
"printer_state": "Стан",
|
||||
"temp_tool": "Температура інструменту",
|
||||
"temp_bed": "Температура ліжка",
|
||||
"job_completion": "Завершення"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Походження IP",
|
||||
"status": "Стан"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Сховище даних",
|
||||
"failed_tasks_24h": "Невиконані завдання 24 години",
|
||||
"cpu_usage": "CPU",
|
||||
"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": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,8 @@
|
||||
"free": "Dư",
|
||||
"used": "Đã dùng",
|
||||
"load": "Load",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "RX",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Devices",
|
||||
"lan_devices": "LAN Devices",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
"wlan_devices": "WLAN Devices",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
@@ -420,5 +424,49 @@
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People",
|
||||
"albums": "Albums"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,7 +40,8 @@
|
||||
"free": "剩餘",
|
||||
"used": "用咗",
|
||||
"load": "負荷",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "接收",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "Devices",
|
||||
"lan_devices": "LAN Devices",
|
||||
"wlan_devices": "WLAN Devices"
|
||||
"wlan_devices": "WLAN Devices",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "Active Streams",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "Bookmark",
|
||||
"service": "Service"
|
||||
"service": "Service",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
@@ -420,5 +424,49 @@
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"days": "Days",
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"docker": {
|
||||
"rx": "接收",
|
||||
@@ -24,8 +25,8 @@
|
||||
"mem": "内存",
|
||||
"cpu": "处理器",
|
||||
"offline": "离线",
|
||||
"error": "Error",
|
||||
"unknown": "Unknown"
|
||||
"error": "错误",
|
||||
"unknown": "未知"
|
||||
},
|
||||
"emby": {
|
||||
"playing": "播放中",
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "无线局域网",
|
||||
"devices": "设备",
|
||||
"lan_devices": "局域网设备",
|
||||
"wlan_devices": "无线局域网设备"
|
||||
"wlan_devices": "无线局域网设备",
|
||||
"empty_data": "子系统状态未知"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "活动流",
|
||||
@@ -279,7 +281,9 @@
|
||||
},
|
||||
"quicklaunch": {
|
||||
"bookmark": "书签",
|
||||
"service": "服务"
|
||||
"service": "服务",
|
||||
"search": "Search",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"homebridge": {
|
||||
"available_update": "System",
|
||||
@@ -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,16 +380,16 @@
|
||||
},
|
||||
"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",
|
||||
@@ -420,5 +424,49 @@
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "Origin IP",
|
||||
"status": "Status"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "Datastore",
|
||||
"failed_tasks_24h": "Failed Tasks 24h",
|
||||
"cpu_usage": "CPU",
|
||||
"memory_usage": "Memory"
|
||||
},
|
||||
"immich": {
|
||||
"users": "Users",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"storage": "Storage"
|
||||
},
|
||||
"uptimekuma": {
|
||||
"up": "Sites Up",
|
||||
"down": "Sites Down",
|
||||
"uptime": "Uptime",
|
||||
"incident": "Incident",
|
||||
"m": "m"
|
||||
},
|
||||
"komga": {
|
||||
"libraries": "Libraries",
|
||||
"series": "Series",
|
||||
"books": "Books"
|
||||
},
|
||||
"mylar": {
|
||||
"series": "Series",
|
||||
"issues": "Issues",
|
||||
"wanted": "Wanted"
|
||||
},
|
||||
"photoprism": {
|
||||
"albums": "Albums",
|
||||
"photos": "Photos",
|
||||
"videos": "Videos",
|
||||
"people": "People"
|
||||
},
|
||||
"diskstation": {
|
||||
"uptime": "Uptime",
|
||||
"volumeAvailable": "Available",
|
||||
"days": "Days"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
"api_error": "API錯誤",
|
||||
"status": "狀態",
|
||||
"information": "資訊",
|
||||
"url": "URL",
|
||||
"raw_error": "Raw Error",
|
||||
"response_data": "Response Data"
|
||||
"url": "網址",
|
||||
"raw_error": "原始錯誤",
|
||||
"response_data": "回復數據"
|
||||
},
|
||||
"weather": {
|
||||
"current": "目前位置",
|
||||
@@ -36,9 +36,9 @@
|
||||
"no_active": "無播放活動"
|
||||
},
|
||||
"jellyseerr": {
|
||||
"pending": "待定",
|
||||
"approved": "已接受",
|
||||
"available": "可用的"
|
||||
"pending": "待下載",
|
||||
"approved": "已核准",
|
||||
"available": "可觀看"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "搜尋…"
|
||||
@@ -48,7 +48,8 @@
|
||||
"free": "剩餘",
|
||||
"used": "已使用",
|
||||
"load": "負載",
|
||||
"cpu": "CPU"
|
||||
"cpu": "CPU",
|
||||
"mem": "MEM"
|
||||
},
|
||||
"nzbget": {
|
||||
"rate": "速率",
|
||||
@@ -82,14 +83,14 @@
|
||||
"books": "書籍"
|
||||
},
|
||||
"ombi": {
|
||||
"pending": "待定",
|
||||
"approved": "已接受",
|
||||
"available": "可用的"
|
||||
"pending": "待下載",
|
||||
"approved": "已核准",
|
||||
"available": "可觀看"
|
||||
},
|
||||
"overseerr": {
|
||||
"pending": "待定",
|
||||
"approved": "已接受",
|
||||
"available": "可用的",
|
||||
"pending": "待下載",
|
||||
"approved": "已核准",
|
||||
"available": "可觀看",
|
||||
"processing": "處理中"
|
||||
},
|
||||
"pihole": {
|
||||
@@ -203,7 +204,8 @@
|
||||
"wlan": "WLAN",
|
||||
"devices": "設備",
|
||||
"lan_devices": "LAN設備",
|
||||
"wlan_devices": "WLAN設備"
|
||||
"wlan_devices": "WLAN設備",
|
||||
"empty_data": "Subsystem status unknown"
|
||||
},
|
||||
"plex": {
|
||||
"streams": "正在播放",
|
||||
@@ -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": "索引器"
|
||||
@@ -416,9 +420,53 @@
|
||||
"series": "影集"
|
||||
},
|
||||
"octoprint": {
|
||||
"printer_state": "Status",
|
||||
"temp_tool": "Tool temp",
|
||||
"temp_bed": "Bed temp",
|
||||
"job_completion": "Completion"
|
||||
"printer_state": "狀態",
|
||||
"temp_tool": "噴頭溫度",
|
||||
"temp_bed": "平台溫度",
|
||||
"job_completion": "完成度"
|
||||
},
|
||||
"cloudflared": {
|
||||
"origin_ip": "源頭IP",
|
||||
"status": "狀態"
|
||||
},
|
||||
"proxmoxbackupserver": {
|
||||
"datastore_usage": "數據存儲",
|
||||
"failed_tasks_24h": "24小時內失敗任務",
|
||||
"cpu_usage": "CPU",
|
||||
"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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
))}
|
||||
|
||||
@@ -30,8 +30,8 @@ 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>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -1,16 +1,18 @@
|
||||
import Docker from "dockerode";
|
||||
|
||||
import getDockerArguments from "utils/config/docker";
|
||||
import createLogger from "utils/logger";
|
||||
|
||||
const logger = createLogger("dockerStatsService");
|
||||
|
||||
export default async function handler(req, res) {
|
||||
const { service } = req.query;
|
||||
const [containerName, containerServer] = service;
|
||||
|
||||
if (!containerName && !containerServer) {
|
||||
res.status(400).send({
|
||||
return res.status(400).send({
|
||||
error: "docker query parameters are required",
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
@@ -23,10 +25,9 @@ export default async function handler(req, res) {
|
||||
// bad docker connections can result in a <Buffer ...> object?
|
||||
// in any case, this ensures the result is the expected array
|
||||
if (!Array.isArray(containers)) {
|
||||
res.status(500).send({
|
||||
return res.status(500).send({
|
||||
error: "query failed",
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
const containerNames = containers.map((container) => container.Names[0].replace(/^\//, ""));
|
||||
@@ -36,10 +37,9 @@ export default async function handler(req, res) {
|
||||
const container = docker.getContainer(containerName);
|
||||
const stats = await container.stats({ stream: false });
|
||||
|
||||
res.status(200).json({
|
||||
return res.status(200).json({
|
||||
stats,
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// Try with a service deployed in Docker Swarm, if enabled
|
||||
@@ -61,19 +61,19 @@ export default async function handler(req, res) {
|
||||
const container = docker.getContainer(taskContainerId);
|
||||
const stats = await container.stats({ stream: false });
|
||||
|
||||
res.status(200).json({
|
||||
return res.status(200).json({
|
||||
stats,
|
||||
});
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
res.status(200).send({
|
||||
return res.status(200).send({
|
||||
error: "not found",
|
||||
});
|
||||
} catch {
|
||||
res.status(500).send({
|
||||
error: {message: "Unknown error"},
|
||||
} catch (e) {
|
||||
logger.error(e);
|
||||
return res.status(500).send({
|
||||
error: {message: e?.message ?? "Unknown error"},
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
import Docker from "dockerode";
|
||||
|
||||
import getDockerArguments from "utils/config/docker";
|
||||
import createLogger from "utils/logger";
|
||||
|
||||
const logger = createLogger("dockerStatusService");
|
||||
|
||||
export default async function handler(req, res) {
|
||||
const { service } = req.query;
|
||||
@@ -68,9 +71,10 @@ export default async function handler(req, res) {
|
||||
return res.status(200).send({
|
||||
error: "not found",
|
||||
});
|
||||
} catch {
|
||||
} catch (e) {
|
||||
logger.error(e);
|
||||
return res.status(500).send({
|
||||
error: "unknown error",
|
||||
error: {message: e?.message ?? "Unknown error"},
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
@@ -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) {
|
||||
@@ -251,6 +266,7 @@ function Home({ initialSettings }) {
|
||||
isOpen={searching}
|
||||
close={setSearching}
|
||||
searchDescriptions={settings.quicklaunch?.searchDescriptions}
|
||||
searchProvider={settings.quicklaunch?.hideInternetSearch ? null : searchProvider}
|
||||
/>
|
||||
{widgets && (
|
||||
<>
|
||||
|
||||
@@ -13,6 +13,17 @@ import {
|
||||
} from "utils/config/service-helpers";
|
||||
import { cleanWidgetGroups, widgetsFromConfig } from "utils/config/widget-helpers";
|
||||
|
||||
/**
|
||||
* Compares services by weight then by name.
|
||||
*/
|
||||
function compareServices(service1, service2) {
|
||||
const comp = service1.weight - service2.weight;
|
||||
if (comp !== 0) {
|
||||
return comp;
|
||||
}
|
||||
return service1.name.localeCompare(service2.name);
|
||||
}
|
||||
|
||||
export async function bookmarksResponse() {
|
||||
checkAndCopyConfig("bookmarks.yaml");
|
||||
|
||||
@@ -112,7 +123,8 @@ export async function servicesResponse() {
|
||||
...discoveredDockerGroup.services,
|
||||
...discoveredKubernetesGroup.services,
|
||||
...configuredGroup.services
|
||||
].filter((service) => service),
|
||||
].filter((service) => service)
|
||||
.sort(compareServices),
|
||||
};
|
||||
|
||||
if (definedLayouts) {
|
||||
|
||||
@@ -33,6 +33,15 @@ export async function servicesFromConfig() {
|
||||
})),
|
||||
}));
|
||||
|
||||
// add default weight to services based on their position in the configuration
|
||||
servicesArray.forEach((group, groupIndex) => {
|
||||
group.services.forEach((service, serviceIndex) => {
|
||||
if(!service.weight) {
|
||||
servicesArray[groupIndex].services[serviceIndex].weight = (serviceIndex + 1) * 100;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
return servicesArray;
|
||||
}
|
||||
|
||||
@@ -152,6 +161,7 @@ export async function servicesFromKubernetes() {
|
||||
href: ingress.metadata.annotations[`${ANNOTATION_BASE}/href`] || getUrlFromIngress(ingress),
|
||||
name: ingress.metadata.annotations[`${ANNOTATION_BASE}/name`] || ingress.metadata.name,
|
||||
group: ingress.metadata.annotations[`${ANNOTATION_BASE}/group`] || "Kubernetes",
|
||||
weight: ingress.metadata.annotations[`${ANNOTATION_BASE}/weight`] || '0',
|
||||
icon: ingress.metadata.annotations[`${ANNOTATION_BASE}/icon`] || '',
|
||||
description: ingress.metadata.annotations[`${ANNOTATION_BASE}/description`] || '',
|
||||
};
|
||||
@@ -201,6 +211,17 @@ export function cleanServiceGroups(groups) {
|
||||
name: serviceGroup.name,
|
||||
services: serviceGroup.services.map((service) => {
|
||||
const cleanedService = { ...service };
|
||||
if (typeof service.weight === 'string') {
|
||||
const weight = parseInt(service.weight, 10);
|
||||
if (Number.isNaN(weight)) {
|
||||
cleanedService.weight = 0;
|
||||
} else {
|
||||
cleanedService.weight = weight;
|
||||
}
|
||||
}
|
||||
if (typeof cleanedService.weight !== "number") {
|
||||
cleanedService.weight = 0;
|
||||
}
|
||||
|
||||
if (cleanedService.widget) {
|
||||
// whitelisted set of keys to pass to the frontend
|
||||
@@ -212,14 +233,18 @@ export function cleanServiceGroups(groups) {
|
||||
currency, // coinmarketcap widget
|
||||
symbols,
|
||||
defaultinterval,
|
||||
site, // unifi widget
|
||||
namespace, // kubernetes widget
|
||||
app,
|
||||
podSelector
|
||||
podSelector,
|
||||
wan // opnsense widget
|
||||
} = cleanedService.widget;
|
||||
|
||||
const fieldsList = typeof fields === 'string' ? JSON.parse(fields) : fields;
|
||||
|
||||
cleanedService.widget = {
|
||||
type,
|
||||
fields: fields || null,
|
||||
fields: fieldsList || null,
|
||||
service_name: service.name,
|
||||
service_group: serviceGroup.name,
|
||||
};
|
||||
@@ -232,11 +257,17 @@ 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;
|
||||
if (podSelector) cleanedService.widget.podSelector = podSelector;
|
||||
}
|
||||
if (type === "opnsense") {
|
||||
if (wan) cleanedService.widget.wan = wan;
|
||||
}
|
||||
}
|
||||
|
||||
return cleanedService;
|
||||
|
||||
@@ -34,12 +34,18 @@ export default async function credentialedProxyHandler(req, res, map) {
|
||||
headers.Authorization = `Bearer ${widget.key}`;
|
||||
} else if (widget.type === "proxmox") {
|
||||
headers.Authorization = `PVEAPIToken=${widget.username}=${widget.password}`;
|
||||
} else if (widget.type === "proxmoxbackupserver") {
|
||||
delete headers["Content-Type"];
|
||||
headers.Authorization = `PBSAPIToken=${widget.username}:${widget.password}`;
|
||||
} else if (widget.type === "autobrr") {
|
||||
headers["X-API-Token"] = `${widget.key}`;
|
||||
} else if (widget.type === "tubearchivist") {
|
||||
headers.Authorization = `Token ${widget.key}`;
|
||||
} else if (widget.type === "miniflux") {
|
||||
headers["X-Auth-Token"] = `${widget.key}`;
|
||||
} else if (widget.type === "cloudflared") {
|
||||
headers["X-Auth-Email"] = `${widget.email}`;
|
||||
headers["X-Auth-Key"] = `${widget.key}`;
|
||||
} else {
|
||||
headers["X-API-Key"] = `${widget.key}`;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
31
src/widgets/cloudflared/component.jsx
Normal file
31
src/widgets/cloudflared/component.jsx
Normal file
@@ -0,0 +1,31 @@
|
||||
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: statsData, error: statsError } = useWidgetAPI(widget, "cfd_tunnel");
|
||||
|
||||
if (statsError) {
|
||||
return <Container error={statsError} />;
|
||||
}
|
||||
|
||||
if (!statsData) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="cloudflared.status" />
|
||||
<Block label="cloudflared.origin_ip" />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
const originIP = statsData.result.connections?.origin_ip ?? statsData.result.connections[0]?.origin_ip;
|
||||
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="cloudflared.status" value={statsData.result.status.charAt(0).toUpperCase() + statsData.result.status.slice(1)} />
|
||||
<Block label="cloudflared.origin_ip" value={originIP} />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
18
src/widgets/cloudflared/widget.js
Normal file
18
src/widgets/cloudflared/widget.js
Normal file
@@ -0,0 +1,18 @@
|
||||
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
|
||||
|
||||
const widget = {
|
||||
api: "https://api.cloudflare.com/client/v4/accounts/{accountid}/{endpoint}/{tunnelid}",
|
||||
proxyHandler: credentialedProxyHandler,
|
||||
|
||||
mappings: {
|
||||
"cfd_tunnel": {
|
||||
endpoint: "cfd_tunnel",
|
||||
validate: [
|
||||
"success",
|
||||
"result"
|
||||
]
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default widget;
|
||||
@@ -6,8 +6,10 @@ const components = {
|
||||
autobrr: dynamic(() => import("./autobrr/component")),
|
||||
bazarr: dynamic(() => import("./bazarr/component")),
|
||||
changedetectionio: dynamic(() => import("./changedetectionio/component")),
|
||||
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")),
|
||||
@@ -20,12 +22,14 @@ const components = {
|
||||
jackett: dynamic(() => import("./jackett/component")),
|
||||
jellyfin: dynamic(() => import("./emby/component")),
|
||||
jellyseerr: dynamic(() => import("./jellyseerr/component")),
|
||||
komga: dynamic(() => import("./komga/component")),
|
||||
lidarr: dynamic(() => import("./lidarr/component")),
|
||||
mastodon: dynamic(() => import("./mastodon/component")),
|
||||
medusa: dynamic(() => import("./medusa/component")),
|
||||
miniflux: dynamic(() => import("./miniflux/component")),
|
||||
mikrotik: dynamic(() => import("./mikrotik/component")),
|
||||
moonraker: dynamic(() => import("./moonraker/component")),
|
||||
mylar: dynamic(() => import("./mylar/component")),
|
||||
navidrome: dynamic(() => import("./navidrome/component")),
|
||||
nextdns: dynamic(() => import("./nextdns/component")),
|
||||
npm: dynamic(() => import("./npm/component")),
|
||||
@@ -36,6 +40,8 @@ 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")),
|
||||
portainer: dynamic(() => import("./portainer/component")),
|
||||
@@ -60,6 +66,8 @@ const components = {
|
||||
unifi: dynamic(() => import("./unifi/component")),
|
||||
watchtower: dynamic(() => import("./watchtower/component")),
|
||||
xteve: dynamic(() => import("./xteve/component")),
|
||||
immich: dynamic(() => import("./immich/component")),
|
||||
uptimekuma: dynamic(() => import("./uptimekuma/component")),
|
||||
};
|
||||
|
||||
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;
|
||||
@@ -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"
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
33
src/widgets/immich/component.jsx
Normal file
33
src/widgets/immich/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: immichData, error: immichError } = useWidgetAPI(widget);
|
||||
|
||||
if (immichError || immichData?.statusCode === 401) {
|
||||
return <Container error={immichError ?? immichData} />;
|
||||
}
|
||||
|
||||
if (!immichData) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="immich.users" />
|
||||
<Block label="immich.photos" />
|
||||
<Block label="immich.videos" />
|
||||
<Block label="immich.storage" />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="immich.users" value={immichData.usageByUser.length} />
|
||||
<Block label="immich.photos" value={immichData.photos} />
|
||||
<Block label="immich.videos" value={immichData.videos} />
|
||||
<Block label="immich.storage" value={immichData.usage} />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
8
src/widgets/immich/widget.js
Normal file
8
src/widgets/immich/widget.js
Normal file
@@ -0,0 +1,8 @@
|
||||
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
|
||||
|
||||
const widget = {
|
||||
api: "{url}/api/server-info/stats",
|
||||
proxyHandler: credentialedProxyHandler,
|
||||
};
|
||||
|
||||
export default widget;
|
||||
37
src/widgets/komga/component.jsx
Normal file
37
src/widgets/komga/component.jsx
Normal file
@@ -0,0 +1,37 @@
|
||||
import { useTranslation } from "next-i18next";
|
||||
|
||||
import Container from "components/services/widget/container";
|
||||
import Block from "components/services/widget/block";
|
||||
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||
|
||||
export default function Component({ service }) {
|
||||
const { t } = useTranslation();
|
||||
const { widget } = service;
|
||||
|
||||
const { data: libraryData, error: libraryError } = useWidgetAPI(widget, "libraries");
|
||||
const { data: seriesData, error: seriesError } = useWidgetAPI(widget, "series");
|
||||
const { data: bookData, error: bookError } = useWidgetAPI(widget, "books");
|
||||
|
||||
if (libraryError || seriesError || bookError) {
|
||||
const finalError = libraryError ?? seriesError ?? bookError;
|
||||
return <Container error={finalError} />;
|
||||
}
|
||||
|
||||
if (!libraryData || !seriesData || !bookData) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="komga.libraries" />
|
||||
<Block label="komga.series" />
|
||||
<Block label="komga.books" />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="komga.libraries" value={t("common.number", { value: libraryData.total })} />
|
||||
<Block label="komga.series" value={t("common.number", { value: seriesData.totalElements })} />
|
||||
<Block label="komga.books" value={t("common.number", { value: bookData.totalElements })} />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
30
src/widgets/komga/widget.js
Normal file
30
src/widgets/komga/widget.js
Normal file
@@ -0,0 +1,30 @@
|
||||
import genericProxyHandler from "utils/proxy/handlers/generic";
|
||||
import { jsonArrayFilter } from "utils/proxy/api-helpers";
|
||||
|
||||
const widget = {
|
||||
api: "{url}/api/v1/{endpoint}",
|
||||
proxyHandler: genericProxyHandler,
|
||||
|
||||
mappings: {
|
||||
libraries: {
|
||||
endpoint: "libraries",
|
||||
map: (data) => ({
|
||||
total: jsonArrayFilter(data, (item) => !item.unavailable).length,
|
||||
}),
|
||||
},
|
||||
series: {
|
||||
endpoint: "series",
|
||||
validate: [
|
||||
"totalElements"
|
||||
]
|
||||
},
|
||||
books: {
|
||||
endpoint: "books",
|
||||
validate: [
|
||||
"totalElements"
|
||||
]
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default widget;
|
||||
40
src/widgets/mylar/component.jsx
Normal file
40
src/widgets/mylar/component.jsx
Normal file
@@ -0,0 +1,40 @@
|
||||
import { useTranslation } from "next-i18next";
|
||||
|
||||
import Container from "components/services/widget/container";
|
||||
import Block from "components/services/widget/block";
|
||||
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||
|
||||
export default function Component({ service }) {
|
||||
const { t } = useTranslation();
|
||||
|
||||
const { widget } = service;
|
||||
|
||||
const { data: seriesData, error: seriesError } = useWidgetAPI(widget, "series");
|
||||
const { data: issuesData, error: issuesError } = useWidgetAPI(widget, "issues");
|
||||
const { data: wantedData, error: wantedError } = useWidgetAPI(widget, "wanted");
|
||||
|
||||
if (seriesError || issuesError || wantedError) {
|
||||
const finalError = seriesError ?? issuesError ?? wantedError;
|
||||
return <Container error={finalError} />;
|
||||
}
|
||||
|
||||
if (!seriesData || !issuesData || !wantedData) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="mylar.series" />
|
||||
<Block label="mylar.issues" />
|
||||
<Block label="mylar.wanted" />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
const totalIssues = issuesData.data.reduce((acc, series) => acc + series.totalIssues, 0);
|
||||
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="mylar.series" value={t("common.number", { value: seriesData.data.length })} />
|
||||
<Block label="mylar.issues" value={t("common.number", { value: totalIssues })} />
|
||||
<Block label="mylar.wanted" value={t("common.number", { value: wantedData.issues.length })} />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
20
src/widgets/mylar/widget.js
Normal file
20
src/widgets/mylar/widget.js
Normal file
@@ -0,0 +1,20 @@
|
||||
import genericProxyHandler from "utils/proxy/handlers/generic";
|
||||
|
||||
const widget = {
|
||||
api: "{url}/api?cmd={endpoint}&apikey={key}",
|
||||
proxyHandler: genericProxyHandler,
|
||||
|
||||
mappings: {
|
||||
issues: {
|
||||
endpoint: "getIndex"
|
||||
},
|
||||
series: {
|
||||
endpoint: "seriesjsonListing"
|
||||
},
|
||||
wanted: {
|
||||
endpoint: "getWanted"
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default widget;
|
||||
@@ -27,7 +27,7 @@ export default function Component({ service }) {
|
||||
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="nzbget.rate" value={t("common.bitrate", { value: statusData.DownloadRate })} />
|
||||
<Block label="nzbget.rate" value={t("common.byterate", { value: statusData.DownloadRate })} />
|
||||
<Block
|
||||
label="nzbget.remaining"
|
||||
value={t("common.bytes", { value: statusData.RemainingSizeMB * 1024 * 1024 })}
|
||||
|
||||
@@ -33,16 +33,14 @@ export default function Component({ service }) {
|
||||
const cpu = 100 - parseFloat(cpuIdle);
|
||||
const memory = activityData.headers[3].match(/Mem: (.+) Active,/)[1];
|
||||
|
||||
const wanUpload = interfaceData.interfaces.wan['bytes transmitted'];
|
||||
const wanDownload = interfaceData.interfaces.wan['bytes received'];
|
||||
const wan = widget.wan ? interfaceData.interfaces[widget.wan] : interfaceData.interfaces.wan;
|
||||
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="opnsense.cpu" value={t("common.percent", { value: cpu.toFixed(2) })} />
|
||||
<Block label="opnsense.memory" value={memory} />
|
||||
<Block label="opnsense.wanUpload" value={t("common.bytes", { value: wanUpload })} />
|
||||
<Block label="opnsense.wanDownload" value={t("common.bytes", { value: wanDownload })} />
|
||||
|
||||
{wan && <Block label="opnsense.wanUpload" value={t("common.bytes", { value: wan['bytes transmitted'] })} />}
|
||||
{wan && <Block label="opnsense.wanDownload" value={t("common.bytes", { value: wan['bytes received'] })} />}
|
||||
</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;
|
||||
@@ -24,15 +24,15 @@ 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 lxc = data.filter(item => item.type === "lxc") || [];
|
||||
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") || [];
|
||||
|
||||
const runningVMs = vms.reduce(calcRunning, 0);
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
45
src/widgets/proxmoxbackupserver/component.jsx
Normal file
45
src/widgets/proxmoxbackupserver/component.jsx
Normal file
@@ -0,0 +1,45 @@
|
||||
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: datastoreData, error: datastoreError } = useWidgetAPI(widget, "status/datastore-usage");
|
||||
const { data: tasksData, error: tasksError } = useWidgetAPI(widget, "nodes/localhost/tasks");
|
||||
const { data: hostData, error: hostError } = useWidgetAPI(widget, "nodes/localhost/status");
|
||||
|
||||
if (datastoreError || tasksError || hostError) {
|
||||
const finalError = tasksError ?? datastoreError ?? hostError;
|
||||
return <Container error={finalError} />;
|
||||
}
|
||||
|
||||
if (!datastoreData || !tasksData || !hostData) {
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="proxmoxbackupserver.datastore_usage" />
|
||||
<Block label="proxmoxbackupserver.failed_tasks_24h" />
|
||||
<Block label="proxmoxbackupserver.cpu_usage" />
|
||||
<Block label="proxmoxbackupserver.memory_usage" />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
|
||||
const datastoreUsage = datastoreData.data[0].used / datastoreData.data[0].total * 100;
|
||||
const cpuUsage = hostData.data.cpu * 100;
|
||||
const memoryUsage = hostData.data.memory.used / hostData.data.memory.total * 100;
|
||||
const failedTasks = tasksData.total >= 100 ? "99+" : tasksData.total;
|
||||
|
||||
return (
|
||||
<Container service={service}>
|
||||
<Block label="proxmoxbackupserver.datastore_usage" value={t("common.percent", { value: datastoreUsage })} />
|
||||
<Block label="proxmoxbackupserver.failed_tasks_24h" value={failedTasks} />
|
||||
<Block label="proxmoxbackupserver.cpu_usage" value={t("common.percent", { value: cpuUsage })} />
|
||||
<Block label="proxmoxbackupserver.memory_usage" value={t("common.percent", { value: memoryUsage })} />
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
22
src/widgets/proxmoxbackupserver/widget.js
Normal file
22
src/widgets/proxmoxbackupserver/widget.js
Normal file
@@ -0,0 +1,22 @@
|
||||
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
|
||||
|
||||
const since = Date.now() - (24 * 60 * 60 * 1000);
|
||||
|
||||
const widget = {
|
||||
api: "{url}/api2/json/{endpoint}",
|
||||
proxyHandler: credentialedProxyHandler,
|
||||
|
||||
mappings: {
|
||||
"status/datastore-usage": {
|
||||
endpoint: "status/datastore-usage",
|
||||
},
|
||||
"nodes/localhost/tasks": {
|
||||
endpoint: `nodes/localhost/tasks?errors=true&limit=100&since=${since}`,
|
||||
},
|
||||
"nodes/localhost/status": {
|
||||
endpoint: "nodes/localhost/status",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default widget;
|
||||
@@ -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 } />}
|
||||
|
||||
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;
|
||||
@@ -3,8 +3,10 @@ import authentik from "./authentik/widget";
|
||||
import autobrr from "./autobrr/widget";
|
||||
import bazarr from "./bazarr/widget";
|
||||
import changedetectionio from "./changedetectionio/widget";
|
||||
import cloudflared from "./cloudflared/widget";
|
||||
import coinmarketcap from "./coinmarketcap/widget";
|
||||
import deluge from "./deluge/widget";
|
||||
import diskstation from "./diskstation/widget";
|
||||
import downloadstation from "./downloadstation/widget";
|
||||
import emby from "./emby/widget";
|
||||
import flood from "./flood/widget";
|
||||
@@ -14,12 +16,14 @@ import hdhomerun from "./hdhomerun/widget";
|
||||
import homebridge from "./homebridge/widget";
|
||||
import jackett from "./jackett/widget";
|
||||
import jellyseerr from "./jellyseerr/widget";
|
||||
import komga from "./komga/widget";
|
||||
import lidarr from "./lidarr/widget";
|
||||
import mastodon from "./mastodon/widget";
|
||||
import medusa from "./medusa/widget";
|
||||
import miniflux from "./miniflux/widget";
|
||||
import mikrotik from "./mikrotik/widget";
|
||||
import moonraker from "./moonraker/widget";
|
||||
import mylar from "./mylar/widget";
|
||||
import navidrome from "./navidrome/widget";
|
||||
import nextdns from "./nextdns/widget";
|
||||
import npm from "./npm/widget";
|
||||
@@ -30,6 +34,8 @@ 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";
|
||||
import portainer from "./portainer/widget";
|
||||
@@ -54,6 +60,8 @@ import truenas from "./truenas/widget";
|
||||
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";
|
||||
|
||||
const widgets = {
|
||||
adguard,
|
||||
@@ -61,9 +69,10 @@ const widgets = {
|
||||
autobrr,
|
||||
bazarr,
|
||||
changedetectionio,
|
||||
cloudflared,
|
||||
coinmarketcap,
|
||||
deluge,
|
||||
diskstation: downloadstation,
|
||||
diskstation,
|
||||
downloadstation,
|
||||
emby,
|
||||
flood,
|
||||
@@ -74,12 +83,14 @@ const widgets = {
|
||||
jackett,
|
||||
jellyfin: emby,
|
||||
jellyseerr,
|
||||
komga,
|
||||
lidarr,
|
||||
mastodon,
|
||||
medusa,
|
||||
miniflux,
|
||||
mikrotik,
|
||||
moonraker,
|
||||
mylar,
|
||||
navidrome,
|
||||
nextdns,
|
||||
npm,
|
||||
@@ -90,6 +101,8 @@ const widgets = {
|
||||
opnsense,
|
||||
overseerr,
|
||||
paperlessngx,
|
||||
photoprism,
|
||||
proxmoxbackupserver,
|
||||
pihole,
|
||||
plex,
|
||||
portainer,
|
||||
@@ -115,6 +128,8 @@ const widgets = {
|
||||
unifi_console: unifi,
|
||||
watchtower,
|
||||
xteve,
|
||||
immich,
|
||||
uptimekuma,
|
||||
};
|
||||
|
||||
export default widgets;
|
||||
|
||||
Reference in New Issue
Block a user