Compare commits
904 Commits
v0.13.1-rc
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
181c6599b7 | ||
|
|
fb77d3cf8a | ||
|
|
1a4b19a5e1 | ||
|
|
a9f553729e | ||
|
|
ed96742680 | ||
|
|
5e7816d72d | ||
|
|
abab38e422 | ||
|
|
7835b17379 | ||
|
|
30612a866b | ||
|
|
bba574ce86 | ||
|
|
6d3d725b6c | ||
|
|
948bc06542 | ||
|
|
8f4ee3268d | ||
|
|
8f97bd997b | ||
|
|
18f6c9c24f | ||
|
|
c7bdd041f2 | ||
|
|
f75a011fb3 | ||
|
|
555764914d | ||
|
|
e4be98c7e7 | ||
|
|
701ce9dc0a | ||
|
|
3f950cc11d | ||
|
|
d8ce34a962 | ||
|
|
ef9d5e7862 | ||
|
|
e3f06eff55 | ||
|
|
7a062b7d7b | ||
|
|
121f3297ae | ||
|
|
9951f00979 | ||
|
|
d8bb744ce4 | ||
|
|
4db342b4ae | ||
|
|
e9f96e6d21 | ||
|
|
56c6ebdadf | ||
|
|
4f941a5892 | ||
|
|
bf69046efe | ||
|
|
cdcdb1b443 | ||
|
|
f875e9df4d | ||
|
|
12dd408f0b | ||
|
|
5e53bae9dc | ||
|
|
b19e190004 | ||
|
|
06c8bdc81a | ||
|
|
62338250e8 | ||
|
|
1ff79ebb13 | ||
|
|
2f9678d882 | ||
|
|
94d70cbe55 | ||
|
|
f5c26f97aa | ||
|
|
b367c7d3d6 | ||
|
|
c9cae35946 | ||
|
|
a895b0b583 | ||
|
|
5321c25bb2 | ||
|
|
b39691b879 | ||
|
|
74e7f02668 | ||
|
|
09e1510298 | ||
|
|
0d95a731e3 | ||
|
|
7d5706520b | ||
|
|
e887b3153d | ||
|
|
a7aa897fad | ||
|
|
29e2fd863b | ||
|
|
330cac26ec | ||
|
|
ca9195ba97 | ||
|
|
908270ffff | ||
|
|
942fbcf6f6 | ||
|
|
dbc6bae898 | ||
|
|
8482802375 | ||
|
|
fdd3614204 | ||
|
|
706a2780d9 | ||
|
|
97a90076a4 | ||
|
|
ef85b8f3e1 | ||
|
|
83700a1d1a | ||
|
|
36a363f8ed | ||
|
|
1c8381337a | ||
|
|
f698b27be5 | ||
|
|
f2767cf3bc | ||
|
|
fe873729b6 | ||
|
|
031b35eb06 | ||
|
|
bcc604cf63 | ||
|
|
adf01eed16 | ||
|
|
bd1750f252 | ||
|
|
49adf0ee84 | ||
|
|
04a2fa72a7 | ||
|
|
064c41d419 | ||
|
|
7c92023af7 | ||
|
|
ac01b75342 | ||
|
|
95a7801a50 | ||
|
|
db1ec5d024 | ||
|
|
a96cd8a38f | ||
|
|
45d5789685 | ||
|
|
4b08123a61 | ||
|
|
bfc99ab02c | ||
|
|
6eb8a18430 | ||
|
|
489b8e6549 | ||
|
|
7bb2ecfff1 | ||
|
|
59b4b34840 | ||
|
|
9597888902 | ||
|
|
dbfcc8ba0a | ||
|
|
fd8e9fba83 | ||
|
|
f65d1828fe | ||
|
|
c32601809b | ||
|
|
fdf86a1e56 | ||
|
|
71908523f9 | ||
|
|
2b7d678321 | ||
|
|
5d64fa8369 | ||
|
|
fe6bb4534c | ||
|
|
95daec6814 | ||
|
|
43b104fcc3 | ||
|
|
a33d6b1c1a | ||
|
|
cf67b9306b | ||
|
|
238c86ee98 | ||
|
|
7f56209ca9 | ||
|
|
a3e50cdc02 | ||
|
|
b7c43d8373 | ||
|
|
cadc13f2e0 | ||
|
|
7965d2e081 | ||
|
|
b829a20169 | ||
|
|
653b8b4014 | ||
|
|
a891203204 | ||
|
|
0236a05f26 | ||
|
|
28deb357da | ||
|
|
4d93f87a01 | ||
|
|
88adfce242 | ||
|
|
3d02795dbc | ||
|
|
7ff50f78eb | ||
|
|
0e3aaf105c | ||
|
|
f638540886 | ||
|
|
343d69d690 | ||
|
|
e2d7d354c6 | ||
|
|
cc6f297b92 | ||
|
|
2add43e71a | ||
|
|
0a493ac345 | ||
|
|
17bb2703d1 | ||
|
|
f0981bf709 | ||
|
|
99de554c18 | ||
|
|
f95a4d56d7 | ||
|
|
1df3c9d322 | ||
|
|
e0838cce6c | ||
|
|
e25d3201c2 | ||
|
|
5d14f14139 | ||
|
|
09e81f5ace | ||
|
|
8f57ef2de4 | ||
|
|
ea242960b3 | ||
|
|
35ac14a7de | ||
|
|
690a8b5c6e | ||
|
|
255b8b2865 | ||
|
|
e27ec63985 | ||
|
|
9f8be6551c | ||
|
|
f09cd687c7 | ||
|
|
686499f8dd | ||
|
|
a3bcc61892 | ||
|
|
faf70c9a39 | ||
|
|
2aa8d3a056 | ||
|
|
23df46ca33 | ||
|
|
8407f52777 | ||
|
|
b44dcaa9c2 | ||
|
|
ff0d823aff | ||
|
|
2e8bfa5373 | ||
|
|
87940ddd03 | ||
|
|
6208979ce9 | ||
|
|
9a27fb1320 | ||
|
|
53129328d0 | ||
|
|
2d79c5a0e9 | ||
|
|
74f5a92ce1 | ||
|
|
146930279c | ||
|
|
0c33579858 | ||
|
|
c9783d097b | ||
|
|
d3eafb8d06 | ||
|
|
09d44b51d6 | ||
|
|
cf357e71f5 | ||
|
|
122efacc52 | ||
|
|
7f536528d0 | ||
|
|
3982249ebf | ||
|
|
388bea2e72 | ||
|
|
921a760817 | ||
|
|
55bcec4dda | ||
|
|
bb08e8dc6a | ||
|
|
a82f950eb6 | ||
|
|
e2dbaab8ba | ||
|
|
3611bb5cc7 | ||
|
|
f01f599526 | ||
|
|
6847526ce8 | ||
|
|
c5f28a6a01 | ||
|
|
86d7d5fdc6 | ||
|
|
781f4d489a | ||
|
|
5a42426048 | ||
|
|
44643f2cc6 | ||
|
|
d902515f4f | ||
|
|
f9df08aefd | ||
|
|
28b18e0d42 | ||
|
|
247c063791 | ||
|
|
ab248287cc | ||
|
|
9a26fc98b8 | ||
|
|
16a2ac8474 | ||
|
|
c4acf4cc41 | ||
|
|
4b0a2d27d0 | ||
|
|
2c6708bfe7 | ||
|
|
2880623cce | ||
|
|
17400ca337 | ||
|
|
3276f6db7a | ||
|
|
db59537adc | ||
|
|
4f1fd82923 | ||
|
|
f6ccb5970f | ||
|
|
c937b91267 | ||
|
|
2d1f32b950 | ||
|
|
8acba98bcc | ||
|
|
d7ba1b8335 | ||
|
|
d20e9bfd94 | ||
|
|
3d54a86bd8 | ||
|
|
c9883f5eb4 | ||
|
|
8bd36fac25 | ||
|
|
ab4d507d9f | ||
|
|
9efb985260 | ||
|
|
2c2c227187 | ||
|
|
63cca6756e | ||
|
|
b0d7fefa5e | ||
|
|
35a5cb47d9 | ||
|
|
dfc4383271 | ||
|
|
185431a733 | ||
|
|
5b68a01186 | ||
|
|
2c4dd4085f | ||
|
|
4d3ff0e9c9 | ||
|
|
ee6182bb23 | ||
|
|
9576d6e034 | ||
|
|
227ddc87d2 | ||
|
|
b3b7730b2c | ||
|
|
075a155f13 | ||
|
|
79a3b66e43 | ||
|
|
fe58968718 | ||
|
|
276e73e724 | ||
|
|
01dd916498 | ||
|
|
6ebf9792ac | ||
|
|
02f8195b5b | ||
|
|
7b4946f41d | ||
|
|
5f4c90128f | ||
|
|
6a2a30e319 | ||
|
|
8a5f27e8d9 | ||
|
|
199bec40e1 | ||
|
|
9d32220275 | ||
|
|
8b689d6df8 | ||
|
|
490005ae69 | ||
|
|
575778ab85 | ||
|
|
85ee162d58 | ||
|
|
712fa6a1ad | ||
|
|
819481adcd | ||
|
|
bc26227443 | ||
|
|
ac43ca947e | ||
|
|
4451d8aaf4 | ||
|
|
79a9e15c5a | ||
|
|
5403cdb28e | ||
|
|
272f37374e | ||
|
|
4147578dc8 | ||
|
|
65bd03c272 | ||
|
|
4835e89c5f | ||
|
|
7ea4516545 | ||
|
|
2f208fe08a | ||
|
|
db584baed3 | ||
|
|
1d41627fb1 | ||
|
|
63b8d4c8cb | ||
|
|
8e60ecd070 | ||
|
|
6ee173791e | ||
|
|
b9d72c0a40 | ||
|
|
36b2e01d88 | ||
|
|
569315f6dc | ||
|
|
a4fab8afed | ||
|
|
d1e3c35693 | ||
|
|
d12f3c4854 | ||
|
|
e32903f36f | ||
|
|
ab126c336c | ||
|
|
79a6d62506 | ||
|
|
08f691b5b6 | ||
|
|
b12632fd1a | ||
|
|
54f3ab4634 | ||
|
|
415168d040 | ||
|
|
6be313144e | ||
|
|
98e571c94b | ||
|
|
1561c464e9 | ||
|
|
4992d599aa | ||
|
|
90b3dfe0db | ||
|
|
ab87c5b1e8 | ||
|
|
3ee6c065cf | ||
|
|
d1249d2b44 | ||
|
|
94a70d3b2e | ||
|
|
b67162eb43 | ||
|
|
4390d35e00 | ||
|
|
19126c0d4d | ||
|
|
0cf0f6cb49 | ||
|
|
d3d3838761 | ||
|
|
4984026f6b | ||
|
|
bb7e825c41 | ||
|
|
bc96ddd555 | ||
|
|
ec85284f78 | ||
|
|
867287e740 | ||
|
|
2e93187021 | ||
|
|
2a19d67974 | ||
|
|
176f7e4271 | ||
|
|
3a6c60d912 | ||
|
|
066c28adb4 | ||
|
|
364ed3209c | ||
|
|
dab6ec28af | ||
|
|
b221250ba7 | ||
|
|
215635634f | ||
|
|
184133a613 | ||
|
|
32248c75cf | ||
|
|
0671c0e89f | ||
|
|
2acadbe11b | ||
|
|
5688c71d2e | ||
|
|
d3c89618f1 | ||
|
|
478ffdb611 | ||
|
|
0b7e5781d5 | ||
|
|
446a53277e | ||
|
|
b2acc1b28d | ||
|
|
27d2fff725 | ||
|
|
0c1f9b3e25 | ||
|
|
cfa4039e9e | ||
|
|
7b62b21e6f | ||
|
|
cc3af4ae7e | ||
|
|
09c44fc935 | ||
|
|
92f441d51f | ||
|
|
d5912513ff | ||
|
|
6417bf3167 | ||
|
|
5bf0694734 | ||
|
|
7b95837663 | ||
|
|
40067df800 | ||
|
|
c5546d71d2 | ||
|
|
307c250240 | ||
|
|
ca1afaa0aa | ||
|
|
809a0b81b2 | ||
|
|
01d5456f9f | ||
|
|
b81605dcf9 | ||
|
|
bb3be2fd17 | ||
|
|
b34da7dd3e | ||
|
|
0cc97ba9f8 | ||
|
|
a754a24d3f | ||
|
|
df209436c8 | ||
|
|
6abd06d435 | ||
|
|
43f6a9fac9 | ||
|
|
e07a152d46 | ||
|
|
e73dcad9a8 | ||
|
|
87de27e4ec | ||
|
|
e851abfd4f | ||
|
|
561dfd2d2e | ||
|
|
4e716ac53b | ||
|
|
12cd7908ef | ||
|
|
1e1cb435a2 | ||
|
|
0bd6d4fdbd | ||
|
|
9f2bd7f2e7 | ||
|
|
a6c5de6ef3 | ||
|
|
86046993b8 | ||
|
|
f7106833ed | ||
|
|
ef35b93569 | ||
|
|
2f5649a90a | ||
|
|
efd07a9afb | ||
|
|
2fad9b2563 | ||
|
|
8d2b74b254 | ||
|
|
3f1a614ac6 | ||
|
|
326284853c | ||
|
|
3ae337b3d8 | ||
|
|
fbef209d2d | ||
|
|
544b060691 | ||
|
|
63bceb49ca | ||
|
|
be9265cb97 | ||
|
|
c7286f8e48 | ||
|
|
a8e76e9198 | ||
|
|
be09af8ca6 | ||
|
|
d47533db08 | ||
|
|
c34944912b | ||
|
|
67b764026f | ||
|
|
9b74665e94 | ||
|
|
855d708464 | ||
|
|
760ecc6ae6 | ||
|
|
2f4bcb17b6 | ||
|
|
78e7517363 | ||
|
|
27e4af57f1 | ||
|
|
1d029a6c3a | ||
|
|
fe547cf56b | ||
|
|
9bddff99d8 | ||
|
|
11fc8a3fa7 | ||
|
|
075ca4715e | ||
|
|
991299b4fc | ||
|
|
84d85c29b7 | ||
|
|
5f1167f0de | ||
|
|
d74b26fbda | ||
|
|
838a60172d | ||
|
|
d6c05d2f9c | ||
|
|
25e74767be | ||
|
|
742a3fcafe | ||
|
|
45f0e14582 | ||
|
|
937c810f7a | ||
|
|
80a68e9a37 | ||
|
|
ce6b3439c9 | ||
|
|
12dd1cb314 | ||
|
|
d420bf0007 | ||
|
|
8e885a8890 | ||
|
|
a5160fbb8a | ||
|
|
2e1ec07b23 | ||
|
|
0dc78a7e72 | ||
|
|
ebd7712862 | ||
|
|
25beefd973 | ||
|
|
2ee65a9bd2 | ||
|
|
d986a5e116 | ||
|
|
8018ce7283 | ||
|
|
a5cdbffa4c | ||
|
|
3b690eac53 | ||
|
|
1cdca18538 | ||
|
|
6d77045aa1 | ||
|
|
b02234f9fc | ||
|
|
eb10f07711 | ||
|
|
f15a503936 | ||
|
|
c580aecb11 | ||
|
|
81879afa32 | ||
|
|
1cb4edb651 | ||
|
|
26e04db950 | ||
|
|
fade902fc0 | ||
|
|
e072fc75c6 | ||
|
|
94da52c0e4 | ||
|
|
56c3290e1c | ||
|
|
e0f1ad8d4f | ||
|
|
bd4ec047c3 | ||
|
|
e3b3cb77d1 | ||
|
|
5a8804630b | ||
|
|
0df8b938d8 | ||
|
|
7180f4eaa7 | ||
|
|
2a55617e3a | ||
|
|
1777d584fe | ||
|
|
edd9ea02e1 | ||
|
|
119d9158c0 | ||
|
|
0e073a01fd | ||
|
|
4e9fdb206c | ||
|
|
0a08d57426 | ||
|
|
c316c50f30 | ||
|
|
81716be512 | ||
|
|
1d273ac651 | ||
|
|
7dc815cd86 | ||
|
|
d6f771e6b2 | ||
|
|
3aeb0569b1 | ||
|
|
bf2c5d59ab | ||
|
|
94b2309945 | ||
|
|
e81c9c5b2d | ||
|
|
900bdc03ca | ||
|
|
5a73ad77f2 | ||
|
|
1c6a29940a | ||
|
|
adb0ae969d | ||
|
|
ae5783ce9f | ||
|
|
4408b36ffb | ||
|
|
8708778596 | ||
|
|
b045c88158 | ||
|
|
0235660642 | ||
|
|
3d90d22b56 | ||
|
|
7ac3993543 | ||
|
|
79294e95c7 | ||
|
|
2e9256a630 | ||
|
|
0e0992e6d4 | ||
|
|
5be7896d8b | ||
|
|
25c659ba03 | ||
|
|
e38a4b40b5 | ||
|
|
de16acbcf4 | ||
|
|
486cb295ac | ||
|
|
dd3fe24294 | ||
|
|
59bdedecbb | ||
|
|
fc3d049019 | ||
|
|
de150e7349 | ||
|
|
06b3f61d37 | ||
|
|
82b96d5ebe | ||
|
|
f2b4d468c2 | ||
|
|
1c0f5c381b | ||
|
|
fb25421ab0 | ||
|
|
4890b4a71c | ||
|
|
e38732a81c | ||
|
|
2a78354b17 | ||
|
|
3fb4347277 | ||
|
|
081e88ead4 | ||
|
|
73f41f8fc6 | ||
|
|
f233f59079 | ||
|
|
9644b00690 | ||
|
|
543e319c25 | ||
|
|
b7ef70f5c6 | ||
|
|
af171f8812 | ||
|
|
8ec3cade06 | ||
|
|
bec8be46ca | ||
|
|
ac7f809132 | ||
|
|
fcb241fab8 | ||
|
|
fbdcf2fa2d | ||
|
|
73c821e07b | ||
|
|
422ddd7ee8 | ||
|
|
943ad974ec | ||
|
|
12a5d59e89 | ||
|
|
85286651dd | ||
|
|
e9b3efe3d5 | ||
|
|
0f06ac0253 | ||
|
|
75fa1aa1e2 | ||
|
|
7d642a21f5 | ||
|
|
4e1421180c | ||
|
|
f0a72645d7 | ||
|
|
86b8e0a904 | ||
|
|
789e6a6962 | ||
|
|
f03b300d72 | ||
|
|
6b0822c0f6 | ||
|
|
d9774cab87 | ||
|
|
f07f9f3718 | ||
|
|
486be0973b | ||
|
|
9246dd00d3 | ||
|
|
baf515791d | ||
|
|
876450d764 | ||
|
|
44e90e255b | ||
|
|
41026ab851 | ||
|
|
d8509c431d | ||
|
|
66df65eb80 | ||
|
|
30641a5809 | ||
|
|
574523daec | ||
|
|
1913605d16 | ||
|
|
8aeecab51f | ||
|
|
9fd5d6a187 | ||
|
|
4568ebb41a | ||
|
|
2777d8af89 | ||
|
|
0c09c22306 | ||
|
|
3f9b997ffa | ||
|
|
df379ee234 | ||
|
|
acd628637e | ||
|
|
155dbfbff1 | ||
|
|
eda3d74c54 | ||
|
|
4b9f393cee | ||
|
|
069da63d1f | ||
|
|
3fbe58b027 | ||
|
|
aa6b5ab028 | ||
|
|
b2ee4e0b5e | ||
|
|
34ab0c6252 | ||
|
|
a8116a7f35 | ||
|
|
8c65129bb4 | ||
|
|
acaf6a7679 | ||
|
|
8044a8a824 | ||
|
|
1ec03b83b6 | ||
|
|
44caf24126 | ||
|
|
a125195695 | ||
|
|
d27385dfa4 | ||
|
|
68bd670d7c | ||
|
|
42eda428ae | ||
|
|
6504ebb9fb | ||
|
|
6332615b08 | ||
|
|
e054c393ea | ||
|
|
85c30b9425 | ||
|
|
5f5d96a1c7 | ||
|
|
2bce1af454 | ||
|
|
d45527f72e | ||
|
|
bd3acf1889 | ||
|
|
347fcf503f | ||
|
|
12c3379e9a | ||
|
|
77a871239d | ||
|
|
337d345ded | ||
|
|
34de9c3586 | ||
|
|
cb28221c58 | ||
|
|
64903038e0 | ||
|
|
4cbc6031f8 | ||
|
|
66f619bb4f | ||
|
|
09a0ed153b | ||
|
|
e8fa981225 | ||
|
|
54f9907238 | ||
|
|
8525f85d59 | ||
|
|
7293ddaa90 | ||
|
|
3ec6a61763 | ||
|
|
7874bbca27 | ||
|
|
b978eaf3f1 | ||
|
|
b2817cb3ba | ||
|
|
ab265d1689 | ||
|
|
527c4c7f91 | ||
|
|
7c506a3fe2 | ||
|
|
217dc875d5 | ||
|
|
489052141d | ||
|
|
62553f4227 | ||
|
|
89c18f8488 | ||
|
|
a8a2197f91 | ||
|
|
535f502169 | ||
|
|
bcc4dd4018 | ||
|
|
eebdd61e47 | ||
|
|
b3e2b0f77f | ||
|
|
fbf487c9ad | ||
|
|
c0d23c80e6 | ||
|
|
6b8931699b | ||
|
|
3b41398ef2 | ||
|
|
73ee6f7ced | ||
|
|
c59595a669 | ||
|
|
c85f27fa80 | ||
|
|
1ab4023200 | ||
|
|
50fdd1869e | ||
|
|
d8153fee52 | ||
|
|
d5323fd050 | ||
|
|
84bfc3687e | ||
|
|
dd06e2b28a | ||
|
|
add1e4eb5d | ||
|
|
5a7a650f83 | ||
|
|
0427f16e72 | ||
|
|
89ec689a46 | ||
|
|
4ae5fb7215 | ||
|
|
241179a924 | ||
|
|
ad16d05c42 | ||
|
|
3ef550d8b1 | ||
|
|
26f330c762 | ||
|
|
79eb43fca3 | ||
|
|
712fbc3ee8 | ||
|
|
0add9bad97 | ||
|
|
b308cc8ce3 | ||
|
|
3920654370 | ||
|
|
503637cb0a | ||
|
|
45ff48d9ac | ||
|
|
47b6f0f3c3 | ||
|
|
a6dd914e83 | ||
|
|
7832783388 | ||
|
|
37553ea889 | ||
|
|
419841d9f9 | ||
|
|
a4c14aa23e | ||
|
|
d71879cc4d | ||
|
|
ca14fa05e5 | ||
|
|
4f4c90d129 | ||
|
|
c56d953516 | ||
|
|
b58e9b9074 | ||
|
|
85d227c926 | ||
|
|
b9d97bb2d8 | ||
|
|
4fc09c348a | ||
|
|
795d73dd19 | ||
|
|
01130b858e | ||
|
|
85ea808119 | ||
|
|
44765d5b6e | ||
|
|
853d112737 | ||
|
|
8881746941 | ||
|
|
d3ee82cccc | ||
|
|
947f440600 | ||
|
|
8e887395f1 | ||
|
|
3f42b8ab51 | ||
|
|
52a8e24d9e | ||
|
|
80248e82f9 | ||
|
|
647964fe99 | ||
|
|
010018b400 | ||
|
|
4783eab37c | ||
|
|
f693d562ba | ||
|
|
964b19be01 | ||
|
|
00c768919d | ||
|
|
c9415b2c02 | ||
|
|
93d666a233 | ||
|
|
cc8538a332 | ||
|
|
f9d619f93a | ||
|
|
471714afd0 | ||
|
|
91ce0ed734 | ||
|
|
a35d2a77a2 | ||
|
|
ea31d58fb8 | ||
|
|
e74dee1892 | ||
|
|
d84fc40b23 | ||
|
|
0dd004825d | ||
|
|
9f36444169 | ||
|
|
52509c7950 | ||
|
|
868c441220 | ||
|
|
5ad408f61d | ||
|
|
9b30f9800c | ||
|
|
07e5ef647a | ||
|
|
47909ad46c | ||
|
|
99c92fad9e | ||
|
|
d7861614b7 | ||
|
|
b4a3e9cbd5 | ||
|
|
e58946f622 | ||
|
|
c8532c76c2 | ||
|
|
6f26ea7b50 | ||
|
|
a848dfac43 | ||
|
|
e5ea747cde | ||
|
|
34a782193b | ||
|
|
8498270df6 | ||
|
|
cd6ed7296b | ||
|
|
57541e560c | ||
|
|
6f877c3852 | ||
|
|
ca8d75e749 | ||
|
|
0dc073ca48 | ||
|
|
edbaf49e7a | ||
|
|
ca790a3799 | ||
|
|
3639bdc0ff | ||
|
|
6817eca793 | ||
|
|
03365eb050 | ||
|
|
df5744b861 | ||
|
|
bc602892b4 | ||
|
|
f49121b8a4 | ||
|
|
c31aab8237 | ||
|
|
8e7070d257 | ||
|
|
bf9a7fe7f4 | ||
|
|
00690dc351 | ||
|
|
2a4b9d29a1 | ||
|
|
4080540e03 | ||
|
|
e2bd7fa37c | ||
|
|
23ce2464ab | ||
|
|
fa6ea23533 | ||
|
|
eed5d21074 | ||
|
|
f5cb587e00 | ||
|
|
e395347421 | ||
|
|
7fec2f7468 | ||
|
|
44fc23d2f8 | ||
|
|
3dfaf1fdac | ||
|
|
972d113afb | ||
|
|
ffc6ca485f | ||
|
|
6a6771a7da | ||
|
|
15e4f9d3a5 | ||
|
|
843aeae581 | ||
|
|
26703ed04e | ||
|
|
4663d71eac | ||
|
|
cd2c170327 | ||
|
|
2f211e8514 | ||
|
|
69a446c987 | ||
|
|
3aace3ee3f | ||
|
|
186fd0c9f7 | ||
|
|
cc8f3fda9c | ||
|
|
b48c678800 | ||
|
|
2f7fd22b09 | ||
|
|
b50c940b24 | ||
|
|
f341d1d312 | ||
|
|
19e0e22ebf | ||
|
|
347eaf269b | ||
|
|
51ed5dbef2 | ||
|
|
aa0a96c3c5 | ||
|
|
a51c6136c2 | ||
|
|
457536b781 | ||
|
|
b514a48b37 | ||
|
|
b7dd646594 | ||
|
|
616419be7a | ||
|
|
df74e162bd | ||
|
|
25374847f6 | ||
|
|
7289c78fec | ||
|
|
33ca7734e5 | ||
|
|
58ab5efa6e | ||
|
|
01d2f5ae5f | ||
|
|
07542aa2b1 | ||
|
|
83f76154ff | ||
|
|
3996a60bf5 | ||
|
|
0cecc6e4c5 | ||
|
|
14011a8246 | ||
|
|
78ed11bd62 | ||
|
|
5b5d2d88e5 | ||
|
|
5bddc22da5 | ||
|
|
3d9c6c5fce | ||
|
|
a06161bbfa | ||
|
|
837ec60062 | ||
|
|
4b3b4d33ff | ||
|
|
400bad5eae | ||
|
|
346149a259 | ||
|
|
7e895b0405 | ||
|
|
b6ab0f306b | ||
|
|
315bd81197 | ||
|
|
8b73ca434b | ||
|
|
b1d7a026a1 | ||
|
|
ed9401427e | ||
|
|
8c8f7b3b38 | ||
|
|
bf2ef355b7 | ||
|
|
3f1a794148 | ||
|
|
a0cedde4b7 | ||
|
|
eb23778bec | ||
|
|
5353101fff | ||
|
|
d32f91e6b8 | ||
|
|
f0d07466cd | ||
|
|
49bcc86c4e | ||
|
|
e7b29b1a2e | ||
|
|
b2c030c275 | ||
|
|
9e92450700 | ||
|
|
2eab516216 | ||
|
|
808dd0f670 | ||
|
|
171ad8b271 | ||
|
|
50585e40c8 | ||
|
|
9a14eef55e | ||
|
|
264710a1fb | ||
|
|
c649b9a5fe | ||
|
|
7ab6515a10 | ||
|
|
38f40cadbf | ||
|
|
9febcf8166 | ||
|
|
4ae197618e | ||
|
|
4dac7d28e4 | ||
|
|
589ed15ac2 | ||
|
|
e944b8a8fa | ||
|
|
2c5ec62c11 | ||
|
|
6b7ec2adc6 | ||
|
|
20c8c3e7c8 | ||
|
|
ceb6bd6f5a | ||
|
|
9c4ff8c064 | ||
|
|
4f364acecc | ||
|
|
f701075cf3 | ||
|
|
d498feee31 | ||
|
|
ecae40ece8 | ||
|
|
2eb4bab240 | ||
|
|
9e666a74e1 | ||
|
|
f89f9ae35b | ||
|
|
2cfda2272d | ||
|
|
256545ab62 | ||
|
|
d63587fcd1 | ||
|
|
18778db7c3 | ||
|
|
fb23ba8522 | ||
|
|
15ea04d7c9 | ||
|
|
154fb39794 | ||
|
|
a02de9790a | ||
|
|
98f40ac920 | ||
|
|
555e6959da | ||
|
|
f8520cd379 | ||
|
|
aee41cc3d4 | ||
|
|
0d8135a09e | ||
|
|
2c7b5c44f1 | ||
|
|
1a73ea7f58 | ||
|
|
4355a987ca | ||
|
|
bf7351c57d | ||
|
|
0c3090b716 | ||
|
|
daace77eb3 | ||
|
|
9e9dd9e9de | ||
|
|
59e5228b1d | ||
|
|
e93b06f471 | ||
|
|
93d69711d6 | ||
|
|
b495266a41 | ||
|
|
4acd1015b9 | ||
|
|
509ad76f2c | ||
|
|
1e7ce92839 | ||
|
|
d960fb3c04 | ||
|
|
0b873977e8 | ||
|
|
1cbde8a1e1 | ||
|
|
45173fa069 | ||
|
|
af543a72e2 | ||
|
|
a7633d2106 | ||
|
|
5e4bb6f105 | ||
|
|
e526530ef0 | ||
|
|
449235843e | ||
|
|
591e85eded | ||
|
|
f8673a97ed | ||
|
|
7aa4e62bbf | ||
|
|
0225d27abb | ||
|
|
e14aa93748 | ||
|
|
3b0fcf7be7 | ||
|
|
ae03c9dc2a | ||
|
|
b19d38a64f | ||
|
|
92eb829041 | ||
|
|
4ea57510ed | ||
|
|
d389b5acec | ||
|
|
eb08cb5aa1 | ||
|
|
d102cb3778 | ||
|
|
bfb30c472b | ||
|
|
4ad9d5cfca | ||
|
|
2c49d1dc65 | ||
|
|
fcd82324a9 | ||
|
|
b4df1d1444 | ||
|
|
181ba089c2 | ||
|
|
394c1dd438 | ||
|
|
2ff6e99385 | ||
|
|
3614612ac2 | ||
|
|
dfeb4e79a4 | ||
|
|
a606c5a375 | ||
|
|
4e698b693c | ||
|
|
208beff5e5 | ||
|
|
0eb81eec04 | ||
|
|
35f5d132c8 | ||
|
|
02cc2496f0 | ||
|
|
d84eaa203a | ||
|
|
e0d372e9bb | ||
|
|
b7a54f6aef | ||
|
|
9d65477af7 | ||
|
|
73cdc890f2 | ||
|
|
e8afb49685 | ||
|
|
716bc7bcf6 | ||
|
|
a05ae8c043 | ||
|
|
bc487f8655 | ||
|
|
2708b5a15b | ||
|
|
b52e705dc4 | ||
|
|
1a5584bcfc | ||
|
|
8238f569c6 | ||
|
|
1051d0c5e5 | ||
|
|
8fe2540f91 | ||
|
|
6232903691 | ||
|
|
819d2fc3b8 | ||
|
|
565a64b0e3 | ||
|
|
18f291345d | ||
|
|
67df399f14 | ||
|
|
222359692e | ||
|
|
288db165a7 | ||
|
|
5c5636aa24 | ||
|
|
8e449763a1 | ||
|
|
002de7bcef | ||
|
|
db616eaa95 | ||
|
|
8eaa59f0ce | ||
|
|
d121973e85 | ||
|
|
30367a9204 | ||
|
|
ab10629b84 | ||
|
|
f7d04365cd | ||
|
|
618914dbf1 | ||
|
|
2d107b1617 | ||
|
|
4922a84ee5 | ||
|
|
2dcb530bef | ||
|
|
22a357c3dd | ||
|
|
0de869e91a | ||
|
|
8d58e02816 | ||
|
|
cfcfa3a999 | ||
|
|
55a1f7a4ce | ||
|
|
28182eb776 | ||
|
|
fa096d627e | ||
|
|
662ac1fc84 | ||
|
|
e676a15609 | ||
|
|
7a0292756d | ||
|
|
d753926967 | ||
|
|
76b2803ce8 | ||
|
|
d26420a3e0 | ||
|
|
6b6e0c6e22 | ||
|
|
45c49e60be | ||
|
|
9733cf0430 | ||
|
|
c57a758ed3 | ||
|
|
acbf99dc4a | ||
|
|
11576c1e66 | ||
|
|
a998797435 | ||
|
|
eb9d9145f1 | ||
|
|
9371938a00 | ||
|
|
eeac1586f5 | ||
|
|
384a0c2252 | ||
|
|
ec9845364d | ||
|
|
93944aad55 | ||
|
|
d992cd3f63 |
1
.envrc
@@ -2,7 +2,6 @@ if ! has nix_direnv_version || ! nix_direnv_version 2.2.1; then
|
||||
source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/2.2.1/direnvrc" "sha256-zelF0vLbEl5uaqrfIzbgNzJWGmLzCmYAkInj/LNxvKs="
|
||||
fi
|
||||
|
||||
nix_direnv_watch_file rust-toolchain.toml
|
||||
nix_direnv_watch_file package.json
|
||||
if ! use flake . --impure
|
||||
then
|
||||
|
||||
31
.github/CODEOWNERS
vendored
@@ -2,23 +2,22 @@
|
||||
* @Eirenliel
|
||||
|
||||
# Make everyone be able to approve SolarXR submodule changes
|
||||
/solarxr-protocol @ButterscotchV @Erimelowo @ImUrX @loucass003
|
||||
/solarxr-protocol @ButterscotchV @Erimelowo @loucass003
|
||||
|
||||
# Make Loucas and Uriel the owners of all GUI stuff
|
||||
/gui/ @ImUrX @loucass003
|
||||
/pnpm-lock.yaml @ImUrX @loucass003
|
||||
/pnpm-workspace.yaml @ImUrX @loucass003
|
||||
# Make Loucass the owner of all GUI stuff
|
||||
/gui/ @loucass003
|
||||
/pnpm-lock.yaml @loucass003
|
||||
/pnpm-workspace.yaml @loucass003
|
||||
|
||||
# Uriel and Erimel responsible for i18n
|
||||
/gui/public/i18n/ @ImUrX @Erimelowo
|
||||
/gui/src/i18n/ @ImUrX @Erimelowo
|
||||
/l10n.toml @ImUrX @Erimelowo
|
||||
# loucass003 and Erimel responsible for i18n
|
||||
/gui/public/i18n/ @loucass003 @Erimelowo @ImSapphire
|
||||
/gui/src/i18n/ @loucass003 @Erimelowo
|
||||
/l10n.toml @loucass003 @Erimelowo
|
||||
|
||||
/gui/src/components/settings/ @Erimelowo @ImUrX
|
||||
/gui/src/components/settings/ @Erimelowo @loucass003
|
||||
|
||||
# Rust part of the GUI
|
||||
/gui/src-tauri/ @ImUrX
|
||||
/Cargo.lock @ImUrX
|
||||
/gui/electron/ @loucass003
|
||||
|
||||
# Some server code~
|
||||
/server/ @ButterscotchV @Eirenliel @Erimelowo
|
||||
@@ -32,7 +31,7 @@
|
||||
/server/src/main/java/dev/slimevr/filtering/ @Erimelowo
|
||||
|
||||
# Linux files
|
||||
*.nix @ImUrX
|
||||
/flake.lock @ImUrX
|
||||
/dev.slimevr.SlimeVR.metainfo.xml @ImUrX
|
||||
/.envrc @ImUrX
|
||||
*.nix @loucass003
|
||||
/flake.lock @loucass003
|
||||
/dev.slimevr.SlimeVR.metainfo.xml @loucass003
|
||||
/.envrc @loucass003
|
||||
|
||||
37
.github/labeler.yml
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
"Area: Continuous Integration":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: ".github/**"
|
||||
"Area: Application Protocol":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: ["solarxr-protocol"]
|
||||
"Area: AutoBone":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: "server/core/src/main/java/dev/slimevr/autobone/**"
|
||||
"Area: Documentation":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: "**/*.md"
|
||||
"Area: GUI":
|
||||
- all:
|
||||
- changed-files:
|
||||
- all-globs-to-any-file: ["gui/**/*", "!gui/public/i18n/**/*"]
|
||||
"Area: Hardware Protocol":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: "server/core/src/main/java/dev/slimevr/tracking/trackers/udp/**"
|
||||
"Area: Server":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: ["server/**", "*gradle*", "gradle/**"]
|
||||
"Area: Skeletal Model":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: "server/core/src/main/java/dev/slimevr/tracking/processor/**"
|
||||
"Area: SteamVR Driver":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: "server/desktop/src/main/java/dev/slimevr/desktop/platform/**"
|
||||
"Area: Translation":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: "gui/public/i18n/**"
|
||||
"Area: VMC":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: ["server/core/src/main/java/dev/slimevr/osc/Unity*", "server/core/src/main/java/dev/slimevr/osc/VMC*", "server/core/src/main/java/dev/slimevr/osc/VRM*"]
|
||||
"Area: VRCOSC":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: ["server/core/src/main/java/dev/slimevr/osc/VRC*"]
|
||||
113
.github/workflows/build-gui.yml
vendored
@@ -1,113 +0,0 @@
|
||||
name: Build GUI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- .github/workflows/build-gui.yml
|
||||
- gui/**
|
||||
- package*.json
|
||||
pull_request:
|
||||
paths:
|
||||
- .github/workflows/build-gui.yml
|
||||
- gui/**
|
||||
- package*.json
|
||||
workflow_dispatch:
|
||||
create:
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
pnpm i
|
||||
cd gui
|
||||
pnpm run lint
|
||||
|
||||
build:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ubuntu-22.04, windows-latest, macos-latest]
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
env:
|
||||
# Don't mark warnings as errors
|
||||
CI: false
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- if: matrix.os == 'ubuntu-22.04'
|
||||
name: Set up Linux dependencies
|
||||
uses: awalsh128/cache-apt-pkgs-action@latest
|
||||
with:
|
||||
packages: libgtk-3-dev webkit2gtk-4.1 libappindicator3-dev librsvg2-dev patchelf
|
||||
# Increment to invalidate the cache
|
||||
version: 1.0
|
||||
# Enables a workaround to attempt to run pre and post install scripts
|
||||
execute_install_scripts: true
|
||||
# Disables uploading logs as a build artifact
|
||||
debug: false
|
||||
|
||||
- name: Cache cargo dependencies
|
||||
uses: Swatinem/rust-cache@v2
|
||||
with:
|
||||
shared-key: "${{ matrix.os }}"
|
||||
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Build
|
||||
shell: bash
|
||||
run: |
|
||||
pnpm i
|
||||
pnpm run skipbundler --config $( ./gui/scripts/gitversion.mjs )
|
||||
|
||||
- if: matrix.os == 'windows-latest'
|
||||
name: Upload a Build Artifact (Windows)
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
# Artifact name
|
||||
name: SlimeVR-GUI-Windows
|
||||
# A file, directory or wildcard pattern that describes what to upload
|
||||
path: target/release/slimevr.exe
|
||||
|
||||
- if: matrix.os == 'ubuntu-22.04'
|
||||
name: Upload a Build Artifact (Linux)
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
# Artifact name
|
||||
name: SlimeVR-GUI-Linux
|
||||
# A file, directory or wildcard pattern that describes what to upload
|
||||
path: target/release/slimevr
|
||||
|
||||
- if: matrix.os == 'macos-latest'
|
||||
name: Upload a Build Artifact (macOS)
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
# Artifact name
|
||||
name: SlimeVR-GUI-macOS
|
||||
# A file, directory or wildcard pattern that describes what to upload
|
||||
path: target/release/slimevr
|
||||
291
.github/workflows/build.yml
vendored
Normal file
@@ -0,0 +1,291 @@
|
||||
name: SlimeVR Full Build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
tags: ["v*"]
|
||||
pull_request:
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
setup-matrix:
|
||||
name: Configure Build Matrix
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
matrix: ${{ steps.set-matrix.outputs.matrix }}
|
||||
steps:
|
||||
- id: set-matrix
|
||||
shell: bash
|
||||
run: |
|
||||
BASE='[{"os":"ubuntu-22.04","platform":"linux"},{"os":"windows-latest","platform":"windows"},{"os":"macos-latest","platform":"macos"}]'
|
||||
EXTRA='[{"os":"ubuntu-22.04-arm","platform":"linux"},{"os":"windows-11-arm","platform":"windows"}]'
|
||||
|
||||
if [[ "${{ github.ref }}" == refs/tags/v* || "${{ github.ref }}" == refs/heads/main || "${{ github.event_name }}" == "workflow_dispatch" ]]; then
|
||||
RESULT=$(echo "$BASE $EXTRA" | jq -c -s 'add')
|
||||
else
|
||||
RESULT=$(echo "$BASE" | jq -c '.')
|
||||
fi
|
||||
echo "matrix={\"include\":$RESULT}" >> "$GITHUB_OUTPUT"
|
||||
gui-checks:
|
||||
name: Gui Checks
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Get tags
|
||||
run: git fetch --tags origin --recurse-submodules=no --force
|
||||
- name: Setup PNPM
|
||||
uses: pnpm/action-setup@v4
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
- name: GUI Lint
|
||||
run: pnpm i && cd gui && pnpm run lint
|
||||
|
||||
java-checks:
|
||||
name: Java Checks
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v5
|
||||
with:
|
||||
java-version: '17'
|
||||
distribution: 'adopt'
|
||||
- name: Setup Gradle
|
||||
uses: gradle/actions/setup-gradle@v5
|
||||
- name: Java Spotless Check
|
||||
run: ./gradlew spotlessCheck --build-cache
|
||||
|
||||
|
||||
build-server-jar:
|
||||
name: Build Desktop Server
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Get tags
|
||||
run: git fetch --tags origin --recurse-submodules=no --force
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v5
|
||||
with:
|
||||
java-version: '17'
|
||||
distribution: 'adopt'
|
||||
- name: Setup Gradle
|
||||
uses: gradle/actions/setup-gradle@v5
|
||||
- name: Build ShadowJar
|
||||
run: ./gradlew :server:desktop:shadowJar --build-cache
|
||||
- name: Test with Gradle
|
||||
run: ./gradlew :server:desktop:test
|
||||
- name: Upload Server Jar
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: server-jar
|
||||
path: |
|
||||
server/desktop/build/libs/slimevr.jar
|
||||
server/core/resources
|
||||
|
||||
build-gui-frontend:
|
||||
name: Build GUI Assets
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Get tags
|
||||
run: git fetch --tags origin --recurse-submodules=no --force
|
||||
- name: Setup PNPM
|
||||
uses: pnpm/action-setup@v4
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
- name: Build JS
|
||||
env:
|
||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||
run: pnpm i && cd gui && pnpm run build
|
||||
- name: Tar GUI Dist
|
||||
run: tar -czf slimevr-gui-dist.tar.gz -C gui/out .
|
||||
- name: Upload GUI Dist
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: gui-dist
|
||||
path: slimevr-gui-dist.tar.gz
|
||||
|
||||
package-desktop:
|
||||
name: Package Desktop (${{ matrix.platform }} - ${{ matrix.os }})
|
||||
needs: [setup-matrix, build-server-jar, build-gui-frontend]
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix: ${{ fromJson(needs.setup-matrix.outputs.matrix) }}
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Get tags
|
||||
run: git fetch --tags origin --recurse-submodules=no --force
|
||||
- name: Setup PNPM
|
||||
uses: pnpm/action-setup@v4
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
- name: Download Server Jar
|
||||
uses: actions/download-artifact@v6
|
||||
with:
|
||||
name: server-jar
|
||||
path: server
|
||||
- name: Download GUI Dist
|
||||
uses: actions/download-artifact@v6
|
||||
with:
|
||||
name: gui-dist
|
||||
- name: Extract GUI for Electron
|
||||
shell: bash
|
||||
run: mkdir -p gui/out && tar -xzf slimevr-gui-dist.tar.gz -C gui/out
|
||||
- name: Run Electron Builder
|
||||
shell: bash
|
||||
env:
|
||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||
run: |
|
||||
mkdir -p gui/dist/artifacts/linux/ \
|
||||
gui/dist/artifacts/win \
|
||||
gui/dist/artifacts/mac
|
||||
cd gui
|
||||
pnpm i
|
||||
pnpm exec electron-builder --${{ matrix.platform }} \
|
||||
${{ matrix.platform == 'macos' && '--universal' || '' }} \
|
||||
--publish never
|
||||
- name: Collect and Rename Artifacts
|
||||
shell: bash
|
||||
run: |
|
||||
SRC_DIR="${{ github.workspace }}/gui/dist/artifacts"
|
||||
DEST_DIR="${{ github.workspace }}/release-out"
|
||||
mkdir -p "$DEST_DIR"
|
||||
|
||||
if [ "${{ matrix.platform }}" == "windows" ]; then
|
||||
[[ "${{ matrix.os }}" == *"arm"* ]] && SUFFIX="win-aarch64" || SUFFIX="win64"
|
||||
cp "$SRC_DIR"/win/*.zip "$DEST_DIR/SlimeVR-$SUFFIX.zip"
|
||||
|
||||
elif [ "${{ matrix.platform }}" == "linux" ]; then
|
||||
for f in "$SRC_DIR"/linux/*; do
|
||||
[ -d "$f" ] && continue
|
||||
BASE=$(basename "$f")
|
||||
NEW_NAME=$(echo "$BASE" | sed -e 's/x86_64/amd64/g' -e 's/arm64/aarch64/g')
|
||||
cp "$f" "$DEST_DIR/$NEW_NAME"
|
||||
done
|
||||
|
||||
elif [ "${{ matrix.platform }}" == "macos" ]; then
|
||||
cp "$SRC_DIR"/mac/*.dmg "$DEST_DIR/SlimeVR-mac.dmg"
|
||||
fi
|
||||
|
||||
echo "Collected files:"
|
||||
ls -lh "$DEST_DIR"
|
||||
- name: Upload For Release
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: release-${{ matrix.platform }}-${{ matrix.os }}
|
||||
path: release-out/*
|
||||
|
||||
bundle-android:
|
||||
name: Build Android APK
|
||||
needs: [build-gui-frontend]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Get tags
|
||||
run: git fetch --tags origin --recurse-submodules=no --force
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v5
|
||||
with:
|
||||
java-version: '17'
|
||||
distribution: 'adopt'
|
||||
- name: Setup Gradle
|
||||
uses: gradle/actions/setup-gradle@v5
|
||||
- name: Download GUI Dist
|
||||
uses: actions/download-artifact@v6
|
||||
with:
|
||||
name: gui-dist
|
||||
- name: Extract GUI for Android
|
||||
run: mkdir -p gui/out && tar -xzf slimevr-gui-dist.tar.gz -C gui/out
|
||||
- name: Build APK
|
||||
run: ./gradlew :server:android:build --build-cache
|
||||
env:
|
||||
ANDROID_STORE_FILE: ${{ secrets.ANDROID_STORE_FILE }}
|
||||
ANDROID_STORE_PASSWD: ${{ secrets.ANDROID_STORE_PASSWD }}
|
||||
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
|
||||
ANDROID_KEY_PASSWD: ${{ secrets.ANDROID_KEY_PASSWD }}
|
||||
- name: Test with Gradle
|
||||
run: ./gradlew test
|
||||
- name: Prepare APK
|
||||
run: cp server/android/build/outputs/apk/release/*.apk ./SlimeVR-android.apk
|
||||
- name: Upload APK
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: release-android
|
||||
path: SlimeVR-android.apk
|
||||
|
||||
- name: Build Google Play release bundle
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
run: ./gradlew :server:android:bundleRelease
|
||||
env:
|
||||
ANDROID_STORE_FILE: ${{ secrets.ANDROID_GPLAY_STORE_FILE }}
|
||||
ANDROID_STORE_PASSWD: ${{ secrets.ANDROID_GPLAY_STORE_PASSWD }}
|
||||
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_GPLAY_KEY_ALIAS }}
|
||||
ANDROID_KEY_PASSWD: ${{ secrets.ANDROID_GPLAY_KEY_PASSWD }}
|
||||
|
||||
- name: Upload the Google Play artifact
|
||||
uses: actions/upload-artifact@v6
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
with:
|
||||
# Artifact name
|
||||
name: 'SlimeVR-Android-GPDev' # optional, default is artifact
|
||||
# A file, directory or wildcard pattern that describes what to upload
|
||||
path: server/android/build/outputs/bundle/release/*
|
||||
|
||||
create-release:
|
||||
name: Finalize Release Draft
|
||||
needs: [package-desktop, bundle-android, build-server-jar, build-gui-frontend]
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Download All Release Artifacts
|
||||
uses: actions/download-artifact@v6
|
||||
with:
|
||||
pattern: release-*
|
||||
path: release-out
|
||||
merge-multiple: true
|
||||
- name: Download Server Jar
|
||||
uses: actions/download-artifact@v6
|
||||
with:
|
||||
name: server-jar
|
||||
path: server
|
||||
- name: Download GUI Dist
|
||||
uses: actions/download-artifact@v6
|
||||
with:
|
||||
name: gui-dist
|
||||
- name: Create GitHub Release
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
draft: true
|
||||
generate_release_notes: true
|
||||
files: |
|
||||
release-out/*
|
||||
server/desktop/build/libs/slimevr.jar
|
||||
slimevr-gui-dist.tar.gz
|
||||
34
.github/workflows/generate-update-manifest.yml
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
# This workflow will build the update manifest for the updater and update a GitHub release
|
||||
|
||||
name: Generate update manifest
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
release:
|
||||
types: [released]
|
||||
|
||||
jobs:
|
||||
generate-manifest:
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
steps:
|
||||
- uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: '22.x'
|
||||
|
||||
- name: Generate update-manifest.json
|
||||
run: |
|
||||
npx @slimevr/update-manifest-generator@latest
|
||||
|
||||
- uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: "update-manifest.json"
|
||||
path: ./update-manifest.json
|
||||
|
||||
- name: Upload update-manifest.json to release
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
tag_name: ${{ secrets.UPDATE_MANIFEST_RELEASE_TAG }}
|
||||
files: ./update-manifest.json
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
357
.github/workflows/gradle.yaml
vendored
@@ -1,357 +0,0 @@
|
||||
# This workflow will build a Java project with Gradle
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
|
||||
|
||||
name: SlimeVR Server
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
pull_request:
|
||||
workflow_dispatch:
|
||||
create:
|
||||
|
||||
jobs:
|
||||
test:
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-latest, windows-latest]
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Get tags
|
||||
run: git fetch --tags origin --recurse-submodules=no --force
|
||||
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: "17"
|
||||
distribution: "adopt"
|
||||
|
||||
- name: Setup Gradle
|
||||
uses: gradle/actions/setup-gradle@v4
|
||||
|
||||
- run: mkdir ./gui/dist && touch ./gui/dist/somefile
|
||||
shell: bash
|
||||
|
||||
- name: Check code formatting
|
||||
run: ./gradlew spotlessCheck
|
||||
|
||||
- name: Test with Gradle
|
||||
run: ./gradlew test
|
||||
|
||||
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Get tags
|
||||
run: git fetch --tags origin --recurse-submodules=no --force
|
||||
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: "17"
|
||||
distribution: "adopt"
|
||||
|
||||
- name: Setup Gradle
|
||||
uses: gradle/actions/setup-gradle@v4
|
||||
|
||||
- name: Build with Gradle
|
||||
run: ./gradlew shadowJar
|
||||
|
||||
- name: Upload the Server JAR as a Build Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
# Artifact name
|
||||
name: "SlimeVR-Server" # optional, default is artifact
|
||||
# A file, directory or wildcard pattern that describes what to upload
|
||||
path: server/desktop/build/libs/*
|
||||
|
||||
- name: Upload to draft release
|
||||
uses: softprops/action-gh-release@v2
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
with:
|
||||
draft: true
|
||||
generate_release_notes: true
|
||||
files: |
|
||||
server/desktop/build/libs/*
|
||||
|
||||
|
||||
bundle-android:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Get tags
|
||||
run: git fetch --tags origin --recurse-submodules=no --force
|
||||
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: "17"
|
||||
distribution: "adopt"
|
||||
|
||||
- name: Setup Gradle
|
||||
uses: gradle/actions/setup-gradle@v4
|
||||
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Build GUI
|
||||
run: |
|
||||
pnpm i
|
||||
cd gui && pnpm run build
|
||||
|
||||
- name: Build with Gradle
|
||||
run: ./gradlew :server:android:assembleDebug
|
||||
|
||||
- name: Upload the Android Build Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
# Artifact name
|
||||
name: "SlimeVR-Android" # optional, default is artifact
|
||||
# A file, directory or wildcard pattern that describes what to upload
|
||||
path: server/android/build/outputs/apk/*
|
||||
|
||||
- name: Prepare for release
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
run: |
|
||||
cp server/android/build/outputs/apk/debug/android-debug.apk ./SlimeVR-android.apk
|
||||
|
||||
- name: Upload to draft release
|
||||
uses: softprops/action-gh-release@v2
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
with:
|
||||
draft: true
|
||||
generate_release_notes: true
|
||||
files: |
|
||||
./SlimeVR-android.apk
|
||||
|
||||
|
||||
bundle-linux:
|
||||
runs-on: ubuntu-22.04
|
||||
needs: [build, test]
|
||||
if: contains(fromJSON('["workflow_dispatch", "create"]'), github.event_name)
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: "SlimeVR-Server"
|
||||
path: server/desktop/build/libs/
|
||||
|
||||
- name: Set up Linux dependencies
|
||||
uses: awalsh128/cache-apt-pkgs-action@latest
|
||||
with:
|
||||
packages: libgtk-3-dev webkit2gtk-4.1 libappindicator3-dev librsvg2-dev patchelf libfuse2
|
||||
# Increment to invalidate the cache
|
||||
version: 1.0
|
||||
# Enables a workaround to attempt to run pre and post install scripts
|
||||
execute_install_scripts: true
|
||||
# Disables uploading logs as a build artifact
|
||||
debug: false
|
||||
|
||||
- name: Cache cargo dependencies
|
||||
uses: Swatinem/rust-cache@v2
|
||||
with:
|
||||
shared-key: "ubuntu-22.04"
|
||||
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
pnpm i
|
||||
pnpm run tauri build --config $( ./gui/scripts/gitversion.mjs )
|
||||
|
||||
- name: Make GUI tarball
|
||||
run: |
|
||||
tar czf slimevr-gui-dist.tar.gz -C gui/dist/ .
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: SlimeVR-GUI-Dist
|
||||
path: ./slimevr-gui-dist.tar.gz
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: SlimeVR-GUI-Deb
|
||||
path: target/release/bundle/deb/slimevr*.deb
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: SlimeVR-GUI-AppImage
|
||||
path: target/release/bundle/appimage/slimevr*.AppImage
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: SlimeVR-GUI-RPM
|
||||
path: target/release/bundle/rpm/slimevr*.rpm
|
||||
|
||||
- name: Prepare for release
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
run: |
|
||||
cp target/release/bundle/appimage/slimevr*.AppImage ./SlimeVR-amd64.appimage
|
||||
cp target/release/bundle/deb/slimevr*.deb ./SlimeVR-amd64.deb
|
||||
cp target/release/bundle/rpm/slimevr*.rpm ./SlimeVR-amd64.rpm
|
||||
|
||||
- name: Upload to draft release
|
||||
uses: softprops/action-gh-release@v2
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
with:
|
||||
draft: true
|
||||
generate_release_notes: true
|
||||
files: |
|
||||
./slimevr-gui-dist.tar.gz
|
||||
./SlimeVR-amd64.appimage
|
||||
./SlimeVR-amd64.deb
|
||||
./SlimeVR-amd64.rpm
|
||||
|
||||
|
||||
bundle-mac:
|
||||
runs-on: macos-latest
|
||||
needs: [build, test]
|
||||
if: contains(fromJSON('["workflow_dispatch", "create"]'), github.event_name)
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: "SlimeVR-Server"
|
||||
path: server/desktop/build/libs/
|
||||
|
||||
- name: Cache cargo dependencies
|
||||
uses: Swatinem/rust-cache@v2
|
||||
with:
|
||||
shared-key: "macos-latest"
|
||||
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
rustup target add x86_64-apple-darwin
|
||||
pnpm i
|
||||
pnpm run tauri build --target universal-apple-darwin --config $( ./gui/scripts/gitversion.mjs )
|
||||
|
||||
- name: Modify Application
|
||||
run: |
|
||||
cd target/universal-apple-darwin/release/bundle/macos/slimevr.app/Contents/MacOS
|
||||
cp $( git rev-parse --show-toplevel )/server/desktop/build/libs/slimevr.jar ./
|
||||
cd ../../../
|
||||
/usr/libexec/PlistBuddy -c "Set :CFBundleDisplayName SlimeVR" slimevr.app/Contents/Info.plist
|
||||
/usr/libexec/PlistBuddy -c "Set :CFBundleName SlimeVR" slimevr.app/Contents/Info.plist
|
||||
codesign --sign - --deep --force slimevr.app
|
||||
mv slimevr.app SlimeVR.app
|
||||
cd ../dmg/
|
||||
./bundle_dmg.sh --volname SlimeVR --icon slimevr 180 170 --app-drop-link 480 170 \
|
||||
--window-size 660 400 --hide-extension ../macos/SlimeVR.app \
|
||||
--volicon ../macos/SlimeVR.app/Contents/Resources/icon.icns --skip-jenkins \
|
||||
--eula ../../../../LICENSE-MIT slimevr.dmg ../macos/SlimeVR.app
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: SlimeVR-GUI-MacApp
|
||||
path: target/universal-apple-darwin/release/bundle/macos/SlimeVR*.app
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: SlimeVR-GUI-MacDmg
|
||||
path: target/universal-apple-darwin/release/bundle/dmg/slimevr.dmg
|
||||
|
||||
- name: Prepare for release
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
run: |
|
||||
cp target/universal-apple-darwin/release/bundle/dmg/slimevr.dmg ./SlimeVR-mac.dmg
|
||||
|
||||
- name: Upload to draft release
|
||||
uses: softprops/action-gh-release@v2
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
with:
|
||||
draft: true
|
||||
generate_release_notes: true
|
||||
files: |
|
||||
./SlimeVR-mac.dmg
|
||||
|
||||
|
||||
bundle-windows:
|
||||
runs-on: windows-latest
|
||||
needs: [build, test]
|
||||
if: contains(fromJSON('["workflow_dispatch", "create"]'), github.event_name)
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: "SlimeVR-Server"
|
||||
path: server/desktop/build/libs/
|
||||
|
||||
- name: Cache cargo dependencies
|
||||
uses: Swatinem/rust-cache@v2
|
||||
with:
|
||||
shared-key: "windows-latest"
|
||||
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Build
|
||||
shell: bash
|
||||
run: |
|
||||
pnpm i
|
||||
pnpm run skipbundler --config $( ./gui/scripts/gitversion.mjs )
|
||||
|
||||
- name: Bundle to zips
|
||||
shell: bash
|
||||
run: |
|
||||
mkdir SlimeVR
|
||||
cp gui/src-tauri/icons/icon.ico ./SlimeVR/run.ico
|
||||
cp server/desktop/build/libs/slimevr.jar ./SlimeVR/slimevr.jar
|
||||
cp server/core/resources/* ./SlimeVR/
|
||||
cp target/release/slimevr.exe ./SlimeVR/
|
||||
7z a -tzip SlimeVR-win64.zip ./SlimeVR/
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: SlimeVR-GUI-Windows
|
||||
path: ./SlimeVR*.zip
|
||||
|
||||
- name: Upload to draft release
|
||||
uses: softprops/action-gh-release@v2
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
with:
|
||||
draft: true
|
||||
generate_release_notes: true
|
||||
files: ./SlimeVR-win64.zip
|
||||
22
.github/workflows/label.yml
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
# This workflow will triage pull requests and apply a label based on the
|
||||
# paths that are modified in the pull request.
|
||||
#
|
||||
# To use this workflow, you will need to set up a .github/labeler.yml
|
||||
# file with configuration. For more information, see:
|
||||
# https://github.com/actions/labeler
|
||||
|
||||
name: Labeler
|
||||
on: [pull_request_target]
|
||||
|
||||
jobs:
|
||||
label:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
|
||||
steps:
|
||||
- uses: actions/labeler@v6
|
||||
with:
|
||||
repo-token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
17
.github/workflows/pontoon-pr.yml
vendored
@@ -3,22 +3,19 @@ on:
|
||||
push:
|
||||
branches:
|
||||
- pontoon
|
||||
|
||||
jobs:
|
||||
pull_request:
|
||||
if: ${{ github.repository == 'SlimeVR/SlimeVR-Server' }}
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
pull-requests: write
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
- uses: repo-sync/pull-request@v2
|
||||
with:
|
||||
destination_branch: "main"
|
||||
pr_title: "New Pontoon translations"
|
||||
pr_body: "Please don't squash me 🥺"
|
||||
pr_label: "Area: Translation"
|
||||
github_token: ${{ secrets.PONTOON_BOT_KEY }}
|
||||
- name: pull-request
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.PONTOON_BOT_KEY }}
|
||||
run: |
|
||||
gh_pr_up() { gh pr create "$@" --label "Area: Translation" --base main || gh pr edit "$@"; }
|
||||
gh_pr_up --title "New Pontoon translations" --body "Please don't squash me 🥺"
|
||||
|
||||
2
.github/workflows/rebase.yml
vendored
@@ -15,7 +15,7 @@ jobs:
|
||||
contents: write
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
ref: pontoon
|
||||
submodules: recursive
|
||||
|
||||
10
.gitignore
vendored
@@ -34,12 +34,16 @@
|
||||
# ignore gradle build folder
|
||||
build/
|
||||
|
||||
# Rust build artifacts
|
||||
/target
|
||||
|
||||
# direnv has been claimed for Nix usage
|
||||
.direnv/
|
||||
.devenv
|
||||
|
||||
# Ignore Android local properties
|
||||
local.properties
|
||||
|
||||
# Ignore temporary config
|
||||
vrconfig.yml.tmp
|
||||
|
||||
|
||||
# Nixos
|
||||
.bin/
|
||||
|
||||
@@ -1 +1 @@
|
||||
18.12.1
|
||||
22.17.0
|
||||
|
||||
1
.vscode/extensions.json
vendored
@@ -7,7 +7,6 @@
|
||||
"gaborv.flatbuffers",
|
||||
"dbaeumer.vscode-eslint",
|
||||
"esbenp.prettier-vscode",
|
||||
"rust-lang.rust-analyzer",
|
||||
"bradlc.vscode-tailwindcss",
|
||||
"EditorConfig.EditorConfig",
|
||||
"macabeus.vscode-fluent",
|
||||
|
||||
@@ -7,8 +7,6 @@ This document describes essential knowledge required to contribute to the SlimeV
|
||||
- [Git](https://git-scm.com/downloads)
|
||||
- [Java v17+](https://adoptium.net/temurin/releases/)
|
||||
- [Node.js v16.9+](https://nodejs.org) (We recommend the use of `nvm` instead of installing Node.js directly)
|
||||
- [Microsoft Edge WebView2](https://developer.microsoft.com/en-us/microsoft-edge/webview2/#download-section) or `webkit2gtk` for Linux
|
||||
- [Rust](https://rustup.rs)
|
||||
|
||||
## Cloning the code
|
||||
First, clone the codebase using git in a terminal in the folder you want.
|
||||
@@ -32,13 +30,13 @@ be at `server/build/libs/slimevr.jar` (you can ignore `server.jar`).
|
||||
|
||||
(Note: Your IDE may be able to do all of the above for you.)
|
||||
|
||||
### Tauri (gui)
|
||||
### Electron (gui)
|
||||
|
||||
- Activate corepack (included with Node.JS) via `corepack enable` (might require administrator permissions)
|
||||
- Run `pnpm i` in your IDE's terminal to download and install dependencies.
|
||||
- To launch the GUI in dev mode, run `pnpm gui`.
|
||||
- Finally, to compile for production, run `pnpm run tauri build`. The result
|
||||
will be at `target/release/slimevr.exe`.
|
||||
- Finally, to compile for production, run `pnpm package:build`. The result
|
||||
will be at `dist/artifacts/` content will change depending of the platform.
|
||||
|
||||
## Code style
|
||||
|
||||
@@ -84,7 +82,7 @@ Import the formatting settings defined in `spotless.xml`, like this:
|
||||
Eclipse will only do a subset of the checks in `spotless`, so you may still want to do
|
||||
`./gradlew spotlessApply` if you ever see an error from spotless.
|
||||
|
||||
### Tauri (gui)
|
||||
### Electron (gui)
|
||||
|
||||
We use ESLint and Prettier to format GUI code.
|
||||
- First, go into the GUI's directory with your terminal by running `cd gui`.
|
||||
@@ -105,6 +103,7 @@ When touching SolarXR:
|
||||
- After editing files, you should run `cd solarxr-protocol`, then either run
|
||||
`./generate-flatbuffer.ps1` (Windows) or `./generate-flatbuffer.sh` (Linux/OSX)
|
||||
- Make sure to commit your changes inside the submodule.
|
||||
- To make sure the gui use the latest generated code, run `pnpm i`.
|
||||
|
||||
## Code Licensing
|
||||
SlimeVR uses dual MIT and Apache-2.0 license. Be sure that any code that you reference,
|
||||
@@ -115,3 +114,9 @@ licensed under `GPL-v3`.
|
||||
## Discord
|
||||
We use discord *a lot* to coordinate and discuss development. Come join us at
|
||||
https://discord.gg/SlimeVR!
|
||||
|
||||
## Use of AI
|
||||
We DO NOT accept contributions that are generated with AI (for example, "vibe-coding").
|
||||
|
||||
If you do use AI, and you believe your usage of AI is reasonable, you must clearly disclose
|
||||
how you used AI in your submission.
|
||||
|
||||
5628
Cargo.lock
generated
16
Cargo.toml
@@ -1,16 +0,0 @@
|
||||
[workspace]
|
||||
# Use 2021 edition resolver, better resolves crate features.
|
||||
resolver = "2"
|
||||
|
||||
# A list of all rust crates in the workspace.
|
||||
members = ["gui/src-tauri"]
|
||||
|
||||
# These settings can be inherited by workspace members
|
||||
[workspace.package]
|
||||
edition = "2021"
|
||||
license = "MIT OR Apache-2.0"
|
||||
rust-version = "1.75" # Tauri's MSRV
|
||||
repository = "https://github.com/SlimeVR/SlimeVR-Server"
|
||||
|
||||
[profile.release]
|
||||
lto = "thin"
|
||||
@@ -47,6 +47,11 @@ on SlimeVR, you need to be aware of them:**
|
||||
Please refer to the [LICENSE-MIT] and [LICENSE-APACHE] files if you are at any point
|
||||
uncertain what the exact requirements are.
|
||||
|
||||
## Trademark and Logo use
|
||||
**SlimeVR is a trademark or a registered trademark of SlimeVR B.V. Usage of SlimeVR software, hardware, or other intellectual property in this or other repositories does not grant you the right to use SlimeVR trademark as your own.**
|
||||
|
||||
For more information, please refer to the [TRADEMARK].
|
||||
|
||||
## Contributions
|
||||
Any contributions submitted for inclusion in this repository will be dual-licensed under
|
||||
either:
|
||||
@@ -64,3 +69,7 @@ okay with this and that you are authorized to provide the above licenses.
|
||||
|
||||
[LICENSE-MIT]: LICENSE-MIT
|
||||
[LICENSE-APACHE]: LICENSE-APACHE
|
||||
[TRADEMARK]: TRADEMARK.md
|
||||
|
||||
|
||||
*if you read this, u cute*
|
||||
|
||||
33
TRADEMARK.md
Normal file
@@ -0,0 +1,33 @@
|
||||
## SlimeVR is a trademark or a registered trademark of SlimeVR B.V.
|
||||
|
||||
**Usage of SlimeVR software, hardware, or other intellectual property in this or other repositories does not grant you the right to use SlimeVR trademark as your own.**
|
||||
|
||||
The purpose of a trademark is to remove uncertainty for users and customers regarding the product's manufacturer or endorsement. You're not allowed to market your product using SlimeVR name, and your usage of the name should be only factual and descriptive. For example, calling original SlimeVR products SlimeVR or describing compatibility of other products or derivatives. This applies to all products, including software, and hardware including non-official Full-Body Trackers.
|
||||
|
||||
**Here are a few _acceptable_ uses of SlimeVR name when selling unofficial Slime trackers:**
|
||||
* SlimeVR-compatible trackers
|
||||
* Unofficial SlimeVR trackers / Non-official SlimeVR trackers
|
||||
* DIY SlimeVR trackers
|
||||
* Third-party SlimeVR Trackers
|
||||
* Custom SlimeVR-compatible trackers
|
||||
* < Your Brand > Slime Trackers
|
||||
* Using "SlimeVR" as a search tag
|
||||
|
||||
**_Unacceptable_ uses include, but are not limited to:**
|
||||
* SlimeVR store
|
||||
* Buy SlimeVR
|
||||
* SlimeVR Trackers
|
||||
* Original SlimeVR
|
||||
* Official SlimeVR
|
||||
* SlimeVR BMI270 (or any other IMU model along with SlimeVR name)
|
||||
* < Your brand > SlimeVR / < your brand > SlimeVR Trackers
|
||||
|
||||
Use of the SlimeVR name that can cause confusion is not allowed in any part of the listing, including, but not limited to: product title, product description, product metadata, site title, site name, site metadata, site texts, social media posts, or other advertisement.
|
||||
|
||||
Also, please ensure you use the correct spelling and capitalization: only **"SlimeVR" is acceptable**. Not "Slimevr", "slimevr", or "Slime VR". You're allowed to use the word "slime" as you wish, it's not a trademark.
|
||||
|
||||
Please understand that we have an obligation to reduce confusion for the customers, and we believe that our usage terms are generous compared to many other companies and products. This applies to all sellers or derivative products, we do not make exceptions.
|
||||
|
||||
---
|
||||
|
||||
If you have any questions about SlimeVR trademark or copyrighted materials, you can reach out to us at *tm[at]slimevr.dev*.
|
||||
242
deny.toml
@@ -1,242 +0,0 @@
|
||||
# This template contains all of the possible sections and their default values
|
||||
|
||||
# Note that all fields that take a lint level have these possible values:
|
||||
# * deny - An error will be produced and the check will fail
|
||||
# * warn - A warning will be produced, but the check will not fail
|
||||
# * allow - No warning or error will be produced, though in some cases a note
|
||||
# will be
|
||||
|
||||
# The values provided in this template are the default values that will be used
|
||||
# when any section or field is not specified in your own configuration
|
||||
|
||||
# Root options
|
||||
|
||||
# The graph table configures how the dependency graph is constructed and thus
|
||||
# which crates the checks are performed against
|
||||
[graph]
|
||||
# If 1 or more target triples (and optionally, target_features) are specified,
|
||||
# only the specified targets will be checked when running `cargo deny check`.
|
||||
# This means, if a particular package is only ever used as a target specific
|
||||
# dependency, such as, for example, the `nix` crate only being used via the
|
||||
# `target_family = "unix"` configuration, that only having windows targets in
|
||||
# this list would mean the nix crate, as well as any of its exclusive
|
||||
# dependencies not shared by any other crates, would be ignored, as the target
|
||||
# list here is effectively saying which targets you are building for.
|
||||
targets = [
|
||||
# The triple can be any string, but only the target triples built in to
|
||||
# rustc (as of 1.40) can be checked against actual config expressions
|
||||
#"x86_64-unknown-linux-musl",
|
||||
# You can also specify which target_features you promise are enabled for a
|
||||
# particular target. target_features are currently not validated against
|
||||
# the actual valid features supported by the target architecture.
|
||||
#{ triple = "wasm32-unknown-unknown", features = ["atomics"] },
|
||||
]
|
||||
# When creating the dependency graph used as the source of truth when checks are
|
||||
# executed, this field can be used to prune crates from the graph, removing them
|
||||
# from the view of cargo-deny. This is an extremely heavy hammer, as if a crate
|
||||
# is pruned from the graph, all of its dependencies will also be pruned unless
|
||||
# they are connected to another crate in the graph that hasn't been pruned,
|
||||
# so it should be used with care. The identifiers are [Package ID Specifications]
|
||||
# (https://doc.rust-lang.org/cargo/reference/pkgid-spec.html)
|
||||
#exclude = []
|
||||
# If true, metadata will be collected with `--all-features`. Note that this can't
|
||||
# be toggled off if true, if you want to conditionally enable `--all-features` it
|
||||
# is recommended to pass `--all-features` on the cmd line instead
|
||||
all-features = false
|
||||
# If true, metadata will be collected with `--no-default-features`. The same
|
||||
# caveat with `all-features` applies
|
||||
no-default-features = false
|
||||
# If set, these feature will be enabled when collecting metadata. If `--features`
|
||||
# is specified on the cmd line they will take precedence over this option.
|
||||
#features = []
|
||||
|
||||
# The output table provides options for how/if diagnostics are outputted
|
||||
[output]
|
||||
# When outputting inclusion graphs in diagnostics that include features, this
|
||||
# option can be used to specify the depth at which feature edges will be added.
|
||||
# This option is included since the graphs can be quite large and the addition
|
||||
# of features from the crate(s) to all of the graph roots can be far too verbose.
|
||||
# This option can be overridden via `--feature-depth` on the cmd line
|
||||
feature-depth = 1
|
||||
|
||||
# This section is considered when running `cargo deny check advisories`
|
||||
# More documentation for the advisories section can be found here:
|
||||
# https://embarkstudios.github.io/cargo-deny/checks/advisories/cfg.html
|
||||
[advisories]
|
||||
# The path where the advisory databases are cloned/fetched into
|
||||
#db-path = "$CARGO_HOME/advisory-dbs"
|
||||
# The url(s) of the advisory databases to use
|
||||
#db-urls = ["https://github.com/rustsec/advisory-db"]
|
||||
# A list of advisory IDs to ignore. Note that ignored advisories will still
|
||||
# output a note when they are encountered.
|
||||
ignore = [
|
||||
#"RUSTSEC-0000-0000",
|
||||
#{ id = "RUSTSEC-0000-0000", reason = "you can specify a reason the advisory is ignored" },
|
||||
#"a-crate-that-is-yanked@0.1.1", # you can also ignore yanked crate versions if you wish
|
||||
#{ crate = "a-crate-that-is-yanked@0.1.1", reason = "you can specify why you are ignoring the yanked crate" },
|
||||
]
|
||||
# If this is true, then cargo deny will use the git executable to fetch advisory database.
|
||||
# If this is false, then it uses a built-in git library.
|
||||
# Setting this to true can be helpful if you have special authentication requirements that cargo-deny does not support.
|
||||
# See Git Authentication for more information about setting up git authentication.
|
||||
#git-fetch-with-cli = true
|
||||
|
||||
# This section is considered when running `cargo deny check licenses`
|
||||
# More documentation for the licenses section can be found here:
|
||||
# https://embarkstudios.github.io/cargo-deny/checks/licenses/cfg.html
|
||||
[licenses]
|
||||
# List of explicitly allowed licenses
|
||||
# See https://spdx.org/licenses/ for list of possible licenses
|
||||
# [possible values: any SPDX 3.11 short identifier (+ optional exception)].
|
||||
allow = [
|
||||
"MIT",
|
||||
"Apache-2.0",
|
||||
"Apache-2.0 WITH LLVM-exception",
|
||||
"Unicode-3.0",
|
||||
"Unicode-DFS-2016",
|
||||
"MIT-0",
|
||||
"ISC",
|
||||
"BSD-3-Clause",
|
||||
"Zlib",
|
||||
"MPL-2.0",
|
||||
]
|
||||
# The confidence threshold for detecting a license from license text.
|
||||
# The higher the value, the more closely the license text must be to the
|
||||
# canonical license text of a valid SPDX license file.
|
||||
# [possible values: any between 0.0 and 1.0].
|
||||
confidence-threshold = 0.8
|
||||
# Allow 1 or more licenses on a per-crate basis, so that particular licenses
|
||||
# aren't accepted for every possible crate as with the normal allow list
|
||||
exceptions = [
|
||||
# Each entry is the crate and version constraint, and its specific allow
|
||||
# list
|
||||
#{ allow = ["Zlib"], crate = "adler32" },
|
||||
]
|
||||
|
||||
# Some crates don't have (easily) machine readable licensing information,
|
||||
# adding a clarification entry for it allows you to manually specify the
|
||||
# licensing information
|
||||
#[[licenses.clarify]]
|
||||
# The package spec the clarification applies to
|
||||
#crate = "ring"
|
||||
# The SPDX expression for the license requirements of the crate
|
||||
#expression = "MIT AND ISC AND OpenSSL"
|
||||
# One or more files in the crate's source used as the "source of truth" for
|
||||
# the license expression. If the contents match, the clarification will be used
|
||||
# when running the license check, otherwise the clarification will be ignored
|
||||
# and the crate will be checked normally, which may produce warnings or errors
|
||||
# depending on the rest of your configuration
|
||||
#license-files = [
|
||||
# Each entry is a crate relative path, and the (opaque) hash of its contents
|
||||
#{ path = "LICENSE", hash = 0xbd0eed23 }
|
||||
#]
|
||||
|
||||
[licenses.private]
|
||||
# If true, ignores workspace crates that aren't published, or are only
|
||||
# published to private registries.
|
||||
# To see how to mark a crate as unpublished (to the official registry),
|
||||
# visit https://doc.rust-lang.org/cargo/reference/manifest.html#the-publish-field.
|
||||
ignore = false
|
||||
# One or more private registries that you might publish crates to, if a crate
|
||||
# is only published to private registries, and ignore is true, the crate will
|
||||
# not have its license(s) checked
|
||||
registries = [
|
||||
#"https://sekretz.com/registry
|
||||
]
|
||||
|
||||
# This section is considered when running `cargo deny check bans`.
|
||||
# More documentation about the 'bans' section can be found here:
|
||||
# https://embarkstudios.github.io/cargo-deny/checks/bans/cfg.html
|
||||
[bans]
|
||||
# Lint level for when multiple versions of the same crate are detected
|
||||
multiple-versions = "warn"
|
||||
# Lint level for when a crate version requirement is `*`
|
||||
wildcards = "allow"
|
||||
# The graph highlighting used when creating dotgraphs for crates
|
||||
# with multiple versions
|
||||
# * lowest-version - The path to the lowest versioned duplicate is highlighted
|
||||
# * simplest-path - The path to the version with the fewest edges is highlighted
|
||||
# * all - Both lowest-version and simplest-path are used
|
||||
highlight = "all"
|
||||
# The default lint level for `default` features for crates that are members of
|
||||
# the workspace that is being checked. This can be overridden by allowing/denying
|
||||
# `default` on a crate-by-crate basis if desired.
|
||||
workspace-default-features = "allow"
|
||||
# The default lint level for `default` features for external crates that are not
|
||||
# members of the workspace. This can be overridden by allowing/denying `default`
|
||||
# on a crate-by-crate basis if desired.
|
||||
external-default-features = "allow"
|
||||
# List of crates that are allowed. Use with care!
|
||||
allow = [
|
||||
#"ansi_term@0.11.0",
|
||||
#{ crate = "ansi_term@0.11.0", reason = "you can specify a reason it is allowed" },
|
||||
]
|
||||
# List of crates to deny
|
||||
deny = [
|
||||
#"ansi_term@0.11.0",
|
||||
#{ crate = "ansi_term@0.11.0", reason = "you can specify a reason it is banned" },
|
||||
# Wrapper crates can optionally be specified to allow the crate when it
|
||||
# is a direct dependency of the otherwise banned crate
|
||||
#{ crate = "ansi_term@0.11.0", wrappers = ["this-crate-directly-depends-on-ansi_term"] },
|
||||
]
|
||||
|
||||
# List of features to allow/deny
|
||||
# Each entry the name of a crate and a version range. If version is
|
||||
# not specified, all versions will be matched.
|
||||
#[[bans.features]]
|
||||
#crate = "reqwest"
|
||||
# Features to not allow
|
||||
#deny = ["json"]
|
||||
# Features to allow
|
||||
#allow = [
|
||||
# "rustls",
|
||||
# "__rustls",
|
||||
# "__tls",
|
||||
# "hyper-rustls",
|
||||
# "rustls",
|
||||
# "rustls-pemfile",
|
||||
# "rustls-tls-webpki-roots",
|
||||
# "tokio-rustls",
|
||||
# "webpki-roots",
|
||||
#]
|
||||
# If true, the allowed features must exactly match the enabled feature set. If
|
||||
# this is set there is no point setting `deny`
|
||||
#exact = true
|
||||
|
||||
# Certain crates/versions that will be skipped when doing duplicate detection.
|
||||
skip = [
|
||||
#"ansi_term@0.11.0",
|
||||
#{ crate = "ansi_term@0.11.0", reason = "you can specify a reason why it can't be updated/removed" },
|
||||
]
|
||||
# Similarly to `skip` allows you to skip certain crates during duplicate
|
||||
# detection. Unlike skip, it also includes the entire tree of transitive
|
||||
# dependencies starting at the specified crate, up to a certain depth, which is
|
||||
# by default infinite.
|
||||
skip-tree = [
|
||||
#"ansi_term@0.11.0", # will be skipped along with _all_ of its direct and transitive dependencies
|
||||
#{ crate = "ansi_term@0.11.0", depth = 20 },
|
||||
]
|
||||
|
||||
# This section is considered when running `cargo deny check sources`.
|
||||
# More documentation about the 'sources' section can be found here:
|
||||
# https://embarkstudios.github.io/cargo-deny/checks/sources/cfg.html
|
||||
[sources]
|
||||
# Lint level for what to happen when a crate from a crate registry that is not
|
||||
# in the allow list is encountered
|
||||
unknown-registry = "warn"
|
||||
# Lint level for what to happen when a crate from a git repository that is not
|
||||
# in the allow list is encountered
|
||||
unknown-git = "warn"
|
||||
# List of URLs for allowed crate registries. Defaults to the crates.io index
|
||||
# if not specified. If it is specified but empty, no registries are allowed.
|
||||
allow-registry = ["https://github.com/rust-lang/crates.io-index"]
|
||||
# List of URLs for allowed Git repositories
|
||||
allow-git = []
|
||||
|
||||
[sources.allow-org]
|
||||
# 1 or more github.com organizations to allow git sources for
|
||||
github = [""]
|
||||
# 1 or more gitlab.com organizations to allow git sources for
|
||||
gitlab = [""]
|
||||
# 1 or more bitbucket.org organizations to allow git sources for
|
||||
bitbucket = [""]
|
||||
@@ -1,117 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
dev.slimevr.SlimeVR.metainfo.xml by SlimeVR contributors
|
||||
|
||||
To the extent possible under law, the person who associated CC0 with
|
||||
dev.slimevr.SlimeVR.metainfo.xml has waived all copyright and related or neighboring rights
|
||||
to dev.slimevr.SlimeVR.metainfo.xml.
|
||||
|
||||
You should have received a copy of the CC0 legalcode along with this
|
||||
work. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
|
||||
-->
|
||||
<component type="desktop-application">
|
||||
<id>dev.slimevr.SlimeVR</id>
|
||||
|
||||
<name>SlimeVR</name>
|
||||
<summary>Accessible full-body tracking in VR</summary>
|
||||
<developer_name>SlimeVR Team</developer_name>
|
||||
|
||||
<!-- CC0 so attribution is not required -->
|
||||
<metadata_license>CC0-1.0</metadata_license>
|
||||
<project_license>MIT OR Apache-2.0</project_license>
|
||||
|
||||
<content_rating type="oars-1.1" />
|
||||
<url type="homepage">https://slimevr.dev/</url>
|
||||
<url type="bugtracker">https://github.com/SlimeVR/SlimeVR-Server/issues</url>
|
||||
<url type="faq">https://docs.slimevr.dev/slimevr101.html</url>
|
||||
<url type="donation">https://github.com/sponsors/SlimeVR</url>
|
||||
<url type="vcs-browser">https://github.com/SlimeVR/SlimeVR-Server</url>
|
||||
<url type="translate">https://i18n.slimevr.dev</url>
|
||||
<url type="help">https://docs.slimevr.dev/server-setup/slimevr-setup.html</url>
|
||||
<url type="contribute">https://github.com/SlimeVR/SlimeVR-Server/blob/main/CONTRIBUTING.md</url>
|
||||
<url type="contact">https://discord.gg/SlimeVR</url>
|
||||
<recommends>
|
||||
<display_length compare="ge">300</display_length>
|
||||
</recommends>
|
||||
<supports>
|
||||
<control>pointing</control>
|
||||
<control>keyboard</control>
|
||||
<control>touch</control>
|
||||
</supports>
|
||||
|
||||
<branding>
|
||||
<color type="primary" scheme_preference="light">#BB8AE5</color>
|
||||
<color type="primary" scheme_preference="dark">#663499</color>
|
||||
</branding>
|
||||
|
||||
<description>
|
||||
<p>
|
||||
SlimeVR is a set of open hardware sensors and open source software that facilitates full-body
|
||||
tracking (FBT) in virtual reality. With no base station required, SlimeVR makes wireless
|
||||
VR FBT affordable and comfortable.
|
||||
</p>
|
||||
</description>
|
||||
|
||||
<launchable type="desktop-id">dev.slimevr.SlimeVR.desktop</launchable>
|
||||
<screenshots>
|
||||
<screenshot type="default" xml:lang="en">
|
||||
<caption>The onboarding for the GUI</caption>
|
||||
<image>https://raw.githubusercontent.com/SlimeVR/SlimeVR-Server/main/assets/img/onboarding.png</image>
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
|
||||
<provides>
|
||||
<binary>slimevr</binary>
|
||||
</provides>
|
||||
|
||||
<releases>
|
||||
<release version="0.13.0" date="2024-09-20"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.0</url></release>
|
||||
<release version="0.13.0~rc.4" type="development" date="2024-09-13"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.0-rc.4</url></release>
|
||||
<release version="0.13.0~rc.3" type="development" date="2024-08-14"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.0-rc.3</url></release>
|
||||
<release version="0.13.0~rc.2" type="development" date="2024-08-08"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.0-rc.2</url></release>
|
||||
<release version="0.13.0~rc.1" type="development" date="2024-08-02"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.0-rc.1</url></release>
|
||||
<release version="0.12.1" date="2024-04-29"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.12.1</url></release>
|
||||
<release version="0.12.0" date="2024-04-26"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.12.0</url></release>
|
||||
<release version="0.12.0~rc.4" type="development" date="2024-04-21"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.12.0-rc.4</url></release>
|
||||
<release version="0.12.0~rc.3" type="development" date="2024-04-14"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.12.0-rc.3</url></release>
|
||||
<release version="0.12.0~rc.2" type="development" date="2024-04-09"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.12.0-rc.2</url></release>
|
||||
<release version="0.12.0~rc.1" type="development" date="2024-04-04"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.12.0-rc.1</url></release>
|
||||
<release version="0.11.0" date="2023-12-23"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.11.0</url></release>
|
||||
<release version="0.11.0~rc.2" type="development" date="2023-12-08"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.11.0-rc.2</url></release>
|
||||
<release version="0.11.0~rc.1" type="development" date="2023-11-23"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.11.0-rc.1</url></release>
|
||||
<release version="0.10.1" date="2023-09-30"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.10.1</url></release>
|
||||
<release version="0.10.1~rc.1" type="development" date="2023-09-29"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.10.1-rc.1</url></release>
|
||||
<release version="0.10.0" date="2023-09-22"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.10.0</url></release>
|
||||
<release version="0.10.0~rc.2" type="development" date="2023-09-15"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.10.0-rc.2</url></release>
|
||||
<release version="0.10.0~rc.1" type="development" date="2023-09-02"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.10.0-rc.1</url></release>
|
||||
<release version="0.9.1" date="2023-08-30"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.1</url></release>
|
||||
<release version="0.9.1~rc.4" type="development" date="2023-08-28"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.1-rc.4</url></release>
|
||||
<release version="0.9.1~rc.3" type="development" date="2023-08-19"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.1-rc.3</url></release>
|
||||
<release version="0.9.1~rc.2" type="development" date="2023-08-15"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.1-rc.2</url></release>
|
||||
<release version="0.9.1~rc.1" type="development" date="2023-08-13"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.1-rc.1</url></release>
|
||||
<release version="0.9.0" date="2023-08-05"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.0</url></release>
|
||||
<release version="0.9.0~rc.2" type="development" date="2023-08-02"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.0-rc.2</url></release>
|
||||
<release version="0.9.0~rc.1" type="development" date="2023-07-31"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.0-rc.1</url></release>
|
||||
<release version="0.8.3" date="2023-07-09"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.3</url></release>
|
||||
<release version="0.8.2" date="2023-07-09"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.2</url></release>
|
||||
<release version="0.8.2~rc.1" type="development" date="2023-07-07"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.2-rc.1</url></release>
|
||||
<release version="0.8.1" date="2023-07-04"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.1</url></release>
|
||||
<release version="0.8.0" date="2023-06-22"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.0</url></release>
|
||||
<release version="0.8.0~rc.3" type="development" date="2023-06-20"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.0-rc.3</url></release>
|
||||
<release version="0.8.0~rc.2" type="development" date="2023-06-15"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.0-rc.2</url></release>
|
||||
<release version="0.8.0~rc.1" type="development" date="2023-06-01"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.0-rc.1</url></release>
|
||||
<release version="0.7.1" date="2023-04-14"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.7.1</url></release>
|
||||
<release version="0.7.0" date="2023-04-11"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.7.0</url></release>
|
||||
<release version="0.6.3" date="2023-02-22"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.6.3</url></release>
|
||||
<release version="0.6.2" date="2023-02-17"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.6.2</url></release>
|
||||
<release version="0.6.1" date="2023-02-12"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.6.1</url></release>
|
||||
<release version="0.6.0" date="2023-01-05"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.6.0</url></release>
|
||||
<release version="0.5.1" date="2022-12-12"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.5.1</url></release>
|
||||
<release version="0.5.0" date="2022-12-07"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.5.0</url></release>
|
||||
<release version="0.4.0" date="2022-11-24"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.4.0</url></release>
|
||||
<release version="0.3.1" date="2022-11-22"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.3.1</url></release>
|
||||
<release version="0.3.0" date="2022-11-16"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.3.0</url></release>
|
||||
<release version="0.2.1" date="2022-08-24"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.2.1</url></release>
|
||||
<release version="0.2.0" date="2022-06-28"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.2.0</url></release>
|
||||
</releases>
|
||||
</component>
|
||||
390
flake.lock
generated
@@ -1,416 +1,58 @@
|
||||
{
|
||||
"nodes": {
|
||||
"devenv": {
|
||||
"inputs": {
|
||||
"flake-compat": "flake-compat",
|
||||
"nix": "nix",
|
||||
"nixpkgs": "nixpkgs",
|
||||
"pre-commit-hooks": "pre-commit-hooks"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1699541523,
|
||||
"narHash": "sha256-Rv0ryuBC5KtA/3YqwIEe58Tabu71qSGnGcGRd67mMUY=",
|
||||
"owner": "cachix",
|
||||
"repo": "devenv",
|
||||
"rev": "14fdefc0bb80c3d6f3a18a491e33429b4064c371",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "cachix",
|
||||
"repo": "devenv",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"fenix": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
],
|
||||
"rust-analyzer-src": "rust-analyzer-src"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1699683614,
|
||||
"narHash": "sha256-XT2tIoIiiv0AxRs9g76nuRhfQf7KU1dE3ho8BL5CYM4=",
|
||||
"owner": "nix-community",
|
||||
"repo": "fenix",
|
||||
"rev": "ca6415d87d2e1b5975d59b2a68ae19029de1759c",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "fenix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-compat": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1673956053,
|
||||
"narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=",
|
||||
"owner": "edolstra",
|
||||
"repo": "flake-compat",
|
||||
"rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "edolstra",
|
||||
"repo": "flake-compat",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-parts": {
|
||||
"inputs": {
|
||||
"nixpkgs-lib": "nixpkgs-lib"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1698882062,
|
||||
"narHash": "sha256-HkhafUayIqxXyHH1X8d9RDl1M2CkFgZLjKD3MzabiEo=",
|
||||
"lastModified": 1762980239,
|
||||
"narHash": "sha256-8oNVE8TrD19ulHinjaqONf9QWCKK+w4url56cdStMpM=",
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"rev": "8c9fa2545007b49a5db5f650ae91f227672c3877",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"id": "flake-parts",
|
||||
"type": "indirect"
|
||||
}
|
||||
},
|
||||
"flake-utils": {
|
||||
"inputs": {
|
||||
"systems": "systems"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1685518550,
|
||||
"narHash": "sha256-o2d0KcvaXzTrPRIo0kOLV0/QXHhDQ5DTi+OxcjO8xqY=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "a1720a10a6cfe8234c0e93907ffe81be440f4cef",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-utils_2": {
|
||||
"inputs": {
|
||||
"systems": "systems_2"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1694529238,
|
||||
"narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-utils_3": {
|
||||
"locked": {
|
||||
"lastModified": 1659877975,
|
||||
"narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"gitignore": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"devenv",
|
||||
"pre-commit-hooks",
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1660459072,
|
||||
"narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=",
|
||||
"owner": "hercules-ci",
|
||||
"repo": "gitignore.nix",
|
||||
"rev": "a20de23b925fd8264fd7fad6454652e142fd7f73",
|
||||
"rev": "52a2caecc898d0b46b2b905f058ccc5081f842da",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hercules-ci",
|
||||
"repo": "gitignore.nix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"lowdown-src": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1633514407,
|
||||
"narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=",
|
||||
"owner": "kristapsdz",
|
||||
"repo": "lowdown",
|
||||
"rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "kristapsdz",
|
||||
"repo": "lowdown",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"mk-shell-bin": {
|
||||
"locked": {
|
||||
"lastModified": 1677004959,
|
||||
"narHash": "sha256-/uEkr1UkJrh11vD02aqufCxtbF5YnhRTIKlx5kyvf+I=",
|
||||
"owner": "rrbutani",
|
||||
"repo": "nix-mk-shell-bin",
|
||||
"rev": "ff5d8bd4d68a347be5042e2f16caee391cd75887",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "rrbutani",
|
||||
"repo": "nix-mk-shell-bin",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nix": {
|
||||
"inputs": {
|
||||
"lowdown-src": "lowdown-src",
|
||||
"nixpkgs": [
|
||||
"devenv",
|
||||
"nixpkgs"
|
||||
],
|
||||
"nixpkgs-regression": "nixpkgs-regression"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1676545802,
|
||||
"narHash": "sha256-EK4rZ+Hd5hsvXnzSzk2ikhStJnD63odF7SzsQ8CuSPU=",
|
||||
"owner": "domenkozar",
|
||||
"repo": "nix",
|
||||
"rev": "7c91803598ffbcfe4a55c44ac6d49b2cf07a527f",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "domenkozar",
|
||||
"ref": "relaxed-flakes",
|
||||
"repo": "nix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nix2container": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils_2",
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1697285352,
|
||||
"narHash": "sha256-tRGLm/DO8+anGUCgLYxTF5EPqWv8EZ9MVFWRdh285HU=",
|
||||
"owner": "nlewo",
|
||||
"repo": "nix2container",
|
||||
"rev": "9d7f33ef0058f4df4c0912025f43c758a3289d76",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nlewo",
|
||||
"repo": "nix2container",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixgl": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils_3",
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1685908677,
|
||||
"narHash": "sha256-E4zUPEUFyVWjVm45zICaHRpfGepfkE9Z2OECV9HXfA4=",
|
||||
"owner": "guibou",
|
||||
"repo": "nixGL",
|
||||
"rev": "489d6b095ab9d289fe11af0219a9ff00fe87c7c5",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "guibou",
|
||||
"repo": "nixGL",
|
||||
"repo": "flake-parts",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1678875422,
|
||||
"narHash": "sha256-T3o6NcQPwXjxJMn2shz86Chch4ljXgZn746c2caGxd8=",
|
||||
"lastModified": 1756787288,
|
||||
"narHash": "sha256-rw/PHa1cqiePdBxhF66V7R+WAP8WekQ0mCDG4CFqT8Y=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "126f49a01de5b7e35a43fd43f891ecf6d3a51459",
|
||||
"rev": "d0fc30899600b9b3466ddb260fd83deb486c32f1",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixpkgs-unstable",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-lib": {
|
||||
"locked": {
|
||||
"dir": "lib",
|
||||
"lastModified": 1698611440,
|
||||
"narHash": "sha256-jPjHjrerhYDy3q9+s5EAsuhyhuknNfowY6yt6pjn9pc=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "0cbe9f69c234a7700596e943bfae7ef27a31b735",
|
||||
"lastModified": 1761765539,
|
||||
"narHash": "sha256-b0yj6kfvO8ApcSE+QmA6mUfu8IYG6/uU28OFn4PaC8M=",
|
||||
"owner": "nix-community",
|
||||
"repo": "nixpkgs.lib",
|
||||
"rev": "719359f4562934ae99f5443f20aa06c2ffff91fc",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"dir": "lib",
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-regression": {
|
||||
"locked": {
|
||||
"lastModified": 1643052045,
|
||||
"narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-stable": {
|
||||
"locked": {
|
||||
"lastModified": 1685801374,
|
||||
"narHash": "sha256-otaSUoFEMM+LjBI1XL/xGB5ao6IwnZOXc47qhIgJe8U=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "c37ca420157f4abc31e26f436c1145f8951ff373",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-23.05",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs_2": {
|
||||
"locked": {
|
||||
"lastModified": 1721562059,
|
||||
"narHash": "sha256-Tybxt65eyOARf285hMHIJ2uul8SULjFZbT9ZaEeUnP8=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "68c9ed8bbed9dfce253cc91560bf9043297ef2fe",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"pre-commit-hooks": {
|
||||
"inputs": {
|
||||
"flake-compat": [
|
||||
"devenv",
|
||||
"flake-compat"
|
||||
],
|
||||
"flake-utils": "flake-utils",
|
||||
"gitignore": "gitignore",
|
||||
"nixpkgs": [
|
||||
"devenv",
|
||||
"nixpkgs"
|
||||
],
|
||||
"nixpkgs-stable": "nixpkgs-stable"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1688056373,
|
||||
"narHash": "sha256-2+SDlNRTKsgo3LBRiMUcoEUb6sDViRNQhzJquZ4koOI=",
|
||||
"owner": "cachix",
|
||||
"repo": "pre-commit-hooks.nix",
|
||||
"rev": "5843cf069272d92b60c3ed9e55b7a8989c01d4c7",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "cachix",
|
||||
"repo": "pre-commit-hooks.nix",
|
||||
"owner": "nix-community",
|
||||
"repo": "nixpkgs.lib",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"devenv": "devenv",
|
||||
"fenix": "fenix",
|
||||
"flake-parts": "flake-parts",
|
||||
"mk-shell-bin": "mk-shell-bin",
|
||||
"nix2container": "nix2container",
|
||||
"nixgl": "nixgl",
|
||||
"nixpkgs": "nixpkgs_2"
|
||||
}
|
||||
},
|
||||
"rust-analyzer-src": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1699629149,
|
||||
"narHash": "sha256-oDxT2FTYLRnwBRgxgWMApbgvNsbsPV4EeH4TZtp70F0=",
|
||||
"owner": "rust-lang",
|
||||
"repo": "rust-analyzer",
|
||||
"rev": "11a87c917943dac5a568579f799c2d7458324103",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "rust-lang",
|
||||
"ref": "nightly",
|
||||
"repo": "rust-analyzer",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"systems": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"systems_2": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
178
flake.nix
@@ -1,152 +1,50 @@
|
||||
{
|
||||
description = "Affordable full-body tracking for VR!";
|
||||
description = "SlimeVR Server & GUI";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||
devenv.url = "github:cachix/devenv";
|
||||
nix2container = {
|
||||
url = "github:nlewo/nix2container";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
mk-shell-bin.url = "github:rrbutani/nix-mk-shell-bin";
|
||||
nixgl = {
|
||||
url = "github:guibou/nixGL";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
fenix = {
|
||||
url = "github:nix-community/fenix";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
flake-parts.url = "github:hercules-ci/flake-parts";
|
||||
};
|
||||
|
||||
nixConfig = {
|
||||
extra-trusted-public-keys = "devenv.cachix.org-1:w1cLUi8dv3hnoSPGAuibQv+f9TZLr6cv/Hm9XgU50cw=";
|
||||
extra-substituters = "https://devenv.cachix.org";
|
||||
};
|
||||
outputs = inputs@{ self, nixpkgs, flake-parts, ... }:
|
||||
flake-parts.lib.mkFlake { inherit inputs; } {
|
||||
systems = [ "x86_64-linux" ];
|
||||
|
||||
outputs = inputs @ {
|
||||
self,
|
||||
flake-parts,
|
||||
nixgl,
|
||||
...
|
||||
}:
|
||||
flake-parts.lib.mkFlake {inherit inputs;} {
|
||||
imports = [
|
||||
inputs.devenv.flakeModule
|
||||
];
|
||||
systems = ["x86_64-linux" "i686-linux" "x86_64-darwin" "aarch64-linux" "aarch64-darwin"];
|
||||
perSystem = { pkgs, ... }:
|
||||
let
|
||||
runtimeLibs = pkgs: (with pkgs; [
|
||||
jdk17
|
||||
|
||||
perSystem = {
|
||||
config,
|
||||
self',
|
||||
inputs',
|
||||
pkgs,
|
||||
system,
|
||||
lib,
|
||||
...
|
||||
}: {
|
||||
# Per-system attributes can be defined here. The self' and inputs'
|
||||
# module parameters provide easy access to attributes of the same
|
||||
# system.
|
||||
alsa-lib at-spi2-atk at-spi2-core cairo cups dbus expat
|
||||
gdk-pixbuf glib gtk3 libdrm libgbm libglvnd libnotify
|
||||
libxkbcommon mesa nspr nss pango systemd vulkan-loader
|
||||
wayland xorg.libX11 xorg.libXcomposite xorg.libXdamage
|
||||
xorg.libXext xorg.libXfixes xorg.libXrandr xorg.libxcb
|
||||
xorg.libxshmfence libusb1 udev libxcrypt-legacy
|
||||
rpm fpm
|
||||
|
||||
# Equivalent to inputs'.nixpkgs.legacyPackages.hello;
|
||||
# packages.default = pkgs.hello;
|
||||
_module.args.pkgs = import self.inputs.nixpkgs {
|
||||
inherit system;
|
||||
overlays = [nixgl.overlay];
|
||||
wineWow64Packages.stable
|
||||
zlib squashfsTools fakeroot libarchive icu
|
||||
nodejs_22 pnpm pkg-config python3 gcc gnumake binutils git
|
||||
pkgs.nodePackages.node-gyp-build
|
||||
]);
|
||||
|
||||
slimeShell = pkgs.buildFHSEnv {
|
||||
name = "slimevr-env";
|
||||
targetPkgs = runtimeLibs;
|
||||
profile = ''
|
||||
export JAVA_HOME=${pkgs.jdk17}
|
||||
export PATH="${pkgs.jdk17}/bin:$PATH"
|
||||
|
||||
# Tell electron-builder to use system tools instead of downloading them
|
||||
export USE_SYSTEM_FPM=true
|
||||
export USE_SYSTEM_MKSQUASHFS=true
|
||||
'';
|
||||
runScript = "bash";
|
||||
};
|
||||
in
|
||||
{
|
||||
devShells.default = slimeShell.env;
|
||||
};
|
||||
|
||||
devenv.shells.default = let
|
||||
fenixpkgs = inputs'.fenix.packages;
|
||||
rust_toolchain = lib.importTOML ./rust-toolchain.toml;
|
||||
in {
|
||||
name = "slimevr";
|
||||
|
||||
imports = [
|
||||
# This is just like the imports in devenv.nix.
|
||||
# See https://devenv.sh/guides/using-with-flake-parts/#import-a-devenv-module
|
||||
# ./devenv-foo.nix
|
||||
];
|
||||
|
||||
# https://devenv.sh/reference/options/
|
||||
packages =
|
||||
(with pkgs; [
|
||||
pkgs.nixgl.nixGLIntel
|
||||
cacert
|
||||
])
|
||||
++ lib.optionals pkgs.stdenv.isLinux (with pkgs; [
|
||||
appimagekit
|
||||
atk
|
||||
cairo
|
||||
dbus
|
||||
dbus.lib
|
||||
dprint
|
||||
gdk-pixbuf
|
||||
glib.out
|
||||
glib-networking
|
||||
gobject-introspection
|
||||
gtk3
|
||||
harfbuzz
|
||||
libffi
|
||||
libsoup_3
|
||||
openssl
|
||||
pango
|
||||
pkg-config
|
||||
treefmt
|
||||
webkitgtk_4_1
|
||||
zlib
|
||||
gst_all_1.gstreamer
|
||||
gst_all_1.gst-plugins-base
|
||||
gst_all_1.gst-plugins-good
|
||||
gst_all_1.gst-plugins-bad
|
||||
librsvg
|
||||
freetype
|
||||
expat
|
||||
libayatana-appindicator
|
||||
libusb1
|
||||
])
|
||||
++ lib.optionals pkgs.stdenv.isDarwin [
|
||||
pkgs.darwin.apple_sdk.frameworks.Security
|
||||
];
|
||||
|
||||
languages.java = {
|
||||
enable = true;
|
||||
gradle.enable = true;
|
||||
jdk.package = pkgs.jdk17;
|
||||
};
|
||||
languages.kotlin.enable = true;
|
||||
|
||||
languages.javascript = {
|
||||
enable = true;
|
||||
corepack.enable = true;
|
||||
};
|
||||
|
||||
languages.rust = {
|
||||
enable = true;
|
||||
toolchain = fenixpkgs.fromToolchainName {
|
||||
name = rust_toolchain.toolchain.channel;
|
||||
sha256 = "sha256-VZZnlyP69+Y3crrLHQyJirqlHrTtGTsyiSnZB8jEvVo=";
|
||||
};
|
||||
components = rust_toolchain.toolchain.components;
|
||||
};
|
||||
|
||||
env = {
|
||||
GIO_EXTRA_MODULES = "${pkgs.glib-networking}/lib/gio/modules:${pkgs.dconf.lib}/lib/gio/modules";
|
||||
};
|
||||
|
||||
enterShell = with pkgs; ''
|
||||
# Export a LD_LIBRARY_PATH without libudev-zero as libgudev not likey
|
||||
export SLIMEVR_RUST_LD_LIBRARY_PATH="$LD_LIBRARY_PATH"
|
||||
export LD_LIBRARY_PATH="${libudev-zero}/lib:$LD_LIBRARY_PATH"
|
||||
# GStreamer plugins won't be found without this
|
||||
export GST_PLUGIN_SYSTEM_PATH_1_0="${pkgs.gst_all_1.gstreamer.out}/lib/gstreamer-1.0:${pkgs.gst_all_1.gst-plugins-base}/lib/gstreamer-1.0:${pkgs.gst_all_1.gst-plugins-good}/lib/gstreamer-1.0:${pkgs.gst_all_1.gst-plugins-bad}/lib/gstreamer-1.0"
|
||||
'';
|
||||
};
|
||||
};
|
||||
flake = {
|
||||
# The usual flake attributes can be defined here, including system-
|
||||
# agnostic ones like nixosModule and system-enumerating ones, although
|
||||
# those are more easily expressed in perSystem.
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -13,8 +13,10 @@ android.useAndroidX=true
|
||||
android.nonTransitiveRClass=true
|
||||
org.gradle.unsafe.configuration-cache=false
|
||||
|
||||
kotlinVersion=2.0.20
|
||||
spotlessVersion=6.25.0
|
||||
shadowJarVersion=8.3.2
|
||||
buildconfigVersion=5.5.0
|
||||
grgitVersion=5.2.2
|
||||
kotlinVersion=2.3.10
|
||||
spotlessVersion=8.2.1
|
||||
shadowJarVersion=9.3.1
|
||||
buildconfigVersion=6.0.7
|
||||
# We should probably stop using grgit, see:
|
||||
# https://andrewoberstar.com/posts/2024-04-02-dont-commit-to-grgit/
|
||||
grgitVersion=5.3.3
|
||||
|
||||
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
4
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,6 +1,8 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.1-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.4-bin.zip
|
||||
distributionSha256Sum=f1771298a70f6db5a29daf62378c4e18a17fc33c9ba6b14362e0cdf40610380d
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
||||
34
gradlew
vendored
@@ -15,6 +15,8 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
##############################################################################
|
||||
#
|
||||
@@ -55,7 +57,7 @@
|
||||
# Darwin, MinGW, and NonStop.
|
||||
#
|
||||
# (3) This script is generated from the Groovy template
|
||||
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# within the Gradle project.
|
||||
#
|
||||
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||
@@ -83,10 +85,9 @@ done
|
||||
# This is normally unused
|
||||
# shellcheck disable=SC2034
|
||||
APP_BASE_NAME=${0##*/}
|
||||
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
|
||||
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
|
||||
' "$PWD" ) || exit
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD=maximum
|
||||
@@ -133,10 +134,13 @@ location of your Java installation."
|
||||
fi
|
||||
else
|
||||
JAVACMD=java
|
||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
if ! command -v java >/dev/null 2>&1
|
||||
then
|
||||
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
@@ -144,7 +148,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||
case $MAX_FD in #(
|
||||
max*)
|
||||
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC3045
|
||||
# shellcheck disable=SC2039,SC3045
|
||||
MAX_FD=$( ulimit -H -n ) ||
|
||||
warn "Could not query maximum file descriptor limit"
|
||||
esac
|
||||
@@ -152,7 +156,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||
'' | soft) :;; #(
|
||||
*)
|
||||
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC3045
|
||||
# shellcheck disable=SC2039,SC3045
|
||||
ulimit -n "$MAX_FD" ||
|
||||
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||
esac
|
||||
@@ -197,11 +201,15 @@ if "$cygwin" || "$msys" ; then
|
||||
done
|
||||
fi
|
||||
|
||||
# Collect all arguments for the java command;
|
||||
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
|
||||
# shell script including quotes and variable substitutions, so put them in
|
||||
# double quotes to make sure that they get re-expanded; and
|
||||
# * put everything else in single quotes, so that it's not re-expanded.
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
|
||||
# Collect all arguments for the java command:
|
||||
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
|
||||
# and any embedded shellness will be escaped.
|
||||
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
|
||||
# treated as '${Hostname}' itself on the command line.
|
||||
|
||||
set -- \
|
||||
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||
|
||||
22
gradlew.bat
vendored
@@ -13,6 +13,8 @@
|
||||
@rem See the License for the specific language governing permissions and
|
||||
@rem limitations under the License.
|
||||
@rem
|
||||
@rem SPDX-License-Identifier: Apache-2.0
|
||||
@rem
|
||||
|
||||
@if "%DEBUG%"=="" @echo off
|
||||
@rem ##########################################################################
|
||||
@@ -43,11 +45,11 @@ set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if %ERRORLEVEL% equ 0 goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
echo. 1>&2
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
|
||||
echo. 1>&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
|
||||
echo location of your Java installation. 1>&2
|
||||
|
||||
goto fail
|
||||
|
||||
@@ -57,11 +59,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
echo. 1>&2
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
|
||||
echo. 1>&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
|
||||
echo location of your Java installation. 1>&2
|
||||
|
||||
goto fail
|
||||
|
||||
|
||||
8
gui/.env
Normal file
@@ -0,0 +1,8 @@
|
||||
VITE_FIRMWARE_TOOL_URL=https://fw-tool-api-v2.slimevr.io
|
||||
VITE_FIRMWARE_TOOL_S3_URL=https://fw-tool-bucket-v2.slimevr.io
|
||||
FIRMWARE_TOOL_SCHEMA_URL=https://fw-tool-api-v2.slimevr.io/api-json
|
||||
|
||||
|
||||
# VITE_FIRMWARE_TOOL_URL=http://localhost:3000
|
||||
# VITE_FIRMWARE_TOOL_S3_URL=http://localhost:9099
|
||||
# FIRMWARE_TOOL_SCHEMA_URL=http://localhost:3000/api-json
|
||||
@@ -1,51 +0,0 @@
|
||||
{
|
||||
"env": {
|
||||
"browser": true,
|
||||
"es2021": true,
|
||||
"jest": true
|
||||
},
|
||||
"extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended", "plugin:@dword-design/import-alias/recommended"],
|
||||
"parser": "@typescript-eslint/parser",
|
||||
"parserOptions": {
|
||||
"ecmaFeatures": {
|
||||
"jsx": true
|
||||
},
|
||||
"ecmaVersion": "latest",
|
||||
"sourceType": "module"
|
||||
},
|
||||
"plugins": ["react-hooks", "@typescript-eslint"],
|
||||
"rules": {
|
||||
"react/react-in-jsx-scope": "off",
|
||||
"react/prop-types": "off",
|
||||
"spaced-comment": "error",
|
||||
"quotes": ["error", "single"],
|
||||
"no-duplicate-imports": "error",
|
||||
"no-inline-styles": "off",
|
||||
"@typescript-eslint/no-explicit-any": "off",
|
||||
"react/no-unescaped-entities": "off",
|
||||
"camelcase": "error",
|
||||
"@typescript-eslint/no-unused-vars": [
|
||||
"warn",
|
||||
{
|
||||
"argsIgnorePattern": "^_",
|
||||
"varsIgnorePattern": "^_"
|
||||
}
|
||||
],
|
||||
"@dword-design/import-alias/prefer-alias": [
|
||||
"error",
|
||||
{
|
||||
"alias": {
|
||||
"@": "./src/"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"import/resolver": {
|
||||
"typescript": {}
|
||||
},
|
||||
"react": {
|
||||
"version": "detect"
|
||||
}
|
||||
}
|
||||
}
|
||||
8
gui/.gitignore
vendored
@@ -28,6 +28,14 @@ yarn-error.log*
|
||||
# vite
|
||||
/dist
|
||||
/stats.html
|
||||
vite.config.ts.timestamp*
|
||||
electron.vite.config.*.mjs
|
||||
|
||||
# eslint
|
||||
.eslintcache
|
||||
|
||||
# Sentry Config File
|
||||
.env.sentry-build-plugin
|
||||
|
||||
# electron
|
||||
out/
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
export default {
|
||||
'**/*.{ts,tsx}': () => 'tsc -p tsconfig.json --noEmit',
|
||||
'**/*.{js,jsx,ts,tsx}': 'eslint --max-warnings=0 --cache --fix',
|
||||
'**/*.{js,jsx,ts,tsx,css,md,json}': 'prettier --write',
|
||||
'src/**/*.{js,jsx,ts,tsx}': 'eslint --max-warnings=0 --no-warn-ignored --cache --fix',
|
||||
'**/*.{js,jsx,ts,tsx,css,scss,md,json}': 'prettier --write',
|
||||
};
|
||||
|
||||
70
gui/electron-builder.yml
Normal file
@@ -0,0 +1,70 @@
|
||||
appId: dev.slimevr.SlimeVR
|
||||
productName: SlimeVR
|
||||
# Global naming pattern
|
||||
artifactName: "${productName}-${version}-${os}-${arch}.${ext}"
|
||||
|
||||
directories:
|
||||
output: dist/artifacts/${os}
|
||||
|
||||
asar: true
|
||||
asarUnpack:
|
||||
- out/main/chunks/*.jar
|
||||
|
||||
electronLanguages:
|
||||
- en-US
|
||||
|
||||
files:
|
||||
- out/**/*
|
||||
- index.html
|
||||
- package.json
|
||||
- node_modules/**
|
||||
- "!node_modules/*/{README,readme,README.md,readme.md,CHANGELOG,CHANGELOG.md,changelog.md}"
|
||||
- "!node_modules/*/{test,tests,__tests__,docs,doc,example,examples}"
|
||||
- "!node_modules/*/.{git,github,vscode,editorconfig,eslintrc,prettierrc}"
|
||||
- "!node_modules/**/*.{map,ts,tsx,d.ts}"
|
||||
- "!**/.DS_Store"
|
||||
|
||||
|
||||
linux:
|
||||
category: Game
|
||||
artifactName: "${productName}-${arch}.${ext}"
|
||||
target:
|
||||
- target: AppImage
|
||||
- target: deb
|
||||
- target: rpm
|
||||
extraFiles:
|
||||
- from: "../server/desktop/build/libs/slimevr.jar"
|
||||
to: "."
|
||||
- from: "./electron/resources/69-slimevr-devices.rules"
|
||||
to: "."
|
||||
icon: "./electron/resources/icons"
|
||||
|
||||
deb:
|
||||
depends: [openjdk-17-jre-headless, udev]
|
||||
afterInstall: "./electron/resources/scripts/postinstall.sh"
|
||||
afterRemove: "./electron/resources/scripts/postremove.sh"
|
||||
|
||||
rpm:
|
||||
depends: [java-latest-openjdk, udev]
|
||||
afterInstall: "./electron/resources/scripts/postinstall.sh"
|
||||
afterRemove: "./electron/resources/scripts/postremove.sh"
|
||||
|
||||
win:
|
||||
artifactName: "${productName}-${os}-${arch}.${ext}"
|
||||
target: zip
|
||||
icon: "./electron/resources/icons/icon.ico"
|
||||
extraFiles:
|
||||
- from: "../server/desktop/build/libs/slimevr.jar"
|
||||
to: "."
|
||||
- from: "../server/core/resources"
|
||||
to: "."
|
||||
filter: ["**/*"]
|
||||
|
||||
mac:
|
||||
target: dmg
|
||||
artifactName: "SlimeVR-mac.${ext}"
|
||||
x64ArchFiles: "**/register-protocol-handler.node"
|
||||
icon: "./electron/resources/icons/icon.icns"
|
||||
extraFiles:
|
||||
- from: "../server/desktop/build/libs/slimevr.jar"
|
||||
to: "Resources/slimevr.jar"
|
||||
47
gui/electron.vite.config.ts
Normal file
@@ -0,0 +1,47 @@
|
||||
import { defineConfig } from 'electron-vite'
|
||||
import { resolve } from 'path'
|
||||
import rendererConfig from './vite.config' // Import your existing React config
|
||||
|
||||
export default defineConfig({
|
||||
main: {
|
||||
build: {
|
||||
rollupOptions: {
|
||||
input: resolve(__dirname, 'electron/main/index.ts'),
|
||||
external: [
|
||||
'pino',
|
||||
'pino-pretty',
|
||||
'pino-roll',
|
||||
'commander',
|
||||
'open'
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
preload: {
|
||||
build: {
|
||||
rollupOptions: {
|
||||
input: resolve(__dirname, 'electron/preload/index.ts'),
|
||||
output: {
|
||||
format: 'cjs', // Force CJS for the preload
|
||||
entryFileNames: 'index.js' // Change back to .js
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
renderer: {
|
||||
...rendererConfig,
|
||||
root: '.',
|
||||
build: {
|
||||
commonjsOptions: {
|
||||
// Force Rollup to treat the protocol directory as CommonJS
|
||||
// even though it's not in node_modules
|
||||
include: [/solarxr-protocol/, /node_modules/],
|
||||
// Required for Flatbuffers/Generated code interop
|
||||
transformMixedEsModules: true,
|
||||
},
|
||||
rollupOptions: {
|
||||
input: resolve(__dirname, 'index.html')
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
1
gui/electron/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
resources/java-version/JavaVersion.class
|
||||
12
gui/electron/main/cli.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import { program } from "commander";
|
||||
|
||||
program
|
||||
.option('-p --path <path>', 'set launch path')
|
||||
.option(
|
||||
'--skip-server-if-running',
|
||||
'gui will not launch the server if it is already running'
|
||||
)
|
||||
.allowUnknownOption();
|
||||
|
||||
program.parse(process.argv);
|
||||
export const options = program.opts();
|
||||
477
gui/electron/main/index.ts
Normal file
@@ -0,0 +1,477 @@
|
||||
import {
|
||||
app,
|
||||
BrowserWindow,
|
||||
dialog,
|
||||
Menu,
|
||||
nativeImage,
|
||||
net,
|
||||
protocol,
|
||||
screen,
|
||||
shell,
|
||||
Tray,
|
||||
} from 'electron';
|
||||
import { IPC_CHANNELS } from '../shared';
|
||||
import path, { dirname, join } from 'path';
|
||||
import open from 'open';
|
||||
import trayIcon from '../resources/icons/icon.png?asset';
|
||||
import appleTrayIcon from '../resources/icons/Square30x30Logo.png?asset';
|
||||
import { readFile, stat } from 'fs/promises';
|
||||
import { getPlatform, handleIpc, isPortAvailable } from './utils';
|
||||
import {
|
||||
findServerJar,
|
||||
findSystemJRE,
|
||||
getGuiDataFolder,
|
||||
getLogsFolder,
|
||||
getServerDataFolder,
|
||||
getWindowStateFile,
|
||||
} from './paths';
|
||||
import { stores } from './store';
|
||||
import { closeLogger, logger } from './logger';
|
||||
import { writeFileSync } from 'node:fs';
|
||||
|
||||
import { spawn } from 'node:child_process';
|
||||
import { discordPresence } from './presence';
|
||||
import { options } from './cli';
|
||||
import { ServerStatusEvent } from 'electron/preload/interface';
|
||||
import { mkdir } from 'node:fs/promises';
|
||||
import { MenuItem } from 'electron/main';
|
||||
|
||||
// Fixes colors looking washed on linux
|
||||
// Might affect hdr
|
||||
if (process.platform === 'linux') {
|
||||
app.commandLine.appendSwitch('disable-features', 'WaylandWpColorManagerV1');
|
||||
app.commandLine.appendSwitch('force-color-profile', 'srgb');
|
||||
}
|
||||
|
||||
app.setPath('userData', getGuiDataFolder());
|
||||
app.setPath('sessionData', join(getGuiDataFolder(), 'electron'));
|
||||
|
||||
protocol.registerSchemesAsPrivileged([
|
||||
{
|
||||
scheme: 'app',
|
||||
privileges: {
|
||||
standard: true,
|
||||
secure: true,
|
||||
supportFetchAPI: true,
|
||||
corsEnabled: true,
|
||||
},
|
||||
},
|
||||
]);
|
||||
|
||||
let mainWindow: BrowserWindow | null = null;
|
||||
|
||||
handleIpc(IPC_CHANNELS.GH_FETCH, async (e, options) => {
|
||||
if (options.type === 'fw-releases') {
|
||||
return fetch(
|
||||
'https://api.github.com/repos/SlimeVR/SlimeVR-Tracker-ESP/releases'
|
||||
).then((res) => res.json());
|
||||
}
|
||||
if (options.type === 'asset') {
|
||||
if (
|
||||
!options.url.startsWith(
|
||||
'https://github.com/SlimeVR/SlimeVR-Tracker-ESP/releases/download'
|
||||
)
|
||||
)
|
||||
return null;
|
||||
return fetch(options.url).then((res) => res.json());
|
||||
}
|
||||
});
|
||||
|
||||
handleIpc(IPC_CHANNELS.OS_STATS, async () => {
|
||||
return {
|
||||
type: getPlatform(),
|
||||
};
|
||||
});
|
||||
|
||||
handleIpc(IPC_CHANNELS.I18N_OVERRIDE, async () => {
|
||||
const overridefile = join(getServerDataFolder(), 'override.ftl');
|
||||
const exists = await stat(overridefile)
|
||||
.then(() => true)
|
||||
.catch(() => false);
|
||||
|
||||
if (!exists) return false;
|
||||
return readFile(overridefile, { encoding: 'utf-8' });
|
||||
});
|
||||
|
||||
handleIpc(IPC_CHANNELS.LOG, (e, type, ...args) => {
|
||||
let payload: Record<string, unknown> = {};
|
||||
const messageParts: unknown[] = [];
|
||||
|
||||
args.forEach((arg) => {
|
||||
if (arg instanceof Error) {
|
||||
payload.err = arg;
|
||||
} else if (typeof arg === 'object' && arg !== null) {
|
||||
payload = { ...payload, ...arg };
|
||||
} else {
|
||||
messageParts.push(arg);
|
||||
}
|
||||
});
|
||||
|
||||
const msg = messageParts.join(' ');
|
||||
|
||||
switch (type) {
|
||||
case 'error':
|
||||
logger.error(payload, msg);
|
||||
break;
|
||||
case 'warn':
|
||||
logger.warn(payload, msg);
|
||||
break;
|
||||
default:
|
||||
logger.info(payload, msg);
|
||||
}
|
||||
});
|
||||
|
||||
handleIpc(IPC_CHANNELS.OPEN_URL, (e, url) => {
|
||||
const allowed_urls = [
|
||||
/steam:\/\/.*/,
|
||||
/ms-settings:network$/,
|
||||
/https:\/\/.*\.slimevr\.dev.*/,
|
||||
/https:\/\/github\.com\/.*/,
|
||||
/https:\/\/discord\.gg\/slimevr$/,
|
||||
];
|
||||
if (allowed_urls.find((a) => url.match(a))) open(url);
|
||||
else logger.error({ url }, 'attempted to open non-whitelisted URL');
|
||||
});
|
||||
|
||||
handleIpc(IPC_CHANNELS.STORAGE, async (e, { type, method, key, value }) => {
|
||||
const store = stores[type];
|
||||
if (!store) throw new Error(`Storage type ${type} not found`);
|
||||
|
||||
switch (method) {
|
||||
case 'get':
|
||||
return store.get(key!);
|
||||
case 'set':
|
||||
return store.set(key!, value);
|
||||
case 'delete':
|
||||
return store.delete(key!);
|
||||
case 'save':
|
||||
return store.save();
|
||||
}
|
||||
});
|
||||
|
||||
handleIpc(IPC_CHANNELS.DISCORD_PRESENCE, async (e, options) => {
|
||||
if (options.enable && !discordPresence.state.ready) {
|
||||
await discordPresence.connect();
|
||||
discordPresence.updateActivity(options.activity);
|
||||
} else if (!options.enable && discordPresence.state.ready) {
|
||||
discordPresence.destroy();
|
||||
}
|
||||
});
|
||||
|
||||
handleIpc(IPC_CHANNELS.OPEN_FILE, (e, folder) => {
|
||||
const requestedPath = path.resolve(folder);
|
||||
|
||||
const isAllowed = [getServerDataFolder(), getGuiDataFolder(), getLogsFolder()].some(
|
||||
(parent) => {
|
||||
const absoluteParent = path.resolve(parent);
|
||||
const relative = path.relative(absoluteParent, requestedPath);
|
||||
return !relative.includes('..') && !path.isAbsolute(relative);
|
||||
}
|
||||
);
|
||||
|
||||
if (isAllowed) {
|
||||
shell.openPath(requestedPath);
|
||||
} else {
|
||||
logger.error({ path: requestedPath }, 'Blocked unauthorized path');
|
||||
}
|
||||
});
|
||||
|
||||
handleIpc(IPC_CHANNELS.GET_FOLDER, (e, folder) => {
|
||||
switch (folder) {
|
||||
case 'config':
|
||||
return getGuiDataFolder();
|
||||
case 'logs':
|
||||
return getLogsFolder();
|
||||
}
|
||||
});
|
||||
|
||||
const windowStateFile = await readFile(getWindowStateFile(), {
|
||||
encoding: 'utf-8',
|
||||
}).catch(() => null);
|
||||
|
||||
const defaultWindowState: {
|
||||
width: number;
|
||||
height: number;
|
||||
x?: number;
|
||||
y?: number;
|
||||
} = {
|
||||
width: 1289.0,
|
||||
height: 709.0,
|
||||
x: undefined,
|
||||
y: undefined,
|
||||
};
|
||||
const windowState = windowStateFile ? JSON.parse(windowStateFile) : defaultWindowState;
|
||||
|
||||
const MIN_WIDTH = 393;
|
||||
const MIN_HEIGHT = 667;
|
||||
|
||||
function validateWindowState(state: typeof defaultWindowState) {
|
||||
if (state.x === undefined || state.y === undefined) {
|
||||
return state;
|
||||
}
|
||||
|
||||
const displays = screen.getAllDisplays();
|
||||
|
||||
const isVisible = displays.some((display) => {
|
||||
return (
|
||||
state.x! >= display.bounds.x &&
|
||||
state.y! >= display.bounds.y &&
|
||||
state.x! + state.width <= display.bounds.x + display.bounds.width &&
|
||||
state.y! + state.height <= display.bounds.y + display.bounds.height
|
||||
);
|
||||
});
|
||||
|
||||
const minWidth = MIN_WIDTH;
|
||||
const minHeight = MIN_HEIGHT;
|
||||
|
||||
if (!isVisible || state.width < minWidth || state.height < minHeight) {
|
||||
return defaultWindowState;
|
||||
}
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
const saveWindowState = async () => {
|
||||
await mkdir(dirname(getWindowStateFile()), { recursive: true });
|
||||
writeFileSync(getWindowStateFile(), JSON.stringify(windowState));
|
||||
};
|
||||
|
||||
function createWindow() {
|
||||
const validatedState = validateWindowState(windowState);
|
||||
|
||||
mainWindow = new BrowserWindow({
|
||||
width: validatedState.width,
|
||||
height: validatedState.height,
|
||||
x: validatedState.x,
|
||||
y: validatedState.y,
|
||||
minHeight: MIN_HEIGHT,
|
||||
minWidth: MIN_WIDTH,
|
||||
movable: true,
|
||||
frame: false,
|
||||
roundedCorners: true,
|
||||
webPreferences: {
|
||||
preload: join(__dirname, '../preload/index.js'),
|
||||
nodeIntegration: false,
|
||||
contextIsolation: true,
|
||||
devTools: true,
|
||||
},
|
||||
});
|
||||
|
||||
if (process.env.ELECTRON_RENDERER_URL) {
|
||||
mainWindow.loadURL(process.env.ELECTRON_RENDERER_URL);
|
||||
mainWindow.webContents.openDevTools();
|
||||
} else {
|
||||
mainWindow.loadURL('app://./index.html');
|
||||
}
|
||||
|
||||
mainWindow.on('closed', () => {
|
||||
mainWindow = null;
|
||||
});
|
||||
|
||||
handleIpc('window-actions', (e, action) => {
|
||||
switch (action) {
|
||||
case 'close':
|
||||
mainWindow?.close();
|
||||
break;
|
||||
case 'hide':
|
||||
mainWindow?.hide();
|
||||
break;
|
||||
case 'minimize':
|
||||
mainWindow?.minimize();
|
||||
break;
|
||||
case 'maximize':
|
||||
mainWindow?.maximize();
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
handleIpc('open-dialog', (e, options) => dialog.showOpenDialog(options));
|
||||
handleIpc('save-dialog', (e, options) => dialog.showSaveDialog(options));
|
||||
|
||||
const icon = nativeImage.createFromPath(
|
||||
getPlatform() === 'macos' ? appleTrayIcon : trayIcon
|
||||
);
|
||||
const tray = new Tray(icon);
|
||||
tray.setToolTip('SlimeVR');
|
||||
tray.on('click', () => {
|
||||
mainWindow?.show();
|
||||
});
|
||||
const contextMenu = Menu.buildFromTemplate([
|
||||
{
|
||||
label: 'Show',
|
||||
click: () => {
|
||||
mainWindow?.show();
|
||||
},
|
||||
},
|
||||
{
|
||||
label: 'Hide',
|
||||
click: () => {
|
||||
mainWindow?.hide();
|
||||
},
|
||||
},
|
||||
{ role: 'quit' },
|
||||
]);
|
||||
tray.setContextMenu(contextMenu);
|
||||
|
||||
const updateWindowState = () => {
|
||||
if (!mainWindow) return;
|
||||
|
||||
windowState.minimized = mainWindow.isMinimized();
|
||||
if (!mainWindow.isMinimized() && !mainWindow.isMaximized()) {
|
||||
const bounds = mainWindow.getBounds();
|
||||
windowState.width = bounds.width;
|
||||
windowState.height = bounds.height;
|
||||
windowState.x = bounds.x;
|
||||
windowState.y = bounds.y;
|
||||
}
|
||||
};
|
||||
|
||||
mainWindow.on('move', updateWindowState);
|
||||
mainWindow.on('resize', updateWindowState);
|
||||
mainWindow.on('minimize', updateWindowState);
|
||||
mainWindow.on('maximize', updateWindowState);
|
||||
|
||||
mainWindow.webContents.on('context-menu', (event, params) => {
|
||||
const menu = new Menu();
|
||||
|
||||
menu.append(
|
||||
new MenuItem({
|
||||
label: 'Inspect Element',
|
||||
click: () => {
|
||||
mainWindow?.webContents.inspectElement(params.x, params.y);
|
||||
},
|
||||
})
|
||||
);
|
||||
|
||||
menu.append(new MenuItem({ type: 'separator' }));
|
||||
menu.append(new MenuItem({ label: 'Copy', role: 'copy' }));
|
||||
menu.append(new MenuItem({ label: 'Paste', role: 'paste' }));
|
||||
|
||||
if (mainWindow) menu.popup({ window: mainWindow });
|
||||
});
|
||||
}
|
||||
|
||||
const checkEnvironmentVariables = () => {
|
||||
const to_check = ['_JAVA_OPTIONS', 'JAVA_TOOL_OPTIONS'];
|
||||
|
||||
const set = to_check.filter((env) => !!process.env[env]);
|
||||
if (set.length > 0) {
|
||||
dialog.showErrorBox(
|
||||
'SlimeVR',
|
||||
`You have environment variables ${set.join(', ')} set, which may cause the SlimeVR Server to fail to launch properly.`
|
||||
);
|
||||
app.quit();
|
||||
}
|
||||
};
|
||||
|
||||
const isServerRunning = async () => !(await isPortAvailable(21110));
|
||||
|
||||
const spawnServer = async () => {
|
||||
if (options.skipServerIfRunning && (await isServerRunning())) {
|
||||
logger.info(
|
||||
{ skipServerIfRunning: options.skipServerIfRunning },
|
||||
'Server is already running, skipping server start'
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
const serverJar = findServerJar();
|
||||
if (!serverJar) {
|
||||
logger.info('server jar not found, skipping');
|
||||
return;
|
||||
}
|
||||
const sharedDir = dirname(serverJar);
|
||||
const javaBin = await findSystemJRE(sharedDir);
|
||||
if (!javaBin) {
|
||||
dialog.showErrorBox(
|
||||
'SlimeVR',
|
||||
`Couldn't find a compatible Java version, please download Java 17 or higher`
|
||||
);
|
||||
app.quit()
|
||||
return;
|
||||
}
|
||||
|
||||
logger.info({ javaBin, serverJar }, 'Found Java and server jar');
|
||||
const platform = getPlatform();
|
||||
const serverWorkdir = getServerDataFolder()
|
||||
const serverProcess = spawn(javaBin, ['-Xmx128M', '-jar', serverJar, 'run'], {
|
||||
cwd: serverWorkdir,
|
||||
shell: false,
|
||||
env:
|
||||
platform === 'windows'
|
||||
? {
|
||||
...process.env,
|
||||
APPDATA: app.getPath('appData'),
|
||||
LOCALAPPDATA: process.env['USERPROFILE'] ? path.join(process.env['USERPROFILE'], 'AppData', 'Local') : undefined,
|
||||
}
|
||||
: undefined,
|
||||
});
|
||||
|
||||
const sendToWindow = (event: ServerStatusEvent) => {
|
||||
if (mainWindow && !mainWindow.webContents.isDestroyed()) {
|
||||
mainWindow.webContents.send(IPC_CHANNELS.SERVER_STATUS, event);
|
||||
}
|
||||
};
|
||||
|
||||
serverProcess.stdout?.on('data', (message) => {
|
||||
sendToWindow({ message: message.toString(), type: 'stdout' });
|
||||
});
|
||||
|
||||
serverProcess.stderr?.on('data', (message) => {
|
||||
sendToWindow({ message: message.toString(), type: 'stderr' });
|
||||
});
|
||||
|
||||
serverProcess.on('error', (err) => {
|
||||
logger.info({ err }, 'Error launching the java server');
|
||||
if (!isQuitting) app.quit();
|
||||
})
|
||||
|
||||
serverProcess.on('exit', () => {
|
||||
logger.info('Server process exiting');
|
||||
})
|
||||
|
||||
const exited = new Promise<void>((resolve) => serverProcess.once('exit', resolve));
|
||||
|
||||
return {
|
||||
process: serverProcess,
|
||||
close: () => serverProcess.kill(),
|
||||
waitForExit: () => exited,
|
||||
};
|
||||
};
|
||||
|
||||
let isQuitting = false;
|
||||
|
||||
app.whenReady().then(async () => {
|
||||
// Register protocol handler for app:// scheme to handle assets with leading slashes
|
||||
protocol.handle('app', (request) => {
|
||||
const url = request.url.slice('app://'.length);
|
||||
const filePath = path.normalize(join(__dirname, '../renderer', url));
|
||||
return net.fetch('file://' + filePath);
|
||||
});
|
||||
|
||||
checkEnvironmentVariables();
|
||||
const server = await spawnServer();
|
||||
|
||||
createWindow();
|
||||
|
||||
logger.info('SlimeVR started!');
|
||||
|
||||
app.on('window-all-closed', () => {
|
||||
app.quit();
|
||||
});
|
||||
|
||||
app.on('before-quit', async (event) => {
|
||||
if (isQuitting) return;
|
||||
isQuitting = true;
|
||||
event.preventDefault();
|
||||
logger.info('App quitting, saving...');
|
||||
server?.close();
|
||||
await server?.waitForExit();
|
||||
stores.settings.save();
|
||||
stores.cache.save();
|
||||
discordPresence.destroy();
|
||||
await saveWindowState();
|
||||
await closeLogger();
|
||||
app.exit(0);
|
||||
});
|
||||
});
|
||||
34
gui/electron/main/logger.ts
Normal file
@@ -0,0 +1,34 @@
|
||||
import pino from 'pino';
|
||||
import { getLogsFolder } from './paths';
|
||||
import { join } from 'node:path';
|
||||
|
||||
const transport = pino.transport({
|
||||
targets: [
|
||||
{
|
||||
target: 'pino-roll',
|
||||
options: {
|
||||
file: join(getLogsFolder(), 'slimevr-gui.log'),
|
||||
frequency: 'daily',
|
||||
size: '10m',
|
||||
mkdir: true,
|
||||
limit: { count: 7 },
|
||||
},
|
||||
level: 'info',
|
||||
},
|
||||
{
|
||||
target: 'pino-pretty',
|
||||
options: { colorize: true },
|
||||
level: 'debug',
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
export const logger = pino(transport);
|
||||
|
||||
export const closeLogger = () =>
|
||||
new Promise<void>((resolve) => {
|
||||
logger.flush(() => {
|
||||
transport.once('close', resolve);
|
||||
transport.end();
|
||||
});
|
||||
});
|
||||
120
gui/electron/main/paths.ts
Normal file
@@ -0,0 +1,120 @@
|
||||
import { app } from 'electron';
|
||||
import path, { join } from 'node:path';
|
||||
import { getPlatform } from './utils';
|
||||
import { glob } from 'glob';
|
||||
import { spawn } from 'node:child_process';
|
||||
import javaVersionJar from '../resources/java-version/JavaVersion.jar?asset&asarUnpack';
|
||||
import { existsSync } from 'node:fs';
|
||||
import { options } from './cli';
|
||||
|
||||
const javaBin = getPlatform() === 'windows' ? 'java.exe' : 'java';
|
||||
export const CONFIG_IDENTIFIER = 'dev.slimevr.SlimeVR';
|
||||
|
||||
export const getGuiDataFolder = () => {
|
||||
const platform = getPlatform();
|
||||
|
||||
switch (platform) {
|
||||
case 'linux':
|
||||
if (process.env['XDG_DATA_HOME'])
|
||||
return join(process.env['XDG_DATA_HOME'], CONFIG_IDENTIFIER);
|
||||
return join(app.getPath('home'), '.local/share', CONFIG_IDENTIFIER);
|
||||
case 'windows':
|
||||
return join(app.getPath('appData'), CONFIG_IDENTIFIER);
|
||||
case 'macos':
|
||||
return join(
|
||||
app.getPath('home'),
|
||||
'Library/Application Support',
|
||||
CONFIG_IDENTIFIER
|
||||
);
|
||||
case 'unknown':
|
||||
throw 'error';
|
||||
}
|
||||
};
|
||||
|
||||
export const getServerDataFolder = () => {
|
||||
const platform = getPlatform();
|
||||
|
||||
switch (platform) {
|
||||
case 'linux':
|
||||
case 'windows':
|
||||
case 'macos':
|
||||
return join(app.getPath('appData'), CONFIG_IDENTIFIER);
|
||||
case 'unknown':
|
||||
throw 'error';
|
||||
}
|
||||
};
|
||||
|
||||
export const getLogsFolder = () => {
|
||||
return join(getGuiDataFolder(), 'logs');
|
||||
};
|
||||
|
||||
export const getWindowStateFile = () =>
|
||||
join(getServerDataFolder(), '.window-state.json');
|
||||
|
||||
const localJavaBin = (sharedDir: string) => {
|
||||
const jre = join(sharedDir, 'jre/bin', javaBin);
|
||||
return jre;
|
||||
};
|
||||
|
||||
const javaHomeBin = () => {
|
||||
const javaHome = process.env['JAVA_HOME'];
|
||||
if (!javaHome) return null;
|
||||
const javaHomeJre = join(javaHome, 'bin', javaBin);
|
||||
return javaHomeJre;
|
||||
};
|
||||
|
||||
export const findSystemJRE = async (sharedDir: string) => {
|
||||
const paths = [
|
||||
localJavaBin(sharedDir),
|
||||
javaHomeBin(),
|
||||
...(await glob('/usr/lib/jvm/*/bin/' + javaBin)),
|
||||
...(await glob('/Library/Java/JavaVirtualMachines/*/Contents/Home/bin/' + javaBin)),
|
||||
];
|
||||
|
||||
for (const path of paths) {
|
||||
if (!path) continue;
|
||||
|
||||
const version = await new Promise<number | null>((resolve) => {
|
||||
const process = spawn(path, ['-jar', javaVersionJar], {});
|
||||
|
||||
let version: number | null = null;
|
||||
|
||||
process.stdout?.once('data', (data) => {
|
||||
try {
|
||||
version = parseFloat(data.toString());
|
||||
} catch {
|
||||
version = null;
|
||||
}
|
||||
});
|
||||
|
||||
process.on('error', () => {
|
||||
resolve(null);
|
||||
});
|
||||
|
||||
process.on('exit', () => {
|
||||
resolve(version);
|
||||
});
|
||||
});
|
||||
if (version && version >= 17) return path;
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
export const findServerJar = () => {
|
||||
const paths = [
|
||||
options.path ? path.resolve(options.path) : undefined,
|
||||
app.isPackaged ? path.resolve(process.resourcesPath) : undefined,
|
||||
// AppImage passes the fakeroot in `APPDIR` env var.
|
||||
process.env['APPDIR']
|
||||
? path.resolve(join(process.env['APPDIR'], 'usr/share/slimevr/'))
|
||||
: undefined,
|
||||
path.dirname(app.getPath('exe')),
|
||||
// For flatpack container
|
||||
path.resolve('/app/share/slimevr/'),
|
||||
path.resolve('/usr/share/slimevr/'),
|
||||
];
|
||||
return paths
|
||||
.filter((p) => !!p)
|
||||
.map((p) => join(p!, 'slimevr.jar'))
|
||||
.find((p) => existsSync(p));
|
||||
};
|
||||
49
gui/electron/main/presence.ts
Normal file
@@ -0,0 +1,49 @@
|
||||
import { Client } from '@xhayper/discord-rpc';
|
||||
import { logger } from './logger';
|
||||
|
||||
export const richPresence = () => {
|
||||
const initialState = () => ({ ready: false, start: Date.now() });
|
||||
|
||||
const state = initialState();
|
||||
|
||||
const client = new Client({
|
||||
clientId: '1237970689009647639',
|
||||
transport: { type: 'ipc' },
|
||||
});
|
||||
client.on('ready', () => {
|
||||
state.ready = true;
|
||||
});
|
||||
|
||||
client.on('disconnected', () => {
|
||||
state.ready = false;
|
||||
});
|
||||
|
||||
return {
|
||||
state,
|
||||
connect: async () => {
|
||||
try {
|
||||
await client.login();
|
||||
} catch (e) {
|
||||
logger.error(e, 'unable to connect to discord rpc');
|
||||
}
|
||||
},
|
||||
updateActivity: (content: string) => {
|
||||
if (!state.ready) return;
|
||||
client.user
|
||||
?.setActivity({
|
||||
state: content,
|
||||
largeImageKey: 'icon',
|
||||
startTimestamp: state.start,
|
||||
})
|
||||
.catch((e) => {
|
||||
logger.error(e, 'unable to update rpc activity');
|
||||
});
|
||||
},
|
||||
destroy: () => {
|
||||
client.destroy();
|
||||
Object.assign(state, initialState());
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export const discordPresence = richPresence();
|
||||
76
gui/electron/main/store.ts
Normal file
@@ -0,0 +1,76 @@
|
||||
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
||||
import { dirname, join } from "path";
|
||||
import { logger } from "./logger";
|
||||
import { getGuiDataFolder } from "./paths";
|
||||
|
||||
|
||||
export class CustomStore {
|
||||
private data: Record<string, unknown> = {};
|
||||
private saveTimeout: NodeJS.Timeout | null = null;
|
||||
private filePath: string;
|
||||
private debounceMs: number;
|
||||
|
||||
constructor(filePath: string, debounceMs: number = 2000) {
|
||||
this.filePath = filePath;
|
||||
this.debounceMs = debounceMs;
|
||||
this.load();
|
||||
}
|
||||
|
||||
private load() {
|
||||
try {
|
||||
if (existsSync(this.filePath)) {
|
||||
const raw = readFileSync(this.filePath, 'utf-8');
|
||||
this.data = JSON.parse(raw);
|
||||
}
|
||||
} catch (err) {
|
||||
logger.error(err, `Failed to load store at ${this.filePath}`);
|
||||
this.data = {};
|
||||
}
|
||||
}
|
||||
|
||||
/** Set a key and trigger the debounced auto-save */
|
||||
set(key: string, value: unknown) {
|
||||
this.data[key] = value;
|
||||
this.triggerAutoSave();
|
||||
}
|
||||
|
||||
get<T>(key: string): T | undefined {
|
||||
return this.data[key] as T;
|
||||
}
|
||||
|
||||
delete(key: string): boolean {
|
||||
if (key in this.data) {
|
||||
delete this.data[key];
|
||||
this.triggerAutoSave();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private triggerAutoSave() {
|
||||
if (this.saveTimeout) clearTimeout(this.saveTimeout);
|
||||
this.saveTimeout = setTimeout(() => {
|
||||
this.save();
|
||||
}, this.debounceMs);
|
||||
}
|
||||
|
||||
save(): boolean {
|
||||
try {
|
||||
if (this.saveTimeout) clearTimeout(this.saveTimeout);
|
||||
|
||||
const dir = dirname(this.filePath);
|
||||
if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
|
||||
|
||||
writeFileSync(this.filePath, JSON.stringify(this.data, null, 2), 'utf-8');
|
||||
return true;
|
||||
} catch (err) {
|
||||
logger.error(err, 'Save failed', this.filePath);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export const stores = {
|
||||
settings: new CustomStore(join(getGuiDataFolder(), 'gui-settings.dat'), 1000),
|
||||
cache: new CustomStore(join(getGuiDataFolder(), 'gui-cache.dat'), 100),
|
||||
};
|
||||
50
gui/electron/main/utils.ts
Normal file
@@ -0,0 +1,50 @@
|
||||
import os from 'os'
|
||||
import { OSStats } from "../preload/interface";
|
||||
import { ipcMain, IpcMainInvokeEvent } from 'electron';
|
||||
import { IpcInvokeMap } from '../shared';
|
||||
import net from 'net'
|
||||
|
||||
export const getPlatform = (): OSStats['type'] => {
|
||||
switch (os.platform()) {
|
||||
case 'darwin':
|
||||
return 'macos';
|
||||
case 'win32':
|
||||
return 'windows';
|
||||
case 'linux':
|
||||
return 'linux';
|
||||
default:
|
||||
return 'unknown';
|
||||
}
|
||||
};
|
||||
|
||||
export const isPortAvailable = (port: number) => {
|
||||
return new Promise((resolve) => {
|
||||
const s = net.createServer();
|
||||
s.once('error', (err) => {
|
||||
s.close();
|
||||
if ("code" in err && err["code"] == "EADDRINUSE") {
|
||||
resolve(false);
|
||||
} else {
|
||||
resolve(false);
|
||||
}
|
||||
});
|
||||
s.once('listening', () => {
|
||||
resolve(true);
|
||||
s.close();
|
||||
});
|
||||
s.listen(port);
|
||||
});
|
||||
};
|
||||
|
||||
export function handleIpc<K extends keyof IpcInvokeMap>(
|
||||
channel: K,
|
||||
handler: (
|
||||
event: IpcMainInvokeEvent,
|
||||
...args: Parameters<IpcInvokeMap[K]>
|
||||
) => ReturnType<IpcInvokeMap[K]>
|
||||
) {
|
||||
ipcMain.handle(channel, (event, ...args) => {
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
return handler(event, ...args as any);
|
||||
});
|
||||
}
|
||||
40
gui/electron/preload/index.ts
Normal file
@@ -0,0 +1,40 @@
|
||||
import { contextBridge, ipcRenderer, IpcRendererEvent } from 'electron';
|
||||
import { IElectronAPI, ServerStatusEvent } from './interface';
|
||||
import { IPC_CHANNELS } from '../shared';
|
||||
|
||||
contextBridge.exposeInMainWorld('electronAPI', {
|
||||
onServerStatus: (callback) => {
|
||||
const subscription = (_event: IpcRendererEvent, value: ServerStatusEvent) =>
|
||||
callback(value);
|
||||
ipcRenderer.on(IPC_CHANNELS.SERVER_STATUS, subscription);
|
||||
return () => ipcRenderer.removeListener(IPC_CHANNELS.SERVER_STATUS, subscription);
|
||||
},
|
||||
openUrl: (url) => ipcRenderer.invoke(IPC_CHANNELS.OPEN_URL, url),
|
||||
osStats: () => ipcRenderer.invoke(IPC_CHANNELS.OS_STATS),
|
||||
close: () => ipcRenderer.invoke(IPC_CHANNELS.WINDOW_ACTIONS, 'close'),
|
||||
hide: () => ipcRenderer.invoke(IPC_CHANNELS.WINDOW_ACTIONS, 'hide'),
|
||||
minimize: () => ipcRenderer.invoke(IPC_CHANNELS.WINDOW_ACTIONS, 'minimize'),
|
||||
maximize: () => ipcRenderer.invoke(IPC_CHANNELS.WINDOW_ACTIONS, 'maximize'),
|
||||
getStorage: async (type) => {
|
||||
return {
|
||||
get: (key) =>
|
||||
ipcRenderer.invoke(IPC_CHANNELS.STORAGE, { type, method: 'get', key }),
|
||||
set: (key, value) =>
|
||||
ipcRenderer.invoke(IPC_CHANNELS.STORAGE, { type, method: 'set', key, value }),
|
||||
delete: (key) =>
|
||||
ipcRenderer.invoke(IPC_CHANNELS.STORAGE, { type, method: 'delete', key }),
|
||||
save: () => ipcRenderer.invoke(IPC_CHANNELS.STORAGE, { type, method: 'save' }),
|
||||
};
|
||||
},
|
||||
log: (type, ...args) => ipcRenderer.invoke(IPC_CHANNELS.LOG, type, ...args),
|
||||
i18nOverride: async () => ipcRenderer.invoke(IPC_CHANNELS.I18N_OVERRIDE),
|
||||
showDecorations: () => {},
|
||||
setTranslations: () => {},
|
||||
openDialog: (options) => ipcRenderer.invoke(IPC_CHANNELS.OPEN_DIALOG, options),
|
||||
saveDialog: (options) => ipcRenderer.invoke(IPC_CHANNELS.SAVE_DIALOG, options),
|
||||
openConfigFolder: async () => ipcRenderer.invoke(IPC_CHANNELS.OPEN_FILE, await ipcRenderer.invoke(IPC_CHANNELS.GET_FOLDER, 'config')),
|
||||
openLogsFolder: async () => ipcRenderer.invoke(IPC_CHANNELS.OPEN_FILE, await ipcRenderer.invoke(IPC_CHANNELS.GET_FOLDER, 'logs')),
|
||||
openFile: (path) => ipcRenderer.invoke(IPC_CHANNELS.OPEN_FILE, path),
|
||||
ghGet: (req) => ipcRenderer.invoke(IPC_CHANNELS.GH_FETCH, req),
|
||||
setPresence: (options) => ipcRenderer.invoke(IPC_CHANNELS.DISCORD_PRESENCE, options)
|
||||
} satisfies IElectronAPI);
|
||||
65
gui/electron/preload/interface.d.ts
vendored
Normal file
@@ -0,0 +1,65 @@
|
||||
import {
|
||||
OpenDialogOptions,
|
||||
OpenDialogReturnValue,
|
||||
SaveDialogOptions,
|
||||
SaveDialogReturnValue,
|
||||
} from 'electron';
|
||||
|
||||
export type ServerStatusEvent = {
|
||||
type: 'stdout' | 'stderr' | 'error' | 'terminated' | 'other';
|
||||
message: string;
|
||||
};
|
||||
|
||||
export type OSStats = {
|
||||
type: 'linux' | 'windows' | 'macos' | 'unknown';
|
||||
};
|
||||
|
||||
export interface CrossStorage {
|
||||
set(key: string, value: unknown): Promise<void>;
|
||||
get<T>(key: string): Promise<T | undefined>;
|
||||
delete(key: string): Promise<boolean>;
|
||||
save(): Promise<boolean>;
|
||||
}
|
||||
|
||||
export type GHGet = { type: 'fw-releases' } | { type: 'asset'; url: string };
|
||||
export type GHReturn = {
|
||||
asset: [number, string][] | null;
|
||||
['fw-releases']:
|
||||
| {
|
||||
assets: { browser_download_url: string; name: string; digest: string }[];
|
||||
prerelease: boolean;
|
||||
tag_name: string;
|
||||
body: string;
|
||||
}[]
|
||||
| null;
|
||||
};
|
||||
|
||||
export type DiscordPresence = { enable: false } | { enable: true, activity: string }
|
||||
|
||||
export interface IElectronAPI {
|
||||
onServerStatus: (cb: (data: ServerStatusEvent) => void) => () => void;
|
||||
openUrl: (url: string) => Promise<void>;
|
||||
osStats: () => Promise<OSStats>;
|
||||
openLogsFolder: () => Promise<void>;
|
||||
openConfigFolder: () => Promise<void>;
|
||||
close: () => void;
|
||||
hide: () => void;
|
||||
minimize: () => void;
|
||||
maximize: () => void;
|
||||
showDecorations: (decorations: boolean) => void;
|
||||
setTranslations: (translations: Record<string, string>) => void;
|
||||
i18nOverride: () => Promise<string | false>;
|
||||
getStorage: (type: 'settings' | 'cache') => Promise<CrossStorage>;
|
||||
openDialog: (options: OpenDialogOptions) => Promise<OpenDialogReturnValue>;
|
||||
saveDialog: (options: SaveDialogOptions) => Promise<SaveDialogReturnValue>;
|
||||
log: (type: 'info' | 'error' | 'warn', ...args: unknown[]) => void;
|
||||
openFile: (path: string) => void;
|
||||
ghGet: <T extends GHGet>(options: T) => Promise<GHReturn[T['type']]>;
|
||||
setPresence: (options: DiscordPresence) => void;
|
||||
}
|
||||
|
||||
declare global {
|
||||
interface Window {
|
||||
electronAPI: IElectronAPI;
|
||||
}
|
||||
}
|
||||
46
gui/electron/resources/69-slimevr-devices.rules
Normal file
@@ -0,0 +1,46 @@
|
||||
# Copyright 2025 Eiren Rain and SlimeVR Contributors
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
## QinHeng
|
||||
# CH340
|
||||
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1A86", ATTRS{idProduct}=="7522", MODE="0660", TAG+="uaccess"
|
||||
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1A86", ATTRS{idProduct}=="7523", MODE="0660", TAG+="uaccess"
|
||||
# CH341
|
||||
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1A86", ATTRS{idProduct}=="5523", MODE="0660", TAG+="uaccess"
|
||||
# CH343
|
||||
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1A86", ATTRS{idProduct}=="55D3", MODE="0660", TAG+="uaccess"
|
||||
# CH9102x
|
||||
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1A86", ATTRS{idProduct}=="55D4", MODE="0660", TAG+="uaccess"
|
||||
|
||||
## Silabs
|
||||
# CP210x
|
||||
SUBSYSTEMS=="usb", ATTRS{idVendor}=="10C4", ATTRS{idProduct}=="EA60", MODE="0660", TAG+="uaccess"
|
||||
|
||||
## Espressif
|
||||
# ESP32-S3 / ESP32-C3 / ESP32-C5 / ESP32-C6 / ESP32-C61 / ESP32-H2 / ESP32-P4
|
||||
SUBSYSTEMS=="usb", ATTRS{idVendor}=="303A", ATTRS{idProduct}=="1001", MODE="0660", TAG+="uaccess"
|
||||
# ESP32-S2
|
||||
SUBSYSTEMS=="usb", ATTRS{idVendor}=="303A", ATTRS{idProduct}=="0002", MODE="0660", TAG+="uaccess"
|
||||
|
||||
## FTDI
|
||||
# FT232BM/L/Q, FT245BM/L/Q
|
||||
# FT232RL/Q, FT245RL/Q
|
||||
# VNC1L with VDPS Firmware
|
||||
# VNC2 with FT232Slave
|
||||
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", MODE="0660", TAG+="uaccess"
|
||||
|
||||
## SlimeVR
|
||||
# smol slime dongle
|
||||
SUBSYSTEM=="usb", ATTR{idVendor}=="1209", ATTR{idProduct}=="7690", MODE="0660", TAG+="uaccess"
|
||||
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="1209", ATTRS{idProduct}=="7690", MODE="0660", TAG+="uaccess"
|
||||
BIN
gui/electron/resources/icons/128x128.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
gui/electron/resources/icons/128x128@2x.png
Normal file
|
After Width: | Height: | Size: 5.7 KiB |
BIN
gui/electron/resources/icons/32x32.png
Normal file
|
After Width: | Height: | Size: 747 B |
BIN
gui/electron/resources/icons/Square107x107Logo.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
gui/electron/resources/icons/Square142x142Logo.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
gui/electron/resources/icons/Square150x150Logo.png
Normal file
|
After Width: | Height: | Size: 3.2 KiB |
BIN
gui/electron/resources/icons/Square284x284Logo.png
Normal file
|
After Width: | Height: | Size: 6.3 KiB |
BIN
gui/electron/resources/icons/Square30x30Logo.png
Normal file
|
After Width: | Height: | Size: 698 B |
BIN
gui/electron/resources/icons/Square310x310Logo.png
Normal file
|
After Width: | Height: | Size: 6.8 KiB |
BIN
gui/electron/resources/icons/Square44x44Logo.png
Normal file
|
After Width: | Height: | Size: 1008 B |
BIN
gui/electron/resources/icons/Square71x71Logo.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
gui/electron/resources/icons/Square89x89Logo.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
gui/electron/resources/icons/StoreLogo.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 922 B After Width: | Height: | Size: 922 B |
BIN
gui/electron/resources/icons/icon.icns
Normal file
BIN
gui/electron/resources/icons/icon.ico
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
gui/electron/resources/icons/icon.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
1
gui/electron/resources/icons/icon.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" stroke-miterlimit="10" clip-rule="evenodd" version="1.1" viewBox="0 0 380 380" xml:space="preserve"><rect id="bg" width="380" height="380" fill="#663499" stroke-width="1" rx="76" /><g id="logo" fill="none" stroke="#fff"><path id="left" stroke-width="13.62" d="m72.867 191.74 37-39 39 36"/><path id="right" stroke-width="13.62" d="m208.87 187.74 38-35 36 38"/><path id="outer" stroke-linecap="square" stroke-width="17" d="m56.867 253.74s130.61-31.182 248 5c13.45 4.146 20.244 2.975 20-8s1.909-126.06-46-131"/></g></svg>
|
||||
|
After Width: | Height: | Size: 579 B |
BIN
gui/electron/resources/icons/ios/AppIcon-20x20@1x.png
Normal file
|
After Width: | Height: | Size: 555 B |
BIN
gui/electron/resources/icons/ios/AppIcon-20x20@2x-1.png
Normal file
|
After Width: | Height: | Size: 848 B |
BIN
gui/electron/resources/icons/ios/AppIcon-20x20@2x.png
Normal file
|
After Width: | Height: | Size: 848 B |
BIN
gui/electron/resources/icons/ios/AppIcon-20x20@3x.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
gui/electron/resources/icons/ios/AppIcon-29x29@1x.png
Normal file
|
After Width: | Height: | Size: 645 B |
BIN
gui/electron/resources/icons/ios/AppIcon-29x29@2x-1.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
gui/electron/resources/icons/ios/AppIcon-29x29@2x.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
gui/electron/resources/icons/ios/AppIcon-29x29@3x.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
gui/electron/resources/icons/ios/AppIcon-40x40@1x.png
Normal file
|
After Width: | Height: | Size: 848 B |
BIN
gui/electron/resources/icons/ios/AppIcon-40x40@2x-1.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
gui/electron/resources/icons/ios/AppIcon-40x40@2x.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
gui/electron/resources/icons/ios/AppIcon-40x40@3x.png
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
BIN
gui/electron/resources/icons/ios/AppIcon-512@2x.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
gui/electron/resources/icons/ios/AppIcon-60x60@2x.png
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
BIN
gui/electron/resources/icons/ios/AppIcon-60x60@3x.png
Normal file
|
After Width: | Height: | Size: 3.8 KiB |
BIN
gui/electron/resources/icons/ios/AppIcon-76x76@1x.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
gui/electron/resources/icons/ios/AppIcon-76x76@2x.png
Normal file
|
After Width: | Height: | Size: 3.0 KiB |
BIN
gui/electron/resources/icons/ios/AppIcon-83.5x83.5@2x.png
Normal file
|
After Width: | Height: | Size: 3.4 KiB |
BIN
gui/electron/resources/java-version/JavaVersion.jar
Normal file
@@ -1,8 +1,8 @@
|
||||
public class JavaVersion {
|
||||
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
var version = Runtime.version().version().get(0);
|
||||
System.exit(version);
|
||||
System.out.println(version);
|
||||
}
|
||||
}
|
||||
26
gui/electron/resources/scripts/postinstall.sh
Normal file
@@ -0,0 +1,26 @@
|
||||
#!/bin/bash
|
||||
|
||||
SRC="/opt/SlimeVR/69-slimevr-devices.rules"
|
||||
DESTDIRS=("/lib" "/usr/lib")
|
||||
|
||||
if [[ ! -f "$SRC" ]]; then
|
||||
echo "SlimeVR udev rules not found, serial console and dongles may not work" >&2
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "Configuring SlimeVR udev rules..."
|
||||
|
||||
for DIR in "${DESTDIRS[@]}"; do
|
||||
if [[ -d "$DIR" && ! -h "$DIR" ]]; then
|
||||
echo "Copying rules to $DIR"
|
||||
install -Dm644 "$SRC" "$DIR/udev/rules.d/69-slimevr-devices.rules"
|
||||
|
||||
if command -v udevadm >/dev/null 2>&1; then
|
||||
udevadm control --reload-rules
|
||||
udevadm trigger
|
||||
fi
|
||||
exit 0
|
||||
fi
|
||||
done
|
||||
|
||||
echo "Couldn't copy SlimeVR udev rules, serial console and dongles may not work" >&2
|
||||
8
gui/electron/resources/scripts/postremove.sh
Normal file
@@ -0,0 +1,8 @@
|
||||
#!/bin/bash
|
||||
echo "Removing SlimeVR udev rules..."
|
||||
rm -f "/lib/udev/rules.d/69-slimevr-devices.rules"
|
||||
rm -f "/usr/lib/udev/rules.d/69-slimevr-devices.rules"
|
||||
|
||||
if command -v udevadm >/dev/null 2>&1; then
|
||||
udevadm control --reload-rules
|
||||
fi
|
||||
49
gui/electron/shared.ts
Normal file
@@ -0,0 +1,49 @@
|
||||
import {
|
||||
OpenDialogOptions,
|
||||
OpenDialogReturnValue,
|
||||
SaveDialogOptions,
|
||||
SaveDialogReturnValue,
|
||||
} from 'electron';
|
||||
import { DiscordPresence, GHGet, GHReturn, OSStats } from './preload/interface';
|
||||
|
||||
export const IPC_CHANNELS = {
|
||||
SERVER_STATUS: 'server-status',
|
||||
OPEN_URL: 'open-url',
|
||||
OS_STATS: 'os-stats',
|
||||
WINDOW_ACTIONS: 'window-actions',
|
||||
LOG: 'log',
|
||||
STORAGE: 'storage',
|
||||
OPEN_DIALOG: 'open-dialog',
|
||||
SAVE_DIALOG: 'save-dialog',
|
||||
I18N_OVERRIDE: 'i18n-override',
|
||||
OPEN_FILE: 'open-file',
|
||||
GET_FOLDER: 'get-folder',
|
||||
GH_FETCH: 'gh-fetch',
|
||||
DISCORD_PRESENCE: 'discord-presence'
|
||||
} as const;
|
||||
|
||||
export interface IpcInvokeMap {
|
||||
[IPC_CHANNELS.OPEN_URL]: (url: string) => void;
|
||||
[IPC_CHANNELS.OS_STATS]: () => Promise<OSStats>;
|
||||
[IPC_CHANNELS.WINDOW_ACTIONS]: (action: 'close' | 'minimize' | 'maximize' | 'hide') => void;
|
||||
[IPC_CHANNELS.LOG]: (type: 'info' | 'error' | 'warn', ...args: unknown[]) => void;
|
||||
[IPC_CHANNELS.OPEN_DIALOG]: (
|
||||
options: OpenDialogOptions
|
||||
) => Promise<OpenDialogReturnValue>;
|
||||
[IPC_CHANNELS.SAVE_DIALOG]: (
|
||||
options: SaveDialogOptions
|
||||
) => Promise<SaveDialogReturnValue>;
|
||||
[IPC_CHANNELS.I18N_OVERRIDE]: () => Promise<string | false>;
|
||||
[IPC_CHANNELS.STORAGE]: (args: {
|
||||
type: 'settings' | 'cache';
|
||||
method: 'get' | 'set' | 'delete' | 'save';
|
||||
key?: string;
|
||||
value?: unknown;
|
||||
}) => Promise<unknown>;
|
||||
[IPC_CHANNELS.OPEN_FILE]: (path: string) => void;
|
||||
[IPC_CHANNELS.GET_FOLDER]: (folder: 'config' | 'logs') => string;
|
||||
[IPC_CHANNELS.GH_FETCH]: <T extends GHGet>(
|
||||
options: T
|
||||
) => Promise<GHReturn[T['type']]>;
|
||||
[IPC_CHANNELS.DISCORD_PRESENCE]: (options: DiscordPresence) => void;
|
||||
}
|
||||
82
gui/eslint.config.js
Normal file
@@ -0,0 +1,82 @@
|
||||
import { FlatCompat } from '@eslint/eslintrc';
|
||||
import eslint from '@eslint/js';
|
||||
import globals from 'globals';
|
||||
import tseslint from 'typescript-eslint';
|
||||
import stylistic from '@stylistic/eslint-plugin';
|
||||
|
||||
const compat = new FlatCompat();
|
||||
|
||||
export const gui = [
|
||||
eslint.configs.recommended,
|
||||
...tseslint.configs.recommended,
|
||||
...compat.extends('plugin:@dword-design/import-alias/recommended'),
|
||||
...compat.plugins('eslint-plugin-react-hooks'),
|
||||
// Add import-alias rule inside compat because plugin doesn't like flat configs
|
||||
...compat.config({
|
||||
rules: {
|
||||
'@dword-design/import-alias/prefer-alias': [
|
||||
'error',
|
||||
{
|
||||
alias: {
|
||||
'@': './src/',
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
}),
|
||||
{
|
||||
languageOptions: {
|
||||
ecmaVersion: 'latest',
|
||||
sourceType: 'module',
|
||||
parser: tseslint.parser,
|
||||
parserOptions: {
|
||||
ecmaFeatures: {
|
||||
jsx: true,
|
||||
},
|
||||
},
|
||||
globals: {
|
||||
...globals.browser,
|
||||
...globals.jest,
|
||||
},
|
||||
},
|
||||
files: ['src/**/*.{js,jsx,ts,tsx,json}'],
|
||||
plugins: {
|
||||
'@typescript-eslint': tseslint.plugin,
|
||||
'@stylistic': stylistic,
|
||||
},
|
||||
rules: {
|
||||
'react/react-in-jsx-scope': 'off',
|
||||
'react/prop-types': 'off',
|
||||
'spaced-comment': 'error',
|
||||
quotes: ['error', 'single'],
|
||||
'no-duplicate-imports': 'error',
|
||||
'no-inline-styles': 'off',
|
||||
'@typescript-eslint/no-explicit-any': 'off',
|
||||
'react/no-unescaped-entities': 'off',
|
||||
camelcase: 'error',
|
||||
'@typescript-eslint/no-unused-vars': [
|
||||
'warn',
|
||||
{
|
||||
argsIgnorePattern: '^_',
|
||||
varsIgnorePattern: '^_',
|
||||
ignoreRestSiblings: true,
|
||||
},
|
||||
],
|
||||
'@stylistic/jsx-self-closing-comp': 'error',
|
||||
},
|
||||
settings: {
|
||||
'import/resolver': {
|
||||
typescript: {},
|
||||
},
|
||||
react: {
|
||||
version: 'detect',
|
||||
},
|
||||
},
|
||||
},
|
||||
// Global ignore
|
||||
{
|
||||
ignores: ['**/firmware-tool-api/'],
|
||||
},
|
||||
];
|
||||
|
||||
export default gui;
|
||||
28
gui/openapi-codegen.config.ts
Normal file
@@ -0,0 +1,28 @@
|
||||
import {
|
||||
generateSchemaTypes,
|
||||
generateReactQueryComponents,
|
||||
} from '@openapi-codegen/typescript';
|
||||
import { defineConfig } from '@openapi-codegen/cli';
|
||||
import dotenv from 'dotenv';
|
||||
|
||||
dotenv.config()
|
||||
|
||||
export default defineConfig({
|
||||
firmwareTool: {
|
||||
from: {
|
||||
source: 'url',
|
||||
url: process.env.FIRMWARE_TOOL_SCHEMA_URL ?? 'http://localhost:3000/api-json',
|
||||
},
|
||||
outputDir: 'src/firmware-tool-api',
|
||||
to: async (context) => {
|
||||
const filenamePrefix = 'firmwareTool';
|
||||
const { schemasFiles } = await generateSchemaTypes(context, {
|
||||
filenamePrefix,
|
||||
});
|
||||
await generateReactQueryComponents(context, {
|
||||
filenamePrefix,
|
||||
schemasFiles,
|
||||
});
|
||||
},
|
||||
},
|
||||
});
|
||||
149
gui/package.json
@@ -1,82 +1,113 @@
|
||||
{
|
||||
"name": "slimevr-ui",
|
||||
"version": "0.5.1",
|
||||
"private": true,
|
||||
"name": "slimevr",
|
||||
"version": "0.0.0",
|
||||
"author": "SlimeVR Team <contact@slimevr.dev>",
|
||||
"homepage": "https://slimevr.dev",
|
||||
"type": "module",
|
||||
"dependencies": {
|
||||
"@ryuziii/discord-rpc": "1.0.1-rc.1",
|
||||
"@xhayper/discord-rpc": "^1.3.0",
|
||||
"commander": "^14.0.3",
|
||||
"discord-rich-presence": "^0.0.8",
|
||||
"glob": "^13.0.3",
|
||||
"open": "^11.0.0",
|
||||
"pino": "^10.3.1",
|
||||
"pino-pretty": "^13.1.3",
|
||||
"pino-roll": "^4.0.0"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "vite --force",
|
||||
"gui": "electron-vite dev --config electron.vite.config.ts --watch",
|
||||
"build": "electron-vite build --config electron.vite.config.ts",
|
||||
"package": "electron-builder",
|
||||
"package:build": "pnpm build && pnpm package",
|
||||
"preview": "electron-vite preview --config electron.vite.config.ts",
|
||||
"skipbundler": "vite build",
|
||||
"lint": "tsc --noEmit && eslint --max-warnings=0 \"src/**/*.{js,jsx,ts,tsx,json}\" && prettier --check \"src/**/*.{js,jsx,ts,tsx,css,scss,md,json}\"",
|
||||
"lint:fix": "tsc --noEmit && eslint --fix --max-warnings=0 \"src/**/*.{js,jsx,ts,tsx,json}\" && pnpm run format",
|
||||
"format": "prettier --write \"src/**/*.{js,jsx,ts,tsx,css,scss,md,json}\"",
|
||||
"javaversion-build": "cd electron/resources/java-version/ && javac JavaVersion.java && jar cvfe JavaVersion.jar JavaVersion JavaVersion.class",
|
||||
"gen:javaversion": "cd electron/resources/java-version/ && javac JavaVersion.java && jar cvfe JavaVersion.jar JavaVersion JavaVersion.class",
|
||||
"gen:firmware-tool": "openapi-codegen gen firmwareTool"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@dword-design/eslint-plugin-import-alias": "^4.0.9",
|
||||
"@electron/asar": "^4.0.1",
|
||||
"@fluent/bundle": "^0.18.0",
|
||||
"@fluent/react": "^0.15.2",
|
||||
"@fontsource/poppins": "^5.1.0",
|
||||
"@formatjs/intl-localematcher": "^0.2.32",
|
||||
"@react-three/drei": "^9.114.3",
|
||||
"@react-three/fiber": "^8.17.10",
|
||||
"@tauri-apps/api": "^2.0.2",
|
||||
"@tauri-apps/plugin-dialog": "^2.0.0",
|
||||
"@tauri-apps/plugin-fs": "^2.0.0",
|
||||
"@tauri-apps/plugin-os": "^2.0.0",
|
||||
"@tauri-apps/plugin-shell": "^2.0.0",
|
||||
"@tauri-apps/plugin-store": "^2.0.0",
|
||||
"browser-fs-access": "^0.35.0",
|
||||
"classnames": "^2.5.1",
|
||||
"flatbuffers": "22.10.26",
|
||||
"intl-pluralrules": "^2.0.1",
|
||||
"ip-num": "^1.5.1",
|
||||
"prompts": "^2.4.2",
|
||||
"react": "^18.3.1",
|
||||
"react-dom": "^18.3.1",
|
||||
"react-error-boundary": "^4.0.13",
|
||||
"react-helmet": "^6.1.0",
|
||||
"react-hook-form": "^7.53.0",
|
||||
"react-modal": "^3.16.1",
|
||||
"react-responsive": "^10.0.0",
|
||||
"react-router-dom": "^6.26.2",
|
||||
"semver": "^7.6.3",
|
||||
"solarxr-protocol": "file:../solarxr-protocol",
|
||||
"three": "^0.163.0",
|
||||
"ts-pattern": "^5.4.0",
|
||||
"typescript": "^5.6.3",
|
||||
"use-double-tap": "^1.3.6"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "vite --force",
|
||||
"build": "vite build",
|
||||
"dev": "tauri dev",
|
||||
"skipbundler": "tauri build --no-bundle",
|
||||
"tauri": "tauri",
|
||||
"lint": "tsc --noEmit && eslint --max-warnings=0 \"src/**/*.{js,jsx,ts,tsx,json}\" && prettier --check \"src/**/*.{js,jsx,ts,tsx,css,scss,md,json}\"",
|
||||
"lint:fix": "tsc --noEmit && eslint --fix --max-warnings=0 \"src/**/*.{js,jsx,ts,tsx,json}\" && pnpm run format",
|
||||
"format": "prettier --write \"src/**/*.{js,jsx,ts,tsx,css,scss,md,json}\"",
|
||||
"preview-vite": "vite preview",
|
||||
"javaversion-build": "cd src-tauri/src/ && javac JavaVersion.java && jar cvfe JavaVersion.jar JavaVersion JavaVersion.class"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@dword-design/eslint-plugin-import-alias": "^4.0.9",
|
||||
"@hookform/resolvers": "^3.6.0",
|
||||
"@openapi-codegen/cli": "^3.1.0",
|
||||
"@openapi-codegen/typescript": "^8.0.2",
|
||||
"@react-hookz/deep-equal": "^3.0.3",
|
||||
"@sentry/react": "10.29.0",
|
||||
"@sentry/vite-plugin": "^2.22.7",
|
||||
"@stylistic/eslint-plugin": "^5.5.0",
|
||||
"@tailwindcss/forms": "^0.5.9",
|
||||
"@tauri-apps/cli": "^2.0.2",
|
||||
"@tailwindcss/typography": "^0.5.15",
|
||||
"@tanstack/react-query": "^5.48.0",
|
||||
"@tweenjs/tween.js": "^25.0.0",
|
||||
"@twemoji/svg": "^15.0.0",
|
||||
"@types/file-saver": "^2.0.7",
|
||||
"@types/node": "^24.3.1",
|
||||
"@types/react": "^18.3.11",
|
||||
"@types/react-dom": "^18.3.0",
|
||||
"@types/react-helmet": "^6.1.11",
|
||||
"@types/react-modal": "3.16.3",
|
||||
"@types/semver": "^7.5.8",
|
||||
"@types/three": "^0.163.0",
|
||||
"@typescript-eslint/eslint-plugin": "^7.18.0",
|
||||
"@typescript-eslint/parser": "^7.18.0",
|
||||
"@typescript-eslint/eslint-plugin": "^8.48.1",
|
||||
"@typescript-eslint/parser": "^8.48.1",
|
||||
"@vitejs/plugin-react": "^4.3.2",
|
||||
"ajv": "^8.17.1",
|
||||
"autoprefixer": "^10.4.20",
|
||||
"cross-env": "^7.0.3",
|
||||
"eslint": "^8.57.1",
|
||||
"eslint-config-airbnb": "^19.0.4",
|
||||
"eslint-import-resolver-typescript": "^3.6.3",
|
||||
"eslint-plugin-import": "^2.31.0",
|
||||
"eslint-plugin-jsx-a11y": "^6.10.0",
|
||||
"eslint-plugin-react": "^7.37.1",
|
||||
"eslint-plugin-react-hooks": "^4.6.2",
|
||||
"browser-fs-access": "^0.35.0",
|
||||
"classnames": "^2.5.1",
|
||||
"convert": "^5.12.0",
|
||||
"dmg-license": "^1.0.11",
|
||||
"dotenv": "^16.4.5",
|
||||
"electron": "^40.3.0",
|
||||
"electron-builder": "^26.7.0",
|
||||
"electron-vite": "^5.0.0",
|
||||
"eslint": "^9.39.1",
|
||||
"eslint-import-resolver-typescript": "^3.10.1",
|
||||
"eslint-plugin-import": "^2.32.0",
|
||||
"eslint-plugin-jsx-a11y": "^6.10.2",
|
||||
"eslint-plugin-react": "^7.37.5",
|
||||
"eslint-plugin-react-hooks": "^7.0.1",
|
||||
"flatbuffers": "22.10.26",
|
||||
"globals": "^15.10.0",
|
||||
"intl-pluralrules": "^2.0.1",
|
||||
"ip-num": "^1.5.1",
|
||||
"jotai": "^2.12.2",
|
||||
"prettier": "^3.3.3",
|
||||
"prompts": "^2.4.2",
|
||||
"react": "^18.3.1",
|
||||
"react-dom": "^18.3.1",
|
||||
"react-error-boundary": "^4.0.13",
|
||||
"react-helmet": "^6.1.0",
|
||||
"react-hook-form": "^7.63.0",
|
||||
"react-markdown": "^9.0.1",
|
||||
"react-modal": "^3.16.1",
|
||||
"react-responsive": "^10.0.0",
|
||||
"react-router-dom": "^6.26.2",
|
||||
"remark-gfm": "^4.0.0",
|
||||
"rollup-plugin-visualizer": "^5.12.0",
|
||||
"sass": "^1.79.4",
|
||||
"semver": "^7.6.3",
|
||||
"solarxr-protocol": "file:../solarxr-protocol",
|
||||
"spdx-satisfies": "^5.0.1",
|
||||
"tailwind-gradient-mask-image": "^1.2.0",
|
||||
"tailwindcss": "^3.4.13",
|
||||
"vite": "^5.4.8"
|
||||
}
|
||||
"three": "^0.163.0",
|
||||
"ts-pattern": "^5.4.0",
|
||||
"typescript": "^5.6.3",
|
||||
"typescript-eslint": "^8.46.2",
|
||||
"use-double-tap": "^1.3.6",
|
||||
"uuid": "^13.0.0",
|
||||
"vite": "^5.4.8",
|
||||
"yup": "^1.4.0"
|
||||
},
|
||||
"main": "./out/main/index.js"
|
||||
}
|
||||
|
||||
BIN
gui/public/fonts/noto-sans-v42-latin-regular.woff2
Normal file
@@ -7,8 +7,13 @@
|
||||
|
||||
## Websocket (server) status
|
||||
|
||||
websocket-connecting = يتم التوصيل بالسيرفر
|
||||
websocket-connection_lost = انقطع الاتصال بالسيرفر. يتم إعادة التوصيل...
|
||||
websocket-connecting = جاري التحميل...
|
||||
websocket-connection_lost = تعطل الخادم!
|
||||
websocket-connection_lost-desc = يبدو أن خادم SlimeVR تعطل. تحقق من السجلات وأعد تشغيل البرنامج
|
||||
websocket-timedout = تعذر الاتصال بالخادم
|
||||
websocket-timedout-desc = يبدو أن خادم SlimeVR قد تعطل أو انتهت مهلته. تحقق من السجلات وأعد تشغيل البرنامج
|
||||
websocket-error-close = الخروج من SlimeVR
|
||||
websocket-error-logs = افتح مجلد السجلات
|
||||
|
||||
## Update notification
|
||||
|
||||
@@ -26,6 +31,9 @@ tips-tap_setup = يمكنك النقر ببطء مرتين على جهاز ال
|
||||
tips-turn_on_tracker = هل تستخدم أجهزة تعقب SlimeVR الرسمية؟ تذكر <b><em> أن تشغل أجهزة التعقب </em></b> بعد توصيلها بالكمبيوتر!
|
||||
tips-failed_webgl = فشل تهيئة WebGL.
|
||||
|
||||
## Units
|
||||
|
||||
|
||||
## Body parts
|
||||
|
||||
body_part-NONE = غير محدد
|
||||
@@ -49,12 +57,72 @@ body_part-LEFT_HAND = اليد اليسرى
|
||||
body_part-LEFT_UPPER_LEG = الفخذ الأيسر
|
||||
body_part-LEFT_LOWER_LEG = الكاحل الأيسر
|
||||
body_part-LEFT_FOOT = القدم اليسرى
|
||||
body_part-LEFT_THUMB_METACARPAL = عظم مشط الإبهام الأيسر
|
||||
body_part-LEFT_THUMB_PROXIMAL = الإبهام الأيسر القريب
|
||||
body_part-LEFT_THUMB_DISTAL = الإبهام الأيسر البعيد
|
||||
body_part-LEFT_INDEX_PROXIMAL = السبابة اليسرى القريبة
|
||||
body_part-LEFT_INDEX_INTERMEDIATE = السبابة اليسرى المتوسطة
|
||||
body_part-LEFT_INDEX_DISTAL = السبابة اليسرى البعيدة
|
||||
body_part-LEFT_MIDDLE_PROXIMAL = الجزء الأوسط الأيسر القريب
|
||||
body_part-LEFT_MIDDLE_INTERMEDIATE = الوسط الأيسر المتوسط
|
||||
body_part-LEFT_MIDDLE_DISTAL = الجزء الأوسط الأيسر البعيد
|
||||
body_part-LEFT_RING_PROXIMAL = الحلقة اليسرى القريبة
|
||||
body_part-LEFT_RING_INTERMEDIATE = الحلقة اليسرى المتوسطة
|
||||
body_part-LEFT_RING_DISTAL = الحلقة اليسرى البعيدة
|
||||
body_part-LEFT_LITTLE_PROXIMAL = الجزء الأيسر الصغير القريب
|
||||
body_part-LEFT_LITTLE_INTERMEDIATE = اليسار الصغير المتوسط
|
||||
body_part-LEFT_LITTLE_DISTAL = الجزء البعيد الأيسر الصغير
|
||||
body_part-RIGHT_THUMB_METACARPAL = مشط الإبهام الأيمن
|
||||
body_part-RIGHT_THUMB_PROXIMAL = الإبهام الأيمن القريب
|
||||
body_part-RIGHT_THUMB_DISTAL = الإبهام الأيمن البعيد
|
||||
body_part-RIGHT_INDEX_PROXIMAL = السبابة اليمنى القريبة
|
||||
body_part-RIGHT_INDEX_INTERMEDIATE = السبابة اليمنى المتوسطة
|
||||
body_part-RIGHT_INDEX_DISTAL = السبابة اليمنى البعيدة
|
||||
body_part-RIGHT_MIDDLE_PROXIMAL = منتصف اليمين القريب
|
||||
body_part-RIGHT_MIDDLE_INTERMEDIATE = الوسط الأيمن المتوسط
|
||||
body_part-RIGHT_MIDDLE_DISTAL = منتصف اليمين البعيد
|
||||
body_part-RIGHT_RING_PROXIMAL = الحلقة اليمنى القريبة
|
||||
body_part-RIGHT_RING_INTERMEDIATE = الحلقة اليمنى المتوسطة
|
||||
body_part-RIGHT_RING_DISTAL = الحلقة اليمنى البعيدة
|
||||
body_part-RIGHT_LITTLE_PROXIMAL = الجزء القريب الأيمن الصغير
|
||||
body_part-RIGHT_LITTLE_INTERMEDIATE = المتوسط الصغير الأيمن
|
||||
body_part-RIGHT_LITTLE_DISTAL = الجزء البعيد الصغير الأيمن
|
||||
|
||||
## BoardType
|
||||
|
||||
board_type-UNKNOWN = مجهول
|
||||
board_type-NODEMCU = NodeMCU
|
||||
board_type-CUSTOM = لوحة مخصصة
|
||||
board_type-WROOM32 = WROOM32
|
||||
board_type-WEMOSD1MINI = Wemos D1 Mini
|
||||
board_type-TTGO_TBASE = TTGO T-Base
|
||||
board_type-ESP01 = ESP-01
|
||||
board_type-SLIMEVR = سلايم في آر
|
||||
board_type-LOLIN_C3_MINI = Lolin C3 Mini
|
||||
board_type-BEETLE32C3 = Beetle ESP32-C3
|
||||
board_type-ESP32C3DEVKITM1 = Espressif ESP32-C3 DevKitM-1
|
||||
board_type-OWOTRACK = owoTrack
|
||||
board_type-WRANGLER = رانجلر جويكونز
|
||||
board_type-MOCOPI = سوني موكوبي (Mocopi)
|
||||
board_type-WEMOSWROOM02 = Wemos Wroom-02 D1 Mini
|
||||
board_type-XIAO_ESP32C3 = Seeed Studio XIAO ESP32C3
|
||||
board_type-HARITORA = Haritora
|
||||
board_type-ESP32C6DEVKITC1 = Espressif ESP32-C6 DevKitC-1
|
||||
board_type-GLOVE_IMU_SLIMEVR_DEV = قفاز SlimeVR تطوير IMU
|
||||
|
||||
## Proportions
|
||||
|
||||
skeleton_bone-NONE = غير محدد
|
||||
skeleton_bone-HEAD = إمالة الرأس
|
||||
skeleton_bone-HEAD-desc =
|
||||
هذه هي المسافة من سماعة الرأس إلى منتصف رأسك.
|
||||
لضبط المسافة ، هز رأسك من اليسار إلى اليمين كما لو كنت لا توافق وقم بتعديله
|
||||
حتى أي حركة في أجهزة التتبع الأخرى لا تكاد تذكر.
|
||||
skeleton_bone-NECK = طول العنق
|
||||
skeleton_bone-NECK-desc =
|
||||
هذه هي المسافة من منتصف رأسك إلى قاعدة رقبتك.
|
||||
لضبطها ، حرك رأسك لأعلى ولأسفل كما لو كنت تومئ رأسك أو تميل رأسك
|
||||
إلى اليسار واليمين وقم بتعديله حتى تصبح أي حركة في أجهزة التتبع الأخرى ضئيلة.
|
||||
skeleton_bone-torso_group = طول الجذع
|
||||
skeleton_bone-UPPER_CHEST = طول أعلى الصدر
|
||||
skeleton_bone-CHEST_OFFSET = درجة تشريد الصدر
|
||||
@@ -81,6 +149,14 @@ skeleton_bone-ELBOW_OFFSET = درجة تشريد الكوع
|
||||
## Tracker reset buttons
|
||||
|
||||
reset-reset_all = إعادة تعيين جميع النسب
|
||||
reset-reset_all_warning-v2 =
|
||||
<b>تحذير:</b> ستتم إعادة تعيين النسب إلى الإعدادات الافتراضية التي تم تحجيمها إلى الارتفاع الذي تم تكوينه.
|
||||
هل أنت متأكد من أنك تريد القيام بذلك؟
|
||||
reset-reset_all_warning-reset = إعادة تعيين النسب
|
||||
reset-reset_all_warning-cancel = إلغاء
|
||||
reset-reset_all_warning_default-v2 =
|
||||
<b>تحذير:</b> لم يتم ضبط طولك، وسيتم إعادة تعيين نسبك إلى الإعدادات الافتراضية مع الارتفاع الافتراضي.
|
||||
هل أنت متأكد من أنك تريد القيام بذلك؟
|
||||
reset-full = اعاده تعيين
|
||||
reset-mounting = إعادة تعيين التركيب
|
||||
reset-yaw = إعادة تعيين الانعراج
|
||||
@@ -124,7 +200,7 @@ widget-overlay-is_mirrored_label = عكس تراكب الشاشة
|
||||
|
||||
widget-drift_compensation-clear = حذف تعويض الانجراف
|
||||
|
||||
## Widget: Clear Reset Mounting
|
||||
## Widget: Clear Mounting calibration
|
||||
|
||||
widget-clear_mounting = مسح إعادة تعيين التركيب
|
||||
|
||||
@@ -142,9 +218,12 @@ widget-developer_mode-more_info = المزيد
|
||||
## Widget: IMU Visualizer
|
||||
|
||||
widget-imu_visualizer = دوران
|
||||
widget-imu_visualizer-preview = عرض
|
||||
widget-imu_visualizer-hide = إخفاء
|
||||
widget-imu_visualizer-rotation_raw = صافي
|
||||
widget-imu_visualizer-rotation_preview = عرض مسبق
|
||||
widget-imu_visualizer-rotation_hide = إخفاء
|
||||
widget-imu_visualizer-acceleration = التسارع
|
||||
widget-imu_visualizer-position = الموضع
|
||||
|
||||
## Widget: Skeleton Visualizer
|
||||
|
||||
@@ -196,9 +275,17 @@ tracker-infos-url = عنوان URL لجهاز التعقب
|
||||
tracker-infos-version = إصدار البرنامج الثابت
|
||||
tracker-infos-hardware_rev = مراجعة الأجهزة
|
||||
tracker-infos-hardware_identifier = معرف الجهاز
|
||||
tracker-infos-data_support = دعم البيانات
|
||||
tracker-infos-imu = مستشعر IMU
|
||||
tracker-infos-board_type = اللوحة الرئيسية
|
||||
tracker-infos-network_version = نسخة البروتوكول
|
||||
tracker-infos-magnetometer = المقياس المغناطيسي
|
||||
tracker-infos-magnetometer-status-v1 =
|
||||
{ $status ->
|
||||
[DISABLED] ملغي
|
||||
[ENABLED] فعال
|
||||
*[NOT_SUPPORTED] غير مدعوم
|
||||
}
|
||||
|
||||
## Tracker settings
|
||||
|
||||
@@ -213,14 +300,25 @@ tracker-settings-mounting_section-edit = تعديل التركيب
|
||||
tracker-settings-drift_compensation_section = السماح بتعويض الانجراف
|
||||
tracker-settings-drift_compensation_section-description = هل يجب أن يعوض جهاز التعقب عن انحرافه عند تمكين تعويض الانجراف؟
|
||||
tracker-settings-drift_compensation_section-edit = السماح بتعويض الانجراف
|
||||
tracker-settings-use_mag = اسمح بالمقياس المغناطيسي على هذا المتتبع
|
||||
# Multiline!
|
||||
tracker-settings-use_mag-description =
|
||||
هل يجب أن يستخدم هذا المتتبع مقياس المغناطيسية لتقليل الانجراف عند السماح باستخدام المقياس المغناطيسي؟ <b>من فضلا لا تغلق جهاز التتبع الخاص بك أثناء تبديل هذا!</b>
|
||||
|
||||
تحتاج إلى السماح باستخدام مقياس المغناطيسية أولا ، <magSetting>انقر هنا للذهاب إلى الإعداد</magSetting>.
|
||||
tracker-settings-use_mag-label = السماح بالمقياس المغناطيسي
|
||||
# The .<name> means it's an attribute and it's related to the top key.
|
||||
# In this case that is the settings for the assignment section.
|
||||
tracker-settings-name_section = اسم جهاز التعقب
|
||||
tracker-settings-name_section-description = أعطها لقب لطيف :)
|
||||
tracker-settings-name_section-placeholder = ساق نايتي بيست اليسرى
|
||||
tracker-settings-name_section-label = اسم جهاز التعقب
|
||||
tracker-settings-forget = انسي جهاز التعقب
|
||||
tracker-settings-forget-description = يزيل جهاز التعقب من خادم SlimeVR ويمنعه من الاتصال به حتى يتم إعادة تشغيل الخادم. لن تضيع تكوين جهاز التعقب.
|
||||
tracker-settings-forget-label = ننسى جهاز التعقب
|
||||
tracker-settings-update-up_to_date = حديث
|
||||
tracker-settings-update = التحديث الآن
|
||||
tracker-settings-update-title = إصدار البرنامج الثابت
|
||||
|
||||
## Tracker part card info
|
||||
|
||||
@@ -296,6 +394,9 @@ settings-sidebar-utils = الأدوات المساعدة
|
||||
settings-sidebar-serial = وحدة التحكم التسلسلية
|
||||
settings-sidebar-appearance = مظهر
|
||||
settings-sidebar-notifications = إشعارات
|
||||
settings-sidebar-behavior = سلوك
|
||||
settings-sidebar-firmware-tool = أداة برامج الجهاز المصنوع بنفسك
|
||||
settings-sidebar-advanced = متقدم
|
||||
|
||||
## SteamVR settings
|
||||
|
||||
@@ -310,10 +411,14 @@ settings-general-steamvr-description =
|
||||
مفيد فقط للألعاب أو التطبيقات التي تدعم أجهزة تعقب معينة.
|
||||
settings-general-steamvr-trackers-waist = الخصر
|
||||
settings-general-steamvr-trackers-chest = الصدر
|
||||
settings-general-steamvr-trackers-feet = القدمين
|
||||
settings-general-steamvr-trackers-knees = الركبتين
|
||||
settings-general-steamvr-trackers-elbows = الكوعين
|
||||
settings-general-steamvr-trackers-hands = اليدين
|
||||
settings-general-steamvr-trackers-left_foot = القدم اليسرى
|
||||
settings-general-steamvr-trackers-right_foot = القدم اليمنى
|
||||
settings-general-steamvr-trackers-left_knee = الركبة اليسرى
|
||||
settings-general-steamvr-trackers-right_knee = الركبة اليمنى
|
||||
settings-general-steamvr-trackers-left_elbow = الكوع الأيسر
|
||||
settings-general-steamvr-trackers-right_elbow = الكوع الأيمن
|
||||
settings-general-steamvr-trackers-left_hand = اليد اليسرى
|
||||
settings-general-steamvr-trackers-right_hand = اليد اليمنى
|
||||
settings-general-steamvr-trackers-tracker_toggling = تعيين جهاز التعقب تلقائي
|
||||
settings-general-steamvr-trackers-tracker_toggling-description = يتعامل تلقائيا مع تبديل أجهزة تعقب SteamVR أو إيقاف تشغيلها اعتمادا على مهام التعقب الحالية
|
||||
settings-general-steamvr-trackers-tracker_toggling-label = تعيين جهاز التعقب التلقائي
|
||||
@@ -339,14 +444,39 @@ settings-general-tracker_mechanics-filtering-type-smoothing-description = ينع
|
||||
settings-general-tracker_mechanics-filtering-type-prediction = التنبؤ
|
||||
settings-general-tracker_mechanics-filtering-type-prediction-description = يقلل من وقت الإستجابة ويجعل الحركات أكثر سرعة ، ولكنه قد يزيد من التوتر.
|
||||
settings-general-tracker_mechanics-filtering-amount = المبلغ
|
||||
settings-general-tracker_mechanics-yaw-reset-smooth-time = إعادة ضبط الانعراج على نحو سلس (يتعطل التنعيم 0 ثوان)
|
||||
settings-general-tracker_mechanics-drift_compensation = تعويض الانجراف
|
||||
# This cares about multilines
|
||||
settings-general-tracker_mechanics-drift_compensation-description =
|
||||
يعوض عن انجراف انعراج وحدة IMU بتطبيق دوران عكسي.
|
||||
قم بتغيير كمية التعويض وعدد عمليات إعادة التعيين التي يتم أخذها في الاعتبار.
|
||||
settings-general-tracker_mechanics-drift_compensation-enabled-label = تعويض الانجراف
|
||||
settings-general-tracker_mechanics-drift_compensation-prediction = التنبؤ بتعويض الانحراف
|
||||
# This cares about multilines
|
||||
settings-general-tracker_mechanics-drift_compensation-prediction-description =
|
||||
يتنبأ بتعويض انحراف الانعراج خارج النطاق المقاس مسبقا.
|
||||
قم بتمكين هذا إذا كانت أجهزة التتبع تدور باستمرار على محور الانعراج.
|
||||
settings-general-tracker_mechanics-drift_compensation-prediction-label = التنبؤ بتعويض الانحراف
|
||||
settings-general-tracker_mechanics-drift_compensation_warning =
|
||||
<b>تحذير:</b> استخدم تعويض الانحراف فقط إذا كنت بحاجة إلى إعادة الضبط
|
||||
في كثير من الأحيان (كل ~ 5-10 دقائق).
|
||||
|
||||
تتضمن بعض وحدات IMU المعرضة لإعادة الضبط المتكرر ما يلي:
|
||||
Joy-Cons و owoTrack و MPUs (بدون برامج ثابتة حديثة).
|
||||
settings-general-tracker_mechanics-drift_compensation_warning-cancel = إلغاء
|
||||
settings-general-tracker_mechanics-drift_compensation_warning-done = أتفهم
|
||||
settings-general-tracker_mechanics-drift_compensation-amount-label = مبلغ التعويض
|
||||
settings-general-tracker_mechanics-drift_compensation-max_resets-label = استخدام ما يصل إلى x عمليات إعادة التعيين الأخيرة
|
||||
settings-general-tracker_mechanics-save_mounting_reset = حفظ معايرة إعادة ضبط التركيب التلقائي
|
||||
settings-general-tracker_mechanics-save_mounting_reset-description =
|
||||
يحفظ معايرة إعادة تعيين التثبيت التلقائي لأجهزة التتبع بين عمليات إعادة التشغيل. مفيد
|
||||
عند ارتداء بدلة حيث لا تتحرك المتتبعات بين الجلسات. <b>لا ينصح به للمستخدمين العاديين!</b>
|
||||
settings-general-tracker_mechanics-save_mounting_reset-enabled-label = حفظ إعادة تعيين التركيب
|
||||
settings-general-tracker_mechanics-use_mag_on_all_trackers = استخدم المقياس المغناطيسي على جميع أجهزة تتبع IMU التي تدعمه
|
||||
settings-general-tracker_mechanics-use_mag_on_all_trackers-description =
|
||||
يستخدم المقياس المغناطيسي على جميع أجهزة التعقب التي تحتوي على برامج ثابتة متوافقة له ، مما يقلل من الانحراف في البيئات المغناطيسية المستقرة.
|
||||
يمكن تعطيله لكل جهاز تعقب في إعدادات التعقب. <b>من فضلك لا تغلق أيا من أجهزة التعقب أثناء تبديل هذا!</b>
|
||||
settings-general-tracker_mechanics-use_mag_on_all_trackers-label = استخدم المقياس المغناطيسي على أجهزة التعقب
|
||||
|
||||
## FK/Tracking settings
|
||||
|
||||
@@ -368,11 +498,17 @@ settings-general-fk_settings-leg_tweak-floor_clip-description = يمكن أن ي
|
||||
settings-general-fk_settings-leg_tweak-toe_snap-description = الانجذاب إلى أصابع القدم يحاول تخمين دوران قدميك إذا لم تكن أجهزة تعقب القدم قيد الاستخدام.
|
||||
settings-general-fk_settings-leg_tweak-foot_plant-description = تثبيت اصبع القدم يحاول تخمين دوران قدميك إذا لم تكن أجهزة تعقب القدم قيد الاستخدام.
|
||||
settings-general-fk_settings-leg_fk = تعقب الساق
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet-description = تمكين إعادة ضبط تركيب القدمين عن طريق المشي على رؤوس الأصابع.
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet = إعادة تعيين تركيب القدمين
|
||||
settings-general-fk_settings-enforce_joint_constraints = حدود الهيكل العظمي
|
||||
settings-general-fk_settings-enforce_joint_constraints-enforce_constraints = فرض القيود
|
||||
settings-general-fk_settings-enforce_joint_constraints-enforce_constraints-description = منع المفاصل من الدوران إلى ما بعد الحد الأقصى
|
||||
settings-general-fk_settings-enforce_joint_constraints-correct_constraints = التصحيح مع قيود
|
||||
settings-general-fk_settings-enforce_joint_constraints-correct_constraints-description = تصحيح دوران المفاصل عندما تتجاوز حدودها
|
||||
settings-general-fk_settings-arm_fk = تعقب الذراع
|
||||
settings-general-fk_settings-arm_fk-description = تغيير طريقة تعقب الذراعين.
|
||||
settings-general-fk_settings-arm_fk-force_arms = إجبار الذراعين من ايتش أم دي
|
||||
settings-general-fk_settings-reset_settings = إعادة تعيين الإعدادات
|
||||
settings-general-fk_settings-reset_settings-reset_hmd_pitch-description = أعد تعيين درجة جهاز الرأس (الدوران الرأسي) عند إجراء إعادة تعيين كاملة. مفيد في حالة ارتداء جهاز الرأس على الجبهة ل VTubing أو mocap. لا تقم بتمكين لVR.
|
||||
settings-general-fk_settings-reset_settings-reset_hmd_pitch = إعادة تعيين درجة جهاز الرأس
|
||||
settings-general-fk_settings-arm_fk-reset_mode-description = قم بتغيير وضع الذراع المتوقع لإعادة ضبط المتصاعد.
|
||||
settings-general-fk_settings-arm_fk-back = العودة
|
||||
settings-general-fk_settings-arm_fk-back-description = الوضع الافتراضي، مع وضع الذراعين العلويين إلى الخلف والساعدين للأمام.
|
||||
@@ -398,9 +534,6 @@ settings-general-fk_settings-skeleton_settings-interp_knee_tracker_ankle = مت
|
||||
settings-general-fk_settings-skeleton_settings-interp_knee_ankle = متوسط انحراف الركبتين ولفة مع الكاحلين
|
||||
settings-general-fk_settings-self_localization-title = وضع Mocap
|
||||
settings-general-fk_settings-self_localization-description = يسمح وضع Mocap للهيكل العظمي بتعقب موضعه تقريبا بدون سماعة رأس أو أجهزة تعقب أخرى. لاحظ أن هذا يتطلب أجهزة تعقب القدمين والرأس للعمل ولا تزال تجريبية.
|
||||
settings-general-fk_settings-vive_emulation-title = محاكاة فايف
|
||||
settings-general-fk_settings-vive_emulation-description = محاكاة مشاكل تعقب الخصر التي تعاني منها أجهزة تعقب فايف. هذه مزحة وتجعل التتبع أسوأ.
|
||||
settings-general-fk_settings-vive_emulation-label = تمكين محاكاة فايف
|
||||
|
||||
## Gesture control settings (tracker tapping)
|
||||
|
||||
@@ -449,6 +582,9 @@ settings-general-interface-dev_mode = وضع المطوّر
|
||||
settings-general-interface-dev_mode-description = يمكن أن يكون هذا الوضع مفيدًا إذا كنت بحاجة إلى بيانات متعمقة أو للتفاعل مع أجهزة التعقب المتصلة على مستوى أكثر تقدمًا.
|
||||
settings-general-interface-dev_mode-label = وضع المطوّر
|
||||
settings-general-interface-theme = موضوع اللون
|
||||
settings-general-interface-show-navbar-onboarding = إظهار "{ navbar-onboarding }" على قائمة التنقل
|
||||
settings-general-interface-show-navbar-onboarding-description = يغير هذا إذا ظهر الزر "{ navbar-onboarding }" على قائمة التنقل.
|
||||
settings-general-interface-show-navbar-onboarding-label = إظهار "{ navbar-onboarding }"
|
||||
settings-general-interface-lang = اختر اللغة
|
||||
settings-general-interface-lang-description = قم بتغيير اللغة الافتراضية التي تريد استخدامها.
|
||||
settings-general-interface-lang-placeholder = اختر اللغة التي تريد استخدامها
|
||||
@@ -460,6 +596,9 @@ settings-interface-appearance-font-os_font = خط نظام التشغيل
|
||||
settings-interface-appearance-font-slime_font = الخط الافتراضي
|
||||
settings-interface-appearance-font_size = قياس الخط الأساسي
|
||||
settings-interface-appearance-font_size-description = يؤثر هذا على حجم خط الواجهة بأكملها باستثناء لوحة الإعدادات هذه.
|
||||
settings-interface-appearance-decorations = استخدم الزخارف الأصلية للنظام
|
||||
settings-interface-appearance-decorations-description = لن يؤدي هذا إلى عرض الشريط الأعلى للواجهة وسيستخدم نظام التشغيل بدلا من ذلك.
|
||||
settings-interface-appearance-decorations-label = استخدم الزخارف الأصلية
|
||||
|
||||
## Notification settings
|
||||
|
||||
@@ -474,9 +613,34 @@ settings-general-interface-feedback_sound-volume = حجم صوت ردود الف
|
||||
settings-general-interface-connected_trackers_warning = تحذير عن أجهزة التعقب المتصلة
|
||||
settings-general-interface-connected_trackers_warning-description = سيعرض هذا الخيار نافذة كل مرة تحاول فيها الخروج من SlimeVR أثناء وجود جهاز أو أكثر من أجهزة التعقب المتصلة. سيذكرك بإيقاف تشغيل أجهزة التعقب عند الانتهاء للحفاظ على عمر البطارية.
|
||||
settings-general-interface-connected_trackers_warning-label = تحذير عن أجهزة التعقب المتصلة عند الخروج
|
||||
|
||||
## Behavior settings
|
||||
|
||||
settings-interface-behavior = السلوك
|
||||
settings-general-interface-use_tray = تصغير إلى علبة النظام
|
||||
settings-general-interface-use_tray-description = يتيح لك إغلاق النافذة دون إغلاق خادم SlimeVR حتى تتمكن من الاستمرار في استخدامه دون إزعاجك من واجهة المستخدم الرسومية.
|
||||
settings-general-interface-use_tray-label = تصغير إلى علبة النظام
|
||||
settings-general-interface-discord_presence = مشاركة النشاط على Discord
|
||||
settings-general-interface-discord_presence-description = يخبر عميل Discord الخاص بك أنك تستخدم SlimeVR جنبا إلى جنب مع عدد أجهزة تعقب IMU التي تستخدمها.
|
||||
settings-general-interface-discord_presence-label = مشاركة النشاط على Discord
|
||||
settings-general-interface-discord_presence-message =
|
||||
{ $amount ->
|
||||
[0] صفر
|
||||
[zero] صفر
|
||||
[one] واحد
|
||||
[two] اثنان
|
||||
[few] قليل
|
||||
[many] كثيرة
|
||||
*[other] أخرى
|
||||
}
|
||||
settings-interface-behavior-error_tracking = جمع الأخطاء عبر Sentry.io
|
||||
settings-interface-behavior-error_tracking-description_v2 =
|
||||
<h1>هل توافق على جمع بيانات الخطأ مجهولة المصدر؟</h1>
|
||||
|
||||
<b>نحن لا نجمع معلومات شخصية</b> مثل عنوان IP الخاص بك أو بيانات الاعتماد اللاسلكية. يقدر SlimeVR خصوصيتك!
|
||||
|
||||
لتوفير أفضل تجربة للمستخدم، نقوم بجمع تقارير الأخطاء ومقاييس الأداء ومعلومات نظام التشغيل مجهولة المصدر. يساعدنا هذا في اكتشاف الأخطاء والمشكلات المتعلقة ب SlimeVR. يتم جمع هذه المقاييس عبر Sentry.io.
|
||||
settings-interface-behavior-error_tracking-label = إرسال الأخطاء إلى المطورين
|
||||
|
||||
## Serial settings
|
||||
|
||||
@@ -495,10 +659,11 @@ settings-serial-factory_reset-warning =
|
||||
مما يعني أن إعدادات واي فاي والمعايرة <b>ستفقد جميعا!</b>
|
||||
settings-serial-factory_reset-warning-ok = أنا أعرف ماذا أفعل
|
||||
settings-serial-factory_reset-warning-cancel = إلغاء
|
||||
settings-serial-get_infos = احصل على معلومات
|
||||
settings-serial-serial_select = اختر منفذ تسلسلي
|
||||
settings-serial-auto_dropdown_item = تلقائي
|
||||
settings-serial-get_wifi_scan = احصل على فحص WiFi
|
||||
settings-serial-file_type = نص عادي
|
||||
settings-serial-save_logs = حفظ في ملف
|
||||
|
||||
## OSC router settings
|
||||
|
||||
@@ -529,14 +694,22 @@ settings-osc-router-network-address-placeholder = عنوان آي بي في 4
|
||||
|
||||
settings-osc-vrchat = أجهزة تعقب "في ار تشات أوه أس سي"
|
||||
# This cares about multilines
|
||||
settings-osc-vrchat-description =
|
||||
قم بتغيير الإعدادات الخاصة ب في ار تشات لتلقي بيانات ايتش أم دي وإرسالها
|
||||
بيانات أجهزة تعقب لتعقب الجسم (يعمل على كوست مستقل).
|
||||
settings-osc-vrchat-description-v1 =
|
||||
تغيير الإعدادات الخاصة بمعيار أجهزة تعقب OSC المستخدم لإرسال
|
||||
بيانات التعقب إلى التطبيقات التي لا تحتوي على SteamVR (مثل Quest المستقل).
|
||||
تأكد من تمكين OSC في VRChat عبر قائمة الإجراءات ضمن OSC > ممكن.
|
||||
settings-osc-vrchat-enable = تمكين
|
||||
settings-osc-vrchat-enable-description = بتبديل إرسال واستقبال البيانات.
|
||||
settings-osc-vrchat-enable-label = تمكين
|
||||
settings-osc-vrchat-oscqueryEnabled = تمكين OSCQuery
|
||||
settings-osc-vrchat-oscqueryEnabled-description =
|
||||
يكتشف OSCQuery تلقائيا مثيلات VRChat قيد التشغيل ويرسل البيانات إليها.
|
||||
يمكنه أيضا الإعلان عن نفسه لهم من أجل تلقي بيانات HMD ووحدة التحكم.
|
||||
للسماح بتلقي بيانات HMD ووحدة التحكم من VRChat ، انتقل إلى إعدادات القائمة الرئيسية
|
||||
ضمن "التتبع و IK (الحركة العكسية)" وتمكين "السماح بإرسال بيانات OSC لتتبع الرأس والمعصم".
|
||||
settings-osc-vrchat-oscqueryEnabled-label = تمكين OSCQuery
|
||||
settings-osc-vrchat-network = منافذ الشبكة
|
||||
settings-osc-vrchat-network-description = قم بتعيين المنافذ للاستماع وإرسال البيانات إلى في ار تشات
|
||||
settings-osc-vrchat-network-description-v1 = ضبط المنافذ الاستماع إلى البيانات وإرسالها. يمكن تركها دون أن تمس ل VRChat.
|
||||
settings-osc-vrchat-network-port_in =
|
||||
.label = منفذ الدخول
|
||||
.placeholder = منفذ الدخول (الإفتراضي: 9001)
|
||||
@@ -544,7 +717,7 @@ settings-osc-vrchat-network-port_out =
|
||||
.label = منفذ الخروج
|
||||
.placeholder = منفذ الخروج (الإفتراضي: 9000)
|
||||
settings-osc-vrchat-network-address = عنوان الشبكة
|
||||
settings-osc-vrchat-network-address-description = اختر العنوان الذي تريد إرسال البيانات إلى في ار تشات (تحقق من إعدادات واي فاي على جهازك)
|
||||
settings-osc-vrchat-network-address-description-v1 = اختر العنوان الذي تريد إرسال البيانات إليه. يمكن تركها دون أن تمس ل VRChat.
|
||||
settings-osc-vrchat-network-address-placeholder = عنوان آي بي الخاص بفي ار تشات
|
||||
settings-osc-vrchat-network-trackers = أجهزة التعقب
|
||||
settings-osc-vrchat-network-trackers-description = تبديل إرسال أجهزة تتبع محددة عبر أوه أس سي.
|
||||
@@ -577,16 +750,54 @@ settings-osc-vmc-network-address-description = قم بتعيين العنوان
|
||||
settings-osc-vmc-network-address-placeholder = عنوان آي بي في 4
|
||||
settings-osc-vmc-vrm = نموذج في ار إم
|
||||
settings-osc-vmc-vrm-description = قم بتحميل نموذج في ار إم للسماح بتركيز الرأس وتمكين توافق أعلى مع تطبيقات الأخرى
|
||||
settings-osc-vmc-vrm-model_unloaded = لم يتم تحميل أي نموذج
|
||||
settings-osc-vmc-vrm-model_loaded =
|
||||
{ $titled ->
|
||||
[true] تحميل النموذج: { $name }
|
||||
*[other] تم تحميل نموذج بدون عنوان
|
||||
}
|
||||
settings-osc-vmc-vrm-untitled_model = نموذج بدون عنوان
|
||||
settings-osc-vmc-vrm-file_select = اسحب نموذج وأفلته لاستخدامه أو <u> تصفح </ u>
|
||||
settings-osc-vmc-anchor_hip = ثبت في الوركين
|
||||
settings-osc-vmc-anchor_hip-description = ثبت التعقب في الوركين، هو مفيد إن كنت تيوبنغ جالسًا. في حالة التعطيل، قم بتحميل نموذج في ار إم.
|
||||
settings-osc-vmc-anchor_hip-label = ثبت في الوركين
|
||||
settings-osc-vmc-mirror_tracking = اعكس التعقب
|
||||
settings-osc-vmc-mirror_tracking-description = اعكس التعقب أفقيا.
|
||||
settings-osc-vmc-mirror_tracking-label = اعكس التعقب
|
||||
|
||||
## Common OSC settings
|
||||
|
||||
|
||||
## Advanced settings
|
||||
|
||||
settings-utils-advanced = متقدم
|
||||
settings-utils-advanced-reset-gui = إعادة تعيين إعدادات واجهة المستخدم الرسومية (GUI)
|
||||
settings-utils-advanced-reset-gui-description = قم باستعادة الإعدادات الافتراضية للواجهة.
|
||||
settings-utils-advanced-reset-gui-label = إعادة تعيين واجهة المستخدم الرسومية
|
||||
settings-utils-advanced-reset-server = إعادة تعيين إعدادات التعقب
|
||||
settings-utils-advanced-reset-server-description = استعادة الإعدادات الافتراضية للتعقب.
|
||||
settings-utils-advanced-reset-server-label = إعادة تعيين التعقب
|
||||
settings-utils-advanced-reset-all = إعادة تعيين جميع الإعدادات
|
||||
settings-utils-advanced-reset-all-description = قم باستعادة الإعدادات الافتراضية لكل من الواجهة و التعقب.
|
||||
settings-utils-advanced-reset-all-label = إعادة تعيين الكل
|
||||
settings-utils-advanced-reset_warning =
|
||||
{ $type ->
|
||||
[gui]
|
||||
<b>تحذير:</b> سيؤدي هذا إلى إعادة تعيين جميع الإعدادات الخاصة بك إلى الإعدادات الافتراضية.
|
||||
هل أنت متأكد من أنك تريد القيام بذلك؟
|
||||
[server] <b>تحذير:</b> سيؤدي هذا إلى إعادة تعيين إعدادات التعقب إلى الإعدادات الافتراضية. هل أنت متأكد من أنك تريد القيام بذلك؟
|
||||
*[all]
|
||||
<b>تحذير:</b> سيؤدي هذا إلى إعادة تعيين جميع الإعدادات الخاصة بك إلى الإعدادات الافتراضية.
|
||||
هل أنت متأكد من أنك تريد القيام بذلك؟
|
||||
}
|
||||
settings-utils-advanced-reset_warning-reset = إعادة تعيين الإعدادات
|
||||
settings-utils-advanced-reset_warning-cancel = إلغاء
|
||||
settings-utils-advanced-open_data-v1 = مجلد التكوين
|
||||
settings-utils-advanced-open_data-description-v1 = فتح مجلد إعدادات SlimeVR في مستكشف الملفات ، والذي يحتوي على الإعدادات
|
||||
settings-utils-advanced-open_data-label = فتح المجلد
|
||||
settings-utils-advanced-open_logs = مجلد السجلات
|
||||
settings-utils-advanced-open_logs-description = افتح مجلد سجلات SlimeVR في مستكشف الملفات ، والذي يحتوي على سجلات التطبيق
|
||||
settings-utils-advanced-open_logs-label = فتح المجلد
|
||||
|
||||
## Home Screen
|
||||
|
||||
|
||||
## Tracking Checlist
|
||||
|
||||
|
||||
## Setup/onboarding menu
|
||||
|
||||
@@ -603,16 +814,12 @@ onboarding-setup_warning-cancel = متابعة الإعداد
|
||||
## Wi-Fi setup
|
||||
|
||||
onboarding-wifi_creds-back = العودة إلى المقدمة
|
||||
onboarding-wifi_creds = إدخل بيانات اعتماد واي فاي
|
||||
# This cares about multilines
|
||||
onboarding-wifi_creds-description =
|
||||
ستستخدم أجهزة التعقب بيانات الاعتماد هذه للاتصال لاسلكيًا.
|
||||
الرجاء استخدام بيانات الاعتماد التي تتصل بها حاليًا.
|
||||
onboarding-wifi_creds-skip = تخطى إعدادات واي فاي
|
||||
onboarding-wifi_creds-submit = إرسال!
|
||||
onboarding-wifi_creds-ssid =
|
||||
.label = اسم الواي فاي
|
||||
.placeholder = أدخل اسم الواي فاي
|
||||
onboarding-wifi_creds-ssid-required = مطلوب اسم Wi-Fi
|
||||
onboarding-wifi_creds-password =
|
||||
.label = كلمة السر
|
||||
.placeholder = أدخل كلمة السر
|
||||
@@ -647,13 +854,6 @@ onboarding-reset_tutorial-2 =
|
||||
onboarding-home = مرحبا بكم في سلايم في ار
|
||||
onboarding-home-start = هيا نتجهز!
|
||||
|
||||
## Enter VR part of setup
|
||||
|
||||
onboarding-enter_vr-back = العودة إلى تعيين أجهزة التعقب
|
||||
onboarding-enter_vr-title = حان وقت دخول في ار!
|
||||
onboarding-enter_vr-description = ضع كل أجهزة التعقب ثم أدخل في ار!
|
||||
onboarding-enter_vr-ready = أنا جاهز
|
||||
|
||||
## Setup done
|
||||
|
||||
onboarding-done-title = أنت جاهز تمامًا!
|
||||
@@ -670,6 +870,7 @@ onboarding-connect_tracker-issue-serial = أواجه مشكلة في الاتص
|
||||
onboarding-connect_tracker-usb = جهاز تعقب يو أس بي
|
||||
onboarding-connect_tracker-connection_status-none = نبحث عن أجهزة التعقب
|
||||
onboarding-connect_tracker-connection_status-serial_init = نتواصل بجهاز التسلسلي
|
||||
onboarding-connect_tracker-connection_status-obtaining_mac_address = الحصول على عنوان mac الخاص بجهاز التعقب
|
||||
onboarding-connect_tracker-connection_status-provisioning = نرسل بيانات اعتماد واي فاي
|
||||
onboarding-connect_tracker-connection_status-connecting = جارٍ إرسال بيانات اعتماد الواي فاي
|
||||
onboarding-connect_tracker-connection_status-looking_for_server = نبحث عن السرفر
|
||||
@@ -697,12 +898,12 @@ onboarding-connect_tracker-next = لقد قمت بتوصيل جميع أجهزة
|
||||
|
||||
onboarding-calibration_tutorial = برنامج تعليم معايرة IMU
|
||||
onboarding-calibration_tutorial-subtitle = سوف يساعد هذا في تقليل الانجراف التعقب!
|
||||
onboarding-calibration_tutorial-description = كل مرة تقوم بتشغيل أجهزة التعقب، يجب أن تستريح للحظة على سطح مستوٍ للمعايرة. لنفعل الشيء نفسه بالنقر فوق الزر "{ onboarding-calibration_tutorial-calibrate }" ، <b>لا تحركها!</b>
|
||||
onboarding-calibration_tutorial-calibrate = وضعت أجهزة التعقب على الطاولة
|
||||
onboarding-calibration_tutorial-status-waiting = بانتظارك
|
||||
onboarding-calibration_tutorial-status-calibrating = جاري المعايرة
|
||||
onboarding-calibration_tutorial-status-success = رائع!
|
||||
onboarding-calibration_tutorial-status-error = تم نقل جهاز التعقب
|
||||
onboarding-calibration_tutorial-skip = تخطي البرنامج التعليمي
|
||||
|
||||
## Tracker assignment tutorial
|
||||
|
||||
@@ -734,6 +935,31 @@ onboarding-assign_trackers-assigned =
|
||||
onboarding-assign_trackers-advanced = إظهار مواقع التعيين المتقدمة
|
||||
onboarding-assign_trackers-next = لقد عينت جميع أجهزة التعقب
|
||||
onboarding-assign_trackers-mirror_view = عرض المرآة
|
||||
onboarding-assign_trackers-option-amount =
|
||||
{ $trackersCount ->
|
||||
[zero] صفر
|
||||
[one] واحد
|
||||
[two] اثنان
|
||||
[few] قليلة
|
||||
[many] كثيرة
|
||||
*[other] أخرى
|
||||
}
|
||||
onboarding-assign_trackers-option-label =
|
||||
{ $mode ->
|
||||
[lower-body] الجسم السفلي
|
||||
[core] أساس الجسم
|
||||
[enhanced-core] الأساس المحسن
|
||||
[full-body] الجسم الكامل
|
||||
*[all] الكل
|
||||
}
|
||||
onboarding-assign_trackers-option-description =
|
||||
{ $mode ->
|
||||
[lower-body] الحد الأدنى لتعقب الجسم الكامل في الواقع الافتراضي
|
||||
[core] + تحسين تعقب العمود الفقري
|
||||
[enhanced-core] + دوران القدم
|
||||
[full-body] + تعقب الكوع
|
||||
*[all] جميع مهام التعقب المتاحة
|
||||
}
|
||||
|
||||
## Tracker assignment warnings
|
||||
|
||||
@@ -809,16 +1035,16 @@ onboarding-choose_mounting = ما طريقة معايرة التركيب الم
|
||||
# Multiline text
|
||||
onboarding-choose_mounting-description = اتجاه التركيب يصحح وضع أجهزة التعقب على جسمك.
|
||||
onboarding-choose_mounting-auto_mounting = التركيب التلقائي
|
||||
# Italized text
|
||||
onboarding-choose_mounting-auto_mounting-label = تجريبي
|
||||
# Italicized text
|
||||
onboarding-choose_mounting-auto_mounting-label-v2 = الموصى به
|
||||
onboarding-choose_mounting-auto_mounting-description = سيكتشف هذا تلقائيًا اتجاهات التركيب لجميع أجهزة التعقب من وضعين
|
||||
onboarding-choose_mounting-manual_mounting = التركيب اليدوي
|
||||
# Italized text
|
||||
onboarding-choose_mounting-manual_mounting-label = المستحسن
|
||||
# Italicized text
|
||||
onboarding-choose_mounting-manual_mounting-label-v2 = قد لا تكون الدقة كافية
|
||||
onboarding-choose_mounting-manual_mounting-description = سيسمح لك باختيار اتجاه التثبيت يدويًا لكل جهاز تعقب
|
||||
# Multiline text
|
||||
onboarding-choose_mounting-manual_modal-title =
|
||||
هل أنت متأكد من أنك تريد
|
||||
هل أنت متأكد من أنك تريد
|
||||
معايرة التركيب التلقائي؟
|
||||
onboarding-choose_mounting-manual_modal-description = <b>يوصى بمعايرة التركيب اليدوي للمستخدمين الجدد</b> ، حيث قد يكون من الصعب الحصول على أوضاع معايرة التركيب التلقائي الصحيحة من اول مرة وقد تتطلب بعض التمرين.
|
||||
onboarding-choose_mounting-manual_modal-confirm = أنا أعرف ماذا أفعل
|
||||
@@ -847,44 +1073,18 @@ onboarding-automatic_mounting-mounting_reset-title = إعادة تعيين ال
|
||||
onboarding-automatic_mounting-mounting_reset-step-0 = 1. قرفص في وضع "التزلج" مع ثني ساقيك ، وإمالة الجزء العلوي من جسمك إلى الأمام ، وثني ذراعيك.
|
||||
onboarding-automatic_mounting-mounting_reset-step-1 = 2. اضغط على زر "إعادة تعيين التركيب" وانتظر لمدة 3 ثوان قبل إعادة تعيين دوران تركيب أجهزة التعقب.
|
||||
onboarding-automatic_mounting-preparation-title = التحضير
|
||||
onboarding-automatic_mounting-preparation-step-0 = 1. قف بشكل مستقيم مع ذراعيك على جانبيك.
|
||||
onboarding-automatic_mounting-preparation-step-1 = اضغط على زر "إعادة ضبط" و انتظر لمدة 3 ثوانٍ قبل إعادة تعيين أجهزة التعقب.
|
||||
onboarding-automatic_mounting-put_trackers_on-title = ارتدي أجهزة التعقب
|
||||
onboarding-automatic_mounting-put_trackers_on-description = لمعايرة دوران التركيب، سنستخدم أجهزة التعقب التي قمت بتعيينها. ارتدي جميع أجهزة التعقب، يمكنك معرفة أي منها في المستند على اليمين.
|
||||
onboarding-automatic_mounting-put_trackers_on-next = ارتديت جميع أجهزة التعقب.
|
||||
|
||||
## Tracker proportions method choose
|
||||
## Tracker manual proportions setupa
|
||||
|
||||
onboarding-choose_proportions = ما هي طريقة معايرة النسب التي يجب استخدامها؟
|
||||
# Multiline string
|
||||
onboarding-choose_proportions-description-v1 =
|
||||
تستخدم نسب الجسم لمعرفة قياسات جسمك. إنهم مطالبون لحساب مواقع أجهزة التعقب.
|
||||
عندما لا تتطابق نسب جسمك مع تلك المحفوظة ، ستكون دقة التعقب أسوأ وستلاحظ أشياء مثل التزلج أو الانزلاق ، أو أن جسمك لا يتطابق مع صورتك الرمزية جيدا.
|
||||
<b>ما عليك سوى قياس جسمك مرة واحدة!</b> إن لم تكن خاطئة أو تغير جسمك ، فلن تحتاج إلى القيام بها مرة أخرى.
|
||||
onboarding-choose_proportions-auto_proportions = النسب التلقائية
|
||||
# Italized text
|
||||
onboarding-choose_proportions-auto_proportions-subtitle = الموصى به
|
||||
onboarding-choose_proportions-auto_proportions-descriptionv3 =
|
||||
سيؤدي ذلك إلى تخمين نسبك عن طريق تسجيل عينة من تحركاتك وتمريرها عبر خوارزمية.
|
||||
|
||||
<b>يتطلب ذلك توصيل جهاز الواقع الافتراضي (HMD) ب SlimeVR و وضعها على رأسك!</b>
|
||||
onboarding-choose_proportions-manual_proportions = النسب اليدوية
|
||||
# Italized text
|
||||
onboarding-choose_proportions-manual_proportions-subtitle = للمسات الصغيرة
|
||||
onboarding-choose_proportions-manual_proportions-description = سيسمح لك بتعديل النسب يدويًا عن طريق تعديلها مباشرة
|
||||
onboarding-choose_proportions-export = تصدير النسب
|
||||
onboarding-choose_proportions-import = استيراد النسب
|
||||
onboarding-choose_proportions-import-success = تم استيراده
|
||||
onboarding-choose_proportions-import-failed = فشل
|
||||
onboarding-choose_proportions-file_type = ملف نسب الجسم
|
||||
|
||||
## Tracker manual proportions setup
|
||||
|
||||
onboarding-manual_proportions-back = العودة إلى برنامج تعليم إعادة التعيين
|
||||
onboarding-manual_proportions-title = نسب الجسم اليدوية
|
||||
onboarding-manual_proportions-precision = ضبط الدقة
|
||||
onboarding-manual_proportions-auto = المعايرة التلقائية
|
||||
onboarding-manual_proportions-ratio = اضبط حسب مجموعات النسب
|
||||
onboarding-manual_proportions-fine_tuning_button = ضبط النسب تلقائيا
|
||||
onboarding-manual_proportions-fine_tuning_button-disabled-tooltip = يرجى توصيل سماعة رأس VR لاستخدام الضبط الدقيق التلقائي
|
||||
onboarding-manual_proportions-export = تصدير النسب
|
||||
onboarding-manual_proportions-import = استيراد النسب
|
||||
onboarding-manual_proportions-file_type = ملف نسب الجسم
|
||||
|
||||
## Tracker automatic proportions setup
|
||||
|
||||
@@ -905,21 +1105,33 @@ onboarding-automatic_proportions-requirements-descriptionv2 =
|
||||
يقوم جهاز الواقع الافتراضي بالإبلاغ عن البيانات الموضعية إلى خادم SlimeVR (وهذا يعني عموما تشغيل SteamVR وتوصيله ب SlimeVR باستخدام برنامج تشغيل SteamVR الخاص ب SlimeVR).
|
||||
يعمل التتبع الخاص بك ويمثل تحركاتك بدقة (على سبيل المثال ، لقد أجريت إعادة تعيين كاملة وتتحرك في الاتجاه الصحيح عند الركل, الانحناء, الجلوس, إلخ).
|
||||
onboarding-automatic_proportions-requirements-next = لقد قرأت المتطلبات
|
||||
onboarding-automatic_proportions-check_height-title = تحقق من طولك
|
||||
onboarding-automatic_proportions-check_height-description = نستخدم طولك كأساس لقياساتنا باستخدام ارتفاع HMD كتقريب لطولك الفعلي ، ولكن من الأفضل التحقق مما إذا كانت صحيحة بنفسك!
|
||||
onboarding-automatic_proportions-check_height-title-v3 = قم بقياس ارتفاع سماعة الرأس
|
||||
onboarding-automatic_proportions-check_height-description-v2 = يجب أن يكون ارتفاع سماعة الرأس (HMD) أقل قليلا من طولك الكامل ، حيث تقيس سماعات الرأس ارتفاع عينيك. سيتم استخدام هذا القياس كخط أساس لنسب جسمك.
|
||||
# All the text is in bold!
|
||||
onboarding-automatic_proportions-check_height-calculation_warning = يرجى الضغط على الزر أثناء الوقوف <u>في وضع مستقيم</u> لحساب طولك. لديك 3 ثوان بعد الضغط على الزر!
|
||||
onboarding-automatic_proportions-check_height-calculation_warning-v3 = ابدأ في القياس أثناء الوقوف <u>في وضع مستقيم</u> لقياس طولك. احرص على عدم رفع يديك أعلى من سماعة الرأس ، لأنها قد تؤثر على القياس!
|
||||
onboarding-automatic_proportions-check_height-guardian_tip =
|
||||
إذا كنت تستخدم سماعة رأس VR مستقلة ، فتأكد من تشغيل حدود الحارس /
|
||||
لكي يكون طولك صحيحا!
|
||||
onboarding-automatic_proportions-check_height-fetch_height = أنا واقف!
|
||||
# Context is that the height is unknown
|
||||
onboarding-automatic_proportions-check_height-unknown = مجهول
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-hmd_height1 = طولك من خلال HMD
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-height1 = لذا فإن طولك الفعلي هو
|
||||
onboarding-automatic_proportions-check_height-hmd_height2 = ارتفاع سماعة الرأس هو:
|
||||
onboarding-automatic_proportions-check_height-measure-start = ابدأ القياس
|
||||
onboarding-automatic_proportions-check_height-measure-stop = توقف عن القياس
|
||||
onboarding-automatic_proportions-check_height-measure-reset = إعادة محاولة القياس
|
||||
onboarding-automatic_proportions-check_height-next_step = انهم بخير
|
||||
onboarding-automatic_proportions-check_floor_height-title = قم بقياس الارتفاع عن الأرض (اختياري)
|
||||
onboarding-automatic_proportions-check_floor_height-description = في بعض الحالات، قد لا يتم ضبط الارتفاع عن الأرض بشكل صحيح بواسطة سماعة الرأس، مما يتسبب في قياس ارتفاع سماعة الرأس على أنه أعلى مما ينبغي. يمكنك قياس "الارتفاع" عن الأرض لتصحيح ارتفاع سماعة الرأس.
|
||||
# All the text is in bold!
|
||||
onboarding-automatic_proportions-check_floor_height-calculation_warning-v2 = ابدأ بقياس و ضع وحدة التحكم على الأرض لقياس ارتفاعها. إذا كنت متأكدا من صحة الارتفاع عن الأرض ، فيمكنك تخطي هذه الخطوة.
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_floor_height-floor_height = الارتفاع عن الأرض هو:
|
||||
onboarding-automatic_proportions-check_floor_height-full_height = طولك الكامل المقدر هو:
|
||||
onboarding-automatic_proportions-check_floor_height-measure-start = ابدأ القياس
|
||||
onboarding-automatic_proportions-check_floor_height-measure-stop = توقف عن القياس
|
||||
onboarding-automatic_proportions-check_floor_height-measure-reset = إعد محاولة القياس
|
||||
onboarding-automatic_proportions-check_floor_height-skip_step = تخطي الخطوة وحفظ
|
||||
onboarding-automatic_proportions-check_floor_height-next_step = استخدم الارتفاع عن الأرض وحفظه
|
||||
onboarding-automatic_proportions-start_recording-title = استعد للتحرك
|
||||
onboarding-automatic_proportions-start_recording-description = سنقوم الآن بتسجيل بعض الوضعيات والحركات المحددة. ستتم مطالبتك بذلك في الشاشة التالية. كن مستعدا للبدء عند الضغط على الزر!
|
||||
onboarding-automatic_proportions-start_recording-next = بدء التسجيل
|
||||
@@ -953,10 +1165,21 @@ onboarding-automatic_proportions-verify_results-redo = إعادة التسجيل
|
||||
onboarding-automatic_proportions-verify_results-confirm = تبدو صحيحة
|
||||
onboarding-automatic_proportions-done-title = تم قياس الجسم و حفظه.
|
||||
onboarding-automatic_proportions-done-description = اكتملت معايرة نسب جسمك!
|
||||
onboarding-automatic_proportions-error_modal =
|
||||
<b>تحذير:</b> تم العثور على خطأ أثناء تقدير النسب!
|
||||
يرجى <docs>التحقق من المستندات</docs> أو الانضمام إلى <discord>Discord</discord> للحصول على المساعدة ^_^
|
||||
onboarding-automatic_proportions-error_modal-v2 =
|
||||
<b>تحذير:</b> حدث خطأ أثناء تقدير النسب!
|
||||
من المحتمل أن تكون هذه مشكلة معايرة التركيب. تأكد من أن التعقب يعمل بشكل صحيح قبل المحاولة مرة أخرى.
|
||||
يرجى <docs>التحقق من التعليمات</docs> أو الانضمام إلى <discord>Discord</discord> للحصول على المساعدة ^_^
|
||||
onboarding-automatic_proportions-error_modal-confirm = مفهوم!
|
||||
onboarding-automatic_proportions-smol_warning =
|
||||
الارتفاع الذي تم تكوينه هو { $height } و هو أصغر من الحد الأدنى للارتفاع المقبول البالغ { $minHeight }.
|
||||
<b>يرجى إعادة القياسات والتأكد من صحتها.</b>
|
||||
onboarding-automatic_proportions-smol_warning-cancel = الرجوع
|
||||
|
||||
## User height calibration
|
||||
|
||||
|
||||
## Stay Aligned setup
|
||||
|
||||
|
||||
## Home
|
||||
|
||||
@@ -980,6 +1203,36 @@ status_system-StatusSteamVRDisconnected =
|
||||
*[other] حاليًا غير متصل بـ SteamVR عبر برنامج تشغيل SlimeVR.
|
||||
}
|
||||
status_system-StatusTrackerError = يحتوي جهاز التعقب { $trackerName } على خطأ.
|
||||
status_system-StatusUnassignedHMD = يجب تعيين سماعة رأس VR كجهاز تعقب للرأس.
|
||||
|
||||
## Firmware tool globals
|
||||
|
||||
firmware_tool-next_step = الخطوة التالية
|
||||
firmware_tool-previous_step = الخطوة السابقة
|
||||
firmware_tool-ok = تبدو جيدة
|
||||
firmware_tool-retry = اعادة المحاولة
|
||||
firmware_tool-loading = تحميل...
|
||||
|
||||
## Firmware tool Steps
|
||||
|
||||
firmware_tool = أداة البرامج الثابتة DIY
|
||||
firmware_tool-description = يسمح لك بتكوين و لتحديث أجهزة التعقب DIY الخاصة بك
|
||||
firmware_tool-not_available = عفوا ، أداة البرامج الثابتة غير متوفرة في الوقت الحالي. عد لاحقا!
|
||||
firmware_tool-not_compatible = أداة البرنامج الثابت غير متوافقة مع هذا الإصدار من الخادم. يرجى تحديث الخادم الخاص بك!
|
||||
firmware_tool-flash_method_step = طريقة التثبيت
|
||||
firmware_tool-flash_method_step-description = الرجاء حدد طريقة التثبيت التي تريد استخدامها
|
||||
firmware_tool-flashbtn_step = اضغط على زر التمهيد
|
||||
firmware_tool-flashbtn_step-description = قبل الانتقال إل الخطوة التالية، هناك بعض الأشياء التي عليك القيام بها
|
||||
firmware_tool-flashbtn_step-board_SLIMEVR = أوقف تشغيل جهاز التعقب، قم بإزالة العلبة (إن وجدت)، وقم بتوصيل كابل USB بهذا الكمبيوتر ، ثم قم بإحدى الخطوات التالية وفقا لمراجعة لوحة SlimeVR:
|
||||
|
||||
## firmware tool build status
|
||||
|
||||
|
||||
## Firmware update status
|
||||
|
||||
|
||||
## Dedicated Firmware Update Page
|
||||
|
||||
|
||||
## Tray Menu
|
||||
|
||||
@@ -1008,3 +1261,9 @@ unknown_device-modal-description =
|
||||
هل تريد توصيله ب SlimeVR؟
|
||||
unknown_device-modal-confirm = أكيد
|
||||
unknown_device-modal-forget = تجاهلها
|
||||
|
||||
## Error collection consent modal
|
||||
|
||||
|
||||
## Tracking checklist section
|
||||
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
### SlimeVR complete GUI translations
|
||||
|
||||
|
||||
# Please developers (not translators) don't reuse a key inside another key
|
||||
# or concat text with a translation string in the code, use the appropriate
|
||||
# features like variables and selectors in each appropriate case!
|
||||
@@ -27,6 +24,9 @@ tips-do_not_move_heels = Sørg for, at dine hæle ikke bevæger sig under optage
|
||||
tips-file_select = Træk og slip filer for at bruge, eller <u>gennemse</u>.
|
||||
tips-tap_setup = Du kan trykke langsomt 2 gange på din tracker for at vælge den i stedet for at vælge den i menuen.
|
||||
|
||||
## Units
|
||||
|
||||
|
||||
## Body parts
|
||||
|
||||
body_part-NONE = Ikke tildelt
|
||||
@@ -50,14 +50,17 @@ body_part-LEFT_UPPER_LEG = Venstre lår
|
||||
body_part-LEFT_LOWER_LEG = Venstre ankel
|
||||
body_part-LEFT_FOOT = Venstre fod
|
||||
|
||||
## BoardType
|
||||
|
||||
|
||||
## Proportions
|
||||
|
||||
skeleton_bone-NONE = Ingen
|
||||
skeleton_bone-HEAD = Hoved skift
|
||||
skeleton_bone-NECK = Hals længde
|
||||
skeleton_bone-torso_group = Torso Længde
|
||||
skeleton_bone-CHEST = Bryst Længde
|
||||
skeleton_bone-CHEST_OFFSET = Bryst Juster
|
||||
skeleton_bone-CHEST = Bryst Længde
|
||||
skeleton_bone-WAIST = Taljelængde
|
||||
skeleton_bone-HIP = Hoftelængde
|
||||
skeleton_bone-HIP_OFFSET = Hofte Juster
|
||||
@@ -103,11 +106,14 @@ navbar-mounting = Montage Kalibrering
|
||||
navbar-onboarding = Opsætningsguide
|
||||
navbar-settings = Indstillinger
|
||||
|
||||
## Bounding volume hierarchy recording
|
||||
## Biovision hierarchy recording
|
||||
|
||||
bvh-start_recording = Optag BVH
|
||||
bvh-recording = Optager...
|
||||
|
||||
## Tracking pause
|
||||
|
||||
|
||||
## Widget: Overlay settings
|
||||
|
||||
widget-overlay = Overlejring
|
||||
@@ -118,6 +124,9 @@ widget-overlay-is_mirrored_label = Vis Overlejring som Spejl
|
||||
|
||||
widget-drift_compensation-clear = Klar afdriftskompensation
|
||||
|
||||
## Widget: Clear Mounting calibration
|
||||
|
||||
|
||||
## Widget: Developer settings
|
||||
|
||||
widget-developer_mode = Udviklertilstand
|
||||
@@ -134,7 +143,9 @@ widget-developer_mode-more_info = Mere info
|
||||
widget-imu_visualizer = Rotation
|
||||
widget-imu_visualizer-rotation_raw = Rå
|
||||
widget-imu_visualizer-rotation_preview = Forhåndsvisning
|
||||
widget-imu_visualizer-rotation_hide = Skjul
|
||||
|
||||
## Widget: Skeleton Visualizer
|
||||
|
||||
|
||||
## Tracker status
|
||||
|
||||
@@ -279,10 +290,6 @@ settings-general-steamvr-description =
|
||||
Nyttig til spil eller apps, der kun understøtter bestemte trackere.
|
||||
settings-general-steamvr-trackers-waist = Talje
|
||||
settings-general-steamvr-trackers-chest = Bryst
|
||||
settings-general-steamvr-trackers-feet = Fødder
|
||||
settings-general-steamvr-trackers-knees = Knæ
|
||||
settings-general-steamvr-trackers-elbows = Albuer
|
||||
settings-general-steamvr-trackers-hands = Hænder
|
||||
|
||||
## Tracker mechanics
|
||||
|
||||
@@ -326,14 +333,7 @@ settings-general-fk_settings-leg_fk = Bensporing
|
||||
settings-general-fk_settings-arm_fk = Arm sporing
|
||||
settings-general-fk_settings-arm_fk-description = Tving arme til spore fra HMD, selvom positionshånddata er tilgængelige.
|
||||
settings-general-fk_settings-arm_fk-force_arms = Tving arme fra HMD
|
||||
settings-general-fk_settings-skeleton_settings = Indstillinger for skelet
|
||||
settings-general-fk_settings-skeleton_settings-description = Slå skeletindstillinger til eller fra. Det anbefales at lade disse være på.
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine = Udvidet rygsøjle
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis = Forlænget pelvis
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees = Forlænget knæ
|
||||
settings-general-fk_settings-vive_emulation-title = Vive emulering
|
||||
settings-general-fk_settings-vive_emulation-description = Emuler de taljetrackerproblemer, som Vive-trackere har. Dette er en joke og gør sporing værre.
|
||||
settings-general-fk_settings-vive_emulation-label = Aktivér Vive-emulering
|
||||
|
||||
## Gesture control settings (tracker tapping)
|
||||
|
||||
@@ -347,12 +347,18 @@ settings-general-gesture_control-taps =
|
||||
}
|
||||
settings-general-gesture_control-yawResetEnabled = Aktivér tryk for at yaw resette
|
||||
|
||||
## Interface settings
|
||||
## Appearance settings
|
||||
|
||||
settings-general-interface = Brugergrænseflade
|
||||
settings-general-interface-dev_mode = Udvikler-tilstand
|
||||
settings-general-interface-dev_mode-description = Denne tilstand kan være nyttig, hvis du har brug for dybdegående data eller for at interagere med tilsluttede trackere på et mere avanceret niveau.
|
||||
settings-general-interface-dev_mode-label = Udvikler-tilstand
|
||||
settings-general-interface-theme = Farvetema
|
||||
settings-general-interface-lang = Vælg sprog
|
||||
settings-general-interface-lang-description = Skift det standardsprog, du vil bruge.
|
||||
settings-general-interface-lang-placeholder = Vælg det sprog, der skal bruges
|
||||
|
||||
## Notification settings
|
||||
|
||||
settings-general-interface-serial_detection = Seriel enhedsregistrering
|
||||
settings-general-interface-serial_detection-description = Denne mulighed viser en pop-up, hver gang du tilslutter en ny seriel enhed, der kan være en tracker. Det hjælper med at forbedre opsætningsprocessen for en tracker.
|
||||
settings-general-interface-serial_detection-label = Seriel enhedsregistrering
|
||||
@@ -360,10 +366,9 @@ settings-general-interface-feedback_sound = Feedback lyd
|
||||
settings-general-interface-feedback_sound-description = Denne indstilling afspiller en lyd, når du nulstiller
|
||||
settings-general-interface-feedback_sound-label = Feedback lyd
|
||||
settings-general-interface-feedback_sound-volume = Feedback lydstyrke
|
||||
settings-general-interface-theme = Farvetema
|
||||
settings-general-interface-lang = Vælg sprog
|
||||
settings-general-interface-lang-description = Skift det standardsprog, du vil bruge.
|
||||
settings-general-interface-lang-placeholder = Vælg det sprog, der skal bruges
|
||||
|
||||
## Behavior settings
|
||||
|
||||
|
||||
## Serial settings
|
||||
|
||||
@@ -378,7 +383,6 @@ settings-serial-factory_reset-warning =
|
||||
Hvilket betyder, at alle Wi-Fi- og kalibreringsindstillinger <b>går tabt!</b>
|
||||
settings-serial-factory_reset-warning-ok = Jeg ved hvad jeg laver
|
||||
settings-serial-factory_reset-warning-cancel = Annuller
|
||||
settings-serial-get_infos = Hent oplysninger
|
||||
settings-serial-serial_select = Vælg en seriel port
|
||||
settings-serial-auto_dropdown_item = Auto
|
||||
|
||||
@@ -409,14 +413,9 @@ settings-osc-router-network-address-placeholder = IPV4-adresse
|
||||
## OSC VRChat settings
|
||||
|
||||
settings-osc-vrchat = VRChat OSC trackere
|
||||
# This cares about multilines
|
||||
settings-osc-vrchat-description =
|
||||
Skift VRChat-specifikke indstillinger for at modtage HMD-data og sende
|
||||
trackerdata til FBT uden SteamVR (f.eks. Quest standalone).
|
||||
settings-osc-vrchat-enable = Aktiver
|
||||
settings-osc-vrchat-enable-label = Aktiver
|
||||
settings-osc-vrchat-network = Netværksporte
|
||||
settings-osc-vrchat-network-description = Indstil portene til at lytte og sende data til VRChat.
|
||||
settings-osc-vrchat-network-port_in =
|
||||
.label = Port ind
|
||||
.placeholder = Port ind (standard: 9001)
|
||||
@@ -424,7 +423,6 @@ settings-osc-vrchat-network-port_out =
|
||||
.label = Port ud
|
||||
.placeholder = Port ud (standard: 9000)
|
||||
settings-osc-vrchat-network-address = Netværksadresse
|
||||
settings-osc-vrchat-network-address-description = Vælg hvilken adresse der skal sende data til VRChat (tjek dine Wi-Fi-indstillinger på din enhed).
|
||||
settings-osc-vrchat-network-address-placeholder = VRChat ip-adresse
|
||||
settings-osc-vrchat-network-trackers = Trackere
|
||||
settings-osc-vrchat-network-trackers-description = Skift afsendelse af specifikke trackere via OSC.
|
||||
@@ -457,9 +455,20 @@ settings-osc-vmc-network-address-description = Vælg hvilken adresse du vil send
|
||||
settings-osc-vmc-network-address-placeholder = IPV4-adresse
|
||||
settings-osc-vmc-vrm = VRM-model
|
||||
settings-osc-vmc-vrm-description = Indlæs en VRM-model for at tillade hovedanker og muliggøre en højere kompatibilitet med andre applikationer
|
||||
settings-osc-vmc-vrm-model_unloaded = Ingen model indlæst
|
||||
settings-osc-vmc-vrm-file_select = Træk og slip en model, du vil bruge, eller <u>gennemse</u>
|
||||
|
||||
## Common OSC settings
|
||||
|
||||
|
||||
## Advanced settings
|
||||
|
||||
|
||||
## Home Screen
|
||||
|
||||
|
||||
## Tracking Checlist
|
||||
|
||||
|
||||
## Setup/onboarding menu
|
||||
|
||||
onboarding-skip = Spring opsætning over
|
||||
@@ -474,11 +483,6 @@ onboarding-setup_warning-cancel = Fortsæt konfigurationen
|
||||
## Wi-Fi setup
|
||||
|
||||
onboarding-wifi_creds-back = Gå tilbage til introduktion
|
||||
onboarding-wifi_creds = Indtast Wi-Fi-oplysninger
|
||||
# This cares about multilines
|
||||
onboarding-wifi_creds-description =
|
||||
Trackerne bruger disse oplysninger til at oprette forbindelse trådløst.
|
||||
Brug de oplysninger, du i øjeblikket har forbindelse til.
|
||||
onboarding-wifi_creds-skip = Spring Wi-Fi-indstillinger over
|
||||
onboarding-wifi_creds-submit = Færdig!
|
||||
onboarding-wifi_creds-ssid =
|
||||
@@ -492,20 +496,12 @@ onboarding-wifi_creds-password =
|
||||
|
||||
onboarding-reset_tutorial-back = Gå tilbage til monteringskalibrering
|
||||
onboarding-reset_tutorial = Start forfra
|
||||
onboarding-reset_tutorial-description = Denne funktion er ikke færdig, bare tryk på fortsæt
|
||||
|
||||
## Setup start
|
||||
|
||||
onboarding-home = Velkommen til SlimeVR
|
||||
onboarding-home-start = Lad os komme i gang!
|
||||
|
||||
## Enter VR part of setup
|
||||
|
||||
onboarding-enter_vr-back = Gå tilbage til Tracker-tildeler
|
||||
onboarding-enter_vr-title = Tid til at gå ind i VR!
|
||||
onboarding-enter_vr-description = Tag alle dine trackere på, og gå derefter på VR!
|
||||
onboarding-enter_vr-ready = Jeg er klar
|
||||
|
||||
## Setup done
|
||||
|
||||
onboarding-done-title = Du er klar!
|
||||
@@ -516,8 +512,6 @@ onboarding-done-close = Luk opsætning
|
||||
|
||||
onboarding-connect_tracker-back = Gå tilbage til Wi-Fi-oplysninger
|
||||
onboarding-connect_tracker-title = Tilslut trackere
|
||||
onboarding-connect_tracker-description-p0 = Nu til den sjove del, forbind alle trackere!
|
||||
onboarding-connect_tracker-description-p1 = Du skal blot tilslutte alle, der ikke er tilsluttet endnu, via en USB-port.
|
||||
onboarding-connect_tracker-issue-serial = Jeg har problemer med at oprette forbindelse!
|
||||
onboarding-connect_tracker-usb = USB-tracker
|
||||
onboarding-connect_tracker-connection_status-none = Leder efter trackere
|
||||
@@ -544,6 +538,9 @@ onboarding-connect_tracker-next = Jeg har tilsluttet alle mine trackere
|
||||
## Tracker calibration tutorial
|
||||
|
||||
|
||||
## Tracker assignment tutorial
|
||||
|
||||
|
||||
## Tracker assignment setup
|
||||
|
||||
onboarding-assign_trackers-back = Gå tilbage til Wi-Fi-oplysninger
|
||||
@@ -567,12 +564,8 @@ onboarding-assign_trackers-next = Jeg har tildelt alle trackerene
|
||||
|
||||
onboarding-choose_mounting = Hvilken monteringskalibreringsmetode vil du bruge?
|
||||
onboarding-choose_mounting-auto_mounting = Automatisk montering
|
||||
# Italized text
|
||||
onboarding-choose_mounting-auto_mounting-subtitle = Anbefalet
|
||||
onboarding-choose_mounting-auto_mounting-description = Dette registrerer automatisk monteringsretningerne til alle dine trackere fra 2 stillinger
|
||||
onboarding-choose_mounting-manual_mounting = Manuel montering
|
||||
# Italized text
|
||||
onboarding-choose_mounting-manual_mounting-subtitle = Hvis du ved hvad du laver
|
||||
onboarding-choose_mounting-manual_mounting-description = Dette giver dig mulighed for manuelt at vælge monteringsretningen for hver tracker
|
||||
|
||||
## Tracker manual mounting setup
|
||||
@@ -593,12 +586,7 @@ onboarding-automatic_mounting-put_trackers_on-title = Tag dine trackere på
|
||||
onboarding-automatic_mounting-put_trackers_on-description = For at kalibrere rotationer bruger vi de trackere, du lige har tildelt. Tag alle dine trackere på du kan se hvilke der er hvilke i figuren til højre.
|
||||
onboarding-automatic_mounting-put_trackers_on-next = Jeg har alle mine trackere på
|
||||
|
||||
## Tracker proportions method choose
|
||||
|
||||
# Italized text
|
||||
onboarding-choose_proportions-auto_proportions-subtitle = Anbefalet
|
||||
|
||||
## Tracker manual proportions setup
|
||||
## Tracker manual proportions setupa
|
||||
|
||||
|
||||
## Tracker automatic proportions setup
|
||||
@@ -621,6 +609,48 @@ onboarding-automatic_proportions-verify_results-redo = prøv igen
|
||||
onboarding-automatic_proportions-done-title = Krop målt og gemt.
|
||||
onboarding-automatic_proportions-done-description = Kalibreringen af dine kropsproportioner er fuldført!
|
||||
|
||||
## User height calibration
|
||||
|
||||
|
||||
## Stay Aligned setup
|
||||
|
||||
|
||||
## Home
|
||||
|
||||
home-no_trackers = Ingen trackere registreret eller tildelt
|
||||
|
||||
## Trackers Still On notification
|
||||
|
||||
|
||||
## Status system
|
||||
|
||||
|
||||
## Firmware tool globals
|
||||
|
||||
|
||||
## Firmware tool Steps
|
||||
|
||||
|
||||
## firmware tool build status
|
||||
|
||||
|
||||
## Firmware update status
|
||||
|
||||
|
||||
## Dedicated Firmware Update Page
|
||||
|
||||
|
||||
## Tray Menu
|
||||
|
||||
|
||||
## First exit modal
|
||||
|
||||
|
||||
## Unknown device modal
|
||||
|
||||
|
||||
## Error collection consent modal
|
||||
|
||||
|
||||
## Tracking checklist section
|
||||
|
||||
|
||||
@@ -18,6 +18,9 @@ websocket-connection_lost = Η σύνδεση μεταξύ του διακομι
|
||||
tips-find_tracker = Δεν είστε σίγουροι ποιος ανιχνευτής είναι ποιος; Κουνήστε έναν ανιχνευτή και θα επισημάνει το αντίστοιχο στοιχείο.
|
||||
tips-do_not_move_heels = Βεβαιωθείτε ότι οι φτέρνες σας δεν κινούνται κατά την εγγραφή!
|
||||
|
||||
## Units
|
||||
|
||||
|
||||
## Body parts
|
||||
|
||||
body_part-NONE = Μη εκχωρημένο
|
||||
@@ -41,13 +44,16 @@ body_part-LEFT_UPPER_LEG = Αριστερός μηρός
|
||||
body_part-LEFT_LOWER_LEG = Αριστερός αστράγαλος
|
||||
body_part-LEFT_FOOT = Αριστερό πόδι
|
||||
|
||||
## BoardType
|
||||
|
||||
|
||||
## Proportions
|
||||
|
||||
skeleton_bone-NONE = Τίποτα
|
||||
skeleton_bone-HEAD = Μετατόπιση κεφαλής
|
||||
skeleton_bone-NECK = Μήκος λαιμού
|
||||
skeleton_bone-CHEST = Μήκος στήθους
|
||||
skeleton_bone-CHEST_OFFSET = Μετατόπιση στήθους
|
||||
skeleton_bone-CHEST = Μήκος στήθους
|
||||
skeleton_bone-WAIST = Μήκος μέσης
|
||||
skeleton_bone-HIP = Μήκος γοφών
|
||||
skeleton_bone-HIP_OFFSET = Μετατόπιση γοφών
|
||||
@@ -106,6 +112,9 @@ widget-overlay-is_mirrored_label = Εμφάνιση υπέρθεσης ως κα
|
||||
|
||||
widget-drift_compensation-clear = Επαναφορά αντιστάθμισης drift
|
||||
|
||||
## Widget: Clear Mounting calibration
|
||||
|
||||
|
||||
## Widget: Developer settings
|
||||
|
||||
widget-developer_mode = Λειτουργία προγραμματιστή
|
||||
@@ -123,6 +132,9 @@ widget-imu_visualizer = Περιστροφή
|
||||
widget-imu_visualizer-rotation_raw = Ακατέργαστο
|
||||
widget-imu_visualizer-rotation_preview = Προεπισκόπηση
|
||||
|
||||
## Widget: Skeleton Visualizer
|
||||
|
||||
|
||||
## Tracker status
|
||||
|
||||
tracker-status-none = Χωρίς κατάσταση
|
||||
@@ -231,8 +243,6 @@ tracker_selection_menu-LEFT_FOOT = { -tracker_selection-part } αριστερό
|
||||
settings-general-steamvr = SteamVR
|
||||
settings-general-steamvr-trackers-waist = Μέση
|
||||
settings-general-steamvr-trackers-chest = Στήθος
|
||||
settings-general-steamvr-trackers-feet = Πόδια
|
||||
settings-general-steamvr-trackers-hands = Χέρια
|
||||
|
||||
## Tracker mechanics
|
||||
|
||||
@@ -243,7 +253,13 @@ settings-general-steamvr-trackers-hands = Χέρια
|
||||
## Gesture control settings (tracker tapping)
|
||||
|
||||
|
||||
## Interface settings
|
||||
## Appearance settings
|
||||
|
||||
|
||||
## Notification settings
|
||||
|
||||
|
||||
## Behavior settings
|
||||
|
||||
|
||||
## Serial settings
|
||||
@@ -260,6 +276,18 @@ settings-osc-vrchat-network-trackers-feet = Πόδια
|
||||
## VMC OSC settings
|
||||
|
||||
|
||||
## Common OSC settings
|
||||
|
||||
|
||||
## Advanced settings
|
||||
|
||||
|
||||
## Home Screen
|
||||
|
||||
|
||||
## Tracking Checlist
|
||||
|
||||
|
||||
## Setup/onboarding menu
|
||||
|
||||
|
||||
@@ -272,9 +300,6 @@ settings-osc-vrchat-network-trackers-feet = Πόδια
|
||||
## Setup start
|
||||
|
||||
|
||||
## Enter VR part of setup
|
||||
|
||||
|
||||
## Setup done
|
||||
|
||||
|
||||
@@ -302,17 +327,53 @@ settings-osc-vrchat-network-trackers-feet = Πόδια
|
||||
## Tracker automatic mounting setup
|
||||
|
||||
|
||||
## Tracker proportions method choose
|
||||
|
||||
|
||||
## Tracker manual proportions setup
|
||||
## Tracker manual proportions setupa
|
||||
|
||||
|
||||
## Tracker automatic proportions setup
|
||||
|
||||
|
||||
## User height calibration
|
||||
|
||||
|
||||
## Stay Aligned setup
|
||||
|
||||
|
||||
## Home
|
||||
|
||||
|
||||
## Trackers Still On notification
|
||||
|
||||
|
||||
## Status system
|
||||
|
||||
|
||||
## Firmware tool globals
|
||||
|
||||
|
||||
## Firmware tool Steps
|
||||
|
||||
|
||||
## firmware tool build status
|
||||
|
||||
|
||||
## Firmware update status
|
||||
|
||||
|
||||
## Dedicated Firmware Update Page
|
||||
|
||||
|
||||
## Tray Menu
|
||||
|
||||
|
||||
## First exit modal
|
||||
|
||||
|
||||
## Unknown device modal
|
||||
|
||||
|
||||
## Error collection consent modal
|
||||
|
||||
|
||||
## Tracking checklist section
|
||||
|
||||
|
||||
@@ -9,6 +9,11 @@
|
||||
|
||||
websocket-connecting = connyecting to teh sewvew
|
||||
websocket-connection_lost = oopsie woopsie~ connyection wost to teh sewvew ;m;... uwu am twying to weconnyect owo!
|
||||
websocket-connection_lost-desc = uh ohs! it look like da swimevr serber cwashed... check ur logs and stuffs and maybe westawt da pwogwam.
|
||||
websocket-timedout = could nawt connec to da serwer
|
||||
websocket-timedout-desc = it look like da swimevr serwer cwashed ow time out, omg!! check da log and westawt da pwogwam.
|
||||
websocket-error-close = Exit SwimeVR
|
||||
websocket-error-logs = open da logs fowder
|
||||
|
||||
## Update notification
|
||||
|
||||
@@ -26,6 +31,9 @@ tips-tap_setup = u can swowly tap youw twackew 2 times to choose it insted of se
|
||||
tips-turn_on_tracker = erm.. are u using offishal SlaiemVR twackews??! rember to <b><em>tuwn on yuor twackew</em></b> aftwew coneccting it to teh PC!
|
||||
tips-failed_webgl = oh nooooo :( faiwled to initiawizwe WebGL...
|
||||
|
||||
## Units
|
||||
|
||||
|
||||
## Body parts
|
||||
|
||||
body_part-NONE = unassyigned
|
||||
@@ -49,6 +57,58 @@ body_part-LEFT_HAND = weft pawb
|
||||
body_part-LEFT_UPPER_LEG = weft uppew weg
|
||||
body_part-LEFT_LOWER_LEG = weft wowwe weg
|
||||
body_part-LEFT_FOOT = weft pawb
|
||||
body_part-LEFT_THUMB_METACARPAL = weft thum medacarpool
|
||||
body_part-LEFT_THUMB_PROXIMAL = weft thum pwoximal
|
||||
body_part-LEFT_THUMB_DISTAL = weft thum dital
|
||||
body_part-LEFT_INDEX_PROXIMAL = weft index pwoximal
|
||||
body_part-LEFT_INDEX_INTERMEDIATE = weft index indamedeate
|
||||
body_part-LEFT_INDEX_DISTAL = weft index dissal
|
||||
body_part-LEFT_MIDDLE_PROXIMAL = weft middol pwoximal
|
||||
body_part-LEFT_MIDDLE_INTERMEDIATE = weft middol intermediation
|
||||
body_part-LEFT_MIDDLE_DISTAL = weft middol dittol
|
||||
body_part-LEFT_RING_PROXIMAL = weft wing woxiwal
|
||||
body_part-LEFT_RING_INTERMEDIATE = weft wing wintamediate
|
||||
body_part-LEFT_RING_DISTAL = weft wing distol
|
||||
body_part-LEFT_LITTLE_PROXIMAL = weft widdle woximol
|
||||
body_part-LEFT_LITTLE_INTERMEDIATE = weft widdle imtermedate
|
||||
body_part-LEFT_LITTLE_DISTAL = weft widdle dital
|
||||
body_part-RIGHT_THUMB_METACARPAL = wight thum medacarpool
|
||||
body_part-RIGHT_THUMB_PROXIMAL = wight thum thoximal
|
||||
body_part-RIGHT_THUMB_DISTAL = wight thum distol
|
||||
body_part-RIGHT_INDEX_PROXIMAL = wight index poximal
|
||||
body_part-RIGHT_INDEX_INTERMEDIATE = wight index imtertediate
|
||||
body_part-RIGHT_INDEX_DISTAL = wight index distal
|
||||
body_part-RIGHT_MIDDLE_PROXIMAL = wight middol pwoximal
|
||||
body_part-RIGHT_MIDDLE_INTERMEDIATE = wight middol intertediate
|
||||
body_part-RIGHT_MIDDLE_DISTAL = wight middol distol
|
||||
body_part-RIGHT_RING_PROXIMAL = wight wing roximal
|
||||
body_part-RIGHT_RING_INTERMEDIATE = wight wing imterdemiate
|
||||
body_part-RIGHT_RING_DISTAL = wight wing distol
|
||||
body_part-RIGHT_LITTLE_PROXIMAL = wight widdle pwoximal
|
||||
body_part-RIGHT_LITTLE_INTERMEDIATE = wight widdle imternediate
|
||||
body_part-RIGHT_LITTLE_DISTAL = wight widdle distol
|
||||
|
||||
## BoardType
|
||||
|
||||
board_type-UNKNOWN = unnown
|
||||
board_type-NODEMCU = nowdemcu
|
||||
board_type-CUSTOM = cusom boawd
|
||||
board_type-WROOM32 = wroom32
|
||||
board_type-WEMOSD1MINI = wemo d1 meenee
|
||||
board_type-TTGO_TBASE = ttgo tbase
|
||||
board_type-ESP01 = esp01
|
||||
board_type-SLIMEVR = swimevr
|
||||
board_type-LOLIN_C3_MINI = lol c3 meenee
|
||||
board_type-BEETLE32C3 = 🪲 (beetle) esp32-c3
|
||||
board_type-ESP32C3DEVKITM1 = expressive esp32-c3 devkitm1
|
||||
board_type-OWOTRACK = owo!!Track
|
||||
board_type-WRANGLER = wrangle joycons (yeehaw)
|
||||
board_type-MOCOPI = soni mocopi
|
||||
board_type-WEMOSWROOM02 = memos vroom-02 d1 meenee
|
||||
board_type-XIAO_ESP32C3 = seeeed studio xiao esp32c3
|
||||
board_type-HARITORA = hawitowa
|
||||
board_type-ESP32C6DEVKITC1 = espresso esp32-c6 devkitc1
|
||||
board_type-GLOVE_IMU_SLIMEVR_DEV = swimevr dev imu gwove
|
||||
|
||||
## Proportions
|
||||
|
||||
@@ -81,6 +141,14 @@ skeleton_bone-ELBOW_OFFSET = ewbow awfsewt
|
||||
## Tracker reset buttons
|
||||
|
||||
reset-reset_all = weset aww pwopowtions~
|
||||
reset-reset_all_warning-v2 =
|
||||
<b>warnings!!!</b> ur pwopawshuns will be weset to default scaled to ur configuwed heit.
|
||||
are u SHURE you want to do dis?!? >~>
|
||||
reset-reset_all_warning-reset = weset pwopawshuns
|
||||
reset-reset_all_warning-cancel = cancew :o
|
||||
reset-reset_all_warning_default-v2 =
|
||||
<b>wawnin!!</b> ur heit has nawt been configure, ur pwopawshuns will be weset to defawts wiff da defawt heit.
|
||||
are u REALLY sure you want to do this?! <~<
|
||||
reset-full = fuww weset~
|
||||
reset-mounting = weset meownting
|
||||
reset-yaw = yaw weset
|
||||
@@ -124,7 +192,7 @@ widget-overlay-is_mirrored_label = dispway owovelay as miwwow
|
||||
|
||||
widget-drift_compensation-clear = cwear dwift compensation
|
||||
|
||||
## Widget: Clear Reset Mounting
|
||||
## Widget: Clear Mounting calibration
|
||||
|
||||
widget-clear_mounting = cweaw weset meownting
|
||||
|
||||
@@ -142,9 +210,12 @@ widget-developer_mode-more_info = mowe info
|
||||
## Widget: IMU Visualizer
|
||||
|
||||
widget-imu_visualizer = wotation
|
||||
widget-imu_visualizer-preview = pwewiew
|
||||
widget-imu_visualizer-hide = hoide
|
||||
widget-imu_visualizer-rotation_raw = waw
|
||||
widget-imu_visualizer-rotation_preview = pwewiew
|
||||
widget-imu_visualizer-rotation_hide = hoide
|
||||
widget-imu_visualizer-acceleration = accewewation
|
||||
widget-imu_visualizer-position = pawsition
|
||||
|
||||
## Widget: Skeleton Visualizer
|
||||
|
||||
@@ -196,9 +267,17 @@ tracker-infos-url = twackaw uawl
|
||||
tracker-infos-version = fiwmwawe vewsion
|
||||
tracker-infos-hardware_rev = hawdwawe revision
|
||||
tracker-infos-hardware_identifier = hawdwawe id
|
||||
tracker-infos-data_support = deyta suppowt
|
||||
tracker-infos-imu = imu sensow
|
||||
tracker-infos-board_type = mane bored
|
||||
tracker-infos-network_version = pwotocol vewsiowon
|
||||
tracker-infos-magnetometer = magentometer
|
||||
tracker-infos-magnetometer-status-v1 =
|
||||
{ $status ->
|
||||
[DISABLED] disabled.
|
||||
[ENABLED] enabled!!
|
||||
*[NOT_SUPPORTED] nawt suppowted...
|
||||
}
|
||||
|
||||
## Tracker settings
|
||||
|
||||
@@ -213,14 +292,19 @@ tracker-settings-mounting_section-edit = edit meownting
|
||||
tracker-settings-drift_compensation_section = awwow dwift compensation
|
||||
tracker-settings-drift_compensation_section-description = shouwd this twackew compensate fow its dwift when dwift compensation is enabwed?
|
||||
tracker-settings-drift_compensation_section-edit = awwow dwift compensation
|
||||
tracker-settings-use_mag = awwow magentometer on dis twackew
|
||||
tracker-settings-use_mag-label = awwow magnetomemer
|
||||
# The .<name> means it's an attribute and it's related to the top key.
|
||||
# In this case that is the settings for the assignment section.
|
||||
tracker-settings-name_section = twackaw name
|
||||
tracker-settings-name_section-description = owo whats dis?
|
||||
tracker-settings-name_section-placeholder = ewimewl's weft pawb
|
||||
tracker-settings-name_section-label = twackaw name
|
||||
tracker-settings-forget = *forgors the tracker*
|
||||
tracker-settings-forget-description = remooves teh twackew fwom da SwimeVR sewvew n pwevent it frum conecting to it til fhe sewvew iz westawtied. the cowonfigyuwatsin of da twackew woant b wost.
|
||||
tracker-settings-forget-label = *forgors the tracker*
|
||||
tracker-settings-update-up_to_date = up to dayte!! ^w^
|
||||
tracker-settings-update = uwupdate meow!
|
||||
|
||||
## Tracker part card info
|
||||
|
||||
@@ -296,6 +380,7 @@ settings-sidebar-utils = utiwities
|
||||
settings-sidebar-serial = sewiaw cownsaw
|
||||
settings-sidebar-appearance = appeawance
|
||||
settings-sidebar-notifications = notificashuns
|
||||
settings-sidebar-behavior = behavur
|
||||
|
||||
## SteamVR settings
|
||||
|
||||
@@ -350,6 +435,7 @@ settings-general-tracker_mechanics-drift_compensation-description =
|
||||
compensates imu yaw dwift by appwying an invewse wotation.
|
||||
change amownt of compensation and how many wesets awe taken into accouwnt.
|
||||
settings-general-tracker_mechanics-drift_compensation-enabled-label = dwift compensation
|
||||
settings-general-tracker_mechanics-drift_compensation_warning-cancel = cancew :o
|
||||
settings-general-tracker_mechanics-drift_compensation-amount-label = compensation amownt
|
||||
settings-general-tracker_mechanics-drift_compensation-max_resets-label = nuwmbew of wesets uwsed
|
||||
settings-general-tracker_mechanics-save_mounting_reset = saiv awtomatic meownting weset calibwaytion
|
||||
@@ -357,6 +443,10 @@ settings-general-tracker_mechanics-save_mounting_reset-description =
|
||||
saves the auwtoemyatic meownting weset cawybwationz for da twackews betwean westawts. useful
|
||||
wen weawing a sUwUit whewe twackews dont move between sesshuns. <b>nawt wecomended for noarmal UwUsews!</b>
|
||||
settings-general-tracker_mechanics-save_mounting_reset-enabled-label = save meownting weset
|
||||
settings-general-tracker_mechanics-use_mag_on_all_trackers-description =
|
||||
uses magnemometer on da twackews dat have a compatubble firmwear fow it, weduces dwift in stable magnettic enviwoments.
|
||||
can be disable per twackew in da twackew setting! <b>pwease dont shut down any twackew when u toggle dis!</b>
|
||||
settings-general-tracker_mechanics-use_mag_on_all_trackers-label = use mangenmometer on twackews
|
||||
|
||||
## FK/Tracking settings
|
||||
|
||||
@@ -378,8 +468,11 @@ settings-general-fk_settings-leg_tweak-floor_clip-description = fwoow-cwip can r
|
||||
settings-general-fk_settings-leg_tweak-toe_snap-description = toe-snap atempts to gwess da wotation of ur fweet if fweet tracker thingys arewnt in use
|
||||
settings-general-fk_settings-leg_tweak-foot_plant-description = pawb-pwant wotates youw feet to be pawawwew to the gwound wen in cawntact.
|
||||
settings-general-fk_settings-leg_fk = leg twacking
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet-description = Enyabwe pawb Meownting Weset by tiptoeing.
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet = Pawb Meownting Weset
|
||||
settings-general-fk_settings-enforce_joint_constraints = skewetal wimits
|
||||
settings-general-fk_settings-enforce_joint_constraints-enforce_constraints = enfourse constwaints
|
||||
settings-general-fk_settings-enforce_joint_constraints-enforce_constraints-description = pwevents da joins fwom wotating past da wimit
|
||||
settings-general-fk_settings-enforce_joint_constraints-correct_constraints = cowwect wit constwaints
|
||||
settings-general-fk_settings-enforce_joint_constraints-correct_constraints-description = cowwect joint wotashuns when dey push past their wimit
|
||||
settings-general-fk_settings-arm_fk = awm twacking
|
||||
settings-general-fk_settings-arm_fk-description = chawnge teh way teh awms awe twacked.
|
||||
settings-general-fk_settings-arm_fk-force_arms = fowce awms fwom hmd
|
||||
@@ -411,9 +504,6 @@ settings-general-fk_settings-skeleton_settings-interp_knee_tracker_ankle = awewa
|
||||
settings-general-fk_settings-skeleton_settings-interp_knee_ankle = Avewage the knees' yaw and woww with the ankews'
|
||||
settings-general-fk_settings-self_localization-title = mocap mowd
|
||||
settings-general-fk_settings-self_localization-description = mocap mowd awwows da skeweton to wuffly twack is own posishun without a hedset or other twackews. note dat dis wequiwes feet and hed twackews to wowk and is stiwll expewimentaw.
|
||||
settings-general-fk_settings-vive_emulation-title = vive emuwation
|
||||
settings-general-fk_settings-vive_emulation-description = emuwate the waist twackew pwobwems that vive twackews hawe. tis is a jowke and mawkes twacking wowse eheh ^^
|
||||
settings-general-fk_settings-vive_emulation-label = enabwe vive emuwation
|
||||
|
||||
## Gesture control settings (tracker tapping)
|
||||
|
||||
@@ -454,6 +544,9 @@ settings-general-interface-dev_mode = devwowwewow mode
|
||||
settings-general-interface-dev_mode-description = this mode can be wowseffuw if you need in-dipth data owow to intewact with cownnected twackaws on a wowowe wowadvanced wowwevew
|
||||
settings-general-interface-dev_mode-label = devwowwewow mode
|
||||
settings-general-interface-theme = cowor theem
|
||||
settings-general-interface-show-navbar-onboarding = show "{ navbar-onboarding }" on da nawigation bar
|
||||
settings-general-interface-show-navbar-onboarding-description = dis change if da "{ navbar-onboarding }" button show on da nawigashun bar!
|
||||
settings-general-interface-show-navbar-onboarding-label = show "{ navbar-onboarding }"
|
||||
settings-general-interface-lang = sewect wanguage
|
||||
settings-general-interface-lang-description = change the defawwt wanguage yuw want to use
|
||||
settings-general-interface-lang-placeholder = sewect teh wanguage to use
|
||||
@@ -465,6 +558,9 @@ settings-interface-appearance-font-os_font = os fawnt
|
||||
settings-interface-appearance-font-slime_font = defawt fawnt
|
||||
settings-interface-appearance-font_size = bass fawn scawing
|
||||
settings-interface-appearance-font_size-description = dis affects da fawnt size of da whol intewface except dis setting panew.
|
||||
settings-interface-appearance-decorations = use da sysem native decowashuns
|
||||
settings-interface-appearance-decorations-description = dis wiw not wendew da top bar of da interfase an will use da opewating syssem's insted.
|
||||
settings-interface-appearance-decorations-label = use native decowashuns
|
||||
|
||||
## Notification settings
|
||||
|
||||
@@ -479,6 +575,10 @@ settings-general-interface-feedback_sound-volume = feedback sownd volyume
|
||||
settings-general-interface-connected_trackers_warning = Connected twackews wawning
|
||||
settings-general-interface-connected_trackers_warning-description = This option wiww show a pop-up evewy time you twy exiting SwimeVR whiwe having one ow mowe connected twackews. It weminds you to tuwn off youw twackews when you awe done to pwesewve battewy wife.
|
||||
settings-general-interface-connected_trackers_warning-label = Connected twackews wawning on exit
|
||||
|
||||
## Behavior settings
|
||||
|
||||
settings-interface-behavior = behavur
|
||||
settings-general-interface-use_tray = minimaize to systewm tway
|
||||
settings-general-interface-use_tray-description = wets u cwose the wimdOwOw wifhout cwosing da SwimeVR Sewvew so uou can keep using it withowt da GUI bohtewing u.
|
||||
settings-general-interface-use_tray-label = minimaize to systewm tway
|
||||
@@ -509,7 +609,6 @@ settings-serial-factory_reset-warning =
|
||||
which means wi-fi and cawibwation settings <b>wiww aww be wost!</b>
|
||||
settings-serial-factory_reset-warning-ok = i know what I'm doing :3
|
||||
settings-serial-factory_reset-warning-cancel = cancew
|
||||
settings-serial-get_infos = get infows
|
||||
settings-serial-serial_select = sewect a shewyaw pawt
|
||||
settings-serial-auto_dropdown_item = awto
|
||||
settings-serial-get_wifi_scan = get wifi scan uwu
|
||||
@@ -588,12 +687,6 @@ settings-osc-vmc-network-address-description = choose which addwess to send out
|
||||
settings-osc-vmc-network-address-placeholder = IPV4 addwess
|
||||
settings-osc-vmc-vrm = VRM modew
|
||||
settings-osc-vmc-vrm-description = woad a VRM modew to awwow head anchow and enabwe a highew compatibiwity with othew appwications
|
||||
settings-osc-vmc-vrm-model_unloaded = no modew woaded
|
||||
settings-osc-vmc-vrm-model_loaded =
|
||||
{ $titled ->
|
||||
[true] modew woaded: { $name }
|
||||
*[other] untitwed modew woaded
|
||||
}
|
||||
settings-osc-vmc-vrm-file_select = dwag & dwop a modew to use OwO, ow <u>bwowse</u>
|
||||
settings-osc-vmc-anchor_hip = anchow at hips
|
||||
settings-osc-vmc-anchor_hip-description = anchow the twacking at the hips, usefuw fow seated vtubing
|
||||
@@ -602,6 +695,38 @@ settings-osc-vmc-mirror_tracking = miwwow twacking
|
||||
settings-osc-vmc-mirror_tracking-description = miwwow da twacking howizawntawwy.
|
||||
settings-osc-vmc-mirror_tracking-label = miwwow twacking
|
||||
|
||||
## Common OSC settings
|
||||
|
||||
|
||||
## Advanced settings
|
||||
|
||||
settings-utils-advanced-reset_warning =
|
||||
{ $type ->
|
||||
[gui]
|
||||
<b>wawning!!</b> this wiww weset youw gui settings to defawts :(
|
||||
aw you supew dupew sure?
|
||||
[server]
|
||||
<b>wawning!!</b> this wiww weset youw twacking settings to defawts :(
|
||||
aw you supew dupew sure?
|
||||
*[all]
|
||||
<b>wawning!!</b> this wiww make aww youw settings go bye-bye!!
|
||||
aw you supew dupew sure??
|
||||
}
|
||||
settings-utils-advanced-reset_warning-reset = weset setings
|
||||
settings-utils-advanced-reset_warning-cancel = cancew :o
|
||||
settings-utils-advanced-open_data-v1 = config fowdew
|
||||
settings-utils-advanced-open_data-description-v1 = open swimevr's config fowdew in da fiwe explowew, containing teh configuwation
|
||||
settings-utils-advanced-open_data-label = open fowdew
|
||||
settings-utils-advanced-open_logs = logs fowdew
|
||||
settings-utils-advanced-open_logs-description = open swimevr's logs fowdew in da fiwe explowew, containing teh logs of da app
|
||||
settings-utils-advanced-open_logs-label = open fowdew
|
||||
|
||||
## Home Screen
|
||||
|
||||
|
||||
## Tracking Checlist
|
||||
|
||||
|
||||
## Setup/onboarding menu
|
||||
|
||||
onboarding-skip = skipy setup
|
||||
@@ -617,16 +742,12 @@ onboarding-setup_warning-cancel = continu setup
|
||||
## Wi-Fi setup
|
||||
|
||||
onboarding-wifi_creds-back = gaww bawwk to intwoduction
|
||||
onboarding-wifi_creds = input wi-fi cwedentials
|
||||
# This cares about multilines
|
||||
onboarding-wifi_creds-description =
|
||||
teh twawckaws will use these cwedentials to connect wirelessly
|
||||
pwease use teh cwedentials that yaww awe cwowently cownyected to
|
||||
onboarding-wifi_creds-skip = skipy wi-fi settiwyngs
|
||||
onboarding-wifi_creds-submit = suwbmyt!
|
||||
onboarding-wifi_creds-ssid =
|
||||
.label = wi-fi nawme
|
||||
.placeholder = entew wi-fi nawme
|
||||
onboarding-wifi_creds-ssid-required = wifi name is wequiwed!!
|
||||
onboarding-wifi_creds-password =
|
||||
.label = passwowod
|
||||
.placeholder = entew passwowod
|
||||
@@ -661,13 +782,6 @@ onboarding-reset_tutorial-2 =
|
||||
onboarding-home = wewcome to SwimeVR
|
||||
onboarding-home-start = wets get set up!
|
||||
|
||||
## Enter VR part of setup
|
||||
|
||||
onboarding-enter_vr-back = gaww bawwk to twacker assignyment
|
||||
onboarding-enter_vr-title = time to entew vr!
|
||||
onboarding-enter_vr-description = put on awe yoaww twackaws and then entew vr!
|
||||
onboarding-enter_vr-ready = iym weady
|
||||
|
||||
## Setup done
|
||||
|
||||
onboarding-done-title = yaww awe awe set!
|
||||
@@ -684,6 +798,7 @@ onboarding-connect_tracker-issue-serial = i'm having twouble connecting!
|
||||
onboarding-connect_tracker-usb = usb twackew
|
||||
onboarding-connect_tracker-connection_status-none = wooking fow twackaws
|
||||
onboarding-connect_tracker-connection_status-serial_init = conectin too da sewiaw dewise
|
||||
onboarding-connect_tracker-connection_status-obtaining_mac_address = obtainin teh twacker mac addwess
|
||||
onboarding-connect_tracker-connection_status-provisioning = sending wi-fi cwedentials
|
||||
onboarding-connect_tracker-connection_status-connecting = sending wi-fi cwedentials
|
||||
onboarding-connect_tracker-connection_status-looking_for_server = wookin fow da sewvew
|
||||
@@ -697,22 +812,22 @@ onboarding-connect_tracker-connection_status-done = cownyected to teh sewvew
|
||||
# if $amount is 0 then we say "No trackers connected"
|
||||
onboarding-connect_tracker-connected_trackers =
|
||||
{ $amount ->
|
||||
[0] no twackers
|
||||
[one] 1 twackers
|
||||
*[other] { $amount } twackers
|
||||
} cownyected
|
||||
[0] no twackers cownyected
|
||||
[one] 1 twackers cownyected
|
||||
*[other] { $amount } twackers cownyected
|
||||
}
|
||||
onboarding-connect_tracker-next = i cownyected awe my twackaws
|
||||
|
||||
## Tracker calibration tutorial
|
||||
|
||||
onboarding-calibration_tutorial = imu cawibwashun tutowiawl
|
||||
onboarding-calibration_tutorial-subtitle = dis will hewp weduce twackew dwifting!!!
|
||||
onboarding-calibration_tutorial-description = evewy time you tuwn on youw twackews, dey need to west fow a moment on a fwat suwface to cawibwate. wet's do da same ting by booping da "{ onboarding-calibration_tutorial-calibrate }" buddon, <b>do nyot move dem!!!</b>
|
||||
onboarding-calibration_tutorial-calibrate = i pwace da twackew on da tabwe
|
||||
onboarding-calibration_tutorial-status-waiting = waiiiting fur u
|
||||
onboarding-calibration_tutorial-status-calibrating = cawibwating
|
||||
onboarding-calibration_tutorial-status-success = congwats~!!
|
||||
onboarding-calibration_tutorial-status-error = da twackew was move ;w;
|
||||
onboarding-calibration_tutorial-skip = skip tutowiaw
|
||||
|
||||
## Tracker assignment tutorial
|
||||
|
||||
@@ -733,10 +848,10 @@ onboarding-assign_trackers-description = wets choyse which twackaw goes whewe. c
|
||||
# $assigned (Number) - Trackers that have been assigned a body part
|
||||
# $trackers (Number) - Trackers connected to the server
|
||||
onboarding-assign_trackers-assigned =
|
||||
{ $assigned } of { $trackers ->
|
||||
[one] 1 twackaws
|
||||
*[other] { $trackers } twackaws
|
||||
} assigned
|
||||
{ $trackers ->
|
||||
[one] { $assigned } of 1 twackaws assigned
|
||||
*[other] { $assigned } of { $trackers } twackaws assigned
|
||||
}
|
||||
onboarding-assign_trackers-advanced = show advanced assign wocations
|
||||
onboarding-assign_trackers-next = i assigned awe the twackaws
|
||||
onboarding-assign_trackers-mirror_view = miwwow vyew
|
||||
@@ -836,11 +951,11 @@ onboarding-choose_mounting = wut meownting cawibwation mefod to use?
|
||||
# Multiline text
|
||||
onboarding-choose_mounting-description = meownting owientation correct fow da pwacement of twackews on u body.
|
||||
onboarding-choose_mounting-auto_mounting = awtomawic meownting
|
||||
# Italized text
|
||||
# Italicized text
|
||||
onboarding-choose_mounting-auto_mounting-label-v2 = wecommended
|
||||
onboarding-choose_mounting-auto_mounting-description = dis will automaticawwy detec da meownting diwecshuns fow aww of ya twackews fwom 2 poses
|
||||
onboarding-choose_mounting-manual_mounting = manyul meownting
|
||||
# Italized text
|
||||
# Italicized text
|
||||
onboarding-choose_mounting-manual_mounting-label-v2 = might nawt b pwecise enuff ;w;
|
||||
onboarding-choose_mounting-manual_mounting-description = dis will let u chose da meownting diwecshun manuwawwy fow eech twackew
|
||||
# Multiline text
|
||||
@@ -874,44 +989,15 @@ onboarding-automatic_mounting-mounting_reset-title = meownting weset
|
||||
onboarding-automatic_mounting-mounting_reset-step-0 = 1. squawt in a "skiing" pose with yowo wegs bent, yowo upper body tilted fowwawds, and yowo awems bent.
|
||||
onboarding-automatic_mounting-mounting_reset-step-1 = 2. pwess the "weset meownting" button and wait fow 3 seconds befowe the twackaws' meownting wowations will weset.
|
||||
onboarding-automatic_mounting-preparation-title = pwepaiwation
|
||||
onboarding-automatic_mounting-preparation-step-0 = 1. stand upwight with yowo awems to yowo sides.
|
||||
onboarding-automatic_mounting-preparation-step-1 = 2. pwess the "fuww weset" button and wait fow 3 seconds befowe the twackaws will weset.
|
||||
onboarding-automatic_mounting-put_trackers_on-title = put on yowo twackaws
|
||||
onboarding-automatic_mounting-put_trackers_on-description = to cawibwate meownting wowations, we'we gonna use the twackaws yowo just assigned. put on awe yowo twackaws, yowo can see which awe which in the figuwe to the wowight.
|
||||
onboarding-automatic_mounting-put_trackers_on-next = i haff awe my twackaws on
|
||||
|
||||
## Tracker proportions method choose
|
||||
## Tracker manual proportions setupa
|
||||
|
||||
onboarding-choose_proportions = wut pwopowshun cawibwation mefod to use?
|
||||
# Multiline string
|
||||
onboarding-choose_proportions-description-v1 =
|
||||
bawdy pwopowotions r used to knwo da mehsuwementz of youw bawdy. they'we wequiewed to cawcuwate da twackews' pawsitshons.
|
||||
wen pwopowotiosn of ur bawdey don match teh ones saeved, yow twacking pwecisiown wiww b wowse and u wiww nowotice tingz wike skayting ow slaiding, ow yor bodiey matching uor avataw wel.
|
||||
<b>u only need to mewhsuwe your bawdee once!!</b> unwess dey awe rong ow yer boady haz chaenged, you dont need to do them agen. UwU
|
||||
onboarding-choose_proportions-auto_proportions = awtomatic pwopowtions
|
||||
# Italized text
|
||||
onboarding-choose_proportions-auto_proportions-subtitle = wecommended
|
||||
onboarding-choose_proportions-auto_proportions-descriptionv3 =
|
||||
This wiww guess youw pwopowtions by wecowding a sampwe of youw movements and passing it thwough an awgowithm.
|
||||
|
||||
<b>This wequiwes having youw headset (HMD) connected to SwimeVR and on youw head!</b>
|
||||
onboarding-choose_proportions-manual_proportions = manuwal pwopowtions
|
||||
# Italized text
|
||||
onboarding-choose_proportions-manual_proportions-subtitle = fow smol touchies
|
||||
onboarding-choose_proportions-manual_proportions-description = dis will let u ajust ur pwopowtions manuwally by modifying dem diwectwy
|
||||
onboarding-choose_proportions-export = expowt pawpowshuns
|
||||
onboarding-choose_proportions-import = Impowt pwopowtions
|
||||
onboarding-choose_proportions-import-success = Impowted
|
||||
onboarding-choose_proportions-import-failed = Faiwed
|
||||
onboarding-choose_proportions-file_type = body pawpowshuns file
|
||||
|
||||
## Tracker manual proportions setup
|
||||
|
||||
onboarding-manual_proportions-back = go bawck to weset tutowiaw
|
||||
onboarding-manual_proportions-title = manyuaw bodee pwopowtiesions
|
||||
onboarding-manual_proportions-precision = pwecision adjusty
|
||||
onboarding-manual_proportions-auto = owtomatic cawybwation
|
||||
onboarding-manual_proportions-ratio = ajust by watio gwoups
|
||||
onboarding-manual_proportions-fine_tuning_button = automaticawwy fine tuwune propowtions
|
||||
onboarding-manual_proportions-fine_tuning_button-disabled-tooltip = pwease connect a vr headset to use automatic fine tuwuning
|
||||
|
||||
## Tracker automatic proportions setup
|
||||
|
||||
@@ -932,21 +1018,33 @@ onboarding-automatic_proportions-requirements-descriptionv2 =
|
||||
Youw headset is wepowting positionaw data to the SwimeVR sewvew (this genewawwy means having SteamVR wunning and connected to SwimeVR using SwimeVR's SteamVR dwivew).
|
||||
Youw twacking is wowking and is accuwatewy wepwesenting youw movements (ex. you have pewfowmed a fuww weset and they move the wight diwection when kicking, bending ovew, sitting, etc).
|
||||
onboarding-automatic_proportions-requirements-next = i have wed da wequiwemens
|
||||
onboarding-automatic_proportions-check_height-title = check youw height
|
||||
onboarding-automatic_proportions-check_height-description = we use youw height as a basis of ouw measuwements by using da hmd's height as an appwoximashun of youw actuwaw height, but is better to check if they are right youwsewf!
|
||||
onboarding-automatic_proportions-check_height-title-v3 = measuwe youw headset heit
|
||||
onboarding-automatic_proportions-check_height-description-v2 = youw hedset heit shuld be swightwy less than youw fuww heit, becoz hedsets measuwe youw eye heit. dis measuwement wiww be used az a basewine fow youw body pwopowtions.
|
||||
# All the text is in bold!
|
||||
onboarding-automatic_proportions-check_height-calculation_warning = pwease pwess da button while standing <u>upwight</u> to cawcuwate youw height. you hav 3 second aftew you pwess da button! >w<
|
||||
onboarding-automatic_proportions-check_height-calculation_warning-v3 = stawt measuwing whiwe standin <u>upwite</u> to measuwe youw heit. be cawefuw to not waise youw hands highew than youw hedset, becoz dey may affect teh measuwement!
|
||||
onboarding-automatic_proportions-check_height-guardian_tip =
|
||||
if u r using a standowone VR hedset, make suwe to have youw gawrdian /
|
||||
bowndawy tuwned on so ur heit iz cowwect!!
|
||||
onboarding-automatic_proportions-check_height-fetch_height = am standing!
|
||||
# Context is that the height is unknown
|
||||
onboarding-automatic_proportions-check_height-unknown = unnown
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-hmd_height1 = youw hmd heit is
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-height1 = so youw actuaw heit is
|
||||
onboarding-automatic_proportions-check_height-hmd_height2 = youw hedset heit is:
|
||||
onboarding-automatic_proportions-check_height-measure-start = stawt measuwing
|
||||
onboarding-automatic_proportions-check_height-measure-stop = stawp measuwing
|
||||
onboarding-automatic_proportions-check_height-measure-reset = wetwy measuwing
|
||||
onboarding-automatic_proportions-check_height-next_step = dey awe fine
|
||||
onboarding-automatic_proportions-check_floor_height-title = measuwe youw fwoor heit (opshunaw)
|
||||
onboarding-automatic_proportions-check_floor_height-description = sometimez youw fwoor heit may nawt be set cowwectwy by youw hedset, cawsing da hedset heit 2 be measuwed too high (ono :c). u can measuwe da "heit" of youw fwoor to cowwect youw hedset heit.
|
||||
# All the text is in bold!
|
||||
onboarding-automatic_proportions-check_floor_height-calculation_warning-v2 = stawt measuwing and put a contwowwew agens youw fwoor to measuwe its heit. if u r suwe dat youw fwoor heit is cowwect, u can skip dis step.
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_floor_height-floor_height = youw fwoor heit is:
|
||||
onboarding-automatic_proportions-check_floor_height-full_height = youw estimated fuww heit is:
|
||||
onboarding-automatic_proportions-check_floor_height-measure-start = stawt measuwing
|
||||
onboarding-automatic_proportions-check_floor_height-measure-stop = stawp measuwing
|
||||
onboarding-automatic_proportions-check_floor_height-measure-reset = wetwy measuwing
|
||||
onboarding-automatic_proportions-check_floor_height-skip_step = skip dis and saiv
|
||||
onboarding-automatic_proportions-check_floor_height-next_step = use fwoor heit and saiv
|
||||
onboarding-automatic_proportions-start_recording-title = get wowdy to move
|
||||
onboarding-automatic_proportions-start_recording-description = we'we now going to wowcawd some specific poses and moves. these will be pwompted in teh wowst screen. be wowdy to stawt when teh buttawn is pwessed!
|
||||
onboarding-automatic_proportions-start_recording-next = stawt wowcawding
|
||||
@@ -976,10 +1074,21 @@ onboarding-automatic_proportions-verify_results-redo = wedo wecowding
|
||||
onboarding-automatic_proportions-verify_results-confirm = tehywee coowect
|
||||
onboarding-automatic_proportions-done-title = bawdy meowsured anwd sayved uwu
|
||||
onboarding-automatic_proportions-done-description = yoww body pwopowwtions cawybowwation is cowowplete! ^w^
|
||||
onboarding-automatic_proportions-error_modal =
|
||||
<b>wawning:</b> an ewwow was fownd whiwe estimating pawpowshuns! ;w;
|
||||
pwease <docs>check da docs</docs> or join ouw <discord>Discord</discord> fow hewp >~>
|
||||
onboarding-automatic_proportions-error_modal-v2 =
|
||||
<b>oh nyo...</b> thewe wuz an ewwow whiwe estimatin da pwopowtions... :(
|
||||
dis is wikewy a mountin cawibwation issue. make suwe youw twackin wowks pwopewy befow twying agen.
|
||||
pwease <docs>chek da docs</docs> ow join ouw <discord>discowd</discord> fow hewp :3
|
||||
onboarding-automatic_proportions-error_modal-confirm = undewstood!
|
||||
onboarding-automatic_proportions-smol_warning =
|
||||
youw configuwed heit of { $height } iz way 2 widdle den da { $minHeight }.
|
||||
<b>pwease wedo da measuwments and ensuwe dey r cowwect.</b>
|
||||
onboarding-automatic_proportions-smol_warning-cancel = go bak
|
||||
|
||||
## User height calibration
|
||||
|
||||
|
||||
## Stay Aligned setup
|
||||
|
||||
|
||||
## Home
|
||||
|
||||
@@ -1005,6 +1114,81 @@ status_system-StatusSteamVRDisconnected =
|
||||
status_system-StatusTrackerError = da { $trackerName } twackew has ewwow. >~<
|
||||
status_system-StatusUnassignedHMD = teh VR hedset shud be awssaignd as a hed twackew.
|
||||
|
||||
## Firmware tool globals
|
||||
|
||||
firmware_tool-next_step = next step
|
||||
firmware_tool-previous_step = pwevious step
|
||||
firmware_tool-ok = wooks gud
|
||||
firmware_tool-retry = wetwy
|
||||
firmware_tool-loading = woadin...
|
||||
|
||||
## Firmware tool Steps
|
||||
|
||||
firmware_tool = DIY fiwmwawe toow
|
||||
firmware_tool-description = awwows u to configuwe an fwash youw DIY twackews
|
||||
firmware_tool-not_available = oopsie woopsie! da fiwmwawe toow iz nawt avaiwabwe wight meow :3 twy agen laitew!
|
||||
firmware_tool-not_compatible = teh fiwmwawe toow iz nawt compatibwe wit dis vershun of teh sewvew. pwease uwupdate youw sewvew!
|
||||
firmware_tool-flash_method_step = fwashin mefod
|
||||
firmware_tool-flash_method_step-description = pwease sewect teh fwashin mefod u wanna use
|
||||
firmware_tool-flashbtn_step = pwess da buwut buddon
|
||||
firmware_tool-flashbtn_step-description = befow goin into da next step thewe's stuff u gotta do
|
||||
firmware_tool-flashbtn_step-board_SLIMEVR = tuwn awf da twackew, wemove da case if u got wun, conecc an usb cabwe to dis compooper, den do wun of da fowwowin steps dependin on wat swimevr boawd u got:
|
||||
firmware_tool-flashbtn_step-board_OTHER =
|
||||
befow fwashin u prob need 2 put da twackew into buwutwoadew mowd :3
|
||||
mowst of da time it meens pressin da buwut buddon on da boawd befow da fwashin pwocess stawts.
|
||||
if da fwashin pwocess timeout at da stawt of da fwashin it prob meens dat da twackew wuz nawt in buwutwoadew mowd ono
|
||||
pwease wefew to da fwashin instwucshuns of youw boawd to no how 2 tuwn on da buwutwoadew mowd :3
|
||||
firmware_tool-flash_method_ota-devices = detectewed ovew teh aiw dewices:
|
||||
firmware_tool-flash_method_ota-no_devices = thewe r no boawds dat can be uwupdated usin ovew teh aiw, make suwe u sewected da cowwect boawd taip
|
||||
firmware_tool-flash_method_serial-wifi = wifi cwedenshuls:
|
||||
firmware_tool-flash_method_serial-devices-label = detectewed sewiaw dewices:
|
||||
firmware_tool-flash_method_serial-devices-placeholder = sewect a sewiaw dewice
|
||||
firmware_tool-flash_method_serial-no_devices = thewe r no compatibwe sewiaw dewices detectewed, make suwe da twackew is pwugged in
|
||||
firmware_tool-build_step = bildin
|
||||
firmware_tool-build_step-description = da fiwmwawe is bildin pwease wait :3
|
||||
firmware_tool-flashing_step = fwashin
|
||||
firmware_tool-flashing_step-description = youw twackews r fwashin, pwease fowwow da instwucshuns on da scween
|
||||
firmware_tool-flashing_step-flash_more = fwash mowe twackews
|
||||
firmware_tool-flashing_step-exit = exit
|
||||
|
||||
## firmware tool build status
|
||||
|
||||
firmware_tool-build-CREATING_BUILD_FOLDER = cweatin da bild fowdew
|
||||
firmware_tool-build-BUILDING = bildin da fiwmwawe
|
||||
firmware_tool-build-SAVING = savin da bild
|
||||
firmware_tool-build-DONE = bild compwete!
|
||||
firmware_tool-build-ERROR = unabwe to bild da fiwmwawe...
|
||||
|
||||
## Firmware update status
|
||||
|
||||
firmware_update-status-DOWNLOADING = downwoadin da fiwmwawe
|
||||
firmware_update-status-AUTHENTICATING = awthenticatin wit da mcu
|
||||
firmware_update-status-UPLOADING = upwoadin da fiwmwawe
|
||||
firmware_update-status-SYNCING_WITH_MCU = syncin wit da mcu
|
||||
firmware_update-status-REBOOTING = appwyin da uwupdate
|
||||
firmware_update-status-PROVISIONING = settin da wifi cwedenshuls
|
||||
firmware_update-status-DONE = uwupdate compwete!!
|
||||
firmware_update-status-ERROR_DEVICE_NOT_FOUND = culd nawt find da dewice
|
||||
firmware_update-status-ERROR_TIMEOUT = da uwupdate pwocess timed owt
|
||||
firmware_update-status-ERROR_DOWNLOAD_FAILED = culd nawt downwoad da fiwmwawe
|
||||
firmware_update-status-ERROR_AUTHENTICATION_FAILED = culd nawt awthenticate wit da mcu
|
||||
firmware_update-status-ERROR_UPLOAD_FAILED = culd nawt upwoad da fiwmwawe
|
||||
firmware_update-status-ERROR_PROVISIONING_FAILED = culd nawt set da wifi cwedenshuls
|
||||
firmware_update-status-ERROR_UNSUPPORTED_METHOD = da uwupdate mefod is nawt suppowted
|
||||
firmware_update-status-ERROR_UNKNOWN = unyown ewwow
|
||||
|
||||
## Dedicated Firmware Update Page
|
||||
|
||||
firmware_update-title = fiwmwawe uwupdate
|
||||
firmware_update-devices = avaiwabwe dewices
|
||||
firmware_update-devices-description = pwease sewect da twackews u want to uwupdate to da latest vershun of swimevr fiwmwawe
|
||||
firmware_update-no_devices = pwease make suwe dat da twackews u want to uwupdate r AWN an conecced to da wifi!
|
||||
firmware_update-changelog-title = uwupdatin to { $version }
|
||||
firmware_update-looking_for_devices = lookin fow dewices to uwupdate...
|
||||
firmware_update-retry = wetwy
|
||||
firmware_update-update = uwupdate sewected twackews
|
||||
firmware_update-exit = exit
|
||||
|
||||
## Tray Menu
|
||||
|
||||
tray_menu-show = show
|
||||
@@ -1032,3 +1216,9 @@ unknown_device-modal-description =
|
||||
d-do u wanna conect it to SwimeVR?
|
||||
unknown_device-modal-confirm = sure!!
|
||||
unknown_device-modal-forget = ignowe it
|
||||
|
||||
## Error collection consent modal
|
||||
|
||||
|
||||
## Tracking checklist section
|
||||
|
||||
|
||||