Compare commits
1070 Commits
v0.11.0
...
hannah/ins
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f28b5a3a26 | ||
|
|
13aabd74da | ||
|
|
9957abb658 | ||
|
|
41ef425869 | ||
|
|
517e76b6df | ||
|
|
77a203c6bc | ||
|
|
bd9ea99087 | ||
|
|
242cdd460f | ||
|
|
5f648731d7 | ||
|
|
bcda3ac222 | ||
|
|
e7dc16ecef | ||
|
|
d0bf170a75 | ||
|
|
d3be840591 | ||
|
|
34d35fa6fd | ||
|
|
1372632ece | ||
|
|
6322fac922 | ||
|
|
d8900d7589 | ||
|
|
7bcdd6887b | ||
|
|
1f97b49a20 | ||
|
|
3873eb5519 | ||
|
|
e2a665d4ce | ||
|
|
e2ff92ef9e | ||
|
|
acb3873f84 | ||
|
|
28deb357da | ||
|
|
5954f9c942 | ||
|
|
84806c44db | ||
|
|
24b2c8722b | ||
|
|
2dd8fd9667 | ||
|
|
f2243d355c | ||
|
|
e4fc57a0a6 | ||
|
|
24fe01e7b9 | ||
|
|
0f866c49c5 | ||
|
|
4053052829 | ||
|
|
5ab3075a61 | ||
|
|
215228551d | ||
|
|
d58d6f8eec | ||
|
|
f765ef0e4a | ||
|
|
a5bee8772c | ||
|
|
c956e5d1cb | ||
|
|
865ffc5543 | ||
|
|
25e771f4f5 | ||
|
|
74628d215a | ||
|
|
f19f5cbe51 | ||
|
|
711d0cae63 | ||
|
|
60321891b8 | ||
|
|
b89a290ac9 | ||
|
|
c4d0fe59fd | ||
|
|
58a9d3b6eb | ||
|
|
a3314fa4f9 | ||
|
|
778e0bde56 | ||
|
|
398e96404d | ||
|
|
be476fe04f | ||
|
|
f2223e5839 | ||
|
|
248f1a6dc9 | ||
|
|
5a6ef6dee5 | ||
|
|
ba5adca358 | ||
|
|
67f1ac7684 | ||
|
|
636514361d | ||
|
|
4d93f87a01 | ||
|
|
63d36db15e | ||
|
|
5d7c65e89b | ||
|
|
9b8073153a | ||
|
|
ada87ff15b | ||
|
|
7b40b8d315 | ||
|
|
0f1a19e04b | ||
|
|
d1387508e6 | ||
|
|
50a2be81f7 | ||
|
|
29598583a9 | ||
|
|
e83adadf1f | ||
|
|
87699438b4 | ||
|
|
bfea8026a4 | ||
|
|
d1cf5dee24 | ||
|
|
b90f52ad7b | ||
|
|
af917d7158 | ||
|
|
2d7877742c | ||
|
|
f3d05e9867 | ||
|
|
802b011a4a | ||
|
|
971dd2c43f | ||
|
|
88adfce242 | ||
|
|
3d02795dbc | ||
|
|
a1205d398a | ||
|
|
185c82a2b4 | ||
|
|
66e6066558 | ||
|
|
604639680f | ||
|
|
da3249849a | ||
|
|
cb3989004c | ||
|
|
544993d535 | ||
|
|
d7945be91a | ||
|
|
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 | ||
|
|
3bbf5cb3e3 | ||
|
|
26ec95b2a7 | ||
|
|
7cb500abef | ||
|
|
16779364c9 | ||
|
|
e058c69192 | ||
|
|
99a4141a7d | ||
|
|
5d65b807ef | ||
|
|
9cacf993ad | ||
|
|
8f9e83c231 | ||
|
|
a0b1abed43 | ||
|
|
066760bf79 | ||
|
|
a2d842d8cc | ||
|
|
ca13ca5fb4 | ||
|
|
33a213f10f | ||
|
|
1a6560a9cf | ||
|
|
449c6f80dc | ||
|
|
1a88eba476 | ||
|
|
8d55440dbd | ||
|
|
8da5d84e0a | ||
|
|
027e6549b6 | ||
|
|
95c8c08f86 | ||
|
|
ba3a2ce125 | ||
|
|
ed34001962 | ||
|
|
1dae302b27 | ||
|
|
505a9fc5d5 | ||
|
|
c58209a140 | ||
|
|
15264526ce | ||
|
|
136434e5c7 | ||
|
|
27244ff974 | ||
|
|
aadf38d2a9 | ||
|
|
439f60b89e | ||
|
|
21f4468c00 | ||
|
|
00f46f01b1 | ||
|
|
af8e6fc3f3 | ||
|
|
28d4199f12 | ||
|
|
0c309da528 | ||
|
|
3c765dbd8a | ||
|
|
eb9928ad08 | ||
|
|
90dcf986f8 | ||
|
|
eb602df452 | ||
|
|
e157fe7ed5 | ||
|
|
e3e48d3b0f | ||
|
|
018056b728 | ||
|
|
d1b21f2f17 | ||
|
|
8eeaa62760 | ||
|
|
564e99c52c | ||
|
|
b483699cf0 | ||
|
|
7cea1c7b47 | ||
|
|
7c96ee89c1 | ||
|
|
1c867efe16 | ||
|
|
9371938a00 | ||
|
|
eeac1586f5 | ||
|
|
2c146169ac | ||
|
|
5c0d3e9932 | ||
|
|
384a0c2252 | ||
|
|
ec9845364d | ||
|
|
93944aad55 | ||
|
|
456485071b | ||
|
|
e2d268df2d | ||
|
|
2beb449171 | ||
|
|
49865f8e2e | ||
|
|
25f7d8fe95 | ||
|
|
62563ab1c2 | ||
|
|
9bec98f8f5 | ||
|
|
60f8db7079 | ||
|
|
b06f038777 | ||
|
|
1fba4e67ab | ||
|
|
1950a419a8 | ||
|
|
9238c7211b | ||
|
|
518fe8d2ef | ||
|
|
8b97c0eb27 | ||
|
|
9bf7f1fa5c | ||
|
|
4abd171efc | ||
|
|
af4f9a96bf | ||
|
|
58ca3fe8c1 | ||
|
|
0859abf08d | ||
|
|
b32e1cad50 | ||
|
|
c2566afa5e | ||
|
|
7a9a23c3d4 | ||
|
|
76b29c4af6 | ||
|
|
0be9b34320 | ||
|
|
0b01a4d67a | ||
|
|
c316313d2a | ||
|
|
d8695d3e88 | ||
|
|
6e942780de | ||
|
|
0d9f9289fb | ||
|
|
a6d0517a5b | ||
|
|
708135ff4c | ||
|
|
1f434e1c88 | ||
|
|
7ab8435595 | ||
|
|
94aec1f4ba | ||
|
|
6a268fbbad | ||
|
|
5ade5eb626 | ||
|
|
63384f40b5 | ||
|
|
d9da5544bb | ||
|
|
cfd9223390 | ||
|
|
a135ca3459 | ||
|
|
9bcccc6c36 | ||
|
|
00ef667c58 | ||
|
|
fbb0b8a460 | ||
|
|
6626cabeaa | ||
|
|
d23c92dec2 | ||
|
|
1356e7fbe6 | ||
|
|
ec2909406b | ||
|
|
37de960c1b | ||
|
|
638d4e3fb1 | ||
|
|
a6f377992d | ||
|
|
27386d5b29 | ||
|
|
d67acf6c28 | ||
|
|
4471aaaa49 | ||
|
|
a3faad4a72 | ||
|
|
4e4edc24da | ||
|
|
e64edb76dd | ||
|
|
721a74aacc | ||
|
|
775f5e9f30 | ||
|
|
6ca2eb6905 | ||
|
|
9808ea8709 | ||
|
|
e2a511b552 | ||
|
|
2d55672f0a | ||
|
|
74ee8211a3 | ||
|
|
18fcb80d4c | ||
|
|
046be5f5e7 | ||
|
|
91a31b399d | ||
|
|
6d014912c4 | ||
|
|
8c0c3d1053 | ||
|
|
24f2895238 | ||
|
|
c901d80915 | ||
|
|
8b52d0f135 | ||
|
|
3d88dcd974 | ||
|
|
9041b4c35e | ||
|
|
804ca64d29 | ||
|
|
530315ff06 | ||
|
|
86b3aec926 | ||
|
|
7f920c1db3 | ||
|
|
369a3496ec | ||
|
|
55af27e59e | ||
|
|
eade92acee | ||
|
|
923e203f1c | ||
|
|
f252e602bc | ||
|
|
abeedf2a87 | ||
|
|
dec1091587 | ||
|
|
9ca6d54d25 | ||
|
|
eb362c135b | ||
|
|
a75aa8cd78 | ||
|
|
6896f9f3e2 | ||
|
|
827e2ceef8 | ||
|
|
ae4391bff1 | ||
|
|
be76cd1b6f | ||
|
|
884424c7b4 | ||
|
|
e0d3224393 | ||
|
|
d992cd3f63 | ||
|
|
fde8ccd821 | ||
|
|
ed9a590296 | ||
|
|
4f1d333f38 | ||
|
|
ce6940dd39 | ||
|
|
c3d97a9463 | ||
|
|
bcf66145c2 | ||
|
|
cfd7bc366e | ||
|
|
f9c077e78b | ||
|
|
5471f5ec40 | ||
|
|
b639523228 | ||
|
|
b310cf0e0e | ||
|
|
7df8c5d858 | ||
|
|
78caab1cd4 | ||
|
|
be9166881a | ||
|
|
29442688d4 | ||
|
|
fc5f3c1a35 | ||
|
|
8a88721924 | ||
|
|
1aa8679c08 | ||
|
|
3d51d77e27 | ||
|
|
8c74e98187 | ||
|
|
aefaa6598d | ||
|
|
f391b558c9 | ||
|
|
ea28baeef9 | ||
|
|
f5f40f496b | ||
|
|
297022fb3f | ||
|
|
f402b22d74 | ||
|
|
a8557474cb | ||
|
|
d53de4a793 | ||
|
|
81aacdde83 | ||
|
|
762290b1e3 | ||
|
|
3425be64ac | ||
|
|
673344baf9 | ||
|
|
ee7d6a8bc0 | ||
|
|
552451cb98 | ||
|
|
a74d5aa273 | ||
|
|
21576aff63 | ||
|
|
908e220b23 | ||
|
|
7d0d64418d | ||
|
|
f80ca11947 | ||
|
|
7f75f4a44c | ||
|
|
1dd1d14d16 | ||
|
|
d3f90b8404 | ||
|
|
d9955d10e3 | ||
|
|
a9b1df8851 | ||
|
|
7b04f536d0 | ||
|
|
fcef02e8f2 | ||
|
|
694d3fa363 | ||
|
|
3f6a26f7d8 | ||
|
|
990cd1d6f2 | ||
|
|
6ac320352b | ||
|
|
ae1b60da5d | ||
|
|
aaa5c2ba48 |
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
|
||||
|
||||
5
.gitattributes
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
* text=auto
|
||||
|
||||
*.png binary
|
||||
*.webp binary
|
||||
*.gif binary
|
||||
67
.github/CODEOWNERS
vendored
@@ -1,30 +1,37 @@
|
||||
# Global code owner
|
||||
* @Eirenliel
|
||||
|
||||
# Make Loucas and Uriel the owners of all GUI stuff
|
||||
/gui/ @loucass003 @ImUrX
|
||||
/package-lock.json @loucass003 @ImUrX
|
||||
|
||||
# Uriel and Erimel responsible for i18n
|
||||
/gui/public/i18n/ @ImUrX @Louka3000
|
||||
/gui/src/i18n/ @ImUrX @Louka3000
|
||||
/l10n.toml @ImUrX @Louka3000
|
||||
|
||||
/gui/src/components/settings/ @Louka3000 @loucass003 @ImUrX
|
||||
|
||||
# Rust part of the GUI
|
||||
/gui/src-tauri/ @ImUrX
|
||||
/Cargo.lock @ImUrX
|
||||
|
||||
# Some server code~
|
||||
/server/ @ButterscotchV @Eirenliel @Louka3000
|
||||
|
||||
/server/src/main/java/dev/slimevr/autobone/ @ButterscotchV
|
||||
/server/src/main/java/dev/slimevr/poserecorder/ @ButterscotchV
|
||||
/server/src/main/java/dev/slimevr/posestreamer/ @ButterscotchV
|
||||
|
||||
/server/src/main/java/dev/slimevr/osc/ @Louka3000
|
||||
/server/src/main/java/dev/slimevr/tracking/processor/ @Louka3000
|
||||
/server/src/main/java/dev/slimevr/filtering/ @Louka3000
|
||||
|
||||
server/src/main/java/dev/slimevr/config/ @loucass003
|
||||
# Global code owner
|
||||
* @Eirenliel
|
||||
|
||||
# Make everyone be able to approve SolarXR submodule changes
|
||||
/solarxr-protocol @ButterscotchV @Erimelowo @loucass003
|
||||
|
||||
# Make Loucass the owner of all GUI stuff
|
||||
/gui/ @loucass003
|
||||
/pnpm-lock.yaml @loucass003
|
||||
/pnpm-workspace.yaml @loucass003
|
||||
|
||||
# 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 @loucass003
|
||||
|
||||
# Rust part of the GUI
|
||||
/gui/electron/ @loucass003
|
||||
|
||||
# Some server code~
|
||||
/server/ @ButterscotchV @Eirenliel @Erimelowo
|
||||
|
||||
/server/src/main/java/dev/slimevr/autobone/ @ButterscotchV
|
||||
/server/src/main/java/dev/slimevr/poserecorder/ @ButterscotchV
|
||||
/server/src/main/java/dev/slimevr/posestreamer/ @ButterscotchV
|
||||
|
||||
/server/src/main/java/dev/slimevr/osc/ @Erimelowo
|
||||
/server/src/main/java/dev/slimevr/tracking/processor/ @Erimelowo
|
||||
/server/src/main/java/dev/slimevr/filtering/ @Erimelowo
|
||||
|
||||
# Linux files
|
||||
*.nix @loucass003
|
||||
/flake.lock @loucass003
|
||||
/dev.slimevr.SlimeVR.metainfo.xml @loucass003
|
||||
/.envrc @loucass003
|
||||
|
||||
8
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
version: 2
|
||||
updates:
|
||||
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
schedule:
|
||||
# Check for updates to GitHub Actions every week
|
||||
interval: "weekly"
|
||||
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*"]
|
||||
88
.github/workflows/build-gui.yml
vendored
@@ -21,90 +21,82 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v3
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'npm'
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
npm ci
|
||||
pnpm i
|
||||
cd gui
|
||||
npm run lint
|
||||
pnpm run lint
|
||||
|
||||
build:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ubuntu-22.04, windows-latest, macos-latest]
|
||||
os:
|
||||
[
|
||||
ubuntu-22.04,
|
||||
windows-latest,
|
||||
macos-latest,
|
||||
ubuntu-22.04-arm,
|
||||
windows-11-arm,
|
||||
]
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
env:
|
||||
# Don't mark warnings as errors
|
||||
CI: false
|
||||
BUILD_ARCH: ${{ endsWith(matrix.os, 'arm') && 'aarch64' || 'amd64' }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v6
|
||||
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 }}"
|
||||
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v3
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'npm'
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Install dependencies
|
||||
shell: bash
|
||||
run: pnpm i
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
npm ci
|
||||
npm run skipbundler
|
||||
shell: bash
|
||||
env:
|
||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||
NODE_OPTIONS: ${{ matrix.os == 'macos-latest' && '--max-old-space-size=4096' || '' }}
|
||||
run: cd gui && pnpm run build
|
||||
|
||||
- if: matrix.os == 'windows-latest'
|
||||
- if: startsWith(matrix.os, 'windows')
|
||||
name: Upload a Build Artifact (Windows)
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
# Artifact name
|
||||
name: SlimeVR-GUI-Windows
|
||||
# A file, directory or wildcard pattern that describes what to upload
|
||||
path: target/release/slimevr.exe
|
||||
name: ${{ format('SlimeVR-GUI-Windows-{0}', env.BUILD_ARCH) }}
|
||||
path: gui/out/renderer/**/*
|
||||
|
||||
- if: matrix.os == 'ubuntu-22.04'
|
||||
- if: startsWith(matrix.os, 'ubuntu')
|
||||
name: Upload a Build Artifact (Linux)
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
# Artifact name
|
||||
name: SlimeVR-GUI-Linux
|
||||
# A file, directory or wildcard pattern that describes what to upload
|
||||
path: target/release/slimevr
|
||||
name: ${{ format('SlimeVR-GUI-Linux-{0}', env.BUILD_ARCH) }}
|
||||
path: gui/out/renderer/**/*
|
||||
|
||||
- if: matrix.os == 'macos-latest'
|
||||
name: Upload a Build Artifact (macOS)
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
# Artifact name
|
||||
name: SlimeVR-GUI-macOS
|
||||
# A file, directory or wildcard pattern that describes what to upload
|
||||
path: target/release/slimevr
|
||||
path: gui/out/renderer/**/*
|
||||
|
||||
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 }}
|
||||
297
.github/workflows/gradle.yaml
vendored
@@ -19,7 +19,7 @@ jobs:
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
@@ -27,15 +27,15 @@ jobs:
|
||||
run: git fetch --tags origin --recurse-submodules=no --force
|
||||
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v3
|
||||
uses: actions/setup-java@v5
|
||||
with:
|
||||
java-version: "17"
|
||||
distribution: "adopt"
|
||||
java-version: '17'
|
||||
distribution: 'adopt'
|
||||
|
||||
- name: Setup Gradle
|
||||
uses: gradle/gradle-build-action@v2
|
||||
uses: gradle/actions/setup-gradle@v5
|
||||
|
||||
- run: mkdir ./gui/dist && touch ./gui/dist/somefile
|
||||
- run: mkdir -p ./gui/out/renderer && touch ./gui/out/renderer/somefile
|
||||
shell: bash
|
||||
|
||||
- name: Check code formatting
|
||||
@@ -44,12 +44,11 @@ jobs:
|
||||
- name: Test with Gradle
|
||||
run: ./gradlew test
|
||||
|
||||
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
@@ -57,39 +56,38 @@ jobs:
|
||||
run: git fetch --tags origin --recurse-submodules=no --force
|
||||
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v3
|
||||
uses: actions/setup-java@v5
|
||||
with:
|
||||
java-version: "17"
|
||||
distribution: "adopt"
|
||||
java-version: '17'
|
||||
distribution: 'adopt'
|
||||
|
||||
- name: Setup Gradle
|
||||
uses: gradle/gradle-build-action@v2
|
||||
uses: gradle/actions/setup-gradle@v5
|
||||
|
||||
- name: Build with Gradle
|
||||
run: ./gradlew shadowJar
|
||||
run: ./gradlew :server:desktop:shadowJar
|
||||
|
||||
- name: Upload the Server JAR as a Build Artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
# Artifact name
|
||||
name: "SlimeVR-Server" # optional, default is artifact
|
||||
name: 'SlimeVR-Server' # optional, default is artifact
|
||||
# A file, directory or wildcard pattern that describes what to upload
|
||||
path: server/desktop/build/libs/*
|
||||
path: server/desktop/build/libs/slimevr.jar
|
||||
|
||||
- name: Upload to draft release
|
||||
uses: softprops/action-gh-release@v1
|
||||
uses: softprops/action-gh-release@v2
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
with:
|
||||
draft: true
|
||||
generate_release_notes: true
|
||||
files: |
|
||||
server/desktop/build/libs/*
|
||||
|
||||
server/desktop/build/libs/slimevr.jar
|
||||
|
||||
bundle-android:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
@@ -97,43 +95,52 @@ jobs:
|
||||
run: git fetch --tags origin --recurse-submodules=no --force
|
||||
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v3
|
||||
uses: actions/setup-java@v5
|
||||
with:
|
||||
java-version: "17"
|
||||
distribution: "adopt"
|
||||
java-version: '17'
|
||||
distribution: 'adopt'
|
||||
|
||||
- name: Setup Gradle
|
||||
uses: gradle/gradle-build-action@v2
|
||||
uses: gradle/actions/setup-gradle@v5
|
||||
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v3
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'npm'
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm i
|
||||
|
||||
- name: Build GUI
|
||||
run: |
|
||||
npm ci
|
||||
cd gui && npm run build
|
||||
env:
|
||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||
run: cd gui && pnpm run build
|
||||
|
||||
- name: Build with Gradle
|
||||
run: ./gradlew :server:android:assembleDebug
|
||||
run: ./gradlew :server:android:build
|
||||
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: Upload the Android Build Artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
- name: Upload the Android build artifact
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
# Artifact name
|
||||
name: "SlimeVR-Android" # optional, default is artifact
|
||||
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
|
||||
cp server/android/build/outputs/apk/release/android-release.apk ./SlimeVR-android.apk
|
||||
|
||||
- name: Upload to draft release
|
||||
uses: softprops/action-gh-release@v1
|
||||
uses: softprops/action-gh-release@v2
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
with:
|
||||
draft: true
|
||||
@@ -141,147 +148,164 @@ jobs:
|
||||
files: |
|
||||
./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/*
|
||||
|
||||
bundle-linux:
|
||||
runs-on: ubuntu-22.04
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-latest, ubuntu-24.04-arm]
|
||||
runs-on: ${{ matrix.os }}
|
||||
needs: [build, test]
|
||||
if: contains(fromJSON('["workflow_dispatch", "create"]'), github.event_name)
|
||||
|
||||
env:
|
||||
BUILD_ARCH: ${{ endsWith(matrix.os, 'arm') && 'aarch64' || 'amd64' }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- uses: actions/download-artifact@v3
|
||||
- uses: actions/download-artifact@v7
|
||||
with:
|
||||
name: "SlimeVR-Server"
|
||||
name: 'SlimeVR-Server'
|
||||
path: server/desktop/build/libs/
|
||||
|
||||
- name: Set up Linux dependencies
|
||||
uses: awalsh128/cache-apt-pkgs-action@latest
|
||||
uses: awalsh128/cache-apt-pkgs-action@v1.6.0
|
||||
with:
|
||||
packages: libgtk-3-dev webkit2gtk-4.1 libappindicator3-dev librsvg2-dev patchelf libfuse2
|
||||
packages: |
|
||||
build-essential curl wget file libssl-dev libgtk-3-dev libappindicator3-dev librsvg2-dev xdg-utils patchelf
|
||||
# Increment to invalidate the cache
|
||||
version: 1.0
|
||||
version: ${{ format('v2.0-electron-{0}', env.BUILD_ARCH) }}
|
||||
# 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@v3
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'npm'
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm i
|
||||
|
||||
- name: Build
|
||||
env:
|
||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||
run: |
|
||||
npm ci
|
||||
npm run tauri build
|
||||
cd gui
|
||||
pnpm run build
|
||||
pnpm exec electron-builder --linux --publish never
|
||||
|
||||
- uses: actions/upload-artifact@v3.1.0
|
||||
- name: Make GUI tarball
|
||||
run: |
|
||||
tar czf slimevr-gui-dist.tar.gz -C gui/out/renderer/ .
|
||||
|
||||
- uses: actions/upload-artifact@v6
|
||||
if: matrix.os == 'ubuntu-latest'
|
||||
with:
|
||||
name: SlimeVR-GUI-Deb
|
||||
path: target/release/bundle/deb/slimevr*.deb
|
||||
name: SlimeVR-GUI-Dist
|
||||
path: ./slimevr-gui-dist.tar.gz
|
||||
|
||||
- name: Install appimage-builder
|
||||
run: |
|
||||
wget "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage"
|
||||
chmod a+x appimagetool-x86_64.AppImage
|
||||
sudo mv appimagetool-x86_64.AppImage /usr/local/bin/appimagetool
|
||||
|
||||
- name: Modify and Build AppImage
|
||||
run: |
|
||||
cd target/release/bundle/appimage
|
||||
chmod a+x slimevr*.AppImage
|
||||
./slimevr*.AppImage --appimage-extract
|
||||
cp $( git rev-parse --show-toplevel )/server/desktop/build/libs/slimevr.jar squashfs-root/slimevr.jar
|
||||
chmod 644 squashfs-root/slimevr.jar
|
||||
appimagetool squashfs-root slimevr*.AppImage
|
||||
|
||||
- uses: actions/upload-artifact@v3.1.0
|
||||
- uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: SlimeVR-GUI-AppImage
|
||||
path: target/release/bundle/appimage/slimevr*.AppImage
|
||||
name: ${{ format('SlimeVR-GUI-Deb-{0}', env.BUILD_ARCH) }}
|
||||
path: gui/dist/artifacts/*.deb
|
||||
|
||||
- uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: ${{ format('SlimeVR-GUI-AppImage-{0}', env.BUILD_ARCH) }}
|
||||
path: gui/dist/artifacts/*.AppImage
|
||||
|
||||
- uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: ${{ format('SlimeVR-GUI-RPM-{0}', env.BUILD_ARCH) }}
|
||||
path: gui/dist/artifacts/*.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 gui/dist/artifacts/*.AppImage "./SlimeVR-$BUILD_ARCH.appimage"
|
||||
cp gui/dist/artifacts/*.deb "./SlimeVR-$BUILD_ARCH.deb"
|
||||
cp gui/dist/artifacts/*.rpm "./SlimeVR-$BUILD_ARCH.rpm"
|
||||
|
||||
- name: Upload to draft release
|
||||
uses: softprops/action-gh-release@v1
|
||||
uses: softprops/action-gh-release@v2
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
with:
|
||||
draft: true
|
||||
generate_release_notes: true
|
||||
files: |
|
||||
./SlimeVR-amd64.appimage
|
||||
./SlimeVR-amd64.deb
|
||||
|
||||
./slimevr-gui-dist.tar.gz
|
||||
./SlimeVR-*.appimage
|
||||
./SlimeVR-*.deb
|
||||
./SlimeVR-*.rpm
|
||||
|
||||
bundle-mac:
|
||||
runs-on: macos-latest
|
||||
needs: [build, test]
|
||||
if: contains(fromJSON('["workflow_dispatch", "create"]'), github.event_name)
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- uses: actions/download-artifact@v3
|
||||
- uses: actions/download-artifact@v7
|
||||
with:
|
||||
name: "SlimeVR-Server"
|
||||
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@v3
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'npm'
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
pnpm i
|
||||
|
||||
- name: Build
|
||||
env:
|
||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||
NODE_OPTIONS: --max-old-space-size=4096
|
||||
run: |
|
||||
npm ci
|
||||
npm run tauri build -- "--target universal-apple-darwin"
|
||||
cd gui
|
||||
pnpm run build
|
||||
pnpm exec electron-builder --mac --universal --publish never
|
||||
|
||||
- name: Modify Application
|
||||
run: |
|
||||
cd target/release/bundle/macos/slimevr.app/Contents/MacOS
|
||||
cp $( git rev-parse --show-toplevel )/server/desktop/build/libs/slimevr.jar ./
|
||||
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@v3.1.0
|
||||
with:
|
||||
name: SlimeVR-GUI-MacApp
|
||||
path: target/release/bundle/macos/slimevr*.app
|
||||
|
||||
- uses: actions/upload-artifact@v3.1.0
|
||||
- uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: SlimeVR-GUI-MacDmg
|
||||
path: target/release/bundle/dmg/slimevr.dmg
|
||||
path: gui/dist/artifacts/*.dmg
|
||||
|
||||
- name: Prepare for release
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
run: |
|
||||
cp target/release/bundle/dmg/slimevr.dmg ./SlimeVR-mac.dmg
|
||||
cp gui/dist/artifacts/*.dmg ./SlimeVR-mac.dmg
|
||||
|
||||
- name: Upload to draft release
|
||||
uses: softprops/action-gh-release@v1
|
||||
uses: softprops/action-gh-release@v2
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
with:
|
||||
draft: true
|
||||
@@ -289,61 +313,66 @@ jobs:
|
||||
files: |
|
||||
./SlimeVR-mac.dmg
|
||||
|
||||
|
||||
bundle-windows:
|
||||
runs-on: windows-latest
|
||||
strategy:
|
||||
matrix:
|
||||
os: [windows-latest, windows-11-arm]
|
||||
runs-on: ${{ matrix.os }}
|
||||
needs: [build, test]
|
||||
if: contains(fromJSON('["workflow_dispatch", "create"]'), github.event_name)
|
||||
|
||||
env:
|
||||
BUILD_ARCH: ${{ endsWith(matrix.os, 'arm') && 'win-aarch64' || 'win64' }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- uses: actions/download-artifact@v3
|
||||
- uses: actions/download-artifact@v7
|
||||
with:
|
||||
name: "SlimeVR-Server"
|
||||
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@v3
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'npm'
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Install dependencies
|
||||
shell: bash
|
||||
run: pnpm i
|
||||
|
||||
- name: Build
|
||||
shell: bash
|
||||
env:
|
||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||
run: |
|
||||
npm ci
|
||||
npm run skipbundler
|
||||
cd gui
|
||||
pnpm run build
|
||||
pnpm exec electron-builder --win portable --publish never
|
||||
|
||||
- name: Bundle to zips
|
||||
shell: bash
|
||||
run: |
|
||||
mkdir SlimeVR
|
||||
cp gui/src-tauri/icons/icon.ico ./SlimeVR/run.ico
|
||||
cp gui/dist/artifacts/*.exe ./SlimeVR/slimevr.exe
|
||||
cp gui/electron/resources/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/
|
||||
7z a -tzip "SlimeVR-$BUILD_ARCH.zip" ./SlimeVR/
|
||||
|
||||
mv ./SlimeVR/slimevr.exe ./SlimeVR/slimevr-ui.exe
|
||||
7z a -tzip SlimeVR.zip ./SlimeVR/
|
||||
|
||||
- uses: actions/upload-artifact@v3.1.0
|
||||
- uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: SlimeVR-GUI-Windows
|
||||
name: ${{ format('SlimeVR-GUI-Windows-{0}', env.BUILD_ARCH) }}
|
||||
path: ./SlimeVR*.zip
|
||||
|
||||
- name: Upload to draft release
|
||||
uses: softprops/action-gh-release@v1
|
||||
uses: softprops/action-gh-release@v2
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
with:
|
||||
draft: true
|
||||
generate_release_notes: true
|
||||
files: |
|
||||
./SlimeVR-win64.zip
|
||||
./SlimeVR.zip
|
||||
files: ./SlimeVR-*.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@v3
|
||||
- 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 🥺"
|
||||
|
||||
5
.github/workflows/rebase.yml
vendored
@@ -15,7 +15,7 @@ jobs:
|
||||
contents: write
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
ref: pontoon
|
||||
submodules: recursive
|
||||
@@ -24,7 +24,7 @@ jobs:
|
||||
- name: Rebase
|
||||
run: |
|
||||
git config --local user.name "slimevr-bot"
|
||||
git config --local user.email pantoon@slimevr.dev
|
||||
git config --local user.email 'pantoon@slimevr.dev'
|
||||
git fetch origin main
|
||||
git rebase origin/main
|
||||
git submodule update
|
||||
@@ -36,3 +36,4 @@ jobs:
|
||||
commit-message: "update"
|
||||
force-push: "true"
|
||||
name: "slimevr-bot"
|
||||
email: "pantoon@slimevr.dev"
|
||||
|
||||
13
.gitignore
vendored
@@ -17,6 +17,7 @@
|
||||
|
||||
# VSCode stuff
|
||||
/.vscode/settings.json
|
||||
/.vscode/launch.json
|
||||
|
||||
# Ignore eclipse stuff
|
||||
.project
|
||||
@@ -27,16 +28,22 @@
|
||||
/node_modules
|
||||
.husky
|
||||
|
||||
# kotlin stuff
|
||||
/.kotlin
|
||||
|
||||
# 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,6 +1,3 @@
|
||||
#!/usr/bin/env sh
|
||||
. "$(dirname -- "$0")/_/husky.sh"
|
||||
|
||||
YELLOW="\033[1;33m"
|
||||
GREEN="\033[1;32m"
|
||||
RESET="\033[0m"
|
||||
|
||||
@@ -1 +1 @@
|
||||
18.12.1
|
||||
22.17.0
|
||||
|
||||
2
.vscode/extensions.json
vendored
@@ -7,10 +7,10 @@
|
||||
"gaborv.flatbuffers",
|
||||
"dbaeumer.vscode-eslint",
|
||||
"esbenp.prettier-vscode",
|
||||
"rust-lang.rust-analyzer",
|
||||
"bradlc.vscode-tailwindcss",
|
||||
"EditorConfig.EditorConfig",
|
||||
"macabeus.vscode-fluent",
|
||||
"redhat.vscode-yaml"
|
||||
],
|
||||
// List of extensions recommended by VS Code that should not be recommended for users of this workspace.
|
||||
"unwantedRecommendations": []
|
||||
|
||||
@@ -6,9 +6,7 @@ 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+](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)
|
||||
- [Node.js v16.9+](https://nodejs.org) (We recommend the use of `nvm` instead of installing Node.js directly)
|
||||
|
||||
## Cloning the code
|
||||
First, clone the codebase using git in a terminal in the folder you want.
|
||||
@@ -32,12 +30,12 @@ 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)
|
||||
|
||||
- Run `npm install` in your IDE's terminal to download and install dependencies.
|
||||
- To launch the GUI in dev mode, run `npm run gui`.
|
||||
- Finally, to compile for production, run `npm run tauri build`. The result
|
||||
will be at `target/release/slimevr.exe`.
|
||||
- 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 build`. The result
|
||||
|
||||
## Code style
|
||||
|
||||
@@ -83,12 +81,12 @@ 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`.
|
||||
- To check code formatting, run `npm run lint`.
|
||||
- To fix code formatting, run `npm run lint:fix` and `npm run format`
|
||||
- To check code formatting, run `pnpm run lint`.
|
||||
- To fix code formatting, run `pnpm run lint:fix` and `pnpm run format`
|
||||
|
||||
Don't forget to run `cd ..` to return to the root directory.
|
||||
|
||||
@@ -104,6 +102,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,
|
||||
@@ -114,3 +113,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.
|
||||
|
||||
4978
Cargo.lock
generated
17
Cargo.toml
@@ -1,17 +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.65" # This version stabilized GATs and let-else
|
||||
repository = "https://github.com/SlimeVR/SlimeVR-Server"
|
||||
|
||||
[profile.release]
|
||||
lto = "thin"
|
||||
strip = "debuginfo" # Only affects Unix binaries with DWARF
|
||||
@@ -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*.
|
||||
@@ -1,3 +1,3 @@
|
||||
plugins {
|
||||
id("org.ajoberstar.grgit") version "5.2.0"
|
||||
id("org.ajoberstar.grgit")
|
||||
}
|
||||
|
||||
@@ -1,91 +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>An app for facilitating full-body tracking in virtual reality</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="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">#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">
|
||||
<caption>The onboarding for the GUI</caption>
|
||||
<image>https://raw.githubusercontent.com/SlimeVR/SlimeVR-Server/main/assets/img/onboarding.png</image>
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
<releases>
|
||||
<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>
|
||||
418
flake.lock
generated
@@ -1,444 +1,58 @@
|
||||
{
|
||||
"nodes": {
|
||||
"devenv": {
|
||||
"inputs": {
|
||||
"flake-compat": "flake-compat",
|
||||
"nix": "nix",
|
||||
"nixpkgs": "nixpkgs",
|
||||
"pre-commit-hooks": "pre-commit-hooks"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1697058441,
|
||||
"narHash": "sha256-gjtW+nkM9suMsjyid63HPmt6WZQEvuVqA5cOAf4lLM0=",
|
||||
"owner": "cachix",
|
||||
"repo": "devenv",
|
||||
"rev": "55294461a62d90c8626feca22f52b0d3d0e18e39",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "cachix",
|
||||
"repo": "devenv",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"fenix": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs_2",
|
||||
"rust-analyzer-src": "rust-analyzer-src"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1695709315,
|
||||
"narHash": "sha256-XKzbb4NqYmUVlORwjCT//RGeQiJa+6LuGYllpaLP5lQ=",
|
||||
"owner": "nix-community",
|
||||
"repo": "fenix",
|
||||
"rev": "f5845b16d889d8bf9930fe1098820074da4cbce9",
|
||||
"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": 1696343447,
|
||||
"narHash": "sha256-B2xAZKLkkeRFG5XcHHSXXcP7To9Xzr59KXeZiRf4vdQ=",
|
||||
"lastModified": 1762980239,
|
||||
"narHash": "sha256-8oNVE8TrD19ulHinjaqONf9QWCKK+w4url56cdStMpM=",
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"rev": "c9afaba3dfa4085dbd2ccb38dfade5141e33d9d4",
|
||||
"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_3"
|
||||
},
|
||||
"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": 1696019113,
|
||||
"narHash": "sha256-X3+DKYWJm93DRSdC5M6K5hLqzSya9BjibtBsuARoPco=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "f5892ddac112a1e9b3612c39af1b72987ee5783a",
|
||||
"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": 1695360818,
|
||||
"narHash": "sha256-JlkN3R/SSoMTa+CasbxS1gq+GpGxXQlNZRUh9+LIy/0=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "e35dcc04a3853da485a396bdd332217d0ac9054f",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs_3": {
|
||||
"locked": {
|
||||
"lastModified": 1695360818,
|
||||
"narHash": "sha256-JlkN3R/SSoMTa+CasbxS1gq+GpGxXQlNZRUh9+LIy/0=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "e35dcc04a3853da485a396bdd332217d0ac9054f",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs_4": {
|
||||
"locked": {
|
||||
"lastModified": 1697456312,
|
||||
"narHash": "sha256-roiSnrqb5r+ehnKCauPLugoU8S36KgmWraHgRqVYndo=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "ca012a02bf8327be9e488546faecae5e05d7d749",
|
||||
"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_4"
|
||||
}
|
||||
},
|
||||
"rust-analyzer-src": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1695642814,
|
||||
"narHash": "sha256-xR1+YaPcutqXN7BYYCyHPU8VVh/gjW+bVFTfA+vHpv0=",
|
||||
"owner": "rust-lang",
|
||||
"repo": "rust-analyzer",
|
||||
"rev": "d3cc3bc00e310ff49268ce0c593eaa6bf4724bbd",
|
||||
"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"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
162
flake.nix
@@ -1,137 +1,49 @@
|
||||
{
|
||||
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";
|
||||
nix2container.inputs.nixpkgs.follows = "nixpkgs";
|
||||
mk-shell-bin.url = "github:rrbutani/nix-mk-shell-bin";
|
||||
nixgl.url = "github:guibou/nixGL";
|
||||
fenix.url = "github:nix-community/fenix";
|
||||
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];
|
||||
wine
|
||||
zlib squashfsTools fakeroot libarchive icu
|
||||
nodejs_22 pnpm pkg-config python3 gcc gnumake binutils git
|
||||
]);
|
||||
|
||||
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.out
|
||||
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
|
||||
])
|
||||
++ 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-rLP8+fTxnPHoR96ZJiCa/5Ans1OojI7MLsmSqR2ip8o=";
|
||||
};
|
||||
components = rust_toolchain.toolchain.components;
|
||||
};
|
||||
|
||||
env = {
|
||||
GIO_EXTRA_MODULES = "${pkgs.glib-networking}/lib/gio/modules:${pkgs.dconf.lib}/lib/gio/modules";
|
||||
};
|
||||
|
||||
enterShell = with pkgs; ''
|
||||
'';
|
||||
};
|
||||
};
|
||||
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,7 +13,9 @@ android.useAndroidX=true
|
||||
android.nonTransitiveRClass=true
|
||||
org.gradle.unsafe.configuration-cache=false
|
||||
|
||||
kotlinVersion=1.9.0-RC
|
||||
spotlessVersion=6.12.0
|
||||
shadowJarVersion=8.1.1
|
||||
buildconfigVersion=3.1.0
|
||||
kotlinVersion=2.0.20
|
||||
spotlessVersion=8.0.0
|
||||
shadowJarVersion=8.3.2
|
||||
buildconfigVersion=5.5.0
|
||||
grgitVersion=5.2.2
|
||||
ktor_version=3.0.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.0.2-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip
|
||||
distributionSha256Sum=bd71102213493060956ec229d946beee57158dbd89d0e62b91bca0fa2c5f3531
|
||||
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"
|
||||
'**/*.{ts,tsx}': () => 'tsc -p tsconfig.json --noEmit',
|
||||
'src/**/*.{js,jsx,ts,tsx}': 'eslint --max-warnings=0 --no-warn-ignored --cache --fix',
|
||||
'**/*.{js,jsx,ts,tsx,css,scss,md,json}': 'prettier --write',
|
||||
};
|
||||
|
||||
57
gui/electron-builder.yml
Normal file
@@ -0,0 +1,57 @@
|
||||
appId: dev.slimevr.SlimeVR
|
||||
productName: SlimeVR
|
||||
directories:
|
||||
output: dist/artifacts
|
||||
|
||||
asar: true
|
||||
asarUnpack:
|
||||
- out/main/chunks/*.jar
|
||||
|
||||
electronLanguages:
|
||||
- en-US
|
||||
|
||||
files:
|
||||
- out/**/*
|
||||
- index.html
|
||||
- package.json
|
||||
- node_modules/**
|
||||
# Exclude unnecessary files from node_modules to reduce size
|
||||
- "!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
|
||||
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
|
||||
rpm:
|
||||
depends:
|
||||
- java-latest-openjdk
|
||||
- udev
|
||||
|
||||
win:
|
||||
target:
|
||||
- target: portable
|
||||
icon: "./electron/resources/icons/icon.ico"
|
||||
|
||||
mac:
|
||||
target: dmg
|
||||
extraFiles:
|
||||
- from: "../server/desktop/build/libs/slimevr.jar"
|
||||
to: "."
|
||||
icon: "./electron/resources/icons/icon.icns"
|
||||
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();
|
||||
425
gui/electron/main/index.ts
Normal file
@@ -0,0 +1,425 @@
|
||||
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/appleTrayIcon.png?asset';
|
||||
import { readFile, stat } from 'fs/promises';
|
||||
import { getPlatform, handleIpc, isPortAvailable } from './utils';
|
||||
import {
|
||||
findServerJar,
|
||||
findSystemJRE,
|
||||
getGuiDataFolder,
|
||||
getLogsFolder,
|
||||
getExeFolder,
|
||||
getServerDataFolder,
|
||||
getWindowStateFile,
|
||||
} from './paths';
|
||||
import { stores } from './store';
|
||||
import { 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';
|
||||
|
||||
// Register custom protocol to handle asset paths with leading slashes
|
||||
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 allowsd_urls = [
|
||||
/steam:\/\/.*/,
|
||||
/ms-settings:network$/,
|
||||
/https:\/\/.*\.slimevr\.dev.*/,
|
||||
/https:\/\/github\.com\/.*/,
|
||||
/https:\/\/discord\.gg\/slimevr$/,
|
||||
];
|
||||
if (allowsd_urls.find((a) => url.match(a))) open(url);
|
||||
else logger.error({ url }, 'trying to open non allowed 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();
|
||||
case 'exe':
|
||||
return getExeFolder();
|
||||
}
|
||||
});
|
||||
|
||||
const windowStateFile = await readFile(getWindowStateFile(), {
|
||||
encoding: 'utf-8',
|
||||
}).catch(() => null);
|
||||
|
||||
const defaultWindowState: {
|
||||
width: number;
|
||||
height: number;
|
||||
x?: number;
|
||||
y?: number;
|
||||
minimized: boolean;
|
||||
} = {
|
||||
width: 1289.0,
|
||||
height: 709.0,
|
||||
x: undefined,
|
||||
y: undefined,
|
||||
minimized: false,
|
||||
};
|
||||
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;
|
||||
}
|
||||
|
||||
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,
|
||||
},
|
||||
});
|
||||
|
||||
if (windowState.minimized) {
|
||||
mainWindow.minimize();
|
||||
}
|
||||
|
||||
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 '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);
|
||||
}
|
||||
|
||||
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.exit(0);
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
const isServerRunning = async () => !await isPortAvailable(21110)
|
||||
|
||||
const spawnServer = async () => {
|
||||
if (options.skipServerIfRunning && await isServerRunning()) {
|
||||
logger.info({ skipServerIfRunning: options.skipServerIfRunning }, 'Server alredy running, skipping');
|
||||
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.exit(0);
|
||||
return;
|
||||
}
|
||||
|
||||
logger.info({ serverJar }, 'found server jar');
|
||||
|
||||
|
||||
const process = spawn(javaBin, ['-Xmx128M', '-jar', serverJar, 'run']);
|
||||
|
||||
process.stdout?.on('data', (message) => {
|
||||
mainWindow?.webContents.send(IPC_CHANNELS.SERVER_STATUS, {
|
||||
message: message.toString(),
|
||||
type: 'stdout'
|
||||
} satisfies ServerStatusEvent)
|
||||
});
|
||||
|
||||
process.stderr?.on('data', (message) => {
|
||||
mainWindow?.webContents.send(IPC_CHANNELS.SERVER_STATUS, {
|
||||
message: message.toString(),
|
||||
type: 'stderr'
|
||||
} satisfies ServerStatusEvent)
|
||||
});
|
||||
|
||||
return {
|
||||
process: process,
|
||||
close: () => {
|
||||
process.kill('SIGTERM');
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
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', () => {
|
||||
if (process.platform !== 'darwin') {
|
||||
app.quit();
|
||||
}
|
||||
});
|
||||
|
||||
process.on('exit', () => {
|
||||
server?.close();
|
||||
})
|
||||
|
||||
app.on('before-quit', () => {
|
||||
logger.info('App quitting, saving...');
|
||||
server?.close();
|
||||
stores.settings.save();
|
||||
stores.cache.save();
|
||||
|
||||
discordPresence.destroy();
|
||||
|
||||
writeFileSync(getWindowStateFile(), JSON.stringify(windowState));
|
||||
});
|
||||
});
|
||||
26
gui/electron/main/logger.ts
Normal file
@@ -0,0 +1,26 @@
|
||||
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);
|
||||
125
gui/electron/main/paths.ts
Normal file
@@ -0,0 +1,125 @@
|
||||
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 getExeFolder = () => {
|
||||
return path.dirname(app.getPath('exe'));
|
||||
}
|
||||
|
||||
export const getWindowStateFile = () =>
|
||||
join(getGuiDataFolder(), '.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);
|
||||
console.log(javaHomeJre);
|
||||
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,
|
||||
// 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'),
|
||||
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),
|
||||
getInstallDir: () => ipcRenderer.invoke(IPC_CHANNELS.GET_FOLDER, 'exe')
|
||||
} 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;
|
||||
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;
|
||||
getInstallDir: () => Promise<string>;
|
||||
}
|
||||
|
||||
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 |
BIN
gui/electron/resources/icons/appleTrayIcon.png
Normal file
|
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);
|
||||
}
|
||||
}
|
||||
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') => 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' | 'exe') => 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;
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
<link rel="manifest" href="/manifest.json" />
|
||||
|
||||
<title>React App</title>
|
||||
<title>SlimeVR GUI</title>
|
||||
</head>
|
||||
<body>
|
||||
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||
|
||||
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,
|
||||
});
|
||||
},
|
||||
},
|
||||
});
|
||||
200
gui/package.json
@@ -1,104 +1,112 @@
|
||||
{
|
||||
"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": {
|
||||
"@fluent/bundle": "^0.17.1",
|
||||
"@fluent/react": "^0.14.1",
|
||||
"@fontsource/poppins": "^4.5.8",
|
||||
"@formatjs/intl-localematcher": "^0.2.32",
|
||||
"@react-three/drei": "^9.80.3",
|
||||
"@react-three/fiber": "^8.13.6",
|
||||
"@tauri-apps/api": "=2.0.0-alpha.8",
|
||||
"@tauri-apps/plugin-app": "=2.0.0-alpha.1",
|
||||
"@tauri-apps/plugin-dialog": "=2.0.0-alpha.1",
|
||||
"@tauri-apps/plugin-fs": "=2.0.0-alpha.1",
|
||||
"@tauri-apps/plugin-os": "=2.0.0-alpha.2",
|
||||
"@tauri-apps/plugin-shell": "=2.0.0-alpha.1",
|
||||
"@tauri-apps/plugin-window": "=2.0.0-alpha.1",
|
||||
"@vitejs/plugin-react": "^3.0.0",
|
||||
"browser-fs-access": "^0.34.1",
|
||||
"browserslist": "^4.18.1",
|
||||
"classnames": "^2.3.1",
|
||||
"eslint-config-react-app": "^7.0.0",
|
||||
"flatbuffers": "^22.10.26",
|
||||
"identity-obj-proxy": "^3.0.0",
|
||||
"intl-pluralrules": "^1.3.1",
|
||||
"ip-num": "^1.4.1",
|
||||
"postcss-flexbugs-fixes": "^5.0.2",
|
||||
"postcss-normalize": "^10.0.1",
|
||||
"postcss-preset-env": "^7.0.1",
|
||||
"prompts": "^2.4.2",
|
||||
"react": "^18.0.0",
|
||||
"react-dev-utils": "^12.0.0",
|
||||
"react-dom": "^18.0.0",
|
||||
"react-helmet": "^6.1.0",
|
||||
"react-hook-form": "^7.29.0",
|
||||
"react-modal": "^3.15.1",
|
||||
"react-responsive": "^9.0.2",
|
||||
"react-router-dom": "^6.2.2",
|
||||
"semver": "^7.5.3",
|
||||
"solarxr-protocol": "file:../solarxr-protocol",
|
||||
"three": "^0.155.0",
|
||||
"ts-pattern": "^5.0.1",
|
||||
"typescript": "^5.1.6"
|
||||
"@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",
|
||||
"build": "vite build",
|
||||
"dev": "tauri dev",
|
||||
"skipbundler": "tauri build -b none",
|
||||
"tauri": "tauri",
|
||||
"lint": "tsc --noEmit && eslint --max-warnings=0 \"src/**/*.{js,jsx,ts,tsx,json}\" && prettier --check \"src/**/*.{js,jsx,ts,tsx,css,md,json}\"",
|
||||
"lint:fix": "tsc --noEmit && eslint --fix --max-warnings=0 \"src/**/*.{js,jsx,ts,tsx,json}\" && npm run format",
|
||||
"format": "prettier --write \"src/**/*.{js,jsx,ts,tsx,css,md,json}\"",
|
||||
"preview-vite": "vite preview",
|
||||
"javaversion-build": "cd src-tauri/src/ && javac JavaVersion.java && jar cvfe JavaVersion.jar JavaVersion JavaVersion.class"
|
||||
},
|
||||
"eslintConfig": {
|
||||
"extends": [
|
||||
"react-app"
|
||||
]
|
||||
},
|
||||
"browserslist": {
|
||||
"production": [
|
||||
">0.2%",
|
||||
"not dead",
|
||||
"not op_mini all"
|
||||
],
|
||||
"development": [
|
||||
"last 1 chrome version",
|
||||
"last 1 firefox version",
|
||||
"last 1 safari version"
|
||||
]
|
||||
"gui": "electron-vite dev --config electron.vite.config.ts --watch",
|
||||
"build": "electron-vite build --config electron.vite.config.ts",
|
||||
"package": "pnpm run build && electron-builder",
|
||||
"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.8",
|
||||
"@tailwindcss/forms": "^0.5.3",
|
||||
"@tauri-apps/cli": "=2.0.0-alpha.17",
|
||||
"@types/file-saver": "^2.0.5",
|
||||
"@types/react": "^18.0.25",
|
||||
"@types/react-dom": "^18.0.5",
|
||||
"@types/react-helmet": "^6.1.6",
|
||||
"@types/react-modal": "3.13.1",
|
||||
"@types/three": "^0.155.0",
|
||||
"@typescript-eslint/eslint-plugin": "^5.60.1",
|
||||
"@typescript-eslint/parser": "^5.60.1",
|
||||
"autoprefixer": "^10.4.4",
|
||||
"cross-env": "^7.0.3",
|
||||
"eslint": "^8.44.0",
|
||||
"eslint-config-airbnb": "^19.0.4",
|
||||
"eslint-import-resolver-typescript": "^3.5.5",
|
||||
"eslint-plugin-import": "^2.27.5",
|
||||
"eslint-plugin-jsx-a11y": "^6.7.1",
|
||||
"eslint-plugin-react": "^7.32.2",
|
||||
"eslint-plugin-react-hooks": "^4.6.0",
|
||||
"postcss": "^8.4.31",
|
||||
"prettier": "^2.8.8",
|
||||
"pretty-quick": "^3.1.3",
|
||||
"rollup-plugin-visualizer": "^5.9.2",
|
||||
"tailwind-gradient-mask-image": "^1.0.0",
|
||||
"tailwindcss": "^3.3.2",
|
||||
"vite": "^4.3.9"
|
||||
}
|
||||
"@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",
|
||||
"@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",
|
||||
"@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": "^8.48.1",
|
||||
"@typescript-eslint/parser": "^8.48.1",
|
||||
"@vitejs/plugin-react": "^4.3.2",
|
||||
"ajv": "^8.17.1",
|
||||
"autoprefixer": "^10.4.20",
|
||||
"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",
|
||||
"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
|
||||
|
||||
@@ -23,6 +28,11 @@ tips-find_tracker = لست متأكد من أجهزة التعقب؟ قم بتح
|
||||
tips-do_not_move_heels = يرجى عدم تحريك كاحليك أثناء التسجيل!
|
||||
tips-file_select = اسحب الملفات وأفلتها لاستخدامها أو <u> تصفح </ u>
|
||||
tips-tap_setup = يمكنك النقر ببطء مرتين على جهاز التعقب لاختياره بدلاً من تحديده من القائمة.
|
||||
tips-turn_on_tracker = هل تستخدم أجهزة تعقب SlimeVR الرسمية؟ تذكر <b><em> أن تشغل أجهزة التعقب </em></b> بعد توصيلها بالكمبيوتر!
|
||||
tips-failed_webgl = فشل تهيئة WebGL.
|
||||
|
||||
## Units
|
||||
|
||||
|
||||
## Body parts
|
||||
|
||||
@@ -47,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 = درجة تشريد الصدر
|
||||
@@ -79,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 = إعادة تعيين الانعراج
|
||||
@@ -122,7 +200,7 @@ widget-overlay-is_mirrored_label = عكس تراكب الشاشة
|
||||
|
||||
widget-drift_compensation-clear = حذف تعويض الانجراف
|
||||
|
||||
## Widget: Clear Reset Mounting
|
||||
## Widget: Clear Mounting calibration
|
||||
|
||||
widget-clear_mounting = مسح إعادة تعيين التركيب
|
||||
|
||||
@@ -140,9 +218,17 @@ 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
|
||||
|
||||
widget-skeleton_visualizer-preview = إظهار الهيكل العظمي
|
||||
widget-skeleton_visualizer-hide = إخفاء
|
||||
|
||||
## Tracker status
|
||||
|
||||
@@ -152,6 +238,7 @@ tracker-status-error = خطأ
|
||||
tracker-status-disconnected = فقد الاتصال
|
||||
tracker-status-occluded = محجوب
|
||||
tracker-status-ok = حسنًا
|
||||
tracker-status-timed_out = انتهت المهله
|
||||
|
||||
## Tracker status columns
|
||||
|
||||
@@ -188,8 +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
|
||||
|
||||
@@ -204,11 +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
|
||||
|
||||
@@ -284,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
|
||||
|
||||
@@ -298,10 +411,22 @@ 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 = تعيين جهاز التعقب التلقائي
|
||||
settings-general-steamvr-trackers-hands-warning =
|
||||
<b>تحذير:</b> ستتجاوز أجهزة تعقب اليد وحدات التحكم الخاصة بك.
|
||||
هل أنت متأكد؟
|
||||
settings-general-steamvr-trackers-hands-warning-cancel = إلغاء
|
||||
settings-general-steamvr-trackers-hands-warning-done = نعم
|
||||
|
||||
## Tracker mechanics
|
||||
|
||||
@@ -319,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
|
||||
|
||||
@@ -348,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 = الوضع الافتراضي، مع وضع الذراعين العلويين إلى الخلف والساعدين للأمام.
|
||||
@@ -378,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)
|
||||
|
||||
@@ -429,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 = اختر اللغة التي تريد استخدامها
|
||||
@@ -440,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
|
||||
|
||||
@@ -451,6 +610,37 @@ settings-general-interface-feedback_sound = صوت ردود الفعل
|
||||
settings-general-interface-feedback_sound-description = سيصدر هذا الخيار صوتًا عند تشغيل إعادة الضبط
|
||||
settings-general-interface-feedback_sound-label = صوت ردود الفعل
|
||||
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
|
||||
|
||||
@@ -469,9 +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
|
||||
|
||||
@@ -502,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)
|
||||
@@ -517,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 = تبديل إرسال أجهزة تتبع محددة عبر أوه أس سي.
|
||||
@@ -550,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
|
||||
|
||||
@@ -576,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 = أدخل كلمة السر
|
||||
@@ -620,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 = أنت جاهز تمامًا!
|
||||
@@ -637,12 +864,13 @@ onboarding-done-close = إغلاق الدليل
|
||||
|
||||
onboarding-connect_tracker-back = العودة إلى بيانات اعتماد الواي فاي
|
||||
onboarding-connect_tracker-title = ربط أجهزة التعقب
|
||||
onboarding-connect_tracker-description-p0 = ننتقل الآن إلى الجزء الممتع ، ربط جميع أجهزة التعقب!
|
||||
onboarding-connect_tracker-description-p1 = ما عليك سوى توصيل كل ما لم يتم توصيله بعد من خلال منفذ يو أس بي.
|
||||
onboarding-connect_tracker-description-p0-v1 = ننتقل الآن إلى الجزء الممتع ، ربط أجهزة التعقب!
|
||||
onboarding-connect_tracker-description-p1-v1 = قم بتوصيل كل جهاز تعقب واحدا تلو الآخر من خلال منفذ USB.
|
||||
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 = نبحث عن السرفر
|
||||
@@ -670,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
|
||||
|
||||
@@ -706,6 +934,32 @@ 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
|
||||
|
||||
@@ -781,13 +1035,20 @@ 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 = أنا أعرف ماذا أفعل
|
||||
onboarding-choose_mounting-manual_modal-cancel = إلغاء
|
||||
|
||||
## Tracker manual mounting setup
|
||||
|
||||
@@ -812,43 +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 =
|
||||
تستخدم نسب الجسم لمعرفة قياسات جسمك. هم مطلوبون لحساب مواقع أجهزة التعقب.
|
||||
عندما لا تتطابق نسب جسمك مع تلك المحفوظة ، ستكون دقة التتبع لديك أسوأ وستلاحظ أشياء مثل التزلج أو الانزلاق ، أو أن جسمك لا يتطابق مع الصورة الرمزية بشكل جيد.
|
||||
onboarding-choose_proportions-auto_proportions = النسب التلقائية
|
||||
# Italized text
|
||||
onboarding-choose_proportions-auto_proportions-subtitle = الموصى به
|
||||
onboarding-choose_proportions-auto_proportions-descriptionv2 =
|
||||
سيؤدي ذلك إلى تخمين نسبك عن طريق تسجيل عينة من تحركاتك وتمريرها عبر خوارزمية.
|
||||
|
||||
<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
|
||||
|
||||
@@ -862,26 +1098,40 @@ onboarding-automatic_proportions-put_trackers_on-description = لمعايرة ن
|
||||
onboarding-automatic_proportions-put_trackers_on-next = ارتديت جميع أجهزة التعقب.
|
||||
onboarding-automatic_proportions-requirements-title = المتطلبات
|
||||
# Each line of text is a different list item
|
||||
onboarding-automatic_proportions-requirements-description =
|
||||
لديك على الأقل ما يكفي من أجهزة تعقب لتعقب قدميك (بشكل عام 5 أجهزة تعقب).
|
||||
ارتديت أجهزة التعقب وسماعة الرأس.
|
||||
شغلت أجهزة التعقب وسماعة الرأس.
|
||||
أجهزة التعقب وسماعات الرأس متصلة بسرفر سلايم في ار.
|
||||
تعمل أجهزة التتبع وسماعات الرأس بشكل صحيح داخل سرفر سلايم في ار .
|
||||
تقوم سماعة الرأس الخاصة بك بالإبلاغ عن بيانات الموقع إلى سرفر سلايم في ار (وهذا يعني بشكل عام تشغيل سلايم في ار وتوصيله بـ سلايم في ار باستخدام برنامج تشغيل ستيم في ار من سلايم في ار ).
|
||||
onboarding-automatic_proportions-requirements-descriptionv2 =
|
||||
لديك على الأقل ما يكفي من أجهزة التعقب لتتبع قدميك (بشكل عام 5 أجهزة تعقب).
|
||||
لديك أجهزة التعقب وجهاز الواقع الافتراضي الخاص بك وترتديهم.
|
||||
أجهزة التعقب وجهاز الواقع الافتراضي متصلة بخادم SlimeVR وتعمل بشكل صحيح (مثلاً، لا يوجد تأتأة أو قطع اتصال ، إلخ).
|
||||
يقوم جهاز الواقع الافتراضي بالإبلاغ عن البيانات الموضعية إلى خادم 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-fetch_height = أنا واقف!
|
||||
onboarding-automatic_proportions-check_height-calculation_warning-v3 = ابدأ في القياس أثناء الوقوف <u>في وضع مستقيم</u> لقياس طولك. احرص على عدم رفع يديك أعلى من سماعة الرأس ، لأنها قد تؤثر على القياس!
|
||||
onboarding-automatic_proportions-check_height-guardian_tip =
|
||||
إذا كنت تستخدم سماعة رأس VR مستقلة ، فتأكد من تشغيل حدود الحارس /
|
||||
لكي يكون طولك صحيحا!
|
||||
# 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 = بدء التسجيل
|
||||
@@ -915,15 +1165,35 @@ 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
|
||||
|
||||
home-no_trackers = لم يتم الكشف أو تعيين عن أي جهاز تعقب
|
||||
|
||||
## Trackers Still On notification
|
||||
|
||||
trackers_still_on-modal-title = أجهزة التعقب لا تزال قيد التشغيل
|
||||
trackers_still_on-modal-description =
|
||||
لا يزال واحد أو أكثر من أجهزة التعقب قيد التشغيل.
|
||||
هل مازلت تريد الخروج من SlimeVR؟
|
||||
trackers_still_on-modal-confirm = الخروج من SlimeVR
|
||||
trackers_still_on-modal-cancel = انتظر...
|
||||
|
||||
## Status system
|
||||
|
||||
status_system-StatusTrackerReset = يوصى بإجراء إعادة تعيين كاملة نظرًا لعدم تعديل واحد أو أكثر من أجهزة التعقب.
|
||||
@@ -933,3 +1203,67 @@ 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
|
||||
|
||||
tray_menu-show = عرض
|
||||
tray_menu-hide = إخفاء
|
||||
tray_menu-quit = انهاء
|
||||
|
||||
## First exit modal
|
||||
|
||||
tray_or_exit_modal-title = ماذا يجب أن يفعل زر الإغلاق؟
|
||||
# Multiline text
|
||||
tray_or_exit_modal-description =
|
||||
يتيح لك ذلك اختيار ما إذا كنت تريد الخروج من الخادم أو تصغيره إلى علبة النظام عند الضغط على زر الإغلاق.
|
||||
|
||||
يمكنك تغيير هذا لاحقا في إعدادات الواجهة!
|
||||
tray_or_exit_modal-radio-exit = الخروج عند الإغلاق
|
||||
tray_or_exit_modal-radio-tray = تصغير إلى علبة النظام
|
||||
tray_or_exit_modal-submit = احفظ
|
||||
tray_or_exit_modal-cancel = إلغاء
|
||||
|
||||
## Unknown device modal
|
||||
|
||||
unknown_device-modal-title = تم العثور على جهاز تعقب جديد!
|
||||
unknown_device-modal-description =
|
||||
هناك جهاز تعقب جديد مع عنوان MAC <b>{ $deviceId }</b>.
|
||||
هل تريد توصيله ب 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
|
||||
|
||||
@@ -23,6 +28,11 @@ tips-find_tracker = nawt suwe whicsh twayckyaw is whicsh? shayke a twackaw and i
|
||||
tips-do_not_move_heels = ensuwe yoowr pawsies do nawt mowve duwing wecowding! ^w^
|
||||
tips-file_select = dwag & dwop fiwes to use OwO, ow <u>bwowse</u>.
|
||||
tips-tap_setup = u can swowly tap youw twackew 2 times to choose it insted of sewecting it fwom the menyu.
|
||||
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
|
||||
|
||||
@@ -47,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
|
||||
|
||||
@@ -79,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
|
||||
@@ -122,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
|
||||
|
||||
@@ -140,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
|
||||
|
||||
@@ -194,8 +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
|
||||
|
||||
@@ -210,11 +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
|
||||
|
||||
@@ -290,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
|
||||
|
||||
@@ -304,10 +395,22 @@ settings-general-steamvr-description =
|
||||
usefuw if yew want mowwe contwoww owew what swimevr does.
|
||||
settings-general-steamvr-trackers-waist = wyayst~
|
||||
settings-general-steamvr-trackers-chest = chwest~
|
||||
settings-general-steamvr-trackers-feet = pweets~
|
||||
settings-general-steamvr-trackers-knees = knyees~
|
||||
settings-general-steamvr-trackers-elbows = ewbows~
|
||||
settings-general-steamvr-trackers-hands = pawbsies~
|
||||
settings-general-steamvr-trackers-left_foot = weft lower pawb
|
||||
settings-general-steamvr-trackers-right_foot = wight lower pawb
|
||||
settings-general-steamvr-trackers-left_knee = weft knee
|
||||
settings-general-steamvr-trackers-right_knee = wight knee
|
||||
settings-general-steamvr-trackers-left_elbow = weft elbow
|
||||
settings-general-steamvr-trackers-right_elbow = wight elbow
|
||||
settings-general-steamvr-trackers-left_hand = weft upper pawb
|
||||
settings-general-steamvr-trackers-right_hand = wight upper pawb
|
||||
settings-general-steamvr-trackers-tracker_toggling = awtomawtic twackaws assigwment
|
||||
settings-general-steamvr-trackers-tracker_toggling-description = aUwUtomaticawwy handels tawggling SteemVR twackews on oar off depening on yoar cuwwent twackew assaingmentz
|
||||
settings-general-steamvr-trackers-tracker_toggling-label = awtomawtic twackaws assigwment
|
||||
settings-general-steamvr-trackers-hands-warning =
|
||||
<b>OwOarning:</b> paw twackows wiww owovewwide youw contwowworz.
|
||||
r u sure??
|
||||
settings-general-steamvr-trackers-hands-warning-cancel = cancew :o
|
||||
settings-general-steamvr-trackers-hands-warning-done = yes!!
|
||||
|
||||
## Tracker mechanics
|
||||
|
||||
@@ -325,14 +428,25 @@ settings-general-tracker_mechanics-filtering-type-smoothing-description = smowth
|
||||
settings-general-tracker_mechanics-filtering-type-prediction = pwediction~
|
||||
settings-general-tracker_mechanics-filtering-type-prediction-description = wowduces wowcyancy and makes wowvements mowe wowappy, but may incwease jiwitty
|
||||
settings-general-tracker_mechanics-filtering-amount = amownt
|
||||
settings-general-tracker_mechanics-yaw-reset-smooth-time = nyaw weset smootse taim (0s disaeblez smooting)
|
||||
settings-general-tracker_mechanics-drift_compensation = dwift compensation
|
||||
# This cares about multilines
|
||||
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
|
||||
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
|
||||
|
||||
@@ -354,11 +468,17 @@ 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
|
||||
settings-general-fk_settings-reset_settings = weset setings
|
||||
settings-general-fk_settings-reset_settings-reset_hmd_pitch-description = weset da HMD's pitch (vewticaw wowtaytion) upawn doin a fuww weset. uwusefuw if weaewing an HMD on da foawrhed fow VTuwubing ow mocap. do nyat enaebwew fow VR.
|
||||
settings-general-fk_settings-reset_settings-reset_hmd_pitch = weset HMD pitch
|
||||
settings-general-fk_settings-arm_fk-reset_mode-description = Change which awm pose is expected fow meownting weset.
|
||||
settings-general-fk_settings-arm_fk-back = bak
|
||||
settings-general-fk_settings-arm_fk-back-description = The defauwt mode, wit da uppew awms going back and wowew awms going fowwawd.
|
||||
@@ -384,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)
|
||||
|
||||
@@ -427,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
|
||||
@@ -438,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
|
||||
|
||||
@@ -453,6 +576,22 @@ settings-general-interface-connected_trackers_warning = Connected twackews wawni
|
||||
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
|
||||
settings-general-interface-discord_presence = shaer activitey on discowd
|
||||
settings-general-interface-discord_presence-description = tewws ur discoard cwient dat ur using SlyimeVR awong wif teh nuhmbew of IMU twackewrz u r using.
|
||||
settings-general-interface-discord_presence-label = shaer activitey on discowd
|
||||
settings-general-interface-discord_presence-message =
|
||||
{ $amount ->
|
||||
[0] slimin awaound :3
|
||||
[one] using 1 twackew
|
||||
*[other] using { $amount } twackewz
|
||||
}
|
||||
|
||||
## Serial settings
|
||||
|
||||
settings-serial = shewyaw console
|
||||
@@ -470,9 +609,11 @@ 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
|
||||
settings-serial-file_type = plane text
|
||||
settings-serial-save_logs = saeve to file
|
||||
|
||||
## OSC router settings
|
||||
|
||||
@@ -502,15 +643,11 @@ settings-osc-router-network-address-placeholder = IPV4 addwess
|
||||
## OSC VRChat settings
|
||||
|
||||
settings-osc-vrchat = VRChawt OSC Twayckaws
|
||||
# This cares about multilines
|
||||
settings-osc-vrchat-description =
|
||||
change vwchat-specific settwings to wweceive hmd data awnd send
|
||||
twayckaws data fow fbt (wawwks on quest standalone).
|
||||
settings-osc-vrchat-enable = enaybwe
|
||||
settings-osc-vrchat-enable-description = toggle teh sending awnd wweceiving of data
|
||||
settings-osc-vrchat-enable-label = enaybwe
|
||||
settings-osc-vrchat-network = newtwowk pawts
|
||||
settings-osc-vrchat-network-description = set the pawts fow wistening awnd sending data to vwchawt
|
||||
settings-osc-vrchat-network-description-v1 = set da powrts fow wistening and sending data. can b left untouwched fow vrawrchat
|
||||
settings-osc-vrchat-network-port_in =
|
||||
.label = pawt in
|
||||
.placeholder = pawt in (defawwt: 9001)
|
||||
@@ -518,7 +655,6 @@ settings-osc-vrchat-network-port_out =
|
||||
.label = pawt out
|
||||
.placeholder = pawt out (defawwt: 9000)
|
||||
settings-osc-vrchat-network-address = network addwess
|
||||
settings-osc-vrchat-network-address-description = choose which addwess to send out data to vwchat (check yuw wi-fi settwings on yuw device)
|
||||
settings-osc-vrchat-network-address-placeholder = vwchat ip addwess
|
||||
settings-osc-vrchat-network-trackers = trayckawws
|
||||
settings-osc-vrchat-network-trackers-description = toggle teh sending of spweciwic twackers viwa OSC
|
||||
@@ -551,16 +687,45 @@ 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
|
||||
settings-osc-vmc-anchor_hip-label = anchow at hips
|
||||
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
|
||||
|
||||
@@ -577,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
|
||||
@@ -621,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!
|
||||
@@ -638,12 +792,13 @@ onboarding-done-close = cwose the guide
|
||||
|
||||
onboarding-connect_tracker-back = gaww bawwk to wi-fi cwedentials
|
||||
onboarding-connect_tracker-title = connect twackaws
|
||||
onboarding-connect_tracker-description-p0 = now onto teh fun pawwt, connecting awe teh twackaws!
|
||||
onboarding-connect_tracker-description-p1 = simply connect awe that awe nawt cownyected yet, through a usb powwt.
|
||||
onboarding-connect_tracker-description-p0-v1 = now onto teh fun pawrt, connyecting twackews!1! :D
|
||||
onboarding-connect_tracker-description-p1-v1 = conect each twackew wun at a taim thru a USB pawrt.
|
||||
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
|
||||
@@ -657,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
|
||||
|
||||
@@ -693,12 +848,34 @@ 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
|
||||
onboarding-assign_trackers-option-amount =
|
||||
{ $trackersCount ->
|
||||
[one] x{ $trackersCount }
|
||||
*[other] x{ $trackersCount }
|
||||
}
|
||||
onboarding-assign_trackers-option-label =
|
||||
{ $mode ->
|
||||
[lower-body] wower-bawdy set
|
||||
[core] coar set
|
||||
[enhanced-core] enhaynced coar set
|
||||
[full-body] fuww-bawdy set
|
||||
*[all] all twackewz
|
||||
}
|
||||
onboarding-assign_trackers-option-description =
|
||||
{ $mode ->
|
||||
[lower-body] minimum fow VR fuww-bawdy twacking
|
||||
[core] + enhanced spine twacking
|
||||
[enhanced-core] + paw wowtation
|
||||
[full-body] + ewbOwOw twacking
|
||||
*[all] all awvaiwabule twackew assaignments
|
||||
}
|
||||
|
||||
## Tracker assignment warnings
|
||||
|
||||
@@ -774,12 +951,12 @@ 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
|
||||
onboarding-choose_mounting-auto_mounting-label = expewimentaw
|
||||
# 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
|
||||
onboarding-choose_mounting-manual_mounting-label = wecommended
|
||||
# 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
|
||||
onboarding-choose_mounting-manual_modal-title =
|
||||
@@ -812,43 +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 =
|
||||
body pawpowtions awe used to know the measuwements of uw body. dey wequiwed to cawcuwate the twackews' pawsitions.
|
||||
wen pawpowtions of youw body dun mach da onyes saved, youw twacking pwecision wiwl be wowse and you wiwl nyotice tings wike skating or swiding, ow youw body nyot matching youw avataw wewl.
|
||||
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
|
||||
|
||||
@@ -869,18 +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-fetch_height = am standing!
|
||||
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!!
|
||||
# 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
|
||||
@@ -910,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
|
||||
|
||||
@@ -937,3 +1112,113 @@ status_system-StatusSteamVRDisconnected =
|
||||
*[other] cuwwentwly nawt conected to SwimeVR wiff da SwimeVR dwiver.
|
||||
}
|
||||
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
|
||||
tray_menu-hide = hoide
|
||||
tray_menu-quit = qwit
|
||||
|
||||
## First exit modal
|
||||
|
||||
tray_or_exit_modal-title = owo wat shud da cwose button do?
|
||||
# Multiline text
|
||||
tray_or_exit_modal-description =
|
||||
dis lets u choose wether u wanna exit te sewvew ow to minimaize it to da tway wen pwessing teh cwose buttin.
|
||||
|
||||
yuow can cheange dis latew in da intewfayce setings! :D
|
||||
tray_or_exit_modal-radio-exit = exit on cwose
|
||||
tray_or_exit_modal-radio-tray = minimaize to systehm tway
|
||||
tray_or_exit_modal-submit = save :3
|
||||
tray_or_exit_modal-cancel = cancew :o
|
||||
|
||||
## Unknown device modal
|
||||
|
||||
unknown_device-modal-title = da twackew was find owo
|
||||
unknown_device-modal-description =
|
||||
therwe is a nyew twackew wif MAC addwess <b>{ $deviceId }</b>..
|
||||
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
|
||||
|
||||
|
||||