Compare commits

..

127 Commits

Author SHA1 Message Date
lucas lelievre
181c6599b7 Increment versionCodeOffset from 4 to 5 2026-03-31 21:10:00 +02:00
gorbit99
fb77d3cf8a Downgrade JavaOSC version (#1801) 2026-03-31 21:02:01 +02:00
lucas lelievre
1a4b19a5e1 Make sure tags are fetched for version number checks 2026-03-30 05:42:47 +02:00
lucas lelievre
a9f553729e Electron fixes macos (#1797) 2026-03-26 08:09:10 +01:00
lucas lelievre
ed96742680 Electron fixes after RC feedbacks (#1784) 2026-03-26 05:15:41 +01:00
lucas lelievre
5e7816d72d New Pontoon translations (#1674) 2026-03-17 11:06:50 +01:00
SlimeVR-bot
abab38e422 Pontoon/GUI: Update Czech (cs)
Co-authored-by: Cheezik <cheatistv@email.cz> (cs)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
7835b17379 Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
30612a866b Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
bba574ce86 Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
6d3d725b6c Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
948bc06542 Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
8f4ee3268d Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
8f97bd997b Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
18f6c9c24f Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
c7bdd041f2 Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
f75a011fb3 Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
Co-authored-by: R4MOS <alexandrerrangel99@gmail.com> (pt-BR)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
555764914d Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
e4be98c7e7 Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
701ce9dc0a Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
3f950cc11d Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
d8ce34a962 Pontoon/GUI: Update Czech (cs)
Co-authored-by: Cheezik <cheatistv@email.cz> (cs)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
ef9d5e7862 Pontoon/GUI: Update Czech (cs)
Co-authored-by: Cheezik <cheatistv@email.cz> (cs)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
e3f06eff55 Pontoon/GUI: Update Czech (cs)
Co-authored-by: Cheezik <cheatistv@email.cz> (cs)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
7a062b7d7b Pontoon/GUI: Update Czech (cs)
Co-authored-by: Cheezik <cheatistv@email.cz> (cs)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
121f3297ae Pontoon/GUI: Update Czech (cs)
Co-authored-by: Cheezik <cheatistv@email.cz> (cs)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
9951f00979 Pontoon/GUI: Update Czech (cs)
Co-authored-by: Cheezik <cheatistv@email.cz> (cs)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
d8bb744ce4 Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
4db342b4ae Pontoon/GUI: Update Czech (cs)
Co-authored-by: Cheezik <cheatistv@email.cz> (cs)
Co-authored-by: Pesky12 <avianearts@gmail.com> (cs)
Co-authored-by: Jeeko <d.safarik06@gmail.com> (cs)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
e9f96e6d21 Pontoon/GUI: Update Czech (cs)
Co-authored-by: Cheezik <cheatistv@email.cz> (cs)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
56c6ebdadf Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
4f941a5892 Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
bf69046efe Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
cdcdb1b443 Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
f875e9df4d Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
12dd408f0b Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
5e53bae9dc Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
b19e190004 Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
06c8bdc81a Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
62338250e8 Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
1ff79ebb13 Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
2f9678d882 Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
94d70cbe55 Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
f5c26f97aa Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:36 +00:00
SlimeVR-bot
b367c7d3d6 Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
c9cae35946 Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
Co-authored-by: R4MOS <alexandrerrangel99@gmail.com> (pt-BR)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
a895b0b583 Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: R4MOS <alexandrerrangel99@gmail.com> (pt-BR)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
5321c25bb2 Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
b39691b879 Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
74e7f02668 Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
09e1510298 Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
0d95a731e3 Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
7d5706520b Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
e887b3153d Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
a7aa897fad Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
29e2fd863b Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
330cac26ec Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
ca9195ba97 Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
908270ffff Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
942fbcf6f6 Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
dbc6bae898 Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
8482802375 Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
fdd3614204 Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
706a2780d9 Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
97a90076a4 Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
ef85b8f3e1 Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
83700a1d1a Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
36a363f8ed Pontoon/GUI: Update Brazilian Portuguese (pt-BR)
Co-authored-by: inex <rui.bisneto@gmail.com> (pt-BR)
Co-authored-by: R4MOS <alexandrerrangel99@gmail.com> (pt-BR)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
1c8381337a Pontoon/GUI: Update French (fr)
Co-authored-by: Erimel <loukalemire@gmail.com> (fr)
Co-authored-by: Nicalay2 <Habbo.rieranicolas08@gmail.com> (fr)
Co-authored-by: Natsuko <maisonasse@gmail.com> (fr)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
f698b27be5 Pontoon/GUI: Update French (fr)
Co-authored-by: Erimel <loukalemire@gmail.com> (fr)
Co-authored-by: Nicalay2 <Habbo.rieranicolas08@gmail.com> (fr)
Co-authored-by: Natsuko <maisonasse@gmail.com> (fr)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
f2767cf3bc Pontoon/GUI: Update French (fr)
Co-authored-by: Natsuko <maisonasse@gmail.com> (fr)
Co-authored-by: Erimel <loukalemire@gmail.com> (fr)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
fe873729b6 Pontoon/GUI: Update French (fr)
Co-authored-by: Nicalay2 <Habbo.rieranicolas08@gmail.com> (fr)
Co-authored-by: Natsuko <maisonasse@gmail.com> (fr)
Co-authored-by: Erimel <loukalemire@gmail.com> (fr)
Co-authored-by: Naoto <naotomuramasa@gmail.com> (fr)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
031b35eb06 Pontoon/GUI: Update French (fr)
Co-authored-by: Erimel <loukalemire@gmail.com> (fr)
Co-authored-by: Nicalay2 <Habbo.rieranicolas08@gmail.com> (fr)
Co-authored-by: Natsuko <maisonasse@gmail.com> (fr)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
bcc604cf63 Pontoon/GUI: Update Traditional Chinese (zh-Hant)
Co-authored-by: Meow Wei <medicalwei@gmail.com> (zh-Hant)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
adf01eed16 Pontoon/GUI: Update Traditional Chinese (zh-Hant)
Co-authored-by: Meow Wei <medicalwei@gmail.com> (zh-Hant)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
bd1750f252 Pontoon/GUI: Update Traditional Chinese (zh-Hant)
Co-authored-by: Meow Wei <medicalwei@gmail.com> (zh-Hant)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
49adf0ee84 Pontoon/GUI: Update German (de)
Co-authored-by: TheDevMinerTV <devminer@devminer.xyz> (de)
Co-authored-by: NichtTube <Marvin-semmler@gmx.net> (de)
Co-authored-by: unlogisch <unlogisch@gmx.ch> (de)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
04a2fa72a7 Pontoon/GUI: Update German (de)
Co-authored-by: TheDevMinerTV <devminer@devminer.xyz> (de)
Co-authored-by: NichtTube <Marvin-semmler@gmx.net> (de)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
064c41d419 Pontoon/GUI: Update German (de)
Co-authored-by: NichtTube <Marvin-semmler@gmx.net> (de)
Co-authored-by: TheDevMinerTV <devminer@devminer.xyz> (de)
Co-authored-by: unlogisch <unlogisch@gmx.ch> (de)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
7c92023af7 Pontoon/GUI: Update Simplified Chinese (zh-Hans)
Co-authored-by: nekomona <nekomona@163.com> (zh-Hans)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
ac01b75342 Pontoon/GUI: Update Thai (th)
Co-authored-by: YumeTomo <Sodnoobe@gmail.com> (th)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
95a7801a50 Pontoon/GUI: Update Dutch (nl)
Co-authored-by: Vyolex <25586367+Vyolex@users.noreply.github.com> (nl)
Co-authored-by: Nola <stefsecretdesecret@gmail.com> (nl)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
db1ec5d024 Pontoon/GUI: Update Dutch (nl)
Co-authored-by: Vyolex <25586367+Vyolex@users.noreply.github.com> (nl)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
a96cd8a38f Pontoon/GUI: Update Dutch (nl)
Co-authored-by: Nola <stefsecretdesecret@gmail.com> (nl)
Co-authored-by: Vyolex <25586367+Vyolex@users.noreply.github.com> (nl)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
45d5789685 Pontoon/GUI: Update Dutch (nl)
Co-authored-by: Nola <stefsecretdesecret@gmail.com> (nl)
Co-authored-by: Vyolex <25586367+Vyolex@users.noreply.github.com> (nl)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
4b08123a61 Pontoon/GUI: Update Latinamerican Spanish (es-419)
Co-authored-by: Uriel <imurx@proton.me> (es-419)
Co-authored-by: MaxEvil <xicovalle@gmail.com> (es-419)
Co-authored-by: Alejandro <moctezumaalejandro25@gmail.com> (es-419)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
bfc99ab02c Pontoon/GUI: Update Latinamerican Spanish (es-419)
Co-authored-by: MaxEvil <xicovalle@gmail.com> (es-419)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
6eb8a18430 Pontoon/GUI: Update Latinamerican Spanish (es-419)
Co-authored-by: MaxEvil <xicovalle@gmail.com> (es-419)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
489b8e6549 Pontoon/GUI: Update Latinamerican Spanish (es-419)
Co-authored-by: MaxEvil <xicovalle@gmail.com> (es-419)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
7bb2ecfff1 Pontoon/GUI: Update Latinamerican Spanish (es-419)
Co-authored-by: MaxEvil <xicovalle@gmail.com> (es-419)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
59b4b34840 Pontoon/GUI: Update Latinamerican Spanish (es-419)
Co-authored-by: MaxEvil <xicovalle@gmail.com> (es-419)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
9597888902 Pontoon/GUI: Update Latinamerican Spanish (es-419)
Co-authored-by: MaxEvil <xicovalle@gmail.com> (es-419)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
dbfcc8ba0a Pontoon/GUI: Update Latinamerican Spanish (es-419)
Co-authored-by: MaxEvil <xicovalle@gmail.com> (es-419)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
fd8e9fba83 Pontoon/GUI: Update Latinamerican Spanish (es-419)
Co-authored-by: MaxEvil <xicovalle@gmail.com> (es-419)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
f65d1828fe Pontoon/GUI: Update Spain Spanish (es-ES)
Co-authored-by: Baddie <baddie@femboy.gay> (es-ES)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
c32601809b Pontoon/GUI: Update Spain Spanish (es-ES)
Co-authored-by: Baddie <baddie@femboy.gay> (es-ES)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
fdf86a1e56 Pontoon/GUI: Update Thai (th)
Co-authored-by: YumeTomo <Sodnoobe@gmail.com> (th)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
71908523f9 Pontoon/GUI: Update Thai (th)
Co-authored-by: YumeTomo <Sodnoobe@gmail.com> (th)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
2b7d678321 Pontoon/GUI: Update Simplified Chinese (zh-Hans)
Co-authored-by: 寂听 <jiting@jtcat.com> (zh-Hans)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
5d64fa8369 Pontoon/GUI: Update Traditional Chinese (zh-Hant)
Co-authored-by: Meow Wei <medicalwei@gmail.com> (zh-Hant)
2026-03-12 01:26:35 +00:00
SlimeVR-bot
fe6bb4534c Pontoon/GUI: Update Traditional Chinese (zh-Hant)
Co-authored-by: Meow Wei <medicalwei@gmail.com> (zh-Hant)
2026-03-12 01:26:35 +00:00
loucass003
95daec6814 Pass server jar properly 2026-03-12 02:26:13 +01:00
lucas lelievre
43b104fcc3 Electron build fix round 2 (#1783) 2026-03-12 02:11:42 +01:00
loucass003
a33d6b1c1a Set better folder for electron storage 2026-03-11 20:45:37 +01:00
loucass003
cf67b9306b Remove electron test from ci 2026-03-11 19:23:56 +01:00
lucas lelievre
238c86ee98 Electron CI fixes (#1780) 2026-03-11 19:12:47 +01:00
loucass003
7f56209ca9 Fix windows zip 2026-03-11 16:57:33 +01:00
loucass003
a3e50cdc02 fix server.jar output path 2026-03-11 01:39:41 +01:00
loucass003
b7c43d8373 Fix release out 2026-03-11 01:23:38 +01:00
lucas lelievre
cadc13f2e0 Revert "Bump actions/upload-artifact from 6 to 7" (#1779) 2026-03-11 01:02:49 +01:00
dependabot[bot]
7965d2e081 Bump actions/upload-artifact from 6 to 7 (#1770)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-10 23:33:56 +01:00
Butterscotch!
b829a20169 Bump Gradle, plugin, and package versions (#1746)
Co-authored-by: lucas lelievre <loucass003@gmail.com>
2026-03-10 22:40:41 +01:00
loucass003
653b8b4014 Make macos build 2026-03-10 22:04:43 +01:00
lucas lelievre
a891203204 Switch to Electron (#1747)
Co-authored-by: Hannah Lindrob <hannahlindrob@ourlook.com>
Co-authored-by: Sapphire <imsapphire0@gmail.com>
2026-03-10 21:38:02 +01:00
Sapphire
0236a05f26 Allow showing 'Up to date' version for third-party trackers (#1756) 2026-02-25 23:08:31 +01:00
Butterscotch!
28deb357da Revert TrackerResetsHandler & add comments (#1748) 2026-02-20 11:26:23 +01:00
jabberrock
4d93f87a01 Clarify AI policy on contributions (#1752) 2026-02-17 03:59:11 +03:00
Sapphire
88adfce242 Hide tracker firmware version when board type is unknown (#1721) 2026-02-09 21:58:36 +01:00
Sapphire
3d02795dbc Don't trigger timeout when Wi-Fi provisioning is done (#1725)
Co-authored-by: lucas lelievre <loucass003@gmail.com>
2026-02-09 21:57:56 +01:00
Sapphire
7ff50f78eb Don't ask for full reset on timeout with manual or saved mounting (#1727) 2026-02-02 18:06:38 +01:00
Sapphire
0e3aaf105c Display more accurate info for OpenVR devices (#1731) 2026-02-02 18:06:17 +01:00
sctanf
f638540886 TrackerBattery disable tooltip while charging (#1733) 2026-02-02 18:05:50 +01:00
Sapphire
343d69d690 Support feet mounting reset over Protobuf bridge (#1737) 2026-02-02 18:05:31 +01:00
H3
e2d7d354c6 Add ESP32-S2 to USB-Serial Accept-List (#1730)
Co-authored-by: unlogisch04 <98281608+unlogisch04@users.noreply.github.com>
2026-01-29 22:54:37 +03:00
sctanf
cc6f297b92 Re-add missing battery runtime estimate to DataFeedBuilder (#1732) 2026-01-29 14:00:18 +04:00
H114514191981
2add43e71a add CH343 support (#1568)
Co-authored-by: unlogisch04 <98281608+unlogisch04@users.noreply.github.com>
2026-01-28 10:39:25 +02:00
Sapphire
0a493ac345 Fix scheduled resets triggering immediately when delay is unspecified (#1724) 2026-01-25 07:08:25 +02:00
184 changed files with 7017 additions and 11691 deletions

1
.envrc
View File

@@ -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

3
.github/CODEOWNERS vendored
View File

@@ -17,8 +17,7 @@
/gui/src/components/settings/ @Erimelowo @loucass003
# Rust part of the GUI
/gui/src-tauri/ @loucass003
/Cargo.lock @loucass003
/gui/electron/ @loucass003
# Some server code~
/server/ @ButterscotchV @Eirenliel @Erimelowo

View File

@@ -1,129 +0,0 @@
name: Build GUI
on:
push:
branches:
- main
paths:
- .github/workflows/build-gui.yml
- gui/**
- package*.json
pull_request:
paths:
- .github/workflows/build-gui.yml
- gui/**
- package*.json
workflow_dispatch:
create:
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
submodules: recursive
- uses: pnpm/action-setup@v4
- name: Use Node.js
uses: actions/setup-node@v6
with:
node-version-file: '.node-version'
cache: 'pnpm'
- name: Build
run: |
pnpm i
cd gui
pnpm run lint
build:
strategy:
fail-fast: false
matrix:
os:
[
ubuntu-22.04,
windows-latest,
macos-latest,
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@v6
with:
submodules: recursive
- if: startsWith(matrix.os, 'ubuntu')
name: Set up Linux dependencies
uses: awalsh128/cache-apt-pkgs-action@v1.6.0
with:
packages: libgtk-3-dev webkit2gtk-4.1 libappindicator3-dev librsvg2-dev patchelf
# Increment to invalidate the cache
version: ${{ format('v1.0-{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
- if: matrix.os == 'windows-11-arm'
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
cache: false
- name: Cache cargo dependencies
uses: Swatinem/rust-cache@v2
- uses: pnpm/action-setup@v4
- name: Use Node.js
uses: actions/setup-node@v6
with:
node-version-file: '.node-version'
cache: 'pnpm'
- name: Install dependencies
shell: bash
run: pnpm i
- name: Build
shell: bash
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
NODE_OPTIONS: ${{ matrix.os == 'macos-latest' && '--max-old-space-size=4096' || '' }}
run: pnpm run skipbundler --config $( ./gui/scripts/gitversion.mjs )
- if: startsWith(matrix.os, 'windows')
name: Upload a Build Artifact (Windows)
uses: actions/upload-artifact@v6
with:
# Artifact name
name: ${{ format('SlimeVR-GUI-Windows-{0}', env.BUILD_ARCH) }}
# A file, directory or wildcard pattern that describes what to upload
path: target/release/slimevr.exe
- if: startsWith(matrix.os, 'ubuntu')
name: Upload a Build Artifact (Linux)
uses: actions/upload-artifact@v6
with:
# Artifact name
name: ${{ format('SlimeVR-GUI-Linux-{0}', env.BUILD_ARCH) }}
# A file, directory or wildcard pattern that describes what to upload
path: target/release/slimevr
- if: matrix.os == 'macos-latest'
name: Upload a Build Artifact (macOS)
uses: actions/upload-artifact@v6
with:
# Artifact name
name: SlimeVR-GUI-macOS
# A file, directory or wildcard pattern that describes what to upload
path: target/release/slimevr

291
.github/workflows/build.yml vendored Normal file
View File

@@ -0,0 +1,291 @@
name: SlimeVR Full Build
on:
push:
branches: [main]
tags: ["v*"]
pull_request:
workflow_dispatch:
jobs:
setup-matrix:
name: Configure Build Matrix
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- id: set-matrix
shell: bash
run: |
BASE='[{"os":"ubuntu-22.04","platform":"linux"},{"os":"windows-latest","platform":"windows"},{"os":"macos-latest","platform":"macos"}]'
EXTRA='[{"os":"ubuntu-22.04-arm","platform":"linux"},{"os":"windows-11-arm","platform":"windows"}]'
if [[ "${{ github.ref }}" == refs/tags/v* || "${{ github.ref }}" == refs/heads/main || "${{ github.event_name }}" == "workflow_dispatch" ]]; then
RESULT=$(echo "$BASE $EXTRA" | jq -c -s 'add')
else
RESULT=$(echo "$BASE" | jq -c '.')
fi
echo "matrix={\"include\":$RESULT}" >> "$GITHUB_OUTPUT"
gui-checks:
name: Gui Checks
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
with:
submodules: recursive
- name: Get tags
run: git fetch --tags origin --recurse-submodules=no --force
- name: Setup PNPM
uses: pnpm/action-setup@v4
- name: Setup Node
uses: actions/setup-node@v6
with:
node-version-file: '.node-version'
cache: 'pnpm'
- name: GUI Lint
run: pnpm i && cd gui && pnpm run lint
java-checks:
name: Java Checks
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
with:
submodules: recursive
- name: Set up JDK 17
uses: actions/setup-java@v5
with:
java-version: '17'
distribution: 'adopt'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v5
- name: Java Spotless Check
run: ./gradlew spotlessCheck --build-cache
build-server-jar:
name: Build Desktop Server
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
with:
submodules: recursive
- name: Get tags
run: git fetch --tags origin --recurse-submodules=no --force
- name: Set up JDK 17
uses: actions/setup-java@v5
with:
java-version: '17'
distribution: 'adopt'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v5
- name: Build ShadowJar
run: ./gradlew :server:desktop:shadowJar --build-cache
- name: Test with Gradle
run: ./gradlew :server:desktop:test
- name: Upload Server Jar
uses: actions/upload-artifact@v6
with:
name: server-jar
path: |
server/desktop/build/libs/slimevr.jar
server/core/resources
build-gui-frontend:
name: Build GUI Assets
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
with:
submodules: recursive
- name: Get tags
run: git fetch --tags origin --recurse-submodules=no --force
- name: Setup PNPM
uses: pnpm/action-setup@v4
- name: Setup Node
uses: actions/setup-node@v6
with:
node-version-file: '.node-version'
cache: 'pnpm'
- name: Build JS
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
run: pnpm i && cd gui && pnpm run build
- name: Tar GUI Dist
run: tar -czf slimevr-gui-dist.tar.gz -C gui/out .
- name: Upload GUI Dist
uses: actions/upload-artifact@v6
with:
name: gui-dist
path: slimevr-gui-dist.tar.gz
package-desktop:
name: Package Desktop (${{ matrix.platform }} - ${{ matrix.os }})
needs: [setup-matrix, build-server-jar, build-gui-frontend]
strategy:
fail-fast: false
matrix: ${{ fromJson(needs.setup-matrix.outputs.matrix) }}
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v6
with:
submodules: recursive
- name: Get tags
run: git fetch --tags origin --recurse-submodules=no --force
- name: Setup PNPM
uses: pnpm/action-setup@v4
- name: Setup Node
uses: actions/setup-node@v6
with:
node-version-file: '.node-version'
cache: 'pnpm'
- name: Download Server Jar
uses: actions/download-artifact@v6
with:
name: server-jar
path: server
- name: Download GUI Dist
uses: actions/download-artifact@v6
with:
name: gui-dist
- name: Extract GUI for Electron
shell: bash
run: mkdir -p gui/out && tar -xzf slimevr-gui-dist.tar.gz -C gui/out
- name: Run Electron Builder
shell: bash
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
run: |
mkdir -p gui/dist/artifacts/linux/ \
gui/dist/artifacts/win \
gui/dist/artifacts/mac
cd gui
pnpm i
pnpm exec electron-builder --${{ matrix.platform }} \
${{ matrix.platform == 'macos' && '--universal' || '' }} \
--publish never
- name: Collect and Rename Artifacts
shell: bash
run: |
SRC_DIR="${{ github.workspace }}/gui/dist/artifacts"
DEST_DIR="${{ github.workspace }}/release-out"
mkdir -p "$DEST_DIR"
if [ "${{ matrix.platform }}" == "windows" ]; then
[[ "${{ matrix.os }}" == *"arm"* ]] && SUFFIX="win-aarch64" || SUFFIX="win64"
cp "$SRC_DIR"/win/*.zip "$DEST_DIR/SlimeVR-$SUFFIX.zip"
elif [ "${{ matrix.platform }}" == "linux" ]; then
for f in "$SRC_DIR"/linux/*; do
[ -d "$f" ] && continue
BASE=$(basename "$f")
NEW_NAME=$(echo "$BASE" | sed -e 's/x86_64/amd64/g' -e 's/arm64/aarch64/g')
cp "$f" "$DEST_DIR/$NEW_NAME"
done
elif [ "${{ matrix.platform }}" == "macos" ]; then
cp "$SRC_DIR"/mac/*.dmg "$DEST_DIR/SlimeVR-mac.dmg"
fi
echo "Collected files:"
ls -lh "$DEST_DIR"
- name: Upload For Release
uses: actions/upload-artifact@v6
with:
name: release-${{ matrix.platform }}-${{ matrix.os }}
path: release-out/*
bundle-android:
name: Build Android APK
needs: [build-gui-frontend]
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
with:
submodules: recursive
- name: Get tags
run: git fetch --tags origin --recurse-submodules=no --force
- name: Set up JDK 17
uses: actions/setup-java@v5
with:
java-version: '17'
distribution: 'adopt'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v5
- name: Download GUI Dist
uses: actions/download-artifact@v6
with:
name: gui-dist
- name: Extract GUI for Android
run: mkdir -p gui/out && tar -xzf slimevr-gui-dist.tar.gz -C gui/out
- name: Build APK
run: ./gradlew :server:android:build --build-cache
env:
ANDROID_STORE_FILE: ${{ secrets.ANDROID_STORE_FILE }}
ANDROID_STORE_PASSWD: ${{ secrets.ANDROID_STORE_PASSWD }}
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
ANDROID_KEY_PASSWD: ${{ secrets.ANDROID_KEY_PASSWD }}
- name: Test with Gradle
run: ./gradlew test
- name: Prepare APK
run: cp server/android/build/outputs/apk/release/*.apk ./SlimeVR-android.apk
- name: Upload APK
uses: actions/upload-artifact@v6
with:
name: release-android
path: SlimeVR-android.apk
- name: Build Google Play release bundle
if: startsWith(github.ref, 'refs/tags/')
run: ./gradlew :server:android:bundleRelease
env:
ANDROID_STORE_FILE: ${{ secrets.ANDROID_GPLAY_STORE_FILE }}
ANDROID_STORE_PASSWD: ${{ secrets.ANDROID_GPLAY_STORE_PASSWD }}
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_GPLAY_KEY_ALIAS }}
ANDROID_KEY_PASSWD: ${{ secrets.ANDROID_GPLAY_KEY_PASSWD }}
- name: Upload the Google Play artifact
uses: actions/upload-artifact@v6
if: startsWith(github.ref, 'refs/tags/')
with:
# Artifact name
name: 'SlimeVR-Android-GPDev' # optional, default is artifact
# A file, directory or wildcard pattern that describes what to upload
path: server/android/build/outputs/bundle/release/*
create-release:
name: Finalize Release Draft
needs: [package-desktop, bundle-android, build-server-jar, build-gui-frontend]
if: startsWith(github.ref, 'refs/tags/')
runs-on: ubuntu-latest
steps:
- name: Download All Release Artifacts
uses: actions/download-artifact@v6
with:
pattern: release-*
path: release-out
merge-multiple: true
- name: Download Server Jar
uses: actions/download-artifact@v6
with:
name: server-jar
path: server
- name: Download GUI Dist
uses: actions/download-artifact@v6
with:
name: gui-dist
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
draft: true
generate_release_notes: true
files: |
release-out/*
server/desktop/build/libs/slimevr.jar
slimevr-gui-dist.tar.gz

View File

@@ -1,413 +0,0 @@
# This workflow will build a Java project with Gradle
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
name: SlimeVR Server
on:
push:
branches:
- main
pull_request:
workflow_dispatch:
create:
jobs:
test:
strategy:
matrix:
os: [ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v6
with:
submodules: recursive
- name: Get tags
run: git fetch --tags origin --recurse-submodules=no --force
- name: Set up JDK 17
uses: actions/setup-java@v5
with:
java-version: '17'
distribution: 'adopt'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v5
- run: mkdir ./gui/dist && touch ./gui/dist/somefile
shell: bash
- name: Check code formatting
run: ./gradlew spotlessCheck
- name: Test with Gradle
run: ./gradlew test
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
submodules: recursive
- name: Get tags
run: git fetch --tags origin --recurse-submodules=no --force
- name: Set up JDK 17
uses: actions/setup-java@v5
with:
java-version: '17'
distribution: 'adopt'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v5
- name: Build with Gradle
run: ./gradlew :server:desktop:shadowJar
- name: Upload the Server JAR as a Build Artifact
uses: actions/upload-artifact@v6
with:
# Artifact name
name: 'SlimeVR-Server' # optional, default is artifact
# A file, directory or wildcard pattern that describes what to upload
path: server/desktop/build/libs/slimevr.jar
- name: Upload to draft release
uses: softprops/action-gh-release@v2
if: startsWith(github.ref, 'refs/tags/')
with:
draft: true
generate_release_notes: true
files: |
server/desktop/build/libs/slimevr.jar
bundle-android:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
submodules: recursive
- name: Get tags
run: git fetch --tags origin --recurse-submodules=no --force
- name: Set up JDK 17
uses: actions/setup-java@v5
with:
java-version: '17'
distribution: 'adopt'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v5
- uses: pnpm/action-setup@v4
- name: Use Node.js
uses: actions/setup-node@v6
with:
node-version-file: '.node-version'
cache: 'pnpm'
- name: Install dependencies
run: pnpm i
- name: Build GUI
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
run: cd gui && pnpm run build
- name: Build with Gradle
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@v6
with:
# Artifact name
name: 'SlimeVR-Android' # optional, default is artifact
# A file, directory or wildcard pattern that describes what to upload
path: server/android/build/outputs/apk/*
- name: Prepare for release
if: startsWith(github.ref, 'refs/tags/')
run: |
cp server/android/build/outputs/apk/release/android-release.apk ./SlimeVR-android.apk
- name: Upload to draft release
uses: softprops/action-gh-release@v2
if: startsWith(github.ref, 'refs/tags/')
with:
draft: true
generate_release_notes: true
files: |
./SlimeVR-android.apk
- 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:
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@v6
with:
submodules: recursive
- uses: actions/download-artifact@v7
with:
name: 'SlimeVR-Server'
path: server/desktop/build/libs/
- name: Set up Linux dependencies
uses: awalsh128/cache-apt-pkgs-action@v1.6.0
with:
packages: |
build-essential curl wget file libssl-dev libgtk-3-dev libappindicator3-dev librsvg2-dev xdg-utils
# Increment to invalidate the cache
version: ${{ format('v1.0-{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: Set up specific Linux versioned dependencies
run: |
sudo apt-get update && sudo apt-get install -y \
libwebkit2gtk-4.1-0=2.44.0-2 \
libwebkit2gtk-4.1-dev=2.44.0-2 \
libjavascriptcoregtk-4.1-0=2.44.0-2 \
libjavascriptcoregtk-4.1-dev=2.44.0-2 \
gir1.2-javascriptcoregtk-4.1=2.44.0-2 \
gir1.2-webkit2-4.1=2.44.0-2;
- name: Cache cargo dependencies
uses: Swatinem/rust-cache@v2
- uses: pnpm/action-setup@v4
- name: Use Node.js
uses: actions/setup-node@v6
with:
node-version-file: '.node-version'
cache: 'pnpm'
- name: Install dependencies
run: pnpm i
- name: Build
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
run: pnpm run tauri build --config $( ./gui/scripts/gitversion.mjs )
- name: Make GUI tarball
run: |
tar czf slimevr-gui-dist.tar.gz -C gui/dist/ .
- uses: actions/upload-artifact@v6
if: matrix.os == 'ubuntu-latest'
with:
name: SlimeVR-GUI-Dist
path: ./slimevr-gui-dist.tar.gz
- uses: actions/upload-artifact@v6
with:
name: ${{ format('SlimeVR-GUI-Deb-{0}', env.BUILD_ARCH) }}
path: target/release/bundle/deb/slimevr*.deb
- uses: actions/upload-artifact@v6
with:
name: ${{ format('SlimeVR-GUI-AppImage-{0}', env.BUILD_ARCH) }}
path: target/release/bundle/appimage/slimevr*.AppImage
- uses: actions/upload-artifact@v6
with:
name: ${{ format('SlimeVR-GUI-RPM-{0}', env.BUILD_ARCH) }}
path: target/release/bundle/rpm/slimevr*.rpm
- name: Prepare for release
if: startsWith(github.ref, 'refs/tags/')
run: |
cp target/release/bundle/appimage/slimevr*.AppImage "./SlimeVR-$BUILD_ARCH.appimage"
cp target/release/bundle/deb/slimevr*.deb "./SlimeVR-$BUILD_ARCH.deb"
cp target/release/bundle/rpm/slimevr*.rpm "./SlimeVR-$BUILD_ARCH.rpm"
- name: Upload to draft release
uses: softprops/action-gh-release@v2
if: startsWith(github.ref, 'refs/tags/')
with:
draft: true
generate_release_notes: true
files: |
./slimevr-gui-dist.tar.gz
./SlimeVR-*.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@v6
with:
submodules: recursive
- uses: actions/download-artifact@v7
with:
name: 'SlimeVR-Server'
path: server/desktop/build/libs/
- name: Cache cargo dependencies
uses: Swatinem/rust-cache@v2
- uses: pnpm/action-setup@v4
- name: Use Node.js
uses: actions/setup-node@v6
with:
node-version-file: '.node-version'
cache: 'pnpm'
- name: Install dependencies
run: |
rustup target add x86_64-apple-darwin
pnpm i
- name: Build
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
NODE_OPTIONS: --max-old-space-size=4096
run: pnpm run tauri build --target universal-apple-darwin --config $( ./gui/scripts/gitversion.mjs )
- name: Modify Application
run: |
cd target/universal-apple-darwin/release/bundle/macos/slimevr.app/Contents/MacOS
cp $( git rev-parse --show-toplevel )/server/desktop/build/libs/slimevr.jar ./
cd ../../../
/usr/libexec/PlistBuddy -c "Set :CFBundleDisplayName SlimeVR" slimevr.app/Contents/Info.plist
/usr/libexec/PlistBuddy -c "Set :CFBundleName SlimeVR" slimevr.app/Contents/Info.plist
codesign --sign - --deep --force slimevr.app
mv slimevr.app SlimeVR.app
cd ../dmg/
./bundle_dmg.sh --volname SlimeVR --icon slimevr 180 170 --app-drop-link 480 170 \
--window-size 660 400 --hide-extension ../macos/SlimeVR.app \
--volicon ../macos/SlimeVR.app/Contents/Resources/icon.icns --skip-jenkins \
--eula ../../../../../LICENSE-MIT slimevr.dmg ../macos/SlimeVR.app
- uses: actions/upload-artifact@v6
with:
name: SlimeVR-GUI-MacApp
path: target/universal-apple-darwin/release/bundle/macos/SlimeVR*.app
- uses: actions/upload-artifact@v6
with:
name: SlimeVR-GUI-MacDmg
path: target/universal-apple-darwin/release/bundle/dmg/slimevr.dmg
- name: Prepare for release
if: startsWith(github.ref, 'refs/tags/')
run: |
cp target/universal-apple-darwin/release/bundle/dmg/slimevr.dmg ./SlimeVR-mac.dmg
- name: Upload to draft release
uses: softprops/action-gh-release@v2
if: startsWith(github.ref, 'refs/tags/')
with:
draft: true
generate_release_notes: true
files: |
./SlimeVR-mac.dmg
bundle-windows:
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@v6
with:
submodules: recursive
- uses: actions/download-artifact@v7
with:
name: 'SlimeVR-Server'
path: server/desktop/build/libs/
- if: matrix.os == 'windows-11-arm'
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
cache: false
- name: Cache cargo dependencies
uses: Swatinem/rust-cache@v2
- uses: pnpm/action-setup@v4
- name: Use Node.js
uses: actions/setup-node@v6
with:
node-version-file: '.node-version'
cache: 'pnpm'
- name: Install dependencies
shell: bash
run: pnpm i
- name: Build
shell: bash
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
run: pnpm run skipbundler --config $( ./gui/scripts/gitversion.mjs )
- name: Bundle to zips
shell: bash
run: |
mkdir SlimeVR
cp gui/src-tauri/icons/icon.ico ./SlimeVR/run.ico
cp server/desktop/build/libs/slimevr.jar ./SlimeVR/slimevr.jar
cp server/core/resources/* ./SlimeVR/
cp target/release/slimevr.exe ./SlimeVR/
7z a -tzip "SlimeVR-$BUILD_ARCH.zip" ./SlimeVR/
- uses: actions/upload-artifact@v6
with:
name: ${{ format('SlimeVR-GUI-Windows-{0}', env.BUILD_ARCH) }}
path: ./SlimeVR*.zip
- name: Upload to draft release
uses: softprops/action-gh-release@v2
if: startsWith(github.ref, 'refs/tags/')
with:
draft: true
generate_release_notes: true
files: ./SlimeVR-*.zip

7
.gitignore vendored
View File

@@ -34,9 +34,6 @@
# ignore gradle build folder
build/
# Rust build artifacts
/target
# direnv has been claimed for Nix usage
.direnv/
.devenv
@@ -46,3 +43,7 @@ local.properties
# Ignore temporary config
vrconfig.yml.tmp
# Nixos
.bin/

View File

@@ -7,7 +7,6 @@
"gaborv.flatbuffers",
"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode",
"rust-lang.rust-analyzer",
"bradlc.vscode-tailwindcss",
"EditorConfig.EditorConfig",
"macabeus.vscode-fluent",

View File

@@ -7,8 +7,6 @@ This document describes essential knowledge required to contribute to the SlimeV
- [Git](https://git-scm.com/downloads)
- [Java v17+](https://adoptium.net/temurin/releases/)
- [Node.js v16.9+](https://nodejs.org) (We recommend the use of `nvm` instead of installing Node.js directly)
- [Microsoft Edge WebView2](https://developer.microsoft.com/en-us/microsoft-edge/webview2/#download-section) or `webkit2gtk` for Linux
- [Rust](https://rustup.rs)
## Cloning the code
First, clone the codebase using git in a terminal in the folder you want.
@@ -32,13 +30,13 @@ be at `server/build/libs/slimevr.jar` (you can ignore `server.jar`).
(Note: Your IDE may be able to do all of the above for you.)
### Tauri (gui)
### Electron (gui)
- Activate corepack (included with Node.JS) via `corepack enable` (might require administrator permissions)
- Run `pnpm i` in your IDE's terminal to download and install dependencies.
- To launch the GUI in dev mode, run `pnpm gui`.
- Finally, to compile for production, run `pnpm run tauri build`. The result
will be at `target/release/slimevr.exe`.
- Finally, to compile for production, run `pnpm package:build`. The result
will be at `dist/artifacts/` content will change depending of the platform.
## Code style
@@ -84,7 +82,7 @@ Import the formatting settings defined in `spotless.xml`, like this:
Eclipse will only do a subset of the checks in `spotless`, so you may still want to do
`./gradlew spotlessApply` if you ever see an error from spotless.
### Tauri (gui)
### Electron (gui)
We use ESLint and Prettier to format GUI code.
- First, go into the GUI's directory with your terminal by running `cd gui`.
@@ -116,3 +114,9 @@ licensed under `GPL-v3`.
## Discord
We use discord *a lot* to coordinate and discuss development. Come join us at
https://discord.gg/SlimeVR!
## Use of AI
We DO NOT accept contributions that are generated with AI (for example, "vibe-coding").
If you do use AI, and you believe your usage of AI is reasonable, you must clearly disclose
how you used AI in your submission.

6898
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,16 +0,0 @@
[workspace]
# Use 2021 edition resolver, better resolves crate features.
resolver = "2"
# A list of all rust crates in the workspace.
members = ["gui/src-tauri"]
# These settings can be inherited by workspace members
[workspace.package]
edition = "2021"
license = "MIT OR Apache-2.0"
rust-version = "1.82" # Tauri's MSRV
repository = "https://github.com/SlimeVR/SlimeVR-Server"
[profile.release]
lto = "thin"

242
deny.toml
View File

@@ -1,242 +0,0 @@
# This template contains all of the possible sections and their default values
# Note that all fields that take a lint level have these possible values:
# * deny - An error will be produced and the check will fail
# * warn - A warning will be produced, but the check will not fail
# * allow - No warning or error will be produced, though in some cases a note
# will be
# The values provided in this template are the default values that will be used
# when any section or field is not specified in your own configuration
# Root options
# The graph table configures how the dependency graph is constructed and thus
# which crates the checks are performed against
[graph]
# If 1 or more target triples (and optionally, target_features) are specified,
# only the specified targets will be checked when running `cargo deny check`.
# This means, if a particular package is only ever used as a target specific
# dependency, such as, for example, the `nix` crate only being used via the
# `target_family = "unix"` configuration, that only having windows targets in
# this list would mean the nix crate, as well as any of its exclusive
# dependencies not shared by any other crates, would be ignored, as the target
# list here is effectively saying which targets you are building for.
targets = [
# The triple can be any string, but only the target triples built in to
# rustc (as of 1.40) can be checked against actual config expressions
#"x86_64-unknown-linux-musl",
# You can also specify which target_features you promise are enabled for a
# particular target. target_features are currently not validated against
# the actual valid features supported by the target architecture.
#{ triple = "wasm32-unknown-unknown", features = ["atomics"] },
]
# When creating the dependency graph used as the source of truth when checks are
# executed, this field can be used to prune crates from the graph, removing them
# from the view of cargo-deny. This is an extremely heavy hammer, as if a crate
# is pruned from the graph, all of its dependencies will also be pruned unless
# they are connected to another crate in the graph that hasn't been pruned,
# so it should be used with care. The identifiers are [Package ID Specifications]
# (https://doc.rust-lang.org/cargo/reference/pkgid-spec.html)
#exclude = []
# If true, metadata will be collected with `--all-features`. Note that this can't
# be toggled off if true, if you want to conditionally enable `--all-features` it
# is recommended to pass `--all-features` on the cmd line instead
all-features = false
# If true, metadata will be collected with `--no-default-features`. The same
# caveat with `all-features` applies
no-default-features = false
# If set, these feature will be enabled when collecting metadata. If `--features`
# is specified on the cmd line they will take precedence over this option.
#features = []
# The output table provides options for how/if diagnostics are outputted
[output]
# When outputting inclusion graphs in diagnostics that include features, this
# option can be used to specify the depth at which feature edges will be added.
# This option is included since the graphs can be quite large and the addition
# of features from the crate(s) to all of the graph roots can be far too verbose.
# This option can be overridden via `--feature-depth` on the cmd line
feature-depth = 1
# This section is considered when running `cargo deny check advisories`
# More documentation for the advisories section can be found here:
# https://embarkstudios.github.io/cargo-deny/checks/advisories/cfg.html
[advisories]
# The path where the advisory databases are cloned/fetched into
#db-path = "$CARGO_HOME/advisory-dbs"
# The url(s) of the advisory databases to use
#db-urls = ["https://github.com/rustsec/advisory-db"]
# A list of advisory IDs to ignore. Note that ignored advisories will still
# output a note when they are encountered.
ignore = [
#"RUSTSEC-0000-0000",
#{ id = "RUSTSEC-0000-0000", reason = "you can specify a reason the advisory is ignored" },
#"a-crate-that-is-yanked@0.1.1", # you can also ignore yanked crate versions if you wish
#{ crate = "a-crate-that-is-yanked@0.1.1", reason = "you can specify why you are ignoring the yanked crate" },
]
# If this is true, then cargo deny will use the git executable to fetch advisory database.
# If this is false, then it uses a built-in git library.
# Setting this to true can be helpful if you have special authentication requirements that cargo-deny does not support.
# See Git Authentication for more information about setting up git authentication.
#git-fetch-with-cli = true
# This section is considered when running `cargo deny check licenses`
# More documentation for the licenses section can be found here:
# https://embarkstudios.github.io/cargo-deny/checks/licenses/cfg.html
[licenses]
# List of explicitly allowed licenses
# See https://spdx.org/licenses/ for list of possible licenses
# [possible values: any SPDX 3.11 short identifier (+ optional exception)].
allow = [
"MIT",
"Apache-2.0",
"Apache-2.0 WITH LLVM-exception",
"Unicode-3.0",
"Unicode-DFS-2016",
"MIT-0",
"ISC",
"BSD-3-Clause",
"Zlib",
"MPL-2.0",
]
# The confidence threshold for detecting a license from license text.
# The higher the value, the more closely the license text must be to the
# canonical license text of a valid SPDX license file.
# [possible values: any between 0.0 and 1.0].
confidence-threshold = 0.8
# Allow 1 or more licenses on a per-crate basis, so that particular licenses
# aren't accepted for every possible crate as with the normal allow list
exceptions = [
# Each entry is the crate and version constraint, and its specific allow
# list
#{ allow = ["Zlib"], crate = "adler32" },
]
# Some crates don't have (easily) machine readable licensing information,
# adding a clarification entry for it allows you to manually specify the
# licensing information
#[[licenses.clarify]]
# The package spec the clarification applies to
#crate = "ring"
# The SPDX expression for the license requirements of the crate
#expression = "MIT AND ISC AND OpenSSL"
# One or more files in the crate's source used as the "source of truth" for
# the license expression. If the contents match, the clarification will be used
# when running the license check, otherwise the clarification will be ignored
# and the crate will be checked normally, which may produce warnings or errors
# depending on the rest of your configuration
#license-files = [
# Each entry is a crate relative path, and the (opaque) hash of its contents
#{ path = "LICENSE", hash = 0xbd0eed23 }
#]
[licenses.private]
# If true, ignores workspace crates that aren't published, or are only
# published to private registries.
# To see how to mark a crate as unpublished (to the official registry),
# visit https://doc.rust-lang.org/cargo/reference/manifest.html#the-publish-field.
ignore = false
# One or more private registries that you might publish crates to, if a crate
# is only published to private registries, and ignore is true, the crate will
# not have its license(s) checked
registries = [
#"https://sekretz.com/registry
]
# This section is considered when running `cargo deny check bans`.
# More documentation about the 'bans' section can be found here:
# https://embarkstudios.github.io/cargo-deny/checks/bans/cfg.html
[bans]
# Lint level for when multiple versions of the same crate are detected
multiple-versions = "warn"
# Lint level for when a crate version requirement is `*`
wildcards = "allow"
# The graph highlighting used when creating dotgraphs for crates
# with multiple versions
# * lowest-version - The path to the lowest versioned duplicate is highlighted
# * simplest-path - The path to the version with the fewest edges is highlighted
# * all - Both lowest-version and simplest-path are used
highlight = "all"
# The default lint level for `default` features for crates that are members of
# the workspace that is being checked. This can be overridden by allowing/denying
# `default` on a crate-by-crate basis if desired.
workspace-default-features = "allow"
# The default lint level for `default` features for external crates that are not
# members of the workspace. This can be overridden by allowing/denying `default`
# on a crate-by-crate basis if desired.
external-default-features = "allow"
# List of crates that are allowed. Use with care!
allow = [
#"ansi_term@0.11.0",
#{ crate = "ansi_term@0.11.0", reason = "you can specify a reason it is allowed" },
]
# List of crates to deny
deny = [
#"ansi_term@0.11.0",
#{ crate = "ansi_term@0.11.0", reason = "you can specify a reason it is banned" },
# Wrapper crates can optionally be specified to allow the crate when it
# is a direct dependency of the otherwise banned crate
#{ crate = "ansi_term@0.11.0", wrappers = ["this-crate-directly-depends-on-ansi_term"] },
]
# List of features to allow/deny
# Each entry the name of a crate and a version range. If version is
# not specified, all versions will be matched.
#[[bans.features]]
#crate = "reqwest"
# Features to not allow
#deny = ["json"]
# Features to allow
#allow = [
# "rustls",
# "__rustls",
# "__tls",
# "hyper-rustls",
# "rustls",
# "rustls-pemfile",
# "rustls-tls-webpki-roots",
# "tokio-rustls",
# "webpki-roots",
#]
# If true, the allowed features must exactly match the enabled feature set. If
# this is set there is no point setting `deny`
#exact = true
# Certain crates/versions that will be skipped when doing duplicate detection.
skip = [
#"ansi_term@0.11.0",
#{ crate = "ansi_term@0.11.0", reason = "you can specify a reason why it can't be updated/removed" },
]
# Similarly to `skip` allows you to skip certain crates during duplicate
# detection. Unlike skip, it also includes the entire tree of transitive
# dependencies starting at the specified crate, up to a certain depth, which is
# by default infinite.
skip-tree = [
#"ansi_term@0.11.0", # will be skipped along with _all_ of its direct and transitive dependencies
#{ crate = "ansi_term@0.11.0", depth = 20 },
]
# This section is considered when running `cargo deny check sources`.
# More documentation about the 'sources' section can be found here:
# https://embarkstudios.github.io/cargo-deny/checks/sources/cfg.html
[sources]
# Lint level for what to happen when a crate from a crate registry that is not
# in the allow list is encountered
unknown-registry = "warn"
# Lint level for what to happen when a crate from a git repository that is not
# in the allow list is encountered
unknown-git = "warn"
# List of URLs for allowed crate registries. Defaults to the crates.io index
# if not specified. If it is specified but empty, no registries are allowed.
allow-registry = ["https://github.com/rust-lang/crates.io-index"]
# List of URLs for allowed Git repositories
allow-git = []
[sources.allow-org]
# 1 or more github.com organizations to allow git sources for
github = [""]
# 1 or more gitlab.com organizations to allow git sources for
gitlab = [""]
# 1 or more bitbucket.org organizations to allow git sources for
bitbucket = [""]

39
flake.lock generated
View File

@@ -1,26 +1,5 @@
{
"nodes": {
"fenix": {
"inputs": {
"nixpkgs": [
"nixpkgs"
],
"rust-analyzer-src": "rust-analyzer-src"
},
"locked": {
"lastModified": 1756795219,
"narHash": "sha256-tKBQtz1JLKWrCJUxVkHKR+YKmVpm0KZdJdPWmR2slQ8=",
"owner": "nix-community",
"repo": "fenix",
"rev": "80dbdab137f2809e3c823ed027e1665ce2502d74",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "fenix",
"type": "github"
}
},
"flake-parts": {
"inputs": {
"nixpkgs-lib": "nixpkgs-lib"
@@ -72,27 +51,9 @@
},
"root": {
"inputs": {
"fenix": "fenix",
"flake-parts": "flake-parts",
"nixpkgs": "nixpkgs"
}
},
"rust-analyzer-src": {
"flake": false,
"locked": {
"lastModified": 1756597274,
"narHash": "sha256-wfaKRKsEVQDB7pQtAt04vRgFphkVscGRpSx3wG1l50E=",
"owner": "rust-lang",
"repo": "rust-analyzer",
"rev": "21614ed2d3279a9aa1f15c88d293e65a98991b30",
"type": "github"
},
"original": {
"owner": "rust-lang",
"ref": "nightly",
"repo": "rust-analyzer",
"type": "github"
}
}
},
"root": "root",

View File

@@ -1,74 +1,50 @@
{
description = "Affordable full-body tracking for VR!";
description = "SlimeVR Server & GUI";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-parts.url = "github:hercules-ci/flake-parts";
fenix = {
url = "github:nix-community/fenix";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs = inputs@{ self, nixpkgs, flake-parts, fenix, ... }:
outputs = inputs@{ self, nixpkgs, flake-parts, ... }:
flake-parts.lib.mkFlake { inherit inputs; } {
systems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ];
systems = [ "x86_64-linux" ];
perSystem = { system, lib, ... }:
perSystem = { pkgs, ... }:
let
pkgs = import nixpkgs { inherit system; };
runtimeLibs = pkgs: (with pkgs; [
jdk17
rust_toolchain = lib.importTOML ./rust-toolchain.toml;
fenixPkgs = fenix.packages.${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
rustToolchainSet = fenixPkgs.fromToolchainName {
name = rust_toolchain.toolchain.channel;
sha256 = "sha256-+9FmLhAOezBZCOziO0Qct1NOrfpjNsXxc/8I0c7BdKE=";
};
in {
wineWow64Packages.stable
zlib squashfsTools fakeroot libarchive icu
nodejs_22 pnpm pkg-config python3 gcc gnumake binutils git
pkgs.nodePackages.node-gyp-build
]);
devShells.default = pkgs.mkShell {
name = "slimevr";
slimeShell = pkgs.buildFHSEnv {
name = "slimevr-env";
targetPkgs = runtimeLibs;
profile = ''
export JAVA_HOME=${pkgs.jdk17}
export PATH="${pkgs.jdk17}/bin:$PATH"
buildInputs =
(with pkgs; [
cacert
]) ++ lib.optionals pkgs.stdenv.isLinux (with pkgs; [
atk cairo dbus dbus.lib dprint gdk-pixbuf glib.out glib-networking
gobject-introspection gtk3 harfbuzz libffi libsoup_3 openssl.dev pango
pkg-config treefmt webkitgtk_4_1 zlib
gst_all_1.gstreamer gst_all_1.gst-plugins-base
gst_all_1.gst-plugins-good gst_all_1.gst-plugins-bad
librsvg freetype expat libayatana-appindicator udev libusb1
]) ++ lib.optionals pkgs.stdenv.isDarwin [
pkgs.darwin.apple_sdk.frameworks.Security
] ++ [
pkgs.jdk17
pkgs.kotlin
rustToolchainSet.rustc
rustToolchainSet.cargo
rustToolchainSet.rustfmt
];
nativeBuildInputs = with pkgs; [ pnpm nodejs_22 gradle ];
RUST_BACKTRACE = 1;
GIO_EXTRA_MODULES = "${pkgs.glib-networking}/lib/gio/modules:${pkgs.dconf.lib}/lib/gio/modules";
shellHook = ''
export SLIMEVR_RUST_LD_LIBRARY_PATH="$LD_LIBRARY_PATH"
export LD_LIBRARY_PATH="${pkgs.udev}/lib:${pkgs.libayatana-appindicator}/lib:$LD_LIBRARY_PATH"
export GST_PLUGIN_SYSTEM_PATH_1_0="${pkgs.gst_all_1.gstreamer.out}/lib/gstreamer-1.0:${pkgs.gst_all_1.gst-plugins-base}/lib/gstreamer-1.0:${pkgs.gst_all_1.gst-plugins-good}/lib/gstreamer-1.0:${pkgs.gst_all_1.gst-plugins-bad}/lib/gstreamer-1.0"
# Force linker and pkg-config to use udev from nixpkgs so libgudev/hidapi
# resolve against the correct libudev implementation at link time.
export PKG_CONFIG_PATH="${pkgs.udev}/lib/pkgconfig:${pkgs.glib}/lib/pkgconfig:$PKG_CONFIG_PATH"
export LIBRARY_PATH="${pkgs.udev}/lib:$LIBRARY_PATH"
export LD_RUN_PATH="${pkgs.udev}/lib:$LD_RUN_PATH"
export NIX_LDFLAGS="-L${pkgs.udev}/lib -ludev $NIX_LDFLAGS"
export LDFLAGS="-L${pkgs.udev}/lib -Wl,-rpath,${pkgs.udev}/lib -ludev $LDFLAGS"
# 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;
};
};
}

View File

@@ -13,8 +13,10 @@ android.useAndroidX=true
android.nonTransitiveRClass=true
org.gradle.unsafe.configuration-cache=false
kotlinVersion=2.0.20
spotlessVersion=8.0.0
shadowJarVersion=8.3.2
buildconfigVersion=5.5.0
grgitVersion=5.2.2
kotlinVersion=2.3.10
spotlessVersion=8.2.1
shadowJarVersion=9.3.1
buildconfigVersion=6.0.7
# We should probably stop using grgit, see:
# https://andrewoberstar.com/posts/2024-04-02-dont-commit-to-grgit/
grgitVersion=5.3.3

View File

@@ -1,7 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip
distributionSha256Sum=bd71102213493060956ec229d946beee57158dbd89d0e62b91bca0fa2c5f3531
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.4-bin.zip
distributionSha256Sum=f1771298a70f6db5a29daf62378c4e18a17fc33c9ba6b14362e0cdf40610380d
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME

4
gui/.gitignore vendored
View File

@@ -29,9 +29,13 @@ yarn-error.log*
/dist
/stats.html
vite.config.ts.timestamp*
electron.vite.config.*.mjs
# eslint
.eslintcache
# Sentry Config File
.env.sentry-build-plugin
# electron
out/

70
gui/electron-builder.yml Normal file
View File

@@ -0,0 +1,70 @@
appId: dev.slimevr.SlimeVR
productName: SlimeVR
# Global naming pattern
artifactName: "${productName}-${version}-${os}-${arch}.${ext}"
directories:
output: dist/artifacts/${os}
asar: true
asarUnpack:
- out/main/chunks/*.jar
electronLanguages:
- en-US
files:
- out/**/*
- index.html
- package.json
- node_modules/**
- "!node_modules/*/{README,readme,README.md,readme.md,CHANGELOG,CHANGELOG.md,changelog.md}"
- "!node_modules/*/{test,tests,__tests__,docs,doc,example,examples}"
- "!node_modules/*/.{git,github,vscode,editorconfig,eslintrc,prettierrc}"
- "!node_modules/**/*.{map,ts,tsx,d.ts}"
- "!**/.DS_Store"
linux:
category: Game
artifactName: "${productName}-${arch}.${ext}"
target:
- target: AppImage
- target: deb
- target: rpm
extraFiles:
- from: "../server/desktop/build/libs/slimevr.jar"
to: "."
- from: "./electron/resources/69-slimevr-devices.rules"
to: "."
icon: "./electron/resources/icons"
deb:
depends: [openjdk-17-jre-headless, udev]
afterInstall: "./electron/resources/scripts/postinstall.sh"
afterRemove: "./electron/resources/scripts/postremove.sh"
rpm:
depends: [java-latest-openjdk, udev]
afterInstall: "./electron/resources/scripts/postinstall.sh"
afterRemove: "./electron/resources/scripts/postremove.sh"
win:
artifactName: "${productName}-${os}-${arch}.${ext}"
target: zip
icon: "./electron/resources/icons/icon.ico"
extraFiles:
- from: "../server/desktop/build/libs/slimevr.jar"
to: "."
- from: "../server/core/resources"
to: "."
filter: ["**/*"]
mac:
target: dmg
artifactName: "SlimeVR-mac.${ext}"
x64ArchFiles: "**/register-protocol-handler.node"
icon: "./electron/resources/icons/icon.icns"
extraFiles:
- from: "../server/desktop/build/libs/slimevr.jar"
to: "Resources/slimevr.jar"

View 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
View File

@@ -0,0 +1 @@
resources/java-version/JavaVersion.class

12
gui/electron/main/cli.ts Normal file
View File

@@ -0,0 +1,12 @@
import { program } from "commander";
program
.option('-p --path <path>', 'set launch path')
.option(
'--skip-server-if-running',
'gui will not launch the server if it is already running'
)
.allowUnknownOption();
program.parse(process.argv);
export const options = program.opts();

477
gui/electron/main/index.ts Normal file
View File

@@ -0,0 +1,477 @@
import {
app,
BrowserWindow,
dialog,
Menu,
nativeImage,
net,
protocol,
screen,
shell,
Tray,
} from 'electron';
import { IPC_CHANNELS } from '../shared';
import path, { dirname, join } from 'path';
import open from 'open';
import trayIcon from '../resources/icons/icon.png?asset';
import appleTrayIcon from '../resources/icons/Square30x30Logo.png?asset';
import { readFile, stat } from 'fs/promises';
import { getPlatform, handleIpc, isPortAvailable } from './utils';
import {
findServerJar,
findSystemJRE,
getGuiDataFolder,
getLogsFolder,
getServerDataFolder,
getWindowStateFile,
} from './paths';
import { stores } from './store';
import { closeLogger, logger } from './logger';
import { writeFileSync } from 'node:fs';
import { spawn } from 'node:child_process';
import { discordPresence } from './presence';
import { options } from './cli';
import { ServerStatusEvent } from 'electron/preload/interface';
import { mkdir } from 'node:fs/promises';
import { MenuItem } from 'electron/main';
// Fixes colors looking washed on linux
// Might affect hdr
if (process.platform === 'linux') {
app.commandLine.appendSwitch('disable-features', 'WaylandWpColorManagerV1');
app.commandLine.appendSwitch('force-color-profile', 'srgb');
}
app.setPath('userData', getGuiDataFolder());
app.setPath('sessionData', join(getGuiDataFolder(), 'electron'));
protocol.registerSchemesAsPrivileged([
{
scheme: 'app',
privileges: {
standard: true,
secure: true,
supportFetchAPI: true,
corsEnabled: true,
},
},
]);
let mainWindow: BrowserWindow | null = null;
handleIpc(IPC_CHANNELS.GH_FETCH, async (e, options) => {
if (options.type === 'fw-releases') {
return fetch(
'https://api.github.com/repos/SlimeVR/SlimeVR-Tracker-ESP/releases'
).then((res) => res.json());
}
if (options.type === 'asset') {
if (
!options.url.startsWith(
'https://github.com/SlimeVR/SlimeVR-Tracker-ESP/releases/download'
)
)
return null;
return fetch(options.url).then((res) => res.json());
}
});
handleIpc(IPC_CHANNELS.OS_STATS, async () => {
return {
type: getPlatform(),
};
});
handleIpc(IPC_CHANNELS.I18N_OVERRIDE, async () => {
const overridefile = join(getServerDataFolder(), 'override.ftl');
const exists = await stat(overridefile)
.then(() => true)
.catch(() => false);
if (!exists) return false;
return readFile(overridefile, { encoding: 'utf-8' });
});
handleIpc(IPC_CHANNELS.LOG, (e, type, ...args) => {
let payload: Record<string, unknown> = {};
const messageParts: unknown[] = [];
args.forEach((arg) => {
if (arg instanceof Error) {
payload.err = arg;
} else if (typeof arg === 'object' && arg !== null) {
payload = { ...payload, ...arg };
} else {
messageParts.push(arg);
}
});
const msg = messageParts.join(' ');
switch (type) {
case 'error':
logger.error(payload, msg);
break;
case 'warn':
logger.warn(payload, msg);
break;
default:
logger.info(payload, msg);
}
});
handleIpc(IPC_CHANNELS.OPEN_URL, (e, url) => {
const allowed_urls = [
/steam:\/\/.*/,
/ms-settings:network$/,
/https:\/\/.*\.slimevr\.dev.*/,
/https:\/\/github\.com\/.*/,
/https:\/\/discord\.gg\/slimevr$/,
];
if (allowed_urls.find((a) => url.match(a))) open(url);
else logger.error({ url }, 'attempted to open non-whitelisted URL');
});
handleIpc(IPC_CHANNELS.STORAGE, async (e, { type, method, key, value }) => {
const store = stores[type];
if (!store) throw new Error(`Storage type ${type} not found`);
switch (method) {
case 'get':
return store.get(key!);
case 'set':
return store.set(key!, value);
case 'delete':
return store.delete(key!);
case 'save':
return store.save();
}
});
handleIpc(IPC_CHANNELS.DISCORD_PRESENCE, async (e, options) => {
if (options.enable && !discordPresence.state.ready) {
await discordPresence.connect();
discordPresence.updateActivity(options.activity);
} else if (!options.enable && discordPresence.state.ready) {
discordPresence.destroy();
}
});
handleIpc(IPC_CHANNELS.OPEN_FILE, (e, folder) => {
const requestedPath = path.resolve(folder);
const isAllowed = [getServerDataFolder(), getGuiDataFolder(), getLogsFolder()].some(
(parent) => {
const absoluteParent = path.resolve(parent);
const relative = path.relative(absoluteParent, requestedPath);
return !relative.includes('..') && !path.isAbsolute(relative);
}
);
if (isAllowed) {
shell.openPath(requestedPath);
} else {
logger.error({ path: requestedPath }, 'Blocked unauthorized path');
}
});
handleIpc(IPC_CHANNELS.GET_FOLDER, (e, folder) => {
switch (folder) {
case 'config':
return getGuiDataFolder();
case 'logs':
return getLogsFolder();
}
});
const windowStateFile = await readFile(getWindowStateFile(), {
encoding: 'utf-8',
}).catch(() => null);
const defaultWindowState: {
width: number;
height: number;
x?: number;
y?: number;
} = {
width: 1289.0,
height: 709.0,
x: undefined,
y: undefined,
};
const windowState = windowStateFile ? JSON.parse(windowStateFile) : defaultWindowState;
const MIN_WIDTH = 393;
const MIN_HEIGHT = 667;
function validateWindowState(state: typeof defaultWindowState) {
if (state.x === undefined || state.y === undefined) {
return state;
}
const displays = screen.getAllDisplays();
const isVisible = displays.some((display) => {
return (
state.x! >= display.bounds.x &&
state.y! >= display.bounds.y &&
state.x! + state.width <= display.bounds.x + display.bounds.width &&
state.y! + state.height <= display.bounds.y + display.bounds.height
);
});
const minWidth = MIN_WIDTH;
const minHeight = MIN_HEIGHT;
if (!isVisible || state.width < minWidth || state.height < minHeight) {
return defaultWindowState;
}
return state;
}
const saveWindowState = async () => {
await mkdir(dirname(getWindowStateFile()), { recursive: true });
writeFileSync(getWindowStateFile(), JSON.stringify(windowState));
};
function createWindow() {
const validatedState = validateWindowState(windowState);
mainWindow = new BrowserWindow({
width: validatedState.width,
height: validatedState.height,
x: validatedState.x,
y: validatedState.y,
minHeight: MIN_HEIGHT,
minWidth: MIN_WIDTH,
movable: true,
frame: false,
roundedCorners: true,
webPreferences: {
preload: join(__dirname, '../preload/index.js'),
nodeIntegration: false,
contextIsolation: true,
devTools: true,
},
});
if (process.env.ELECTRON_RENDERER_URL) {
mainWindow.loadURL(process.env.ELECTRON_RENDERER_URL);
mainWindow.webContents.openDevTools();
} else {
mainWindow.loadURL('app://./index.html');
}
mainWindow.on('closed', () => {
mainWindow = null;
});
handleIpc('window-actions', (e, action) => {
switch (action) {
case 'close':
mainWindow?.close();
break;
case 'hide':
mainWindow?.hide();
break;
case 'minimize':
mainWindow?.minimize();
break;
case 'maximize':
mainWindow?.maximize();
break;
}
});
handleIpc('open-dialog', (e, options) => dialog.showOpenDialog(options));
handleIpc('save-dialog', (e, options) => dialog.showSaveDialog(options));
const icon = nativeImage.createFromPath(
getPlatform() === 'macos' ? appleTrayIcon : trayIcon
);
const tray = new Tray(icon);
tray.setToolTip('SlimeVR');
tray.on('click', () => {
mainWindow?.show();
});
const contextMenu = Menu.buildFromTemplate([
{
label: 'Show',
click: () => {
mainWindow?.show();
},
},
{
label: 'Hide',
click: () => {
mainWindow?.hide();
},
},
{ role: 'quit' },
]);
tray.setContextMenu(contextMenu);
const updateWindowState = () => {
if (!mainWindow) return;
windowState.minimized = mainWindow.isMinimized();
if (!mainWindow.isMinimized() && !mainWindow.isMaximized()) {
const bounds = mainWindow.getBounds();
windowState.width = bounds.width;
windowState.height = bounds.height;
windowState.x = bounds.x;
windowState.y = bounds.y;
}
};
mainWindow.on('move', updateWindowState);
mainWindow.on('resize', updateWindowState);
mainWindow.on('minimize', updateWindowState);
mainWindow.on('maximize', updateWindowState);
mainWindow.webContents.on('context-menu', (event, params) => {
const menu = new Menu();
menu.append(
new MenuItem({
label: 'Inspect Element',
click: () => {
mainWindow?.webContents.inspectElement(params.x, params.y);
},
})
);
menu.append(new MenuItem({ type: 'separator' }));
menu.append(new MenuItem({ label: 'Copy', role: 'copy' }));
menu.append(new MenuItem({ label: 'Paste', role: 'paste' }));
if (mainWindow) menu.popup({ window: mainWindow });
});
}
const checkEnvironmentVariables = () => {
const to_check = ['_JAVA_OPTIONS', 'JAVA_TOOL_OPTIONS'];
const set = to_check.filter((env) => !!process.env[env]);
if (set.length > 0) {
dialog.showErrorBox(
'SlimeVR',
`You have environment variables ${set.join(', ')} set, which may cause the SlimeVR Server to fail to launch properly.`
);
app.quit();
}
};
const isServerRunning = async () => !(await isPortAvailable(21110));
const spawnServer = async () => {
if (options.skipServerIfRunning && (await isServerRunning())) {
logger.info(
{ skipServerIfRunning: options.skipServerIfRunning },
'Server is already running, skipping server start'
);
return;
}
const serverJar = findServerJar();
if (!serverJar) {
logger.info('server jar not found, skipping');
return;
}
const sharedDir = dirname(serverJar);
const javaBin = await findSystemJRE(sharedDir);
if (!javaBin) {
dialog.showErrorBox(
'SlimeVR',
`Couldn't find a compatible Java version, please download Java 17 or higher`
);
app.quit()
return;
}
logger.info({ javaBin, serverJar }, 'Found Java and server jar');
const platform = getPlatform();
const serverWorkdir = getServerDataFolder()
const serverProcess = spawn(javaBin, ['-Xmx128M', '-jar', serverJar, 'run'], {
cwd: serverWorkdir,
shell: false,
env:
platform === 'windows'
? {
...process.env,
APPDATA: app.getPath('appData'),
LOCALAPPDATA: process.env['USERPROFILE'] ? path.join(process.env['USERPROFILE'], 'AppData', 'Local') : undefined,
}
: undefined,
});
const sendToWindow = (event: ServerStatusEvent) => {
if (mainWindow && !mainWindow.webContents.isDestroyed()) {
mainWindow.webContents.send(IPC_CHANNELS.SERVER_STATUS, event);
}
};
serverProcess.stdout?.on('data', (message) => {
sendToWindow({ message: message.toString(), type: 'stdout' });
});
serverProcess.stderr?.on('data', (message) => {
sendToWindow({ message: message.toString(), type: 'stderr' });
});
serverProcess.on('error', (err) => {
logger.info({ err }, 'Error launching the java server');
if (!isQuitting) app.quit();
})
serverProcess.on('exit', () => {
logger.info('Server process exiting');
})
const exited = new Promise<void>((resolve) => serverProcess.once('exit', resolve));
return {
process: serverProcess,
close: () => serverProcess.kill(),
waitForExit: () => exited,
};
};
let isQuitting = false;
app.whenReady().then(async () => {
// Register protocol handler for app:// scheme to handle assets with leading slashes
protocol.handle('app', (request) => {
const url = request.url.slice('app://'.length);
const filePath = path.normalize(join(__dirname, '../renderer', url));
return net.fetch('file://' + filePath);
});
checkEnvironmentVariables();
const server = await spawnServer();
createWindow();
logger.info('SlimeVR started!');
app.on('window-all-closed', () => {
app.quit();
});
app.on('before-quit', async (event) => {
if (isQuitting) return;
isQuitting = true;
event.preventDefault();
logger.info('App quitting, saving...');
server?.close();
await server?.waitForExit();
stores.settings.save();
stores.cache.save();
discordPresence.destroy();
await saveWindowState();
await closeLogger();
app.exit(0);
});
});

View File

@@ -0,0 +1,34 @@
import pino from 'pino';
import { getLogsFolder } from './paths';
import { join } from 'node:path';
const transport = pino.transport({
targets: [
{
target: 'pino-roll',
options: {
file: join(getLogsFolder(), 'slimevr-gui.log'),
frequency: 'daily',
size: '10m',
mkdir: true,
limit: { count: 7 },
},
level: 'info',
},
{
target: 'pino-pretty',
options: { colorize: true },
level: 'debug',
},
],
});
export const logger = pino(transport);
export const closeLogger = () =>
new Promise<void>((resolve) => {
logger.flush(() => {
transport.once('close', resolve);
transport.end();
});
});

120
gui/electron/main/paths.ts Normal file
View File

@@ -0,0 +1,120 @@
import { app } from 'electron';
import path, { join } from 'node:path';
import { getPlatform } from './utils';
import { glob } from 'glob';
import { spawn } from 'node:child_process';
import javaVersionJar from '../resources/java-version/JavaVersion.jar?asset&asarUnpack';
import { existsSync } from 'node:fs';
import { options } from './cli';
const javaBin = getPlatform() === 'windows' ? 'java.exe' : 'java';
export const CONFIG_IDENTIFIER = 'dev.slimevr.SlimeVR';
export const getGuiDataFolder = () => {
const platform = getPlatform();
switch (platform) {
case 'linux':
if (process.env['XDG_DATA_HOME'])
return join(process.env['XDG_DATA_HOME'], CONFIG_IDENTIFIER);
return join(app.getPath('home'), '.local/share', CONFIG_IDENTIFIER);
case 'windows':
return join(app.getPath('appData'), CONFIG_IDENTIFIER);
case 'macos':
return join(
app.getPath('home'),
'Library/Application Support',
CONFIG_IDENTIFIER
);
case 'unknown':
throw 'error';
}
};
export const getServerDataFolder = () => {
const platform = getPlatform();
switch (platform) {
case 'linux':
case 'windows':
case 'macos':
return join(app.getPath('appData'), CONFIG_IDENTIFIER);
case 'unknown':
throw 'error';
}
};
export const getLogsFolder = () => {
return join(getGuiDataFolder(), 'logs');
};
export const getWindowStateFile = () =>
join(getServerDataFolder(), '.window-state.json');
const localJavaBin = (sharedDir: string) => {
const jre = join(sharedDir, 'jre/bin', javaBin);
return jre;
};
const javaHomeBin = () => {
const javaHome = process.env['JAVA_HOME'];
if (!javaHome) return null;
const javaHomeJre = join(javaHome, 'bin', javaBin);
return javaHomeJre;
};
export const findSystemJRE = async (sharedDir: string) => {
const paths = [
localJavaBin(sharedDir),
javaHomeBin(),
...(await glob('/usr/lib/jvm/*/bin/' + javaBin)),
...(await glob('/Library/Java/JavaVirtualMachines/*/Contents/Home/bin/' + javaBin)),
];
for (const path of paths) {
if (!path) continue;
const version = await new Promise<number | null>((resolve) => {
const process = spawn(path, ['-jar', javaVersionJar], {});
let version: number | null = null;
process.stdout?.once('data', (data) => {
try {
version = parseFloat(data.toString());
} catch {
version = null;
}
});
process.on('error', () => {
resolve(null);
});
process.on('exit', () => {
resolve(version);
});
});
if (version && version >= 17) return path;
}
return null;
};
export const findServerJar = () => {
const paths = [
options.path ? path.resolve(options.path) : undefined,
app.isPackaged ? path.resolve(process.resourcesPath) : undefined,
// AppImage passes the fakeroot in `APPDIR` env var.
process.env['APPDIR']
? path.resolve(join(process.env['APPDIR'], 'usr/share/slimevr/'))
: undefined,
path.dirname(app.getPath('exe')),
// For flatpack container
path.resolve('/app/share/slimevr/'),
path.resolve('/usr/share/slimevr/'),
];
return paths
.filter((p) => !!p)
.map((p) => join(p!, 'slimevr.jar'))
.find((p) => existsSync(p));
};

View 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();

View 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),
};

View 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);
});
}

View File

@@ -0,0 +1,40 @@
import { contextBridge, ipcRenderer, IpcRendererEvent } from 'electron';
import { IElectronAPI, ServerStatusEvent } from './interface';
import { IPC_CHANNELS } from '../shared';
contextBridge.exposeInMainWorld('electronAPI', {
onServerStatus: (callback) => {
const subscription = (_event: IpcRendererEvent, value: ServerStatusEvent) =>
callback(value);
ipcRenderer.on(IPC_CHANNELS.SERVER_STATUS, subscription);
return () => ipcRenderer.removeListener(IPC_CHANNELS.SERVER_STATUS, subscription);
},
openUrl: (url) => ipcRenderer.invoke(IPC_CHANNELS.OPEN_URL, url),
osStats: () => ipcRenderer.invoke(IPC_CHANNELS.OS_STATS),
close: () => ipcRenderer.invoke(IPC_CHANNELS.WINDOW_ACTIONS, 'close'),
hide: () => ipcRenderer.invoke(IPC_CHANNELS.WINDOW_ACTIONS, 'hide'),
minimize: () => ipcRenderer.invoke(IPC_CHANNELS.WINDOW_ACTIONS, 'minimize'),
maximize: () => ipcRenderer.invoke(IPC_CHANNELS.WINDOW_ACTIONS, 'maximize'),
getStorage: async (type) => {
return {
get: (key) =>
ipcRenderer.invoke(IPC_CHANNELS.STORAGE, { type, method: 'get', key }),
set: (key, value) =>
ipcRenderer.invoke(IPC_CHANNELS.STORAGE, { type, method: 'set', key, value }),
delete: (key) =>
ipcRenderer.invoke(IPC_CHANNELS.STORAGE, { type, method: 'delete', key }),
save: () => ipcRenderer.invoke(IPC_CHANNELS.STORAGE, { type, method: 'save' }),
};
},
log: (type, ...args) => ipcRenderer.invoke(IPC_CHANNELS.LOG, type, ...args),
i18nOverride: async () => ipcRenderer.invoke(IPC_CHANNELS.I18N_OVERRIDE),
showDecorations: () => {},
setTranslations: () => {},
openDialog: (options) => ipcRenderer.invoke(IPC_CHANNELS.OPEN_DIALOG, options),
saveDialog: (options) => ipcRenderer.invoke(IPC_CHANNELS.SAVE_DIALOG, options),
openConfigFolder: async () => ipcRenderer.invoke(IPC_CHANNELS.OPEN_FILE, await ipcRenderer.invoke(IPC_CHANNELS.GET_FOLDER, 'config')),
openLogsFolder: async () => ipcRenderer.invoke(IPC_CHANNELS.OPEN_FILE, await ipcRenderer.invoke(IPC_CHANNELS.GET_FOLDER, 'logs')),
openFile: (path) => ipcRenderer.invoke(IPC_CHANNELS.OPEN_FILE, path),
ghGet: (req) => ipcRenderer.invoke(IPC_CHANNELS.GH_FETCH, req),
setPresence: (options) => ipcRenderer.invoke(IPC_CHANNELS.DISCORD_PRESENCE, options)
} satisfies IElectronAPI);

65
gui/electron/preload/interface.d.ts vendored Normal file
View File

@@ -0,0 +1,65 @@
import {
OpenDialogOptions,
OpenDialogReturnValue,
SaveDialogOptions,
SaveDialogReturnValue,
} from 'electron';
export type ServerStatusEvent = {
type: 'stdout' | 'stderr' | 'error' | 'terminated' | 'other';
message: string;
};
export type OSStats = {
type: 'linux' | 'windows' | 'macos' | 'unknown';
};
export interface CrossStorage {
set(key: string, value: unknown): Promise<void>;
get<T>(key: string): Promise<T | undefined>;
delete(key: string): Promise<boolean>;
save(): Promise<boolean>;
}
export type GHGet = { type: 'fw-releases' } | { type: 'asset'; url: string };
export type GHReturn = {
asset: [number, string][] | null;
['fw-releases']:
| {
assets: { browser_download_url: string; name: string; digest: string }[];
prerelease: boolean;
tag_name: string;
body: string;
}[]
| null;
};
export type DiscordPresence = { enable: false } | { enable: true, activity: string }
export interface IElectronAPI {
onServerStatus: (cb: (data: ServerStatusEvent) => void) => () => void;
openUrl: (url: string) => Promise<void>;
osStats: () => Promise<OSStats>;
openLogsFolder: () => Promise<void>;
openConfigFolder: () => Promise<void>;
close: () => void;
hide: () => void;
minimize: () => void;
maximize: () => void;
showDecorations: (decorations: boolean) => void;
setTranslations: (translations: Record<string, string>) => void;
i18nOverride: () => Promise<string | false>;
getStorage: (type: 'settings' | 'cache') => Promise<CrossStorage>;
openDialog: (options: OpenDialogOptions) => Promise<OpenDialogReturnValue>;
saveDialog: (options: SaveDialogOptions) => Promise<SaveDialogReturnValue>;
log: (type: 'info' | 'error' | 'warn', ...args: unknown[]) => void;
openFile: (path: string) => void;
ghGet: <T extends GHGet>(options: T) => Promise<GHReturn[T['type']]>;
setPresence: (options: DiscordPresence) => void;
}
declare global {
interface Window {
electronAPI: IElectronAPI;
}
}

View File

@@ -18,6 +18,8 @@ SUBSYSTEMS=="usb", ATTRS{idVendor}=="1A86", ATTRS{idProduct}=="7522", MODE="0660
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"
@@ -26,8 +28,10 @@ SUBSYSTEMS=="usb", ATTRS{idVendor}=="1A86", ATTRS{idProduct}=="55D4", MODE="0660
SUBSYSTEMS=="usb", ATTRS{idVendor}=="10C4", ATTRS{idProduct}=="EA60", MODE="0660", TAG+="uaccess"
## Espressif
# ESP32-C3
# 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

View File

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

View File

Before

Width:  |  Height:  |  Size: 747 B

After

Width:  |  Height:  |  Size: 747 B

View File

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

Before

Width:  |  Height:  |  Size: 698 B

After

Width:  |  Height:  |  Size: 698 B

View File

Before

Width:  |  Height:  |  Size: 6.8 KiB

After

Width:  |  Height:  |  Size: 6.8 KiB

View File

Before

Width:  |  Height:  |  Size: 1008 B

After

Width:  |  Height:  |  Size: 1008 B

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 922 B

After

Width:  |  Height:  |  Size: 922 B

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 579 B

After

Width:  |  Height:  |  Size: 579 B

View File

Before

Width:  |  Height:  |  Size: 555 B

After

Width:  |  Height:  |  Size: 555 B

View File

Before

Width:  |  Height:  |  Size: 848 B

After

Width:  |  Height:  |  Size: 848 B

View File

Before

Width:  |  Height:  |  Size: 848 B

After

Width:  |  Height:  |  Size: 848 B

View File

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

Before

Width:  |  Height:  |  Size: 645 B

After

Width:  |  Height:  |  Size: 645 B

View File

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

Before

Width:  |  Height:  |  Size: 848 B

After

Width:  |  Height:  |  Size: 848 B

View File

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

View 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);
}
}

View File

@@ -0,0 +1,26 @@
#!/bin/bash
SRC="/opt/SlimeVR/69-slimevr-devices.rules"
DESTDIRS=("/lib" "/usr/lib")
if [[ ! -f "$SRC" ]]; then
echo "SlimeVR udev rules not found, serial console and dongles may not work" >&2
exit 0
fi
echo "Configuring SlimeVR udev rules..."
for DIR in "${DESTDIRS[@]}"; do
if [[ -d "$DIR" && ! -h "$DIR" ]]; then
echo "Copying rules to $DIR"
install -Dm644 "$SRC" "$DIR/udev/rules.d/69-slimevr-devices.rules"
if command -v udevadm >/dev/null 2>&1; then
udevadm control --reload-rules
udevadm trigger
fi
exit 0
fi
done
echo "Couldn't copy SlimeVR udev rules, serial console and dongles may not work" >&2

View File

@@ -0,0 +1,8 @@
#!/bin/bash
echo "Removing SlimeVR udev rules..."
rm -f "/lib/udev/rules.d/69-slimevr-devices.rules"
rm -f "/usr/lib/udev/rules.d/69-slimevr-devices.rules"
if command -v udevadm >/dev/null 2>&1; then
udevadm control --reload-rules
fi

49
gui/electron/shared.ts Normal file
View File

@@ -0,0 +1,49 @@
import {
OpenDialogOptions,
OpenDialogReturnValue,
SaveDialogOptions,
SaveDialogReturnValue,
} from 'electron';
import { DiscordPresence, GHGet, GHReturn, OSStats } from './preload/interface';
export const IPC_CHANNELS = {
SERVER_STATUS: 'server-status',
OPEN_URL: 'open-url',
OS_STATS: 'os-stats',
WINDOW_ACTIONS: 'window-actions',
LOG: 'log',
STORAGE: 'storage',
OPEN_DIALOG: 'open-dialog',
SAVE_DIALOG: 'save-dialog',
I18N_OVERRIDE: 'i18n-override',
OPEN_FILE: 'open-file',
GET_FOLDER: 'get-folder',
GH_FETCH: 'gh-fetch',
DISCORD_PRESENCE: 'discord-presence'
} as const;
export interface IpcInvokeMap {
[IPC_CHANNELS.OPEN_URL]: (url: string) => void;
[IPC_CHANNELS.OS_STATS]: () => Promise<OSStats>;
[IPC_CHANNELS.WINDOW_ACTIONS]: (action: 'close' | 'minimize' | 'maximize' | 'hide') => void;
[IPC_CHANNELS.LOG]: (type: 'info' | 'error' | 'warn', ...args: unknown[]) => void;
[IPC_CHANNELS.OPEN_DIALOG]: (
options: OpenDialogOptions
) => Promise<OpenDialogReturnValue>;
[IPC_CHANNELS.SAVE_DIALOG]: (
options: SaveDialogOptions
) => Promise<SaveDialogReturnValue>;
[IPC_CHANNELS.I18N_OVERRIDE]: () => Promise<string | false>;
[IPC_CHANNELS.STORAGE]: (args: {
type: 'settings' | 'cache';
method: 'get' | 'set' | 'delete' | 'save';
key?: string;
value?: unknown;
}) => Promise<unknown>;
[IPC_CHANNELS.OPEN_FILE]: (path: string) => void;
[IPC_CHANNELS.GET_FOLDER]: (folder: 'config' | 'logs') => string;
[IPC_CHANNELS.GH_FETCH]: <T extends GHGet>(
options: T
) => Promise<GHReturn[T['type']]>;
[IPC_CHANNELS.DISCORD_PRESENCE]: (options: DiscordPresence) => void;
}

View File

@@ -1,82 +1,54 @@
{
"name": "slimevr-ui",
"version": "0.5.1",
"private": true,
"name": "slimevr",
"version": "0.0.0",
"author": "SlimeVR Team <contact@slimevr.dev>",
"homepage": "https://slimevr.dev",
"type": "module",
"dependencies": {
"@ryuziii/discord-rpc": "1.0.1-rc.1",
"@xhayper/discord-rpc": "^1.3.0",
"commander": "^14.0.3",
"discord-rich-presence": "^0.0.8",
"glob": "^13.0.3",
"open": "^11.0.0",
"pino": "^10.3.1",
"pino-pretty": "^13.1.3",
"pino-roll": "^4.0.0"
},
"scripts": {
"start": "vite --force",
"gui": "electron-vite dev --config electron.vite.config.ts --watch",
"build": "electron-vite build --config electron.vite.config.ts",
"package": "electron-builder",
"package:build": "pnpm build && pnpm package",
"preview": "electron-vite preview --config electron.vite.config.ts",
"skipbundler": "vite build",
"lint": "tsc --noEmit && eslint --max-warnings=0 \"src/**/*.{js,jsx,ts,tsx,json}\" && prettier --check \"src/**/*.{js,jsx,ts,tsx,css,scss,md,json}\"",
"lint:fix": "tsc --noEmit && eslint --fix --max-warnings=0 \"src/**/*.{js,jsx,ts,tsx,json}\" && pnpm run format",
"format": "prettier --write \"src/**/*.{js,jsx,ts,tsx,css,scss,md,json}\"",
"javaversion-build": "cd electron/resources/java-version/ && javac JavaVersion.java && jar cvfe JavaVersion.jar JavaVersion JavaVersion.class",
"gen:javaversion": "cd electron/resources/java-version/ && javac JavaVersion.java && jar cvfe JavaVersion.jar JavaVersion JavaVersion.class",
"gen:firmware-tool": "openapi-codegen gen firmwareTool"
},
"devDependencies": {
"@dword-design/eslint-plugin-import-alias": "^4.0.9",
"@electron/asar": "^4.0.1",
"@fluent/bundle": "^0.18.0",
"@fluent/react": "^0.15.2",
"@fontsource/poppins": "^5.1.0",
"@formatjs/intl-localematcher": "^0.2.32",
"@hookform/resolvers": "^3.6.0",
"@react-hookz/deep-equal": "^3.0.3",
"@react-three/drei": "^9.114.3",
"@react-three/fiber": "^8.17.10",
"@sentry/react": "10.29.0",
"@sentry/vite-plugin": "^2.22.7",
"@tailwindcss/typography": "^0.5.15",
"@tanstack/react-query": "^5.48.0",
"@tauri-apps/api": "^2.0.2",
"@tauri-apps/plugin-dialog": "^2.0.0",
"@tauri-apps/plugin-fs": "2.4.1",
"@tauri-apps/plugin-http": "^2.5.0",
"@tauri-apps/plugin-log": "~2",
"@tauri-apps/plugin-opener": "^2.4.0",
"@tauri-apps/plugin-os": "^2.0.0",
"@tauri-apps/plugin-shell": "^2.3.0",
"@tauri-apps/plugin-store": "^2.4.1",
"@tweenjs/tween.js": "^25.0.0",
"@twemoji/svg": "^15.0.0",
"ajv": "^8.17.1",
"browser-fs-access": "^0.35.0",
"classnames": "^2.5.1",
"convert": "^5.12.0",
"flatbuffers": "22.10.26",
"intl-pluralrules": "^2.0.1",
"ip-num": "^1.5.1",
"jotai": "^2.12.2",
"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",
"semver": "^7.6.3",
"solarxr-protocol": "file:../solarxr-protocol",
"three": "^0.163.0",
"ts-pattern": "^5.4.0",
"typescript": "^5.6.3",
"use-double-tap": "^1.3.6",
"uuid": "^13.0.0",
"yup": "^1.4.0"
},
"scripts": {
"start": "vite --force",
"build": "vite build",
"dev": "tauri dev",
"skipbundler": "tauri build --no-bundle",
"tauri": "tauri",
"lint": "tsc --noEmit && eslint --max-warnings=0 \"src/**/*.{js,jsx,ts,tsx,json}\" && prettier --check \"src/**/*.{js,jsx,ts,tsx,css,scss,md,json}\"",
"lint:fix": "tsc --noEmit && eslint --fix --max-warnings=0 \"src/**/*.{js,jsx,ts,tsx,json}\" && pnpm run format",
"format": "prettier --write \"src/**/*.{js,jsx,ts,tsx,css,scss,md,json}\"",
"preview-vite": "vite preview",
"javaversion-build": "cd src-tauri/src/ && javac JavaVersion.java && jar cvfe JavaVersion.jar JavaVersion JavaVersion.class",
"gen:javaversion": "cd src-tauri/src/ && javac JavaVersion.java && jar cvfe JavaVersion.jar JavaVersion JavaVersion.class",
"gen:firmware-tool": "openapi-codegen gen firmwareTool",
"gen:icons": "tauri icon --ios-color '#663499' src-tauri/icons/icon.svg"
},
"devDependencies": {
"@dword-design/eslint-plugin-import-alias": "^4.0.9",
"@openapi-codegen/cli": "^3.1.0",
"@openapi-codegen/typescript": "^8.0.2",
"@react-hookz/deep-equal": "^3.0.3",
"@sentry/react": "10.29.0",
"@sentry/vite-plugin": "^2.22.7",
"@stylistic/eslint-plugin": "^5.5.0",
"@tailwindcss/forms": "^0.5.9",
"@tauri-apps/cli": "~2",
"@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",
@@ -88,23 +60,54 @@
"@typescript-eslint/eslint-plugin": "^8.48.1",
"@typescript-eslint/parser": "^8.48.1",
"@vitejs/plugin-react": "^4.3.2",
"ajv": "^8.17.1",
"autoprefixer": "^10.4.20",
"cross-env": "^7.0.3",
"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",
"vite": "^5.4.8"
}
"use-double-tap": "^1.3.6",
"uuid": "^13.0.0",
"vite": "^5.4.8",
"yup": "^1.4.0"
},
"main": "./out/main/index.js"
}

Binary file not shown.

View File

@@ -10,7 +10,7 @@
websocket-connecting = Připojování k serveru
websocket-connection_lost = Ztraceno spojení se serverem. Pokouším se znovu připojit...
websocket-connection_lost-desc = Vypadá to že SlimeVR server spadl. Zkontrolujte záznamy protokolů a restartuje aplikaci
websocket-timedout = Nelze se připojit k serveru
websocket-timedout = Nepodařilo se připojit k serveru
websocket-timedout-desc = Vypadá to že buď vypršel časový limit SlimeVR serveru, a nebo došlo k zhroucení. Zkontrolujte záznamy protokolů a restartuje aplikaci
websocket-error-close = Ukončit SlimeVR
websocket-error-logs = Otevření složku s záznamy protokolů
@@ -33,6 +33,10 @@ tips-failed_webgl = Načtení WebGL selhalo.
## Units
unit-meter = Metr
unit-foot = Foot
unit-inch = Palec
unit-cm = cm
## Body parts
@@ -73,6 +77,8 @@ board_type-WEMOSD1MINI = Wemos D1 Mini
board_type-TTGO_TBASE = TTGO T-Base
board_type-ESP01 = ESP-01
board_type-SLIMEVR = SlimeVR
board_type-SLIMEVR_DEV = SlimeVR Dev Board
board_type-SLIMEVR_V1_2 = SlimeVR v1.2
board_type-LOLIN_C3_MINI = Lolin C3 Mini
board_type-BEETLE32C3 = Beetle ESP32-C3
board_type-ESP32C3DEVKITM1 = Espressif ESP32-C3 DevKitM-1
@@ -84,6 +90,11 @@ 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 vývojářská IMU rukavice
board_type-GESTURES = Gesta
board_type-ESP32S3_SUPERMINI = ESP32-S3 Supermini
board_type-GENERIC_NRF = Obecné nRF
board_type-SLIMEVR_BUTTERFLY_DEV = SlimeVR Dev Butterfly
board_type-SLIMEVR_BUTTERFLY = SlimeVR Butterfly
## Proportions
@@ -104,7 +115,7 @@ skeleton_bone-LOWER_LEG = Délka dolní části nohy
skeleton_bone-FOOT_LENGTH = Délka chodidla
skeleton_bone-FOOT_LENGTH-desc =
Toto je vzdálenost mezi vaši kotníky a prsty na nohou.
Pro upravení, Chodtě po špičkách dokud vaše virtuální nohy nezůstanou na místě.
Pro upravení, Choďte po špičkách dokud vaše virtuální nohy nezůstanou na místě.
skeleton_bone-FOOT_SHIFT = Odsazení chodidla
skeleton_bone-SKELETON_OFFSET = Odsazení kostry
skeleton_bone-SHOULDERS_DISTANCE = Vzdálenost ramen
@@ -129,7 +140,11 @@ reset-reset_all_warning_default-v2 =
Jste si jistí že to chcete udělat?
reset-full = Plný Reset
reset-mounting = Znovu nastavit nasazení
reset-mounting-feet = Obnovit pozice nasazení nohou
reset-mounting-fingers = Obnovit pozice nasazení prstů
reset-yaw = Rychlý reset
reset-error-no_feet_tracker = Žádný tracker nohou nebyl přiřazen
reset-error-no_fingers_tracker = Žádné trackery prstů nebyly přiřazeny
## Serial detection stuff
@@ -149,11 +164,14 @@ navbar-trackers_assign = Přiřazení trackerů
navbar-mounting = Kalibrace nasazení
navbar-onboarding = Průvodce nastavením
navbar-settings = Nastavení
navbar-connect_trackers = Připojte Trackery
## Biovision hierarchy recording
bvh-start_recording = Nahrát BVH
bvh-stop_recording = Uložit BVH záznam
bvh-recording = Nahrávání...
bvh-save_title = Uložit BVH záznam
## Tracking pause
@@ -194,7 +212,7 @@ widget-imu_visualizer-rotation_raw = Nezpracované
widget-imu_visualizer-rotation_preview = Náhled
widget-imu_visualizer-acceleration = Akcelerace
widget-imu_visualizer-position = Pozice
widget-imu_visualizer-stay_aligned = Zůstaň Srovaný (Stay Aligned)
widget-imu_visualizer-stay_aligned = Zůstaň Srovnaný (Stay Aligned)
## Widget: Skeleton Visualizer
@@ -217,12 +235,13 @@ tracker-table-column-name = Název
tracker-table-column-type = Typ
tracker-table-column-battery = Baterie
tracker-table-column-ping = Ping
tracker-table-column-packet_loss = Ztráta Paketů
tracker-table-column-tps = TPS
tracker-table-column-temperature = Teplota °C
tracker-table-column-linear-acceleration = Akcel. X/Y/Z
tracker-table-column-rotation = Rotace X/Y/Z
tracker-table-column-position = Pozice X/Y/Z
tracker-table-column-stay_aligned = Zůstaň Srovaný (Stay Aligned)
tracker-table-column-stay_aligned = Zůstaň Srovnaný (Stay Aligned)
tracker-table-column-url = URL
## Tracker rotation
@@ -258,6 +277,9 @@ tracker-infos-magnetometer-status-v1 =
[ENABLED] Povoleno
*[NOT_SUPPORTED] Není podporováno
}
tracker-infos-packet_loss = Ztráta Paketů
tracker-infos-packets_lost = Pakety Ztraceny
tracker-infos-packets_received = Pakety Přijaty
## Tracker settings
@@ -288,10 +310,16 @@ tracker-settings-name_section-label = Název trackeru
tracker-settings-forget = Zapomenout tracker
tracker-settings-forget-description = Odebere tracker z SlimeVR Serveru a zabrání jeho opětovnému připojení do té doby, dokud nebude server restarován. Konfigurace trackeru nebude ztracena.
tracker-settings-forget-label = Zapomenout tracker
tracker-settings-update-unavailable-v2 = Žádné vydání nebyla nalezena
tracker-settings-update-incompatible = Nelze aktualizovat. Nekompatibilní deska nebo verze firmwaru
tracker-settings-update-low-battery = Nelze provést aktualizaci. Baterie má méně než 50%
tracker-settings-update-up_to_date = Aktuální
tracker-settings-update-blocked = Není dostupná aktualizace. Žádná jiná verze není k dispozici
tracker-settings-update = Aktualizovat nyní
tracker-settings-update-title = Verze Firmwareu
tracker-settings-current-version = Současný
tracker-settings-latest-version = Nejnovější
tracker-settings-build-date = Datum sestavení
## Tracker part card info
@@ -357,16 +385,20 @@ mounting_selection_menu-close = Zavřít
settings-sidebar-title = Nastavení
settings-sidebar-general = Obecné
settings-sidebar-steamvr = SteamVR
settings-sidebar-tracker_mechanics = Mechanika trackerů
settings-sidebar-stay_aligned = Zůstaň Srovaný (Stay Aligned)
settings-sidebar-stay_aligned = Zůstaň Srovnaný (Stay Aligned)
settings-sidebar-fk_settings = Nastavení trackování
settings-sidebar-gesture_control = Ovládání gesty
settings-sidebar-interface = Rozhraní
settings-sidebar-osc_router = OSC router
settings-sidebar-osc_trackers = VRChat OSC tracker
settings-sidebar-osc_vmc = VMC
settings-sidebar-utils = Nástroje
settings-sidebar-serial = Sériová konzole
settings-sidebar-appearance = Vzhled
settings-sidebar-home = Domovská obrazovka
settings-sidebar-checklist = Přehled trackování
settings-sidebar-notifications = Notifikace
settings-sidebar-behavior = Chování
settings-sidebar-firmware-tool = Nástroj pro DIY firmware
@@ -452,18 +484,25 @@ settings-general-tracker_mechanics-use_mag_on_all_trackers-description =
Použití magnetometr na všech trackerech které pro to mají kompatibilní firmware, snížení drifutu v stailních magnetických prostředích.
Může být vypnuto pro jednotivé trackery v jejich nastaveních. <b> Prosíme nevypínejte žádný z trackerů při přepínání tohoto nastavení! </b>
settings-general-tracker_mechanics-use_mag_on_all_trackers-label = Použít magnetometru na trackerech
settings-stay_aligned = Zůstaň Srovaný (Stay Aligned)
settings-stay_aligned-description = Zůstaň Srovaný redukuje drift pomocí postupného upravování vašich trackerů do vaší relaxůjící pózy.
settings-stay_aligned-setup-label = Nastavte Zůstaň Sronaný
settings-stay_aligned-setup-description = Musíte dokončit "Nastvení Zůstaň Srovaný" pro zapnutí Zůstaň Srovnaný.
settings-general-tracker_mechanics-trackers_over_usb = Trackery přes USB
settings-stay_aligned = Zůstaň Srovnaný (Stay Aligned)
settings-stay_aligned-description = Zůstaň Srovnaný (Stay Aligned) redukuje drift pomocí postupného upravování vašich trackerů do vaší relaxůjící pózy.
settings-stay_aligned-setup-label = Nastavte Zůstaň Srovnaný (Stay Aligned)
settings-stay_aligned-setup-description = Musíte dokončit "Nastavení Zůstaň Srovnaný" pro zapnutí Zůstaň Srovnaný.
settings-stay_aligned-warnings-drift_compensation = ⚠ Prosím vypněte Kompenzaci Driftu! Kompenzace driftu bude narušovat funkčnost Zůstaň Srovnaný.
settings-stay_aligned-enabled-label = Upravit trackery
settings-stay_aligned-hide_yaw_correction-label = Skrýt ladění (pro srovnání s vypnutým Zůstaň Srovnaný)
settings-stay_aligned-general-label = Obecné
settings-stay_aligned-relaxed_poses-label = Relaxovací Póza
settings-stay_aligned-relaxed_poses-description = Zůstaň Srovnaný používá vaše uvolněné pózy k udržení srovnání trackerů. K aktualizaci těchto póz použijte "Nastavte Zůstaň Srovnaný".
settings-stay_aligned-relaxed_poses-standing = Upravit trackery při stoje
settings-stay_aligned-relaxed_poses-sitting = Upravit pozici trackerů při sezení na židli
settings-stay_aligned-relaxed_poses-flat = Upravte pozici trackerů při sezení na zemi, nebo ležení na zádech
settings-stay_aligned-relaxed_poses-save_pose = Uložit pózu
settings-stay_aligned-relaxed_poses-reset_pose = Obnovit pózu
settings-stay_aligned-relaxed_poses-close = Zavřít
settings-stay_aligned-debug-label = Ladění
settings-stay_aligned-debug-description = Při nahlašování problémů s Zůstaň Srovnaný, prosím zahrňte vaše nastavení.
settings-stay_aligned-debug-copy-label = Zkopírovat nastavení do schránky
## FK/Tracking settings
@@ -472,7 +511,7 @@ settings-general-fk_settings = Nastavení trackování
# Floor clip:
# why the name - came from the idea of noclip in video games, but is the opposite where clipping to the floor is a desired feature
# definition - Prevents the foot trackers from going lower than they where when a reset was performed
settings-general-fk_settings-leg_tweak-floor_clip = Podlahovej clip
settings-general-fk_settings-leg_tweak-floor_clip = Clip podlahy
# Skating correction:
# why the name - without this enabled the feet will often slide across the ground as if your skating across the ground,
# since this largely prevents this it corrects for it hence skating correction (note this may be renamed to sliding correction)
@@ -486,11 +525,14 @@ settings-general-fk_settings-leg_tweak-floor_clip-description = Připnutí k pod
settings-general-fk_settings-leg_tweak-toe_snap-description = Přichycení špiček se pokouší odhadnout rotaci vašich chodidel v případě, že nepoužíváte trackery chodidel.
settings-general-fk_settings-leg_tweak-foot_plant-description = Narovnání chodidla při dotyku narovnává chodidla tak, aby byla rovnoběžně se zemí.
settings-general-fk_settings-leg_fk = Sledování nohou
settings-general-fk_settings-leg_fk-reset_mounting_feet-v1 = Vynutit kalibraci nasazení pro trackery nohou
settings-general-fk_settings-enforce_joint_constraints = Limity kostry
settings-general-fk_settings-enforce_joint_constraints-enforce_constraints = Prosazování omezení
settings-general-fk_settings-enforce_joint_constraints-enforce_constraints-description = Zabránit rotaci kloubům za jejich limit
settings-general-fk_settings-enforce_joint_constraints-correct_constraints = Opravit pomocí omezení
settings-general-fk_settings-enforce_joint_constraints-correct_constraints-description = Opravit rotaci kloubů, když překročí svůj limit
settings-general-fk_settings-ik = Data pozice
settings-general-fk_settings-ik-use_position = Použít Data pozice
settings-general-fk_settings-arm_fk = Trackování ramen
settings-general-fk_settings-arm_fk-description = Vynutit sledování rukou z VR headsetu, i když jsou k dispozici údaje o poloze rukou z trackerů.
settings-general-fk_settings-arm_fk-force_arms = Vynutit ruce z VR Headsetu
@@ -614,6 +656,9 @@ settings-interface-behavior-error_tracking-description_v2 =
Aby jsme mohli poskytnout nejlepší zážitek uživatelům, schromažďujeme proto anonymizované zprávy o chybých, metriky výkon a informace o operačním systém. To nám pomáhá zjištovat chyby a problémy s SlimeVR. Tyto matriky jsou schromažďovány prostřednictvím Sentry.io.
settings-interface-behavior-error_tracking-label = Odeslat chyby vývojářům
settings-interface-behavior-bvh_directory = Cesta pro uložení BVH záznamů
settings-interface-behavior-bvh_directory-description = Vyberte cestu k uložení záznamů BHV. namísto toho, abyste pokaždé vybírali, kam je uložit.
settings-interface-behavior-bvh_directory-label = Lokace pro BVH nahrávky
## Serial settings
@@ -624,7 +669,7 @@ settings-serial-description =
Může být užitečné, pokud potřebujete zjistit, zda se firmware chová špatně.
settings-serial-connection_lost = Ztráta připojení k seriálu, Připojení se obnovuje...
settings-serial-reboot = Restartovat
settings-serial-factory_reset = Obnovení továrního nastavení
settings-serial-factory_reset = Obnovení do továrního nastavení
# This cares about multilines
# <b>text</b> means that the text should be bold
settings-serial-factory_reset-warning =
@@ -637,6 +682,10 @@ settings-serial-auto_dropdown_item = Auto
settings-serial-get_wifi_scan = Skenovat WiFi
settings-serial-file_type = Prostý text
settings-serial-save_logs = Uložit jako soubor
settings-serial-send_command = Odeslat
settings-serial-send_command-placeholder = Příkaz...
settings-serial-send_command-warning-ok = Vím, co dělám!
settings-serial-send_command-warning-cancel = Zrušit
## OSC router settings
@@ -729,6 +778,7 @@ settings-osc-vmc-mirror_tracking-label = Zrcadlení trackování
## Common OSC settings
settings-osc-common-network-port_banned_error = Port { $port } nelze použít!
## Advanced settings
@@ -765,9 +815,14 @@ settings-utils-advanced-open_logs-label = Otevřít složku
## Home Screen
settings-home-list-layout = Uspořádání seznamu trackerů
settings-home-list-layout-desc = Vyberte jedno z možných uspořádání domovské obrazovky.
settings-home-list-layout-grid = Mřížka
settings-home-list-layout-table = Tabulka
## Tracking Checlist
settings-tracking_checklist-active_steps = Aktivní kroky
## Setup/onboarding menu
@@ -784,6 +839,7 @@ onboarding-setup_warning-cancel = Pokračovat v nastavení
## Wi-Fi setup
onboarding-wifi_creds-back = Zpět na úvod
onboarding-wifi_creds-v2 = Trackey používající Wi-Fi
onboarding-wifi_creds-skip = Přeskočit nastavení Wi-Fi
onboarding-wifi_creds-submit = Odeslat!
onboarding-wifi_creds-ssid =
@@ -793,6 +849,8 @@ onboarding-wifi_creds-ssid-required = Je vyžadován název sítě Wi-Fi
onboarding-wifi_creds-password =
.label = Heslo
.placeholder = Zadejte heslo
onboarding-wifi_creds-dongle-title = Trackery používající dongle
onboarding-wifi_creds-dongle-continue = Pokračovat s donglem
## Mounting setup
@@ -814,7 +872,7 @@ onboarding-reset_tutorial-1 =
## Setup start
onboarding-home = Vítejte k SlimeVR
onboarding-home = Vítejte ve SlimeVR
onboarding-home-start = Pusťme se do toho!
## Setup done
@@ -885,6 +943,7 @@ onboarding-assignment_tutorial-done = Nachystal jsem samolepky a pásky!
onboarding-assign_trackers-back = Zpět na přihlašovací údaje Wi-Fi
onboarding-assign_trackers-title = Přiřazení trackerů
onboarding-assign_trackers-description = Vyberte, na jakou končetinu každý tracker patří. Klikněte na místo, kam chcete umístit tracker
onboarding-assign_trackers-unassign_all = Zrušit přiřazení všech trackerů
# Look at translation of onboarding-connect_tracker-connected_trackers on how to use plurals
# $assigned (Number) - Trackers that have been assigned a body part
# $trackers (Number) - Trackers connected to the server
@@ -932,7 +991,7 @@ onboarding-assign_trackers-warning-LEFT_FOOT =
## Tracker mounting method choose
onboarding-choose_mounting = Jakou metodu nasazení trackerů použít?
onboarding-choose_mounting = Jakou metodu nasazení trackerů chcete použít?
# Multiline text
onboarding-choose_mounting-description = Správná orientace nasazení zajistí přesné sledování trackerů na těle.
onboarding-choose_mounting-auto_mounting = Automatická detekce nasazení
@@ -975,12 +1034,15 @@ onboarding-automatic_mounting-mounting_reset-step-0 = 1. Dřepněte si, jako př
onboarding-automatic_mounting-mounting_reset-step-1 = 2. Stiskněte tlačítko "Resetovat nasazení trackerů" a vyčkejte 3 sekundy. Orientace nasazení trackerů se nastaví na základní hodnoty.
onboarding-automatic_mounting-preparation-title = Příprava
onboarding-automatic_mounting-preparation-v2-step-0 = 1. Stiskněte tlačítko pro "Plný Reset"
onboarding-automatic_mounting-preparation-v2-step-2 = 3. Zůstaňte v pozici, dokud 3s časovač neskončí.
onboarding-automatic_mounting-put_trackers_on-title = Nasaďte si trackery
onboarding-automatic_mounting-put_trackers_on-description = Pro kalibraci směru nasazení použijeme právě přiřazené trackery. Nasaďte si prosím všechny trackery. Můžete zkontrolovat jejich umístění na obrázku vpravo.
onboarding-automatic_mounting-put_trackers_on-next = Mám nasazené všechny trackery
onboarding-automatic_mounting-return-home = Hotovo
## Tracker manual proportions setupa
onboarding-manual_proportions-back-scaled = Jít zpět na Škálování Proporcí
onboarding-manual_proportions-title = Manuální proporce těla
onboarding-manual_proportions-fine_tuning_button = Automatické jemné doladění proporcí
onboarding-manual_proportions-fine_tuning_button-disabled-tooltip = Pro použití automatického jemného lazení, prosím připojte VR headset
@@ -1081,27 +1143,57 @@ onboarding-automatic_proportions-smol_warning-cancel = Jít zpět
## User height calibration
onboarding-user_height-title = Jaká je vaše výška?
onboarding-user_height-calculate = Vypočítejte mou výšku automaticky
onboarding-user_height-next_step = Uložit a pokračovat
onboarding-user_height-manual-proportions = Manuální Proporce
onboarding-user_height-calibration-title = Průběh kalibrace
onboarding-user_height-calibration-WAITING_FOR_RISE = Postavte se zpátky
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-ok = Ujistěte se, že je vaše hlava ve vodorovné pozici
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-low = Nedívejte se na podlahu
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-high = Nedívej se příliš vysoko
onboarding-user_height-calibration-RECORDING_HEIGHT = Znovu se postavte a nehýbejte se!
onboarding-user_height-calibration-DONE = Úspěch!
onboarding-user_height-calibration-ERROR_TIMEOUT = Časový limit kalibrace vypršel, zkuste to znovu.
onboarding-user_height-calibration-error = Kalibrace selhala
## Stay Aligned setup
onboarding-stay_aligned-title = Zůstaň Srovaný!
onboarding-stay_aligned-description = Nakonfigurujte Zustaň Srovnaný, aby byly vaše trackery srovnáný.
onboarding-stay_aligned-title = Zůstaň Srovnaný!
onboarding-stay_aligned-description = Nakonfigurujte Zůstaň Srovnaný, aby byly vaše trackery srovnány.
onboarding-stay_aligned-put_trackers_on-title = Nasaďte si trackery
onboarding-stay_aligned-put_trackers_on-trackers_warning = Aktuálně máte méně než 5 připojených a přiřazených trackerů! Toto je minimální počet trackerů potřebné pro správné fungování funkce Zůstaň Srovnaný.
onboarding-stay_aligned-put_trackers_on-next = Mám nasazené všechny trackery
onboarding-stay_aligned-verify_mounting-title = Zkotrolujte nasazení
onboarding-stay_aligned-verify_mounting-step-0 = Zůstaň Srovnaný vyžaduje dobré nasazení. V opačném případě nebudete mít nejlepší zážitek s Zůstaň Srovnaný.
onboarding-stay_aligned-verify_mounting-step-1 = 1. Pohybujte se ve stoje.
onboarding-stay_aligned-verify_mounting-step-2 = 2. Posaďte se a pohybujte nohama a chodidly.
onboarding-stay_aligned-verify_mounting-redo_mounting = Předělat kalibraci nasazení
onboarding-stay_aligned-preparation-title = Příprava
onboarding-stay_aligned-preparation-tip = Ujistěte se, že stojíte vzpřímeně. koukáte vpřed a máte ruce podél těla.
onboarding-stay_aligned-relaxed_poses-standing-title = Uvolněná pozice ve stoje
onboarding-stay_aligned-relaxed_poses-standing-step-0 = 1. Stůjte v pohodlné pozici. Relaxujte!
onboarding-stay_aligned-relaxed_poses-standing-step-1-v2 = 2. Zmáčkněte tlačítko "Uložit pózu"
onboarding-stay_aligned-relaxed_poses-sitting-title = Uvolněná póza při sezení v židli
onboarding-stay_aligned-relaxed_poses-sitting-step-0 = 1. Posaďte se do pohodlné pozice, Relaxujte!
onboarding-stay_aligned-relaxed_poses-sitting-step-1-v2 = 2. Zmáčkněte tlačítko "Uložit pózu"
onboarding-stay_aligned-relaxed_poses-flat-title = Uvolněná pozice při sezení na zemi
onboarding-stay_aligned-relaxed_poses-flat-step-1-v2 = 2. Zmáčkněte tlačítko "Uložit pózu"
onboarding-stay_aligned-relaxed_poses-skip_step = Přeskočit
onboarding-stay_aligned-done-title = Zustaň Srovnaný zapnuto!
onboarding-stay_aligned-done-title = Zůstaň Srovnaný zapnuto!
onboarding-stay_aligned-done-description = Váš nastavení Zůstaň Srovnaný je dokončeno!
onboarding-stay_aligned-done-description-2 = Vaše nastavení je dokončeno! Pokud chcete vaše pózy znovu zkalibrovat, můžete proces zopakovat.
onboarding-stay_aligned-previous_step = Předchozí
onboarding-stay_aligned-next_step = Další
onboarding-stay_aligned-restart = Restart
onboarding-stay_aligned-done = Hotovo
onboarding-stay_aligned-manual_mounting-done = Hotovo
## Home
home-no_trackers = Nebyly zjištěny ani přiřazeny žádné trackery
home-settings = Nastavení domovské stránky
home-settings-close = Zavřít
## Trackers Still On notification
@@ -1137,8 +1229,28 @@ firmware_tool = Nástroj pro DIY firmwere
firmware_tool-description = Umožní vám konfigurovat a flashovat vaše DIY trackery
firmware_tool-not_available = Jejda, nástroj pro firmware není v momentální chvíli k dispozici, Vraťte se později!
firmware_tool-not_compatible = Nástroj pro firmware není kompatibilní s touhle verzí serveru. Aktualizujte prosím svůj server.
firmware_tool-select_source = Vyberte firmware k flashování
firmware_tool-select_source-error = Nelze načíst Zdroje
firmware_tool-select_source-board_type = Typ desky
firmware_tool-select_source-firmware = Zdrojový kód firmwaru
firmware_tool-select_source-version = Verze firmwaru
firmware_tool-select_source-official = Oficiální
firmware_tool-select_source-dev = Vývojářské
firmware_tool-select_source-not_selected = Nebyl vybrán žádný zdroj
firmware_tool-board_defaults = Nekonfigurujte vaší desku
firmware_tool-board_defaults-add = Přidat
firmware_tool-board_defaults-reset = Restartovat do výchozího nastavení
firmware_tool-board_defaults-error-required = Povinné pole
firmware_tool-board_defaults-error-format = Neplatný formát
firmware_tool-board_defaults-error-format-number = Není číslo
firmware_tool-flash_method_step = Metoda flashování
firmware_tool-flash_method_step-description = Prosím zvolte metodu flashování, kterou chcete použít
firmware_tool-flash_method_step-ota-v2 =
.label = Wi-Fi
.description = Použijte "wireless" metodu. Vaše trackery budou používát Wi-Fi pro aktualizování jejich firmweru. Funguje pouze u trackerů, které již byly nastaveny.
firmware_tool-flash_method_step-serial-v2 =
.label = USB
.description = Použíjte USB kabel k aktualizování vaších trackerů
firmware_tool-flashbtn_step = Stiskněte tlačítko bootu btn
firmware_tool-flashbtn_step-description = Než přejdeme na další krok, je tady pár věcí které musíte udělat
firmware_tool-flashbtn_step-board_SLIMEVR = Vypněte tracker, vyndejte z obalu (jestli v nějakém je), Připojte USB kabel k tomuto počítači a poté následujte jeden z kroků revize odpovídající k vaší verzi desky trackeru SlimeVR:
@@ -1147,8 +1259,10 @@ firmware_tool-flashbtn_step-board_OTHER =
Ve většině případů to znamená stisknutí boot tlačítka na desce trakeru před tím než začne proces flashování.
Pokud procesu flashování vyprší čas hned na začátku flashování, to nejspíš znamená že tracker nebyl v řežimu bootloaderu
Podívejte se prosím na instrukce procesu flashování pro desku vašeho zařízení, aby jste zjistili jak se dostat do režimu bootloaderu
firmware_tool-flash_method_ota-title = Flashování přes Wi-Fi
firmware_tool-flash_method_ota-devices = Byla detekována zařízení s OTA:
firmware_tool-flash_method_ota-no_devices = Nebyly nalezeny žádné zákadní desky které by mohly být aktualizované pomocí OTA, prosím ujistěte se že jste zvolily správný typ základní desky
firmware_tool-flash_method_serial-title = Flashování přes USB
firmware_tool-flash_method_serial-wifi = Přihlašovací údaje Wi-Fi:
firmware_tool-flash_method_serial-devices-label = Detekována Sériová Zařízení:
firmware_tool-flash_method_serial-devices-placeholder = Vyberte sériové zařízení
@@ -1157,12 +1271,16 @@ firmware_tool-build_step = Sestavování
firmware_tool-build_step-description = Firmwere se sestavuje, čekejte prosím
firmware_tool-flashing_step = Flashování
firmware_tool-flashing_step-description = Probíhá flashování vašich trackerů, prosím postupujte dle instrukcí na obrazovce
firmware_tool-flashing_step-warning-v2 = Během procesu nahrávání prosíme NEVYPÍNEJTE ani NEODPOJUJTE vaše trackery pokud k tomu nejste vyzváni, učiněním můžete způsobit že deska trackeru se stane nefunkční.
firmware_tool-flashing_step-flash_more = Flashnout více trackerů
firmware_tool-flashing_step-exit = Odejít
## firmware tool build status
firmware_tool-build-QUEUED = Čekání na sestavení...
firmware_tool-build-CREATING_BUILD_FOLDER = Vytváření složky pro sestavení
firmware_tool-build-DOWNLOADING_SOURCE = Stahování zdrojového kódu
firmware_tool-build-EXTRACTING_SOURCE = Extrahování zdrojového kódu
firmware_tool-build-BUILDING = Sestavování firmweru
firmware_tool-build-SAVING = Ukládání sestavení
firmware_tool-build-DONE = Sestavení dokončeno
@@ -1171,6 +1289,7 @@ firmware_tool-build-ERROR = Nepodařilo se sestavit firmwere
## Firmware update status
firmware_update-status-DOWNLOADING = Stahování firmwaru
firmware_update-status-NEED_MANUAL_REBOOT-v2 = Vypněte a znovu zapněte tracker prosím
firmware_update-status-AUTHENTICATING = Autentifikování s mcu
firmware_update-status-UPLOADING = Nahrávání firmwaru
firmware_update-status-SYNCING_WITH_MCU = Synchronizace s MCU
@@ -1195,7 +1314,7 @@ firmware_update-no_devices = Prosím ujistěte se, že tracker který chcete akt
firmware_update-changelog-title = Aktualizování na { $version }
firmware_update-looking_for_devices = Hledání zařízení pro aktualizaci
firmware_update-retry = Opakovat
firmware_update-update = Aktualizovat Zvolený/é Tracker/y
firmware_update-update = Aktualizovat Zvolené Trackery
firmware_update-exit = Odejít
## Tray Menu
@@ -1225,10 +1344,15 @@ unknown_device-modal-description =
Chcete jej připojit k SlimeVR?
unknown_device-modal-confirm = Jasně!
unknown_device-modal-forget = Ignoruj
# VRChat config warnings
vrc_config-page-title = Varování VRChat konfigurace
vrc_config-page-desc = Tato stránka slouží k zobrazení vašeho aktuálního stavu nastavení ve VRChat. přesněji, nástavní které jsou nekompatibilní s SlimeVR. Je silně doporučeno poupravit všechny chybné nastavení které jsou zde zobrazeny pro nejlepší zážitek s SlimeVR.
vrc_config-page-help = Nemůžete najít specifické nastavení?
vrc_config-page-help-desc = Podívejte se na naší <a>dokumentaci k tomuto tématu!</a>
vrc_config-page-big_menu = Sledování & IK (Velké Menu)
vrc_config-page-big_menu-desc = Nastavení souvicející s IK ve velké nabídce nastavení
vrc_config-page-wrist_menu = Sledování & IK (Zápěstní menu)
vrc_config-page-wrist_menu-desc = Nastavení související s IK najdete v malém (zápěstním) menu
vrc_config-on = Zapnuto
vrc_config-off = Vypnuto
vrc_config-invalid = Máte špatně nakonfigurované VRChat nastavení!
@@ -1241,6 +1365,7 @@ vrc_config-mute-btn = Ztlumení
vrc_config-unmute-btn = Zrušit ztlumení
vrc_config-legacy_mode = Použít starší řešení IK
vrc_config-disable_shoulder_tracking = Vypnout sledování ramen
vrc_config-shoulder_width_compensation = Kompenzace Šířky Ramen
vrc_config-spine_mode = Režim páteře FTB
vrc_config-tracker_model = Model FBT trackeru
vrc_config-avatar_measurement_type = Meření avataru
@@ -1272,3 +1397,28 @@ error_collection_modal-cancel = Nesouhlasím
## Tracking checklist section
tracking_checklist-settings-close = Zavřít
tracking_checklist-status-incomplete = Nejste připraveni používat SlimeVR!
tracking_checklist-status-complete = Jste připravení k použití SlimeVR
tracking_checklist-FULL_RESET = Proveďte plné obnovení
tracking_checklist-STEAMVR_DISCONNECTED = SteamVR není zapnut
tracking_checklist-STEAMVR_DISCONNECTED-desc = SteamVR není zapnut. Používáte ho pro VR?
tracking_checklist-STEAMVR_DISCONNECTED-open = Spusťte SteamVR
tracking_checklist-TRACKERS_REST_CALIBRATION = Kalibrujte vaše trackery
tracking_checklist-TRACKER_ERROR = Trackery s chybami
tracking_checklist-VRCHAT_SETTINGS = Nakonfigurujte nastavení VRChat
tracking_checklist-VRCHAT_SETTINGS-open = Přejít k varování ve VRChat
tracking_checklist-NETWORK_PROFILE_PUBLIC = Změňte profil sítě
tracking_checklist-NETWORK_PROFILE_PUBLIC-open = Otevřete Ovládací Panel
tracking_checklist-STAY_ALIGNED_CONFIGURED = Nakonfigurujte Zůstaň Srovnaný
tracking_checklist-ignore = Ignorovat
preview-mocap_mode_soon = Režim Mocap (brzy™)
preview-disable_render = Vypnout vykreslování
preview-disabled_render = Vykreslování vypnuto
toolbar-mounting_calibration = Kalibrace nasazení
toolbar-mounting_calibration-default = Tělo
toolbar-mounting_calibration-feet = Chodidla
toolbar-mounting_calibration-fingers = Prsty
toolbar-drift_reset = Restartování driftu
toolbar-assigned_trackers = { $count } trackery/ů přiřazeno
toolbar-unassigned_trackers = { $count } trackey/ů nepřiřazeno

View File

@@ -115,6 +115,11 @@ 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 Dev-IMU-Handschuh
board_type-GESTURES = Gesten
board_type-ESP32S3_SUPERMINI = ESP32-S3 Supermini
board_type-GENERIC_NRF = Generisches nRF
board_type-SLIMEVR_BUTTERFLY_DEV = SlimeVR Dev Butterfly
board_type-SLIMEVR_BUTTERFLY = SlimeVR Butterfly
## Proportions
@@ -180,6 +185,8 @@ reset-mounting-fingers = Fingerkalibrierung
reset-yaw = Horizontaler Reset
reset-error-no_feet_tracker = Kein Fußtracker zugewiesen
reset-error-no_fingers_tracker = Kein Fingertracker zugewiesen
reset-error-mounting-need_full_reset = Ein vollständiger Reset ist vor der Tracker-Ausrichtung erforderlich.
reset-error-yaw-need_full_reset = Für den Yaw-Reset ist ein vollständiger Reset erforderlich.
## Serial detection stuff
@@ -199,6 +206,7 @@ navbar-trackers_assign = Tracker-Zuordnung
navbar-mounting = Tracker-Ausrichtung
navbar-onboarding = Einrichtungs-Assistent
navbar-settings = Einstellungen
navbar-connect_trackers = Tracker verbinden
## Biovision hierarchy recording
@@ -269,6 +277,7 @@ tracker-table-column-name = Name
tracker-table-column-type = Typ
tracker-table-column-battery = Batterie
tracker-table-column-ping = Latenz
tracker-table-column-packet_loss = Paketverlust
tracker-table-column-tps = TPS
tracker-table-column-temperature = Temp. °C
tracker-table-column-linear-acceleration = Beschleunigung X/Y/Z
@@ -310,6 +319,9 @@ tracker-infos-magnetometer-status-v1 =
[ENABLED] Angeschalten
*[NOT_SUPPORTED] Nicht unterstützt
}
tracker-infos-packet_loss = Paketverlust
tracker-infos-packets_lost = Pakete verloren
tracker-infos-packets_received = Pakete empfangen
## Tracker settings
@@ -347,6 +359,9 @@ tracker-settings-update-up_to_date = Auf dem neusten Stand
tracker-settings-update-blocked = Update nicht verfügbar. Weitere Veröffentlichungen sind nicht verfügbar.
tracker-settings-update = Jetzt aktualisieren
tracker-settings-update-title = Firmware-Version
tracker-settings-current-version = Aktuelle
tracker-settings-latest-version = Aktuelleste
tracker-settings-build-date = Herstellungsdatum
## Tracker part card info
@@ -511,14 +526,19 @@ settings-general-tracker_mechanics-use_mag_on_all_trackers-description =
Verwendet das Magnetometer auf allen Trackern, die über eine kompatible Firmware verfügen, um den Drift in stabilen magnetischen Umgebungen zu reduzieren.
Kann pro Tracker in den Einstellungen des Trackers deaktiviert werden. <b>Bitte schalten Sie keinen der Tracker aus, während Sie dies umschalten!</b>
settings-general-tracker_mechanics-use_mag_on_all_trackers-label = Magnetometer auf Trackern verwenden
settings-general-tracker_mechanics-trackers_over_usb = Tracker über USB
settings-general-tracker_mechanics-trackers_over_usb-enabled-label = Erlaube HID-Tracker eine USB-Direktverbindung
settings-stay_aligned = Stay Aligned
settings-stay_aligned-description = Stay Aligned reduziert Drift, indem es deine Tracker schrittweise an deine entspannten Posen anpasst.
settings-stay_aligned-setup-label = Stay Aligned einrichten
settings-stay_aligned-setup-description = Sie müssen Stay Aligned einrichten, um es zu aktivieren.
settings-stay_aligned-warnings-drift_compensation = ⚠ Bitte schalten Sie die Driftkompensation aus! Diese steht in Konflikt mit Stay Aligned.
settings-stay_aligned-enabled-label = Tracker anpassen
settings-stay_aligned-hide_yaw_correction-label = Anpassung ausblenden (zum Vergleich ohne Stay Aligned)
settings-stay_aligned-general-label = Allgemein
settings-stay_aligned-relaxed_poses-label = Entspannte Posen
settings-stay_aligned-relaxed_poses-standing = Tracker im Stehen anpassen
settings-stay_aligned-relaxed_poses-sitting = Tracker anpassen, während du auf einem Stuhl sitzt
settings-stay_aligned-relaxed_poses-save_pose = Pose speichern
settings-stay_aligned-relaxed_poses-reset_pose = Pose zurücksetzen
settings-stay_aligned-relaxed_poses-close = Schließen
@@ -546,6 +566,8 @@ settings-general-fk_settings-leg_tweak-floor_clip-description = Bodenclip kann d
settings-general-fk_settings-leg_tweak-toe_snap-description = Zehen-Ausrichtung versucht, die Rotation Ihrer Füße zu erraten, wenn keine Fuß-Tracker verwendet werden.
settings-general-fk_settings-leg_tweak-foot_plant-description = Fußkorrektur richtet Ihre Füße parallel zum Boden aus, wenn sie den Boden berühren.
settings-general-fk_settings-leg_fk = Beintracking
settings-general-fk_settings-leg_fk-reset_mounting_feet-description-v1 = Erzwinge Fußausrichtungs-Kalibrierung während der Körperausrichtungs-Kalibrierung.
settings-general-fk_settings-leg_fk-reset_mounting_feet-v1 = Fuß-Ausrichtung kalibrieren
settings-general-fk_settings-enforce_joint_constraints = Gelenkgrenzen
settings-general-fk_settings-enforce_joint_constraints-enforce_constraints = Grenzen erzwingen
settings-general-fk_settings-enforce_joint_constraints-enforce_constraints-description = Verhindert, dass sich Gelenke über ihre Grenzen hinaus drehen
@@ -845,10 +867,12 @@ settings-utils-advanced-open_logs-label = Ordner öffnen
settings-home-list-layout = Layout der Tracker-Liste
settings-home-list-layout-desc = Wählen Sie eines der möglichen Startbildschirm-Layouts aus
settings-home-list-layout-grid = Raster
settings-home-list-layout-table = Tabelle
## Tracking Checlist
settings-tracking_checklist-active_steps = Aktive Schritte
## Setup/onboarding menu
@@ -863,6 +887,7 @@ onboarding-setup_warning-cancel = Einrichtung fortsetzen
## Wi-Fi setup
onboarding-wifi_creds-back = Zurück zur Einführung
onboarding-wifi_creds-v2 = Tracker mit WLAN
onboarding-wifi_creds-skip = WLAN-Zugangsdaten überspringen
onboarding-wifi_creds-submit = Weiter!
onboarding-wifi_creds-ssid =
@@ -872,6 +897,8 @@ onboarding-wifi_creds-ssid-required = WLAN-Name ist erforderlich
onboarding-wifi_creds-password =
.label = Passwort
.placeholder = Passwort eingeben
onboarding-wifi_creds-dongle-title = Tracker mit einem Dongle
onboarding-wifi_creds-dongle-continue = Fahre mit einem Dongle fort
## Mounting setup
@@ -970,6 +997,7 @@ onboarding-assignment_tutorial-done = Ich habe Aufkleber und Bänder angebracht!
onboarding-assign_trackers-back = Zurück zu den WLAN-Zugangsdaten
onboarding-assign_trackers-title = Tracker zuweisen
onboarding-assign_trackers-description = Wählen Sie nun aus, welcher Tracker wo befestigt ist. Klicken Sie auf einen Ort, an dem der Tracker platziert ist.
onboarding-assign_trackers-unassign_all = Alle Trackerzuweisungen aufheben
# Look at translation of onboarding-connect_tracker-connected_trackers on how to use plurals
# $assigned (Number) - Trackers that have been assigned a body part
# $trackers (Number) - Trackers connected to the server
@@ -1115,6 +1143,9 @@ onboarding-automatic_mounting-mounting_reset-title = Befestigungs-Reset
onboarding-automatic_mounting-mounting_reset-step-0 = 1. Beugen Sie sich in die "Skifahren"-Pose mit gebeugten Beinen, geneigtem Oberkörper und gebeugten Armen.
onboarding-automatic_mounting-mounting_reset-step-1 = 2. Drücken Sie die Schaltfläche "Befestigungs-Reset" und warten Sie 3 Sekunden, bevor die Drehungen der Tracker gesetzt werden.
onboarding-automatic_mounting-preparation-title = Vorbereitung
onboarding-automatic_mounting-preparation-v2-step-0 = 1. Drücke den Knopf "Kompletter Reset".
onboarding-automatic_mounting-preparation-v2-step-1 = 2. Stehe aufrecht mit den Armen an den Seiten. Schaue unbedingt nach vorne.
onboarding-automatic_mounting-preparation-v2-step-2 = 3. Halte die Position, bis 3 Sekunden abgelaufen sind.
onboarding-automatic_mounting-put_trackers_on-title = Legen Sie Ihre Tracker an
onboarding-automatic_mounting-put_trackers_on-description = Um die Drehung der Tracker zu kalibrieren, werden die Tracker verwendet, welche Sie gerade zugewiesen haben. Ziehen Sie alle Ihre Tracker an, in der Abbildung rechts können sie sehen um welchen Tracker es sich handelt.
onboarding-automatic_mounting-put_trackers_on-next = Ich habe alle meine Tracker angelegt
@@ -1128,6 +1159,7 @@ onboarding-manual_proportions-fine_tuning_button-disabled-tooltip = Bitte schlie
onboarding-manual_proportions-export = Proportionen exportieren
onboarding-manual_proportions-import = Proportionen importieren
onboarding-manual_proportions-file_type = Körperproportions-Datei
onboarding-manual_proportions-grouped_proportions = Gruppierte Proportionen
onboarding-manual_proportions-all_proportions = Alle Proportionen
onboarding-manual_proportions-estimated_height = Geschätzte Benutzergröße
@@ -1216,10 +1248,26 @@ onboarding-automatic_proportions-smol_warning-cancel = Zurück
## User height calibration
onboarding-user_height-title = Wie groß bist du?
onboarding-user_height-description = Wir brauchen deine Größe, um deine Körperproportionen zu berechnen und deine Bewegungen genau darzustellen. Du kannst dies entweder SlimeVR berechnen lassen oder deine Höhe manuell eingeben.
onboarding-user_height-calculate = Berechne meine Körpergröße automatisch
onboarding-user_height-next_step = Fortfahren und speichern
onboarding-user_height-manual-proportions = Manuelle Körperproportionen
onboarding-user_height-calibration-title = Kalibrierungsfortschritt
onboarding-user_height-calibration-WAITING_FOR_RISE = Steh wieder auf
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK = Steh wieder auf und schau nach vorne
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-ok = Achte darauf, dass dein Kopf waagerecht ist
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-low = Schauen sie nicht auf den Boden
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-high = Schauen sie nicht zu hoch nach oben
onboarding-user_height-calibration-WAITING_FOR_CONTROLLER_PITCH = Achten sie darauf, dass der Controller nach unten zeigt
onboarding-user_height-calibration-RECORDING_HEIGHT = Steh wieder auf und steh still!
onboarding-user_height-calibration-DONE = Erfolg!
onboarding-user_height-calibration-ERROR_TIMEOUT = Die Kalibrierung ist abgelaufen, versuche es nochmal.
onboarding-user_height-calibration-ERROR_TOO_HIGH = Die erkannte Benutzerhöhe ist zu hoch, versuche es erneut.
onboarding-user_height-calibration-error = Kalibrierung fehlgeschlagen
onboarding-user_height-reset-warning =
<b>Achtung:</b> Die Proportionen werden zurückgesetzt und auf Basis deiner Körpergröße neu berechnet.
Bist du dir sicher?
## Stay Aligned setup
@@ -1230,20 +1278,34 @@ onboarding-stay_aligned-put_trackers_on-description = Um Ihre Ruheposen zu speic
onboarding-stay_aligned-put_trackers_on-trackers_warning = Sie haben derzeit weniger als 5 Tracker verbunden und zugewiesen! Dies ist die Mindestanzahl an Trackern, die erforderlich sind, damit Stay Aligned richtig funktioniert.
onboarding-stay_aligned-put_trackers_on-next = Ich habe alle meine Tracker angelegt
onboarding-stay_aligned-verify_mounting-title = Tracker-Ausrichtung
onboarding-stay_aligned-verify_mounting-step-1 = 1. Bewege dich im Stehen.
onboarding-stay_aligned-verify_mounting-step-2 = 2. Setz dich hin und bewege deine Beine und Füße.
onboarding-stay_aligned-verify_mounting-step-3 = 3. Wenn deine Tracker nicht an der richtigen Stelle sind, drücke "Ausrichtungskalibrierung wiederholen".
onboarding-stay_aligned-verify_mounting-redo_mounting = Tracker-Ausrichtungskalibrierung wiederholen
onboarding-stay_aligned-preparation-title = Vorbereitung
onboarding-stay_aligned-preparation-tip = Achten Sie darauf, aufrecht zu stehen. Schauen Sie nach vorne und lassen Sie die Arme an den Seiten hängen.
onboarding-stay_aligned-relaxed_poses-standing-title = Entspannte Stehpose
onboarding-stay_aligned-relaxed_poses-standing-step-0 = 1. Nehmen Sie eine bequeme Haltung ein. Entspannen Sie sich!
onboarding-stay_aligned-relaxed_poses-standing-step-1-v2 = 2. Drücken Sie die Taste „Pose speichern“.
onboarding-stay_aligned-relaxed_poses-sitting-title = Entspannte Im-Stuhl-sitzen-Pose
onboarding-stay_aligned-relaxed_poses-sitting-step-0 = 1. Nehme eine bequeme Haltung ein. Entspanne dich!
onboarding-stay_aligned-relaxed_poses-sitting-step-1-v2 = 2. Drücke die Taste „Pose speichern“.
onboarding-stay_aligned-relaxed_poses-flat-title = Entspannte Sitzposition auf dem Boden
onboarding-stay_aligned-relaxed_poses-flat-step-0 = 1. Setz dich mit den Beinen nach vorne auf den Boden. Entspann dich!
onboarding-stay_aligned-relaxed_poses-flat-step-1-v2 = 2. Drücke die Taste „Pose speichern“.
onboarding-stay_aligned-relaxed_poses-skip_step = Überspringen
onboarding-stay_aligned-done-title = Stay aligned aktiviert!
onboarding-stay_aligned-done-description = Dein Stay Aligned-Setup ist komplett!
onboarding-stay_aligned-previous_step = Zurück
onboarding-stay_aligned-next_step = Weiter
onboarding-stay_aligned-restart = Neu starten
onboarding-stay_aligned-done = Fertig
onboarding-stay_aligned-manual_mounting-done = Fertig
## Home
home-no_trackers = Keine Tracker erkannt oder zugewiesen
home-settings = Startseiten-Einstellungen
home-settings-close = Schließen
## Trackers Still On notification
@@ -1280,12 +1342,19 @@ firmware_tool = DIY Firmware-Tool
firmware_tool-description = Erlaubt ihnen das Konfigurieren und Flashen von DIY Trackern
firmware_tool-not_available = Das Firmware Tool ist im Moment nicht verfügbar. Versuche sie später erneut!
firmware_tool-not_compatible = Das Firmware Tool ist nicht mit dieser Version des Servers kompatibel. Bitte den Server aktualisieren!
firmware_tool-select_source = Wähle die Firmware zum Flashen aus
firmware_tool-select_source-description = Wähle die Firmware aus, die du auf deinem Board flashen möchtest
firmware_tool-select_source-error = Quellen konnten nicht geladen werden
firmware_tool-select_source-board_type = Boardtyp
firmware_tool-select_source-firmware = Firmware-Quelle
firmware_tool-select_source-version = Firmware-Version
firmware_tool-select_source-official = Offiziell
firmware_tool-select_source-dev = Dev
firmware_tool-select_source-not_selected = Keine Quelle ausgewählt
firmware_tool-select_source-no_boards = Keine verfügbaren Boards für diese Quelle
firmware_tool-select_source-no_versions = Keine verfügbaren Versionen für diese Quelle
firmware_tool-board_defaults = Konfigurieren Sie Ihr Board
firmware_tool-board_defaults-description = Stelle die Pins oder Einstellungen relativ zu deiner Hardware ein
firmware_tool-board_defaults-add = Hinzufügen
firmware_tool-board_defaults-reset = Auf Standard zurücksetzen
firmware_tool-board_defaults-error-required = Erforderliches Feld
@@ -1398,7 +1467,12 @@ unknown_device-modal-forget = Ignorieren
# VRChat config warnings
vrc_config-page-title = VRChat Konfigurations-Warnungen
vrc_config-page-desc = Diese Seite zeigt den Zustand deiner VRChat-Einstellungen und zeigt, welche Einstellungen mit SlimeVR inkompatibel sind. Es wird dringend empfohlen, alle hier angezeigten Warnungen zu beheben, um das beste Nutzererlebnis mit SlimeVR zu gewährleisten.
vrc_config-page-help = Kannst du die Einstellungen nicht finden?
vrc_config-page-help-desc = Schauen Sie sich unsere <a>Dokumentation zu diesem Thema</a> an!
vrc_config-page-big_menu = Tracking & IK (Großes Menü)
vrc_config-page-big_menu-desc = Einstellungen im Zusammenhang mit IK im großen Einstellungsmenü
vrc_config-page-wrist_menu = Tracking & IK (Handgelenkmenü)
vrc_config-page-wrist_menu-desc = Einstellungen im Zusammenhang mit IK im kleinen Einstellungsmenü (Handgelenkmenü)
vrc_config-on = An
vrc_config-off = Aus
vrc_config-invalid = Sie haben falsch konfigurierte VRChat-Einstellungen!
@@ -1409,13 +1483,23 @@ vrc_config-current_value = Aktueller Wert
vrc_config-mute = Warnung stummschalten
vrc_config-mute-btn = Stummschalten
vrc_config-unmute-btn = Stummschaltung aufheben
vrc_config-legacy_mode = Verwende Legacy IK Solving
vrc_config-disable_shoulder_tracking = Schultertracking deaktivieren
vrc_config-shoulder_width_compensation = Schulterbreitenkompensation
vrc_config-spine_mode = FBT-Wirbelsäulenmodus
vrc_config-tracker_model = FBT-Trackermodell
vrc_config-avatar_measurement_type = Avatar-Messung
vrc_config-calibration_range = Kalibrierungsbereich
vrc_config-calibration_visuals = Display-Kalibrierungsvisualisierungen
vrc_config-user_height = Echte Benutzergröße
vrc_config-spine_mode-UNKNOWN = Unbekannt
vrc_config-spine_mode-LOCK_BOTH = Beide sperren
vrc_config-spine_mode-LOCK_HEAD = Kopf sperren
vrc_config-spine_mode-LOCK_HIP = Hüfte sperren
vrc_config-tracker_model-UNKNOWN = Unbekannt
vrc_config-tracker_model-AXIS = Achse
vrc_config-tracker_model-BOX = Box
vrc_config-tracker_model-SPHERE = Sphäre
vrc_config-tracker_model-SYSTEM = System
vrc_config-avatar_measurement_type-UNKNOWN = Unbekannt
vrc_config-avatar_measurement_type-HEIGHT = Höhe
@@ -1433,22 +1517,41 @@ error_collection_modal-cancel = Ich will nicht
## Tracking checklist section
tracking_checklist = Tracking-Checkliste
tracking_checklist-settings = Einstellungen der Tracking-Checkliste
tracking_checklist-settings-close = Schließen
tracking_checklist-status-incomplete = Du bist nicht darauf vorbereitet, SlimeVR zu benutzen!
tracking_checklist-status-partial =
{ $count ->
[one] Sie haben 1 Warnung!
*[other] Sie haben { $count } Warnungen!
}
tracking_checklist-status-complete = Du bist bereit, SlimeVR zu nutzen!
tracking_checklist-MOUNTING_CALIBRATION = Tracker-Ausrichtung durchführen
tracking_checklist-FEET_MOUNTING_CALIBRATION = Führe eine Fußmontage-Kalibrierung durch
tracking_checklist-FULL_RESET = Führe einen vollständigen Reset durch
tracking_checklist-FULL_RESET-desc = Manche Tracker benötigen eine erneute Kalibrierung.
tracking_checklist-STEAMVR_DISCONNECTED = SteamVR läuft nicht
tracking_checklist-STEAMVR_DISCONNECTED-desc = SteamVR läuft nicht. Nutzen sie es für VR?
tracking_checklist-STEAMVR_DISCONNECTED-open = SteamVR starten
tracking_checklist-TRACKERS_REST_CALIBRATION = Kalibriere deine Tracker
tracking_checklist-TRACKERS_REST_CALIBRATION-desc = Sie haben keine Tracker-Kalibrierung durchgeführt. Bitte lassen Sie Ihre Tracker (gelb markiert) für einige Sekunden auf einer stabilen Oberfläche ruhen.
tracking_checklist-TRACKER_ERROR = Tracker mit Fehlern
tracking_checklist-TRACKER_ERROR-desc = Einige deiner Tracker haben einen Fehler. Bitte starte die gelb markierten Tracker neu.
tracking_checklist-VRCHAT_SETTINGS = VRChat-Einstellungen konfigurieren
tracking_checklist-VRCHAT_SETTINGS-desc = Du hast die VRChat-Einstellungen falsch konfiguriert! Das kann sich negativ auf dein Tracking auswirken.
tracking_checklist-VRCHAT_SETTINGS-open = Gehen sie zu den VRChat-Warnungen
tracking_checklist-UNASSIGNED_HMD = VR-Headset nicht dem Kopf zugewiesen
tracking_checklist-UNASSIGNED_HMD-desc = Das VR-Headset sollte als Kopf-Tracker zugewiesen sein.
tracking_checklist-NETWORK_PROFILE_PUBLIC = Ändere dein Netzwerkprofil
tracking_checklist-NETWORK_PROFILE_PUBLIC-desc =
{ $count ->
[one] Dein Netzwerkprofil ist derzeit auf Öffentlich ({ $adapters }) eingestellt. Dies wird für das ordnungsgemäße Funktionieren von SlimeVR nicht empfohlen. <PublicFixLink>Hier erfährst du, wie du das beheben kannst.</PublicFixLink>
*[other] Einige deiner Netzwerkadapter sind auf Öffentlich eingestellt:¶{ $adapters }¶Das wird nicht empfohlen, damit SlimeVR ordnungsgemäß funktioniert.¶<PublicFixLink>Hier erfährst du, wie du das beheben kannst.</PublicFixLink>
}
tracking_checklist-NETWORK_PROFILE_PUBLIC-open = Kontrollpanel öffnen
tracking_checklist-STAY_ALIGNED_CONFIGURED = Stay Aligned konfigurieren
tracking_checklist-STAY_ALIGNED_CONFIGURED-desc = Zeichne die Stay Aligned-Posen auf, um Drift zu reduzieren
tracking_checklist-STAY_ALIGNED_CONFIGURED-open = Öffne den Stay Aligned Assistent
tracking_checklist-ignore = Ignorieren
preview-mocap_mode_soon = Mocap-Modus (Bald™)
@@ -1458,5 +1561,6 @@ toolbar-mounting_calibration = Tracker-Ausrichtung
toolbar-mounting_calibration-default = Körper
toolbar-mounting_calibration-feet = Füße
toolbar-mounting_calibration-fingers = Finger
toolbar-drift_reset = Drift-Reset
toolbar-assigned_trackers = { $count } Tracker zugewiesen
toolbar-unassigned_trackers = { $count } Tracker nicht zugewiesen

View File

@@ -10,7 +10,7 @@
websocket-connecting = Cargando...
websocket-connection_lost = ¡El servidor falló!
websocket-connection_lost-desc = Parece que el servidor de SlimeVR ha dejado de funcionar. Revise los registros y reinicie el programa.
websocket-timedout = No se ha podido conectar al servidor.
websocket-timedout = No se ha podido conectar al servidor
websocket-timedout-desc = Parece que el servidor de SlimeVR ha dejado de funcionar o se agotó el tiempo de espera de la conexión. Revise los registros y reinicie el programa
websocket-error-close = Salir de SlimeVR
websocket-error-logs = Abrir la carpeta de registros
@@ -33,6 +33,10 @@ tips-failed_webgl = Fallo al inicializar WebGL.
## Units
unit-meter = Metro
unit-foot = Pie
unit-inch = Pulgada
unit-cm = cm
## Body parts
@@ -111,6 +115,11 @@ 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 = Guante SlimeVR Dev IMU
board_type-GESTURES = Gestos
board_type-ESP32S3_SUPERMINI = ESP32-S3 Supermini
board_type-GENERIC_NRF = nRF Genérico
board_type-SLIMEVR_BUTTERFLY_DEV = SlimeVR Dev Butterfly
board_type-SLIMEVR_BUTTERFLY = SlimeVR Butterfly
## Proportions
@@ -252,6 +261,10 @@ reset-mounting = Reinicio de montura
reset-mounting-feet = Restablecer montura de los pies
reset-mounting-fingers = Restablecer montura de los dedos
reset-yaw = Reinicio horizontal
reset-error-no_feet_tracker = Tracker de pie sin asignar
reset-error-no_fingers_tracker = Tracker de dedos sin asignar
reset-error-mounting-need_full_reset = Es necesario un reinicio completo antes de montar
reset-error-yaw-need_full_reset = Es necesario un reinicio completo antes del reinicio horizontal
## Serial detection stuff
@@ -271,10 +284,12 @@ navbar-trackers_assign = Asignación de sensores
navbar-mounting = Calibración de montura
navbar-onboarding = Asistente de configuración
navbar-settings = Ajustes
navbar-connect_trackers = Conectar Trackers
## Biovision hierarchy recording
bvh-start_recording = Grabar BVH
bvh-stop_recording = Guardar grabación BVH
bvh-recording = Grabando...
bvh-save_title = Guardar grabación BVH
@@ -418,6 +433,9 @@ tracker-settings-update-up_to_date = Actualizado
tracker-settings-update-blocked = Actualización no disponible. No hay otras versiones disponibles
tracker-settings-update = Actualizar ahora
tracker-settings-update-title = Versión del firmware
tracker-settings-current-version = Actual
tracker-settings-latest-version = Último
tracker-settings-build-date = Fecha de fabricación
## Tracker part card info
@@ -495,6 +513,8 @@ settings-sidebar-osc_vmc = VMC
settings-sidebar-utils = Utilidades
settings-sidebar-serial = Consola serial
settings-sidebar-appearance = Apariencia
settings-sidebar-home = Pantalla de Inicio
settings-sidebar-checklist = Lista de Tracking
settings-sidebar-notifications = Notificaciones
settings-sidebar-behavior = Comportamiento
settings-sidebar-firmware-tool = Herramienta de firmware DIY
@@ -651,7 +671,7 @@ settings-general-fk_settings-skeleton_settings-extended_spine_model = Modelo ext
settings-general-fk_settings-skeleton_settings-extended_pelvis_model = Modelo extendido del pelvis
settings-general-fk_settings-skeleton_settings-extended_knees_model = Modelo extendido de la rodilla
settings-general-fk_settings-skeleton_settings-ratios = Radios del esqueleto
settings-general-fk_settings-skeleton_settings-ratios-description = Cambia los valores de los ajustes del esqueleto. Podes llegar a necesitar reajustar tus proporciones después de cambiar estos valores.
settings-general-fk_settings-skeleton_settings-ratios-description = Cambia los valores de los ajustes del esqueleto. Podrías llegar a necesitar reajustar tus proporciones después de cambiar estos valores.
settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_hip = Imputar de la cintura al pecho hasta la cadera
settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_legs = Imputar de la cintura al pecho hasta las piernas
settings-general-fk_settings-skeleton_settings-impute_hip_from_chest_legs = Imputar de la cadera al pecho hasta las piernas
@@ -925,9 +945,15 @@ settings-utils-advanced-open_logs-label = Abrir carpeta
## Home Screen
settings-home-list-layout = Diseño de la lista de Trackers
settings-home-list-layout-desc = Selecciona uno de los posibles diseños de la pantalla de inicio
settings-home-list-layout-grid = Cuadrícula
settings-home-list-layout-table = Tabla
## Tracking Checlist
settings-tracking_checklist-active_steps = Pasos Activos
settings-tracking_checklist-active_steps-desc = Lista de todos los pasos en la lista de tracking. Puedes elegir desactivar pasos específicos.
## Setup/onboarding menu
@@ -944,6 +970,13 @@ onboarding-setup_warning-cancel = Continuar configuración
## Wi-Fi setup
onboarding-wifi_creds-back = Volver a la introducción
onboarding-wifi_creds-v2 = Trackers utilizando Wi-Fi
# This cares about multilines
onboarding-wifi_creds-description-v2 =
La mayoría de trackers (como los trackers oficiales de SlimeVR) utilizan Wi-Fi para conectar al servidor.
Por favor utiliza las credenciales de la red Wi-Fi donde tu dispositivo esta actualmente conectado.
¡Asegúrate de utilizar una conexión Wi-Fi 2.4Ghz para tus trackers!
onboarding-wifi_creds-skip = Saltar ajustes de Wi-Fi
onboarding-wifi_creds-submit = ¡Enviar!
onboarding-wifi_creds-ssid =
@@ -953,12 +986,16 @@ onboarding-wifi_creds-ssid-required = Se requiere el nombre del Wi-Fi
onboarding-wifi_creds-password =
.label = Contraseña
.placeholder = Ingresa la contraseña
onboarding-wifi_creds-dongle-title = Trackers utilizando un dongle
onboarding-wifi_creds-dongle-description = ¡Si tus trackers llegaron con un dongle, conéctalo a tu dispositivo y deberías estar listo para usar!
onboarding-wifi_creds-dongle-wip = Esta sección es un trabajo en progreso. Una página dedicada para administrar trackers que se conectan via dongle sera hecha pronto.
onboarding-wifi_creds-dongle-continue = Continuar con un dongle
## Mounting setup
onboarding-reset_tutorial-back = Volver a la calibración de montura
onboarding-reset_tutorial = Reiniciar tutorial
onboarding-reset_tutorial-explanation = Mientras estés usando tus trackers, estos pueden empezar a desalinearse por el drift horizontal del IMU, o porque los moviste físicamente. Hay varias formas de arreglar este tipo de problemas.
onboarding-reset_tutorial-explanation = Mientras estés usando tus trackers, estos pueden empezar a desalinearse por el desvío horizontal del IMU, o porque los moviste físicamente. Hay varias formas de arreglar este tipo de problemas.
onboarding-reset_tutorial-skip = Saltar paso
# Cares about multiline
onboarding-reset_tutorial-0 =
@@ -969,8 +1006,8 @@ onboarding-reset_tutorial-0 =
onboarding-reset_tutorial-1 =
Toca { $taps } veces el tracker resaltado para activar el reinicio completo.
Se requiere que estas de forma parada (pose en i). Esto tiene un delay de 3 segundos (configurable) antes de que actualmente suceda.
Esto reinicia completamente la posición y rotación de todos tus sensores, debería de arreglar la mayoría de tus problemas.
Se requiere que estés de pie (pose en i). Esto tiene una demora de 3 segundos (configurable) antes de que realmente suceda.
Esto reinicia completamente la posición y rotación de todos tus trackers. Debería de arreglar la mayoría de los problemas.
# Cares about multiline
onboarding-reset_tutorial-2 =
Toca { $taps } veces el tracker resaltado para activar el reinicio de montura.
@@ -1058,6 +1095,7 @@ onboarding-assignment_tutorial-done = ¡Puse las correas y stickers!
onboarding-assign_trackers-back = Volver a las credenciales Wi-Fi
onboarding-assign_trackers-title = Asignación de sensores
onboarding-assign_trackers-description = Debes escoger dónde van los sensores. Has clic en la ubicación donde quieras colocar un sensor
onboarding-assign_trackers-unassign_all = Des-asignar todos los trackers
# Look at translation of onboarding-connect_tracker-connected_trackers on how to use plurals
# $assigned (Number) - Trackers that have been assigned a body part
# $trackers (Number) - Trackers connected to the server
@@ -1203,6 +1241,8 @@ onboarding-automatic_mounting-done-restart = Volver al inicio
onboarding-automatic_mounting-mounting_reset-title = Reinicio de montura
onboarding-automatic_mounting-mounting_reset-step-0 = 1. Arrodíllate en una posición de «esquiar» con tus piernas dobladas, la parte superior de tu cuerpo inclinada hacia adelante, y tus brazos doblados.
onboarding-automatic_mounting-mounting_reset-step-1 = 2. Presiona el botón «Reinicio de montura» y espera 3 segundos hasta que se reinicie la montura.
onboarding-automatic_mounting-mounting_reset-feet-step-0 = 1. Párate de puntillas con ambos pies apuntando hacia el frente. Alternativamente puedes hacerlo sentándote en una silla.
onboarding-automatic_mounting-mounting_reset-feet-step-1 = 2. Presiona el botón "Calibración de pies" y espera por 3 segundos hasta que la orientación de los trackers se reinicie.
onboarding-automatic_mounting-preparation-title = Preparación
onboarding-automatic_mounting-preparation-v2-step-0 = 1. Presiona el botón «Reinicio completo».
onboarding-automatic_mounting-preparation-v2-step-1 = 2. Párate recto con los brazos a tus lados. Asegúrate de mirar hacia adelante.
@@ -1214,6 +1254,7 @@ onboarding-automatic_mounting-return-home = Hecho
## Tracker manual proportions setupa
onboarding-manual_proportions-back-scaled = Regresar a Proporciones Escaladas
onboarding-manual_proportions-title = Proporciones de cuerpo manuales
onboarding-manual_proportions-fine_tuning_button = Ajustar automáticamente las proporciones
onboarding-manual_proportions-fine_tuning_button-disabled-tooltip = Por favor conecte un visor VR para utilizar el ajuste automático
@@ -1313,6 +1354,30 @@ onboarding-automatic_proportions-smol_warning-cancel = Volver
## User height calibration
onboarding-user_height-title = ¿Cuál es tu altura?
onboarding-user_height-description = Necesitamos tu altura para calcular tus proporciones corporales y representar tus movimientos de manera precisa. Puedes dejar que SlimeVR lo calcule, o puedes ingresar tu altura manualmente.
onboarding-user_height-need_head_tracker = Un casco y controles con rastreo posicional son requeridos para realizar la calibración.
onboarding-user_height-calculate = Calcular mi altura automáticamente
onboarding-user_height-next_step = Continuar y guardar
onboarding-user_height-manual-proportions = Proporciones Manuales
onboarding-user_height-calibration-title = Progreso de Calibración
onboarding-user_height-calibration-RECORDING_FLOOR = Toca el suelo con la punta de tu control
onboarding-user_height-calibration-WAITING_FOR_RISE = Vuelve a pararte
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK = Vuelve a pararte y mira hacia adelante
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-ok = Asegúrate de que tu cabeza este derecha
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-low = No mires al suelo
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-high = No mires demasiado arriba
onboarding-user_height-calibration-WAITING_FOR_CONTROLLER_PITCH = Asegúrate que el control este apuntando hacia abajo
onboarding-user_height-calibration-RECORDING_HEIGHT = ¡Vuelve a pararte y no te muevas!
onboarding-user_height-calibration-DONE = ¡Éxito!
onboarding-user_height-calibration-ERROR_TIMEOUT = Calibración agotada, inténtalo de nuevo.
onboarding-user_height-calibration-ERROR_TOO_HIGH = La altura del usuario detectada es demasiado alta, inténtalo de nuevo.
onboarding-user_height-calibration-ERROR_TOO_SMALL = La altura del usuario detectada es demasiado baja. Asegúrate de pararte derecho y mirar hacia el frente al final de la calibración.
onboarding-user_height-calibration-error = Calibración Fallida
onboarding-user_height-manual-tip = Mientras ajustas tu altura, intenta poses distintas y ve como el esqueleto se ajusta a tu cuerpo.
onboarding-user_height-reset-warning =
<b>Peligro:</b> Esto reiniciará tus proporciones para ser basadas en tu altura.
¿Seguro quieres hacer esto?
## Stay Aligned setup
@@ -1351,6 +1416,7 @@ onboarding-stay_aligned-done = Hecho
## Home
home-no_trackers = No hay sensores detectados o asignados
home-settings = Ajustes de la Página de Inicio
home-settings-close = Cerrar
## Trackers Still On notification
@@ -1417,6 +1483,9 @@ firmware_tool-flash_method_step-serial-v2 =
firmware_tool-flashbtn_step = Presione el botón de boot
firmware_tool-flashbtn_step-description = Antes de pasar al siguiente paso, hay algunas cosas que debe hacer
firmware_tool-flashbtn_step-board_SLIMEVR = Apague el sensor, retire la carcasa (si la hay), conecte un cable USB a esta computadora y, a continuación, realice uno de los siguientes pasos de acuerdo con la revisión de la placa SlimeVR:
firmware_tool-flashbtn_step-board_SLIMEVR-r11-v2 = Enciende el tracker mientras haces corto en el segundo pad rectangular de FLASH desde el borde en la parte superior de la placa con el protector metálico del microcontrolador. El LED del tracker debería hacer un parpadeo breve.
firmware_tool-flashbtn_step-board_SLIMEVR-r12-v2 = Enciende el tracker mientras haces corto en pad circular de FLASH en la parte superior de la placa con el protector metálico del microcontrolador. El LED del tracker debería hacer un parpadeo breve.
firmware_tool-flashbtn_step-board_SLIMEVR-r14-v2 = Enciende el tracker mientras pulsas el botón FLASH en la parte superior de la placa. El LED del tracker deberia hacer un parpadeo breve.
firmware_tool-flashbtn_step-board_OTHER =
Antes de flashear, probablemente tendrá que poner el sensor en modo bootloader.
La mayoría de las veces, esto significa presionar el botón de boot en la placa antes de que comience el proceso de flasheo. Si el proceso de flasheo se agota al comienzo, probablemente significa que el sensor no estaba en modo bootloader.
@@ -1432,7 +1501,7 @@ firmware_tool-flash_method_serial-no_devices = No se han detectado dispositivos
firmware_tool-build_step = Compilando
firmware_tool-build_step-description = El firmware se está compilando, por favor espere
firmware_tool-flashing_step = Flasheando
firmware_tool-flashing_step-description = Sus sensores se están flasheando, por favor siga las instrucciones en la pantalla
firmware_tool-flashing_step-description = Sus trackers se están flasheando, por favor siga las instrucciones en la pantalla
firmware_tool-flashing_step-warning-v2 = No desconectes o apagues el tracker durante el proceso de subida a menos que se te indique, puede causar que tu placa quede inutilizable.
firmware_tool-flashing_step-flash_more = Flashear más sensores
firmware_tool-flashing_step-exit = Salir
@@ -1559,9 +1628,59 @@ error_collection_modal-cancel = No quiero
## Tracking checklist section
tracking_checklist = Lista de Tracking
tracking_checklist-settings = Ajustes de la Lista de Tracking
tracking_checklist-settings-close = Cerrar
tracking_checklist-status-incomplete = ¡No estás listo para usar SlimeVR!
tracking_checklist-status-partial =
{ $count ->
[one] ¡Tienes 1 advertencia!
[many] ¡Tienes { $count } advertencias!
*[other] { "" }
}
tracking_checklist-status-complete = ¡Estás listo para usar SlimeVR!
tracking_checklist-MOUNTING_CALIBRATION = Realizar una calibración de montura
tracking_checklist-FEET_MOUNTING_CALIBRATION = Realizar una calibración de montura de los pies
tracking_checklist-FULL_RESET = Realizar un reinicio completo
tracking_checklist-FULL_RESET-desc = Algunos trackers necesitan realizar un reinicio.
tracking_checklist-STEAMVR_DISCONNECTED = SteamVR no se está ejecutando
tracking_checklist-STEAMVR_DISCONNECTED-desc = SteamVR no se esta ejecutando. ¿Lo estas usando para VR?
tracking_checklist-STEAMVR_DISCONNECTED-open = Abrir SteamVR
tracking_checklist-TRACKERS_REST_CALIBRATION = Calibra tus trackers
tracking_checklist-TRACKERS_REST_CALIBRATION-desc = No realizaste una calibración para los trackers. Por favor deja reposar tus trackers (resaltados en amarillo) en una superficie estable por unos segundos.
tracking_checklist-TRACKER_ERROR = Trackers con Errores
tracking_checklist-TRACKER_ERROR-desc = Algunos de tus trackers tienen un error. Por favor reinicia el tracker resaltado en amarillo.
tracking_checklist-VRCHAT_SETTINGS = Configurar ajustes de VRChat
tracking_checklist-VRCHAT_SETTINGS-desc = ¡Tienes ajustes mal puestos en VRChat! Esto puede impactar negativamente tu tracking.
tracking_checklist-VRCHAT_SETTINGS-open = Ir a Advertencias de VRChat
tracking_checklist-UNASSIGNED_HMD = Casco VR sin asignar a Cabeza
tracking_checklist-UNASSIGNED_HMD-desc = El casco VR debería estar asignado como un tracker de cabeza.
tracking_checklist-NETWORK_PROFILE_PUBLIC = Cambia tu perfil de red
tracking_checklist-NETWORK_PROFILE_PUBLIC-desc =
{ $count ->
[one]
Tu perfil de red esta actualmente configurado como Público ({ $adapters }).
Esto no es recomendado para el correcto funcionamiento de SlimeVR.
<PublicFixLink>Ve como arreglarlo aquí</PublicFixLink>
[many]
Algunos de tus adaptadores de red están configurados como públicos:
{ $adapters }
Esto no es recomendado para el correcto funcionamiento de SlimeVR.
<PublicFixLink>Ve como arreglarlo aquí</PublicFixLink>
*[other] { "" }
}
tracking_checklist-NETWORK_PROFILE_PUBLIC-open = Abrir Panel de Control
tracking_checklist-STAY_ALIGNED_CONFIGURED = Configurar Stay Aligned
tracking_checklist-STAY_ALIGNED_CONFIGURED-desc = Graba las poses de Stay Aligned para reducir el desvío
tracking_checklist-STAY_ALIGNED_CONFIGURED-open = Abrir el ayudante de Stay Aligned
tracking_checklist-ignore = Ignorar
preview-mocap_mode_soon = Modo Mocap (Pronto™)
preview-disable_render = Desactivar renderizado
preview-disabled_render = Renderizado desactivado
toolbar-mounting_calibration = Calibración de montura
toolbar-mounting_calibration-default = Cuerpo
toolbar-mounting_calibration-feet = Pies
toolbar-mounting_calibration-fingers = Dedos
toolbar-drift_reset = Reinicio de Desviación
toolbar-assigned_trackers = { $count } trackers asignados
toolbar-unassigned_trackers = { $count } trackers sin asignar

View File

@@ -33,6 +33,10 @@ tips-failed_webgl = No se pudo iniciar WebGL.
## Units
unit-meter = Metro
unit-foot = Pie
unit-inch = Pulgada
unit-cm = cm
## Body parts
@@ -241,10 +245,12 @@ navbar-trackers_assign = Asignación de trackers
navbar-mounting = Calibración de montura
navbar-onboarding = Asistente de Configuración
navbar-settings = Configuración
navbar-connect_trackers = Conectar Trackers
## Biovision hierarchy recording
bvh-start_recording = Grabar BVH
bvh-stop_recording = Guardar grabación BVH
bvh-recording = Grabando...
bvh-save_title = Guardar grabación BVH
@@ -381,6 +387,7 @@ tracker-settings-name_section-label = Nombre del tracker
tracker-settings-forget = Olvidar tracker
tracker-settings-forget-description = Elimina el tracker del servidor SlimeVR y evita que se conecte a él hasta que se reinicie el servidor. La configuración del tracker no se perderá.
tracker-settings-forget-label = Olvidar tracker
tracker-settings-update-incompatible = No se puede actualizar. Versión de placa o firmware incompatible
tracker-settings-update-low-battery = No se puede actualizar. Batería inferior al 50%
tracker-settings-update-up_to_date = Actualizado
tracker-settings-update-blocked = Actualización no disponible. No hay otras versiones disponibles
@@ -451,6 +458,7 @@ mounting_selection_menu-close = Cerrar
settings-sidebar-title = Configuración
settings-sidebar-general = General
settings-sidebar-steamvr = SteamVR
settings-sidebar-tracker_mechanics = Mecánicas del tracker
settings-sidebar-stay_aligned = Mantener Alineado
settings-sidebar-fk_settings = Configuración del tracking

View File

@@ -7,7 +7,7 @@
## Websocket (server) status
websocket-connecting = Connexion au serveur
websocket-connecting = Chargement...
websocket-connection_lost = Connexion avec le serveur perdue. Reconnexion...
websocket-connection_lost-desc = Il semble que le serveur SlimeVR ait planté. Vérifiez les logs et redémarrez le programme.
websocket-timedout = Impossible de se connecter au serveur
@@ -33,7 +33,7 @@ tips-failed_webgl = Échec de l'initialisation de WebGL.
## Units
unit-meter = Metre
unit-meter = Mètre
unit-foot = Pied
unit-inch = Pouce
unit-cm = cm
@@ -115,6 +115,11 @@ 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 Dev IMU Glove
board_type-GESTURES = Gestes
board_type-ESP32S3_SUPERMINI = ESP32-S3 Supermini
board_type-GENERIC_NRF = nRF Générique
board_type-SLIMEVR_BUTTERFLY_DEV = SlimeVR Dev Butterfly
board_type-SLIMEVR_BUTTERFLY = SlimeVR Butterfly
## Proportions
@@ -225,7 +230,7 @@ skeleton_bone-LOWER_ARM-desc =
skeleton_bone-HAND_Y = Distance Y des mains
skeleton_bone-HAND_Y-desc =
Ceci est la distance verticale entre vos poignets et le milieu de vos main.
Pour lajuster pour la capture de mouvement, ajustez correctement la longueur des bras et modifiez-la jusquà ce que votre
Pour lajuster pour la capture de mouvement, ajustez correctement la longueur des bras et modifiez-la jusquà ce que vos
capteurs de main soient alignés verticalement avec le milieu de vos mains.
Pour lajuster pour le suivi des coudes à partir de vos manettes, réglez la longueur des bras à 0 et
modifiez-la jusquà ce que vos capteurs de coude soient alignés verticalement avec vos poignets.
@@ -256,9 +261,10 @@ reset-mounting = Réinitialiser l'alignement
reset-mounting-feet = Réinitialiser l'alignement des pieds
reset-mounting-fingers = Réinitialiser l'alignement des doigts
reset-yaw = Réinitialisation horizontale
reset-error-no_feet_tracker = Aucun traqueur de pieds nest assigné
reset-error-no_fingers_tracker = Aucun traqueur de doigts n'est assigné
reset-error-no_feet_tracker = Aucun capteur de pieds nest assigné
reset-error-no_fingers_tracker = Aucun capteur de doigts n'est assigné
reset-error-mounting-need_full_reset = Nécessite une réinitialisation complète avant de le monter
reset-error-yaw-need_full_reset = Nécessite une réinitialisation complète avant une réinitialisation horizontale
## Serial detection stuff
@@ -278,6 +284,7 @@ navbar-trackers_assign = Attribution des capteurs
navbar-mounting = Alignement des capteurs
navbar-onboarding = Assistant de configuration
navbar-settings = Réglages
navbar-connect_trackers = Connecter les capteurs
## Biovision hierarchy recording
@@ -348,6 +355,7 @@ tracker-table-column-name = Nom
tracker-table-column-type = Type
tracker-table-column-battery = Batterie
tracker-table-column-ping = Ping
tracker-table-column-packet_loss = Pertes de paquets
tracker-table-column-tps = TPS
tracker-table-column-temperature = Temp. °C
tracker-table-column-linear-acceleration = Accél. X/Y/Z
@@ -389,6 +397,9 @@ tracker-infos-magnetometer-status-v1 =
[ENABLED] Activé
*[NOT_SUPPORTED] Non pris en charge
}
tracker-infos-packet_loss = Pertes de paquets
tracker-infos-packets_lost = Paquets perdus
tracker-infos-packets_received = Paquets reçus
## Tracker settings
@@ -426,6 +437,9 @@ tracker-settings-update-up_to_date = À jour
tracker-settings-update-blocked = Mise à jour non disponible. Aucune autre version disponible
tracker-settings-update = Mettre à jour maintenant
tracker-settings-update-title = Version du micrologiciel
tracker-settings-current-version = Actuel
tracker-settings-latest-version = Dernière version
tracker-settings-build-date = Date de build
## Tracker part card info
@@ -504,6 +518,7 @@ settings-sidebar-utils = Utilitaires
settings-sidebar-serial = Console série
settings-sidebar-appearance = Apparence
settings-sidebar-home = Ecran d'accueil
settings-sidebar-checklist = Checklist de suivi
settings-sidebar-notifications = Notifications
settings-sidebar-behavior = Comportement
settings-sidebar-firmware-tool = Outil de micrologiciel DIY
@@ -589,6 +604,9 @@ settings-general-tracker_mechanics-use_mag_on_all_trackers-description =
Utilise le magnétomètre sur tous les capteurs dotés d'un micrologiciel compatible, réduisant ainsi la dérive dans des environnements magnétiques stables.
Peut être désactivé par capteur dans les paramètres du capteur. <b>Ne fermez aucun des capteurs en changeant cette option !</b>
settings-general-tracker_mechanics-use_mag_on_all_trackers-label = Utiliser le magnétomètre sur les capteurs
settings-general-tracker_mechanics-trackers_over_usb = Capteurs via USB
settings-general-tracker_mechanics-trackers_over_usb-description = Permet de recevoir des données de suivi HID via USB. Assurez-vous que les capteurs connectés ont <b>la connexion via HID</b> activée !
settings-general-tracker_mechanics-trackers_over_usb-enabled-label = Permettre aux capteurs HID de se connecter directement via USB
settings-stay_aligned = Garder Aligné
settings-stay_aligned-description = Garder Aligné réduit la dérive en ajustant progressivement vos capteurs pour quils correspondent à vos postures détendues.
settings-stay_aligned-setup-label = Configurer Garder Aligné
@@ -851,7 +869,7 @@ settings-osc-vrchat-network-port_out =
settings-osc-vrchat-network-address = Adresse réseau
settings-osc-vrchat-network-address-description-v1 = Choisissez l'adresse à laquelle envoyer des données. Peut être laissé intact pour VRChat.
settings-osc-vrchat-network-address-placeholder = Adresse IP VRChat
settings-osc-vrchat-network-trackers = capteurs
settings-osc-vrchat-network-trackers = Capteurs
settings-osc-vrchat-network-trackers-description = Sélectionner quels capteurs envoyer via OSC.
settings-osc-vrchat-network-trackers-chest = Poitrine
settings-osc-vrchat-network-trackers-hip = Hanche
@@ -931,11 +949,15 @@ settings-utils-advanced-open_logs-label = Ouvrir le dossier
## Home Screen
settings-home-list-layout = Disposition de la liste des capteurs
settings-home-list-layout-desc = Sélectionnez l'une des dispositions possibles de l'écran d'accueil
settings-home-list-layout-grid = Grille
settings-home-list-layout-table = Tableau
## Tracking Checlist
settings-tracking_checklist-active_steps = Etapes actives
settings-tracking_checklist-active_steps-desc = Liste de toutes les étapes de la checklist de suivi. Vous pouvez choisir de désactiver certaines étapes.
## Setup/onboarding menu
@@ -952,6 +974,13 @@ onboarding-setup_warning-cancel = Continuer la configuration
## Wi-Fi setup
onboarding-wifi_creds-back = Retour à l'introduction
onboarding-wifi_creds-v2 = Capteurs utilisant le Wi-Fi
# This cares about multilines
onboarding-wifi_creds-description-v2 =
La plupart des capteurs (comme les capteurs officiels SlimeVR) utilisent le Wi-Fi pour se connecter au serveur.
Veuillez utiliser les identifiants du réseau Wi-Fi auquel votre appareil est actuellement connecté.
Assurez-vous dutiliser une connexion Wi-Fi 2,4 GHz pour vos capteurs !
onboarding-wifi_creds-skip = Passer configuration Wi-Fi
onboarding-wifi_creds-submit = Valider
onboarding-wifi_creds-ssid =
@@ -961,6 +990,10 @@ onboarding-wifi_creds-ssid-required = Le nom du Wi-Fi est requis
onboarding-wifi_creds-password =
.label = Mot de passe du Wi-Fi
.placeholder = Mot de passe
onboarding-wifi_creds-dongle-title = Capteurs utilisant un dongle
onboarding-wifi_creds-dongle-description = Si vos capteurs ont été livrés avec un dongle, branchez-le à votre appareil et vous devriez être prêt !
onboarding-wifi_creds-dongle-wip = Cette section est en cours de développement. Une page dédiée à la gestion des capteurs connectés via un dongle sera bientôt créée.
onboarding-wifi_creds-dongle-continue = Continuer avec un dongle
## Mounting setup
@@ -1066,6 +1099,7 @@ onboarding-assignment_tutorial-done = J'ai mis les autocollants et les sangles !
onboarding-assign_trackers-back = Revenir aux identifiants Wi-Fi
onboarding-assign_trackers-title = Attribuer des capteurs
onboarding-assign_trackers-description = Choisissons où mettre chaque capteur.
onboarding-assign_trackers-unassign_all = Désattribuer tout les capteurs
# Look at translation of onboarding-connect_tracker-connected_trackers on how to use plurals
# $assigned (Number) - Trackers that have been assigned a body part
# $trackers (Number) - Trackers connected to the server
@@ -1210,6 +1244,8 @@ onboarding-automatic_mounting-done-restart = Retourner au début
onboarding-automatic_mounting-mounting_reset-title = Réinitialisation de l'alignement
onboarding-automatic_mounting-mounting_reset-step-0 = 1. Accroupissez-vous dans une pose de "ski" avec les jambes pliées, le haut du corps incliné vers l'avant et les bras pliés.
onboarding-automatic_mounting-mounting_reset-step-1 = 2. Appuyez sur le bouton "Réinitialiser l'alignement" et attendez 3 secondes avant que l'alignement des capteurs se calibre.
onboarding-automatic_mounting-mounting_reset-feet-step-0 = 1. Mettez-vous sur la pointe des pieds, les deux pieds pointés vers lavant. Vous pouvez aussi le faire assis sur une chaise.
onboarding-automatic_mounting-mounting_reset-feet-step-1 = 2. Appuyez sur le bouton « Calibration des pieds » et attendez 3 secondes avant que lorientation de l'alignement des capteurs ne se réinitialise.
onboarding-automatic_mounting-preparation-title = Préparation
onboarding-automatic_mounting-preparation-v2-step-0 = 1. Appuyez sur le bouton « Réinitialisation complète ».
onboarding-automatic_mounting-preparation-v2-step-1 = 2. Tenez-vous droit debout, les bras le long du corps. Assurez-vous de regarder vers lavant.
@@ -1221,6 +1257,7 @@ onboarding-automatic_mounting-return-home = Terminé
## Tracker manual proportions setupa
onboarding-manual_proportions-back-scaled = Retour aux proportions mises à l'échelle
onboarding-manual_proportions-title = Proportions manuelles du corps
onboarding-manual_proportions-fine_tuning_button = Automatiquement ajuster les proportions
onboarding-manual_proportions-fine_tuning_button-disabled-tooltip = Veuillez connecter un casque VR pour utiliser l'ajustement automatique
@@ -1321,9 +1358,29 @@ onboarding-automatic_proportions-smol_warning-cancel = Retour
## User height calibration
onboarding-user_height-title = Quelle est votre taille ?
onboarding-user_height-description = Nous avons besoin de votre taille pour calculer les proportions de votre corps ainsi que pour représenter précisément vos mouvements. Vous pouvez laisser SlimeVR la calculer ou entrer votre taille manuellement.
onboarding-user_height-need_head_tracker = Un casque VR (ou capteur de tête) et des manettes à position absolue sont nécessaires pour calculer votre taille.
onboarding-user_height-calculate = Calculer ma taille automatiquement
onboarding-user_height-next_step = Continuer et enregistrer
onboarding-user_height-manual-proportions = Proportions manuelles
onboarding-user_height-calibration-title = Progression de la calibration
onboarding-user_height-calibration-RECORDING_FLOOR = Touchez le sol avec l'extrémité de votre contrôleur
onboarding-user_height-calibration-WAITING_FOR_RISE = Relevez-vous
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK = Relevez-vous et regardez droit devant vous
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-ok = Assurez-vous que votre tête est bien droite
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-low = Ne regardez pas vers le sol
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-high = Ne regardez pas trop haut
onboarding-user_height-calibration-WAITING_FOR_CONTROLLER_PITCH = Assurez-vous que votre manette pointe vers le bas
onboarding-user_height-calibration-RECORDING_HEIGHT = Relevez-vous et restez immobile !
onboarding-user_height-calibration-DONE = Succès !
onboarding-user_height-calibration-ERROR_TIMEOUT = Délais de calibration expiré, veuillez réessayer.
onboarding-user_height-calibration-ERROR_TOO_HIGH = La taille détectée est trop grande, veuillez réessayez.
onboarding-user_height-calibration-ERROR_TOO_SMALL = La taille détectée est trop petite. Veuillez rester droit et regardez devant vous à la fin de la calibration.
onboarding-user_height-calibration-error = Calibration échouée
onboarding-user_height-manual-tip = En ajustant votre taille, essayez différentes poses et regardez comment le squelette suit vos mouvements.
onboarding-user_height-reset-warning =
<b>Attention :</b> Cette action réinitialisera vos proportions pour être basées sur votre taille.
Êtes-vous sûr de vouloir continuer ?
## Stay Aligned setup
@@ -1358,10 +1415,13 @@ onboarding-stay_aligned-previous_step = Précédent
onboarding-stay_aligned-next_step = Prochain
onboarding-stay_aligned-restart = Recommencer
onboarding-stay_aligned-done = Fait
onboarding-stay_aligned-manual_mounting-done = Terminé
## Home
home-no_trackers = Aucun capteur détecté ou attribué
home-settings = Paramètres de la page d'accueil
home-settings-close = Fermer
## Trackers Still On notification
@@ -1406,6 +1466,9 @@ firmware_tool-select_source-firmware = Source du micrologiciel
firmware_tool-select_source-version = Version du micrologiciel
firmware_tool-select_source-official = Officiel
firmware_tool-select_source-dev = Dev
firmware_tool-select_source-not_selected = Aucune source sélectionnée
firmware_tool-select_source-no_boards = Aucune carte disponible pour cette source
firmware_tool-select_source-no_versions = Aucune version disponible pour cette source
firmware_tool-board_defaults = Configurez votre carte
firmware_tool-board_defaults-description = Réglez les broches ou réglages pour votre matériel
firmware_tool-board_defaults-add = Ajouter
@@ -1427,6 +1490,9 @@ firmware_tool-flash_method_step-serial-v2 =
firmware_tool-flashbtn_step = Appuyez sur le bouton boot
firmware_tool-flashbtn_step-description = Avant de passer à l'étape suivante, il y a quelques choses que vous devez faire
firmware_tool-flashbtn_step-board_SLIMEVR = Éteignez le capteur, retirez le boîtier (s'il y en a un), connectez un câble USB à votre ordinateur, puis effectuez l'une des étapes suivantes en fonction de la révision de votre carte SlimeVR :
firmware_tool-flashbtn_step-board_SLIMEVR-r11-v2 = Allumez le capteur tout en court-circuitant le second pad FLASH rectangulaire à partir du bord en haut de la carte jusquà la protection métallique du microcontrôleur. La LED du capteur devrait faire un clignotement rapide.
firmware_tool-flashbtn_step-board_SLIMEVR-r12-v2 = Allumez le capteur tout en court-circuitant le pad FLASH circulaire sur le dessus de la carte à la protection métallique du microcontrôleur. La LED du capteur devrait faire un clignotement rapide.
firmware_tool-flashbtn_step-board_SLIMEVR-r14-v2 = Allumez le capteur tout en appuyant sur le bouton FLASH sur le dessus de la carte. La LED du capteur devrait faire un clignotement brièvement.
firmware_tool-flashbtn_step-board_OTHER =
Avant de flash le capteur, vous devrez probablement le mettre en mode bootloader.
La plupart du temps, il s'agit d'appuyer sur le bouton boot de la carte avant que le processus de flash ne commence.
@@ -1569,3 +1635,54 @@ error_collection_modal-cancel = Je ne veux pas
## Tracking checklist section
tracking_checklist = Checklist de suivi
tracking_checklist-settings = Paramètres de lachecklist de suivi
tracking_checklist-settings-close = Fermer
tracking_checklist-status-incomplete = Vous nêtes pas prêt à utiliser SlimeVR !
tracking_checklist-status-partial =
{ $count ->
[one] Vous avez 1 avertissement !
*[other] Vous avez { $count } avertissements !
}
tracking_checklist-status-complete = Vous êtes prêt à utiliser SlimeVR !
tracking_checklist-MOUNTING_CALIBRATION = Effectuer une calibration de l'alignement
tracking_checklist-FEET_MOUNTING_CALIBRATION = Effectuer une calibration de l'alignement des pieds
tracking_checklist-FULL_RESET = Faire une réinitialisation complète
tracking_checklist-FULL_RESET-desc = Certains capteurs nécessitent une réinitialisation.
tracking_checklist-STEAMVR_DISCONNECTED = SteamVR n'est pas lancé
tracking_checklist-STEAMVR_DISCONNECTED-desc = SteamVR n'est pas lancé. Lutilisez-vous pour la VR ?
tracking_checklist-STEAMVR_DISCONNECTED-open = Lancer SteamVR
tracking_checklist-TRACKERS_REST_CALIBRATION = Calibrer vos capteurs
tracking_checklist-TRACKERS_REST_CALIBRATION-desc = Vous navez pas fait de calibration de capteur. Veuillez laisser vos capteurs (surlignés en jaune) reposer sur une surface stable pendant quelques seconds.
tracking_checklist-TRACKER_ERROR = Capteurs avec erreur
tracking_checklist-TRACKER_ERROR-desc = Certains de vos capteurs ont une erreur. Veuillez redémarrer les capteurs surlignés en jaune.
tracking_checklist-VRCHAT_SETTINGS = Configurez les paramètres de VRChat
tracking_checklist-VRCHAT_SETTINGS-desc = Vous avez mal configuré les paramètres de VRChat ! Cela peut dégrader votre suivi.
tracking_checklist-VRCHAT_SETTINGS-open = Aller sur les avertissements de VRChat
tracking_checklist-UNASSIGNED_HMD = Casque VR non attribué à la tête
tracking_checklist-UNASSIGNED_HMD-desc = Le casque VR devrait être attribué en tant que capteur de la tête.
tracking_checklist-NETWORK_PROFILE_PUBLIC = Modifier votre profil de réseau
tracking_checklist-NETWORK_PROFILE_PUBLIC-desc =
{ $count ->
[one] Votre profil de réseau est actuellement défini comme étant public. Ce nest pas recommandé pour le fonctionnement correct de SlimeVR. <PublicFixLink>Voyez comment y remédier ici.</PublicFixLink>
*[other]
Certains de vos adaptateurs réseau sont réglés sur public :
{ $adapters }
Ce nest pas recommandé pour que SlimeVR fonctionne correctement.
<PublicFixLink>Voyez comment y remédier ici.</PublicFixLink>
}
tracking_checklist-NETWORK_PROFILE_PUBLIC-open = Ouvrir le panneau de configuration
tracking_checklist-STAY_ALIGNED_CONFIGURED = Configurer Garder Aligné
tracking_checklist-STAY_ALIGNED_CONFIGURED-desc = Enregistrez les poses Garder Aligné pour réduire la dérive
tracking_checklist-STAY_ALIGNED_CONFIGURED-open = Ouvrir l'assistant de Garder Aligné
tracking_checklist-ignore = Ignorer
preview-mocap_mode_soon = Mode Mocap (Bientôt™)
preview-disable_render = Désactiver le rendu
preview-disabled_render = Rendu désactivé
toolbar-mounting_calibration = Calibration de l'alignement
toolbar-mounting_calibration-default = Corps
toolbar-mounting_calibration-feet = Pieds
toolbar-mounting_calibration-fingers = Doigts
toolbar-drift_reset = Réinitialisation de la dérive
toolbar-assigned_trackers = { $count } capteurs assignés
toolbar-unassigned_trackers = { $count } capteurs non assignés

View File

@@ -115,6 +115,11 @@ 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 Dev IMU Handschoen
board_type-GESTURES = Gebaren
board_type-ESP32S3_SUPERMINI = ESP32-S3 Supermini
board_type-GENERIC_NRF = Generic nRF
board_type-SLIMEVR_BUTTERFLY_DEV = SlimeVR Dev Butterfly
board_type-SLIMEVR_BUTTERFLY = SlimeVR Butterfly
## Proportions
@@ -255,8 +260,8 @@ reset-mounting-fingers = Reset vingermontage
reset-yaw = Yaw Reset
reset-error-no_feet_tracker = Geen voet-tracker toegewezen
reset-error-no_fingers_tracker = Geen vingertracker toegewezen
reset-error-mounting-need_full_reset = U heeft een volledige reset nodig voordat u de montagekalibratie kunt uitvoeren.
reset-error-yaw-need_full_reset = U heeft een volledige reset nodig voordat u de yaw reset kunt uitvoeren.
reset-error-mounting-need_full_reset = Je hebt een volledige reset nodig voordat je een montagekalibratie kunt uitvoeren.
reset-error-yaw-need_full_reset = Je hebt een volledige reset nodig voordat je een yaw reset kunt uitvoeren.
## Serial detection stuff
@@ -276,6 +281,7 @@ navbar-trackers_assign = Tracker-toewijzing
navbar-mounting = Montage-kalibratie
navbar-onboarding = Installatiewizard
navbar-settings = Instellingen
navbar-connect_trackers = Verbind Trackers
## Biovision hierarchy recording
@@ -346,6 +352,7 @@ tracker-table-column-name = Naam
tracker-table-column-type = Type
tracker-table-column-battery = Batterij
tracker-table-column-ping = Ping
tracker-table-column-packet_loss = Pakketverlies
tracker-table-column-tps = TPS
tracker-table-column-temperature = Temp. °C
tracker-table-column-linear-acceleration = Accel. X/Y/Z
@@ -387,6 +394,9 @@ tracker-infos-magnetometer-status-v1 =
[ENABLED] Ingeschakeld
*[NOT_SUPPORTED] Niet ondersteund
}
tracker-infos-packet_loss = Pakketverlies
tracker-infos-packets_lost = Verloren pakketten
tracker-infos-packets_received = Ontvangen pakketten
## Tracker settings
@@ -404,8 +414,8 @@ tracker-settings-drift_compensation_section-edit = Laat drift compensatie toe
tracker-settings-use_mag = Sta de magnetometer toe op deze tracker.
# Multiline!
tracker-settings-use_mag-description =
Wilt u dat deze tracker de magnetometer gebruikt om drift te verminderen wanneer de magnetometer is toegestaan? <b>Zet de tracker niet uit terwijl u dit aan of uit zet.</b>
U moet eerst de magnetometer toestemming geven,<magSetting>click hier om naar de instellingen te gaan</magSetting>.
Wilt je dat deze tracker de magnetometer gebruikt om drift te verminderen wanneer de magnetometer is toegestaan? <b>Zet de tracker niet uit terwijl je dit aan of uit zet.</b>
Je moet eerst de magnetometer toestemming geven,<magSetting>click hier om naar de instellingen te gaan</magSetting>.
tracker-settings-use_mag-label = Laat magnetometer toe
# 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.
@@ -423,6 +433,9 @@ tracker-settings-update-up_to_date = Up to date.
tracker-settings-update-blocked = Update is niet beschikbaar. Er zijn geen andere versies beschikbaar.
tracker-settings-update = Werk nu bij.
tracker-settings-update-title = Firmware versie
tracker-settings-current-version = Actueel
tracker-settings-latest-version = Nieuwste
tracker-settings-build-date = Creatiedatum
## Tracker part card info
@@ -583,6 +596,9 @@ settings-general-tracker_mechanics-use_mag_on_all_trackers-description =
Gebruikt magnetometer op alle trackers die er een compatibele firmware voor hebben, waardoor drift in stabiele magnetische omgevingen wordt verminderd.
Je kan dit per individuele tracker uit zetten in de instellingen van de tracker. <b>Sluit geen van de trackers af terwijl u dit in- en uitschakelt!</b>
settings-general-tracker_mechanics-use_mag_on_all_trackers-label = Gebruik magnetometer op de trackers
settings-general-tracker_mechanics-trackers_over_usb = Trackers via USB
settings-general-tracker_mechanics-trackers_over_usb-description = Maakt het mogelijk om HID-trackergegevens via USB te ontvangen. Zorg ervoor dat verbonden trackers <b>"verbinding over HID"</b> hebben ingeschakeld!
settings-general-tracker_mechanics-trackers_over_usb-enabled-label = Laat HID-trackers direct via USB verbinden
settings-stay_aligned = Blijf in lijn
settings-stay_aligned-description = Blijf in lijn vermindert drift door je trackers geleidelijk aan te passen zodat ze overeenkomen met je ontspannen houdingen.
settings-stay_aligned-setup-label = Blijf in lijn instellen
@@ -634,7 +650,7 @@ settings-general-fk_settings-enforce_joint_constraints-correct_constraints = Cor
settings-general-fk_settings-enforce_joint_constraints-correct_constraints-description = Corrigeer gewrichtsrotaties wanneer ze hun limiet overschrijden
settings-general-fk_settings-ik = Positie gegevens
settings-general-fk_settings-ik-use_position = Positiegegevens gebruiken
settings-general-fk_settings-ik-use_position-description = Maakt gebruik van positiegegevens mogelijk van de trackers die deze leveren. Waneer u dit inschakelt, zorg er voor dat u een volledige reset doet en in het spel opnieuw kalibreert.
settings-general-fk_settings-ik-use_position-description = Maakt gebruik van positiegegevens mogelijk van de trackers die deze leveren. Zorg er voor dat je een volledige reset doet en opnieuw kalibreert in het spel wanneer je dit inschakelt.
settings-general-fk_settings-arm_fk = Arm tracking
settings-general-fk_settings-arm_fk-description = Verander de manier waarop de armen worden getrackt.
settings-general-fk_settings-arm_fk-force_arms = Dwing armen vanuit HMD
@@ -755,9 +771,9 @@ settings-general-interface-discord_presence-message =
}
settings-interface-behavior-error_tracking = Foutverzameling via Sentry.io
settings-interface-behavior-error_tracking-description_v2 =
<h1>Geeft u toestemming voor het verzamelen van geanonimiseerde foutgegevens?</h1>
<h1>Geef je toestemming voor het verzamelen van geanonimiseerde foutgegevens?</h1>
<b>We verzamelen geen persoonlijke informatie</b> zoals uw IP-adres of draadloze inloggegevens. SlimeVR hecht veel waarde aan uw privacy!
<b>We verzamelen geen persoonlijke informatie</b> zoals jouw IP-adres of draadloze inloggegevens. SlimeVR hecht veel waarde aan je privacy!
Om de beste gebruikerservaring te bieden, verzamelen we geanonimiseerde foutrapporten, prestatiestatistieken en informatie over het besturingssysteem. Dit helpt ons bij het detecteren van fouten en problemen met SlimeVR. Deze statistieken worden verzameld via Sentry.io.
settings-interface-behavior-error_tracking-label = Stuur fouten naar de ontwikkelaars
@@ -904,14 +920,14 @@ settings-utils-advanced-reset-all-label = Alles resetten
settings-utils-advanced-reset_warning =
{ $type ->
[gui]
<b>Waarschuwing</b>Hiermee worden al uw GUI instellingen teruggezet naar de standaardinstellingen.
Weet u zeker dat u dit wilt doen?
<b>Waarschuwing</b>Hiermee worden al je GUI instellingen teruggezet naar de standaardinstellingen.
Weet je zeker dat je dit wilt doen?
[server]
<b>Waarschuwing</b>Hiermee worden al uw tracking instellingen teruggezet naar de standaardinstellingen.
Weet u zeker dat u dit wilt doen?
<b>Waarschuwing</b>Hiermee worden al je tracking instellingen teruggezet naar de standaardinstellingen.
Weet je zeker dat je dit wilt doen?
*[all]
<b>Waarschuwing:</b> Hiermee worden al uw instellingen teruggezet naar de standaardinstellingen.
Weet u zeker dat u dit wilt doen?
<b>Waarschuwing:</b> Hiermee worden al je instellingen teruggezet naar de standaardinstellingen.
Weet je zeker dat je dit wilt doen?
}
settings-utils-advanced-reset_warning-reset = Instellingen resetten
settings-utils-advanced-reset_warning-cancel = Annuleren
@@ -949,6 +965,13 @@ onboarding-setup_warning-cancel = Doorgaan met setupgids
## Wi-Fi setup
onboarding-wifi_creds-back = Ga terug naar de introductie
onboarding-wifi_creds-v2 = Trackers die Wi-Fi gebruiken
# This cares about multilines
onboarding-wifi_creds-description-v2 =
De meeste trackers (zoals de officiële SlimeVR-trackers) gebruiken Wi-Fi om verbinding te maken met de server.
Gebruik de inloggegevens van het Wi-Fi-netwerk waarmee je apparaat momenteel is verbonden.
Zorg ervoor dat je een 2,4GHz-Wi-Fi-verbinding gebruikt voor jouw trackers!
onboarding-wifi_creds-skip = WiFi-instellingen overslaan
onboarding-wifi_creds-submit = Verzenden!
onboarding-wifi_creds-ssid =
@@ -958,6 +981,10 @@ onboarding-wifi_creds-ssid-required = Wi-Fi-naam is vereist
onboarding-wifi_creds-password =
.label = Paswoord
.placeholder = Vul paswoord in
onboarding-wifi_creds-dongle-title = Trackers met een dongle
onboarding-wifi_creds-dongle-description = Als je trackers met een dongle zijn geleverd, steek die dan in je apparaat en je bent klaar om te beginnen!
onboarding-wifi_creds-dongle-wip = Dit gedeelte is nog in ontwikkeling. Er komt binnenkort een aparte pagina om trackers te beheren die via een dongle verbinden.
onboarding-wifi_creds-dongle-continue = Ga verder met een dongle
## Mounting setup
@@ -1206,7 +1233,7 @@ onboarding-automatic_mounting-done-restart = Terug naar start
onboarding-automatic_mounting-mounting_reset-title = Montage-reset
onboarding-automatic_mounting-mounting_reset-step-0 = 1. Ga staan in een "skie"-houding met gebogen benen, je bovenlichaam naar voren gekanteld en armen gebogen.
onboarding-automatic_mounting-mounting_reset-step-1 = 2. Druk op de knop "Reset montage" en wacht 3 seconden voordat de montagerichtingen van de trackers opnieuw worden ingesteld.
onboarding-automatic_mounting-mounting_reset-feet-step-0 = 1. Sta op uw tenen met beide voeten naar voren gericht. u kunt het ook zittend op een stoel doen.
onboarding-automatic_mounting-mounting_reset-feet-step-0 = 1. Sta op je tenen met beide voeten naar voren gericht. Je kunt het ook zittend op een stoel doen.
onboarding-automatic_mounting-mounting_reset-feet-step-1 = 2. Druk op de knop "Voetkalibratie" en wacht 3 seconden voordat de montageoriëntaties van de trackers gereset worden.
onboarding-automatic_mounting-preparation-title = Voorbereiding
onboarding-automatic_mounting-preparation-v2-step-0 = 1. Druk op de knop "Volledige reset".
@@ -1246,26 +1273,26 @@ onboarding-automatic_proportions-requirements-title = Vereisten
# Each line of text is a different list item
onboarding-automatic_proportions-requirements-descriptionv2 = Je hebt voldaan aan de minimale vereisten om je voeten te tracken (over het algemeen 5 trackers). Je hebt je trackers en headset aan en draagt ze. Je trackers en headset zijn verbonden met de SlimeVR server en werken naar behoren (zonder haperingen, loskoppelingen etc.). Je headset stuurt positiedata naar de SlimeVR server (dit vereist doorgaans dat SteamVR draait en verbonden is met SlimeVR via de SlimeVR SteamVR-driver). De tracking werkt en registreert je bewegingen nauwkeurig (je hebt bijvoorbeeld een volledige reset uitgevoerd en de trackers bewegen in de juiste richting bij schoppen, bukken, zitten etc.).
onboarding-automatic_proportions-requirements-next = Ik heb de vereisten gelezen
onboarding-automatic_proportions-check_height-title-v3 = Meet de hoogte van uw headset
onboarding-automatic_proportions-check_height-description-v2 = De hoogte van uw headset (HMD) moet iets minder zijn dan uw volledige lengte, aangezien headsets uw ooghoogte meten. Deze meting wordt gebruikt als basis voor uw lichaamsverhoudingen.
onboarding-automatic_proportions-check_height-title-v3 = Meet de hoogte van je headset
onboarding-automatic_proportions-check_height-description-v2 = De hoogte van je headset (HMD) moet iets minder zijn dan jouw volledige lengte, aangezien headsets je ooghoogte meten. Deze meting wordt gebruikt als basis voor je lichaamsverhoudingen.
# All the text is in bold!
onboarding-automatic_proportions-check_height-calculation_warning-v3 = Begin met meten terwijl je <u>rechtop</u> staat om je lengte te meten. Let erop dat je je handen niet hoger dan je headset tilt, want dat kan de meting beïnvloeden!
onboarding-automatic_proportions-check_height-guardian_tip = Als je een losse VR-bril gebruikt, zorg er dan voor dat je guardian/veilige zone is ingeschakeld zodat je lengte correct is gekalibreerd!
# Context is that the height is unknown
onboarding-automatic_proportions-check_height-unknown = Onbekend
# Shows an element below it
onboarding-automatic_proportions-check_height-hmd_height2 = De hoogte van uw headset is:
onboarding-automatic_proportions-check_height-hmd_height2 = De hoogte van je headset is:
onboarding-automatic_proportions-check_height-measure-start = Begin met meten
onboarding-automatic_proportions-check_height-measure-stop = Stoppen met meten
onboarding-automatic_proportions-check_height-measure-reset = Probeer opnieuw te meten
onboarding-automatic_proportions-check_height-next_step = Ze zijn goed
onboarding-automatic_proportions-check_floor_height-title = Meet uw vloerhoogte (optioneel)
onboarding-automatic_proportions-check_floor_height-description = In sommige gevallen wordt uw vloerhoogte mogelijk niet correct ingesteld door uw headset, waardoor de hoogte van de headset hoger wordt gemeten dan zou moeten. U kunt de "hoogte" van uw vloer meten om de hoogte van uw headset te corrigeren.
onboarding-automatic_proportions-check_floor_height-title = Meet je vloerhoogte (optioneel)
onboarding-automatic_proportions-check_floor_height-description = In sommige gevallen wordt je vloerhoogte mogelijk niet correct ingesteld door je headset, waardoor de hoogte van de headset hoger wordt gemeten dan zou moeten. Je kunt de "hoogte" van je vloer meten om de hoogte van je headset te corrigeren.
# All the text is in bold!
onboarding-automatic_proportions-check_floor_height-calculation_warning-v2 = Begin met meten en zet een controller op je vloer om de hoogte te meten. Als je zeker weet dat je vloerhoogte klopt, kun je deze stap overslaan.
# Shows an element below it
onboarding-automatic_proportions-check_floor_height-floor_height = Uw vloerhoogte is:
onboarding-automatic_proportions-check_floor_height-full_height = Uw geschatte volledige lengte is:
onboarding-automatic_proportions-check_floor_height-floor_height = Je vloerhoogte is:
onboarding-automatic_proportions-check_floor_height-full_height = Je geschatte volledige lengte is:
onboarding-automatic_proportions-check_floor_height-measure-start = Begin met meten
onboarding-automatic_proportions-check_floor_height-measure-stop = Stoppen met meten
onboarding-automatic_proportions-check_floor_height-measure-reset = Probeer opnieuw te meten
@@ -1306,7 +1333,7 @@ onboarding-automatic_proportions-error_modal-v2 =
<docs>Bekijk de documentatie</docs> of word lid van onze <discord>Discord</discord> voor hulp ^_^
onboarding-automatic_proportions-error_modal-confirm = Begrepen!
onboarding-automatic_proportions-smol_warning =
Uw ingestelde lengte van { $height } is lager dan de toegestane minimumlengte van { $minHeight }.
Jouw ingestelde lengte van { $height } is lager dan de toegestane minimumlengte van { $minHeight }.
<b>Voer de metingen opnieuw uit en controleer of ze correct zijn.</b>
onboarding-automatic_proportions-smol_warning-cancel = Ga terug
@@ -1317,6 +1344,25 @@ onboarding-user_height-description = We hebben je lengte nodig om je lichaamspro
onboarding-user_height-need_head_tracker = Voor de kalibratie zijn een headset en controllers met positionele tracking vereist.
onboarding-user_height-calculate = Bereken mijn lengte automatisch
onboarding-user_height-next_step = Doorgaan en opslaan
onboarding-user_height-manual-proportions = Handmatige lichaamsverhoudingen
onboarding-user_height-calibration-title = Vooruitgang van de kalibratie
onboarding-user_height-calibration-RECORDING_FLOOR = Raak de vloer aan met de punt van je controller
onboarding-user_height-calibration-WAITING_FOR_RISE = Sta weer op
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK = Sta weer op en kijk vooruit
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-ok = Zorg dat je hoofd vlak staat
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-low = Kijk niet naar de vloer
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-high = Kijk niet te veel omhoog
onboarding-user_height-calibration-WAITING_FOR_CONTROLLER_PITCH = Zorg dat de controller naar beneden wijst
onboarding-user_height-calibration-RECORDING_HEIGHT = Sta weer op en blijf stilstaan!
onboarding-user_height-calibration-DONE = Gelukt!
onboarding-user_height-calibration-ERROR_TIMEOUT = Kalibratie sessie is verlopen, probeer het opnieuw.
onboarding-user_height-calibration-ERROR_TOO_HIGH = De gedetecteerde gebruikershoogte is te hoog, probeer het opnieuw.
onboarding-user_height-calibration-ERROR_TOO_SMALL = De gedetecteerde gebruikerslengte is te klein. Zorg dat je voor het einde van de kalibratie rechtop staat en naar voren kijkt.
onboarding-user_height-calibration-error = Kalibratie mislukt
onboarding-user_height-manual-tip = Tijdens het aanpassen van je lengte kan je verschillende poses proberen en kijken hoe het skelet met jouw lichaam overeenkomt.
onboarding-user_height-reset-warning =
<b>Waarschuwing:</b> Dit zet je verhoudingen terug op basis van jouw lengte.
Weet je zeker dat je dit wilt doen?
## Stay Aligned setup
@@ -1351,6 +1397,7 @@ onboarding-stay_aligned-previous_step = Vorige
onboarding-stay_aligned-next_step = Volgende
onboarding-stay_aligned-restart = Herstarten
onboarding-stay_aligned-done = Klaar
onboarding-stay_aligned-manual_mounting-done = Klaar
## Home
@@ -1397,20 +1444,50 @@ firmware_tool = DIY firmware-tool
firmware_tool-description = Hiermee kan je uw DIY-trackers configureren en flashen
firmware_tool-not_available = Oeps, de firmwaretool is momenteel niet beschikbaar. Kom later terug!
firmware_tool-not_compatible = De firmwaretool is niet compatibel met deze versie van de server. Gelieve te updaten!
firmware_tool-select_source = Selecteer de firmware die u wilt flashen
firmware_tool-select_source-description = Selecteer de firmware die u op uw bord wilt flashen
firmware_tool-select_source = Selecteer de firmware die je wilt flashen
firmware_tool-select_source-description = Selecteer de firmware die je op jouw bord wilt flashen
firmware_tool-select_source-error = Kan bronnen niet laden
firmware_tool-select_source-board_type = Type bord
firmware_tool-select_source-firmware = Firmware-bron
firmware_tool-select_source-version = Firmware versie
firmware_tool-select_source-official = Officieel
firmware_tool-select_source-dev = Ontwikkelaar
firmware_tool-select_source-not_selected = Geen bron geselecteerd
firmware_tool-select_source-no_boards = Geen beschikbare borden voor deze bron
firmware_tool-select_source-no_versions = Geen beschikbare versies voor deze bron
firmware_tool-board_defaults = Configureer je bord
firmware_tool-board_defaults-description = Stel de pinnen of instellingen in ten opzichte van jouw hardware
firmware_tool-board_defaults-add = Toevoegen
firmware_tool-board_defaults-reset = Reset naar standaard
firmware_tool-board_defaults-error-required = Verplicht veld
firmware_tool-board_defaults-error-format = Ongeldig formaat
firmware_tool-board_defaults-error-format-number = Is geen nummer
firmware_tool-flash_method_step = Flashing methode
firmware_tool-flash_method_step-description = Kies de flashingsmethode die je wilt gebruiken
firmware_tool-flash_method_step-ota-v2 =
.label = Wi-Fi
.description = Gebruik de over-the-air methode. Jouw tracker zal via wifi de firmware bijwerken. Werkt alleen op trackers die al zijn ingesteld.
firmware_tool-flash_method_step-ota-info =
We gebruiken jouw wifi-inloggegevens om de tracker te flashen en te bevestigen dat alles correct werkte.
<b>We slaan je wifi-gegevens niet op!</b>
firmware_tool-flash_method_step-serial-v2 =
.label = USB
.description = Gebruik een USB kabel om jouw tracker up te daten.
firmware_tool-flashbtn_step = Druk op de bootknop
firmware_tool-flashbtn_step-description = Voordat u naar de volgende stap gaat, zijn er een paar dingen die u moet doen.
firmware_tool-flashbtn_step-board_SLIMEVR = Zet de tracker uit, verwijder de behuizing (indien aanwezig), verbind een USB-kabel met deze computer en voer vervolgens een van de volgende stappen uit, afhankelijk van de revisie van uw SlimeVR-board:
firmware_tool-flashbtn_step-description = Voordat je naar de volgende stap gaat, zijn er een paar dingen die je moet doen.
firmware_tool-flashbtn_step-board_SLIMEVR = Zet de tracker uit, verwijder de behuizing (indien aanwezig), verbind een USB-kabel met deze computer en voer vervolgens een van de volgende stappen uit, afhankelijk van de revisie van je SlimeVR-bord:
firmware_tool-flashbtn_step-board_SLIMEVR-r11-v2 = Zet de tracker aan terwijl je het tweede rechthoekige FLASH-contact vlak bij de rand aan de bovenkant van de printplaat kortsluit tot het metalen schild van de microcontroller. De LED van de tracker zou kort moeten knipperen.
firmware_tool-flashbtn_step-board_SLIMEVR-r12-v2 = Zet de tracker aan terwijl je het ronde FLASH-contact aan de bovenkant van de printplaat kortsluit tot het metalen schild van de microcontroller. De LED van de tracker zou kort moeten knipperen.
firmware_tool-flashbtn_step-board_SLIMEVR-r14-v2 = Zet de tracker aan terwijl je de FLASH-knop aan de bovenkant van de printplaat ingedrukt houdt. De LED van de tracker zou kort moeten knipperen.
firmware_tool-flashbtn_step-board_OTHER =
Voordat u gaat flashen, moet de tracker waarschijnlijk in de bootloader-modus worden gezet.
Voordat je gaat flashen, moet de tracker waarschijnlijk in de bootloader-modus worden gezet.
Meestal betekent dit het indrukken van de bootknop op het board voordat het flashproces begint.
Als het flashproces time-out bij het begin van het flashen, betekent dit waarschijnlijk dat de tracker niet in de bootloader-modus stond.
Raadpleeg de flitsinstructies van uw board om te weten hoe u de bootloader-modus inschakelt.
Als het flashproces verloopt bij het begin van het flashen, betekent dit waarschijnlijk dat de tracker niet in de bootloader-modus stond.
Raadpleeg de flashing-instructies van je board om te weten hoe je de bootloader-modus inschakelt.
firmware_tool-flash_method_ota-title = Flashen over Wi-Fi
firmware_tool-flash_method_ota-devices = Gedetecteerde OTA-apparaten:
firmware_tool-flash_method_ota-no_devices = Er zijn geen boards die via OTA bijgewerkt kunnen worden, zorg ervoor dat u het juiste boardtype heeft geselecteerd.
firmware_tool-flash_method_ota-no_devices = Er zijn geen boards die via OTA bijgewerkt kunnen worden, zorg ervoor dat je het juiste boardtype heeft geselecteerd.
firmware_tool-flash_method_serial-title = Flashen over USB
firmware_tool-flash_method_serial-wifi = Wi-Fi-gegevens:
firmware_tool-flash_method_serial-devices-label = Gedetecteerde serial apparaten:
firmware_tool-flash_method_serial-devices-placeholder = Selecteer een serieel apparaat
@@ -1425,7 +1502,10 @@ firmware_tool-flashing_step-exit = Sluit
## firmware tool build status
firmware_tool-build-QUEUED = Wachten om te maken....
firmware_tool-build-CREATING_BUILD_FOLDER = De buildmap maken
firmware_tool-build-DOWNLOADING_SOURCE = Broncode wordt gedownload
firmware_tool-build-EXTRACTING_SOURCE = Broncode wordt uitgepakt
firmware_tool-build-BUILDING = Firmware wordt gebouwd
firmware_tool-build-SAVING = De build opslaan
firmware_tool-build-DONE = Build voltooid
@@ -1540,6 +1620,31 @@ error_collection_modal-cancel = Ik wil het niet
## Tracking checklist section
tracking_checklist = Tracking Checklist
tracking_checklist-settings = Instellingen voor trackingchecklists
tracking_checklist-settings-close = Sluiten
tracking_checklist-status-incomplete = U bent niet voorbereid om SlimeVR te gebruiken!
tracking_checklist-status-partial =
{ $count ->
[one] U heeft 1 waarschuwing!
*[other] U heeft { $count } waarschuwingen!
}
tracking_checklist-status-complete = U bent klaar om SlimeVR te gebruiken!
tracking_checklist-MOUNTING_CALIBRATION = Voer een montagekalibratie uit
tracking_checklist-FEET_MOUNTING_CALIBRATION = Voer een voetmontage-kalibratie uit
tracking_checklist-FULL_RESET = Voer een volledige reset uit
tracking_checklist-FULL_RESET-desc = Sommige trackers hebben een reset nodig
tracking_checklist-STEAMVR_DISCONNECTED = SteamVR draait niet
tracking_checklist-STEAMVR_DISCONNECTED-desc = SteamVR draait niet. Gebruik je het voor VR?
tracking_checklist-STEAMVR_DISCONNECTED-open = Open SteamVR
tracking_checklist-TRACKERS_REST_CALIBRATION = Kalibreer je trackers
tracking_checklist-TRACKERS_REST_CALIBRATION-desc = Je hebt geen tracker kalibratie uitgevoerd. Laat je Slimes (gemarkeerd met geel) rusten op een stabiele ondergrond voor een paar secondes.
tracking_checklist-TRACKER_ERROR = Trackers met fouten
tracking_checklist-TRACKER_ERROR-desc = Sommige van je trackers hebben een fout. Herstart de tracker die in het geel zijn gemarkeerd aub.
tracking_checklist-VRCHAT_SETTINGS = Configureer VRChat-instellingen
tracking_checklist-VRCHAT_SETTINGS-desc = Je hebt enkele VRchat-instellingen verkeerd geconfigureerd! Dit kan jouw trackingervaring negatief beïnvloeden.
tracking_checklist-VRCHAT_SETTINGS-open = Ga naar VRChat Waarschuwingen
tracking_checklist-UNASSIGNED_HMD = VR-headset niet toegewezen aan Hoofd
tracking_checklist-UNASSIGNED_HMD-desc = De VR-headset moet worden toegewezen als hoofdtracker.
tracking_checklist-NETWORK_PROFILE_PUBLIC = Verander je netwerkprofiel
tracking_checklist-NETWORK_PROFILE_PUBLIC-desc =
@@ -1547,12 +1652,12 @@ tracking_checklist-NETWORK_PROFILE_PUBLIC-desc =
[one]
Uw netwerk-profiel is op dit moment of publiek ingesteld ({ $adapters })
Dit wordt niet aanbevolen voor een goede werking van SlimeVR
<PublicFixLink>Hiet leest u hoe u dit kunt oplossen</PublicFixLink>
<PublicFixLink>Hier lees je hoe je dit kan oplossen</PublicFixLink>
*[other]
Sommige van uw netwerkadapters staan ingesteld op openbaar:
Sommige van je netwerkadapters staan ingesteld op openbaar:
{ $adapters }.
Dit wordt niet aanbevolen voor een goede werking van SlimeVR.
<PublicFixLink>Hier leest u hoe u dit kunt oplossen.</PublicFixLink>
<PublicFixLink>Hier lees je hoe je dit kan oplossen.</PublicFixLink>
}
tracking_checklist-NETWORK_PROFILE_PUBLIC-open = Open Configuratiescherm
tracking_checklist-STAY_ALIGNED_CONFIGURED = Configureer Blijf in lijn

File diff suppressed because it is too large Load Diff

View File

@@ -115,6 +115,11 @@ 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 = บอร์ดพัฒนาถุงมือ IMU SlimeVR
board_type-GESTURES = ท่าทางสัมผัส
board_type-ESP32S3_SUPERMINI = ESP32-S3 Supermini
board_type-GENERIC_NRF = บอร์ด NRF ทั่วไป
board_type-SLIMEVR_BUTTERFLY_DEV = SlimeVR Dev Butterfly
board_type-SLIMEVR_BUTTERFLY = SlimeVR Butterfly
## Proportions
@@ -276,7 +281,7 @@ navbar-home = หน้าหลัก
navbar-body_proportions = สัดส่วนร่างกาย
navbar-trackers_assign = กำหนดแทร็กเกอร์
navbar-mounting = ตั้งศูนย์การติดตั้ง
navbar-onboarding = ตัวช่วยตั้งค่าโปรแกรม
navbar-onboarding = ตัวช่วยการตั้งค่า
navbar-settings = ตั้งค่า
navbar-connect_trackers = เชื่อมต่อแทร็กเกอร์
@@ -349,6 +354,7 @@ tracker-table-column-name = ชื่อ
tracker-table-column-type = ชนิด
tracker-table-column-battery = แบตเตอรี่
tracker-table-column-ping = Ping
tracker-table-column-packet_loss = สูญเสียแพ็คเก็ต
tracker-table-column-tps = TPS
tracker-table-column-temperature = อุณหภูมิ °C
tracker-table-column-linear-acceleration = ความเร่ง X/Y/Z
@@ -390,6 +396,9 @@ tracker-infos-magnetometer-status-v1 =
[ENABLED] เปิดใช้งาน
*[NOT_SUPPORTED] ไม่รองรับ
}
tracker-infos-packet_loss = สูญเสียแพ็คเก็ต
tracker-infos-packets_lost = สูญเสียแพ็คเก็ต
tracker-infos-packets_received = ได้รับแพ็คเก็ต
## Tracker settings
@@ -428,6 +437,7 @@ tracker-settings-update = อัปเดตทันที
tracker-settings-update-title = เวอร์ชันเฟิร์มแวร์
tracker-settings-current-version = ปัจจุบัน
tracker-settings-latest-version = ล่าสุด
tracker-settings-build-date = วันที่สร้าง
## Tracker part card info
@@ -593,6 +603,9 @@ settings-general-tracker_mechanics-use_mag_on_all_trackers-description =
ใช้เซ็นเซอร์สนามแม่เหล็กบนแทร็กเกอร์ทั้งหมดที่มีเฟิร์มแวร์ที่เข้ากันได้ ซึ่งช่วยลดดริฟท์ในสภาพแวดล้อมที่มีสนามแม่เหล็กคงที่
สามารถปิดการใช้งานสำหรับแทร็กเกอร์แต่ละตัวได้ในการตั้งค่าของแทร็กเกอร์ <b>โปรดอย่าปิดแทร็กเกอร์ ในขณะที่กำลังสลับการตั้งค่านี้!</b>
settings-general-tracker_mechanics-use_mag_on_all_trackers-label = ใช้เซ็นเซอร์สนามแม่เหล็กกับแทร็กเกอร์
settings-general-tracker_mechanics-trackers_over_usb = ต่อแทร็กเกอร์ผ่าน USB
settings-general-tracker_mechanics-trackers_over_usb-description = เปิดใช้งานการรับข้อมูลแทร็กเกอร์แบบ HID ผ่านสาย USB ตรวจสอบว่าแทร็กเกอร์ของคุณได้เปิด <b>การเชื่อมต่อผ่าน HID</b> เอาไว้!
settings-general-tracker_mechanics-trackers_over_usb-enabled-label = เปิดให้แทร็กเกอร์แบบ HID ต่อโดยตรงผ่านสาย USB
settings-stay_aligned = Stay Aligned
settings-stay_aligned-description = Stay Aligned จะลดดริฟท์โดยค่อยๆ ปรับแทร็กเกอร์ให้เข้ากับท่าทางผ่อนคลายของคุณ
settings-stay_aligned-setup-label = ตั้งค่า Stay Aligned
@@ -896,8 +909,8 @@ settings-utils-advanced = ขั้นสูง
settings-utils-advanced-reset-gui = รีเซ็ตตั้งค่า GUI
settings-utils-advanced-reset-gui-description = คืนค่าการตั้งค่าเริ่มต้นสำหรับอินเทอร์เฟซ
settings-utils-advanced-reset-gui-label = รีเซ็ต GUI
settings-utils-advanced-reset-server = รีเซ็ตการตั้งค่าการติดตาม
settings-utils-advanced-reset-server-description = คืนค่าการจับตำแหน่งทั้งหมดเป็นค่าเริ่มต้น
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 = คืนค่าการตั้งค่าเริ่มต้นสำหรับทั้งอินเทอร์เฟซและการจับตำแหน่ง
@@ -1368,6 +1381,7 @@ onboarding-stay_aligned-previous_step = ก่อนหน้า
onboarding-stay_aligned-next_step = ต่อไป
onboarding-stay_aligned-restart = เริ่มใหม่
onboarding-stay_aligned-done = เสร็จแล้ว
onboarding-stay_aligned-manual_mounting-done = เสร็จแล้ว
## Home
@@ -1418,6 +1432,9 @@ firmware_tool-select_source-firmware = แหล่งที่มาของ
firmware_tool-select_source-version = เวอร์ชันของเฟิร์มแวร์
firmware_tool-select_source-official = ทางการ
firmware_tool-select_source-dev = รุ่นพัฒนา
firmware_tool-select_source-not_selected = ยังไม่ได้กำหนดแหล่งเฟิร์มแวร์
firmware_tool-select_source-no_boards = ไม่มีเฟิร์มแวร์บอร์ดสำหรับแหล่งนี้
firmware_tool-select_source-no_versions = ไม่มีเวอร์ชั่นที่ใช้ได้สำหรับแหล่งนี้
firmware_tool-board_defaults = กำหนดค่าบอร์ดของคุณ
firmware_tool-board_defaults-description = ตั้งค่า Pin หรือการตั้งค่าที่เกี่ยวข้องกับฮาร์ดแวร์ของคุณ
firmware_tool-board_defaults-add = เพิ่ม

View File

@@ -115,6 +115,11 @@ 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手套
board_type-GESTURES = 手势
board_type-ESP32S3_SUPERMINI = ESP32-S3 Supermini
board_type-GENERIC_NRF = nRF系列
board_type-SLIMEVR_BUTTERFLY_DEV = SlimeVR蝴蝶 开发版
board_type-SLIMEVR_BUTTERFLY = SlimeVR蝴蝶
## Proportions
@@ -262,7 +267,7 @@ serial_detection-close = 关闭
## Navigation bar
navbar-home = 主
navbar-home = 主界面
navbar-body_proportions = 身体比例
navbar-trackers_assign = 追踪器分配
navbar-mounting = 佩戴校准
@@ -275,7 +280,7 @@ navbar-connect_trackers = 连接追踪器
bvh-start_recording = 录制 BVH 文件
bvh-stop_recording = 保存 BVH 记录
bvh-recording = 录制中...
bvh-save_title = 保存BVH记录
bvh-save_title = 保存 BVH 记录
## Tracking pause
@@ -339,6 +344,7 @@ tracker-table-column-name = 名字
tracker-table-column-type = 类型
tracker-table-column-battery = 电量
tracker-table-column-ping = 延迟
tracker-table-column-packet_loss = 丢包
tracker-table-column-tps = TPS
tracker-table-column-temperature = 温度 °C
tracker-table-column-linear-acceleration = 加速度 X/Y/Z
@@ -380,6 +386,9 @@ tracker-infos-magnetometer-status-v1 =
[ENABLED] 已启用
*[NOT_SUPPORTED] 不支持
}
tracker-infos-packet_loss = 丢包
tracker-infos-packets_lost = 包丢失
tracker-infos-packets_received = 包已接收
## Tracker settings
@@ -419,6 +428,7 @@ tracker-settings-update = 立即更新
tracker-settings-update-title = 固件版本
tracker-settings-current-version = 当前版本
tracker-settings-latest-version = 最新版本
tracker-settings-build-date = 生成日期
## Tracker part card info
@@ -526,7 +536,7 @@ 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-description = 根据当前已分配的追踪器,自动选择可用的 SteamVR 虚拟追踪器
settings-general-steamvr-trackers-tracker_toggling-label = 自动开关追踪器
settings-general-steamvr-trackers-hands-warning =
<b>警告:</b>开启手部虚拟追踪器将覆盖手柄的追踪信息。
@@ -583,6 +593,9 @@ settings-general-tracker_mechanics-use_mag_on_all_trackers-description =
在所有有固件支持的追踪器上启用磁力计,在磁场稳定的环境中可以减轻飘移。
可以在个别追踪器上禁用本功能。<b>切换此选项时请勿关闭任何一个追踪器的电源!</b>
settings-general-tracker_mechanics-use_mag_on_all_trackers-label = 在追踪器上启用磁力计
settings-general-tracker_mechanics-trackers_over_usb = 通过USB连接的追踪器
settings-general-tracker_mechanics-trackers_over_usb-description = 通过USB接收HID追踪器数据。清确保连接的追踪器启用了 <b>通过HID连接</b> 功能!
settings-general-tracker_mechanics-trackers_over_usb-enabled-label = 允许HID追踪器通过USB直接连接
settings-stay_aligned = 持续校准
settings-stay_aligned-description = 持续校准会逐渐将追踪器对齐到设置的放松姿势,减少追踪器漂移的影响
settings-stay_aligned-setup-label = 配置持续校准
@@ -753,9 +766,9 @@ settings-interface-behavior-error_tracking-description_v2 =
为了提供最佳用户体验,我们会收集匿名错误报告、性能指标和操作系统信息。这有助于我们检测 SlimeVR 的错误和问题。这些指标将通过 Sentry.io 收集。
settings-interface-behavior-error_tracking-label = 向开发人员发送错误信息
settings-interface-behavior-bvh_directory = BVH记录保存目录
settings-interface-behavior-bvh_directory-description = 选择保存BVH记录文件的目录
settings-interface-behavior-bvh_directory-label = BVH记录保存目录
settings-interface-behavior-bvh_directory = BVH 记录保存目录
settings-interface-behavior-bvh_directory-description = 选择保存 BVH 记录文件的目录
settings-interface-behavior-bvh_directory-label = BVH 记录保存目录
## Serial settings
@@ -1371,6 +1384,7 @@ onboarding-stay_aligned-previous_step = 上一步
onboarding-stay_aligned-next_step = 下一步
onboarding-stay_aligned-restart = 重新开始
onboarding-stay_aligned-done = 完成
onboarding-stay_aligned-manual_mounting-done = 完成
## Home
@@ -1421,6 +1435,9 @@ firmware_tool-select_source-firmware = 固件来源
firmware_tool-select_source-version = 固件版本
firmware_tool-select_source-official = 官方
firmware_tool-select_source-dev = 开发版
firmware_tool-select_source-not_selected = 未选择来源
firmware_tool-select_source-no_boards = 此来源无可用的开发板
firmware_tool-select_source-no_versions = 此来源无可用的版本
firmware_tool-board_defaults = 配置电路板
firmware_tool-board_defaults-description = 设置引脚与其他和硬件相关的配置
firmware_tool-board_defaults-add = 新增

View File

@@ -115,6 +115,11 @@ 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 Dev IMU 手套
board_type-GESTURES = litten Yº by Gestures
board_type-ESP32S3_SUPERMINI = ESP32-S3 Supermini
board_type-GENERIC_NRF = 通用 nRF
board_type-SLIMEVR_BUTTERFLY_DEV = SlimeVR Dev Butterfly
board_type-SLIMEVR_BUTTERFLY = SlimeVR Butterfly
## Proportions
@@ -345,6 +350,7 @@ tracker-table-column-name = 名稱
tracker-table-column-type = 類型
tracker-table-column-battery = 電量
tracker-table-column-ping = Ping
tracker-table-column-packet_loss = 封包遺失
tracker-table-column-tps = TPS
tracker-table-column-temperature = 溫度 ℃
tracker-table-column-linear-acceleration = 加速度 X/Y/Z
@@ -386,6 +392,9 @@ tracker-infos-magnetometer-status-v1 =
[ENABLED] 已啟用
*[NOT_SUPPORTED] 不支援
}
tracker-infos-packet_loss = 封包遺失
tracker-infos-packets_lost = 已遺失封包
tracker-infos-packets_received = 已接收封包
## Tracker settings
@@ -425,6 +434,7 @@ tracker-settings-update = 立即更新
tracker-settings-update-title = 韌體版本
tracker-settings-current-version = 目前版本
tracker-settings-latest-version = 最新版本
tracker-settings-build-date = 建置日期
## Tracker part card info
@@ -589,6 +599,9 @@ settings-general-tracker_mechanics-use_mag_on_all_trackers-description =
在所有有韌體支援的追蹤器上使用磁力計,在磁場穩定的環境中可以減緩偏移。
開啟此選項後,可以個別在追蹤器選項內停用磁力計。<b>切換此選項時請勿關閉任何一個追蹤器的電源!</b>
settings-general-tracker_mechanics-use_mag_on_all_trackers-label = 在追蹤器上啟用磁力計
settings-general-tracker_mechanics-trackers_over_usb = 透過 USB 連接的追蹤器
settings-general-tracker_mechanics-trackers_over_usb-description = 透過 USB 接收 HID 追蹤器的資料,請確保連接的追蹤器已啟用<b>「透過 HID 連接」</b>的功能。
settings-general-tracker_mechanics-trackers_over_usb-enabled-label = 允許 HID 追蹤器透過 USB 直接連接
settings-stay_aligned = 持續校正
settings-stay_aligned-description = 持續校正功能會逐漸調整追蹤器以對齊到設定的放鬆姿態,進而減少追蹤器偏移的影響。
settings-stay_aligned-setup-label = 設定持續校正
@@ -947,6 +960,13 @@ onboarding-setup_warning-cancel = 繼續設定
## Wi-Fi setup
onboarding-wifi_creds-back = 返回簡介
onboarding-wifi_creds-v2 = 透過 Wi-Fi 連接
# This cares about multilines
onboarding-wifi_creds-description-v2 =
大多數的追蹤器(例如官方的 SlimeVR 追蹤器)使用 Wi-Fi 連接伺服器程式。
請輸入目前設備連接的網路的 Wi-Fi 憑證。
請確保輸入的是 2.4 GHz 頻道的 Wi-Fi 憑證。
onboarding-wifi_creds-skip = 跳過 Wi-Fi 設定
onboarding-wifi_creds-submit = 送出!
onboarding-wifi_creds-ssid =
@@ -956,6 +976,10 @@ onboarding-wifi_creds-ssid-required = 必須填寫 Wi-Fi 名稱
onboarding-wifi_creds-password =
.label = 密碼
.placeholder = 輸入密碼
onboarding-wifi_creds-dongle-title = 透過接收器連接
onboarding-wifi_creds-dongle-description = 如果你的追蹤器有接收器,將其插入你的裝置即可開始使用。
onboarding-wifi_creds-dongle-wip = 本部分目前仍在開發階段,將來會推出管理接收器連接追蹤器的專屬頁面。
onboarding-wifi_creds-dongle-continue = 使用接收器繼續
## Mounting setup
@@ -1362,6 +1386,7 @@ onboarding-stay_aligned-previous_step = 上一步
onboarding-stay_aligned-next_step = 下一步
onboarding-stay_aligned-restart = 重新開始
onboarding-stay_aligned-done = 完成
onboarding-stay_aligned-manual_mounting-done = 完成
## Home
@@ -1412,6 +1437,9 @@ firmware_tool-select_source-firmware = 韌體來源
firmware_tool-select_source-version = 韌體版本
firmware_tool-select_source-official = 正式版
firmware_tool-select_source-dev = 開發版
firmware_tool-select_source-not_selected = 未選擇來源
firmware_tool-select_source-no_boards = 此來源沒有可用的開發板
firmware_tool-select_source-no_versions = 此來源沒有可用的版本
firmware_tool-board_defaults = 設定電路板
firmware_tool-board_defaults-description = 設定與硬體相關的腳位或配置
firmware_tool-board_defaults-add = 新增

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -1,6 +0,0 @@
# Generated by Cargo
# will have compiled files and executables
/target/
WixTools
src/JavaVersion.class
/gen/schemas

View File

@@ -1,3 +0,0 @@
export default {
'**/*.rs': 'cargo fmt --',
};

View File

@@ -1,66 +0,0 @@
[package]
name = "slimevr"
version = "0.0.0"
description = "SlimeVR GUI Application"
license.workspace = true
repository.workspace = true
edition.workspace = true
rust-version.workspace = true
default-run = "slimevr"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[features]
# by default Tauri runs in production mode
# when `tauri dev` runs it is executed with `cargo run --no-default-features` if `devPath` is an URL
default = ["custom-protocol"]
# this feature is used used for production builds where `devPath` points to the filesystem
# DO NOT remove this
custom-protocol = ["tauri/custom-protocol"]
[build-dependencies]
tauri-build = { version = "2.0", features = [] }
cfg_aliases = "0.2"
shadow-rs = "0.35"
[dependencies]
serde_json = "1"
serde = { version = "1", features = ["derive"] }
tauri = { version = "2.0", features = ["devtools", "tray-icon", "image-png", "rustls-tls"] }
tauri-runtime = "2.0"
tauri-plugin-dialog = "2.0"
tauri-plugin-fs = "2.4.1"
tauri-plugin-os = "2.0"
tauri-plugin-shell = "2.3.0"
tauri-plugin-store = "2.0"
flexi_logger = "0.29"
log-panics = { version = "2", features = ["with-backtrace"] }
log = "0.4"
clap = { version = "4.0.29", features = ["derive"] }
clap-verbosity-flag = "2"
rand = "0.8.5"
tempfile = "3"
which = "6.0"
glob = "0.3"
open = "5"
shadow-rs = { version = "0.35", default-features = false }
const_format = "0.2.30"
cfg-if = "1"
color-eyre = "0.6"
rfd = { version = "0.15", features = ["gtk3"], default-features = false }
dirs-next = "2.0.0"
discord-sdk = "0.3.6"
tokio = { version = "1.37.0", features = ["time"] }
itertools = "0.13.0"
tauri-plugin-opener = "2.4.0"
tauri-plugin-http = "2.5.0"
tauri-plugin-log = "2"
[target.'cfg(windows)'.dependencies]
win32job = "1"
winreg = "0.52"
[target.'cfg(target_os = "linux")'.dependencies]
libloading = "0.8"

View File

@@ -1,15 +0,0 @@
use cfg_aliases::cfg_aliases;
fn main() -> shadow_rs::SdResult<()> {
// Bypass for Nix script having libudev-zero and Tauri not liking it
if let Some(path) = option_env!("SLIMEVR_RUST_LD_LIBRARY_PATH") {
println!("cargo:rustc-env=LD_LIBRARY_PATH={path}");
}
tauri_build::build();
cfg_aliases! {
mobile: { any(target_os = "ios", target_os = "android") },
desktop: { not(any(target_os = "ios", target_os = "android")) }
}
shadow_rs::new()
}

View File

@@ -1,66 +0,0 @@
{
"identifier": "migrated",
"description": "permissions that were migrated from v1",
"local": true,
"windows": [
"main"
],
"permissions": [
"core:default",
"core:window:allow-close",
"core:window:allow-toggle-maximize",
"core:window:allow-minimize",
"core:window:allow-start-dragging",
"core:window:allow-hide",
"core:window:allow-show",
"core:window:allow-set-focus",
"core:window:allow-destroy",
"core:window:allow-request-user-attention",
"core:window:allow-set-decorations",
"store:default",
"os:allow-os-type",
"os:allow-hostname",
"os:allow-locale",
"dialog:allow-open",
"dialog:allow-save",
"shell:allow-open",
"store:allow-get",
"store:allow-set",
"store:allow-save",
"fs:allow-write-text-file",
"fs:allow-read-text-file",
"fs:allow-exists",
{
"identifier": "fs:scope",
"allow": [
{
"path": "$APPDATA"
},
{
"path": "$APPDATA/**"
}
]
},
{
"identifier": "opener:allow-open-url",
"allow": [
{
"url": "steam:*"
},
{
"url": "ms-settings:network"
}
]
},
{
"identifier": "http:default",
"allow": [
{
"url": "https://github.com/SlimeVR/SlimeVR-Tracker-ESP/releases/download/*"
}
]
},
"opener:default",
"log:default"
]
}

View File

@@ -1,13 +0,0 @@
[Desktop Entry]
Version=1.5
Categories=Game;GTK;
Exec={{exec}}
Icon={{icon}}
Name=SlimeVR
GenericName=Full-body tracking
Comment=An app for facilitating full-body tracking in virtual reality
Keywords=FBT;VR;Steam;VRChat;IMU
Terminal=false
Type=Application

View File

@@ -1,139 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
dev.slimevr.SlimeVR.metainfo.xml by SlimeVR contributors
To the extent possible under law, the person who associated CC0 with
dev.slimevr.SlimeVR.metainfo.xml has waived all copyright and related or neighboring rights
to dev.slimevr.SlimeVR.metainfo.xml.
You should have received a copy of the CC0 legalcode along with this
work. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
-->
<component type="desktop-application">
<id>dev.slimevr.SlimeVR</id>
<name>SlimeVR</name>
<summary>Accessible full-body tracking in VR</summary>
<developer_name>SlimeVR Team</developer_name>
<!-- CC0 so attribution is not required -->
<metadata_license>CC0-1.0</metadata_license>
<project_license>MIT OR Apache-2.0</project_license>
<content_rating type="oars-1.1" />
<url type="homepage">https://slimevr.dev/</url>
<url type="bugtracker">https://github.com/SlimeVR/SlimeVR-Server/issues</url>
<url type="faq">https://docs.slimevr.dev/slimevr101.html</url>
<url type="donation">https://github.com/sponsors/SlimeVR</url>
<url type="vcs-browser">https://github.com/SlimeVR/SlimeVR-Server</url>
<url type="translate">https://i18n.slimevr.dev</url>
<url type="help">https://docs.slimevr.dev/server-setup/slimevr-setup.html</url>
<url type="contribute">https://github.com/SlimeVR/SlimeVR-Server/blob/main/CONTRIBUTING.md</url>
<url type="contact">https://discord.gg/SlimeVR</url>
<recommends>
<display_length compare="ge">300</display_length>
</recommends>
<supports>
<control>pointing</control>
<control>keyboard</control>
<control>touch</control>
</supports>
<branding>
<color type="primary" scheme_preference="light">#BB8AE5</color>
<color type="primary" scheme_preference="dark">#663499</color>
</branding>
<description>
<p>
SlimeVR is a set of open hardware sensors and open source software that facilitates full-body
tracking (FBT) in virtual reality. With no base station required, SlimeVR makes wireless
VR FBT affordable and comfortable.
</p>
</description>
<launchable type="desktop-id">dev.slimevr.SlimeVR.desktop</launchable>
<launchable type="desktop-id">safe-mode.dev.slimevr.SlimeVR.desktop</launchable>
<screenshots>
<screenshot type="default" xml:lang="en">
<caption>The onboarding for the GUI</caption>
<image>https://raw.githubusercontent.com/SlimeVR/SlimeVR-Server/main/assets/img/onboarding.png</image>
</screenshot>
</screenshots>
<provides>
<binary>slimevr</binary>
</provides>
<releases>
<release version="0.16.2" date="2025-08-01"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.16.2</url></release>
<release version="0.16.1" date="2025-07-27"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.16.1</url></release>
<release version="0.16.1~rc.2" type="development" date="2025-07-17"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.16.1-rc.2</url></release>
<release version="0.16.1~rc.1" type="development" date="2025-07-04"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.16.1-rc.1</url></release>
<release version="0.16.0" date="2025-07-01"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.16.0</url></release>
<release version="0.16.0~rc.2" type="development" date="2025-06-20"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.16.0-rc.2</url></release>
<release version="0.16.0~rc.1" type="development" date="2025-05-27"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.16.0-rc.1</url></release>
<release version="0.15.0" date="2025-05-19"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.15.0</url></release>
<release version="0.15.0~rc.4" type="development" date="2025-05-12"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.15.0-rc.4</url></release>
<release version="0.15.0~rc.3" type="development" date="2025-04-28"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.15.0-rc.3</url></release>
<release version="0.15.0~rc.2" type="development" date="2025-04-25"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.15.0-rc.2</url></release>
<release version="0.15.0~rc.1" type="development" date="2025-04-23"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.15.0-rc.1</url></release>
<release version="0.14.1" date="2025-04-15"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.14.1</url></release>
<release version="0.14.0" date="2025-04-10"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.14.0</url></release>
<release version="0.14.0~rc.2" type="development" date="2025-03-25"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.14.0-rc.2</url></release>
<release version="0.14.0~rc.1" type="development" date="2025-02-12"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.14.0-rc1</url></release>
<release version="0.13.2" date="2024-11-06"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.2</url></release>
<release version="0.13.1" date="2024-11-05"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.1</url></release>
<release version="0.13.1~rc.3" type="development" date="2024-10-31"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.1-rc.3</url></release>
<release version="0.13.1~rc.2" type="development" date="2024-10-26"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.1-rc.2</url></release>
<release version="0.13.1~rc.1" type="development" date="2024-10-16"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.1-rc.1</url></release>
<release version="0.13.0" date="2024-09-20"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.0</url></release>
<release version="0.13.0~rc.4" type="development" date="2024-09-13"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.0-rc.4</url></release>
<release version="0.13.0~rc.3" type="development" date="2024-08-14"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.0-rc.3</url></release>
<release version="0.13.0~rc.2" type="development" date="2024-08-08"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.0-rc.2</url></release>
<release version="0.13.0~rc.1" type="development" date="2024-08-02"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.0-rc.1</url></release>
<release version="0.12.1" date="2024-04-29"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.12.1</url></release>
<release version="0.12.0" date="2024-04-26"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.12.0</url></release>
<release version="0.12.0~rc.4" type="development" date="2024-04-21"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.12.0-rc.4</url></release>
<release version="0.12.0~rc.3" type="development" date="2024-04-14"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.12.0-rc.3</url></release>
<release version="0.12.0~rc.2" type="development" date="2024-04-09"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.12.0-rc.2</url></release>
<release version="0.12.0~rc.1" type="development" date="2024-04-04"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.12.0-rc.1</url></release>
<release version="0.11.0" date="2023-12-23"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.11.0</url></release>
<release version="0.11.0~rc.2" type="development" date="2023-12-08"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.11.0-rc.2</url></release>
<release version="0.11.0~rc.1" type="development" date="2023-11-23"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.11.0-rc.1</url></release>
<release version="0.10.1" date="2023-09-30"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.10.1</url></release>
<release version="0.10.1~rc.1" type="development" date="2023-09-29"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.10.1-rc.1</url></release>
<release version="0.10.0" date="2023-09-22"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.10.0</url></release>
<release version="0.10.0~rc.2" type="development" date="2023-09-15"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.10.0-rc.2</url></release>
<release version="0.10.0~rc.1" type="development" date="2023-09-02"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.10.0-rc.1</url></release>
<release version="0.9.1" date="2023-08-30"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.1</url></release>
<release version="0.9.1~rc.4" type="development" date="2023-08-28"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.1-rc.4</url></release>
<release version="0.9.1~rc.3" type="development" date="2023-08-19"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.1-rc.3</url></release>
<release version="0.9.1~rc.2" type="development" date="2023-08-15"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.1-rc.2</url></release>
<release version="0.9.1~rc.1" type="development" date="2023-08-13"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.1-rc.1</url></release>
<release version="0.9.0" date="2023-08-05"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.0</url></release>
<release version="0.9.0~rc.2" type="development" date="2023-08-02"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.0-rc.2</url></release>
<release version="0.9.0~rc.1" type="development" date="2023-07-31"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.0-rc.1</url></release>
<release version="0.8.3" date="2023-07-09"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.3</url></release>
<release version="0.8.2" date="2023-07-09"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.2</url></release>
<release version="0.8.2~rc.1" type="development" date="2023-07-07"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.2-rc.1</url></release>
<release version="0.8.1" date="2023-07-04"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.1</url></release>
<release version="0.8.0" date="2023-06-22"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.0</url></release>
<release version="0.8.0~rc.3" type="development" date="2023-06-20"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.0-rc.3</url></release>
<release version="0.8.0~rc.2" type="development" date="2023-06-15"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.0-rc.2</url></release>
<release version="0.8.0~rc.1" type="development" date="2023-06-01"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.0-rc.1</url></release>
<release version="0.7.1" date="2023-04-14"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.7.1</url></release>
<release version="0.7.0" date="2023-04-11"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.7.0</url></release>
<release version="0.6.3" date="2023-02-22"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.6.3</url></release>
<release version="0.6.2" date="2023-02-17"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.6.2</url></release>
<release version="0.6.1" date="2023-02-12"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.6.1</url></release>
<release version="0.6.0" date="2023-01-05"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.6.0</url></release>
<release version="0.5.1" date="2022-12-12"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.5.1</url></release>
<release version="0.5.0" date="2022-12-07"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.5.0</url></release>
<release version="0.4.0" date="2022-11-24"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.4.0</url></release>
<release version="0.3.1" date="2022-11-22"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.3.1</url></release>
<release version="0.3.0" date="2022-11-16"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.3.0</url></release>
<release version="0.2.1" date="2022-08-24"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.2.1</url></release>
<release version="0.2.0" date="2022-06-28"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.2.0</url></release>
</releases>
</component>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Some files were not shown because too many files have changed in this diff Show More