Compare commits

...

839 Commits

Author SHA1 Message Date
Eiren Rain
4d7c931b69 Add workflow dispatch to server build 2023-01-05 16:45:31 +02:00
Erimel
ac6c7da1be Yaw drift compensation (#436) 2023-01-05 17:12:47 +03:00
Uriel
3c5dc4d8b5 try updating vite to latest (#438) 2023-01-05 17:11:02 +03:00
muumi
caac02975c translation in Estonian (#452) 2023-01-05 17:10:15 +03:00
Collin Kees
77858e11f3 Improve tap detection (#432) 2023-01-05 17:09:38 +03:00
MenacingExiler
af807aa9c1 Update Vietnamese (#448)
Updating newly added descriptions
2023-01-05 01:17:35 +03:00
Uriel
3826a49837 Fix some fluent stuff (#447) 2023-01-05 01:17:12 +03:00
Erimel
2450bb0abe fix translation header typos (#451) 2023-01-05 01:15:00 +03:00
Uriel
2d297d6622 only check on main push (#445) 2023-01-03 23:18:41 +03:00
Uriel
2afc2d1c58 fix a little typo that broke everything (#444) 2023-01-03 20:55:37 +03:00
Uriel
8dfeedaf2b make macos gui work (#412) 2023-01-03 20:39:29 +03:00
Uriel
3b75b5168f Start using fluent syntaxing (#423) 2023-01-03 20:18:23 +03:00
Erimel
97818e1504 Switch rotation to orientation (#435) 2023-01-03 19:13:53 +03:00
Erimel
003bb61dfb remove java WindowConfig (#434) 2023-01-03 19:12:35 +03:00
Uriel
c6b9d2b0e0 Fix bug on window state save (#439) 2023-01-03 19:07:37 +03:00
Uriel
8c1061adca Make spotless actually do stuff on kotlin (#437) 2023-01-03 19:06:44 +03:00
Erimel
95b2cb15e4 Rename GUI title to "SlimeVR" instead of "Slimevr UI" (#441) 2023-01-03 19:06:11 +03:00
Uriel
f35da6557b Fix artifact not uploading in linux (#430) 2022-12-28 16:04:39 +02:00
Uriel
1be691e045 update to main (#431) 2022-12-28 02:53:49 +03:00
Uriel
5dd5399e99 Kotlin revolution (#401) 2022-12-27 21:53:05 +03:00
Gabriel S
34818e925c Gesture control new keys & overall changes (calibração > calibragem, Montagem > Posicição/Posicionamento) (#429) 2022-12-27 21:33:10 +03:00
tamakiti
f93d165d6e Controller Translation (#426) 2022-12-27 21:30:32 +03:00
Uriel
25b69f2ca9 Change emoji for latinamerican spanish (#425)
We discussed it on the spanish translation group and ended up choosing this emoji for now
2022-12-27 21:28:16 +03:00
Uriel
84735029f6 Improve developer experience on translation changes (#416) 2022-12-25 14:51:44 +02:00
Uriel
7790e0fdac Add feeder translation keys (#417) 2022-12-25 14:51:26 +02:00
Uriel
f4e13f837b Linux bundling with the jar (#413) 2022-12-25 03:06:28 +03:00
MaxEvil47
b912e0003a Spanish Translation in Fluent (#415)
Co-Authored-By: Fowels <91481489+fowels@users.noreply.github.com>
Co-authored-by: Uriel <urielfontan2002@gmail.com>
2022-12-25 03:05:12 +03:00
Collin Kees
a8fa180ab7 Vive tracker emulation toggle (#418) 2022-12-25 03:03:19 +03:00
Uriel
1ca3980e90 small PR with dialect integrated in the keys (#419) 2022-12-25 03:01:48 +03:00
Uriel
9130b9911a Use fluent format for translations (#414) 2022-12-21 22:02:28 +02:00
namakeingo
f16827eb52 minor italian traslation fix (#409) 2022-12-20 21:14:09 +02:00
Naexen Chen
66d679ef70 typo&grammar fix (#410) 2022-12-20 21:13:49 +02:00
Uriel
9cfde38cdf Fix git versioning (#411) 2022-12-20 00:08:43 +03:00
Uriel
80b24486b3 it was with max (#408) 2022-12-19 21:46:52 +02:00
Disappear9
3c2ee9278c Add and improve some Chinese translations (#403) 2022-12-18 22:58:11 +02:00
TheDevMinerTV
e4667b384a fix: Vietnamese translation key for amount (#407) 2022-12-18 22:54:03 +02:00
Erimel
81c58a8ce4 Fix config.ts and tracker assignment goto (#399) 2022-12-18 22:51:15 +02:00
Erimel
8ce06e4c8b Improve French translation (#402) 2022-12-18 22:49:54 +02:00
Uriel
2c24e4d335 fix languages not fitting (#406) 2022-12-18 22:48:12 +02:00
Uriel
d6218a240a fix npe (#404) 2022-12-18 22:47:29 +02:00
Uriel
76de35e28c Show git commit in version (#351) 2022-12-16 19:14:33 +03:00
Erimel
e7cf1a3008 Remove ReferenceAdjustedTracker (#394) 2022-12-16 18:37:28 +03:00
Collin Kees
88f649ae5c add additional functionality to tap detection (#375) 2022-12-16 16:37:36 +03:00
Butterscotch!
f273d3a9bb Add trackerPort config, defaults to 6969 (#383) 2022-12-16 16:32:52 +03:00
namakeingo
79a0df7b28 Add Italian Translation (#382) 2022-12-16 16:26:40 +03:00
Erimel
ad9e5e0060 Filtering amount check (#378) 2022-12-16 16:25:50 +03:00
Erimel
48c35d9a78 make front the default mounting orientation (#384) 2022-12-16 16:25:05 +03:00
Ryan Butler
9407c6f0d4 Fixed NPE in catch of UDP Server (#388) 2022-12-16 16:24:30 +03:00
Ryan Butler
3dd94b3aa3 Fixed index out of bounds on data feed configs (#389) 2022-12-16 16:24:01 +03:00
Yexo
fbf509ec79 Fixed some polish translations (#387) 2022-12-16 16:23:40 +03:00
Kamilake
5a231ba9ef Korean translation improved and words replaced (#391) 2022-12-16 16:22:54 +03:00
Uriel
9a8c1f1d7b fixes socket not being deleted on exit (#392) 2022-12-16 16:22:33 +03:00
Carl Andersson
871a62e0a5 Include font for colour flags on Windows (#377) 2022-12-16 16:21:44 +03:00
tamakiti
372031ad42 Create new Japanese translation (#374) 2022-12-16 16:21:00 +03:00
Ryan Butler
9227ee4820 Update README.md (#386) 2022-12-16 14:51:16 +03:00
Erimel
4ffbc86588 sort steamvr trackers top-down (#379) 2022-12-13 19:14:37 +03:00
maclux
df43e5fcdf Fix page not opening (#359) 2022-12-13 19:14:09 +03:00
Gabriel S
7bc208fec3 Fix of Brazilian Portuguese translation of the Server GUI (#376) 2022-12-13 19:12:46 +03:00
Erimel
2ee9d5080f log server version on startup (#380) 2022-12-13 19:12:07 +03:00
Eiren Rain
47c76c9c9e Bump version to 0.5.1 2022-12-12 18:11:16 +02:00
Kamilake
88db845f0e Add Korean translation (#372) 2022-12-12 19:09:43 +03:00
Yexo
efe5b006c3 fix and added hands because yeah (#370) 2022-12-12 19:04:14 +03:00
Carl Andersson
3a59325797 Fix language config for pl, zh & pt-BR languages (#367) 2022-12-12 19:03:52 +03:00
Erimel
30d4869217 rename leg parts to something understandable (#366) 2022-12-12 19:03:19 +03:00
Erimel
03f68a598f add key for hands translation (#369) 2022-12-12 19:02:48 +03:00
Colanns
ba362e0098 Add and fix some Chinese translations (#371) 2022-12-12 19:02:20 +03:00
Eiren Rain
410e5901e6 More build fixes 2022-12-11 16:46:03 +02:00
Eiren Rain
5ee67480da Fix build error 2022-12-11 16:41:09 +02:00
Erimel
60e7c9c098 Add OSCRouter (#349) 2022-12-11 17:39:13 +03:00
Gabriel
b4bff05723 Brazilian Portuguese translation for the SlimeVR Server GUI (#361) 2022-12-11 17:34:30 +03:00
Colanns
0eb986b342 Add Chinese translation (#363) 2022-12-11 17:33:16 +03:00
Yexo
04006b1caa Adding Polish Translation as i was saying (#360) 2022-12-11 17:32:01 +03:00
Uriel
aa6eb9ffb1 fix broken message receiving in linux (#344) 2022-12-11 17:29:54 +03:00
Erimel
7e2ed8380c Rename slimevr gui artifact to slimevr.exe (#358) 2022-12-11 17:29:08 +03:00
MenacingExiler
51506b88b6 Added Vietnamese translation (#350) 2022-12-11 17:28:19 +03:00
Erimel
1b16cb84a5 Fix OSC rotations, using OSC with SteamVR and reduce error logging spam (#330) 2022-12-10 13:42:46 +03:00
Collin Kees
645331657f Add keys and French translation for legtweaks+gesture-control (#346) 2022-12-10 13:42:07 +03:00
Carl Andersson
ac30bfaaeb Right align some text for body proportions. (#352) 2022-12-10 13:41:25 +03:00
Ryan Butler
072d6d6661 Update config.ts (#355) 2022-12-10 13:40:49 +03:00
Butterscotch!
f04f833939 Add Engwish~ (OwO) translation (#348)
* Add OwO English

* Update with missing entries
2022-12-08 23:35:00 +03:00
Ryan Butler
6218b5808e Tacker - tracker (#347) 2022-12-08 23:15:41 +03:00
Erimel
8eba520090 some french translation fixes (#343) 2022-12-07 23:11:29 +03:00
Eiren Rain
05c421f51f Bump versison to 0.5.0 2022-12-07 21:47:43 +02:00
lucas lelievre
629310f953 Make the modal reset state when closing (#341) 2022-12-07 13:19:30 +03:00
Uriel
e7e0ee9d7d Fix launching Java from the launcher (#337) 2022-12-07 13:15:21 +03:00
Ryan Butler
c9e82adda2 Create .node-version (#342) 2022-12-07 13:14:43 +03:00
lucas lelievre
4b237d0b1b Feature/gui i18n (#335) 2022-12-07 13:13:13 +03:00
lucas lelievre
2dda66bc55 Fix/gui mounting rotation (#333)
Co-authored-by: Butterscotch! <bscotchvanilla@gmail.com>
2022-12-05 12:36:08 +03:00
Collin Kees
6a25a584b2 Add double tap detection and skating correction settings (#328) 2022-12-05 12:35:29 +03:00
Butterscotch!
90fddbf66a Mounting reset workflow GUI (#326) 2022-12-04 00:17:43 +03:00
Uriel
7d0f2b0e08 Unix socket support (#273) 2022-12-03 09:23:03 +03:00
Erimel
3f022cd09e add hands to gui steamvr checkboxes (#331) 2022-12-03 09:13:47 +03:00
Erimel
78f9780147 Only write changed toggles and values to config (#316)
Co-authored-by: Butterscotch! <bscotchvanilla@gmail.com>
2022-12-03 09:13:07 +03:00
Erimel
aa9d9486f3 Fix tracker rotations breaking gui (#327) 2022-12-03 09:12:20 +03:00
Uriel
aeae54d39e dont reinstall rustup and etc (#329) 2022-12-03 09:11:49 +03:00
Uriel
c972bb005d Add more readable errors for the launcher (#319) 2022-12-03 09:10:51 +03:00
Ryan Butler
7913b2e839 Fix Capitalization in Titles (#320) 2022-11-30 21:04:07 +03:00
Erimel
51e9ecfd72 properly yaw reset vrc (#314) 2022-11-27 23:49:33 +03:00
lucas lelievre
9b624f5d9a Serial Selection and detection (#312) 2022-11-27 21:13:46 +03:00
0forks
c3e2987e82 Improve GUI consistency/UX (#313) 2022-11-27 18:51:54 +03:00
Uriel
f7d34480de Make a dialog appear when rust app panics (#310) 2022-11-27 00:15:23 +03:00
lucas lelievre
5247891ff0 Fix scrollbars (#309) 2022-11-26 23:26:39 +03:00
Ryan Butler
e5c05fc864 Switch to tabs (#304) 2022-11-25 18:21:58 +03:00
Ryan Butler
b33d3cd41f Clarify Licensing (#306) 2022-11-25 18:07:59 +03:00
TheDevMinerTV
e88357fb40 refactor(gui): webpack -> vite (#307) 2022-11-25 18:05:36 +03:00
Ryan Butler
49994286fc Improve rust CI and developer experience (#303) 2022-11-25 08:35:00 +03:00
lucas lelievre
cae2573a98 Add Reboot, Factory Reset and Get infos (#302) 2022-11-25 03:33:57 +03:00
Eiren Rain
18aae19573 Bump versison to 0.4.0 2022-11-24 23:28:17 +02:00
lucas lelievre
def3da6580 Fix/Optimize OSC IP address saving (#300) 2022-11-25 00:12:39 +03:00
Butterscotch!
b5f12b46e0 Fix Windows bridge exceptions on other OSes and handle serial exceptions better (#297) 2022-11-25 00:05:19 +03:00
Butterscotch!
5c59c4e385 Linux GUI CI and run GUI CI when workflow file is changed (#294) 2022-11-25 00:00:53 +03:00
Erimel
7fd94c36f5 remove excssive osc logging (#299) 2022-11-25 00:00:42 +03:00
lucas lelievre
bb4861635d Fix/gui reset all (#298) 2022-11-24 23:59:50 +03:00
Erimel
0a2d5674f7 GUI: Fix filtering not being clamped properly (#296) 2022-11-24 23:32:38 +03:00
lucas lelievre
1ac0a380db Feature/gui osc implem (#290) 2022-11-24 22:54:34 +03:00
Erimel
171877ee49 update java 17 download link in run.bat (#292) 2022-11-24 22:02:22 +03:00
Butterscotch!
e45da2b979 appDir() causes GUI config to not be loaded :c (#295) 2022-11-24 22:02:05 +03:00
Eiren Rain
46fedc2d3a Update build-gui.yml 2022-11-23 04:21:02 +03:00
Eiren Rain
6f8037f9f9 Don't crash on unrecognized arguments (#287) 2022-11-23 04:15:09 +03:00
lucas lelievre
9d63191ff3 Fix osc settings (#289) 2022-11-23 04:15:01 +03:00
lucas lelievre
1bcf8467a6 Fix typo (#288) 2022-11-23 04:14:31 +03:00
Eiren Rain
eb55a3e1d4 Fix CI artifact upload (#286) 2022-11-22 23:11:52 +03:00
Eiren Rain
57e220ac34 Merge pull request #285 from SlimeVR/old-gui-cleanup
Old gui cleanup
2022-11-22 19:01:39 +03:00
Eiren Rain
584f3b6afe Fix line endings. Thanks github.dev! 2022-11-22 18:06:07 +03:00
Eiren Rain
b959ac56af Post-merge fixes 2022-11-22 16:01:49 +01:00
Eiren Rain
32a3a010cf Fix keybindings class 2022-11-22 15:50:21 +01:00
Eiren Rain
1624ed3282 Update solarxr-protocol 2022-11-22 15:34:14 +01:00
Eiren Rain
1b27ea6940 Delete old gui, cleanup after new gui merge, bump version to 0.3.1 2022-11-22 17:30:08 +03:00
Eiren Rain
70fb9b4a5a Merge pull request #268 from SlimeVR/merge-gui-and-server
Merge gui and server
2022-11-22 17:20:10 +03:00
Eiren Rain
c0229e107b Merge branch 'main' of https://github.com/SlimeVR/SlimeVR-Server into merge-gui-and-server 2022-11-22 15:09:35 +01:00
Erimel
45d11ba176 bump version to 0.3.,0 (#279) 2022-11-22 16:53:45 +03:00
lucas lelievre
d0b117ab36 Merge branch 'main' of github.com:SlimeVR/SlimeVR-Server into merge-gui-and-server 2022-11-22 10:42:42 +01:00
Erimel
3d3e6faad7 Add config delays for reset/quickreset keybindings (#278) 2022-11-22 05:02:16 +03:00
Butterscotch!
5b44eaddfa Add mounting reset (two-pose reset) (#251) 2022-11-22 04:40:13 +03:00
Erimel
85ea2a0d06 OSC Support (#274) 2022-11-22 04:36:43 +03:00
Collin Kees
ba146e0fb7 Upgrades to legtweaks (#260) 2022-11-22 04:33:04 +03:00
lucas lelievre
6dbe80050f Syncronise with main 2022-11-21 21:36:30 +01:00
lucas lelievre
1dd11ce579 Fix extentions files formatting 2022-11-21 21:32:59 +01:00
williammb
317630628f Remove org/json from jackson (#272) 2022-11-21 23:29:57 +03:00
lucas lelievre
d1f72c9280 Use workspaces modules, update ci, update solarxr 2022-11-19 23:27:04 +01:00
Ryan Butler
e349440ce0 Fixed NPE in tracker ip addr (#269) 2022-11-14 18:02:04 +03:00
lucas lelievre
ae94de39b1 Merge remote-tracking branch 'gui/main' into merge-gui-and-server 2022-11-13 02:27:28 +01:00
lucas lelievre
813c1340a8 Preparing merge with server repo 2022-11-13 02:00:31 +01:00
Erimel
d8a7fa978b Add third party notices with releases (#262) 2022-11-12 18:33:18 +03:00
Uriel
d9988cc658 Refactor code to Java 17 (#244) 2022-11-12 03:14:08 +03:00
lucas lelievre
f38360e4f1 Do not send position or rotation if not available (#265) 2022-11-09 20:18:46 +03:00
lucas lelievre
a6e17c96b8 Hide position if not sent (#33) 2022-11-09 18:10:37 +01:00
lucas lelievre
b149b87fa7 Pub sub implementation (#263) 2022-11-07 23:34:52 +03:00
lucas lelievre
79b1a96e8c add glow effect (#30) 2022-11-07 03:11:32 +01:00
lucas lelievre
cef818b430 Fix min hieight of table row (#29) 2022-11-07 02:57:20 +01:00
lucas lelievre
dd8e9a623f Kepp wifi between pages (#28) 2022-11-07 02:49:47 +01:00
lucas lelievre
fcad1142b0 Tauri update (#27)
* Rust cache

* Update tauri to v1.1.1
2022-11-07 02:25:17 +01:00
lucas lelievre
af629007e1 Rust cache (#26)
* Rust cache

* Add node cache also and update rust-cache version
2022-11-07 02:22:18 +01:00
lucas lelievre
25374a1d6a Implement pubsub protocol + Use it for the overlay 2022-11-07 00:59:08 +01:00
Butterscotch!
2f2f57a46f Add a mounting rotation button to the GUI (#22)
* Add support for mounting reset

* Add reset mounting button

* Don't display negative timer on reset buttons

* Fix reset button timer going negative

* Update package-lock.json
2022-11-03 21:35:25 +01:00
TheDevMinerTV
eed7dd98af docs: add rust to build prereqs (#21) 2022-11-03 21:34:24 +01:00
Butterscotch!
660599b5e1 Replace ip-bigint with ip-num (#23) 2022-11-03 21:33:53 +01:00
Butterscotch!
3d2aa988a0 Better AutoBone body proportion error (#258) 2022-10-27 16:00:04 +03:00
lucas lelievre
f3d32da4cd Bring back device ip (#256) 2022-10-20 18:10:31 +03:00
lucas lelievre
9f9d45c450 Fix lock 2022-10-18 07:11:01 +02:00
lucas lelievre
85671f5497 Add device ip (#18)
* Add device ip

* Use ip address instead of hardware address
2022-10-18 04:42:20 +02:00
Collin Kees
081c2eb191 Add Toggles to settings page (#15)
* add settings for legtweaks

* change settings over flatbuffer

* add toggle control

* bug fix and cleanup

* removed horrific gramatical issues

* made FK settings

* add other toggles

* grammatical corrections

* change text to be in line with style

* Make it work :p

* Remove console log

Co-authored-by: lucas lelievre <loucass003@gmail.com>
2022-10-17 07:47:17 +02:00
Erimel
c3225c10c6 Update for Better Filtering (#17)
* rename filtering stuff

* fix description error

* Make it compile

Co-authored-by: lucas lelievre <loucass003@gmail.com>
2022-10-13 23:49:47 +02:00
Erimel
d5059ed48c Better filtering (#241) 2022-10-13 16:17:32 +03:00
unlogisch04
8b1e4cb21a Adding more Serial Commands to the Server (#245) 2022-10-05 19:36:08 +03:00
Erimel
6242afda42 fix crashing when converting zoom (#242) 2022-09-17 00:09:53 +03:00
Erimel
4f44e6c7c7 fix arms from controllers (#240) 2022-09-13 03:14:29 +03:00
Butterscotch!
6fec8c6d07 Autobone cleanup, logging improvements, and restoring functionality (#237) 2022-09-13 03:14:02 +03:00
Erimel
1348f9f5ef fix trackers not loading none/null (#239) 2022-09-13 03:13:45 +03:00
Eiren Rain
1b5a4bf369 Remove Slime Java Commons submodule, (#236) 2022-09-13 03:13:06 +03:00
Collin Kees
426f914f4d Leg tweaks (#223) 2022-08-30 19:50:15 +03:00
Eiren Rain
caa11f9dfc Bump version to v0.2.1 2022-08-24 23:04:09 +02:00
Butterscotch!
d1ed22d3d3 Add a recurring AutoBone recording for user debug info (#235) 2022-08-24 23:54:03 +03:00
Kitlith
67ea5edda6 Add "fast reset" user action to protobuf bridge. (#232) 2022-08-17 18:16:03 +03:00
lucas lelievre
8c6d5e2369 Fix NPE on config converter. (#234) 2022-08-16 22:38:00 +03:00
lucas lelievre
c5e05d2940 Fix Tracker config not being saved properly (#231) 2022-08-11 21:31:58 +03:00
lucas lelievre
8adf3fe591 Implement overlay toggle (#230) 2022-08-09 21:49:07 +03:00
Loler920a
101c403138 Make elbows track from HMD by default (#228) 2022-08-09 21:32:43 +03:00
lucas lelievre
5d1dbb27e1 Config refactor round 2 (#229) 2022-08-09 21:27:28 +03:00
lucas lelievre
0e73480e8a Overlay settings (#13)
* Overlay settings

* remove console log
2022-08-09 06:35:41 -07:00
lucas lelievre
58b0153cdc Reindent + Fix reponsive on the preparation step 2022-08-09 15:33:24 +02:00
Spazzwan
378cc12401 Autobone edits (#12)
* Update Recording.tsx

* Update Preparation.tsx

* Update Preparation.tsx

* Update Recording.tsx

* Update Recording.tsx

* Update Recording.tsx

* Update StartRecording.tsx

* Update Done.tsx

* Update Done.tsx

* Update Recording.tsx

* Update Preparation.tsx

* Update StartRecording.tsx

* Update StartRecording.tsx

* Update Preparation.tsx

* Update StartRecording.tsx

* Update Preparation.tsx

* Update Recording.tsx

* Update StartRecording.tsx
2022-08-09 06:30:55 -07:00
lucas lelievre
0146c5825c Reindent + Fix reponsive on the preparation step 2022-08-09 15:29:22 +02:00
Spazzwan
5cc2b391f8 Merge branch 'SlimeVR:main' into main 2022-08-09 22:13:17 +10:00
Spazzwan
80bced317c Update StartRecording.tsx 2022-08-09 22:09:47 +10:00
Spazzwan
3f51170be7 Update Recording.tsx 2022-08-09 22:09:03 +10:00
Spazzwan
ad7bd26577 Update Preparation.tsx 2022-08-09 22:08:08 +10:00
Spazzwan
820b8b21ec Update StartRecording.tsx 2022-08-09 21:33:07 +10:00
Spazzwan
12fc9f0377 Update Preparation.tsx 2022-08-09 21:31:58 +10:00
lucas lelievre
b475099b58 fix window not showing up" 2022-08-09 13:18:37 +02:00
Spazzwan
3ea3fbcd99 Update StartRecording.tsx 2022-08-09 20:23:50 +10:00
Spazzwan
28fae6f8db Update StartRecording.tsx 2022-08-09 19:40:55 +10:00
Spazzwan
d466871762 Update Preparation.tsx 2022-08-09 19:39:08 +10:00
Spazzwan
87850ee485 Update Recording.tsx 2022-08-09 19:29:51 +10:00
Spazzwan
86cfa7ce4d Update Done.tsx 2022-08-09 19:18:16 +10:00
Spazzwan
0315e523b5 Update Done.tsx 2022-08-09 19:17:59 +10:00
Spazzwan
ad99dfb439 Update StartRecording.tsx 2022-08-09 19:12:54 +10:00
Spazzwan
c7bf9a6d24 Update Recording.tsx 2022-08-09 19:09:31 +10:00
Spazzwan
38ffa9bb6d Update Recording.tsx 2022-08-09 19:07:27 +10:00
Spazzwan
1ac0191964 Update Recording.tsx 2022-08-09 19:06:39 +10:00
Spazzwan
75fab32a32 Update Preparation.tsx 2022-08-09 19:03:25 +10:00
Spazzwan
cf3eccde64 Update Preparation.tsx 2022-08-09 19:00:28 +10:00
Spazzwan
5a0240a01a Update Recording.tsx 2022-08-09 18:56:15 +10:00
Ryan Butler
390d6f3b51 Model settings (#226) 2022-08-04 20:34:33 +03:00
Erimel
29121913fd Add Skeleton settings to config and change some FK averaging logic. (#215) 2022-08-04 20:02:58 +03:00
lucas lelievre
7489d6ed34 Autobone tracker highlight 2022-08-04 16:14:48 +02:00
lucas lelievre
5d288063ad Fix Typos, window position, tracker list and missign links 2022-08-03 13:12:56 +02:00
lucas lelievre
efce9d3748 Window position save + Window controls button hover effect 2022-08-03 11:34:37 +02:00
lucas lelievre
e9c0b79b73 Better big buttons 2022-08-03 02:13:16 +02:00
lucas lelievre
29268da5c0 First round of fixes 2022-08-03 01:46:41 +02:00
lucas lelievre
41a87b1c9b update to new protocol 2022-07-30 09:08:36 +02:00
lucas lelievre
612d99ae70 Update solarxr dep 2022-07-30 08:56:00 +02:00
lucas lelievre
d878789fcf Fix build 2022-07-30 08:51:18 +02:00
lucas lelievre
2674da1185 New look (#10)
* WIP

* Current progress for erimel

* basic components + Typography

* Current progress  + formating

* Settings ok

* Small Tracker cards + progress on onboarding

* git attributes

* Fix lf

* change some settings naming stuff (#8)

* change some settings naming stuff

* rename legs label to feet

* Body proportions begin

* Serial console + Tracker settings

* interactions on cards

* Body proportions adjust

* Standalone body proportions + some responsive changes

* Dev mode + uniform ui

* Serial layout fix

* Remove old code / cleaning

* make dev table interactable

* Autobone

Co-authored-by: Erimel <marioluigivideo@gmail.com>
2022-07-30 08:46:27 +02:00
lucas lelievre
8d90663799 Add set tracker name in the rpc (#222) 2022-07-30 00:38:15 +03:00
lucas lelievre
bc3cc4ce14 Send manufacturer through the protocol (#221) 2022-07-30 00:37:42 +03:00
lucas lelievre
b5159c9776 Catch flatbuffers errors (#218) 2022-07-30 00:37:11 +03:00
Erimel
9ee09319d7 Skeleton arms rework and cleaning up (#214) 2022-07-15 02:24:21 +03:00
lucas lelievre
7818582f3f Implement Tracker names (#210) 2022-07-15 02:06:22 +03:00
lucas lelievre
2ed0726b76 New readme (#2)
* New readme

* Update README.md

Co-authored-by: TheDevMinerTV <tobigames200@gmail.com>

* Update README.md

Co-authored-by: TheDevMinerTV <tobigames200@gmail.com>

* Update README.md

Co-authored-by: TheDevMinerTV <tobigames200@gmail.com>

* Addressing TheButlah's Feedbacks

* Update README.md

Co-authored-by: Ryan Butler <thebutlah@gmail.com>

* Update README.md

Co-authored-by: TheDevMinerTV <tobigames200@gmail.com>
Co-authored-by: Ryan Butler <thebutlah@gmail.com>
2022-07-05 21:03:34 +02:00
Erimel
0b7f79340b Set disconnected TrackerStatus (#211) 2022-07-04 16:35:08 +03:00
lucas lelievre
c22b5ce421 Implement devices in the protocol (#205) 2022-07-04 00:57:21 +03:00
Erimel
078b140966 Rename hmd bodypart to head (#209) 2022-07-04 00:54:29 +03:00
Erimel
c3e4e86c4e Fixing skeleton stuff (#206) 2022-07-04 00:53:29 +03:00
Erimel
d0b1a9c822 remove waist_tracker, only use hip_tracker (#208) 2022-07-04 00:50:05 +03:00
lucas lelievre
531503f789 Merge pull request #7 from SlimeVR/fix-build
Fix build
2022-07-03 11:26:56 +02:00
lucas lelievre
3abf984d19 Fix build 2022-07-03 10:51:53 +02:00
Erimel
e875cbbcbc Place tracker at origin when disabled (#207) 2022-07-01 02:14:17 +03:00
lucas lelievre
e0dff69d7c Merge pull request #4 from Louka3000/foot_shift
rename foot_offset to foot_shift
2022-06-29 05:55:23 +02:00
Louka
23141305c1 update packages 2022-06-28 16:09:08 -04:00
Louka
04b5bfac9d owo 2022-06-28 16:08:41 -04:00
Eiren Rain
663170681a Bump version to 0.2.0 2022-06-28 21:09:27 +02:00
Butterscotch!
b1318567e3 AutoBone: Adjust bone offsets for directly and implement new contribution based error calculation (#204) 2022-06-28 22:00:57 +03:00
Eiren Rain
d1a02c52a9 Monor changes, added comments 2022-06-28 20:36:04 +02:00
lucas lelievre
b3efcd19db Remove realTracker checks for cleaner code (#203) 2022-06-28 21:33:43 +03:00
Erimel
66e4e4e0a0 Basic shoulder tracking support (#200) 2022-06-28 21:32:11 +03:00
Erimel
7c37fdb24e Use split offsets and rename foot_offset to foot_shift (#199) 2022-06-28 21:20:31 +03:00
Eiren Rain
ceb1cc77d8 Minor cleanup and comments from last PRs 2022-06-28 20:11:08 +02:00
Ryan Butler
8df4726d22 [Feature] Add support for bones in DataFeedUpdate (#196) 2022-06-28 20:57:09 +03:00
Ryan Butler
408df5273d Fix NPE in Websocket logging (#202) 2022-06-28 20:21:38 +03:00
Ryan Butler
7a4d087be2 Prevent logs in gitignore (#201) 2022-06-28 20:21:01 +03:00
Louka
f7249a883f rename foot_offset to foot_shift 2022-06-23 20:49:17 -04:00
lucas lelievre
b1ef647819 Merge pull request #3 from ButterscotchV/github-actions
Add GitHub Actions workflow and update npm packages
2022-06-21 22:44:02 +02:00
Erimel
11a15ab5b1 Cleaning up the skeleton a bit (#197) 2022-06-21 17:22:53 +03:00
Eiren Rain
f6ffd63b05 Fix left arm tracker not resetting (#198) 2022-06-21 01:13:09 +03:00
Butterscotch!
879065f420 Use npm ci instead of install 2022-06-20 16:30:05 -04:00
Butterscotch!
1169f68eb2 Add CI workflow and update npm packages
Create build-gui.yml

Update build-gui.yml

Force install in GitHub Actions

Update SolarXR-Protocol

Update packages to not need to force

Fix CI env declaration
2022-06-20 16:11:07 -04:00
lucas lelievre
0afe9d2ef8 Fix optional in the feeder and bring back none option in the gui (#194) 2022-06-11 20:15:27 +03:00
lucas lelievre
738bf20dc6 Merge pull request #1 from ButterscotchV/autobone-gui
Add basic AutoBone interface
2022-06-11 18:46:07 +02:00
Erimel
c02b95346f Extended knee model + temporary fix for null/optional (#193) 2022-06-09 13:21:40 +03:00
Erimel
db33c561ab fix minor typo in firewall.bat (#192) 2022-06-06 21:08:58 +03:00
Eiren Rain
df2cfa1e57 Skeleton data (#189) 2022-06-05 01:04:07 +03:00
Ryan Butler
d40e2c2ce2 Refactored TrackerPosition (#181) 2022-06-01 17:08:56 +03:00
Butterscotch!
215f3b9f44 Implement AutoBone into the protocol (#187)
Implement event-based AutoBoneHandler & more
2022-06-01 16:59:17 +03:00
Ryan Butler
766cf9ae72 Update instructions for spotless on IntelliJ (#183) 2022-05-31 13:42:57 +03:00
Kamilake
26d808deb7 Handling exception thrown when closing WiFiWindow (#185) 2022-05-30 17:43:43 +03:00
Butterscotch!
4b887332ef Add basic AutoBone interface & export body part labels 2022-05-30 01:46:04 -04:00
Eiren Rain
f9259c976d Update commons version 2022-05-24 17:17:32 +03:00
Erimel
39c3285a0a Fix getting previous rotations (#180) 2022-05-24 01:09:00 +03:00
Ryan Butler
57f3624ee7 CI & Formatting improvements (#178)
* CI & Formatting improvements

+ Added spotlessCheck to CI
+ Now formatting .yaml files (with spaces)
* Bumped version numbers of actions

* Renamed .yml to .yaml in accordance with yaml.org/faq
2022-05-23 15:54:10 +03:00
Eiren Rain
5a4b656a74 WIP of skeleton data 2022-05-19 19:03:38 +03:00
Eiren Rain
bf7e13d923 Update spotless 2022-05-19 18:08:57 +03:00
Ryan Butler
dedec668e1 Added spotless and CONTRIBUTING.md (#172) 2022-05-19 17:51:46 +03:00
Eiren Rain
1e4013be98 This time it should work 2022-05-16 20:52:28 +03:00
Eiren Rain
76c3210788 Should be the last one for gradle or I give up... 2022-05-16 20:48:42 +03:00
Eiren Rain
4a99eff854 Fix gradle build (hopefully) 2022-05-16 20:46:18 +03:00
Eiren Rain
237dabce17 Update commons with formatted code 2022-05-16 20:41:42 +03:00
Eiren Rain
6f36f7624a Update commons 2022-05-16 20:36:26 +03:00
Eiren Rain
1dea626422 Eclipse formatting (#176)
* Make eclipse formatter better follow our conventions and format all of it
* Don't join wrapped lines to allow for hand-formatting
* Fix formatting of switch statements and add breaks in enum declarations
* Use new formatter by @thebutlah, adjust formatter more
2022-05-16 20:05:46 +03:00
Eiren Rain
c74cc539c9 Clarify README regarding licencing 2022-05-08 17:56:53 +03:00
Eiren Rain
910e32bb3e Merge pull request #166 from Futurabeast/clean-get-tracker-by-id
Change getTrackerById
2022-05-03 15:33:18 +03:00
Eiren Rain
6ad3c862ce Merge pull request #171 from TheButlah/fix_concurrent_modification_datafeed
Fix concurrent modification in DataFeedHandler
2022-05-03 15:27:43 +03:00
Eiren Rain
05819baf97 Merge pull request #173 from TheButlah/trackerpos_from_role
Computed trackers use TrackerRole to determine TrackerPosition, if null
2022-05-03 15:25:52 +03:00
Eiren Rain
d84ba2aef5 Merge pull request #174 from TheButlah/fix_more_fbs_bugs
Fix position and rotation getting mixed up in flatbuffer
2022-05-03 15:24:20 +03:00
Ryan Butler
ec9e7d94bc Fix position and rotation getting mixed up in flatbuffer 2022-05-03 03:24:22 -04:00
Ryan Butler
a800749b87 Fix concurrent modification in DataFeedHandler 2022-05-03 00:41:25 -04:00
lucas lelievre
675c69af60 WIP 2022-05-03 06:41:23 +02:00
Ryan Butler
76fe83452e Computed trackers use TrackerRole to determine TrackerPosition, if null 2022-05-02 23:45:57 -04:00
Eiren Rain
6d940503af Merge pull request #169 from TheButlah/gitignore_eclipse
.gitignore eclipse stuff
2022-05-02 23:17:21 +03:00
Ryan Butler
0ea5b58b50 .gitignoring most eclipse stuff 2022-05-02 13:38:50 -04:00
Eiren Rain
94c079815f Merge pull request #168 from TheButlah/fix_computed_tracker_num
Computed trackers should use their tracker id as their num
2022-05-02 13:47:43 +03:00
Eiren Rain
11ab7a6cb6 Merge pull request #167 from TheButlah/fix_invalid_fb_serialization
Fix invalid flatbuffer offsets
2022-05-02 13:47:15 +03:00
Ryan Butler
7f67135e69 Computed trackers should use their tracker id as their num 2022-05-02 02:58:24 -04:00
Ryan Butler
a1717bbf7a Fix invalid flatbuffer offsets 2022-05-02 02:09:33 -04:00
Eiren Rain
c99375364d Merge pull request #165 from deiteris/use-foreach
Refactor for to foreach
2022-05-01 16:02:24 +03:00
Eiren Rain
94460ed7ab Merge pull request #163 from Futurabeast/fix-index-error-datafeed
Fix iteration on the sensors, i used the key of the map instead of the index of the array
2022-05-01 01:07:18 +03:00
lucas lelievre
413332462f more readable version of it 2022-04-30 23:06:14 +02:00
lucas lelievre
18386d57d6 Better tracker id with no possible null pointer exception 2022-04-30 22:50:32 +02:00
lucas lelievre
f72045438e Change getTrackerById 2022-04-30 21:58:26 +02:00
Yury
17f74c693c Refactor for to foreach 2022-04-30 20:34:13 +03:00
lucas lelievre
fb3057b80a I don't know what this does, but I'm gonna merge it anyway
add filtering description
2022-04-30 07:55:51 +02:00
lucas lelievre
4eec83e5f4 Merge pull request #9 from Louka3000/main
Better tracker rotation slider
2022-04-30 07:54:52 +02:00
Louka
f94850c120 better tracker rotation slider 2022-04-30 01:50:39 -04:00
lucas lelievre
3fb87a4688 Fix iteration on the sensors, i used the key of the map instead of the index of the array 2022-04-30 04:03:53 +02:00
Erimel
488c3ec22c add filtering description 2022-04-29 18:48:36 -04:00
lucas lelievre
cccf57d37a new palette 2022-04-29 00:56:01 +02:00
lucas lelievre
8f1be283a4 rename extensions file 2022-04-28 19:24:38 +02:00
lucas lelievre
049465fc41 Add recomended extensions 2022-04-28 19:21:25 +02:00
lucas lelievre
00be864bbf Change event name on front side to match rust changes 2022-04-28 17:13:25 +02:00
lucas lelievre
494d362ec6 Merge pull request #5 from TheButlah/more_err
Added "terminated" and "other" events to "server-status", fixed icon
2022-04-28 17:12:07 +02:00
lucas lelievre
2c3ac89844 new process events + fallback to current folder if no arguments 2022-04-28 17:10:32 +02:00
Eiren Rain
9205f6cab7 Merge pull request #162 from Futurabeast/format-all
Format all files based on .editorconfig
2022-04-28 15:32:48 +03:00
lucas lelievre
d0ee364fb9 Fix conflicts with main 2022-04-28 14:30:40 +02:00
lucas lelievre
3a80ad0632 Change the formating to tabs 2022-04-28 03:44:24 +02:00
lucas lelievre
93c353bbc6 Fix crlf 2022-04-27 23:20:14 +02:00
Eiren Rain
9f883dccec Fix eclipse prefs 2022-04-27 23:42:16 +03:00
lucas lelievre
ad3b697517 New formatting rules 2022-04-27 22:40:03 +02:00
Eiren Rain
5f3097185e Merge pull request #161 from Futurabeast/fix-forward-to-front
Fix Converting FORWARD rotation to FRONT
2022-04-27 23:33:11 +03:00
lucas lelievre
7ac7f7d424 New formatting rules 2022-04-27 22:29:09 +02:00
lucas lelievre
ba58f4df6a Reformat the formatter 2022-04-27 22:25:28 +02:00
lucas lelievre
297bfddf6c Update src/main/java/dev/slimevr/NetworkProtocol.java
Co-authored-by: TheDevMinerTV <tobigames200@gmail.com>
2022-04-27 22:21:09 +02:00
lucas lelievre
e4d0aca744 Update src/main/java/dev/slimevr/bridge/BridgeThread.java
Co-authored-by: TheDevMinerTV <tobigames200@gmail.com>
2022-04-27 22:21:05 +02:00
lucas lelievre
8b5ac226c3 Update src/main/java/dev/slimevr/bridge/BridgeThread.java
Co-authored-by: TheDevMinerTV <tobigames200@gmail.com>
2022-04-27 22:21:00 +02:00
lucas lelievre
cfc264fa33 Update src/main/java/dev/slimevr/bridge/BridgeThread.java
Co-authored-by: TheDevMinerTV <tobigames200@gmail.com>
2022-04-27 22:20:49 +02:00
lucas lelievre
9e12958ca6 reformat all 2022-04-27 21:39:54 +02:00
lucas lelievre
8609fb9e97 Fix Converting FORWARD rotation to FRON 2022-04-27 21:30:54 +02:00
Eiren Rain
9d6dda8b17 Use https for solarxr module 2022-04-27 19:38:36 +03:00
Eiren Rain
92b64f0f12 Merge pull request #159 from Futurabeast/main
Headless Server / SolarXR Protocol implementation
2022-04-27 19:33:59 +03:00
Ryan Butler
ffda9f6b2e Added "terminated" and "other" events to "server-status", fixed icon 2022-04-26 23:51:17 -04:00
lucas lelievre
ae881565e8 Prepare for beta 2022-04-27 02:40:10 +02:00
lucas lelievre
2b46032329 Add icon 2022-04-26 23:50:51 +02:00
lucas lelievre
f4ee1ff73d Remove icon 2022-04-26 23:50:43 +02:00
lucas lelievre
a54e850de8 Merge console stdio with some minor improvements 2022-04-26 23:47:23 +02:00
lucas lelievre
3e554c1b8a new settings 2022-04-26 21:19:28 +02:00
Ryan Butler
a7c442d785 Events now get sent to frontend 2022-04-26 00:19:19 -04:00
lucas lelievre
677fa71ba1 Cancel change to .settings 2022-04-26 02:08:56 +02:00
lucas lelievre
9f3f34ce70 Reformat protocol 2022-04-26 02:07:45 +02:00
lucas lelievre
2d2b6588b3 Sync with main solarxr 2022-04-26 02:04:59 +02:00
lucas lelievre
f6e1cc7747 update default dependency 2022-04-25 20:47:25 +02:00
Ryan Butler
e04357c815 Added clap 2022-04-25 14:31:44 -04:00
lucas lelievre
17d75cfee0 New settings layout + update solarxr 2022-04-25 20:06:25 +02:00
lucas lelievre
44fa266697 remove slimevr_protocol from submodules 2022-04-25 00:39:37 +02:00
lucas lelievre
57f7ea6745 clean useless stuff 2022-04-25 00:38:50 +02:00
lucas lelievre
326c7e969a remove ignored files 2022-04-25 00:37:29 +02:00
lucas lelievre
23f9b3b276 Sync with lastest server 2022-04-25 00:21:32 +02:00
lucas lelievre
1e74deede3 Current progress 2022-04-24 19:53:56 +02:00
lucas lelievre
4906d9551e New icons 2022-04-24 16:41:23 +02:00
lucas lelievre
83b40d3351 Config stuff 2022-04-24 16:28:35 +02:00
lucas lelievre
ce8929af04 rename to solarxr 2022-04-24 16:09:35 +02:00
lucas lelievre
c2a51e4d57 Merge pull request #2 from TheButlah/add_license
Add LICENSE
2022-04-24 14:04:15 +02:00
lucas lelievre
5fae72fb03 Merge branch 'master' into add_license 2022-04-24 14:03:57 +02:00
lucas lelievre
1b6b6e30ad Merge pull request #1 from TheButlah/fix_child_proc
fix: Child process termination, workspaces, gitignore, logger
2022-04-24 14:03:18 +02:00
Ryan Butler
451d687198 Add LICENSE 2022-04-24 01:35:25 -04:00
Ryan Butler
90144f13c8 fix: Child process termination, workspaces, gitignore, logger
* Now using cargo workspaces, means you can `cargo run` from toplevel.
* Command execution now is cwd independent.
+ Added pretty_env_logger which lets us leverage log crate for easy
  logging.
* Windows now uses the win32job crate to ensure that all child processes
  will properly terminate when the parent process does.
+ Added empty rustfmt.toml to ensure everyone uses default rustfmt
  settings.
* Gitignore now ignores more stuff.
2022-04-24 01:18:00 -04:00
lucas lelievre
9fc9b66745 Rust stuff 2022-04-24 03:55:39 +02:00
loucass003
2317ad94f5 Update submodule to solarxr-protocol 2022-04-24 01:20:55 +02:00
Eiren Rain
58d1f2de96 Merge pull request #158 from Louka3000/skeloff-fix
Fix hip when not using legs
2022-04-23 19:03:15 +03:00
Louka
de101b3576 Fix hip when not using legs
disables pelvis averaging if user isn't using knee trackers.
2022-04-20 21:26:36 -04:00
lucas lelievre
9fbfc43655 Clean packages 2022-04-16 16:40:30 +02:00
loucass003
e3e37023e8 More rpc stuff 2022-04-15 01:17:16 +02:00
Eiren Rain
63409b61ea Merge pull request #157 from mgschwan/main
Change variable naming of configPath
2022-04-14 17:15:20 +03:00
Michael Gschwandtner
c827e7725b Revert changed files 2022-04-14 16:10:35 +02:00
Michael Gschwandtner
0bcaed719b Merge branch 'SlimeVR:main' into main 2022-04-14 16:06:17 +02:00
Michael Gschwandtner
c77d73c460 Rename configPath variable 2022-04-14 16:04:37 +02:00
loucass003
9fc5d41e1b protocol rework Sets -> Map 2022-04-14 09:15:01 +02:00
Eiren Rain
ac0cb9e9cb Merge pull request #149 from Louka3000/hand-tracking
Hand tracking support + elbows without controllers
2022-04-12 20:22:32 +03:00
lucas lelievre
f961318035 update submodule 2022-04-12 09:09:29 +02:00
lucas lelievre
52fa670293 Datafeed almost done 2022-04-12 09:07:18 +02:00
Eiren Rain
d0c3e0ae8d Merge pull request #155 from mgschwan/main
Make VRServer config path variable
2022-04-12 01:57:10 +03:00
Louka
0b2491ead5 Properly handle elbows with hand tracking
Instead of moving the controller chains to the slimevr hand, now just make the computed elbows affected by the elbow from the slimevr hand chain.

Also refactored some stuff to replace "upper arm distance" by "elbow offset". Idek if it's useful but it may be so I'm keeping it.
2022-04-11 18:39:30 -04:00
Michael Gschwandtner
1723d19882 Make VRServer config path variable
Add a constructor that accepts a path to the config file
2022-04-12 00:37:46 +02:00
Louka
416f96fe44 Merge branch 'main' into hand-tracking 2022-04-11 17:41:32 -04:00
Eiren Rain
7b700b4a0c Merge pull request #154 from mgschwan/main
Make WebSocketVRBridge compatible with Android
2022-04-11 21:37:50 +03:00
Eiren Rain
bde578fb9d Merge pull request #151 from Louka3000/neck-tracking
Neck tracking support owo
2022-04-11 21:05:37 +03:00
Michael Gschwandtner
c41dc490ed Make WebSocketVRBridge compatible with Android
Change JSONObject.optFloat (does not exist on Android) to optDouble
2022-04-11 16:00:42 +02:00
Eiren Rain
6d9e816d19 Merge pull request #153 from Louka3000/filters-fix
Make filter dependent on tracker tps
2022-04-08 00:59:28 +03:00
Erimel
8f19afee88 Merge branch 'SlimeVR:main' into hand-tracking 2022-04-07 01:18:50 -04:00
Louka
784ec877d8 Make filter dependent on tracker tps
Why was this in the wrong place wth
2022-04-06 20:35:47 -04:00
Eiren Rain
48c509ef54 Merge pull request #152 from mgschwan/main
Add full reset command to WebSocket bridge
2022-04-06 15:43:56 +03:00
Eiren Rain
0a5f06816d Merge pull request #150 from Louka3000/patch-1
Null check on designation I forgor
2022-04-06 15:42:06 +03:00
Louka
ecbeaf10ed Remove unnecessary code
Also makes my code a whole lot clearer damn.
Now I can understand it myself!!! :P
2022-04-05 18:02:30 -04:00
Michael Gschwandtner
c8e4918b4e Merge branch 'SlimeVR:main' into main 2022-04-05 22:17:55 +02:00
Michael Gschwandtner
4ab5609dbd Add full reset command to WebSocket bridge 2022-04-05 22:11:40 +02:00
Louka
cfe8eb62e7 Neck tracking support owo
This is not a joke.
As I suspected, adding a neck tracker does help with reducing sliding. I tested it in VRChat myself.
Think of it like adding a fourth spine tracker.
Anyway, this can be useful to mocap suits and furries, pls merge ty owo.
2022-04-05 00:11:43 -04:00
Erimel
f2ceb84969 Null check on designation I forgor
sowwy, this completely breaks the server whenever a new tracker (never connected before) connects.  

;-;
2022-04-04 23:41:51 -04:00
Louka
039628d7e4 Hand tracking support + elbows without controllers
This extends the HMD skeleton to support arm tracking. We do end up with kinda duplicate bones tho.

If user has controllers: elbows go from controllers with tracker on lower arm and possibility for upper arm tracker.

If user has no controller (or no feeder app) and enables Elbow SteamVR trackers: elbows go from chest.

If user has no controllers and enables Hand SteamVR trackers: SteamVR trackers on the users hand appear using upper arm, forearm and hand trackers. Use chest tracker as well for more precision.

This also adds a lot of body proportions...
2022-04-04 22:21:18 -04:00
Eiren Rain
91fb4bc035 Merge pull request #146 from Louka3000/legs-fix
Fix ambiguous usage of "Legs"
2022-04-04 16:07:59 +03:00
Eiren Rain
d89ccc3401 Merge pull request #147 from TheDevMinerTV/fix/pingpongpacket
Fix "could not parse packet" warning for PingPongPackets
2022-04-04 16:02:21 +03:00
loucass003
7ab9a37989 Started implementing new protocol 2022-04-04 07:37:26 +02:00
TheDevMinerTV
cf7054b6da Fix "could not parse packet" warning for PingPongPackets 2022-04-04 00:29:22 +02:00
Louka
758f9e8f2f support old configs + rename in skeleton 2022-04-03 11:44:40 -04:00
Louka
fef21906f5 Fix ambiguous usage of "Legs"
- Leg in tracker roles is now knee
- Legs in SteamVR trackers to enable is now Feet
2022-04-03 11:18:44 -04:00
loucass003
4ae37944d9 Everything 2022-04-02 22:36:25 +02:00
loucass003
37ce6a69c1 update submodule 2022-04-02 22:35:45 +02:00
loucass003
aaed8fbd49 Body proportions 2022-04-02 22:33:32 +02:00
loucass003
5fbac9d861 More data 2022-04-02 08:39:31 +02:00
lucas lelievre
c54298709f update submodules url 2022-04-01 05:32:25 +02:00
lucas lelievre
b7d1637b18 Add more tracker data 2022-04-01 04:57:51 +02:00
lucas lelievre
56402526f7 new layout 2022-03-31 18:10:10 +02:00
lucas lelievre
015fa551b7 slimevr_protocol submodules 2022-03-31 16:05:34 +02:00
lucas lelievre
a681f0e5b3 rm folder 2022-03-31 16:05:03 +02:00
lucas lelievre
281810dfbb begin websocket api 2022-03-31 16:00:13 +02:00
lucas lelievre
9482e60dfa Initialize project using Create React App 2022-03-30 18:02:12 +02:00
Eiren Rain
38b8e65d53 Merge pull request #137 from Louka3000/main
Basic Interpolation and Extrapolation
2022-03-28 16:56:05 +03:00
Louka
74ccaa6cf1 fix size/capacity of circle buffer 2022-03-28 00:07:43 -04:00
Louka
4d2083df27 Use circle buffer to get previous rotations
Should help with performance.
2022-03-27 23:58:23 -04:00
Louka
98068232a6 don't create as many quaternions 2022-03-27 06:33:36 -04:00
Eiren Rain
60711df671 Merge pull request #128 from ButterscotchV/autobone-work
Consolidate PoseFrames functionality and add documentation
2022-03-24 14:05:55 +02:00
Erimel
c6b7c11418 Merge branch 'SlimeVR:main' into main 2022-03-23 21:47:52 -04:00
Eiren Rain
ece8811293 Merge pull request #138 from Louka3000/issue61
Align spine yaw with HMD when no spine trackers are present
2022-03-24 02:10:03 +02:00
Louka
8c95c491b9 use GetYaw() 2022-03-23 18:53:43 -04:00
Erimel
45091565b4 Merge branch 'SlimeVR:main' into issue61 2022-03-23 18:42:36 -04:00
Erimel
7c0222189a Merge branch 'SlimeVR:main' into main 2022-03-23 18:42:26 -04:00
Eiren Rain
a84c735761 Update commons 2022-03-24 00:40:20 +02:00
Louka
946c5d4527 calculate hmd yaw better 2022-03-23 18:34:47 -04:00
Louka
2ac6208302 / 2 * 4 = *2 2022-03-23 18:05:58 -04:00
Louka
0cd65c825c Align spine yaw with HMD when no spine tracker
issue https://github.com/SlimeVR/SlimeVR-Server/issues/61
2022-03-23 18:04:09 -04:00
Eiren Rain
43d97a7b97 Merge pull request #136 from Louka3000/upper-arms
Upper arm tracking support for VRC shoulders
2022-03-23 18:38:02 +02:00
Louka
9923556212 removed bad code lol
Code I stole was bad and did unncessery things that made extrapolation wonky
2022-03-22 21:44:29 -04:00
Louka
0a65783637 Make bone
bone yes
2022-03-22 19:58:52 -04:00
Louka
b5bd7e0a26 changed default values for filters 2022-03-22 18:35:00 -04:00
Louka
82779d101b fixed a NullPointerException
When the type was null oops
2022-03-22 01:20:40 -04:00
Louka
9c18d349dd upper arms support
for vrchat's shoulder tracking.
Not recommended since that's 2 trackers PER ARM, but good to have the option.
2022-03-22 00:46:38 -04:00
Louka
8c74071e30 Small adjustments to filter
-renamed frame to tick
- increased max intensity
2022-03-19 13:33:54 -04:00
Louka
256e5079cf Tracker filters GUI and config
I am now master at GUI.
(never again).
Might have done some dumb things like giving IMUTracker VRServer idk, tell me if there's something to fix <3
2022-03-19 03:02:06 -04:00
Louka
4263e86189 Basic interpolation and extrapolation
only the logic. Need to make config and GUI
2022-03-18 22:36:06 -04:00
Eiren Rain
dadb0bb378 Merge pull request #135 from Louka3000/main
Prettier changing proportions
2022-03-15 14:56:26 +02:00
Erimel
8ba25ca840 Merge branch 'SlimeVR:main' into main 2022-03-14 18:12:01 -04:00
Louka
09ac04331f Prettier changing proportions
- Now removes the .0 if the value is whole (only see decimal if is .5)
- Add precision adjust button unselected by default to toggle between 1 and 0.5 adjustment.
2022-03-14 18:11:29 -04:00
Eiren Rain
c21caa76d5 Bump version number to 0.1.6 2022-03-14 20:02:10 +02:00
Eiren Rain
4073d8fc32 Merge pull request #134 from Louka3000/main
Change default proportions and allow half-decimal editing
2022-03-14 15:33:49 +02:00
Erimel
f8b7be8572 Merge branch 'SlimeVR:main' into main 2022-03-13 18:27:01 -04:00
Louka
d6ab811de0 Change default proportions and allow half-decimal editing
- Better initial and default body proportions for people that don't want to calibrate
- Now changes bone length to half decimal (0.5). Rounds up to the nearest 0.5.
2022-03-13 18:25:43 -04:00
Eiren Rain
9fa6722f2b Merge pull request #133 from Blixtdraken/main
Changed the scroll speed for the ui
2022-03-13 18:21:35 +02:00
Blixtdraken
c51204e9cd Changed the scroll speed for the ui. 2022-03-13 17:12:40 +01:00
Eiren Rain
74794d8610 Merge pull request #132 from Louka3000/main
Elbow tracking support OwO
2022-03-12 12:56:49 +02:00
Louka
16978f5acd change default elbow distance
25cm to 22cm
2022-03-11 21:15:49 -05:00
Louka
71e24d0cb9 oops Mighty <3
fix FORWARD being renamed to FRONT
2022-03-10 19:47:28 -05:00
Louka
9a45f99b0e Vertical controllet offset 2022-03-10 18:45:36 -05:00
Louka
7f829f56a3 Fix reset and fix pipe creation order
owo
2022-03-10 18:35:51 -05:00
Erimel
347531f4fe Merge branch 'SlimeVR:main' into main 2022-03-10 18:21:08 -05:00
Eiren Rain
a1c33a0852 Merge pull request #131 from MightyGood/patch-1
Change FORWARD to FRONT for tracker mounting
2022-03-10 17:55:01 +02:00
MightyGood
9cd441654e Change FORWARD to FRONT for tracker mounting
Front fits better with the other options, and should cause less confusion about what the drop-down items mean.
2022-03-10 09:46:24 -06:00
Eiren Rain
88c866a735 Merge pull request #130 from kitlith/feeder_app_protobuf
Switch feeder app from old protocol to new protocol.
2022-03-10 16:00:55 +02:00
Louka
b11492c3f3 minor cleanup
removed skeleton offset for arms; useless
2022-03-10 01:07:35 -05:00
Erimel
52e30b6323 Merge pull request #3 from kitlith/feeder_app_protobuf
Switch feeder app from old protocol to new protocol.
2022-03-10 00:37:47 -05:00
Louka
1ebad806f9 Fix reset and wrist
oh wow, it works.
2022-03-09 19:24:35 -05:00
Louka
51129d3b5d Wrists
doesn't work as intended but does something
2022-03-09 01:27:13 -05:00
Louka
379e1cdcf0 Get all nodes better
for SkeletonList
2022-03-09 01:08:26 -05:00
Louka
0a8f76cfd4 Initial elbows commit
testing
2022-03-08 00:13:49 -05:00
Kitlith
a382698c32 Switch feeder app from old protocol to new protocol. 2022-03-07 20:56:22 -08:00
Butterscotch!
d43002952c Consolidate PoseFrames functionality & add documentation 2022-02-17 22:51:15 -05:00
Eiren Rain
718f1d02c6 Merge pull request #127 from ColdIce1605/ignore-runtime-created-files
Ignore runtime created files
2022-02-17 08:40:52 +02:00
ColdIce
542de22550 Revert "restart branch"
This reverts commit e18ce338e9.
2022-02-16 21:16:22 -06:00
ColdIce
327d458f00 update .gitignore 2022-02-16 21:14:49 -06:00
Eiren Rain
5f206dd12e Merge pull request #125 from Louka3000/patch-2
waist tracker will default to hip before chest
2022-02-16 12:33:09 +02:00
ColdIce
e18ce338e9 restart branch 2022-02-16 01:25:15 -06:00
Erimel
51e6255e9d waist tracker will default to hip before chest
If user has chest + waist but uses chest + hip in the server, chest would be chest+waist and waist would be hip.
This can be fixed by a better explanation of “waist vs hip” in the new GUI, or just defaulting waist to hip instead of chest when no waist tracker is found.
2022-02-15 14:48:21 -05:00
Eiren Rain
7fa7e6c2cc Merge pull request #124 from ColdIce1605/platform-package-fix
Platform Package Fix
2022-02-15 10:19:34 +02:00
ColdIce
710d154817 remove files 2022-02-15 02:17:55 -06:00
ColdIce
f354a10a81 fix .idea related things
sadly can't get rid of the one Magneto change do to LF :P
2022-02-15 02:17:14 -06:00
ColdIce
8bb8135f41 Move windows related code to its own package
Ah no more git history issues
2022-02-15 02:12:20 -06:00
Eiren Rain
e7b9968519 Better tracker timeout handling 2022-02-15 09:59:27 +02:00
Eiren Rain
bfc58d51f2 Merge pull request #122 from Kamilake/patch-1
Change the minimum compatible Java version
2022-02-11 07:14:10 +02:00
Eiren Rain
c158022da5 Merge pull request #123 from Kamilake/patch-2
Add a hide password option
2022-02-11 05:56:55 +02:00
Kamilake
9e010b0026 Add a hide password option 2022-02-11 11:44:18 +09:00
Kamilake
a085b09e07 Change the minimum compatible Java version 2022-02-11 09:36:11 +09:00
Kamilake
37da4ab7fe Change the minimum compatible Java version 2022-02-11 09:22:28 +09:00
Eiren Rain
c5945d784b Merge pull request #121 from ButterscotchV/spell-fix
Fix spelling mistakes
2022-02-09 21:09:33 +02:00
Butterscotch!
16ca08446b Fix spelling mistakes 2022-02-09 04:44:05 -05:00
Eiren Rain
b487350714 Update version to 0.1.5 2022-02-07 20:31:19 +02:00
Eiren Rain
753b12b49e Merge pull request #120 from ButterscotchV/bvh-recording
Add simple BVH recording button
2022-02-07 20:01:45 +02:00
Butterscotch!
0d90cf9c20 Add simple BVH recording button 2022-02-07 01:40:11 -05:00
Eiren Rain
658fd2916d Merge pull request #118 from deiteris/main
Switch to latest gradle and update dependencies
2022-02-05 17:43:00 +02:00
Yury
ed4ea675fb Keep JavaOSC package and remove slf4j package 2022-02-05 18:39:10 +03:00
Yury
2746fd7a67 Remove guava 2022-02-05 18:37:25 +03:00
Eiren Rain
a6b92c60b0 Update commons 2022-02-05 17:33:40 +02:00
Eiren Rain
d4d36a65ec Merge pull request #119 from ButterscotchV/bvh-fix
Fix BVH local angle calculations and abstract PoseStreamer
2022-02-05 17:25:34 +02:00
Butterscotch!
97df8ee12f Simplify PoseFrameStreamer constructor 2022-02-05 07:21:14 -05:00
Butterscotch!
2ab637b4e8 Improve PoseFrameStreamer functionality 2022-02-05 07:08:45 -05:00
Butterscotch!
9a821b051f Abstract PoseStreamer 2022-02-05 07:08:44 -05:00
Butterscotch!
e2f09fc93d Add fake root method & fix local angle calculation 2022-02-05 06:01:07 -05:00
Butterscotch!
891d8e0468 Fix BVH angles 2022-02-05 05:04:31 -05:00
Yury
494e31e41f Switch to latest gradle and update dependencies 2022-02-05 13:02:46 +03:00
Eiren Rain
b369ae6a2a Fix battery reading compatibility with owoTrack 2022-02-02 18:39:53 +02:00
Eiren Rain
5c22ef0192 Fix backwards compatibility with extensions on old firmware 2022-01-29 00:45:28 +02:00
Eiren Rain
d99cbb9c85 Fix backwards compatibility with old firmware and owoTrack 2022-01-28 02:53:08 +02:00
Eiren Rain
4f14f01830 Merge pull request #114 from SlimeVR/test
Network refactoring
2022-01-27 21:51:56 +02:00
Eiren Rain
930b5c701a Cleanup UDP responses 2022-01-27 21:38:49 +02:00
Eiren Rain
bd9e2c47a3 Merge branch 'main' into test 2022-01-27 21:30:39 +02:00
Eiren Rain
53ca2cf881 Move UDP packets and parsing to own calsses
Cleanup UDP networking significantly
2022-01-27 21:30:25 +02:00
Eiren Rain
55e17e7625 Minor network fixes 2022-01-27 19:52:30 +02:00
Eiren Rain
13b37aa2a9 Improved debug, added checkbox to display sensors debug info 2022-01-27 19:31:13 +02:00
Eiren Rain
fe4dde69ea Merge pull request #113 from Louka3000/patch-1
fix link setup
2022-01-27 02:21:07 +02:00
Erimel
0268a5a3ec fix link setup 2022-01-26 19:13:52 -05:00
Eiren Rain
4bddb529d4 Fix ping not working 2022-01-25 22:00:02 +02:00
Eiren Rain
435f5d1751 Don't create new trackers if tracker's IP changed while server is running, hand over old trackers to the new connection
Implements #70
2022-01-25 21:46:50 +02:00
Eiren Rain
af8ce60dbe Fix signal strength reading 2022-01-20 20:57:03 +02:00
Eiren Rain
25f53232cd Fix packet number reading 2022-01-20 20:27:23 +02:00
Eiren Rain
012cb518b3 Fix merge issues, track packets order, improve logging in UDP server 2022-01-20 18:03:53 +02:00
Eiren Rain
2d1ffbc5b0 Merge branch 'main' into test
# Conflicts:
#	src/main/java/dev/slimevr/vr/trackers/TrackersUDPServer.java
2022-01-20 17:54:56 +02:00
Eiren Rain
c88a6802a9 Minor debug stuff 2022-01-20 17:50:08 +02:00
Eiren Rain
f5d608ac6a Merge pull request #111 from ButterscotchV/autobone-fix
Fix AutoBone overwriting configs & improve code documentation
2022-01-20 14:19:46 +03:00
Butterscotch!
5d49bbfb29 Fix AutoBone overwriting configs & improve code documentation 2022-01-19 19:20:47 -05:00
Eiren Rain
5ce520a316 Merge pull request #110 from deiteris/main
Fix decimal places for battery voltage
2022-01-20 00:44:49 +03:00
Yury
98c2c6e202 Merge branch 'main' of https://github.com/deiteris/SlimeVR-Server 2022-01-20 00:25:12 +03:00
Yury
a2fc809d71 Fix decimal places for battery voltage 2022-01-20 00:24:47 +03:00
Eiren Rain
eb302aaef1 Merge pull request #107 from Louka3000/main
Updated default body proportions (again
2022-01-16 02:12:36 +03:00
Louka
3b354f103a Update SkeletonConfigValue.java 2022-01-15 18:00:50 -05:00
Eiren Rain
03c24a5d39 Merge pull request #106 from deiteris/main
Fix log in firewall_uninstall.bat
2022-01-13 01:11:38 +03:00
Yury
a8f13bb570 Fix log in firewall_uninstall.bat 2022-01-13 00:56:08 +03:00
Eiren Rain
f8e35e0a72 Merge pull request #105 from deiteris/main
Show battery level reported by tracker
2022-01-13 00:32:10 +03:00
Yury
27c153f5d3 Show battery level reported by tracker 2022-01-12 19:30:51 +03:00
Eiren Rain
82fdedfa14 Minor changes 2022-01-10 12:54:25 +02:00
Eiren Rain
f5bfbb13e2 Added contributions notice to the README 2022-01-10 12:50:02 +02:00
Eiren Rain
80de578334 Fix missing refactoring changes 2022-01-09 12:27:32 +02:00
Eiren Rain
3b0acbe406 Create new trackers only when sensor info packet received 2022-01-09 12:25:57 +02:00
Eiren Rain
1062361612 Merge pull request #99 from deiteris/main
Add RSSI to trackers
2022-01-09 13:17:57 +03:00
Eiren Rain
7d81fe6f92 Merge pull request #102 from Louka3000/main
Skeleton offset
2022-01-09 11:13:42 +03:00
Eiren Rain
0285eca613 Merge pull request #103 from ColdIce1605/fix-typos
Fix typos
2022-01-08 09:03:10 +03:00
James R
b0aea9ba89 fix typos 2022-01-07 20:54:34 -06:00
Louka
b98eafb66f Remove vertical foot offset
Only keep skeleton offset
2022-01-07 09:12:06 -05:00
Louka
566df6793c fixed foot rotation (I broke it)
I still think there's a better way to do this horizontal foot offset thing
2022-01-06 23:43:26 -05:00
Louka
4949e0a7f3 Skeleton offset and vertical foot offset 2022-01-06 22:30:20 -05:00
Yury
572dcdf1bb Add RSSI to trackers 2022-01-02 23:25:56 +03:00
Eiren Rain
80ce825494 Merge pull request #97 from carl-anders/keybindings-wrap-even-more-no-more-panics-plz
Keybindings: Catch even more errors, and manually check that operating system is Windows
2021-12-27 02:23:13 +03:00
Carl Andersson
bdc3b1971c Fix accidental inversion of check 2021-12-26 21:49:46 +01:00
Carl Andersson
cee400a4c6 Simplify OS & error checks 2021-12-26 21:48:52 +01:00
Carl Andersson
e58706d212 Keybindings: Catch even more errors, and manually check that operating system is Windows 2021-12-26 06:05:27 +01:00
Eiren Rain
ad03caa064 Bump version to 0.1.3 2021-12-24 21:26:03 +02:00
Eiren Rain
e2d6189547 Code formatting 2021-12-24 21:25:40 +02:00
Eiren Rain
7b15d242f7 Move rest of the classes to dev.slimev package, comment out wrong unit-test, minor cleanups 2021-12-24 21:18:58 +02:00
Eiren Rain
b81458d034 Merge pull request #95 from ButterscotchVanilla/skeleton-refactor
Skeleton refactor
2021-12-24 22:09:57 +03:00
Eiren Rain
0595422f69 Merge pull request #96 from deiteris/main
Send empty packets when there are no active trackers
2021-12-18 20:46:43 +03:00
Yury
8e58adb279 Send empty packets when there are no active trackers 2021-12-18 16:33:49 +03:00
ButterscotchVanilla
a5e4b4d8e2 Fix all config "Reset" buttons being timed 2021-12-16 21:33:48 -05:00
ButterscotchVanilla
be2c010b5a Remove comment, this was fixed 2021-12-16 19:14:37 -05:00
ButterscotchVanilla
e107326fee Fix merge conflict 2021-12-16 18:54:20 -05:00
Eiren Rain
4da54f6dec Merge pull request #94 from Louka3000/main
Changed default body proportions
2021-12-16 18:15:42 +03:00
ButterscotchVanilla
1a3a955e10 Change StringBuilder.isEmpty() to length check instead for Java 8 compatibility 2021-12-16 02:26:02 -05:00
ButterscotchVanilla
3f304f7275 Optimize offset calculation for bulk config set & finish AutoBone implementation 2021-12-16 02:06:55 -05:00
ButterscotchVanilla
0690d742c7 Properly save SkeletonConfig values 2021-12-16 01:38:16 -05:00
ButterscotchVanilla
43bbd4b4dd Update config defaults from @Louka3000 2021-12-16 00:27:19 -05:00
ButterscotchVanilla
77fa27a698 Remove String skeleton config & fix null exception with SkeletonConfig 2021-12-15 23:00:08 -05:00
Louka
8991e4f9f8 Changed default body proportions 2021-12-15 20:43:13 -05:00
ButterscotchVanilla
c9740651ba Remove other HumanSkeleton implementations 2021-12-08 23:35:21 -05:00
ButterscotchVanilla
473550ba07 Move skeleton namespace 2021-12-08 23:12:43 -05:00
ButterscotchVanilla
a7cbe91e73 Make SimpleSkeleton compatible with HumanSkeleton 2021-12-08 23:10:54 -05:00
ButterscotchVanilla
40281f68b9 Use config enum instead of strings for AutoBone 2021-12-08 22:00:43 -05:00
ButterscotchVanilla
d3049751ba Update AutoBone to use SkeletonConfig 2021-12-08 21:26:32 -05:00
ButterscotchVanilla
68164756c2 Add more ways to set SkeletonConfig values 2021-12-08 19:53:07 -05:00
ButterscotchVanilla
91c0ddef28 Add new SkeletonConfig class for configuring bone lengths and toggles 2021-12-08 17:57:53 -05:00
Eiren Rain
0641ca1b7b Bump version to 0.1.2 2021-12-07 14:26:20 +02:00
ButterscotchVanilla
e3d9eb6ac9 Add new config for offset slide error & disable dist scaling 2021-12-06 19:37:47 -05:00
ButterscotchVanilla
7eec89bd53 AutoBone: Add offset slide error 2021-12-04 20:59:42 -05:00
ButterscotchVanilla
289a7f8313 AutoBone: Scale distances by height difference 2021-12-04 02:55:18 -05:00
ButterscotchVanilla
f49b2556ae Add full tracker functionality to SimpleSkeleton 2021-12-04 00:45:37 -05:00
Eiren Rain
318c43077c Merge pull request #89 from ButterscotchVanilla/bvh-standard
Add functional BVH recording
2021-12-02 23:54:10 +03:00
Eiren Rain
5691b68166 Merge pull request #90 from ButterscotchVanilla/patch-1
Update GitHub Actions workflow
2021-12-02 23:52:31 +03:00
Butterscotch!
0ea44f988c Update GitHub Actions workflow 2021-12-02 15:45:11 -05:00
ButterscotchVanilla
59e2f796eb Add reference to ViRe in a comment 2021-12-02 12:14:45 -05:00
ButterscotchVanilla
f1a75a98d0 Add extra Spine node for rotation 2021-12-02 03:37:13 -05:00
ButterscotchVanilla
76ac3fcf55 Fix angle calculations 2021-12-01 23:50:47 -05:00
ButterscotchVanilla
6cc3c8e84b Add attempted Euler conversion 2021-12-01 23:19:00 -05:00
ButterscotchVanilla
36907c3244 Add closeOutput for specific stream 2021-12-01 20:21:55 -05:00
ButterscotchVanilla
dfeb02c1a7 Add local rotation calculations to TransformNodeWrapper 2021-12-01 20:17:36 -05:00
ButterscotchVanilla
6adf5f4090 Move node hierarchy wrapping to TransformNodeWrapper 2021-12-01 20:17:36 -05:00
ButterscotchVanilla
e44ce3fb0b Add getParent to TransformNode and add StdBVHFileStream 2021-12-01 20:17:36 -05:00
ButterscotchVanilla
76ab69e44e Wrap TransformNodes for different PoseStream hierarchy requirements 2021-12-01 20:17:35 -05:00
Eiren Rain
57d009df5c Fix bug with wrong trackers being read in skeleton if no leg trackers are attached 2021-12-02 02:11:01 +02:00
Eiren Rain
b4d07b0b7e Merge pull request #88 from deiteris/main
Improve bat script error checking
2021-12-01 16:46:07 +03:00
Yury
da3afa6f8e Improve bat script error checking 2021-12-01 11:43:35 +03:00
Eiren Rain
ec1c491e93 Merge pull request #87 from Louka3000/main
autobone hip-only doesn't affect waist distance anymore
2021-12-01 10:27:45 +03:00
Louka
baccb556e8 autobone hip-only doesn't affect waist distance anymore
- Now autobone checks if user has BOTH waist and hip tracker to add the waist distance value.
- Also renamed certain variable, replacing "hip" by "torso"
2021-11-29 20:08:08 -05:00
Eiren Rain
eedfa61d74 Merge pull request #85 from deiteris/main
Prevent path change when running as admin
2021-11-24 08:39:44 +03:00
Eiren Rain
2a9225178f Merge pull request #84 from Louka3000/main
Changed body proportions: Torso, Chest, Waist
2021-11-23 23:36:31 +03:00
Louka
259190e478 Changed body proportions: Torso, Chest, Waist
Body proportions have been changed: - Torso length is now the base value, replacing waist length in earlier versions.
- Hip length is now waist distance. Waist distance is only used when using a hip tracker
- Chest distance/length is the same. It is only used when using a chest tracker
- Autobone support with any mix-n-match configuration :)
- Virtual Waist changed its name to "Hip offset". It still behaves the same.
2021-11-23 15:11:16 -05:00
Yury
24a0c3b136 Prevent path change when running as admin 2021-11-23 12:11:09 +03:00
Louka
f46f2bc913 Tries to get the waist first for the rotation node for Autobone
When you want the rotation node, it should give the node that has the rotation that affects the bone you want
2021-11-22 22:48:43 -05:00
Eiren Rain
77f048c48e Merge pull request #83 from Louka3000/hip-tracker
Hip tracker support
2021-11-23 04:00:14 +03:00
Louka
4055d51758 Autobone support
Added basic autobone support for the hip tracker, fixed "allTracekrs" and changed initial values of upper body.
2021-11-21 18:14:19 -05:00
Louka
21eff5e1ba Better reset and initial values
owo
2021-11-20 21:32:47 -05:00
Louka
34174b442f Virtual waist affected by kneebuf 2021-11-20 20:49:32 -05:00
Louka
77d37ab2a7 Cleanup and support for hip tracker alone/
why would you want hip alone instead of waist? idk
2021-11-20 16:35:22 -05:00
Louka
350fdbce9d Can use chest tracker alone
hip tracker will default to the waist tracker's position (waist or chest) if no hip tracker is found
2021-11-20 15:03:33 -05:00
Louka
e19cec4d3e Initial commit
added hip tracking support.
Independent from waist.
Has a hip length value going from waist to hip.
Legs depend on hip instead of waist
should work normally without hip tracker.
Should work just fine with a virtual waist offset.
2021-11-20 00:04:33 -05:00
Eiren Rain
e56d7665ed Merge pull request #81 from carl-anders/softer-keybinding-failure-mode
Keybinding: If JIntellitype fails to load, still allow server to run
2021-11-12 02:59:46 +02:00
Carl Andersson
a0e23bfbe9 Keybinding: Be even better at catching errors from JIntellitype 2021-11-12 00:35:41 +01:00
Carl Andersson
b7dc33f79e Keybinding: If JIntellitype fails to load, still allow server to run 2021-11-11 06:31:35 +01:00
Eiren Rain
d8c31eec81 Merge pull request #80 from deiteris/main
Display information message in case Java is not installed
2021-11-08 20:32:42 +02:00
Yury
e84ee760b1 Display information message in case Java is not installed 2021-11-08 21:25:26 +03:00
Eiren Rain
6ba1cc6bdb Merge pull request #79 from deiteris/main
Add forgotten imports
2021-11-08 17:22:31 +02:00
Yury
1b5e534592 Add forgotten imports 2021-11-08 18:01:43 +03:00
Eiren Rain
1a3e21007b Merge pull request #78 from deiteris/main
Prevent server from running if required ports are busy
2021-11-06 20:26:58 +02:00
Yury
55e11ffb5c Prevent server from running if required ports are busy 2021-11-06 21:22:24 +03:00
Eiren Rain
957a040996 Bump version to v0.1.1 2021-10-23 21:00:31 +03:00
Eiren Rain
460a42b135 Merge pull request #67 from ButterscotchVanilla/mocap-stuff
Add base internal mocap functionality
2021-10-22 17:43:47 +03:00
Eiren Rain
8c356b401c Merge pull request #71 from Louka3000/main
Foot Offset and Updated Icons
2021-10-22 17:42:19 +03:00
ButterscotchVanilla
820d06f008 Move PoseStreamer files 2021-10-21 22:48:38 -04:00
Louka
3fa22fa716 Merge branch 'SlimeVR:main' into main 2021-10-20 21:17:09 -04:00
Louka
333daa9cfb Updated Icons
Replaced the old Icons with the new ones. Also made the 16x16 icon pixel.
2021-10-20 21:15:23 -04:00
Eiren Rain
0e61460cdb Bump version to 0.1.0 Test 1 2021-10-21 00:57:49 +03:00
Eiren Rain
268da18bb5 Properly handle tracker error state for tracker extensions, and timeout for all trackers 2021-10-21 00:57:13 +03:00
Eiren Rain
3fec29cbc6 Minor GUI cleanup 2021-10-20 03:49:57 +03:00
Louka
4f3e79a4ac Foot Offset
Added horizontal backwards/forwards foot offset feature.
2021-10-17 01:03:31 -04:00
Eiren Rain
8b3699024b Merge branch 'main' of https://github.com/SlimeVR/SlimeVR-Server into main 2021-10-17 02:08:40 +03:00
Eiren Rain
dd071f2538 Properly use tracker's IP if no MAC recieved 2021-10-17 02:07:30 +03:00
Eiren Rain
ebe74dac17 Merge pull request #69 from ButterscotchVanilla/java-popup
Add a simple error log and popup for unsupported Java versions
2021-10-14 16:35:45 +03:00
ButterscotchVanilla
909a51892f Add a simple error log and popup for unsupported Java versions 2021-10-14 04:31:20 -04:00
ButterscotchVanilla
35c26bec0f Fix Pose Recorder and Streamer synchronization and reduce if nesting 2021-10-13 07:05:29 -04:00
ButterscotchVanilla
8f05284792 Rename PoseFileStream and remove unexpected buffer 2021-10-13 03:05:39 -04:00
ButterscotchVanilla
e1d3af0734 Fix formatting 2021-10-13 02:38:30 -04:00
ButterscotchVanilla
c3fc5607ba Explain the editorconfig change in a comment 2021-10-13 01:57:07 -04:00
ButterscotchVanilla
a326d76f6a Add basic BVH file streamer 2021-10-13 01:57:07 -04:00
ButterscotchVanilla
472fcab821 Add a basic PoseStreamer implementation for streaming mocap data 2021-10-13 01:57:06 -04:00
ButterscotchVanilla
e7f81eb1aa Rename PoseFrame to PoseFrames 2021-10-13 01:57:06 -04:00
ButterscotchVanilla
31375855a0 Fix PoseRecorder frame timing 2021-10-13 01:56:04 -04:00
Eiren Rain
385890d0f0 Bundle LICENSE in the build 2021-10-05 14:58:15 +03:00
Eiren Rain
c9b4b5f18f Added explanation of licensing terms 2021-10-05 14:57:29 +03:00
Eiren Rain
c49af7fb33 Add discorvery port to firewall and add firewall uninstall script 2021-10-05 14:23:16 +03:00
Eiren Rain
4f042de2f4 Minor refactoring 2021-10-05 14:18:13 +03:00
Eiren Rain
f3e2b2ca40 Merge pull request #64 from SlimeVR/ipc-upgrade
IPC upgrade
2021-10-05 14:17:08 +03:00
Eiren Rain
a690447391 Fix thread safety 2021-10-05 14:15:47 +03:00
Eiren Rain
01593352ab Bump version to 0.1.0 2021-10-05 14:13:09 +03:00
Eiren Rain
0e4618529d Merge branch 'main' into ipc-upgrade 2021-10-05 14:11:04 +03:00
Eiren Rain
57c97cd5e1 Move eclipse project to java 11 2021-10-05 13:51:57 +03:00
Eiren Rain
8606c0daa3 Change how SteamVR trackers are selected 2021-10-05 13:51:44 +03:00
Eiren Rain
e94551d4f7 Merge pull request #63 from carl-anders/keyboard-keybindings
Keyboard keybindings: Actually do the correct type of reset
2021-10-03 21:26:33 +03:00
Carl Andersson
ffcd4f32ed Keyboard keybindings: Actually do the correct type of reset 2021-10-03 20:21:21 +02:00
Eiren Rain
2248f577df Merge pull request #62 from adigyran/main
Updated github CI to use 11th java
2021-10-03 18:33:01 +03:00
adigyran
8a57553986 updated gradle CI to use 11th java 2021-10-03 18:31:36 +03:00
Eiren Rain
bb01ce776b Merge branch 'main' into ipc-upgrade
# Conflicts:
#	src/main/java/io/eiren/vr/trackers/TrackersUDPServer.java
2021-10-03 13:18:14 +03:00
Eiren Rain
631870846c Fix classpath for new gradle build 2021-10-03 13:13:33 +03:00
Eiren Rain
a45abb7992 Update README.md 2021-10-02 19:48:54 +03:00
Eiren Rain
c7aaffa5e6 Merge pull request #58 from adigyran/main
slime commons as submodule
2021-10-02 19:46:34 +03:00
adigyran
7def0d0b4e gitlab ci with submodule 2021-10-02 19:44:14 +03:00
adigyran
c035135fb7 slime commons as submodule 2021-10-02 18:43:51 +03:00
Eiren Rain
15ffdeeeb8 Merge pull request #57 from carl-anders/keyboard-keybindings
Keyboard keybindings
2021-10-02 17:47:18 +03:00
Eiren Rain
74f6902a1b Fix NPE in WebSocket bridge 2021-10-02 17:45:56 +03:00
Carl Andersson
b2ae71333a Remove unused json dependency 2021-10-02 16:31:45 +02:00
Carl Andersson
fc88269f2d Add support for keyboard keybindings for reset and quick reset 2021-10-02 15:30:53 +02:00
Eiren Rain
a191fcf803 Bump version to Test 6 2021-10-01 17:39:20 +03:00
Eiren Rain
37b109bd73 Make UDP server support any number of sensors on a single tracker 2021-10-01 17:39:03 +03:00
Eiren Rain
27b2a77f48 Display descriptive tracker names instead of mac addresses in the GUI 2021-10-01 17:30:37 +03:00
Eiren Rain
0f34dd0967 Add back the bridge for SteamVR input, make it also reconnect automatically 2021-10-01 17:30:17 +03:00
Eiren Rain
10fc717500 Fix new bridge 2021-10-01 14:49:01 +03:00
Eiren Rain
250068c6c2 Reset trackers on bridge disconnect 2021-10-01 13:32:44 +03:00
Eiren Rain
488838752b Implement new named pipe bridge and test it lightly 2021-10-01 12:27:04 +03:00
Eiren Rain
dd0f4deae3 Merge pull request #54 from JimWails/main
Fix Spelling mistakes
2021-10-01 04:28:01 +03:00
JimWails
2df4106c92 Fix Spelling mistakes
Change upd:// to udp://
2021-09-30 23:48:42 +08:00
Eiren Rain
ed58076c68 Rework new bridge, don't use internal trackers
Update messages, added more enums and such; some refactoring
2021-09-30 14:42:37 +03:00
Eiren Rain
a4b300198d More work on IPC, minor bridges refactoring 2021-09-29 21:51:14 +03:00
Eiren Rain
6980023c5a Merge branch 'main' into ipc-upgrade 2021-09-29 20:37:35 +03:00
Eiren Rain
9f4d956345 Don't start SteamVR bridge not on Windows for now 2021-09-29 17:16:28 +03:00
Eiren Rain
ce4a90dc55 Early implementation of WebSocket VR Bridge 2021-09-24 01:53:10 +03:00
Eiren Rain
82ba193bb4 Minor GUI cleanup 2021-09-23 22:55:45 +03:00
Eiren Rain
a3a004536d Make GUI greatly less annoying and stretchy 2021-09-23 22:46:17 +03:00
Eiren Rain
bb1d7e06c2 Minor GUI update 2021-09-23 21:42:11 +03:00
Eiren Rain
3689e6723c IPC upgrade WIP 2021-09-23 21:18:42 +03:00
Eiren Rain
ef504c40b6 Use tracker mac address to save tracker configs 2021-09-22 22:37:45 +03:00
Eiren Rain
5e4a128d25 Update firewall script 2021-09-21 20:22:48 +03:00
Eiren Rain
67d93d87b5 Added protobuf and generated messages class 2021-09-18 23:44:51 +03:00
Eiren Rain
56b8b58606 Bump version to 0.0.19 2021-09-18 16:51:49 +03:00
Eiren Rain
97bc9343c1 Code formatting, move some packages 2021-09-18 16:50:54 +03:00
Eiren Rain
18cea30f72 Merge pull request #49 from ButterscotchVanilla/autobone-positions
AutoBone PoseFrame file format rework and other related fixes
2021-09-18 03:04:29 +03:00
Eiren Rain
d5c048600e Fix SteamVR input bridge not setting tracker status properly 2021-09-18 02:58:22 +03:00
ButterscotchVanilla
6d103d4ff9 Get all trackers directly in setPoseFromFrame 2021-09-17 19:18:24 -04:00
Eiren Rain
7008197760 Merge pull request #48 from kitlith/target_java8_release
Fixes some compatibility issues when compiling with Java9+ jdk.
2021-09-17 15:32:21 +03:00
Kitlith
da66f33edc Fixes some compatibility issues when compiling with Java9+ jdk.
i.e.:
java.lang.NoSuchMethodError:
java.nio.ByteBuffer.rewind()Ljava/nio/ByteBuffer;
2021-09-16 16:36:00 -07:00
ButterscotchVanilla
4109d1c825 Add pelvis averaging for SimpleSkeleton and fix neck rotation 2021-09-16 00:30:22 -04:00
ButterscotchVanilla
a300663a9e Spelling fix and check for null in TrackerUtils 2021-09-14 10:36:35 -04:00
ButterscotchVanilla
cb33dac3b9 Handle getRotation and getPosition responses properly 2021-09-14 09:14:16 -04:00
ButterscotchVanilla
582bac8050 Check recording for chest tracker when loading AutoBone configs 2021-09-14 09:08:22 -04:00
ButterscotchVanilla
5e1c45bc09 Record individual trackers with PoseFrame and optimize iterations 2021-09-14 08:50:08 -04:00
ButterscotchVanilla
b3073e6938 Handle busy status and add better exception messages 2021-09-14 04:20:43 -04:00
ButterscotchVanilla
63e259689f Handle computed trackers better and handle tracker status in data collection 2021-09-14 04:01:10 -04:00
ButterscotchVanilla
d92ea0a39e Small clean-up and ignore computed trackers in PoseFrame by default 2021-09-14 02:52:06 -04:00
ButterscotchVanilla
81bbb4008b Only allow loading tracker configs if the tracker is user editable 2021-09-14 01:45:35 -04:00
ButterscotchVanilla
45ad0698b1 Allow multiple TrackerFrames with the same designation in PoseFrame, make TrackerFrame extend Tracker 2021-09-14 01:06:36 -04:00
ButterscotchVanilla
bc542a7bb1 Don't put null designations in the trackers 2021-09-12 13:19:33 -04:00
ButterscotchVanilla
efb065f558 Fix TrackerBodyPosition.getByDesignation capitalization 2021-09-12 13:19:33 -04:00
ButterscotchVanilla
00e63db029 Use HashMap directly 2021-09-12 13:19:32 -04:00
ButterscotchVanilla
f6a2926033 Remove comment and useless if statement 2021-09-12 13:19:32 -04:00
ButterscotchVanilla
5b0f8afa4e Change namespaces, change PoseRecorder format, use TrackerBodyPosition for designation 2021-09-12 13:19:32 -04:00
Eiren Rain
c5b4421eae Fix tracker info not updating for IMU trackers 2021-09-12 19:58:03 +03:00
Eiren Rain
4d3f04e227 Bump version to 0.0.18 Test 3 2021-09-12 12:11:20 +03:00
Eiren Rain
75ad29a68d Can select role for SteamVR trackers
Trackers now have info if they report position or rotation
Extended pelvis model is always on
2021-09-12 12:10:59 +03:00
Eiren Rain
62e1e65dda Merge pull request #46 from ButterscotchVanilla/pelvis-fix
Fix leg averaging for pelvis and add waist tracker averaging
2021-09-12 12:00:11 +03:00
ButterscotchVanilla
02f64314b8 Fix leg averaging for pelvis and add waist tracker averaging 2021-09-12 04:49:54 -04:00
Eiren Rain
12d7f191ee Fix NPE, added bat scripts to the build 2021-09-04 09:25:16 +03:00
Eiren Rain
37135e1c8e Merge pull request #45 from ButterscotchVanilla/main
AutoBone: Move hardcoded values to variables
2021-09-03 06:54:33 +03:00
ButterscotchVanilla
85a0c25d0e AutoBone: Move hardcoded values to variables 2021-09-02 22:17:19 -04:00
Eiren Rain
1f081392df Always have a skeleton with legs, can work with any trackers, fill in empty trackers with static or previous 2021-09-02 11:41:54 +03:00
Eiren Rain
c02f9b827d Merge branch 'main' of https://github.com/SlimeVR/SlimeVR-Server into main 2021-09-02 11:33:46 +03:00
Eiren Rain
7e95c9f999 Remember window size and position between restarts
Added window and taskbar icons
2021-09-02 11:33:27 +03:00
Eiren Rain
4836b025e9 Merge pull request #41 from JimWails/main
Add support for ch910xx
2021-08-29 17:08:04 +03:00
JimWails
9a76838602 Add support for ch910xx
Already test on ESP8266 which use CH9102X driver
2021-08-28 22:27:30 +08:00
Eiren Rain
6c27186ce9 Make GUI less garbage (still gabage, but less) 2021-08-26 11:57:35 +03:00
Eiren Rain
74c25c2ca3 Don't use source port to id trackers 2021-08-23 16:39:43 +03:00
Eiren Rain
91ee6ff6c0 Merge pull request #35 from adigyran/patch-6
Update README.md
2021-08-22 15:59:17 +03:00
Yury
05ba866bef Update README.md
new build command
2021-08-22 15:55:38 +03:00
Eiren Rain
af3aab86dc Don't crash on pipe errors, just log them 2021-08-22 15:03:11 +03:00
Eiren Rain
4370defb69 Merge pull request #34 from adigyran/main
Gradle shadow plugin for dependency resolving
2021-08-22 14:50:20 +03:00
Eiren Rain
a105879c9a Supress config file not found error to create less confusion 2021-08-22 14:46:55 +03:00
Eiren Rain
9383be678c Don't parse some packets when paired with owoTrack #33 2021-08-22 14:46:35 +03:00
Eiren Rain
7c8a394147 Handle HMD pipe better 2021-08-22 14:43:27 +03:00
Eiren Rain
ffc8a9dae4 Remove new spine model from the main branch 2021-08-22 14:36:35 +03:00
adigyran
bb4a65882d Gradle shadow plugin. Based on Kitlith change of build.gradle. Using now library for Slime Commons dependency resolving. Changed gradle.yml accordingly. It produces slimevr.jar file 2021-08-22 13:44:26 +03:00
Yury
5ebbb907e7 Update gradle.yml
fix resolving
2021-08-22 13:39:20 +03:00
Yury
2ba66d7f91 Update .github/workflows/gradle.yml
Co-authored-by: Butterscotch! <bscotchvanilla@gmail.com>
2021-08-22 13:38:28 +03:00
Yury
7f8fe9e4f4 Update .github/workflows/gradle.yml
Co-authored-by: Butterscotch! <bscotchvanilla@gmail.com>
2021-08-22 13:38:22 +03:00
Yury
12292070ce Update .github/workflows/gradle.yml
Co-authored-by: Butterscotch! <bscotchvanilla@gmail.com>
2021-08-22 13:34:46 +03:00
adigyran
8bc2b72ab0 readme fix for new command 2021-08-22 13:32:20 +03:00
adigyran
208ae6b6d6 reformat code 2021-08-22 13:21:20 +03:00
adigyran
ba8121a8a7 Gradle shadow plugin. Based on Kitlith change of build.gradle. Using now library for Slime Commons dependency resolving. Changed gradle.yml accordingly. It produces slimevr.jar file 2021-08-22 13:15:22 +03:00
Eiren Rain
c8da0427f9 Added simple test extended spine model, SlimeVR/SlimeVR-Server#31 2021-08-20 17:05:15 +03:00
Eiren Rain
fed13e8fda Change name of steamvr trackers to legs instead of feet to make it less confusing 2021-08-20 15:32:53 +03:00
Eiren Rain
e3b977c636 Merge pull request #29 from ButterscotchVanilla/main
Add AutoBone, a skeleton auto-configuration algorithm
2021-08-20 15:30:33 +03:00
ButterscotchVanilla
337912f3d0 AutoBone: Optimize PoseRecorder tick 2021-08-19 22:46:41 -04:00
ButterscotchVanilla
3b61f88343 AutoBone: Add save recording button & enable buttons as needed 2021-08-19 18:14:57 -04:00
Eiren Rain
5f6a6ba1c5 Actually start steamvr input bridge 2021-08-20 00:11:25 +03:00
Eiren Rain
bb29844101 Recieve tracker role from SteamVR for input trackers 2021-08-19 23:03:07 +03:00
Eiren Rain
5600d95684 Add OCCLUDED status to the tracker status for future usage 2021-08-19 15:48:51 +03:00
Eiren Rain
45ba341ccf Added new pipe to read basic tracking data from feeder app 2021-08-19 15:43:49 +03:00
ButterscotchVanilla
7992526d2d AutoBone: Rename PoseRecordIO to PoseFrameIO and separate recording load into a method 2021-08-19 04:29:14 -04:00
ButterscotchVanilla
9a6cb23659 AutoBone: Add support for absolute positions 2021-08-19 04:11:23 -04:00
ButterscotchVanilla
bc132b7757 AutoBone: Thow NullPointerException for missing frames 2021-08-19 02:38:18 -04:00
ButterscotchVanilla
b05d726ad0 AutoBone: Return recording ASAP and check if it's empty 2021-08-19 01:54:28 -04:00
ButterscotchVanilla
a7a612aa9b AutoBone: Add recording cancellation, always check if the recording is done and not submitted 2021-08-19 00:52:09 -04:00
ButterscotchVanilla
32a29c8bc7 AutoBone: Add new dedicated AutoBone window 2021-08-18 23:59:12 -04:00
ButterscotchVanilla
23a3babf33 AutoBone: Fix recording 2021-08-17 16:28:13 -04:00
ButterscotchVanilla
3d90f0b284 AutoBone: Add proportion error 2021-08-17 04:12:21 -04:00
ButterscotchVanilla
1e6448c61f AutoBone: Let's pretend this didn't get committed 2021-08-17 00:10:08 -04:00
ButterscotchVanilla
a1f709ca12 AutoBone: Add unused configs to staticConfigs and split error function 2021-08-16 23:55:20 -04:00
ButterscotchVanilla
a8ca2fd6e6 AutoBone: Use abs dist for foot offset error, use total length again, and remove hips 2021-08-16 19:37:13 -04:00
ButterscotchVanilla
f835eeecdd AutoBone: Use error derivative and add more foot offsets 2021-08-16 18:14:17 -04:00
ButterscotchVanilla
70f5228d1c AutoBone: Remove head offset, remove totalLength 2021-08-16 18:14:17 -04:00
ButterscotchVanilla
89e2ea610a AutoBone: Automatically update node positions 2021-08-16 18:14:16 -04:00
ButterscotchVanilla
6b68a983a5 AutoBone: Restructure processFrames and remove unused code 2021-08-16 18:14:16 -04:00
ButterscotchVanilla
4a2878b92e AutoBone: Separate pose recorder from AutoBone & save multiple recordings 2021-08-16 18:14:16 -04:00
ButterscotchVanilla
4f8165c8e1 Set gradle compiler encoding to UTF-8 2021-08-16 18:14:15 -04:00
ButterscotchVanilla
855d15cec5 AutoBone: Fix configs not updating when AutoBone is run 2021-08-16 18:14:15 -04:00
ButterscotchVanilla
e1d17f61c4 AutoBone: Properly handle ratio output 2021-08-16 18:14:15 -04:00
ButterscotchVanilla
380ae27762 AutoBone: Support no chest tracker 2021-08-16 18:14:15 -04:00
ButterscotchVanilla
4775dcd57a AutoBone: Add more configs, fix recording reading 2021-08-16 18:14:14 -04:00
ButterscotchVanilla
807ccc69ce AutoBone: Print file name before processing frames 2021-08-16 18:14:14 -04:00
ButterscotchVanilla
aaee64ce02 AutoBone: Add stabilization, more fine-tuning as usual 2021-08-16 18:14:13 -04:00
ButterscotchVanilla
294141e223 AutoBone: Oops 2021-08-16 18:14:13 -04:00
ButterscotchVanilla
e3b125f244 AutoBone: Add bulk recording loading, add height diff stat 2021-08-16 18:14:13 -04:00
ButterscotchVanilla
7fd3297fed AutoBone: Fix error function, add error derivative, consider positive and negative equally, etc 2021-08-16 18:14:12 -04:00
ButterscotchVanilla
a2f54f67a3 AutoBone: Update GUI values after adjustment 2021-08-16 18:14:12 -04:00
Butterscotch!
d77724a911 Change CI to build on any branch 2021-08-16 18:14:12 -04:00
ButterscotchVanilla
1dc05ba196 AutoBone: Save configs without needing to have a skeleton 2021-08-16 18:14:11 -04:00
ButterscotchVanilla
cd7d4d102b AutoBone: Add config input for recording and adjustment values 2021-08-16 18:14:11 -04:00
ButterscotchVanilla
0ba2450152 AutoBone: Fine-tune chest-waist and leg-waist ratios 2021-08-16 18:14:10 -04:00
ButterscotchVanilla
eee7d67591 AutoBone: Allow manual target height value 2021-08-16 18:14:10 -04:00
ButterscotchVanilla
760dbfa5b9 AutoBone: Load multiple recordings, fine-tune values and extract ratios, fix restricted values from getting stuck 2021-08-16 18:14:10 -04:00
ButterscotchVanilla
a52384de2e AutoBone: This decreases error magically? Fine-tune leg to body ratio range 2021-08-16 18:14:09 -04:00
ButterscotchVanilla
0dab8f0c94 AutoBone: Fix grammar to be clearer 2021-08-16 18:14:09 -04:00
ButterscotchVanilla
629984c792 AutoBone: Remove feet from skeleton, read from AutoBone configs, and make skeletons local 2021-08-16 18:14:09 -04:00
ButterscotchVanilla
707e4c6dde AutoBone: Auto-detect height, add more restrains, fine-tuning adjustment values 2021-08-16 18:14:08 -04:00
ButterscotchVanilla
efbe409399 AutoBone: Only allow one AutoBone thread 2021-08-16 18:14:08 -04:00
ButterscotchVanilla
faf0be6c53 AutoBone: Fine-tune algorithm and error function, apply results to skeleton 2021-08-16 18:14:08 -04:00
ButterscotchVanilla
1a078993f3 AutoBone: Simplify length adjustment code 2021-08-16 18:14:07 -04:00
ButterscotchVanilla
e0ac3bb853 AutoBone: Make PoseRecordIO static and add height to algorithm error 2021-08-16 18:14:07 -04:00
ButterscotchVanilla
c6cd13d9cd AutoBone: Add data distance controls to control amount of context between poses 2021-08-16 18:14:07 -04:00
ButterscotchVanilla
ef88e2e4a9 AutoBone: Modify error function, add average error logs, and add tuning variables 2021-08-16 18:14:06 -04:00
ButterscotchVanilla
d9bcc39ee6 AutoBone: Disable feet 2021-08-16 18:14:06 -04:00
ButterscotchVanilla
84f4a47df1 AutoBone: Load recordings from "ABRecording_Load.abf" 2021-08-16 18:14:06 -04:00
ButterscotchVanilla
1408a5c357 AutoBone: Use skeleton properly and update on tick & add a timer for sampling 2021-08-16 18:14:05 -04:00
ButterscotchVanilla
202b15e8a8 Specify Java 8 compatibility 2021-08-16 18:14:05 -04:00
ButterscotchVanilla
110554a180 AutoBone: Add recording export to process 2021-08-16 18:14:04 -04:00
ButterscotchVanilla
90e3715426 AutoBone: Add serialization/deserialization of recording 2021-08-16 18:14:04 -04:00
ButterscotchVanilla
644fee2d1f AutoBone: Make auto-adjustment wait for recording to finish 2021-08-16 18:14:04 -04:00
ButterscotchVanilla
c163effe60 AutoBone: Add test button 2021-08-16 18:14:03 -04:00
ButterscotchVanilla
0a39c746a3 AutoBone: Add frame recording interval 2021-08-16 18:14:03 -04:00
ButterscotchVanilla
2f46b3ff58 AutoBone: Move configs to HashMap and finish implementing adjustment 2021-08-16 18:14:02 -04:00
ButterscotchVanilla
d35760d3a2 AutoBone: Add basic PoseFrame recording and start processing loop 2021-08-16 18:14:02 -04:00
ButterscotchVanilla
19a1101b43 AutoBone: Add AutoBone, PoseFrame, and finish implementing SimpleSkeleton 2021-08-16 18:14:01 -04:00
ButterscotchVanilla
8b209eaf27 AutoBone: Add node HashMap 2021-08-16 18:14:01 -04:00
ButterscotchVanilla
fc6f7d3004 AutoBone: Add config setting/saving 2021-08-16 18:14:01 -04:00
ButterscotchVanilla
1abab9f92d AutoBone: Add basic skeleton initialization 2021-08-16 18:14:01 -04:00
Eiren Rain
c3b50983e3 Make GUI updates less frequent and save some CPU usage 2021-08-14 18:48:45 +03:00
Eiren Rain
a0857090a0 Minor changes 2021-08-13 22:05:03 +03:00
Eiren Rain
1ce9be3ed3 Merge pull request #23 from ButterscotchVanilla/slime-ci-patch
Separate CI test and build into jobs
2021-08-12 12:18:58 +03:00
Butterscotch!
11d461380d Separate CI test and build into jobs 2021-08-12 05:14:16 -04:00
Eiren Rain
6c0eb07c0b Merge pull request #21 from ButterscotchVanilla/editorconfig
Create .editorconfig
2021-08-10 17:43:56 +03:00
ButterscotchVanilla
fb9ae3e78c Create .editorconfig 2021-08-10 10:38:58 -04:00
Eiren Rain
52f59fbfb3 Fixed typo 2021-08-10 16:51:42 +03:00
Eiren Rain
4a59017269 Added important comment 2021-08-10 09:20:12 +03:00
Eiren Rain
5c6d02de30 Parse handshake properly 2021-08-10 08:58:57 +03:00
Eiren Rain
83b0e78b9e Recieve correction and tap data, currently not used
Fix some typos
2021-08-10 08:31:03 +03:00
Eiren Rain
ac192e2416 Display magentometer calibration separately 2021-08-10 07:26:32 +03:00
Eiren Rain
52932d63d3 Display data from new protocol and firmware version, including calibration statis and magentometer correction 2021-08-09 17:46:00 +03:00
Eiren Rain
6a45e5d32c Another attempt at new knee model
Waist rotation now takes into account knee model
2021-08-08 08:04:28 +03:00
Eiren Rain
6f09598243 Added toggle for extended pelvis model
Extended aknle model is added but not used
Added 3-tracker rudementary support for people that want to hurt themselves
Fixed typos
2021-08-05 07:50:49 +03:00
Eiren Rain
467e79d1c0 Added Fast Reset button that resets only Yaw of the trackers 2021-08-04 07:48:54 +03:00
Eiren Rain
fa66c94ec3 Implemented new pelvis model as average between legs rotation
SlimeVR/SlimeVR-Server#9
2021-08-04 01:03:58 +03:00
Eiren Rain
2b4ce4b920 Fix version number 2021-08-02 23:08:22 +03:00
Eiren Rain
4e7585b87e Added support for different SteamVR trackers configuration 2021-08-02 23:07:25 +03:00
Eiren Rain
de13db4627 Fix right foot wasn't resetting 2021-07-31 03:05:08 +03:00
Eiren Rain
ca8ceb428b Set version to 0.0.12 2021-07-26 02:01:18 +03:00
Eiren Rain
c18597387a Merge pull request #20 from adigyran/patch-5
Update build.gradle
2021-07-26 02:00:25 +03:00
Yury
962504b788 Update build.gradle
useJUnitPlatform
2021-07-26 01:27:15 +03:00
Eiren Rain
8d1886d045 Display raw tracker data in degrees not in quats 2021-07-26 00:55:01 +03:00
Eiren Rain
1c5167bb7c Another tracker adjustment fix, doesn't pass all tests, but works better 2021-07-26 00:48:34 +03:00
Eiren Rain
e248cca4e7 Adjustmed trackers pass all tests 2021-07-25 23:04:34 +03:00
Eiren Rain
89ee97872d Streams go brrrr in unit tests 2021-07-25 22:45:54 +03:00
Eiren Rain
b22a2368d4 Refactor tests, generate tests for each angle dynamically, separate 3 test types 2021-07-25 22:19:04 +03:00
Eiren Rain
9ecfc57e44 Use JUnit 5 framework for testing 2021-07-25 20:57:11 +03:00
Eiren Rain
cd141258c5 Merge pull request #19 from adigyran/patch-4
Update build.gradle
2021-07-23 17:51:47 +03:00
Yury
5dc027a9e2 Update build.gradle
fix gradle dependencies
2021-07-23 17:46:29 +03:00
Eiren Rain
3e55b0e417 Merge pull request #18 from adigyran/patch-3
Update README.md
2021-07-22 12:36:20 +03:00
Eiren Rain
9ca6b21c61 Merge pull request #17 from ButterscotchVanilla/main
Automatically detect and set the Slime Java Commons subproject location
2021-07-22 12:36:01 +03:00
Yury
8ec528d4a0 Update README.md
formatting, thanks Butterscotch for some changes
2021-07-22 02:56:25 +03:00
Yury
961946bd29 Update README.md
formatting
2021-07-22 02:53:35 +03:00
Yury
da5fc860cf Update README.md
formatting
2021-07-22 02:50:54 +03:00
Yury
fdd39c4010 Update README.md
How to build instructions, this is for ButterscotchVanilla's PR  #17
2021-07-22 02:46:39 +03:00
ButterscotchVanilla
900e96a3a6 Announce subproject location before setting it 2021-07-21 17:39:45 -04:00
ButterscotchVanilla
6a9f42f126 Auto-detect Slime Java Commons subproject location 2021-07-21 17:35:09 -04:00
ButterscotchVanilla
72ea196359 Update gradle.yml 2021-07-21 17:11:01 -04:00
ButterscotchVanilla
90a8abeed2 Add comments to build.gradle and add path to subproject 2021-07-21 17:07:16 -04:00
Eiren Rain
34fcbfa96f Minor fixes 2021-07-21 22:21:39 +03:00
Eiren Rain
0f360cf892 WiFi window should be able to use CP2102 usb to uart too 2021-07-21 22:15:03 +03:00
Eiren Rain
22d4196bed Implement setting WiFi credentials via GUI 2021-07-21 22:06:35 +03:00
Eiren Rain
fb9860d51d Improve unit testing for adjusted trackers, not properly tests reference yaw != 0 2021-07-21 18:13:00 +03:00
Eiren Rain
c8ba9d62aa Added unit tests for adjusted trackers rotation, another rotation correction alghorithm
Added version number to the title to reduce confusion
2021-07-21 17:38:43 +03:00
Eiren Rain
4a66128af5 Merge pull request #15 from adigyran/patch-1
Update README.md
2021-07-20 15:54:27 +03:00
Yury
f061410205 Update README.md 2021-07-20 15:51:53 +03:00
Eiren Rain
1250e77771 More correct (but still not completely correct) tracker adjustments 2021-07-19 18:35:08 +03:00
Eiren Rain
a20334d026 Fixed trackers ping not being displayed 2021-07-13 17:25:15 +03:00
Eiren Rain
c2b4d30047 Removed leg yaw averaging, it was causing leg gimbal lock 2021-07-08 16:46:55 +03:00
Eiren Rain
755ab592f1 Rework legs proportions to legs length and knee height 2021-07-08 06:36:23 +03:00
Eiren Rain
9e0147ed27 Implemented body proportions reset buttons to reset things to their defaults based on user's height 2021-07-08 06:16:02 +03:00
Eiren Rain
0ab92322a8 Minor GUI fix 2021-07-08 06:15:21 +03:00
Eiren Rain
4e58df76fb Merge pull request #6 from ButterscotchVanilla/main
Add Slime Java Commons to Gradle build and create a GitHub Actions workflow
2021-07-08 02:50:33 +03:00
Butterscotch!
d3f81625ce Add testing to workflow 2021-07-07 19:39:08 -04:00
Butterscotch!
b97a92b682 Create GitHub Actions build script (#1)
* Create gradle.yml
2021-07-07 19:29:54 -04:00
ButterscotchVanilla
5b2918acb2 Build dependencies when packaging a server jar 2021-07-07 19:19:46 -04:00
ButterscotchVanilla
cbf37a7c9c Add Slime Java Commons as a dependency and add runnable jar task 2021-07-07 18:48:24 -04:00
Eiren Rain
f169cfd0c7 Merge pull request #5 from ButterscotchVanilla/main
Retain initial font size while zooming and display zoom level
2021-07-08 00:39:33 +03:00
ButterscotchVanilla
0e51b79775 Fix formatting 2021-07-07 10:27:42 -04:00
ButterscotchVanilla
1ee13c02d9 Retain initial font size while zooming and display zoom level 2021-07-07 10:19:55 -04:00
Eiren Rain
94829060a3 Added GUI zoom button, made default zoom level 150% instead of 200%
Minor gui refactoring
2021-07-06 23:00:10 +03:00
Eiren Rain
b790cfbd7d Fix updating waist doesn't move tracker right away 2021-07-06 22:59:15 +03:00
Eiren Rain
43bc140d42 Fix hips switching place when changing hips width 2021-07-05 17:00:33 +03:00
Eiren Rain
143cf49ce7 Added a button to switch between 3 and 1 vive trackers mode 2021-07-05 02:32:30 +03:00
Eiren Rain
a7aec873e6 Added scroll bar to the main window 2021-07-05 02:32:10 +03:00
Eiren Rain
00f2b08c84 Remove wrong window referesh 2021-07-04 21:54:08 +03:00
449 changed files with 73303 additions and 4174 deletions

View File

@@ -1,33 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" output="bin/main" path="src/main/java">
<attributes>
<attribute name="gradle_scope" value="main"/>
<attribute name="gradle_used_by_scope" value="main,test"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="bin/main" path="src/main/resources">
<attributes>
<attribute name="gradle_scope" value="main"/>
<attribute name="gradle_used_by_scope" value="main,test"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="bin/test" path="src/test/java">
<attributes>
<attribute name="gradle_scope" value="test"/>
<attribute name="gradle_used_by_scope" value="test"/>
<attribute name="test" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="bin/test" path="src/test/resources">
<attributes>
<attribute name="gradle_scope" value="test"/>
<attribute name="gradle_used_by_scope" value="test"/>
<attribute name="test" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8/"/>
<classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer"/>
<classpathentry combineaccessrules="false" kind="src" path="/Slime Java Commons"/>
<classpathentry kind="output" path="bin/default"/>
</classpath>

74
.github/workflows/build-gui.yml vendored Normal file
View File

@@ -0,0 +1,74 @@
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:
jobs:
build:
strategy:
fail-fast: false
matrix:
os: [ubuntu-20.04, windows-latest]
runs-on: ${{ matrix.os }}
env:
# Don't mark warnings as errors
CI: false
steps:
- uses: actions/checkout@v3
with:
submodules: recursive
- if: matrix.os == 'ubuntu-20.04'
name: Set up Linux dependencies
run: |
sudo apt-get update
sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf
- name: Cache cargo dependencies
uses: Swatinem/rust-cache@v2
with:
shared-key: "tauri"
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version-file: '.node-version'
cache: 'npm'
- name: Build
run: |
npm ci
npm run skipbundler
- if: matrix.os == 'windows-latest'
name: Upload a Build Artifact
uses: actions/upload-artifact@v3.1.0
with:
# Artifact name
name: SlimeVR-GUI
# A file, directory or wildcard pattern that describes what to upload
path: target/release/slimevr.exe
- if: matrix.os == 'ubuntu-20.04'
name: Upload a Build Artifact
uses: actions/upload-artifact@v3.1.0
with:
# Artifact name
name: SlimeVR-GUI-Linux
# A file, directory or wildcard pattern that describes what to upload
path: target/release/slimevr

125
.github/workflows/gradle.yaml vendored Normal file
View File

@@ -0,0 +1,125 @@
# 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:
jobs:
test:
strategy:
matrix:
os: [ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v3
with:
submodules: recursive
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: "17"
distribution: "adopt"
- name: Setup Gradle
uses: gradle/gradle-build-action@v2
- name: Check code formatting
run: ./gradlew spotlessCheck
- name: Test with Gradle
run: ./gradlew test
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
submodules: recursive
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: "17"
distribution: "adopt"
- name: Setup Gradle
uses: gradle/gradle-build-action@v2
- name: Build with Gradle
run: ./gradlew shadowJar
- name: Upload the Server JAR as a Build Artifact
uses: actions/upload-artifact@v3
with:
# Artifact name
name: "SlimeVR-Server" # optional, default is artifact
# A file, directory or wildcard pattern that describes what to upload
path: server/build/libs/*
bundle:
runs-on: ubuntu-20.04
needs: build
steps:
- uses: actions/checkout@v3
with:
submodules: recursive
- uses: actions/download-artifact@v3
with:
name: "SlimeVR-Server"
path: server/build/libs/
- name: Set up Linux dependencies
run: |
sudo apt-get update
sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf libfuse2
- name: Cache cargo dependencies
uses: Swatinem/rust-cache@v2
with:
shared-key: "tauri"
- name: Use Node.js
uses: actions/setup-node@v3
with:
node-version-file: '.node-version'
cache: 'npm'
- name: Build
run: |
npm ci
npm run tauri build
- uses: actions/upload-artifact@v3.1.0
with:
name: SlimeVR-GUI-Deb
path: target/release/bundle/deb/slimevr*.deb
- name: Install appimage-builder
run: |
wget "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage"
chmod a+x appimagetool-x86_64.AppImage
sudo mv appimagetool-x86_64.AppImage /usr/local/bin/appimagetool
- name: Modify and Build AppImage
run: |
cd target/release/bundle/appimage
chmod a+x slimevr*.AppImage
./slimevr*.AppImage --appimage-extract
cp $( git rev-parse --show-toplevel )/server/build/libs/slimevr.jar squashfs-root/slimevr.jar
chmod 644 squashfs-root/slimevr.jar
appimagetool squashfs-root slimevr*.AppImage
- uses: actions/upload-artifact@v3.1.0
with:
name: SlimeVR-GUI-AppImage
path: target/release/bundle/appimage/slimevr*.AppImage

33
.gitignore vendored
View File

@@ -1,12 +1,33 @@
# Ignore Gradle project-specific cache directory
.gradle
# Ignore Gradle build output directory
build
/bin/
# Syncthing ignore file
.stignore
MagnetoLib.dll
# Ignore .idea
.idea
# Ignore eclipse stuff
.project
.classpath
.settings
# VSCode stuff
/.vscode/settings.json
# Ignore eclipse stuff
.project
.classpath
.settings
# Node Stuff
/node_modules
.husky
# ignore gradle build folder
build/
# Rust build artifacts
/target

3
.gitmodules vendored Normal file
View File

@@ -0,0 +1,3 @@
[submodule "solarxr-protocol"]
path = solarxr-protocol
url = https://github.com/SlimeVR/SolarXR-Protocol.git

1
.node-version Normal file
View File

@@ -0,0 +1 @@
18.12.1

6
.prettierrc Normal file
View File

@@ -0,0 +1,6 @@
{
"trailingComma": "es5",
"tabWidth": 2,
"semi": true,
"singleQuote": true
}

View File

@@ -1,23 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>SlimeVR Server</name>
<comment>SlimeVR Server</comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.buildship.core.gradleprojectbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
</natures>
</projectDescription>

View File

@@ -1,2 +0,0 @@
connection.project.dir=
eclipse.preferences.version=1

View File

@@ -1,2 +0,0 @@
eclipse.preferences.version=1
encoding/<project>=UTF-8

View File

@@ -1,2 +0,0 @@
eclipse.preferences.version=1
line.separator=\r\n

View File

@@ -1,416 +0,0 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=enabled
org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.APILeak=warning
org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
org.eclipse.jdt.core.compiler.problem.deadCode=ignore
org.eclipse.jdt.core.compiler.problem.deprecation=warning
org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=info
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
org.eclipse.jdt.core.compiler.problem.forbiddenReference=info
org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=enabled
org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=error
org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=error
org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=error
org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
org.eclipse.jdt.core.compiler.problem.nullReference=error
org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=enabled
org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedImport=warning
org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning
org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
org.eclipse.jdt.core.compiler.source=1.8
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=0
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=48
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=0
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=0
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=0
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
org.eclipse.jdt.core.formatter.alignment_for_binary_expression=0
org.eclipse.jdt.core.formatter.alignment_for_compact_if=0
org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=0
org.eclipse.jdt.core.formatter.alignment_for_enum_constants=48
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=0
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=0
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=0
org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=0
org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=0
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=48
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=0
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=0
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=0
org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
org.eclipse.jdt.core.formatter.blank_lines_after_package=1
org.eclipse.jdt.core.formatter.blank_lines_before_field=0
org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
org.eclipse.jdt.core.formatter.blank_lines_before_method=1
org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
org.eclipse.jdt.core.formatter.blank_lines_before_package=0
org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=false
org.eclipse.jdt.core.formatter.comment.format_block_comments=false
org.eclipse.jdt.core.formatter.comment.format_header=false
org.eclipse.jdt.core.formatter.comment.format_html=true
org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
org.eclipse.jdt.core.formatter.comment.format_line_comments=false
org.eclipse.jdt.core.formatter.comment.format_source_code=true
org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
org.eclipse.jdt.core.formatter.comment.line_length=80
org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
org.eclipse.jdt.core.formatter.compact_else_if=true
org.eclipse.jdt.core.formatter.continuation_indentation=2
org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
org.eclipse.jdt.core.formatter.indent_empty_lines=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.join_lines_in_comments=true
org.eclipse.jdt.core.formatter.join_wrapped_lines=false
org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
org.eclipse.jdt.core.formatter.lineSplit=200
org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
org.eclipse.jdt.core.formatter.tabulation.char=tab
org.eclipse.jdt.core.formatter.tabulation.size=4
org.eclipse.jdt.core.formatter.use_on_off_tags=true
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter

View File

@@ -1,3 +0,0 @@
eclipse.preferences.version=1
formatter_profile=_Essentia
formatter_settings_version=13

15
.vscode/extensions.json vendored Normal file
View File

@@ -0,0 +1,15 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations.
// Extension identifier format: ${publisher}.${name}. Example: vscode.csharp
// List of extensions which should be recommended for users of this workspace.
"recommendations": [
"richardwillis.vscode-spotless-gradle",
"gaborv.flatbuffers",
"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode",
"rust-lang.rust-analyzer",
"bradlc.vscode-tailwindcss"
],
// List of extensions recommended by VS Code that should not be recommended for users of this workspace.
"unwantedRecommendations": []
}

84
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,84 @@
# Contributing to SlimeVR
This document describes essential knowledge for contributors to SlimeVR.
## How to get started
### Getting the code
First, clone the codebase using `git`. If you don't have `git` installed, go install it.
```bash
# Clone repositories
git clone --recursive https://github.com/SlimeVR/SlimeVR-Server.git
# Enter the directory of the codebase
cd SlimeVR-Server
```
Now you can open the codebase in your favorite IDE or text editor.
### Building the code
The code is built with `gradle`, a cli tool that manages java projects and their
dependencies. You can build the code with `./gradlew build` and run it with
`./gradlew run`.
## Code Style
Code is autoformatted with [spotless](https://github.com/diffplug/spotless/tree/main/plugin-gradle).
Code is checked for autoformatting whenever you build, but you can also run
`./gradlew spotlessCheck` if you prefer.
To autoformat your code from the command line, you can run `./gradlew spotlessApply`.
We recommend installing support for spotless in your IDE of choice, and formatting
whenever you save a file, to make things easy.
If you need to prevent autoformatting for a particular region of code, use
`// @formatter:off` and `// @formatter:on`
### Setting up spotless in VSCode
* Install the `richardwillis.vscode-spotless-gradle` extension
* Add the following to your workspace settings, at `.vscode/settings.json`:
```json
"spotlessGradle.format.enable": true,
"editor.formatOnSave": true,
"[java]": {
"editor.defaultFormatter": "richardwillis.vscode-spotless-gradle"
}
```
### Setting up spotless for IntelliJ
* Install https://plugins.jetbrains.com/plugin/18321-spotless-gradle.
* Add a keyboard shortcut for `Code` > `Reformat Code with Spotless`
* They are working on support to do this on save without a keybind
[here](https://github.com/ragurney/spotless-intellij-gradle/issues/8)
### Setting up Eclipse autoformatting
Import the formatting settings defined in `spotless.xml`, like this:
* Go to `File > Properties`, then `Java Code Style > Formatter`
* Check `Enable project specific settings`
* Click `Import`, then open `spotless.xml`, then `Apply`
* Go to `Java Editor > Save Actions`
* Select `Enable project specific settings`, `Perform the selected actions on save`,
`Format source code`, `Format all lines`
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.
### Version bumping
* Create the git tag instead of making it from releases, you can do it by just ``git tag VERSION``,
example ``git tag v0.5.0``
* You need to push this change with ``git push origin VERSION`` or ``git push origin --tags``
(will push all tags you made).
We recommend committing first and then making the tag, that tag will point to the commit you are currently
on.
## Code Licensing
SlimeVR uses an MIT license, and some parts of the project use a dual MIT/Apache 2.0
license. Be sure that any code that you reference, or dependencies you add, are
compatible with these licenses. `GPL-v3` for example is not compatible because it
requires any and all code that depends on it to *also* be licensed under `GPL-v3`.
## Discord
We use discord *a lot* to coordinate and discuss development. Come join us at
https://discord.gg/SlimeVR!

3833
Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

13
Cargo.toml Normal file
View File

@@ -0,0 +1,13 @@
[workspace]
# Use 2021 edition resolver, better resolves crate features.
resolver = "2"
# A list of all rust crates in the workspace.
members = ["gui/src-tauri"]
# These settings can be inherited by workspace members
[workspace.package]
edition = "2021"
license = "MIT OR Apache-2.0"
rust-version = "1.65" # This version stabilized GATs and let-else
repository = "https://github.com/SlimeVR/SlimeVR-Server"

201
LICENSE-APACHE Normal file
View File

@@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2022 Eiren Rain and SlimeVR Contributors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

21
LICENSE-MIT Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2022 Eiren Rain and SlimeVR Contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -5,12 +5,54 @@ Server orchestrates communication between multiple sensors and integrations, lik
Sensors implementations:
* [SlimeVR Tracker for ESP](https://github.com/SlimeVR/SlimeVR-Tracker-ESP) - ESP microcontrollers and multiple IMUs are supported
* [owoTrack Mobile App](https://github.com/abb128/owoTrackVRSyncMobile) - use phone as a tracker (limited functionality and copmatibility)
* [owoTrack Mobile App](https://github.com/abb128/owoTrackVRSyncMobile) - use phone as a tracker (limited functionality and compatibility)
Integrations:
* Use [SlimeVR OpenVR Driver](https://github.com/SlimeVR/SlimeVR-OpenVR-Driver) as a driver for SteamVR
* Integrations with other systems will be added later
## How to use
It's recommended to download installer from here: https://github.com/SlimeVR/SlimeVR-Installer/releases/latest/download/slimevr_web_installer.exe
Latest instructions are currently [here](https://gist.github.com/Eirenliel/8c0eefcdbda1076d5c2e1bf634831d20). Will be updated and republished as time goes on.
Latest instructions are [on our site](https://docs.slimevr.dev/server-setup/slimevr-setup.html).
## License Clarification
**SlimeVR software** (including server, firmware, drivers, installator, documents, and others - see
licence for each case specifically) **is distributed under the MIT License ([LICENSE-MIT])
and in some cases dually licensed under Apache-2.0 License ([LICENSE-APACHE]). These
licenses are the copyright of Eiren Rain and the SlimeVR contributors.**
**However, these Licenses have some limits, and if you wish to distribute software based
on SlimeVR, you need to be aware of them:**
* When distributing any software that uses or is based on SlimeVR, you have to provide
to the end-user at least one of the original, unmodified [LICENSE-MIT] or
[LICENSE-APACHE] files from SlimeVR. This includes the `Copyright (c) 2022 Eiren Rain
and SlimeVR Contributors` part of the license. It is insufficient to use a generic MIT
or Apache-2.0 License, **it must be the original license file**.
* This applies even if you distribute software without the source code. In this case,
one way to provide it to the end-user is to have a menu in your application that lists
all the open source licenses used, including SlimeVR's.
Please refer to the [LICENSE-MIT] and [LICENSE-APACHE] files if you are at any point
uncertain what the exact requirements are.
## Contributions
Any contributions submitted for inclusion in this repository will be dual-licensed under
either:
- MIT License ([LICENSE-MIT])
- Apache License, Version 2.0 ([LICENSE-APACHE])
Unless you explicitly state otherwise, any contribution intentionally submitted for
inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual
licensed as above, without any additional terms or conditions.
You also certify that the code you have used is compatible with those licenses or is
authored by you. If you're doing so on your work time, you certify that your employer is
okay with this and that you are authorized to provide the above licenses.
For a how-to on contributing, see [CONTRIBUTING.md](CONTRIBUTING.md).
[LICENSE-MIT]: LICENSE-MIT
[LICENSE-APACHE]: LICENSE-APACHE

View File

@@ -1,35 +0,0 @@
/*
* This file was generated by the Gradle 'init' task.
*
* This generated file contains a sample Java Library project to get you started.
* For more details take a look at the Java Libraries chapter in the Gradle
* User Manual available at https://docs.gradle.org/6.3/userguide/java_library_plugin.html
*/
plugins {
// Apply the java-library plugin to add support for Java Library
id 'java-library'
}
repositories {
// Use jcenter for resolving dependencies.
// You can declare any Maven/Ivy/file repository here.
jcenter()
mavenCentral()
}
dependencies {
// This dependency is exported to consumers, that is to say found on their compile classpath.
api 'org.apache.commons:commons-math3:3.6.1'
api 'org.yaml:snakeyaml:1.25'
api 'net.java.dev.jna:jna:5.6.0'
api 'net.java.dev.jna:jna-platform:5.6.0'
api 'com.illposed.osc:javaosc-core:0.8'
// This dependency is used internally, and not exposed to consumers on their own compile classpath.
implementation 'com.google.guava:guava:28.2-jre'
// Use JUnit test framework
testImplementation 'junit:junit:4.12'
}

8
gradle.properties Normal file
View File

@@ -0,0 +1,8 @@
# Fixes bug with spotless. See https://github.com/diffplug/spotless/issues/834#issuecomment-819118761
org.gradle.jvmargs=--add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED \
--add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED \
--add-exports jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED \
--add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED \
--add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED
kotlin.code.style=official

Binary file not shown.

View File

@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

269
gradlew vendored Normal file → Executable file
View File

@@ -1,7 +1,7 @@
#!/usr/bin/env sh
#!/bin/sh
#
# Copyright 2015 the original author or authors.
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -17,78 +17,113 @@
#
##############################################################################
##
## Gradle start up script for UN*X
##
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
APP_BASE_NAME=${0##*/}
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
MAX_FD=maximum
warn () {
echo "$*"
}
} >&2
die () {
echo
echo "$*"
echo
exit 1
}
} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
JAVACMD=$JAVA_HOME/jre/sh/java
else
JAVACMD="$JAVA_HOME/bin/java"
JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -97,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
@@ -105,79 +140,95 @@ location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"

22
gradlew.bat vendored
View File

@@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@@ -54,7 +54,7 @@ goto fail
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
@@ -64,28 +64,14 @@ echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell

40
gui/.eslintrc.json Normal file
View File

@@ -0,0 +1,40 @@
{
"env": {
"browser": true,
"es2021": true,
"jest": true
},
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended",
"prettier"
],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaFeatures": {
"jsx": true
},
"ecmaVersion": "latest",
"sourceType": "module"
},
"plugins": ["react-hooks", "@typescript-eslint", "prettier"],
"rules": {
"react/react-in-jsx-scope": "off",
"react/prop-types": "off",
"spaced-comment": "error",
"quotes": ["error", "single"],
"no-duplicate-imports": "error",
"no-inline-styles": "off",
"@typescript-eslint/no-explicit-any": "off",
"react/no-unescaped-entities": "off",
"prettier/prettier": "warn"
},
"settings": {
"import/resolver": {
"typescript": {}
},
"react": {
"version": "detect"
}
}
}

1
gui/.gitattributes vendored Normal file
View File

@@ -0,0 +1 @@
* text=auto eol=lf

29
gui/.gitignore vendored Normal file
View File

@@ -0,0 +1,29 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# JS/TS dependencies
/node_modules
/.pnp
.pnp.js
# testing
/coverage
# Build artifacts
/build
/target
# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*
*.log
/dist

6
gui/LICENSE.md Normal file
View File

@@ -0,0 +1,6 @@
This directory and all subdirectories are dual-licensed under either
* MIT License ([/LICENSE-MIT](/LICENSE-MIT))
* Apache License, Version 2.0 ([/LICENSE-APACHE](/LICENSE-APACHE))
at your option.

30
gui/README.md Normal file
View File

@@ -0,0 +1,30 @@
# SlimeVR UI
This is the GUI of SlimeVR, it uses the SolarXR protocol to communicate with the server and is completely isolated from the server logic.
This project is written in Typescript + React for the frontend and uses Tauri + Rust as a small backend. This makes the application more lightweight than electron.
## Compiling
### Prerequisites
- [Node.js](https://nodejs.org) 16 (We recommend the use of `nvm` instead of installing Node.js directly)
- Windows Webview
- SlimeVR server installed
- [Rust](https://rustup.rs)
```
npm install
```
Build for production
```
npm run tauri build
```
Launch in dev mode
```
npm run tauri dev
```

20
gui/index.html Normal file
View File

@@ -0,0 +1,20 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="theme-color" content="#000000" />
<link rel="apple-touch-icon" href="/logo192.png" />
<link rel="manifest" href="/manifest.json" />
<title>React App</title>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
<script type="module" src="/src/index.tsx"></script>
</body>
</html>

93
gui/package.json Normal file
View File

@@ -0,0 +1,93 @@
{
"name": "slimevr-ui",
"version": "0.5.1",
"private": true,
"dependencies": {
"@fluent/bundle": "^0.17.1",
"@fluent/react": "^0.14.1",
"@fontsource/poppins": "^4.5.8",
"@formatjs/intl-localematcher": "^0.2.32",
"@tauri-apps/api": "^1.2.0",
"@vitejs/plugin-react": "^3.0.0",
"browserslist": "^4.18.1",
"camelcase": "^6.2.1",
"classnames": "^2.3.1",
"dotenv": "^10.0.0",
"dotenv-expand": "^5.1.0",
"eslint-config-react-app": "^7.0.0",
"file-loader": "^6.2.0",
"flatbuffers": "^22.10.26",
"fs-extra": "^10.0.0",
"identity-obj-proxy": "^3.0.0",
"intl-pluralrules": "^1.3.1",
"ip-num": "^1.4.1",
"postcss-flexbugs-fixes": "^5.0.2",
"postcss-normalize": "^10.0.1",
"postcss-preset-env": "^7.0.1",
"prompts": "^2.4.2",
"quaternion": "^1.4.0",
"react": "^18.0.0",
"react-dev-utils": "^12.0.0",
"react-dom": "^18.0.0",
"react-hook-form": "^7.29.0",
"react-modal": "3.15.1",
"react-router-dom": "^6.2.2",
"semver": "^7.3.5",
"solarxr-protocol": "file:../solarxr-protocol",
"typescript": "^4.6.3"
},
"scripts": {
"start": "vite --force",
"build": "vite build",
"dev": "tauri dev",
"skipbundler": "tauri build -b none",
"tauri": "tauri",
"lint": "eslint src/**/*.{js,jsx,ts,tsx,json}",
"lint:fix": "eslint --fix src/**/*.{js,jsx,ts,tsx,json}",
"format": "prettier --write src/**/*.{js,jsx,ts,tsx,css,md,json} --config ./.prettierrc",
"preview-vite": "vite preview",
"javaversion-build": "cd src-tauri/src/ && javac JavaVersion.java && jar cvfe JavaVersion.jar JavaVersion JavaVersion.class"
},
"eslintConfig": {
"extends": [
"react-app"
]
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
},
"devDependencies": {
"@tailwindcss/forms": "^0.5.0",
"@tauri-apps/cli": "^1.2.2",
"@types/react": "18.0.25",
"@types/react-dom": "^18.0.5",
"@types/react-modal": "3.13.1",
"@typescript-eslint/eslint-plugin": "^5.43.0",
"@typescript-eslint/parser": "^5.43.0",
"autoprefixer": "^10.4.4",
"cross-env": "^7.0.3",
"eslint": "^8.18.0",
"eslint-config-airbnb": "^19.0.4",
"eslint-config-prettier": "^8.5.0",
"eslint-import-resolver-typescript": "^3.1.1",
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-jsx-a11y": "^6.6.0",
"eslint-plugin-prettier": "^4.1.0",
"eslint-plugin-react": "^7.30.1",
"eslint-plugin-react-hooks": "^4.6.0",
"postcss": "^8.4.12",
"prettier": "^2.7.1",
"pretty-quick": "^3.1.3",
"tailwindcss": "^3.0.23",
"vite": "^4.0.3"
}
}

6
gui/postcss.config.cjs Normal file
View File

@@ -0,0 +1,6 @@
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
};

BIN
gui/public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

View File

@@ -0,0 +1,519 @@
### SlimeVR complete GUI translations
# Please developers (not translators) don't reuse a key inside another key
# or concat text with a translation string in the code, use the appropriate
# features like variables and selectors in each appropriate case!
# And also comment the string if it's something not easy to translate, so you help
# translators on what it means
## Websocket (server) status
websocket-connecting = weconnyecting to teh sewvew
websocket-connection_lost = oopsie woopsie~ connyection wost to teh sewvew ;m;... uwu am twying to weconnyect owo!
## Tips
tips-find_tracker = nawt suwe whicsh twayckyaw is whicsh? shayke a twackaw and it will hyighwight the cowowesponding iytem.
tips-do_not_move_heels = ensuwe yoowr pawsies do nawt mowve duwing wecowding! ^w^
## Body parts
body_part-NONE = unassyigned
body_part-HEAD = hed
body_part-NECK = nyecky wecky
body_part-RIGHT_SHOULDER = wight shouwder~
body_part-RIGHT_UPPER_ARM = wight uppew awm
body_part-RIGHT_LOWER_ARM = wight wowwe awm
body_part-RIGHT_HAND = wight pawb
body_part-RIGHT_UPPER_LEG = wight uppew weg
body_part-RIGHT_LOWER_LEG = wight wowwe weg
body_part-RIGHT_FOOT = wight pawb
body_part-RIGHT_CONTROLLER = wight wontwolew
body_part-CHEST = chwest
body_part-WAIST = wyayst
body_part-HIP = hyip
body_part-LEFT_SHOULDER = weft shouwder~
body_part-LEFT_UPPER_ARM = weft uppew awm
body_part-LEFT_LOWER_ARM = weft wowwe awm
body_part-LEFT_HAND = weft pawb
body_part-LEFT_UPPER_LEG = weft uppew weg
body_part-LEFT_LOWER_LEG = weft wowwe weg
body_part-LEFT_FOOT = weft pawb
body_part-LEFT_CONTROLLER = weft wontwolew
## Skeleton stuff
skeleton_bone-NONE = none
skeleton_bone-HEAD = hed shyft
skeleton_bone-NECK = nyeck wength
skeleton_bone-TORSO = towso wength
skeleton_bone-CHEST = chwest disyance
skeleton_bone-WAIST = weyst disyance
skeleton_bone-HIP_OFFSET = hyip awfset
skeleton_bone-HIPS_WIDTH = hyips wiwdth
skeleton_bone-LEGS_LENGTH = wegs wength
skeleton_bone-KNEE_HEIGHT = knyee heiyt
skeleton_bone-FOOT_LENGTH = pawsies wength
skeleton_bone-FOOT_SHIFT = pawsies shyft
skeleton_bone-SKELETON_OFFSET = skeweton awfset
skeleton_bone-CONTROLLER_DISTANCE_Z = cyontwowla disance z
skeleton_bone-CONTROLLER_DISTANCE_Y = cyontwowla disance y
skeleton_bone-FOREARM_LENGTH = fowewawm disyance
skeleton_bone-SHOULDERS_DISTANCE = shouwdews disyance
skeleton_bone-SHOULDERS_WIDTH = shouwdews wiwdth
skeleton_bone-UPPER_ARM_LENGTH = uppew awm wength
skeleton_bone-ELBOW_OFFSET = ewbow awfsewt
## Tracker reset buttons
reset-reset_all = weset aww pwopowtions~
reset-full = weset~
reset-mounting = weset meownting
reset-quick = quick weset
## Serial detection stuff
serial_detection-new_device-p0 = nyu sewiaw device detected~!
serial_detection-new_device-p1 = entaw youw wifi cwedentiaws~!
serial_detection-new_device-p2 = pwease sewect what youw want to do wit it
serial_detection-open_wifi = cownnyect to wyfy~
serial_detection-open_serial = awpen sewiaw console >w<
serial_detection-submit = suwbmyt~!
serial_detection-close = cwose
## Navigation bar
navbar-home = howme
navbar-body_proportions = body pwopowshons
navbar-trackers_assign = twackaws assigwment
navbar-mounting = meownting calibwation
navbar-onboarding = suwep wisawd
navbar-settings = sewtings
## Bounding volume hierarchy recording
bvh-start_recording = wecowd bvh
bvh-recording = wecowding...
## Overlay settings
overlay-is_visible_label = show owovelay in steawmvr
overlay-is_mirrored_label = dispway owovelay as miwwow
## Tracker status
tracker-status-none = no stawtus
tracker-status-busy = busy
tracker-status-error = ewwow
tracker-status-disconnected = disconnyected
tracker-status-occluded = occwuded
tracker-status-ok = oki
## Tracker status columns
tracker-table-column-name = nayme
tracker-table-column-type = type
tracker-table-column-battery = battewy
tracker-table-column-ping = pyng
tracker-table-column-rotation = wotaytion x/y/z
tracker-table-column-position = pawsytion x/y/z
tracker-table-column-url = uawl
## Tracker rotation
tracker-rotation-front = fwowt
tracker-rotation-left = lewft
tracker-rotation-right = wight
tracker-rotation-back = bak
## Tracker information
tracker-infos-manufacturer = mawufactuwer
tracker-infos-display_name = dispway name
tracker-infos-custom_name = custowm name
tracker-infos-url = twackaw uawl
## Tracker settings
tracker-settings-back = go bak to twackaws liwst
tracker-settings-title = twackaw sewtings
tracker-settings-assignment_section = assiwnment
tracker-settings-assignment_section-description = what pawt of the bawdy the twackaw is assiwned to uwu
tracker-settings-assignment_section-edit = ewdit assiwnment
tracker-settings-mounting_section = meownting pawsition
tracker-settings-mounting_section-description = whewe is the twackaw mownted?
tracker-settings-mounting_section-edit = edit meownting
tracker-settings-drift_compensation_section = awwow dwift compensation
tracker-settings-drift_compensation_section-description = shouwd this twackew compensate fow its dwift when dwift compensation is enabwed?
tracker-settings-drift_compensation_section-edit = awwow dwift compensation
# The .<name> means it's an attribute and it's related to the top key.
# In this case that is the settings for the assignment section.
tracker-settings-name_section = twackaw name
tracker-settings-name_section-description = owo whats dis?
tracker-settings-name_section-placeholder = ewimewl's weft pawb
## Tracker part card info
tracker-part_card-no_name = no name
tracker-part_card-unassigned = unassigwed
## Body assignment menu
body_assignment_menu = whewe doo yew want dis twayckaw to be?? >~>
body_assignment_menu-description = chooce a wocation whewe yew want dis twayckaw to be assyigned. awtwernativewy, yew can chooce to manage awl twackaws at ownce instawd of won by won.
body_assignment_menu-show_advanced_locations = show advawnced assyign wocations
body_assignment_menu-manage_trackers = manage awl twackaws
body_assignment_menu-unassign_tracker = unassyign twayckaw
## Tracker assignment menu
# A -translation_key (with a dash in the front) means that it's a label.
# It can only be used in the translation file, it's nice for reusing names and that kind of stuff.
#
# We are using it here because english doesn't require changing the text in each case but
# maybe your language does.
-tracker_selection-part = Which tracker to assign to your
tracker_selection_menu-NONE = Which tracker do you want to be unassigned?
tracker_selection_menu-HEAD = { -tracker_selection-part } head?
tracker_selection_menu-NECK = { -tracker_selection-part } neck?
tracker_selection_menu-RIGHT_SHOULDER = { -tracker_selection-part } right shoulder?
tracker_selection_menu-RIGHT_UPPER_ARM = { -tracker_selection-part } right upper arm?
tracker_selection_menu-RIGHT_LOWER_ARM = { -tracker_selection-part } right lower arm?
tracker_selection_menu-RIGHT_HAND = { -tracker_selection-part } right hand?
tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } right thigh?
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } right ankle?
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } right foot?
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } right controller?
tracker_selection_menu-CHEST = { -tracker_selection-part } chest?
tracker_selection_menu-WAIST = { -tracker_selection-part } waist?
tracker_selection_menu-HIP = { -tracker_selection-part } hip?
tracker_selection_menu-LEFT_SHOULDER = { -tracker_selection-part } left shoulder?
tracker_selection_menu-LEFT_UPPER_ARM = { -tracker_selection-part } left upper arm?
tracker_selection_menu-LEFT_LOWER_ARM = { -tracker_selection-part } left lower arm?
tracker_selection_menu-LEFT_HAND = { -tracker_selection-part } left hand?
tracker_selection_menu-LEFT_UPPER_LEG = { -tracker_selection-part } left thigh?
tracker_selection_menu-LEFT_LOWER_LEG = { -tracker_selection-part } left ankle?
tracker_selection_menu-LEFT_FOOT = { -tracker_selection-part } left foot?
tracker_selection_menu-LEFT_CONTROLLER = { -tracker_selection-part } left controller?
tracker_selection_menu-unassigned = unassyigned twackaws
tracker_selection_menu-assigned = assyigned twackaws
tracker_selection_menu-dont_assign = do nawt assyign
## Mounting menu
mounting_selection_menu = whewe doo yew want dis twayckaw to be?
mounting_selection_menu-close = cwose
## Sidebar settings
settings-sidebar-title = settyings~
settings-sidebar-general = genyawaw
settings-sidebar-tracker_mechanics = twayckaw mechanics~
settings-sidebar-fk_settings = fk settyings
settings-sidebar-gesture_control = Gesture control
settings-sidebar-interface = intyawface~
settings-sidebar-osc_router = OSC wouwter
settings-sidebar-utils = utiwities
settings-sidebar-serial = sewiaw cownsaw
## SteamVR settings
settings-general-steamvr = steamvr~
settings-general-steamvr-subtitle = steamvr twayckaws~
# Not all translation keys support multiline, only the ones that specify it will actually
# split it in lines (that also means you can split in lines however you want in those).
# The first spaces (not tabs) for indentation will be ignored, just to make the file look nice when writing.
# This one is one of this cases that cares about multilines
settings-general-steamvr-description =
enyable or dysabywe specific twacking pawts.
usefuw if yew want mowwe contwoww owew what swimevr does.
settings-general-steamvr-trackers-waist = wyayst
settings-general-steamvr-trackers-chest = chwest
settings-general-steamvr-trackers-feet = pawbsies~
settings-general-steamvr-trackers-knees = knyees~
settings-general-steamvr-trackers-elbows = ewbows~
settings-general-steamvr-trackers-hands = Hands
## Tracker mechanics
settings-general-tracker_mechanics = twayckaw mechanics~
settings-general-tracker_mechanics-filtering = fiwtering~
# This also cares about multilines
settings-general-tracker_mechanics-filtering-description =
chooce teh fiwwtewing type fow youw twackaws.
pwediction pwedicts movment while smowthing smowthens movment.
settings-general-tracker_mechanics-filtering-type = fiwtewing type~
settings-general-tracker_mechanics-filtering-type-none = no fiwwtewing~
settings-general-tracker_mechanics-filtering-type-none-description = use wowtations as is. wiw nawt do any fiwwtewing.
settings-general-tracker_mechanics-filtering-type-smoothing = smowthing
settings-general-tracker_mechanics-filtering-type-smoothing-description = smowthes movements but adds some watency~
settings-general-tracker_mechanics-filtering-type-prediction = pwediction~
settings-general-tracker_mechanics-filtering-type-prediction-description = wowduces wowcyancy and makes wowvements mowe wowappy, but may incwease jiwitty
settings-general-tracker_mechanics-filtering-amount = amownt
settings-general-tracker_mechanics-drift_compensation = dwift compensation
# This cares about multilines
settings-general-tracker_mechanics-drift_compensation-description =
compensates imu yaw dwift by appwying an invewse wotation.
change amownt of compensation and how many wesets awe taken into accouwnt.
settings-general-tracker_mechanics-drift_compensation-enabled-label = dwift compensation
settings-general-tracker_mechanics-drift_compensation-amount-label = compensation amownt
settings-general-tracker_mechanics-drift_compensation-max_resets-label = nuwmbew of wesets uwsed
## FK/Tracking settings
settings-general-fk_settings = fk sewttings
settings-general-fk_settings-leg_tweak = leg tweeks
settings-general-fk_settings-leg_tweak-description = floo-cwip can wowduce owow even ewiminates cwipping with teh fwoor but may cause pwobweems when on yowur neeys. skayting-cowwection cowwects fow wowce skating, but can wowcyancy accuwowacy in cewtain wowvement wowttewns.
# 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 = fwoow cwip
# 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)
# definition - Guesses when each foot is in contact with the ground and uses that information to improve tracking
settings-general-fk_settings-leg_tweak-skating_correction = skayting wowcowwection
settings-general-fk_settings-leg_tweak-skating_correction-amount = Skating correction strength
settings-general-fk_settings-arm_fk = awm fk
settings-general-fk_settings-arm_fk-description = chawnge teh way teh awms awe twacked.
settings-general-fk_settings-arm_fk-force_arms = fowce awms fwom hmd
settings-general-fk_settings-skeleton_settings = skeweton sewttings
settings-general-fk_settings-skeleton_settings-description = toggwe skeweton sewttings on owow off. is wowcommended to weawve these on~
settings-general-fk_settings-skeleton_settings-extended_spine = ewtended spine
settings-general-fk_settings-skeleton_settings-extended_pelvis = ewtended pelvis
settings-general-fk_settings-skeleton_settings-extended_knees = ewtended neey
settings-general-fk_settings-vive_emulation-title = Vive emulation
settings-general-fk_settings-vive_emulation-description = Emulate the waist tracker problems that Vive trackers have. This is a joke and makes tracking worse.
settings-general-fk_settings-vive_emulation-label = Enable Vive emulation
## Gesture control settings (tracker tapping)
settings-general-gesture_control = gestauw cantwol
settings-general-gesture_control-subtitle = bap bwased wesets
settings-general-gesture_control-description = allaws owr wesets wo be twiggered by wapping a twackaw. The twackaw hyighest wup on youwur twursuu is uwued for qwick weset, wa twackaw hyighest up on youwur weft weg is uwused for weset, and teh twackaw hyighest up on youwur wight weg is used for mmountwing weset. It showold we wentioned what waps muwst happen within 0.6 seconds wo be wegistered
# This is a unit: 3 taps, 2 taps, 1 tap
# $amount (Number) - Amount of taps (touches to the tracker's case)
settings-general-gesture_control-taps = { $amount ->
[one] 1 bap
*[other] { $amount } baps
}
settings-general-gesture_control-quickResetEnabled = enable wap to quwuick weset
settings-general-gesture_control-quickResetDelay = quwuick weset deway
settings-general-gesture_control-quickResetTaps = baps for quwuick weset
settings-general-gesture_control-resetEnabled = enable wap to weset
settings-general-gesture_control-resetDelay = weset deway
settings-general-gesture_control-resetTaps = baps for weset
settings-general-gesture_control-mountingResetEnabled = enable wap to weset mountwing
settings-general-gesture_control-mountingResetDelay = mountwing weset deway
settings-general-gesture_control-mountingResetTaps = baps for mountwing weset
## Interface settings
settings-general-interface = intewface
settings-general-interface-dev_mode = devwowwewow mode
settings-general-interface-dev_mode-description = this mode can be wowseffuw if you need in-dipth data owow to intewact with cownnected twackaws on a wowowe wowadvanced wowwevew
settings-general-interface-dev_mode-label = devwowwewow mode
settings-general-interface-serial_detection = shewyaw device deteccion
settings-general-interface-serial_detection-description = this option will shaww a pawp-up evewy time yuw pwug a new shewyaw device that cawwld be a twayckaw. it helps iympwooving teh setup pwocess of a twayckaw
settings-general-interface-serial_detection-label = shewyaw device deteccion
settings-general-interface-lang = sewect wanguage
settings-general-interface-lang-description = change the defawwt wanguage yuw want to use
settings-general-interface-lang-placeholder = sewect teh wanguage to use
## Serial settings
settings-serial = shewyaw console
# This cares about multilines
settings-serial-description =
this is a wiwve infowmation feed fow shewyaw comyunicaytion
may be usefuw if yuw need to know teh fiwmwawe is acting up
settings-serial-connection_lost = connyection to shewyaw wost, weconnyecting... >~<
settings-serial-reboot = weboot
settings-serial-factory_reset = fawctowy reset
settings-serial-get_infos = get infows
settings-serial-serial_select = sewect a shewyaw pawt
settings-serial-auto_dropdown_item = awto
## OSC router settings
settings-osc-router = OSC wouwter
# This cares about multilines
settings-osc-router-description =
fowwawd osc messages fwom anothew pwogwam
usefuww fow uwsing anothew osc pwogwam with VRChat fow exampwe
settings-osc-router-enable = enaybwe
settings-osc-router-enable-description = toggle teh fowwawding of data
settings-osc-router-enable-label = enaybwe
settings-osc-router-network = network pawts
# This cares about multilines
settings-osc-router-network-description =
set the pawts fow wistening awnd sending data
these can be the same as othew powts uwsed in the swimevr sewvew
settings-osc-router-network-port_in =
.label = pawt in
.placeholder = pawt in (defawwt: 9002)
settings-osc-router-network-port_out =
.label = pawt out
.placeholder = pawt out (defawwt: 9000)
settings-osc-router-network-address = network addwess
settings-osc-router-network-address-description = choose which addwess to send out data at
settings-osc-router-network-address-placeholder = IPV4 addwess
## OSC VRChat settings
settings-osc-vrchat = VRChat OSC Trackers
# This cares about multilines
settings-osc-vrchat-description =
change vwchat-specific settwings to wweceive hmd data awnd send
twayckaws data fow fbt (wawwks on quest standalone).
settings-osc-vrchat-enable = enaybwe
settings-osc-vrchat-enable-description = toggle teh sending awnd wweceiving of data
settings-osc-vrchat-enable-label = enaybwe
settings-osc-vrchat-network = network pawts
settings-osc-vrchat-network-description = set the pawts fow wistening awnd sending data to vwchawt
settings-osc-vrchat-network-port_in =
.label = pawt in
.placeholder = pawt in (defawwt: 9001)
settings-osc-vrchat-network-port_out =
.label = pawt out
.placeholder = pawt out (defawwt: 9000)
settings-osc-vrchat-network-address = network addwess
settings-osc-vrchat-network-address-description = choose which addwess to send out data to vwchat (check yuw wifi settwings on yuw device)
settings-osc-vrchat-network-address-placeholder = vwchat ip addwess
settings-osc-vrchat-network-trackers = trayckawws
settings-osc-vrchat-network-trackers-description = toggle teh sending of spweciwic twackers viwa OSC
settings-osc-vrchat-network-trackers-chest = chest
settings-osc-vrchat-network-trackers-waist = wayst
settings-osc-vrchat-network-trackers-knees = knees
settings-osc-vrchat-network-trackers-feet = pawbs
settings-osc-vrchat-network-trackers-elbows = elbows
## Setup/onboarding menu
onboarding-skip = skipy setup
onboarding-continue = continyue
onboarding-wip = wowwk in pwowgress
## WiFi setup
onboarding-wifi_creds-back = gaww bawwk to intwoduction
onboarding-wifi_creds = input wifi cwedentials
# This cares about multilines
onboarding-wifi_creds-description =
teh twawckaws will use these cwedentials to connect wirelessly
pwease use teh cwedentials that yaww awe cwowently cownyected to
onboarding-wifi_creds-skip = skipy wifi settiwyngs
onboarding-wifi_creds-submit = suwbmyt!
onboarding-wifi_creds-ssid =
.label = SSID
.placeholder = Enter SSID
onboarding-wifi_creds-password =
.label = Password
.placeholder = Enter password
## Mounting setup
onboarding-reset_tutorial-back = gaww bawwk to meownting cawwibwation
onboarding-reset_tutorial = weset tutowial
onboarding-reset_tutorial-description = dis featuwe isn't done, just pwess continyue
## Setup start
onboarding-home = wewcome to swimevr
# This cares about multilines and it's centered!!
onboarding-home-description =
bwinging fuww-bawdy twacking
to everyone
onboarding-home-start = wets get set up!
## Enter VR part of setup
onboarding-enter_vr-back = gaww bawwk to twacker assignyment
onboarding-enter_vr-title = time to entew vr!
onboarding-enter_vr-description = put on awe yoaww twackaws and then entew vr!
onboarding-enter_vr-ready = iym ready
## Setup done
onboarding-done-title = yaww awe awe set!
onboarding-done-description = enjoy yoaww fuww body expewwience
onboarding-done-close = cwose the guide
## Tracker connection setup
onboarding-connect_tracker-back = gaww bawwk to wifi cwedentials
onboarding-connect_tracker-title = connect twackaws
onboarding-connect_tracker-description-p0 = now onto teh fun pawwt, connecting awe teh twackaws!
onboarding-connect_tracker-description-p1 = simply connect awe that awe nawt cownyected yet, through a usb powwt.
onboarding-connect_tracker-issue-serial = i'm having twouble connecting!
onboarding-connect_tracker-usb = usb twacker
onboarding-connect_tracker-connection_status-connecting = sending wifi cwedentials
onboarding-connect_tracker-connection_status-connected = cownyected to wifi
onboarding-connect_tracker-connection_status-error = unabwe to cownyect to wifi
onboarding-connect_tracker-connection_status-start_connecting = wooking for twackaws
onboarding-connect_tracker-connection_status-handshake = cownyected to teh sewvew
# $amount (Number) - Amount of trackers connected (this is a number, but you can use CLDR plural rules for your language)
# More info on https://www.unicode.org/cldr/cldr-aux/charts/22/supplemental/language_plural_rules.html
# English in this case only has 2 plural rules, which are "one" and "other",
# we use 0 in an explicit way because there is no plural rule in english for 0, so we directly say
# if $amount is 0 then we say "No trackers connected"
onboarding-connect_tracker-connected_trackers = { $amount ->
[0] no twackers
[one] 1 twackers
*[other] { $amount } twackers
} cownyected
onboarding-connect_tracker-next = i cownyected awe my twackaws
## Tracker assignment setup
onboarding-assign_trackers-back = go bak to wifi credyentials
onboarding-assign_trackers-title = assign twackaws
onboarding-assign_trackers-description = wets choyse which twackaw goes whewe. cwick on a wocation whewe yowo want to payce a twackaw
# 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
onboarding-assign_trackers-assigned = { $assigned } of { $trackers ->
[one] 1 twackaws
*[other] { $trackers } twackaws
} assigned
onboarding-assign_trackers-advanced = show advanced assign wocations
onboarding-assign_trackers-next = i assigned awe the twackaws
## Tracker manual mounting setup
onboarding-manual_mounting-back = go bak to entaw vawe
onboarding-manual_mounting = manual meownting
onboarding-manual_mounting-description = cwick on evewy twackaw and sewect which way they awe mownted
onboarding-manual_mounting-auto_mounting = awtomawic meownting
onboarding-manual_mounting-next = newt stewp
## Tracker automatic mounting setup
onboarding-automatic_mounting-back = go bak to entaw vawe
onboarding-automatic_mounting-title = meownting cawibwation
onboarding-automatic_mounting-description = fow SlimeVR twackaws to wowk, we need to assign a meownting wowation to yowo twackaws to awign them with yowo pwysical twackaw mounting.
onboarding-automatic_mounting-manual_mounting = manually set meownting
onboarding-automatic_mounting-next = next step
onboarding-automatic_mounting-prev_step = pwevious step
onboarding-automatic_mounting-done-title = mounting wowations cawibwated.
onboarding-automatic_mounting-done-description = yowo meownting cawibwation is compwete!
onboarding-automatic_mounting-done-restart = weturn to start
onboarding-automatic_mounting-mounting_reset-title = meownting weset
onboarding-automatic_mounting-mounting_reset-step-0 = 1. squawt in a "skiing" pose with yowo wegs bent, yowo upper body tilted fowwawds, and yowo awems bent.
onboarding-automatic_mounting-mounting_reset-step-1 = 2. pwess the "weset meownting" button and wait fow 3 seconds befowe the twackaws' meownting wowations will weset.
onboarding-automatic_mounting-preparation-title = pwepairation
onboarding-automatic_mounting-preparation-step-0 = 1. stand upwight with yowo awems to yowo sides.
onboarding-automatic_mounting-preparation-step-1 = 2. pwess the "weset" button and wait fow 3 seconds befowe the twackaws will weset.
onboarding-automatic_mounting-put_trackers_on-title = put on yowo twackaws
onboarding-automatic_mounting-put_trackers_on-description = to cawibwate meownting wowations, we'we gonna use the twackaws yowo just assigned. put on awe yowo twackaws, yowo can see which awe which in the figure to the wowight.
onboarding-automatic_mounting-put_trackers_on-next = i haff awe my twackaws on
## Tracker manual proportions setup
onboarding-manual_proportions-back = go bawck to weset tutowiaw
onboarding-manual_proportions-title = manyuaw bodee pwopowtiesions
onboarding-manual_proportions-precision = pwecision adjusty
onboarding-manual_proportions-auto = owtomatic cawybwation
## Tracker automatic proportions setup
onboarding-automatic_proportions-back = go bawck to weweset tutowiaw
onboarding-automatic_proportions-title = measuwe yowuw bodee
onboarding-automatic_proportions-description = fow swimevw twackaws to wowk, we need to know teh wowkty of yowuw bones. dis showt cawybwation will measuwe it fow yowu
onboarding-automatic_proportions-manual = manyuaw cawybwation
onboarding-automatic_proportions-prev_step = pwevious stwep
onboarding-automatic_proportions-put_trackers_on-title = put on yowuw twackaws
onboarding-automatic_proportions-put_trackers_on-description = to cawybwate yowuw pwopowtiesions, we'we gonna use teh twackaws yowu just assigned. put on awl yowuw twackaws, yowu can see which awe which in teh figuwe to teh wowight.
onboarding-automatic_proportions-put_trackers_on-next = i have awl my twackaws on
onboarding-automatic_proportions-preparation-title = pwepawation
onboarding-automatic_proportions-preparation-description = pwace a chayaw diwectly behind yowu inside yowuw pway spawce. be pwepawed to sit down duwing teh owtobone setyup.
onboarding-automatic_proportions-preparation-next = i am in fwont of a chayaw
onboarding-automatic_proportions-start_recording-title = get wowdy to move
onboarding-automatic_proportions-start_recording-description = we'we now going to wowcawd some specific poses and moves. these will be pwompted in teh wowst screen. be wowdy to stawt when teh buttawn is pwessed!
onboarding-automatic_proportions-start_recording-next = stawt wowcawding
onboarding-automatic_proportions-recording-title = wowcawd
onboarding-automatic_proportions-recording-description-p0 = wowcawding in pwowgress...
onboarding-automatic_proportions-recording-description-p1 = make teh moves shown bowow:
onboarding-automatic_proportions-recording-steps-0 = bend knees a few times.
onboarding-automatic_proportions-recording-steps-1 = sit on a chayaw then stawnd up.
onboarding-automatic_proportions-recording-steps-2 = twist upwe wowdy wowft, then bend wowft.
onboarding-automatic_proportions-recording-steps-3 = twist upwe wowdy wowight, then bend wowight.
onboarding-automatic_proportions-recording-steps-4 = wiggy aweound until tymey ends.
onboarding-automatic_proportions-recording-processing = pwowcessing teh wowesult
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 15)
onboarding-automatic_proportions-recording-timer = { $time ->
[one] 1 second wowft
*[other] { $time } secondsy wowft
}
onboarding-automatic_proportions-verify_results-title = vewify wowesults
onboarding-automatic_proportions-verify_results-description = check teh wewesults below, do tehy weok coowect?
onboarding-automatic_proportions-verify_results-results = wecowding wewesults
onboarding-automatic_proportions-verify_results-processing = pwocessing teh wewesult
onboarding-automatic_proportions-verify_results-redo = wedo wecowding
onboarding-automatic_proportions-verify_results-confirm = tehywee coowect
onboarding-automatic_proportions-done-title = bawdy meowsured anwd sayved uwu
onboarding-automatic_proportions-done-description = yoww body pwopowwtions cawybowwation is cowowplete! ^w^
## Home
home-no_trackers = no twackaws detecyted owo wowigned

View File

@@ -0,0 +1,519 @@
### SlimeVR complete GUI translations
# Please developers (not translators) don't reuse a key inside another key
# or concat text with a translation string in the code, use the appropriate
# features like variables and selectors in each appropriate case!
# And also comment the string if it's something not easy to translate, so you help
# translators on what it means
## Websocket (server) status
websocket-connecting = Connecting to the server
websocket-connection_lost = Connection lost to the server. Trying to reconnect...
## Tips
tips-find_tracker = Not sure which tracker is which? Shake a tracker and it will highlight the corresponding item.
tips-do_not_move_heels = Ensure your heels do not move during recording!
## Body parts
body_part-NONE = Unassigned
body_part-HEAD = Head
body_part-NECK = Neck
body_part-RIGHT_SHOULDER = Right shoulder
body_part-RIGHT_UPPER_ARM = Right upper arm
body_part-RIGHT_LOWER_ARM = Right lower arm
body_part-RIGHT_HAND = Right hand
body_part-RIGHT_UPPER_LEG = Right thigh
body_part-RIGHT_LOWER_LEG = Right ankle
body_part-RIGHT_FOOT = Right foot
body_part-RIGHT_CONTROLLER = Right controller
body_part-CHEST = Chest
body_part-WAIST = Waist
body_part-HIP = Hip
body_part-LEFT_SHOULDER = Left shoulder
body_part-LEFT_UPPER_ARM = Left upper arm
body_part-LEFT_LOWER_ARM = Left lower arm
body_part-LEFT_HAND = Left hand
body_part-LEFT_UPPER_LEG = Left thigh
body_part-LEFT_LOWER_LEG = Left ankle
body_part-LEFT_FOOT = Left foot
body_part-LEFT_CONTROLLER = Left controller
## Skeleton stuff
skeleton_bone-NONE = None
skeleton_bone-HEAD = Head Shift
skeleton_bone-NECK = Neck Length
skeleton_bone-TORSO = Torso Length
skeleton_bone-CHEST = Chest Distance
skeleton_bone-WAIST = Waist Distance
skeleton_bone-HIP_OFFSET = Hip Offset
skeleton_bone-HIPS_WIDTH = Hips Width
skeleton_bone-LEGS_LENGTH = Legs Length
skeleton_bone-KNEE_HEIGHT = Knee Height
skeleton_bone-FOOT_LENGTH = Foot Length
skeleton_bone-FOOT_SHIFT = Foot Shift
skeleton_bone-SKELETON_OFFSET = Skeleton Offset
skeleton_bone-CONTROLLER_DISTANCE_Z = Controller Distance Z
skeleton_bone-CONTROLLER_DISTANCE_Y = Controller Distance Y
skeleton_bone-FOREARM_LENGTH = Forearm Distance
skeleton_bone-SHOULDERS_DISTANCE = Shoulders Distance
skeleton_bone-SHOULDERS_WIDTH = Shoulders Width
skeleton_bone-UPPER_ARM_LENGTH = Upper Arm Length
skeleton_bone-ELBOW_OFFSET = Elbow Offset
## Tracker reset buttons
reset-reset_all = Reset all proportions
reset-full = Reset
reset-mounting = Reset Mounting
reset-quick = Quick Reset
## Serial detection stuff
serial_detection-new_device-p0 = New serial device detected!
serial_detection-new_device-p1 = Enter your WiFi credentials!
serial_detection-new_device-p2 = Please select what you want to do with it
serial_detection-open_wifi = Connect to WiFi
serial_detection-open_serial = Open Serial Console
serial_detection-submit = Submit!
serial_detection-close = Close
## Navigation bar
navbar-home = Home
navbar-body_proportions = Body Proportions
navbar-trackers_assign = Tracker Assignment
navbar-mounting = Mounting Calibration
navbar-onboarding = Setup Wizard
navbar-settings = Settings
## Bounding volume hierarchy recording
bvh-start_recording = Record BVH
bvh-recording = Recording...
## Overlay settings
overlay-is_visible_label = Show Overlay in SteamVR
overlay-is_mirrored_label = Display Overlay as Mirror
## Tracker status
tracker-status-none = No Status
tracker-status-busy = Busy
tracker-status-error = Error
tracker-status-disconnected = Disconnected
tracker-status-occluded = Occluded
tracker-status-ok = OK
## Tracker status columns
tracker-table-column-name = Name
tracker-table-column-type = Type
tracker-table-column-battery = Battery
tracker-table-column-ping = Ping
tracker-table-column-rotation = Rotation X/Y/Z
tracker-table-column-position = Position X/Y/Z
tracker-table-column-url = URL
## Tracker rotation
tracker-rotation-front = Front
tracker-rotation-left = Left
tracker-rotation-right = Right
tracker-rotation-back = Back
## Tracker information
tracker-infos-manufacturer = Manufacturer
tracker-infos-display_name = Display Name
tracker-infos-custom_name = Custom Name
tracker-infos-url = Tracker URL
## Tracker settings
tracker-settings-back = Go back to trackers list
tracker-settings-title = Tracker settings
tracker-settings-assignment_section = Assignment
tracker-settings-assignment_section-description = What part of the body the tracker is assigned to.
tracker-settings-assignment_section-edit = Edit assignment
tracker-settings-mounting_section = Mounting position
tracker-settings-mounting_section-description = Where is the tracker mounted?
tracker-settings-mounting_section-edit = Edit mounting
tracker-settings-drift_compensation_section = Allow drift compensation
tracker-settings-drift_compensation_section-description = Should this tracker compensate for its drift when drift compensation is enabled?
tracker-settings-drift_compensation_section-edit = Allow drift compensation
# The .<name> means it's an attribute and it's related to the top key.
# In this case that is the settings for the assignment section.
tracker-settings-name_section = Tracker name
tracker-settings-name_section-description = Give it a cute nickname :)
tracker-settings-name_section-placeholder = NightyBeast's left leg
## Tracker part card info
tracker-part_card-no_name = No name
tracker-part_card-unassigned = Unassigned
## Body assignment menu
body_assignment_menu = Where do you want this tracker to be?
body_assignment_menu-description = Choose a location where you want this tracker to be assigned. Alternatively you can choose to manage all trackers at once instead of one by one.
body_assignment_menu-show_advanced_locations = Show advanced assign locations
body_assignment_menu-manage_trackers = Manage all trackers
body_assignment_menu-unassign_tracker = Unassign tracker
## Tracker assignment menu
# A -translation_key (with a dash in the front) means that it's a label.
# It can only be used in the translation file, it's nice for reusing names and that kind of stuff.
#
# We are using it here because english doesn't require changing the text in each case but
# maybe your language does.
-tracker_selection-part = Which tracker to assign to your
tracker_selection_menu-NONE = Which tracker do you want to be unassigned?
tracker_selection_menu-HEAD = { -tracker_selection-part } head?
tracker_selection_menu-NECK = { -tracker_selection-part } neck?
tracker_selection_menu-RIGHT_SHOULDER = { -tracker_selection-part } right shoulder?
tracker_selection_menu-RIGHT_UPPER_ARM = { -tracker_selection-part } right upper arm?
tracker_selection_menu-RIGHT_LOWER_ARM = { -tracker_selection-part } right lower arm?
tracker_selection_menu-RIGHT_HAND = { -tracker_selection-part } right hand?
tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } right thigh?
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } right ankle?
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } right foot?
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } right controller?
tracker_selection_menu-CHEST = { -tracker_selection-part } chest?
tracker_selection_menu-WAIST = { -tracker_selection-part } waist?
tracker_selection_menu-HIP = { -tracker_selection-part } hip?
tracker_selection_menu-LEFT_SHOULDER = { -tracker_selection-part } left shoulder?
tracker_selection_menu-LEFT_UPPER_ARM = { -tracker_selection-part } left upper arm?
tracker_selection_menu-LEFT_LOWER_ARM = { -tracker_selection-part } left lower arm?
tracker_selection_menu-LEFT_HAND = { -tracker_selection-part } left hand?
tracker_selection_menu-LEFT_UPPER_LEG = { -tracker_selection-part } left thigh?
tracker_selection_menu-LEFT_LOWER_LEG = { -tracker_selection-part } left ankle?
tracker_selection_menu-LEFT_FOOT = { -tracker_selection-part } left foot?
tracker_selection_menu-LEFT_CONTROLLER = { -tracker_selection-part } left controller?
tracker_selection_menu-unassigned = Unassigned Trackers
tracker_selection_menu-assigned = Assigned Trackers
tracker_selection_menu-dont_assign = Do not assign
## Mounting menu
mounting_selection_menu = Where do you want this tracker to be?
mounting_selection_menu-close = Close
## Sidebar settings
settings-sidebar-title = Settings
settings-sidebar-general = General
settings-sidebar-tracker_mechanics = Tracker mechanics
settings-sidebar-fk_settings = Tracking settings
settings-sidebar-gesture_control = Gesture control
settings-sidebar-interface = Interface
settings-sidebar-osc_router = OSC router
settings-sidebar-utils = Utilities
settings-sidebar-serial = Serial console
## SteamVR settings
settings-general-steamvr = SteamVR
settings-general-steamvr-subtitle = SteamVR trackers
# Not all translation keys support multiline, only the ones that specify it will actually
# split it in lines (that also means you can split in lines however you want in those).
# The first spaces (not tabs) for indentation will be ignored, just to make the file look nice when writing.
# This one is one of this cases that cares about multilines
settings-general-steamvr-description =
Enable or disable specific SteamVR trackers.
Useful for games or apps that only support certain trackers.
settings-general-steamvr-trackers-waist = Waist
settings-general-steamvr-trackers-chest = Chest
settings-general-steamvr-trackers-feet = Feet
settings-general-steamvr-trackers-knees = Knees
settings-general-steamvr-trackers-elbows = Elbows
settings-general-steamvr-trackers-hands = Hands
## Tracker mechanics
settings-general-tracker_mechanics = Tracker mechanics
settings-general-tracker_mechanics-filtering = Filtering
# This also cares about multilines
settings-general-tracker_mechanics-filtering-description =
Choose the filtering type for your trackers.
Prediction predicts movement while smoothing smoothens movement.
settings-general-tracker_mechanics-filtering-type = Filtering type
settings-general-tracker_mechanics-filtering-type-none = No filtering
settings-general-tracker_mechanics-filtering-type-none-description = Use rotations as is. Will not do any filtering.
settings-general-tracker_mechanics-filtering-type-smoothing = Smoothing
settings-general-tracker_mechanics-filtering-type-smoothing-description = Smooths movements but adds some latency.
settings-general-tracker_mechanics-filtering-type-prediction = Prediction
settings-general-tracker_mechanics-filtering-type-prediction-description = Reduces latency and makes movements more snappy, but may increase jitter.
settings-general-tracker_mechanics-filtering-amount = Amount
settings-general-tracker_mechanics-drift_compensation = Drift compensation
# This cares about multilines
settings-general-tracker_mechanics-drift_compensation-description =
Compensates IMU yaw drift by applying an inverse rotation.
Change amount of compensation and up to how many resets are taken into account.
settings-general-tracker_mechanics-drift_compensation-enabled-label = Drift compensation
settings-general-tracker_mechanics-drift_compensation-amount-label = Compensation amount
settings-general-tracker_mechanics-drift_compensation-max_resets-label = Use up to x last resets
## FK/Tracking settings
settings-general-fk_settings = Tracking settings
settings-general-fk_settings-leg_tweak = Leg tweaks
settings-general-fk_settings-leg_tweak-description = Floor-clip can Reduce or even eliminates clipping with the floor but may cause problems when on your knees. Skating-correction corrects for ice skating, but can decrease accuracy in certain movement patterns.
# 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 = Floor clip
# 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)
# definition - Guesses when each foot is in contact with the ground and uses that information to improve tracking
settings-general-fk_settings-leg_tweak-skating_correction = Skating correction
settings-general-fk_settings-leg_tweak-skating_correction-amount = Skating correction strength
settings-general-fk_settings-arm_fk = Arm tracking
settings-general-fk_settings-arm_fk-description = Change the way the arms are tracked.
settings-general-fk_settings-arm_fk-force_arms = Force arms from HMD
settings-general-fk_settings-skeleton_settings = Skeleton settings
settings-general-fk_settings-skeleton_settings-description = Toggle skeleton settings on or off. It is recommended to leave these on.
settings-general-fk_settings-skeleton_settings-extended_spine = Extended spine
settings-general-fk_settings-skeleton_settings-extended_pelvis = Extended pelvis
settings-general-fk_settings-skeleton_settings-extended_knees = Extended knee
settings-general-fk_settings-vive_emulation-title = Vive emulation
settings-general-fk_settings-vive_emulation-description = Emulate the waist tracker problems that Vive trackers have. This is a joke and makes tracking worse.
settings-general-fk_settings-vive_emulation-label = Enable Vive emulation
## Gesture control settings (tracker tapping)
settings-general-gesture_control = Gesture control
settings-general-gesture_control-subtitle = Tap based resets
settings-general-gesture_control-description = Allows for resets to be triggered by tapping a tracker. The tracker highest up on your torso is used for Quick Reset, the tracker highest up on your left leg is used for Reset, and the tracker highest up on your right leg is used for Mounting Reset. It should be mentioned that taps must happen within 0.6 seconds to be registered.
# This is a unit: 3 taps, 2 taps, 1 tap
# $amount (Number) - Amount of taps (touches to the tracker's case)
settings-general-gesture_control-taps = { $amount ->
[one] 1 tap
*[other] { $amount } taps
}
settings-general-gesture_control-quickResetEnabled = Enable tap to quick reset
settings-general-gesture_control-quickResetDelay = Quick reset delay
settings-general-gesture_control-quickResetTaps = Taps for quick reset
settings-general-gesture_control-resetEnabled = Enable tap to reset
settings-general-gesture_control-resetDelay = Reset delay
settings-general-gesture_control-resetTaps = Taps for reset
settings-general-gesture_control-mountingResetEnabled = Enable tap to reset mounting
settings-general-gesture_control-mountingResetDelay = Mounting reset delay
settings-general-gesture_control-mountingResetTaps = Taps for mounting reset
## Interface settings
settings-general-interface = Interface
settings-general-interface-dev_mode = Developer Mode
settings-general-interface-dev_mode-description = This mode can be useful if you need in-depth data or to interact with connected trackers on a more advanced level.
settings-general-interface-dev_mode-label = Developer Mode
settings-general-interface-serial_detection = Serial device detection
settings-general-interface-serial_detection-description = This option will show a pop-up every time you plug a new serial device that could be a tracker. It helps improving the setup process of a tracker.
settings-general-interface-serial_detection-label = Serial device detection
settings-general-interface-lang = Select language
settings-general-interface-lang-description = Change the default language you want to use.
settings-general-interface-lang-placeholder = Select the language to use
## Serial settings
settings-serial = Serial Console
# This cares about multilines
settings-serial-description =
This is a live information feed for serial communication.
May be useful if you need to know the firmware is acting up.
settings-serial-connection_lost = Connection to serial lost, Reconnecting...
settings-serial-reboot = Reboot
settings-serial-factory_reset = Factory Reset
settings-serial-get_infos = Get Infos
settings-serial-serial_select = Select a serial port
settings-serial-auto_dropdown_item = Auto
## OSC router settings
settings-osc-router = OSC router
# This cares about multilines
settings-osc-router-description =
Forward OSC messages from another program.
Useful for using another OSC program with VRChat for example.
settings-osc-router-enable = Enable
settings-osc-router-enable-description = Toggle the forwarding of messages.
settings-osc-router-enable-label = Enable
settings-osc-router-network = Network ports
# This cares about multilines
settings-osc-router-network-description =
Set the ports for listening and sending data.
These can be the same as other ports used in the SlimeVR server.
settings-osc-router-network-port_in =
.label = Port In
.placeholder = Port in (default: 9002)
settings-osc-router-network-port_out =
.label = Port Out
.placeholder = Port out (default: 9000)
settings-osc-router-network-address = Network address
settings-osc-router-network-address-description = Set the address to send out data at.
settings-osc-router-network-address-placeholder = IPV4 address
## OSC VRChat settings
settings-osc-vrchat = VRChat OSC Trackers
# This cares about multilines
settings-osc-vrchat-description =
Change VRChat-specific settings to receive HMD data and send
trackers data for FBT (works on Quest standalone).
settings-osc-vrchat-enable = Enable
settings-osc-vrchat-enable-description = Toggle the sending and receiving of data.
settings-osc-vrchat-enable-label = Enable
settings-osc-vrchat-network = Network ports
settings-osc-vrchat-network-description = Set the ports for listening and sending data to VRChat.
settings-osc-vrchat-network-port_in =
.label = Port In
.placeholder = Port in (default: 9001)
settings-osc-vrchat-network-port_out =
.label = Port Out
.placeholder = Port out (default: 9000)
settings-osc-vrchat-network-address = Network address
settings-osc-vrchat-network-address-description = Choose which address to send out data to VRChat (check your wifi settings on your device).
settings-osc-vrchat-network-address-placeholder = VRChat ip address
settings-osc-vrchat-network-trackers = Trackers
settings-osc-vrchat-network-trackers-description = Toggle the sending of specific trackers via OSC.
settings-osc-vrchat-network-trackers-chest = Chest
settings-osc-vrchat-network-trackers-waist = Waist
settings-osc-vrchat-network-trackers-knees = Knees
settings-osc-vrchat-network-trackers-feet = Feet
settings-osc-vrchat-network-trackers-elbows = Elbows
## Setup/onboarding menu
onboarding-skip = Skip setup
onboarding-continue = Continue
onboarding-wip = Work in progress
## WiFi setup
onboarding-wifi_creds-back = Go Back to introduction
onboarding-wifi_creds = Input WiFi credentials
# This cares about multilines
onboarding-wifi_creds-description =
The Trackers will use these credentials to connect wirelessly.
Please use the credentials that you are currently connected to.
onboarding-wifi_creds-skip = Skip wifi settings
onboarding-wifi_creds-submit = Submit!
onboarding-wifi_creds-ssid =
.label = SSID
.placeholder = Enter SSID
onboarding-wifi_creds-password =
.label = Password
.placeholder = Enter password
## Mounting setup
onboarding-reset_tutorial-back = Go Back to Mounting calibration
onboarding-reset_tutorial = Reset tutorial
onboarding-reset_tutorial-description = This feature isn't done, just press continue
## Setup start
onboarding-home = Welcome to SlimeVR
# This cares about multilines and it's centered!!
onboarding-home-description =
Bringing full-body tracking
to everyone
onboarding-home-start = Lets get set up!
## Enter VR part of setup
onboarding-enter_vr-back = Go Back to Tracker assignent
onboarding-enter_vr-title = Time to enter VR!
onboarding-enter_vr-description = Put on all your trackers and then enter VR!
onboarding-enter_vr-ready = I'm ready
## Setup done
onboarding-done-title = You're all set!
onboarding-done-description = Enjoy your full body experience
onboarding-done-close = Close the guide
## Tracker connection setup
onboarding-connect_tracker-back = Go Back to WiFi credentials
onboarding-connect_tracker-title = Connect trackers
onboarding-connect_tracker-description-p0 = Now onto the fun part, connecting all the trackers!
onboarding-connect_tracker-description-p1 = Simply connect all that aren't connected yet, through a USB port.
onboarding-connect_tracker-issue-serial = I'm having trouble connecting!
onboarding-connect_tracker-usb = USB Tracker
onboarding-connect_tracker-connection_status-connecting = Sending wifi credentials
onboarding-connect_tracker-connection_status-connected = Connected to WiFi
onboarding-connect_tracker-connection_status-error = Unable to connect to Wifi
onboarding-connect_tracker-connection_status-start_connecting = Looking for trackers
onboarding-connect_tracker-connection_status-handshake = Connected to the Server
# $amount (Number) - Amount of trackers connected (this is a number, but you can use CLDR plural rules for your language)
# More info on https://www.unicode.org/cldr/cldr-aux/charts/22/supplemental/language_plural_rules.html
# English in this case only has 2 plural rules, which are "one" and "other",
# we use 0 in an explicit way because there is no plural rule in english for 0, so we directly say
# if $amount is 0 then we say "No trackers connected"
onboarding-connect_tracker-connected_trackers = { $amount ->
[0] No trackers
[one] 1 tracker
*[other] { $amount } trackers
} connected
onboarding-connect_tracker-next = I connected all my trackers
## Tracker assignment setup
onboarding-assign_trackers-back = Go Back to Wifi Credentials
onboarding-assign_trackers-title = Assign trackers
onboarding-assign_trackers-description = Let's choose which tracker goes where. Click on a location where you want to place a 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
onboarding-assign_trackers-assigned = { $assigned } of { $trackers ->
[one] 1 tracker
*[other] { $trackers } trackers
} assigned
onboarding-assign_trackers-advanced = Show advanced assign locations
onboarding-assign_trackers-next = I assigned all the trackers
## Tracker manual mounting setup
onboarding-manual_mounting-back = Go Back to Enter VR
onboarding-manual_mounting = Manual Mounting
onboarding-manual_mounting-description = Click on every tracker and select which way they are mounted
onboarding-manual_mounting-auto_mounting = Automatic mounting
onboarding-manual_mounting-next = Next step
## Tracker automatic mounting setup
onboarding-automatic_mounting-back = Go Back to Enter VR
onboarding-automatic_mounting-title = Mounting Calibration
onboarding-automatic_mounting-description = For SlimeVR trackers to work, we need to assign a mounting rotation to your trackers to align them with your physical tracker mounting.
onboarding-automatic_mounting-manual_mounting = Manually set mounting
onboarding-automatic_mounting-next = Next step
onboarding-automatic_mounting-prev_step = Previous step
onboarding-automatic_mounting-done-title = Mounting rotations calibrated.
onboarding-automatic_mounting-done-description = Your mounting calibration is complete!
onboarding-automatic_mounting-done-restart = Return to start
onboarding-automatic_mounting-mounting_reset-title = Mounting Reset
onboarding-automatic_mounting-mounting_reset-step-0 = 1. Squat in a "skiing" pose with your legs bent, your upper body tilted forwards, and your arms bent.
onboarding-automatic_mounting-mounting_reset-step-1 = 2. Press the "Reset Mounting" button and wait for 3 seconds before the trackers' mounting rotations will reset.
onboarding-automatic_mounting-preparation-title = Preparation
onboarding-automatic_mounting-preparation-step-0 = 1. Stand upright with your arms to your sides.
onboarding-automatic_mounting-preparation-step-1 = 2. Press the "Reset" button and wait for 3 seconds before the trackers will reset.
onboarding-automatic_mounting-put_trackers_on-title = Put on your trackers
onboarding-automatic_mounting-put_trackers_on-description = To calibrate mounting rotations, we're gonna use the trackers you just assigned. Put on all your trackers, you can see which are which in the figure to the right.
onboarding-automatic_mounting-put_trackers_on-next = I have all my trackers on
## Tracker manual proportions setup
onboarding-manual_proportions-back = Go Back to Reset tutorial
onboarding-manual_proportions-title = Manual Body Proportions
onboarding-manual_proportions-precision = Precision adjust
onboarding-manual_proportions-auto = Automatic calibration
## Tracker automatic proportions setup
onboarding-automatic_proportions-back = Go Back to Reset tutorial
onboarding-automatic_proportions-title = Measure your body
onboarding-automatic_proportions-description = For SlimeVR trackers to work, we need to know the length of your bones. This short calibration will measure it for you.
onboarding-automatic_proportions-manual = Manual calibration
onboarding-automatic_proportions-prev_step = Previous step
onboarding-automatic_proportions-put_trackers_on-title = Put on your trackers
onboarding-automatic_proportions-put_trackers_on-description = To calibrate your proportions, we're gonna use the trackers you just assigned. Put on all your trackers, you can see which are which in the figure to the right.
onboarding-automatic_proportions-put_trackers_on-next = I have all my trackers on
onboarding-automatic_proportions-preparation-title = Preparation
onboarding-automatic_proportions-preparation-description = Place a chair directly behind you inside your play space. Be prepared to sit down during the autobone setup.
onboarding-automatic_proportions-preparation-next = I am in front of a chair
onboarding-automatic_proportions-start_recording-title = Get ready to move
onboarding-automatic_proportions-start_recording-description = We're now going to record some specific poses and moves. These will be prompted in the next screen. Be ready to start when the button is pressed!
onboarding-automatic_proportions-start_recording-next = Start Recording
onboarding-automatic_proportions-recording-title = REC
onboarding-automatic_proportions-recording-description-p0 = Recording in progress...
onboarding-automatic_proportions-recording-description-p1 = Make the moves shown below:
onboarding-automatic_proportions-recording-steps-0 = Bend knees a few times.
onboarding-automatic_proportions-recording-steps-1 = Sit on a chair then stand up.
onboarding-automatic_proportions-recording-steps-2 = Twist upper body left, then bend right.
onboarding-automatic_proportions-recording-steps-3 = Twist upper body right, then bend left.
onboarding-automatic_proportions-recording-steps-4 = Wiggle around until timer ends.
onboarding-automatic_proportions-recording-processing = Processing the result
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 15)
onboarding-automatic_proportions-recording-timer = { $time ->
[one] 1 second left
*[other] { $time } seconds left
}
onboarding-automatic_proportions-verify_results-title = Verify results
onboarding-automatic_proportions-verify_results-description = Check the results below, do they look correct?
onboarding-automatic_proportions-verify_results-results = Recording results
onboarding-automatic_proportions-verify_results-processing = Processing the result
onboarding-automatic_proportions-verify_results-redo = Redo recording
onboarding-automatic_proportions-verify_results-confirm = They're correct
onboarding-automatic_proportions-done-title = Body measured and saved.
onboarding-automatic_proportions-done-description = Your body proportions calibration is complete!
## Home
home-no_trackers = No trackers detected or assigned

View File

@@ -0,0 +1,519 @@
### SlimeVR complete GUI translations
# Please developers (not translators) don't reuse a key inside another key
# or concat text with a translation string in the code, use the appropriate
# features like variables and selectors in each appropriate case!
# And also comment the string if it's something not easy to translate, so you help
# translators on what it means
## Websocket (server) status
websocket-connecting = Conectando al servidor
websocket-connection_lost = Conexión al servidor perdida. Intentando reconectar...
## Tips
tips-find_tracker = ¿No estás seguro de cuál sensor es cuál? Agita un sensor y se resaltará donde está asignado.
tips-do_not_move_heels = ¡Asegúrate de no mover los talones en la grabación!
## Body parts
body_part-NONE = Sin asignar
body_part-HEAD = Cabeza
body_part-NECK = Cuello
body_part-RIGHT_SHOULDER = Hombro derecho
body_part-RIGHT_UPPER_ARM = Brazo superior derecho
body_part-RIGHT_LOWER_ARM = Antebrazo derecho
body_part-RIGHT_HAND = Mano derecha
body_part-RIGHT_UPPER_LEG = Muslo derecho
body_part-RIGHT_LOWER_LEG = Tobillo derecho
body_part-RIGHT_FOOT = Pie derecho
body_part-RIGHT_CONTROLLER = Control derecho
body_part-CHEST = Pecho
body_part-WAIST = Cintura
body_part-HIP = Cadera
body_part-LEFT_SHOULDER = Hombro izquierdo
body_part-LEFT_UPPER_ARM = Brazo superior izquierdo
body_part-LEFT_LOWER_ARM = Antebrazo izquierdo
body_part-LEFT_HAND = Mano izquierda
body_part-LEFT_UPPER_LEG = Muslo izquierdo
body_part-LEFT_LOWER_LEG = Tobillo izquierdo
body_part-LEFT_FOOT = Pie izquierdo
body_part-LEFT_CONTROLLER = Control izquierdo
## Skeleton stuff
skeleton_bone-NONE = Nada
skeleton_bone-HEAD = Inclinación de cabeza
skeleton_bone-NECK = Largo del cuello
skeleton_bone-TORSO = Largo del torso
skeleton_bone-CHEST = Distancia del pecho
skeleton_bone-WAIST = Distancia de la cintura
skeleton_bone-HIP_OFFSET = Desplazamiento de la cadera
skeleton_bone-HIPS_WIDTH = Ancho de la cadera
skeleton_bone-LEGS_LENGTH = Largo de las piernas
skeleton_bone-KNEE_HEIGHT = Altura de las rodillas
skeleton_bone-FOOT_LENGTH = Largo de pies
skeleton_bone-FOOT_SHIFT = Desplazamiento de pies
skeleton_bone-SKELETON_OFFSET = Desplazamiento del esqueleto
skeleton_bone-CONTROLLER_DISTANCE_Z = Distancia Z del mando
skeleton_bone-CONTROLLER_DISTANCE_Y = Distancia Y del mando
skeleton_bone-FOREARM_LENGTH = Distancia del antebrazo
skeleton_bone-SHOULDERS_DISTANCE = Distancia de los hombros
skeleton_bone-SHOULDERS_WIDTH = Ancho de los hombros
skeleton_bone-UPPER_ARM_LENGTH = Largo del brazo superior
skeleton_bone-ELBOW_OFFSET = Desplazamiento del codo
## Tracker reset buttons
reset-reset_all = Reiniciar todas las proporciones
reset-full = Reiniciar
reset-mounting = Reiniciar montura
reset-quick = Reinicio rápido
## Serial detection stuff
serial_detection-new_device-p0 = ¡Nuevo dispositivo serial detectado!
serial_detection-new_device-p1 = ¡Ingresa tus credenciales del WiFi!
serial_detection-new_device-p2 = Por favor selecciona que quieres hacer con el
serial_detection-open_wifi = Conectarse al WiFi
serial_detection-open_serial = Abrir consola serial
serial_detection-submit = ¡Enviar!
serial_detection-close = Cerrar
## Navigation bar
navbar-home = Inicio
navbar-body_proportions = Proporciones corporales
navbar-trackers_assign = Asignación de sensores
navbar-mounting = Calibración de montura
navbar-onboarding = Asistente de configuración
navbar-settings = Ajustes
## Bounding volume hierarchy recording
bvh-start_recording = Grabar BVH
bvh-recording = Grabando...
## Overlay settings
overlay-is_visible_label = Mostrar interfaz en SteamVR
overlay-is_mirrored_label = Mostrar interfaz reflejada
## Tracker status
tracker-status-none = Sin estado
tracker-status-busy = Ocupado
tracker-status-error = Error
tracker-status-disconnected = Desconectado
tracker-status-occluded = Ocluido
tracker-status-ok = Conectado
## Tracker status columns
tracker-table-column-name = Nombre
tracker-table-column-type = Tipo
tracker-table-column-battery = Batería
tracker-table-column-ping = Latencia
tracker-table-column-rotation = Rotación X/Y/Z
tracker-table-column-position = Posición X/Y/Z
tracker-table-column-url = URL
## Tracker rotation
tracker-rotation-front = Frente
tracker-rotation-left = Izquierda
tracker-rotation-right = Derecha
tracker-rotation-back = Atrás
## Tracker information
tracker-infos-manufacturer = Fabricante
tracker-infos-display_name = Nombre
tracker-infos-custom_name = Nombre personalizado
tracker-infos-url = URL del sensor
## Tracker settings
tracker-settings-back = Volver a la lista de sensores
tracker-settings-title = Ajustes de los sensores
tracker-settings-assignment_section = Asignación
tracker-settings-assignment_section-description = Parte del cuerpo asignado al sensor.
tracker-settings-assignment_section-edit = Editar asignación
tracker-settings-mounting_section = Posición de montura
tracker-settings-mounting_section-description = ¿Dónde está montado el sensor?
tracker-settings-mounting_section-edit = Editar montura
tracker-settings-drift_compensation_section = Allow drift compensation
tracker-settings-drift_compensation_section-description = Should this tracker compensate for its drift when drift compensation is enabled?
tracker-settings-drift_compensation_section-edit = Allow drift compensation
# The .<name> means it's an attribute and it's related to the top key.
# In this case that is the settings for the assignment section.
tracker-settings-name_section = Nombre del sensor
tracker-settings-name_section-description = Dale un apodo bonito :)
tracker-settings-name_section-placeholder = Pierna izquierda de NightyBeast
## Tracker part card info
tracker-part_card-no_name = Sin nombre
tracker-part_card-unassigned = Sin asignar
## Body assignment menu
body_assignment_menu = ¿Dónde quieres que esté este sensor?
body_assignment_menu-description = Selecciona la posición donde quieres asignar este sensor. También puedes escoger administrar todos los sensores al mismo tiempo en vez de uno por uno.
body_assignment_menu-show_advanced_locations = Mostrar posiciones de asignación avanzadas
body_assignment_menu-manage_trackers = Administrar todos los sensores
body_assignment_menu-unassign_tracker = Desasignar sensor
## Tracker assignment menu
# A -translation_key (with a dash in the front) means that it's a label.
# It can only be used in the translation file, it's nice for reusing names and that kind of stuff.
#
# We are using it here because english doesn't require changing the text in each case but
# maybe your language does.
-tracker_selection-part = Which tracker to assign to your
tracker_selection_menu-NONE = Which tracker do you want to be unassigned?
tracker_selection_menu-HEAD = { -tracker_selection-part } head?
tracker_selection_menu-NECK = { -tracker_selection-part } neck?
tracker_selection_menu-RIGHT_SHOULDER = { -tracker_selection-part } right shoulder?
tracker_selection_menu-RIGHT_UPPER_ARM = { -tracker_selection-part } right upper arm?
tracker_selection_menu-RIGHT_LOWER_ARM = { -tracker_selection-part } right lower arm?
tracker_selection_menu-RIGHT_HAND = { -tracker_selection-part } right hand?
tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } right thigh?
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } right ankle?
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } right foot?
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } right controller?
tracker_selection_menu-CHEST = { -tracker_selection-part } chest?
tracker_selection_menu-WAIST = { -tracker_selection-part } waist?
tracker_selection_menu-HIP = { -tracker_selection-part } hip?
tracker_selection_menu-LEFT_SHOULDER = { -tracker_selection-part } left shoulder?
tracker_selection_menu-LEFT_UPPER_ARM = { -tracker_selection-part } left upper arm?
tracker_selection_menu-LEFT_LOWER_ARM = { -tracker_selection-part } left lower arm?
tracker_selection_menu-LEFT_HAND = { -tracker_selection-part } left hand?
tracker_selection_menu-LEFT_UPPER_LEG = { -tracker_selection-part } left thigh?
tracker_selection_menu-LEFT_LOWER_LEG = { -tracker_selection-part } left ankle?
tracker_selection_menu-LEFT_FOOT = { -tracker_selection-part } left foot?
tracker_selection_menu-LEFT_CONTROLLER = { -tracker_selection-part } left controller?
tracker_selection_menu-unassigned = Sensores sin asignar
tracker_selection_menu-assigned = Sensores asignados
tracker_selection_menu-dont_assign = No asignar
## Mounting menu
mounting_selection_menu = ¿Dónde quieres colocar el sensor?
mounting_selection_menu-close = Cerrar
## Sidebar settings
settings-sidebar-title = Ajustes
settings-sidebar-general = General
settings-sidebar-tracker_mechanics = Mecánicas del sensor
settings-sidebar-fk_settings = Ajustes de FK
settings-sidebar-gesture_control = Control de gestos
settings-sidebar-interface = Interfaz
settings-sidebar-osc_router = Router OSC
settings-sidebar-utils = Utilidades
settings-sidebar-serial = Consola serial
## SteamVR settings
settings-general-steamvr = SteamVR
settings-general-steamvr-subtitle = Sensores en SteamVR
# Not all translation keys support multiline, only the ones that specify it will actually
# split it in lines (that also means you can split in lines however you want in those).
# The first spaces (not tabs) for indentation will be ignored, just to make the file look nice when writing.
# This one is one of this cases that cares about multilines
settings-general-steamvr-description =
Habilita o deshabilita sensores de SteamVR en específico.
Útil para juegos y aplicaciones que solo soportan ciertos sensores..
settings-general-steamvr-trackers-waist = Cintura
settings-general-steamvr-trackers-chest = Pecho
settings-general-steamvr-trackers-feet = Pies
settings-general-steamvr-trackers-knees = Rodillas
settings-general-steamvr-trackers-elbows = Codos
settings-general-steamvr-trackers-hands = Manos
## Tracker mechanics
settings-general-tracker_mechanics = Mecánicas del sensor
settings-general-tracker_mechanics-filtering = Filtrado
# This also cares about multilines
settings-general-tracker_mechanics-filtering-description =
Selecciona un tipo de filtro para tus sensores.
Predicción predice el movimiento mientras que el suavizado suaviza el movimiento.
settings-general-tracker_mechanics-filtering-type = Tipos de filtro
settings-general-tracker_mechanics-filtering-type-none = Sin filtro
settings-general-tracker_mechanics-filtering-type-none-description = Usa las rotaciones como son. No se realizará ningún filtrado.
settings-general-tracker_mechanics-filtering-type-smoothing = Suavizado
settings-general-tracker_mechanics-filtering-type-smoothing-description = Suaviza los movimientos pero añade algo de latencia.
settings-general-tracker_mechanics-filtering-type-prediction = Predicción
settings-general-tracker_mechanics-filtering-type-prediction-description = Reduce la latencia y los movimientos serán más inmediatos, pero puede incrementar la inestabilidad.
settings-general-tracker_mechanics-filtering-amount = Cantidad
settings-general-tracker_mechanics-drift_compensation = Drift compensation
# This cares about multilines
settings-general-tracker_mechanics-drift_compensation-description =
Compensates IMU yaw drift by applying an inverse rotation.
Change amount of compensation and up to how many resets are taken into account.
settings-general-tracker_mechanics-drift_compensation-enabled-label = Drift compensation
settings-general-tracker_mechanics-drift_compensation-amount-label = Compensation amount
settings-general-tracker_mechanics-drift_compensation-max_resets-label = Use up to x last resets
## FK/Tracking settings
settings-general-fk_settings = Ajustes de sensores
settings-general-fk_settings-leg_tweak = Corrección de piernas
settings-general-fk_settings-leg_tweak-description = El clip del suelo puede reducir o incluso eliminar el traspaso del piso pero puede causar problemas cuando te arrodilles. Corrección del patinaje corrige el patinaje, pero puede disminuir la precisión de ciertos movimientos.
# 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 = Clip del suelo
# 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)
# definition - Guesses when each foot is in contact with the ground and uses that information to improve tracking
settings-general-fk_settings-leg_tweak-skating_correction = Corrección del patinaje
settings-general-fk_settings-leg_tweak-skating_correction-amount = Agresividad de la corrección del patinaje
settings-general-fk_settings-arm_fk = Trackeo de brazos
settings-general-fk_settings-arm_fk-description = Cambia cómo el movimiento de los brazos es detectado.
settings-general-fk_settings-arm_fk-force_arms = Forzar brazos desde el HMD
settings-general-fk_settings-skeleton_settings = Ajustes de esqueleto
settings-general-fk_settings-skeleton_settings-description = Habilita o deshabilita los ajustes de esqueleto. Es recomendado dejar estos ajustes habilitados.
settings-general-fk_settings-skeleton_settings-extended_spine = Extención de columna
settings-general-fk_settings-skeleton_settings-extended_pelvis = Extención de pelvis
settings-general-fk_settings-skeleton_settings-extended_knees = Extención de rodillas
settings-general-fk_settings-vive_emulation-title = Vive emulation
settings-general-fk_settings-vive_emulation-description = Emulate the waist tracker problems that Vive trackers have. This is a joke and makes tracking worse.
settings-general-fk_settings-vive_emulation-label = Enable Vive emulation
## Gesture control settings (tracker tapping)
settings-general-gesture_control = Control de gestos
settings-general-gesture_control-subtitle = Reinicio basado en toques
settings-general-gesture_control-description = Permite la ejecución de un reinicio al tocar un sensor. El sensor más alto en el torso es utilizado para el reinicio rápido, el sensor más alto en tu pierna izquierda es utilizado para el reinicio, y el sensor más alto en tu pierna derecha es utilizado para reiniciar la montura. Cabe destacar que los toques deben suceder dentro de 0.6 segundos para ser registrados.
# This is a unit: 3 taps, 2 taps, 1 tap
# $amount (Number) - Amount of taps (touches to the tracker's case)
settings-general-gesture_control-taps = { $amount ->
[one] 1 tap
*[other] { $amount } taps
}
settings-general-gesture_control-quickResetEnabled = Activar toques para reinicio rápido
settings-general-gesture_control-quickResetDelay = Retraso de reinicio rápido
settings-general-gesture_control-quickResetTaps = Toques para reinicio rápido
settings-general-gesture_control-resetEnabled = Activar toques para reinicio
settings-general-gesture_control-resetDelay = Retraso de reinicio
settings-general-gesture_control-resetTaps = Toques para reinicio
settings-general-gesture_control-mountingResetEnabled = Activar toques para reinicio de montura
settings-general-gesture_control-mountingResetDelay = Retraso de reinicio de montura
settings-general-gesture_control-mountingResetTaps = Toques para reinicio de montura
## Interface settings
settings-general-interface = Interfaz
settings-general-interface-dev_mode = Modo desarrollador
settings-general-interface-dev_mode-description = Este modo puede ser útil si es que necesitas información a fondo o para un nivel de interacción más avanzado con los sensores conectados.
settings-general-interface-dev_mode-label = Modo desarrollador
settings-general-interface-serial_detection = Detección de dispositivo serial
settings-general-interface-serial_detection-description = Esta opción mostrará un notificación cada vez que conectes un nuevo dispositivo serial que pueda ser un sensor. Ayuda a mejorar el proceso de configuración de un sensor.
settings-general-interface-serial_detection-label = Detección de dispositivo serial
settings-general-interface-lang = Selecciona un idioma
settings-general-interface-lang-description = Cambia el idioma que quieras usar.
settings-general-interface-lang-placeholder = Selecciona el idioma a utilizar
## Serial settings
settings-serial = Consola serial
# This cares about multilines
settings-serial-description =
Esta es la comunicación serial actualizada en vivo.
Puede ser util para saber si el firmware tiene problemas.
settings-serial-connection_lost = Conexión serial perdida, reconectando...
settings-serial-reboot = Reinciar
settings-serial-factory_reset = Restauración de fábrica
settings-serial-get_infos = Obtener información
settings-serial-serial_select = Selecciona un puerto serial
settings-serial-auto_dropdown_item = Auto
## OSC router settings
settings-osc-router = Router OSC
# This cares about multilines
settings-osc-router-description =
Redirecciona mensajes OSC recibidos de otro programa.
Útil para usar otro programa OSC con VRChat por ejemplo.
settings-osc-router-enable = Habilitar
settings-osc-router-enable-description = Habilita el reenvío de mensajes.
settings-osc-router-enable-label = Habilitar
settings-osc-router-network = Puertos de conexión
# This cares about multilines
settings-osc-router-network-description =
Establece los puertos de entrada y salida de datos
Estos pueden ser lo mismos puertos usados en el servidor de SlimeVR.
settings-osc-router-network-port_in =
.label = Puerto de entrada
.placeholder = Puerto de entrada (por defecto: 9002)
settings-osc-router-network-port_out =
.label = Puerto de salida
.placeholder = Puerto de salida (por defecto: 9000)
settings-osc-router-network-address = Dirección de red
settings-osc-router-network-address-description = Establece la direción a la cuál se enviarán los datos.
settings-osc-router-network-address-placeholder = Dirección IPv4
## OSC VRChat settings
settings-osc-vrchat = VRChat OSC Trackers
# This cares about multilines
settings-osc-vrchat-description =
Cambiar ajustes específicos de VRChat para recibir datos del HMD y enviar
datos de los sensores para seguimiento de cuerpo completo (funciona en Quest nativo).
settings-osc-vrchat-enable = Habilitar
settings-osc-vrchat-enable-description = Habilita el envio y recibo de datos.
settings-osc-vrchat-enable-label = Habilitar
settings-osc-vrchat-network = Puertos de conexión
settings-osc-vrchat-network-description = Establece los puertos de entrada y salida de datos a VRChat.
settings-osc-vrchat-network-port_in =
.label = Puerto de entrada
.placeholder = Puerto de entrada (por defecto: 9001)
settings-osc-vrchat-network-port_out =
.label = Puerto de salida
.placeholder = Puerto de salida (por defecto: 9000)
settings-osc-vrchat-network-address = Dirección de red
settings-osc-vrchat-network-address-description = Establece la dirección donde se enviarán los datos de VRChat (revisa los ajustes de WiFi de tu dispositivo que tenga el juego).
settings-osc-vrchat-network-address-placeholder = Dirección IP de VRChat
settings-osc-vrchat-network-trackers = Sensores
settings-osc-vrchat-network-trackers-description = Habilita el envío de sensores específicos mediante OSC.
settings-osc-vrchat-network-trackers-chest = Pecho
settings-osc-vrchat-network-trackers-waist = Cintura
settings-osc-vrchat-network-trackers-knees = Rodillas
settings-osc-vrchat-network-trackers-feet = Pies
settings-osc-vrchat-network-trackers-elbows = Codos
## Setup/onboarding menu
onboarding-skip = Saltar configuración
onboarding-continue = Continuar
onboarding-wip = Trabajo en progreso
## WiFi setup
onboarding-wifi_creds-back = Volver a la introducción
onboarding-wifi_creds = Ingresar credenciales del WiFi
# This cares about multilines
onboarding-wifi_creds-description =
Los sensores utilizarán estas credenciales para conectarse inalámbricamente.
Por favor usa las credenciales del WiFi al cuál estás conectado actualmente.
onboarding-wifi_creds-skip = Saltar ajustes de WiFi
onboarding-wifi_creds-submit = ¡Enviar!
onboarding-wifi_creds-ssid =
.label = SSID
.placeholder = Enter SSID
onboarding-wifi_creds-password =
.label = Password
.placeholder = Enter password
## Mounting setup
onboarding-reset_tutorial-back = Volver a la calibración de montura
onboarding-reset_tutorial = Reiniciar tutorial
onboarding-reset_tutorial-description = Esta aún parte no está finalizada, por favor presione continuar
## Setup start
onboarding-home = Bienvenido a SlimeVR
# This cares about multilines and it's centered!!
onboarding-home-description =
¡Acercando el seguimiento
de cuerpo completo a todos!
onboarding-home-start = ¡Comencemos!
## Enter VR part of setup
onboarding-enter_vr-back = Volver a la asignación de sensores
onboarding-enter_vr-title = ¡Es hora de entrar a la RV!
onboarding-enter_vr-description = ¡Ponte todos tus sensores y luego entra a la RV!
onboarding-enter_vr-ready = Estoy listo
## Setup done
onboarding-done-title = ¡Estás listo!
onboarding-done-description = Disfruta moverte en la realidad virtual
onboarding-done-close = Cerrar la guía
## Tracker connection setup
onboarding-connect_tracker-back = Volver a las credenciales WiFi
onboarding-connect_tracker-title = Conecta tus sensores
onboarding-connect_tracker-description-p0 = Ahora la parte divertida, ¡Conectar todos tus sensores!
onboarding-connect_tracker-description-p1 = Simplemente conecta todos los sensores que aún no están conectados, por medio de un puerto USB.
onboarding-connect_tracker-issue-serial = ¡Tengo problemas conectándolos!
onboarding-connect_tracker-usb = Sensor USB
onboarding-connect_tracker-connection_status-connecting = Enviando credenciales WiFi
onboarding-connect_tracker-connection_status-connected = Conectado al WiFi
onboarding-connect_tracker-connection_status-error = Incapaz de conectar al WiFi
onboarding-connect_tracker-connection_status-start_connecting = Buscando sensores
onboarding-connect_tracker-connection_status-handshake = Conectado con el servidor
# $amount (Number) - Amount of trackers connected (this is a number, but you can use CLDR plural rules for your language)
# More info on https://www.unicode.org/cldr/cldr-aux/charts/22/supplemental/language_plural_rules.html
# English in this case only has 2 plural rules, which are "one" and "other",
# we use 0 in an explicit way because there is no plural rule in english for 0, so we directly say
# if $amount is 0 then we say "No trackers connected"
onboarding-connect_tracker-connected_trackers = { $amount ->
[0] No trackers
[one] 1 tracker
*[other] { $amount } trackers
} connected
onboarding-connect_tracker-next = He conectado todos mis sensores
## Tracker assignment setup
onboarding-assign_trackers-back = Volver a las credenciales WiFi
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
# 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
onboarding-assign_trackers-assigned = { $assigned } of { $trackers ->
[one] 1 tracker
*[other] { $trackers } trackers
} assigned
onboarding-assign_trackers-advanced = Mostrar ubicación de asignaciones avanzados.
onboarding-assign_trackers-next = He asignado todos los sensores
## Tracker manual mounting setup
onboarding-manual_mounting-back = Volver para entrar a la RV
onboarding-manual_mounting = Montura manual
onboarding-manual_mounting-description = Has clic en todos los sensores y selecciona en que dirección están montados
onboarding-manual_mounting-auto_mounting = Montura automática
onboarding-manual_mounting-next = Siguiente paso
## Tracker automatic mounting setup
onboarding-automatic_mounting-back = Volver para entrar a la RV
onboarding-automatic_mounting-title = Calibración de montura
onboarding-automatic_mounting-description = Para que los sensores SlimeVR funcionen, necesitamos asignar una posición de montura a tus sensores para que se alinien con la montura física de tu sensor.
onboarding-automatic_mounting-manual_mounting = Establecer montura manualmente
onboarding-automatic_mounting-next = Siguiente paso
onboarding-automatic_mounting-prev_step = Paso anterior
onboarding-automatic_mounting-done-title = Ubicación de monturas calibradas.
onboarding-automatic_mounting-done-description = ¡Tu calibración de monturas está completa!
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-preparation-title = Preparación
onboarding-automatic_mounting-preparation-step-0 = 1. Párate derecho con tus brazos a los costados.
onboarding-automatic_mounting-preparation-step-1 = 2. Presiona el botón «Reiniciar» y espera 3 segundos hasta que se reinicien los sensores.
onboarding-automatic_mounting-put_trackers_on-title = Ponte tus sensores
onboarding-automatic_mounting-put_trackers_on-description = Para calibrar la ubicación de tus monturas, usaremos los sensores que has asignado. Ponte todos tus sensores, puedes ver cuál es cual en la figura de la derecha.
onboarding-automatic_mounting-put_trackers_on-next = Tengo puestos todos mis sensores
## Tracker manual proportions setup
onboarding-manual_proportions-back = Volver al tutorial de reinicio
onboarding-manual_proportions-title = Proporciones de cuerpo manuales
onboarding-manual_proportions-precision = Ajuste con precisión
onboarding-manual_proportions-auto = Calibración automática
## Tracker automatic proportions setup
onboarding-automatic_proportions-back = Volver al tutorial de reinicio
onboarding-automatic_proportions-title = Mide tu cuerpo
onboarding-automatic_proportions-description = Para que los sensores de SlimeVR funcionen, necesitamos saber el largo de tus huesos. Esta breve calibración los medirá por ti.
onboarding-automatic_proportions-manual = Calibración manual
onboarding-automatic_proportions-prev_step = Paso anterior
onboarding-automatic_proportions-put_trackers_on-title = Ponte tus sensores
onboarding-automatic_proportions-put_trackers_on-description = Para calibrar tus proporciones, usaremos los sensores que acabas de asignar. Ponte todos tus sensores, puedes ver cuál es cual en la figura de la derecha.
onboarding-automatic_proportions-put_trackers_on-next = Tengo puestos todos mis sensores
onboarding-automatic_proportions-preparation-title = Preparación
onboarding-automatic_proportions-preparation-description = Coloca una silla directamente detrás de ti en tu area de juego. Prepárate para sentarte durante la configuración del autobone.
onboarding-automatic_proportions-preparation-next = Estoy al frente de una silla
onboarding-automatic_proportions-start_recording-title = Prepárate para moverte
onboarding-automatic_proportions-start_recording-description = Ahora vamos a grabar poses y movimientos en específico. Estas serán mostradas en la siguiente ventana. ¡Prepárate para empezar cuando presiones el botón!
onboarding-automatic_proportions-start_recording-next = Empezar grabación
onboarding-automatic_proportions-recording-title = REC
onboarding-automatic_proportions-recording-description-p0 = Grabación en proceso...
onboarding-automatic_proportions-recording-description-p1 = Realiza los siguientes movimientos:
onboarding-automatic_proportions-recording-steps-0 = Dobla tus rodillas unas cuantas veces.
onboarding-automatic_proportions-recording-steps-1 = Sientate en una silla y párate.
onboarding-automatic_proportions-recording-steps-2 = Gira tu torso hacia la izquierda, luego inclínate hacia la derecha.
onboarding-automatic_proportions-recording-steps-3 = Gira tu torso hacia la derecha, luego inclínate hacia la izquierda.
onboarding-automatic_proportions-recording-steps-4 = Menea tu cuerpo hasta que el tiempo se acabe.
onboarding-automatic_proportions-recording-processing = Procesando el resultado
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 15)
onboarding-automatic_proportions-recording-timer = { $time ->
[one] 1 second left
*[other] { $time } seconds left
}
onboarding-automatic_proportions-verify_results-title = Verificando resultados
onboarding-automatic_proportions-verify_results-description = Comprueba abajo los resultados, ¿Parecen correctos?
onboarding-automatic_proportions-verify_results-results = Grabando resultados
onboarding-automatic_proportions-verify_results-processing = Procesando resultados
onboarding-automatic_proportions-verify_results-redo = Rehacer grabación
onboarding-automatic_proportions-verify_results-confirm = Son correctos
onboarding-automatic_proportions-done-title = Cuerpo medido y guardado.
onboarding-automatic_proportions-done-description = ¡La calibración de tus proporciones corporales fue completada!
## Home
home-no_trackers = No hay sensores detectados o asignados

View File

@@ -0,0 +1,508 @@
### SlimeVR complete GUI translations
# Please developers (not translators) don't reuse a key inside another key
# or concat text with a translation string in the code, use the appropiate
# features like variables and selectors in each appropiate case!
# And also comment the string if it's something not easy to translate so you help
# translators on what it means
## Websocket (server) status
websocket-connecting = Serveriga ühendamine
websocket-connection_lost = Ühendus serveriga on kaotatud. Ühenduse taastamine...
## Tips
tips-find_tracker = Ei ole kindel milline jälgija on mis? Raputage jälgijat ja vaadake milline jälgija tõstetakse esile.
tips-do_not_move_heels = Veenduge, et teie kannad ei liigu salvestamise ajal!
## Body parts
body_part-NONE = Määramata
body_part-HEAD = Pea
body_part-NECK = Kael
body_part-RIGHT_SHOULDER = Parem õlg
body_part-RIGHT_UPPER_ARM = Parem õlavars
body_part-RIGHT_LOWER_ARM = Parem küünarvars
body_part-RIGHT_HAND = Parem käsi
body_part-RIGHT_UPPER_LEG = Parem reis
body_part-RIGHT_LOWER_LEG = Parem säär
body_part-RIGHT_FOOT = Parem jalg
body_part-RIGHT_CONTROLLER = Parem kontroller
body_part-CHEST = Rind
body_part-WAIST = Vöökoht
body_part-HIP = Puus
body_part-LEFT_SHOULDER = Vasak õlg
body_part-LEFT_UPPER_ARM = Vasak õlavars
body_part-LEFT_LOWER_ARM = Vasak küünarvars
body_part-LEFT_HAND = Vasak käsi
body_part-LEFT_UPPER_LEG = Vasak reis
body_part-LEFT_LOWER_LEG = Vasak säär
body_part-LEFT_FOOT = Vasak jalg
body_part-LEFT_CONTROLLER = Vasak kontroller
## Skeleton stuff
skeleton_bone-NONE = Mitte midagi
skeleton_bone-HEAD = Pea Nihe
skeleton_bone-NECK = Kaela Pikkus
skeleton_bone-TORSO = Torso Pikkus
skeleton_bone-CHEST = Rinna Vahemaa
skeleton_bone-WAIST = Vöökoha Vahemaa
skeleton_bone-HIP_OFFSET = Puusa Nihe
skeleton_bone-HIPS_WIDTH = Puusa Laius
skeleton_bone-LEGS_LENGTH = Jalgade Pikkus
skeleton_bone-KNEE_HEIGHT = Põlve Kõrgus
skeleton_bone-FOOT_LENGTH = Jala Pikkus
skeleton_bone-FOOT_SHIFT = Jala Nihe
skeleton_bone-SKELETON_OFFSET = Skeletti Nihe
skeleton_bone-CONTROLLER_DISTANCE_Z = Kontrolleri Kaugus Z
skeleton_bone-CONTROLLER_DISTANCE_Y = Kontrolleri Kaugus Y
skeleton_bone-FOREARM_LENGTH = Käsivarre Kaugus
skeleton_bone-SHOULDERS_DISTANCE = Õlgade Kaugus
skeleton_bone-SHOULDERS_WIDTH = Õlgade Laius
skeleton_bone-UPPER_ARM_LENGTH = Õlavarre Pikkus
skeleton_bone-ELBOW_OFFSET = Küünarnuki Nihe
## Tracker reset buttons
reset-reset_all = Lähtesta kõik proportsioonid
reset-full = Lähtesta
reset-mounting = Lähtesta Paigaldusasend
reset-quick = Kiir Lähtestamine
## Serial detection stuff
serial_detection-new_device-p0 = Uus jadaseade tuvastatud!
serial_detection-new_device-p1 = Sisestage enda WiFi andmed!
serial_detection-new_device-p2 = Palun valige, mida te soovite sellega teha
serial_detection-open_wifi = Ühendage WiFi-ga
serial_detection-open_serial = Avage Jadakonsool
serial_detection-submit = Jätka!
serial_detection-close = Sulge
## Navigation bar
navbar-home = Kodu
navbar-body_proportions = Keha Proportsioonid
navbar-trackers_assign = Jälgija Määramine
navbar-mounting = Jälgijate Paigalduse Kalibreerimine
navbar-onboarding = Häälestusviisard
navbar-settings = Seaded
## Bounding volume hierarchy recording
bvh-start_recording = Salvesta BVH
bvh-recording = Salvestamine...
## Overlay settings
overlay-is_visible_label = Näita Ülekatet SteamVR-is
overlay-is_mirrored_label = Näita Ülekatet Peeglina
## Tracker status
tracker-status-none = Staatuseta
tracker-status-busy = Hõivatud
tracker-status-error = Viga
tracker-status-disconnected = Ühendus katkestatud
tracker-status-occluded = Jälgija kadunud
tracker-status-ok = OK
## Tracker status columns
tracker-table-column-name = Nimi
tracker-table-column-type = Tüüp
tracker-table-column-battery = Patarei
tracker-table-column-ping = Ping
tracker-table-column-rotation = Pööre X/Y/Z
tracker-table-column-position = Positsioon X/Y/Z
tracker-table-column-url = URL
## Tracker rotation
tracker-rotation-front = Ees
tracker-rotation-left = Vasak
tracker-rotation-right = Parem
tracker-rotation-back = Taga
## Tracker information
tracker-infos-manufacturer = Tootja
tracker-infos-display_name = Kuvatav Nimi
tracker-infos-custom_name = Kohandatud Nimi
tracker-infos-url = Jälgija URL
## Tracker settings
tracker-settings-back = Minge tagasi jälgija loendise
tracker-settings-title = Jälgija Seaded
tracker-settings-assignment_section = Jälgija asukoha määramine
tracker-settings-assignment_section-description = Mis kehaosale jälgija määratud on.
tracker-settings-assignment_section-edit = Muuda jälgija asukohta
tracker-settings-mounting_section = Paigaldusasend
tracker-settings-mounting_section-description = Kuhu on jälgija paigaldatud.
tracker-settings-mounting_section-edit = Muuda paigaldusasendit
# The .<name> means it's an attribute and it's related to the top key.
# In this case that is the settings for the assignment section.
tracker-settings-name_section = Jälgija Nimi
tracker-settings-name_section-placeholder = NightyBeast-i vasak käsi
tracker-settings-name_section-description = Anna talle armas hüüdnimi :)
## Tracker part card info
tracker-part_card-no_name = Nimi puudub
tracker-part_card-unassigned = Määramata
## Body assignment menu
body_assignment_menu = Kus te soovite, et jälgija oleks?
body_assignment_menu-description = Vali asukoht kuhu te soovite, et jälgija määratakse. Alternatiivina saate te hallata kõiki jälgijaid korraga mitte ükshaaval.
body_assignment_menu-show_advanced_locations = Kuva täpsem määramise asukoht
body_assignment_menu-manage_trackers = Halda kõiki jälgijaid
body_assignment_menu-unassign_tracker = Tühista jälgija määramine
## Tracker assignment menu
# A -translation_key (with a dash in the front) means that it's a label.
# It can only be used in the translation file, it's nice for reusing names and that kind of stuff.
#
# We are using it here because english doesn't require changing the text in each case but
# maybe your language does.
-tracker_selection-part = Millist jälgijat määrata teie
tracker_selection_menu-NONE = Millise jälgija määramist soovite tühistada?
tracker_selection_menu-HEAD = { -tracker_selection-part } peale?
tracker_selection_menu-NECK = { -tracker_selection-part } kaelale?
tracker_selection_menu-RIGHT_SHOULDER = { -tracker_selection-part } paremale õlale?
tracker_selection_menu-RIGHT_UPPER_ARM = { -tracker_selection-part } paremale õlavarrele?
tracker_selection_menu-RIGHT_LOWER_ARM = { -tracker_selection-part } paremale küünarvarrele?
tracker_selection_menu-RIGHT_HAND = { -tracker_selection-part } paremale käele?
tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } paremale reiele?
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } paremale säärele?
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } paremale jalale?
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } paremale kontrollerile?
tracker_selection_menu-CHEST = { -tracker_selection-part } rind?
tracker_selection_menu-WAIST = { -tracker_selection-part } vöökoht?
tracker_selection_menu-HIP = { -tracker_selection-part } puus?
tracker_selection_menu-LEFT_SHOULDER = { -tracker_selection-part } vasakule õlale?
tracker_selection_menu-LEFT_UPPER_ARM = { -tracker_selection-part } vasakule õlavarrele?
tracker_selection_menu-LEFT_LOWER_ARM = { -tracker_selection-part } vasakule küünarvarrele_
tracker_selection_menu-LEFT_HAND = { -tracker_selection-part } vasakule käele?
tracker_selection_menu-LEFT_UPPER_LEG = { -tracker_selection-part } vasakule reiele?
tracker_selection_menu-LEFT_LOWER_LEG = { -tracker_selection-part } vasakule säärele?
tracker_selection_menu-LEFT_FOOT = { -tracker_selection-part } vasakule jalale?
tracker_selection_menu-LEFT_CONTROLLER = { -tracker_selection-part } vasakule kontrollerile?
tracker_selection_menu-unassigned = Määramata Jälgijad
tracker_selection_menu-assigned = Määratud Jälgijad
tracker_selection_menu-dont_assign = Ära määra jälgijat
## Mounting menu
mounting_selection_menu = Kus te soovite, et see jälgija paikneks?
mounting_selection_menu-close = Sulge
## Sidebar settings
settings-sidebar-title = Seaded
settings-sidebar-general = Tavaline
settings-sidebar-tracker_mechanics = Jälgija mehaanika
settings-sidebar-fk_settings = FK seaded
settings-sidebar-gesture_control = Žesti juhtimine
settings-sidebar-interface = Liides
settings-sidebar-osc_router = OSC ruuter
settings-sidebar-utils = Olemus / Lisad
settings-sidebar-serial = Jadakonsool
## SteamVR settings
settings-general-steamvr = SteamVR
settings-general-steamvr-subtitle = SteamVR jälgijad
# Not all translation keys support multiline, only the ones that specify it will actually
# split it in lines (that also means you can split in lines however you want in those).
# The first spaces (not tabs) for indentation will be ignored, just to make the file look nice when writing.
# This one is one of this cases that cares about multilines
settings-general-steamvr-description =
Luba või keela spetsiifilised SteamVR-i jälgijad.
Kasulik teatud mängudele või äppidele, mis toetavad ainult teatuid jälgijaid.
settings-general-steamvr-trackers-waist = Vöökoht
settings-general-steamvr-trackers-chest = Rind
settings-general-steamvr-trackers-feet = Jalad
settings-general-steamvr-trackers-knees = Põlved
settings-general-steamvr-trackers-elbows = Küünarnukid
settings-general-steamvr-trackers-hands = Käed
## Tracker mechanics
settings-general-tracker_mechanics = Jälgija mehaanika
settings-general-tracker_mechanics-subtitle = Filtreerimine
# This also cares about multilines
settings-general-tracker_mechanics-description =
Vali filtreerimis tüüp enda jälgijatele.
Ennustus ennustab liikumist, aga silestamine silestab liikumist.
settings-general-tracker_mechanics-filtering_type = Filtreerimise tüüp
settings-general-tracker_mechanics-filtering_type-none = Ei mingit filtreerimist
settings-general-tracker_mechanics-filtering_type-none-description = Kasutage pöörlemist nii nagu on. Ei tee mingit filtreerimist.
settings-general-tracker_mechanics-filtering_type-smoothing = Silestamine
settings-general-tracker_mechanics-filtering_type-smoothing-description = Teeb liigutused siledaks, aga lisab aega jälgija ja programmi vahel.
settings-general-tracker_mechanics-filtering_type-prediction = Ennustamine
settings-general-tracker_mechanics-filtering_type-prediction-description = Vähendab aega jälgija ja programmi vahel ja tee liigutused kiiremaks, aga võib lisada värinat.
settings-general-tracker_mechanics-amount = Summa
## FK/Tracking settings
settings-general-fk_settings = Jälgija seaded
settings-general-fk_settings-leg_tweak = Jälgija näpunäiteid
settings-general-fk_settings-leg_tweak-description = Põranda läbimine saab vähendada või isegi elimineerida jalgade positsiooni läbimist põrandaga, võib põhjustada probleeme põlvedega. Libisemise korrigeerimine korregeerib jalgade libisemist liikudes, aga võib vähendada täpsust teatud liikumiste puhul.
# 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 = Põranda läbimine
# 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)
# definition - Guesses when each foot is in contact with the ground and uses that information to improve tracking
settings-general-fk_settings-leg_tweak-skating_correction = Libisemise korrigeerimine
settings-general-fk_settings-leg_tweak-skating_correction-amount = Libisemise korrigeerimine jõud
settings-general-fk_settings-arm_fk = Käe jälgimine
settings-general-fk_settings-arm_fk-description = Muuda viisi kuidas käsi jälgitakse.
settings-general-fk_settings-arm_fk-force_arms = Sunni käed HMD-st
settings-general-fk_settings-skeleton_settings = Skeletti seaded
settings-general-fk_settings-skeleton_settings-description = Lülita skeletti seaded sisse või välja. Soovitatud on see sisse jätta.
settings-general-fk_settings-skeleton_settings-extended_spine = Selgroo laiendamine
settings-general-fk_settings-skeleton_settings-extended_pelvis = Vaagnaluu laiendamine
settings-general-fk_settings-skeleton_settings-extended_knees = Põlve laiendamine
settings-general-fk_settings-vive_emulation-title = Vive-i emulatsioon
settings-general-fk_settings-vive_emulation-description = Emuleeri vöökoha jälgija probleeme mis Vive jälgijatel on. See on nali ja teeb jälgijate täpsuse halvaks.
settings-general-fk_settings-vive_emulation-label = Luba Vive-i emulatsioon
## Gesture control settings (tracker tapping)
settings-general-gesture_control = Žesti juhtimine
settings-general-gesture_control-subtitle = Puudutusepõhised lähtestused
settings-general-gesture_control-description = Lubab lähtestada jälgija puudutades jälgijat. Jälgija kere kõige kõrgemal osal kasutatakse kiireks lähtestamiseks, jälgija vasaku jala kõige kõrgemal osal kasutatakse lähtestamiseks ja jälgija parema jala kõige kõrgemal osal kasutatakse paigalduse lähtestamiseks. Vajutused peavad toimuma 0.6 sekundi jooksul, et need registreeritaks.
# This is a unit: 3 taps, 2 taps, 1 tap
# $amount (Number) - Amount of taps (touches to the tracker's case)
settings-general-gesture_control-taps = { $amount ->
[one] 1 tap
*[other] { $amount } taps
}
settings-general-gesture_control-quickResetEnabled = Luba, et vajutus kiir lähtestab
settings-general-gesture_control-quickResetDelay = Kiir lähtestamise viivitus
settings-general-gesture_control-quickResetTaps = Kiir lähtestamis vajutus
settings-general-gesture_control-resetEnabled = Luba, et vajutus lähtestab
settings-general-gesture_control-resetDelay = Lähtestamise viivitus
settings-general-gesture_control-resetTaps = Lähtestamise vajutus
settings-general-gesture_control-mountingResetEnabled = Luba, et vajutus lähtestab paigalduseasendi
settings-general-gesture_control-mountingResetDelay = Paigaldusasendi lähtestamise viivitus
settings-general-gesture_control-mountingResetTaps = Paigaldusasendi lähtestamise vajutus
## Interface settings
settings-general-interface = Liides
settings-general-interface-dev_mode = Arendaja režiim
settings-general-interface-dev_mode-description = See režiim on kasulik, kui on vaja põhjalike andmeid või või suhelda ühendatud jälgijatega kõrgemal tasemel.
settings-general-interface-dev_mode-label = Arendaja režiim
settings-general-interface-serial_detection = Jadaseadme märkamine
settings-general-interface-serial_detection-description = See valik näitab hüpikakent iga kord kui panna sisse uus jada seade, mis võib olla jälgija. See aitab jälgija seadistusprotsessi parandada.
settings-general-interface-serial_detection-label = Jadaseadme märkamine
settings-general-interface-lang = Vaikekeel
settings-general-interface-lang-description = Muutke vaikekeelt, mida soovite kasutada.
settings-general-interface-lang-placeholder = Vali keel, mida kasutada
## Serial settings
settings-serial = Jadakonsool
# This cares about multilines
settings-serial-description =
See on reaalajas teabevoog jadaside jaoks.
Võib olla kasulik, kui on vaja teada, kas püsivara töötab.
settings-serial-connection_lost = Ühendus jadakonsooliga kaotatud. Ühenduse taastamine...
settings-serial-reboot = Taaskäivitage
settings-serial-factory_reset = Tehaseseadete taastamine
settings-serial-get_infos = Saa infot
settings-serial-serial_select = Valige jadaport
settings-serial-auto_dropdown_item = Auto
## OSC router settings
settings-osc-router = OSC ruuter
# This cares about multilines
settings-osc-router-description =
Edasta OSC-teated teisest programmidest.
Kasulik, kui kasutada teist OSC programmi näiteks VRChat-iga.
settings-osc-router-enable = Luba
settings-osc-router-enable-description = Lülitage andmete sisestamine sisse/välja.
settings-osc-router-enable-label = Luba
settings-osc-router-network = Võrgupordid
# This cares about multilines
settings-osc-router-network-description =
Lisage võrgupordid, mille pealt saata ja kuulata andmeid.
Need võivad olla samad võrgupordid mida kasutab SlimeVR server.
settings-osc-router-network-port_in =
.label = Võrguport sisse
.placeholder = Võrguport sisse (vaikimisi: 9002)
settings-osc-router-network-port_out =
.label = Võrguport välja
.placeholder = Võrguport välja (vaikimisi: 9000)
settings-osc-router-network-address = Võrgu aadress
settings-osc-router-network-address-description = Lisage võrgu aadress kuhu saata andmeid.
settings-osc-router-network-address-placeholder = IPV4 aadress
## OSC VRChat settings
settings-osc-vrchat = VRChat OSC Jälgija
# This cares about multilines
settings-osc-vrchat-description =
Muuda VRChat-i spetsiifiliseid seadeid, et saada ja saata HMD andmeid.
Jälgijate andmed FBT jaoks (töötab Questi peal ilma arvuti ühenduseta).
settings-osc-vrchat-enable = Luba
settings-osc-vrchat-enable-description = Lülitage andmete sisestamine sisse/välja.
settings-osc-vrchat-enable-label = Luba
settings-osc-vrchat-network = Võrgupordid
settings-osc-vrchat-network-description = Lisage võrgupordid andmete saamiseks ja saatmiseks VRChat-i.
settings-osc-vrchat-network-port_in =
.label = Võrguport sisse
.placeholder = Võrguport sisse (vaikimisi: 9001)
settings-osc-vrchat-network-port_out =
.label = Võrguport välja
.placeholder = Võrguport välja (vaikimisi: 9000)
settings-osc-vrchat-network-address = Võrgu aadress
settings-osc-vrchat-network-address-description = Vali, mis aadressile saata andmeid VRChat-i jaoks (kontrolli enda WiFi seadeid seadmest).
settings-osc-vrchat-network-address-placeholder = VRChat ip aadress
settings-osc-vrchat-network-trackers = Jälgia
settings-osc-vrchat-network-trackers-description = Lülita sisse/välja teatud jälgijate andmete saatmise OSC kaudu.
settings-osc-vrchat-network-trackers-chest = Rind
settings-osc-vrchat-network-trackers-waist = Vöökoht
settings-osc-vrchat-network-trackers-knees = Põlved
settings-osc-vrchat-network-trackers-feet = Jalad
settings-osc-vrchat-network-trackers-elbows = Küünarnukid
## Setup/onboarding menu
onboarding-skip = Jäta seadistamine vahele
onboarding-continue = Jätka
onboarding-wip = Töö käib
## WiFi setup
onboarding-wifi_creds-back = Mine tagasi juhistele
onboarding-wifi_creds = Sisestage enda WiFi andmed!
# This cares about multilines
onboarding-wifi_creds-description =
Jälgijad kasutavad neid andmeid, et ühendada juhtmevabalt.
Palun kasutage neid WiFi andmeid, millega te praegu olete ühendatud.
onboarding-wifi_creds-skip = Jätke WiFi seaded vahele.
onboarding-wifi_creds-submit = Jätka!
onboarding-wifi_creds-ssid =
.label = SSID
.placeholder = Sisesta SSID
onboarding-wifi_creds-password =
.label = parool
.placeholder = Sisesta parool
## Mounting setup
onboarding-reset_tutorial-back = Minge tagasi paigaldus kalibreerimisse
onboarding-reset_tutorial = Lähtesta õpetus
onboarding-reset_tutorial-description = See funktsioon pole valmis, vajutage lihtsalt nuppu Jätka
## Setup start
onboarding-home = Tere tulemast SlimeVR-i
# This cares about multilines and it's centered!!
onboarding-home-description =
Toome kogu keha jälgimise
kõigile
onboarding-home-start = Hakkame sättima!
## Enter VR part of setup
onboarding-enter_vr-back = Minge tagasi jälgijate määramisse
onboarding-enter_vr-title = Aeg minna VR-i!
onboarding-enter_vr-description = Pange selga kõik jälgijad ja VR prillid.
onboarding-enter_vr-ready = Olen valmis
## Setup done
onboarding-done-title = Kõik on valmis!
onboarding-done-description = Nautige enda kogu keha jälgimis kogemust
onboarding-done-close = Sulgege juhend
## Tracker connection setup
onboarding-connect_tracker-back = Minge tagasi WiFi andmetesse
onboarding-connect_tracker-title = Ühendage jälgijad
onboarding-connect_tracker-description-p0 = Nüüd lähme lõbusa osa juurde, ühendame kõik jälgijad-
onboarding-connect_tracker-description-p1 = Lihtsalt ühendage kõik jälgijad, mis ei ole ühendatud läbi USB enda arvutisse.
onboarding-connect_tracker-issue-serial = Mul on probleeme ühenduse loomisega!
onboarding-connect_tracker-usb = USB Jälgija
onboarding-connect_tracker-connection_status-connecting = Saadame WiFi andmeid
onboarding-connect_tracker-connection_status-connected = Ühendatud WiFi võrguga
onboarding-connect_tracker-connection_status-error = WiFi-ga ei saa ühendust luua!
onboarding-connect_tracker-connection_status-start_connecting = Jälgijate otsimine
onboarding-connect_tracker-connection_status-handshake = Ühendatud serveriga
# $amount (Number) - Amount of trackers connected (this is a number, but you can use CLDR plural rules for your language)
# More info on https://www.unicode.org/cldr/cldr-aux/charts/22/supplemental/language_plural_rules.html
# English in this case only has 2 plural rules, which are "one" and "other",
# we use 0 in an explicit way because there is no plural rule in english for 0, so we directly say
# if $amount is 0 then we say "No trackers connected"
onboarding-connect_tracker-connected_trackers = { $amount ->
[0] Mitte ühtegi jälgijat ühendatud
[one] 1 jälgija
*[other] { $amount } jälgijat
} connected
onboarding-connect_tracker-next = Olen ühendanud kõik oma jälgijad
## Tracker assignment setup
onboarding-assign_trackers-back = Minge tagasi WiFi andmetesse
onboarding-assign_trackers-title = Määrake jälgijad asukoht
onboarding-assign_trackers-description = Valime mis jälgijad lähevad kuhu. Vajutage asukohale kuhu te tahate, et jälgija läheks.
# 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
onboarding-assign_trackers-assigned = { $assigned } of { $trackers ->
[one] 1 jälgija
*[other] { $trackers } jälgijat
} assigned
onboarding-assign_trackers-advanced = Kuva täpsemad määramiskohad
onboarding-assign_trackers-next = Määrasin kõikide jälgijate asukohad
## Tracker manual mounting setup
onboarding-manual_mounting-back = Minge tagasi, et siseneda VR-i
onboarding-manual_mounting = Käsitsi paigaldamine
onboarding-manual_mounting-description = Vajutage iga jälgija peale ja valige, kuidas see on paigaldatud
onboarding-manual_mounting-auto_mounting = Automaatne paigaldamine
onboarding-manual_mounting-next = Järgmine Samm
## Tracker automatic mounting setup
onboarding-automatic_mounting-back = Minge tagasi, et siseneda VR-i
onboarding-automatic_mounting-title = Paigaldamis kalibreerimine
onboarding-automatic_mounting-description = Et SlimeVR jälgijad töötaksid peame me nendele seadistama paigaldamise pöörde, et need joondada teie füüsilise jälgijate paigaldusega.
onboarding-automatic_mounting-manual_mounting = Manuaalselt seadistamine
onboarding-automatic_mounting-next = Järgmine Samm
onboarding-automatic_mounting-prev_step = Eelmine Samm
onboarding-automatic_mounting-done-title = Paigalduse pööre kalibreeritud.
onboarding-automatic_mounting-done-description = Teie paigalduse kalibreerimine on valmis!
onboarding-automatic_mounting-done-restart = Minge algusese
onboarding-automatic_mounting-mounting_reset-title = Paigalduse lähtestamine
onboarding-automatic_mounting-mounting_reset-step-0 = 1. Kükita suusaasendis, jalad kõverad, ülakeha kallutatud ettepoole ja käed kõverad.
onboarding-automatic_mounting-mounting_reset-step-1 = 2. Vajutage "Lähtesta Paigaldusasend" nuppu ja oodage 3 sekuntit ja jälgijate paigaldusasend lähtestatakse.
onboarding-automatic_mounting-preparation-title = Ettevalmistus
onboarding-automatic_mounting-preparation-step-0 = 1. Seiske püsti, käed kõrval.
onboarding-automatic_mounting-preparation-step-1 = 2. Vajutage "Lähtesta" nuppu ja oodage 3 sekundit ja jälgijad lähtestatakse.
onboarding-automatic_mounting-put_trackers_on-title = Pange kõik jälgijad peale
onboarding-automatic_mounting-put_trackers_on-description = Et kalibreerida jälgijate paigaldus asendi pööret pange kõik jälgijad peale ja nüüd te näete mis on mis jälgijad paremal pool ekraani.
onboarding-automatic_mounting-put_trackers_on-next = Mul on kõik jälgijad küljes
## Tracker manual proportions setup
onboarding-manual_proportions-back = Mine tagasi lähtestamise õppetusse
onboarding-manual_proportions-title = Käsitsi keha proportsioonid
onboarding-manual_proportions-precision = Täpne reguleerimine
onboarding-manual_proportions-auto = Automaatne kalibreerimine
## Tracker automatic proportions setup
onboarding-automatic_proportions-back = Mine tagasi lähtestamise õppetusse
onboarding-automatic_proportions-title = Mõõtke oma keha
onboarding-automatic_proportions-description = Et SlimeVR jälgijad töötaks peame me teadma teie kontide pikkust. See lühike kalibreerimine mõõdab selle teie jaoks.
onboarding-automatic_proportions-manual = Manuaalne Kalibreerimine
onboarding-automatic_proportions-prev_step = Eelmine Samm
onboarding-automatic_proportions-put_trackers_on-title = Pange kõik jälgijad peale
onboarding-automatic_proportions-put_trackers_on-description = Et kalibreerida teie proportsioone pange kõik jälgijad peale ja te näete mis on mis jälgijad paremal pool ekraani.
onboarding-automatic_proportions-put_trackers_on-next = Mul on kõik jälgijad küljes
onboarding-automatic_proportions-preparation-title = Ettevalmistus
onboarding-automatic_proportions-preparation-description = Võtke tool ja pange see täpselt enda seljataha maha mänguruumi sisse. Olge valmis maha istuma et seadistada autobone.
onboarding-automatic_proportions-preparation-next = Ma olen enda tooli ees
onboarding-automatic_proportions-start_recording-title = Olge valmis liikuma
onboarding-automatic_proportions-start_recording-description = Me nüüd salvestame teatud poose ja liigutusi neid näete järgmisel ekraanil. Olge valmis, kui te vajutate nuppu!
onboarding-automatic_proportions-start_recording-next = Alusta salvestamist
onboarding-automatic_proportions-recording-title = REC
onboarding-automatic_proportions-recording-description-p0 = Salvestamine on pooleli...
onboarding-automatic_proportions-recording-description-p1 = Tehke allpool näidatud liigutusi:
onboarding-automatic_proportions-recording-steps-0 = Painutage põlvi paar korda.
onboarding-automatic_proportions-recording-steps-1 = Istuge toolile ja tõuske püsti.
onboarding-automatic_proportions-recording-steps-2 = Keerake ülakeha vasakule, seejärel paremale.
onboarding-automatic_proportions-recording-steps-3 = Keerake ülakeha paremale, seejärel vasakule.
onboarding-automatic_proportions-recording-steps-4 = Liigutage ringi, kuni taimer lõpeb.
onboarding-automatic_proportions-recording-processing = Tulemuse töötlemine
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 15)
onboarding-automatic_proportions-recording-timer = { $time ->
[one] 1 sekund
*[other] { $time } sekundit
}
onboarding-automatic_proportions-verify_results-title = Kontrollige tulemust
onboarding-automatic_proportions-verify_results-description = Kontrollige tulemust all, kas kõik näeb välja korrektne?
onboarding-automatic_proportions-verify_results-results = Salvestame tulemused
onboarding-automatic_proportions-verify_results-processing = Tulemuse töötlemine
onboarding-automatic_proportions-verify_results-redo = Tee salvestus uuesti
onboarding-automatic_proportions-verify_results-confirm = Nad on õiged
onboarding-automatic_proportions-done-title = Kere mõõdetud ja salvestatud.
onboarding-automatic_proportions-done-description = Teie keha proportsioonid kalibreerimine on valmis!
## Home
home-no_trackers = Jälgijaid ei tuvastatud ega määratud

View File

@@ -0,0 +1,519 @@
### SlimeVR complete GUI translations
# Please developers (not translators) don't reuse a key inside another key
# or concat text with a translation string in the code, use the appropriate
# features like variables and selectors in each appropriate case!
# And also comment the string if it's something not easy to translate, so you help
# translators on what it means
## Websocket (server) status
websocket-connecting = Connexion au serveur..
websocket-connection_lost = Connexion avec le serveur perdue. Reconnexion...
## Tips
tips-find_tracker = Impossible de différencier vos capteurs? Secouez-en un pour qu'il soit mis en évidence.
tips-do_not_move_heels = Assurez-vous de ne pas bouger vos pieds pendant la calibration!
## Body parts
body_part-NONE = Non-assigné
body_part-HEAD = Tête
body_part-NECK = Cou
body_part-RIGHT_SHOULDER = Épaule droite
body_part-RIGHT_UPPER_ARM = Bras droit
body_part-RIGHT_LOWER_ARM = Avant-bras droit
body_part-RIGHT_HAND = Main droite
body_part-RIGHT_UPPER_LEG = Cuisse droite
body_part-RIGHT_LOWER_LEG = Cheville droite
body_part-RIGHT_FOOT = Pied droit
body_part-RIGHT_CONTROLLER = Right controller
body_part-CHEST = Poitrine
body_part-WAIST = Taille
body_part-HIP = Hanche
body_part-LEFT_SHOULDER = Épaule gauche
body_part-LEFT_UPPER_ARM = Bras gauche
body_part-LEFT_LOWER_ARM = Avant-bras gauche
body_part-LEFT_HAND = Main gauche
body_part-LEFT_UPPER_LEG = Cuisse gauche
body_part-LEFT_LOWER_LEG = Cheville gauche
body_part-LEFT_FOOT = Pied gauche
body_part-LEFT_CONTROLLER = Left controller
## Skeleton stuff
skeleton_bone-NONE = Aucun
skeleton_bone-HEAD = Décalage de la tête
skeleton_bone-NECK = Longueur du cou
skeleton_bone-TORSO = Longueur du torse
skeleton_bone-CHEST = Distance de la poitrine
skeleton_bone-WAIST = Distance de la taille
skeleton_bone-HIP_OFFSET = Écart de la hanche
skeleton_bone-HIPS_WIDTH = Largeur des hanches
skeleton_bone-LEGS_LENGTH = Longueur des jambes
skeleton_bone-KNEE_HEIGHT = Hauteur des genoux
skeleton_bone-FOOT_LENGTH = Longueur des pieds
skeleton_bone-FOOT_SHIFT = Décalage des pieds
skeleton_bone-SKELETON_OFFSET = Écart du squelette
skeleton_bone-CONTROLLER_DISTANCE_Z = Distance Z des contrôleurs
skeleton_bone-CONTROLLER_DISTANCE_Y = Distance Y des contrôleurs
skeleton_bone-FOREARM_LENGTH = Longueur des avant-bras
skeleton_bone-SHOULDERS_DISTANCE = Distance des épaules
skeleton_bone-SHOULDERS_WIDTH = Largeur des épaules
skeleton_bone-UPPER_ARM_LENGTH = Longueur des bras supérieurs
skeleton_bone-ELBOW_OFFSET = Écart des coudes
## Tracker reset buttons
reset-reset_all = Réinitialiser toutes les proportions
reset-full = Réinitialiser
reset-mounting = Réinitialiser l'alignement
reset-quick = Réinitialisation rapide
## Serial detection stuff
serial_detection-new_device-p0 = Nouveau périphérique détecté!
serial_detection-new_device-p1 = Entrez vos identifiants Wi-Fi!
serial_detection-new_device-p2 = Veuillez sélectionner quoi en faire
serial_detection-open_wifi = Connecter au Wi-Fi
serial_detection-open_serial = Ouvrir la console série
serial_detection-submit = Soumettre!
serial_detection-close = Fermer
## Navigation bar
navbar-home = Accueil
navbar-body_proportions = Proportions du corps
navbar-trackers_assign = Asignement des capteurs
navbar-mounting = Alignement des capteurs
navbar-onboarding = Assistant de configuration
navbar-settings = Réglages
## Bounding volume hierarchy recording
bvh-start_recording = Enregistrer BVH
bvh-recording = Enregistrement...
## Overlay settings
overlay-is_visible_label = Superposer le squelette dans SteamVR
overlay-is_mirrored_label = Afficher le squelette en tant que miroir
## Tracker status
tracker-status-none = Pas de statut
tracker-status-busy = Occupé
tracker-status-error = Erreur
tracker-status-disconnected = Déconnecté
tracker-status-occluded = Obstrué
tracker-status-ok = OK
## Tracker status columns
tracker-table-column-name = Nom
tracker-table-column-type = Type
tracker-table-column-battery = Batterie
tracker-table-column-ping = Ping
tracker-table-column-rotation = Rotation X/Y/Z
tracker-table-column-position = Position X/Y/Z
tracker-table-column-url = URL
## Tracker rotation
tracker-rotation-front = Avant
tracker-rotation-left = Gauche
tracker-rotation-right = Droite
tracker-rotation-back = Arrière
## Tracker information
tracker-infos-manufacturer = Fabricant
tracker-infos-display_name = Nom
tracker-infos-custom_name = Nom personnalisé
tracker-infos-url = URL
## Tracker settings
tracker-settings-back = Retour à la liste des capteurs
tracker-settings-title = Paramètres du capteur
tracker-settings-assignment_section = Assignement du capteur
tracker-settings-assignment_section-description = À quelle partie du corps le capteur est assigné.
tracker-settings-assignment_section-edit = Ré-assigner
tracker-settings-mounting_section = Orientation du capteur
tracker-settings-mounting_section-description = Dans quelle direction pointe le capteur?
tracker-settings-mounting_section-edit = Changer l'orientation
tracker-settings-drift_compensation_section = Permettre la compensation de la dérive
tracker-settings-drift_compensation_section-description = Ce capteur devrait-il compenser pour sa dérive si l'option est activée?
tracker-settings-drift_compensation_section-edit = Permettre la compensation de la dérive
# The .<name> means it's an attribute and it's related to the top key.
# In this case that is the settings for the assignment section.
tracker-settings-name_section = Nom personalisé
tracker-settings-name_section-description = Donnez-lui un joli surnom :3
tracker-settings-name_section-placeholder = Patte gauche d'Erimel
## Tracker part card info
tracker-part_card-no_name = Sans nom
tracker-part_card-unassigned = Non attribué
## Body assignment menu
body_assignment_menu = Où assigner ce capteur?
body_assignment_menu-description = Choisissez l'endroit où assigner ce capteur. Vous pouvez également gérer tous les capteurs à la fois.
body_assignment_menu-show_advanced_locations = Afficher les emplacements d'attribution avancés
body_assignment_menu-manage_trackers = Gérer tous les capteurs
body_assignment_menu-unassign_tracker = Désassigner
## Tracker assignment menu
# A -translation_key (with a dash in the front) means that it's a label.
# It can only be used in the translation file, it's nice for reusing names and that kind of stuff.
#
# We are using it here because english doesn't require changing the text in each case but
# maybe your language does.
-tracker_selection-part = Which tracker to assign to your
tracker_selection_menu-NONE = Which tracker do you want to be unassigned?
tracker_selection_menu-HEAD = { -tracker_selection-part } head?
tracker_selection_menu-NECK = { -tracker_selection-part } neck?
tracker_selection_menu-RIGHT_SHOULDER = { -tracker_selection-part } right shoulder?
tracker_selection_menu-RIGHT_UPPER_ARM = { -tracker_selection-part } right upper arm?
tracker_selection_menu-RIGHT_LOWER_ARM = { -tracker_selection-part } right lower arm?
tracker_selection_menu-RIGHT_HAND = { -tracker_selection-part } right hand?
tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } right thigh?
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } right ankle?
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } right foot?
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } right controller?
tracker_selection_menu-CHEST = { -tracker_selection-part } chest?
tracker_selection_menu-WAIST = { -tracker_selection-part } waist?
tracker_selection_menu-HIP = { -tracker_selection-part } hip?
tracker_selection_menu-LEFT_SHOULDER = { -tracker_selection-part } left shoulder?
tracker_selection_menu-LEFT_UPPER_ARM = { -tracker_selection-part } left upper arm?
tracker_selection_menu-LEFT_LOWER_ARM = { -tracker_selection-part } left lower arm?
tracker_selection_menu-LEFT_HAND = { -tracker_selection-part } left hand?
tracker_selection_menu-LEFT_UPPER_LEG = { -tracker_selection-part } left thigh?
tracker_selection_menu-LEFT_LOWER_LEG = { -tracker_selection-part } left ankle?
tracker_selection_menu-LEFT_FOOT = { -tracker_selection-part } left foot?
tracker_selection_menu-LEFT_CONTROLLER = { -tracker_selection-part } left controller?
tracker_selection_menu-unassigned = Capteurs non assignés
tracker_selection_menu-assigned = Capteurs assignés
tracker_selection_menu-dont_assign = Ne pas attribuer
## Mounting menu
mounting_selection_menu = Dans quelle direction pointe ce capteur?
mounting_selection_menu-close = Fermer
## Sidebar settings
settings-sidebar-title = Réglages
settings-sidebar-general = Général
settings-sidebar-tracker_mechanics = Paramètres des capteurs
settings-sidebar-fk_settings = Paramètres de la capture
settings-sidebar-gesture_control = Contrôle gestuel
settings-sidebar-interface = Interface
settings-sidebar-osc_router = Routeur OSC
settings-sidebar-utils = Utilitaires
settings-sidebar-serial = Console série
## SteamVR settings
settings-general-steamvr = SteamVR
settings-general-steamvr-subtitle = Capteurs SteamVR
# Not all translation keys support multiline, only the ones that specify it will actually
# split it in lines (that also means you can split in lines however you want in those).
# The first spaces (not tabs) for indentation will be ignored, just to make the file look nice when writing.
# This one is one of this cases that cares about multilines
settings-general-steamvr-description =
Activez ou désactivez des capteurs SteamVR.
Utile pour les jeux ou applications qui ne supportent que certains capteurs.
settings-general-steamvr-trackers-waist = Taille
settings-general-steamvr-trackers-chest = Poitrine
settings-general-steamvr-trackers-feet = Pieds
settings-general-steamvr-trackers-knees = Genoux
settings-general-steamvr-trackers-elbows = Coudes
settings-general-steamvr-trackers-hands = Mains
## Tracker mechanics
settings-general-tracker_mechanics = Paramètres des capteurs
settings-general-tracker_mechanics-filtering = Filtrage
# This also cares about multilines
settings-general-tracker_mechanics-filtering-description =
Choisissez le type de filtrage pour vos capteurs.
La prédiction prédit les mouvements tandis que la fluidification rend les mouvements plus fluides.
settings-general-tracker_mechanics-filtering-type = Type de filtrage
settings-general-tracker_mechanics-filtering-type-none = Pas de filtrage
settings-general-tracker_mechanics-filtering-type-none-description = Utilisez les rotations telles quelles.
settings-general-tracker_mechanics-filtering-type-smoothing = Fluidification
settings-general-tracker_mechanics-filtering-type-smoothing-description = Fluidifie les mouvements mais ajoute un peu de latence.
settings-general-tracker_mechanics-filtering-type-prediction = Prédiction
settings-general-tracker_mechanics-filtering-type-prediction-description = Réduit la latence et rend les mouvements plus vifs, mais moins fluides.
settings-general-tracker_mechanics-filtering-amount = Intensité du filtrage
settings-general-tracker_mechanics-drift_compensation = Compensation de la dérive
# This cares about multilines
settings-general-tracker_mechanics-drift_compensation-description =
Compense la dérive des gyroscopes en appliquant une rotation inverse.
Modifier la force de la compensation et le nombre de réinitialisations prises en compte.
settings-general-tracker_mechanics-drift_compensation-enabled-label = Compensation de la dérive
settings-general-tracker_mechanics-drift_compensation-amount-label = Force de la compensation
settings-general-tracker_mechanics-drift_compensation-max_resets-label = Nombre de réinitialisations prises en compte
## FK/Tracking settings
settings-general-fk_settings = Paramètres de la capture
settings-general-fk_settings-leg_tweak = Ajustement des jambes
settings-general-fk_settings-leg_tweak-description = Le limitage au sol empêche vos pieds de traverser le sol, mais peut causer des problèmes lorsque vous êtes à genoux. La correction du glissement réduit le glissement, mais peut réduire la précision de certains mouvements.
# 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 = Limitage au sol
# 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)
# definition - Guesses when each foot is in contact with the ground and uses that information to improve tracking
settings-general-fk_settings-leg_tweak-skating_correction = Correction du glissement
settings-general-fk_settings-leg_tweak-skating_correction-amount = Force de la correction du glissement
settings-general-fk_settings-arm_fk = Capture des bras
settings-general-fk_settings-arm_fk-description = Changez la façon dont les bras sont captés.
settings-general-fk_settings-arm_fk-force_arms = Forcer les bras en provenance du casque VR
settings-general-fk_settings-skeleton_settings = Paramètres du squelette
settings-general-fk_settings-skeleton_settings-description = Activez ou désactivez des paramètres avancés de capture.
settings-general-fk_settings-skeleton_settings-extended_spine = Colone vertébrale avancée
settings-general-fk_settings-skeleton_settings-extended_pelvis = Bassin avancé
settings-general-fk_settings-skeleton_settings-extended_knees = Genoux avancés
settings-general-fk_settings-vive_emulation-title = Vive emulation
settings-general-fk_settings-vive_emulation-description = Emulate the waist tracker problems that Vive trackers have. This is a joke and makes tracking worse.
settings-general-fk_settings-vive_emulation-label = Enable Vive emulation
## Gesture control settings (tracker tapping)
settings-general-gesture_control = Contrôle gestuel
settings-general-gesture_control-subtitle = Double tape pour réinitialisation rapide
settings-general-gesture_control-description = Permet de déclencher des réinitialisations en tapant un capteur. Le capteur le plus haut sur votre torse est utilisé pour la réinitialisation rapide, le capteur le plus haut sur votre jambe gauche est utilisé pour la réinitialisation, et le capteur le plus haut sur votre jambe droite est utilisé pour la réinitialisation de l'alignement. Les tapes doivent être enchainées en moins de 0,6 seconde pour être pris en compte.
# This is a unit: 3 taps, 2 taps, 1 tap
# $amount (Number) - Amount of taps (touches to the tracker's case)
settings-general-gesture_control-taps = { $amount ->
[one] 1 tap
*[other] { $amount } taps
}
settings-general-gesture_control-quickResetEnabled = Taper pour réinitialisation rapide
settings-general-gesture_control-quickResetDelay = Délai de réinitialisation rapide
settings-general-gesture_control-quickResetTaps = Tapes pour réinitialisation rapide
settings-general-gesture_control-resetEnabled = Taper pour réinitialisation
settings-general-gesture_control-resetDelay = Délai de réinitialisation
settings-general-gesture_control-resetTaps = Tapes pour réinitialisation
settings-general-gesture_control-mountingResetEnabled = Taper pour réinitialisation de l'alignement
settings-general-gesture_control-mountingResetDelay = Délai de réinitialisation de l'alignement
settings-general-gesture_control-mountingResetTaps = Tapes pour la réinitialisation de l'alignement
## Interface settings
settings-general-interface = Interface
settings-general-interface-dev_mode = Mode développeur
settings-general-interface-dev_mode-description = Ce mode peut être utile pour avoir des données approfondies ou pour interagir avec des capteurs connectés à un niveau plus avancé.
settings-general-interface-dev_mode-label = Mode développeur
settings-general-interface-serial_detection = Détection de périphérique série
settings-general-interface-serial_detection-description = Cette option affichera une fenêtre chaque fois qu'un nouveau périphérique série qui pourrait être un capteur est connecté.
settings-general-interface-serial_detection-label = Détection de périphérique série
settings-general-interface-lang = Sélectionner la langue
settings-general-interface-lang-description = Choisir la langue par défaut.
settings-general-interface-lang-placeholder = Choisissez la langue
## Serial settings
settings-serial = Console série
# This cares about multilines
settings-serial-description =
Il s'agit d'un flux d'informations en direct pour la communication en série.
Peut être utile pour savoir si un capteur fonctionne correctement.
settings-serial-connection_lost = Connexion à l'appareil perdue, reconnexion...
settings-serial-reboot = Redémarrer
settings-serial-factory_reset = Remise à zéro
settings-serial-get_infos = Obtenir des informations
settings-serial-serial_select = Sélectionnez un port série
settings-serial-auto_dropdown_item = Automatique
## OSC router settings
settings-osc-router = Routeur OSC
# This cares about multilines
settings-osc-router-description =
Transférez les messages OSC provenant d'un autre programme
Utile pour utiliser un autre programme OSC avec VRChat par exemple.
settings-osc-router-enable = Activer
settings-osc-router-enable-description = Activer/désactiver le transfert de messages.
settings-osc-router-enable-label = Activer
settings-osc-router-network = Ports réseau
# This cares about multilines
settings-osc-router-network-description =
Définissez les ports pour écouter et envoyer des données.
Ces ports peuvent être les mêmes que les autres utilisés dans le serveur SlimeVR.
settings-osc-router-network-port_in =
.label = Port de réception
.placeholder = Port de réception (par défaut: 9002)
settings-osc-router-network-port_out =
.label = Port d'envoi
.placeholder = Port d'envoi (par défaut: 9000)
settings-osc-router-network-address = Adresse réseau
settings-osc-router-network-address-description = Choisissez l'adresse vers laquelle envoyer les données.
settings-osc-router-network-address-placeholder = Adresse IPv4
## OSC VRChat settings
settings-osc-vrchat = VRChat OSC Trackers
# This cares about multilines
settings-osc-vrchat-description =
Modifiez les paramètres spécifiques à VRChat pour recevoir et envoyer
des capteurs par OSC (fonctionne sur Quest sans PC).
settings-osc-vrchat-enable = Activer
settings-osc-vrchat-enable-description = Activer/désactiver l'envoi et la réception de données.
settings-osc-vrchat-enable-label = Activer
settings-osc-vrchat-network = Connexions réseau
settings-osc-vrchat-network-description = Définissez les ports pour écouter et envoyer des données à VRChat.
settings-osc-vrchat-network-port_in =
.label = Port d'entrée
.placeholder = Port de réception (par défaut : 9001)
settings-osc-vrchat-network-port_out =
.label = Port de sortie
.placeholder = Port d'envoi (par défaut : 9000)
settings-osc-vrchat-network-address = Adresse réseau
settings-osc-vrchat-network-address-description = Choisissez l'adresse à laquelle envoyer les données à VRChat (vérifiez les réseaux Wi-Fi de votre appareil).
settings-osc-vrchat-network-address-placeholder = Adresse IP VRChat
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-waist = Taille
settings-osc-vrchat-network-trackers-knees = Genoux
settings-osc-vrchat-network-trackers-feet = Pieds
settings-osc-vrchat-network-trackers-elbows = Coudes
## Setup/onboarding menu
onboarding-skip = Passer
onboarding-continue = Continuer
onboarding-wip = Pas encore implémenté
## WiFi setup
onboarding-wifi_creds-back = Retour à l'introduction
onboarding-wifi_creds = Saisir les identifiants Wi-Fi
# This cares about multilines
onboarding-wifi_creds-description =
Les capteurs utiliseront ces informations d'identification pour se connecter au réseau.
Veuillez utiliser les identifiants avec lesquels vous êtes actuellement connecté.
onboarding-wifi_creds-skip = Passer la configuration Wi-Fi
onboarding-wifi_creds-submit = Valider
onboarding-wifi_creds-ssid =
.label = SSID
.placeholder = Enter SSID
onboarding-wifi_creds-password =
.label = Password
.placeholder = Enter password
## Mounting setup
onboarding-reset_tutorial-back = Retourner à l'alignement des capteurs
onboarding-reset_tutorial = Didacticiel de réinitialisation
onboarding-reset_tutorial-description = Cette fonctionnalité n'est pas encore terminée, appuyez simplement sur continuer
## Setup start
onboarding-home = Bienvenue sur SlimeVR
# This cares about multilines and it's centered!!
onboarding-home-description =
Rendre la capture des mouvements
accessible à toutes et tous!
onboarding-home-start = Commencer!
## Enter VR part of setup
onboarding-enter_vr-back = Revenir à l'attribution des capteurs
onboarding-enter_vr-title = Il est temps d'entrer en réalité virtuelle!
onboarding-enter_vr-description = Enfilez tous vos capteurs puis entrez en réalité virtuelle!
onboarding-enter_vr-ready = je suis prêt!
## Setup done
onboarding-done-title = Vous êtes prêt!
onboarding-done-description = Amusez-vous bien :)
onboarding-done-close = Fermer le guide
## Tracker connection setup
onboarding-connect_tracker-back = Revenir aux informations d'identification Wi-Fi
onboarding-connect_tracker-title = Connecter les capteurs
onboarding-connect_tracker-description-p0 = Passons maintenant à la partie amusante, en connectant tous les capteurs!
onboarding-connect_tracker-description-p1 = Connectez chaque capteur qui n'est pas encore connecté via un port USB.
onboarding-connect_tracker-issue-serial = J'ai du mal à me connecter!
onboarding-connect_tracker-usb = Capteur USB
onboarding-connect_tracker-connection_status-connecting = Envoi d'identifiants Wi-Fi
onboarding-connect_tracker-connection_status-connected = Connecté au Wi-Fi
onboarding-connect_tracker-connection_status-error = Impossible de se connecter au réseau
onboarding-connect_tracker-connection_status-start_connecting = Recherche de capteurs
onboarding-connect_tracker-connection_status-handshake = Connecté au serveur
# $amount (Number) - Amount of trackers connected (this is a number, but you can use CLDR plural rules for your language)
# More info on https://www.unicode.org/cldr/cldr-aux/charts/22/supplemental/language_plural_rules.html
# English in this case only has 2 plural rules, which are "one" and "other",
# we use 0 in an explicit way because there is no plural rule in english for 0, so we directly say
# if $amount is 0 then we say "No trackers connected"
onboarding-connect_tracker-connected_trackers = { $amount ->
[0] No trackers
[one] 1 tracker
*[other] { $amount } trackers
} connected
onboarding-connect_tracker-next = J'ai connecté tous mes capteurs
## Tracker assignment setup
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.
# 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
onboarding-assign_trackers-assigned = { $assigned } of { $trackers ->
[one] 1 tracker
*[other] { $trackers } trackers
} assigned
onboarding-assign_trackers-advanced = Afficher les emplacements d'attribution avancés
onboarding-assign_trackers-next = J'ai assigné tous mes capteurs
## Tracker manual mounting setup
onboarding-manual_mounting-back = Retournez à entrer dans la réalité virtuelle
onboarding-manual_mounting = Alignement manuel
onboarding-manual_mounting-description = Cliquez sur chaque capteur et sélectionnez la manière dont ils sont orientés
onboarding-manual_mounting-auto_mounting = Détection automatique
onboarding-manual_mounting-next = Prochaine étape
## Tracker automatic mounting setup
onboarding-automatic_mounting-back = Retournez à entrer dans la réalité virtuelle
onboarding-automatic_mounting-title = Calibration de l'alignement des capteurs
onboarding-automatic_mounting-description = Pour que vos capteurs SlimeVR fonctionnent, nous devons attribuer une rotation à vos capteurs pour les aligner avec la rotation réelle de ces derniers.
onboarding-automatic_mounting-manual_mounting = Alignement manuel
onboarding-automatic_mounting-next = Prochaine étape
onboarding-automatic_mounting-prev_step = Étape précédente
onboarding-automatic_mounting-done-title = C'est terminé!
onboarding-automatic_mounting-done-description = L'alignement des capteurs est calibré!
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-preparation-title = Préparation
onboarding-automatic_mounting-preparation-step-0 = 1. Tenez-vous debout avec vos bras à vos côtés.
onboarding-automatic_mounting-preparation-step-1 = 2. Appuyez sur le bouton "Réinitialiser" et attendez 3 secondes avant que les capteurs ne se réinitialisent.
onboarding-automatic_mounting-put_trackers_on-title = Enfilez vos capteurs
onboarding-automatic_mounting-put_trackers_on-description = Pour calibrer l'alignement, nous allons utiliser les capteurs que vous venez d'affecter.
onboarding-automatic_mounting-put_trackers_on-next = J'ai tous mes capteurs
## Tracker manual proportions setup
onboarding-manual_proportions-back = Revenir au didacticiel de réinitialisation
onboarding-manual_proportions-title = Proportions manuelles du corps
onboarding-manual_proportions-precision = Ajustement de précision
onboarding-manual_proportions-auto = Calibration automatique
## Tracker automatic proportions setup
onboarding-automatic_proportions-back = Revenir au didacticiel de réinitialisation
onboarding-automatic_proportions-title = Calibration des proportions du corps
onboarding-automatic_proportions-description = Pour que les capteurs SlimeVR fonctionnent, nous devons connaître la longueur de vos os.
onboarding-automatic_proportions-manual = Calibration manuelle
onboarding-automatic_proportions-prev_step = Étape précédente
onboarding-automatic_proportions-put_trackers_on-title = Enfilez vos capteurs
onboarding-automatic_proportions-put_trackers_on-description = Pour calibrer vos proportions, nous allons utiliser les capteurs que vous venez d'assigner.
onboarding-automatic_proportions-put_trackers_on-next = J'ai tous mes capteurs
onboarding-automatic_proportions-preparation-title = Préparation
onboarding-automatic_proportions-preparation-description = Placez une chaise directement derrière vous dans votre espace de jeu.
onboarding-automatic_proportions-preparation-next = je suis devant une chaise
onboarding-automatic_proportions-start_recording-title = Préparez-vous à bouger
onboarding-automatic_proportions-start_recording-description = Nous allons maintenant enregistrer des poses et des mouvements spécifiques.
onboarding-automatic_proportions-start_recording-next = Commencer l'enregistrement
onboarding-automatic_proportions-recording-title = Enregistrement
onboarding-automatic_proportions-recording-description-p0 = Enregistrement en cours...
onboarding-automatic_proportions-recording-description-p1 = Effectuez les mouvements indiqués ci-dessous:
onboarding-automatic_proportions-recording-steps-0 = Pliez les genoux plusieurs fois.
onboarding-automatic_proportions-recording-steps-1 = Asseyez-vous sur une chaise puis levez-vous.
onboarding-automatic_proportions-recording-steps-2 = Tournez le haut du corps vers la gauche, puis panchez vers la droite.
onboarding-automatic_proportions-recording-steps-3 = Tournez le haut du corps vers la droite, puis panchez vers la gauche.
onboarding-automatic_proportions-recording-steps-4 = Remuez jusqu'à ce que la minuterie se termine.
onboarding-automatic_proportions-recording-processing = Traitement du résultat
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 15)
onboarding-automatic_proportions-recording-timer = { $time ->
[one] 1 second left
*[other] { $time } seconds left
}
onboarding-automatic_proportions-verify_results-title = Vérifier les résultats
onboarding-automatic_proportions-verify_results-description = Les résultats ci-dessous vous semblent-ils corrects?
onboarding-automatic_proportions-verify_results-results = Enregistrement des résultats
onboarding-automatic_proportions-verify_results-processing = Traitement du résultat
onboarding-automatic_proportions-verify_results-redo = Refaire l'enregistrement
onboarding-automatic_proportions-verify_results-confirm = Les resultats sont corrects
onboarding-automatic_proportions-done-title = Calibration terminée
onboarding-automatic_proportions-done-description = Votre calibration est terminée!
## Home
home-no_trackers = Aucun capteur détecté ou attribué

View File

@@ -0,0 +1,519 @@
### SlimeVR complete GUI translations
# Please developers (not translators) don't reuse a key inside another key
# or concat text with a translation string in the code, use the appropriate
# features like variables and selectors in each appropriate case!
# And also comment the string if it's something not easy to translate, so you help
# translators on what it means
## Websocket (server) status
websocket-connecting = Connessione al server in corso
websocket-connection_lost = Connessione con il server persa. Tentativo di riconnessione in corso...
## Tips
tips-find_tracker = Non sei sicurə quale tracker è quale? Agitalo e l'oggetto corrispondente sarà evidenziato.
tips-do_not_move_heels = Assicurati di non muovere i tuoi talloni durante la registrazione!
## Body parts
body_part-NONE = Non assegnato
body_part-HEAD = Testa
body_part-NECK = Collo
body_part-RIGHT_SHOULDER = Spalla destra
body_part-RIGHT_UPPER_ARM = Braccio destro
body_part-RIGHT_LOWER_ARM = Avambraccio destro
body_part-RIGHT_HAND = Mano destra
body_part-RIGHT_UPPER_LEG = Coscia destra
body_part-RIGHT_LOWER_LEG = Caviglia destra
body_part-RIGHT_FOOT = Piede destro
body_part-RIGHT_CONTROLLER = Right controller
body_part-CHEST = Petto
body_part-WAIST = Girovita
body_part-HIP = Fianchi
body_part-LEFT_SHOULDER = Spalla sinistra
body_part-LEFT_UPPER_ARM = Braccio sinistro
body_part-LEFT_LOWER_ARM = Avambraccio sinistro
body_part-LEFT_HAND = Mano sinistra
body_part-LEFT_UPPER_LEG = Coscia sinistra
body_part-LEFT_LOWER_LEG = Caviglia sinistra
body_part-LEFT_FOOT = Piede sinistro
body_part-LEFT_CONTROLLER = Left controller
## Skeleton stuff
skeleton_bone-NONE = Non assegnato
skeleton_bone-HEAD = Correzione Testa
skeleton_bone-NECK = Lunghezza Collo
skeleton_bone-TORSO = Torso Lunghezza
skeleton_bone-CHEST = Distanza Petto
skeleton_bone-WAIST = Distanza Girovita
skeleton_bone-HIP_OFFSET = Correzione Fianchi
skeleton_bone-HIPS_WIDTH = Larghezza Fianchi
skeleton_bone-LEGS_LENGTH = Lunghezza Gambe
skeleton_bone-KNEE_HEIGHT = Altezza Ginocchia
skeleton_bone-FOOT_LENGTH = Lunghezza Piedi
skeleton_bone-FOOT_SHIFT = Correzione Piedi
skeleton_bone-SKELETON_OFFSET = Compensazione scheletro
skeleton_bone-CONTROLLER_DISTANCE_Z = Distanza Z Controller
skeleton_bone-CONTROLLER_DISTANCE_Y = Distanza Y Controller
skeleton_bone-FOREARM_LENGTH = Distanza Avambracci
skeleton_bone-SHOULDERS_DISTANCE = Distanza Spalle
skeleton_bone-SHOULDERS_WIDTH = Larghezza Spalle
skeleton_bone-UPPER_ARM_LENGTH = Lunghezza Braccia
skeleton_bone-ELBOW_OFFSET = Correzione Gomito
## Tracker reset buttons
reset-reset_all = Ripristina tutte le proporzioni
reset-full = Ripristina
reset-mounting = Ripristina posizionamento
reset-quick = Reset veloce
## Serial detection stuff
serial_detection-new_device-p0 = Nuovo dispositivo seriale rilevato!
serial_detection-new_device-p1 = Inserisci le tue credenziali WiFi!
serial_detection-new_device-p2 = Seleziona come utilizzare il tracker, per piacere
serial_detection-open_wifi = Connetti al WiFi
serial_detection-open_serial = Apri la Serial Console
serial_detection-submit = Conferma!
serial_detection-close = Chiudi
## Navigation bar
navbar-home = Home
navbar-body_proportions = Proporzioni del corpo
navbar-trackers_assign = Assegnazione dei tracker
navbar-mounting = Calibrazione della posizionamento
navbar-onboarding = Installazione guidata
navbar-settings = Impostazioni
## Bounding volume hierarchy recording
bvh-start_recording = Registra BVH
bvh-recording = Registrazione in corso...
## Overlay settings
overlay-is_visible_label = Mostra Overlay in SteamVR
overlay-is_mirrored_label = Includi uno specchio nel Overlay
## Tracker status
tracker-status-none = Nessuno Stato
tracker-status-busy = Occupato
tracker-status-error = Errore
tracker-status-disconnected = Disconnesso
tracker-status-occluded = Ostruito
tracker-status-ok = Connesso
## Tracker status columns
tracker-table-column-name = Nome
tracker-table-column-type = Tipologia
tracker-table-column-battery = Batteria
tracker-table-column-ping = Ping
tracker-table-column-rotation = Rotazione X/Y/Z
tracker-table-column-position = Rotazione X/Y/Z
tracker-table-column-url = URL
## Tracker rotation
tracker-rotation-front = Davanti
tracker-rotation-left = Sinistra
tracker-rotation-right = Destra
tracker-rotation-back = Dietro
## Tracker information
tracker-infos-manufacturer = Produttore
tracker-infos-display_name = Nome da visualizzare
tracker-infos-custom_name = Nome Personalizzato
tracker-infos-url = URL del tracker
## Tracker settings
tracker-settings-back = Torna alla lista dei tracker
tracker-settings-title = Impostazioni del tracker
tracker-settings-assignment_section = Assegnazione
tracker-settings-assignment_section-description = Definisce a che paste del corpo è assegnato il tracker.
tracker-settings-assignment_section-edit = Cambia assegnazione
tracker-settings-mounting_section = posizionamento di montaggio
tracker-settings-mounting_section-description = Come è posizionato il tracker?
tracker-settings-mounting_section-edit = Cambia posizionamento
tracker-settings-drift_compensation_section = Allow drift compensation
tracker-settings-drift_compensation_section-description = Should this tracker compensate for its drift when drift compensation is enabled?
tracker-settings-drift_compensation_section-edit = Allow drift compensation
# The .<name> means it's an attribute and it's related to the top key.
# In this case that is the settings for the assignment section.
tracker-settings-name_section = Nome del tracker
tracker-settings-name_section-description = Scegli un nomignolo carino :)
tracker-settings-name_section-placeholder = Gamba destra di NightyQueer
## Tracker part card info
tracker-part_card-no_name = Nessun nome
tracker-part_card-unassigned = Non assegnato
## Body assignment menu
body_assignment_menu = Con che parte del corpo vuoi utilizzare il tracker?
body_assignment_menu-description = Scegli una parte del corpo a cui assegnare questo tracker. Alternativamente puoi scegliere di gestire tutti i tracker in una schermata unica invece che singolarmente.
body_assignment_menu-show_advanced_locations = Mostra impostazioni avanzate di Assegnazione
body_assignment_menu-manage_trackers = Gestisci tutti i tracker
body_assignment_menu-unassign_tracker = Rimuovi assegnazione del tracker
## Tracker assignment menu
# A -translation_key (with a dash in the front) means that it's a label.
# It can only be used in the translation file, it's nice for reusing names and that kind of stuff.
#
# We are using it here because english doesn't require changing the text in each case but
# maybe your language does.
-tracker_selection-part = Which tracker to assign to your
tracker_selection_menu-NONE = Which tracker do you want to be unassigned?
tracker_selection_menu-HEAD = { -tracker_selection-part } head?
tracker_selection_menu-NECK = { -tracker_selection-part } neck?
tracker_selection_menu-RIGHT_SHOULDER = { -tracker_selection-part } right shoulder?
tracker_selection_menu-RIGHT_UPPER_ARM = { -tracker_selection-part } right upper arm?
tracker_selection_menu-RIGHT_LOWER_ARM = { -tracker_selection-part } right lower arm?
tracker_selection_menu-RIGHT_HAND = { -tracker_selection-part } right hand?
tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } right thigh?
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } right ankle?
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } right foot?
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } right controller?
tracker_selection_menu-CHEST = { -tracker_selection-part } chest?
tracker_selection_menu-WAIST = { -tracker_selection-part } waist?
tracker_selection_menu-HIP = { -tracker_selection-part } hip?
tracker_selection_menu-LEFT_SHOULDER = { -tracker_selection-part } left shoulder?
tracker_selection_menu-LEFT_UPPER_ARM = { -tracker_selection-part } left upper arm?
tracker_selection_menu-LEFT_LOWER_ARM = { -tracker_selection-part } left lower arm?
tracker_selection_menu-LEFT_HAND = { -tracker_selection-part } left hand?
tracker_selection_menu-LEFT_UPPER_LEG = { -tracker_selection-part } left thigh?
tracker_selection_menu-LEFT_LOWER_LEG = { -tracker_selection-part } left ankle?
tracker_selection_menu-LEFT_FOOT = { -tracker_selection-part } left foot?
tracker_selection_menu-LEFT_CONTROLLER = { -tracker_selection-part } left controller?
tracker_selection_menu-unassigned = Tracker non assegnato
tracker_selection_menu-assigned = Dispositivo assegnato
tracker_selection_menu-dont_assign = Non assegnare
## Mounting menu
mounting_selection_menu = Come è posizionato il tracker?
mounting_selection_menu-close = Chiudi
## Sidebar settings
settings-sidebar-title = Impostazioni
settings-sidebar-general = Generali
settings-sidebar-tracker_mechanics = Comportamento del tracker
settings-sidebar-fk_settings = Impostazioni FK
settings-sidebar-gesture_control = Controllo dei gesti
settings-sidebar-interface = Interfaccia
settings-sidebar-osc_router = OSC router
settings-sidebar-utils = Strumenti
settings-sidebar-serial = Serial console
## SteamVR settings
settings-general-steamvr = SteamVR
settings-general-steamvr-subtitle = Tracker di SteamVR
# Not all translation keys support multiline, only the ones that specify it will actually
# split it in lines (that also means you can split in lines however you want in those).
# The first spaces (not tabs) for indentation will be ignored, just to make the file look nice when writing.
# This one is one of this cases that cares about multilines
settings-general-steamvr-description =
Abilita o disabilita specifici tracker di SteamVR.
Utile per alcuni giochi che utilizzano solo alcuni tracker di SteamVR.
settings-general-steamvr-trackers-waist = Girovita
settings-general-steamvr-trackers-chest = Petto
settings-general-steamvr-trackers-feet = Piedi
settings-general-steamvr-trackers-knees = Ginocchia
settings-general-steamvr-trackers-elbows = Gomiti
settings-general-steamvr-trackers-hands = Mani
## Tracker mechanics
settings-general-tracker_mechanics = Comportamento del tracker
settings-general-tracker_mechanics-filtering = Filtro movimenti
# This also cares about multilines
settings-general-tracker_mechanics-filtering-description =
Scegli la tipologia di filtraggio movimenti per il tuo tracker.
Predizione anticipa i movimenti, mentre Attenuazione attenua movimenti eccessivi.
settings-general-tracker_mechanics-filtering-type = Tipologia di filtraggio
settings-general-tracker_mechanics-filtering-type-none = Non usare alcun filtraggio
settings-general-tracker_mechanics-filtering-type-none-description = Usa le rotazioni così come sono. Non eseguirà alcun filtro.
settings-general-tracker_mechanics-filtering-type-smoothing = Attenuazione
settings-general-tracker_mechanics-filtering-type-smoothing-description = Attenua movimenti eccessivi ma aggiunge ritardo.
settings-general-tracker_mechanics-filtering-type-prediction = Predizione
settings-general-tracker_mechanics-filtering-type-prediction-description = Riduce ritardo e rende movimenti più istantanei, ma può introdurre tremolio.
settings-general-tracker_mechanics-filtering-amount = Quantità
settings-general-tracker_mechanics-drift_compensation = Drift compensation
# This cares about multilines
settings-general-tracker_mechanics-drift_compensation-description =
Compensates IMU yaw drift by applying an inverse rotation.
Change amount of compensation and up to how many resets are taken into account.
settings-general-tracker_mechanics-drift_compensation-enabled-label = Drift compensation
settings-general-tracker_mechanics-drift_compensation-amount-label = Compensation amount
settings-general-tracker_mechanics-drift_compensation-max_resets-label = Use up to x last resets
## FK/Tracking settings
settings-general-fk_settings = Impostazioni FK
settings-general-fk_settings-leg_tweak = Impostazioni Gambe
settings-general-fk_settings-leg_tweak-description = "Compenetrazione pavimento" può ridurre o anche eliminare completamente la compenetrazione con il pavimento, ma può causare problemi quando in ginocchio. "Correzione pattinaggio" corregge l'effetto che fa sembrare che pattini sul ghiaccio, ma può peggiorare la precisione di certi movimenti.
# 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 = Compenetrazione pavimento
# 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)
# definition - Guesses when each foot is in contact with the ground and uses that information to improve tracking
settings-general-fk_settings-leg_tweak-skating_correction = Correzione pattinaggio
settings-general-fk_settings-leg_tweak-skating_correction-amount = Forza fattore di correzione pattinaggio
settings-general-fk_settings-arm_fk = FK Braccia
settings-general-fk_settings-arm_fk-description = Cambia la modalità di tracciamento delle braccia.
settings-general-fk_settings-arm_fk-force_arms = Forza il calcolo della posizione delle braccia a utilizzare il HMD
settings-general-fk_settings-skeleton_settings = Impostazioni scheletro
settings-general-fk_settings-skeleton_settings-description = Abilita o disabilita le impostazioni dello scheletro. É raccomandato lasciare queste impostazioni attive.
settings-general-fk_settings-skeleton_settings-extended_spine = Estensione colonna vertebrale
settings-general-fk_settings-skeleton_settings-extended_pelvis = Estensione bacino
settings-general-fk_settings-skeleton_settings-extended_knees = Estensione ginocchia
settings-general-fk_settings-vive_emulation-title = Vive emulation
settings-general-fk_settings-vive_emulation-description = Emulate the waist tracker problems that Vive trackers have. This is a joke and makes tracking worse.
settings-general-fk_settings-vive_emulation-label = Enable Vive emulation
## Gesture control settings (tracker tapping)
settings-general-gesture_control = Controllo dei gesti
settings-general-gesture_control-subtitle = Reset veloce con il doppio tocco
settings-general-gesture_control-description = Abilita o disabilita il reset veloce con il doppio tocco. Quando attivato, un doppio tocco su una qualsiasi parte del tracker posizionato più in altro lungo il torso abiliterà il reset veloce. "Ritardo" è il ritardo dal momento in cui il gesto è eseguito e il Reset.
# This is a unit: 3 taps, 2 taps, 1 tap
# $amount (Number) - Amount of taps (touches to the tracker's case)
settings-general-gesture_control-taps = { $amount ->
[one] 1 tap
*[other] { $amount } taps
}
settings-general-gesture_control-quickResetEnabled = Enable tap to quick reset
settings-general-gesture_control-quickResetDelay = Quick reset delay
settings-general-gesture_control-quickResetTaps = Taps for quick reset
settings-general-gesture_control-resetEnabled = Enable tap to reset
settings-general-gesture_control-resetDelay = Reset delay
settings-general-gesture_control-resetTaps = Taps for reset
settings-general-gesture_control-mountingResetEnabled = Enable tap to reset mounting
settings-general-gesture_control-mountingResetDelay = Mounting reset delay
settings-general-gesture_control-mountingResetTaps = Taps for mounting reset
## Interface settings
settings-general-interface = Interfaccia
settings-general-interface-dev_mode = Modalità sviluppatore
settings-general-interface-dev_mode-description = Questa modalità è utile se hai bisogno di dati approfonditi o devi interagire in maniera più avanzata con i tracker connessi.
settings-general-interface-dev_mode-label = Modalità sviluppatore
settings-general-interface-serial_detection = Rilevazione nuovi dispositivi seriali
settings-general-interface-serial_detection-description = Questa opzione mostrerà un pop-up ogni volta che colleghi un nuovo dispositivo seriale che potrebbe essere un tracker. Aiuta a facilitare la configurazione iniziale di un tracker
settings-general-interface-serial_detection-label = Rilevazione nuovi dispositivi seriali
settings-general-interface-lang = Seleziona la lingua
settings-general-interface-lang-description = Seleziona la lingua che vuoi utilizzare
settings-general-interface-lang-placeholder = Seleziona la lingua da utilizzare
## Serial settings
settings-serial = Serial Console
# This cares about multilines
settings-serial-description =
Questo è un feed di informazioni in tempo reale per la comunicazione seriale.
Può essere utile se ti serve capire se il firmware sta avendo problemi.
settings-serial-connection_lost = Connessione seriale persa. Riconnessione in corso...
settings-serial-reboot = Riavvia
settings-serial-factory_reset = Ripristino delle impostazioni di fabbrica
settings-serial-get_infos = Ottieni informazioni
settings-serial-serial_select = Seleziona una porta seriale
settings-serial-auto_dropdown_item = Automatico
## OSC router settings
settings-osc-router = OSC router
# This cares about multilines
settings-osc-router-description =
Inoltra messaggi OSC da un altro programma.
Utile per utilizzare un altro programma OSC con VRChat, per esempio.
settings-osc-router-enable = Attiva
settings-osc-router-enable-description = Attiva o disattiva l'inoltro dei messaggi
settings-osc-router-enable-label = Attiva
settings-osc-router-network = Porte di rete
# This cares about multilines
settings-osc-router-network-description =
Impostare le porte di rete per l'ascolto e l'invio dei dati
Queste possono essere le stesse porte di rete di altre porte utilizzate nel server di SlimeVR
settings-osc-router-network-port_in =
.label = Porta in ingresso
.placeholder = Porta in ingresso (predefinito: 9002)
settings-osc-router-network-port_out =
.label = Porta in uscita
.placeholder = Porta in uscita (predefinito: 9000)
settings-osc-router-network-address = Indirizzo di rete
settings-osc-router-network-address-description = Impostare l'indirizzo di rete a cui inviare i dati
settings-osc-router-network-address-placeholder = Indirizzo IPV4
## OSC VRChat settings
settings-osc-vrchat = VRChat OSC Trackers
# This cares about multilines
settings-osc-vrchat-description =
Modifica le impostazioni specifiche a VRChat per ricevere e inviare dati del HMD
Dati dei tracker per FBT (funziona su Quest standalone).
settings-osc-vrchat-enable = Attiva
settings-osc-vrchat-enable-description = Attiva o disattiva l'invio e la ricezione dei dati
settings-osc-vrchat-enable-label = Attiva
settings-osc-vrchat-network = Porte di rete
settings-osc-vrchat-network-description = Impostare le porte di rete per ascoltare e inviare dati a VRChat
settings-osc-vrchat-network-port_in =
.label = Porta in ingresso
.placeholder = Porta in ingresso (predefinito: 9002)
settings-osc-vrchat-network-port_out =
.label = Porta in uscita
.placeholder = Porta in uscita (predefinito: 9000)
settings-osc-vrchat-network-address = Indirizzo di rete
settings-osc-vrchat-network-address-description = Scegli a quale indirizzo di rete inviare i dati di VRChat (controlla le impostazioni WiFi sul tuo dispositivo)
settings-osc-vrchat-network-address-placeholder = Indirizzo IP di VRChat
settings-osc-vrchat-network-trackers = Tracker
settings-osc-vrchat-network-trackers-description = Attiva o disattiva l'invio e la ricezione dei dati
settings-osc-vrchat-network-trackers-chest = Petto
settings-osc-vrchat-network-trackers-waist = Girovita
settings-osc-vrchat-network-trackers-knees = Ginocchia
settings-osc-vrchat-network-trackers-feet = Piedi
settings-osc-vrchat-network-trackers-elbows = Gomiti
## Setup/onboarding menu
onboarding-skip = Salta la configurazione
onboarding-continue = Continua
onboarding-wip = Lavori in corso
## WiFi setup
onboarding-wifi_creds-back = Torna all'introduzione
onboarding-wifi_creds = Inserisci credenziali WiFi
# This cares about multilines
onboarding-wifi_creds-description =
I tracker utilizzeranno queste credenziali per connettersi in modalità wireless
Si prega di utilizzare le stesse credenziali con cui si è attualmente connessi
onboarding-wifi_creds-skip = Salta impostazioni WiFi
onboarding-wifi_creds-submit = Conferma!
onboarding-wifi_creds-ssid =
.label = SSID
.placeholder = Enter SSID
onboarding-wifi_creds-password =
.label = Password
.placeholder = Enter password
## Mounting setup
onboarding-reset_tutorial-back = Torna alla calibrazione posizionamento
onboarding-reset_tutorial = Tutorial di ripristino
onboarding-reset_tutorial-description = Questa funzionalità non è completa, premi continua
## Setup start
onboarding-home = Benvenuti a SlimeVR
# This cares about multilines and it's centered!!
onboarding-home-description =
Portiamo full-body tracking
a tuttə
onboarding-home-start = Prepariamoci!
## Enter VR part of setup
onboarding-enter_vr-back = Torna all'assegnazione dei tracker
onboarding-enter_vr-title = È ora di entrare in VR!
onboarding-enter_vr-description = Indossa tutti i tuoi tracker e entra in VR!
onboarding-enter_vr-ready = Sono prontə!
## Setup done
onboarding-done-title = È tutto pronto!
onboarding-done-description = Goditi la tua esperienza di full-body tracking
onboarding-done-close = Chiudi la guida
## Tracker connection setup
onboarding-connect_tracker-back = Torna alle credenziali WiFi
onboarding-connect_tracker-title = Connetti i tracker
onboarding-connect_tracker-description-p0 = Ora passiamo alla parte divertente, colleghiamo tutti i tracker!
onboarding-connect_tracker-description-p1 = Collega semplicemente tutti i tracker che non sono ancora collegati tramite una porta USB.
onboarding-connect_tracker-issue-serial = Ho problemi con la connessione!
onboarding-connect_tracker-usb = Tracker USB
onboarding-connect_tracker-connection_status-connecting = Invio credenziali WiFi in corso.
onboarding-connect_tracker-connection_status-connected = Connesso al WiFi
onboarding-connect_tracker-connection_status-error = Impossibile connettersi al WiFi
onboarding-connect_tracker-connection_status-start_connecting = Ricerca dei tracker in corso
onboarding-connect_tracker-connection_status-handshake = Connesso al Server
# $amount (Number) - Amount of trackers connected (this is a number, but you can use CLDR plural rules for your language)
# More info on https://www.unicode.org/cldr/cldr-aux/charts/22/supplemental/language_plural_rules.html
# English in this case only has 2 plural rules, which are "one" and "other",
# we use 0 in an explicit way because there is no plural rule in english for 0, so we directly say
# if $amount is 0 then we say "No trackers connected"
onboarding-connect_tracker-connected_trackers = { $amount ->
[0] No trackers
[one] 1 tracker
*[other] { $amount } trackers
} connected
onboarding-connect_tracker-next = Ho collegato tutti i miei tracker
## Tracker assignment setup
onboarding-assign_trackers-back = Torna alle credenziali WiFi
onboarding-assign_trackers-title = Assegna i tracker
onboarding-assign_trackers-description = Scegliamo quale tracker va dove. Fare clic su una parte del corpo in cui si desidera assegnare un 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
onboarding-assign_trackers-assigned = { $assigned } of { $trackers ->
[one] 1 tracker
*[other] { $trackers } trackers
} assigned
onboarding-assign_trackers-advanced = Mostra impostazioni avanzate di assegnazione
onboarding-assign_trackers-next = Ho assegnato tutti i miei tracker
## Tracker manual mounting setup
onboarding-manual_mounting-back = Torna indietro per entrare in VR
onboarding-manual_mounting = Posizionamento manuale
onboarding-manual_mounting-description = Fare clic su ogni tracker e selezionare in che direzione sono montati
onboarding-manual_mounting-auto_mounting = Posizionamento automatico
onboarding-manual_mounting-next = Passo successivo
## Tracker automatic mounting setup
onboarding-automatic_mounting-back = Torna indietro per entrare in VR
onboarding-automatic_mounting-title = Calibrazione posizionamento
onboarding-automatic_mounting-description = Affinché i tracker di SlimeVR funzionino, dobbiamo configurare una rotazione di posizione di montaggio ai tuoi tracker per allinearli con la posizione di montaggio del tuo tracker fisico.
onboarding-automatic_mounting-manual_mounting = Imposta posizione manualmente
onboarding-automatic_mounting-next = Passo successivo
onboarding-automatic_mounting-prev_step = Passaggio precedente
onboarding-automatic_mounting-done-title = Rotazione delle posizioni di montaggio calibrate.
onboarding-automatic_mounting-done-description = La calibrazione della posizione é completa!
onboarding-automatic_mounting-done-restart = Torna all'inizio
onboarding-automatic_mounting-mounting_reset-title = Ripristina posizionamento
onboarding-automatic_mounting-mounting_reset-step-0 = 1. Piegati come per sciare: con le gambe leggermente piegate e unite, la parte superiore del corpo inclinata in avanti e le braccia piegate.
onboarding-automatic_mounting-mounting_reset-step-1 = 2. Premere il pulsante "Ripristina posizionamento" e attendere 3 secondi prima che le rotazioni delle posizioni di montaggio dei tracker vengano ripristinate.
onboarding-automatic_mounting-preparation-title = Preparazione
onboarding-automatic_mounting-preparation-step-0 = 1. Stai in piedi drittə con le braccia lungo i fianchi.
onboarding-automatic_mounting-preparation-step-1 = 2. Premi il pulsante "Reset" e attendi 3 secondi prima che i tracker vengano ripristinati.
onboarding-automatic_mounting-put_trackers_on-title = Indossa i tuoi tracker
onboarding-automatic_mounting-put_trackers_on-description = Per calibrare le rotazioni delle posizioni montaggio useremo i tracker che hai appena assegnato. Indossa tutti i tuoi tracker, puoi vedere quali sono quali nella figura a destra.
onboarding-automatic_mounting-put_trackers_on-next = Sto indossando tutti i miei tracker
## Tracker manual proportions setup
onboarding-manual_proportions-back = Torna al tutorial di reset
onboarding-manual_proportions-title = Impostazione manuale delle proporzioni del corpo
onboarding-manual_proportions-precision = Regolazione di precisione
onboarding-manual_proportions-auto = Calibrazione automatica
## Tracker automatic proportions setup
onboarding-automatic_proportions-back = Torna al tutorial di reset
onboarding-automatic_proportions-title = Misura il tuo corpo
onboarding-automatic_proportions-description = Affinché i tracker di SlimeVR funzionino dobbiamo conoscere la lunghezza dei tuoi arti. Questa breve calibrazione le misurerà per te.
onboarding-automatic_proportions-manual = Calibrazione manuale
onboarding-automatic_proportions-prev_step = Passaggio precedente
onboarding-automatic_proportions-put_trackers_on-title = Indossa i tuoi tracker
onboarding-automatic_proportions-put_trackers_on-description = Per calibrare le tue proporzioni useremo i tracker che hai appena assegnato. Indossa tutti i tuoi tracker, puoi vedere quali sono quali nella figura a destra.
onboarding-automatic_proportions-put_trackers_on-next = Sto indossando tutti i miei tracker
onboarding-automatic_proportions-preparation-title = Preparazione
onboarding-automatic_proportions-preparation-description = Posiziona una sedia direttamente dietro di te all'interno della tua area di gioco. Ti verrà richiesto di sederti durante certi passaggi della calibrazione delle proporzioni.
onboarding-automatic_proportions-preparation-next = Sono davanti a una sedia
onboarding-automatic_proportions-start_recording-title = Preparati a muoverti
onboarding-automatic_proportions-start_recording-description = Ora registreremo alcune pose e movimenti specifici. Questi verranno descritte nelle schermate successive. Preparati a iniziare quando premi il pulsante!
onboarding-automatic_proportions-start_recording-next = Inizia registrazione
onboarding-automatic_proportions-recording-title = REC
onboarding-automatic_proportions-recording-description-p0 = Registrazione in corso...
onboarding-automatic_proportions-recording-description-p1 = Fai i movimenti mostrati di seguito:
onboarding-automatic_proportions-recording-steps-0 = Piega le ginocchia un paio di volte.
onboarding-automatic_proportions-recording-steps-1 = Siediti su una sedia e poi alzati.
onboarding-automatic_proportions-recording-steps-2 = Ruota la parte superiore del corpo a sinistra, poi piegati a destra.
onboarding-automatic_proportions-recording-steps-3 = Ruota la parte superiore del corpo a destra, poi piegati a sinistra.
onboarding-automatic_proportions-recording-steps-4 = Muoviti un poco fino allo scadere del timer.
onboarding-automatic_proportions-recording-processing = Elaborazione del risultato
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 15)
onboarding-automatic_proportions-recording-timer = { $time ->
[one] 1 second left
*[other] { $time } seconds left
}
onboarding-automatic_proportions-verify_results-title = Verifica i risultati
onboarding-automatic_proportions-verify_results-description = Controlla i risultati qui sotto, sembrano corretti?
onboarding-automatic_proportions-verify_results-results = Salvataggio dei risultati
onboarding-automatic_proportions-verify_results-processing = Elaborazione del risultato
onboarding-automatic_proportions-verify_results-redo = Rifai registrazione
onboarding-automatic_proportions-verify_results-confirm = Sono corretti
onboarding-automatic_proportions-done-title = Corpo misurato e salvato.
onboarding-automatic_proportions-done-description = La calibrazione delle proporzioni del tuo corpo è completa!
## Home
home-no_trackers = Nessun tracker rilevato o assegnato

View File

@@ -0,0 +1,519 @@
### SlimeVR complete GUI translations
# Please developers (not translators) don't reuse a key inside another key
# or concat text with a translation string in the code, use the appropriate
# features like variables and selectors in each appropriate case!
# And also comment the string if it's something not easy to translate, so you help
# translators on what it means
## Websocket (server) status
websocket-connecting = サーバー接続中
websocket-connection_lost = サーバーへの接続が失われました。再接続を試みています...
## Tips
tips-find_tracker = どのトラッカーがどれだかわからない?トラッカーを振ると、該当する項目がハイライトされます。
tips-do_not_move_heels = レコーディング中にかかとが動かないように注意しましょう!
## Body parts
body_part-NONE = 未設定
body_part-HEAD = 頭
body_part-NECK = 首
body_part-RIGHT_SHOULDER = 右肩
body_part-RIGHT_UPPER_ARM = 右上腕
body_part-RIGHT_LOWER_ARM = 右前腕
body_part-RIGHT_HAND = 右手
body_part-RIGHT_UPPER_LEG = 右膝
body_part-RIGHT_LOWER_LEG = 右足
body_part-RIGHT_FOOT = 右足先
body_part-RIGHT_CONTROLLER = 右コントローラ
body_part-CHEST = 胸
body_part-WAIST = 腰
body_part-HIP = ヒップ
body_part-LEFT_SHOULDER = 左肩
body_part-LEFT_UPPER_ARM = 左上腕
body_part-LEFT_LOWER_ARM = 左前腕
body_part-LEFT_HAND = 左手
body_part-LEFT_UPPER_LEG = 左膝
body_part-LEFT_LOWER_LEG = 左足
body_part-LEFT_FOOT = 左足先
body_part-LEFT_CONTROLLER = 左コントローラ
## Skeleton stuff
skeleton_bone-NONE = 無し
skeleton_bone-HEAD = ヘッドシフト
skeleton_bone-NECK = 首長さ
skeleton_bone-TORSO = 胴長さ
skeleton_bone-CHEST = 胸部の距離
skeleton_bone-WAIST = 腰部の距離
skeleton_bone-HIP_OFFSET = ヒップオフセット
skeleton_bone-HIPS_WIDTH = ヒップ幅
skeleton_bone-LEGS_LENGTH = 脚長さ
skeleton_bone-KNEE_HEIGHT = 膝高さ
skeleton_bone-FOOT_LENGTH = 足先長さ
skeleton_bone-FOOT_SHIFT = 足先シフト
skeleton_bone-SKELETON_OFFSET = スケルトンオフセット
skeleton_bone-CONTROLLER_DISTANCE_Z = コントローラ距離 Z
skeleton_bone-CONTROLLER_DISTANCE_Y = コントローラ距離 Y
skeleton_bone-FOREARM_LENGTH = 前腕長さ
skeleton_bone-SHOULDERS_DISTANCE = 肩の距離
skeleton_bone-SHOULDERS_WIDTH = 肩幅
skeleton_bone-UPPER_ARM_LENGTH = 上腕長さ
skeleton_bone-ELBOW_OFFSET = 肘オフセット
## Tracker reset buttons
reset-reset_all = すべてのプロポーションをリセット
reset-full = リセット
reset-mounting = リセットマウンティング
reset-quick = クイックリセット
## Serial detection stuff
serial_detection-new_device-p0 = 新しいシリアルデバイスを検出しました!
serial_detection-new_device-p1 = wifiの認証情報を入力してください
serial_detection-new_device-p2 = 何をするか選択してください
serial_detection-open_wifi = WiFiに接続
serial_detection-open_serial = シリアルコンソールを開く
serial_detection-submit = 実行!
serial_detection-close = 閉じる
## Navigation bar
navbar-home = ホーム
navbar-body_proportions = ボディプロポーション
navbar-trackers_assign = トラッカー割り当て
navbar-mounting = マウントキャリブレーション
navbar-onboarding = セットアップ ウィザード
navbar-settings = 設定
## Bounding volume hierarchy recording
bvh-start_recording = BVHレコーディング
bvh-recording = レコーディング中...
## Overlay settings
overlay-is_visible_label = SteamVRでオーバーレイを表示する
overlay-is_mirrored_label = オーバーレイをミラーとして表示する
## Tracker status
tracker-status-none = ステータスなし
tracker-status-busy = Busy
tracker-status-error = エラー
tracker-status-disconnected = 切断
tracker-status-occluded = Occluded
tracker-status-ok = 接続中
## Tracker status columns
tracker-table-column-name = Name
tracker-table-column-type = Type
tracker-table-column-battery = Battery
tracker-table-column-ping = Ping
tracker-table-column-rotation = Rotation X/Y/Z
tracker-table-column-position = Position X/Y/Z
tracker-table-column-url = URL
## Tracker rotation
tracker-rotation-front = 前
tracker-rotation-left = 左
tracker-rotation-right = 右
tracker-rotation-back = 後
## Tracker information
tracker-infos-manufacturer = メーカ-
tracker-infos-display_name = 表示名
tracker-infos-custom_name = カスタム名称
tracker-infos-url = トラッカーURL
## Tracker settings
tracker-settings-back = トラッカーリストへ戻る
tracker-settings-title = トラッカー設定
tracker-settings-assignment_section = 割り当て
tracker-settings-assignment_section-description = トラッカーが体のどの部位に装着されているか
tracker-settings-assignment_section-edit = 割り当ての編集
tracker-settings-mounting_section = 装着方向
tracker-settings-mounting_section-description = トラッカーをどの方向に装着していますか?
tracker-settings-mounting_section-edit = 装着向きの編集
tracker-settings-drift_compensation_section = Allow drift compensation
tracker-settings-drift_compensation_section-description = Should this tracker compensate for its drift when drift compensation is enabled?
tracker-settings-drift_compensation_section-edit = Allow drift compensation
# The .<name> means it's an attribute and it's related to the top key.
# In this case that is the settings for the assignment section.
tracker-settings-name_section = トラッカー名称
tracker-settings-name_section-description = 自由に名称をつけてください
tracker-settings-name_section-placeholder = NightyBeast's left leg
## Tracker part card info
tracker-part_card-no_name = 名称無し
tracker-part_card-unassigned = 未割り当て
## Body assignment menu
body_assignment_menu = このトラッカーをどこに配置しますか?
body_assignment_menu-description = このトラッカーを割り当てる場所を選択します。また、トラッカーを一つずつ管理するのではなく、すべてのトラッカーを一括して管理することもできます。
body_assignment_menu-show_advanced_locations = 高度な割り当て場所の表示
body_assignment_menu-manage_trackers = すべてのトラッカーの管理
body_assignment_menu-unassign_tracker = トラッカーの割り当て解除
## Tracker assignment menu
# A -translation_key (with a dash in the front) means that it's a label.
# It can only be used in the translation file, it's nice for reusing names and that kind of stuff.
#
# We are using it here because english doesn't require changing the text in each case but
# maybe your language does.
-tracker_selection-part = Which tracker to assign to your
tracker_selection_menu-NONE = Which tracker do you want to be unassigned?
tracker_selection_menu-HEAD = { -tracker_selection-part } head?
tracker_selection_menu-NECK = { -tracker_selection-part } neck?
tracker_selection_menu-RIGHT_SHOULDER = { -tracker_selection-part } right shoulder?
tracker_selection_menu-RIGHT_UPPER_ARM = { -tracker_selection-part } right upper arm?
tracker_selection_menu-RIGHT_LOWER_ARM = { -tracker_selection-part } right lower arm?
tracker_selection_menu-RIGHT_HAND = { -tracker_selection-part } right hand?
tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } right thigh?
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } right ankle?
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } right foot?
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } right controller?
tracker_selection_menu-CHEST = { -tracker_selection-part } chest?
tracker_selection_menu-WAIST = { -tracker_selection-part } waist?
tracker_selection_menu-HIP = { -tracker_selection-part } hip?
tracker_selection_menu-LEFT_SHOULDER = { -tracker_selection-part } left shoulder?
tracker_selection_menu-LEFT_UPPER_ARM = { -tracker_selection-part } left upper arm?
tracker_selection_menu-LEFT_LOWER_ARM = { -tracker_selection-part } left lower arm?
tracker_selection_menu-LEFT_HAND = { -tracker_selection-part } left hand?
tracker_selection_menu-LEFT_UPPER_LEG = { -tracker_selection-part } left thigh?
tracker_selection_menu-LEFT_LOWER_LEG = { -tracker_selection-part } left ankle?
tracker_selection_menu-LEFT_FOOT = { -tracker_selection-part } left foot?
tracker_selection_menu-LEFT_CONTROLLER = { -tracker_selection-part } left controller?
tracker_selection_menu-unassigned = 未割り当てのトラッカー
tracker_selection_menu-assigned = 割り当て済みのトラッカー
tracker_selection_menu-dont_assign = 割り当てない
## Mounting menu
mounting_selection_menu = このトラッカーをどこに配置しますか?
mounting_selection_menu-close = 閉じる
## Sidebar settings
settings-sidebar-title = 設定
settings-sidebar-general = 一般
settings-sidebar-tracker_mechanics = トラッカーメカニズム
settings-sidebar-fk_settings = FK設定
settings-sidebar-gesture_control = Gesture control
settings-sidebar-interface = インターフェース
settings-sidebar-osc_router = OSC router
settings-sidebar-utils = ユーティリティ
settings-sidebar-serial = シリアルコンソール
## SteamVR settings
settings-general-steamvr = SteamVR
settings-general-steamvr-subtitle = SteamVRのトラッカー
# Not all translation keys support multiline, only the ones that specify it will actually
# split it in lines (that also means you can split in lines however you want in those).
# The first spaces (not tabs) for indentation will be ignored, just to make the file look nice when writing.
# This one is one of this cases that cares about multilines
settings-general-steamvr-description =
有効化したい部位にチャックを入れてください。
SlimeVRが行うことをよりコントロールしたい場合に便利です。
settings-general-steamvr-trackers-waist = 腰
settings-general-steamvr-trackers-chest = 胸
settings-general-steamvr-trackers-feet = 足
settings-general-steamvr-trackers-knees = 膝
settings-general-steamvr-trackers-elbows = 肘
settings-general-steamvr-trackers-hands = Hands
## Tracker mechanics
settings-general-tracker_mechanics = トラッカーメカニズム
settings-general-tracker_mechanics-filtering = フィルター機能
# This also cares about multilines
settings-general-tracker_mechanics-filtering-description =
トラッカーのフィルタリングの種類を選択します。
Predictionは動きを予測し、Smoothingは動きを滑らかにする。
settings-general-tracker_mechanics-filtering-type = フィルタータイプ
settings-general-tracker_mechanics-filtering-type-none = No filtering
settings-general-tracker_mechanics-filtering-type-none-description = トラッカーの値をそのまま使用します。フィルタリングは行いません。
settings-general-tracker_mechanics-filtering-type-smoothing = Smoothing
settings-general-tracker_mechanics-filtering-type-smoothing-description = 動きを滑らかにしますが、若干の遅れが発生します
settings-general-tracker_mechanics-filtering-type-prediction = Prediction
settings-general-tracker_mechanics-filtering-type-prediction-description = レイテンシーを減らし、動きをよりキビキビさせますが、ジッターが増加する場合があります。
settings-general-tracker_mechanics-filtering-amount = 数値
settings-general-tracker_mechanics-drift_compensation = Drift compensation
# This cares about multilines
settings-general-tracker_mechanics-drift_compensation-description =
Compensates IMU yaw drift by applying an inverse rotation.
Change amount of compensation and up to how many resets are taken into account.
settings-general-tracker_mechanics-drift_compensation-enabled-label = Drift compensation
settings-general-tracker_mechanics-drift_compensation-amount-label = Compensation amount
settings-general-tracker_mechanics-drift_compensation-max_resets-label = Use up to x last resets
## FK settings
settings-general-fk_settings = FK設定
settings-general-fk_settings-leg_tweak = 脚の微調整
settings-general-fk_settings-leg_tweak-description = フロアクリップは、床とのクリッピングを減らす、あるいはなくすことができますが、膝をついたときに問題が発生する可能性があります。スケーティング補正は足の滑りを補正できますが、特定の動作パターンでは精度が落ちることがあります。
# 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 = フロアクリップ
# 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)
# definition - Guesses when each foot is in contact with the ground and uses that information to improve tracking
settings-general-fk_settings-leg_tweak-skating_correction = スケーティング補正
settings-general-fk_settings-leg_tweak-skating_correction-amount = Skating correction strength
settings-general-fk_settings-arm_fk = アームFK
settings-general-fk_settings-arm_fk-description = 腕の追従方法を変更する。
settings-general-fk_settings-arm_fk-force_arms = Force arms from HMD
settings-general-fk_settings-skeleton_settings = スケルトン設定
settings-general-fk_settings-skeleton_settings-description = スケルトン設定のオン/オフを切り替えます。これらはオンのままにしておくことをお勧めします。
settings-general-fk_settings-skeleton_settings-extended_spine = Extended spine
settings-general-fk_settings-skeleton_settings-extended_pelvis = Extended pelvis
settings-general-fk_settings-skeleton_settings-extended_knees = Extended knee
settings-general-fk_settings-vive_emulation-title = Vive emulation
settings-general-fk_settings-vive_emulation-description = Emulate the waist tracker problems that Vive trackers have. This is a joke and makes tracking worse.
settings-general-fk_settings-vive_emulation-label = Enable Vive emulation
## Gesture control settings (tracker tapping)
settings-general-gesture_control = ジェスチャーコントロール
settings-general-gesture_control-subtitle = ダブルタップクイックリセット
settings-general-gesture_control-description = ダブルタップクイックリセットの有効・無効を設定します。有効にすると、最も高い胴体トラッカー上の任意の場所をダブルタップすると、クイックリセットが起動します。ディレイは、タップされてからリセットされるまでの時間です。
# This is a unit: 3 taps, 2 taps, 1 tap
# $amount (Number) - Amount of taps (touches to the tracker's case)
settings-general-gesture_control-taps = { $amount ->
[one] 1 tap
*[other] { $amount } taps
}
settings-general-gesture_control-quickResetEnabled = Enable tap to quick reset
settings-general-gesture_control-quickResetDelay = Quick reset delay
settings-general-gesture_control-quickResetTaps = Taps for quick reset
settings-general-gesture_control-resetEnabled = Enable tap to reset
settings-general-gesture_control-resetDelay = Reset delay
settings-general-gesture_control-resetTaps = Taps for reset
settings-general-gesture_control-mountingResetEnabled = Enable tap to reset mounting
settings-general-gesture_control-mountingResetDelay = Mounting reset delay
settings-general-gesture_control-mountingResetTaps = Taps for mounting reset
## Interface settings
settings-general-interface = インターフェース
settings-general-interface-dev_mode = 開発者モード
settings-general-interface-dev_mode-description = このモードは、詳細なデータが必要な場合や、接続されたトラッカーをより高度なレベルで操作する場合に役立ちます。
settings-general-interface-dev_mode-label = 開発者モード
settings-general-interface-serial_detection = シリアルデバイスの検出
settings-general-interface-serial_detection-description = このオプションは、トラッカーとなり得る新しいシリアルデバイスを接続するたびにポップアップを表示します。これはトラッカーの設定プロセスを改善するのに役立ちます。
settings-general-interface-serial_detection-label = シリアルデバイスの検出
settings-general-interface-lang = 言語を選択
settings-general-interface-lang-description = 使用したいデフォルトの言語を変更する
settings-general-interface-lang-placeholder = 使用する言語を選択する
## Serial settings
settings-serial = シリアルコンソール
# This cares about multilines
settings-serial-description =
シリアル通信のライブ情報フィードです。
ファームウェアの動作を知る必要がある場合に有用かもしれません。
settings-serial-connection_lost = シリアルへの接続が失われました、再接続中...
settings-serial-reboot = リブート
settings-serial-factory_reset = ファクトリーリセット
settings-serial-get_infos = 情報取得
settings-serial-serial_select = シリアルポートを選択
settings-serial-auto_dropdown_item = 自動
## OSC router settings
settings-osc-router = OSC router
# This cares about multilines
settings-osc-router-description =
Forward OSC messages from another program.
Useful for using another OSC program with VRChat for example.
settings-osc-router-enable = Enable
settings-osc-router-enable-description = Toggle the forwarding of messages.
settings-osc-router-enable-label = Enable
settings-osc-router-network = Network ports
# This cares about multilines
settings-osc-router-network-description =
Set the ports for listening and sending data.
These can be the same as other ports used in the SlimeVR server.
settings-osc-router-network-port_in =
.label = Port In
.placeholder = Port in (default: 9002)
settings-osc-router-network-port_out =
.label = Port Out
.placeholder = Port out (default: 9000)
settings-osc-router-network-address = Network address
settings-osc-router-network-address-description = Set the address to send out data at.
settings-osc-router-network-address-placeholder = IPV4 address
## OSC VRChat settings
settings-osc-vrchat = VRChat OSC Trackers
# This cares about multilines
settings-osc-vrchat-description =
HMDのデータを受信して送信するためにVRChat固有の設定を変更する。
FBT用のトラッカーデータQuestスタンドアロンで動作します
settings-osc-vrchat-enable = 有効
settings-osc-vrchat-enable-description = データの送受信を切り替える。
settings-osc-vrchat-enable-label = 有効
settings-osc-vrchat-network = ネットワークポート
settings-osc-vrchat-network-description = VRChatへのデータを送受信するためのポートを設定します。
settings-osc-vrchat-network-port_in =
.label = ポートイン
.placeholder = ポートイン (デフォルト: 9001)
settings-osc-vrchat-network-port_out =
.label = ポートアウト
.placeholder = ポートアウト (デフォルト: 9000)
settings-osc-vrchat-network-address = ネットワークアドレス
settings-osc-vrchat-network-address-description = VRChatにデータを送信するアドレスを選択してくださいデバイスのwifi設定を確認してください
settings-osc-vrchat-network-address-placeholder = VRChatのIPアドレス
settings-osc-vrchat-network-trackers = トラッカー
settings-osc-vrchat-network-trackers-description = データの送受信を切り替える。
settings-osc-vrchat-network-trackers-chest = 胸
settings-osc-vrchat-network-trackers-waist = 腰
settings-osc-vrchat-network-trackers-knees = 膝
settings-osc-vrchat-network-trackers-feet = 足
settings-osc-vrchat-network-trackers-elbows = 肘
## Setup/onboarding menu
onboarding-skip = 設定をスキップする
onboarding-continue = 続ける
onboarding-wip = 実行中
## WiFi setup
onboarding-wifi_creds-back = 戻る
onboarding-wifi_creds = WiFiの認証情報の入力
# This cares about multilines
onboarding-wifi_creds-description =
トラッカーはこれらの認証情報を使ってwifiに接続します。
現在接続している認証情報を使用してください。
onboarding-wifi_creds-skip = wifi設定をスキップする
onboarding-wifi_creds-submit = 実行!
onboarding-wifi_creds-ssid =
.label = SSID
.placeholder = Enter SSID
onboarding-wifi_creds-password =
.label = Password
.placeholder = Enter password
## Mounting setup
onboarding-reset_tutorial-back = マウントキャリブレーションに戻る
onboarding-reset_tutorial = リセットチュートリアル
onboarding-reset_tutorial-description = この機能は終了していません。続けるを押してください。
## Setup start
onboarding-home = Welcome to SlimeVR
# This cares about multilines and it's centered!!
onboarding-home-description =
Bringing full-body tracking
to everyone
onboarding-home-start = セットアップ開始!
## Enter VR part of setup
onboarding-enter_vr-back = トラッカー割り当てに戻る
onboarding-enter_vr-title = VRに入る時間だ
onboarding-enter_vr-description = トラッカーを全部つけて、VRに突入せよ
onboarding-enter_vr-ready = 準備完了
## Setup done
onboarding-done-title = 準備完了です!
onboarding-done-description = フルトラをお楽しみください
onboarding-done-close = ガイドを閉じる
## Tracker connection setup
onboarding-connect_tracker-back = WiFi認証に戻る
onboarding-connect_tracker-title = 接続中のトラッカー
onboarding-connect_tracker-description-p0 = さあ、楽しい部分に移りましょう。すべてのトラッカーを接続します!
onboarding-connect_tracker-description-p1 = まだ接続されていないトラッカーたちをUSBポートを通して接続するだけです。
onboarding-connect_tracker-issue-serial = 接続に問題があります!
onboarding-connect_tracker-usb = USBトラッカー
onboarding-connect_tracker-connection_status-connecting = wifiの認証情報を送信中
onboarding-connect_tracker-connection_status-connected = WiFiに接続されました
onboarding-connect_tracker-connection_status-error = Wifiに接続できません
onboarding-connect_tracker-connection_status-start_connecting = トラッカーを探しています
onboarding-connect_tracker-connection_status-handshake = サーバーに接続されました
# $amount (Number) - Amount of trackers connected (this is a number, but you can use CLDR plural rules for your language)
# More info on https://www.unicode.org/cldr/cldr-aux/charts/22/supplemental/language_plural_rules.html
# English in this case only has 2 plural rules, which are "one" and "other",
# we use 0 in an explicit way because there is no plural rule in english for 0, so we directly say
# if $amount is 0 then we say "No trackers connected"
onboarding-connect_tracker-connected_trackers = { $amount ->
[0] No trackers
[one] 1 tracker
*[other] { $amount } trackers
} connected
onboarding-connect_tracker-next = すべてのトラッカーを接続しました
## Tracker assignment setup
onboarding-assign_trackers-back = Wifi認証に戻る
onboarding-assign_trackers-title = トラッカーを割り当てる
onboarding-assign_trackers-description = どのトラッカーをどこに置くか選んでみましょう。トラッカーを配置したい場所をクリックしてください。
# 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
onboarding-assign_trackers-assigned = { $assigned } of { $trackers ->
[one] 1 tracker
*[other] { $trackers } trackers
} assigned
onboarding-assign_trackers-advanced = 高度な割り当て場所の表示
onboarding-assign_trackers-next = すべてのトラッカーを割り当てました
## Tracker manual mounting setup
onboarding-manual_mounting-back = VRの入力に戻る
onboarding-manual_mounting = マニュアルマウント
onboarding-manual_mounting-description = すべてのトラッカーをクリックし、どの方向にマウントするかを選択
onboarding-manual_mounting-auto_mounting = 自動マウント
onboarding-manual_mounting-next = 次のステップ
## Tracker automatic mounting setup
onboarding-automatic_mounting-back = VRの入力に戻る
onboarding-automatic_mounting-title = マウントキャリブレーション
onboarding-automatic_mounting-description = SlimeVRのトラッカーを動作させるためには、物理的なトラッカーの取り付け位置と合わせるために、トラッカーの取り付け方向を合わせる必要があります。
onboarding-automatic_mounting-manual_mounting = マニュアルマウント
onboarding-automatic_mounting-next = 次のステップ
onboarding-automatic_mounting-prev_step = 前のステップ
onboarding-automatic_mounting-done-title = 取り付け方向の較正を行いました。
onboarding-automatic_mounting-done-description = マウントのキャリブレーションが完了しました!
onboarding-automatic_mounting-done-restart = 最初に戻る
onboarding-automatic_mounting-mounting_reset-title = マウントリセット
onboarding-automatic_mounting-mounting_reset-step-0 = 1. 足を曲げ、上体を前に倒し、腕を曲げた状態で、スキーのポーズでしゃがむ。
onboarding-automatic_mounting-mounting_reset-step-1 = 2. リセットマウンティングボタンを押し、3秒待つと装着方向がリセットされます。
onboarding-automatic_mounting-preparation-title = 準備
onboarding-automatic_mounting-preparation-step-0 = 1. 両手を横に広げて直立します。
onboarding-automatic_mounting-preparation-step-1 = 2. リセットボタンを押し、3秒待つとリセットされます。
onboarding-automatic_mounting-put_trackers_on-title = トラッカーを装着する
onboarding-automatic_mounting-put_trackers_on-description = マウントの方向を較正するために、先ほど割り当てたトラッカーを使用します。右の図でどれがどれだかわかると思います。
onboarding-automatic_mounting-put_trackers_on-next = すべてのトラッカーを装着しました
## Tracker manual proportions setup
onboarding-manual_proportions-back = チュートリアルをリセットする
onboarding-manual_proportions-title = マニュアルボディプロポーション
onboarding-manual_proportions-precision = 精度を調整する
onboarding-manual_proportions-auto = 自動キャリブレーション
## Tracker automatic proportions setup
onboarding-automatic_proportions-back = チュートリアルをリセットする
onboarding-automatic_proportions-title = 自分の体の測定
onboarding-automatic_proportions-description = SlimeVRのトラッカーが動作するためには、あなたの骨の長さを知る必要があります。この短いキャリブレーションでそれを測定します。
onboarding-automatic_proportions-manual = 手動調整
onboarding-automatic_proportions-prev_step = 前のステップ
onboarding-automatic_proportions-put_trackers_on-title = トラッカーを装着する
onboarding-automatic_proportions-put_trackers_on-description = プロポーションを調整するために、先ほど割り当てたトラッカーを使用します。右の図で、どれがどのトラッカーかわかると思います。
onboarding-automatic_proportions-put_trackers_on-next = すべてのトラッカーを装着しました
onboarding-automatic_proportions-preparation-title = 準備
onboarding-automatic_proportions-preparation-description = プレイスペース内のあなたの真後ろに椅子を置いてください。オートボーンセットアップの間、座れるように準備してください。
onboarding-automatic_proportions-preparation-next = 椅子の前にいます
onboarding-automatic_proportions-start_recording-title = 測定の準備をする
onboarding-automatic_proportions-start_recording-description = これから具体的なポーズや動きを記録します。これらは次の画面に表示されます。ボタンが押されたらすぐに始められるように準備しておいてください!
onboarding-automatic_proportions-start_recording-next = レコーディングスタート
onboarding-automatic_proportions-recording-title = REC
onboarding-automatic_proportions-recording-description-p0 = レコーディング中...
onboarding-automatic_proportions-recording-description-p1 = 以下に示すような動きをします。
onboarding-automatic_proportions-recording-steps-0 = 膝を数回曲げてください
onboarding-automatic_proportions-recording-steps-1 = 椅子に座り、立ち上がる
onboarding-automatic_proportions-recording-steps-2 = 上半身を左にひねり、右に曲げる
onboarding-automatic_proportions-recording-steps-3 = 上半身を右にひねり、左に曲げる
onboarding-automatic_proportions-recording-steps-4 = タイマーが終わるまで体をくねらせる
onboarding-automatic_proportions-recording-processing = 結果を処理中
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 15)
onboarding-automatic_proportions-recording-timer = { $time ->
[one] 1 second left
*[other] { $time } seconds left
}
onboarding-automatic_proportions-verify_results-title = 結果を確認
onboarding-automatic_proportions-verify_results-description = 以下の結果を確認してください。正しく表示されていますか?
onboarding-automatic_proportions-verify_results-results = 記録結果
onboarding-automatic_proportions-verify_results-processing = 結果の処理
onboarding-automatic_proportions-verify_results-redo = レコーディングやり直し
onboarding-automatic_proportions-verify_results-confirm = 正確です
onboarding-automatic_proportions-done-title = 体を測定して保存
onboarding-automatic_proportions-done-description = ボディプロポーションのキャリブレーションが完了しました!
## Home
home-no_trackers = トラッカーを検出できません。もしくは割り当てられていません。

View File

@@ -0,0 +1,519 @@
### SlimeVR complete GUI translations
# Please developers (not translators) don't reuse a key inside another key
# or concat text with a translation string in the code, use the appropriate
# features like variables and selectors in each appropriate case!
# And also comment the string if it's something not easy to translate, so you help
# translators on what it means
## Websocket (server) status
websocket-connecting = 서버에 연결하는 중...
websocket-connection_lost = 서버와의 연결이 끊어졌어요. 다시 연결하는 중...
## Tips
tips-find_tracker = 내 트래커가 어떤 트래커인지 모르시겠다구요? 트래커를 흔들면 해당 항목이 빛날 거에요.
tips-do_not_move_heels = 기록하는 동안 발뒤꿈치가 움직이지 않도록 조심하세요!
## Body parts
body_part-NONE = 할당되지 않음
body_part-HEAD = 머리
body_part-NECK = 목
body_part-RIGHT_SHOULDER = 오른쪽 어깨
body_part-RIGHT_UPPER_ARM = 오른쪽 팔 위
body_part-RIGHT_LOWER_ARM = 오른쪽 팔 아래
body_part-RIGHT_HAND = 오른손
body_part-RIGHT_UPPER_LEG = 오른쪽 다리 위
body_part-RIGHT_LOWER_LEG = 오른쪽 다리 아래
body_part-RIGHT_FOOT = 오른발
body_part-RIGHT_CONTROLLER = Right controller
body_part-CHEST = 가슴
body_part-WAIST = 허리
body_part-HIP = 골반
body_part-LEFT_SHOULDER = 오른쪽 어깨
body_part-LEFT_UPPER_ARM = 왼쪽 팔 위
body_part-LEFT_LOWER_ARM = 왼쪽 팔 아래
body_part-LEFT_HAND = 왼손
body_part-LEFT_UPPER_LEG = 왼쪽 다리 위
body_part-LEFT_LOWER_LEG = 왼쪽 다리 아래
body_part-LEFT_FOOT = 왼발
body_part-LEFT_CONTROLLER = Left controller
## Skeleton stuff
skeleton_bone-NONE = None
skeleton_bone-HEAD = 머리 밀림
skeleton_bone-NECK = 목 길이
skeleton_bone-TORSO = 몸통 길이
skeleton_bone-CHEST = 가슴 거리
skeleton_bone-WAIST = 허리 거리
skeleton_bone-HIP_OFFSET = 골반 오프셋
skeleton_bone-HIPS_WIDTH = 골반 너비
skeleton_bone-LEGS_LENGTH = 다리 길이
skeleton_bone-KNEE_HEIGHT = 무릎 높이
skeleton_bone-FOOT_LENGTH = 발 크기
skeleton_bone-FOOT_SHIFT = 발 밀림
skeleton_bone-SKELETON_OFFSET = 골격 오프셋
skeleton_bone-CONTROLLER_DISTANCE_Z = 컨트롤러 Z축 거리
skeleton_bone-CONTROLLER_DISTANCE_Y = 컨트롤러 Y축 거리
skeleton_bone-FOREARM_LENGTH = 전완 길이
skeleton_bone-SHOULDERS_DISTANCE = 어깨 거리
skeleton_bone-SHOULDERS_WIDTH = 어깨 너비
skeleton_bone-UPPER_ARM_LENGTH = 위팔 거리
skeleton_bone-ELBOW_OFFSET = 팔꿈치 오프셋
## Tracker reset buttons
reset-reset_all = 모든 신체 비율 리셋
reset-full = 리셋
reset-mounting = 착용 방향 리셋
reset-quick = 퀵 리셋
## Serial detection stuff
serial_detection-new_device-p0 = 새로운 시리얼 디바이스를 찾았어요!
serial_detection-new_device-p1 = WiFi 자격 증명을 입력해주세요!
serial_detection-new_device-p2 = 원하는 작업을 선택하세요
serial_detection-open_wifi = WiFi 연결
serial_detection-open_serial = 시리얼 콘솔 열기
serial_detection-submit = 저장!
serial_detection-close = 닫기
## Navigation bar
navbar-home = 홈
navbar-body_proportions = 신체 비율
navbar-trackers_assign = 트래커 위치
navbar-mounting = 착용 방향 정렬
navbar-onboarding = 설정 마법사
navbar-settings = 설정
## Bounding volume hierarchy recording
bvh-start_recording = BVH 기록
bvh-recording = 기록중...
## Overlay settings
overlay-is_visible_label = SteamVR에서 오버레이 표시
overlay-is_mirrored_label = 오버레이 반전
## Tracker status
tracker-status-none = No Status
tracker-status-busy = 바쁨
tracker-status-error = 오류
tracker-status-disconnected = 연결되지 않음
tracker-status-occluded = 사용할 수 없음
tracker-status-ok = 연결됨
## Tracker status columns
tracker-table-column-name = 이름
tracker-table-column-type = 타입
tracker-table-column-battery = 배터리
tracker-table-column-ping = Ping
tracker-table-column-rotation = X/Y/Z 회전
tracker-table-column-position = X/Y/Z 위치
tracker-table-column-url = URL
## Tracker rotation
tracker-rotation-front = 앞쪽
tracker-rotation-left = 왼쪽
tracker-rotation-right = 오른쪽
tracker-rotation-back = 뒤쪽
## Tracker information
tracker-infos-manufacturer = 제조사
tracker-infos-display_name = 표시되는 이름
tracker-infos-custom_name = 사용자 정의 이름
tracker-infos-url = 트래커 URL
## Tracker settings
tracker-settings-back = 트래커 목록으로 돌아가기
tracker-settings-title = 트래커 설정
tracker-settings-assignment_section = 트래커 위치 지정
tracker-settings-assignment_section-description = 트래커가 위치한 신체 부위
tracker-settings-assignment_section-edit = 위치 수정
tracker-settings-mounting_section = 착용 방향
tracker-settings-mounting_section-description = 트래커는 어디에 착용하나요?
tracker-settings-mounting_section-edit = 방향 수정
tracker-settings-drift_compensation_section = Allow drift compensation
tracker-settings-drift_compensation_section-description = Should this tracker compensate for its drift when drift compensation is enabled?
tracker-settings-drift_compensation_section-edit = Allow drift compensation
# The .<name> means it's an attribute and it's related to the top key.
# In this case that is the settings for the assignment section.
tracker-settings-name_section = 트래커 이름
tracker-settings-name_section-description = 귀여운 이름을 지어주세요! >_<
tracker-settings-name_section-placeholder = NightyBeast's left leg
## Tracker part card info
tracker-part_card-no_name = 이름 없음
tracker-part_card-unassigned = 할당되지 않음
## Body assignment menu
body_assignment_menu = 트래커가 어디에 있나요?
body_assignment_menu-description = 이 트래커를 할당할 위치를 선택하세요. 또는, 모든 트래커를 한 번에 설정할 수도 있어요.
body_assignment_menu-show_advanced_locations = 고급 할당 위치 표시
body_assignment_menu-manage_trackers = 모든 트래커 설정
body_assignment_menu-unassign_tracker = 할당하지 않기
## Tracker assignment menu
# A -translation_key (with a dash in the front) means that it's a label.
# It can only be used in the translation file, it's nice for reusing names and that kind of stuff.
#
# We are using it here because english doesn't require changing the text in each case but
# maybe your language does.
-tracker_selection-part = Which tracker to assign to your
tracker_selection_menu-NONE = Which tracker do you want to be unassigned?
tracker_selection_menu-HEAD = { -tracker_selection-part } head?
tracker_selection_menu-NECK = { -tracker_selection-part } neck?
tracker_selection_menu-RIGHT_SHOULDER = { -tracker_selection-part } right shoulder?
tracker_selection_menu-RIGHT_UPPER_ARM = { -tracker_selection-part } right upper arm?
tracker_selection_menu-RIGHT_LOWER_ARM = { -tracker_selection-part } right lower arm?
tracker_selection_menu-RIGHT_HAND = { -tracker_selection-part } right hand?
tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } right thigh?
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } right ankle?
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } right foot?
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } right controller?
tracker_selection_menu-CHEST = { -tracker_selection-part } chest?
tracker_selection_menu-WAIST = { -tracker_selection-part } waist?
tracker_selection_menu-HIP = { -tracker_selection-part } hip?
tracker_selection_menu-LEFT_SHOULDER = { -tracker_selection-part } left shoulder?
tracker_selection_menu-LEFT_UPPER_ARM = { -tracker_selection-part } left upper arm?
tracker_selection_menu-LEFT_LOWER_ARM = { -tracker_selection-part } left lower arm?
tracker_selection_menu-LEFT_HAND = { -tracker_selection-part } left hand?
tracker_selection_menu-LEFT_UPPER_LEG = { -tracker_selection-part } left thigh?
tracker_selection_menu-LEFT_LOWER_LEG = { -tracker_selection-part } left ankle?
tracker_selection_menu-LEFT_FOOT = { -tracker_selection-part } left foot?
tracker_selection_menu-LEFT_CONTROLLER = { -tracker_selection-part } left controller?
tracker_selection_menu-unassigned = 할당되지 않은 트래커
tracker_selection_menu-assigned = 할당된 트래커
tracker_selection_menu-dont_assign = 할당하지 않기
## Mounting menu
mounting_selection_menu = 트래커가 어디에 있나요?
mounting_selection_menu-close = 닫기
## Sidebar settings
settings-sidebar-title = 설정
settings-sidebar-general = 일반
settings-sidebar-tracker_mechanics = 트래커 역학
settings-sidebar-fk_settings = FK 설정
settings-sidebar-gesture_control = 제스처 제어
settings-sidebar-interface = 인터페이스
settings-sidebar-osc_router = OSC 라우터
settings-sidebar-utils = 유틸리티
settings-sidebar-serial = 시리얼 콘솔
## SteamVR settings
settings-general-steamvr = SteamVR
settings-general-steamvr-subtitle = SteamVR 트래커
# Not all translation keys support multiline, only the ones that specify it will actually
# split it in lines (that also means you can split in lines however you want in those).
# The first spaces (not tabs) for indentation will be ignored, just to make the file look nice when writing.
# This one is one of this cases that cares about multilines
settings-general-steamvr-description =
SteamVR 트래커를 켜거나 끄세요
특정 트래커 구성만 허용하는 게임 또는 앱에서 유용해요.
settings-general-steamvr-trackers-waist = Waist
settings-general-steamvr-trackers-chest = Chest
settings-general-steamvr-trackers-feet = Feet
settings-general-steamvr-trackers-knees = Knees
settings-general-steamvr-trackers-elbows = Elbows
settings-general-steamvr-trackers-hands = Hands
## Tracker mechanics
settings-general-tracker_mechanics = 트래커 역학
settings-general-tracker_mechanics-filtering = 필터링
# This also cares about multilines
settings-general-tracker_mechanics-filtering-description =
트래커의 필터링 유형을 선택하세요.
Prediction은 움직임을 예측하고 Smoothing은 움직임을 부드럽게 해요.
settings-general-tracker_mechanics-filtering-type = 필터링 타입
settings-general-tracker_mechanics-filtering-type-none = 필터링 없음
settings-general-tracker_mechanics-filtering-type-none-description = 어떠한 필터링도 사용하지 않아요. 있는 그대로의 회전 값을 사용해요.
settings-general-tracker_mechanics-filtering-type-smoothing = Smoothing
settings-general-tracker_mechanics-filtering-type-smoothing-description = 움직임을 부드럽게 하지만 약간의 대기 시간이 추가돼요.
settings-general-tracker_mechanics-filtering-type-prediction = Prediction
settings-general-tracker_mechanics-filtering-type-prediction-description = 대기 시간이 줄어들고 움직임이 더 빨라지지만 지터가 증가할 수 있어요.
settings-general-tracker_mechanics-filtering-amount = 강도
settings-general-tracker_mechanics-drift_compensation = Drift compensation
# This cares about multilines
settings-general-tracker_mechanics-drift_compensation-description =
Compensates IMU yaw drift by applying an inverse rotation.
Change amount of compensation and up to how many resets are taken into account.
settings-general-tracker_mechanics-drift_compensation-enabled-label = Drift compensation
settings-general-tracker_mechanics-drift_compensation-amount-label = Compensation amount
settings-general-tracker_mechanics-drift_compensation-max_resets-label = Use up to x last resets
## FK/Tracking settings
settings-general-fk_settings = FK 설정
settings-general-fk_settings-leg_tweak = 다리 보정
settings-general-fk_settings-leg_tweak-description = 플로어 클립은 바닥과의 클리핑을 줄이거나 제거할 수 있지만 무릎을 꿇을 때 문제를 일으킬 수 있어요. 스케이팅 보정은 아이스 스케이팅을 보정하지만, 특정 움직임 패턴에서 정확도를 저하시킬 수 있어요.
# 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 = 플로어 클립
# 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)
# definition - Guesses when each foot is in contact with the ground and uses that information to improve tracking
settings-general-fk_settings-leg_tweak-skating_correction = 스케이팅 보정
settings-general-fk_settings-leg_tweak-skating_correction-amount = 스케이팅 보정 강도
settings-general-fk_settings-arm_fk = 팔 운동학
settings-general-fk_settings-arm_fk-description = 팔이 추적되는 방식을 변경할 수 있어요.
settings-general-fk_settings-arm_fk-force_arms = 팔을 HMD에서만 받아오기
settings-general-fk_settings-skeleton_settings = 골격 설정
settings-general-fk_settings-skeleton_settings-description = 골격 설정을 설정하거나 해제해요. 이것들은 켜두는 게 좋아요.
settings-general-fk_settings-skeleton_settings-extended_spine = 척추 확장
settings-general-fk_settings-skeleton_settings-extended_pelvis = 골반 확장
settings-general-fk_settings-skeleton_settings-extended_knees = 무릎 확장
settings-general-fk_settings-vive_emulation-title = Vive emulation
settings-general-fk_settings-vive_emulation-description = Emulate the waist tracker problems that Vive trackers have. This is a joke and makes tracking worse.
settings-general-fk_settings-vive_emulation-label = Enable Vive emulation
## Gesture control settings (tracker tapping)
settings-general-gesture_control = 제스처 제어
settings-general-gesture_control-subtitle = 두 번 탭해서 퀵 리셋하기
settings-general-gesture_control-description = 활성화하면 가장 높이 있는 트래커의 아무 곳이나 두 번 탭해서 퀵 리셋을 활성화할 수 있어요. 두번 탭하는 간격은 딜레이로 조절할 수 있어요.
# This is a unit: 3 taps, 2 taps, 1 tap
# $amount (Number) - Amount of taps (touches to the tracker's case)
settings-general-gesture_control-taps = { $amount ->
[one] 1 tap
*[other] { $amount } taps
}
settings-general-gesture_control-quickResetEnabled = Enable tap to quick reset
settings-general-gesture_control-quickResetDelay = Quick reset delay
settings-general-gesture_control-quickResetTaps = Taps for quick reset
settings-general-gesture_control-resetEnabled = Enable tap to reset
settings-general-gesture_control-resetDelay = Reset delay
settings-general-gesture_control-resetTaps = Taps for reset
settings-general-gesture_control-mountingResetEnabled = Enable tap to reset mounting
settings-general-gesture_control-mountingResetDelay = Mounting reset delay
settings-general-gesture_control-mountingResetTaps = Taps for mounting reset
## Interface settings
settings-general-interface = 인터페이스
settings-general-interface-dev_mode = 개발자 모드
settings-general-interface-dev_mode-description = 이 모드는 더 많은 데이터가 필요하거나 고급 수준에서 연결된 트래커와 상호 작용하는 경우에 유용할 수 있어요.
settings-general-interface-dev_mode-label = 개발자 모드
settings-general-interface-serial_detection = 시리얼 디바이스 감지
settings-general-interface-serial_detection-description = 이 옵션은 트래커일 수도 있는 새로운 시리얼 디바이스를 연결할 때마다 팝업을 표시해요. 트래커 설정 프로세스를 개선하는 데 도움이 될 거에요.
settings-general-interface-serial_detection-label = 시리얼 디바이스 감지
settings-general-interface-lang = 언어 선택
settings-general-interface-lang-description = 사용하고 싶은 기본 언어를 선택하세요.
settings-general-interface-lang-placeholder = 사용할 언어를 선택하세요
## Serial settings
settings-serial = 시리얼 콘솔
# This cares about multilines
settings-serial-description =
이 라이브 피드에서 시리얼 디바이스와 통신할 수 있어요.
펌웨어가 제대로 작동하는지 알아야 할 때 유용할 거에요.
settings-serial-connection_lost = 시리얼 연결 끊김, 다시 연결 중...
settings-serial-reboot = 재부팅
settings-serial-factory_reset = 공장 초기화
settings-serial-get_infos = 정보 가져오기
settings-serial-serial_select = 시리얼 포트 선택
settings-serial-auto_dropdown_item = 자동
## OSC router settings
settings-osc-router = OSC 라우터
# This cares about multilines
settings-osc-router-description =
다른 프로그램에서 오는 OSC 메시지를 전달해요.
예를 들어 VRChat과 함께 다른 OSC 프로그램을 사용하는 데 유용할 거에요.
settings-osc-router-enable = 활성화
settings-osc-router-enable-description = 활성화해서 메세지 전달 켜기
settings-osc-router-enable-label = 활성화
settings-osc-router-network = 네트워크 포트
# This cares about multilines
settings-osc-router-network-description =
데이터 수신 및 전송을 위한 포트 설정
이들은 SlimeVR 서버에서 사용되는 다른 포트와 동일할 수 있어요.
settings-osc-router-network-port_in =
.label = 들어오는 포트
.placeholder = Port in (기본값: 9002)
settings-osc-router-network-port_out =
.label = 나가는 포트
.placeholder = Port out (기본값: 9000)
settings-osc-router-network-address = 네트워크 주소
settings-osc-router-network-address-description = 데이터를 보낼 주소를 설정하세요.
settings-osc-router-network-address-placeholder = IPV4 주소
## OSC VRChat settings
settings-osc-vrchat = VRChat OSC Trackers
# This cares about multilines
settings-osc-vrchat-description =
HMD 데이터 수신 및 전송을 위한 VRChat 관련 설정 변경
FBT용 트래커 데이터(Quest 단독에서 작동)
settings-osc-vrchat-enable = 활성화
settings-osc-vrchat-enable-description = 활성화해서 데이터 송수신 전환
settings-osc-vrchat-enable-label = 활성화
settings-osc-vrchat-network = 네트워크 포트
settings-osc-vrchat-network-description = VRChat과 데이터를 주고받는 포트 설정
settings-osc-vrchat-network-port_in =
.label = 들어오는 포트
.placeholder = Port in (기본값: 9001)
settings-osc-vrchat-network-port_out =
.label = 나가는 포트
.placeholder = Port out (기본값: 9000)
settings-osc-vrchat-network-address = 네트워크 주소
settings-osc-vrchat-network-address-description = VRChat으로 데이터를 보낼 주소를 선택하세요(장치의 Wi-Fi 설정 확인).
settings-osc-vrchat-network-address-placeholder = VRChat IP 주소
settings-osc-vrchat-network-trackers = 트래커
settings-osc-vrchat-network-trackers-description = 활성화해서 데이터 송수신 전환
settings-osc-vrchat-network-trackers-chest = Chest
settings-osc-vrchat-network-trackers-waist = Waist
settings-osc-vrchat-network-trackers-knees = Knees
settings-osc-vrchat-network-trackers-feet = Feet
settings-osc-vrchat-network-trackers-elbows = Elbows
## Setup/onboarding menu
onboarding-skip = 설정 건너뛰기
onboarding-continue = 계속하기
onboarding-wip = 아직 공사 중이에요
## WiFi setup
onboarding-wifi_creds-back = 처음으로 돌아가기
onboarding-wifi_creds = WiFi 자격 증명을 입력하세요
# This cares about multilines
onboarding-wifi_creds-description =
트래커는 이 자격 증명을 사용하여 무선으로 연결해요
지금 연결되어 있는 자격 증명을 사용해주세요
onboarding-wifi_creds-skip = WiFi 설정 건너뛰기
onboarding-wifi_creds-submit = 저장!
onboarding-wifi_creds-ssid =
.label = SSID
.placeholder = Enter SSID
onboarding-wifi_creds-password =
.label = Password
.placeholder = Enter password
## Mounting setup
onboarding-reset_tutorial-back = 착용 방향 정렬로 돌아가기
onboarding-reset_tutorial = 리셋 튜토리얼
onboarding-reset_tutorial-description = 이 기능은 아직 완성되지 않았어요, 지금은 일단 계속하기를 눌러주세요!
## Setup start
onboarding-home = SlimeVR에 어서오세요!
# This cares about multilines and it's centered!!
onboarding-home-description =
Bringing full-body tracking
to everyone
onboarding-home-start = 설정하러 가보죠!
## Enter VR part of setup
onboarding-enter_vr-back = 트래커 위치 지정으로 돌아가기
onboarding-enter_vr-title = VR에 들어갈 시간이에요!
onboarding-enter_vr-description = 모든 트래커를 착용하고 VR에 입장하세요!
onboarding-enter_vr-ready = 준비됐어요!
## Setup done
onboarding-done-title = 모든 설정을 마쳤어요!
onboarding-done-description = 풀바디 트래킹을 즐기세요!
onboarding-done-close = 마법사 닫기
## Tracker connection setup
onboarding-connect_tracker-back = WiFi 자격 증명으로 돌아가기
onboarding-connect_tracker-title = 트래커 연결
onboarding-connect_tracker-description-p0 = 이제 모든 트래커를 연결하는 재미있는 부분으로 가봐요!
onboarding-connect_tracker-description-p1 = 그냥 모든 트래커를 USB 포트에 연결하기만 하면 돼요
onboarding-connect_tracker-issue-serial = 연결하는 데 문제가 생겼어요!
onboarding-connect_tracker-usb = USB 트래커
onboarding-connect_tracker-connection_status-connecting = WiFi 자격증명 전송 중
onboarding-connect_tracker-connection_status-connected = WiFi 연결됨
onboarding-connect_tracker-connection_status-error = Wifi에 연결할 수 없음
onboarding-connect_tracker-connection_status-start_connecting = 트래커 찾는 중
onboarding-connect_tracker-connection_status-handshake = 서버에 연결됨
# $amount (Number) - Amount of trackers connected (this is a number, but you can use CLDR plural rules for your language)
# More info on https://www.unicode.org/cldr/cldr-aux/charts/22/supplemental/language_plural_rules.html
# English in this case only has 2 plural rules, which are "one" and "other",
# we use 0 in an explicit way because there is no plural rule in english for 0, so we directly say
# if $amount is 0 then we say "No trackers connected"
onboarding-connect_tracker-connected_trackers = { $amount ->
[0] No trackers
[one] 1 tracker
*[other] { $amount } trackers
} connected
onboarding-connect_tracker-next = 모든 트래커를 잘 연결했어요
## Tracker assignment setup
onboarding-assign_trackers-back = WiFi 자격 증명으로 돌아가기
onboarding-assign_trackers-title = 트래커 위치 지정
onboarding-assign_trackers-description = 이제, 어떤 트래커가 어디에 있는지 선택할 시간이에요. 트래커를 배치할 위치를 클릭해보세요
# 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
onboarding-assign_trackers-assigned = { $assigned } of { $trackers ->
[one] 1 tracker
*[other] { $trackers } trackers
} assigned
onboarding-assign_trackers-advanced = 고급 할당 위치 보기
onboarding-assign_trackers-next = 모든 트래커를 배치했어요
## Tracker manual mounting setup
onboarding-manual_mounting-back = VR 입장 페이지로 돌아가기
onboarding-manual_mounting = 수동으로 착용 방향 설정
onboarding-manual_mounting-description = 트래커를 클릭한 다음, 트래커가 바라보는 방향을 선택해주세요
onboarding-manual_mounting-auto_mounting = 자동으로 착용 방향 설정
onboarding-manual_mounting-next = 다음 단계
## Tracker automatic mounting setup
onboarding-automatic_mounting-back = VR 입장 페이지로 돌아가기
onboarding-automatic_mounting-title = 착용 방향 정렬
onboarding-automatic_mounting-description = SlimeVR 트래커가 작동하려면, 착용 방향을 정해야 해요. 이 단계에서는 실제 트래커의 회전과 맞게 착용 방향을 정렬할 거에요.
onboarding-automatic_mounting-manual_mounting = 수동으로 착용 방향 설정
onboarding-automatic_mounting-next = 다음 단계
onboarding-automatic_mounting-prev_step = 이전 단계
onboarding-automatic_mounting-done-title = 착용 방향이 정렬되었어요
onboarding-automatic_mounting-done-description = 트래커의 착용 방향이 잘 설정되었어요!
onboarding-automatic_mounting-done-restart = 다시 처음으로 돌아가기
onboarding-automatic_mounting-mounting_reset-title = 착용 방향 정렬
onboarding-automatic_mounting-mounting_reset-step-0 = 1. 팔, 다리를 구부린 다음 상체를 앞으로 기울여서 마치 스키를 타는 것처럼 쪼그리고 앉으세요.
onboarding-automatic_mounting-mounting_reset-step-1 = 2. "착용 방향 재설정" 버튼을 누르고 착용 방향이 재설정될 때 까지 3초간 기다려주세요.
onboarding-automatic_mounting-preparation-title = 준비
onboarding-automatic_mounting-preparation-step-0 = 1. 팔을 몸에 붙이고 똑바로 서 주세요
onboarding-automatic_mounting-preparation-step-1 = 2. "리셋" 버튼을 누르고 트래커가 리셋될 때까지 3초 동안 기다려주세요
onboarding-automatic_mounting-put_trackers_on-title = 트래커를 착용해주세요
onboarding-automatic_mounting-put_trackers_on-description = 트래커의 착용 방향이 돌아가는 것을 보정하기 위해 방금 할당한 트래커를 사용할 거에요. 모든 트래커를 착용했다면 오른쪽 그림에서 어떤 트래커인지 확인할 수 있어요.
onboarding-automatic_mounting-put_trackers_on-next = 모든 트래커를 착용했어요
## Tracker manual proportions setup
onboarding-manual_proportions-back = 리셋 튜토리얼로 돌아가기
onboarding-manual_proportions-title = 수동 신체 비율 설정
onboarding-manual_proportions-precision = 자세히 조절하기
onboarding-manual_proportions-auto = 자동 신체 비율 설정
## Tracker automatic proportions setup
onboarding-automatic_proportions-back = 리셋 튜토리얼로 돌아가기
onboarding-automatic_proportions-title = 신체 비율을 측정해보세요
onboarding-automatic_proportions-description = SlimeVR 트래커가 작동하려면 뼈의 길이를 알아야 하는데, 이 짧은 보정을 통해 측정할 수 있어요.
onboarding-automatic_proportions-manual = 수동 신체 비율 설정
onboarding-automatic_proportions-prev_step = 뒤로
onboarding-automatic_proportions-put_trackers_on-title = 트래커를 착용하세요
onboarding-automatic_proportions-put_trackers_on-description = 비율을 조정하기 위해 방금 할당한 트래커를 사용할 거에요. 모든 트래커를 착용하면 오른쪽 그림에서 어떤 것이 있는지 알 수 있어요.
onboarding-automatic_proportions-put_trackers_on-next = 트래커를 다 착용했어요
onboarding-automatic_proportions-preparation-title = 준비하기
onboarding-automatic_proportions-preparation-description = 여러분의 놀이 공간 안에 여러분의 바로 뒤에 의자를 놓으세요. 오토본 설정 중에 앉을 수 있도록 준비해주세요.
onboarding-automatic_proportions-preparation-next = 의자 앞에 서 있어요
onboarding-automatic_proportions-start_recording-title = 움직일 준비
onboarding-automatic_proportions-start_recording-description = 이제 몇 가지 특정 포즈와 동작을 기록할 거에요. 다음 화면에서 메시지가 표시되면 버튼을 눌러서 시작하세요!
onboarding-automatic_proportions-start_recording-next = 기록 시작하기
onboarding-automatic_proportions-recording-title = REC
onboarding-automatic_proportions-recording-description-p0 = 기록하는 중...
onboarding-automatic_proportions-recording-description-p1 = 아래에 표시된 동작을 따라 하세요
onboarding-automatic_proportions-recording-steps-0 = 무릎을 몇 번 구부리세요
onboarding-automatic_proportions-recording-steps-1 = 의자에 앉았다가 일어서세요.
onboarding-automatic_proportions-recording-steps-2 = 상체를 왼쪽으로 비틀고 오른쪽으로 구부리세요.
onboarding-automatic_proportions-recording-steps-3 = 상체를 오른쪽으로 비틀고 왼쪽으로 구부리세요.
onboarding-automatic_proportions-recording-steps-4 = 타이머가 종료될 때까지 이리저리 움직여 보세요.
onboarding-automatic_proportions-recording-processing = 결과 처리 중
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 15)
onboarding-automatic_proportions-recording-timer = { $time ->
[one] 1 second left
*[other] { $time } seconds left
}
onboarding-automatic_proportions-verify_results-title = 결과를 확인하세요
onboarding-automatic_proportions-verify_results-description = 아래 결과를 한번 보세요, 어때요?
onboarding-automatic_proportions-verify_results-results = 기록 결과
onboarding-automatic_proportions-verify_results-processing = 결과 처리중
onboarding-automatic_proportions-verify_results-redo = 다시 기록하기
onboarding-automatic_proportions-verify_results-confirm = 정확해요!
onboarding-automatic_proportions-done-title = 몸을 측정하고 저장했어요
onboarding-automatic_proportions-done-description = 신체 비율 보정이 완료되었어요!
## Home
home-no_trackers = 감지되거나 할당된 트래커가 없어요.

View File

@@ -0,0 +1,519 @@
### SlimeVR complete GUI translations
# Please developers (not translators) don't reuse a key inside another key
# or concat text with a translation string in the code, use the appropriate
# features like variables and selectors in each appropriate case!
# And also comment the string if it's something not easy to translate, so you help
# translators on what it means
## Websocket (server) status
websocket-connecting = Łączenie z serwerem
websocket-connection_lost = Połączenie z serwerem zostało utracone. Próba ponownego połączenia...
## Tips
tips-find_tracker = Nie wiesz który tracker to który? Obracaj Trackerem , podczas obracania będzie sie on podświetlał w serwerze.
tips-do_not_move_heels = Upewnij się aby pięty pozostały w bezruchu podczas nagrywania.
## Body parts
body_part-NONE = Nie Przypisano
body_part-HEAD = Głowa
body_part-NECK = Szyja
body_part-RIGHT_SHOULDER = Prawe Ramie
body_part-RIGHT_UPPER_ARM = Prawy Biceps
body_part-RIGHT_LOWER_ARM = Prawe PrzedRamie
body_part-RIGHT_HAND = Prawa Dłoń
body_part-RIGHT_UPPER_LEG = Prawe Udo
body_part-RIGHT_LOWER_LEG = Prawy Podudzie
body_part-RIGHT_FOOT = Prawa Stopa
body_part-RIGHT_CONTROLLER = Right controller
body_part-CHEST = Klatka Piersiowa
body_part-WAIST = Pas
body_part-HIP = Biodra
body_part-LEFT_SHOULDER = Lewe Ramie
body_part-LEFT_UPPER_ARM = Lewy Biceps
body_part-LEFT_LOWER_ARM = Lewe PrzedRamie
body_part-LEFT_HAND = Lewa Dłoń
body_part-LEFT_UPPER_LEG = Lewe Udo
body_part-LEFT_LOWER_LEG = Lewe Podudzie
body_part-LEFT_FOOT = Lewa Stopa
body_part-LEFT_CONTROLLER = Left controller
## Skeleton stuff
skeleton_bone-NONE = Brak
skeleton_bone-HEAD = Head Shift
skeleton_bone-NECK = Długość Szyi
skeleton_bone-TORSO = Długość Tułowia
skeleton_bone-CHEST = Długość Klatki Piersiowej
skeleton_bone-WAIST = Waist Distance
skeleton_bone-HIP_OFFSET = Offset Bioder
skeleton_bone-HIPS_WIDTH = Szerokość Bioder
skeleton_bone-LEGS_LENGTH = Długość Nóg
skeleton_bone-KNEE_HEIGHT = Wysokość Kolana
skeleton_bone-FOOT_LENGTH = Długość Stopy
skeleton_bone-FOOT_SHIFT = Foot Shift
skeleton_bone-SKELETON_OFFSET = Skeleton Offset
skeleton_bone-CONTROLLER_DISTANCE_Z = Controller Distance Z
skeleton_bone-CONTROLLER_DISTANCE_Y = Controller Distance Y
skeleton_bone-FOREARM_LENGTH = Długość PrzedRamienia
skeleton_bone-SHOULDERS_DISTANCE = Shoulders Distance
skeleton_bone-SHOULDERS_WIDTH = Szerokość Ramion
skeleton_bone-UPPER_ARM_LENGTH = Długość Bicepsa
skeleton_bone-ELBOW_OFFSET = Offset Łokcia
## Tracker reset buttons
reset-reset_all = Zresetuj wszystkie wymiary
reset-full = Reset
reset-mounting = Zresetuj Położenie
reset-quick = Szybki Reset
## Serial detection stuff
serial_detection-new_device-p0 = Wykryto Nowe Urządzenie.
serial_detection-new_device-p1 = Wprowadź dane WiFi!
serial_detection-new_device-p2 = Wybierz co chcesz z nim zrobić.
serial_detection-open_wifi = Połącz z WiFi
serial_detection-open_serial = Otwórz Konsole
serial_detection-submit = Potwierdź!
serial_detection-close = Zamknij
## Navigation bar
navbar-home = Strona Główna
navbar-body_proportions = Proporcje Ciała
navbar-trackers_assign = Przydzielenie Trackerów
navbar-mounting = Kalibracja Pozycji
navbar-onboarding = Wstępna Konfiguracja
navbar-settings = Ustawienia
## Bounding volume hierarchy recording
bvh-start_recording = Nagraj BVH
bvh-recording = Nagrywam...
## Overlay settings
overlay-is_visible_label = Pokaż Overlay w SteamVR
overlay-is_mirrored_label = Pokaż Overlay jako Lustro
## Tracker status
tracker-status-none = Brak Statusu
tracker-status-busy = Zajęty
tracker-status-error = Error
tracker-status-disconnected = Rozłączono
tracker-status-occluded = Zablokowany
tracker-status-ok = Połączono
## Tracker status columns
tracker-table-column-name = Nazwa
tracker-table-column-type = Typ
tracker-table-column-battery = Bateria
tracker-table-column-ping = Ping
tracker-table-column-rotation = Rotacja X/Y/Z
tracker-table-column-position = Pozycja X/Y/Z
tracker-table-column-url = URL
## Tracker rotation
tracker-rotation-front = Przód
tracker-rotation-left = Lewa
tracker-rotation-right = Prawa
tracker-rotation-back = Tył
## Tracker information
tracker-infos-manufacturer = Producent
tracker-infos-display_name = Wyświetlana Nazwa
tracker-infos-custom_name = Niestandardowa Nazwa
tracker-infos-url = Tracker URL
## Tracker settings
tracker-settings-back = Wróć do listy trackerów
tracker-settings-title = Ustawienia Trackerów
tracker-settings-assignment_section = Przydzielanie
tracker-settings-assignment_section-description = Do jakiej części ciała jest przydzielony tracker.
tracker-settings-assignment_section-edit = Edytuj
tracker-settings-mounting_section = Położenie Trackera
tracker-settings-mounting_section-description = Gdzie jest Tracker zamontowany?
tracker-settings-mounting_section-edit = Edytuj
tracker-settings-drift_compensation_section = Allow drift compensation
tracker-settings-drift_compensation_section-description = Should this tracker compensate for its drift when drift compensation is enabled?
tracker-settings-drift_compensation_section-edit = Allow drift compensation
# The .<name> means it's an attribute and it's related to the top key.
# In this case that is the settings for the assignment section.
tracker-settings-name_section = Nazwa Trackera
tracker-settings-name_section-description = Daj mu słodką nazwę :)
tracker-settings-name_section-placeholder = Lewa noga Yexo
## Tracker part card info
tracker-part_card-no_name = Brak Nazwy
tracker-part_card-unassigned = Nieprzydzielony
## Body assignment menu
body_assignment_menu = Gdzie chcesz żeby ten tracker był?
body_assignment_menu-description = Wybierz miejsce gdzie tracker będzie przydzielony. Alternatywnie możesz ustawić wszystkie na raz.
body_assignment_menu-show_advanced_locations = Pokaż zaawansowane położenia
body_assignment_menu-manage_trackers = Zarządzaj wszystkimi trackerami
body_assignment_menu-unassign_tracker = Usuń przydzielenie
## Tracker assignment menu
# A -translation_key (with a dash in the front) means that it's a label.
# It can only be used in the translation file, it's nice for reusing names and that kind of stuff.
#
# We are using it here because english doesn't require changing the text in each case but
# maybe your language does.
-tracker_selection-part = Which tracker to assign to your
tracker_selection_menu-NONE = Which tracker do you want to be unassigned?
tracker_selection_menu-HEAD = { -tracker_selection-part } head?
tracker_selection_menu-NECK = { -tracker_selection-part } neck?
tracker_selection_menu-RIGHT_SHOULDER = { -tracker_selection-part } right shoulder?
tracker_selection_menu-RIGHT_UPPER_ARM = { -tracker_selection-part } right upper arm?
tracker_selection_menu-RIGHT_LOWER_ARM = { -tracker_selection-part } right lower arm?
tracker_selection_menu-RIGHT_HAND = { -tracker_selection-part } right hand?
tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } right thigh?
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } right ankle?
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } right foot?
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } right controller?
tracker_selection_menu-CHEST = { -tracker_selection-part } chest?
tracker_selection_menu-WAIST = { -tracker_selection-part } waist?
tracker_selection_menu-HIP = { -tracker_selection-part } hip?
tracker_selection_menu-LEFT_SHOULDER = { -tracker_selection-part } left shoulder?
tracker_selection_menu-LEFT_UPPER_ARM = { -tracker_selection-part } left upper arm?
tracker_selection_menu-LEFT_LOWER_ARM = { -tracker_selection-part } left lower arm?
tracker_selection_menu-LEFT_HAND = { -tracker_selection-part } left hand?
tracker_selection_menu-LEFT_UPPER_LEG = { -tracker_selection-part } left thigh?
tracker_selection_menu-LEFT_LOWER_LEG = { -tracker_selection-part } left ankle?
tracker_selection_menu-LEFT_FOOT = { -tracker_selection-part } left foot?
tracker_selection_menu-LEFT_CONTROLLER = { -tracker_selection-part } left controller?
tracker_selection_menu-unassigned = Nieprzydzielone trackery
tracker_selection_menu-assigned = Przydzielone trackery
tracker_selection_menu-dont_assign = Nie przydzielaj
## Mounting menu
mounting_selection_menu = Gdzie chciałbyś ten tracker?
mounting_selection_menu-close = Zamknij
## Sidebar settings
settings-sidebar-title = Ustawienia
settings-sidebar-general = Ogólne
settings-sidebar-tracker_mechanics = Tracker mechanics
settings-sidebar-fk_settings = FK settings
settings-sidebar-gesture_control = Gesture control
settings-sidebar-interface = Interfejs
settings-sidebar-osc_router = OSC router
settings-sidebar-utils = Narzędzia
settings-sidebar-serial = Konsola Seryjna
## SteamVR settings
settings-general-steamvr = SteamVR
settings-general-steamvr-subtitle = SteamVR trackers
# Not all translation keys support multiline, only the ones that specify it will actually
# split it in lines (that also means you can split in lines however you want in those).
# The first spaces (not tabs) for indentation will be ignored, just to make the file look nice when writing.
# This one is one of this cases that cares about multilines
settings-general-steamvr-description =
Włącz lub Wyłącz specyficzne pozycje trackowania.
Przydatne jeżeli chcesz więcej kontroli nad SlimeVR.
settings-general-steamvr-trackers-waist = Bruch
settings-general-steamvr-trackers-chest = Klatka Piersiowa
settings-general-steamvr-trackers-feet = Stopy
settings-general-steamvr-trackers-knees = Kolana
settings-general-steamvr-trackers-elbows = Łokcie
settings-general-steamvr-trackers-hands = Ręce
## Tracker mechanics
settings-general-tracker_mechanics = Tracker mechanics
settings-general-tracker_mechanics-filtering = Filtrowanie
# This also cares about multilines
settings-general-tracker_mechanics-filtering-description =
Wybierz Filtry dla twoich trackerów.
Przewidywanie przewiduje ruchy a Wygładzanie stara się wygładzić ruchy.
settings-general-tracker_mechanics-filtering-type = Filtry
settings-general-tracker_mechanics-filtering-type-none = Brak Filtrów
settings-general-tracker_mechanics-filtering-type-none-description = Używa rotacji takimi jakimi są.
settings-general-tracker_mechanics-filtering-type-smoothing = Wygładzanie
settings-general-tracker_mechanics-filtering-type-smoothing-description = Wygładza ruchy lecz dodaje trochę opóźnienia.
settings-general-tracker_mechanics-filtering-type-prediction = Przewidywanie
settings-general-tracker_mechanics-filtering-type-prediction-description = Zmniejsza opóźnienie i robi ruchy trochę ostrzejszymi, ale może dodać trochę drgań.
settings-general-tracker_mechanics-filtering-amount = Ilość
settings-general-tracker_mechanics-drift_compensation = Drift compensation
# This cares about multilines
settings-general-tracker_mechanics-drift_compensation-description =
Compensates IMU yaw drift by applying an inverse rotation.
Change amount of compensation and up to how many resets are taken into account.
settings-general-tracker_mechanics-drift_compensation-enabled-label = Drift compensation
settings-general-tracker_mechanics-drift_compensation-amount-label = Compensation amount
settings-general-tracker_mechanics-drift_compensation-max_resets-label = Use up to x last resets
## FK settings
settings-general-fk_settings = Tracking settings
settings-general-fk_settings-leg_tweak = Leg tweaks
settings-general-fk_settings-leg_tweak-description = Floor-clip can Reduce or even eliminates clipping with the floor but may cause problems when on your knees. Skating-correction corrects for ice skating, but can decrease accuracy in certain movement patterns.
# 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 = Floor clip
# 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)
# definition - Guesses when each foot is in contact with the ground and uses that information to improve tracking
settings-general-fk_settings-leg_tweak-skating_correction = Skating correction
settings-general-fk_settings-leg_tweak-skating_correction-amount = Skating correction strength
settings-general-fk_settings-arm_fk = Arm tracking
settings-general-fk_settings-arm_fk-description = Change the way the arms are tracked.
settings-general-fk_settings-arm_fk-force_arms = Force arms from HMD
settings-general-fk_settings-skeleton_settings = Skeleton settings
settings-general-fk_settings-skeleton_settings-description = Toggle skeleton settings on or off. It is recommended to leave these on.
settings-general-fk_settings-skeleton_settings-extended_spine = Extended spine
settings-general-fk_settings-skeleton_settings-extended_pelvis = Extended pelvis
settings-general-fk_settings-skeleton_settings-extended_knees = Extended knee
settings-general-fk_settings-vive_emulation-title = Vive emulation
settings-general-fk_settings-vive_emulation-description = Emulate the waist tracker problems that Vive trackers have. This is a joke and makes tracking worse.
settings-general-fk_settings-vive_emulation-label = Enable Vive emulation
## Gesture control settings (tracker tapping)
settings-general-gesture_control = Kontrola Gestami
settings-general-gesture_control-subtitle = Dotknij 2 razy by wykonać szybki reset
settings-general-gesture_control-description = Włącz lub wyłącz opcje szybkiego resetowanie podwójnym dotknięciem. Stuknij 2 razy w jakąkolwiek część trackera na klatce piersiowej aby wykonać szybki reset. Opóźnienie jest czasem pomiędzy stuknięciem a wykonaniem szybkiego resetu.
# This is a unit: 3 taps, 2 taps, 1 tap
# $amount (Number) - Amount of taps (touches to the tracker's case)
settings-general-gesture_control-taps = { $amount ->
[one] 1 tap
*[other] { $amount } taps
}
settings-general-gesture_control-quickResetEnabled = Enable tap to quick reset
settings-general-gesture_control-quickResetDelay = Quick reset delay
settings-general-gesture_control-quickResetTaps = Taps for quick reset
settings-general-gesture_control-resetEnabled = Enable tap to reset
settings-general-gesture_control-resetDelay = Reset delay
settings-general-gesture_control-resetTaps = Taps for reset
settings-general-gesture_control-mountingResetEnabled = Enable tap to reset mounting
settings-general-gesture_control-mountingResetDelay = Mounting reset delay
settings-general-gesture_control-mountingResetTaps = Taps for mounting reset
## Interface settings
settings-general-interface = Interfejs
settings-general-interface-dev_mode = Tryb Dewelopera
settings-general-interface-dev_mode-description = Ten tryb przydaje się do sprawdzania większej ilości danych.
settings-general-interface-dev_mode-label = Tryb Dewelopera
settings-general-interface-serial_detection = Wykrywanie urządzeń
settings-general-interface-serial_detection-description = Ta opcja daje powiadomienia jeżeli serwer wykryje urządzenie które może być trackerem
settings-general-interface-serial_detection-label = Wykrywanie urządzeń
settings-general-interface-lang = Wybierz Język
settings-general-interface-lang-description = Zmień podstawowy język jaki chcesz używać
settings-general-interface-lang-placeholder = Wybierz Język który będziesz używać
## Serial settings
settings-serial = Serial Console
# This cares about multilines
settings-serial-description =
This is a live information feed for serial communication.
May be useful if you need to know the firmware is acting up.
settings-serial-connection_lost = Connection to serial lost, Reconnecting...
settings-serial-reboot = Reboot
settings-serial-factory_reset = Factory Reset
settings-serial-get_infos = Get Infos
settings-serial-serial_select = Select a serial port
settings-serial-auto_dropdown_item = Auto
## OSC router settings
settings-osc-router = OSC router
# This cares about multilines
settings-osc-router-description =
Forward OSC messages from another program.
Useful for using another OSC program with VRChat for example.
settings-osc-router-enable = Enable
settings-osc-router-enable-description = Toggle the forwarding of messages.
settings-osc-router-enable-label = Enable
settings-osc-router-network = Network ports
# This cares about multilines
settings-osc-router-network-description =
Set the ports for listening and sending data.
These can be the same as other ports used in the SlimeVR server.
settings-osc-router-network-port_in =
.label = Port In
.placeholder = Port in (default: 9002)
settings-osc-router-network-port_out =
.label = Port Out
.placeholder = Port out (default: 9000)
settings-osc-router-network-address = Network address
settings-osc-router-network-address-description = Set the address to send out data at.
settings-osc-router-network-address-placeholder = IPV4 address
## OSC VRChat settings
settings-osc-vrchat = VRChat OSC Trackers
# This cares about multilines
settings-osc-vrchat-description =
Change VRChat-specific settings to receive HMD data and send
trackers data for FBT (works on Quest standalone).
settings-osc-vrchat-enable = Enable
settings-osc-vrchat-enable-description = Toggle the sending and receiving of data.
settings-osc-vrchat-enable-label = Enable
settings-osc-vrchat-network = Network ports
settings-osc-vrchat-network-description = Set the ports for listening and sending data to VRChat.
settings-osc-vrchat-network-port_in =
.label = Port In
.placeholder = Port in (default: 9001)
settings-osc-vrchat-network-port_out =
.label = Port Out
.placeholder = Port out (default: 9000)
settings-osc-vrchat-network-address = Network address
settings-osc-vrchat-network-address-description = Choose which address to send out data to VRChat (check your wifi settings on your device).
settings-osc-vrchat-network-address-placeholder = VRChat ip address
settings-osc-vrchat-network-trackers = Trackers
settings-osc-vrchat-network-trackers-description = Toggle the sending of specific trackers via OSC.
settings-osc-vrchat-network-trackers-chest = Chest
settings-osc-vrchat-network-trackers-waist = Waist
settings-osc-vrchat-network-trackers-knees = Knees
settings-osc-vrchat-network-trackers-feet = Feet
settings-osc-vrchat-network-trackers-elbows = Elbows
## Setup/onboarding menu
onboarding-skip = Pomiń wstępną konfiguracje
onboarding-continue = Kontynuuj
onboarding-wip = W trakcie prac
## WiFi setup
onboarding-wifi_creds-back = Cofnij się do początku
onboarding-wifi_creds = Wpisz dane WiFi
# This cares about multilines
onboarding-wifi_creds-description =
Trackery będą używać tej sieci do łączenia się z serwerem
proszę używać sieci do której jest się połączonym
onboarding-wifi_creds-skip = Pomiń ustawienia WiFi
onboarding-wifi_creds-submit = Potwierdź!
onboarding-wifi_creds-ssid =
.label = SSID
.placeholder = Enter SSID
onboarding-wifi_creds-password =
.label = Password
.placeholder = Enter password
## Mounting setup
onboarding-reset_tutorial-back = Powrót do Konfiguracji Położenia trackerów
onboarding-reset_tutorial = Zresetuj poradnik
onboarding-reset_tutorial-description = Ta funkcja jeszcze nie jest skończona.
## Setup start
onboarding-home = Witamy w SlimeVR
# This cares about multilines and it's centered!!
onboarding-home-description =
Full-body tracking
dla każdego
onboarding-home-start = Zaczynajmny!
## Enter VR part of setup
onboarding-enter_vr-back = Cofnij do Przydzielania Trackerów
onboarding-enter_vr-title = Czas na wejście do VR!
onboarding-enter_vr-description = Załóż wszystkie trackery a potem wejdź do VR!
onboarding-enter_vr-ready = Jestem gotów
## Setup done
onboarding-done-title = Wszystko ustawione!
onboarding-done-description = Ciesz się Full-Body
onboarding-done-close = Zamknij Poradnik
## Tracker connection setup
onboarding-connect_tracker-back = Cofnij się do ustawień WiFi
onboarding-connect_tracker-title = Połącz trackery
onboarding-connect_tracker-description-p0 = Teraz czas na zabawe, połączenie wszystkich trackerów!
onboarding-connect_tracker-description-p1 = Po prostu połącz wszystkie dotychczas nie połączone trackery za pomocą USB
onboarding-connect_tracker-issue-serial = Mam problemy z połączeniem!
onboarding-connect_tracker-usb = USB Tracker
onboarding-connect_tracker-connection_status-connecting = Wysyłanie danych WiFi
onboarding-connect_tracker-connection_status-connected = Połączono z WiFi
onboarding-connect_tracker-connection_status-error = Nie można połączyć z Wifi
onboarding-connect_tracker-connection_status-start_connecting = Szukanie Trackerów
onboarding-connect_tracker-connection_status-handshake = Połączono z serwerem
# $amount (Number) - Amount of trackers connected (this is a number, but you can use CLDR plural rules for your language)
# More info on https://www.unicode.org/cldr/cldr-aux/charts/22/supplemental/language_plural_rules.html
# English in this case only has 2 plural rules, which are "one" and "other",
# we use 0 in an explicit way because there is no plural rule in english for 0, so we directly say
# if $amount is 0 then we say "No trackers connected"
onboarding-connect_tracker-connected_trackers = { $amount ->
[0] No trackers
[one] 1 tracker
*[other] { $amount } trackers
} connected
onboarding-connect_tracker-next = Połączyłem już wszystkie trackery
## Tracker assignment setup
onboarding-assign_trackers-back = Cofnij się do ustawień WiFi
onboarding-assign_trackers-title = Przydziel Trackery
onboarding-assign_trackers-description = Wybierzmy gdzie idzie jaki tracker. Naciśnij gdzie chcesz go przydzielić
# 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
onboarding-assign_trackers-assigned = { $assigned } of { $trackers ->
[one] 1 tracker
*[other] { $trackers } trackers
} assigned
onboarding-assign_trackers-advanced = Pokaż zaawansowane ustawienia pozycji
onboarding-assign_trackers-next = Przydzieliłem już wszystkie trackery
## Tracker manual mounting setup
onboarding-manual_mounting-back = Cofnij się żeby wejść do VR
onboarding-manual_mounting = Pozycjonowanie Manualne
onboarding-manual_mounting-description = Kliknij na każdy tracker i wybierz w jaki sposób są zamontowane
onboarding-manual_mounting-auto_mounting = Automatic mounting
onboarding-manual_mounting-next = Następny krok
## Tracker automatic mounting setup
onboarding-automatic_mounting-back = Cofnij się żeby wejść do VR
onboarding-automatic_mounting-title = Kalibracja Pozycji
onboarding-automatic_mounting-description = Aby SlimeVR działało prawidłowo, musimy przypisać rotacje trackera aby zgadzała się ona z tą w prawdziwym życiu.
onboarding-automatic_mounting-manual_mounting = Pozycjonowanie Manualne
onboarding-automatic_mounting-next = Następny krok
onboarding-automatic_mounting-prev_step = Poprzedni krok
onboarding-automatic_mounting-done-title = Rotacja trackerów została skalibrowana.
onboarding-automatic_mounting-done-description = Kalibracja skończona!
onboarding-automatic_mounting-done-restart = Cofnij się na początek
onboarding-automatic_mounting-mounting_reset-title = Kalibracja Pozycji
onboarding-automatic_mounting-mounting_reset-step-0 = 1. Zrób pozycje "na Małysza" z wygiętymi nogami, tułów pochylony do przodu z wygiętymi rękami.
onboarding-automatic_mounting-mounting_reset-step-1 = 2. Naciśnij "Zresetuj Położenie" i poczekaj 3 sekundy zanim trackery się zresetują.
onboarding-automatic_mounting-preparation-title = Przygotowania
onboarding-automatic_mounting-preparation-step-0 = 1. Stań prosto z rękami wyciągniętymi na bok.
onboarding-automatic_mounting-preparation-step-1 = 2. Naciśnij "Reset" i poczekaj 3 sekundy zanim trackery się zresetują.
onboarding-automatic_mounting-put_trackers_on-title = Załóż trackery
onboarding-automatic_mounting-put_trackers_on-description = Aby skalibrować rotacje, użyjemy trackerów które przed chwilą przypisałeś. Załóż wszystkie trackery, będziesz widział który to który na postaci po prawej.
onboarding-automatic_mounting-put_trackers_on-next = Mam wszystkie trackery założone
## Tracker manual proportions setup
onboarding-manual_proportions-back = Go Back to Reset tutorial
onboarding-manual_proportions-title = Manualne Proporcje Ciała
onboarding-manual_proportions-precision = Precyzyjna Regulacja
onboarding-manual_proportions-auto = Automatyczna Kalibracja
## Tracker automatic proportions setup
onboarding-automatic_proportions-back = Go Back to Reset tutorial
onboarding-automatic_proportions-title = Zmierz swoje ciało
onboarding-automatic_proportions-description = Aby SlimeVR działało poprawnie, musimy znać długość twoich kości. Ta kalibracja zrobi to za ciebie.
onboarding-automatic_proportions-manual = Kalibracja Manualna
onboarding-automatic_proportions-prev_step = Poprzedni krok
onboarding-automatic_proportions-put_trackers_on-title = Załóż trackery
onboarding-automatic_proportions-put_trackers_on-description = Aby skalibrować proporcje, użyjemy trackerów które przed chwilą przypisałeś. Załóż wszystkie trackery, będziesz widział który to który na postaci po prawej.
onboarding-automatic_proportions-put_trackers_on-next = Mam wszystkie trackery założone
onboarding-automatic_proportions-preparation-title = Przygotowania
onboarding-automatic_proportions-preparation-description = Połóż krzesło za sobą w twojej przeszczeni grania. Bądź gotowy do siadania podczas automatycznej kalibracji kości.
onboarding-automatic_proportions-preparation-next = Jestem przed krzesłem
onboarding-automatic_proportions-start_recording-title = Bądź gotowy żeby się ruszać
onboarding-automatic_proportions-start_recording-description = Będziemy teraz nagrywać specyficzne pozycje i ruchy. Będą one pokazane w następnym okienku. Bądź gotowy po naciśnięciu przycisku!
onboarding-automatic_proportions-start_recording-next = Uruchom nagrywanie
onboarding-automatic_proportions-recording-title = REC
onboarding-automatic_proportions-recording-description-p0 = Nagrywanie w toku...
onboarding-automatic_proportions-recording-description-p1 = Wykonuj ruchy pokazane niżej:
onboarding-automatic_proportions-recording-steps-0 = Zegnij kolana kilka razy.
onboarding-automatic_proportions-recording-steps-1 = Usiądź na krześle ,po czym wstań.
onboarding-automatic_proportions-recording-steps-2 = Przekręć ciało w lewo ,po czym przechyl się w prawo.
onboarding-automatic_proportions-recording-steps-3 = Przekręć ciało w prawo ,po czym przechyl się w lewo.
onboarding-automatic_proportions-recording-steps-4 = Poruszaj się dopuki czas się nie skończy
onboarding-automatic_proportions-recording-processing = Przetwarzanie wyników
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 15)
onboarding-automatic_proportions-recording-timer = { $time ->
[one] 1 second left
*[other] { $time } seconds left
}
onboarding-automatic_proportions-verify_results-title = Zweryfikuj Wyniki
onboarding-automatic_proportions-verify_results-description = Sprawdź wyniki poniżej, czy są prawidłowe?
onboarding-automatic_proportions-verify_results-results = Wyniki Nagrywania
onboarding-automatic_proportions-verify_results-processing = Przetwarzanie wyniku
onboarding-automatic_proportions-verify_results-redo = Powtórz Nagrywanie
onboarding-automatic_proportions-verify_results-confirm = Są Prawidłowe
onboarding-automatic_proportions-done-title = Zmierzono oraz Zapisano.
onboarding-automatic_proportions-done-description = Twoja kalibracja ciała została zakończona!
## Home
home-no_trackers = Nie wykryto trackerów

View File

@@ -0,0 +1,519 @@
### SlimeVR complete GUI translations
# Please developers (not translators) don't reuse a key inside another key
# or concat text with a translation string in the code, use the appropriate
# features like variables and selectors in each appropriate case!
# And also comment the string if it's something not easy to translate, so you help
# translators on what it means
## Websocket (server) status
websocket-connecting = Conectando ao servidor
websocket-connection_lost = Conexão perdida com o servidor. Reconectando...
## Tips
tips-find_tracker = Não tem certeza qual tracker é qual? Balance o tracker e ele destacará o item correspondente.
tips-do_not_move_heels = Tenha certeza de não mexer seus calcanhares durante a gravação!
## Body parts
body_part-NONE = Não atribuído
body_part-HEAD = Cabeça
body_part-NECK = Pescoço
body_part-RIGHT_SHOULDER = Ombro direito
body_part-RIGHT_UPPER_ARM = Braço superior direito
body_part-RIGHT_LOWER_ARM = Antebraço direito
body_part-RIGHT_HAND = Mão Direita
body_part-RIGHT_UPPER_LEG = Coxa direita
body_part-RIGHT_LOWER_LEG = Canela direita
body_part-RIGHT_FOOT = Pé direito
body_part-RIGHT_CONTROLLER = Controle direito
body_part-CHEST = Peito
body_part-WAIST = Cintura
body_part-HIP = Quadril
body_part-LEFT_SHOULDER = Ombro esquerdo
body_part-LEFT_UPPER_ARM = Braço superior esquerdo
body_part-LEFT_LOWER_ARM = Antebraço esquerdo
body_part-LEFT_HAND = Mão esquerda
body_part-LEFT_UPPER_LEG = Coxa esquerda
body_part-LEFT_LOWER_LEG = Canela esquerda
body_part-LEFT_FOOT = Pé esquerdo
body_part-LEFT_CONTROLLER = Controle esquerdo
## Skeleton stuff
skeleton_bone-NONE = Nada
skeleton_bone-HEAD = Deslocamento da Cabeça
skeleton_bone-NECK = Tamanho do Pescoço
skeleton_bone-TORSO = Tamanho do Torso
skeleton_bone-CHEST = Distância do Peito
skeleton_bone-WAIST = Distância da Cintura
skeleton_bone-HIP_OFFSET = Compensação do Quadril
skeleton_bone-HIPS_WIDTH = Largura do Quadril
skeleton_bone-LEGS_LENGTH = Tamanho das Perna
skeleton_bone-KNEE_HEIGHT = Altura dos Joelhos
skeleton_bone-FOOT_LENGTH = Tamanho do Pé
skeleton_bone-FOOT_SHIFT = Compensação do Pé
skeleton_bone-SKELETON_OFFSET = Compensação do Esqueleto
skeleton_bone-CONTROLLER_DISTANCE_Z = Distância do Controle Z
skeleton_bone-CONTROLLER_DISTANCE_Y = Distância do Controle Y
skeleton_bone-FOREARM_LENGTH = Distância do Antebraço
skeleton_bone-SHOULDERS_DISTANCE = Distância dos Ombros
skeleton_bone-SHOULDERS_WIDTH = Largura dos Ombros
skeleton_bone-UPPER_ARM_LENGTH = Tamanho do Braço Superior
skeleton_bone-ELBOW_OFFSET = Compensação do Cotovelo
## Tracker reset buttons
reset-reset_all = Redefinir todas as proporções
reset-full = Reset
reset-mounting = Reset de Posição
reset-quick = Reset Rápido
## Serial detection stuff
serial_detection-new_device-p0 = Novo dispositivo de serial detectado!
serial_detection-new_device-p1 = Insira suas credenciais de wifi!
serial_detection-new_device-p2 = Selecione o que quer fazer com ele
serial_detection-open_wifi = Conectar ao WiFi
serial_detection-open_serial = Abrir o Console Serial
serial_detection-submit = Enviar!
serial_detection-close = Fechar
## Navigation bar
navbar-home = Início
navbar-body_proportions = Proporções do corpo
navbar-trackers_assign = Atribuição de Tracker
navbar-mounting = Calibragem de Posição
navbar-onboarding = Assistente de Configuração
navbar-settings = Opções
## Bounding volume hierarchy recording
bvh-start_recording = Gravar BVH
bvh-recording = Gravando...
## Overlay settings
overlay-is_visible_label = Mostrar Overlay na SteamVR
overlay-is_mirrored_label = Mostrar Overlay como espelho
## Tracker status
tracker-status-none = Sem Status
tracker-status-busy = Ocupado
tracker-status-error = Erro
tracker-status-disconnected = Desconectado
tracker-status-occluded = Ocluso
tracker-status-ok = Conectado
## Tracker status columns
tracker-table-column-name = Nome
tracker-table-column-type = Tipo
tracker-table-column-battery = Bateria
tracker-table-column-ping = Ping
tracker-table-column-rotation = Rotação X/Y/Z
tracker-table-column-position = Posição X/Y/Z
tracker-table-column-url = URL
## Tracker rotation
tracker-rotation-front = Frente
tracker-rotation-left = Esquerda
tracker-rotation-right = Direita
tracker-rotation-back = Atrás
## Tracker information
tracker-infos-manufacturer = Fabricante
tracker-infos-display_name = Nome de exibição
tracker-infos-custom_name = Nome personalizado
tracker-infos-url = URL do Tracker
## Tracker settings
tracker-settings-back = Voltar para lista de trackers
tracker-settings-title = Opções dos trackers
tracker-settings-assignment_section = Atribuição
tracker-settings-assignment_section-description = Qual parte do seu corpo o tracker está atribuído para.
tracker-settings-assignment_section-edit = Editar atribuição
tracker-settings-mounting_section = Posicionamento
tracker-settings-mounting_section-description = Aonde o tracker está posicionado?
tracker-settings-mounting_section-edit = Editar posição
tracker-settings-drift_compensation_section = Allow drift compensation
tracker-settings-drift_compensation_section-description = Should this tracker compensate for its drift when drift compensation is enabled?
tracker-settings-drift_compensation_section-edit = Allow drift compensation
# The .<name> means it's an attribute and it's related to the top key.
# In this case that is the settings for the assignment section.
tracker-settings-name_section = Nome do tracker
tracker-settings-name_section-description = Dê um apelido fofo :)
tracker-settings-name_section-placeholder = Coxa esquerda de NightyBeast
## Tracker part card info
tracker-part_card-no_name = Sem nome
tracker-part_card-unassigned = Não atribuído
## Body assignment menu
body_assignment_menu = Aonde você quer que esse tracker fique?
body_assignment_menu-description = Escolha um local onde você quer que esse tracker seja atribuído. Alternativamente você pode escolher arrumar todos os tracker de uma vez, ao invés de um por um.
body_assignment_menu-show_advanced_locations = Mostrar locais de atribuição avançados
body_assignment_menu-manage_trackers = Arrumar todos os trackers
body_assignment_menu-unassign_tracker = Desatribuir tracker
## Tracker assignment menu
# A -translation_key (with a dash in the front) means that it's a label.
# It can only be used in the translation file, it's nice for reusing names and that kind of stuff.
#
# We are using it here because english doesn't require changing the text in each case but
# maybe your language does.
-tracker_selection-part = Which tracker to assign to your
tracker_selection_menu-NONE = Which tracker do you want to be unassigned?
tracker_selection_menu-HEAD = { -tracker_selection-part } head?
tracker_selection_menu-NECK = { -tracker_selection-part } neck?
tracker_selection_menu-RIGHT_SHOULDER = { -tracker_selection-part } right shoulder?
tracker_selection_menu-RIGHT_UPPER_ARM = { -tracker_selection-part } right upper arm?
tracker_selection_menu-RIGHT_LOWER_ARM = { -tracker_selection-part } right lower arm?
tracker_selection_menu-RIGHT_HAND = { -tracker_selection-part } right hand?
tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } right thigh?
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } right ankle?
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } right foot?
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } right controller?
tracker_selection_menu-CHEST = { -tracker_selection-part } chest?
tracker_selection_menu-WAIST = { -tracker_selection-part } waist?
tracker_selection_menu-HIP = { -tracker_selection-part } hip?
tracker_selection_menu-LEFT_SHOULDER = { -tracker_selection-part } left shoulder?
tracker_selection_menu-LEFT_UPPER_ARM = { -tracker_selection-part } left upper arm?
tracker_selection_menu-LEFT_LOWER_ARM = { -tracker_selection-part } left lower arm?
tracker_selection_menu-LEFT_HAND = { -tracker_selection-part } left hand?
tracker_selection_menu-LEFT_UPPER_LEG = { -tracker_selection-part } left thigh?
tracker_selection_menu-LEFT_LOWER_LEG = { -tracker_selection-part } left ankle?
tracker_selection_menu-LEFT_FOOT = { -tracker_selection-part } left foot?
tracker_selection_menu-LEFT_CONTROLLER = { -tracker_selection-part } left controller?
tracker_selection_menu-unassigned = Trackers não atribuídos
tracker_selection_menu-assigned = Trackers atribuídos
tracker_selection_menu-dont_assign = Não atribuir
## Mounting menu
mounting_selection_menu = Aonde você quer que esse tracker fique?
mounting_selection_menu-close = Fechar
## Sidebar settings
settings-sidebar-title = Opções
settings-sidebar-general = Geral
settings-sidebar-tracker_mechanics = Mecânicas do Tracker
settings-sidebar-fk_settings = Opções de Tracker
settings-sidebar-gesture_control = Controle de Gestos
settings-sidebar-interface = Interface
settings-sidebar-osc_router = Roteador OSC
settings-sidebar-utils = Utilidades
settings-sidebar-serial = Console Serial
## SteamVR settings
settings-general-steamvr = SteamVR
settings-general-steamvr-subtitle = Trackers do SteamVR
# Not all translation keys support multiline, only the ones that specify it will actually
# split it in lines (that also means you can split in lines however you want in those).
# The first spaces (not tabs) for indentation will be ignored, just to make the file look nice when writing.
# This one is one of this cases that cares about multilines
settings-general-steamvr-description =
Ativar ou desativar partes específicas do tracking.
Útil se você quer mais controle do que o SlimeVR faz.
settings-general-steamvr-trackers-waist = Cintura
settings-general-steamvr-trackers-chest = Peito
settings-general-steamvr-trackers-feet = Pés
settings-general-steamvr-trackers-knees = Joelhos
settings-general-steamvr-trackers-elbows = Cotovelos
settings-general-steamvr-trackers-hands = Mãos
## Tracker mechanics
settings-general-tracker_mechanics = Mecânicas do Tracker
settings-general-tracker_mechanics-filtering = Filtros
# This also cares about multilines
settings-general-tracker_mechanics-filtering-description =
Escolha o tipo de filtro para seus trackers.
Predição prediz movimentação enquanto suavização suaviza o movimento.
settings-general-tracker_mechanics-filtering-type = Tipo de filtro
settings-general-tracker_mechanics-filtering-type-none = Sem filtro
settings-general-tracker_mechanics-filtering-type-none-description = Utiliza as rotações como registradas. Sem qualquer tipo de filtro.
settings-general-tracker_mechanics-filtering-type-smoothing = Suavização
settings-general-tracker_mechanics-filtering-type-smoothing-description = Suaviza o movimento porém introduz um pouco de latência.
settings-general-tracker_mechanics-filtering-type-prediction = Predição
settings-general-tracker_mechanics-filtering-type-prediction-description = Reduz latência e torna os movimentos mais responsivos, porém aumenta tremulação (Jitter).
settings-general-tracker_mechanics-filtering-amount = Quantidade
settings-general-tracker_mechanics-drift_compensation = Drift compensation
# This cares about multilines
settings-general-tracker_mechanics-drift_compensation-description =
Compensates IMU yaw drift by applying an inverse rotation.
Change amount of compensation and up to how many resets are taken into account.
settings-general-tracker_mechanics-drift_compensation-enabled-label = Drift compensation
settings-general-tracker_mechanics-drift_compensation-amount-label = Compensation amount
settings-general-tracker_mechanics-drift_compensation-max_resets-label = Use up to x last resets
## FK/Tracking settings
settings-general-fk_settings = Opções de Tracker
settings-general-fk_settings-leg_tweak = Ajustes de perna
settings-general-fk_settings-leg_tweak-description = Atravessar o chão pode reduzir ou até eliminar o clipping(atravessar) com o chão porém pode causar problemas quando ajoelhado. Correção de Deslize corrige o ice skating(deslize dos trackers no chão), porém pode diminuir a precisão de certos padrões de movimento.
# 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 = Atravessar o chão
# 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)
# definition - Guesses when each foot is in contact with the ground and uses that information to improve tracking
settings-general-fk_settings-leg_tweak-skating_correction = Correção de deslize
settings-general-fk_settings-leg_tweak-skating_correction-amount = Força da correção de deslize
settings-general-fk_settings-arm_fk = Opções do Braço
settings-general-fk_settings-arm_fk-description = Muda o jeito que os braços são rastreados.
settings-general-fk_settings-arm_fk-force_arms = Forçar braços do HMD
settings-general-fk_settings-skeleton_settings = Opções do esqueleto
settings-general-fk_settings-skeleton_settings-description = Ligar ou desligar opções do esqueleto. É recomendado deixar eles ligados.
settings-general-fk_settings-skeleton_settings-extended_spine = Estender coluna
settings-general-fk_settings-skeleton_settings-extended_pelvis = Estender pélvis
settings-general-fk_settings-skeleton_settings-extended_knees = Estender joelho
settings-general-fk_settings-vive_emulation-title = Emulação de Vive
settings-general-fk_settings-vive_emulation-description = Emule o problema de tracker da cintura que o Vive tracker tem. Isso é uma piada e faz o tracking ficar pior.
settings-general-fk_settings-vive_emulation-label = Ativar emulação de Vive
## Gesture control settings (tracker tapping)
settings-general-gesture_control = Controle de gestos
settings-general-gesture_control-subtitle = Resets baseados em toques
settings-general-gesture_control-description = Faz com oque os resets sejam ativados tocando um tracker. O Tracker mais alto no seu torso é usado para o Reset Rápido, o tracker mais alto na sua perna esquerda é usado para o Reset, e o tracker mais alto na sua perna direita é usado para o Reset de Posição. Os toques devem ocorrer dentro de 0.6 segundos para serem registrados.
# This is a unit: 3 taps, 2 taps, 1 tap
# $amount (Number) - Amount of taps (touches to the tracker's case)
settings-general-gesture_control-taps = { $amount ->
[one] 1 tap
*[other] { $amount } taps
}
settings-general-gesture_control-quickResetEnabled = Ativar toque para reset rápido
settings-general-gesture_control-quickResetDelay = Delay do reset rápido
settings-general-gesture_control-quickResetTaps = Toques para o reset rápido
settings-general-gesture_control-resetEnabled = Ativar toque para reset
settings-general-gesture_control-resetDelay = Delay do reset
settings-general-gesture_control-resetTaps = Toques para o reset
settings-general-gesture_control-mountingResetEnabled = Toques para o reset de posição
settings-general-gesture_control-mountingResetDelay = Delay do reset de posição
settings-general-gesture_control-mountingResetTaps = Toques para o reset de posição
## Interface settings
settings-general-interface = Interface
settings-general-interface-dev_mode = Modo de desenvolvedor
settings-general-interface-dev_mode-description = Este modo pode ser útil se precisar de dados específicos ou para interagir com trackers conectados a um nível mais avançado
settings-general-interface-dev_mode-label = Modo de desenvolvedor
settings-general-interface-serial_detection = Detecção de dispositivo serial
settings-general-interface-serial_detection-description = Esta opção mostrará um pop-up toda vez que você conectar um novo dispositivo serial que pode ser um tracker. Ajuda a melhorar o processo de configuração de um tracker
settings-general-interface-serial_detection-label = Detecção de dispositivo serial
settings-general-interface-lang = Selecione o idioma
settings-general-interface-lang-description = Alterar o idioma padrão que pretende utilizar
settings-general-interface-lang-placeholder = Selecione o idioma que vai usar
## Serial settings
settings-serial = Console Serial
# This cares about multilines
settings-serial-description =
Este é um feed de informações ao vivo para comunicação serial.
Pode ser útil se você precisar saber se o firmware está tendo problemas.
settings-serial-connection_lost = Conexão com o serial perdida, Reconectando...
settings-serial-reboot = Reiniciar
settings-serial-factory_reset = Restaurar para o padrão de fábrica
settings-serial-get_infos = Obter informações
settings-serial-serial_select = Selecione uma porta serial
settings-serial-auto_dropdown_item = Auto
## OSC router settings
settings-osc-router = Roteador OSC
# This cares about multilines
settings-osc-router-description =
Encaminhar mensagens OSC de outro programa.
Útil para usar outro programa OSC com VRChat, por exemplo.
settings-osc-router-enable = Ativar
settings-osc-router-enable-description = Ligar ou desligar o encaminhamento de mensagens
settings-osc-router-enable-label = Ativar
settings-osc-router-network = Portas de rede
# This cares about multilines
settings-osc-router-network-description =
Defina as portas para receber e enviar dados
Esses podem ser as mesmas portas usadas no servidor do SlimeVR
settings-osc-router-network-port_in =
.label = Porta de entrada
.placeholder = Porta de entrada (padrão: 9002)
settings-osc-router-network-port_out =
.label = Porta de saída
.placeholder = Porta de saída (padrão: 9000)
settings-osc-router-network-address = Endereço de rede
settings-osc-router-network-address-description = Defina o endereço para mandar dados
settings-osc-router-network-address-placeholder = Endereço IPV4
## OSC VRChat settings
settings-osc-vrchat = VRChat OSC Trackers
# This cares about multilines
settings-osc-vrchat-description =
Mudar opções específicas do VRChat para receber e mandar dados do HMD
dados de trackers para FBT (funciona no Quest standalone).
settings-osc-vrchat-enable = Ativar
settings-osc-vrchat-enable-description = Ligar ou desligar o envio e recebimento de dados
settings-osc-vrchat-enable-label = Ativar
settings-osc-vrchat-network = Portas de rede
settings-osc-vrchat-network-description = Defina as portas para receber e enviar dados para o VRChat
settings-osc-vrchat-network-port_in =
.label = Porta de entrada
.placeholder = Porta de entrada (padrão: 9001)
settings-osc-vrchat-network-port_out =
.label = Porta de saída
.placeholder = Porta de saída (padrão: 9000)
settings-osc-vrchat-network-address = Endereço de rede
settings-osc-vrchat-network-address-description = Escolha qual o endereço para enviar dados para o VRChat (verifique as suas opções de wifi no seu dispositivo)
settings-osc-vrchat-network-address-placeholder = Endereço de ip do VRChat
settings-osc-vrchat-network-trackers = Trackers
settings-osc-vrchat-network-trackers-description = Ligar ou desligar o envio e recepção de dados.
settings-osc-vrchat-network-trackers-chest = Peito
settings-osc-vrchat-network-trackers-waist = Cintura
settings-osc-vrchat-network-trackers-knees = Joelhos
settings-osc-vrchat-network-trackers-feet = Pés
settings-osc-vrchat-network-trackers-elbows = Cotovelos
## Setup/onboarding menu
onboarding-skip = Pular configurações
onboarding-continue = Continuar
onboarding-wip = Trabalho em progresso
## WiFi setup
onboarding-wifi_creds-back = Voltar para introdução
onboarding-wifi_creds = Insira as credenciais de WiFi
# This cares about multilines
onboarding-wifi_creds-description =
Os Trackers vão usar essas credenciais para conectar à rede sem fio
Use as credenciais da rede em que você está atualmente conectado
onboarding-wifi_creds-skip = Pular as configurações de WiFi
onboarding-wifi_creds-submit = Enviar!
onboarding-wifi_creds-ssid =
.label = SSID
.placeholder = Enter SSID
onboarding-wifi_creds-password =
.label = Password
.placeholder = Enter password
## Mounting setup
onboarding-reset_tutorial-back = Voltar para a Calibragem de Posição
onboarding-reset_tutorial = Resetar Tutorial
onboarding-reset_tutorial-description = Esse recurso não está concluído, apenas aperte continue
## Setup start
onboarding-home = Bem vindo ao SlimeVR
# This cares about multilines and it's centered!!
onboarding-home-description =
Trazendo full-body tracking
para todos
onboarding-home-start = Vamos configurar!
## Enter VR part of setup
onboarding-enter_vr-back = Voltar para atribuição de Trackers
onboarding-enter_vr-title = Hora de entrar no VR!
onboarding-enter_vr-description = Coloque todos os seus trackers e entre no VR!
onboarding-enter_vr-ready = Estou pronto
## Setup done
onboarding-done-title = Está tudo pronto!
onboarding-done-description = Aproveite sua experiência com full body
onboarding-done-close = Fechar o guia
## Tracker connection setup
onboarding-connect_tracker-back = Voltar para as credenciais de WiFi
onboarding-connect_tracker-title = Conectar os trackers
onboarding-connect_tracker-description-p0 = Agora para a parte divertida, conectando todos os seus trackers!
onboarding-connect_tracker-description-p1 = Simplesmente conecte todos que ainda não estão conectados, via porta USB.
onboarding-connect_tracker-issue-serial = Estou tendo problemas para conectar!
onboarding-connect_tracker-usb = Tracker USB
onboarding-connect_tracker-connection_status-connecting = Enviando credenciais de wifi
onboarding-connect_tracker-connection_status-connected = Conectado ao WiFi
onboarding-connect_tracker-connection_status-error = Não é possível conectar ao WiFi
onboarding-connect_tracker-connection_status-start_connecting = Procurando por trackers
onboarding-connect_tracker-connection_status-handshake = Conectado ao servidor
# $amount (Number) - Amount of trackers connected (this is a number, but you can use CLDR plural rules for your language)
# More info on https://www.unicode.org/cldr/cldr-aux/charts/22/supplemental/language_plural_rules.html
# English in this case only has 2 plural rules, which are "one" and "other",
# we use 0 in an explicit way because there is no plural rule in english for 0, so we directly say
# if $amount is 0 then we say "No trackers connected"
onboarding-connect_tracker-connected_trackers = { $amount ->
[0] No trackers
[one] 1 tracker
*[other] { $amount } trackers
} connected
onboarding-connect_tracker-next = Eu conectei todos os meus trackers
## Tracker assignment setup
onboarding-assign_trackers-back = Voltar para as credenciais de WiFi
onboarding-assign_trackers-title = Atribuir trackers
onboarding-assign_trackers-description = Vamos escolher onde cada tracker vai. Clique no local onde você quer colocar o 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
onboarding-assign_trackers-assigned = { $assigned } of { $trackers ->
[one] 1 tracker
*[other] { $trackers } trackers
} assigned
onboarding-assign_trackers-advanced = Mostrar locais de atribuição avançados
onboarding-assign_trackers-next = Atribui todos os trackers
## Tracker manual mounting setup
onboarding-manual_mounting-back = Voltar para entrar no VR
onboarding-manual_mounting = Posicionamento Manual
onboarding-manual_mounting-description = Clique em cada tracker e selecione de que maneira estão posicionados
onboarding-manual_mounting-auto_mounting = Posicionamento automática
onboarding-manual_mounting-next = Próximo passo
## Tracker automatic mounting setup
onboarding-automatic_mounting-back = Voltar para entrar no VR
onboarding-automatic_mounting-title = Calibragem de Posicionamento
onboarding-automatic_mounting-description = Para os trackers do SlimeVR funcionar, nós precisamos atribuir a rotação de posicionamento dos seus trackers para alinhar com a posição física de seus trackers.
onboarding-automatic_mounting-manual_mounting = Definir manualmente a posição
onboarding-automatic_mounting-next = Próximo passo
onboarding-automatic_mounting-prev_step = Passo anterior
onboarding-automatic_mounting-done-title = Rotações de posição calibradas.
onboarding-automatic_mounting-done-description = Sua calibragem de posicionamento está completa!
onboarding-automatic_mounting-done-restart = Voltar ao início
onboarding-automatic_mounting-mounting_reset-title = Reset de Posição
onboarding-automatic_mounting-mounting_reset-step-0 = 1. Agache-se em uma pose de "esqui" com as pernas dobradas, a parte superior do corpo inclinada para a frente e os braços dobrados.
onboarding-automatic_mounting-mounting_reset-step-1 = 2. Pressione o botão "Resetar Posição" e aguarde 3 segundos antes que as rotações de posição dos trackers sejam redefinidas.
onboarding-automatic_mounting-preparation-title = Preparação
onboarding-automatic_mounting-preparation-step-0 = 1. Fique de pé com os braços ao lado do corpo.
onboarding-automatic_mounting-preparation-step-1 = 2. Pressione o botão "Reset" e aguarde 3 segundos antes que os rastreadores sejam reiniciados.
onboarding-automatic_mounting-put_trackers_on-title = Coloque seus trackers
onboarding-automatic_mounting-put_trackers_on-description = Para calibrar as rotações de posicionamento, usaremos os trackers que você atribuiu. Coloque todos os seus trackers, você pode ver qual é qual na figura na direita.
onboarding-automatic_mounting-put_trackers_on-next = Coloquei todos os meus trackers
## Tracker manual proportions setup
onboarding-manual_proportions-back = Voltar para o tutorial de reset
onboarding-manual_proportions-title = Proporções de corpo manuais
onboarding-manual_proportions-precision = Ajuste de precisão
onboarding-manual_proportions-auto = Calibragem Automática
## Tracker automatic proportions setup
onboarding-automatic_proportions-back = Voltar para o tutorial de reset
onboarding-automatic_proportions-title = Meça seu corpo
onboarding-automatic_proportions-description = Para os trackers SlimeVR funcionarem, precisamos saber o tamanho dos seus ossos. Essa curta calibragem vai medir isso para você.
onboarding-automatic_proportions-manual = Calibragem manual
onboarding-automatic_proportions-prev_step = Passo anterior
onboarding-automatic_proportions-put_trackers_on-title = Coloque seus trackers
onboarding-automatic_proportions-put_trackers_on-description = Para calibrar suas proporções, usaremos os trackers que você atribuiu. Coloque todos os seus trackers, você pode ver quais são quais na figura à direita.
onboarding-automatic_proportions-put_trackers_on-next = Coloquei todos os meus trackers
onboarding-automatic_proportions-preparation-title = Preparação
onboarding-automatic_proportions-preparation-description = Coloque uma cadeira diretamente atrás de você dentro da sua área de jogo(Play space). Esteja preparado para sentar durante a configuração de autobone.
onboarding-automatic_proportions-preparation-next = Estou em frente a uma cadeira
onboarding-automatic_proportions-start_recording-title = Esteja preparado para se mexer
onboarding-automatic_proportions-start_recording-description = Começaremos a gravar algumas poses e movimentos específicos. Estes serão solicitados na próxima tela. Esteja preparado para começar quando o botão for pressionado!
onboarding-automatic_proportions-start_recording-next = Começar Gravação
onboarding-automatic_proportions-recording-title = GRAVAR
onboarding-automatic_proportions-recording-description-p0 = Gravação em progresso...
onboarding-automatic_proportions-recording-description-p1 = Faça os movimentos apresentados abaixo:
onboarding-automatic_proportions-recording-steps-0 = Dobre os joelhos algumas vezes.
onboarding-automatic_proportions-recording-steps-1 = Sente-se na cadeira e se levante.
onboarding-automatic_proportions-recording-steps-2 = Gire seu tronco para esquerda, e incline para direita.
onboarding-automatic_proportions-recording-steps-3 = Gire seu tronco para direita, e incline para esquerda.
onboarding-automatic_proportions-recording-steps-4 = Mexa-se até o tempo terminar.
onboarding-automatic_proportions-recording-processing = Processando o resultado
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 15)
onboarding-automatic_proportions-recording-timer = { $time ->
[one] 1 second left
*[other] { $time } seconds left
}
onboarding-automatic_proportions-verify_results-title = Verificar os resultados
onboarding-automatic_proportions-verify_results-description = Verifique os resultados abaixo, parecem corretos?
onboarding-automatic_proportions-verify_results-results = Gravando os resultados
onboarding-automatic_proportions-verify_results-processing = Processando o resultado
onboarding-automatic_proportions-verify_results-redo = Refazer a gravação
onboarding-automatic_proportions-verify_results-confirm = Eles estão corretos
onboarding-automatic_proportions-done-title = Corpo medido e salvo.
onboarding-automatic_proportions-done-description = Sua calibragem de proporção de corpo está completa!
## Home
home-no_trackers = Nenhum tracker detectado ou atribuído

View File

@@ -0,0 +1,519 @@
### SlimeVR complete GUI translations
# Please developers (not translators) don't reuse a key inside another key
# or concat text with a translation string in the code, use the appropriate
# features like variables and selectors in each appropriate case!
# And also comment the string if it's something not easy to translate, so you help
# translators on what it means
## Websocket (server) status
websocket-connecting = Đang kết nối với máy chủ
websocket-connection_lost = Kết nối với máy chủ đã mất. Đang kết nối lại...
## Tips
tips-find_tracker = Không rõ tracker nào? Lắc tracker và trong menu sẽ sáng lên.
tips-do_not_move_heels = Hãy đảm bảo gót chân không cử động trong khi đo ghi!
## Body parts
body_part-NONE = Chưa liên kết
body_part-HEAD = Đầu
body_part-NECK = Cổ
body_part-RIGHT_SHOULDER = Vai phải
body_part-RIGHT_UPPER_ARM = Tay phải trên
body_part-RIGHT_LOWER_ARM = Tay phải dưới
body_part-RIGHT_HAND = Tay phải
body_part-RIGHT_UPPER_LEG = Chân phải trên
body_part-RIGHT_LOWER_LEG = chân phải dưới
body_part-RIGHT_FOOT = Bàn chân phải
body_part-RIGHT_CONTROLLER = Tay cầm phải
body_part-CHEST = Ngực
body_part-WAIST = Eo
body_part-HIP = Hông
body_part-LEFT_SHOULDER = Vai trái
body_part-LEFT_UPPER_ARM = Tay trái trên
body_part-LEFT_LOWER_ARM = tay trái dưới
body_part-LEFT_HAND = Tay trái
body_part-LEFT_UPPER_LEG = Chân trái trên
body_part-LEFT_LOWER_LEG = Chân trái dưới
body_part-LEFT_FOOT = Bàn chân trái
body_part-LEFT_CONTROLLER = Tay cầm trái
## Skeleton stuff
skeleton_bone-NONE = Chưa liên kết
skeleton_bone-HEAD = Đầu ca
skeleton_bone-NECK = Cổ dài
skeleton_bone-TORSO = Chiều dài thân
skeleton_bone-CHEST = Khoảng cách ngực
skeleton_bone-WAIST = Khoảng cách eo
skeleton_bone-HIP_OFFSET = Lệc đo hông
skeleton_bone-HIPS_WIDTH = Chiều rộng hông
skeleton_bone-LEGS_LENGTH = Chiều dài chân
skeleton_bone-KNEE_HEIGHT = Chiều cao đầu gối
skeleton_bone-FOOT_LENGTH = CHiều dài bàn chân
skeleton_bone-FOOT_SHIFT = Lệch đo bàn chân
skeleton_bone-SKELETON_OFFSET = Lệch đo thân
skeleton_bone-CONTROLLER_DISTANCE_Z = Khoảng cách tay cầm Z
skeleton_bone-CONTROLLER_DISTANCE_Y = Khoảng cách tay cầm Y
skeleton_bone-FOREARM_LENGTH = khoảng cách cánh tay
skeleton_bone-SHOULDERS_DISTANCE = Khoảng cách vai
skeleton_bone-SHOULDERS_WIDTH = Chiều rộng vai
skeleton_bone-UPPER_ARM_LENGTH = Chiều dài tay trên
skeleton_bone-ELBOW_OFFSET = Lệch đo khuỷu tay
## Tracker reset buttons
reset-reset_all = Reset tất cả bộ phận
reset-full = Reset
reset-mounting = Reset vị trí cài
reset-quick = Reset nhanh
## Serial detection stuff
serial_detection-new_device-p0 = New serial device detected!
serial_detection-new_device-p1 = Vui lòng nhập thông tin Wi-Fi!
serial_detection-new_device-p2 = Vui lòng chọn những gì làm với nó
serial_detection-open_wifi = Kết nối Wi-Fi
serial_detection-open_serial = Mở Serial Console
serial_detection-submit = Đăng lên!
serial_detection-close = Đóng
## Navigation bar
navbar-home = Giao diện chính
navbar-body_proportions = Bộ phận cơ thể
navbar-trackers_assign = Giao bộ phận tracker
navbar-mounting = Đo vị trí đặt
navbar-onboarding = Trình hướng dẫn cài đặt
navbar-settings = Cài đặt
## Bounding volume hierarchy recording
bvh-start_recording = Ghi BVH
bvh-recording = Đang ghi...
## Overlay settings
overlay-is_visible_label = Xem overlay trên SteamVR
overlay-is_mirrored_label = Xem overlay trong gương
## Tracker status
tracker-status-none = Không có tình trạng
tracker-status-busy = Bận
tracker-status-error = Lỗi
tracker-status-disconnected = Đã ngắt kết nối
tracker-status-occluded = Bị tắc
tracker-status-ok = Đã kết nối
## Tracker status columns
tracker-table-column-name = Tên
tracker-table-column-type = Loại
tracker-table-column-battery = Pin
tracker-table-column-ping = Ping
tracker-table-column-rotation = Chiều chuyển X/Y/Z
tracker-table-column-position = Vị trí X/Y/Z
tracker-table-column-url = URL
## Tracker rotation
tracker-rotation-front = Đằng trước
tracker-rotation-left = Bên trái
tracker-rotation-right = Bên phải
tracker-rotation-back = Đằng sau
## Tracker information
tracker-infos-manufacturer = Nhà sản xuất
tracker-infos-display_name = Tên gọi
tracker-infos-custom_name = Tên tự chọn
tracker-infos-url = URL
## Tracker settings
tracker-settings-back = Quay lại danh sách tracker
tracker-settings-title = Cài đặt tracker
tracker-settings-assignment_section = Giao bộ phận
tracker-settings-assignment_section-description = Thiết bị này được giao cho bộ phận nào.
tracker-settings-assignment_section-edit = Chỉnh lại giao bộ phận
tracker-settings-mounting_section = Vị trí đặt bộ phận
tracker-settings-mounting_section-description = Tracker đặt ở đâu?
tracker-settings-mounting_section-edit = Chỉnh lại chỗ đặt
tracker-settings-drift_compensation_section = Allow drift compensation
tracker-settings-drift_compensation_section-description = Should this tracker compensate for its drift when drift compensation is enabled?
tracker-settings-drift_compensation_section-edit = Allow drift compensation
# The .<name> means it's an attribute and it's related to the top key.
# In this case that is the settings for the assignment section.
tracker-settings-name_section = Tên tracker
tracker-settings-name_section-description = Hãy cho một tên đẹp :)
tracker-settings-name_section-placeholder = Menaced's left leg
## Tracker part card info
tracker-part_card-no_name = Không tên
tracker-part_card-unassigned = Chưa giao vị trí
## Body assignment menu
body_assignment_menu = Bạn muốn giao tracker này cho bộ phận nào?
body_assignment_menu-description = Chọn vị trí bạn muốn giao tracker cho. Ngoài ra, bạn có thể quản lí tất cả tracker cùng một lúc thay vì từng cái một.
body_assignment_menu-show_advanced_locations = Xem thêm vị trí đặt
body_assignment_menu-manage_trackers = Quản lí tất cả tracker
body_assignment_menu-unassign_tracker = Tracker chưa giao vị trí
## Tracker assignment menu
# A -translation_key (with a dash in the front) means that it's a label.
# It can only be used in the translation file, it's nice for reusing names and that kind of stuff.
#
# We are using it here because english doesn't require changing the text in each case but
# maybe your language does.
-tracker_selection-part = Tracker nào để giao cho vị trí
tracker_selection_menu-NONE = Bạn muốn giao cho tracker nào mà chua giao?
tracker_selection_menu-HEAD = { -tracker_selection-part } đầu?
tracker_selection_menu-NECK = { -tracker_selection-part } cổ?
tracker_selection_menu-RIGHT_SHOULDER = { -tracker_selection-part } vai phải?
tracker_selection_menu-RIGHT_UPPER_ARM = { -tracker_selection-part } tay phải trên?
tracker_selection_menu-RIGHT_LOWER_ARM = { -tracker_selection-part } tay phải dưới?
tracker_selection_menu-RIGHT_HAND = { -tracker_selection-part } tay phải?
tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } chân phải trên?
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } chân phải dưới?
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } bàn chân phải?
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } tay cầm phải?
tracker_selection_menu-CHEST = { -tracker_selection-part } ngực?
tracker_selection_menu-WAIST = { -tracker_selection-part } eo?
tracker_selection_menu-HIP = { -tracker_selection-part } hông?
tracker_selection_menu-LEFT_SHOULDER = { -tracker_selection-part } vai trái?
tracker_selection_menu-LEFT_UPPER_ARM = { -tracker_selection-part } tay trái trên?
tracker_selection_menu-LEFT_LOWER_ARM = { -tracker_selection-part } tay trái dưới?
tracker_selection_menu-LEFT_HAND = { -tracker_selection-part } tay trái?
tracker_selection_menu-LEFT_UPPER_LEG = { -tracker_selection-part } chân trái trên?
tracker_selection_menu-LEFT_LOWER_LEG = { -tracker_selection-part } chân trái dưới?
tracker_selection_menu-LEFT_FOOT = { -tracker_selection-part } bàn chân trái?
tracker_selection_menu-LEFT_CONTROLLER = { -tracker_selection-part } tay tráitrái?
tracker_selection_menu-unassigned = Chưa giao vị trí
tracker_selection_menu-assigned = Đã giao vị trí
tracker_selection_menu-dont_assign = Thoát và không giao
## Mounting menu
mounting_selection_menu = Bạn muốn giao tracker này ở đâu?
mounting_selection_menu-close = Đóng
## Sidebar settings
settings-sidebar-title = Cài đặt
settings-sidebar-general = Cài đặt chung
settings-sidebar-tracker_mechanics = Cơ khí tracker
settings-sidebar-fk_settings = Cài đặt FK
settings-sidebar-gesture_control = Gesture control
settings-sidebar-interface = Giao diện
settings-sidebar-osc_router = OSC router
settings-sidebar-utils = Hữu dụng
settings-sidebar-serial = Bảng điều khiển Serial
## SteamVR settings
settings-general-steamvr = SteamVR
settings-general-steamvr-subtitle = SteamVR trackers
# Not all translation keys support multiline, only the ones that specify it will actually
# split it in lines (that also means you can split in lines however you want in those).
# The first spaces (not tabs) for indentation will be ignored, just to make the file look nice when writing.
# This one is one of this cases that cares about multilines
settings-general-steamvr-description =
Bặt hoặc tắt tracker SteamVR.
Hữu dụng nếu bạn muốn điều khiển cách SlimeVR hoạt động.
settings-general-steamvr-trackers-waist = Eo
settings-general-steamvr-trackers-chest = Ngực
settings-general-steamvr-trackers-feet = Bàn chân
settings-general-steamvr-trackers-knees = Đầu gối (Chân)
settings-general-steamvr-trackers-elbows = Khuỷu tay
settings-general-steamvr-trackers-hands = Hands
## Tracker mechanics
settings-general-tracker_mechanics = Cơ khí tracker
settings-general-tracker_mechanics-filtering = Lọc rung
# This also cares about multilines
settings-general-tracker_mechanics-filtering-description =
Chọn kiểu lọc rung cho tracker.
Dự đoán đoán cử động trong khi lọc rung cử động.
settings-general-tracker_mechanics-filtering-type = Kiểu lọc
settings-general-tracker_mechanics-filtering-type-none = Không lọc
settings-general-tracker_mechanics-filtering-type-none-description = Để đo chiều chuyển y nguyên. Không sử dụlọclọc.
settings-general-tracker_mechanics-filtering-type-smoothing = Làm mượt
settings-general-tracker_mechanics-filtering-type-smoothing-description = Lọc cử động mượt nhưng tạo ít chậm rễ.
settings-general-tracker_mechanics-filtering-type-prediction = Dự đoán
settings-general-tracker_mechanics-filtering-type-prediction-description = Giảm chậm trê và để cử động gọn hơn, nhưng có thể tăng độ rung.
settings-general-tracker_mechanics-filtering-amount = Số luọng
settings-general-tracker_mechanics-drift_compensation = Drift compensation
# This cares about multilines
settings-general-tracker_mechanics-drift_compensation-description =
Compensates IMU yaw drift by applying an inverse rotation.
Change amount of compensation and up to how many resets are taken into account.
settings-general-tracker_mechanics-drift_compensation-enabled-label = Drift compensation
settings-general-tracker_mechanics-drift_compensation-amount-label = Compensation amount
settings-general-tracker_mechanics-drift_compensation-max_resets-label = Use up to x last resets
## FK/Tracking settings
settings-general-fk_settings = Cài đặt FK
settings-general-fk_settings-leg_tweak = Chỉnh chân
settings-general-fk_settings-leg_tweak-description = Chỉnh chân có thể giảm hoặc loại bỏ chân đi xuyên sàn nhà nhưng có thể ảnh hưởng đầu gối. Sửa trượt sửa khi lướt, nhưng giảm độ chính xác ở một số cử động.
# 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 = Xuyên sàn
# 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)
# definition - Guesses when each foot is in contact with the ground and uses that information to improve tracking
settings-general-fk_settings-leg_tweak-skating_correction = Sửa trượt
settings-general-fk_settings-leg_tweak-skating_correction-amount = Skating correction strength
settings-general-fk_settings-arm_fk = Tay FK
settings-general-fk_settings-arm_fk-description = Chỉnh cách tay được đo.
settings-general-fk_settings-arm_fk-force_arms = Bắt tay từ kính thực tế ảo
settings-general-fk_settings-skeleton_settings = Cài đặt cơ thể
settings-general-fk_settings-skeleton_settings-description = Bật hoặc tắt hình cơ thể. Khuyên nên luôn để bật lựa chọn này.
settings-general-fk_settings-skeleton_settings-extended_spine = Xương sống mở rộng
settings-general-fk_settings-skeleton_settings-extended_pelvis = Xuong chậu mở rộng
settings-general-fk_settings-skeleton_settings-extended_knees = Đầu gối mở rộng
settings-general-fk_settings-vive_emulation-title = Vive emulation
settings-general-fk_settings-vive_emulation-description = Emulate the waist tracker problems that Vive trackers have. This is a joke and makes tracking worse.
settings-general-fk_settings-vive_emulation-label = Enable Vive emulation
## Gesture control settings (tracker tapping)
settings-general-gesture_control = Điều khiển cử chỉ
settings-general-gesture_control-subtitle = Bấm hai lần để reset nhanh
settings-general-gesture_control-description = Bật hoặc tắt reset nhanh. Khi bật bấm hai lần bất cứ đâu trên điểm cao nhất ở thân sẽ kích hoạt reset nhanh. Delay is the time between registering a tap and resetting.
# This is a unit: 3 taps, 2 taps, 1 tap
# $amount (Number) - Amount of taps (touches to the tracker's case)
settings-general-gesture_control-taps = { $amount ->
[one] 1 tap
*[other] { $amount } lần
}
settings-general-gesture_control-quickResetEnabled = Enable tap to quick reset
settings-general-gesture_control-quickResetDelay = Quick reset delay
settings-general-gesture_control-quickResetTaps = Taps for quick reset
settings-general-gesture_control-resetEnabled = Enable tap to reset
settings-general-gesture_control-resetDelay = Reset delay
settings-general-gesture_control-resetTaps = Taps for reset
settings-general-gesture_control-mountingResetEnabled = Enable tap to reset mounting
settings-general-gesture_control-mountingResetDelay = Mounting reset delay
settings-general-gesture_control-mountingResetTaps = Taps for mounting reset
## Interface settings
settings-general-interface = Giao diện
settings-general-interface-dev_mode = Chế độ nhà phát triển
settings-general-interface-dev_mode-description = Chế độ này có thể hữu dụng nếu như bạn cần thông tin sâu hơn hoặc giao tiếp với tracker nâng cao
settings-general-interface-dev_mode-label = Chế độ nhà phát triển
settings-general-interface-serial_detection = Phát hiện thiết bị Serial
settings-general-interface-serial_detection-description = Lựa chọn này sẽ hiển thị thông báo mỗi lần thiết bị Serial mà có thể là tracker.Lựa chọn này có thể giúp quá trình cài đạt tracker
settings-general-interface-serial_detection-label = Phát hiện thiết bị Serial
settings-general-interface-lang = Chọn ngôn ngữ (Change language)
settings-general-interface-lang-description = Đổi ngôn ngữ cố định (Change the default language you want to use)
settings-general-interface-lang-placeholder = Chọn ngôn ngữ để sử dụng (Select the language to use)
## Serial settings
settings-serial = Bảng điều khiển serial
# This cares about multilines
settings-serial-description =
Đâu là thông tin trực tiếp về giao tiếp với Serial.
Hữu dụng nếu muốn biết phần mềm firmware có vấn đề không.
settings-serial-connection_lost = Kết nối đến Serial đã mất, đang kết nối lại...
settings-serial-reboot = Khởi động lại
settings-serial-factory_reset = Khôi phục cài đặt gối
settings-serial-get_infos = Lấy thông tin
settings-serial-serial_select = Chọn cổng Serial
settings-serial-auto_dropdown_item = Tự động
## OSC router settings
settings-osc-router = OSC router
# This cares about multilines
settings-osc-router-description =
Forward OSC messages from another program.
Useful for using another OSC program with VRChat for example.
settings-osc-router-enable = Enable
settings-osc-router-enable-description = Toggle the forwarding of messages.
settings-osc-router-enable-label = Enable
settings-osc-router-network = Network ports
# This cares about multilines
settings-osc-router-network-description =
Set the ports for listening and sending data.
These can be the same as other ports used in the SlimeVR server.
settings-osc-router-network-port_in =
.label = Port In
.placeholder = Port in (default: 9002)
settings-osc-router-network-port_out =
.label = Port Out
.placeholder = Port out (default: 9000)
settings-osc-router-network-address = Network address
settings-osc-router-network-address-description = Set the address to send out data at.
settings-osc-router-network-address-placeholder = IPV4 address
## OSC VRChat settings
settings-osc-vrchat = VRChat OSC Trackers
# This cares about multilines
settings-osc-vrchat-description =
Đổi cài đặt dành riêng cho VRChat để nhận thông tin từ kính thực tế ảo và gửi
thông tin tracker để track toàn thân (Hoạt động trên Quest một mình standalone).
settings-osc-vrchat-enable = Bật
settings-osc-vrchat-enable-description = Chình gửi và nhận thông tin
settings-osc-vrchat-enable-label = Bật
settings-osc-vrchat-network = Cổng mạng
settings-osc-vrchat-network-description = Chọn cổng mạng để nghe và gửi thông tin lên VRChat
settings-osc-vrchat-network-port_in =
.label = Cổng vào
.placeholder = Cổng vào (Cố định: 9001)
settings-osc-vrchat-network-port_out =
.label = Cổng ra
.placeholder = Cổng ra (Cố định: 9000)
settings-osc-vrchat-network-address = Địa chỉ mạng
settings-osc-vrchat-network-address-description = Chọn địa chỉ mạng nào để gứi lên VRChat (Hãy kiểm tra cài đặt Wi-Fi trên thiết bị để tìm cái này)
settings-osc-vrchat-network-address-placeholder = Địa chỉ IP cho VRChat
settings-osc-vrchat-network-trackers = Trackers
settings-osc-vrchat-network-trackers-description = Chỉnh gửi và nhận thông tin
settings-osc-vrchat-network-trackers-chest = Ngực
settings-osc-vrchat-network-trackers-waist = Eo
settings-osc-vrchat-network-trackers-knees = Đầu gối
settings-osc-vrchat-network-trackers-feet = Bàn chân
settings-osc-vrchat-network-trackers-elbows = Khuỷu tay
## Setup/onboarding menu
onboarding-skip = Bỏ qua cài đặt
onboarding-continue = Tiếp tục
onboarding-wip = Đang làm dở (vui lòng quay lại sau update)
## WiFi setup
onboarding-wifi_creds-back = Quay lại đoạn giới thiệuthiệu
onboarding-wifi_creds = Bỏ thông tin Wi-Fi ở đây
# This cares about multilines
onboarding-wifi_creds-description =
Tracker sẽ sử dụng thông tin sau để kết nối không dây
vui lòng bỏ thông tin bạn muốn kết nối
onboarding-wifi_creds-skip = Bỏ qua cài đặt Wi-Fi
onboarding-wifi_creds-submit = Thiết lập!
onboarding-wifi_creds-ssid =
.label = SSID
.placeholder = Enter SSID
onboarding-wifi_creds-password =
.label = Password
.placeholder = Enter password
## Mounting setup
onboarding-reset_tutorial-back = Quay lại đo đạt vị trí
onboarding-reset_tutorial = Làm lại hướng dẫn
onboarding-reset_tutorial-description = Tính năng này chưa hoàn thiện, vui lòng bấm tiếp tục và quay lại sau update
## Setup start
onboarding-home = Chào mừng đến với SlimeVR!
# This cares about multilines and it's centered!!
onboarding-home-description =
Đem đến đo toàn thân
tới tất cả
onboarding-home-start = Hãy bắt đầu cài đặt!
## Enter VR part of setup
onboarding-enter_vr-back = Quay lại giao bộ phận tracker
onboarding-enter_vr-title = Đến giờ lên VR!
onboarding-enter_vr-description = Đeo tất cả tracker và lên VR!
onboarding-enter_vr-ready = Sẵn sàng!
## Setup done
onboarding-done-title = Bạn đã hoàn thành cài đặt!
onboarding-done-description = Hãy tận hưởng đo toàn thân
onboarding-done-close = Đóng hướng dẫn
## Tracker connection setup
onboarding-connect_tracker-back = Quay lại tra thông tin Wi-Fi
onboarding-connect_tracker-title = Kết nối tracker
onboarding-connect_tracker-description-p0 = Đến giờ đoạn hay nhất, kết nối tất cả tracker!
onboarding-connect_tracker-description-p1 = Đơn thuần kết nối tất cả tracker chưa kết nối, qua cổng USB
onboarding-connect_tracker-issue-serial = Mình có vấn đề kết nối!
onboarding-connect_tracker-usb = USB Tracker
onboarding-connect_tracker-connection_status-connecting = Đang gửi thông tin Wi-Fi
onboarding-connect_tracker-connection_status-connected = Đã kết nối Wi-Fi
onboarding-connect_tracker-connection_status-error = Không thể kết nối Wi-Fi
onboarding-connect_tracker-connection_status-start_connecting = Đang tìm tracker
onboarding-connect_tracker-connection_status-handshake = Đã kết nối với máy chủ
# $amount (Number) - Amount of trackers connected (this is a number, but you can use CLDR plural rules for your language)
# More info on https://www.unicode.org/cldr/cldr-aux/charts/22/supplemental/language_plural_rules.html
# English in this case only has 2 plural rules, which are "one" and "other",
# we use 0 in an explicit way because there is no plural rule in english for 0, so we directly say
# if $amount is 0 then we say "No trackers connected"
onboarding-connect_tracker-connected_trackers = { $amount ->
[0] Không trackers
[one] 1 tracker
*[other] { $amount } trackers
} đã giao
onboarding-connect_tracker-next = Tôi đã kết nối tất cả tracker
## Tracker assignment setup
onboarding-assign_trackers-back = Quay lại tra thông tin Wi-Fi
onboarding-assign_trackers-title = Giao tracker
onboarding-assign_trackers-description = Hãy chọn tracker nào nằm ở đâu. Chọn vị trí bạn muốn giao tracker cho
# 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
onboarding-assign_trackers-assigned = { $assigned } of { $trackers ->
[one] 1 tracker
*[other] { $trackers } trackers
} đã giao
onboarding-assign_trackers-advanced = Xem vị trí mở rộng
onboarding-assign_trackers-next = Hoàn thành
## Tracker manual mounting setup
onboarding-manual_mounting-back = Quay lại đến vào VR
onboarding-manual_mounting = Đặt thủ công
onboarding-manual_mounting-description = Bấm từng tracker một và chọn xem nó được gắn theo chiều nào
onboarding-manual_mounting-auto_mounting = Gắn tự động
onboarding-manual_mounting-next = Bước tiếp theo
## Tracker automatic mounting setup
onboarding-automatic_mounting-back = Quay lại đến vào VR
onboarding-automatic_mounting-title = Đo vị trí đặt
onboarding-automatic_mounting-description = Để SlimeVR hoạt động, bạn cần đạt chiều hướng quay của tracker để khớp với điểm đặt tracker trên cơ thể
onboarding-automatic_mounting-manual_mounting = Đặt vị trí thủ công
onboarding-automatic_mounting-next = Bước tiếp theo
onboarding-automatic_mounting-prev_step = Bước trước
onboarding-automatic_mounting-done-title = Hướng quay đã được đo.
onboarding-automatic_mounting-done-description = Cài đặt vị trí đã hoàn thành!
onboarding-automatic_mounting-done-restart = Quay lại bắt đầu
onboarding-automatic_mounting-mounting_reset-title = Reset vị trí
onboarding-automatic_mounting-mounting_reset-step-0 = 1. Ngồi xổm trong tư thế "skiing" với hai chân cong, thân trên nghiêng về phía trước và hai cánh tay cong.
onboarding-automatic_mounting-mounting_reset-step-1 = 2. Nhấn nút "Reset Mounting" và đợi trong 3 giây trước khi các vòng quay giá đỡ của thiết bị theo dõi sẽ được đặt lại.
onboarding-automatic_mounting-preparation-title = Chuẩn bị
onboarding-automatic_mounting-preparation-step-0 = 1. Đứng thẳng với hai cánh tay sang hai bên.
onboarding-automatic_mounting-preparation-step-1 = 2. Nhấn nút "Reset" và đợi trong 3 giây trước khi trình theo dõi sẽ đặt lại.
onboarding-automatic_mounting-put_trackers_on-title = Hãy đeo tracker lên người
onboarding-automatic_mounting-put_trackers_on-description = Để đo chiều quay của tracker, phần mềm sẽ sử dụng tracker mà bạn đã giao cho. Hãy đeo lên tất cả tracker, và xem cái nào là cái nào trên hình bên phải
onboarding-automatic_mounting-put_trackers_on-next = Hoàn thành (Gắn xong)
## Tracker manual proportions setup
onboarding-manual_proportions-back = Quay lại hướng dẫn reset
onboarding-manual_proportions-title = Cài bộ phận cơ thể thủ công
onboarding-manual_proportions-precision = Chỉnh độ chính xác
onboarding-manual_proportions-auto = Đo cơ thể tự động
## Tracker automatic proportions setup
onboarding-automatic_proportions-back = Quay lại hướng dẫn reset
onboarding-automatic_proportions-title = Đo cơ thể
onboarding-automatic_proportions-description = Để SlimeVR hoạt động, phần mềm cần biết chiều dài của thân. Bước đo tự động này sẽ giúp bạn.
onboarding-automatic_proportions-manual = Đo thủ công
onboarding-automatic_proportions-prev_step = Bước trước
onboarding-automatic_proportions-put_trackers_on-title = Đeo tất cả
onboarding-automatic_proportions-put_trackers_on-description = Để đo bộ phận, phần mềm sẽ sử dụng tracker mà bạn đã giao cho. Hãy đeo lên tất cả tracker, và xem cái nào là cái nào trên hình bên phải.
onboarding-automatic_proportions-put_trackers_on-next = Hoàn thành (Gắn xong)
onboarding-automatic_proportions-preparation-title = Chuẩn bị
onboarding-automatic_proportions-preparation-description = Đặt ghế đằng sau bạn thẳng trong khu vực chơi VR. Hãy chuẩn bị ngồi trong khi cài đặt đo thân tự động.
onboarding-automatic_proportions-preparation-next = Tôi đang đứng trước ghế ngồi
onboarding-automatic_proportions-start_recording-title = Chuẩn bị cử động
onboarding-automatic_proportions-start_recording-description = Phần mềm sẽ ghi một số củ động cử chỉ. Bước này sẽ bắt đầu ở màn hình tiếp theo. Hãy chuẩn bị khi bấm bắt đầu
onboarding-automatic_proportions-start_recording-next = Bắt đầu quay
onboarding-automatic_proportions-recording-title = Quay
onboarding-automatic_proportions-recording-description-p0 = Đang quay...
onboarding-automatic_proportions-recording-description-p1 = Hãy cử động theo hướng dẫn sau:
onboarding-automatic_proportions-recording-steps-0 = Cong đầu gối vài lần.
onboarding-automatic_proportions-recording-steps-1 = Ngồi lên ghế rồi đứng lên.
onboarding-automatic_proportions-recording-steps-2 = Vặn thân trên sang trái, sau đó uốn cong sang phải.
onboarding-automatic_proportions-recording-steps-3 = Vặn thân trên sang phải, sau đó uốn cong sang trái.
onboarding-automatic_proportions-recording-steps-4 = Đảo xung quanh cho đến khi bộ đếm thời gian kết thúc.
onboarding-automatic_proportions-recording-processing = Đang xử lí kết quả
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 15)
onboarding-automatic_proportions-recording-timer = { $time ->
[one] 1 giây còn lại
*[other] { $time } giây còn
}
onboarding-automatic_proportions-verify_results-title = Xác nhận kết quả
onboarding-automatic_proportions-verify_results-description = Kiểm tra kết quả dưới đây, nó có chính xác không?
onboarding-automatic_proportions-verify_results-results = Đang ghi kết quả
onboarding-automatic_proportions-verify_results-processing = Đang xử lí kết quả
onboarding-automatic_proportions-verify_results-redo = Ghi lại
onboarding-automatic_proportions-verify_results-confirm = Kết quả này chính xác!
onboarding-automatic_proportions-done-title = Thân đã được đo và lưu.
onboarding-automatic_proportions-done-description = Quá trình đo thân đã hoàn thành!
## Home
home-no_trackers = Không tracker nào được phát hiện hoặc giao vị trí

View File

@@ -0,0 +1,519 @@
### SlimeVR complete GUI translations
# Please developers (not translators) don't reuse a key inside another key
# or concat text with a translation string in the code, use the appropriate
# features like variables and selectors in each appropriate case!
# And also comment the string if it's something not easy to translate, so you help
# translators on what it means
## Websocket (server) status
websocket-connecting = 正在连接到服务器
websocket-connection_lost = 与服务器的连接丢失,正在尝试重新连接...
## Tips
tips-find_tracker = 不确定哪个追踪器是哪个?在现实中摇动一个追踪器,对应的那个将在屏幕上高亮显示。
tips-do_not_move_heels = 确保你的脚跟在录制的时候不会发生移动!
## Body parts
body_part-NONE = 未分配
body_part-HEAD = 头部
body_part-NECK = 颈部
body_part-RIGHT_SHOULDER = 右肩
body_part-RIGHT_UPPER_ARM = 右大臂
body_part-RIGHT_LOWER_ARM = 右小臂
body_part-RIGHT_HAND = 右手
body_part-RIGHT_UPPER_LEG = 右大腿
body_part-RIGHT_LOWER_LEG = 右小腿
body_part-RIGHT_FOOT = 右脚
body_part-RIGHT_CONTROLLER = Right controller
body_part-CHEST = 胸部
body_part-WAIST = 腰部
body_part-HIP = 髋部
body_part-LEFT_SHOULDER = 左肩
body_part-LEFT_UPPER_ARM = 左大臂
body_part-LEFT_LOWER_ARM = 左小臂
body_part-LEFT_HAND = 左手
body_part-LEFT_UPPER_LEG = 左大腿
body_part-LEFT_LOWER_LEG = 左小腿
body_part-LEFT_FOOT = 左脚
body_part-LEFT_CONTROLLER = Left controller
## Skeleton stuff
skeleton_bone-NONE = 无
skeleton_bone-HEAD = 头部偏移
skeleton_bone-NECK = 颈部长度
skeleton_bone-TORSO = 躯干长度
skeleton_bone-CHEST = 胸部距离
skeleton_bone-WAIST = 腰部距离
skeleton_bone-HIP_OFFSET = 髋部偏移
skeleton_bone-HIPS_WIDTH = 髋部宽度
skeleton_bone-LEGS_LENGTH = 腿部长度
skeleton_bone-KNEE_HEIGHT = 膝盖高度
skeleton_bone-FOOT_LENGTH = 脚部长度
skeleton_bone-FOOT_SHIFT = 脚部偏移
skeleton_bone-SKELETON_OFFSET = 骨骼偏移
skeleton_bone-CONTROLLER_DISTANCE_Z = 控制器距离 Z
skeleton_bone-CONTROLLER_DISTANCE_Y = 控制器距离 Y
skeleton_bone-FOREARM_LENGTH = 前臂距离
skeleton_bone-SHOULDERS_DISTANCE = 肩膀距离
skeleton_bone-SHOULDERS_WIDTH = 肩膀宽度
skeleton_bone-UPPER_ARM_LENGTH = 上臂长度
skeleton_bone-ELBOW_OFFSET = 肘部偏移
## Tracker reset buttons
reset-reset_all = 重置所有比例
reset-full = 重置
reset-mounting = 重置佩戴
reset-quick = 快速重置
## Serial detection stuff
serial_detection-new_device-p0 = 检测到了新的串口设备!
serial_detection-new_device-p1 = 输入你的 WiFi 凭据!
serial_detection-new_device-p2 = 请选择你想对它做什么
serial_detection-open_wifi = 连接到 WiFi
serial_detection-open_serial = 打开串口控制器
serial_detection-submit = 提交!
serial_detection-close = 关闭
## Navigation bar
navbar-home = 主页
navbar-body_proportions = 身体比例
navbar-trackers_assign = 追踪器分配
navbar-mounting = 佩戴校准
navbar-onboarding = 向导
navbar-settings = 设置
## Bounding volume hierarchy recording
bvh-start_recording = 录制 BVH 文件
bvh-recording = 录制中...
## Overlay settings
overlay-is_visible_label = 在 SteamVR 中显示覆盖层
overlay-is_mirrored_label = 镜像显示覆盖层
## Tracker status
tracker-status-none = 无状态
tracker-status-busy = 繁忙
tracker-status-error = 错误
tracker-status-disconnected = 断开连接
tracker-status-occluded = 被遮挡
tracker-status-ok = 已连接
## Tracker status columns
tracker-table-column-name = 名字
tracker-table-column-type = 类型
tracker-table-column-battery = 电量
tracker-table-column-ping = 延迟
tracker-table-column-rotation = 旋转 X/Y/Z
tracker-table-column-position = 位置 X/Y/Z
tracker-table-column-url = 地址
## Tracker rotation
tracker-rotation-front = 前
tracker-rotation-left = 左
tracker-rotation-right = 右
tracker-rotation-back = 后
## Tracker information
tracker-infos-manufacturer = 制造商
tracker-infos-display_name = 显示名称
tracker-infos-custom_name = 自定义名称
tracker-infos-url = 追踪器地址
## Tracker settings
tracker-settings-back = 返回追踪器列表
tracker-settings-title = 追踪器设置
tracker-settings-assignment_section = 分配追踪器
tracker-settings-assignment_section-description = 该追踪器要被分配到身体的哪个部位?
tracker-settings-assignment_section-edit = 编辑分配
tracker-settings-mounting_section = 佩戴位置
tracker-settings-mounting_section-description = 该追踪器被佩戴在哪里?
tracker-settings-mounting_section-edit = 编辑佩戴
tracker-settings-drift_compensation_section = Allow drift compensation
tracker-settings-drift_compensation_section-description = Should this tracker compensate for its drift when drift compensation is enabled?
tracker-settings-drift_compensation_section-edit = Allow drift compensation
# The .<name> means it's an attribute and it's related to the top key.
# In this case that is the settings for the assignment section.
tracker-settings-name_section = 追踪器名称
tracker-settings-name_section-description = 给它起一个可爱的名字吧=w=~
tracker-settings-name_section-placeholder = CC 封印着漆黑之力的漆黑左臂
## Tracker part card info
tracker-part_card-no_name = 未命名
tracker-part_card-unassigned = 未分配
## Body assignment menu
body_assignment_menu = 你想把追踪器放在哪里?
body_assignment_menu-description = 选择要将此追踪器分配到的位置,或者你也可以选择一次管理所有追踪器,而不是逐个管理。
body_assignment_menu-show_advanced_locations = 显示高级分配位置
body_assignment_menu-manage_trackers = 管理所有追踪器
body_assignment_menu-unassign_tracker = 取消分配追踪器
## Tracker assignment menu
# A -translation_key (with a dash in the front) means that it's a label.
# It can only be used in the translation file, it's nice for reusing names and that kind of stuff.
#
# We are using it here because english doesn't require changing the text in each case but
# maybe your language does.
-tracker_selection-part = Which tracker to assign to your
tracker_selection_menu-NONE = Which tracker do you want to be unassigned?
tracker_selection_menu-HEAD = { -tracker_selection-part } head?
tracker_selection_menu-NECK = { -tracker_selection-part } neck?
tracker_selection_menu-RIGHT_SHOULDER = { -tracker_selection-part } right shoulder?
tracker_selection_menu-RIGHT_UPPER_ARM = { -tracker_selection-part } right upper arm?
tracker_selection_menu-RIGHT_LOWER_ARM = { -tracker_selection-part } right lower arm?
tracker_selection_menu-RIGHT_HAND = { -tracker_selection-part } right hand?
tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } right thigh?
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } right ankle?
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } right foot?
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } right controller?
tracker_selection_menu-CHEST = { -tracker_selection-part } chest?
tracker_selection_menu-WAIST = { -tracker_selection-part } waist?
tracker_selection_menu-HIP = { -tracker_selection-part } hip?
tracker_selection_menu-LEFT_SHOULDER = { -tracker_selection-part } left shoulder?
tracker_selection_menu-LEFT_UPPER_ARM = { -tracker_selection-part } left upper arm?
tracker_selection_menu-LEFT_LOWER_ARM = { -tracker_selection-part } left lower arm?
tracker_selection_menu-LEFT_HAND = { -tracker_selection-part } left hand?
tracker_selection_menu-LEFT_UPPER_LEG = { -tracker_selection-part } left thigh?
tracker_selection_menu-LEFT_LOWER_LEG = { -tracker_selection-part } left ankle?
tracker_selection_menu-LEFT_FOOT = { -tracker_selection-part } left foot?
tracker_selection_menu-LEFT_CONTROLLER = { -tracker_selection-part } left controller?
tracker_selection_menu-unassigned = 未分配的追踪器
tracker_selection_menu-assigned = 已分配的追踪器
tracker_selection_menu-dont_assign = 不分配
## Mounting menu
mounting_selection_menu = 你想把追踪器放在哪里?
mounting_selection_menu-close = 关闭
## Sidebar settings
settings-sidebar-title = 设置
settings-sidebar-general = 通用设置
settings-sidebar-tracker_mechanics = 追踪器设置
settings-sidebar-fk_settings = FK 设置
settings-sidebar-gesture_control = 手势控制
settings-sidebar-interface = 交互界面
settings-sidebar-osc_router = OSC 路由
settings-sidebar-utils = 工具
settings-sidebar-serial = 串行控制器
## SteamVR settings
settings-general-steamvr = SteamVR
settings-general-steamvr-subtitle = SteamVR 追踪器
# Not all translation keys support multiline, only the ones that specify it will actually
# split it in lines (that also means you can split in lines however you want in those).
# The first spaces (not tabs) for indentation will be ignored, just to make the file look nice when writing.
# This one is one of this cases that cares about multilines
settings-general-steamvr-description =
启用或禁用特定的追踪器
对于只支持特定追踪器的应用会很有用。
settings-general-steamvr-trackers-waist = 腰部
settings-general-steamvr-trackers-chest = 胸部
settings-general-steamvr-trackers-feet = 脚部
settings-general-steamvr-trackers-knees = 膝盖
settings-general-steamvr-trackers-elbows = 肘部
settings-general-steamvr-trackers-hands = 手部
## Tracker mechanics
settings-general-tracker_mechanics = 追踪器设置
settings-general-tracker_mechanics-filtering = 滤波
# This also cares about multilines
settings-general-tracker_mechanics-filtering-description =
选择追踪器的滤波类型。
预测型将会对你的运动加以预测,而平滑型将会让你的运动更加平滑。
settings-general-tracker_mechanics-filtering-type = 滤波类型
settings-general-tracker_mechanics-filtering-type-none = 无滤波
settings-general-tracker_mechanics-filtering-type-none-description = 使用原始数据,不会进行任何过滤。
settings-general-tracker_mechanics-filtering-type-smoothing = 平滑型
settings-general-tracker_mechanics-filtering-type-smoothing-description = 让运动更加平滑,但会增加一些延迟。
settings-general-tracker_mechanics-filtering-type-prediction = 预测型
settings-general-tracker_mechanics-filtering-type-prediction-description = 减少延迟并使移动更敏捷,但可能会增加一些抖动。
settings-general-tracker_mechanics-filtering-amount = 滤波强度
settings-general-tracker_mechanics-drift_compensation = Drift compensation
# This cares about multilines
settings-general-tracker_mechanics-drift_compensation-description =
Compensates IMU yaw drift by applying an inverse rotation.
Change amount of compensation and up to how many resets are taken into account.
settings-general-tracker_mechanics-drift_compensation-enabled-label = Drift compensation
settings-general-tracker_mechanics-drift_compensation-amount-label = Compensation amount
settings-general-tracker_mechanics-drift_compensation-max_resets-label = Use up to x last resets
## FK/Tracking settings
settings-general-fk_settings = FK 设置
settings-general-fk_settings-leg_tweak = 腿部调整
settings-general-fk_settings-leg_tweak-description = 本设置可以减少甚至消除脚部穿入地板的情况,但是当你跪在地上的时候可能产生一些问题. 脚滑矫正可以矫正一些脚滑溜冰的问题, 但是可能会降低某些动作的准确性。
# 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 = 地板限制
# 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)
# definition - Guesses when each foot is in contact with the ground and uses that information to improve tracking
settings-general-fk_settings-leg_tweak-skating_correction = 脚滑矫正
settings-general-fk_settings-leg_tweak-skating_correction-amount = 脚滑矫正数值
settings-general-fk_settings-arm_fk = 手臂 FK
settings-general-fk_settings-arm_fk-description = 更改手臂的追踪方式。
settings-general-fk_settings-arm_fk-force_arms = 强制从头显获得数据
settings-general-fk_settings-skeleton_settings = 骨架设置
settings-general-fk_settings-skeleton_settings-description = 打开或关闭骨架设置。建议保持这些设置不变。
settings-general-fk_settings-skeleton_settings-extended_spine = 脊柱延伸
settings-general-fk_settings-skeleton_settings-extended_pelvis = 骨盆延伸
settings-general-fk_settings-skeleton_settings-extended_knees = 膝盖延伸
settings-general-fk_settings-vive_emulation-title = Vive emulation
settings-general-fk_settings-vive_emulation-description = Emulate the waist tracker problems that Vive trackers have. This is a joke and makes tracking worse.
settings-general-fk_settings-vive_emulation-label = Enable Vive emulation
## Gesture control settings (tracker tapping)
settings-general-gesture_control = 手势控制
settings-general-gesture_control-subtitle = 双击快速重置
settings-general-gesture_control-description = 启用或禁用双击快速重置。启用时,双击身上佩戴的最高的追踪器上的任何位置将激活快速重置。延迟是指记录到敲击和重置之间的时间。
# This is a unit: 3 taps, 2 taps, 1 tap
# $amount (Number) - Amount of taps (touches to the tracker's case)
settings-general-gesture_control-taps = { $amount ->
[one] 1 tap
*[other] { $amount } taps
}
settings-general-gesture_control-quickResetEnabled = Enable tap to quick reset
settings-general-gesture_control-quickResetDelay = Quick reset delay
settings-general-gesture_control-quickResetTaps = Taps for quick reset
settings-general-gesture_control-resetEnabled = Enable tap to reset
settings-general-gesture_control-resetDelay = Reset delay
settings-general-gesture_control-resetTaps = Taps for reset
settings-general-gesture_control-mountingResetEnabled = Enable tap to reset mounting
settings-general-gesture_control-mountingResetDelay = Mounting reset delay
settings-general-gesture_control-mountingResetTaps = Taps for mounting reset
## Interface settings
settings-general-interface = 交互界面
settings-general-interface-dev_mode = 开发者模式
settings-general-interface-dev_mode-description = 如果你需要深入的数据或更深入地与连接的追踪器进行交互,打开此模式将会非常有用。
settings-general-interface-dev_mode-label = 开发者模式
settings-general-interface-serial_detection = 串口设备检测
settings-general-interface-serial_detection-description = 每次插入可能是追踪器的新串口设备时,此选项都会显示一个弹出窗口。这有助于改进追踪器的设置过程。
settings-general-interface-serial_detection-label = 串口设备检测
settings-general-interface-lang = 选择语言
settings-general-interface-lang-description = 更改要使用的默认语言
settings-general-interface-lang-placeholder = 选择要使用的语言
## Serial settings
settings-serial = 串口控制台
# This cares about multilines
settings-serial-description =
这是用于串口通信的实时信息馈送。
如果你需要了解固件是否出现问题,这将会很有用。
settings-serial-connection_lost = 串口连接丢失,正在重新连接..
settings-serial-reboot = 重新启动
settings-serial-factory_reset = 恢复出厂设置
settings-serial-get_infos = 获取信息
settings-serial-serial_select = 选择串行端口
settings-serial-auto_dropdown_item = 自动
## OSC router settings
settings-osc-router = OSC 路由
# This cares about multilines
settings-osc-router-description =
从另一个程序转发 OSC 信息。
在使用另一个 VRChat 的 OSC 程序时会很有用。
settings-osc-router-enable = 启用
settings-osc-router-enable-description = 控制信息转发功能的开关。
settings-osc-router-enable-label = 启用
settings-osc-router-network = 网络端口
# This cares about multilines
settings-osc-router-network-description =
设置用于监听和向 VRChat 发送数据的端口
这些端口可以与 SlimeVR 服务器中使用的其他端口相同。
settings-osc-router-network-port_in =
.label = 输入端口
.placeholder = 输入端口(默认 9002
settings-osc-router-network-port_out =
.label = 输出端口
.placeholder = 输出端口(默认 9000
settings-osc-router-network-address = 网络地址
settings-osc-router-network-address-description = 设置用来发送数据的地址。
settings-osc-router-network-address-placeholder = IPV4 地址
## OSC VRChat settings
settings-osc-vrchat = VRChat OSC Trackers
# This cares about multilines
settings-osc-vrchat-description =
改变 VRChat 的特定设置以接收和发送头显数据。
用于全身追踪的追踪器数据(在 Quest 端生效)。
settings-osc-vrchat-enable = 启用
settings-osc-vrchat-enable-description = 切换数据的发送和接收
settings-osc-vrchat-enable-label = 启用
settings-osc-vrchat-network = 网络端口
settings-osc-vrchat-network-description = 设置用于监听和向 VRChat 发送数据的端口
settings-osc-vrchat-network-port_in =
.label = 输入端口
.placeholder = 输入端口(默认 9001
settings-osc-vrchat-network-port_out =
.label = 输出端口
.placeholder = 输出端口(默认 9000
settings-osc-vrchat-network-address = 网络地址
settings-osc-vrchat-network-address-description = 选择将数据发送到 VRChat 的地址(检查设备上的 WiFi 设置)
settings-osc-vrchat-network-address-placeholder = VRChat IP 地址
settings-osc-vrchat-network-trackers = 追踪器
settings-osc-vrchat-network-trackers-description = 切换数据的发送和接收
settings-osc-vrchat-network-trackers-chest = 胸部
settings-osc-vrchat-network-trackers-waist = 腰部
settings-osc-vrchat-network-trackers-knees = 膝盖
settings-osc-vrchat-network-trackers-feet = 脚部
settings-osc-vrchat-network-trackers-elbows = 肘部
## Setup/onboarding menu
onboarding-skip = 跳过设置
onboarding-continue = 继续
onboarding-wip = 仍在开发中
## WiFi setup
onboarding-wifi_creds-back = 返回简介
onboarding-wifi_creds = 输入 WiFi 凭据
# This cares about multilines
onboarding-wifi_creds-description =
追踪器将使用这些凭据连接到 WiFi
请使用当前连接到 WiFi 的凭据
onboarding-wifi_creds-skip = 跳过 WiFi 设置
onboarding-wifi_creds-submit = 提交!
onboarding-wifi_creds-ssid =
.label = SSID
.placeholder = Enter SSID
onboarding-wifi_creds-password =
.label = Password
.placeholder = Enter password
## Mounting setup
onboarding-reset_tutorial-back = 返回到佩戴校准
onboarding-reset_tutorial = 重置教程
onboarding-reset_tutorial-description = 此功能尚未开发完成,请继续就好
## Setup start
onboarding-home = 欢迎来到 SlimeVR
# This cares about multilines and it's centered!!
onboarding-home-description =
将全身追踪
带给每一个人
onboarding-home-start = 我准备好了!
## Enter VR part of setup
onboarding-enter_vr-back = 返回到追踪器分配
onboarding-enter_vr-title = VR 时间到!
onboarding-enter_vr-description = 穿戴好所有的追踪器,开始快乐 VR 吧!
onboarding-enter_vr-ready = 我准备好了
## Setup done
onboarding-done-title = 都搞定啦!
onboarding-done-description = 享受你的全身追踪体验吧
onboarding-done-close = 关闭向导
## Tracker connection setup
onboarding-connect_tracker-back = 返回到 WiFi 凭据设置
onboarding-connect_tracker-title = 连接追踪器
onboarding-connect_tracker-description-p0 = 来到了我第二喜欢的环节,连接所有的追踪器!
onboarding-connect_tracker-description-p1 = 只需通过 USB 连接所有尚未连接的设备即可。
onboarding-connect_tracker-issue-serial = QAQ 我在连接时遇到问题!
onboarding-connect_tracker-usb = USB 追踪器
onboarding-connect_tracker-connection_status-connecting = 正在发送 WiFi 凭据
onboarding-connect_tracker-connection_status-connected = WiFi 已连接
onboarding-connect_tracker-connection_status-error = 无法连接到 WiFi
onboarding-connect_tracker-connection_status-start_connecting = 寻找追踪器
onboarding-connect_tracker-connection_status-handshake = 已连接到服务器
# $amount (Number) - Amount of trackers connected (this is a number, but you can use CLDR plural rules for your language)
# More info on https://www.unicode.org/cldr/cldr-aux/charts/22/supplemental/language_plural_rules.html
# English in this case only has 2 plural rules, which are "one" and "other",
# we use 0 in an explicit way because there is no plural rule in english for 0, so we directly say
# if $amount is 0 then we say "No trackers connected"
onboarding-connect_tracker-connected_trackers = { $amount ->
[0] No trackers
[one] 1 tracker
*[other] { $amount } trackers
} connected
onboarding-connect_tracker-next = 所有的追踪器都连接好了
## Tracker assignment setup
onboarding-assign_trackers-back = 返回 WiFi 凭据设置
onboarding-assign_trackers-title = 分配追踪器
onboarding-assign_trackers-description = 让我们选择哪个追踪器在哪里。单击要放置追踪器的部位
# 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
onboarding-assign_trackers-assigned = { $assigned } of { $trackers ->
[one] 1 tracker
*[other] { $trackers } trackers
} assigned
onboarding-assign_trackers-advanced = 显示高级分配部位
onboarding-assign_trackers-next = 所有的追踪器都分配好了
## Tracker manual mounting setup
onboarding-manual_mounting-back = 返回到进入 VR
onboarding-manual_mounting = 手动佩戴
onboarding-manual_mounting-description = 单击每个追踪器并选择它们的配电方式
onboarding-manual_mounting-auto_mounting = 自动佩戴
onboarding-manual_mounting-next = 下一步
## Tracker automatic mounting setup
onboarding-automatic_mounting-back = 返回到进入 VR
onboarding-automatic_mounting-title = 佩戴校准
onboarding-automatic_mounting-description = 为了让 SlimeVR 追踪器正常工作,我们需要为你的追踪器分配一个佩戴方向,以使其与你的物理追踪器佩戴方式对齐。
onboarding-automatic_mounting-manual_mounting = 手动设置佩戴方向
onboarding-automatic_mounting-next = 下一步
onboarding-automatic_mounting-prev_step = 上一步
onboarding-automatic_mounting-done-title = 佩戴方向已校准。
onboarding-automatic_mounting-done-description = 你的佩戴方向校准完成!
onboarding-automatic_mounting-done-restart = 返回以开始
onboarding-automatic_mounting-mounting_reset-title = 佩戴重置
onboarding-automatic_mounting-mounting_reset-step-0 = 1. 双腿弯曲以滑雪的姿势蹲下,上身向前倾斜,手臂弯曲。
onboarding-automatic_mounting-mounting_reset-step-1 = 按下佩戴重置按钮并等待 3 秒钟,然后追踪器的佩戴方向将被重置。
onboarding-automatic_mounting-preparation-title = 准备
onboarding-automatic_mounting-preparation-step-0 = 1. 身体直立,双臂放在身体两侧。
onboarding-automatic_mounting-preparation-step-1 = 按下“复位”按钮,等待 3 秒钟,追踪器将复位。
onboarding-automatic_mounting-put_trackers_on-title = 穿戴好追踪器
onboarding-automatic_mounting-put_trackers_on-description = 为了校准佩戴方向,我们将使用你刚才分配的追踪器。戴上你所有的追踪器,你可以在右边的图中看到哪个追踪器对应哪个。
onboarding-automatic_mounting-put_trackers_on-next = 所有的追踪器都已开启!
## Tracker manual proportions setup
onboarding-manual_proportions-back = 返回重置教程
onboarding-manual_proportions-title = 手动调整身体比例
onboarding-manual_proportions-precision = 精确调整
onboarding-manual_proportions-auto = 自动校准
## Tracker automatic proportions setup
onboarding-automatic_proportions-back = 返回重置教程
onboarding-automatic_proportions-title = 测量你的身体比例
onboarding-automatic_proportions-description = 为了让 SlimeVR 追踪器正常使用,我们需要知道你的骨头的长度。这个简短的校准将为你测量它们。
onboarding-automatic_proportions-manual = 手动校准
onboarding-automatic_proportions-prev_step = 上一步
onboarding-automatic_proportions-put_trackers_on-title = 穿戴好追踪器
onboarding-automatic_proportions-put_trackers_on-description = 为了校准你的身体比例,我们将使用你刚才分配的追踪器。戴上你所有的追踪器,你可以在右边的图中看到哪个追踪器对应哪个。
onboarding-automatic_proportions-put_trackers_on-next = 所有的追踪器都已开启!
onboarding-automatic_proportions-preparation-title = 准备
onboarding-automatic_proportions-preparation-description = 在你的正后方放一把椅子,并准备好在接下来的设置过程中坐下。
onboarding-automatic_proportions-preparation-next = 我在椅子前面啦
onboarding-automatic_proportions-start_recording-title = 准备录制运动
onboarding-automatic_proportions-start_recording-description = 我们现在要记录一些特定的姿势和动作。这些将在下一个屏幕中提示。当按钮被按下时,准备好开始!
onboarding-automatic_proportions-start_recording-next = 开始录制
onboarding-automatic_proportions-recording-title = REC
onboarding-automatic_proportions-recording-description-p0 = 录制中...
onboarding-automatic_proportions-recording-description-p1 = 依次做出以下动作:
onboarding-automatic_proportions-recording-steps-0 = 弯曲几次膝盖。
onboarding-automatic_proportions-recording-steps-1 = 坐在椅子上,然后站起来。
onboarding-automatic_proportions-recording-steps-2 = 向左扭转上身,然后向右弯。
onboarding-automatic_proportions-recording-steps-3 = 向右扭转上身,然后向左弯。
onboarding-automatic_proportions-recording-steps-4 = 持续摆动身体,直到计时器结束。
onboarding-automatic_proportions-recording-processing = 正在处理结果
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 15)
onboarding-automatic_proportions-recording-timer = { $time ->
[one] 1 second left
*[other] { $time } seconds left
}
onboarding-automatic_proportions-verify_results-title = 校验结果
onboarding-automatic_proportions-verify_results-description = 检查下面的结果,它们看起来是正确的吗?
onboarding-automatic_proportions-verify_results-results = 录制结果
onboarding-automatic_proportions-verify_results-processing = 正在处理结果
onboarding-automatic_proportions-verify_results-redo = 重新录制
onboarding-automatic_proportions-verify_results-confirm = 他们是正确的!
onboarding-automatic_proportions-done-title = 身体数据已测量并保存。
onboarding-automatic_proportions-done-description = 你的身体比例校准已完成!
## Home
home-no_trackers = 未检测到或未分配追踪器

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 948 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 570 KiB

BIN
gui/public/logo192.png Normal file

Binary file not shown.

BIN
gui/public/logo512.png Normal file

Binary file not shown.

25
gui/public/manifest.json Normal file
View File

@@ -0,0 +1,25 @@
{
"short_name": "React App",
"name": "Create React App Sample",
"icons": [
{
"src": "favicon.ico",
"sizes": "64x64 32x32 24x24 16x16",
"type": "image/x-icon"
},
{
"src": "logo192.png",
"type": "image/png",
"sizes": "192x192"
},
{
"src": "logo512.png",
"type": "image/png",
"sizes": "512x512"
}
],
"start_url": ".",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
}

3
gui/public/robots.txt Normal file
View File

@@ -0,0 +1,3 @@
# https://www.robotstxt.org/robotstxt.html
User-agent: *
Disallow:

97
gui/scripts/check-missing.js Executable file
View File

@@ -0,0 +1,97 @@
#!/bin/node
/*
Process exit codes:
First bit: Fluent syntax error in english file
Second bit: Fluent syntax error in translation file
Third bit: Missing key
Fourth bit: Missing attribute
Fifth bit: Extra key
Sixth bit: Extra attribute
*/
// eslint-disable-next-line @typescript-eslint/no-var-requires
const fs = require('fs');
// eslint-disable-next-line @typescript-eslint/no-var-requires
const path = require('path');
// eslint-disable-next-line @typescript-eslint/no-var-requires
const process = require('process');
// eslint-disable-next-line @typescript-eslint/no-var-requires
const { execSync } = require('child_process');
// eslint-disable-next-line @typescript-eslint/no-var-requires
const { FluentBundle, FluentResource } = require('@fluent/bundle');
const PATH = path.join(
execSync('git rev-parse --show-toplevel', { encoding: 'utf-8' }).trim(),
'gui/public/i18n'
);
const langs = fs.readdirSync(PATH).filter((x) => x !== 'en');
const en = new FluentBundle('en');
const enErrors = en.addResource(
new FluentResource(
fs.readFileSync(path.join(PATH, 'en/translation.ftl'), 'utf-8')
)
);
if (enErrors.length) {
for (const error of enErrors) {
console.error(error);
}
process.exit(1);
}
const requiredMessages = [...en._messages.keys()];
process.exitCode = 0;
for (const lang of langs) {
const resource = new FluentResource(
fs.readFileSync(path.join(PATH, lang, 'translation.ftl'), 'utf-8')
);
const bundle = new FluentBundle(lang);
const errors = bundle.addResource(resource);
// Check for syntax errors
for (const error of errors) {
console.error(error);
process.exitCode &= 0b10;
}
if (errors.length) process.exit();
// Check for missing
for (const msg of requiredMessages) {
if (!bundle._messages.has(msg)) {
console.log(`missing key in ${lang}: ${msg}`);
process.exitCode &= 0b100;
continue;
}
const data = en._messages.get(msg);
const localAttributes = Object.keys(bundle._messages.get(msg).attributes);
const missing = Object.keys(data.attributes).filter(
(x) => !localAttributes.some((y) => x === y)
);
if (missing.length) {
console.log(`missing attributes in ${lang} of ${msg}: [${missing}]`);
process.exitCode &= 0b1000;
}
}
// Check for extra
for (const msg of bundle._messages.keys()) {
if (!en._messages.has(msg)) {
console.log(`extra key in ${lang}: ${msg}`);
process.exitCode &= 0b10000;
continue;
}
const data = bundle._messages.get(msg);
const localAttributes = Object.keys(en._messages.get(msg).attributes);
const missing = Object.keys(data.attributes).filter(
(x) => !localAttributes.some((y) => x === y)
);
if (missing.length) {
console.log(`extra attributes in ${lang} of ${msg}: [${missing}]`);
process.exitCode &= 0b100000;
}
}
}

108
gui/scripts/convert-fluent.js Executable file
View File

@@ -0,0 +1,108 @@
#!/bin/node
// eslint-disable-next-line @typescript-eslint/no-var-requires
const fs = require('fs');
// eslint-disable-next-line @typescript-eslint/no-var-requires
const translation = require('./translation.json');
const sections = {
websocket: 'Websocket status',
tips: 'Tips',
'body-part': 'Body parts',
'skeleton-bone': 'Skeleton stuff',
reset: 'Tracker reset buttons',
'serial-detection': 'Serial detection stuff',
navbar: 'Navigation bar',
bvh: 'Bounding volume hierarchy recording',
overlay: 'Overlay settings',
tracker: {
status: 'Tracker status',
table: {
column: 'Tracker status columns',
},
rotation: 'Tracker rotation',
infos: 'Tracker information',
settings: 'Tracker settings',
'part-card': 'Tracker part card info',
},
'body-assignment-menu': 'Body assignment menu',
'tracker-selection-menu': 'Tracker assignment menu',
'mounting-selection-menu': 'Mounting menu',
settings: {
sidebar: 'Sidebar settings',
general: {
steamvr: 'SteamVR settings',
'tracker-mechanics': 'Tracker mechanics',
'fk-settings': 'FK settings',
'gesture-control': 'Gesture control settings (tracker tapping)',
interface: 'Interface settings',
},
serial: 'Serial settings',
osc: {
router: 'OSC router settings',
vrchat: 'OSC VRChat settings',
},
},
onboarding: {
default: 'Setup/onboarding menu',
'wifi-creds': 'WiFi setup',
'reset-tutorial': 'Mounting setup',
home: 'Setup start',
'enter-vr': 'Enter VR part of setup',
done: 'Setup done',
'connect-tracker': 'Tracker connection setup',
'assign-trackers': 'Tracker assignment setup',
'manual-mounting': 'Tracker manual mounting setup',
'automatic-mounting': 'Tracker automatic mounting setup',
'manual-proportions': 'Tracker manual proportions setup',
'automatic-proportions': 'Tracker automatic proportions setup',
},
home: 'Home',
};
function goTo(obj, property) {
const props = property.split('.');
if (props.length === 1) {
const prop = props.shift();
if (typeof obj[prop] === 'string') {
return obj[prop];
} else if (obj[prop] && obj[prop].default) {
return obj[prop].default;
}
} else {
const prop = props.shift();
if (obj[prop]) return goTo(obj[prop], props.join('.'));
}
return null;
}
function recurseObject(obj, prefix = '') {
const array = [];
let first = false;
for (const prop in obj) {
if (typeof obj[prop] === 'string') {
if (!first) {
first = true;
const section = goTo(sections, prefix.slice(0, -1).replace(/\0/g, '.'));
if (section) {
array.push(`\n## ${section}`);
}
}
array.push(
`${prefix.replace(/-/g, '_').replace(/\0/g, '-')}${prop
.replace(/-/g, '_')
.replace(/\./g, '-')} = ${obj[prop]
.replace(/{{/g, '{ $')
.replace(/}}/g, ' }')}`
);
} else {
array.push(...recurseObject(obj[prop], `${prefix}${prop}\0`));
}
}
return array;
}
fs.writeFileSync(
'./translation.ftl',
recurseObject(translation).join('\n').trim() + '\n'
);

5
gui/src-tauri/.gitignore vendored Normal file
View File

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

46
gui/src-tauri/Cargo.toml Normal file
View File

@@ -0,0 +1,46 @@
[package]
name = "slimevr"
version = "0.0.0"
description = "SlimeVR GUI Application"
license = "MIT OR Apache-2.0"
repository = "https://github.com/SlimeVR/SlimeVR-Server"
edition = "2021"
rust-version = "1.65"
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 = "1.2", features = [] }
cfg_aliases = "0.1"
shadow-rs = "0.19"
[dependencies]
serde_json = "1"
serde = { version = "1", features = ["derive"] }
tauri = { version = "1.2", features = ["devtools", "dialog", "fs-all", "path-all", "shell-execute", "window-close", "window-maximize", "window-minimize", "window-set-resizable", "window-set-title", "window-start-dragging", "window-unmaximize", "window-unminimize"] }
pretty_env_logger = "0.4"
log = "0.4"
clap = { version = "4.0.29", features = ["derive"] }
clap-verbosity-flag = "2"
tauri-plugin-window-state = { git = "https://github.com/tauri-apps/tauri-plugin-window-state", rev = "refs/pull/52/head" }
rand = "0.8.5"
tempfile = "3"
which = "4.3.0"
open = "3"
shadow-rs = { version = "0.19", default-features = false }
const_format = "0.2.30"
[target.'cfg(windows)'.dependencies]
win32job = "1"
winreg = "0.10.1"

10
gui/src-tauri/build.rs Normal file
View File

@@ -0,0 +1,10 @@
use cfg_aliases::cfg_aliases;
fn main() -> shadow_rs::SdResult<()> {
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()
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

11
gui/src-tauri/run.bat.old Normal file
View File

@@ -0,0 +1,11 @@
@echo off
setlocal enableextensions
echo "TEST"
cd /d "C:\Program Files (x86)\SlimeVR Server"
jre\bin\java.exe -Xmx512M -jar slimevr.jar --no-gui
if %errorlevel% NEQ 0 (
pause
)

Binary file not shown.

View File

@@ -0,0 +1,8 @@
public class JavaVersion {
public static void main(String[] args)
{
var version = Runtime.version().version().get(0);
System.exit(version);
}
}

328
gui/src-tauri/src/main.rs Normal file
View File

@@ -0,0 +1,328 @@
#![cfg_attr(all(not(debug_assertions), windows), windows_subsystem = "windows")]
use std::env;
use std::ffi::{OsStr, OsString};
use std::io::Write;
#[cfg(windows)]
use std::os::windows::process::CommandExt;
use std::panic;
use std::path::PathBuf;
use std::process::{Child, Stdio};
use clap::Parser;
use const_format::concatcp;
use rand::{seq::SliceRandom, thread_rng};
use shadow_rs::shadow;
use tauri::api::process::Command;
use tauri::Manager;
use tempfile::Builder;
use which::which_all;
#[cfg(windows)]
/// For Commands on Windows so they dont create terminals
const CREATE_NO_WINDOW: u32 = 0x0800_0000;
/// It's an i32 because we check it through exit codes of the process
const MINIMUM_JAVA_VERSION: i32 = 17;
const JAVA_BIN: &str = if cfg!(windows) { "java.exe" } else { "java" };
static POSSIBLE_TITLES: &[&str] = &[
"Panicking situation",
"looking for spatula",
"never gonna give you up",
"never gonna let you down",
"uwu sowwy",
];
shadow!(build);
// Tauri has a way to return the package.json version, but it's not a constant...
const VERSION: &str = if build::TAG.is_empty() {
build::SHORT_COMMIT
} else {
build::TAG
};
const MODIFIED: &str = if build::GIT_CLEAN { "" } else { "-dirty" };
#[derive(Debug, Parser)]
#[clap(
version = concatcp!(VERSION, MODIFIED),
about
)]
struct Cli {
#[clap(short, long)]
display_console: bool,
#[clap(long)]
launch_from_path: Option<PathBuf>,
#[clap(flatten)]
verbose: clap_verbosity_flag::Verbosity,
}
fn is_valid_path(path: &PathBuf) -> bool {
path.join("slimevr.jar").exists()
}
fn get_launch_path(cli: Cli) -> Option<PathBuf> {
if let Some(path) = cli.launch_from_path {
if path.exists() && is_valid_path(&path) {
return Some(path);
}
}
let path = env::current_dir().unwrap();
if is_valid_path(&path) {
return Some(path);
}
let path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
if is_valid_path(&path) {
return Some(path);
}
let path = PathBuf::from("/usr/share/slimevr/");
if is_valid_path(&path) {
return Some(path);
}
// This is only for AppImage
if let Some(appimage) = env::var_os("APPDIR") {
let path = PathBuf::from(appimage);
if is_valid_path(&path) {
return Some(path);
}
}
None
}
fn spawn_java(java: &OsStr, java_version: &OsStr) -> std::io::Result<Child> {
let mut cmd = std::process::Command::new(java);
#[cfg(windows)]
cmd.creation_flags(CREATE_NO_WINDOW);
cmd.arg("-jar")
.arg(java_version)
.stdin(Stdio::null())
.stderr(Stdio::null())
.stdout(Stdio::null())
.spawn()
}
#[cfg(desktop)]
fn show_error(text: &str) -> bool {
use tauri::api::dialog::{
blocking::MessageDialogBuilder, MessageDialogButtons, MessageDialogKind,
};
MessageDialogBuilder::new(
format!(
"SlimeVR GUI crashed - {}",
POSSIBLE_TITLES.choose(&mut thread_rng()).unwrap()
),
text,
)
.buttons(MessageDialogButtons::Ok)
.kind(MessageDialogKind::Error)
.show()
}
#[cfg(mobile)]
fn show_error(text: &str) -> bool {
// needs to do native stuff on mobile
false
}
fn main() {
// Make an error dialog box when panicking
panic::set_hook(Box::new(|panic_info| {
println!("{}", panic_info);
show_error(&panic_info.to_string());
}));
let cli = Cli::parse();
// Set up loggers and global handlers
{
if std::env::var_os("RUST_LOG").is_none() {
std::env::set_var("RUST_LOG", "info")
}
pretty_env_logger::init();
}
// Ensure child processes die when spawned on windows
// and then check for WebView2's existence
#[cfg(windows)]
{
use win32job::{ExtendedLimitInfo, Job};
let mut info = ExtendedLimitInfo::new();
info.limit_kill_on_job_close();
let job = Job::create_with_limit_info(&mut info).expect("Failed to create Job");
job.assign_current_process()
.expect("Failed to assign current process to Job");
// We don't do anything with the job anymore, but we shouldn't drop it because that would
// terminate our process tree. So we intentionally leak it instead.
std::mem::forget(job);
if !webview2_exists() {
// This makes a dialog appear which let's you press Ok or Cancel
// If you press Ok it will open the SlimeVR installer documentation
use tauri::api::dialog::{
blocking::MessageDialogBuilder, MessageDialogButtons, MessageDialogKind,
};
let confirm = MessageDialogBuilder::new("SlimeVR", "Couldn't find WebView2 installed. You can install it with the SlimeVR installer")
.buttons(MessageDialogButtons::OkCancel)
.kind(MessageDialogKind::Error)
.show();
if confirm {
open::that("https://docs.slimevr.dev/server-setup/installing-and-connecting.html#install-the-latest-slimevr-installer").unwrap();
}
return;
}
}
// Spawn server process
let run_path = get_launch_path(cli);
let stdout_recv = if let Some(p) = run_path {
log::info!("Server found on path: {}", p.to_str().unwrap());
// Check if any Java already installed is compatible
let jre = p.join("jre/bin").join(JAVA_BIN);
let java_bin = jre
.exists()
.then(|| jre.into_os_string())
.or_else(|| valid_java_paths().first().map(|x| x.0.to_owned()));
let Some(java_bin) = java_bin else {
show_error(&format!("Couldn't find a compatible Java version, please download Java {} or higher", MINIMUM_JAVA_VERSION));
return;
};
log::info!("Using Java binary: {:?}", java_bin);
let (recv, _child) = Command::new(java_bin.to_str().unwrap())
.current_dir(p)
.args(["-Xmx512M", "-jar", "slimevr.jar", "--no-gui"])
.spawn()
.expect("Unable to start the server jar");
Some(recv)
} else {
log::warn!("No server found. We will not start the server.");
None
};
let builder = tauri::Builder::default();
#[cfg(not(target_os = "macos"))]
let builder = builder.plugin(tauri_plugin_window_state::Builder::default().build());
builder
.setup(|app| {
if let Some(mut recv) = stdout_recv {
let app_handle = app.app_handle();
tauri::async_runtime::spawn(async move {
use tauri::api::process::CommandEvent;
while let Some(cmd_event) = recv.recv().await {
let emit_me = match cmd_event {
CommandEvent::Stderr(s) => ("stderr", s),
CommandEvent::Stdout(s) => ("stdout", s),
CommandEvent::Error(s) => ("error", s),
CommandEvent::Terminated(s) => {
("terminated", format!("{s:?}"))
}
_ => ("other", "".to_string()),
};
app_handle
.emit_all("server-status", emit_me)
.expect("Failed to emit");
}
log::error!("Java server receiver died");
app_handle
.emit_all("server-status", ("other", "receiver cancelled"))
.expect("Failed to emit");
});
}
Ok(())
})
//
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
#[cfg(windows)]
/// Check if WebView2 exists
fn webview2_exists() -> bool {
use winreg::enums::*;
use winreg::RegKey;
// First on the machine itself
let machine: Option<String> = RegKey::predef(HKEY_LOCAL_MACHINE)
.open_subkey(r"SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}")
.map(|r| r.get_value("pv").ok()).ok().flatten();
let mut exists = false;
if let Some(version) = machine {
exists = version.split('.').any(|x| x != "0");
}
// Then in the current user
if !exists {
let user: Option<String> = RegKey::predef(HKEY_CURRENT_USER)
.open_subkey(
r"Software\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}",
)
.map(|r| r.get_value("pv").ok())
.ok()
.flatten();
if let Some(version) = user {
exists = version.split('.').any(|x| x != "0");
}
}
exists
}
fn valid_java_paths() -> Vec<(OsString, i32)> {
let mut file = Builder::new()
.suffix(".jar")
.tempfile()
.expect("Couldn't generate .jar file");
file.write_all(include_bytes!("JavaVersion.jar"))
.expect("Couldn't write to .jar file");
let java_version = file.into_temp_path();
// Check if main Java is a supported version
let main_java = if let Ok(java_home) = std::env::var("JAVA_HOME") {
PathBuf::from(java_home)
.join("bin")
.join(JAVA_BIN)
.into_os_string()
} else {
JAVA_BIN.into()
};
if let Some(main_child) = spawn_java(&main_java, java_version.as_os_str())
.expect("Couldn't spawn the main Java binary")
.wait()
.expect("Couldn't execute the main Java binary")
.code()
{
if main_child >= MINIMUM_JAVA_VERSION {
return vec![(main_java, main_child)];
}
}
// Otherwise check if anything else is a supported version
let mut childs = vec![];
for java in which_all(JAVA_BIN).unwrap() {
let res = spawn_java(java.as_os_str(), java_version.as_os_str());
match res {
Ok(child) => childs.push((java.into_os_string(), child)),
Err(e) => println!("Error on trying to spawn a Java executable: {}", e),
}
}
childs
.into_iter()
.filter_map(|(p, mut c)| {
c.wait()
.expect("Failed on executing a Java executable")
.code()
.map(|code| (p, code))
.filter(|(_p, code)| *code >= MINIMUM_JAVA_VERSION)
})
.collect()
}

View File

@@ -0,0 +1,91 @@
{
"package": {
"productName": "slimevr",
"version": "../package.json"
},
"build": {
"distDir": "../dist",
"devPath": "http://localhost:5173",
"beforeDevCommand": "npm run start",
"beforeBuildCommand": "npm run build"
},
"tauri": {
"bundle": {
"active": true,
"targets": "all",
"identifier": "slimevr.dev",
"icon": ["icons/icon.ico", "icons/icon.png"],
"resources": [],
"externalBin": [],
"copyright": "",
"category": "DeveloperTool",
"shortDescription": "",
"longDescription": "",
"deb": {
"depends": ["openjdk-17-jre-headless"],
"files": {
"/usr/share/slimevr/slimevr.jar": "../../server/build/libs/slimevr.jar"
}
},
"macOS": {
"frameworks": [],
"exceptionDomain": "localhost",
"signingIdentity": null,
"providerShortName": null,
"entitlements": null,
"license": "../../LICENSE-MIT"
},
"windows": {
"certificateThumbprint": null,
"digestAlgorithm": "sha256",
"timestampUrl": ""
}
},
"updater": {
"active": false
},
"allowlist": {
"shell": {
"all": false,
"execute": true
},
"fs": {
"scope": ["$APP/*", "$APP"],
"all": true
},
"path": {
"all": true
},
"window": {
"setResizable": true,
"setTitle": true,
"maximize": true,
"unmaximize": true,
"minimize": true,
"unminimize": true,
"close": true,
"startDragging": true
}
},
"windows": [
{
"title": "SlimeVR",
"width": 1289,
"height": 709,
"minWidth": 880,
"minHeight": 740,
"resizable": true,
"fullscreen": false,
"decorations": false,
"transparent": false,
"fileDropEnabled": false,
"visible": true,
"hiddenTitle": true,
"tabbingIdentifier": "slimevr"
}
],
"security": {
"csp": null
}
}
}

9
gui/src/App.test.tsx Normal file
View File

@@ -0,0 +1,9 @@
import React from 'react';
import { render, screen } from '@testing-library/react';
import App from './App';
test('renders learn react link', () => {
render(<App />);
const linkElement = screen.getByText(/learn react/i);
expect(linkElement).toBeInTheDocument();
});

182
gui/src/App.tsx Normal file
View File

@@ -0,0 +1,182 @@
import { useEffect } from 'react';
import {
BrowserRouter as Router,
Outlet,
Route,
Routes,
} from 'react-router-dom';
import { Home } from './components/home/Home';
import { MainLayoutRoute } from './components/MainLayout';
import { AppContextProvider } from './components/providers/AppContext';
import { GeneralSettings } from './components/settings/pages/GeneralSettings';
import { Serial } from './components/settings/pages/Serial';
import { SettingsLayoutRoute } from './components/settings/SettingsLayout';
import {
useProvideWebsocketApi,
WebSocketApiContext,
} from './hooks/websocket-api';
import { Event, listen } from '@tauri-apps/api/event';
import { OnboardingContextProvider } from './components/onboarding/OnboardingContextProvicer';
import { OnboardingLayout } from './components/onboarding/OnboardingLayout';
import { AutomaticProportionsPage } from './components/onboarding/pages/body-proportions/AutomaticProportions';
import { ManualProportionsPage } from './components/onboarding/pages/body-proportions/ManualProportions';
import { ConnectTrackersPage } from './components/onboarding/pages/ConnectTracker';
import { DonePage } from './components/onboarding/pages/Done';
import { EnterVRPage } from './components/onboarding/pages/EnterVR';
import { HomePage } from './components/onboarding/pages/Home';
import { AutomaticMountingPage } from './components/onboarding/pages/mounting/AutomaticMounting';
import { ManualMountingPage } from './components/onboarding/pages/mounting/ManualMounting';
import { ResetTutorialPage } from './components/onboarding/pages/ResetTutorial';
import { TrackersAssignPage } from './components/onboarding/pages/trackers-assign/TrackerAssignment';
import { WifiCredsPage } from './components/onboarding/pages/WifiCreds';
import { ConfigContextProvider } from './components/providers/ConfigContext';
import { SerialDetectionModal } from './components/SerialDetectionModal';
import { VRCOSCSettings } from './components/settings/pages/VRCOSCSettings';
import { TopBar } from './components/TopBar';
import { TrackerSettingsPage } from './components/tracker/TrackerSettings';
import { useConfig } from './hooks/config';
import { OSCRouterSettings } from './components/settings/pages/OSCRouterSettings';
import { useLocalization } from '@fluent/react';
function Layout() {
const { loading } = useConfig();
if (loading) return <></>;
return (
<>
<SerialDetectionModal></SerialDetectionModal>
<Routes>
<Route
path="/"
element={
<MainLayoutRoute>
<Home />
</MainLayoutRoute>
}
/>
<Route
path="/tracker/:trackernum/:deviceid"
element={
<MainLayoutRoute background={false}>
<TrackerSettingsPage />
</MainLayoutRoute>
}
/>
<Route
path="/settings"
element={
<SettingsLayoutRoute>
<Outlet></Outlet>
</SettingsLayoutRoute>
}
>
<Route path="trackers" element={<GeneralSettings />} />
<Route path="serial" element={<Serial />} />
<Route path="osc/router" element={<OSCRouterSettings />} />
<Route path="osc/vrchat" element={<VRCOSCSettings />} />
</Route>
<Route
path="/onboarding"
element={
<OnboardingLayout>
<Outlet></Outlet>
</OnboardingLayout>
}
>
<Route path="home" element={<HomePage />} />
<Route path="wifi-creds" element={<WifiCredsPage />} />
<Route path="connect-trackers" element={<ConnectTrackersPage />} />
<Route path="trackers-assign" element={<TrackersAssignPage />} />
<Route path="enter-vr" element={<EnterVRPage />} />
<Route path="mounting/auto" element={<AutomaticMountingPage />} />
<Route path="mounting/manual" element={<ManualMountingPage />} />
<Route path="reset-tutorial" element={<ResetTutorialPage />} />
<Route
path="body-proportions/auto"
element={<AutomaticProportionsPage />}
/>
<Route
path="body-proportions/manual"
element={<ManualProportionsPage />}
/>
<Route path="done" element={<DonePage />} />
</Route>
<Route path="*" element={<TopBar></TopBar>}></Route>
</Routes>
</>
);
}
export default function App() {
const websocketAPI = useProvideWebsocketApi();
const { l10n } = useLocalization();
useEffect(() => {
const unlisten = listen(
'server-status',
(event: Event<[string, string]>) => {
const [event_type, s] = event.payload;
if ('stderr' === event_type) {
// This strange invocation is what lets us lose the line information in the console
// See more here: https://stackoverflow.com/a/48994308
setTimeout(
console.log.bind(
console,
`%c[SERVER] %c${s}`,
'color:cyan',
'color:red'
)
);
} else if (event_type === 'stdout') {
setTimeout(
console.log.bind(
console,
`%c[SERVER] %c${s}`,
'color:cyan',
'color:green'
)
);
} else if (event_type === 'error') {
console.error('Error: %s', s);
} else if (event_type === 'terminated') {
console.error('Server Process Terminated: %s', s);
} else if (event_type === 'other') {
console.log('Other process event: %s', s);
}
}
);
return () => {
// eslint-disable-next-line @typescript-eslint/no-empty-function
unlisten.then(() => {});
};
}, []);
return (
<Router>
<ConfigContextProvider>
<WebSocketApiContext.Provider value={websocketAPI}>
<AppContextProvider>
<OnboardingContextProvider>
<div className="h-full w-full text-standard bg-background-80 text-background-10">
<div className="flex-col h-full">
{!websocketAPI.isConnected && (
<>
<TopBar></TopBar>
<div className="flex w-full h-full justify-center items-center p-2">
{websocketAPI.isFirstConnection
? l10n.getString('websocket-connecting')
: l10n.getString('websocket-connection_lost')}
</div>
</>
)}
{websocketAPI.isConnected && <Layout></Layout>}
</div>
</div>
</OnboardingContextProvider>
</AppContextProvider>
</WebSocketApiContext.Provider>
</ConfigContextProvider>
</Router>
);
}

View File

@@ -0,0 +1,34 @@
import { useLocalization } from '@fluent/react';
import { useState } from 'react';
import {
RecordBVHRequestT,
RecordBVHStatusT,
RpcMessage,
} from 'solarxr-protocol';
import { useWebsocketAPI } from '../hooks/websocket-api';
import { BigButton } from './commons/BigButton';
import { RecordIcon } from './commons/icon/RecordIcon';
export function BVHButton() {
const { l10n } = useLocalization();
const { useRPCPacket, sendRPCPacket } = useWebsocketAPI();
const [recording, setRecording] = useState(false);
const toggleBVH = () => {
const record = new RecordBVHRequestT();
record.stop = recording;
sendRPCPacket(RpcMessage.RecordBVHRequest, record);
};
useRPCPacket(RpcMessage.RecordBVHStatus, (data: RecordBVHStatusT) => {
setRecording(data.recording);
});
return (
<BigButton
text={l10n.getString(recording ? 'bvh-recording' : 'bvh-start_recording')}
icon={<RecordIcon width={20} />}
onClick={toggleBVH}
></BigButton>
);
}

View File

@@ -0,0 +1,69 @@
import classNames from 'classnames';
import { ReactNode } from 'react';
import { ResetType } from 'solarxr-protocol';
import { useLayout } from '../hooks/layout';
import { BVHButton } from './BVHButton';
import { ResetButton } from './home/ResetButton';
import { Navbar } from './Navbar';
import { TopBar } from './TopBar';
import { OverlayWidget } from './widgets/OverlayWidget';
export function MainLayoutRoute({
children,
background = true,
widgets = true,
}: {
children: ReactNode;
background?: boolean;
widgets?: boolean;
}) {
const { layoutHeight, ref } = useLayout<HTMLDivElement>();
const { layoutWidth, ref: refw } = useLayout<HTMLDivElement>();
return (
<>
<TopBar></TopBar>
<div ref={ref} className="flex-grow" style={{ height: layoutHeight }}>
<div className="flex h-full pb-3">
<Navbar></Navbar>
<div
className="flex gap-2 pr-3 w-full"
ref={refw}
style={{ minWidth: layoutWidth }}
>
<div
className={classNames(
'flex flex-col rounded-xl w-full overflow-hidden',
background && 'bg-background-70'
)}
>
{children}
</div>
{widgets && (
<div className="flex flex-col px-2 min-w-[274px] w-[274px] gap-2 pt-2 rounded-xl overflow-y-auto bg-background-70">
<div className="grid grid-cols-2 gap-2 w-full">
<ResetButton
type={ResetType.Quick}
variant="big"
></ResetButton>
<ResetButton
type={ResetType.Full}
variant="big"
></ResetButton>
<ResetButton
type={ResetType.Mounting}
variant="big"
></ResetButton>
<BVHButton></BVHButton>
</div>
<div className="w-full">
<OverlayWidget></OverlayWidget>
</div>
</div>
)}
</div>
</div>
</div>
</>
);
}

View File

@@ -0,0 +1,105 @@
import { useLocalization } from '@fluent/react';
import classnames from 'classnames';
import { ReactNode } from 'react';
import { NavLink, useMatch } from 'react-router-dom';
import { CubeIcon } from './commons/icon/CubeIcon';
import { GearIcon } from './commons/icon/GearIcon';
export function NavButton({
to,
children,
match,
state = {},
icon,
}: {
to: string;
children: ReactNode;
match?: string;
state?: any;
icon: ReactNode;
}) {
const doesMatch = useMatch({
path: match || to,
});
return (
<NavLink
to={to}
state={state}
className={classnames(
'flex flex-col justify-center gap-4 w-[85px] h-[85px] rounded-md group select-text',
{
'bg-accent-background-50 fill-accent-background-20': doesMatch,
'hover:bg-background-70': !doesMatch,
}
)}
>
<div className="flex justify-around">
<div
className={classnames('scale-150', {
'fill-accent-lighter': doesMatch,
'fill-background-50': !doesMatch,
})}
>
{icon}
</div>
</div>
<div
className={classnames('text-center', {
'text-accent-background-10': doesMatch,
'text-background-10': !doesMatch,
})}
>
{children}
</div>
</NavLink>
);
}
export function Navbar() {
const { l10n } = useLocalization();
return (
<div className="flex flex-col px-2 pt-2">
<div className="flex flex-col flex-grow gap-2">
<NavButton to="/" icon={<CubeIcon></CubeIcon>}>
{l10n.getString('navbar-home')}
</NavButton>
<NavButton
to="/onboarding/body-proportions/auto"
match="/onboarding/body-proportions/*"
state={{ alonePage: true }}
icon={<GearIcon></GearIcon>}
>
{l10n.getString('navbar-body_proportions')}
</NavButton>
<NavButton
to="/onboarding/trackers-assign"
state={{ alonePage: true }}
icon={<GearIcon></GearIcon>}
>
{l10n.getString('navbar-trackers_assign')}
</NavButton>
<NavButton
to="/onboarding/mounting/auto"
match="/onboarding/mounting/*"
state={{ alonePage: true }}
icon={<GearIcon></GearIcon>}
>
{l10n.getString('navbar-mounting')}
</NavButton>
<NavButton to="/onboarding/home" icon={<GearIcon></GearIcon>}>
{l10n.getString('navbar-onboarding')}
</NavButton>
</div>
<NavButton
to="/settings/trackers"
match="/settings/*"
state={{ scrollTo: 'steamvr' }}
icon={<GearIcon></GearIcon>}
>
{l10n.getString('navbar-settings')}
</NavButton>
</div>
);
}

View File

@@ -0,0 +1,206 @@
import { useLocalization } from '@fluent/react';
import { useEffect, useState } from 'react';
import { useLocation, useNavigate } from 'react-router-dom';
import {
RpcMessage,
SerialDevicesRequestT,
SerialDevicesResponseT,
SerialDeviceT,
} from 'solarxr-protocol';
import { useConfig } from '../hooks/config';
import { usePrevious } from '../hooks/previous';
import { useWebsocketAPI } from '../hooks/websocket-api';
import { useWifiForm, WifiFormData } from '../hooks/wifi-form';
import { BaseModal } from './commons/BaseModal';
import { Button } from './commons/Button';
import { BulbIcon } from './commons/icon/BulbIcon';
import { USBIcon } from './commons/icon/UsbIcon';
import { Typography } from './commons/Typography';
const mapItems = <T,>(items: T[], getKey: (item: T) => string) => {
const map: any = {};
for (const item of items) {
const key = getKey(item);
map[key] = item;
}
return map;
};
const detectChanges = <T,>(
prevItems: T[],
nextItems: T[],
getKey: (item: T) => string,
compareItems: (a: T, b: T) => boolean
) => {
const mappedItems = mapItems(prevItems, getKey);
const addedItems = [];
const updatedItems = [];
const removedItems = [];
const unchangedItems = [];
for (const nextItem of nextItems) {
const itemKey = getKey(nextItem);
if (itemKey in mappedItems) {
const prevItem = mappedItems[itemKey];
if (delete mappedItems[itemKey] && compareItems(prevItem, nextItem)) {
unchangedItems.push(nextItem);
} else {
updatedItems.push(nextItem);
}
} else {
addedItems.push(nextItem);
}
}
for (const itemKey in mappedItems) {
if (itemKey in mappedItems) {
removedItems.push(mappedItems[itemKey]);
}
}
return { addedItems, updatedItems, removedItems, unchangedItems };
};
export function SerialDetectionModal() {
const { l10n } = useLocalization();
const { config } = useConfig();
const nav = useNavigate();
const { pathname } = useLocation();
const { sendRPCPacket, useRPCPacket } = useWebsocketAPI();
const [currentDevices, setCurrentDevices] = useState<SerialDeviceT[] | null>(
null
);
const prevDevices = usePrevious<SerialDeviceT[] | null>(currentDevices);
const [isOpen, setOpen] = useState<SerialDeviceT | null>(null);
const [showWifiForm, setShowWifiForm] = useState(false);
const { WifiForm, handleSubmit, submitWifiCreds, formState, hasWifiCreds } =
useWifiForm();
useEffect(() => {
if (prevDevices == null) return;
const changes = detectChanges(
prevDevices || [],
currentDevices || [],
(item) => item.port?.toString() || 'error',
(a, b) => a.port == b.port && a.name == b.name
);
if (changes.addedItems.length === 1) {
setOpen(changes.addedItems[0]);
}
}, [prevDevices, currentDevices]);
useEffect(() => {
let timerId: NodeJS.Timer;
if (
config?.watchNewDevices &&
!['/settings/serial', '/onboarding/connect-trackers'].includes(pathname)
) {
timerId = setInterval(() => {
sendRPCPacket(
RpcMessage.SerialDevicesRequest,
new SerialDevicesRequestT()
);
}, 3000);
}
return () => {
clearInterval(timerId);
};
}, [config, sendRPCPacket, pathname]);
const closeModal = () => {
setOpen(null);
setShowWifiForm(false);
};
const openSerial = () => {
nav('/settings/serial', { state: { serialPort: isOpen?.port } });
closeModal();
};
const openWifi = () => {
if (!hasWifiCreds) {
setShowWifiForm(true);
} else {
closeModal();
nav('/onboarding/connect-trackers', { state: { alonePage: true } });
}
};
const modalWifiSubmit = (form: WifiFormData) => {
submitWifiCreds(form);
closeModal();
nav('/onboarding/connect-trackers', { state: { alonePage: true } });
};
useRPCPacket(
RpcMessage.SerialDevicesResponse,
(val: SerialDevicesResponseT) => {
setCurrentDevices(val.devices);
}
);
return (
<BaseModal isOpen={!!isOpen} onRequestClose={closeModal}>
<div className="flex flex-col gap-3">
{!showWifiForm && (
<>
<div className="flex flex-col items-center gap-3 fill-accent-background-20">
<USBIcon></USBIcon>
<div className="flex flex-col items-center gap-2">
<Typography variant="main-title">
{l10n.getString('serial_detection-new_device-p0')}
</Typography>
<Typography variant="section-title">
{isOpen?.name || 'unknown'}
</Typography>
<Typography variant="standard">
{l10n.getString('serial_detection-new_device-p2')}
</Typography>
</div>
</div>
<Button variant="primary" onClick={openWifi}>
{l10n.getString('serial_detection-open_wifi')}
</Button>
<Button variant="tiertiary" onClick={openSerial}>
{l10n.getString('serial_detection-open_serial')}
</Button>
<Button variant="secondary" onClick={closeModal}>
{l10n.getString('serial_detection-close')}
</Button>
</>
)}
{showWifiForm && (
<form
onSubmit={handleSubmit(modalWifiSubmit)}
className="flex flex-col gap-3"
>
<div className="flex flex-col items-center gap-3">
<BulbIcon></BulbIcon>
<Typography variant="main-title">
{l10n.getString('serial_detection-new_device-p0')}
</Typography>
<Typography variant="standard">
{l10n.getString('serial_detection-new_device-p1')}
</Typography>
</div>
<div className="flex flex-col gap-3 rounded-xl max-w-sm">
<WifiForm></WifiForm>
</div>
<Button
type="submit"
variant="primary"
disabled={!formState.isValid}
>
{l10n.getString('serial_detection-submit')}
</Button>
<Button variant="secondary" onClick={closeModal}>
{l10n.getString('serial_detection-close')}
</Button>
</form>
)}
</div>
</BaseModal>
);
}

View File

@@ -0,0 +1,81 @@
import { appWindow } from '@tauri-apps/api/window';
import { ReactNode } from 'react';
import { NavLink } from 'react-router-dom';
import { CloseIcon } from './commons/icon/CloseIcon';
import { MaximiseIcon } from './commons/icon/MaximiseIcon';
import { MinimiseIcon } from './commons/icon/MinimiseIcon';
import { SlimeVRIcon } from './commons/icon/SimevrIcon';
import { ProgressBar } from './commons/ProgressBar';
import { Typography } from './commons/Typography';
export function TopBar({
progress,
}: {
children?: ReactNode;
progress?: number;
}) {
return (
<div data-tauri-drag-region className="flex gap-2 h-[38px] z-50">
<div
className="flex px-2 pb-1 mt-3 justify-around z-50"
data-tauri-drag-region
>
<div className="flex gap-1" data-tauri-drag-region>
<NavLink
to="/"
className="flex justify-around flex-col select-all"
data-tauri-drag-region
>
<SlimeVRIcon></SlimeVRIcon>
</NavLink>
<div className="flex justify-around flex-col" data-tauri-drag-region>
<Typography>SlimeVR</Typography>
</div>
<div
className="mx-2 flex justify-around flex-col text-standard-bold text-status-success bg-status-success bg-opacity-20 rounded-lg px-3"
data-tauri-drag-region
>
{(__VERSION_TAG__ || __COMMIT_HASH__) +
(__GIT_CLEAN__ ? '' : '-dirty')}
</div>
</div>
</div>
<div
className="flex flex-grow items-center h-full justify-center z-50"
data-tauri-drag-region
>
<div
className="flex max-w-xl h-full items-center w-full"
data-tauri-drag-region
>
{progress !== undefined && (
<ProgressBar progress={progress} height={3} parts={3}></ProgressBar>
)}
</div>
</div>
<div
className="flex justify-end items-center px-2 gap-2 z-50"
data-tauri-drag-region
>
<div
className="flex items-center justify-center hover:bg-background-60 rounded-full w-7 h-7"
onClick={() => appWindow.minimize()}
>
<MinimiseIcon></MinimiseIcon>
</div>
<div
className="flex items-center justify-center hover:bg-background-60 rounded-full w-7 h-7"
onClick={() => appWindow.toggleMaximize()}
>
<MaximiseIcon></MaximiseIcon>
</div>
<div
className="flex items-center justify-center hover:bg-background-60 rounded-full w-7 h-7"
onClick={() => appWindow.close()}
>
<CloseIcon></CloseIcon>
</div>
</div>
</div>
);
}

View File

@@ -0,0 +1,50 @@
import classNames from 'classnames';
import { ReactNode, useMemo } from 'react';
import { NavLink } from 'react-router-dom';
import { ArrowLeftIcon, ArrowRightIcon } from './icon/ArrowIcons';
export function ArrowLink({
to,
children,
state,
direction = 'left',
variant = 'flat',
}: {
to: string;
children: ReactNode;
state?: { SerialPort?: string };
direction?: 'left' | 'right';
variant?: 'flat' | 'boxed' | 'boxed-2';
}) {
const classes = useMemo(() => {
const variantsMap = {
flat: classNames('justify-start'),
boxed: classNames(
'justify-between bg-background-70 rounded-md hover:bg-background-60 p-3'
),
'boxed-2': classNames(
'justify-between bg-background-60 rounded-md hover:bg-background-50 p-3'
),
};
return classNames(
variantsMap[variant],
'flex gap-2 hover:fill-background-10 hover:text-background-10 fill-background-30 text-background-30'
);
}, [variant]);
return (
<NavLink to={to} state={state} className={classes}>
{direction === 'left' && (
<div className="flex flex-col justify-center">
<ArrowLeftIcon></ArrowLeftIcon>
</div>
)}
{children}
{direction === 'right' && (
<div className="flex flex-col justify-center">
<ArrowRightIcon></ArrowRightIcon>
</div>
)}
</NavLink>
);
}

View File

@@ -0,0 +1,28 @@
import classNames from 'classnames';
import { ReactNode } from 'react';
import ReactModal from 'react-modal';
export function BaseModal({
children,
...props
}: {
isOpen: boolean;
children: ReactNode;
} & ReactModal.Props) {
return (
<ReactModal
{...props}
shouldCloseOnOverlayClick
shouldCloseOnEsc
overlayClassName={classNames(
'fixed top-0 right-0 left-0 bottom-0 flex flex-col justify-center items-center w-full h-full bg-background-90 bg-opacity-60 z-20'
)}
className={classNames(
props.className as string,
'items-center focus:ring-transparent focus:ring-offset-transparent focus:outline-transparent outline-none bg-background-60 p-6 rounded-lg text-white'
)}
>
{children}
</ReactModal>
);
}

View File

@@ -0,0 +1,36 @@
import classNames from 'classnames';
import React, { ReactNode } from 'react';
export function BigButton({
text,
icon,
disabled,
onClick,
...props
}: {
text: string;
disabled?: boolean;
icon: ReactNode;
} & React.HTMLAttributes<HTMLButtonElement>) {
return (
<button
disabled={disabled}
onClick={onClick}
{...props}
type="button"
className={classNames(
'flex flex-col justify-center rounded-md py-3 gap-1 px-3 cursor-pointer items-center ',
{
'bg-background-60 hover:bg-background-60 cursor-not-allowed text-background-40 fill-background-40':
disabled,
'bg-background-60 hover:bg-background-50 text-standard fill-background-10':
!disabled,
},
props.className
)}
>
<div className="flex justify-around">{icon}</div>
<div className="flex text-default flex-grow">{text}</div>
</button>
);
}

View File

@@ -0,0 +1,196 @@
import classNames from 'classnames';
import {
ReactNode,
useEffect,
useLayoutEffect,
useMemo,
useRef,
useState
} from 'react';
import { BodyPart, TrackerDataT } from 'solarxr-protocol';
import { FlatDeviceTracker } from '../../hooks/app';
import { useTracker } from '../../hooks/tracker';
import { PersonFrontIcon } from './PersonFrontIcon';
interface SlotDot {
id: string;
left: number;
top: number;
height: number;
width: number;
buttonOffset: {
left: number;
top: number;
};
}
type DotParams = {
dotSize: number;
trackers: FlatDeviceTracker[];
} & SlotDot;
function Tracker({
tracker,
updateVelocity,
}: {
tracker: TrackerDataT;
updateVelocity: (velocity: number) => void;
}) {
const { useVelocity } = useTracker(tracker);
const velocity = useVelocity();
useEffect(() => {
updateVelocity(velocity);
}, [velocity]);
return <></>;
}
function Dot({
top,
height,
width,
buttonOffset,
id,
left,
dotSize,
trackers,
}: DotParams) {
const [velocities, setVelocities] = useState<number[]>([]);
const updateVelocity = (vel: number) => {
if (velocities.length > 3) {
velocities.shift();
}
velocities.push(vel);
setVelocities(velocities);
};
const globalVelocity = useMemo(
() => velocities.reduce((curr, v) => curr + v, 0) / (trackers?.length || 1),
[velocities, trackers]
);
return (
<div
key={id}
className="absolute z-10"
style={{
top: top + height / 2 - dotSize / 2 + buttonOffset.top,
left: left + width / 2 - dotSize / 2 + buttonOffset.left,
}}
>
<div
className={classNames(
'rounded-full outline outline-2 outline-accent-background-20 bg-background-10 transition-transform'
)}
style={{
width: dotSize,
height: dotSize,
outlineWidth: globalVelocity * 2 + 2,
}}
></div>
{trackers?.map(({ tracker }, index) => (
<Tracker
tracker={tracker}
key={index}
updateVelocity={(vel) => updateVelocity(vel)}
/>
))}
</div>
);
}
export function BodyDisplay({
leftControls,
rightControls,
trackers,
width = 228,
dotsSize = 20,
variant = 'tracker-select',
}: {
leftControls?: ReactNode;
rightControls?: ReactNode;
width?: number;
dotsSize?: number;
variant?: 'dots' | 'tracker-select';
trackers: FlatDeviceTracker[];
}) {
const personRef = useRef<HTMLDivElement | null>(null);
const [slotsButtonsPos, setSlotsButtonPos] = useState<SlotDot[]>([]);
const getSlotsPos = () => {
return (
(personRef.current && [
...(personRef.current.querySelectorAll('.body-part-circle') as any),
]) ||
[]
);
};
const getOffset = (el: HTMLDivElement, offset = { left: 0, top: 0 }) => {
const rect = el.getBoundingClientRect();
return {
left: rect.left - (offset.left || 0),
top: rect.top - (offset.top || 0),
width: rect.width || el.offsetWidth,
height: rect.height || el.offsetHeight,
};
};
useLayoutEffect(() => {
if (!personRef.current) return;
const slotsPos = getSlotsPos();
const personBox = personRef.current.getBoundingClientRect();
const slots = slotsPos.map((slot: HTMLDivElement) => {
const slotPosition = getOffset(slot, personBox);
return {
...slotPosition,
id: slot.id,
buttonOffset: {
left: personBox.left - personBox.left,
top: personBox.top - personBox.top,
},
};
});
setSlotsButtonPos(slots);
}, [leftControls, rightControls, variant]);
const trackerPartGrouped = useMemo(
() =>
trackers.reduce<{ [key: number]: FlatDeviceTracker[] }>((curr, td) => {
if (!td) return curr;
const key = td.tracker.info?.bodyPart || BodyPart.NONE;
return {
...curr,
[key]: [...(curr[key] || []), td],
};
}, {}),
[trackers]
);
return (
<div className="flex">
<div
ref={personRef}
className={classNames(
'relative w-full flex justify-center',
variant === 'tracker-select' && 'mx-10'
)}
>
<PersonFrontIcon width={width}></PersonFrontIcon>
{slotsButtonsPos.map((dotData) => (
<Dot
{...dotData}
dotSize={dotsSize}
key={dotData.id}
trackers={trackerPartGrouped[(BodyPart as any)[dotData.id]]}
/>
))}
</div>
</div>
);
}

View File

@@ -0,0 +1,193 @@
import classNames from 'classnames';
import { ReactNode, useLayoutEffect, useRef, useState } from 'react';
import { BodyPart } from 'solarxr-protocol';
import { PersonFrontIcon } from './PersonFrontIcon';
export function BodyInteractions({
leftControls,
rightControls,
assignedRoles,
width = 228,
dotsSize = 20,
variant = 'tracker-select',
}: {
leftControls?: ReactNode;
rightControls?: ReactNode;
width?: number;
dotsSize?: number;
variant?: 'dots' | 'tracker-select';
assignedRoles: BodyPart[];
}) {
const personRef = useRef<HTMLDivElement | null>(null);
const leftContainerRef = useRef<HTMLDivElement | null>(null);
const rightContainerRef = useRef<HTMLDivElement | null>(null);
const canvasRefRef = useRef<HTMLCanvasElement | null>(null);
const [slotsButtonsPos, setSlotsButtonPos] = useState<
{
id: string;
left: number;
top: number;
height: number;
width: number;
hidden: boolean;
buttonOffset: {
left: number;
top: number;
};
}[]
>([]);
const getSlotsPos = () => {
return (
(personRef.current && [
...(personRef.current.querySelectorAll('.body-part-circle') as any),
]) ||
[]
);
};
const getControlsPos = () => {
const pos = (container: HTMLDivElement) =>
[...(container.querySelectorAll('.control') as any)].filter(
({ id }) => !!id
);
const left =
(leftContainerRef.current && pos(leftContainerRef.current)) || [];
const right =
(rightContainerRef.current && pos(rightContainerRef.current)) || [];
return [...left, ...right];
};
const getOffset = (el: HTMLDivElement, offset = { left: 0, top: 0 }) => {
const rect = el.getBoundingClientRect();
return {
left: rect.left - (offset.left || 0),
top: rect.top - (offset.top || 0),
width: rect.width || el.offsetWidth,
height: rect.height || el.offsetHeight,
};
};
useLayoutEffect(() => {
if (
!(
personRef.current &&
canvasRefRef.current &&
rightContainerRef.current &&
leftContainerRef.current
)
)
return;
const ctx = canvasRefRef.current.getContext('2d');
if (!ctx) return;
const slotsPos = getSlotsPos();
const controlsPos = getControlsPos();
canvasRefRef.current.width = canvasRefRef.current.offsetWidth;
canvasRefRef.current.height = canvasRefRef.current.offsetHeight;
ctx.strokeStyle = '#608AAB';
ctx.lineWidth = 1;
const canvasBox = canvasRefRef.current.getBoundingClientRect();
const personBox = personRef.current.getBoundingClientRect();
const controlsPosIds = controlsPos.map(({ id: cid }) => cid);
const slots = slotsPos.map((slot: HTMLDivElement) => {
const slotPosition = getOffset(slot, canvasBox);
return {
...slotPosition,
id: slot.id,
hidden:
variant === 'tracker-select' && !controlsPosIds.includes(slot.id),
buttonOffset: {
left: canvasBox.left - personBox.left,
top: canvasBox.top - personBox.top,
},
};
});
if (variant === 'tracker-select') {
slots.forEach((slot) => {
const controls = controlsPos.filter(({ id }) => id === slot.id);
controls.forEach((control) => {
const controlPosition = getOffset(control, canvasBox);
const offsetX =
controlPosition.left < slot.left ? controlPosition.width : 0;
const constolLeft = controlPosition.left + offsetX;
const LINE_BREAK_WIDTH = 40;
const leftOffsetX =
LINE_BREAK_WIDTH * (controlPosition.left < slot.left ? -1 : 1);
ctx.beginPath();
ctx.moveTo(
constolLeft,
controlPosition.top + controlPosition.height / 2
);
ctx.lineTo(
constolLeft - leftOffsetX,
controlPosition.top + controlPosition.height / 2
);
ctx.lineTo(slot.left + slot.width / 2, slot.top + slot.height / 2);
ctx.stroke();
});
});
}
setSlotsButtonPos(slots);
}, [leftControls, rightControls, variant]);
return (
<div className="relative">
<canvas
ref={canvasRefRef}
className="absolute w-full h-full top-0 z-10"
width="100%"
height="100%"
></canvas>
<div className="flex">
<div ref={leftContainerRef} className="z-10">
{leftControls}
</div>
<div
ref={personRef}
className={classNames(
'relative w-full flex justify-center',
variant === 'tracker-select' && 'mx-10'
)}
>
<PersonFrontIcon width={width}></PersonFrontIcon>
{slotsButtonsPos.map(
({ top, left, height, width, id, hidden, buttonOffset }) => (
<div
key={id}
className="absolute z-10"
style={{
top: top + height / 2 - dotsSize / 2 + buttonOffset.top,
left: left + width / 2 - dotsSize / 2 + buttonOffset.left,
}}
>
<div
className={classNames(
'rounded-full outline outline-2 outline-background-20 transition-opacity',
(assignedRoles.includes((BodyPart as any)[id]) &&
'bg-background-70') ||
'bg-background-10',
(hidden && 'opacity-0') || 'opacity-100'
)}
style={{ width: dotsSize, height: dotsSize }}
></div>
</div>
)
)}
</div>
<div ref={rightContainerRef} className="z-10">
{rightControls}
</div>
</div>
</div>
);
}

View File

@@ -0,0 +1,109 @@
import classNames from 'classnames';
import React, { ReactNode, useMemo } from 'react';
import { NavLink } from 'react-router-dom';
import { LoaderIcon } from './icon/LoaderIcon';
function ButtonContent({
loading,
icon,
children,
}: {
loading: boolean;
icon?: ReactNode;
children: ReactNode;
}) {
return (
<>
<div
className={classNames(
{ 'opacity-0': loading },
'flex flex-row gap-2 justify-center'
)}
>
{icon && (
<div className="flex justify-center items-center fill-background-10 w-5 h-5">
{icon}
</div>
)}
{children}
</div>
{loading && (
<div className="absolute top-0 left-0 w-full h-full flex justify-center items-center fill-background-10">
<LoaderIcon youSpinMeRightRoundBabyRightRound></LoaderIcon>
</div>
)}
</>
);
}
export function Button({
children,
variant,
disabled,
to,
loading = false,
state = {},
icon,
rounded = false,
...props
}: {
children: ReactNode;
icon?: ReactNode;
variant: 'primary' | 'secondary' | 'tiertiary' | 'quaternary';
to?: string;
loading?: boolean;
rounded?: boolean;
state?: any;
} & React.ButtonHTMLAttributes<HTMLButtonElement>) {
const classes = useMemo(() => {
const variantsMap = {
primary: classNames({
'bg-accent-background-30 hover:bg-accent-background-20 text-standard text-background-10':
!disabled,
'bg-accent-background-40 hover:bg-accent-background-40 cursor-not-allowed text-accent-background-10':
disabled,
}),
secondary: classNames({
'bg-background-60 hover:bg-background-50 text-standard text-background-10':
!disabled,
'bg-background-60 hover:bg-background-60 cursor-not-allowed text-background-40':
disabled,
}),
tiertiary: classNames({
'bg-background-50 hover:bg-background-40 text-standard text-background-10':
!disabled,
'bg-background-50 hover:bg-background-50 cursor-not-allowed text-background-40':
disabled,
}),
quaternary: classNames({
'bg-background-70 hover:bg-background-60 text-standard text-background-10':
!disabled,
'bg-background-70 hover:bg-background-70 cursor-not-allowed text-background-40':
disabled,
}),
};
return classNames(
variantsMap[variant],
'focus:ring-4 text-center relative',
{
'rounded-full p-2 text-center min-h-[35px] min-w-[35px]': rounded,
'rounded-md px-5 py-2.5': !rounded,
},
props.className
);
}, [variant, disabled, rounded]);
return to ? (
<NavLink to={to} className={classes} state={state}>
<ButtonContent icon={icon} loading={loading}>
{children}
</ButtonContent>
</NavLink>
) : (
<button type="button" {...props} className={classes} disabled={disabled}>
<ButtonContent icon={icon} loading={loading}>
{children}
</ButtonContent>
</button>
);
}

View File

@@ -0,0 +1,92 @@
import classNames from 'classnames';
import { useMemo } from 'react';
import { Control, Controller } from 'react-hook-form';
export function CheckBox({
label,
variant = 'checkbox',
control,
outlined,
name,
// input props
disabled,
...props
}: {
label: string;
control: Control<any>;
name: string;
variant?: 'checkbox' | 'toggle';
outlined?: boolean;
} & React.HTMLProps<HTMLInputElement>) {
const classes = useMemo(() => {
const vriantsMap = {
checkbox: {
checkbox: classNames(
'bg-background-50 border-background-50 rounded-md w-5 h-5 text-accent-background-30 focus:border-accent-background-40 focus:ring-transparent focus:ring-offset-transparent focus:outline-transparent'
),
toggle: '',
pin: '',
},
toggle: {
checkbox: classNames('hidden'),
toggle: classNames('w-10 h-4 rounded-full relative transition-colors'),
pin: classNames('h-2 w-2 bg-background-10 rounded-full absolute m-1'),
},
};
return vriantsMap[variant];
}, [variant]);
return (
<Controller
control={control}
name={name}
render={({ field: { onChange, value, ref, name } }) => (
<div
className={classNames(
{
'bg-background-60 rounded-lg text-white': outlined,
'text-background-30': !outlined,
},
'flex items-center gap-2 w-full'
)}
>
<label
className={classNames(
'w-full py-3 flex gap-2 items-center text-standard-bold',
{
'px-3': outlined,
'cursor-pointer': !disabled,
}
)}
>
<input
ref={ref}
onChange={onChange}
checked={value}
name={name}
className={classes.checkbox}
type="checkbox"
{...props}
/>
{variant === 'toggle' && (
<div
className={classNames(classes.toggle, {
'bg-accent-background-30': value,
'bg-background-50': !value,
})}
>
<div
className={classNames(classes.pin, {
'left-0': !value,
'right-0': value,
})}
></div>
</div>
)}
{label}
</label>
</div>
)}
/>
);
}

View File

@@ -0,0 +1,114 @@
import classNames from 'classnames';
import { useState } from 'react';
import { Control, Controller } from 'react-hook-form';
export interface DropdownItem {
label: string;
value: string;
}
export type DropdownDirection = 'up' | 'down';
export function Dropdown({
direction = 'up',
variant = 'primary',
placeholder,
control,
name,
items = [],
}: {
direction?: DropdownDirection;
variant?: 'primary' | 'secondary';
placeholder: string;
control: Control<any>;
name: string;
items: DropdownItem[];
}) {
const [isOpen, setOpen] = useState(false);
return (
<Controller
control={control}
name={name}
render={({ field: { onChange, value } }) => (
<>
{isOpen && (
<div
className="absolute top-0 left-0 w-full h-full bg-transparent"
onClick={() => setOpen(false)}
></div>
)}
<div className="relative w-fit">
<div
className={classNames(
'min-h-[35px] text-white px-5 py-2.5 rounded-md focus:ring-4 text-center flex',
variant == 'primary' &&
'bg-background-60 hover:bg-background-50',
variant == 'secondary' &&
'bg-background-70 hover:bg-background-60'
)}
onClick={() => setOpen((open) => !open)}
>
<div className="flex-grow">
{items.find((i) => i.value == value)?.label || placeholder}
</div>
<div
className={classNames(
'ml-2',
direction == 'up' && 'rotate-180',
direction == 'down' && 'rotate-0'
)}
>
<svg
className="justify-end w-4 h-4 "
aria-hidden="true"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth="2"
d="M19 9l-7 7-7-7"
></path>
</svg>
</div>
</div>
{isOpen && (
<div
className={classNames(
'absolute z-10 rounded shadow right-0 min-w-max',
direction === 'up' && 'bottom-[45px]',
direction === 'down' && 'top-[45px]',
variant == 'primary' && 'bg-background-60',
variant == 'secondary' && 'bg-background-70'
)}
>
<ul className="py-1 text-sm text-gray-200 flex flex-col ">
{items.map((item) => (
<li
className={classNames(
'py-2 px-4 hover:text-white min-w-max',
variant == 'primary' && 'hover:bg-background-50',
variant == 'secondary' && 'hover:bg-background-60'
)}
onClick={() => {
onChange(item.value);
setOpen(false);
}}
key={item.value}
>
{item.label}
</li>
))}
</ul>
</div>
)}
</div>
</>
)}
/>
);
}

View File

@@ -0,0 +1,65 @@
import classNames from 'classnames';
import {
forwardRef,
HTMLInputTypeAttribute,
MouseEvent,
useMemo,
useState
} from 'react';
import { EyeIcon } from './icon/EyeIcon';
export interface InputProps {
type: HTMLInputTypeAttribute;
placeholder?: string | null;
label?: string | null;
autocomplete?: boolean;
variant?: 'primary' | 'secondary';
}
export const Input = forwardRef<HTMLInputElement, InputProps>(function AppInput(
{ type, placeholder, label, autocomplete, variant = 'primary', ...props },
ref
) {
const [forceText, setForceText] = useState(false);
const togglePassword = (e: MouseEvent<HTMLDivElement>) => {
e.preventDefault();
setForceText(!forceText);
};
const classes = useMemo(() => {
const variantsMap = {
primary: classNames('bg-background-60 border-background-60'),
secondary: classNames('bg-background-50 border-background-50'),
};
return classNames(
variantsMap[variant],
'w-full focus:ring-transparent focus:ring-offset-transparent focus:outline-transparent rounded-md bg-background-60 border-background-60 focus:border-accent-background-40 placeholder:text-background-30 text-standard relative'
);
}, [variant]);
return (
<label className="flex flex-col gap-1">
{label}
<div className="relative w-full">
<input
type={forceText ? 'text' : type}
ref={ref}
className={classNames(classes, { 'pr-10': type === 'password' })}
placeholder={placeholder || undefined}
autoComplete={autocomplete ? 'off' : 'on'}
{...props}
></input>
{type === 'password' && (
<div
className="fill-background-10 absolute top-0 h-full flex flex-col justify-center right-0 p-4"
onClick={togglePassword}
>
<EyeIcon></EyeIcon>
</div>
)}
</div>
</label>
);
});

View File

@@ -0,0 +1,46 @@
import { useLocalization } from '@fluent/react';
import { useEffect, useMemo, useContext } from 'react';
import { useForm } from 'react-hook-form';
import { useConfig } from '../../hooks/config';
import { langs, LangContext } from '../../i18n/config';
import { Dropdown, DropdownDirection } from './Dropdown';
export function LangSelector({
direction = 'up',
}: {
direction?: DropdownDirection;
}) {
const { changeLocales } = useContext(LangContext);
const { l10n } = useLocalization();
const { config, setConfig } = useConfig();
const { control, watch, handleSubmit } = useForm<{ lang: string }>({
defaultValues: { lang: config?.lang || 'en' },
});
const languagesItems = useMemo(
() => langs.map(({ key, name }) => ({ label: name, value: key })),
[]
);
useEffect(() => {
const subscription = watch(() => handleSubmit(onSubmit)());
return () => subscription.unsubscribe();
}, []);
const onSubmit = (value: { lang: string }) => {
changeLocales([value.lang]);
setConfig({ lang: value.lang });
};
return (
<Dropdown
control={control}
name="lang"
placeholder={l10n.getString(
'settings-general-interface-lang-placeholder'
)}
items={languagesItems}
direction={direction}
></Dropdown>
);
}

View File

@@ -0,0 +1,25 @@
import classNames from 'classnames';
import { ReactNode } from 'react';
import ReactModal from 'react-modal';
export function EmptyModal({
children,
...props
}: { children?: ReactNode } & ReactModal.Props) {
return (
<ReactModal
{...props}
shouldCloseOnOverlayClick
shouldCloseOnEsc
overlayClassName={classNames(
'fixed top-0 right-0 left-0 bottom-0 flex flex-col justify-center items-center w-full h-full bg-background-90 bg-opacity-60 z-20'
)}
className={classNames(
props.className as string,
'items-center focus:ring-transparent focus:ring-offset-transparent focus:outline-transparent outline-none'
)}
>
{children}
</ReactModal>
);
}

View File

@@ -0,0 +1,64 @@
import { Control, Controller } from 'react-hook-form';
import { Button } from './Button';
import { Typography } from './Typography';
export function NumberSelector({
label,
valueLabelFormat,
control,
name,
min,
max,
step,
}: {
label: string;
valueLabelFormat?: (value: number) => string;
control: Control<any>;
name: string;
min: number;
max: number;
step: number | ((value: number, add: boolean) => number);
}) {
const stepFn =
typeof step === 'function'
? step
: (value: number, add: boolean) =>
+(add ? value + step : value - step).toFixed(2);
return (
<Controller
control={control}
name={name}
render={({ field: { onChange, value } }) => (
<div className="flex flex-col gap-1 w-full">
<Typography bold>{label}</Typography>
<div className="flex gap-2 bg-background-60 p-2 rounded-lg">
<div className="flex">
<Button
variant="tiertiary"
rounded
onClick={() => onChange(stepFn(value, false))}
disabled={stepFn(value, false) < min}
>
-
</Button>
</div>
<div className="flex flex-grow justify-center items-center w-10">
{valueLabelFormat ? valueLabelFormat(value) : value}
</div>
<div className="flex">
<Button
variant="tiertiary"
rounded
onClick={() => onChange(stepFn(value, true))}
disabled={stepFn(value, true) > max}
>
+
</Button>
</div>
</div>
</div>
)}
/>
);
}

View File

@@ -0,0 +1,151 @@
import { BodyPart } from 'solarxr-protocol';
export function PersonFrontIcon({ width }: { width?: number }) {
const CIRCLE_RADIUS = 0.0001;
return (
<svg
width={width || 240}
viewBox="0 0 165 392"
xmlns="http://www.w3.org/2000/svg"
>
<path d="M84.53 224.074C83.953 230.874 88.569 266.874 90.951 280.984C92.085 287.671 95.195 298.565 94.076 304.349C92.476 312.411 92.017 322.843 92.896 328.918C93.451 332.607 95.196 349.618 92.696 355.845C91.389 359.108 88.996 375.832 88.996 375.832C82.756 391.587 86.278 390.812 86.278 390.812C88.21 393.183 91.519 390.998 91.519 390.998C92.1549 391.464 92.9388 391.682 93.7241 391.612C94.5094 391.542 95.2421 391.188 95.785 390.616C97.949 392.407 100.471 390.396 100.471 390.396C103.189 391.807 105.71 389.205 105.71 389.205C107.271 389.991 107.653 388.998 107.653 388.998C112.337 388.698 105.039 373.706 105.039 373.706C103.291 360.242 106.773 352.748 106.773 352.748C118.178 318.926 118.758 309.948 114.199 297.204C112.915 293.524 112.59 292.067 113.181 290.47C114.547 286.783 113.551 271.953 115.217 266.064C118.431 254.706 121.602 225.903 123.254 212.464C125.475 194.364 115.388 170.088 115.388 170.088C113.179 160.21 116.418 125.016 116.418 125.016C120.941 132.054 120.768 144.477 120.768 144.477C120.05 157.506 131.294 177.42 131.294 177.42C136.694 185.649 138.742 193.456 138.742 194.036C138.742 196.407 138.223 202.145 138.223 202.145L138.43 207.145C138.803 209.721 139.034 212.316 139.123 214.918C138.28 227.953 140.35 225.501 140.35 225.501C142.098 225.501 144.018 215.011 144.018 215.011C144.018 217.711 143.357 225.811 144.818 228.869C146.564 232.512 147.848 228.244 147.871 227.387C148.333 210.787 149.33 215.138 149.33 215.138C150.301 228.602 151.494 231.644 153.63 230.591C155.25 229.818 153.769 214.433 153.769 214.433C156.544 223.572 158.649 225.027 158.649 225.027C163.229 228.243 160.397 219.361 159.76 217.602C156.371 208.256 156.267 205.017 156.267 205.017C160.501 213.417 163.692 213.104 163.692 213.104C167.822 211.786 160.083 199.894 155.548 194.197C153.234 191.297 150.248 187.408 149.384 185.097C147.973 181.188 146.907 168.62 146.907 168.62C146.48 153.79 142.813 147.348 142.813 147.348C136.544 137.314 135.365 118.598 135.365 118.598L135.09 87C132.89 65.445 117.01 65.29 117.01 65.29C100.957 62.9 98.723 57.714 98.723 57.714C95.323 52.821 97.266 43.44 97.266 43.44C100.087 41.145 101.175 35.053 101.175 35.053C105.859 31.461 105.63 26.205 103.466 26.262C101.73 26.308 102.123 24.87 102.123 24.87C105.052 1.208 84.046 0 84.046 0H80.836C80.836 0 59.821 1.208 62.746 24.864C62.746 24.864 63.139 26.304 61.388 26.256C59.23 26.199 59.029 31.456 63.696 35.047C63.696 35.047 64.783 41.137 67.605 43.434C67.605 43.434 69.548 52.814 66.148 57.708C66.148 57.708 63.922 62.894 47.861 65.284C47.861 65.284 31.952 65.44 29.788 86.994L29.488 118.594C29.488 118.594 28.331 137.311 22.038 147.344C22.038 147.344 18.389 153.787 17.967 168.616C17.967 168.616 16.898 181.184 15.492 185.093C14.635 187.393 11.653 191.276 9.32001 194.193C4.74601 199.878 -2.94199 211.745 1.17101 213.1C1.17101 213.1 4.37901 213.412 8.59601 205.013C8.59601 205.013 8.50901 208.229 5.12501 217.598C4.46001 219.334 1.63201 228.217 6.21301 225.024C6.21301 225.024 8.33501 223.567 11.093 214.43C11.093 214.43 9.61301 229.815 11.26 230.588C13.412 231.642 14.586 228.599 15.56 215.135C15.56 215.135 16.56 210.787 17.017 227.384C17.04 228.241 18.295 232.509 20.049 228.866C21.529 225.811 20.864 217.727 20.864 215.008C20.864 215.008 22.764 225.498 24.536 225.498C24.536 225.498 26.624 227.95 25.767 214.915C25.628 212.786 26.375 208.415 26.467 207.142L26.667 202.142C26.667 202.142 26.146 196.417 26.146 194.033C26.146 193.442 28.194 185.646 33.594 177.417C33.594 177.417 44.826 157.494 44.103 144.474C44.103 144.474 43.947 132.051 48.47 125.013C48.47 125.013 51.68 160.205 49.505 170.085C49.505 170.085 39.405 194.358 41.629 212.461C43.27 225.937 46.435 254.702 49.657 266.061C51.34 271.938 50.345 286.761 51.693 290.467C52.301 292.076 51.982 293.558 50.675 297.201C46.141 309.947 46.718 318.925 58.123 352.745C58.123 352.745 61.633 360.239 59.859 373.703C59.859 373.703 52.572 388.695 57.239 388.995C57.239 388.995 57.604 389.988 59.182 389.202C59.182 389.202 61.703 391.802 64.427 390.393C64.427 390.393 66.95 392.407 69.106 390.613C69.6451 391.185 70.3751 391.54 71.158 391.61C71.9409 391.681 72.7225 391.462 73.355 390.995C73.355 390.995 76.664 393.227 78.63 390.809C78.63 390.809 82.123 391.584 75.904 375.829C75.904 375.829 73.522 359.129 72.209 355.842C69.709 349.621 71.474 332.57 72.009 328.915C72.87 322.806 72.409 312.398 70.835 304.346C69.684 298.575 72.801 287.679 73.952 280.981C76.317 266.881 80.952 230.881 80.373 224.071L82.288 224.743C83.0863 224.756 83.8692 224.522 84.53 224.074Z" />
<circle
className="body-part-circle"
cx="82.004"
cy="120"
r={CIRCLE_RADIUS}
id={BodyPart[BodyPart.CHEST]}
/>
<circle
className="body-part-circle"
cx="82.004"
cy="181"
r={CIRCLE_RADIUS}
id={BodyPart[BodyPart.HIP]}
/>
<circle
className="body-part-circle"
cx="82.004"
cy="181"
r={CIRCLE_RADIUS}
id={BodyPart[BodyPart.WAIST]}
/>
<circle
className="body-part-circle"
cx="82"
cy="50"
r={CIRCLE_RADIUS}
id={BodyPart[BodyPart.NECK]}
/>
<circle
className="body-part-circle"
cx="82"
cy="50"
r={CIRCLE_RADIUS}
id={BodyPart[BodyPart.HEAD]}
/>
<circle
className="body-part-circle"
cx="139.004"
cy="170"
r={CIRCLE_RADIUS}
id={BodyPart[BodyPart.LEFT_HAND]}
/>
<circle
className="body-part-circle"
cx="122"
cy="93"
r={CIRCLE_RADIUS}
id={BodyPart[BodyPart.LEFT_UPPER_ARM]}
/>
<circle
className="body-part-circle"
cx="122"
cy="93"
r={CIRCLE_RADIUS}
id={BodyPart[BodyPart.LEFT_SHOULDER]}
/>
<circle
className="body-part-circle"
cx="139.004"
cy="170"
r={CIRCLE_RADIUS}
id={BodyPart[BodyPart.LEFT_LOWER_ARM]}
/>
<circle
className="body-part-circle"
cx="97.004"
cy="360"
r={CIRCLE_RADIUS}
id={BodyPart[BodyPart.LEFT_LOWER_LEG]}
/>
<circle
className="body-part-circle"
cx="103.004"
cy="260"
r={CIRCLE_RADIUS}
id={BodyPart[BodyPart.LEFT_UPPER_LEG]}
/>
<circle
className="body-part-circle"
cx="97.004"
cy="360"
r={CIRCLE_RADIUS}
id={BodyPart[BodyPart.LEFT_FOOT]}
/>
<circle
className="body-part-circle"
cx="26.004"
cy="170"
r={CIRCLE_RADIUS}
id={BodyPart[BodyPart.RIGHT_HAND]}
/>
<circle
className="body-part-circle"
cx="43"
cy="93"
r={CIRCLE_RADIUS}
id={BodyPart[BodyPart.RIGHT_UPPER_ARM]}
/>
<circle
className="body-part-circle"
cx="43"
cy="93"
r={CIRCLE_RADIUS}
id={BodyPart[BodyPart.RIGHT_SHOULDER]}
/>
<circle
className="body-part-circle"
cx="26.004"
cy="170"
r={CIRCLE_RADIUS}
id={BodyPart[BodyPart.RIGHT_LOWER_ARM]}
/>
<circle
className="body-part-circle"
cx="67.004"
cy="360"
r={CIRCLE_RADIUS}
id={BodyPart[BodyPart.RIGHT_LOWER_LEG]}
/>
<circle
className="body-part-circle"
cx="61.004"
cy="260"
r={CIRCLE_RADIUS}
id={BodyPart[BodyPart.RIGHT_UPPER_LEG]}
/>
<circle
className="body-part-circle"
cx="67.004"
cy="360"
r={CIRCLE_RADIUS}
id={BodyPart[BodyPart.RIGHT_FOOT]}
/>
</svg>
);
}

View File

@@ -0,0 +1,43 @@
import classNames from 'classnames';
import { useMemo } from 'react';
export function ProgressBar({
progress,
parts = 1,
height = 10,
}: {
progress: number;
parts?: number;
height?: number;
}) {
const Bar = ({ index }: { index: number }) => {
const value = useMemo(
() => Math.min(Math.max((progress * parts) / 1 - index, 0), 1),
[index, progress]
);
return (
<div
className="flex relative flex-grow bg-background-50 rounded-lg overflow-hidden"
style={{ height: `${height}px` }}
>
<div
className={classNames(
'bg-accent-background-20 rounded-lg overflow-hidden absolute top-0'
)}
style={{
width: `${value * 100}%`,
height: `${height}px`,
}}
></div>
</div>
);
};
return (
<div className="flex w-full flex-row gap-2">
{Array.from({ length: parts }).map((_, key) => (
<Bar index={key} key={key}></Bar>
))}
</div>
);
}

View File

@@ -0,0 +1,58 @@
import classNames from 'classnames';
import { Control, Controller } from 'react-hook-form';
import { Typography } from './Typography';
export function Radio({
control,
name,
label,
value,
desciption,
// input props
disabled,
...props
}: {
control: Control<any>;
name: string;
label: string;
value: string | number;
desciption?: string | null;
} & React.HTMLProps<HTMLInputElement>) {
return (
<Controller
control={control}
name={name}
render={({ field: { onChange, ref, name, value: checked } }) => (
<label
className={classNames(
'w-full bg-background-60 p-3 rounded-md flex gap-3 border-2',
{
'border-accent-background-30': value == checked,
'border-transparent': value != checked,
'cursor-pointer': !disabled,
}
)}
>
<input
type="radio"
className="text-accent-background-30 focus:ring-transparent focus:ring-offset-transparent focus:outline-transparent"
name={name}
ref={ref}
onChange={onChange}
value={value}
checked={value == checked}
{...props}
></input>
<div className="flex flex-col gap-2">
<Typography bold>{label}</Typography>
{desciption && (
<Typography variant="standard" color="secondary">
{desciption}
</Typography>
)}
</div>
</label>
)}
/>
);
}

View File

@@ -0,0 +1,16 @@
import { ReactNode } from 'react';
import { BulbIcon } from './icon/BulbIcon';
import { Typography } from './Typography';
export function TipBox({ children }: { children: ReactNode }) {
return (
<div className="flex flex-row gap-4 bg-accent-background-50 p-4 rounded-md">
<div className="fill-accent-background-20 flex flex-col justify-center">
<BulbIcon></BulbIcon>
</div>
<div className="flex flex-col">
<Typography color="text-accent-background-10">{children}</Typography>
</div>
</div>
);
}

View File

@@ -0,0 +1,43 @@
import classNames from 'classnames';
import { createElement, ReactNode, useMemo } from 'react';
export function Typography({
variant = 'standard',
bold = false,
color = 'primary',
children,
}: {
variant?: 'main-title' | 'section-title' | 'standard' | 'vr-accessible';
bold?: boolean;
block?: boolean;
color?: 'primary' | 'secondary' | string;
children: ReactNode;
}) {
const tag = useMemo(() => {
const tags = {
'main-title': 'h1',
'section-title': 'h2',
standard: 'p',
'vr-accessible': 'p',
};
return tags[variant];
}, [variant]);
return createElement(
tag,
{
className: classNames([
variant === 'main-title' && 'text-main-title',
variant === 'section-title' && 'text-section-title',
variant === 'standard' &&
(bold ? 'text-standard-bold' : 'text-standard'),
variant === 'vr-accessible' &&
(bold ? 'text-vr-accesible-bold' : 'text-vr-accesible'),
color === 'primary' && 'text-background-10',
color === 'secondary' && 'text-background-30',
typeof color === 'string' && color,
]),
},
children
);
}

View File

@@ -0,0 +1,48 @@
export function ArrowDownIcon() {
return (
<svg
xmlns="http://www.w3.org/2000/svg"
xmlnsXlink="http://www.w3.org/1999/xlink"
version="1.1"
width="24"
height="24"
viewBox="0 0 24 24"
>
<path d="M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z" />
</svg>
);
}
export function ArrowLeftIcon() {
return (
<svg
width="12"
height="10"
viewBox="0 0 12 10"
xmlns="http://www.w3.org/2000/svg"
>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M12 5C12 5.18941 11.921 5.37106 11.7804 5.50499C11.6397 5.63892 11.449 5.71416 11.2501 5.71416H2.56155L5.7817 8.77932C5.85142 8.84572 5.90673 8.92455 5.94446 9.0113C5.9822 9.09805 6.00162 9.19104 6.00162 9.28494C6.00162 9.37884 5.9822 9.47183 5.94446 9.55858C5.90673 9.64534 5.85142 9.72417 5.7817 9.79056C5.71197 9.85696 5.6292 9.90964 5.5381 9.94557C5.447 9.98151 5.34936 10 5.25075 10C5.15215 10 5.05451 9.98151 4.96341 9.94557C4.87231 9.90964 4.78954 9.85696 4.71981 9.79056L0.220316 5.50562C0.150479 5.43928 0.0950707 5.36048 0.0572652 5.27371C0.0194598 5.18695 0 5.09394 0 5C0 4.90606 0.0194598 4.81305 0.0572652 4.72629C0.0950707 4.63952 0.150479 4.56072 0.220316 4.49438L4.71981 0.209436C4.86063 0.0753365 5.05161 0 5.25075 0C5.4499 0 5.64088 0.0753365 5.7817 0.209436C5.92251 0.343536 6.00162 0.525414 6.00162 0.715059C6.00162 0.904705 5.92251 1.08658 5.7817 1.22068L2.56155 4.28584H11.2501C11.449 4.28584 11.6397 4.36108 11.7804 4.49502C11.921 4.62895 12 4.81059 12 5Z"
/>
</svg>
);
}
export function ArrowRightIcon() {
return (
<svg
width="12"
height="10"
viewBox="0 0 12 10"
xmlns="http://www.w3.org/2000/svg"
>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M-3.2717e-07 5C-3.2717e-07 4.81059 0.0790079 4.62894 0.219644 4.49501C0.360281 4.36108 0.551026 4.28584 0.749916 4.28584L9.43845 4.28584L6.2183 1.22068C6.14858 1.15428 6.09327 1.07545 6.05554 0.9887C6.0178 0.901945 5.99838 0.808961 5.99838 0.715058C5.99838 0.621155 6.0178 0.528172 6.05554 0.441417C6.09327 0.354662 6.14858 0.275834 6.2183 0.209435C6.28803 0.143036 6.3708 0.0903648 6.4619 0.0544297C6.553 0.0184946 6.65064 -2.87569e-07 6.74925 -2.87569e-07C6.84785 -2.87569e-07 6.94549 0.0184946 7.03659 0.0544297C7.12769 0.0903648 7.21046 0.143036 7.28019 0.209435L11.7797 4.49438C11.8495 4.56072 11.9049 4.63952 11.9427 4.72629C11.9805 4.81305 12 4.90606 12 5C12 5.09394 11.9805 5.18695 11.9427 5.27371C11.9049 5.36048 11.8495 5.43928 11.7797 5.50562L7.28019 9.79056C7.13937 9.92466 6.94839 10 6.74925 10C6.5501 10 6.35912 9.92466 6.2183 9.79056C6.07749 9.65646 5.99838 9.47459 5.99838 9.28494C5.99838 9.0953 6.07749 8.91342 6.2183 8.77932L9.43845 5.71416L0.749916 5.71416C0.551026 5.71416 0.360281 5.63891 0.219644 5.50498C0.0790079 5.37105 -3.2717e-07 5.18941 -3.2717e-07 5Z"
/>
</svg>
);
}

View File

@@ -0,0 +1,64 @@
import classNames from 'classnames';
import { useMemo } from 'react';
export function BatteryIcon({
value,
disabled = false,
}: {
value: number;
disabled?: boolean;
}) {
const col = useMemo(() => {
const colorsMap: { [key: number]: string } = {
0.4: 'fill-status-success',
0.2: 'fill-status-warning',
0: 'fill-status-critical',
};
const val = Object.keys(colorsMap)
.filter((key) => +key < value)
.sort((a, b) => +b - +a)[0];
return disabled
? 'fill-background-40'
: colorsMap[+val] || 'fill-background-10';
}, [value, disabled]);
return (
<svg
width="19"
height="9"
viewBox="0 0 19 9"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M11.0833 0H1.31203C0.995003 0.00131561 0.691347 0.121213 0.467167 0.333594C0.242986 0.545976 0.116428 0.83365 0.115039 1.134V7.383C0.114754 7.68458 0.240506 7.97399 0.464808 8.18799C0.689109 8.40198 0.993714 8.52315 1.31203 8.525H11.0833V0Z"
fill="#3D6381"
/>
<path
d="M15.0005 8.525C15.3175 8.52368 15.6212 8.40379 15.8454 8.19141C16.0696 7.97902 16.1961 7.69135 16.1975 7.391V5.968H17.9972V2.558H16.1975V1.134C16.1961 0.83365 16.0696 0.545976 15.8454 0.333594C15.6212 0.121213 15.3175 0.00131561 15.0005 0H10.9672V8.525H15.0005Z"
fill="#3D6381"
/>
<mask
id="mask0_4_39"
style={{ maskType: 'alpha' }}
maskUnits="userSpaceOnUse"
x="0"
y="0"
width="18"
height="9"
>
<path
d="M11.0833 0H1.31203C0.995003 0.00131561 0.691347 0.121213 0.467167 0.333594C0.242986 0.545976 0.116428 0.83365 0.115039 1.134V7.383C0.114754 7.68458 0.240506 7.97399 0.464808 8.18799C0.689109 8.40198 0.993714 8.52315 1.31203 8.525H11.0833V0Z"
fill="#3D6381"
/>
<path
d="M15.0005 8.525C15.3175 8.52368 15.6212 8.40379 15.8454 8.19141C16.0696 7.97902 16.1961 7.69135 16.1975 7.391V5.968H17.9972V2.558H16.1975V1.134C16.1961 0.83365 16.0696 0.545976 15.8454 0.333594C15.6212 0.121213 15.3175 0.00131561 15.0005 0H10.9672V8.525H15.0005Z"
fill="#3D6381"
/>
</mask>
<g mask="url(#mask0_4_39)" className={classNames(col, 'opacity-100')}>
<rect width={value * 18} height="9" />
</g>
</svg>
);
}

View File

@@ -0,0 +1,12 @@
export function BulbIcon() {
return (
<svg
xmlns="http://www.w3.org/2000/svg"
width={20}
height={20}
viewBox="0 0 352 512"
>
<path d="M96.06 454.35c.01 6.29 1.87 12.45 5.36 17.69l17.09 25.69a31.99 31.99 0 0 0 26.64 14.28h61.71a31.99 31.99 0 0 0 26.64-14.28l17.09-25.69a31.989 31.989 0 0 0 5.36-17.69l.04-38.35H96.01l.05 38.35zM0 176c0 44.37 16.45 84.85 43.56 115.78 16.52 18.85 42.36 58.23 52.21 91.45.04.26.07.52.11.78h160.24c.04-.26.07-.51.11-.78 9.85-33.22 35.69-72.6 52.21-91.45C335.55 260.85 352 220.37 352 176 352 78.61 272.91-.3 175.45 0 73.44.31 0 82.97 0 176zm176-80c-44.11 0-80 35.89-80 80 0 8.84-7.16 16-16 16s-16-7.16-16-16c0-61.76 50.24-112 112-112 8.84 0 16 7.16 16 16s-7.16 16-16 16z" />
</svg>
);
}

View File

@@ -0,0 +1,19 @@
export function CheckIcon(props: any) {
return (
<svg
width="9"
height="7"
viewBox="0 0 9 7"
xmlns="http://www.w3.org/2000/svg"
>
<g clipPath="url(#clip0_548_761)">
<path d="M3.05666 6.86296L0.132685 3.81321C0.0906355 3.76962 0.0572652 3.71778 0.034494 3.66068C0.0117228 3.60358 0 3.54235 0 3.48051C0 3.41867 0.0117228 3.35744 0.034494 3.30035C0.0572652 3.24325 0.0906355 3.19141 0.132685 3.14781L0.770644 2.48241C0.812442 2.43856 0.862143 2.40375 0.916885 2.38C0.971628 2.35625 1.03033 2.34402 1.08962 2.34402C1.14891 2.34402 1.20762 2.35625 1.26236 2.38C1.3171 2.40375 1.3668 2.43856 1.4086 2.48241L3.37883 4.53739L7.59946 0.135219C7.64126 0.0913603 7.69096 0.0565546 7.7457 0.0328039C7.80044 0.00905319 7.85915 -0.00317383 7.91844 -0.00317383C7.97773 -0.00317383 8.03643 0.00905319 8.09117 0.0328039C8.14592 0.0565546 8.19562 0.0913603 8.23742 0.135219L8.87537 0.800618C8.91742 0.844214 8.95079 0.896052 8.97357 0.95315C8.99634 1.01025 9.00806 1.07148 9.00806 1.13332C9.00806 1.19516 8.99634 1.25639 8.97357 1.31349C8.95079 1.37058 8.91742 1.42242 8.87537 1.46602L3.69303 6.86296C3.65126 6.90657 3.60166 6.94116 3.54706 6.96477C3.49246 6.98837 3.43394 7.00052 3.37484 7.00052C3.31574 7.00052 3.25722 6.98837 3.20263 6.96477C3.14803 6.94116 3.09843 6.90657 3.05666 6.86296Z" />
</g>
<defs>
<clipPath id="clip0_548_761">
<rect width="9" height="7" />
</clipPath>
</defs>
</svg>
);
}

View File

@@ -0,0 +1,13 @@
export function CircleIcon(props: any) {
return (
<svg
{...props}
width="10"
height="10"
viewBox="0 0 6 6"
xmlns="http://www.w3.org/2000/svg"
>
<path d="M3 6C4.65685 6 6 4.65685 6 3C6 1.34315 4.65685 0 3 0C1.34315 0 0 1.34315 0 3C0 4.65685 1.34315 6 3 6Z" />
</svg>
);
}

View File

@@ -0,0 +1,29 @@
export function CloseIcon({
className,
size = 35,
}: {
className?: string;
size?: number;
}) {
return (
<svg
width={size}
height={size}
className={className}
viewBox="0 0 31 29"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M19.3804 17.8804L12.619 11.119"
stroke="#C0A1D8"
strokeLinecap="round"
/>
<path
d="M12.6196 17.8804L19.381 11.119"
stroke="#C0A1D8"
strokeLinecap="round"
/>
</svg>
);
}

View File

@@ -0,0 +1,11 @@
export function CrossIcon() {
return (
<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path
fillRule="evenodd"
d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z"
clipRule="evenodd"
></path>
</svg>
);
}

View File

@@ -0,0 +1,15 @@
export function CubeIcon(props: any) {
return (
<svg
{...props}
width="20"
height="20"
viewBox="0 0 16 16"
xmlns="http://www.w3.org/2000/svg"
>
<path d="M14.835 3.752L8.377 0.852002C8.31295 0.823464 8.24362 0.808716 8.1735 0.808716C8.10338 0.808716 8.03405 0.823464 7.97 0.852002L1.509 3.752C1.45917 3.77586 1.4169 3.81302 1.38684 3.85938C1.35678 3.90573 1.34011 3.95949 1.33867 4.01472C1.33722 4.06995 1.35105 4.12451 1.37863 4.17237C1.40622 4.22024 1.44649 4.25956 1.495 4.286L7.938 7.679C8.00997 7.71812 8.09058 7.73862 8.1725 7.73862C8.25442 7.73862 8.33503 7.71812 8.407 7.679L14.85 4.286C14.8985 4.25947 14.9387 4.22008 14.9662 4.17215C14.9937 4.12423 15.0074 4.06964 15.0059 4.01441C15.0043 3.95918 14.9875 3.90545 14.9574 3.85915C14.9272 3.81284 14.8849 3.77577 14.835 3.752Z" />
<path d="M9.04301 15.774L15.537 12.338C15.5774 12.3112 15.6104 12.2748 15.6331 12.232C15.6558 12.1892 15.6674 12.1414 15.667 12.093V5.429C15.6697 5.38221 15.6601 5.33552 15.6392 5.29359C15.6182 5.25166 15.5867 5.21596 15.5476 5.19006C15.5085 5.16415 15.4634 5.14894 15.4166 5.14595C15.3698 5.14296 15.3231 5.15228 15.281 5.173L8.78701 8.519C8.74073 8.54365 8.70214 8.58059 8.6755 8.62576C8.64886 8.67092 8.63519 8.72257 8.63601 8.775V15.529C8.63442 15.5774 8.64577 15.6253 8.6689 15.6679C8.69203 15.7104 8.7261 15.746 8.76758 15.771C8.80907 15.796 8.85647 15.8094 8.90489 15.8099C8.95331 15.8105 9.00099 15.7981 9.04301 15.774Z" />
<path d="M0.67101 5.428V12.088C0.670579 12.1364 0.682243 12.1842 0.704943 12.227C0.727644 12.2698 0.760664 12.3062 0.80101 12.333L7.29601 15.769C7.33755 15.7933 7.38493 15.8059 7.43307 15.8055C7.48122 15.805 7.52834 15.7915 7.5694 15.7663C7.61046 15.7412 7.64392 15.7053 7.66622 15.6627C7.68851 15.62 7.69881 15.5721 7.69601 15.524V8.771C7.69683 8.71856 7.68317 8.66692 7.65652 8.62175C7.62988 8.57659 7.59129 8.53965 7.54501 8.515L1.05501 5.169C1.01276 5.14923 0.966102 5.14076 0.919596 5.14439C0.87309 5.14802 0.828319 5.16364 0.789646 5.18973C0.750973 5.21581 0.719718 5.25147 0.698927 5.29323C0.678135 5.33498 0.668517 5.38142 0.67101 5.428Z" />
</svg>
);
}

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