Compare commits
627 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a3b48fc01c | ||
|
|
8be94aa09c | ||
|
|
5db1253ab8 | ||
|
|
ceedd86310 | ||
|
|
6a0254623f | ||
|
|
1c6ec56032 | ||
|
|
287869ed45 | ||
|
|
e4dbc3ba12 | ||
|
|
426e5689f8 | ||
|
|
afda5fd4a4 | ||
|
|
0a21b2820c | ||
|
|
87b3b76b0b | ||
|
|
41ec46f1d3 | ||
|
|
7a359588db | ||
|
|
255abe8b11 | ||
|
|
b0936c5e6e | ||
|
|
2907ac74d4 | ||
|
|
ea678f37b0 | ||
|
|
076082c945 | ||
|
|
5ee98f90e8 | ||
|
|
c988dd88d7 | ||
|
|
f7d6c461dc | ||
|
|
14771ae946 | ||
|
|
7e9086b20e | ||
|
|
4b3c4870ba | ||
|
|
43cebd0c04 | ||
|
|
5ce13109b0 | ||
|
|
6e428c91d1 | ||
|
|
4430045550 | ||
|
|
282cb06091 | ||
|
|
772c2743b5 | ||
|
|
90199b89a5 | ||
|
|
e1d2e3f3e5 | ||
|
|
3f9fe1f2c6 | ||
|
|
c79bbc5756 | ||
|
|
63e1bec2b9 | ||
|
|
d26b7c6f75 | ||
|
|
da8dc4fa54 | ||
|
|
413b81c47f | ||
|
|
9ef419e3df | ||
|
|
39893912d9 | ||
|
|
49456ca6c3 | ||
|
|
6b9b8f0dbb | ||
|
|
5eb48b2717 | ||
|
|
5339cfca70 | ||
|
|
1462b2d0b8 | ||
|
|
3798a23183 | ||
|
|
ddaf916170 | ||
|
|
d6e37b058f | ||
|
|
2e9ad7d7cb | ||
|
|
190da74f66 | ||
|
|
f1315dda7f | ||
|
|
43e6105eb3 | ||
|
|
d785209eb6 | ||
|
|
da8b6a9010 | ||
|
|
1fd68722da | ||
|
|
c9a2c1d0e4 | ||
|
|
161f536a62 | ||
|
|
1a32e9944e | ||
|
|
6deb753198 | ||
|
|
4e33a98631 | ||
|
|
dcb9464d8f | ||
|
|
b94936b29f | ||
|
|
108d0a5a5b | ||
|
|
4814a2de28 | ||
|
|
5d8eeff502 | ||
|
|
0bc4087266 | ||
|
|
921209b901 | ||
|
|
fa9d754470 | ||
|
|
1f50a1f0f4 | ||
|
|
80e84c0421 | ||
|
|
5059872c3f | ||
|
|
8add244776 | ||
|
|
04e23fd7e4 | ||
|
|
336b11b808 | ||
|
|
8d9dba361c | ||
|
|
64ce3638cb | ||
|
|
f3ceb73f0e | ||
|
|
131dbe934c | ||
|
|
58288e89bd | ||
|
|
22c43c7124 | ||
|
|
2bf0b25ee5 | ||
|
|
3bc03c1364 | ||
|
|
490d71f8c9 | ||
|
|
edceb5900e | ||
|
|
e5ef28415b | ||
|
|
46b98df153 | ||
|
|
9f34021c90 | ||
|
|
8121eef839 | ||
|
|
da48d1f66c | ||
|
|
b167287c5b | ||
|
|
41f9da6bf8 | ||
|
|
e7c7fc8186 | ||
|
|
b950dd2d68 | ||
|
|
6d34de14d3 | ||
|
|
a5a84c0cdd | ||
|
|
701b1b811f | ||
|
|
97267cdfbf | ||
|
|
40ce37d230 | ||
|
|
8a9ade355c | ||
|
|
9bffec64b5 | ||
|
|
a03ee2ae0e | ||
|
|
ee889235fe | ||
|
|
94d6d80497 | ||
|
|
413c45a559 | ||
|
|
6dc5536c48 | ||
|
|
76c4bf56fa | ||
|
|
a0c6642230 | ||
|
|
4198d7bd13 | ||
|
|
b06fddec07 | ||
|
|
d1f14bee59 | ||
|
|
8953f63197 | ||
|
|
193d80d826 | ||
|
|
9e308792aa | ||
|
|
fbabd8c351 | ||
|
|
1a3cb09ca2 | ||
|
|
ccab4040b1 | ||
|
|
ee5f4d10ea | ||
|
|
57b83dc226 | ||
|
|
dddec01070 | ||
|
|
3524b059c6 | ||
|
|
5888cb7172 | ||
|
|
17b8bbd269 | ||
|
|
5bcb950275 | ||
|
|
eb0100d432 | ||
|
|
cf5810d6ca | ||
|
|
7c3818bc51 | ||
|
|
9304a0377b | ||
|
|
2c5886de09 | ||
|
|
9919f9038f | ||
|
|
ed05bddbbc | ||
|
|
381acbf5ed | ||
|
|
9eb16f4703 | ||
|
|
eefdc9b2d1 | ||
|
|
8c4c15584f | ||
|
|
7223f3d4e1 | ||
|
|
ba4abcecfb | ||
|
|
04dfede535 | ||
|
|
248430e5b0 | ||
|
|
6b5f98cb2d | ||
|
|
5bc28a0560 | ||
|
|
f9efd6acfa | ||
|
|
ed5bcb17ed | ||
|
|
52a9cc6852 | ||
|
|
d538367354 | ||
|
|
9a60e8f075 | ||
|
|
e2ddd48a79 | ||
|
|
b876981243 | ||
|
|
7767cc4b51 | ||
|
|
131ece725a | ||
|
|
4d2a944310 | ||
|
|
91a9d5aab5 | ||
|
|
dc16574a04 | ||
|
|
8ed6a3869e | ||
|
|
faacbe088b | ||
|
|
f70449d67d | ||
|
|
d0523c1e54 | ||
|
|
026e414388 | ||
|
|
2535c8c7c3 | ||
|
|
ece74d7552 | ||
|
|
3237d9eb21 | ||
|
|
3ccb61fba2 | ||
|
|
73f2926469 | ||
|
|
1249055668 | ||
|
|
d312b783e9 | ||
|
|
4044f43808 | ||
|
|
d94b2a7805 | ||
|
|
a0ea95b1c3 | ||
|
|
23764f8c93 | ||
|
|
9d1df94f89 | ||
|
|
0f226b3620 | ||
|
|
536b7f3b2c | ||
|
|
1c0ea9e7bb | ||
|
|
ff8bc49074 | ||
|
|
b80bf51a61 | ||
|
|
a28fabedef | ||
|
|
b989953b7a | ||
|
|
39cd8ff63e | ||
|
|
57fc8c2687 | ||
|
|
0befb32571 | ||
|
|
824d7c7bb6 | ||
|
|
a45716e0cb | ||
|
|
64066e9622 | ||
|
|
5836275a3f | ||
|
|
11956aee00 | ||
|
|
a38cc9a1ee | ||
|
|
107548aa36 | ||
|
|
4d58eafc19 | ||
|
|
fbc6f6e887 | ||
|
|
991d91b636 | ||
|
|
5f701980a4 | ||
|
|
4fd82afade | ||
|
|
7d2fbde2fe | ||
|
|
819c53df7e | ||
|
|
aed5a63a19 | ||
|
|
439208605b | ||
|
|
3c7bb77f3e | ||
|
|
f126a59ff2 | ||
|
|
c1a729f542 | ||
|
|
2f96a090c4 | ||
|
|
704a93713f | ||
|
|
78e156bfb2 | ||
|
|
765404f55d | ||
|
|
d08a3df440 | ||
|
|
3ad1e7a196 | ||
|
|
dacc042a85 | ||
|
|
f5d5bf9c37 | ||
|
|
bfece9ae7d | ||
|
|
b6a797c993 | ||
|
|
96866565c4 | ||
|
|
6ed2e558cb | ||
|
|
2681e4eb28 | ||
|
|
7feebb8c1f | ||
|
|
32da0c8283 | ||
|
|
e11d505409 | ||
|
|
fae3a20a9e | ||
|
|
d5ce11c788 | ||
|
|
cedade1d01 | ||
|
|
7edef87a4f | ||
|
|
48fdf4cc84 | ||
|
|
2597f99571 | ||
|
|
26264ecdea | ||
|
|
8bfb0eb9e0 | ||
|
|
f654557fae | ||
|
|
cf3a246520 | ||
|
|
5993231c2a | ||
|
|
7be9c5fb9c | ||
|
|
98bee2aae7 | ||
|
|
3747e2fc40 | ||
|
|
150c8f014b | ||
|
|
e361e509af | ||
|
|
0ad7b4f8b8 | ||
|
|
13df750473 | ||
|
|
baffe6dbe0 | ||
|
|
f187bc6ccf | ||
|
|
5e9f0bf8a1 | ||
|
|
ff1780bb04 | ||
|
|
96a0b9cfd2 | ||
|
|
519ca23556 | ||
|
|
2ddc29f45e | ||
|
|
b9aa4ba124 | ||
|
|
7b74d83c23 | ||
|
|
9ad710fade | ||
|
|
58f0a1fade | ||
|
|
c65525ac86 | ||
|
|
466ec45f7b | ||
|
|
9c6e6b8be8 | ||
|
|
157d7239c6 | ||
|
|
602ef60bf0 | ||
|
|
fc00b4b961 | ||
|
|
4e6ea086e3 | ||
|
|
2e31076171 | ||
|
|
14b8608be1 | ||
|
|
5baf683278 | ||
|
|
44a431c19f | ||
|
|
183fc7f160 | ||
|
|
2137bfbcd0 | ||
|
|
1f586a2c31 | ||
|
|
fad3f41e58 | ||
|
|
37dc1056c9 | ||
|
|
2993e1236a | ||
|
|
8e484a575c | ||
|
|
ba564a886b | ||
|
|
1a64dc5cba | ||
|
|
f4bf7a4d5e | ||
|
|
813cfb56a2 | ||
|
|
828752e354 | ||
|
|
483bf51c2f | ||
|
|
7557bacb60 | ||
|
|
8fa3a2d0e4 | ||
|
|
ab058cc094 | ||
|
|
b802c97a8d | ||
|
|
61ddb56639 | ||
|
|
8bfea497a0 | ||
|
|
b1b8332a7c | ||
|
|
fb2809e4c2 | ||
|
|
21860daf41 | ||
|
|
52e94e902b | ||
|
|
8d722da799 | ||
|
|
18b33ee0a2 | ||
|
|
1d8f6bed6b | ||
|
|
6b41459281 | ||
|
|
b34b504bf3 | ||
|
|
026c26cea7 | ||
|
|
c360dd7f84 | ||
|
|
e20adee0e2 | ||
|
|
2c79c25436 | ||
|
|
d605db5c8f | ||
|
|
1f69f88b81 | ||
|
|
71e6e18e09 | ||
|
|
694854a89f | ||
|
|
7c816ec20a | ||
|
|
b2b5c21cf0 | ||
|
|
c796cf4009 | ||
|
|
4d78f1b11a | ||
|
|
991189dbca | ||
|
|
a1af24be47 | ||
|
|
17c50000db | ||
|
|
6f3c916273 | ||
|
|
3d5ce4b863 | ||
|
|
3093230400 | ||
|
|
5b0081d914 | ||
|
|
a117e5fd77 | ||
|
|
5168995ed9 | ||
|
|
e04fede462 | ||
|
|
d1441fbafe | ||
|
|
b9640c380f | ||
|
|
799a1ac5f0 | ||
|
|
2e11d8827e | ||
|
|
b08265221f | ||
|
|
dacf8f0864 | ||
|
|
6c08b7b45d | ||
|
|
9edbc5cc89 | ||
|
|
47560173f9 | ||
|
|
292a29a611 | ||
|
|
c910696735 | ||
|
|
2ead60a13a | ||
|
|
83dccfda1a | ||
|
|
1434556e0b | ||
|
|
50d6ed919b | ||
|
|
362dcdf288 | ||
|
|
7414dcc8da | ||
|
|
07cc0a22e8 | ||
|
|
e57b63a76f | ||
|
|
50bcabbc54 | ||
|
|
7156f08eb8 | ||
|
|
1f654fb4a6 | ||
|
|
a26efc5ca6 | ||
|
|
ee96f2696e | ||
|
|
9eeacb3bdd | ||
|
|
df800aba70 | ||
|
|
11dca4c37c | ||
|
|
460f3f957e | ||
|
|
7032677def | ||
|
|
c337e959b5 | ||
|
|
b442e0f914 | ||
|
|
43fb481aee | ||
|
|
9f299079f8 | ||
|
|
aa0f941624 | ||
|
|
cca3a35229 | ||
|
|
23783ae411 | ||
|
|
72a2a392c3 | ||
|
|
1d9894ce5b | ||
|
|
5284ceefd6 | ||
|
|
3a3ba4de37 | ||
|
|
527e161264 | ||
|
|
14260fa180 | ||
|
|
e686387d88 | ||
|
|
4a93b326db | ||
|
|
7283c968ae | ||
|
|
6924290626 | ||
|
|
eec13678a1 | ||
|
|
2b1b6c7afb | ||
|
|
0d1a720f03 | ||
|
|
48bc6da7b5 | ||
|
|
dd2555fc3f | ||
|
|
3ff94413e4 | ||
|
|
c2afe134f6 | ||
|
|
ee18b85108 | ||
|
|
f10c5b9ea8 | ||
|
|
54c75ecbe5 | ||
|
|
2200ff98d7 | ||
|
|
47280b1339 | ||
|
|
2b3f70393b | ||
|
|
ce9929e93f | ||
|
|
73752bffc3 | ||
|
|
b2eb96ec16 | ||
|
|
cd9d5567fb | ||
|
|
8a3fd342c6 | ||
|
|
143cb1e7c1 | ||
|
|
03b9a46a4c | ||
|
|
5a982ae32e | ||
|
|
22901bb856 | ||
|
|
38cdef9458 | ||
|
|
2dc86a9da2 | ||
|
|
3524d92013 | ||
|
|
5035fdce86 | ||
|
|
7c2480f027 | ||
|
|
66d344c910 | ||
|
|
440dabfca8 | ||
|
|
fc0c9b3a49 | ||
|
|
90403b655b | ||
|
|
ad49593fe3 | ||
|
|
05de760c41 | ||
|
|
ac94b33ad4 | ||
|
|
f9f419f03f | ||
|
|
d74819b198 | ||
|
|
d1d11e7b70 | ||
|
|
b696cdff08 | ||
|
|
f093853d21 | ||
|
|
4153713ce7 | ||
|
|
1a49c7870c | ||
|
|
691471dae5 | ||
|
|
5660c0e0db | ||
|
|
d3a6b1639c | ||
|
|
b2f6094a1d | ||
|
|
55ba013977 | ||
|
|
790812901d | ||
|
|
8693ce07a2 | ||
|
|
2133302397 | ||
|
|
e80f6d4cc2 | ||
|
|
a1b9cecebb | ||
|
|
a9f9a1650e | ||
|
|
e80d115e4f | ||
|
|
be714bec12 | ||
|
|
402045a53d | ||
|
|
220f4c6723 | ||
|
|
9000228698 | ||
|
|
a5341b00c1 | ||
|
|
37e5c4d092 | ||
|
|
a363e97dd4 | ||
|
|
3d47390bf1 | ||
|
|
040cd6a29f | ||
|
|
b4dbde9a80 | ||
|
|
37df072711 | ||
|
|
f2edd14117 | ||
|
|
bff799afd9 | ||
|
|
4971239bfc | ||
|
|
2b52e8e6ee | ||
|
|
eb0b219505 | ||
|
|
1023f092f6 | ||
|
|
7de5987355 | ||
|
|
c3ca5725a4 | ||
|
|
92bb653e81 | ||
|
|
6579190ae4 | ||
|
|
02be466954 | ||
|
|
86c6b149d7 | ||
|
|
307ec25524 | ||
|
|
e89ccd7ad4 | ||
|
|
bcf7e2125c | ||
|
|
476e0d5542 | ||
|
|
4984953287 | ||
|
|
cf4f74dcfc | ||
|
|
cf231f9fe6 | ||
|
|
8ce2cc579c | ||
|
|
439aa913b6 | ||
|
|
2e17054037 | ||
|
|
9cf9a6fbc5 | ||
|
|
93b52655b5 | ||
|
|
a397f81988 | ||
|
|
c9d54f4fea | ||
|
|
79df3c847e | ||
|
|
533e32abac | ||
|
|
43506e19f1 | ||
|
|
9a4a7cef4c | ||
|
|
930697d033 | ||
|
|
70f6e1d22b | ||
|
|
3cce2c1e1b | ||
|
|
a2bb4f1287 | ||
|
|
7388ad4524 | ||
|
|
a43a000c68 | ||
|
|
7148015037 | ||
|
|
c90cd4ce1a | ||
|
|
da65babd56 | ||
|
|
a23a284d1a | ||
|
|
ef144e27cb | ||
|
|
153bfc191d | ||
|
|
4d06a52e99 | ||
|
|
df84aeb8b2 | ||
|
|
7bbaa5f5ab | ||
|
|
4619b6ef9c | ||
|
|
1194a87c76 | ||
|
|
5a9fd74470 | ||
|
|
f2981c5b15 | ||
|
|
09576285c9 | ||
|
|
e928a29353 | ||
|
|
cc4a05bf11 | ||
|
|
453eb200a8 | ||
|
|
e74a6cf3d5 | ||
|
|
96d5b750ba | ||
|
|
f47aacaf6f | ||
|
|
603e226995 | ||
|
|
1edd54b4df | ||
|
|
cf943bf41f | ||
|
|
6c6c9cdc98 | ||
|
|
3c3ca33cda | ||
|
|
f51934396f | ||
|
|
ef880c67af | ||
|
|
f74c5cd9ba | ||
|
|
8152829c89 | ||
|
|
2e8761f533 | ||
|
|
2a6c2f7c72 | ||
|
|
c07958fa73 | ||
|
|
eb158e63a2 | ||
|
|
278d5984b2 | ||
|
|
6c84d2f52b | ||
|
|
269c2a0a10 | ||
|
|
9ce7138d9b | ||
|
|
700322c603 | ||
|
|
730a62831b | ||
|
|
932a9ef3ff | ||
|
|
6e4aa8e56e | ||
|
|
82b0abaab3 | ||
|
|
e4fd75ac5a | ||
|
|
ddaee7c2f3 | ||
|
|
b187ec88be | ||
|
|
84e99048ab | ||
|
|
7c853e3ea5 | ||
|
|
1f29fde5d2 | ||
|
|
6e4cc8eb28 | ||
|
|
4bdf3694c3 | ||
|
|
03f9e88bad | ||
|
|
b55b8bf831 | ||
|
|
3b698fc062 | ||
|
|
567f1442f5 | ||
|
|
459b647b68 | ||
|
|
806a223e00 | ||
|
|
f3970b9fb2 | ||
|
|
191ffe0173 | ||
|
|
e32f7536b5 | ||
|
|
61218f9ca3 | ||
|
|
ab09fa6614 | ||
|
|
b417cca906 | ||
|
|
acaec6e2d8 | ||
|
|
28660b82ef | ||
|
|
f4b6326652 | ||
|
|
c899a84b29 | ||
|
|
be62767d45 | ||
|
|
2f4b522189 | ||
|
|
8004c41094 | ||
|
|
f7278fc890 | ||
|
|
685faa0627 | ||
|
|
1cdcff120d | ||
|
|
57b72ae440 | ||
|
|
2062bf082d | ||
|
|
a302050431 | ||
|
|
d9c26e01f4 | ||
|
|
d06ffdacd0 | ||
|
|
0420793e21 | ||
|
|
11c3bf795b | ||
|
|
e20f2d32e8 | ||
|
|
e1284feae6 | ||
|
|
a53ebb334b | ||
|
|
7abadfb5a6 | ||
|
|
65de4a8ca5 | ||
|
|
7d4c30732a | ||
|
|
536fbedda2 | ||
|
|
93f6368753 | ||
|
|
ad11b9fcc5 | ||
|
|
3475e6ec91 | ||
|
|
417cb4c89d | ||
|
|
e3f2b211a9 | ||
|
|
6a2191ff92 | ||
|
|
8111a83703 | ||
|
|
e643378249 | ||
|
|
d663106f9f | ||
|
|
d5f8cf6cf0 | ||
|
|
a0287a9f36 | ||
|
|
9c8ed3dfa8 | ||
|
|
f02cca1981 | ||
|
|
46cc363413 | ||
|
|
a59286473f | ||
|
|
f88f5c3bda | ||
|
|
b5d8b8771e | ||
|
|
35e9ecedd0 | ||
|
|
b5c705a1fe | ||
|
|
fe51669369 | ||
|
|
46cffb836c | ||
|
|
b78949cf0c | ||
|
|
1be87d0ec0 | ||
|
|
329922a836 | ||
|
|
c62c8e2c43 | ||
|
|
cfca40b7be | ||
|
|
8057c24947 | ||
|
|
1af7271a06 | ||
|
|
7ce03c18b2 | ||
|
|
ab8fdf3106 | ||
|
|
1d1b186d1e | ||
|
|
fb1f868c42 | ||
|
|
e08fa188ec | ||
|
|
e30bf47f0d | ||
|
|
253ab40e5c | ||
|
|
58a08757f5 | ||
|
|
9ca096094f | ||
|
|
4788f1dddc | ||
|
|
cf1c9643b9 | ||
|
|
c512a6a274 | ||
|
|
58fbd62779 | ||
|
|
173b7f6362 | ||
|
|
9fb738eda1 | ||
|
|
d35d106ad4 | ||
|
|
159942de95 | ||
|
|
693eef8f7e | ||
|
|
2887d23381 | ||
|
|
096d41088f | ||
|
|
bd84eeca0b | ||
|
|
b804f43d5a | ||
|
|
36b24bedb4 | ||
|
|
c1b3ff7bfd | ||
|
|
20c859b0a1 | ||
|
|
c4925ee2c7 | ||
|
|
d37a1fbea7 | ||
|
|
2142ae3e1c | ||
|
|
e686df45c9 | ||
|
|
ed9ed905ed | ||
|
|
98e77b9d0f | ||
|
|
879a347f23 | ||
|
|
cab58c30a7 | ||
|
|
75b9a3eeb0 | ||
|
|
00bf34965a | ||
|
|
81ab841fa5 | ||
|
|
df313adf39 | ||
|
|
c991c20cc1 | ||
|
|
0e54be8f66 | ||
|
|
140a3de5ed | ||
|
|
ae97012456 | ||
|
|
20d81e4353 | ||
|
|
8abdcf15d4 | ||
|
|
7f35ddfe30 | ||
|
|
7431de094f | ||
|
|
4b7397de46 | ||
|
|
a716254557 | ||
|
|
c406d92b82 | ||
|
|
432e3b1824 | ||
|
|
73611dacf1 | ||
|
|
8f4f141a64 | ||
|
|
51af3c63f1 | ||
|
|
b3c35b385b | ||
|
|
5b2ed02428 | ||
|
|
3405172d76 | ||
|
|
d88a078cd6 | ||
|
|
ee3e30d9b5 | ||
|
|
0250589be2 | ||
|
|
a66204f672 | ||
|
|
91967e6ce3 | ||
|
|
60507ea4bc | ||
|
|
486b920d6b |
@@ -1,683 +0,0 @@
|
||||
import 'l10n.dart';
|
||||
|
||||
/// The translations for German (`de`).
|
||||
class SDe extends S {
|
||||
SDe([String locale = 'de']) : super(locale);
|
||||
|
||||
@override
|
||||
String get about => 'Über';
|
||||
|
||||
@override
|
||||
String get aboutThanks => 'Vielen Dank an die folgenden Personen, die daran teilgenommen haben.\n';
|
||||
|
||||
@override
|
||||
String get add => 'Neu';
|
||||
|
||||
@override
|
||||
String get addAServer => 'Server hinzufügen';
|
||||
|
||||
@override
|
||||
String get addPrivateKey => 'Private key hinzufügen';
|
||||
|
||||
@override
|
||||
String get added2List => 'Zur Aufgabenliste hinzugefügt';
|
||||
|
||||
@override
|
||||
String get all => 'Alle';
|
||||
|
||||
@override
|
||||
String get alreadyLastDir => 'Bereits im letzten Verzeichnis.';
|
||||
|
||||
@override
|
||||
String get alterUrl => 'Url ändern';
|
||||
|
||||
@override
|
||||
String get attention => 'Achtung';
|
||||
|
||||
@override
|
||||
String get auto => 'System folgen';
|
||||
|
||||
@override
|
||||
String get autoUpdateHomeWidget => 'Home-Widget automatisch aktualisieren';
|
||||
|
||||
@override
|
||||
String get backup => 'Backup';
|
||||
|
||||
@override
|
||||
String get backupAndRestore => 'Backup und Wiederherstellung';
|
||||
|
||||
@override
|
||||
String get backupTip => 'Das Backup wird nur einfach verschlüsselt.\nBitte bewahre die Datei sicher auf.';
|
||||
|
||||
@override
|
||||
String get backupVersionNotMatch => 'Die Backup-Version stimmt nicht überein.';
|
||||
|
||||
@override
|
||||
String get bgRun => 'Hintergrundaktualisierung';
|
||||
|
||||
@override
|
||||
String get canPullRefresh => 'Danach: herunterziehen zum Aktualisieren';
|
||||
|
||||
@override
|
||||
String get cancel => 'Abbrechen';
|
||||
|
||||
@override
|
||||
String get choose => 'Auswählen';
|
||||
|
||||
@override
|
||||
String get chooseFontFile => 'Schriftart auswählen';
|
||||
|
||||
@override
|
||||
String get choosePrivateKey => 'Private key auswählen';
|
||||
|
||||
@override
|
||||
String get clear => 'Entfernen';
|
||||
|
||||
@override
|
||||
String get close => 'Schließen';
|
||||
|
||||
@override
|
||||
String get cmd => 'Command';
|
||||
|
||||
@override
|
||||
String get conn => 'Verbindung';
|
||||
|
||||
@override
|
||||
String get containerName => 'Container Name';
|
||||
|
||||
@override
|
||||
String get containerStatus => 'Container Status';
|
||||
|
||||
@override
|
||||
String get convert => 'Konvertieren';
|
||||
|
||||
@override
|
||||
String get copy => 'Kopieren';
|
||||
|
||||
@override
|
||||
String get copyPath => 'Pfad kopieren';
|
||||
|
||||
@override
|
||||
String get createFile => 'Datei erstellen';
|
||||
|
||||
@override
|
||||
String get createFolder => 'Ordner erstellen';
|
||||
|
||||
@override
|
||||
String get dark => 'Dunkel';
|
||||
|
||||
@override
|
||||
String get debug => 'Debug';
|
||||
|
||||
@override
|
||||
String get decode => 'Decode';
|
||||
|
||||
@override
|
||||
String get delete => 'Löschen';
|
||||
|
||||
@override
|
||||
String get deleteServers => 'Batch-Löschung von Servern';
|
||||
|
||||
@override
|
||||
String get disabled => 'Behinderte';
|
||||
|
||||
@override
|
||||
String get disconnected => 'Disconnected';
|
||||
|
||||
@override
|
||||
String get diskIgnorePath => 'Pfad für Datenträger ignorieren';
|
||||
|
||||
@override
|
||||
String dl2Local(Object fileName) {
|
||||
return 'Datei \"$fileName\" herunterladen?';
|
||||
}
|
||||
|
||||
@override
|
||||
String get dockerEditHost => 'DOCKER_HOST bearbeiten';
|
||||
|
||||
@override
|
||||
String get dockerEmptyRunningItems => 'Keine aktiven Container.\n\nWomöglich wird die Umgebungsvariable DOCKER_HOST nicht richtig erkannt. Du kannst sie finden, indem du `echo \$DOCKER_HOST` im Terminal ausführst.';
|
||||
|
||||
@override
|
||||
String dockerImagesFmt(Object count) {
|
||||
return '$count Image(s)';
|
||||
}
|
||||
|
||||
@override
|
||||
String get dockerNotInstalled => 'Docker ist nicht installiert';
|
||||
|
||||
@override
|
||||
String dockerStatusRunningAndStoppedFmt(Object runningCount, Object stoppedCount) {
|
||||
return '$runningCount aktiv, $stoppedCount container gestoppt.';
|
||||
}
|
||||
|
||||
@override
|
||||
String dockerStatusRunningFmt(Object count) {
|
||||
return '$count Container aktiv';
|
||||
}
|
||||
|
||||
@override
|
||||
String get download => 'Download';
|
||||
|
||||
@override
|
||||
String downloadStatus(Object percent, Object size) {
|
||||
return '$percent% von $size';
|
||||
}
|
||||
|
||||
@override
|
||||
String get edit => 'Bearbeiten';
|
||||
|
||||
@override
|
||||
String get editVirtKeys => 'Virtuelle Tasten bearbeiten';
|
||||
|
||||
@override
|
||||
String get editor => 'Editor';
|
||||
|
||||
@override
|
||||
String get encode => 'Encode';
|
||||
|
||||
@override
|
||||
String get error => 'Fehler';
|
||||
|
||||
@override
|
||||
String get exampleName => 'Servername';
|
||||
|
||||
@override
|
||||
String get experimentalFeature => 'Experimentelles Feature';
|
||||
|
||||
@override
|
||||
String get export => 'Export';
|
||||
|
||||
@override
|
||||
String get extraArgs => 'Extra args';
|
||||
|
||||
@override
|
||||
String get failed => 'Failed';
|
||||
|
||||
@override
|
||||
String get feedback => 'Feedback';
|
||||
|
||||
@override
|
||||
String get feedbackOnGithub => 'Wenn du Fragen hast, stelle diese bitte auf Github.';
|
||||
|
||||
@override
|
||||
String get fieldMustNotEmpty => 'Die Eingabefelder dürfen nicht leer sein.';
|
||||
|
||||
@override
|
||||
String fileNotExist(Object file) {
|
||||
return '$file existiert nicht';
|
||||
}
|
||||
|
||||
@override
|
||||
String fileTooLarge(Object file, Object size, Object sizeMax) {
|
||||
return 'Datei \'$file\' ist zu groß $size, max $sizeMax';
|
||||
}
|
||||
|
||||
@override
|
||||
String get files => 'Dateien';
|
||||
|
||||
@override
|
||||
String get finished => 'fertiggestellt';
|
||||
|
||||
@override
|
||||
String get font => 'Schriftarten';
|
||||
|
||||
@override
|
||||
String get fontSize => 'Schriftgröße';
|
||||
|
||||
@override
|
||||
String foundNUpdate(Object count) {
|
||||
return 'Update $count gefunden';
|
||||
}
|
||||
|
||||
@override
|
||||
String get fullScreen => 'Vollbildmodus';
|
||||
|
||||
@override
|
||||
String get fullScreenJitter => 'Jitter im Vollbildmodus';
|
||||
|
||||
@override
|
||||
String get fullScreenJitterHelp => 'Einbrennen des Bildschirms verhindern';
|
||||
|
||||
@override
|
||||
String get getPushTokenFailed => 'Push-Token kann nicht abgerufen werden';
|
||||
|
||||
@override
|
||||
String get gettingToken => 'Getting token...';
|
||||
|
||||
@override
|
||||
String get goto => 'Pfad öffnen';
|
||||
|
||||
@override
|
||||
String get homeWidgetUrlConfig => 'Home-Widget-Link konfigurieren';
|
||||
|
||||
@override
|
||||
String get host => 'Host';
|
||||
|
||||
@override
|
||||
String httpFailedWithCode(Object code) {
|
||||
return 'Anfrage fehlgeschlagen, Statuscode: $code';
|
||||
}
|
||||
|
||||
@override
|
||||
String get image => 'Image';
|
||||
|
||||
@override
|
||||
String get imagesList => 'Images';
|
||||
|
||||
@override
|
||||
String get import => 'Importieren';
|
||||
|
||||
@override
|
||||
String get inner => 'Eingebaut';
|
||||
|
||||
@override
|
||||
String get inputDomainHere => 'Domain eingeben';
|
||||
|
||||
@override
|
||||
String get install => 'install';
|
||||
|
||||
@override
|
||||
String get installDockerWithUrl => 'Bitte installiere docker zuerst. https://docs.docker.com/engine/install';
|
||||
|
||||
@override
|
||||
String get invalidJson => 'Ungültige JSON';
|
||||
|
||||
@override
|
||||
String get invalidVersion => 'Ungültige Version';
|
||||
|
||||
@override
|
||||
String invalidVersionHelp(Object url) {
|
||||
return 'Bitte stelle sicher, dass Docker korrekt installiert ist oder dass du eine nicht selbstkompilierte Version verwendest. Wenn du die oben genannten Probleme nicht hast, melde bitte einen Fehler auf $url.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get isBusy => 'Is busy now';
|
||||
|
||||
@override
|
||||
String get keepForeground => 'Stelle sicher, dass die App geöffnet bleibt.';
|
||||
|
||||
@override
|
||||
String get keyAuth => 'Schlüsselauthentifzierung';
|
||||
|
||||
@override
|
||||
String get keyboardCompatibility => 'Mögliche Verbesserungen bei der Kompatibilität der Eingabemethoden';
|
||||
|
||||
@override
|
||||
String get keyboardType => 'Tastatur Typ';
|
||||
|
||||
@override
|
||||
String get language => 'Sprache';
|
||||
|
||||
@override
|
||||
String get languageName => 'Deutsch';
|
||||
|
||||
@override
|
||||
String get lastTry => 'Letzter Versuch';
|
||||
|
||||
@override
|
||||
String get launchPage => 'Startseite';
|
||||
|
||||
@override
|
||||
String get license => 'Lizenzen';
|
||||
|
||||
@override
|
||||
String get light => 'Hell';
|
||||
|
||||
@override
|
||||
String get loadingFiles => 'Lädt Dateien...';
|
||||
|
||||
@override
|
||||
String get log => 'Log';
|
||||
|
||||
@override
|
||||
String get loss => 'loss';
|
||||
|
||||
@override
|
||||
String madeWithLove(Object myGithub) {
|
||||
return 'Erstellt mit ❤️ von $myGithub';
|
||||
}
|
||||
|
||||
@override
|
||||
String get max => 'max';
|
||||
|
||||
@override
|
||||
String get maxRetryCount => 'Anzahl an Verbindungsversuchen';
|
||||
|
||||
@override
|
||||
String get maxRetryCountEqual0 => 'Unbegrenzte Verbindungsversuche zum Server';
|
||||
|
||||
@override
|
||||
String get min => 'min';
|
||||
|
||||
@override
|
||||
String get mission => 'Mission';
|
||||
|
||||
@override
|
||||
String get ms => 'ms';
|
||||
|
||||
@override
|
||||
String get name => 'Name';
|
||||
|
||||
@override
|
||||
String get needRestart => 'App muss neugestartet werden';
|
||||
|
||||
@override
|
||||
String get netViewType => 'Netzwerkansicht Typ';
|
||||
|
||||
@override
|
||||
String get newContainer => 'Neuer Container';
|
||||
|
||||
@override
|
||||
String get noClient => 'Kein Client';
|
||||
|
||||
@override
|
||||
String get noInterface => 'Kein Interface';
|
||||
|
||||
@override
|
||||
String get noOptions => 'Keine Optionen verfügbar';
|
||||
|
||||
@override
|
||||
String get noResult => 'Kein Ergebnis';
|
||||
|
||||
@override
|
||||
String get noSavedPrivateKey => 'Keine gespeicherten Private Keys';
|
||||
|
||||
@override
|
||||
String get noSavedSnippet => 'Keine gespeicherten Snippets.';
|
||||
|
||||
@override
|
||||
String get noServerAvailable => 'Kein Server verfügbar.';
|
||||
|
||||
@override
|
||||
String get noUpdateAvailable => 'Kein Update verfügbar';
|
||||
|
||||
@override
|
||||
String get notSelected => 'Nicht ausgewählt';
|
||||
|
||||
@override
|
||||
String get nullToken => 'Null token';
|
||||
|
||||
@override
|
||||
String get ok => 'OK';
|
||||
|
||||
@override
|
||||
String get onServerDetailPage => 'in Detailansicht des Servers';
|
||||
|
||||
@override
|
||||
String get open => 'Öffnen';
|
||||
|
||||
@override
|
||||
String get paste => 'Einfügen';
|
||||
|
||||
@override
|
||||
String get path => 'Pfad';
|
||||
|
||||
@override
|
||||
String get pickFile => 'Datei wählen';
|
||||
|
||||
@override
|
||||
String get pingAvg => 'Avg:';
|
||||
|
||||
@override
|
||||
String get pingInputIP => 'Bitte gib eine Ziel-IP/Domain ein.';
|
||||
|
||||
@override
|
||||
String get pingNoServer => 'Kein Server zum Anpingen.\nBitte füge einen Server hinzu.';
|
||||
|
||||
@override
|
||||
String get pkg => 'Pkg';
|
||||
|
||||
@override
|
||||
String get platformNotSupportUpdate => 'Die aktuelle Plattform unterstützt keine In-App-Updates.\nBitte kompiliere vom Quellcode und installiere sie.';
|
||||
|
||||
@override
|
||||
String get plzEnterHost => 'Bitte Host eingeben.';
|
||||
|
||||
@override
|
||||
String get plzSelectKey => 'Wähle einen Key.';
|
||||
|
||||
@override
|
||||
String get port => 'Port';
|
||||
|
||||
@override
|
||||
String get preview => 'Vorschau';
|
||||
|
||||
@override
|
||||
String get primaryColor => 'Farbschema';
|
||||
|
||||
@override
|
||||
String get privateKey => 'Private Key';
|
||||
|
||||
@override
|
||||
String get process => 'Prozess';
|
||||
|
||||
@override
|
||||
String get pushToken => 'Push Token';
|
||||
|
||||
@override
|
||||
String get pwd => 'Passwort';
|
||||
|
||||
@override
|
||||
String get remotePath => 'Entfernte Pfade';
|
||||
|
||||
@override
|
||||
String get rename => 'Umbenennen';
|
||||
|
||||
@override
|
||||
String reportBugsOnGithubIssue(Object url) {
|
||||
return 'Bitte Bugs auf $url melden';
|
||||
}
|
||||
|
||||
@override
|
||||
String get restart => 'Neustart';
|
||||
|
||||
@override
|
||||
String get restore => 'Wiederherstellen';
|
||||
|
||||
@override
|
||||
String get restoreSuccess => 'Wiederherstellung erfolgreich. App neustarten um Änderungen anzuwenden.';
|
||||
|
||||
@override
|
||||
String restoreSureWithDate(Object date) {
|
||||
return 'Bist du sicher, dass du das Backup vom $date wiederherstellen möchtest?';
|
||||
}
|
||||
|
||||
@override
|
||||
String get result => 'Result';
|
||||
|
||||
@override
|
||||
String get rotateAngel => 'Rotationswinkel';
|
||||
|
||||
@override
|
||||
String get run => 'Ausführen';
|
||||
|
||||
@override
|
||||
String get save => 'Speichern';
|
||||
|
||||
@override
|
||||
String get saved => 'Gerettet';
|
||||
|
||||
@override
|
||||
String get second => 's';
|
||||
|
||||
@override
|
||||
String get server => 'Server';
|
||||
|
||||
@override
|
||||
String get serverTabConnecting => 'Verbinden...';
|
||||
|
||||
@override
|
||||
String get serverTabEmpty => 'Keine Server vorhanden.';
|
||||
|
||||
@override
|
||||
String get serverTabFailed => 'Fehlgeschlagen';
|
||||
|
||||
@override
|
||||
String get serverTabLoading => 'Lädt...';
|
||||
|
||||
@override
|
||||
String get serverTabPlzSave => 'Bitte \'speichere\' diesen privaten Schlüssel erneut.';
|
||||
|
||||
@override
|
||||
String get serverTabUnkown => 'Unbekannter Status';
|
||||
|
||||
@override
|
||||
String get setting => 'Einstellungen';
|
||||
|
||||
@override
|
||||
String get sftpDlPrepare => 'Verbindung vorbereiten...';
|
||||
|
||||
@override
|
||||
String get sftpNoDownloadTask => 'Keine aktiven Downloads.';
|
||||
|
||||
@override
|
||||
String get sftpSSHConnected => 'SFTP Verbunden';
|
||||
|
||||
@override
|
||||
String get showDistLogo => 'Distributionslogo anzeigen';
|
||||
|
||||
@override
|
||||
String get snippet => 'Snippet';
|
||||
|
||||
@override
|
||||
String get speed => 'Tempo';
|
||||
|
||||
@override
|
||||
String spentTime(Object time) {
|
||||
return 'Benötigte Zeit: $time';
|
||||
}
|
||||
|
||||
@override
|
||||
String sshTip(Object url) {
|
||||
return 'Diese Funktion befindet sich jetzt in der Experimentierphase.\n\nBitte melde Bugs auf $url oder mach mit bei der Entwicklung.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sshVirtualKeyAutoOff => 'Automatische Umschaltung der virtuellen Tasten';
|
||||
|
||||
@override
|
||||
String get start => 'Start';
|
||||
|
||||
@override
|
||||
String get stop => 'Stop';
|
||||
|
||||
@override
|
||||
String get success => 'Erfolgreich';
|
||||
|
||||
@override
|
||||
String sureDelete(Object name) {
|
||||
return 'Soll [$name] wirklich gelöscht werden?';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sureDirEmpty => 'Stelle sicher, dass der Ordner leer ist.';
|
||||
|
||||
@override
|
||||
String get sureNoPwd => 'Bist du sicher, dass du kein Passwort verwenden willst?';
|
||||
|
||||
@override
|
||||
String sureToDeleteServer(Object server) {
|
||||
return 'Bist du sicher, dass du [$server] löschen willst?';
|
||||
}
|
||||
|
||||
@override
|
||||
String get system => 'Systeme';
|
||||
|
||||
@override
|
||||
String get tag => 'Tags';
|
||||
|
||||
@override
|
||||
String get terminal => 'Terminal';
|
||||
|
||||
@override
|
||||
String get theme => 'Themen';
|
||||
|
||||
@override
|
||||
String get themeMode => 'Themen-Modus';
|
||||
|
||||
@override
|
||||
String get times => 'x';
|
||||
|
||||
@override
|
||||
String get traffic => 'Durchflussmenge';
|
||||
|
||||
@override
|
||||
String get ttl => 'ttl';
|
||||
|
||||
@override
|
||||
String get unknown => 'Unbekannt';
|
||||
|
||||
@override
|
||||
String get unknownError => 'Unbekannter Fehler';
|
||||
|
||||
@override
|
||||
String get unkownConvertMode => 'Unbekannter Konvertierungsmodus';
|
||||
|
||||
@override
|
||||
String get update => 'Update';
|
||||
|
||||
@override
|
||||
String get updateAll => 'Alle aktualisieren';
|
||||
|
||||
@override
|
||||
String get updateIntervalEqual0 => 'Wenn du den Wert 0 einstellst, wird nicht automatisch aktualisiert.\nDer CPU-Status kann nicht berechnet werden.';
|
||||
|
||||
@override
|
||||
String get updateServerStatusInterval => 'Aktualisierungsintervall des Serverstatus';
|
||||
|
||||
@override
|
||||
String updateTip(Object newest) {
|
||||
return 'Update: v1.0.$newest';
|
||||
}
|
||||
|
||||
@override
|
||||
String updateTipTooLow(Object newest) {
|
||||
return 'Aktuelle Version ist zu alt, bitte update auf v1.0.$newest';
|
||||
}
|
||||
|
||||
@override
|
||||
String get upload => 'Hochladen';
|
||||
|
||||
@override
|
||||
String get upsideDown => 'Upside Down';
|
||||
|
||||
@override
|
||||
String get urlOrJson => 'URL oder JSON';
|
||||
|
||||
@override
|
||||
String get user => 'Benutzer';
|
||||
|
||||
@override
|
||||
String versionHaveUpdate(Object build) {
|
||||
return 'Gefunden: v1.0.$build, klicke zum Aktualisieren';
|
||||
}
|
||||
|
||||
@override
|
||||
String versionUnknownUpdate(Object build) {
|
||||
return 'Aktuell: v1.0.$build';
|
||||
}
|
||||
|
||||
@override
|
||||
String versionUpdated(Object build) {
|
||||
return 'v1.0.$build ist bereits die neueste Version';
|
||||
}
|
||||
|
||||
@override
|
||||
String get viewErr => 'Fehler anzeigen';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpClipboard => 'In die Zwischenablage kopieren, wenn das ausgewählte Terminal nicht leer ist, andernfalls den Inhalt der Zwischenablage in das Terminal einfügen.';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpSFTP => 'Aktuelles Verzeichnis in SFTP öffnen.';
|
||||
|
||||
@override
|
||||
String get waitConnection => 'Bitte warte, bis die Verbindung hergestellt wurde.';
|
||||
|
||||
@override
|
||||
String get whenOpenApp => 'Beim Öffnen der App';
|
||||
|
||||
@override
|
||||
String get willTakEeffectImmediately => 'Wird sofort angewendet';
|
||||
}
|
||||
@@ -1,683 +0,0 @@
|
||||
import 'l10n.dart';
|
||||
|
||||
/// The translations for English (`en`).
|
||||
class SEn extends S {
|
||||
SEn([String locale = 'en']) : super(locale);
|
||||
|
||||
@override
|
||||
String get about => 'About';
|
||||
|
||||
@override
|
||||
String get aboutThanks => 'Thanks to the following people who participated in.';
|
||||
|
||||
@override
|
||||
String get add => 'Add';
|
||||
|
||||
@override
|
||||
String get addAServer => 'add a server';
|
||||
|
||||
@override
|
||||
String get addPrivateKey => 'Add private key';
|
||||
|
||||
@override
|
||||
String get added2List => 'Added to task list';
|
||||
|
||||
@override
|
||||
String get all => 'All';
|
||||
|
||||
@override
|
||||
String get alreadyLastDir => 'Already in last directory.';
|
||||
|
||||
@override
|
||||
String get alterUrl => 'Alter url';
|
||||
|
||||
@override
|
||||
String get attention => 'Attention';
|
||||
|
||||
@override
|
||||
String get auto => 'Auto';
|
||||
|
||||
@override
|
||||
String get autoUpdateHomeWidget => 'Auto update home widget';
|
||||
|
||||
@override
|
||||
String get backup => 'Backup';
|
||||
|
||||
@override
|
||||
String get backupAndRestore => 'Backup and Restore';
|
||||
|
||||
@override
|
||||
String get backupTip => 'The exported data is simply encrypted. \nPlease keep it safe.';
|
||||
|
||||
@override
|
||||
String get backupVersionNotMatch => 'Backup version is not match.';
|
||||
|
||||
@override
|
||||
String get bgRun => 'Run in backgroud';
|
||||
|
||||
@override
|
||||
String get canPullRefresh => 'You can pull to refresh.';
|
||||
|
||||
@override
|
||||
String get cancel => 'Cancel';
|
||||
|
||||
@override
|
||||
String get choose => 'Choose';
|
||||
|
||||
@override
|
||||
String get chooseFontFile => 'Choose a font file';
|
||||
|
||||
@override
|
||||
String get choosePrivateKey => 'Choose private key';
|
||||
|
||||
@override
|
||||
String get clear => 'Clear';
|
||||
|
||||
@override
|
||||
String get close => 'Close';
|
||||
|
||||
@override
|
||||
String get cmd => 'Command';
|
||||
|
||||
@override
|
||||
String get conn => 'Connection';
|
||||
|
||||
@override
|
||||
String get containerName => 'Container name';
|
||||
|
||||
@override
|
||||
String get containerStatus => 'Container status';
|
||||
|
||||
@override
|
||||
String get convert => 'Convert';
|
||||
|
||||
@override
|
||||
String get copy => 'Copy';
|
||||
|
||||
@override
|
||||
String get copyPath => 'Copy path';
|
||||
|
||||
@override
|
||||
String get createFile => 'Create file';
|
||||
|
||||
@override
|
||||
String get createFolder => 'Create folder';
|
||||
|
||||
@override
|
||||
String get dark => 'Dark';
|
||||
|
||||
@override
|
||||
String get debug => 'Debug';
|
||||
|
||||
@override
|
||||
String get decode => 'Decode';
|
||||
|
||||
@override
|
||||
String get delete => 'Delete';
|
||||
|
||||
@override
|
||||
String get deleteServers => 'Batch delete servers';
|
||||
|
||||
@override
|
||||
String get disabled => 'Disabled';
|
||||
|
||||
@override
|
||||
String get disconnected => 'Disconnected';
|
||||
|
||||
@override
|
||||
String get diskIgnorePath => 'Ignore path for disk';
|
||||
|
||||
@override
|
||||
String dl2Local(Object fileName) {
|
||||
return 'Download $fileName to local?';
|
||||
}
|
||||
|
||||
@override
|
||||
String get dockerEditHost => 'Edit DOCKER_HOST';
|
||||
|
||||
@override
|
||||
String get dockerEmptyRunningItems => 'No running container. \nIt may be that the env DOCKER_HOST is not read correctly. You can found it by running `echo \$DOCKER_HOST` in terminal.';
|
||||
|
||||
@override
|
||||
String dockerImagesFmt(Object count) {
|
||||
return '$count images';
|
||||
}
|
||||
|
||||
@override
|
||||
String get dockerNotInstalled => 'Docker not installed';
|
||||
|
||||
@override
|
||||
String dockerStatusRunningAndStoppedFmt(Object runningCount, Object stoppedCount) {
|
||||
return '$runningCount running, $stoppedCount container stopped.';
|
||||
}
|
||||
|
||||
@override
|
||||
String dockerStatusRunningFmt(Object count) {
|
||||
return '$count container running.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get download => 'Download';
|
||||
|
||||
@override
|
||||
String downloadStatus(Object percent, Object size) {
|
||||
return '$percent% of $size';
|
||||
}
|
||||
|
||||
@override
|
||||
String get edit => 'Edit';
|
||||
|
||||
@override
|
||||
String get editVirtKeys => 'Edit virtual keys';
|
||||
|
||||
@override
|
||||
String get editor => 'Editor';
|
||||
|
||||
@override
|
||||
String get encode => 'Encode';
|
||||
|
||||
@override
|
||||
String get error => 'Error';
|
||||
|
||||
@override
|
||||
String get exampleName => 'Example name';
|
||||
|
||||
@override
|
||||
String get experimentalFeature => 'Experimental feature';
|
||||
|
||||
@override
|
||||
String get export => 'Export';
|
||||
|
||||
@override
|
||||
String get extraArgs => 'Extra args';
|
||||
|
||||
@override
|
||||
String get failed => 'Failed';
|
||||
|
||||
@override
|
||||
String get feedback => 'Feedback';
|
||||
|
||||
@override
|
||||
String get feedbackOnGithub => 'If you have any questions, please feedback on Github.';
|
||||
|
||||
@override
|
||||
String get fieldMustNotEmpty => 'These fields must not be empty.';
|
||||
|
||||
@override
|
||||
String fileNotExist(Object file) {
|
||||
return '$file not exist';
|
||||
}
|
||||
|
||||
@override
|
||||
String fileTooLarge(Object file, Object size, Object sizeMax) {
|
||||
return 'File \'$file\' too large $size, max $sizeMax';
|
||||
}
|
||||
|
||||
@override
|
||||
String get files => 'Files';
|
||||
|
||||
@override
|
||||
String get finished => 'Finished';
|
||||
|
||||
@override
|
||||
String get font => 'Font';
|
||||
|
||||
@override
|
||||
String get fontSize => 'Font size';
|
||||
|
||||
@override
|
||||
String foundNUpdate(Object count) {
|
||||
return 'Found $count update';
|
||||
}
|
||||
|
||||
@override
|
||||
String get fullScreen => 'Full screen mode';
|
||||
|
||||
@override
|
||||
String get fullScreenJitter => 'Full screen jitter';
|
||||
|
||||
@override
|
||||
String get fullScreenJitterHelp => 'To avoid screen burn-in';
|
||||
|
||||
@override
|
||||
String get getPushTokenFailed => 'Can\'t fetch push token';
|
||||
|
||||
@override
|
||||
String get gettingToken => 'Getting token...';
|
||||
|
||||
@override
|
||||
String get goto => 'Go to';
|
||||
|
||||
@override
|
||||
String get homeWidgetUrlConfig => 'Config home widget url';
|
||||
|
||||
@override
|
||||
String get host => 'Host';
|
||||
|
||||
@override
|
||||
String httpFailedWithCode(Object code) {
|
||||
return 'request failed, status code: $code';
|
||||
}
|
||||
|
||||
@override
|
||||
String get image => 'Image';
|
||||
|
||||
@override
|
||||
String get imagesList => 'Images list';
|
||||
|
||||
@override
|
||||
String get import => 'Import';
|
||||
|
||||
@override
|
||||
String get inner => 'Inner';
|
||||
|
||||
@override
|
||||
String get inputDomainHere => 'Input Domain here';
|
||||
|
||||
@override
|
||||
String get install => 'install';
|
||||
|
||||
@override
|
||||
String get installDockerWithUrl => 'Please https://docs.docker.com/engine/install docker first.';
|
||||
|
||||
@override
|
||||
String get invalidJson => 'Invalid JSON';
|
||||
|
||||
@override
|
||||
String get invalidVersion => 'Invalid version';
|
||||
|
||||
@override
|
||||
String invalidVersionHelp(Object url) {
|
||||
return 'Please make sure that docker is installed correctly, or that you are using a non-self-compiled version. If you don\'t have the above issues, please submit an issue on $url.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get isBusy => 'Is busy now';
|
||||
|
||||
@override
|
||||
String get keepForeground => 'Keep app foreground!';
|
||||
|
||||
@override
|
||||
String get keyAuth => 'Key Auth';
|
||||
|
||||
@override
|
||||
String get keyboardCompatibility => 'Possible to improve input method compatibility';
|
||||
|
||||
@override
|
||||
String get keyboardType => 'Keyborad type';
|
||||
|
||||
@override
|
||||
String get language => 'Language';
|
||||
|
||||
@override
|
||||
String get languageName => 'English';
|
||||
|
||||
@override
|
||||
String get lastTry => 'Last try';
|
||||
|
||||
@override
|
||||
String get launchPage => 'Launch page';
|
||||
|
||||
@override
|
||||
String get license => 'License';
|
||||
|
||||
@override
|
||||
String get light => 'Light';
|
||||
|
||||
@override
|
||||
String get loadingFiles => 'Loading files...';
|
||||
|
||||
@override
|
||||
String get log => 'Log';
|
||||
|
||||
@override
|
||||
String get loss => 'loss';
|
||||
|
||||
@override
|
||||
String madeWithLove(Object myGithub) {
|
||||
return 'Made with ❤️ by $myGithub';
|
||||
}
|
||||
|
||||
@override
|
||||
String get max => 'max';
|
||||
|
||||
@override
|
||||
String get maxRetryCount => 'Number of server reconnection';
|
||||
|
||||
@override
|
||||
String get maxRetryCountEqual0 => 'Will retry again and again.';
|
||||
|
||||
@override
|
||||
String get min => 'min';
|
||||
|
||||
@override
|
||||
String get mission => 'Mission';
|
||||
|
||||
@override
|
||||
String get ms => 'ms';
|
||||
|
||||
@override
|
||||
String get name => 'Name';
|
||||
|
||||
@override
|
||||
String get needRestart => 'Need to restart app';
|
||||
|
||||
@override
|
||||
String get netViewType => 'Net view type';
|
||||
|
||||
@override
|
||||
String get newContainer => 'New container';
|
||||
|
||||
@override
|
||||
String get noClient => 'No client';
|
||||
|
||||
@override
|
||||
String get noInterface => 'No interface';
|
||||
|
||||
@override
|
||||
String get noOptions => 'No options';
|
||||
|
||||
@override
|
||||
String get noResult => 'No result';
|
||||
|
||||
@override
|
||||
String get noSavedPrivateKey => 'No saved private keys.';
|
||||
|
||||
@override
|
||||
String get noSavedSnippet => 'No saved snippets.';
|
||||
|
||||
@override
|
||||
String get noServerAvailable => 'No server available.';
|
||||
|
||||
@override
|
||||
String get noUpdateAvailable => 'No update available';
|
||||
|
||||
@override
|
||||
String get notSelected => 'Not selected';
|
||||
|
||||
@override
|
||||
String get nullToken => 'Null token';
|
||||
|
||||
@override
|
||||
String get ok => 'OK';
|
||||
|
||||
@override
|
||||
String get onServerDetailPage => 'On server detail page';
|
||||
|
||||
@override
|
||||
String get open => 'Open';
|
||||
|
||||
@override
|
||||
String get paste => 'Paste';
|
||||
|
||||
@override
|
||||
String get path => 'Path';
|
||||
|
||||
@override
|
||||
String get pickFile => 'Pick file';
|
||||
|
||||
@override
|
||||
String get pingAvg => 'Avg:';
|
||||
|
||||
@override
|
||||
String get pingInputIP => 'Please input a target IP / domain.';
|
||||
|
||||
@override
|
||||
String get pingNoServer => 'No server to ping.\nPlease add a server in server tab.';
|
||||
|
||||
@override
|
||||
String get pkg => 'Pkg';
|
||||
|
||||
@override
|
||||
String get platformNotSupportUpdate => 'Current platform does not support in app update.\nPlease build from source and install it.';
|
||||
|
||||
@override
|
||||
String get plzEnterHost => 'Please enter host.';
|
||||
|
||||
@override
|
||||
String get plzSelectKey => 'Please select a key.';
|
||||
|
||||
@override
|
||||
String get port => 'Port';
|
||||
|
||||
@override
|
||||
String get preview => 'Preview';
|
||||
|
||||
@override
|
||||
String get primaryColor => 'Primary color';
|
||||
|
||||
@override
|
||||
String get privateKey => 'Private Key';
|
||||
|
||||
@override
|
||||
String get process => 'Process';
|
||||
|
||||
@override
|
||||
String get pushToken => 'Push token';
|
||||
|
||||
@override
|
||||
String get pwd => 'Password';
|
||||
|
||||
@override
|
||||
String get remotePath => 'Remote path';
|
||||
|
||||
@override
|
||||
String get rename => 'Rename';
|
||||
|
||||
@override
|
||||
String reportBugsOnGithubIssue(Object url) {
|
||||
return 'Please report bugs on $url';
|
||||
}
|
||||
|
||||
@override
|
||||
String get restart => 'Restart';
|
||||
|
||||
@override
|
||||
String get restore => 'Restore';
|
||||
|
||||
@override
|
||||
String get restoreSuccess => 'Restore success. Restart app to apply.';
|
||||
|
||||
@override
|
||||
String restoreSureWithDate(Object date) {
|
||||
return 'Are you sure to restore from $date ?';
|
||||
}
|
||||
|
||||
@override
|
||||
String get result => 'Result';
|
||||
|
||||
@override
|
||||
String get rotateAngel => 'Rotation angle';
|
||||
|
||||
@override
|
||||
String get run => 'Run';
|
||||
|
||||
@override
|
||||
String get save => 'Save';
|
||||
|
||||
@override
|
||||
String get saved => 'Saved';
|
||||
|
||||
@override
|
||||
String get second => 's';
|
||||
|
||||
@override
|
||||
String get server => 'Server';
|
||||
|
||||
@override
|
||||
String get serverTabConnecting => 'Connecting...';
|
||||
|
||||
@override
|
||||
String get serverTabEmpty => 'There is no server.\nClick the fab to add one.';
|
||||
|
||||
@override
|
||||
String get serverTabFailed => 'Failed';
|
||||
|
||||
@override
|
||||
String get serverTabLoading => 'Loading...';
|
||||
|
||||
@override
|
||||
String get serverTabPlzSave => 'Please \'save\' this private key again.';
|
||||
|
||||
@override
|
||||
String get serverTabUnkown => 'Unknown state';
|
||||
|
||||
@override
|
||||
String get setting => 'Settings';
|
||||
|
||||
@override
|
||||
String get sftpDlPrepare => 'Preparing to connect...';
|
||||
|
||||
@override
|
||||
String get sftpNoDownloadTask => 'No download task.';
|
||||
|
||||
@override
|
||||
String get sftpSSHConnected => 'SFTP Connected';
|
||||
|
||||
@override
|
||||
String get showDistLogo => 'Show distribution logo';
|
||||
|
||||
@override
|
||||
String get snippet => 'Snippet';
|
||||
|
||||
@override
|
||||
String get speed => 'Speed';
|
||||
|
||||
@override
|
||||
String spentTime(Object time) {
|
||||
return 'Spent time: $time';
|
||||
}
|
||||
|
||||
@override
|
||||
String sshTip(Object url) {
|
||||
return 'This function is now in the experimental stage.\n\nPlease report bugs on $url or join our development.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sshVirtualKeyAutoOff => 'Auto switching of virtual keys';
|
||||
|
||||
@override
|
||||
String get start => 'Start';
|
||||
|
||||
@override
|
||||
String get stop => 'Stop';
|
||||
|
||||
@override
|
||||
String get success => 'Success';
|
||||
|
||||
@override
|
||||
String sureDelete(Object name) {
|
||||
return 'Are you sure to delete [$name]?';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sureDirEmpty => 'Make sure dir is empty.';
|
||||
|
||||
@override
|
||||
String get sureNoPwd => 'Are you sure to use no password?';
|
||||
|
||||
@override
|
||||
String sureToDeleteServer(Object server) {
|
||||
return 'Are you sure to delete server [$server]?';
|
||||
}
|
||||
|
||||
@override
|
||||
String get system => 'System';
|
||||
|
||||
@override
|
||||
String get tag => 'Tags';
|
||||
|
||||
@override
|
||||
String get terminal => 'Terminal';
|
||||
|
||||
@override
|
||||
String get theme => 'Theme';
|
||||
|
||||
@override
|
||||
String get themeMode => 'Theme mode';
|
||||
|
||||
@override
|
||||
String get times => 'Times';
|
||||
|
||||
@override
|
||||
String get traffic => 'Traffic';
|
||||
|
||||
@override
|
||||
String get ttl => 'ttl';
|
||||
|
||||
@override
|
||||
String get unknown => 'Unknown';
|
||||
|
||||
@override
|
||||
String get unknownError => 'Unknown error';
|
||||
|
||||
@override
|
||||
String get unkownConvertMode => 'Unknown convert mode';
|
||||
|
||||
@override
|
||||
String get update => 'Update';
|
||||
|
||||
@override
|
||||
String get updateAll => 'Update all';
|
||||
|
||||
@override
|
||||
String get updateIntervalEqual0 => 'You set to 0, will not update automatically.\nCan\'t calculate CPU status.';
|
||||
|
||||
@override
|
||||
String get updateServerStatusInterval => 'Server status update interval';
|
||||
|
||||
@override
|
||||
String updateTip(Object newest) {
|
||||
return 'Update: v1.0.$newest';
|
||||
}
|
||||
|
||||
@override
|
||||
String updateTipTooLow(Object newest) {
|
||||
return 'Current version is too low, please update to v1.0.$newest';
|
||||
}
|
||||
|
||||
@override
|
||||
String get upload => 'Upload';
|
||||
|
||||
@override
|
||||
String get upsideDown => 'Upside Down';
|
||||
|
||||
@override
|
||||
String get urlOrJson => 'URL or JSON';
|
||||
|
||||
@override
|
||||
String get user => 'User';
|
||||
|
||||
@override
|
||||
String versionHaveUpdate(Object build) {
|
||||
return 'Found: v1.0.$build, click to update';
|
||||
}
|
||||
|
||||
@override
|
||||
String versionUnknownUpdate(Object build) {
|
||||
return 'Current: v1.0.$build';
|
||||
}
|
||||
|
||||
@override
|
||||
String versionUpdated(Object build) {
|
||||
return 'Current: v1.0.$build, is up to date';
|
||||
}
|
||||
|
||||
@override
|
||||
String get viewErr => 'See error';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpClipboard => 'Copy to the clipboard if terminal selected is not empty, otherwise paste the contents of the clipboard to the terminal.';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpSFTP => 'Open current directory in SFTP.';
|
||||
|
||||
@override
|
||||
String get waitConnection => 'Please wait for the connection to be established.';
|
||||
|
||||
@override
|
||||
String get whenOpenApp => 'When opening the app';
|
||||
|
||||
@override
|
||||
String get willTakEeffectImmediately => 'Will take effect immediately';
|
||||
}
|
||||
@@ -1,683 +0,0 @@
|
||||
import 'l10n.dart';
|
||||
|
||||
/// The translations for Indonesian (`id`).
|
||||
class SId extends S {
|
||||
SId([String locale = 'id']) : super(locale);
|
||||
|
||||
@override
|
||||
String get about => 'Tentang';
|
||||
|
||||
@override
|
||||
String get aboutThanks => 'Terima kasih kepada orang -orang berikut yang berpartisipasi.';
|
||||
|
||||
@override
|
||||
String get add => 'Menambahkan';
|
||||
|
||||
@override
|
||||
String get addAServer => 'tambahkan server';
|
||||
|
||||
@override
|
||||
String get addPrivateKey => 'Tambahkan kunci pribadi';
|
||||
|
||||
@override
|
||||
String get added2List => 'Ditambahkan ke Daftar Tugas';
|
||||
|
||||
@override
|
||||
String get all => 'Semua';
|
||||
|
||||
@override
|
||||
String get alreadyLastDir => 'Sudah di direktori terakhir.';
|
||||
|
||||
@override
|
||||
String get alterUrl => 'Alter url';
|
||||
|
||||
@override
|
||||
String get attention => 'Perhatian';
|
||||
|
||||
@override
|
||||
String get auto => 'Auto';
|
||||
|
||||
@override
|
||||
String get autoUpdateHomeWidget => 'Widget Rumah Pembaruan Otomatis';
|
||||
|
||||
@override
|
||||
String get backup => 'Cadangan';
|
||||
|
||||
@override
|
||||
String get backupAndRestore => 'Cadangan dan Pulihkan';
|
||||
|
||||
@override
|
||||
String get backupTip => 'Data yang diekspor hanya dienkripsi.\nTolong jaga keamanannya.';
|
||||
|
||||
@override
|
||||
String get backupVersionNotMatch => 'Versi cadangan tidak cocok.';
|
||||
|
||||
@override
|
||||
String get bgRun => 'Jalankan di Backgroud';
|
||||
|
||||
@override
|
||||
String get canPullRefresh => 'Anda dapat menarik untuk menyegarkan.';
|
||||
|
||||
@override
|
||||
String get cancel => 'Membatalkan';
|
||||
|
||||
@override
|
||||
String get choose => 'Memilih';
|
||||
|
||||
@override
|
||||
String get chooseFontFile => 'Pilih file font';
|
||||
|
||||
@override
|
||||
String get choosePrivateKey => 'Pilih Kunci Pribadi';
|
||||
|
||||
@override
|
||||
String get clear => 'Jernih';
|
||||
|
||||
@override
|
||||
String get close => 'Menutup';
|
||||
|
||||
@override
|
||||
String get cmd => 'Memerintah';
|
||||
|
||||
@override
|
||||
String get conn => 'Koneksi';
|
||||
|
||||
@override
|
||||
String get containerName => 'Nama kontainer';
|
||||
|
||||
@override
|
||||
String get containerStatus => 'Status wadah';
|
||||
|
||||
@override
|
||||
String get convert => 'Mengubah';
|
||||
|
||||
@override
|
||||
String get copy => 'Menyalin';
|
||||
|
||||
@override
|
||||
String get copyPath => 'Path Copy';
|
||||
|
||||
@override
|
||||
String get createFile => 'Buat file';
|
||||
|
||||
@override
|
||||
String get createFolder => 'Membuat folder';
|
||||
|
||||
@override
|
||||
String get dark => 'Gelap';
|
||||
|
||||
@override
|
||||
String get debug => 'Debug';
|
||||
|
||||
@override
|
||||
String get decode => 'Membaca sandi';
|
||||
|
||||
@override
|
||||
String get delete => 'Menghapus';
|
||||
|
||||
@override
|
||||
String get deleteServers => 'Penghapusan server secara batch';
|
||||
|
||||
@override
|
||||
String get disabled => 'Dengan disabilitas';
|
||||
|
||||
@override
|
||||
String get disconnected => 'Terputus';
|
||||
|
||||
@override
|
||||
String get diskIgnorePath => 'Abaikan jalan untuk disk';
|
||||
|
||||
@override
|
||||
String dl2Local(Object fileName) {
|
||||
return 'Unduh $fileName ke lokal?';
|
||||
}
|
||||
|
||||
@override
|
||||
String get dockerEditHost => 'Edit Docker_host';
|
||||
|
||||
@override
|
||||
String get dockerEmptyRunningItems => 'Tidak ada wadah yang berjalan.\nMungkin saja env DOCKER_HOST tidak dibaca dengan benar. Anda dapat menemukannya dengan menjalankan `echo \$DOCKER_HOST` di terminal.';
|
||||
|
||||
@override
|
||||
String dockerImagesFmt(Object count) {
|
||||
return '$count gambar';
|
||||
}
|
||||
|
||||
@override
|
||||
String get dockerNotInstalled => 'Docker tidak terpasang';
|
||||
|
||||
@override
|
||||
String dockerStatusRunningAndStoppedFmt(Object runningCount, Object stoppedCount) {
|
||||
return '$runningCount running, $stoppedCount container stopped.';
|
||||
}
|
||||
|
||||
@override
|
||||
String dockerStatusRunningFmt(Object count) {
|
||||
return '$count wadah berjalan.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get download => 'Unduh';
|
||||
|
||||
@override
|
||||
String downloadStatus(Object percent, Object size) {
|
||||
return '$percent% dari $size';
|
||||
}
|
||||
|
||||
@override
|
||||
String get edit => 'Edit';
|
||||
|
||||
@override
|
||||
String get editVirtKeys => 'Edit kunci virtual';
|
||||
|
||||
@override
|
||||
String get editor => 'Editor';
|
||||
|
||||
@override
|
||||
String get encode => 'Menyandi';
|
||||
|
||||
@override
|
||||
String get error => 'Kesalahan';
|
||||
|
||||
@override
|
||||
String get exampleName => 'Nama contoh';
|
||||
|
||||
@override
|
||||
String get experimentalFeature => 'Fitur eksperimental';
|
||||
|
||||
@override
|
||||
String get export => 'Ekspor';
|
||||
|
||||
@override
|
||||
String get extraArgs => 'Args ekstra';
|
||||
|
||||
@override
|
||||
String get failed => 'Gagal';
|
||||
|
||||
@override
|
||||
String get feedback => 'Masukan';
|
||||
|
||||
@override
|
||||
String get feedbackOnGithub => 'Jika Anda memiliki pertanyaan, silakan umpan balik tentang GitHub.';
|
||||
|
||||
@override
|
||||
String get fieldMustNotEmpty => 'Bidang -bidang ini tidak boleh kosong.';
|
||||
|
||||
@override
|
||||
String fileNotExist(Object file) {
|
||||
return '$file tidak ada';
|
||||
}
|
||||
|
||||
@override
|
||||
String fileTooLarge(Object file, Object size, Object sizeMax) {
|
||||
return 'File \'$file\' terlalu besar $size, max $sizeMax';
|
||||
}
|
||||
|
||||
@override
|
||||
String get files => 'File';
|
||||
|
||||
@override
|
||||
String get finished => 'Selesai';
|
||||
|
||||
@override
|
||||
String get font => 'Font';
|
||||
|
||||
@override
|
||||
String get fontSize => 'Ukuran huruf';
|
||||
|
||||
@override
|
||||
String foundNUpdate(Object count) {
|
||||
return 'Menemukan $count pembaruan';
|
||||
}
|
||||
|
||||
@override
|
||||
String get fullScreen => 'Mode Layar Penuh';
|
||||
|
||||
@override
|
||||
String get fullScreenJitter => 'Jitter layar penuh';
|
||||
|
||||
@override
|
||||
String get fullScreenJitterHelp => 'Untuk menghindari pembakaran layar';
|
||||
|
||||
@override
|
||||
String get getPushTokenFailed => 'Tidak bisa mengambil token dorong';
|
||||
|
||||
@override
|
||||
String get gettingToken => 'Mendapatkan token ...';
|
||||
|
||||
@override
|
||||
String get goto => 'Pergi ke';
|
||||
|
||||
@override
|
||||
String get homeWidgetUrlConfig => 'Konfigurasi URL Widget Rumah';
|
||||
|
||||
@override
|
||||
String get host => 'Host';
|
||||
|
||||
@override
|
||||
String httpFailedWithCode(Object code) {
|
||||
return 'Permintaan gagal, kode status: $code';
|
||||
}
|
||||
|
||||
@override
|
||||
String get image => 'Gambar';
|
||||
|
||||
@override
|
||||
String get imagesList => 'Daftar gambar';
|
||||
|
||||
@override
|
||||
String get import => 'Impor';
|
||||
|
||||
@override
|
||||
String get inner => 'Batin';
|
||||
|
||||
@override
|
||||
String get inputDomainHere => 'Input domain di sini';
|
||||
|
||||
@override
|
||||
String get install => 'Install';
|
||||
|
||||
@override
|
||||
String get installDockerWithUrl => 'Silakan https://docs.docker.com/engine/install Docker pertama.';
|
||||
|
||||
@override
|
||||
String get invalidJson => 'JSON tidak valid';
|
||||
|
||||
@override
|
||||
String get invalidVersion => 'Versi tidak valid';
|
||||
|
||||
@override
|
||||
String invalidVersionHelp(Object url) {
|
||||
return 'Pastikan Docker diinstal dengan benar, atau Anda menggunakan versi yang tidak dikompilasi. Jika Anda tidak memiliki masalah di atas, silakan kirimkan masalah pada $url.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get isBusy => 'Sibuk sekarang';
|
||||
|
||||
@override
|
||||
String get keepForeground => 'Simpan Aplikasi Foreground!';
|
||||
|
||||
@override
|
||||
String get keyAuth => 'Auth kunci';
|
||||
|
||||
@override
|
||||
String get keyboardCompatibility => 'Mungkin untuk meningkatkan kompatibilitas metode input';
|
||||
|
||||
@override
|
||||
String get keyboardType => 'Tipe Keyborad';
|
||||
|
||||
@override
|
||||
String get language => 'Bahasa';
|
||||
|
||||
@override
|
||||
String get languageName => 'Indonesia';
|
||||
|
||||
@override
|
||||
String get lastTry => 'Percobaan terakhir';
|
||||
|
||||
@override
|
||||
String get launchPage => 'Halaman peluncuran';
|
||||
|
||||
@override
|
||||
String get license => 'Lisensi';
|
||||
|
||||
@override
|
||||
String get light => 'Terang';
|
||||
|
||||
@override
|
||||
String get loadingFiles => 'Memuat file ...';
|
||||
|
||||
@override
|
||||
String get log => 'Catatan';
|
||||
|
||||
@override
|
||||
String get loss => 'kehilangan';
|
||||
|
||||
@override
|
||||
String madeWithLove(Object myGithub) {
|
||||
return 'Dibuat dengan ❤️ oleh $myGithub';
|
||||
}
|
||||
|
||||
@override
|
||||
String get max => 'Max';
|
||||
|
||||
@override
|
||||
String get maxRetryCount => 'Jumlah penyambungan kembali server';
|
||||
|
||||
@override
|
||||
String get maxRetryCountEqual0 => 'Akan mencoba lagi lagi dan lagi.';
|
||||
|
||||
@override
|
||||
String get min => 'Min';
|
||||
|
||||
@override
|
||||
String get mission => 'Misi';
|
||||
|
||||
@override
|
||||
String get ms => 'MS';
|
||||
|
||||
@override
|
||||
String get name => 'Nama';
|
||||
|
||||
@override
|
||||
String get needRestart => 'Perlu memulai ulang aplikasi';
|
||||
|
||||
@override
|
||||
String get netViewType => 'Jenis tampilan bersih';
|
||||
|
||||
@override
|
||||
String get newContainer => 'Wadah baru';
|
||||
|
||||
@override
|
||||
String get noClient => 'Tidak ada klien';
|
||||
|
||||
@override
|
||||
String get noInterface => 'Tidak ada antarmuka';
|
||||
|
||||
@override
|
||||
String get noOptions => 'Tidak ada opsi';
|
||||
|
||||
@override
|
||||
String get noResult => 'Tidak ada hasil';
|
||||
|
||||
@override
|
||||
String get noSavedPrivateKey => 'Tidak ada kunci pribadi yang disimpan.';
|
||||
|
||||
@override
|
||||
String get noSavedSnippet => 'Tidak ada cuplikan yang disimpan.';
|
||||
|
||||
@override
|
||||
String get noServerAvailable => 'Tidak ada server yang tersedia.';
|
||||
|
||||
@override
|
||||
String get noUpdateAvailable => 'Tidak ada pembaruan yang tersedia';
|
||||
|
||||
@override
|
||||
String get notSelected => 'Tidak terpilih';
|
||||
|
||||
@override
|
||||
String get nullToken => 'Token NULL';
|
||||
|
||||
@override
|
||||
String get ok => 'OKE';
|
||||
|
||||
@override
|
||||
String get onServerDetailPage => 'Di halaman detail server';
|
||||
|
||||
@override
|
||||
String get open => 'Membuka';
|
||||
|
||||
@override
|
||||
String get paste => 'Tempel';
|
||||
|
||||
@override
|
||||
String get path => 'Jalur';
|
||||
|
||||
@override
|
||||
String get pickFile => 'Pilih file';
|
||||
|
||||
@override
|
||||
String get pingAvg => 'Rata -rata:';
|
||||
|
||||
@override
|
||||
String get pingInputIP => 'Harap masukkan IP / domain target.';
|
||||
|
||||
@override
|
||||
String get pingNoServer => 'Tidak ada server untuk melakukan ping.\nHarap tambahkan server di tab Server.';
|
||||
|
||||
@override
|
||||
String get pkg => 'Pkg';
|
||||
|
||||
@override
|
||||
String get platformNotSupportUpdate => 'Platform saat ini tidak mendukung pembaruan aplikasi.\nSilakan bangun dari sumber dan instal.';
|
||||
|
||||
@override
|
||||
String get plzEnterHost => 'Harap masukkan host.';
|
||||
|
||||
@override
|
||||
String get plzSelectKey => 'Pilih kunci.';
|
||||
|
||||
@override
|
||||
String get port => 'Port';
|
||||
|
||||
@override
|
||||
String get preview => 'Pratinjau';
|
||||
|
||||
@override
|
||||
String get primaryColor => 'Warna utama';
|
||||
|
||||
@override
|
||||
String get privateKey => 'Kunci Pribadi';
|
||||
|
||||
@override
|
||||
String get process => 'Proses';
|
||||
|
||||
@override
|
||||
String get pushToken => 'Dorong token';
|
||||
|
||||
@override
|
||||
String get pwd => 'Kata sandi';
|
||||
|
||||
@override
|
||||
String get remotePath => 'Jalur jarak jauh';
|
||||
|
||||
@override
|
||||
String get rename => 'Ganti nama';
|
||||
|
||||
@override
|
||||
String reportBugsOnGithubIssue(Object url) {
|
||||
return 'Harap laporkan bug di $url';
|
||||
}
|
||||
|
||||
@override
|
||||
String get restart => 'Mengulang kembali';
|
||||
|
||||
@override
|
||||
String get restore => 'Memulihkan';
|
||||
|
||||
@override
|
||||
String get restoreSuccess => 'Kembalikan kesuksesan. Mulai ulang aplikasi untuk diterapkan.';
|
||||
|
||||
@override
|
||||
String restoreSureWithDate(Object date) {
|
||||
return 'Apakah Anda pasti akan memulihkan dari $date?';
|
||||
}
|
||||
|
||||
@override
|
||||
String get result => 'Hasil';
|
||||
|
||||
@override
|
||||
String get rotateAngel => 'Sudut rotasi';
|
||||
|
||||
@override
|
||||
String get run => 'Berlari';
|
||||
|
||||
@override
|
||||
String get save => 'Menyimpan';
|
||||
|
||||
@override
|
||||
String get saved => 'Diselamatkan';
|
||||
|
||||
@override
|
||||
String get second => 'S';
|
||||
|
||||
@override
|
||||
String get server => 'Server';
|
||||
|
||||
@override
|
||||
String get serverTabConnecting => 'Menghubungkan ...';
|
||||
|
||||
@override
|
||||
String get serverTabEmpty => 'Tidak ada server.\nKlik fab untuk menambahkan satu.';
|
||||
|
||||
@override
|
||||
String get serverTabFailed => 'Gagal';
|
||||
|
||||
@override
|
||||
String get serverTabLoading => 'Memuat...';
|
||||
|
||||
@override
|
||||
String get serverTabPlzSave => 'Harap \'simpan\' kunci pribadi ini lagi.';
|
||||
|
||||
@override
|
||||
String get serverTabUnkown => 'Negara yang tidak diketahui';
|
||||
|
||||
@override
|
||||
String get setting => 'Pengaturan';
|
||||
|
||||
@override
|
||||
String get sftpDlPrepare => 'Bersiap untuk terhubung ...';
|
||||
|
||||
@override
|
||||
String get sftpNoDownloadTask => 'Tidak ada tugas unduhan.';
|
||||
|
||||
@override
|
||||
String get sftpSSHConnected => 'Sftp terhubung';
|
||||
|
||||
@override
|
||||
String get showDistLogo => 'Tampilkan logo distribusi';
|
||||
|
||||
@override
|
||||
String get snippet => 'Snippet';
|
||||
|
||||
@override
|
||||
String get speed => 'Kecepatan';
|
||||
|
||||
@override
|
||||
String spentTime(Object time) {
|
||||
return 'Menghabiskan waktu: $time';
|
||||
}
|
||||
|
||||
@override
|
||||
String sshTip(Object url) {
|
||||
return 'Fungsi ini sekarang dalam tahap eksperimen.\n\nHarap laporkan bug di $url atau bergabunglah dengan pengembangan kami.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sshVirtualKeyAutoOff => 'Switching Otomatis Kunci Virtual';
|
||||
|
||||
@override
|
||||
String get start => 'Awal';
|
||||
|
||||
@override
|
||||
String get stop => 'Berhenti';
|
||||
|
||||
@override
|
||||
String get success => 'Kesuksesan';
|
||||
|
||||
@override
|
||||
String sureDelete(Object name) {
|
||||
return 'Apakah Anda pasti akan menghapus [$name]?';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sureDirEmpty => 'Pastikan dir kosong.';
|
||||
|
||||
@override
|
||||
String get sureNoPwd => 'Apakah Anda pasti tidak menggunakan kata sandi?';
|
||||
|
||||
@override
|
||||
String sureToDeleteServer(Object server) {
|
||||
return 'Apakah Anda pasti akan menghapus server [$server]?';
|
||||
}
|
||||
|
||||
@override
|
||||
String get system => 'Sistem';
|
||||
|
||||
@override
|
||||
String get tag => 'Tag';
|
||||
|
||||
@override
|
||||
String get terminal => 'Terminal';
|
||||
|
||||
@override
|
||||
String get theme => ' Tema';
|
||||
|
||||
@override
|
||||
String get themeMode => 'Mode tema';
|
||||
|
||||
@override
|
||||
String get times => 'Waktu';
|
||||
|
||||
@override
|
||||
String get traffic => 'Lalu lintas';
|
||||
|
||||
@override
|
||||
String get ttl => 'ttl';
|
||||
|
||||
@override
|
||||
String get unknown => 'Tidak dikenal';
|
||||
|
||||
@override
|
||||
String get unknownError => 'Kesalahan yang tidak diketahui';
|
||||
|
||||
@override
|
||||
String get unkownConvertMode => 'Mode Konversi Tidak Diketahui';
|
||||
|
||||
@override
|
||||
String get update => 'Memperbarui';
|
||||
|
||||
@override
|
||||
String get updateAll => 'Perbarui semua';
|
||||
|
||||
@override
|
||||
String get updateIntervalEqual0 => 'Anda mengatur ke 0, tidak akan memperbarui secara otomatis.\nTidak dapat menghitung status CPU.';
|
||||
|
||||
@override
|
||||
String get updateServerStatusInterval => 'Interval Pembaruan Status Server';
|
||||
|
||||
@override
|
||||
String updateTip(Object newest) {
|
||||
return 'UPDATE: v1.0.$newest';
|
||||
}
|
||||
|
||||
@override
|
||||
String updateTipTooLow(Object newest) {
|
||||
return 'Versi saat ini terlalu rendah, harap perbarui ke v1.0.$newest';
|
||||
}
|
||||
|
||||
@override
|
||||
String get upload => 'Mengunggah';
|
||||
|
||||
@override
|
||||
String get upsideDown => 'Terbalik';
|
||||
|
||||
@override
|
||||
String get urlOrJson => 'URL atau JSON';
|
||||
|
||||
@override
|
||||
String get user => 'Username';
|
||||
|
||||
@override
|
||||
String versionHaveUpdate(Object build) {
|
||||
return 'Ditemukan: v1.0.$build, klik untuk memperbarui';
|
||||
}
|
||||
|
||||
@override
|
||||
String versionUnknownUpdate(Object build) {
|
||||
return 'Saat ini: v1.0.$build';
|
||||
}
|
||||
|
||||
@override
|
||||
String versionUpdated(Object build) {
|
||||
return 'Saat ini: v1.0.$build, mutakhir';
|
||||
}
|
||||
|
||||
@override
|
||||
String get viewErr => 'Lihat kesalahan';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpClipboard => 'Salin ke clipboard jika terminal yang dipilih tidak kosong, jika tidak, tempel isi clipboard ke terminal.';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpSFTP => 'Buka direktori saat ini di SFTP.';
|
||||
|
||||
@override
|
||||
String get waitConnection => 'Harap tunggu koneksi akan dibuat.';
|
||||
|
||||
@override
|
||||
String get whenOpenApp => 'Saat membuka aplikasi';
|
||||
|
||||
@override
|
||||
String get willTakEeffectImmediately => 'Akan segera berlaku';
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
# Generated by the flutter tool
|
||||
name: synthetic_package
|
||||
description: The Flutter application's synthetic package.
|
||||
14
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||
patreon: # Replace with a single Patreon username
|
||||
open_collective: # Replace with a single Open Collective username
|
||||
ko_fi: lollipopkit
|
||||
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||
liberapay: # Replace with a single Liberapay username
|
||||
issuehunt: # Replace with a single IssueHunt username
|
||||
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
|
||||
polar: # Replace with a single Polar username
|
||||
buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
|
||||
custom: ['https://afdian.com/a/lollipopkit'] # Replace with up to 4 custom sponsorship URLs
|
||||
39
.github/workflows/analysis.yml
vendored
Normal file
@@ -0,0 +1,39 @@
|
||||
# This workflow uses actions that are not certified by GitHub.
|
||||
# They are provided by a third-party and are governed by
|
||||
# separate terms of service, privacy policy, and support
|
||||
# documentation.
|
||||
|
||||
name: flutter analysis
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "main" ]
|
||||
pull_request:
|
||||
branches: [ "main" ]
|
||||
|
||||
jobs:
|
||||
check:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: subosito/flutter-action@v2
|
||||
with:
|
||||
channel: 'stable' # or: 'beta', 'dev' or 'master'
|
||||
|
||||
- name: Install dependencies
|
||||
run: flutter pub get
|
||||
|
||||
# Uncomment this step to verify the use of 'dart format' on each commit.
|
||||
- name: Verify formatting
|
||||
run: dart format --output=none .
|
||||
|
||||
# Consider passing '--fatal-infos' for slightly stricter analysis.
|
||||
- name: Analyze project source
|
||||
run: dart analyze
|
||||
|
||||
# Your project will need to have tests in test/ and a dependency on
|
||||
# package:test for this step to succeed. Note that Flutter projects will
|
||||
# want to change this to 'flutter test'.
|
||||
- name: Run tests
|
||||
run: flutter test
|
||||
87
.github/workflows/release.yml
vendored
Normal file
@@ -0,0 +1,87 @@
|
||||
name: Flutter Release
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- "v*"
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
releaseAL:
|
||||
name: Release android and linux
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Install Flutter
|
||||
uses: subosito/flutter-action@v2
|
||||
with:
|
||||
channel: 'stable'
|
||||
flutter-version: '3.22.2'
|
||||
- uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: 'zulu'
|
||||
java-version: '17'
|
||||
- name: Fetch secrets
|
||||
run: |
|
||||
curl -u ${{ secrets.BASIC_AUTH }} -o android/app/app.key ${{ secrets.URL_PREFIX }}app.key
|
||||
curl -u ${{ secrets.BASIC_AUTH }} -o android/key.properties ${{ secrets.URL_PREFIX }}key.properties
|
||||
- name: Build
|
||||
run: dart run fl_build -p android,linux
|
||||
- name: Rename for fdroid
|
||||
run: |
|
||||
mv build/app/outputs/flutter-apk/${{ env.APP_NAME }}_${{ env.BUILD_NUMBER }}_arm64.apk build/app/outputs/flutter-apk/${{ env.APP_NAME }}_v1.0.${{ env.BUILD_NUMBER }}_arm64.apk
|
||||
mv build/app/outputs/flutter-apk/${{ env.APP_NAME }}_${{ env.BUILD_NUMBER }}_arm.apk build/app/outputs/flutter-apk/${{ env.APP_NAME }}_v1.0.${{ env.BUILD_NUMBER }}_arm.apk
|
||||
mv build/app/outputs/flutter-apk/${{ env.APP_NAME }}_${{ env.BUILD_NUMBER }}_amd64.apk build/app/outputs/flutter-apk/${{ env.APP_NAME }}_v1.0.${{ env.BUILD_NUMBER }}_amd64.apk
|
||||
- name: Create Release
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
files: |
|
||||
build/app/outputs/flutter-apk/${{ env.APP_NAME }}_v1.0.${{ env.BUILD_NUMBER }}_arm64.apk
|
||||
build/app/outputs/flutter-apk/${{ env.APP_NAME }}_v1.0.${{ env.BUILD_NUMBER }}_arm.apk
|
||||
build/app/outputs/flutter-apk/${{ env.APP_NAME }}_v1.0.${{ env.BUILD_NUMBER }}_amd64.apk
|
||||
${{ env.APP_NAME }}_${{ env.BUILD_NUMBER }}_amd64.AppImage
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
releaseWin:
|
||||
name: Release windows
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Install Flutter
|
||||
uses: subosito/flutter-action@v2
|
||||
- name: Build
|
||||
run: dart run fl_build -p windows
|
||||
- name: Create Release
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
files: |
|
||||
${{ env.APP_NAME }}_${{ env.BUILD_NUMBER }}_windows_amd64.zip
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
# releaseApple:
|
||||
# name: Release ios and macos
|
||||
# runs-on: macos-latest
|
||||
# steps:
|
||||
# - name: Checkout
|
||||
# uses: actions/checkout@v4
|
||||
# - name: Install Flutter
|
||||
# uses: subosito/flutter-action@v2
|
||||
# with:
|
||||
# channel: 'stable'
|
||||
# flutter-version: '3.22.2'
|
||||
# - name: Build
|
||||
# run: dart run fl_build -p ios,mac
|
||||
# - name: Create Release
|
||||
# uses: softprops/action-gh-release@v2
|
||||
# with:
|
||||
# files: |
|
||||
# ${{ env.APP_NAME }}_universal_macos.zip
|
||||
# ${{ env.APP_NAME }}_universal.ipa
|
||||
# env:
|
||||
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
17
.gitignore
vendored
@@ -48,8 +48,19 @@ app.*.map.json
|
||||
/android/app/fjy.androidstudio.key
|
||||
/release
|
||||
test.dart
|
||||
.fvm
|
||||
|
||||
# Keep generated l10n files
|
||||
/.dart_tool/*
|
||||
!/.dart_tool/flutter_gen
|
||||
# /.dart_tool/*
|
||||
# !/.dart_tool/flutter_gen
|
||||
|
||||
.dart_tool
|
||||
|
||||
# Linux release
|
||||
linux.AppDir
|
||||
**/*.AppImage
|
||||
|
||||
untranlated.json
|
||||
|
||||
.vscode/settings.json
|
||||
more_build_data.json
|
||||
trans.txt
|
||||
|
||||
29
.metadata
@@ -1,11 +1,11 @@
|
||||
# This file tracks properties of this Flutter project.
|
||||
# Used by Flutter tool to assess capabilities and perform upgrades etc.
|
||||
#
|
||||
# This file should be version controlled.
|
||||
# This file should be version controlled and should not be manually edited.
|
||||
|
||||
version:
|
||||
revision: 84a1e904f44f9b0e9c4510138010edcc653163f8
|
||||
channel: stable
|
||||
revision: "761747bfc538b5af34aa0d3fac380f1bc331ec49"
|
||||
channel: "stable"
|
||||
|
||||
project_type: app
|
||||
|
||||
@@ -13,11 +13,26 @@ project_type: app
|
||||
migration:
|
||||
platforms:
|
||||
- platform: root
|
||||
create_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8
|
||||
base_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8
|
||||
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||
- platform: android
|
||||
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||
- platform: ios
|
||||
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||
- platform: linux
|
||||
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||
- platform: macos
|
||||
create_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8
|
||||
base_revision: 84a1e904f44f9b0e9c4510138010edcc653163f8
|
||||
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||
- platform: web
|
||||
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||
- platform: windows
|
||||
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||
|
||||
# User provided section
|
||||
|
||||
|
||||
13
.vscode/launch.json
vendored
@@ -5,12 +5,19 @@
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "toolbox",
|
||||
"name": "debug",
|
||||
"request": "launch",
|
||||
"type": "dart"
|
||||
"type": "dart",
|
||||
"env": {
|
||||
// Comment this line to use the default display
|
||||
"DISPLAY": ":1"
|
||||
}
|
||||
// "args": [
|
||||
// "-v"
|
||||
// ]
|
||||
},
|
||||
{
|
||||
"name": "toolbox (profile mode)",
|
||||
"name": "profile",
|
||||
"request": "launch",
|
||||
"type": "dart",
|
||||
"flutterMode": "profile",
|
||||
|
||||
12
.vscode/settings.json
vendored
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"dart.flutterSdkPath": ".fvm",
|
||||
"files.watcherExclude": {
|
||||
"**/.fvm": true
|
||||
},
|
||||
"git.ignoredRepositories": [
|
||||
".fvm"
|
||||
],
|
||||
"search.exclude": {
|
||||
"**/.fvm": true
|
||||
}
|
||||
}
|
||||
674
LICENSE
Normal file
@@ -0,0 +1,674 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<https://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
||||
135
README.md
@@ -1,20 +1,10 @@
|
||||
English | [简体中文](README_zh.md)
|
||||
<!-- Title-->
|
||||
<p align="center">
|
||||
<img src="imgs/flutter_server_box.png">
|
||||
</p>
|
||||
|
||||
<!-- Badges-->
|
||||
<h2 align="center">Flutter Server Box</h2>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://apps.apple.com/app/id1586449703">
|
||||
<img style="height: 37px" src="imgs/appstore.svg">
|
||||
</a>
|
||||
<a href="https://count.ly/f/badge" rel="nofollow">
|
||||
<img style="height: 37px" src="https://count.ly/badges/dark.svg">
|
||||
</a>
|
||||
<a href="https://github.com/lollipopkit/flutter_server_box/releases/latest">
|
||||
<img style="height: 37px" src="imgs/dl-android.svg">
|
||||
</a>
|
||||
<img alt="lang" src="https://img.shields.io/badge/lang-dart-pink">
|
||||
<img alt="license" src="https://img.shields.io/badge/license-GPLv3-pink">
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
@@ -24,81 +14,70 @@ Especially thanks to <a href="https://github.com/TerminalStudio/dartssh2">dartss
|
||||
</p>
|
||||
|
||||
|
||||
## 📥 Install
|
||||
|
||||
Platform | From
|
||||
--- | ---
|
||||
iOS / macOS | [AppStore](https://apps.apple.com/app/id1586449703)
|
||||
Android | [GitHub](https://github.com/lollipopkit/flutter_server_box/releases) / [CDN](https://cdn.lolli.tech/serverbox/?sort=time&order=desc&layout=grid) / [F-Droid](https://f-droid.org/packages/tech.lolli.toolbox) / [OpenAPK](https://www.openapk.net/serverbox/tech.lolli.toolbox/)
|
||||
Linux / Windows | [GitHub](https://github.com/lollipopkit/flutter_server_box/releases) / [CDN](https://cdn.lolli.tech/serverbox/?sort=time&order=desc&layout=grid)
|
||||
|
||||
**Please only download pkgs from the source that you trust!**
|
||||
- `AppStore` & `CDN` packages are built by myself
|
||||
- Github releases are built by Github Actions
|
||||
- Other sources are built by themselves
|
||||
|
||||
|
||||
## 🔖 Feature
|
||||
- [x] Functions
|
||||
- [x] `SSH` Terminal, `SFTP`
|
||||
- [x] `Docker & Pkg` Manager
|
||||
- [x] `Status` charts
|
||||
- [x] `Code editor`
|
||||
- [x] `Ping` and etc.
|
||||
- [x] Localization ( English, 简体中文, Deutsch, 繁體中文, Indonesian. [l10n guide](#l10n-guide) )
|
||||
- [x] Desktop support
|
||||
- `Status chart` (CPU, Sensors, GPU...), `SSH` Term, `SFTP`, `Docker & Process`...
|
||||
- Platform specific: `Bio auth`、`Msg push`、`Home widget`、`watchOS App`...
|
||||
- English, 简体中文; Deutsch [@its-tom](https://github.com/its-tom), 繁體中文 [@kalashnikov](https://github.com/kalashnikov), Indonesian [@azkadev](https://github.com/azkadev), Français [@FrancXPT](https://github.com/FrancXPT), Dutch [@QazCetelic](https://github.com/QazCetelic); Español, Русский язык, Português, 日本語 (Generated by GPT)
|
||||
|
||||
|
||||
## 📩 Push
|
||||
In order to push server status to your portable device without opening ServerBox app (Such as **message push** and **home widget**), you need to install [ServerBoxMonitor](https://github.com/lollipopkit/server_box_monitor) on your servers, and config it correctly. See [Wiki](https://github.com/lollipopkit/server_box_monitor/wiki) for more details.
|
||||
## 🏙️ ScreenShots
|
||||
<table>
|
||||
<tr>
|
||||
<td><img width="277px" src="https://cdn.lolli.tech/serverbox/screenshot/1.png"></td>
|
||||
<td><img width="277px" src="https://cdn.lolli.tech/serverbox/screenshot/2.png"></td>
|
||||
<td><img width="277px" src="https://cdn.lolli.tech/serverbox/screenshot/3.png"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img width="277px" src="https://cdn.lolli.tech/serverbox/screenshot/4.png"> </td>
|
||||
<td><img width="277px" src="https://cdn.lolli.tech/serverbox/screenshot/5.png"></td>
|
||||
<td><img width="277px" src="https://cdn.lolli.tech/serverbox/screenshot/6.png"></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
## 🆘 Help
|
||||
If you have any question or feature request, please open a [discussion](https://github.com/lollipopkit/flutter_server_box/discussions/new/choose).
|
||||
If ServerBox app has any bug, please open an [issue](https://github.com/lollipopkit/flutter_server_box/issues/new).
|
||||
- In order to push server status to your portable device without opening ServerBox app (Such as **message push** and **home widget**), you need to install [ServerBoxMonitor](https://github.com/lollipopkit/server_box_monitor) on your servers, and config it correctly. See [wiki](https://github.com/lollipopkit/server_box_monitor/wiki) for more details.
|
||||
- **Common issues** can be found in [app wiki](https://github.com/lollipopkit/flutter_server_box/wiki).
|
||||
|
||||
Before you open an issue, please read the following:
|
||||
1. Paste the **entire log** (click the top right of the home page) in the issue template.
|
||||
2. Make sure whether the issue is caused by ServerBox app.
|
||||
3. Welcome all valid and positive feedback, subjective feedback (such as you think other UI is better) may not be accepted.
|
||||
|
||||
## 📱 ScreenShots
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<img width="200px" src="imgs/server.jpeg">
|
||||
</td>
|
||||
<td>
|
||||
<img width="200px" src="imgs/detail.jpg">
|
||||
</td>
|
||||
<td>
|
||||
<img width="200px" src="imgs/ssh.jpg">
|
||||
</td>
|
||||
<td>
|
||||
<img width="200px" src="imgs/editor.jpg">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<img width="200px" src="imgs/ping.png">
|
||||
</td>
|
||||
<td>
|
||||
<img width="200px" src="imgs/sftp.jpeg">
|
||||
</td>
|
||||
<td>
|
||||
<img width="200px" src="imgs/docker.jpeg">
|
||||
</td>
|
||||
<td>
|
||||
<img width="200px" src="imgs/convert.png">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
## 🖥 Platform
|
||||
Status|Platform
|
||||
--- | ---
|
||||
Full Support| Android / iOS / macOS
|
||||
Support, but not tested| Windows / Linux
|
||||
After you read the above, you can open an [issue](https://github.com/lollipopkit/flutter_server_box/issues/new).
|
||||
|
||||
|
||||
## 🧱 Contribution
|
||||
**Any positive contribution is welcome**.
|
||||
10 iOS app redemption codes will be given away for the first time you participate in the contribution. This is the only thing I can do to thank you. :)
|
||||
### l10n guide
|
||||
1. Fork this repo and clone forked repo to your local machine.
|
||||
2. Create `arb` file in `lib/l10n/` directory
|
||||
- File name should be `intl_XX.arb`, where `XX` is the language code. Such as `intl_en.arb` for English and `intl_zh.arb` for Chinese.
|
||||
3. Add content to the file. You can refer to `intl_en.arb` and `intl_zh.arb` for the format.
|
||||
4. Run `flutter gen-l10n` to generate files.
|
||||
5. Pull commit to your forked repo.
|
||||
6. Request a pull request on my repo.
|
||||
Any positive contribution is welcome.
|
||||
|
||||
### Development
|
||||
1. Setup [Flutter](https://flutter.dev/docs/get-started/install) environment.
|
||||
2. Clone this repo, run `flutter run` to start the app.
|
||||
3. Run `dart run fl_build -p PLATFORM` to build the app.
|
||||
|
||||
### Translation
|
||||
- [Guide](https://blog.lpkt.cn/posts/faq/) can be found in my blog.
|
||||
- We need your help! Just feel free to open a PR.
|
||||
|
||||
|
||||
## 💡 My other apps
|
||||
- [GPT Box](https://github.com/lollipopkit/flutter_gpt_box) - A third-party GPT Client for OpenAI API on all platforms.
|
||||
- [More](https://github.com/lollipopkit) - Tools & etc.
|
||||
|
||||
|
||||
## 📝 License
|
||||
1. You can package it for personal use, but you can't distribute it. (For example: You can teach others how to package it to avoid spending money to buy App, but you can't directly distribute the App you packaged.)
|
||||
2. Except for the above, apply the `GPLv3` license.
|
||||
`GPL v3 lollipopkit`
|
||||
|
||||
137
README_zh.md
@@ -1,104 +1,85 @@
|
||||
简体中文 | [English](README.md)
|
||||
<!-- Title-->
|
||||
<p align="center">
|
||||
<img src="imgs/flutter_server_box.png">
|
||||
</p>
|
||||
|
||||
<!-- Badges-->
|
||||
<h2 align="center">Flutter Server Box</h2>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://apps.apple.com/app/id1586449703">
|
||||
<img style="height: 37px" src="imgs/appstore.svg">
|
||||
</a>
|
||||
<a href="https://count.ly/f/badge" rel="nofollow">
|
||||
<img style="height: 37px" src="https://count.ly/badges/dark.svg">
|
||||
</a>
|
||||
<a href="https://github.com/lollipopkit/flutter_server_box/releases/latest">
|
||||
<img style="height: 37px" src="imgs/dl-android.svg">
|
||||
</a>
|
||||
<img alt="lang" src="https://img.shields.io/badge/lang-dart-pink">
|
||||
<img alt="license" src="https://img.shields.io/badge/license-GPLv3-pink">
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
使用 Flutter 开发的 <a href="../../issues/43">Linux</a> 服务器工具箱,提供服务器状态图表和管理工具。
|
||||
<br>
|
||||
特别感谢 <a href="https://github.com/TerminalStudio/dartssh2">dartssh2</a> & <a href="https://github.com/TerminalStudio/xterm.dart">xterm.dart</a>.
|
||||
特别感谢 <a href="https://github.com/TerminalStudio/dartssh2">dartssh2</a> & <a href="https://github.com/TerminalStudio/xterm.dart">xterm.dart</a>。
|
||||
</p>
|
||||
|
||||
## 📥 安装
|
||||
|
||||
平台 | 下载
|
||||
--- | ---
|
||||
iOS / macOS | [AppStore](https://apps.apple.com/app/id1586449703)
|
||||
Android | [GitHub](https://github.com/lollipopkit/flutter_server_box/releases) / [CDN](https://cdn.lolli.tech/serverbox/?sort=time&order=desc&layout=grid) / [F-Droid](https://f-droid.org/packages/tech.lolli.toolbox) / [OpenAPK](https://www.openapk.net/serverbox/tech.lolli.toolbox/)
|
||||
Linux / Windows | [GitHub](https://github.com/lollipopkit/flutter_server_box/releases) / [CDN](https://cdn.lolli.tech/serverbox/?sort=time&order=desc&layout=grid)
|
||||
|
||||
**请不要从不受信任的来源下载!**
|
||||
- `AppStore` & `CDN` 的包由我构建
|
||||
- Github 的包由 Github Actions 构建
|
||||
- 其他来源由其所有者构建
|
||||
|
||||
|
||||
## 🔖 特点
|
||||
- [x] 功能
|
||||
- [x] `SSH` 终端, `SFTP`
|
||||
- [x] `Docker & 包` 管理器
|
||||
- [x] 状态图表
|
||||
- [x] 代码编辑器
|
||||
- [x] `Ping` 和 更多
|
||||
- [x] 本地化 ( English, 简体中文, Deutsch, 繁體中文, Indonesian。 [如何贡献?](#l10n))
|
||||
- [x] 桌面端支持
|
||||
- `状态图表`(CPU、传感器、GPU 等), `SSH` 终端, `SFTP`, `Docker & 进程` 管理...
|
||||
- 特殊支持:`生物认证`、`推送`、`桌面小部件`、`watchOS App`、`跟随系统颜色`...
|
||||
- 本地化
|
||||
- English, 简体中文
|
||||
- Español, Русский язык, Português, 日本語 (Generated by GPT)
|
||||
- Deutsch (@its-tom) / 繁體中文 (@kalashnikov) / Indonesian (@azkadev) / Français (@FrancXPT) / Dutch (@QazCetelic)
|
||||
|
||||
|
||||
## 📩 推送
|
||||
为了可以在不使用 ServerBox app 时获取服务器状态(例如:桌面小部件、推送服务),你需要在你的服务器上安装 [ServerBoxMonitor](https://github.com/lollipopkit/server_box_monitor),并且正确配置,详情可见 [Wiki](https://github.com/lollipopkit/server_box_monitor/wiki/%E4%B8%BB%E9%A1%B5)。
|
||||
## 🏙️ 截屏
|
||||
<table>
|
||||
<tr>
|
||||
<td><img width="277px" src="https://cdn.lolli.tech/serverbox/screenshot/1.png"></td>
|
||||
<td><img width="277px" src="https://cdn.lolli.tech/serverbox/screenshot/2.png"></td>
|
||||
<td><img width="277px" src="https://cdn.lolli.tech/serverbox/screenshot/3.png"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img width="277px" src="https://cdn.lolli.tech/serverbox/screenshot/4.png"> </td>
|
||||
<td><img width="277px" src="https://cdn.lolli.tech/serverbox/screenshot/5.png"></td>
|
||||
<td><img width="277px" src="https://cdn.lolli.tech/serverbox/screenshot/6.png"></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
## 🆘 帮助
|
||||
如果你有任何问题或者功能请求,请在 [讨论](https://github.com/lollipopkit/flutter_server_box/discussions/new/choose) 中交流。
|
||||
如果 ServerBox app 有任何 bug,请在 [问题](https://github.com/lollipopkit/flutter_server_box/issues/new) 中反馈。
|
||||
|
||||
- 吹水、参与开发、了解如何使用,QQ群 **762870488**
|
||||
- 为了可以在不使用 ServerBox app 时获取服务器状态(例如:桌面小部件、推送服务),你需要在你的服务器上安装 [ServerBoxMonitor](https://github.com/lollipopkit/server_box_monitor),并且正确配置,详情可见 [wiki](https://github.com/lollipopkit/server_box_monitor/wiki/%E4%B8%BB%E9%A1%B5)。
|
||||
- **常见问题**可以在 [app wiki](https://github.com/lollipopkit/flutter_server_box/wiki/主页) 查看。
|
||||
|
||||
## 📱 截屏
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<img width="200px" src="imgs/server.jpeg">
|
||||
</td>
|
||||
<td>
|
||||
<img width="200px" src="imgs/detail.jpg">
|
||||
</td>
|
||||
<td>
|
||||
<img width="200px" src="imgs/ssh.jpg">
|
||||
</td>
|
||||
<td>
|
||||
<img width="200px" src="imgs/editor.jpg">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<img width="200px" src="imgs/ping.png">
|
||||
</td>
|
||||
<td>
|
||||
<img width="200px" src="imgs/sftp.jpeg">
|
||||
</td>
|
||||
<td>
|
||||
<img width="200px" src="imgs/docker.jpeg">
|
||||
</td>
|
||||
<td>
|
||||
<img width="200px" src="imgs/convert.png">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
反馈前须知:
|
||||
1. 反馈问题请附带 log(点击首页右上角),并以 bug 模版提交。
|
||||
2. 反馈问题前请检查是否是 serverbox 的问题。
|
||||
3. 欢迎所有有效、正面的反馈,主观(比如你觉得其他UI更好看)的反馈不一定会接受
|
||||
|
||||
确认了解上述内容后,请在 [问题](https://github.com/lollipopkit/flutter_server_box/issues/new) 中反馈。
|
||||
|
||||
## 🖥 平台
|
||||
状态|平台
|
||||
--- | ---
|
||||
完整支持 | Android / iOS / macOS
|
||||
可能支持,未测试 | Windows / Linux
|
||||
|
||||
## 🧱 贡献
|
||||
**任何正面的贡献都欢迎**.
|
||||
第一次参与贡献,会赠送 10 份 iOS App 兑换码。这是我唯一能送的。你可以同来送给其他人。:)
|
||||
任何正面的贡献都欢迎。
|
||||
|
||||
### l10n
|
||||
1. Fork 本项目,并 Clone 你 Fork 的项目至你的电脑
|
||||
2. 在 `lib/l10n/` 文件夹内创建 `.arb` 本地化文件
|
||||
- 文件名应该类似 `intl_XX.arb`, `XX` 是语言标识码。 例如 `intl_en.arb` 是给英语的, `intl_zh.arb` 是给中文的
|
||||
3. 向 `.arb` 本地化文件添加内容。 你可以查看 `intl_en.arb` 和 `intl_zh.arb` 的内容,并理解其含义,来创建新的本地化文件
|
||||
4. 运行 `flutter gen-l10n` 来生成所需文件
|
||||
5. Commit 变更到你的 Fork 的 Repo
|
||||
6. 在我的项目中发起 Pull Request.
|
||||
### 开发
|
||||
1. 安装 [Flutter](https://flutter.dev/docs/get-started/install)
|
||||
2. 克隆这个仓库, 运行 `flutter run` 启动应用
|
||||
3. 运行 `dart run fl_build -p PLATFORM` 构建应用
|
||||
|
||||
### 翻译
|
||||
[指南](https://blog.lolli.tech/faq/) 可在我的博客中找到。
|
||||
|
||||
## 💡 我的其它 Apps
|
||||
- [GPT Box](https://github.com/lollipopkit/flutter_gpt_box) - 支持 OpenAI API 的 第三方全平台客户端。
|
||||
- [更多](https://github.com/lollipopkit) - 工具 & etc.
|
||||
|
||||
|
||||
## 📝 License
|
||||
1. 允许打包自用,但不允许分发(举例:你可以教别人如何打包,避免花钱购买App,但不能与他人分享你打包的App)
|
||||
2. 除去上诉情形:遵循 `GPLv3`
|
||||
## 📝 协议
|
||||
`GPL v3 lollipopkit`
|
||||
|
||||
@@ -9,6 +9,14 @@
|
||||
# packages, and plugins designed to encourage good coding practices.
|
||||
include: package:flutter_lints/flutter.yaml
|
||||
|
||||
analyzer:
|
||||
exclude:
|
||||
- '**/*.g.dart'
|
||||
language:
|
||||
# strict-casts: true
|
||||
# strict-inference: true
|
||||
# strict-raw-types: true
|
||||
|
||||
linter:
|
||||
# The lint rules applied to this project can be customized in the
|
||||
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
|
||||
@@ -24,6 +32,10 @@ linter:
|
||||
rules:
|
||||
library_private_types_in_public_api: false
|
||||
use_build_context_synchronously: false
|
||||
depend_on_referenced_packages: false
|
||||
prefer_final_locals: true
|
||||
unnecessary_parenthesis: true
|
||||
implicit_call_tearoffs: true
|
||||
# avoid_print: false # Uncomment to disable the `avoid_print` rule
|
||||
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
|
||||
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
plugins {
|
||||
id "com.android.application"
|
||||
id "kotlin-android"
|
||||
id "dev.flutter.flutter-gradle-plugin"
|
||||
}
|
||||
|
||||
def localProperties = new Properties()
|
||||
def localPropertiesFile = rootProject.file('local.properties')
|
||||
if (localPropertiesFile.exists()) {
|
||||
@@ -10,11 +16,12 @@ def keystoreProperties = new Properties()
|
||||
def keystorePropertiesFile = rootProject.file('key.properties')
|
||||
if (keystorePropertiesFile.exists()) {
|
||||
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
|
||||
} else {
|
||||
System.err.printf(" [!] key.properties not found in %s (%s). Build will fail. \n", rootProject, rootProject.file('.'))
|
||||
}
|
||||
|
||||
def flutterRoot = localProperties.getProperty('flutter.sdk')
|
||||
if (flutterRoot == null) {
|
||||
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
|
||||
if (keystoreProperties['storeFile'] == null || !file(keystoreProperties['storeFile']).exists()) {
|
||||
System.err.printf(" [!] storeFile defined in key.properties does not exist in %s. Build will fail. \n", file('.'))
|
||||
}
|
||||
|
||||
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
|
||||
@@ -27,12 +34,10 @@ if (flutterVersionName == null) {
|
||||
flutterVersionName = '1.0'
|
||||
}
|
||||
|
||||
apply plugin: 'com.android.application'
|
||||
apply plugin: 'kotlin-android'
|
||||
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
|
||||
|
||||
android {
|
||||
compileSdkVersion 33
|
||||
namespace "tech.lolli.toolbox"
|
||||
compileSdk flutter.compileSdkVersion
|
||||
ndkVersion flutter.ndkVersion
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_1_8
|
||||
@@ -48,11 +53,20 @@ android {
|
||||
}
|
||||
|
||||
defaultConfig {
|
||||
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
||||
applicationId "tech.lolli.toolbox"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 30
|
||||
// You can update the following values to match your application needs.
|
||||
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
|
||||
minSdkVersion flutter.minSdkVersion
|
||||
targetSdkVersion flutter.targetSdkVersion
|
||||
versionCode flutterVersionCode.toInteger()
|
||||
versionName flutterVersionName
|
||||
|
||||
ndk {
|
||||
if(!splits.abi.enable) { // abiFilters cannot be present when splits abi filters are set
|
||||
abiFilters 'arm64-v8a', 'armeabi-v7a'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
signingConfigs {
|
||||
@@ -85,6 +99,15 @@ flutter {
|
||||
source '../..'
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
||||
dependencies {}
|
||||
|
||||
ext.abiCodes = ["x86_64": 1, "armeabi-v7a": 2, "arm64-v8a": 3]
|
||||
import com.android.build.OutputFile
|
||||
android.applicationVariants.all { variant ->
|
||||
variant.outputs.each { output ->
|
||||
def abiVersionCode = project.ext.abiCodes.get(output.getFilter(OutputFile.ABI))
|
||||
if (abiVersionCode != null) {
|
||||
output.versionCodeOverride = variant.versionCode * 10 + abiVersionCode
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
6
android/app/proguard-rules.pro
vendored
@@ -1,7 +1 @@
|
||||
-keep class io.flutter.app.** { *; }
|
||||
-keep class io.flutter.plugin.** { *; }
|
||||
-keep class io.flutter.util.** { *; }
|
||||
-keep class io.flutter.view.** { *; }
|
||||
-keep class io.flutter.** { *; }
|
||||
-keep class io.flutter.plugins.** { *; }
|
||||
-keep class com.jcraft.** { *; }
|
||||
|
||||
@@ -1,18 +1,24 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="tech.lolli.toolbox">
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
|
||||
<uses-permission android:name="android.permission.VIBRATE" />
|
||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||
|
||||
<application
|
||||
android:label="ServerBox"
|
||||
android:name="${applicationName}"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:allowBackup="true"
|
||||
android:hasFragileUserData="true"
|
||||
android:restoreAnyVersion="true">
|
||||
<activity
|
||||
android:name=".MainActivity"
|
||||
android:exported="true"
|
||||
android:launchMode="singleTop"
|
||||
android:theme="@style/LaunchTheme"
|
||||
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
||||
@@ -37,6 +43,10 @@
|
||||
android:name="flutterEmbedding"
|
||||
android:value="2" />
|
||||
|
||||
<service
|
||||
android:name="id.flutter.flutter_background_service.BackgroundService"
|
||||
android:foregroundServiceType="dataSync"
|
||||
/>
|
||||
|
||||
<receiver
|
||||
android:name=".widget.HomeWidget"
|
||||
@@ -56,5 +66,18 @@
|
||||
android:name="android.appwidget.provider"
|
||||
android:resource="@xml/home_widget" />
|
||||
</receiver>
|
||||
|
||||
<service android:name=".KeepAliveService"/>
|
||||
</application>
|
||||
<!-- Required to query activities that can process text, see:
|
||||
https://developer.android.com/training/package-visibility?hl=en and
|
||||
https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.
|
||||
|
||||
In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
|
||||
<queries>
|
||||
<intent>
|
||||
<action android:name="android.intent.action.PROCESS_TEXT"/>
|
||||
<data android:mimeType="text/plain"/>
|
||||
</intent>
|
||||
</queries>
|
||||
</manifest>
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
package tech.lolli.toolbox
|
||||
|
||||
import android.app.Service
|
||||
import android.content.Intent
|
||||
|
||||
import android.os.IBinder
|
||||
import org.jetbrains.annotations.Nullable
|
||||
|
||||
class KeepAliveService : Service() {
|
||||
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
||||
return START_STICKY
|
||||
}
|
||||
|
||||
@Nullable
|
||||
override fun onBind(intent: Intent?): IBinder? {
|
||||
return null
|
||||
}
|
||||
}
|
||||
@@ -1,21 +1,29 @@
|
||||
package tech.lolli.toolbox
|
||||
|
||||
import io.flutter.embedding.android.FlutterActivity
|
||||
import android.content.Intent
|
||||
import io.flutter.embedding.android.FlutterFragmentActivity
|
||||
import io.flutter.embedding.engine.FlutterEngine
|
||||
import io.flutter.plugin.common.MethodChannel
|
||||
|
||||
class MainActivity : FlutterActivity() {
|
||||
class MainActivity: FlutterFragmentActivity() {
|
||||
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
|
||||
super.configureFlutterEngine(flutterEngine)
|
||||
val binaryMessenger = flutterEngine.dartExecutor.binaryMessenger
|
||||
|
||||
MethodChannel(binaryMessenger, "tech.lolli.toolbox/app_retain").apply {
|
||||
setMethodCallHandler { method, result ->
|
||||
if (method.method == "sendToBackground") {
|
||||
moveTaskToBack(true)
|
||||
result.success(null)
|
||||
} else {
|
||||
result.notImplemented()
|
||||
when (method.method) {
|
||||
"sendToBackground" -> {
|
||||
moveTaskToBack(true)
|
||||
result.success(null)
|
||||
}
|
||||
"startService" -> {
|
||||
val intent = Intent(this@MainActivity, KeepAliveService::class.java)
|
||||
startService(intent)
|
||||
}
|
||||
else -> {
|
||||
result.notImplemented()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import android.appwidget.AppWidgetManager
|
||||
import android.appwidget.AppWidgetProvider
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.os.Build
|
||||
import android.view.View
|
||||
import android.widget.RemoteViews
|
||||
import kotlinx.coroutines.DelicateCoroutinesApi
|
||||
@@ -37,11 +38,16 @@ class HomeWidget : AppWidgetProvider() {
|
||||
val ids = intArrayOf(appWidgetId)
|
||||
intentUpdate.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids)
|
||||
|
||||
var flag = PendingIntent.FLAG_UPDATE_CURRENT
|
||||
if (Build.VERSION_CODES.O <= Build.VERSION.SDK_INT) {
|
||||
flag = PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
|
||||
}
|
||||
|
||||
val pendingUpdate: PendingIntent = PendingIntent.getBroadcast(
|
||||
context,
|
||||
appWidgetId,
|
||||
intentUpdate,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT)
|
||||
flag)
|
||||
views.setOnClickPendingIntent(R.id.widget_container, pendingUpdate)
|
||||
|
||||
if (url.isNullOrEmpty()) {
|
||||
@@ -52,36 +58,53 @@ class HomeWidget : AppWidgetProvider() {
|
||||
views.setTextViewText(R.id.widget_name, "ID: $appWidgetId")
|
||||
appWidgetManager.updateAppWidget(appWidgetId, views)
|
||||
return
|
||||
} else {
|
||||
views.setViewVisibility(R.id.widget_cpu_label, View.VISIBLE)
|
||||
views.setViewVisibility(R.id.widget_mem_label, View.VISIBLE)
|
||||
views.setViewVisibility(R.id.widget_disk_label, View.VISIBLE)
|
||||
views.setViewVisibility(R.id.widget_net_label, View.VISIBLE)
|
||||
}
|
||||
|
||||
GlobalScope.launch(Dispatchers.IO) {
|
||||
val jsonStr = URL(url).readText()
|
||||
val jsonObject = JSONObject(jsonStr)
|
||||
val data = jsonObject.getJSONObject("data")
|
||||
val server = data.getString("name")
|
||||
val cpu = data.getString("cpu")
|
||||
val mem = data.getString("mem")
|
||||
val disk = data.getString("disk")
|
||||
val net = data.getString("net")
|
||||
try {
|
||||
val jsonStr = URL(url).readText()
|
||||
val jsonObject = JSONObject(jsonStr)
|
||||
val data = jsonObject.getJSONObject("data")
|
||||
val server = data.getString("name")
|
||||
val cpu = data.getString("cpu")
|
||||
val mem = data.getString("mem")
|
||||
val disk = data.getString("disk")
|
||||
val net = data.getString("net")
|
||||
|
||||
GlobalScope.launch(Dispatchers.Main) {
|
||||
// mem or disk is empty -> get status failed
|
||||
// (cpu | net) isEmpty -> data is not ready
|
||||
if (mem.isEmpty() || disk.isEmpty()) {
|
||||
return@launch
|
||||
GlobalScope.launch(Dispatchers.Main) main@ {
|
||||
// mem or disk is empty -> get status failed
|
||||
// (cpu | net) isEmpty -> data is not ready
|
||||
if (mem.isEmpty() || disk.isEmpty()) {
|
||||
return@main
|
||||
}
|
||||
views.setTextViewText(R.id.widget_name, server)
|
||||
|
||||
views.setTextViewText(R.id.widget_cpu, cpu)
|
||||
views.setTextViewText(R.id.widget_mem, mem)
|
||||
views.setTextViewText(R.id.widget_disk, disk)
|
||||
views.setTextViewText(R.id.widget_net, net)
|
||||
|
||||
val timeStr = android.text.format.DateFormat.format("HH:mm", java.util.Date()).toString()
|
||||
views.setTextViewText(R.id.widget_time, timeStr)
|
||||
|
||||
appWidgetManager.updateAppWidget(appWidgetId, views)
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
println("ServerBoxHomeWidget: ${e.localizedMessage}")
|
||||
GlobalScope.launch(Dispatchers.Main) main@ {
|
||||
views.setViewVisibility(R.id.widget_cpu_label, View.INVISIBLE)
|
||||
views.setViewVisibility(R.id.widget_mem_label, View.INVISIBLE)
|
||||
views.setViewVisibility(R.id.widget_disk_label, View.INVISIBLE)
|
||||
views.setViewVisibility(R.id.widget_net_label, View.INVISIBLE)
|
||||
views.setTextViewText(R.id.widget_name, "ID: $appWidgetId")
|
||||
views.setTextViewText(R.id.widget_mem, e.localizedMessage)
|
||||
appWidgetManager.updateAppWidget(appWidgetId, views)
|
||||
}
|
||||
views.setTextViewText(R.id.widget_name, server)
|
||||
|
||||
views.setTextViewText(R.id.widget_cpu, cpu)
|
||||
views.setTextViewText(R.id.widget_mem, mem)
|
||||
views.setTextViewText(R.id.widget_disk, disk)
|
||||
views.setTextViewText(R.id.widget_net, net)
|
||||
|
||||
// eg: 17:17
|
||||
val timeStr = android.text.format.DateFormat.format("HH:mm", java.util.Date()).toString()
|
||||
views.setTextViewText(R.id.widget_time, timeStr)
|
||||
|
||||
appWidgetManager.updateAppWidget(appWidgetId, views)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
android:textColor="@color/widgetText"
|
||||
android:textSize="23sp"
|
||||
android:textStyle="bold"
|
||||
android:maxLines="1"
|
||||
tools:text="Server Name" />
|
||||
|
||||
<RelativeLayout
|
||||
|
||||
@@ -1,16 +1,3 @@
|
||||
buildscript {
|
||||
ext.kotlin_version = '1.8.0'
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:7.0.2'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
}
|
||||
}
|
||||
|
||||
allprojects {
|
||||
repositories {
|
||||
google()
|
||||
@@ -21,6 +8,8 @@ allprojects {
|
||||
rootProject.buildDir = '../build'
|
||||
subprojects {
|
||||
project.buildDir = "${rootProject.buildDir}/${project.name}"
|
||||
}
|
||||
subprojects {
|
||||
project.evaluationDependsOn(':app')
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
org.gradle.jvmargs=-Xmx1536M
|
||||
org.gradle.jvmargs=-Xmx4G
|
||||
android.useAndroidX=true
|
||||
android.enableJetifier=true
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#Fri Jun 23 08:50:38 CEST 2017
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-all.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-all.zip
|
||||
distributionSha256Sum=6001aba9b2204d26fa25a5800bb9382cf3ee01ccb78fe77317b2872336eb2f80
|
||||
|
||||
@@ -1,11 +1,26 @@
|
||||
include ':app'
|
||||
pluginManagement {
|
||||
def flutterSdkPath = {
|
||||
def properties = new Properties()
|
||||
file("local.properties").withInputStream { properties.load(it) }
|
||||
def flutterSdkPath = properties.getProperty("flutter.sdk")
|
||||
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
|
||||
return flutterSdkPath
|
||||
}
|
||||
settings.ext.flutterSdkPath = flutterSdkPath()
|
||||
|
||||
def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
|
||||
def properties = new Properties()
|
||||
includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle")
|
||||
|
||||
assert localPropertiesFile.exists()
|
||||
localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
gradlePluginPortal()
|
||||
}
|
||||
}
|
||||
|
||||
def flutterSdkPath = properties.getProperty("flutter.sdk")
|
||||
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
|
||||
apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
|
||||
plugins {
|
||||
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
|
||||
id "com.android.application" version "7.4.2" apply false
|
||||
id "org.jetbrains.kotlin.android" version "1.8.10" apply false
|
||||
}
|
||||
|
||||
include ":app"
|
||||
|
||||
1
devtools_options.yaml
Normal file
@@ -0,0 +1 @@
|
||||
extensions:
|
||||
6
fastlane/metadata/android/en-US/full_description.txt
Normal file
@@ -0,0 +1,6 @@
|
||||
A Flutter project which provide charts to display Linux server status and tools to manage server.
|
||||
Especially thanks to dartssh2 & xterm.dart.
|
||||
|
||||
* Status chart (CPU, Sensors, GPU...), SSH Term, SFTP, Docker & Pkg & Process...
|
||||
* Platform specific: Bio auth、Msg push、Home widget、watchOS App...
|
||||
* English, 简体中文; Deutsch, 繁體中文, Indonesian, Français, Dutch; Español, Русский язык, Português, 日本語
|
||||
BIN
fastlane/metadata/android/en-US/images/icon.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
fastlane/metadata/android/en-US/images/phoneScreenshots/1.png
Normal file
|
After Width: | Height: | Size: 135 KiB |
BIN
fastlane/metadata/android/en-US/images/phoneScreenshots/2.png
Normal file
|
After Width: | Height: | Size: 115 KiB |
BIN
fastlane/metadata/android/en-US/images/phoneScreenshots/3.png
Normal file
|
After Width: | Height: | Size: 173 KiB |
BIN
fastlane/metadata/android/en-US/images/phoneScreenshots/4.png
Normal file
|
After Width: | Height: | Size: 135 KiB |
BIN
fastlane/metadata/android/en-US/images/phoneScreenshots/5.png
Normal file
|
After Width: | Height: | Size: 135 KiB |
BIN
fastlane/metadata/android/en-US/images/phoneScreenshots/6.png
Normal file
|
After Width: | Height: | Size: 144 KiB |
1
fastlane/metadata/android/en-US/short_description.txt
Normal file
@@ -0,0 +1 @@
|
||||
A server status & toolbox app using Flutter
|
||||
1
fastlane/metadata/android/en-US/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
ServerBox
|
||||
7
fastlane/metadata/android/zh-CN/full_description.txt
Normal file
@@ -0,0 +1,7 @@
|
||||
使用 Flutter 开发的 Linux 服务器工具箱,提供服务器状态图表和管理工具。
|
||||
特别感谢 dartssh2 & xterm.dart。
|
||||
|
||||
特点:
|
||||
* 状态图表(CPU、传感器、GPU 等), SSH 终端, SFTP, Docker & 包 & 进程管理器...
|
||||
* 特殊支持:生物认证、推送、桌面小部件、watchOS App、跟随系统颜色...
|
||||
* 本地化 (English, 简体中文, Español, Русский язык, Português, 日本語, Deutsch, 繁體中文, Indonesian, Français, Dutch
|
||||
BIN
fastlane/metadata/android/zh-CN/images/icon.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
fastlane/metadata/android/zh-CN/images/phoneScreenshots/1.png
Normal file
|
After Width: | Height: | Size: 135 KiB |
BIN
fastlane/metadata/android/zh-CN/images/phoneScreenshots/2.png
Normal file
|
After Width: | Height: | Size: 115 KiB |
BIN
fastlane/metadata/android/zh-CN/images/phoneScreenshots/3.png
Normal file
|
After Width: | Height: | Size: 173 KiB |
BIN
fastlane/metadata/android/zh-CN/images/phoneScreenshots/4.png
Normal file
|
After Width: | Height: | Size: 135 KiB |
BIN
fastlane/metadata/android/zh-CN/images/phoneScreenshots/5.png
Normal file
|
After Width: | Height: | Size: 135 KiB |
BIN
fastlane/metadata/android/zh-CN/images/phoneScreenshots/6.png
Normal file
|
After Width: | Height: | Size: 144 KiB |
1
fastlane/metadata/android/zh-CN/short_description.txt
Normal file
@@ -0,0 +1 @@
|
||||
使用 Flutter 开发的服务器状态和工具箱应用
|
||||
1
fastlane/metadata/android/zh-CN/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
ServerBox
|
||||
4
fl_build.json
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"appName": "ServerBox",
|
||||
"beforeBuild": "./make.dart before"
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
<svg width="360" height="120" viewBox="0 0 360 120" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M0 16C0 7.16344 7.16344 0 16 0H344C352.837 0 360 7.16344 360 16V104C360 112.837 352.837 120 344 120H16C7.16344 120 0 112.837 0 104V16Z" fill="black"/>
|
||||
<path d="M1.50391 5.49902V21H6.71387C11.3223 21 14.0293 18.1318 14.0293 13.2441C14.0293 8.36719 11.3115 5.49902 6.71387 5.49902H1.50391ZM3.4375 7.23926H6.58496C10.1084 7.23926 12.0527 9.3877 12.0527 13.2656C12.0527 17.1113 10.0977 19.2598 6.58496 19.2598H3.4375V7.23926ZM20.7754 21.1934C23.8584 21.1934 25.9424 18.9697 25.9424 15.4141C25.9424 11.8477 23.8584 9.63477 20.7754 9.63477C17.6816 9.63477 15.5977 11.8477 15.5977 15.4141C15.5977 18.9697 17.6816 21.1934 20.7754 21.1934ZM20.7754 19.5498C18.7988 19.5498 17.499 18.0459 17.499 15.4141C17.499 12.7822 18.7988 11.2783 20.7754 11.2783C22.752 11.2783 24.041 12.7822 24.041 15.4141C24.041 18.0459 22.752 19.5498 20.7754 19.5498ZM42.0449 9.82812H40.1973L37.9629 18.916H37.9199L35.3848 9.82812H33.5801L31.0557 18.916H31.0127L28.7783 9.82812H26.9199L30.0459 21H31.9473L34.4609 12.3525H34.5039L37.0283 21H38.9297L42.0449 9.82812ZM43.5811 21H45.4502V14.4258C45.4502 12.5352 46.5996 11.2891 48.3613 11.2891C50.0801 11.2891 50.9287 12.2773 50.9287 14.082V21H52.7979V13.749C52.7979 11.2139 51.3799 9.63477 48.9307 9.63477C47.2012 9.63477 46.0088 10.4082 45.3857 11.6113H45.3428V9.82812H43.5811V21ZM55.2793 21H57.1484V5.49902H55.2793V21ZM64.3027 21.1934C67.3857 21.1934 69.4697 18.9697 69.4697 15.4141C69.4697 11.8477 67.3857 9.63477 64.3027 9.63477C61.209 9.63477 59.125 11.8477 59.125 15.4141C59.125 18.9697 61.209 21.1934 64.3027 21.1934ZM64.3027 19.5498C62.3262 19.5498 61.0264 18.0459 61.0264 15.4141C61.0264 12.7822 62.3262 11.2783 64.3027 11.2783C66.2793 11.2783 67.5684 12.7822 67.5684 15.4141C67.5684 18.0459 66.2793 19.5498 64.3027 19.5498ZM75.0449 19.6035C73.7021 19.6035 72.8105 18.9053 72.8105 17.8418C72.8105 16.7891 73.6699 16.123 75.1738 16.0264L78.1602 15.8438V16.7568C78.1602 18.3682 76.8066 19.6035 75.0449 19.6035ZM74.626 21.1934C76.1299 21.1934 77.5479 20.3555 78.2139 19.0771H78.2568V21H80.0293V13.2764C80.0293 11.0527 78.375 9.63477 75.7539 9.63477C73.1113 9.63477 71.457 11.1172 71.3281 13.0508H73.1328C73.3691 11.9551 74.2715 11.2783 75.7109 11.2783C77.2578 11.2783 78.1602 12.0947 78.1602 13.459V14.3936L74.959 14.5762C72.3809 14.7266 70.9092 15.9297 70.9092 17.8418C70.9092 19.8506 72.4023 21.1934 74.626 21.1934ZM86.6357 21.1934C88.2471 21.1934 89.5254 20.3984 90.2451 19.1094H90.2773V21H92.0605V5.49902H90.1914V11.6436H90.1484C89.4824 10.4189 88.1934 9.63477 86.5928 9.63477C83.7783 9.63477 81.8555 11.9121 81.8555 15.4141C81.8555 18.916 83.7891 21.1934 86.6357 21.1934ZM86.9902 11.2783C88.9131 11.2783 90.2021 12.9219 90.2021 15.4141C90.2021 17.917 88.9131 19.5498 86.9902 19.5498C85.0137 19.5498 83.7676 17.9492 83.7676 15.4141C83.7676 12.8896 85.0137 11.2783 86.9902 11.2783ZM103.727 21.1934C106.81 21.1934 108.894 18.9697 108.894 15.4141C108.894 11.8477 106.81 9.63477 103.727 9.63477C100.633 9.63477 98.5488 11.8477 98.5488 15.4141C98.5488 18.9697 100.633 21.1934 103.727 21.1934ZM103.727 19.5498C101.75 19.5498 100.45 18.0459 100.45 15.4141C100.45 12.7822 101.75 11.2783 103.727 11.2783C105.703 11.2783 106.992 12.7822 106.992 15.4141C106.992 18.0459 105.703 19.5498 103.727 19.5498ZM110.784 21H112.653V14.4258C112.653 12.5352 113.803 11.2891 115.564 11.2891C117.283 11.2891 118.132 12.2773 118.132 14.082V21H120.001V13.749C120.001 11.2139 118.583 9.63477 116.134 9.63477C114.404 9.63477 113.212 10.4082 112.589 11.6113H112.546V9.82812H110.784V21ZM127.499 7.13184V9.82812H125.834V11.3643H127.499V18.0996C127.499 20.248 128.294 21.0859 130.346 21.0859C130.786 21.0859 131.302 21.0537 131.527 21V19.4316C131.398 19.4531 130.969 19.4854 130.754 19.4854C129.798 19.4854 129.368 19.0234 129.368 18.0029V11.3643H131.538V9.82812H129.368V7.13184H127.499ZM133.633 21H135.502V14.4902C135.502 12.5566 136.651 11.2891 138.51 11.2891C140.261 11.2891 141.152 12.3525 141.152 14.125V21H143.021V13.7812C143.021 11.2891 141.539 9.63477 139.09 9.63477C137.393 9.63477 136.168 10.3652 135.545 11.6113H135.502V5.49902H133.633V21ZM149.875 11.2568C151.637 11.2568 152.808 12.5889 152.851 14.458H146.781C146.899 12.5996 148.124 11.2568 149.875 11.2568ZM152.808 17.7988C152.496 18.8516 151.454 19.5713 150.036 19.5713C148.027 19.5713 146.771 18.1641 146.771 16.0264V15.9189H154.784V15.21C154.784 11.8262 152.926 9.63477 149.907 9.63477C146.824 9.63477 144.848 11.9873 144.848 15.457C144.848 18.9697 146.792 21.1934 149.993 21.1934C152.432 21.1934 154.322 19.7539 154.645 17.7988H152.808Z" transform="translate(112 21)" fill="white"/>
|
||||
<path d="M24.4694 44H29.7926L18.0905 11.5889H12.6549L0.952774 44H6.18617L9.15102 35.2402H21.5045L24.4694 44ZM15.2604 16.9795H15.3952L20.2243 31.1973H10.4313L15.2604 16.9795ZM46.0085 19.9893C42.5945 19.9893 39.8767 21.7188 38.4841 24.4365H38.3943V20.3711H33.6999V51.8164H38.5515V40.1143H38.6638C40.0114 42.7422 42.7068 44.4043 46.0984 44.4043C52.028 44.4043 55.9587 39.665 55.9587 32.1855C55.9587 24.7061 52.0056 19.9893 46.0085 19.9893ZM44.7282 40.2939C40.9997 40.2939 38.529 37.1045 38.529 32.1855C38.529 27.3115 41.0222 24.0771 44.7282 24.0771C48.5691 24.0771 50.9724 27.2441 50.9724 32.1855C50.9724 37.1494 48.5691 40.2939 44.7282 40.2939ZM72.9383 19.9893C69.5242 19.9893 66.8064 21.7188 65.4139 24.4365H65.324V20.3711H60.6297V51.8164H65.4813V40.1143H65.5936C66.9412 42.7422 69.6365 44.4043 73.0281 44.4043C78.9578 44.4043 82.8885 39.665 82.8885 32.1855C82.8885 24.7061 78.9354 19.9893 72.9383 19.9893ZM71.658 40.2939C67.9295 40.2939 65.4588 37.1045 65.4588 32.1855C65.4588 27.3115 67.952 24.0771 71.658 24.0771C75.4988 24.0771 77.9021 27.2441 77.9021 32.1855C77.9021 37.1494 75.4988 40.2939 71.658 40.2939ZM96.9697 34.9707C97.2841 40.833 102.136 44.5391 109.323 44.5391C117.005 44.5391 121.834 40.7432 121.834 34.6787C121.834 29.9395 119.071 27.2666 112.423 25.6943L108.852 24.8184C104.674 23.7852 102.967 22.4375 102.967 20.1465C102.967 17.2715 105.64 15.2949 109.548 15.2949C113.456 15.2949 116.129 17.249 116.421 20.4834H121.317C121.16 14.8906 116.466 11.0498 109.615 11.0498C102.697 11.0498 97.8232 14.8906 97.8232 20.4834C97.8232 24.998 100.586 27.7832 106.538 29.2207L110.738 30.2314C114.938 31.2646 116.713 32.7695 116.713 35.2852C116.713 38.1826 113.77 40.2939 109.683 40.2939C105.415 40.2939 102.293 38.1826 101.934 34.9707H96.9697ZM128.1 14.7783V20.3711H124.663V24.2119H128.1V37.7783C128.1 42.3379 129.964 44.1572 134.748 44.1572C135.826 44.1572 136.904 44.0674 137.443 43.9326V40.0918C137.129 40.1592 136.343 40.2041 135.849 40.2041C133.872 40.2041 132.974 39.2832 132.974 37.2393V24.2119H137.466V20.3711H132.974V14.7783H128.1ZM151.952 44.4492C158.713 44.4492 163.16 39.7998 163.16 32.1855C163.16 24.5938 158.691 19.9443 151.952 19.9443C145.214 19.9443 140.744 24.5938 140.744 32.1855C140.744 39.7998 145.192 44.4492 151.952 44.4492ZM151.952 40.4512C148.156 40.4512 145.686 37.4414 145.686 32.1855C145.686 26.9521 148.156 23.9424 151.952 23.9424C155.748 23.9424 158.219 26.9521 158.219 32.1855C158.219 37.4414 155.771 40.4512 151.952 40.4512ZM167.831 44H172.683V29.8496C172.683 26.5029 174.614 24.4141 177.737 24.4141C178.68 24.4141 179.533 24.5264 179.915 24.6836V20.1689C179.556 20.1016 178.949 19.9893 178.253 19.9893C175.468 19.9893 173.357 21.6289 172.571 24.3916H172.458V20.3711H167.831V44ZM192.695 23.8525C196.086 23.8525 198.377 26.3906 198.49 30.0068H186.675C186.922 26.4355 189.303 23.8525 192.695 23.8525ZM198.467 37.0596C197.816 39.126 195.772 40.5186 193.009 40.5186C189.123 40.5186 186.653 37.8008 186.653 33.6904V33.3984H203.341V31.7363C203.341 24.5713 199.253 19.9443 192.695 19.9443C186.024 19.9443 181.756 24.8857 181.756 32.2979C181.756 39.7549 185.956 44.4492 192.897 44.4492C198.31 44.4492 202.398 41.3721 203.072 37.0596H198.467Z" transform="translate(112 46)" fill="white"/>
|
||||
<path d="M58.7425 55.4758C57.6652 57.9629 56.3901 60.2522 54.9128 62.357C52.899 65.2263 51.2502 67.2125 49.9795 68.3154C48.0097 70.1257 45.8992 71.0529 43.6392 71.1056C42.0167 71.1056 40.0601 70.6443 37.7825 69.7083C35.4974 68.7768 33.3975 68.3154 31.4774 68.3154C29.4636 68.3154 27.3038 68.7768 24.9937 69.7083C22.6801 70.6443 20.8162 71.132 19.3912 71.1803C17.2239 71.2726 15.0638 70.3191 12.9075 68.3154C11.5313 67.1158 9.80991 65.0594 7.74776 62.1461C5.53525 59.0351 3.71625 55.4275 2.29122 51.3146C0.765059 46.8722 0 42.5704 0 38.4057C0 33.635 1.03151 29.5204 3.09761 26.0723C4.72138 23.3027 6.88158 21.118 9.58523 19.5142C12.2889 17.9103 15.2102 17.093 18.3561 17.0407C20.0775 17.0407 22.3349 17.5729 25.1401 18.6186C27.9374 19.668 29.7335 20.2001 30.521 20.2001C31.1098 20.2001 33.1051 19.5779 36.4876 18.3374C39.6864 17.187 42.386 16.7107 44.5977 16.8984C50.5906 17.3817 55.0931 19.7427 58.0873 23.9961C52.7275 27.2416 50.0762 31.7873 50.129 37.6187C50.1773 42.1609 51.8262 45.9407 55.0667 48.9418C56.5352 50.3348 58.1753 51.4113 60 52.1759C59.6043 53.3227 59.1866 54.4213 58.7425 55.4758ZM44.9978 1.42413C44.9978 4.98426 43.6963 8.30835 41.1022 11.3851C37.9716 15.0427 34.185 17.1563 30.0787 16.8228C30.0264 16.3957 29.996 15.9462 29.996 15.4738C29.996 12.0561 31.4848 8.39843 34.1287 5.40781C35.4486 3.8936 37.1274 2.63457 39.1631 1.63021C41.1945 0.640834 43.1159 0.093682 44.923 0C44.9758 0.475924 44.9978 0.951892 44.9978 1.42408V1.42413Z" transform="translate(26 23)" fill="white"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 9.1 KiB |
BIN
imgs/apt.png
|
Before Width: | Height: | Size: 185 KiB |
BIN
imgs/convert.png
|
Before Width: | Height: | Size: 143 KiB |
BIN
imgs/detail.jpg
|
Before Width: | Height: | Size: 297 KiB |
|
Before Width: | Height: | Size: 5.8 KiB |
BIN
imgs/docker.jpeg
|
Before Width: | Height: | Size: 190 KiB |
BIN
imgs/editor.jpg
|
Before Width: | Height: | Size: 596 KiB |
|
Before Width: | Height: | Size: 37 KiB |
BIN
imgs/ping.png
|
Before Width: | Height: | Size: 138 KiB |
BIN
imgs/server.jpeg
|
Before Width: | Height: | Size: 273 KiB |
BIN
imgs/sftp.jpeg
|
Before Width: | Height: | Size: 323 KiB |
BIN
imgs/ssh.jpg
|
Before Width: | Height: | Size: 168 KiB |
@@ -21,6 +21,6 @@
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1.0</string>
|
||||
<key>MinimumOSVersion</key>
|
||||
<string>11.0</string>
|
||||
<string>12.0</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Uncomment this line to define a global platform for your project
|
||||
# platform :ios, '11.0'
|
||||
# platform :ios, '12.0'
|
||||
|
||||
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
|
||||
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
||||
|
||||
@@ -1,17 +1,25 @@
|
||||
PODS:
|
||||
- countly_flutter (23.6.0):
|
||||
- device_info_plus (0.0.1):
|
||||
- Flutter
|
||||
- file_picker (0.0.1):
|
||||
- Flutter
|
||||
- Flutter (1.0.0)
|
||||
- flutter_background_service_ios (0.0.3):
|
||||
- Flutter
|
||||
- flutter_native_splash (0.0.1):
|
||||
- Flutter
|
||||
- icloud_storage (0.0.1):
|
||||
- Flutter
|
||||
- local_auth_darwin (0.0.1):
|
||||
- Flutter
|
||||
- package_info_plus (0.4.5):
|
||||
- Flutter
|
||||
- path_provider_foundation (0.0.1):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- plain_notification_token (0.0.1):
|
||||
- permission_handler_apple (9.3.0):
|
||||
- Flutter
|
||||
- r_upgrade (0.0.1):
|
||||
- plain_notification_token (0.0.1):
|
||||
- Flutter
|
||||
- share_plus (0.0.1):
|
||||
- Flutter
|
||||
@@ -20,53 +28,81 @@ PODS:
|
||||
- FlutterMacOS
|
||||
- url_launcher_ios (0.0.1):
|
||||
- Flutter
|
||||
- wakelock_plus (0.0.1):
|
||||
- Flutter
|
||||
- watch_connectivity (0.0.1):
|
||||
- Flutter
|
||||
|
||||
DEPENDENCIES:
|
||||
- countly_flutter (from `.symlinks/plugins/countly_flutter/ios`)
|
||||
- device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
|
||||
- file_picker (from `.symlinks/plugins/file_picker/ios`)
|
||||
- Flutter (from `Flutter`)
|
||||
- flutter_background_service_ios (from `.symlinks/plugins/flutter_background_service_ios/ios`)
|
||||
- flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`)
|
||||
- icloud_storage (from `.symlinks/plugins/icloud_storage/ios`)
|
||||
- local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`)
|
||||
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
|
||||
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
|
||||
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
|
||||
- plain_notification_token (from `.symlinks/plugins/plain_notification_token/ios`)
|
||||
- r_upgrade (from `.symlinks/plugins/r_upgrade/ios`)
|
||||
- share_plus (from `.symlinks/plugins/share_plus/ios`)
|
||||
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
|
||||
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
|
||||
- wakelock_plus (from `.symlinks/plugins/wakelock_plus/ios`)
|
||||
- watch_connectivity (from `.symlinks/plugins/watch_connectivity/ios`)
|
||||
|
||||
EXTERNAL SOURCES:
|
||||
countly_flutter:
|
||||
:path: ".symlinks/plugins/countly_flutter/ios"
|
||||
device_info_plus:
|
||||
:path: ".symlinks/plugins/device_info_plus/ios"
|
||||
file_picker:
|
||||
:path: ".symlinks/plugins/file_picker/ios"
|
||||
Flutter:
|
||||
:path: Flutter
|
||||
flutter_background_service_ios:
|
||||
:path: ".symlinks/plugins/flutter_background_service_ios/ios"
|
||||
flutter_native_splash:
|
||||
:path: ".symlinks/plugins/flutter_native_splash/ios"
|
||||
icloud_storage:
|
||||
:path: ".symlinks/plugins/icloud_storage/ios"
|
||||
local_auth_darwin:
|
||||
:path: ".symlinks/plugins/local_auth_darwin/darwin"
|
||||
package_info_plus:
|
||||
:path: ".symlinks/plugins/package_info_plus/ios"
|
||||
path_provider_foundation:
|
||||
:path: ".symlinks/plugins/path_provider_foundation/darwin"
|
||||
permission_handler_apple:
|
||||
:path: ".symlinks/plugins/permission_handler_apple/ios"
|
||||
plain_notification_token:
|
||||
:path: ".symlinks/plugins/plain_notification_token/ios"
|
||||
r_upgrade:
|
||||
:path: ".symlinks/plugins/r_upgrade/ios"
|
||||
share_plus:
|
||||
:path: ".symlinks/plugins/share_plus/ios"
|
||||
shared_preferences_foundation:
|
||||
:path: ".symlinks/plugins/shared_preferences_foundation/darwin"
|
||||
url_launcher_ios:
|
||||
:path: ".symlinks/plugins/url_launcher_ios/ios"
|
||||
wakelock_plus:
|
||||
:path: ".symlinks/plugins/wakelock_plus/ios"
|
||||
watch_connectivity:
|
||||
:path: ".symlinks/plugins/watch_connectivity/ios"
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
countly_flutter: 4eeee607183664b871589250a0bd049cfd2697eb
|
||||
file_picker: 1d63c4949e05e386da864365f8c13e1e64787675
|
||||
Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
|
||||
flutter_native_splash: 52501b97d1c0a5f898d687f1646226c1f93c56ef
|
||||
path_provider_foundation: eaf5b3e458fc0e5fbb9940fb09980e853fe058b8
|
||||
device_info_plus: 97af1d7e84681a90d0693e63169a5d50e0839a0d
|
||||
file_picker: c79185e70b9b45728cde2a8d8da454e0cb43f287
|
||||
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
|
||||
flutter_background_service_ios: e30e0d3ee69e4cee66272d0c78eacd48c2e94aac
|
||||
flutter_native_splash: edf599c81f74d093a4daf8e17bd7a018854bc778
|
||||
icloud_storage: d9ac7a33ced81df08ba7ea1bf3099cc0ee58f60a
|
||||
local_auth_darwin: 4d56c90c2683319835a61274b57620df9c4520ab
|
||||
package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c
|
||||
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
|
||||
permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2
|
||||
plain_notification_token: b36467dc91939a7b6754267c701bbaca14996ee1
|
||||
r_upgrade: 44d715c61914cce3d01ea225abffe894fd51c114
|
||||
share_plus: 599aa54e4ea31d4b4c0e9c911bcc26c55e791028
|
||||
shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126
|
||||
url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4
|
||||
share_plus: 8875f4f2500512ea181eef553c3e27dba5135aad
|
||||
shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
|
||||
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
|
||||
wakelock_plus: 78ec7c5b202cab7761af8e2b2b3d0671be6c4ae1
|
||||
watch_connectivity: 715eb484685e05846eab74795348a44bb2809b82
|
||||
|
||||
PODFILE CHECKSUM: 7fb15c416f8685fca4966867a8da218ec592ec2e
|
||||
PODFILE CHECKSUM: ec6ef69056f066e8b21a3391082f23b5ad2d37f8
|
||||
|
||||
COCOAPODS: 1.12.1
|
||||
COCOAPODS: 1.15.2
|
||||
|
||||
17
ios/PrivacyInfo.xcprivacy
Normal file
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>NSPrivacyAccessedAPITypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>NSPrivacyAccessedAPITypeReasons</key>
|
||||
<array>
|
||||
<string>CA92.1</string>
|
||||
</array>
|
||||
<key>NSPrivacyAccessedAPIType</key>
|
||||
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -10,6 +10,9 @@
|
||||
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
|
||||
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
|
||||
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
|
||||
7538AEC32BB83FAB002AB82A /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 7538AEC22BB83FAB002AB82A /* PrivacyInfo.xcprivacy */; };
|
||||
7538AEC52BB83FC8002AB82A /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 7538AEC42BB83FC8002AB82A /* PrivacyInfo.xcprivacy */; };
|
||||
7538AEC72BB83FD3002AB82A /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 7538AEC62BB83FD3002AB82A /* PrivacyInfo.xcprivacy */; };
|
||||
9234EA956D1225D388A01660 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C1EB3935F9285537B0516 /* Pods_Runner.framework */; };
|
||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
|
||||
@@ -17,9 +20,21 @@
|
||||
E33A3E392A626DCD009744AB /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E33A3E382A626DCD009744AB /* SwiftUI.framework */; };
|
||||
E33A3E3C2A626DCE009744AB /* StatusWidgetBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = E33A3E3B2A626DCE009744AB /* StatusWidgetBundle.swift */; };
|
||||
E33A3E402A626DCE009744AB /* StatusWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = E33A3E3F2A626DCE009744AB /* StatusWidget.swift */; };
|
||||
E33A3E452A626DD0009744AB /* StatusWidget.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = E33A3E412A626DCE009744AB /* StatusWidget.intentdefinition */; };
|
||||
E33A3E462A626DD0009744AB /* StatusWidget.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = E33A3E412A626DCE009744AB /* StatusWidget.intentdefinition */; };
|
||||
E33A3E492A626DD0009744AB /* StatusWidgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = E33A3E352A626DCD009744AB /* StatusWidgetExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
|
||||
E37C48EA2B9C30EE00E542D2 /* StatusWidget.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = E37C48ED2B9C30EE00E542D2 /* StatusWidget.intentdefinition */; };
|
||||
E37C48EB2B9C30EE00E542D2 /* StatusWidget.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = E37C48ED2B9C30EE00E542D2 /* StatusWidget.intentdefinition */; };
|
||||
E39515CA2AB5AD62003602C1 /* WatchEndApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = E39515C92AB5AD62003602C1 /* WatchEndApp.swift */; };
|
||||
E39515CC2AB5AD62003602C1 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E39515CB2AB5AD62003602C1 /* ContentView.swift */; };
|
||||
E39515D42AB5AD64003602C1 /* ServerBox.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = E39515C72AB5AD62003602C1 /* ServerBox.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
|
||||
E39515DB2AB5AE7F003602C1 /* PhoneConnMgr.swift in Sources */ = {isa = PBXBuildFile; fileRef = E39515DA2AB5AE7F003602C1 /* PhoneConnMgr.swift */; };
|
||||
E39515DD2AB5AE9E003602C1 /* Store.swift in Sources */ = {isa = PBXBuildFile; fileRef = E39515DC2AB5AE9E003602C1 /* Store.swift */; };
|
||||
E39515E02AB5CF97003602C1 /* Watch.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E39515DF2AB5CF97003602C1 /* Watch.xcassets */; };
|
||||
E39A76AE2AB9A2F70067C641 /* Info-Debug.plist in Resources */ = {isa = PBXBuildFile; fileRef = E39A76AB2AB9A2F70067C641 /* Info-Debug.plist */; };
|
||||
E39A76AF2AB9A2F70067C641 /* Info-Release.plist in Resources */ = {isa = PBXBuildFile; fileRef = E39A76AC2AB9A2F70067C641 /* Info-Release.plist */; };
|
||||
E39A76B02AB9A2F70067C641 /* Info-Profile.plist in Resources */ = {isa = PBXBuildFile; fileRef = E39A76AD2AB9A2F70067C641 /* Info-Profile.plist */; };
|
||||
E3AE8AEA2AB601DB000A6459 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3AE8AE92AB601DB000A6459 /* Utils.swift */; };
|
||||
E3AE8AEB2AB601DB000A6459 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3AE8AE92AB601DB000A6459 /* Utils.swift */; };
|
||||
E3AE8AEC2AB601DB000A6459 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3AE8AE92AB601DB000A6459 /* Utils.swift */; };
|
||||
E3DB67ED2A31FE200027B8CB /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E3DB67EB2A31FE200027B8CB /* LaunchScreen.storyboard */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
@@ -31,6 +46,13 @@
|
||||
remoteGlobalIDString = E33A3E342A626DCD009744AB;
|
||||
remoteInfo = StatusWidgetExtension;
|
||||
};
|
||||
E39515D22AB5AD64003602C1 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 97C146E61CF9000F007C117D /* Project object */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = E39515C62AB5AD62003602C1;
|
||||
remoteInfo = "WatchEnd Watch App";
|
||||
};
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXCopyFilesBuildPhase section */
|
||||
@@ -55,6 +77,17 @@
|
||||
name = "Embed Foundation Extensions";
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
E39515D52AB5AD64003602C1 /* Embed Watch Content */ = {
|
||||
isa = PBXCopyFilesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
dstPath = "$(CONTENTS_FOLDER_PATH)/Watch";
|
||||
dstSubfolderSpec = 16;
|
||||
files = (
|
||||
E39515D42AB5AD64003602C1 /* ServerBox.app in Embed Watch Content */,
|
||||
);
|
||||
name = "Embed Watch Content";
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
@@ -65,13 +98,15 @@
|
||||
5A4B3EB10512B2EB8E10213B /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
|
||||
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||
7538AEC22BB83FAB002AB82A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
|
||||
7538AEC42BB83FC8002AB82A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
|
||||
7538AEC62BB83FD3002AB82A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
|
||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
|
||||
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
|
||||
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
|
||||
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
|
||||
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
9C5314B89F1F73A1900CCAFD /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
|
||||
A775F241DEE026555178AC01 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
E33A3E352A626DCD009744AB /* StatusWidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = StatusWidgetExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
@@ -79,9 +114,47 @@
|
||||
E33A3E382A626DCD009744AB /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; };
|
||||
E33A3E3B2A626DCE009744AB /* StatusWidgetBundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusWidgetBundle.swift; sourceTree = "<group>"; };
|
||||
E33A3E3F2A626DCE009744AB /* StatusWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusWidget.swift; sourceTree = "<group>"; };
|
||||
E33A3E412A626DCE009744AB /* StatusWidget.intentdefinition */ = {isa = PBXFileReference; lastKnownFileType = file.intentdefinition; path = StatusWidget.intentdefinition; sourceTree = "<group>"; };
|
||||
E33A3E442A626DD0009744AB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
E37C48EC2B9C30EE00E542D2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.intentdefinition; name = Base; path = Base.lproj/StatusWidget.intentdefinition; sourceTree = "<group>"; };
|
||||
E37C48F02B9C5E0C00E542D2 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/StatusWidget.strings; sourceTree = "<group>"; };
|
||||
E37C48F22B9C5E0D00E542D2 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/StatusWidget.strings"; sourceTree = "<group>"; };
|
||||
E37C48F42B9C5E1000E542D2 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/StatusWidget.strings"; sourceTree = "<group>"; };
|
||||
E37C48F62B9C5E1500E542D2 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/StatusWidget.strings; sourceTree = "<group>"; };
|
||||
E37C48F82B9C5E1700E542D2 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/StatusWidget.strings; sourceTree = "<group>"; };
|
||||
E37C48FA2B9C5E1700E542D2 /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = id.lproj/StatusWidget.strings; sourceTree = "<group>"; };
|
||||
E37C48FC2B9C5E1800E542D2 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/StatusWidget.strings; sourceTree = "<group>"; };
|
||||
E37C48FE2B9C5E1800E542D2 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/StatusWidget.strings"; sourceTree = "<group>"; };
|
||||
E37C49002B9C5E1900E542D2 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/StatusWidget.strings; sourceTree = "<group>"; };
|
||||
E37C49022B9C5E1900E542D2 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/StatusWidget.strings; sourceTree = "<group>"; };
|
||||
E39515C72AB5AD62003602C1 /* ServerBox.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ServerBox.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
E39515C92AB5AD62003602C1 /* WatchEndApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchEndApp.swift; sourceTree = "<group>"; };
|
||||
E39515CB2AB5AD62003602C1 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
|
||||
E39515DA2AB5AE7F003602C1 /* PhoneConnMgr.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhoneConnMgr.swift; sourceTree = "<group>"; };
|
||||
E39515DC2AB5AE9E003602C1 /* Store.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Store.swift; sourceTree = "<group>"; };
|
||||
E39515DF2AB5CF97003602C1 /* Watch.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Watch.xcassets; sourceTree = "<group>"; };
|
||||
E398BF6A29BDB34500FE4FD5 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = "<group>"; };
|
||||
E39A76AB2AB9A2F70067C641 /* Info-Debug.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info-Debug.plist"; sourceTree = "<group>"; };
|
||||
E39A76AC2AB9A2F70067C641 /* Info-Release.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info-Release.plist"; sourceTree = "<group>"; };
|
||||
E39A76AD2AB9A2F70067C641 /* Info-Profile.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info-Profile.plist"; sourceTree = "<group>"; };
|
||||
E3AE8AE92AB601DB000A6459 /* Utils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Utils.swift; sourceTree = "<group>"; };
|
||||
E3D26BC22B99637800D83425 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/Main.strings"; sourceTree = "<group>"; };
|
||||
E3D26BC32B99637900D83425 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/LaunchScreen.strings"; sourceTree = "<group>"; };
|
||||
E3D26BC42B99637F00D83425 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Main.strings; sourceTree = "<group>"; };
|
||||
E3D26BC52B99637F00D83425 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/LaunchScreen.strings; sourceTree = "<group>"; };
|
||||
E3D26BC62B99639800D83425 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Main.strings; sourceTree = "<group>"; };
|
||||
E3D26BC72B99639800D83425 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/LaunchScreen.strings; sourceTree = "<group>"; };
|
||||
E3D26BC82B9963A600D83425 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Main.strings; sourceTree = "<group>"; };
|
||||
E3D26BC92B9963A600D83425 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/LaunchScreen.strings; sourceTree = "<group>"; };
|
||||
E3D26BCA2B9963AC00D83425 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Main.strings; sourceTree = "<group>"; };
|
||||
E3D26BCB2B9963AC00D83425 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/LaunchScreen.strings; sourceTree = "<group>"; };
|
||||
E3D26BCC2B9963BC00D83425 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Main.strings"; sourceTree = "<group>"; };
|
||||
E3D26BCD2B9963BC00D83425 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/LaunchScreen.strings"; sourceTree = "<group>"; };
|
||||
E3D26BCE2B9963CE00D83425 /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = id.lproj/Main.strings; sourceTree = "<group>"; };
|
||||
E3D26BCF2B9963CE00D83425 /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = id.lproj/LaunchScreen.strings; sourceTree = "<group>"; };
|
||||
E3D26BD02B9963E100D83425 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Main.strings"; sourceTree = "<group>"; };
|
||||
E3D26BD12B9963E100D83425 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/LaunchScreen.strings"; sourceTree = "<group>"; };
|
||||
E3D26BD22B9966EC00D83425 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Main.strings; sourceTree = "<group>"; };
|
||||
E3D26BD32B9966EC00D83425 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/LaunchScreen.strings; sourceTree = "<group>"; };
|
||||
E3DB67EC2A31FE200027B8CB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
@@ -103,6 +176,13 @@
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
E39515C42AB5AD62003602C1 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
@@ -133,6 +213,7 @@
|
||||
9740EEB11CF90186004384FC /* Flutter */,
|
||||
97C146F01CF9000F007C117D /* Runner */,
|
||||
E33A3E3A2A626DCE009744AB /* StatusWidget */,
|
||||
E39515C82AB5AD62003602C1 /* WatchApp */,
|
||||
97C146EF1CF9000F007C117D /* Products */,
|
||||
65C40392B90925608A0465EE /* Pods */,
|
||||
D242A20E381A343934B6A7B6 /* Frameworks */,
|
||||
@@ -144,6 +225,7 @@
|
||||
children = (
|
||||
97C146EE1CF9000F007C117D /* Runner.app */,
|
||||
E33A3E352A626DCD009744AB /* StatusWidgetExtension.appex */,
|
||||
E39515C72AB5AD62003602C1 /* ServerBox.app */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
@@ -151,13 +233,17 @@
|
||||
97C146F01CF9000F007C117D /* Runner */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
7538AEC22BB83FAB002AB82A /* PrivacyInfo.xcprivacy */,
|
||||
E398BF6A29BDB34500FE4FD5 /* Runner.entitlements */,
|
||||
97C146FA1CF9000F007C117D /* Main.storyboard */,
|
||||
97C146FD1CF9000F007C117D /* Assets.xcassets */,
|
||||
E3DB67EB2A31FE200027B8CB /* LaunchScreen.storyboard */,
|
||||
97C147021CF9000F007C117D /* Info.plist */,
|
||||
E39A76AB2AB9A2F70067C641 /* Info-Debug.plist */,
|
||||
E39A76AD2AB9A2F70067C641 /* Info-Profile.plist */,
|
||||
E39A76AC2AB9A2F70067C641 /* Info-Release.plist */,
|
||||
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
|
||||
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
|
||||
E3AE8AE92AB601DB000A6459 /* Utils.swift */,
|
||||
74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
|
||||
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
|
||||
);
|
||||
@@ -177,14 +263,28 @@
|
||||
E33A3E3A2A626DCE009744AB /* StatusWidget */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
7538AEC42BB83FC8002AB82A /* PrivacyInfo.xcprivacy */,
|
||||
E33A3E3B2A626DCE009744AB /* StatusWidgetBundle.swift */,
|
||||
E33A3E3F2A626DCE009744AB /* StatusWidget.swift */,
|
||||
E33A3E412A626DCE009744AB /* StatusWidget.intentdefinition */,
|
||||
E37C48ED2B9C30EE00E542D2 /* StatusWidget.intentdefinition */,
|
||||
E33A3E442A626DD0009744AB /* Info.plist */,
|
||||
);
|
||||
path = StatusWidget;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
E39515C82AB5AD62003602C1 /* WatchApp */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
7538AEC62BB83FD3002AB82A /* PrivacyInfo.xcprivacy */,
|
||||
E39515C92AB5AD62003602C1 /* WatchEndApp.swift */,
|
||||
E39515CB2AB5AD62003602C1 /* ContentView.swift */,
|
||||
E39515DA2AB5AE7F003602C1 /* PhoneConnMgr.swift */,
|
||||
E39515DC2AB5AE9E003602C1 /* Store.swift */,
|
||||
E39515DF2AB5CF97003602C1 /* Watch.xcassets */,
|
||||
);
|
||||
path = WatchApp;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
@@ -198,14 +298,17 @@
|
||||
97C146EB1CF9000F007C117D /* Frameworks */,
|
||||
97C146EC1CF9000F007C117D /* Resources */,
|
||||
9705A1C41CF9048500538489 /* Embed Frameworks */,
|
||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
|
||||
AA0A1FF2F3246F84EB0D91F2 /* [CP] Embed Pods Frameworks */,
|
||||
E33A3E4A2A626DD0009744AB /* Embed Foundation Extensions */,
|
||||
E39515D52AB5AD64003602C1 /* Embed Watch Content */,
|
||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
|
||||
955896919A10AA2BEC131F36 /* [CP] Copy Pods Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
E33A3E482A626DD0009744AB /* PBXTargetDependency */,
|
||||
E39515D32AB5AD64003602C1 /* PBXTargetDependency */,
|
||||
);
|
||||
name = Runner;
|
||||
productName = Runner;
|
||||
@@ -229,6 +332,23 @@
|
||||
productReference = E33A3E352A626DCD009744AB /* StatusWidgetExtension.appex */;
|
||||
productType = "com.apple.product-type.app-extension";
|
||||
};
|
||||
E39515C62AB5AD62003602C1 /* WatchApp */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = E39515D92AB5AD64003602C1 /* Build configuration list for PBXNativeTarget "WatchApp" */;
|
||||
buildPhases = (
|
||||
E39515C32AB5AD62003602C1 /* Sources */,
|
||||
E39515C42AB5AD62003602C1 /* Frameworks */,
|
||||
E39515C52AB5AD62003602C1 /* Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = WatchApp;
|
||||
productName = "WatchEnd Watch App";
|
||||
productReference = E39515C72AB5AD62003602C1 /* ServerBox.app */;
|
||||
productType = "com.apple.product-type.application";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
@@ -236,7 +356,7 @@
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastSwiftUpdateCheck = 1430;
|
||||
LastUpgradeCheck = 1300;
|
||||
LastUpgradeCheck = 1510;
|
||||
ORGANIZATIONNAME = "";
|
||||
TargetAttributes = {
|
||||
97C146ED1CF9000F007C117D = {
|
||||
@@ -246,6 +366,9 @@
|
||||
E33A3E342A626DCD009744AB = {
|
||||
CreatedOnToolsVersion = 14.3;
|
||||
};
|
||||
E39515C62AB5AD62003602C1 = {
|
||||
CreatedOnToolsVersion = 14.3.1;
|
||||
};
|
||||
};
|
||||
};
|
||||
buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
|
||||
@@ -255,6 +378,15 @@
|
||||
knownRegions = (
|
||||
en,
|
||||
Base,
|
||||
"zh-Hant",
|
||||
fr,
|
||||
ru,
|
||||
es,
|
||||
de,
|
||||
"pt-BR",
|
||||
id,
|
||||
"zh-Hans",
|
||||
ja,
|
||||
);
|
||||
mainGroup = 97C146E51CF9000F007C117D;
|
||||
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
|
||||
@@ -263,6 +395,7 @@
|
||||
targets = (
|
||||
97C146ED1CF9000F007C117D /* Runner */,
|
||||
E33A3E342A626DCD009744AB /* StatusWidgetExtension */,
|
||||
E39515C62AB5AD62003602C1 /* WatchApp */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
@@ -274,7 +407,11 @@
|
||||
files = (
|
||||
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
|
||||
E3DB67ED2A31FE200027B8CB /* LaunchScreen.storyboard in Resources */,
|
||||
E39A76AF2AB9A2F70067C641 /* Info-Release.plist in Resources */,
|
||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
|
||||
E39A76AE2AB9A2F70067C641 /* Info-Debug.plist in Resources */,
|
||||
E39A76B02AB9A2F70067C641 /* Info-Profile.plist in Resources */,
|
||||
7538AEC32BB83FAB002AB82A /* PrivacyInfo.xcprivacy in Resources */,
|
||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
@@ -283,6 +420,16 @@
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
7538AEC52BB83FC8002AB82A /* PrivacyInfo.xcprivacy in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
E39515C52AB5AD62003602C1 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
7538AEC72BB83FD3002AB82A /* PrivacyInfo.xcprivacy in Resources */,
|
||||
E39515E02AB5CF97003602C1 /* Watch.xcassets in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -305,6 +452,23 @@
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
|
||||
};
|
||||
955896919A10AA2BEC131F36 /* [CP] Copy Pods Resources */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputFileListPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
|
||||
);
|
||||
name = "[CP] Copy Pods Resources";
|
||||
outputFileListPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
9740EEB61CF901F6004384FC /* Run Script */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
alwaysOutOfDate = 1;
|
||||
@@ -368,7 +532,8 @@
|
||||
files = (
|
||||
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
|
||||
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
|
||||
E33A3E462A626DD0009744AB /* StatusWidget.intentdefinition in Sources */,
|
||||
E37C48EA2B9C30EE00E542D2 /* StatusWidget.intentdefinition in Sources */,
|
||||
E3AE8AEA2AB601DB000A6459 /* Utils.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -377,8 +542,21 @@
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
E33A3E402A626DCE009744AB /* StatusWidget.swift in Sources */,
|
||||
E33A3E452A626DD0009744AB /* StatusWidget.intentdefinition in Sources */,
|
||||
E37C48EB2B9C30EE00E542D2 /* StatusWidget.intentdefinition in Sources */,
|
||||
E33A3E3C2A626DCE009744AB /* StatusWidgetBundle.swift in Sources */,
|
||||
E3AE8AEB2AB601DB000A6459 /* Utils.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
E39515C32AB5AD62003602C1 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
E3AE8AEC2AB601DB000A6459 /* Utils.swift in Sources */,
|
||||
E39515DB2AB5AE7F003602C1 /* PhoneConnMgr.swift in Sources */,
|
||||
E39515CC2AB5AD62003602C1 /* ContentView.swift in Sources */,
|
||||
E39515CA2AB5AD62003602C1 /* WatchEndApp.swift in Sources */,
|
||||
E39515DD2AB5AE9E003602C1 /* Store.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -390,6 +568,11 @@
|
||||
target = E33A3E342A626DCD009744AB /* StatusWidgetExtension */;
|
||||
targetProxy = E33A3E472A626DD0009744AB /* PBXContainerItemProxy */;
|
||||
};
|
||||
E39515D32AB5AD64003602C1 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
target = E39515C62AB5AD62003602C1 /* WatchApp */;
|
||||
targetProxy = E39515D22AB5AD64003602C1 /* PBXContainerItemProxy */;
|
||||
};
|
||||
/* End PBXTargetDependency section */
|
||||
|
||||
/* Begin PBXVariantGroup section */
|
||||
@@ -397,14 +580,50 @@
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
97C146FB1CF9000F007C117D /* Base */,
|
||||
E3D26BC22B99637800D83425 /* zh-Hant */,
|
||||
E3D26BC42B99637F00D83425 /* fr */,
|
||||
E3D26BC62B99639800D83425 /* ru */,
|
||||
E3D26BC82B9963A600D83425 /* es */,
|
||||
E3D26BCA2B9963AC00D83425 /* de */,
|
||||
E3D26BCC2B9963BC00D83425 /* pt-BR */,
|
||||
E3D26BCE2B9963CE00D83425 /* id */,
|
||||
E3D26BD02B9963E100D83425 /* zh-Hans */,
|
||||
E3D26BD22B9966EC00D83425 /* ja */,
|
||||
);
|
||||
name = Main.storyboard;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
E37C48ED2B9C30EE00E542D2 /* StatusWidget.intentdefinition */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
E37C48EC2B9C30EE00E542D2 /* Base */,
|
||||
E37C48F02B9C5E0C00E542D2 /* en */,
|
||||
E37C48F22B9C5E0D00E542D2 /* zh-Hans */,
|
||||
E37C48F42B9C5E1000E542D2 /* zh-Hant */,
|
||||
E37C48F62B9C5E1500E542D2 /* fr */,
|
||||
E37C48F82B9C5E1700E542D2 /* de */,
|
||||
E37C48FA2B9C5E1700E542D2 /* id */,
|
||||
E37C48FC2B9C5E1800E542D2 /* ja */,
|
||||
E37C48FE2B9C5E1800E542D2 /* pt-BR */,
|
||||
E37C49002B9C5E1900E542D2 /* ru */,
|
||||
E37C49022B9C5E1900E542D2 /* es */,
|
||||
);
|
||||
name = StatusWidget.intentdefinition;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
E3DB67EB2A31FE200027B8CB /* LaunchScreen.storyboard */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
E3DB67EC2A31FE200027B8CB /* Base */,
|
||||
E3D26BC32B99637900D83425 /* zh-Hant */,
|
||||
E3D26BC52B99637F00D83425 /* fr */,
|
||||
E3D26BC72B99639800D83425 /* ru */,
|
||||
E3D26BC92B9963A600D83425 /* es */,
|
||||
E3D26BCB2B9963AC00D83425 /* de */,
|
||||
E3D26BCD2B9963BC00D83425 /* pt-BR */,
|
||||
E3D26BCF2B9963CE00D83425 /* id */,
|
||||
E3D26BD12B9963E100D83425 /* zh-Hans */,
|
||||
E3D26BD32B9966EC00D83425 /* ja */,
|
||||
);
|
||||
name = LaunchScreen.storyboard;
|
||||
sourceTree = "<group>";
|
||||
@@ -416,6 +635,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
@@ -453,7 +673,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTED_PLATFORMS = iphoneos;
|
||||
@@ -470,15 +690,17 @@
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||
CURRENT_PROJECT_VERSION = 406;
|
||||
CURRENT_PROJECT_VERSION = 1034;
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.406;
|
||||
MARKETING_VERSION = 1.0.1034;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
@@ -491,6 +713,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
@@ -534,7 +757,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = iphoneos;
|
||||
@@ -546,6 +769,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
@@ -583,7 +807,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTED_PLATFORMS = iphoneos;
|
||||
@@ -602,15 +826,17 @@
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||
CURRENT_PROJECT_VERSION = 406;
|
||||
CURRENT_PROJECT_VERSION = 1034;
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.406;
|
||||
MARKETING_VERSION = 1.0.1034;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
@@ -628,15 +854,17 @@
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||
CURRENT_PROJECT_VERSION = 406;
|
||||
CURRENT_PROJECT_VERSION = 1034;
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.406;
|
||||
MARKETING_VERSION = 1.0.1034;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
@@ -657,7 +885,7 @@
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 406;
|
||||
CURRENT_PROJECT_VERSION = 1034;
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
@@ -670,7 +898,7 @@
|
||||
"@executable_path/Frameworks",
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.406;
|
||||
MARKETING_VERSION = 1.0.1034;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
|
||||
@@ -696,7 +924,7 @@
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 406;
|
||||
CURRENT_PROJECT_VERSION = 1034;
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
@@ -709,7 +937,7 @@
|
||||
"@executable_path/Frameworks",
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.406;
|
||||
MARKETING_VERSION = 1.0.1034;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
@@ -732,7 +960,7 @@
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 406;
|
||||
CURRENT_PROJECT_VERSION = 1034;
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
@@ -745,7 +973,7 @@
|
||||
"@executable_path/Frameworks",
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.406;
|
||||
MARKETING_VERSION = 1.0.1034;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
@@ -756,6 +984,123 @@
|
||||
};
|
||||
name = Profile;
|
||||
};
|
||||
E39515D62AB5AD64003602C1 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1034;
|
||||
DEVELOPMENT_ASSET_PATHS = "";
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
|
||||
INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.lollipopkit.toolbox;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.1034;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd;
|
||||
PRODUCT_NAME = ServerBox;
|
||||
SDKROOT = watchos;
|
||||
SKIP_INSTALL = YES;
|
||||
SUPPORTED_PLATFORMS = "watchsimulator watchos";
|
||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = 4;
|
||||
WATCHOS_DEPLOYMENT_TARGET = 7.0;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
E39515D72AB5AD64003602C1 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1034;
|
||||
DEVELOPMENT_ASSET_PATHS = "";
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
|
||||
INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.lollipopkit.toolbox;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.1034;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd;
|
||||
PRODUCT_NAME = ServerBox;
|
||||
SDKROOT = watchos;
|
||||
SKIP_INSTALL = YES;
|
||||
SUPPORTED_PLATFORMS = "watchsimulator watchos";
|
||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = 4;
|
||||
WATCHOS_DEPLOYMENT_TARGET = 7.0;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
E39515D82AB5AD64003602C1 /* Profile */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1034;
|
||||
DEVELOPMENT_ASSET_PATHS = "";
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
|
||||
INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.lollipopkit.toolbox;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.1034;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd;
|
||||
PRODUCT_NAME = ServerBox;
|
||||
SDKROOT = watchos;
|
||||
SKIP_INSTALL = YES;
|
||||
SUPPORTED_PLATFORMS = "watchsimulator watchos";
|
||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = 4;
|
||||
WATCHOS_DEPLOYMENT_TARGET = 7.0;
|
||||
};
|
||||
name = Profile;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
@@ -789,6 +1134,16 @@
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
E39515D92AB5AD64003602C1 /* Build configuration list for PBXNativeTarget "WatchApp" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
E39515D62AB5AD64003602C1 /* Debug */,
|
||||
E39515D72AB5AD64003602C1 /* Release */,
|
||||
E39515D82AB5AD64003602C1 /* Profile */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = 97C146E61CF9000F007C117D /* Project object */;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1300"
|
||||
LastUpgradeVersion = "1510"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
@@ -27,8 +27,6 @@
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
</Testables>
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
@@ -38,8 +36,8 @@
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
<Testables>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
@@ -61,8 +59,6 @@
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Profile"
|
||||
|
||||
@@ -0,0 +1,113 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1430"
|
||||
wasCreatedForAppExtension = "YES"
|
||||
version = "2.0">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
<BuildActionEntries>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "E33A3E342A626DCD009744AB"
|
||||
BuildableName = "StatusWidgetExtension.appex"
|
||||
BlueprintName = "StatusWidgetExtension"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||
BuildableName = "Runner.app"
|
||||
BlueprintName = "Runner"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
shouldAutocreateTestPlan = "YES">
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = ""
|
||||
selectedLauncherIdentifier = "Xcode.IDEFoundation.Launcher.PosixSpawn"
|
||||
launchStyle = "0"
|
||||
askForAppToLaunch = "Yes"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES"
|
||||
launchAutomaticallySubstyle = "2">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||
BuildableName = "Runner.app"
|
||||
BlueprintName = "Runner"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
<EnvironmentVariables>
|
||||
<EnvironmentVariable
|
||||
key = "_XCWidgetKind"
|
||||
value = ""
|
||||
isEnabled = "NO">
|
||||
</EnvironmentVariable>
|
||||
<EnvironmentVariable
|
||||
key = "_XCWidgetDefaultView"
|
||||
value = "timeline"
|
||||
isEnabled = "NO">
|
||||
</EnvironmentVariable>
|
||||
<EnvironmentVariable
|
||||
key = "_XCWidgetFamily"
|
||||
value = "medium"
|
||||
isEnabled = "NO">
|
||||
</EnvironmentVariable>
|
||||
</EnvironmentVariables>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
askForAppToLaunch = "Yes"
|
||||
launchAutomaticallySubstyle = "2">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||
BuildableName = "Runner.app"
|
||||
BlueprintName = "Runner"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
@@ -0,0 +1,91 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1430"
|
||||
version = "1.7">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
<BuildActionEntries>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "E39515C62AB5AD62003602C1"
|
||||
BuildableName = "ServerBox.app"
|
||||
BlueprintName = "WatchApp"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||
BuildableName = "Runner.app"
|
||||
BlueprintName = "Runner"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
shouldAutocreateTestPlan = "YES">
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "E39515C62AB5AD62003602C1"
|
||||
BuildableName = "ServerBox.app"
|
||||
BlueprintName = "WatchApp"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "E39515C62AB5AD62003602C1"
|
||||
BuildableName = "ServerBox.app"
|
||||
BlueprintName = "WatchApp"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
@@ -4,22 +4,30 @@ import Flutter
|
||||
|
||||
@UIApplicationMain
|
||||
@objc class AppDelegate: FlutterAppDelegate {
|
||||
override func application(
|
||||
_ application: UIApplication,
|
||||
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
|
||||
) -> Bool {
|
||||
GeneratedPluginRegistrant.register(with: self)
|
||||
override func application(
|
||||
_ application: UIApplication,
|
||||
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
|
||||
) -> Bool {
|
||||
GeneratedPluginRegistrant.register(with: self)
|
||||
|
||||
let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
|
||||
let methodChannel = FlutterMethodChannel(name: "tech.lolli.toolbox/home_widget", binaryMessenger: controller.binaryMessenger)
|
||||
methodChannel.setMethodCallHandler({
|
||||
(call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
|
||||
if call.method == "update" {
|
||||
if #available(iOS 14.0, *) {
|
||||
WidgetCenter.shared.reloadTimelines(ofKind: "StatusWidget")
|
||||
let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
|
||||
let methodChannel = FlutterMethodChannel(name: "tech.lolli.toolbox/home_widget", binaryMessenger: controller.binaryMessenger)
|
||||
methodChannel.setMethodCallHandler({(call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
|
||||
if call.method == "update" {
|
||||
if #available(iOS 14.0, *) {
|
||||
WidgetCenter.shared.reloadTimelines(ofKind: "StatusWidget")
|
||||
}
|
||||
}
|
||||
})
|
||||
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
|
||||
}
|
||||
|
||||
override func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
|
||||
if url.scheme == "https" || url.scheme == "http" {
|
||||
UIApplication.shared.open(url)
|
||||
} else {
|
||||
// Pass
|
||||
}
|
||||
}
|
||||
})
|
||||
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
|
||||
}
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,6 +37,8 @@
|
||||
<array>
|
||||
<string>_dartobservatory._tcp</string>
|
||||
</array>
|
||||
<key>NSFaceIDUsageDescription</key>
|
||||
<string>Required for auth</string>
|
||||
<key>NSLocalNetworkUsageDescription</key>
|
||||
<string>ServerBox needs to access your local network to discover and connect to your server.</string>
|
||||
<key>NSUserActivityTypes</key>
|
||||
@@ -58,6 +60,8 @@
|
||||
<key>UISupportedInterfaceOrientations</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
</array>
|
||||
<key>UISupportedInterfaceOrientations~ipad</key>
|
||||
<array>
|
||||
|
||||
@@ -48,6 +48,8 @@
|
||||
<key>UISupportedInterfaceOrientations</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
</array>
|
||||
<key>UISupportedInterfaceOrientations~ipad</key>
|
||||
<array>
|
||||
@@ -64,5 +66,7 @@
|
||||
</array>
|
||||
<key>NSLocalNetworkUsageDescription</key>
|
||||
<string>ServerBox needs to access your local network to discover and connect to your server.</string>
|
||||
<key>NSFaceIDUsageDescription</key>
|
||||
<string>Required for auth</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
@@ -48,6 +48,8 @@
|
||||
<key>UISupportedInterfaceOrientations</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
</array>
|
||||
<key>UISupportedInterfaceOrientations~ipad</key>
|
||||
<array>
|
||||
@@ -58,5 +60,7 @@
|
||||
</array>
|
||||
<key>UIViewControllerBasedStatusBarAppearance</key>
|
||||
<false/>
|
||||
<key>NSFaceIDUsageDescription</key>
|
||||
<string>Required for auth</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
25
ios/Runner/PrivacyInfo.xcprivacy
Normal file
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>NSPrivacyAccessedAPITypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>NSPrivacyAccessedAPITypeReasons</key>
|
||||
<array>
|
||||
<string>E174.1</string>
|
||||
</array>
|
||||
<key>NSPrivacyAccessedAPIType</key>
|
||||
<string>NSPrivacyAccessedAPICategoryDiskSpace</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>NSPrivacyAccessedAPITypeReasons</key>
|
||||
<array>
|
||||
<string>CA92.1</string>
|
||||
</array>
|
||||
<key>NSPrivacyAccessedAPIType</key>
|
||||
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -4,5 +4,17 @@
|
||||
<dict>
|
||||
<key>aps-environment</key>
|
||||
<string>production</string>
|
||||
<key>com.apple.developer.icloud-container-identifiers</key>
|
||||
<array>
|
||||
<string>iCloud.tech.lolli.serverbox</string>
|
||||
</array>
|
||||
<key>com.apple.developer.icloud-services</key>
|
||||
<array>
|
||||
<string>CloudDocuments</string>
|
||||
</array>
|
||||
<key>com.apple.developer.ubiquity-container-identifiers</key>
|
||||
<array>
|
||||
<string>iCloud.tech.lolli.serverbox</string>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
41
ios/Runner/Utils.swift
Normal file
@@ -0,0 +1,41 @@
|
||||
//
|
||||
// Utils.swift
|
||||
// Runner
|
||||
//
|
||||
// Created by lolli on 2023/9/16.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
let accessoryKey = "accessory_widget_url"
|
||||
|
||||
let helpUrl = URL(string: "https://github.com/lollipopkit/flutter_server_box/wiki#home-widget--watchos-app")!
|
||||
|
||||
extension Date {
|
||||
func toStr() -> String {
|
||||
let formatter = DateFormatter()
|
||||
formatter.dateStyle = .none
|
||||
formatter.timeStyle = .short
|
||||
formatter.locale = Locale.current
|
||||
return formatter.string(from: self)
|
||||
}
|
||||
}
|
||||
|
||||
enum ErrType: Error {
|
||||
case url(String)
|
||||
case http(String)
|
||||
}
|
||||
|
||||
enum ContentState {
|
||||
case loading
|
||||
case error(ErrType)
|
||||
case normal(Status)
|
||||
}
|
||||
|
||||
struct Status {
|
||||
let name: String
|
||||
let cpu: String
|
||||
let mem: String
|
||||
let disk: String
|
||||
let net: String
|
||||
}
|
||||
1
ios/Runner/de.lproj/LaunchScreen.strings
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
1
ios/Runner/de.lproj/Main.strings
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
1
ios/Runner/es.lproj/LaunchScreen.strings
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
1
ios/Runner/es.lproj/Main.strings
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
1
ios/Runner/fr.lproj/LaunchScreen.strings
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
1
ios/Runner/fr.lproj/Main.strings
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
1
ios/Runner/id.lproj/LaunchScreen.strings
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
1
ios/Runner/id.lproj/Main.strings
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
1
ios/Runner/ja.lproj/LaunchScreen.strings
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
1
ios/Runner/ja.lproj/Main.strings
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
1
ios/Runner/pt-BR.lproj/LaunchScreen.strings
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
1
ios/Runner/pt-BR.lproj/Main.strings
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
1
ios/Runner/ru.lproj/LaunchScreen.strings
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
1
ios/Runner/ru.lproj/Main.strings
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
1
ios/Runner/zh-Hans.lproj/LaunchScreen.strings
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
1
ios/Runner/zh-Hans.lproj/Main.strings
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
1
ios/Runner/zh-Hant.lproj/LaunchScreen.strings
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
1
ios/Runner/zh-Hant.lproj/Main.strings
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
17
ios/StatusWidget/PrivacyInfo.xcprivacy
Normal file
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>NSPrivacyAccessedAPITypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>NSPrivacyAccessedAPITypeReasons</key>
|
||||
<array>
|
||||
<string>CA92.1</string>
|
||||
</array>
|
||||
<key>NSPrivacyAccessedAPIType</key>
|
||||
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -8,80 +8,192 @@
|
||||
import WidgetKit
|
||||
import SwiftUI
|
||||
import Intents
|
||||
import AppIntents
|
||||
import Foundation
|
||||
|
||||
struct Status {
|
||||
let name: String
|
||||
let cpu: String
|
||||
let mem: String
|
||||
let disk: String
|
||||
let net: String
|
||||
}
|
||||
|
||||
let demoStatus = Status(name: "Server Name", cpu: "31.7%", mem: "1.3g / 1.9g", disk: "7.1g / 30.0g", net: "712.3k / 1.2m")
|
||||
let demoStatus = Status(name: "Server", cpu: "31.7%", mem: "1.3g / 1.9g", disk: "7.1g / 30.0g", net: "712.3k / 1.2m")
|
||||
let domain = "com.lollipopkit.toolbox"
|
||||
var url: String?
|
||||
let bgColor = DynamicColor(dark: UIColor.black, light: UIColor.white)
|
||||
|
||||
struct Provider: IntentTimelineProvider {
|
||||
func placeholder(in context: Context) -> SimpleEntry {
|
||||
SimpleEntry(date: Date(), configuration: ConfigurationIntent(), data: demoStatus, state: .normal)
|
||||
SimpleEntry(date: Date(), configuration: ConfigurationIntent(), state: .normal(demoStatus))
|
||||
}
|
||||
|
||||
func getSnapshot(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (SimpleEntry) -> ()) {
|
||||
let entry = SimpleEntry(date: Date(), configuration: configuration, data: demoStatus, state: .normal)
|
||||
let entry = SimpleEntry(date: Date(), configuration: configuration, state: .normal(demoStatus))
|
||||
completion(entry)
|
||||
}
|
||||
|
||||
func getTimeline(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
|
||||
url = configuration.url
|
||||
var url = configuration.url
|
||||
|
||||
let family = context.family
|
||||
if #available(iOSApplicationExtension 16.0, *) {
|
||||
if family == .accessoryInline || family == .accessoryRectangular {
|
||||
url = UserDefaults.standard.string(forKey: accessoryKey)
|
||||
}
|
||||
}
|
||||
|
||||
let currentDate = Date()
|
||||
let refreshDate = Calendar.current.date(byAdding: .minute, value: 30, to: currentDate)!
|
||||
StatusLoader.fetch { result in
|
||||
let entry: SimpleEntry
|
||||
switch result {
|
||||
case .success(let status):
|
||||
entry = SimpleEntry(
|
||||
date: currentDate,
|
||||
configuration: configuration,
|
||||
data: status,
|
||||
state: .normal
|
||||
)
|
||||
case .failure(let err):
|
||||
entry = SimpleEntry(date: currentDate, configuration: configuration, data: demoStatus, state: .error(err.localizedDescription))
|
||||
}
|
||||
let refreshDate = Calendar.current.date(byAdding: .minute, value: 15, to: currentDate)!
|
||||
fetch(url: url) { result in
|
||||
let entry: SimpleEntry = SimpleEntry(
|
||||
date: currentDate,
|
||||
configuration: configuration,
|
||||
state: result
|
||||
)
|
||||
let timeline = Timeline(entries: [entry], policy: .after(refreshDate))
|
||||
completion(timeline)
|
||||
}
|
||||
}
|
||||
|
||||
func fetch(url: String?, completion: @escaping (ContentState) -> Void) {
|
||||
guard let url = url, url.count >= 12 else {
|
||||
completion(.error(.url("url is nil OR len < 12")))
|
||||
return
|
||||
}
|
||||
guard let url = URL(string: url) else {
|
||||
completion(.error(.url("parse url failed")))
|
||||
return
|
||||
}
|
||||
|
||||
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
|
||||
if error != nil {
|
||||
completion(.error(.http(error?.localizedDescription ?? "unknown http err")))
|
||||
return
|
||||
}
|
||||
guard let data = data else {
|
||||
completion(.error(.http("empty http data")))
|
||||
return
|
||||
}
|
||||
let jsonAll = try! JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] ?? [:]
|
||||
let code = jsonAll["code"] as? Int ?? 1
|
||||
if (code != 0) {
|
||||
let msg = jsonAll["msg"] as? String ?? "Empty err"
|
||||
completion(.error(.http(msg)))
|
||||
return
|
||||
}
|
||||
|
||||
let json = jsonAll["data"] as? [String: Any] ?? [:]
|
||||
let name = json["name"] as? String ?? ""
|
||||
let disk = json["disk"] as? String ?? ""
|
||||
let cpu = json["cpu"] as? String ?? ""
|
||||
let mem = json["mem"] as? String ?? ""
|
||||
let net = json["net"] as? String ?? ""
|
||||
completion(.normal(Status(name: name, cpu: cpu, mem: mem, disk: disk, net: net)))
|
||||
}
|
||||
task.resume()
|
||||
}
|
||||
}
|
||||
|
||||
struct SimpleEntry: TimelineEntry {
|
||||
let date: Date
|
||||
let configuration: ConfigurationIntent
|
||||
let data: Status
|
||||
let state: ContentState
|
||||
}
|
||||
|
||||
struct StatusWidgetEntryView : View {
|
||||
var entry: Provider.Entry
|
||||
|
||||
@Environment(\.widgetFamily) var family: WidgetFamily
|
||||
|
||||
var body: some View {
|
||||
switch entry.state {
|
||||
case .loading:
|
||||
ProgressView().padding()
|
||||
case .error(let descriotion):
|
||||
Text(descriotion).padding(.all, 13)
|
||||
case .normal:
|
||||
VStack(alignment: .leading, spacing: 5.7) {
|
||||
Text(entry.data.name).font(.system(.title3))
|
||||
Spacer()
|
||||
DetailItem(icon: "cpu", text: entry.data.cpu, color: .primary.opacity(0.7))
|
||||
DetailItem(icon: "memorychip", text: entry.data.mem, color: .primary.opacity(0.7))
|
||||
DetailItem(icon: "externaldrive", text: entry.data.disk, color: .primary.opacity(0.7))
|
||||
Spacer()
|
||||
DetailItem(icon: "clock", text: date2String(entry.date, dateFormat: "HH:mm"), color: .primary.opacity(0.7))
|
||||
}.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading)
|
||||
.padding()
|
||||
Text("Loading").widgetBackground()
|
||||
case .error(let err):
|
||||
switch err {
|
||||
case .http(let description):
|
||||
VStack(alignment: .center) {
|
||||
Text(description)
|
||||
if #available(iOS 17.0, *) {
|
||||
Button(intent: RefreshIntent()) {
|
||||
Image(systemName: "arrow.clockwise")
|
||||
.resizable()
|
||||
.frame(width: 10, height: 12.7)
|
||||
}.tint(.gray)
|
||||
}
|
||||
}
|
||||
.widgetBackground()
|
||||
case .url(_):
|
||||
Link("Open wiki ⬅️", destination: helpUrl)
|
||||
.widgetBackground()
|
||||
}
|
||||
case .normal(let data):
|
||||
let sumColor: Color = .primary.opacity(0.7)
|
||||
switch family {
|
||||
case .accessoryRectangular:
|
||||
VStack(alignment: .leading, spacing: 2) {
|
||||
HStack {
|
||||
Text(data.name)
|
||||
.font(.system(size: 15, weight: .semibold, design: .monospaced))
|
||||
Spacer()
|
||||
CirclePercent(percent: data.cpu)
|
||||
.padding(.top, 3)
|
||||
.padding(.trailing, 3)
|
||||
}
|
||||
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading)
|
||||
Spacer()
|
||||
DetailItem(icon: "memorychip", text: data.mem, color: sumColor)
|
||||
DetailItem(icon: "externaldrive", text: data.disk, color: sumColor)
|
||||
DetailItem(icon: "network", text: data.net, color: sumColor)
|
||||
}
|
||||
.widgetBackground()
|
||||
case .accessoryInline:
|
||||
Text("\(data.name) \(data.cpu)").widgetBackground()
|
||||
default:
|
||||
VStack(alignment: .leading, spacing: 3.7) {
|
||||
if #available(iOS 17.0, *) {
|
||||
HStack {
|
||||
Text(data.name).font(.system(.title3, design: .monospaced))
|
||||
Spacer()
|
||||
Button(intent: RefreshIntent()) {
|
||||
Image(systemName: "arrow.clockwise")
|
||||
.resizable()
|
||||
.frame(width: 10, height: 12.7)
|
||||
}.tint(.gray)
|
||||
}
|
||||
} else {
|
||||
Text(data.name).font(.system(.title3, design: .monospaced))
|
||||
}
|
||||
Spacer()
|
||||
DetailItem(icon: "cpu", text: data.cpu, color: sumColor)
|
||||
DetailItem(icon: "memorychip", text: data.mem, color: sumColor)
|
||||
DetailItem(icon: "externaldrive", text: data.disk, color: sumColor)
|
||||
DetailItem(icon: "network", text: data.net, color: sumColor)
|
||||
Spacer()
|
||||
DetailItem(icon: "clock", text: entry.date.toStr(), color: sumColor)
|
||||
.padding(.bottom, 3)
|
||||
}
|
||||
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading)
|
||||
.autoPadding()
|
||||
.widgetBackground()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension View {
|
||||
@ViewBuilder
|
||||
func widgetBackground() -> some View {
|
||||
// Set bg to black in Night, white in Day
|
||||
let backgroundView = Color(bgColor.resolve())
|
||||
if #available(iOS 17.0, *) {
|
||||
containerBackground(for: .widget) {
|
||||
backgroundView
|
||||
}
|
||||
} else {
|
||||
background(backgroundView)
|
||||
}
|
||||
}
|
||||
|
||||
// iOS 17 will auto add a SafeArea, so when iOS < 17, add .padding(.all, 17)
|
||||
func autoPadding() -> some View {
|
||||
if #available(iOS 17.0, *) {
|
||||
return self
|
||||
} else {
|
||||
return self.padding(.all, 17)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -90,116 +202,78 @@ struct StatusWidget: Widget {
|
||||
let kind: String = "StatusWidget"
|
||||
|
||||
var body: some WidgetConfiguration {
|
||||
IntentConfiguration(kind: kind, intent: ConfigurationIntent.self, provider: Provider()) { entry in
|
||||
let cfg = IntentConfiguration(kind: kind, intent: ConfigurationIntent.self, provider: Provider()) { entry in
|
||||
StatusWidgetEntryView(entry: entry)
|
||||
}
|
||||
.configurationDisplayName("Status")
|
||||
.description("Status of your servers.")
|
||||
.supportedFamilies([.systemSmall])
|
||||
if #available(iOSApplicationExtension 16.0, *) {
|
||||
return cfg.supportedFamilies([.systemSmall, .accessoryRectangular, .accessoryInline])
|
||||
} else {
|
||||
return cfg.supportedFamilies([.systemSmall])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct StatusWidget_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
StatusWidgetEntryView(entry: SimpleEntry(date: Date(), configuration: ConfigurationIntent(), data: demoStatus, state: .normal))
|
||||
StatusWidgetEntryView(entry: SimpleEntry(date: Date(), configuration: ConfigurationIntent(), state: .normal(demoStatus)))
|
||||
.previewContext(WidgetPreviewContext(family: .systemSmall))
|
||||
}
|
||||
}
|
||||
|
||||
struct StatusLoader {
|
||||
static func fetch(completion: @escaping (Result<Status, Error>) -> Void) {
|
||||
if let url = url, url.count < 12 {
|
||||
completion(.failure(NSError(domain: domain, code: 1, userInfo: [NSLocalizedDescriptionKey: "https://github.com/lollipopkit/server_box_monitor/wiki"])))
|
||||
return
|
||||
}
|
||||
let URL = URL(string: url!)!
|
||||
let task = URLSession.shared.dataTask(with: URL) { (data, response, error) in
|
||||
guard error == nil else {
|
||||
completion(.failure(error!))
|
||||
return
|
||||
}
|
||||
guard data != nil else {
|
||||
completion(.failure(NSError(domain: domain, code: 2, userInfo: [NSLocalizedDescriptionKey: "empty network data."])))
|
||||
return
|
||||
}
|
||||
let result = getStatus(fromData: data!)
|
||||
switch result {
|
||||
case .success(let status):
|
||||
completion(.success(status))
|
||||
case .failure(let error):
|
||||
completion(.failure(error))
|
||||
}
|
||||
}
|
||||
task.resume()
|
||||
}
|
||||
|
||||
static func getStatus(fromData data: Foundation.Data) -> Result<Status, Error> {
|
||||
let jsonAll = try! JSONSerialization.jsonObject(with: data, options: []) as! [String: Any]
|
||||
let code = jsonAll["code"] as! Int
|
||||
if (code != 0) {
|
||||
switch (code) {
|
||||
default:
|
||||
let msg = jsonAll["msg"] as! String? ?? ""
|
||||
return .failure(NSError(domain: domain, code: code, userInfo: [NSLocalizedDescriptionKey: msg]))
|
||||
}
|
||||
}
|
||||
|
||||
let json = jsonAll["data"] as! [String: Any]
|
||||
let name = json["name"] as! String
|
||||
let disk = json["disk"] as! String
|
||||
let cpu = json["cpu"] as! String
|
||||
let mem = json["mem"] as! String
|
||||
let net = json["net"] as! String
|
||||
return .success(Status(name: name, cpu: cpu, mem: mem, disk: disk, net: net))
|
||||
}
|
||||
}
|
||||
|
||||
private func dynamicUIColor(color: DynamicColor) -> UIColor {
|
||||
if #available(iOS 13, *) { // 版本号大于等于13
|
||||
return UIColor { (traitCollection: UITraitCollection) -> UIColor in
|
||||
return traitCollection.userInterfaceStyle == UIUserInterfaceStyle.dark ?
|
||||
color.dark : color.light
|
||||
}
|
||||
}
|
||||
return color.light
|
||||
}
|
||||
|
||||
struct DynamicColor {
|
||||
let dark: UIColor
|
||||
let light: UIColor
|
||||
}
|
||||
|
||||
let bgColor = DynamicColor(dark: UIColor(.black), light: UIColor(.white))
|
||||
let textColor = DynamicColor(dark: UIColor(.white), light: UIColor(.black))
|
||||
|
||||
private func dynamicColor(color: DynamicColor) -> Color {
|
||||
return Color.init(dynamicUIColor(color: color))
|
||||
}
|
||||
|
||||
struct DetailItem: View {
|
||||
let icon: String
|
||||
let text: String
|
||||
let color: Color
|
||||
|
||||
var body: some View {
|
||||
HStack(spacing: 5.7) {
|
||||
HStack(spacing: 6.7) {
|
||||
Image(systemName: icon).resizable().foregroundColor(color).frame(width: 11, height: 11, alignment: .center)
|
||||
Text(text)
|
||||
.font(.system(.caption2))
|
||||
.font(.system(size: 11, design: .monospaced))
|
||||
.foregroundColor(color)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func date2String(_ date:Date, dateFormat:String = "yyyy-MM-dd HH:mm:ss") -> String {
|
||||
let formatter = DateFormatter()
|
||||
formatter.dateFormat = dateFormat
|
||||
let date = formatter.string(from: date)
|
||||
return date
|
||||
// 空心圆,显示百分比
|
||||
struct CirclePercent: View {
|
||||
// eg: 31.7%
|
||||
let percent: String
|
||||
|
||||
var body: some View {
|
||||
// 31.7% -> 0.317
|
||||
let percentD = Double(percent.trimmingCharacters(in: .init(charactersIn: "%")))
|
||||
let double = (percentD ?? 0) / 100
|
||||
Circle()
|
||||
.trim(from: 0, to: CGFloat(double))
|
||||
.stroke(Color.primary, lineWidth: 3)
|
||||
.animation(.easeInOut(duration: 0.5))
|
||||
}
|
||||
}
|
||||
|
||||
enum ContentState {
|
||||
case loading
|
||||
case error(String)
|
||||
case normal
|
||||
struct DynamicColor {
|
||||
let dark: UIColor
|
||||
let light: UIColor
|
||||
|
||||
func resolve() -> UIColor {
|
||||
if #available(iOS 13, *) { // 版本号大于等于13
|
||||
return UIColor { (traitCollection: UITraitCollection) -> UIColor in
|
||||
return traitCollection.userInterfaceStyle == UIUserInterfaceStyle.dark ?
|
||||
self.dark : self.light
|
||||
}
|
||||
}
|
||||
return self.light
|
||||
}
|
||||
}
|
||||
|
||||
@available(iOS 16.0, macOS 13.0, watchOS 9.0, tvOS 16.0, *)
|
||||
struct RefreshIntent: AppIntent {
|
||||
static var title: LocalizedStringResource = "Refresh"
|
||||
static var description = IntentDescription("Refresh status.")
|
||||
|
||||
func perform() async throws -> some IntentResult {
|
||||
return .result()
|
||||
}
|
||||
}
|
||||
|
||||
10
ios/StatusWidget/de.lproj/StatusWidget.strings
Normal file
@@ -0,0 +1,10 @@
|
||||
"5QiOUM" = "Url";
|
||||
|
||||
"gpCwrM" = "Status-Widget-Konfiguration";
|
||||
|
||||
"j41owf" = "Überwachungs-URL";
|
||||
|
||||
"tVvJ9c" = "Desktop-Widget-Konfiguration";
|
||||
|
||||
"wwvqC2" = "https://";
|
||||
|
||||
10
ios/StatusWidget/en.lproj/StatusWidget.strings
Normal file
@@ -0,0 +1,10 @@
|
||||
"5QiOUM" = "Url";
|
||||
|
||||
"gpCwrM" = "Status Widget Config";
|
||||
|
||||
"j41owf" = "Monitoring URL";
|
||||
|
||||
"tVvJ9c" = "Desktop widget configuration";
|
||||
|
||||
"wwvqC2" = "https://";
|
||||
|
||||