Compare commits

...

186 Commits

Author SHA1 Message Date
Erimel
8d91838fab Create toggle 2026-03-02 19:48:26 -05:00
Sapphire
0236a05f26 Allow showing 'Up to date' version for third-party trackers (#1756) 2026-02-25 23:08:31 +01:00
Butterscotch!
28deb357da Revert TrackerResetsHandler & add comments (#1748) 2026-02-20 11:26:23 +01:00
jabberrock
4d93f87a01 Clarify AI policy on contributions (#1752) 2026-02-17 03:59:11 +03:00
Sapphire
88adfce242 Hide tracker firmware version when board type is unknown (#1721) 2026-02-09 21:58:36 +01:00
Sapphire
3d02795dbc Don't trigger timeout when Wi-Fi provisioning is done (#1725)
Co-authored-by: lucas lelievre <loucass003@gmail.com>
2026-02-09 21:57:56 +01:00
Sapphire
7ff50f78eb Don't ask for full reset on timeout with manual or saved mounting (#1727) 2026-02-02 18:06:38 +01:00
Sapphire
0e3aaf105c Display more accurate info for OpenVR devices (#1731) 2026-02-02 18:06:17 +01:00
sctanf
f638540886 TrackerBattery disable tooltip while charging (#1733) 2026-02-02 18:05:50 +01:00
Sapphire
343d69d690 Support feet mounting reset over Protobuf bridge (#1737) 2026-02-02 18:05:31 +01:00
H3
e2d7d354c6 Add ESP32-S2 to USB-Serial Accept-List (#1730)
Co-authored-by: unlogisch04 <98281608+unlogisch04@users.noreply.github.com>
2026-01-29 22:54:37 +03:00
sctanf
cc6f297b92 Re-add missing battery runtime estimate to DataFeedBuilder (#1732) 2026-01-29 14:00:18 +04:00
H114514191981
2add43e71a add CH343 support (#1568)
Co-authored-by: unlogisch04 <98281608+unlogisch04@users.noreply.github.com>
2026-01-28 10:39:25 +02:00
Sapphire
0a493ac345 Fix scheduled resets triggering immediately when delay is unspecified (#1724) 2026-01-25 07:08:25 +02:00
Sapphire
17bb2703d1 Fix unassigned HMD flightlist step never showing (#1723) 2026-01-24 07:34:37 +02:00
Sapphire
f0981bf709 ProtocolAPI: Initialise RPCHandler after other members (#1722) 2026-01-24 01:17:25 +03:00
peelz
99de554c18 Add delay param to ResetRequest (#1712) 2026-01-23 03:38:08 +04:00
Sapphire
f95a4d56d7 Add feet mounting reset keybind (#1717) 2026-01-23 03:14:27 +04:00
Sapphire
1df3c9d322 Hide devices with unknown board type in DIY firmware tool (#1718) 2026-01-23 03:14:12 +04:00
sctanf
e0838cce6c Battery indicators (#1714) 2026-01-23 03:13:36 +04:00
Sapphire
e25d3201c2 Fix translation key for Autobone processing text (#1719) 2026-01-23 03:12:18 +04:00
Sapphire
5d14f14139 Fix alignment of neck and head dots in tracker assignment page (#1720) 2026-01-23 03:11:37 +04:00
Eiren Rain
09e81f5ace Fix trackers table having an extra header 2026-01-19 20:29:23 +01:00
Maya
8f57ef2de4 Migrate core/dev.slimevr.protocol to Kotlin (#1688)
Co-authored-by: Butterscotch! <bscotchvanilla@gmail.com>
2026-01-14 15:50:04 +01:00
loucass003
ea242960b3 Lint 2026-01-12 21:34:19 +01:00
Eiren Rain
35ac14a7de Packet loss (#1687)
Co-authored-by: loucass003 <loucass003@gmail.com>
2026-01-12 21:22:53 +01:00
Aed
690a8b5c6e add manual mounting to stay alligned setup (#1692) 2026-01-08 02:16:08 +01:00
sctanf
255b8b2865 Detect and use tracker PID during HID enumeration (#1556) 2026-01-07 10:13:33 +01:00
Eiren Rain
e27ec63985 Accept fixed tracker accel (#1706) 2026-01-07 08:57:24 +03:00
Butterscotch!
9f8be6551c Accept fixed tracker accel 2026-01-06 22:51:17 -05:00
lucas lelievre
f09cd687c7 Make ignore buttons be session only in checklist (#1675) 2026-01-05 16:21:36 +01:00
lucas lelievre
686499f8dd fix fw tool source (#1690) 2026-01-05 16:20:45 +01:00
Butterscotch!
a3bcc61892 Fix race conditions from Play Store (#1696) 2025-12-26 10:28:39 +01:00
sctanf
faf70c9a39 Add nRF consts (#1685) 2025-12-26 09:26:32 +01:00
sctanf
2aa8d3a056 hid add "unknown" runtime state (#1693) 2025-12-25 16:41:46 +01:00
Meia
23df46ca33 Amplify UI sounds by 8dB (#1694) 2025-12-25 16:41:08 +01:00
lucas lelievre
8407f52777 Better columns width for table view (#1691) 2025-12-19 00:24:28 +01:00
lucas lelievre
b44dcaa9c2 Runtime (#1678) 2025-12-19 00:11:10 +01:00
sctanf
ff0d823aff Merge remote-tracking branch 'upstream/main' into runtime 2025-12-18 10:46:44 -06:00
sctanf
2e8bfa5373 Update solarxr-protocol 2025-12-18 02:35:33 -06:00
sctanf
87940ddd03 TrackerBattery tooltip remove classes 2025-12-18 00:04:07 -06:00
sctanf
6208979ce9 TrackerBattery battery level tooltip if not shown 2025-12-17 23:48:00 -06:00
lucas lelievre
9a27fb1320 separate firmware date from version (#1650) 2025-12-18 06:46:10 +01:00
sctanf
53129328d0 Update solarxr-protocol 2025-12-17 22:59:24 -06:00
lucas lelievre
2d79c5a0e9 Add @ImSapphire as code owner for i18n directory 2025-12-18 05:03:19 +01:00
sctanf
74f5a92ce1 fw date default 2025-12-15 09:16:47 -06:00
sctanf
146930279c add firmware date to new field 2025-12-15 09:16:47 -06:00
sctanf
0c33579858 HIDCommon don't show firmware date in version 2025-12-15 09:16:46 -06:00
sctanf
c9783d097b show voltage in less situations 2025-12-15 09:16:30 -06:00
sctanf
d3eafb8d06 only show runtime if nonzero 2025-12-15 09:16:30 -06:00
sctanf
09d44b51d6 linter borked it 2025-12-15 09:16:30 -06:00
sctanf
cf357e71f5 lint 2025-12-15 09:16:29 -06:00
sctanf
122efacc52 show runtime in gui 2025-12-15 09:16:29 -06:00
sctanf
7f536528d0 Parse runtime from HID tracker 2025-12-15 09:16:28 -06:00
Eiren Rain
3982249ebf Bump actions/upload-artifact from 5 to 6 (#1683) 2025-12-15 17:53:59 +03:00
Eiren Rain
388bea2e72 Bump actions/download-artifact from 6 to 7 (#1684) 2025-12-15 17:53:41 +03:00
dependabot[bot]
921a760817 Bump actions/download-artifact from 6 to 7
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 6 to 7.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v6...v7)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-15 14:12:16 +00:00
dependabot[bot]
55bcec4dda Bump actions/upload-artifact from 5 to 6
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 5 to 6.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-15 14:12:07 +00:00
Eiren Rain
bb08e8dc6a DesktopHID only warn if device cannot open (#1682) 2025-12-15 11:08:44 +03:00
sctanf
a82f950eb6 DesktopHID only warn if device cannot open 2025-12-14 20:52:14 -06:00
Eiren Rain
e2dbaab8ba hid packet 6 and packet 7 (data2) (#1679) 2025-12-14 10:25:49 +03:00
sctanf
3611bb5cc7 hid packet 6 and packet 7 (data2)
this is the worst meme ever
2025-12-13 23:59:36 -06:00
lucas lelievre
f01f599526 New Pontoon translations (#1672) 2025-12-11 20:39:52 +01:00
SlimeVR-bot
6847526ce8 Pontoon/GUI: Update Simplified Chinese (zh-Hans)
Co-authored-by: pwnint <ahndkp@gmail.com> (zh-Hans)
Co-authored-by: 寂听 <jiting@jtcat.com> (zh-Hans)
Co-authored-by: nekomona <nekomona@163.com> (zh-Hans)
2025-12-11 19:03:14 +00:00
SlimeVR-bot
c5f28a6a01 Pontoon/GUI: Update Simplified Chinese (zh-Hans)
Co-authored-by: 寂听 <jiting@jtcat.com> (zh-Hans)
Co-authored-by: Joshh <josh229411@icloud.com> (zh-Hans)
Co-authored-by: pwnint <ahndkp@gmail.com> (zh-Hans)
Co-authored-by: nekomona <nekomona@163.com> (zh-Hans)
2025-12-11 19:03:14 +00:00
lucas lelievre
86d7d5fdc6 Fix tracker set selection (#1668) 2025-12-11 20:02:52 +01:00
lucas lelievre
781f4d489a Better Android signing & Google Play bundle building (#1670) 2025-12-11 19:56:07 +01:00
jabberrock
5a42426048 [Stay Aligned] Fix broken tracker rotations (#1669) 2025-12-11 07:26:12 -05:00
Butterscotch!
44643f2cc6 Rename Google Play artifact 2025-12-11 07:06:02 -05:00
Butterscotch!
d902515f4f Change message 2025-12-11 06:30:40 -05:00
Butterscotch!
f9df08aefd Include all Android tasks for signing & Play CI 2025-12-11 06:27:20 -05:00
Butterscotch!
28b18e0d42 Handle KeyStore secret directly in Gradle 2025-12-11 06:27:20 -05:00
loucass003
247c063791 Lint 2025-12-11 10:11:16 +01:00
lucas lelievre
ab248287cc Update gui/src/components/onboarding/pages/trackers-assign/TrackerAssignOptions.tsx
Co-authored-by: Sapphire <imsapphire0@gmail.com>
2025-12-11 09:44:33 +01:00
lucas lelievre
9a26fc98b8 Update gui/src/components/onboarding/pages/trackers-assign/TrackerAssignOptions.tsx
Co-authored-by: Sapphire <imsapphire0@gmail.com>
2025-12-11 09:44:28 +01:00
loucass003
16a2ac8474 Lint 2025-12-11 09:36:02 +01:00
loucass003
c4acf4cc41 Better selection + only set the prefered once for a new user 2025-12-11 09:30:21 +01:00
loucass003
4b0a2d27d0 Fix tracker set selection 2025-12-11 09:19:25 +01:00
lucas lelievre
2c6708bfe7 Don't show fw update icon when update is blocked (#1667) 2025-12-11 08:35:46 +01:00
Sapphire
2880623cce Fix fw update icon low battery warning 2025-12-11 00:30:54 -06:00
Sapphire
17400ca337 Don't show fw update icon when update is blocked 2025-12-11 00:24:06 -06:00
lucas lelievre
3276f6db7a Fix tooltips on table and reset buttons (#1666) 2025-12-11 06:21:56 +01:00
loucass003
db59537adc Fix tooltips on table and reset buttons 2025-12-11 06:17:05 +01:00
lucas lelievre
4f1fd82923 Tooltip: Better handling of disabled buttons (#1665) 2025-12-11 04:02:12 +01:00
loucass003
f6ccb5970f Lint 2025-12-11 03:57:06 +01:00
loucass003
c937b91267 Better handling of disabled buttons 2025-12-11 03:54:23 +01:00
lucas lelievre
2d1f32b950 Disable R8 optimization for Android (#1664) 2025-12-11 03:28:49 +01:00
Butterscotch!
8acba98bcc Temporarily disable Proguard optimization 2025-12-10 21:23:38 -05:00
lucas lelievre
d7ba1b8335 Fix mobile tooltip (#1662) 2025-12-11 03:13:13 +01:00
lucas lelievre
d20e9bfd94 Fix tiertiary dropdown text color (#1663) 2025-12-11 02:56:37 +01:00
loucass003
3d54a86bd8 Fix tiertiary dropdown text color 2025-12-11 02:54:22 +01:00
loucass003
c9883f5eb4 Fix mobile tooltip 2025-12-11 02:28:09 +01:00
lucas lelievre
8bd36fac25 Increase accent text contrast for ace theme (#1656) 2025-12-11 02:26:43 +01:00
lucas lelievre
ab4d507d9f Snep theme (#1659) 2025-12-11 02:26:26 +01:00
lucas lelievre
9efb985260 Sentry fixes (#1658) 2025-12-11 02:26:10 +01:00
loucass003
2c2c227187 Fix scaled proportions event not triggering 2025-12-11 02:24:00 +01:00
sctanf
63cca6756e lint 2025-12-10 19:07:28 -06:00
lucas lelievre
b0d7fefa5e Only skip server start when CLI arg is passed (#1660) 2025-12-11 02:02:57 +01:00
Butterscotch!
35a5cb47d9 Disable Android obfuscation 2025-12-10 19:07:54 -05:00
lucas lelievre
dfc4383271 Update gui/src/hooks/app.ts
Co-authored-by: Sapphire <imsapphire0@gmail.com>
2025-12-10 21:58:47 +01:00
lucas lelievre
185431a733 Update gui/src/hooks/tracking-checklist.ts
Co-authored-by: Sapphire <imsapphire0@gmail.com>
2025-12-10 21:58:35 +01:00
Sapphire
5b68a01186 Only skip server start when CLI arg is passed 2025-12-10 14:36:56 -06:00
lucas lelievre
2c4dd4085f Remove Ktor dependency (#1655) 2025-12-10 21:34:35 +01:00
sctanf
4d3ff0e9c9 snep 2025-12-10 11:42:16 -06:00
loucass003
ee6182bb23 lint 2025-12-10 17:15:07 +01:00
loucass003
9576d6e034 Sentry fixes 2025-12-10 17:12:25 +01:00
lucas lelievre
227ddc87d2 Increment Android version code and log config (#1657) 2025-12-10 13:51:46 +01:00
Butterscotch!
b3b7730b2c Increment Android version code and log config 2025-12-10 07:14:54 -05:00
Butterscotch!
075a155f13 Increase accent text contrast for ace theme 2025-12-10 05:31:43 -05:00
Butterscotch!
79a3b66e43 Fix formatting 2025-12-10 05:08:29 -05:00
lucas lelievre
fe58968718 New Pontoon translations (#1654) 2025-12-10 09:38:53 +01:00
Butterscotch!
276e73e724 Remove Ktor dependency 2025-12-10 00:39:27 -05:00
SlimeVR-bot
01dd916498 Pontoon/GUI: Update Thai (th)
Co-authored-by: YumeTomo <Sodnoobe@gmail.com> (th)
2025-12-09 20:00:05 +00:00
SlimeVR-bot
6ebf9792ac Pontoon/GUI: Update Thai (th)
Co-authored-by: YumeTomo <Sodnoobe@gmail.com> (th)
2025-12-09 16:30:06 +00:00
SlimeVR-bot
02f8195b5b Pontoon/GUI: Update Thai (th)
Co-authored-by: YumeTomo <Sodnoobe@gmail.com> (th)
2025-12-09 15:26:14 +00:00
SlimeVR-bot
7b4946f41d Pontoon/GUI: Update Thai (th)
Co-authored-by: YumeTomo <Sodnoobe@gmail.com> (th)
2025-12-09 15:26:14 +00:00
SlimeVR-bot
5f4c90128f Pontoon/GUI: Update German (de)
Co-authored-by: Patty <pattycoder@gmx.de> (de)
Co-authored-by: unlogisch <unlogisch@gmx.ch> (de)
2025-12-09 15:26:14 +00:00
SlimeVR-bot
6a2a30e319 Pontoon/GUI: Update Dutch (nl), German (de)
Co-authored-by: Nola <stefsecretdesecret@gmail.com> (nl)
Co-authored-by: Joshh <josh229411@icloud.com> (nl)
Co-authored-by: Vyolex <25586367+Vyolex@users.noreply.github.com> (nl)
Co-authored-by: Smeltie <martijnklerks123@gmail.com> (nl)
Co-authored-by: C0D3 M4513R <mail@c0d3m4513r.com> (de)
Co-authored-by: Patty <pattycoder@gmx.de> (de)
Co-authored-by: unlogisch <unlogisch@gmx.ch> (de)
Co-authored-by: stephaniegoldschmidt9 <stephaniegoldschmidt9@gmail.com> (de)
2025-12-09 15:26:14 +00:00
SlimeVR-bot
8a5f27e8d9 Pontoon/GUI: Update 28 localizations 2025-12-09 15:26:14 +00:00
lucas lelievre
199bec40e1 Build and sign release APK (#1653) 2025-12-09 16:25:49 +01:00
lucas lelievre
9d32220275 Merge branch 'main' into bscotch/android-signing-ci 2025-12-09 14:51:16 +01:00
lucas lelievre
8b689d6df8 Android fixes & update (#1648) 2025-12-09 14:50:59 +01:00
Butterscotch!
490005ae69 Merge remote-tracking branch 'upstream/main' into bscotch/android-fixes 2025-12-09 07:53:46 -05:00
Butterscotch!
575778ab85 Don't fail for keystore 2025-12-09 07:25:54 -05:00
Butterscotch!
85ee162d58 Remove unused import 2025-12-09 07:18:26 -05:00
Butterscotch!
712fa6a1ad Avoid Android Gradle project for desktop tests 2025-12-09 02:55:12 -05:00
Butterscotch!
819481adcd Early fail for keystore issues 2025-12-09 02:36:21 -05:00
Butterscotch!
bc26227443 Build and sign release with Gradle 2025-12-09 02:36:21 -05:00
lucas lelievre
ac43ca947e New Pontoon translations (#1646) 2025-12-09 05:25:55 +01:00
SlimeVR-bot
4451d8aaf4 Pontoon/GUI: Update Thai (th)
Co-authored-by: YumeTomo <Sodnoobe@gmail.com> (th)
2025-12-09 04:25:34 +00:00
SlimeVR-bot
79a9e15c5a Pontoon/GUI: Update Thai (th), German (de)
Co-authored-by: YumeTomo <Sodnoobe@gmail.com> (th)
Co-authored-by: Cusmo84 <saopob@gmail.com> (th)
Co-authored-by: unlogisch <unlogisch@gmx.ch> (de)
Co-authored-by: Patty <pattycoder@gmx.de> (de)
2025-12-09 04:25:34 +00:00
SlimeVR-bot
5403cdb28e Pontoon/GUI: Update Thai (th)
Co-authored-by: YumeTomo <Sodnoobe@gmail.com> (th)
2025-12-09 04:25:34 +00:00
SlimeVR-bot
272f37374e Pontoon/GUI: Update Thai (th), German (de)
Co-authored-by: Kaiera huzu <patsakorn9090@gmail.com> (th)
Co-authored-by: SparklingSakura <natthakitw.2006@gmail.com> (th)
Co-authored-by: YumeTomo <Sodnoobe@gmail.com> (th)
Co-authored-by: Patty <pattycoder@gmx.de> (de)
Co-authored-by: unlogisch <unlogisch@gmx.ch> (de)
Co-authored-by: Zahnatom <zahnatomletsplay@gmail.com> (de)
2025-12-09 04:25:34 +00:00
SlimeVR-bot
4147578dc8 Pontoon/GUI: Update Thai (th), German (de)
Co-authored-by: YumeTomo <Sodnoobe@gmail.com> (th)
Co-authored-by: Patty <pattycoder@gmx.de> (de)
Co-authored-by: TheDevMinerTV <devminer@devminer.xyz> (de)
2025-12-09 04:25:34 +00:00
SlimeVR-bot
65bd03c272 Pontoon/GUI: Update Thai (th)
Co-authored-by: YumeTomo <Sodnoobe@gmail.com> (th)
2025-12-09 04:25:34 +00:00
SlimeVR-bot
4835e89c5f Pontoon/GUI: Update Thai (th)
Co-authored-by: YumeTomo <Sodnoobe@gmail.com> (th)
2025-12-09 04:25:34 +00:00
SlimeVR-bot
7ea4516545 Pontoon/GUI: Update Thai (th)
Co-authored-by: YumeTomo <Sodnoobe@gmail.com> (th)
2025-12-09 04:25:34 +00:00
SlimeVR-bot
2f208fe08a Pontoon/GUI: Update Thai (th)
Co-authored-by: YumeTomo <Sodnoobe@gmail.com> (th)
2025-12-09 04:25:34 +00:00
SlimeVR-bot
db584baed3 Pontoon/GUI: Update Thai (th)
Co-authored-by: YumeTomo <Sodnoobe@gmail.com> (th)
2025-12-09 04:25:34 +00:00
SlimeVR-bot
1d41627fb1 Pontoon/GUI: Update Thai (th)
Co-authored-by: YumeTomo <Sodnoobe@gmail.com> (th)
Co-authored-by: Kaiera huzu <patsakorn9090@gmail.com> (th)
2025-12-09 04:25:34 +00:00
SlimeVR-bot
63b8d4c8cb Pontoon/GUI: Update Thai (th)
Co-authored-by: YumeTomo <Sodnoobe@gmail.com> (th)
Co-authored-by: Kaiera huzu <patsakorn9090@gmail.com> (th)
2025-12-09 04:25:34 +00:00
SlimeVR-bot
8e60ecd070 Pontoon/GUI: Update Thai (th)
Co-authored-by: YumeTomo <Sodnoobe@gmail.com> (th)
2025-12-09 04:25:34 +00:00
SlimeVR-bot
6ee173791e Pontoon/GUI: Update Thai (th)
Co-authored-by: YumeTomo <Sodnoobe@gmail.com> (th)
Co-authored-by: Kaiera huzu <patsakorn9090@gmail.com> (th)
2025-12-09 04:25:34 +00:00
SlimeVR-bot
b9d72c0a40 Pontoon/GUI: Update Thai (th)
Co-authored-by: YumeTomo <Sodnoobe@gmail.com> (th)
2025-12-09 04:25:34 +00:00
SlimeVR-bot
36b2e01d88 Pontoon/GUI: Update Thai (th)
Co-authored-by: YumeTomo <Sodnoobe@gmail.com> (th)
2025-12-09 04:25:34 +00:00
SlimeVR-bot
569315f6dc Pontoon/GUI: Update Thai (th)
Co-authored-by: YumeTomo <Sodnoobe@gmail.com> (th)
2025-12-09 04:25:34 +00:00
SlimeVR-bot
a4fab8afed Pontoon/GUI: Update Thai (th)
Co-authored-by: YumeTomo <Sodnoobe@gmail.com> (th)
2025-12-09 04:25:34 +00:00
SlimeVR-bot
d1e3c35693 Pontoon/GUI: Update Thai (th)
Co-authored-by: YumeTomo <Sodnoobe@gmail.com> (th)
2025-12-09 04:25:34 +00:00
SlimeVR-bot
d12f3c4854 Pontoon/GUI: Update Polish (pl)
Co-authored-by: Yexo <patrykcyranski@gmail.com> (pl)
Co-authored-by: ReDoX <redox01@o2.pl> (pl)
2025-12-09 04:25:34 +00:00
SlimeVR-bot
e32903f36f Pontoon/GUI: Update Polish (pl)
Co-authored-by: Yexo <patrykcyranski@gmail.com> (pl)
2025-12-09 04:25:34 +00:00
SlimeVR-bot
ab126c336c Pontoon/GUI: Update Polish (pl)
Co-authored-by: Yexo <patrykcyranski@gmail.com> (pl)
2025-12-09 04:25:34 +00:00
SlimeVR-bot
79a6d62506 Pontoon/GUI: Update Polish (pl)
Co-authored-by: Yexo <patrykcyranski@gmail.com> (pl)
2025-12-09 04:25:34 +00:00
SlimeVR-bot
08f691b5b6 Pontoon/GUI: Update Polish (pl)
Co-authored-by: Yexo <patrykcyranski@gmail.com> (pl)
2025-12-09 04:25:34 +00:00
SlimeVR-bot
b12632fd1a Pontoon/GUI: Update Polish (pl)
Co-authored-by: Yexo <patrykcyranski@gmail.com> (pl)
Co-authored-by: ReDoX <redox01@o2.pl> (pl)
2025-12-09 04:25:34 +00:00
SlimeVR-bot
54f3ab4634 Pontoon/GUI: Update Polish (pl)
Co-authored-by: Yexo <patrykcyranski@gmail.com> (pl)
2025-12-09 04:25:34 +00:00
SlimeVR-bot
415168d040 Pontoon/GUI: Update Traditional Chinese (zh-Hant)
Co-authored-by: Meow Wei <medicalwei@gmail.com> (zh-Hant)
2025-12-09 04:25:34 +00:00
SlimeVR-bot
6be313144e Pontoon/GUI: Update Traditional Chinese (zh-Hant)
Co-authored-by: Meow Wei <medicalwei@gmail.com> (zh-Hant)
2025-12-09 04:25:34 +00:00
SlimeVR-bot
98e571c94b Pontoon/GUI: Update Traditional Chinese (zh-Hant)
Co-authored-by: Meow Wei <medicalwei@gmail.com> (zh-Hant)
2025-12-09 04:25:34 +00:00
SlimeVR-bot
1561c464e9 Pontoon/GUI: Update Traditional Chinese (zh-Hant)
Co-authored-by: Meow Wei <medicalwei@gmail.com> (zh-Hant)
2025-12-09 04:25:34 +00:00
SlimeVR-bot
4992d599aa Pontoon/GUI: Update Thai (th)
Co-authored-by: YumeTomo <Sodnoobe@gmail.com> (th)
2025-12-09 04:25:34 +00:00
lucas lelievre
90b3dfe0db v18.0rc1 fixes (#1651) 2025-12-09 05:25:07 +01:00
lucas lelievre
ab87c5b1e8 Update gui/src/hooks/crypto.ts
Co-authored-by: Butterscotch! <bscotchvanilla@gmail.com>
2025-12-09 04:46:35 +01:00
lucas lelievre
3ee6c065cf Disable root overscroll (#1652) 2025-12-09 04:41:25 +01:00
lucas lelievre
d1249d2b44 Apply suggestions from code review
Co-authored-by: Sapphire <imsapphire0@gmail.com>
2025-12-09 04:37:12 +01:00
Butterscotch!
94a70d3b2e Update Ktor to latest 2.3.X version 2025-12-08 21:50:53 -05:00
Butterscotch!
b67162eb43 Revert Ktor version update 2025-12-08 21:47:00 -05:00
Lasse Lauwerys
4390d35e00 Disable root overscroll 2025-12-09 02:37:13 +01:00
lucas lelievre
19126c0d4d Update gui/public/i18n/en/translation.ftl
Co-authored-by: Maya <jovannmc@femboyfurry.net>
2025-12-08 09:51:43 +01:00
lucas lelievre
0cf0f6cb49 Update gui/public/i18n/en/translation.ftl
Co-authored-by: Maya <jovannmc@femboyfurry.net>
2025-12-08 09:51:36 +01:00
lucas lelievre
d3d3838761 Update gui/src/components/onboarding/pages/WifiCreds.tsx
Co-authored-by: Maya <jovannmc@femboyfurry.net>
2025-12-08 09:47:15 +01:00
loucass003
4984026f6b Lint 2025-12-08 09:28:09 +01:00
loucass003
bb7e825c41 Remove confusion with dongles in the Connect page 2025-12-08 09:25:03 +01:00
loucass003
bc96ddd555 More fixes and metrics 2025-12-08 05:40:33 +01:00
loucass003
ec85284f78 Lint 2025-12-08 05:31:57 +01:00
loucass003
867287e740 More sentry metrics 2025-12-08 05:25:07 +01:00
loucass003
2e93187021 More sentry metrics 2025-12-08 05:12:05 +01:00
loucass003
2a19d67974 Make sentry report anonymous unique user ids so we can count release adoption 2025-12-08 04:28:00 +01:00
loucass003
176f7e4271 Round one of fixes 2025-12-08 03:39:49 +01:00
Butterscotch!
3a6c60d912 Only get GUI port once 2025-12-07 05:23:03 -05:00
Butterscotch!
066c28adb4 Use randomized Android GUI port 2025-12-07 05:20:13 -05:00
Butterscotch!
364ed3209c Prevent Android GUI race condition 2025-12-07 05:12:56 -05:00
Butterscotch!
dab6ec28af Simpler bytesSkipped check 2025-12-07 04:53:09 -05:00
Butterscotch!
b221250ba7 More Gradle cleanup 2025-12-07 04:48:09 -05:00
Butterscotch!
215635634f Update Android versions & Proguard settings 2025-12-07 04:43:15 -05:00
Butterscotch!
184133a613 Fix OTA upload socket not being closed 2025-12-07 04:22:01 -05:00
Butterscotch!
32248c75cf Fix Android SDK level errors 2025-12-07 04:21:37 -05:00
177 changed files with 4729 additions and 3643 deletions

2
.github/CODEOWNERS vendored
View File

@@ -10,7 +10,7 @@
/pnpm-workspace.yaml @loucass003
# loucass003 and Erimel responsible for i18n
/gui/public/i18n/ @loucass003 @Erimelowo
/gui/public/i18n/ @loucass003 @Erimelowo @ImSapphire
/gui/src/i18n/ @loucass003 @Erimelowo
/l10n.toml @loucass003 @Erimelowo

View File

@@ -103,7 +103,7 @@ jobs:
- if: startsWith(matrix.os, 'windows')
name: Upload a Build Artifact (Windows)
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
# Artifact name
name: ${{ format('SlimeVR-GUI-Windows-{0}', env.BUILD_ARCH) }}
@@ -112,7 +112,7 @@ jobs:
- if: startsWith(matrix.os, 'ubuntu')
name: Upload a Build Artifact (Linux)
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
# Artifact name
name: ${{ format('SlimeVR-GUI-Linux-{0}', env.BUILD_ARCH) }}
@@ -121,7 +121,7 @@ jobs:
- if: matrix.os == 'macos-latest'
name: Upload a Build Artifact (macOS)
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
# Artifact name
name: SlimeVR-GUI-macOS

View File

@@ -20,7 +20,7 @@ jobs:
run: |
npx @slimevr/update-manifest-generator@latest
- uses: actions/upload-artifact@v5
- uses: actions/upload-artifact@v6
with:
name: "update-manifest.json"
path: ./update-manifest.json

View File

@@ -65,10 +65,10 @@ jobs:
uses: gradle/actions/setup-gradle@v5
- name: Build with Gradle
run: ./gradlew shadowJar
run: ./gradlew :server:desktop:shadowJar
- name: Upload the Server JAR as a Build Artifact
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
# Artifact name
name: 'SlimeVR-Server' # optional, default is artifact
@@ -113,16 +113,21 @@ jobs:
- name: Install dependencies
run: pnpm i
- name: Build
- name: Build GUI
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
run: cd gui && pnpm run build
- name: Build with Gradle
run: ./gradlew :server:android:assembleDebug
run: ./gradlew :server:android:build
env:
ANDROID_STORE_FILE: ${{ secrets.ANDROID_STORE_FILE }}
ANDROID_STORE_PASSWD: ${{ secrets.ANDROID_STORE_PASSWD }}
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
ANDROID_KEY_PASSWD: ${{ secrets.ANDROID_KEY_PASSWD }}
- name: Upload the Android Build Artifact
uses: actions/upload-artifact@v5
- name: Upload the Android build artifact
uses: actions/upload-artifact@v6
with:
# Artifact name
name: 'SlimeVR-Android' # optional, default is artifact
@@ -132,7 +137,7 @@ jobs:
- name: Prepare for release
if: startsWith(github.ref, 'refs/tags/')
run: |
cp server/android/build/outputs/apk/debug/android-debug.apk ./SlimeVR-android.apk
cp server/android/build/outputs/apk/release/android-release.apk ./SlimeVR-android.apk
- name: Upload to draft release
uses: softprops/action-gh-release@v2
@@ -143,6 +148,24 @@ jobs:
files: |
./SlimeVR-android.apk
- name: Build Google Play release bundle
if: startsWith(github.ref, 'refs/tags/')
run: ./gradlew :server:android:bundleRelease
env:
ANDROID_STORE_FILE: ${{ secrets.ANDROID_GPLAY_STORE_FILE }}
ANDROID_STORE_PASSWD: ${{ secrets.ANDROID_GPLAY_STORE_PASSWD }}
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_GPLAY_KEY_ALIAS }}
ANDROID_KEY_PASSWD: ${{ secrets.ANDROID_GPLAY_KEY_PASSWD }}
- name: Upload the Google Play artifact
uses: actions/upload-artifact@v6
if: startsWith(github.ref, 'refs/tags/')
with:
# Artifact name
name: 'SlimeVR-Android-GPDev' # optional, default is artifact
# A file, directory or wildcard pattern that describes what to upload
path: server/android/build/outputs/bundle/release/*
bundle-linux:
strategy:
matrix:
@@ -158,7 +181,7 @@ jobs:
with:
submodules: recursive
- uses: actions/download-artifact@v6
- uses: actions/download-artifact@v7
with:
name: 'SlimeVR-Server'
path: server/desktop/build/libs/
@@ -207,23 +230,23 @@ jobs:
run: |
tar czf slimevr-gui-dist.tar.gz -C gui/dist/ .
- uses: actions/upload-artifact@v5
- uses: actions/upload-artifact@v6
if: matrix.os == 'ubuntu-latest'
with:
name: SlimeVR-GUI-Dist
path: ./slimevr-gui-dist.tar.gz
- uses: actions/upload-artifact@v5
- uses: actions/upload-artifact@v6
with:
name: ${{ format('SlimeVR-GUI-Deb-{0}', env.BUILD_ARCH) }}
path: target/release/bundle/deb/slimevr*.deb
- uses: actions/upload-artifact@v5
- uses: actions/upload-artifact@v6
with:
name: ${{ format('SlimeVR-GUI-AppImage-{0}', env.BUILD_ARCH) }}
path: target/release/bundle/appimage/slimevr*.AppImage
- uses: actions/upload-artifact@v5
- uses: actions/upload-artifact@v6
with:
name: ${{ format('SlimeVR-GUI-RPM-{0}', env.BUILD_ARCH) }}
path: target/release/bundle/rpm/slimevr*.rpm
@@ -256,7 +279,7 @@ jobs:
with:
submodules: recursive
- uses: actions/download-artifact@v6
- uses: actions/download-artifact@v7
with:
name: 'SlimeVR-Server'
path: server/desktop/build/libs/
@@ -297,12 +320,12 @@ jobs:
--volicon ../macos/SlimeVR.app/Contents/Resources/icon.icns --skip-jenkins \
--eula ../../../../../LICENSE-MIT slimevr.dmg ../macos/SlimeVR.app
- uses: actions/upload-artifact@v5
- uses: actions/upload-artifact@v6
with:
name: SlimeVR-GUI-MacApp
path: target/universal-apple-darwin/release/bundle/macos/SlimeVR*.app
- uses: actions/upload-artifact@v5
- uses: actions/upload-artifact@v6
with:
name: SlimeVR-GUI-MacDmg
path: target/universal-apple-darwin/release/bundle/dmg/slimevr.dmg
@@ -336,7 +359,7 @@ jobs:
with:
submodules: recursive
- uses: actions/download-artifact@v6
- uses: actions/download-artifact@v7
with:
name: 'SlimeVR-Server'
path: server/desktop/build/libs/
@@ -376,7 +399,7 @@ jobs:
cp target/release/slimevr.exe ./SlimeVR/
7z a -tzip "SlimeVR-$BUILD_ARCH.zip" ./SlimeVR/
- uses: actions/upload-artifact@v5
- uses: actions/upload-artifact@v6
with:
name: ${{ format('SlimeVR-GUI-Windows-{0}', env.BUILD_ARCH) }}
path: ./SlimeVR*.zip

View File

@@ -116,3 +116,9 @@ licensed under `GPL-v3`.
## Discord
We use discord *a lot* to coordinate and discuss development. Come join us at
https://discord.gg/SlimeVR!
## Use of AI
We DO NOT accept contributions that are generated with AI (for example, "vibe-coding").
If you do use AI, and you believe your usage of AI is reasonable, you must clearly disclose
how you used AI in your submission.

View File

@@ -12,7 +12,7 @@
"@react-hookz/deep-equal": "^3.0.3",
"@react-three/drei": "^9.114.3",
"@react-three/fiber": "^8.17.10",
"@sentry/react": "^9.9.0",
"@sentry/react": "10.29.0",
"@sentry/vite-plugin": "^2.22.7",
"@tailwindcss/typography": "^0.5.15",
"@tanstack/react-query": "^5.48.0",
@@ -20,8 +20,8 @@
"@tauri-apps/plugin-dialog": "^2.0.0",
"@tauri-apps/plugin-fs": "2.4.1",
"@tauri-apps/plugin-http": "^2.5.0",
"@tauri-apps/plugin-opener": "^2.4.0",
"@tauri-apps/plugin-log": "~2",
"@tauri-apps/plugin-opener": "^2.4.0",
"@tauri-apps/plugin-os": "^2.0.0",
"@tauri-apps/plugin-shell": "^2.3.0",
"@tauri-apps/plugin-store": "^2.4.1",
@@ -52,6 +52,7 @@
"ts-pattern": "^5.4.0",
"typescript": "^5.6.3",
"use-double-tap": "^1.3.6",
"uuid": "^13.0.0",
"yup": "^1.4.0"
},
"scripts": {
@@ -71,7 +72,7 @@
},
"devDependencies": {
"@dword-design/eslint-plugin-import-alias": "^4.0.9",
"@openapi-codegen/cli": "^2.0.2",
"@openapi-codegen/cli": "^3.1.0",
"@openapi-codegen/typescript": "^8.0.2",
"@stylistic/eslint-plugin": "^5.5.0",
"@tailwindcss/forms": "^0.5.9",
@@ -84,19 +85,18 @@
"@types/react-modal": "3.16.3",
"@types/semver": "^7.5.8",
"@types/three": "^0.163.0",
"@typescript-eslint/eslint-plugin": "^7.18.0",
"@typescript-eslint/parser": "^7.18.0",
"@typescript-eslint/eslint-plugin": "^8.48.1",
"@typescript-eslint/parser": "^8.48.1",
"@vitejs/plugin-react": "^4.3.2",
"autoprefixer": "^10.4.20",
"cross-env": "^7.0.3",
"dotenv": "^16.4.5",
"eslint": "^9.39.0",
"eslint-config-airbnb": "^19.0.4",
"eslint": "^9.39.1",
"eslint-import-resolver-typescript": "^3.10.1",
"eslint-plugin-import": "^2.32.0",
"eslint-plugin-jsx-a11y": "^6.10.2",
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-hooks": "^4.6.2",
"eslint-plugin-react-hooks": "^7.0.1",
"globals": "^15.10.0",
"prettier": "^3.3.3",
"rollup-plugin-visualizer": "^5.12.0",

View File

@@ -814,11 +814,6 @@ onboarding-setup_warning-cancel = متابعة الإعداد
## Wi-Fi setup
onboarding-wifi_creds-back = العودة إلى المقدمة
onboarding-wifi_creds = إدخل بيانات اعتماد واي فاي
# This cares about multilines
onboarding-wifi_creds-description =
ستستخدم أجهزة التعقب بيانات الاعتماد هذه للاتصال لاسلكيًا.
الرجاء استخدام بيانات الاعتماد التي تتصل بها حاليًا.
onboarding-wifi_creds-skip = تخطى إعدادات واي فاي
onboarding-wifi_creds-submit = إرسال!
onboarding-wifi_creds-ssid =
@@ -1269,3 +1264,6 @@ unknown_device-modal-forget = تجاهلها
## Error collection consent modal
## Tracking checklist section

View File

@@ -784,11 +784,6 @@ onboarding-setup_warning-cancel = Pokračovat v nastavení
## Wi-Fi setup
onboarding-wifi_creds-back = Zpět na úvod
onboarding-wifi_creds = Zadání přihlašovacích údajů k Wi-Fi
# This cares about multilines
onboarding-wifi_creds-description =
Sledovací zařízení budou tato přihlašovací údaje používat k připojení.
Použijte prosím přihlašovací údaje, ke kterým jste aktuálně připojeni.
onboarding-wifi_creds-skip = Přeskočit nastavení Wi-Fi
onboarding-wifi_creds-submit = Odeslat!
onboarding-wifi_creds-ssid =
@@ -1274,3 +1269,6 @@ error_collection_modal-description_v2 =
Tohle lze později změnit v sekci Chování v nastavení.
error_collection_modal-confirm = Souhlasím
error_collection_modal-cancel = Nesouhlasím
## Tracking checklist section

View File

@@ -483,11 +483,6 @@ onboarding-setup_warning-cancel = Fortsæt konfigurationen
## Wi-Fi setup
onboarding-wifi_creds-back = Gå tilbage til introduktion
onboarding-wifi_creds = Indtast Wi-Fi-oplysninger
# This cares about multilines
onboarding-wifi_creds-description =
Trackerne bruger disse oplysninger til at oprette forbindelse trådløst.
Brug de oplysninger, du i øjeblikket har forbindelse til.
onboarding-wifi_creds-skip = Spring Wi-Fi-indstillinger over
onboarding-wifi_creds-submit = Færdig!
onboarding-wifi_creds-ssid =
@@ -656,3 +651,6 @@ home-no_trackers = Ingen trackere registreret eller tildelt
## Error collection consent modal
## Tracking checklist section

View File

@@ -33,6 +33,10 @@ tips-failed_webgl = Fehler beim Initialisieren von WebGL.
## Units
unit-meter = Meter
unit-foot = Fuß
unit-inch = Zoll
unit-cm = Zentimeter
## Body parts
@@ -116,6 +120,9 @@ board_type-GLOVE_IMU_SLIMEVR_DEV = SlimeVR Dev-IMU-Handschuh
skeleton_bone-NONE = Keine
skeleton_bone-HEAD = Kopfverschiebung
skeleton_bone-HEAD-desc =
Dies ist der Abstand von Ihrem Headset zur Mitte Ihres Kopfes.
Um ihn anzupassen, bewegen Sie den Kopf von links nach rechts, als würden Sie „nein“ sagen. Ändern Sie den Wert so lange, bis sich die anderen Tracker nicht mehr mitbewegen.
skeleton_bone-NECK = Halslänge
skeleton_bone-NECK-desc =
Dies ist der Abstand von der Mitte Ihres Kopfes bis zum Ansatz Ihres Nackens.
@@ -133,6 +140,9 @@ skeleton_bone-CHEST_OFFSET-desc =
Dies kann angepasst werden, um Ihren virtuellen Brust-Tracker nach oben oder unten zu verschieben, um
die Kalibrierung in bestimmten Spielen oder Anwendungen zu unterstützen, die möglicherweise einen höheren oder niedrigeren Wert erwarten.
skeleton_bone-CHEST = Brustabstand
skeleton_bone-CHEST-desc =
Dies ist der Abstand vom Ansatz der Brust bis zur Mitte Ihrer Wirbelsäule.
Passen Sie zunächst Ihre Rumpflänge korrekt an und verändern Sie dann diesen Wert in verschiedenen Positionen (z.B. im Sitzen, beim Bücken oder Liegen), bis Ihre virtuelle Wirbelsäule mit Ihrer echten übereinstimmt.
skeleton_bone-WAIST = Taillenabstand
skeleton_bone-HIP = Hüftlänge
skeleton_bone-HIP_OFFSET = Hüftversatz
@@ -166,7 +176,10 @@ reset-reset_all_warning_default-v2 =
reset-full = Reset
reset-mounting = Befestigungs-Reset
reset-mounting-feet = Fuß-Befestigungs-Reset
reset-mounting-fingers = Fingerkalibrierung
reset-yaw = Horizontaler Reset
reset-error-no_feet_tracker = Kein Fußtracker zugewiesen
reset-error-no_fingers_tracker = Kein Fingertracker zugewiesen
## Serial detection stuff
@@ -211,7 +224,7 @@ widget-drift_compensation-clear = Driftkompensation zurücksetzen
## Widget: Clear Mounting calibration
widget-clear_mounting = Befestigungs-Reset zurücksetzen
widget-clear_mounting = Tracker-Ausrichtung zurücksetzen
## Widget: Developer settings
@@ -275,7 +288,7 @@ tracker-rotation-back = Hinten
tracker-rotation-back_left = Hinten-Links
tracker-rotation-back_right = Hinten-Rechts
tracker-rotation-custom = Benutzerdefiniert
tracker-rotation-overriden = (von Befestigungs-Reset überschrieben)
tracker-rotation-overriden = (von der Tracker-Ausrichtung überschrieben)
## Tracker information
@@ -327,9 +340,11 @@ tracker-settings-name_section-label = Trackername
tracker-settings-forget = Tracker Vergessen
tracker-settings-forget-description = Entfernt den Tracker vom SlimeVR Server und verhindert, dass er sich wieder verbindet, bis der Server neu gestartet wurde. Die Konfiguration des Trackers geht nicht verloren.
tracker-settings-forget-label = Tracker Vergessen
tracker-settings-update-unavailable-v2 = Keine Veröffentlichungen gefunden
tracker-settings-update-incompatible = Update nicht möglich. Board inkompatibel
tracker-settings-update-low-battery = Aktualisierung nicht möglich. Akku unter 50 %
tracker-settings-update-up_to_date = Auf dem neusten Stand
tracker-settings-update-blocked = Update nicht verfügbar. Weitere Veröffentlichungen sind nicht verfügbar.
tracker-settings-update = Jetzt aktualisieren
tracker-settings-update-title = Firmware-Version
@@ -409,6 +424,8 @@ settings-sidebar-osc_vmc = VMC
settings-sidebar-utils = Werkzeuge
settings-sidebar-serial = Serielle Konsole
settings-sidebar-appearance = Erscheinungsbild
settings-sidebar-home = Startbildschirm
settings-sidebar-checklist = Tracking-Checkliste
settings-sidebar-notifications = Benachrichtigungen
settings-sidebar-behavior = Verhalten
settings-sidebar-firmware-tool = DIY Firmware-Tool
@@ -484,20 +501,29 @@ settings-general-tracker_mechanics-drift_compensation_warning-cancel = Abbrechen
settings-general-tracker_mechanics-drift_compensation_warning-done = Ich verstehe
settings-general-tracker_mechanics-drift_compensation-amount-label = Kompensierungsmenge
settings-general-tracker_mechanics-drift_compensation-max_resets-label = Nutze die letzten x Resets
settings-general-tracker_mechanics-save_mounting_reset = Automatische Befestigungs-Reset Kalibrierung speichern
settings-general-tracker_mechanics-save_mounting_reset = Automatische Tracker-Ausrichtung speichern
settings-general-tracker_mechanics-save_mounting_reset-description =
Speichert die automatische Befestigungs-Reset Kalibrierung für die Tracker zwischen den Neustarts. Nützlich
Speichert die automatische Tracker-Ausrichtung für die Tracker zwischen den Neustarts. Nützlich
wenn Sie einen Anzug tragen, bei dem sich die Tracker zwischen den Sitzungen nicht bewegen. <b>Für normale Benutzer nicht zu empfehlen!</b>
settings-general-tracker_mechanics-save_mounting_reset-enabled-label = Befestigungs-Reset speichern
settings-general-tracker_mechanics-save_mounting_reset-enabled-label = Tracker-Ausrichtung speichern
settings-general-tracker_mechanics-use_mag_on_all_trackers = Verwende das Magnetometer auf allen IMU-Trackern, die dies unterstützen.
settings-general-tracker_mechanics-use_mag_on_all_trackers-description =
Verwendet das Magnetometer auf allen Trackern, die über eine kompatible Firmware verfügen, um den Drift in stabilen magnetischen Umgebungen zu reduzieren.
Kann pro Tracker in den Einstellungen des Trackers deaktiviert werden. <b>Bitte schalten Sie keinen der Tracker aus, während Sie dies umschalten!</b>
settings-general-tracker_mechanics-use_mag_on_all_trackers-label = Magnetometer auf Trackern verwenden
settings-stay_aligned = Stay Aligned
settings-stay_aligned-description = Stay Aligned reduziert Drift, indem es deine Tracker schrittweise an deine entspannten Posen anpasst.
settings-stay_aligned-setup-label = Stay Aligned einrichten
settings-stay_aligned-setup-description = Sie müssen Stay Aligned einrichten, um es zu aktivieren.
settings-stay_aligned-warnings-drift_compensation = ⚠ Bitte schalten Sie die Driftkompensation aus! Diese steht in Konflikt mit Stay Aligned.
settings-stay_aligned-enabled-label = Tracker anpassen
settings-stay_aligned-general-label = Allgemein
settings-stay_aligned-relaxed_poses-label = Entspannte Posen
settings-stay_aligned-relaxed_poses-save_pose = Pose speichern
settings-stay_aligned-relaxed_poses-reset_pose = Pose zurücksetzen
settings-stay_aligned-relaxed_poses-close = Schließen
settings-stay_aligned-debug-label = Debuggen
settings-stay_aligned-debug-description = Bitte geben Sie Ihre Einstellungen mit an, wenn Sie Probleme mit Stay Aligned melden.
settings-stay_aligned-debug-copy-label = Einstellungen in die Zwischenablage kopieren
## FK/Tracking settings
@@ -525,17 +551,19 @@ settings-general-fk_settings-enforce_joint_constraints-enforce_constraints = Gre
settings-general-fk_settings-enforce_joint_constraints-enforce_constraints-description = Verhindert, dass sich Gelenke über ihre Grenzen hinaus drehen
settings-general-fk_settings-enforce_joint_constraints-correct_constraints = Mit Grenzen korrigieren
settings-general-fk_settings-enforce_joint_constraints-correct_constraints-description = Korrigiert Gelenkrotationen, wenn diese über ihre Grenzen hinausgehen
settings-general-fk_settings-ik = Positionsdaten
settings-general-fk_settings-ik-use_position = Positionsdaten verwenden
settings-general-fk_settings-arm_fk = Arm-Tracking
settings-general-fk_settings-arm_fk-description = Ändern Sie die Art und Weise, wie die Arme berechnet werden.
settings-general-fk_settings-arm_fk-force_arms = Arme vom VR-Headset erzwingen
settings-general-fk_settings-reset_settings = Einstellungen zurücksetzen
settings-general-fk_settings-reset_settings-reset_hmd_pitch-description = Setzen Sie die Neigung (vertikale Drehung) Ihres Headsets zurück, wenn Sie einen vollständigen Reset durchführen. Nützlich, wenn Sie ein Headset auf der Stirn für VTubing oder Mocap tragen. Nicht für VR aktivieren.
settings-general-fk_settings-reset_settings-reset_hmd_pitch = Headset-Nick (vertikale Drehung) zurücksetzen
settings-general-fk_settings-arm_fk-reset_mode-description = Ändern Sie, welche Armhaltung für den Befestigungs-Reset erwartet wird.
settings-general-fk_settings-arm_fk-reset_mode-description = Ändern Sie, welche Armhaltung für den Reset der Tracker-Ausrichtung erwartet wird.
settings-general-fk_settings-arm_fk-back = nach Hinten
settings-general-fk_settings-arm_fk-back-description = Der Standardmodus, bei dem die Oberarme nach hinten und die Unterarme nach vorne gehen.
settings-general-fk_settings-arm_fk-tpose_up = T-Pose (oben)
settings-general-fk_settings-arm_fk-tpose_up-description = Erwartet, dass deine Arme während des vollständigen Zurücksetzens seitlich nach unten gerichtet sind und während des Befestigungs-Reset um 90 Grad nach außen gerichtet sind.
settings-general-fk_settings-arm_fk-tpose_up-description = Erwartet, dass deine Arme während des vollständigen Zurücksetzens seitlich nach unten gerichtet sind und während des Reset der Tracker-Ausrichtung um 90 Grad nach außen gerichtet sind.
settings-general-fk_settings-arm_fk-tpose_down = T-Pose (unten)
settings-general-fk_settings-arm_fk-tpose_down-description = Erwartet, dass deine Arme während des vollständigen Zurücksetzens um 90 Grad nach außen gerichtet sind und während des Befestigungs-Reset seitlich nach unten.
settings-general-fk_settings-arm_fk-forward = Vorwärts
@@ -561,7 +589,7 @@ settings-general-fk_settings-self_localization-description = Der Motion-Capture-
settings-general-gesture_control = Gestensteuerung
settings-general-gesture_control-subtitle = Reset durch Antippen
settings-general-gesture_control-description = Erlaubt Reset durch das Antippen eines Trackers auszulösen. Der höchste Tracker auf dem Oberkörper wird für schnelle Resets genutzt, der höchste Tracker auf dem linken Bein wird für Reset genutzt und der höchste Tracker auf dem rechten Bein wird für Befestigungs-Reset genutzt. Das Antippen muss innerhalb von 0.5 Sekunden erfolgen, um erkannt zu werden.
settings-general-gesture_control-description = Erlaubt Reset durch das Antippen eines Trackers auszulösen. Der höchste Tracker auf dem Oberkörper wird für schnelle Resets genutzt, der höchste Tracker auf dem linken Bein wird für Reset genutzt und der höchste Tracker auf dem rechten Bein wird für Reset der Tracker-Ausrichtung genutzt. Das Antippen muss innerhalb von 0.5 Sekunden erfolgen, um erkannt zu werden.
# 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 =
@@ -582,8 +610,8 @@ settings-general-gesture_control-yawResetTaps = Antipp-Anzahl für einen horizon
settings-general-gesture_control-fullResetEnabled = Vollständiger Reset durch Antippen
settings-general-gesture_control-fullResetDelay = Verzögerung für einen vollständigen Reset
settings-general-gesture_control-fullResetTaps = Antipp-Anzahl für einen vollständigen Reset
settings-general-gesture_control-mountingResetEnabled = Antippen für Befestigungs-Reset
settings-general-gesture_control-mountingResetDelay = Befestigungs-Reset-Verzögerung
settings-general-gesture_control-mountingResetEnabled = Aktivieren von Antippen für Reset der Tracker-Ausrichtung
settings-general-gesture_control-mountingResetDelay = Verzögerung von Reset der Tracker-Ausrichtung
settings-general-gesture_control-mountingResetTaps = Anzahl für Befestigungs-Reset
# The number of trackers that can have higher acceleration before a tap is rejected
settings-general-gesture_control-numberTrackersOverThreshold = Tracker über Schwellwert
@@ -651,6 +679,8 @@ settings-interface-behavior-error_tracking-description_v2 =
Um die bestmögliche Benutzererfahrung zu bieten, erfassen wir anonymisierte Fehlerberichte, Leistungsmetriken und Informationen zum Betriebssystem. Dies hilft uns, Fehler und Probleme mit SlimeVR zu erkennen. Diese Metriken werden über Sentry.io erfasst.
settings-interface-behavior-error_tracking-label = Fehler an Entwickler senden
settings-interface-behavior-bvh_directory = Verzeichnis zum Speichern von BVH-Aufnahmen
settings-interface-behavior-bvh_directory-label = Verzeichnis für BVH-Aufnahmen
## Serial settings
@@ -666,7 +696,7 @@ settings-serial-factory_reset = Werkseinstellungen zurücksetzen
# <b>text</b> means that the text should be bold
settings-serial-factory_reset-warning =
<b>Warnung:</b> Dadurch wird der Tracker auf die Werkseinstellungen zurückgesetzt.
Das bedeutet, dass Wi-Fi- und Kalibrierungseinstellungen <b>verloren gehen!</b>
Das bedeutet, dass die WLAN- und Kalibrierungseinstellungen <b>verloren gehen!</b>
settings-serial-factory_reset-warning-ok = Ich weiß, was ich tue
settings-serial-factory_reset-warning-cancel = Abbruch
settings-serial-serial_select = Wählen Sie einen seriellen Anschluss
@@ -674,6 +704,11 @@ settings-serial-auto_dropdown_item = Auto
settings-serial-get_wifi_scan = WLAN-Scan
settings-serial-file_type = Klartext
settings-serial-save_logs = In Datei speichern
settings-serial-send_command = Senden
settings-serial-send_command-placeholder = Befehl...
settings-serial-send_command-warning = <b>Warnung:</b> Das Ausführen serieller Befehle kann zu Datenverlust führen oder die Tracker unbrauchbar machen.
settings-serial-send_command-warning-ok = Ich weiß, was ich tue
settings-serial-send_command-warning-cancel = Abbruch
## OSC router settings
@@ -770,6 +805,7 @@ settings-osc-vmc-mirror_tracking-label = Tracking spiegeln
## Common OSC settings
settings-osc-common-network-ports_match_error = Die Ein- und Ausgänge des OSC-Routers können nicht gleich sein!
settings-osc-common-network-port_banned_error = Der Port { $port } kann nicht verwendet werden!
## Advanced settings
@@ -807,6 +843,9 @@ settings-utils-advanced-open_logs-label = Ordner öffnen
## Home Screen
settings-home-list-layout = Layout der Tracker-Liste
settings-home-list-layout-desc = Wählen Sie eines der möglichen Startbildschirm-Layouts aus
settings-home-list-layout-table = Tabelle
## Tracking Checlist
@@ -824,12 +863,6 @@ onboarding-setup_warning-cancel = Einrichtung fortsetzen
## Wi-Fi setup
onboarding-wifi_creds-back = Zurück zur Einführung
onboarding-wifi_creds = WLAN-Zugangsdaten eingeben
# This cares about multilines
onboarding-wifi_creds-description =
Die Tracker nutzen diese Zugangsdaten, um sich mit dem WLAN zu verbinden.
Bitte verwenden Sie die Zugangsdaten, mit denen ihr PC gerade verbunden sind.
Dieses WLAN-Netzwerk muss ein 2.4 GHz-Netzwerk sein.
onboarding-wifi_creds-skip = WLAN-Zugangsdaten überspringen
onboarding-wifi_creds-submit = Weiter!
onboarding-wifi_creds-ssid =
@@ -842,7 +875,7 @@ onboarding-wifi_creds-password =
## Mounting setup
onboarding-reset_tutorial-back = Zurück zur Trackerausrichtung
onboarding-reset_tutorial-back = Zurück zur Tracker-Ausrichtung
onboarding-reset_tutorial = Tutorial neustarten
onboarding-reset_tutorial-explanation = Während Sie Ihre Tracker verwenden, können sie aufgrund der IMU-Gierdrift oder weil Sie sie physisch bewegt haben, aus der Ausrichtung geraten. Sie haben mehrere Möglichkeiten, dies zu beheben.
onboarding-reset_tutorial-skip = Schritt überspringen
@@ -859,11 +892,11 @@ onboarding-reset_tutorial-1 =
Dadurch werden die Position und Rotation aller Ihrer Tracker vollständig zurückgesetzt. Dies sollte die meisten Probleme beheben.
# Cares about multiline
onboarding-reset_tutorial-2 =
Tippen Sie { $taps } mal auf den markierten Tracker um einen Befestigungs-Reset auszulösen.
Tippen Sie { $taps } mal auf den markierten Tracker um einen Reset der Tracker-Ausrichtung auszulösen.
Ein Befestigungs-Reset hilft dabei, die Tracker neu auszurichten, so wie diese tatsächlich an Ihnen angebracht sind. Zum Beispiel, wenn Sie ein Tracker versehentlich verschoben haben und dessen Orientierung sich stark verändert hat.
Ein Reset der Tracker-Ausrichtung hilft dabei, die Tracker neu auszurichten, so wie diese tatsächlich an Ihnen angebracht sind. Zum Beispiel, wenn Sie ein Tracker versehentlich verschoben haben und dessen Orientierung sich stark verändert hat.
Sie müssen sich in einer "Skifahren"-Pose, wie im Befestigungs-Assistenten gezeigt wird, befinden. Nach dem Auslösen wird der Reset nach 3 Sekunden (konfigurierbar) durchgeführt.
Sie müssen sich in einer "Skifahren"-Pose, wie im Tracker-Ausrichtung-Assistenten gezeigt wird, befinden. Nach dem Auslösen wird der Reset nach 3 Sekunden (konfigurierbar) durchgeführt.
## Setup start
@@ -893,7 +926,10 @@ onboarding-connect_tracker-connection_status-looking_for_server = Suche nach Ser
onboarding-connect_tracker-connection_status-connection_error = Es kann keine WLAN-Verbindung hergestellt werden
onboarding-connect_tracker-connection_status-could_not_find_server = Server konnte nicht gefunden werden
onboarding-connect_tracker-connection_status-done = Verbindung zum Server hergestellt.
onboarding-connect_tracker-connection_status-no_serial_log = Konnte keine Logs vom Tracker abrufen
onboarding-connect_tracker-connection_status-no_serial_device_found = Konnte keinen Tracker über USB finden
onboarding-connect_serial-error-modal-no_serial_log = Ist der Tracker eingeschaltet?
onboarding-connect_serial-error-modal-no_serial_log-desc = Stellen Sie sicher, dass der Tracker eingeschaltet und mit Ihrem Computer verbunden ist.
onboarding-connect_serial-error-modal-no_serial_device_found = Keine Tracker erkannt
# $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
@@ -1180,20 +1216,35 @@ onboarding-automatic_proportions-smol_warning-cancel = Zurück
## User height calibration
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-low = Schauen sie nicht auf den Boden
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-high = Schauen sie nicht zu hoch nach oben
onboarding-user_height-calibration-WAITING_FOR_CONTROLLER_PITCH = Achten sie darauf, dass der Controller nach unten zeigt
onboarding-user_height-calibration-DONE = Erfolg!
## Stay Aligned setup
onboarding-stay_aligned-title = Stay Aligned
onboarding-stay_aligned-description = Konfigurieren Sie Stay Aligned, um Ihre Tracker ausgerichtet zu halten.
onboarding-stay_aligned-put_trackers_on-title = Legen Sie Ihre Tracker an
onboarding-stay_aligned-put_trackers_on-description = Um Ihre Ruheposen zu speichern, verwenden wir die Tracker, die Sie gerade zugewiesenen haben. Legen Sie all Ihre Tracker an. In der Abbildung rechts können Sie sehen, welcher welcher ist.
onboarding-stay_aligned-put_trackers_on-trackers_warning = Sie haben derzeit weniger als 5 Tracker verbunden und zugewiesen! Dies ist die Mindestanzahl an Trackern, die erforderlich sind, damit Stay Aligned richtig funktioniert.
onboarding-stay_aligned-put_trackers_on-next = Ich habe alle meine Tracker angelegt
onboarding-stay_aligned-verify_mounting-title = Tracker-Ausrichtung
onboarding-stay_aligned-verify_mounting-redo_mounting = Tracker-Ausrichtungskalibrierung wiederholen
onboarding-stay_aligned-preparation-title = Vorbereitung
onboarding-stay_aligned-preparation-tip = Achten Sie darauf, aufrecht zu stehen. Schauen Sie nach vorne und lassen Sie die Arme an den Seiten hängen.
onboarding-stay_aligned-relaxed_poses-standing-step-0 = 1. Nehmen Sie eine bequeme Haltung ein. Entspannen Sie sich!
onboarding-stay_aligned-relaxed_poses-standing-step-1-v2 = 2. Drücken Sie die Taste „Pose speichern“.
onboarding-stay_aligned-relaxed_poses-skip_step = Überspringen
onboarding-stay_aligned-previous_step = Zurück
onboarding-stay_aligned-next_step = Weiter
onboarding-stay_aligned-restart = Neu starten
onboarding-stay_aligned-done = Fertig
## Home
home-no_trackers = Keine Tracker erkannt oder zugewiesen
home-settings-close = Schließen
## Trackers Still On notification
@@ -1231,8 +1282,26 @@ firmware_tool-not_available = Das Firmware Tool ist im Moment nicht verfügbar.
firmware_tool-not_compatible = Das Firmware Tool ist nicht mit dieser Version des Servers kompatibel. Bitte den Server aktualisieren!
firmware_tool-select_source-board_type = Boardtyp
firmware_tool-select_source-firmware = Firmware-Quelle
firmware_tool-select_source-version = Firmware-Version
firmware_tool-select_source-official = Offiziell
firmware_tool-select_source-dev = Dev
firmware_tool-board_defaults = Konfigurieren Sie Ihr Board
firmware_tool-board_defaults-add = Hinzufügen
firmware_tool-board_defaults-reset = Auf Standard zurücksetzen
firmware_tool-board_defaults-error-required = Erforderliches Feld
firmware_tool-board_defaults-error-format = Ungültiges Format
firmware_tool-board_defaults-error-format-number = Keine Zahl
firmware_tool-flash_method_step = Flash-Methode
firmware_tool-flash_method_step-description = Bitte wählen Sie die Flash-Methode aus, die Sie verwenden möchten.
firmware_tool-flash_method_step-ota-v2 =
.label = WLAN
.description = Verwenden Sie die Over-the-Air-Methode. Ihr Tracker wird seine Firmware über WLAN aktualisieren. Funktioniert nur bei Trackern, die bereits eingerichtet wurden.
firmware_tool-flash_method_step-ota-info =
Wir nutzen Ihre WLAN-Zugangsdaten, um den Tracker zu flashen und zu bestätigen, dass alles korrekt funktioniert hat.
<b>Wir speichern Ihre WLAN-Zugangsdaten nicht!</b>
firmware_tool-flash_method_step-serial-v2 =
.label = USB
.description = Verwenden Sie ein USB-Kabel, um Ihren Tracker zu aktualisieren.
firmware_tool-flashbtn_step = Drücken Sie den Boot-Button
firmware_tool-flashbtn_step-description = Bevor Sie mit dem nächsten Schritt fortfahren, gibt es ein paar Dinge, die Sie erledigen müssen.
firmware_tool-flashbtn_step-board_SLIMEVR = Schalten Sie den Tracker aus, entfernen Sie das Gehäuse (falls vorhanden), verbinden Sie ein USB-Kabel mit diesem Computer und führen Sie dann einen der folgenden Schritte entsprechend Ihrer SlimeVR-Board-Revision aus:
@@ -1241,8 +1310,10 @@ firmware_tool-flashbtn_step-board_OTHER =
In den meisten Fällen bedeutet das, dass Sie die Boot-Taste auf dem Board drücken müssen, bevor der Flash-Vorgang beginnt.
Wenn der Flash-Vorgang zu Beginn aufgrund eines Timeouts fehlschlägt, bedeutet das wahrscheinlich, dass der Tracker nicht im Bootloader-Modus war.
Bitte beziehen Sie sich auf die Flash-Anweisungen Ihres Boards, um zu erfahren, wie Sie den Bootloader-Modus aktivieren.
firmware_tool-flash_method_ota-title = Flashen über WLAN
firmware_tool-flash_method_ota-devices = Erkannte OTA-Geräte:
firmware_tool-flash_method_ota-no_devices = Es sind keine Boards vorhanden, die über OTA aktualisiert werden können. Stellen Sie sicher, dass Sie den richtigen Board-Typ ausgewählt haben.
firmware_tool-flash_method_serial-title = Über USB flashen
firmware_tool-flash_method_serial-wifi = WLAN-Zugangsdaten:
firmware_tool-flash_method_serial-devices-label = Erkannte serielle Geräte:
firmware_tool-flash_method_serial-devices-placeholder = Wählen Sie ein serielles Gerät aus
@@ -1257,7 +1328,10 @@ firmware_tool-flashing_step-exit = Schließen
## firmware tool build status
firmware_tool-build-QUEUED = Warte darauf, zu bauen....
firmware_tool-build-CREATING_BUILD_FOLDER = Erstelle den Build-Ordner
firmware_tool-build-DOWNLOADING_SOURCE = Lade den Quellcode herunter
firmware_tool-build-EXTRACTING_SOURCE = Entpacken des Quellcode
firmware_tool-build-BUILDING = Erstellen der Firmware
firmware_tool-build-SAVING = Speichern des Builds
firmware_tool-build-DONE = Erstellen abgeschlossen
@@ -1323,6 +1397,8 @@ unknown_device-modal-confirm = Sicher!
unknown_device-modal-forget = Ignorieren
# VRChat config warnings
vrc_config-page-title = VRChat Konfigurations-Warnungen
vrc_config-page-desc = Diese Seite zeigt den Zustand deiner VRChat-Einstellungen und zeigt, welche Einstellungen mit SlimeVR inkompatibel sind. Es wird dringend empfohlen, alle hier angezeigten Warnungen zu beheben, um das beste Nutzererlebnis mit SlimeVR zu gewährleisten.
vrc_config-page-help-desc = Schauen Sie sich unsere <a>Dokumentation zu diesem Thema</a> an!
vrc_config-on = An
vrc_config-off = Aus
vrc_config-invalid = Sie haben falsch konfigurierte VRChat-Einstellungen!
@@ -1333,10 +1409,17 @@ vrc_config-current_value = Aktueller Wert
vrc_config-mute = Warnung stummschalten
vrc_config-mute-btn = Stummschalten
vrc_config-unmute-btn = Stummschaltung aufheben
vrc_config-disable_shoulder_tracking = Schultertracking deaktivieren
vrc_config-user_height = Echte Benutzergröße
vrc_config-spine_mode-UNKNOWN = Unbekannt
vrc_config-spine_mode-LOCK_HEAD = Kopf sperren
vrc_config-spine_mode-LOCK_HIP = Hüfte sperren
vrc_config-tracker_model-UNKNOWN = Unbekannt
vrc_config-tracker_model-AXIS = Achse
vrc_config-tracker_model-SYSTEM = System
vrc_config-avatar_measurement_type-UNKNOWN = Unbekannt
vrc_config-avatar_measurement_type-HEIGHT = Höhe
vrc_config-avatar_measurement_type-ARM_SPAN = Armspannweite
## Error collection consent modal
@@ -1347,3 +1430,33 @@ error_collection_modal-description_v2 =
Sie können diese Einstellung später im Abschnitt Verhalten auf der Einstellungsseite ändern.
error_collection_modal-confirm = Ich stimme zu
error_collection_modal-cancel = Ich will nicht
## Tracking checklist section
tracking_checklist-settings-close = Schließen
tracking_checklist-status-partial =
{ $count ->
[one] Sie haben 1 Warnung!
*[other] Sie haben { $count } Warnungen!
}
tracking_checklist-MOUNTING_CALIBRATION = Tracker-Ausrichtung durchführen
tracking_checklist-STEAMVR_DISCONNECTED = SteamVR läuft nicht
tracking_checklist-STEAMVR_DISCONNECTED-desc = SteamVR läuft nicht. Nutzen sie es für VR?
tracking_checklist-STEAMVR_DISCONNECTED-open = SteamVR starten
tracking_checklist-TRACKERS_REST_CALIBRATION-desc = Sie haben keine Tracker-Kalibrierung durchgeführt. Bitte lassen Sie Ihre Tracker (gelb markiert) für einige Sekunden auf einer stabilen Oberfläche ruhen.
tracking_checklist-TRACKER_ERROR = Tracker mit Fehlern
tracking_checklist-VRCHAT_SETTINGS = VRChat-Einstellungen konfigurieren
tracking_checklist-VRCHAT_SETTINGS-open = Gehen sie zu den VRChat-Warnungen
tracking_checklist-NETWORK_PROFILE_PUBLIC-open = Kontrollpanel öffnen
tracking_checklist-STAY_ALIGNED_CONFIGURED = Stay Aligned konfigurieren
tracking_checklist-STAY_ALIGNED_CONFIGURED-open = Öffne den Stay Aligned Assistent
tracking_checklist-ignore = Ignorieren
preview-mocap_mode_soon = Mocap-Modus (Bald™)
preview-disable_render = Vorschau deaktivieren
preview-disabled_render = Vorschau deaktiviert
toolbar-mounting_calibration = Tracker-Ausrichtung
toolbar-mounting_calibration-default = Körper
toolbar-mounting_calibration-feet = Füße
toolbar-mounting_calibration-fingers = Finger
toolbar-assigned_trackers = { $count } Tracker zugewiesen
toolbar-unassigned_trackers = { $count } Tracker nicht zugewiesen

View File

@@ -374,3 +374,6 @@ settings-osc-vrchat-network-trackers-feet = Πόδια
## Error collection consent modal
## Tracking checklist section

View File

@@ -742,11 +742,6 @@ onboarding-setup_warning-cancel = continu setup
## Wi-Fi setup
onboarding-wifi_creds-back = gaww bawwk to intwoduction
onboarding-wifi_creds = input wi-fi cwedentials
# This cares about multilines
onboarding-wifi_creds-description =
teh twawckaws will use these cwedentials to connect wirelessly
pwease use teh cwedentials that yaww awe cwowently cownyected to
onboarding-wifi_creds-skip = skipy wi-fi settiwyngs
onboarding-wifi_creds-submit = suwbmyt!
onboarding-wifi_creds-ssid =
@@ -1224,3 +1219,6 @@ unknown_device-modal-forget = ignowe it
## Error collection consent modal
## Tracking checklist section

View File

@@ -109,6 +109,11 @@ board_type-XIAO_ESP32C3 = Seeed Studio XIAO ESP32C3
board_type-HARITORA = Haritora
board_type-ESP32C6DEVKITC1 = Espressif ESP32-C6 DevKitC-1
board_type-GLOVE_IMU_SLIMEVR_DEV = SlimeVR Dev IMU Glove
board_type-GESTURES = Gestures
board_type-ESP32S3_SUPERMINI = ESP32-S3 Supermini
board_type-GENERIC_NRF = Generic nRF
board_type-SLIMEVR_BUTTERFLY_DEV = SlimeVR Dev Butterfly
board_type-SLIMEVR_BUTTERFLY = SlimeVR Butterfly
## Proportions
skeleton_bone-NONE = None
@@ -331,6 +336,7 @@ tracker-table-column-name = Name
tracker-table-column-type = Type
tracker-table-column-battery = Battery
tracker-table-column-ping = Ping
tracker-table-column-packet_loss = Packet Loss
tracker-table-column-tps = TPS
tracker-table-column-temperature = Temp. °C
tracker-table-column-linear-acceleration = Accel. X/Y/Z
@@ -370,6 +376,10 @@ tracker-infos-magnetometer-status-v1 = { $status ->
[ENABLED] Enabled
}
tracker-infos-packet_loss = Packet Loss
tracker-infos-packets_lost = Packets Lost
tracker-infos-packets_received = Packets Received
## Tracker settings
tracker-settings-back = Go back to trackers list
tracker-settings-title = Tracker settings
@@ -407,6 +417,7 @@ tracker-settings-update = Update now
tracker-settings-update-title = Firmware version
tracker-settings-current-version = Current
tracker-settings-latest-version = Latest
tracker-settings-build-date = Build Date
## Tracker part card info
@@ -567,6 +578,10 @@ settings-general-tracker_mechanics-use_mag_on_all_trackers-description =
Uses magnetometer on all trackers that have a compatible firmware for it, reducing drift in stable magnetic environments.
Can be disabled per tracker in the tracker's settings. <b>Please don't shutdown any of the trackers while toggling this!</b>
settings-general-tracker_mechanics-use_mag_on_all_trackers-label = Use magnetometer on trackers
settings-general-tracker_mechanics-trackers_over_usb = Trackers over USB
settings-general-tracker_mechanics-trackers_over_usb-description =
Enables receiving HID tracker data over USB. Make sure connected trackers have <b>connection over HID</b> enabled!
settings-general-tracker_mechanics-trackers_over_usb-enabled-label = Allow HID trackers to connect directly over USB
settings-stay_aligned = Stay Aligned
settings-stay_aligned-description = Stay Aligned reduces drift by gradually adjusting your trackers to match your relaxed poses.
@@ -647,6 +662,8 @@ settings-general-fk_settings-skeleton_settings-impute_hip_from_waist_legs = Impu
settings-general-fk_settings-skeleton_settings-interp_hip_legs = Average the hip's yaw and roll with the legs'
settings-general-fk_settings-skeleton_settings-interp_knee_tracker_ankle = Average the knee trackers' yaw and roll with the ankles'
settings-general-fk_settings-skeleton_settings-interp_knee_ankle = Average the knees' yaw and roll with the ankles'
settings-general-fk_settings-skeleton_settings-fingers_mitten = Fingers Mitten Mode
settings-general-fk_settings-self_localization-title = Mocap mode
settings-general-fk_settings-self_localization-description = Mocap Mode allows the skeleton to roughly track its own position without a headset or other trackers. Note that this requires feet and head trackers to work and is still experimental.
@@ -921,11 +938,13 @@ onboarding-setup_warning-cancel = Continue setup
## Wi-Fi setup
onboarding-wifi_creds-back = Go back to introduction
onboarding-wifi_creds = Input Wi-Fi credentials
onboarding-wifi_creds-v2 = Trackers using Wi-Fi
# 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-description-v2 =
Most trackers (such as official SlimeVR trackers) use Wi-Fi to connect to the server.
Please use the credentials of the Wi-Fi network your device is currently connected to.
Make sure to use a 2.4GHz Wi-Fi connection for your trackers!
onboarding-wifi_creds-skip = Skip Wi-Fi settings
onboarding-wifi_creds-submit = Submit!
onboarding-wifi_creds-ssid =
@@ -936,6 +955,12 @@ onboarding-wifi_creds-password =
.label = Password
.placeholder = Enter password
onboarding-wifi_creds-dongle-title = Trackers using a dongle
onboarding-wifi_creds-dongle-description =
If your trackers came with a dongle, plug it into your device and you should be good to go!
onboarding-wifi_creds-dongle-wip = This section is a work in progress. A dedicated page to manage trackers that connect via a dongle will be made soon.
onboarding-wifi_creds-dongle-continue = Continue with a dongle
## Mounting setup
onboarding-reset_tutorial-back = Go back to Mounting calibration
onboarding-reset_tutorial = Reset tutorial
@@ -1334,6 +1359,7 @@ onboarding-stay_aligned-previous_step = Previous
onboarding-stay_aligned-next_step = Next
onboarding-stay_aligned-restart = Restart
onboarding-stay_aligned-done = Done
onboarding-stay_aligned-manual_mounting-done = Done
## Home
home-no_trackers = No trackers detected or assigned
@@ -1385,6 +1411,9 @@ firmware_tool-select_source-firmware = Firmware Source
firmware_tool-select_source-version = Firmware Version
firmware_tool-select_source-official = Official
firmware_tool-select_source-dev = Dev
firmware_tool-select_source-not_selected = No source selected
firmware_tool-select_source-no_boards = No available boards for this source
firmware_tool-select_source-no_versions = No available versions for this source
firmware_tool-board_defaults = Configure your board
firmware_tool-board_defaults-description = Set the pins or settings relative to your hardware
@@ -1557,7 +1586,7 @@ error_collection_modal-description_v2 = { settings-interface-behavior-error_trac
error_collection_modal-confirm = I agree
error_collection_modal-cancel = I don't want to
## Tracking checklist section
tracking_checklist = Tracking Checklist
tracking_checklist-settings = Tracking Checklist Settings
tracking_checklist-settings-close = Close

View File

@@ -944,11 +944,6 @@ onboarding-setup_warning-cancel = Continuar configuración
## Wi-Fi setup
onboarding-wifi_creds-back = Volver a la introducción
onboarding-wifi_creds = Ingresar credenciales del Wi-Fi
# This cares about multilines
onboarding-wifi_creds-description =
Los sensores utilizarán estas credenciales para conectarse inalámbricamente.
Por favor usa las credenciales del Wi-Fi al cuál estás conectado actualmente.
onboarding-wifi_creds-skip = Saltar ajustes de Wi-Fi
onboarding-wifi_creds-submit = ¡Enviar!
onboarding-wifi_creds-ssid =
@@ -1561,6 +1556,9 @@ error_collection_modal-description_v2 =
Tu puedes cambiar esta configuración más tarde en la sección de comportamiento de la pagina de configuración.
error_collection_modal-confirm = Acepto
error_collection_modal-cancel = No quiero
## Tracking checklist section
tracking_checklist-settings-close = Cerrar
tracking_checklist-STEAMVR_DISCONNECTED-open = Abrir SteamVR
tracking_checklist-TRACKERS_REST_CALIBRATION = Calibra tus trackers

View File

@@ -899,11 +899,6 @@ onboarding-setup_warning-cancel = Continuar con la configuración
## Wi-Fi setup
onboarding-wifi_creds-back = Volver a la introducción
onboarding-wifi_creds = Introduce credenciales de Wi-Fi
# This cares about multilines
onboarding-wifi_creds-description =
Los trackers utilizarán estas credenciales para conectarse de forma inalámbrica.
Por favor, utiliza las credenciales a las que está conectado actualmente.
onboarding-wifi_creds-skip = Omitir configuración Wi-Fi
onboarding-wifi_creds-submit = ¡Enviar!
onboarding-wifi_creds-ssid =
@@ -1484,3 +1479,6 @@ error_collection_modal-description_v2 =
Puede cambiar esta configuración más adelante en la sección Comportamiento de la página de configuración.
error_collection_modal-confirm = Acepto
error_collection_modal-cancel = No quiero
## Tracking checklist section

View File

@@ -559,11 +559,6 @@ onboarding-setup_warning-cancel = Jätka seadistamist
## Wi-Fi setup
onboarding-wifi_creds-back = Mine tagasi juhistele
onboarding-wifi_creds = Sisestage enda Wi-Fi andmed!
# This cares about multilines
onboarding-wifi_creds-description =
Jälgijad kasutavad neid andmeid, et ühendada juhtmevabalt.
Palun kasutage neid Wi-Fi andmeid, millega te praegu olete ühendatud.
onboarding-wifi_creds-skip = Jätke Wi-Fi seaded vahele.
onboarding-wifi_creds-submit = Jätka!
onboarding-wifi_creds-ssid =
@@ -807,3 +802,6 @@ status_system-StatusTrackerError = Jälgijal { $trackerName } on tõrge.
## Error collection consent modal
## Tracking checklist section

View File

@@ -592,11 +592,6 @@ onboarding-setup_warning-cancel = Jatka asennusta
## Wi-Fi setup
onboarding-wifi_creds-back = Palaa esittelyyn
onboarding-wifi_creds = Syötä Wi-Fi-tunnistetiedot
# This cares about multilines
onboarding-wifi_creds-description =
Jäljittimet käyttävät näitä tunnistetietoja langattomaan yhteyden muodostamiseen.
Käytä tunnistetietoja, joihin olet tällä hetkellä yhteydessä.
onboarding-wifi_creds-skip = Ohita Wi-Fi-asetukset
onboarding-wifi_creds-submit = Lähetä!
onboarding-wifi_creds-ssid =
@@ -910,3 +905,6 @@ status_system-StatusTrackerError = { $trackerName } jäljittimessä on virhe
## Error collection consent modal
## Tracking checklist section

View File

@@ -952,11 +952,6 @@ onboarding-setup_warning-cancel = Continuer la configuration
## Wi-Fi 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 configuration Wi-Fi
onboarding-wifi_creds-submit = Valider
onboarding-wifi_creds-ssid =
@@ -1571,3 +1566,6 @@ error_collection_modal-description_v2 =
Vous pouvez modifier ce paramètre ultérieurement dans la section "Comportement" des paramètres.
error_collection_modal-confirm = Je suis d'accord
error_collection_modal-cancel = Je ne veux pas
## Tracking checklist section

View File

@@ -384,3 +384,6 @@ home-no_trackers = לא זוהו או הוקצו חיישנים
## Error collection consent modal
## Tracking checklist section

View File

@@ -910,11 +910,6 @@ onboarding-setup_warning-cancel = Continua la configurazione
## Wi-Fi setup
onboarding-wifi_creds-back = Torna all'introduzione
onboarding-wifi_creds = Inserisci credenziali Wi-Fi
# 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 Wi-Fi
onboarding-wifi_creds-submit = Conferma!
onboarding-wifi_creds-ssid =
@@ -1496,3 +1491,6 @@ error_collection_modal-description_v2 =
Puoi modificare questa impostazione in un secondo momento nella sezione Comportamento delle impostazioni.
error_collection_modal-confirm = Acconsento
error_collection_modal-cancel = Non acconsento
## Tracking checklist section

View File

@@ -577,11 +577,6 @@ onboarding-setup_warning-cancel = セットアップを続行する
## Wi-Fi setup
onboarding-wifi_creds-back = 戻る
onboarding-wifi_creds = Wi-Fi
# This cares about multilines
onboarding-wifi_creds-description =
トラッカーはこれらの認証情報を使ってWi-Fiに接続します。
現在接続している認証情報を使用してください。
onboarding-wifi_creds-skip = Wi-Fi設定をスキップする
onboarding-wifi_creds-submit = 実行!
onboarding-wifi_creds-ssid =
@@ -795,3 +790,6 @@ unknown_device-modal-forget = 無視する
## Error collection consent modal
## Tracking checklist section

View File

@@ -743,11 +743,6 @@ onboarding-setup_warning-cancel = 설정 계속하기
## Wi-Fi setup
onboarding-wifi_creds-back = 처음으로 돌아가기
onboarding-wifi_creds = Wi-Fi 자격 증명을 입력하세요
# This cares about multilines
onboarding-wifi_creds-description =
트래커는 이 자격 증명을 사용하여 무선으로 연결해요
지금 연결되어 있는 자격 증명을 사용해주세요
onboarding-wifi_creds-skip = Wi-Fi 설정 건너뛰기
onboarding-wifi_creds-submit = 저장!
onboarding-wifi_creds-ssid =
@@ -1216,3 +1211,6 @@ unknown_device-modal-forget = 무시할게요
error_collection_modal-title = 오류를 수집해도 될까요?
error_collection_modal-confirm = 동의해요
## Tracking checklist section

View File

@@ -694,3 +694,6 @@ settings-general-gesture_control-trackers =
error_collection_modal-confirm = Sutinku
error_collection_modal-cancel = Nesutinku
## Tracking checklist section

View File

@@ -497,11 +497,6 @@ onboarding-wip = Arbeid pågår
## Wi-Fi setup
onboarding-wifi_creds-back = Gå tilbake til introduksjonen
onboarding-wifi_creds = Tast inn Wi-Fi legitimasjon
# This cares about multilines
onboarding-wifi_creds-description =
Trackerne bruker denne legitimasjonen for å koble til trådløst.
Vennligst bruk legitimasjonen til nettet du er koblet til nå.
onboarding-wifi_creds-skip = Hopp over Wi-Fi innstillinger
onboarding-wifi_creds-submit = Send inn!
onboarding-wifi_creds-ssid =
@@ -683,3 +678,6 @@ tray_or_exit_modal-cancel = Avbryt
## Error collection consent modal
## Tracking checklist section

View File

@@ -33,6 +33,10 @@ tips-failed_webgl = WebGL initialiseren is gefaald.
## Units
unit-meter = Meter
unit-foot = Voet
unit-inch = Inch
unit-cm = cm
## Body parts
@@ -98,6 +102,8 @@ board_type-WEMOSD1MINI = Wemos D1 Mini
board_type-TTGO_TBASE = TTGO T-Base
board_type-ESP01 = ESP-01
board_type-SLIMEVR = SlimeVR
board_type-SLIMEVR_DEV = SlimeVR-ontwikkelingsbord
board_type-SLIMEVR_V1_2 = SlimeVR v1.2
board_type-LOLIN_C3_MINI = Lolin C3 Mini
board_type-BEETLE32C3 = Beetle ESP32-C3
board_type-ESP32C3DEVKITM1 = Espressif ESP32-C3 DevKitM-1
@@ -247,6 +253,10 @@ reset-mounting = Reset montage
reset-mounting-feet = Reset voetmontage
reset-mounting-fingers = Reset vingermontage
reset-yaw = Yaw Reset
reset-error-no_feet_tracker = Geen voet-tracker toegewezen
reset-error-no_fingers_tracker = Geen vingertracker toegewezen
reset-error-mounting-need_full_reset = U heeft een volledige reset nodig voordat u de montagekalibratie kunt uitvoeren.
reset-error-yaw-need_full_reset = U heeft een volledige reset nodig voordat u de yaw reset kunt uitvoeren.
## Serial detection stuff
@@ -270,6 +280,7 @@ navbar-settings = Instellingen
## Biovision hierarchy recording
bvh-start_recording = BVH opnemen
bvh-stop_recording = Sla BVH-opname op
bvh-recording = Opname bezig...
bvh-save_title = Sla BVH-opname op
@@ -405,6 +416,8 @@ tracker-settings-name_section-label = Trackernaam
tracker-settings-forget = Vergeet tracker
tracker-settings-forget-description = Verwijdert de tracker van de SlimeVR Server en voorkomt dat deze verbinding kan maken totdat de server opnieuw wordt opgestart. De configuratie van de tracker blijft behouden.
tracker-settings-forget-label = Vergeet tracker
tracker-settings-update-unavailable-v2 = Geen versies gevonden.
tracker-settings-update-incompatible = Kan niet worden bijgewerkt. Incompatibel bord
tracker-settings-update-low-battery = Kan niet worden bijgewerkt. Batterij lager dan 50%
tracker-settings-update-up_to_date = Up to date.
tracker-settings-update-blocked = Update is niet beschikbaar. Er zijn geen andere versies beschikbaar.
@@ -475,6 +488,7 @@ mounting_selection_menu-close = Sluiten
settings-sidebar-title = Instellingen
settings-sidebar-general = Algemeen
settings-sidebar-steamvr = SteamVR
settings-sidebar-tracker_mechanics = Trackersinstellingen
settings-sidebar-stay_aligned = Blijf in lijn
settings-sidebar-fk_settings = FK-instellingen
@@ -482,9 +496,12 @@ settings-sidebar-gesture_control = Tikbediening
settings-sidebar-interface = Interface
settings-sidebar-osc_router = OSC-router
settings-sidebar-osc_trackers = VRChat OSC Trackers
settings-sidebar-osc_vmc = VMC
settings-sidebar-utils = Hulpmiddelen
settings-sidebar-serial = Serieel console
settings-sidebar-appearance = Uiterlijk
settings-sidebar-home = Startscherm
settings-sidebar-checklist = Tracking checklist
settings-sidebar-notifications = Notificaties
settings-sidebar-behavior = Gedrag
settings-sidebar-firmware-tool = DIY Firmware Tool
@@ -567,7 +584,7 @@ settings-general-tracker_mechanics-use_mag_on_all_trackers-description =
Je kan dit per individuele tracker uit zetten in de instellingen van de tracker. <b>Sluit geen van de trackers af terwijl u dit in- en uitschakelt!</b>
settings-general-tracker_mechanics-use_mag_on_all_trackers-label = Gebruik magnetometer op de trackers
settings-stay_aligned = Blijf in lijn
settings-stay_aligned-description = ijf in lijn vermindert drift door je trackers geleidelijk aan te passen zodat ze overeenkomen met je ontspannen houdingen.
settings-stay_aligned-description = Blijf in lijn vermindert drift door je trackers geleidelijk aan te passen zodat ze overeenkomen met je ontspannen houdingen.
settings-stay_aligned-setup-label = Blijf in lijn instellen
settings-stay_aligned-setup-description = Je moet "Blijf in lijn instellen" voltooien om Blijf in lijn te activeren.
settings-stay_aligned-warnings-drift_compensation = ⚠ Schakel Drift Compensation uit! Drift Compensation conflicteert met Blijf in lijn.
@@ -608,11 +625,16 @@ settings-general-fk_settings-leg_tweak-floor_clip-description =
settings-general-fk_settings-leg_tweak-toe_snap-description = Toe-snap probeert de rotatie van uw voeten te raden als voet-trackers niet worden gebruikt.
settings-general-fk_settings-leg_tweak-foot_plant-description = Foot-plant roteert je voeten zodat ze evenwijdig aan de grond zijn wanneer ze in contact zijn.
settings-general-fk_settings-leg_fk = Been tracking
settings-general-fk_settings-leg_fk-reset_mounting_feet-description-v1 = Forceer de voet montage reset tijdens normale montage resets.
settings-general-fk_settings-leg_fk-reset_mounting_feet-v1 = Forceer voet montage reset
settings-general-fk_settings-enforce_joint_constraints = Bewegingslimieten van het skelet
settings-general-fk_settings-enforce_joint_constraints-enforce_constraints = Beperkingen toepassen
settings-general-fk_settings-enforce_joint_constraints-enforce_constraints-description = Voorkomt dat gewrichten over hun limiet draaien
settings-general-fk_settings-enforce_joint_constraints-correct_constraints = Corrigeren met beperkingen
settings-general-fk_settings-enforce_joint_constraints-correct_constraints-description = Corrigeer gewrichtsrotaties wanneer ze hun limiet overschrijden
settings-general-fk_settings-ik = Positie gegevens
settings-general-fk_settings-ik-use_position = Positiegegevens gebruiken
settings-general-fk_settings-ik-use_position-description = Maakt gebruik van positiegegevens mogelijk van de trackers die deze leveren. Waneer u dit inschakelt, zorg er voor dat u een volledige reset doet en in het spel opnieuw kalibreert.
settings-general-fk_settings-arm_fk = Arm tracking
settings-general-fk_settings-arm_fk-description = Verander de manier waarop de armen worden getrackt.
settings-general-fk_settings-arm_fk-force_arms = Dwing armen vanuit HMD
@@ -765,6 +787,11 @@ settings-serial-auto_dropdown_item = Automatisch
settings-serial-get_wifi_scan = WiFi-scan uitvoeren
settings-serial-file_type = Gewone tekst
settings-serial-save_logs = Opslaan in bestand
settings-serial-send_command = Verzenden
settings-serial-send_command-placeholder = Commando...
settings-serial-send_command-warning = <b>Waarschuwing:</b> Het uitvoeren van seriële opdrachten kan leiden tot gegevensverlies of de trackers stuk maken.
settings-serial-send_command-warning-ok = Ik weet wat ik doe
settings-serial-send_command-warning-cancel = Annuleren
## OSC router settings
@@ -859,6 +886,8 @@ settings-osc-vmc-mirror_tracking-label = Gespiegelde tracking
## Common OSC settings
settings-osc-common-network-ports_match_error = De in- en uit poorten van de OSC-Router mogen niet hetzelfde zijn!
settings-osc-common-network-port_banned_error = Het poort { $port } kan niet worden gebruikt!
## Advanced settings
@@ -895,9 +924,15 @@ settings-utils-advanced-open_logs-label = Map openen
## Home Screen
settings-home-list-layout = Trackers lijst indeling
settings-home-list-layout-desc = Selecteer een van de mogelijke indelingen voor het startscherm
settings-home-list-layout-grid = Rooster
settings-home-list-layout-table = Tabel
## Tracking Checlist
settings-tracking_checklist-active_steps = Actieve stappen
settings-tracking_checklist-active_steps-desc = Laat alle stappen die in de tracking checklist komen zien. U kan of dit uitzetten of negeerbare stappen laten zien.
## Setup/onboarding menu
@@ -914,11 +949,6 @@ onboarding-setup_warning-cancel = Doorgaan met setupgids
## Wi-Fi setup
onboarding-wifi_creds-back = Ga terug naar de introductie
onboarding-wifi_creds = Voer de WiFi-inloggegevens in
# This cares about multilines
onboarding-wifi_creds-description =
Deze gegevens worden gebruikt om de trackers draadloos te verbinden met de server.
Gelieve de gegevens te gebruiken van het netwerk waarmee je momenteel bent verbonden.
onboarding-wifi_creds-skip = WiFi-instellingen overslaan
onboarding-wifi_creds-submit = Verzenden!
onboarding-wifi_creds-ssid =
@@ -1033,6 +1063,7 @@ onboarding-assignment_tutorial-done = Ik heb stickers en riemen geplaatst!
onboarding-assign_trackers-back = Ga terug naar de instellingen voor WiFi-configuratie
onboarding-assign_trackers-title = Trackers toewijzen
onboarding-assign_trackers-description = Laten we de bevesteging van je trackers bepalen. Klik op de lichaamslocatie waar je een tracker wilt toewijzen.
onboarding-assign_trackers-unassign_all = Alle trackers toewijzing verwijderen
# 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
@@ -1175,6 +1206,8 @@ onboarding-automatic_mounting-done-restart = Terug naar start
onboarding-automatic_mounting-mounting_reset-title = Montage-reset
onboarding-automatic_mounting-mounting_reset-step-0 = 1. Ga staan in een "skie"-houding met gebogen benen, je bovenlichaam naar voren gekanteld en armen gebogen.
onboarding-automatic_mounting-mounting_reset-step-1 = 2. Druk op de knop "Reset montage" en wacht 3 seconden voordat de montagerichtingen van de trackers opnieuw worden ingesteld.
onboarding-automatic_mounting-mounting_reset-feet-step-0 = 1. Sta op uw tenen met beide voeten naar voren gericht. u kunt het ook zittend op een stoel doen.
onboarding-automatic_mounting-mounting_reset-feet-step-1 = 2. Druk op de knop "Voetkalibratie" en wacht 3 seconden voordat de montageoriëntaties van de trackers gereset worden.
onboarding-automatic_mounting-preparation-title = Voorbereiding
onboarding-automatic_mounting-preparation-v2-step-0 = 1. Druk op de knop "Volledige reset".
onboarding-automatic_mounting-preparation-v2-step-1 = 2. Ga rechtop staan met je armen langs je zij. Zorg dat je recht vooruit kijkt.
@@ -1182,9 +1215,11 @@ onboarding-automatic_mounting-preparation-v2-step-2 = 3. Houd deze houding aan t
onboarding-automatic_mounting-put_trackers_on-title = Doe je trackers aan
onboarding-automatic_mounting-put_trackers_on-description = Om montagerichtingen te kalibreren gaan we gebruik maken van de trackers die je net hebt toegewezen. Doe al je trackers aan, je kunt zien welke trackers welke zijn in de figuur rechts.
onboarding-automatic_mounting-put_trackers_on-next = Ik heb al mijn trackers aan
onboarding-automatic_mounting-return-home = Klaar
## Tracker manual proportions setupa
onboarding-manual_proportions-back-scaled = Ga terug naar geschaalde proporties
onboarding-manual_proportions-title = Handmatige lichaamsverhoudingen
onboarding-manual_proportions-fine_tuning_button = Automatisch afstemmen van verhoudingen
onboarding-manual_proportions-fine_tuning_button-disabled-tooltip = Sluit een VR-headset aan om automatische fijnafstelling te gebruiken
@@ -1277,6 +1312,11 @@ onboarding-automatic_proportions-smol_warning-cancel = Ga terug
## User height calibration
onboarding-user_height-title = Wat is jouw lengte?
onboarding-user_height-description = We hebben je lengte nodig om je lichaamsproporties te berekenen en je bewegingen nauwkeurig weer te geven. Je kunt SlimeVR je lengte laten berekenen, of je lengte handmatig invoeren.
onboarding-user_height-need_head_tracker = Voor de kalibratie zijn een headset en controllers met positionele tracking vereist.
onboarding-user_height-calculate = Bereken mijn lengte automatisch
onboarding-user_height-next_step = Doorgaan en opslaan
## Stay Aligned setup
@@ -1315,6 +1355,8 @@ onboarding-stay_aligned-done = Klaar
## Home
home-no_trackers = Geen trackers gedetecteerd of toegewezen
home-settings = Startpagina-instellingen
home-settings-close = Sluiten
## Trackers Still On notification
@@ -1355,6 +1397,8 @@ firmware_tool = DIY firmware-tool
firmware_tool-description = Hiermee kan je uw DIY-trackers configureren en flashen
firmware_tool-not_available = Oeps, de firmwaretool is momenteel niet beschikbaar. Kom later terug!
firmware_tool-not_compatible = De firmwaretool is niet compatibel met deze versie van de server. Gelieve te updaten!
firmware_tool-select_source = Selecteer de firmware die u wilt flashen
firmware_tool-select_source-description = Selecteer de firmware die u op uw bord wilt flashen
firmware_tool-flash_method_step = Flashing methode
firmware_tool-flash_method_step-description = Kies de flashingsmethode die je wilt gebruiken
firmware_tool-flashbtn_step = Druk op de bootknop
@@ -1493,3 +1537,35 @@ error_collection_modal-description_v2 =
U kunt deze instelling later wijzigen in de sectie Gedrag van de instellingenpagina.
error_collection_modal-confirm = Ik ben akkoord
error_collection_modal-cancel = Ik wil het niet
## Tracking checklist section
tracking_checklist-UNASSIGNED_HMD-desc = De VR-headset moet worden toegewezen als hoofdtracker.
tracking_checklist-NETWORK_PROFILE_PUBLIC = Verander je netwerkprofiel
tracking_checklist-NETWORK_PROFILE_PUBLIC-desc =
{ $count ->
[one]
Uw netwerk-profiel is op dit moment of publiek ingesteld ({ $adapters })
Dit wordt niet aanbevolen voor een goede werking van SlimeVR
<PublicFixLink>Hiet leest u hoe u dit kunt oplossen</PublicFixLink>
*[other]
Sommige van uw netwerkadapters staan ingesteld op openbaar:
{ $adapters }.
Dit wordt niet aanbevolen voor een goede werking van SlimeVR.
<PublicFixLink>Hier leest u hoe u dit kunt oplossen.</PublicFixLink>
}
tracking_checklist-NETWORK_PROFILE_PUBLIC-open = Open Configuratiescherm
tracking_checklist-STAY_ALIGNED_CONFIGURED = Configureer Blijf in lijn
tracking_checklist-STAY_ALIGNED_CONFIGURED-desc = Noteer de blijf in lijn posities voor een verbeterde imu-drift
tracking_checklist-STAY_ALIGNED_CONFIGURED-open = Open Blijf in lijn wizard
tracking_checklist-ignore = Negeren
preview-mocap_mode_soon = Mocap-modus (binnenkort™)
preview-disable_render = Schakel rendering uit
preview-disabled_render = Rendering uitgeschakeld
toolbar-mounting_calibration = Montage-kalibratie
toolbar-mounting_calibration-default = Lichaam
toolbar-mounting_calibration-feet = Voeten
toolbar-mounting_calibration-fingers = Vingers
toolbar-drift_reset = Drift Reset
toolbar-assigned_trackers = { $count } trackers toegewezen
toolbar-unassigned_trackers = { $count } trackers niet toegewezen

View File

@@ -33,6 +33,10 @@ tips-failed_webgl = Nie udało się zainicjalizować WebGL.
## Units
unit-meter = Metr
unit-foot = Stopa
unit-inch = Cal
unit-cm = cm
## Body parts
@@ -98,6 +102,8 @@ board_type-WEMOSD1MINI = Wemos D1 Mini
board_type-TTGO_TBASE = Podstawa T TTGO
board_type-ESP01 = Zobacz materiał ESP-01
board_type-SLIMEVR = SlimeVR
board_type-SLIMEVR_DEV = SlimeVR Płytka Deweloperska
board_type-SLIMEVR_V1_2 = SlimeVR v1.2
board_type-LOLIN_C3_MINI = Lolin C3 Mini
board_type-BEETLE32C3 = Beetle ESP32-C3
board_type-ESP32C3DEVKITM1 = Espressif ESP32-C3 DevKitM-1
@@ -249,6 +255,10 @@ reset-mounting = Zresetuj położenie
reset-mounting-feet = Zresetuj mocowanie stóp
reset-mounting-fingers = Zresetuj mocowanie palców
reset-yaw = Reset odchylenia
reset-error-no_feet_tracker = Nie przypisano urządzenia śledzenia stóp
reset-error-no_fingers_tracker = Nie przypisano urządzenia śledzenia palcy
reset-error-mounting-need_full_reset = Potrzebny jest pełny reset przed montażem
reset-error-yaw-need_full_reset = Potrzebny jest pełny reset przed resetem obrotu
## Serial detection stuff
@@ -268,10 +278,12 @@ navbar-trackers_assign = Przydzielenie Trackerów
navbar-mounting = Kalibracja Pozycji
navbar-onboarding = Wstępna konfiguracja
navbar-settings = Ustawienia
navbar-connect_trackers = Połącz Urządzenia
## Biovision hierarchy recording
bvh-start_recording = Nagraj BVH
bvh-stop_recording = Zapisz nagranie BVH
bvh-recording = Nagrywanie...
bvh-save_title = Zapisz nagranie BVH
@@ -408,11 +420,15 @@ tracker-settings-name_section-label = Nazwa Urządzenia
tracker-settings-forget = Zapomnij o trackerze
tracker-settings-forget-description = Usuwa moduł śledzący z serwera SlimeVR i uniemożliwia mu połączenie się z nim do czasu ponownego uruchomienia serwera. Konfiguracja modułu śledzącego nie zostanie utracona.
tracker-settings-forget-label = Zapomnij o trackerze
tracker-settings-update-unavailable-v2 = Nie znaleziono aktualizacji
tracker-settings-update-incompatible = Nie można zaktualizować. Niekompatybilne urządzenie lub wersja oprogramowania.
tracker-settings-update-low-battery = Nie można zaktualizować. Bateria poniżej 50%
tracker-settings-update-up_to_date = Aktualny
tracker-settings-update-blocked = Aktualizacja niedostępna. Brak innych wersji
tracker-settings-update = Zaktualizuj teraz
tracker-settings-update-title = Wersja oprogramowania
tracker-settings-current-version = Aktualny
tracker-settings-latest-version = Najnowszy
## Tracker part card info
@@ -478,6 +494,7 @@ mounting_selection_menu-close = Zamknij
settings-sidebar-title = Ustawienia
settings-sidebar-general = Ogólne
settings-sidebar-steamvr = SteamVR
settings-sidebar-tracker_mechanics = Mechanika trackerów
settings-sidebar-stay_aligned = Wyrównywanie
settings-sidebar-fk_settings = Ustawienia śledzenia
@@ -485,9 +502,12 @@ settings-sidebar-gesture_control = Sterowanie gestami
settings-sidebar-interface = Interfejs
settings-sidebar-osc_router = OSC router
settings-sidebar-osc_trackers = Śledzenie VRChat OSC
settings-sidebar-osc_vmc = VMC
settings-sidebar-utils = Narzędzia
settings-sidebar-serial = Konsola szeregowa
settings-sidebar-appearance = Wygląd
settings-sidebar-home = Strona Główna
settings-sidebar-checklist = Lista kontrolna
settings-sidebar-notifications = Powiadomienia
settings-sidebar-behavior = Zachowanie
settings-sidebar-firmware-tool = Narzędzie do oprogramowania sprzętowego DIY
@@ -613,11 +633,16 @@ settings-general-fk_settings-leg_tweak-floor_clip-description = Floor-clip może
settings-general-fk_settings-leg_tweak-toe_snap-description = Toe-snap próbuje odgadnąć obrót twoich stóp, jeśli trackery stóp nie są używane.
settings-general-fk_settings-leg_tweak-foot_plant-description = Foot-plant obraca stopy, aby były równoległe do podłoża podczas kontaktu.
settings-general-fk_settings-leg_fk = Śledzenie nóg
settings-general-fk_settings-leg_fk-reset_mounting_feet-description-v1 = Wymuś kalibracje montażu stóp podczas kalibracji pozycji.
settings-general-fk_settings-leg_fk-reset_mounting_feet-v1 = Wymuś kalibracje mocowania stóp
settings-general-fk_settings-enforce_joint_constraints = Limity szkieletowe
settings-general-fk_settings-enforce_joint_constraints-enforce_constraints = Wymuszanie ograniczeń
settings-general-fk_settings-enforce_joint_constraints-enforce_constraints-description = Zapobiega obracaniu się stawów poza ich limit
settings-general-fk_settings-enforce_joint_constraints-correct_constraints = Korygowanie za pomocą ograniczeń
settings-general-fk_settings-enforce_joint_constraints-correct_constraints-description = Koryguj rotacje stawów, gdy przekraczają swój limit
settings-general-fk_settings-ik = Dane pozycji
settings-general-fk_settings-ik-use_position = Użyj danych o pozycji
settings-general-fk_settings-ik-use_position-description = Umożliwia wykorzystanie danych o pozycji z urządzeń, które je wspierają. Włączając to, upewnij się, że dokonałeś reset w aplikacji i skalibrowałeś położenie w grze.
settings-general-fk_settings-arm_fk = Śledzenie ramienia
settings-general-fk_settings-arm_fk-description = Zmień sposób śledzenia ramion.
settings-general-fk_settings-arm_fk-force_arms = Śledź ramiona z gogli VR
@@ -775,6 +800,11 @@ settings-serial-auto_dropdown_item = Auto
settings-serial-get_wifi_scan = Skanuj sieci WiFi
settings-serial-file_type = Zwykły tekst
settings-serial-save_logs = Zapisz do pliku
settings-serial-send_command = Wyślij
settings-serial-send_command-placeholder = Polecenie...
settings-serial-send_command-warning = <b>Ostrzeżenie:</b> Wysyłanie poleceń szeregowych może prowadzić do utraty danych lub zablokowania urządzenia.
settings-serial-send_command-warning-ok = Wiem co robię
settings-serial-send_command-warning-cancel = Anuluj
## OSC router settings
@@ -874,6 +904,8 @@ settings-osc-vmc-mirror_tracking-label = Odbicie lustrzane śledzenia
## Common OSC settings
settings-osc-common-network-ports_match_error = Porty wejściowe i wyjściowe routera OSC nie mogą być takie same!
settings-osc-common-network-port_banned_error = Port { $port } nie może zostać użyty!
## Advanced settings
@@ -906,9 +938,15 @@ settings-utils-advanced-open_logs-label = Otwórz folder
## Home Screen
settings-home-list-layout = Układ listy urządzeń
settings-home-list-layout-desc = Wybierz jeden z możliwych układów ekranu głównego
settings-home-list-layout-grid = Siatka
settings-home-list-layout-table = Tabela
## Tracking Checlist
settings-tracking_checklist-active_steps = Aktywne Kroki
settings-tracking_checklist-active_steps-desc = Lista wszystkich kroków kontrolnych. Możesz wyłączyć konkretne punkty.
## Setup/onboarding menu
@@ -925,11 +963,6 @@ onboarding-setup_warning-cancel = Kontynuuj konfigurację
## Wi-Fi setup
onboarding-wifi_creds-back = Cofnij się do początku
onboarding-wifi_creds = Wpisz dane Wi-Fi
# 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 Wi-Fi
onboarding-wifi_creds-submit = Potwierdź!
onboarding-wifi_creds-ssid =
@@ -1046,6 +1079,7 @@ onboarding-assignment_tutorial-done = Umieszczam naklejki i paski!
onboarding-assign_trackers-back = Cofnij się do ustawień Wi-Fi
onboarding-assign_trackers-title = Przydziel Trackery
onboarding-assign_trackers-description = Wybierzmy gdzie idzie jaki tracker. Naciśnij gdzie chcesz go przydzielić
onboarding-assign_trackers-unassign_all = Usuń przydzielenie wszystkich urządzeń
# 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
@@ -1193,6 +1227,8 @@ 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łowiem pochylonym 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-mounting_reset-feet-step-0 = 1. Stań na palcach z obiema stopami skierowanymi do przodu. Alternatywnie możesz to zrobić siedząc na krześle.
onboarding-automatic_mounting-mounting_reset-feet-step-1 = 2. Naciśnij "Kalibracja Stóp" i poczekaj 3 sekundy zanim zresetuje pozycje.
onboarding-automatic_mounting-preparation-title = Przygotowania
onboarding-automatic_mounting-preparation-v2-step-0 = 1. Naciśnij przycisk "Pełny reset".
onboarding-automatic_mounting-preparation-v2-step-1 = 2. Stań prosto z rękami po bokach. Upewnij się, że patrzysz przed siebie.
@@ -1200,9 +1236,11 @@ onboarding-automatic_mounting-preparation-v2-step-2 = 3. Utrzymaj pozycję, aż
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 przypisano przed chwilą. Załóż wszystkie trackery, możesz je odróznić na postaci po prawej.
onboarding-automatic_mounting-put_trackers_on-next = Wszystkie trackery założone
onboarding-automatic_mounting-return-home = Gotowe
## Tracker manual proportions setupa
onboarding-manual_proportions-back-scaled = Wróć do skalowania proporcji
onboarding-manual_proportions-title = Manualne Proporcje Ciała
onboarding-manual_proportions-fine_tuning_button = Automatyczne dostrajanie proporcji
onboarding-manual_proportions-fine_tuning_button-disabled-tooltip = Podłącz gogle VR, aby korzystać z automatycznego dostrajania
@@ -1304,6 +1342,30 @@ onboarding-automatic_proportions-smol_warning-cancel = Przejdź wstecz
## User height calibration
onboarding-user_height-title = Jaki masz wzrost?
onboarding-user_height-description = Potrzebujemy twojego wzrostu, aby obliczyć proporcje ciała i dokładnie oddać twoje ruchy. Możesz pozwolić SlimeVR to obliczyć albo wpisać swój wzrost ręcznie.
onboarding-user_height-need_head_tracker = Do kalibracji wymaganę są gogle vr z kontrolerami.
onboarding-user_height-calculate = Automatycznie oblicz mój wzrost
onboarding-user_height-next_step = Kontynuuj i zapisz
onboarding-user_height-manual-proportions = Manualne Proporcje Ciała
onboarding-user_height-calibration-title = Postęp kalibracji
onboarding-user_height-calibration-RECORDING_FLOOR = Dotknij podłogi górną częścią kontrolera
onboarding-user_height-calibration-WAITING_FOR_RISE = Wstań
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK = Wstań i spójrz przed siebie
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-ok = Upewnij się, że masz głowę poziomo
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-low = Nie patrz w podłogę
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-high = Nie patrz za wysoko
onboarding-user_height-calibration-WAITING_FOR_CONTROLLER_PITCH = Upewnij się, że kontroler jest skierowany w dół
onboarding-user_height-calibration-RECORDING_HEIGHT = Wstań i nie ruszaj się!
onboarding-user_height-calibration-DONE = Sukces!
onboarding-user_height-calibration-ERROR_TIMEOUT = Kalibracja zakończona niepomyślnie, spróbuj ponownie.
onboarding-user_height-calibration-ERROR_TOO_HIGH = Wykryty wzrost użytkownika jest zbyt wysoki, spróbuj ponownie.
onboarding-user_height-calibration-ERROR_TOO_SMALL = Wykryty wzrost użytkownika jest zbyt mały. Upewnij się, że stoisz prosto i patrzysz przed siebie pod koniec kalibracji.
onboarding-user_height-calibration-error = Kalibracja nieudana
onboarding-user_height-manual-tip = Podczas regulacji wzrostu wypróbuj różne pozy i zobacz, czy szkielet odzwierciedla twoje ruchy.
onboarding-user_height-reset-warning =
<b>Ostrzeżenie:</b> Spowoduje to zresetowanie wszystkich ustawień proporcji do wartości domyślnych.
Czy na pewno chcesz to zrobić?
## Stay Aligned setup
@@ -1342,6 +1404,8 @@ onboarding-stay_aligned-done = Gotowy
## Home
home-no_trackers = Nie wykryto ani nie przypisano żadnych trackerów
home-settings = Ustawienia strony głównej
home-settings-close = Zamknij
## Trackers Still On notification
@@ -1383,21 +1447,50 @@ firmware_tool = Narzędzie do oprogramowania sprzętowego DIY
firmware_tool-description = Umożliwia konfigurowanie i flashowanie trackerów DIY
firmware_tool-not_available = Ups, narzędzie do oprogramowania sprzętowego nie jest obecnie dostępne. Wróć później!
firmware_tool-not_compatible = Narzędzie oprogramowania układowego nie jest kompatybilne z tą wersją serwera. Proszę zaktualizować swój serwer!
firmware_tool-select_source = Wybierz oprogramowanie do wgrania
firmware_tool-select_source-description = Wybierz oprogramowanie, które chcesz wgrać na urządzenie
firmware_tool-select_source-error = Nie można załadować oprogramowania
firmware_tool-select_source-board_type = Typ urządzenia
firmware_tool-select_source-firmware = Źródło oprogramowania
firmware_tool-select_source-version = Wersja oprogramowania
firmware_tool-select_source-official = Oficjalny
firmware_tool-select_source-dev = Deweloperski
firmware_tool-board_defaults = Skonfiguruj swoje urządzenie
firmware_tool-board_defaults-description = Ustaw piny lub ustawienia do twojego urządzenia
firmware_tool-board_defaults-add = Dodaj
firmware_tool-board_defaults-reset = Zresetuj do domyślnych ustawień
firmware_tool-board_defaults-error-required = Wymagane pole
firmware_tool-board_defaults-error-format = Nieprawidłowy format
firmware_tool-board_defaults-error-format-number = To nie liczba
firmware_tool-flash_method_step = Metoda flashowania
firmware_tool-flash_method_step-description = Wybierz metodę flashowania, której chcesz użyć
firmware_tool-flash_method_step-ota-v2 =
.label = Wi-Fi
.description = Użyj metody bezprzewodowej. Twoje urządzenie będzie aktualizować się przez Wi-Fi. Działa tylko z skonfigurowanymi urządzeniami.
firmware_tool-flash_method_step-ota-info =
Używamy Twoich danych wi-fi, aby wgrać tracker i potwierdzić, że wszystko działa poprawnie.
<b>Nie przechowujemy Twoich danych wifi!</b>
firmware_tool-flash_method_step-serial-v2 =
.label = USB
.description = Użyj kabla usb, aby aktualizować urządzenie.
firmware_tool-flashbtn_step = Naciśnij przycisk zasilania
firmware_tool-flashbtn_step-description = Zanim przejdziesz do następnego kroku, musisz zrobić kilka rzeczy
firmware_tool-flashbtn_step-board_SLIMEVR =
Naciśnij przycisk flash na płytce drukowanej przed włożeniem, aby włączyć tracker.¶
Jeśli tracker był już włączony, po prostu go wyłącz i włącz ponownie, naciskając przycisk lub zwierając podkładki flash.¶
Oto kilka zdjęć, jak to zrobić, zgodnie z różnymi wersjami trackera SlimeVR
firmware_tool-flashbtn_step-board_SLIMEVR-r11-v2 = Włącz tracker zwierając drugi prostokątny pad FLASH od krawędzi na górnej stronie płytki, a metalową osłonę mikrokontrolera
firmware_tool-flashbtn_step-board_SLIMEVR-r12-v2 = Włącz tracker zwierając drugi prostokątny pad FLASH od krawędzi na górnej stronie płytki, a metalową osłonę mikrokontrolera
firmware_tool-flashbtn_step-board_SLIMEVR-r14-v2 = Włącz tracker, naciskając przycisk FLASH na górnej stronie płytki. Dioda LED powinna krótko mrógnąć.
firmware_tool-flashbtn_step-board_OTHER =
Przed flashowaniem prawdopodobnie będziesz musiał przełączyć moduł śledzący w tryb bootloadera.¶
W większości przypadków oznacza to naciśnięcie przycisku rozruchu na płycie przed rozpoczęciem procesu flashowania.¶
Jeśli na początku flashowania upłynie limit czasu procesu flashowania, prawdopodobnie oznacza to, że moduł śledzący nie był w trybie bootloadera¶
Aby dowiedzieć się, jak włączyć tryb ładowarki łodzi, zapoznaj się z instrukcjami flashowania swojej tablicy
firmware_tool-flash_method_ota-title = Wgrywanie przez Wi-Fi
firmware_tool-flash_method_ota-devices = Wykryte urządzenia OTA:
firmware_tool-flash_method_ota-no_devices = Nie ma tablic, które można zaktualizować za pomocą OTA, upewnij się, że wybrałeś właściwy typ płyty
firmware_tool-flash_method_serial-title = Wgrywanie przez USB
firmware_tool-flash_method_serial-wifi = Dane uwierzytelniające Wi-Fi:
firmware_tool-flash_method_serial-devices-label = Wykryte urządzenia szeregowe:
firmware_tool-flash_method_serial-devices-placeholder = Wybierz urządzenie szeregowe
@@ -1412,7 +1505,10 @@ firmware_tool-flashing_step-exit = Wyjście
## firmware tool build status
firmware_tool-build-QUEUED = Budowanie....
firmware_tool-build-CREATING_BUILD_FOLDER = Tworzenie folderu kompilacji
firmware_tool-build-DOWNLOADING_SOURCE = Pobieranie kodu źródłowego
firmware_tool-build-EXTRACTING_SOURCE = Ekstrakcja kodu źródłowego
firmware_tool-build-BUILDING = Budowa oprogramowania sprzętowego
firmware_tool-build-SAVING = Zapisywanie kompilacji
firmware_tool-build-DONE = Budowa ukończona
@@ -1521,8 +1617,72 @@ vrc_config-avatar_measurement_type-ARM_SPAN = Rozpiętość ramion
error_collection_modal-title = Czy możemy zbierać błędy?
error_collection_modal-description_v2 =
{ ustawienia-interfejsu-zachowanie-error_tracking-description_v2 }
{ settings-interface-behavior-error_tracking-description_v2 }
To ustawienie można zmienić później w sekcji Zachowanie na stronie ustawień.
error_collection_modal-confirm = Zgadzam się
error_collection_modal-cancel = Nie chcę
## Tracking checklist section
tracking_checklist = Lista Kontrolna
tracking_checklist-settings = Ustawienia Listy Kontrolnej
tracking_checklist-settings-close = Zamknij
tracking_checklist-status-incomplete = Nie jesteś przygotowany aby korzystać ze SlimeVR!
tracking_checklist-status-partial =
{ $count ->
[one] Masz { $count } ostrzeżenie!
[few] Masz { $count } ostrzeżeń!
*[many] Masz { $count } ostrzeżeń!
}
tracking_checklist-status-complete = Jesteś gotowy korzystać ze SlimeVR!
tracking_checklist-MOUNTING_CALIBRATION = Wykonaj kalibrację montażu
tracking_checklist-FEET_MOUNTING_CALIBRATION = Wykonaj kalibrację montażu stóp
tracking_checklist-FULL_RESET = Wykonaj pełny reset
tracking_checklist-FULL_RESET-desc = Niektóre urządzenia wymagają resetu.
tracking_checklist-STEAMVR_DISCONNECTED = SteamVR nie jest uruchomiony
tracking_checklist-STEAMVR_DISCONNECTED-desc = SteamVR nie jest uruchomiony. Czy twoje gogle są podłączone?
tracking_checklist-STEAMVR_DISCONNECTED-open = Uruchom SteamVR
tracking_checklist-TRACKERS_REST_CALIBRATION = Skalibruj swoje urządzenia
tracking_checklist-TRACKERS_REST_CALIBRATION-desc = Nie wykonałeś kalibracji urządzenia. Proszę, pozwól swoim urządzeniom (podświetlonym na żółto) odpocząć na stabilnej powierzchni przez kilka sekund.
tracking_checklist-TRACKER_ERROR = Urządzenia z błędami
tracking_checklist-TRACKER_ERROR-desc = Niektóre z Twoich urządzeń mają błędy. Proszę ponownie uruchomić urządzenia podświetlone na żółto.
tracking_checklist-VRCHAT_SETTINGS = Konfiguruj ustawienia do VRChat'a
tracking_checklist-VRCHAT_SETTINGS-desc = Źle ustawiłeś ustawienia VRChat'a! Może to negatywnie wpłynąć na twoje śledzenie.
tracking_checklist-VRCHAT_SETTINGS-open = Przejdź do ostrzeżeń VRChat
tracking_checklist-UNASSIGNED_HMD = Zestaw VR nieprzypisany do Głowy
tracking_checklist-UNASSIGNED_HMD-desc = Zestaw VR powinien być przypisany jako śledzenie głowy.
tracking_checklist-NETWORK_PROFILE_PUBLIC = Zmień profil sieciowy
tracking_checklist-NETWORK_PROFILE_PUBLIC-desc =
{ $count ->
[one]
Jeden z Twoich adapterów sieciowych jest ustawiony na publiczny:
{ $adapters }
Nie zaleca się tego, aby SlimeVR działał poprawnie.
<PublicFixLink>Zobacz, jak to naprawić tutaj.</PublicFixLink>
[few]
Niektóre z Twoich adapterów sieciowych są ustawione na publiczne:
{ $adapters }
Nie zaleca się tego, aby SlimeVR działał poprawnie.
<PublicFixLink>Zobacz, jak to naprawić tutaj.</PublicFixLink>
*[many]
Niektóre z Twoich adapterów sieciowych są ustawione na publiczne:
{ $adapters }
Nie zaleca się tego, aby SlimeVR działał poprawnie.
<PublicFixLink>Zobacz, jak to naprawić tutaj.</PublicFixLink>
}
tracking_checklist-NETWORK_PROFILE_PUBLIC-open = Otwórz panel sterowania
tracking_checklist-STAY_ALIGNED_CONFIGURED = Konfiguruj Opcje Wyrównywania
tracking_checklist-STAY_ALIGNED_CONFIGURED-desc = Zapisz pozycje wyrównywania, aby zmniejszyć poślizg
tracking_checklist-STAY_ALIGNED_CONFIGURED-open = Otwórz Konfiguracje Wyrównywania
tracking_checklist-ignore = Ignoruj
preview-mocap_mode_soon = Tryb mocap (wkrótce™)
preview-disable_render = Wyłącz renderowanie
preview-disabled_render = Renderowanie wyłączone
toolbar-mounting_calibration = Kalibracja Pozycji
toolbar-mounting_calibration-default = Ciało
toolbar-mounting_calibration-feet = Stopy
toolbar-mounting_calibration-fingers = Palce
toolbar-drift_reset = Reset Poślizgu
toolbar-assigned_trackers = { $count } Przydzielonych urządzeń
toolbar-unassigned_trackers = { $count } Nieprzydzielonych urządzeń

View File

@@ -778,11 +778,6 @@ onboarding-setup_warning-cancel = Continuar configurações
## Wi-Fi setup
onboarding-wifi_creds-back = Voltar para introdução
onboarding-wifi_creds = Insira as credenciais de Wi-Fi
# 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 Wi-Fi
onboarding-wifi_creds-submit = Enviar!
onboarding-wifi_creds-ssid =
@@ -1267,3 +1262,6 @@ unknown_device-modal-forget = Ignore-o
error_collection_modal-title = Podemos coletar erros?
error_collection_modal-confirm = Eu concordo
error_collection_modal-cancel = Eu não quero
## Tracking checklist section

View File

@@ -920,11 +920,6 @@ onboarding-setup_warning-cancel = Продолжить настройку
## Wi-Fi setup
onboarding-wifi_creds-back = Вернуться к введению
onboarding-wifi_creds = Вставьте данные Wi-Fi
# This cares about multilines
onboarding-wifi_creds-description =
Трекеры будут использовать эти учетные данные для беспроводного подключения.
Пожалуйста, используйте данные Wi-Fi, к которому вы на данный момент подключены.
onboarding-wifi_creds-skip = Пропустить настройки Wi-Fi
onboarding-wifi_creds-submit = Отправить!
onboarding-wifi_creds-ssid =
@@ -1507,3 +1502,6 @@ error_collection_modal-description_v2 =
Вы можете изменить эту настройку позже на странице настроек в разделе Поведение.
error_collection_modal-confirm = Я согласен
error_collection_modal-cancel = Я не согласен
## Tracking checklist section

View File

@@ -842,11 +842,6 @@ onboarding-setup_warning-cancel = Fortsätt inställning
## Wi-Fi setup
onboarding-wifi_creds-back = Gå tillbaka till introduktion
onboarding-wifi_creds = Skriv in Wi-Fi information
# This cares about multilines
onboarding-wifi_creds-description =
Trackers kommer att använda dessa uppgifter för att ansluta trådlöst.
Använd de autentiseringsuppgifter som du för närvarande är ansluten till.
onboarding-wifi_creds-skip = Hoppa över Wi-Fi inställningar.
onboarding-wifi_creds-submit = Överlämna!
onboarding-wifi_creds-ssid =
@@ -1247,3 +1242,6 @@ error_collection_modal-description_v2 =
Du kan ändra denna inställningen senare i beteende-sektionen av inställnings-sidan
error_collection_modal-confirm = Jag tillåter.
error_collection_modal-cancel = Jag vill inte
## Tracking checklist section

View File

@@ -17,9 +17,9 @@ websocket-error-logs = เปิดโฟลเดอร์ไฟล์บัน
## Update notification
version_update-title = มีเวอร์ชันใหม่พร้อมแล้ว: { $version }
version_update-title = มีเวอร์ชันใหม่พร้อมแล้ว: { $version }
version_update-description = คลิกที่ "{ version_update-update }" เพื่อดาวน์โหลดตัวติดตั้ง SlimeVR ให้คุณ
version_update-update = อัเดต
version_update-update = อัเดต
version_update-close = ปิด
## Tips
@@ -141,7 +141,7 @@ skeleton_bone-UPPER_CHEST-desc =
skeleton_bone-CHEST_OFFSET = การชดเชยตำแหน่งหน้าอก
skeleton_bone-CHEST_OFFSET-desc =
นี่เป็นการปรับให้แทร็กเกอร์เสมือนบริเวณอกสูงขึ้น หรือต่ำลงเพื่อช่วย
ในการตั้งศูนย์หรือปรับเทียบสำหรับบางเกมหรือแอปพลิเคชันที่กำหนดตำแหน่งแทร็กเกอร์สูงกว่า หรือต่ำกว่า
ในการตั้งศูนย์หรือปรับเทียบสำหรับบางเกมหรือแอปพลิเคชันที่กำหนดตำแหน่งแทร็กเกอร์สูงกว่า หรือต่ำกว่า
skeleton_bone-CHEST = ความยาวหน้าอก
skeleton_bone-CHEST-desc =
นี่เป็นระยะห่างจากกลางหน้าอกถึงกลางกระดูกสันหลัง
@@ -151,7 +151,7 @@ skeleton_bone-WAIST = ความยาวเอว
skeleton_bone-WAIST-desc =
นี่เป็นระยะห่างจากตรงกลางกระดูกสันหลังถึงสะดือ
ปรับด้วยการเริ่มจากการปรับความยาวลำตัวให้เหมาะสมก่อน แล้วปรับค่านี้ในท่าต่างๆ
(นั่งลง ก้มตัว นอนราบ เป็นต้น) จนกว่ากระดูกหลังเสมือนจะตรงกับกระดูกสันหลังจริง
(นั่งลง ก้มตัว นอนราบ เป็นต้น) จนกว่ากระดูกหลังเสมือนจะตรงกับกระดูกสันหลังจริงของคุณ
skeleton_bone-HIP = ความยาวสะโพก
skeleton_bone-HIP-desc =
นี่เป็นระยะห่างจากสะดือถึงสะโพก
@@ -160,12 +160,12 @@ skeleton_bone-HIP-desc =
skeleton_bone-HIP_OFFSET = การชดเชยตำแหน่งสะโพก
skeleton_bone-HIP_OFFSET-desc =
ปรับค่านี้เพื่อขยับแทร็กเกอร์เสมือนของสะโพกขึ้นหรือลง
เพื่อช่วยในการตั้งศูนย์หรือปรับเทียบสำหรับบางเกมหรือแอปพลิเคชันที่กำหนดตำแหน่งแทร็กเกอร์ให้อยู่ที่สะโพก
เพื่อช่วยในการตั้งศูนย์หรือปรับเทียบสำหรับบางเกมหรือแอปพลิเคชันที่กำหนดตำแหน่งแทร็กเกอร์ให้อยู่ที่สะโพก
skeleton_bone-HIPS_WIDTH = ความกว้างสะโพก
skeleton_bone-HIPS_WIDTH-desc =
นี่เป็นระยะห่างจากจุดเริ่มต้นของขาทั้งสอง
ปรับด้วยการเริ่มจากการรีเซ็ตแทร็กเกอร์ทั้งหมดในขณะที่ยืนตรง
ขาตรง และจึงปรับค่านี้จนกระทังขาเสมือนของคุณตรงกับขาจริงในแนวนอน
ปรับด้วยการเริ่มจากการรีเซ็ตทั้งหมดในขณะที่ยืนตรง
ขาตรง และจึงปรับค่านี้จนกระทังขาเสมือนของคุณตรงกับขาจริงในแนวนอน
skeleton_bone-leg_group = ความยาวขา
skeleton_bone-leg_group-desc =
นี่เป็นระยะห่างจากสะโพกถึงเท้า
@@ -189,7 +189,7 @@ skeleton_bone-FOOT_SHIFT = การปรับชดเชยการวา
skeleton_bone-FOOT_SHIFT-desc =
นี่เป็นระยะห่างในแนวนอนจากหัวเข่าถึงข้อเท้า
ค่านี้ช่วยในการคำนวณการเอียงของขาส่วนล่างเมื่อยืนตัวตรง
โดยเริ่มจากการตั้งความยาวเท้าเป็น 0, รีเซ็ตแทร็กเกอร์ทั้งหมด,
โดยเริ่มจากการตั้งความยาวเท้าเป็น 0, จากนั้นรีเซ็ตทั้งหมด
แล้วจึงปรับค่าจนกระทั่งเท้าเสมือนตรงกับกลางข้อเท้าจริงของคุณ
skeleton_bone-SKELETON_OFFSET = การชดเชยตำแหน่งโครงร่างรวม
skeleton_bone-SKELETON_OFFSET-desc =
@@ -226,14 +226,14 @@ skeleton_bone-HAND_Y-desc =
นี่เป็นระยะห่างในแนวตั้งจากข้อมือถึงกลางมือของคุณ
หากใช้สำหรับ Motion Capture ให้เริ่มจากปรับความยาวแขนให้เหมาะสม แล้วปรับค่านี้จนกว่า
แทร็กเกอร์เสมือนของมือนั้นอยู่ในแนวตั้งเดียวกับกลางมือจริง
หากใช้สำหรับจับตำแหน่งข้อศอกจากคอนโทรลเลอร์ ให้เริ่มจากตั้งความยาวแขน เป็น 0 และ
หากใช้สำหรับจับตำแหน่งข้อศอกจากคอนโทรลเลอร์ ให้เริ่มจากตั้งความยาวแขน เป็น 0
และปรับค่าจนกว่าแทร็กเกอร์ข้อศอกนั้นอยู่ในแนวตั้งเดียวกับข้อมือจริง
skeleton_bone-HAND_Z = ระยะมือแนวราบ (แกน Z)
skeleton_bone-HAND_Z-desc =
นี่เป็นระยะห่างแนวนอนจากข้อมือถึงกลางมือของคุณ
หากใช้สำหรับ Motion capture ให้ตั้งค่านี้เป็น 0
หากใช้สำหรับจับตำแหน่งข้อศอกจากคอนโทรลเลอร์ ให้เริ่มจากตั้งความยาวแขนเป็น 0 และ
ปรับค่าจนกว่าแทร็กเกอร์ข้อศอกนั้นอยู่ในแนวราบเดียวกับข้อมือจริงของคุณ
หากใช้สำหรับจับตำแหน่งข้อศอกจากคอนโทรลเลอร์ ให้เริ่มจากตั้งความยาวแขนเป็น 0
และปรับค่าจนกว่าแทร็กเกอร์ข้อศอกนั้นอยู่ในแนวราบเดียวกับข้อมือจริงของคุณ
skeleton_bone-ELBOW_OFFSET = ชดเชยตำแหน่งข้อศอก
skeleton_bone-ELBOW_OFFSET-desc =
สามารถปรับเพื่อเลื่อนแทร็กเกอร์ข้อศอกเสมือนของคุณขึ้นหรือลงเพื่อช่วย
@@ -250,23 +250,23 @@ reset-reset_all_warning-cancel = ยกเลิก
reset-reset_all_warning_default-v2 =
<b>คำเตือน:</b> คุณยังไม่ได้ตั้งค่าความสูง สัดส่วนของคุณจะถูกรีเซ็ตเป็นค่าเริ่มต้น
คุณแน่ใจหรือไม่ว่าต้องการทำเช่นนี้
reset-full = รีเซ็ตแทร็กเกอร์ทั้งหมด
reset-full = รีเซ็ตทั้งหมด
reset-mounting = รีเซ็ตตั้งศูนย์การติดตั้ง
reset-mounting-feet = รีเซ็ตทิศทางติดตั้งเท้า
reset-mounting-fingers = รีเซ็ตการติดตั้งนิ้วมือ
reset-yaw = รีเซ็ตแกนตั้ง
reset-error-no_feet_tracker = ไม่ได้กำหนดแทร็กเกอร์เท้า
reset-error-no_fingers_tracker = ไม่ได้กําหนดแทร็กเกอร์นิ้ว
reset-error-mounting-need_full_reset = ต้องรีเซ็ตแทร็กเกอร์ทั้งหมดก่อนการตั้งศูนย์การติดตั้ง
reset-error-yaw-need_full_reset = ต้องรีเซ็ตแทร็กเกอร์ทั้งหมดก่อนรีเซ็ตแกนตั้ง
reset-error-no_fingers_tracker = ไม่ได้กหนดแทร็กเกอร์นิ้ว
reset-error-mounting-need_full_reset = ต้องรีเซ็ตทั้งหมดก่อนการตั้งศูนย์การติดตั้ง
reset-error-yaw-need_full_reset = ต้องรีเซ็ตทั้งหมดก่อนรีเซ็ตแกนตั้ง
## Serial detection stuff
serial_detection-new_device-p0 = ตรวจพบอุปกรณ์ Serial ใหม่!
serial_detection-new_device-p1 = ป้อนข้อมูลการเข้าสู่ระบบ Wi-Fi ของคุณ!
serial_detection-new_device-p1 = ใส่ข้อมูลเครือข่าย Wi-Fi ของคุณ!
serial_detection-new_device-p2 = กรุณาเลือกสิ่งที่คุณต้องการทำกับอุปกรณ์
serial_detection-open_wifi = เชื่อมต่อกับ Wi-Fi
serial_detection-open_serial = เปิด Serial console
serial_detection-open_serial = เปิดหน้าคอนโซล Serial
serial_detection-submit = ยืนยัน!
serial_detection-close = ปิด
@@ -276,7 +276,7 @@ navbar-home = หน้าหลัก
navbar-body_proportions = สัดส่วนร่างกาย
navbar-trackers_assign = กำหนดแทร็กเกอร์
navbar-mounting = ตั้งศูนย์การติดตั้ง
navbar-onboarding = ตัวช่วยการตั้งค่า
navbar-onboarding = ตัวช่วยตั้งค่าโปรแกรม
navbar-settings = ตั้งค่า
navbar-connect_trackers = เชื่อมต่อแทร็กเกอร์
@@ -401,9 +401,9 @@ tracker-settings-assignment_section-edit = แก้ไขการกำหน
tracker-settings-mounting_section = ทิศทางการติดตั้ง
tracker-settings-mounting_section-description = แทร็กเกอร์นี้อยู่ด้านไหนของคุณ?
tracker-settings-mounting_section-edit = แก้ไขการติดตั้ง
tracker-settings-drift_compensation_section = เปิดใช้การชดเชยค่าดริฟท์
tracker-settings-drift_compensation_section-description = ให้แทร็กเกอร์ตัวนี้ชดเชยค่าดริฟท์เมื่อมีการเปิดใช้งานการชดเชยค่าดริฟท์หรือไม่?
tracker-settings-drift_compensation_section-edit = ใช้การชดเชยค่าดริฟท์
tracker-settings-drift_compensation_section = เปิดใช้การชดเชยการดริฟท์
tracker-settings-drift_compensation_section-description = ให้แทร็กเกอร์ตัวนี้ชดเชยการดริฟท์เมื่อมีการเปิดใช้งานการชดเชยการดริฟท์หรือไม่?
tracker-settings-drift_compensation_section-edit = ใช้การชดเชยการดริฟท์
tracker-settings-use_mag = เปิดใช้งานเซ็นเซอร์สนามแม่เหล็กสำหรับแทร็กเกอร์ตัวนี้
# Multiline!
tracker-settings-use_mag-description =
@@ -421,10 +421,10 @@ tracker-settings-forget-description = ลบแทร็กเกอร์ออ
tracker-settings-forget-label = ลืมแทร็กเกอร์
tracker-settings-update-unavailable-v2 = ไม่พบเวอร์ชันที่เผยแพร่
tracker-settings-update-incompatible = ไม่สามารถอัปเดตได้ บอร์ดไม่รองรับ
tracker-settings-update-low-battery = ไม่สามารถอัเดตได้ แบตเตอรี่ต่ำกว่า 50%
tracker-settings-update-low-battery = ไม่สามารถอัเดตได้ แบตเตอรี่ต่ำกว่า 50%
tracker-settings-update-up_to_date = เป็นเวอร์ชันล่าสุดแล้ว
tracker-settings-update-blocked = ไม่มีอัปเดต ไม่มีเวอร์ชันอื่นให้ใช้งาน
tracker-settings-update = อัเดตทันที
tracker-settings-update = อัเดตทันที
tracker-settings-update-title = เวอร์ชันเฟิร์มแวร์
tracker-settings-current-version = ปัจจุบัน
tracker-settings-latest-version = ล่าสุด
@@ -465,7 +465,7 @@ tracker_selection_menu-UPPER_CHEST = { -tracker_selection-part } หน้าอ
tracker_selection_menu-CHEST = { -tracker_selection-part } อก?
tracker_selection_menu-WAIST = { -tracker_selection-part } เอว?
tracker_selection_menu-HIP = { -tracker_selection-part } สะโพก?
tracker_selection_menu-LEFT_SHOULDER = { -tracker_selection-part } หัวไหลซ้าย?
tracker_selection_menu-LEFT_SHOULDER = { -tracker_selection-part } ไหลซ้าย?
tracker_selection_menu-LEFT_UPPER_ARM = { -tracker_selection-part } แขนซ้ายส่วนบน?
tracker_selection_menu-LEFT_LOWER_ARM = { -tracker_selection-part } แขนซ้ายส่วนล่าง?
tracker_selection_menu-LEFT_HAND = { -tracker_selection-part } มือซ้าย?
@@ -503,10 +503,10 @@ settings-sidebar-osc_router = เราเตอร์ OSC
settings-sidebar-osc_trackers = แทร็กเกอร์ VRChat OSC
settings-sidebar-osc_vmc = VMC
settings-sidebar-utils = เครื่องมือ
settings-sidebar-serial = Serial Console
settings-sidebar-serial = คอนโซล Serial
settings-sidebar-appearance = รูปแบบ
settings-sidebar-home = หน้าหลัก
settings-sidebar-checklist = รายการเตรียมความพร้อมแทร็กกิ้ง
settings-sidebar-checklist = รายการเตรียมความพร้อมแทร็กเกอร์
settings-sidebar-notifications = การแจ้งเตือน
settings-sidebar-behavior = พฤติกรรมการทำงาน
settings-sidebar-firmware-tool = เครื่องมือเฟิร์มแวร์ DIY
@@ -550,7 +550,7 @@ 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 = ใช้ค่าการหมุนตามจริง จะไม่มีการกรองข้อมูลใดๆ
@@ -560,33 +560,33 @@ settings-general-tracker_mechanics-filtering-type-prediction = คาดกา
settings-general-tracker_mechanics-filtering-type-prediction-description = ลดความหน่วง และทำให้การเคลื่อนไหวฉับไวขึ้น แต่อาจเพิ่มการกระตุก
settings-general-tracker_mechanics-filtering-amount = ปริมาณ
settings-general-tracker_mechanics-yaw-reset-smooth-time = เวลาหน่วงการรีเซ็ตแกนตั้ง(ตั้งที่ 0 วินาทีเพื่อปิดการใช้)
settings-general-tracker_mechanics-drift_compensation = การชดเชยค่าดริฟท์
settings-general-tracker_mechanics-drift_compensation = การชดเชยการดริฟท์
# This cares about multilines
settings-general-tracker_mechanics-drift_compensation-description =
ชดเชยความคลาดเคลื่อนแกนตั้งของ IMU โดยหมุนชดเชยในทิศทางตรงข้าม
โดยนำปริมาณการรีเซ็ตและจำนวนครั้งในการรีเซ็ตมาพิจารณา
ควรใช้เฉพาะในกรณีที่คุณต้องรีเซ็ตบ่อยครั้งมากเท่านั้น!
settings-general-tracker_mechanics-drift_compensation-enabled-label = การชดเชยค่าดริฟท์
settings-general-tracker_mechanics-drift_compensation-prediction = การคาดการณ์การชดเชยค่าดริฟท์
settings-general-tracker_mechanics-drift_compensation-enabled-label = การชดเชยการดริฟท์
settings-general-tracker_mechanics-drift_compensation-prediction = การคาดการณ์การชดเชยการดริฟท์
# This cares about multilines
settings-general-tracker_mechanics-drift_compensation-prediction-description =
คาดการณ์การชดเชยค่าดริฟท์ของแกนตั้งนอกเหนือจากช่วงที่เคยถูกวัดไว้
คาดการณ์การชดเชยการดริฟท์ของแกนตั้งนอกเหนือจากช่วงที่เคยถูกวัดไว้
เปิดใช้งานหากแทร็กเกอร์ของคุณหมุนรอบแกนตั้งอย่างต่อเนื่อง
settings-general-tracker_mechanics-drift_compensation-prediction-label = คาดการณ์การชดเชยค่าดริฟท์
settings-general-tracker_mechanics-drift_compensation-prediction-label = คาดการณ์การชดเชยการดริฟท์
settings-general-tracker_mechanics-drift_compensation_warning =
<b>คำเตือน:</b> ควรใช้การชดเชยดริฟท์เฉพาะในกรณีที่คุณต้องรีเซ็ต
บ่อยครั้งมากเท่านั้น (ทุก ~5-10 นาที)
IMU บางตัวที่มีแนวโน้มที่จะต้องรีเซ็ตบ่อย ได้แก่:
Joy-Cons, owoTrack, และ MPU (หากเฟิร์มแวร์ไม่ได้รับการอัเดต)
Joy-Cons, owoTrack, และ MPU (หากเฟิร์มแวร์ไม่ได้รับการอัเดต)
settings-general-tracker_mechanics-drift_compensation_warning-cancel = ยกเลิก
settings-general-tracker_mechanics-drift_compensation_warning-done = ฉันเข้าใจแล้ว
settings-general-tracker_mechanics-drift_compensation-amount-label = ปริมาณการชดเชย
settings-general-tracker_mechanics-drift_compensation-max_resets-label = ใช้ค่าจากการรีเซ็ต X ครั้ง
settings-general-tracker_mechanics-save_mounting_reset = บันทึกการตั้งศูนย์การรีเซ็ตการติดตั้งอัตโนมัติ
settings-general-tracker_mechanics-save_mounting_reset = บันทึกค่าการตั้งศูนย์การติดตั้งโดยอัตโนมัติ
settings-general-tracker_mechanics-save_mounting_reset-description =
บันทึกการตั้งศูนย์การติดตั้งแทร็กเกอร์ระหว่างการรีสตาร์ท มีประโยชน์
เมื่อสวมชุดที่แทร็กเกอร์ไม่ขยับระหว่างเซสชัน <b>ไม่แนะนำสำหรับผู้ใช้ทั่วไป!</b>
บันทึกการตั้งศูนย์การติดตั้งแทร็กเกอร์อัตโนมัติ เพื่อใช้ซ้ำเมื่อรีสตาร์ท
มีประโยชน์เมื่อสวมชุดที่ตำแหน่งแทร็กเกอร์ไม่เปลี่ยนแปลงระหว่างการใช้งาน <b>ไม่แนะนำสำหรับผู้ใช้ทั่วไป!</b>
settings-general-tracker_mechanics-save_mounting_reset-enabled-label = บันทึกการรีเซ็ตการติดตั้ง
settings-general-tracker_mechanics-use_mag_on_all_trackers = ใช้เซ็นเซอร์สนามแม่เหล็กบนแทร็กเกอร์ที่ IMU รองรับ
settings-general-tracker_mechanics-use_mag_on_all_trackers-description =
@@ -597,12 +597,12 @@ settings-stay_aligned = Stay Aligned
settings-stay_aligned-description = Stay Aligned จะลดดริฟท์โดยค่อยๆ ปรับแทร็กเกอร์ให้เข้ากับท่าทางผ่อนคลายของคุณ
settings-stay_aligned-setup-label = ตั้งค่า Stay Aligned
settings-stay_aligned-setup-description = คุณต้องทำ "ตั้งค่า Stay Aligned" ให้เสร็จสมบูรณ์เพื่อเปิดใช้งาน Stay Aligned
settings-stay_aligned-warnings-drift_compensation = ⚠ โปรดปิด การชดเชยค่าดริฟท์! เพราะมันจะขัดแย้งกับการทำงานของ Stay Aligned
settings-stay_aligned-warnings-drift_compensation = ⚠ โปรดปิด การชดเชยการดริฟท์! เพราะมันจะขัดแย้งกับการทำงานของ Stay Aligned
settings-stay_aligned-enabled-label = เปิดใช้งาน
settings-stay_aligned-hide_yaw_correction-label = ซ่อนการปรับแต่ง (เพื่อเปรียบเทียบกับแบบไม่มี Stay Aligned)
settings-stay_aligned-general-label = ทั่วไป
settings-stay_aligned-relaxed_poses-label = ท่าทางผ่อนคลาย
settings-stay_aligned-relaxed_poses-description = Stay Aligned ใช้ท่าทางผ่อนคลายของคุณเพื่อให้แทร็กเกอร์อยู่ในแนวที่ถูกต้อง ใช้ "ตั้งค่า Stay Aligned" เพื่ออัเดตท่าทางเหล่านี้
settings-stay_aligned-relaxed_poses-description = Stay Aligned ใช้ท่าทางผ่อนคลายของคุณเพื่อให้แทร็กเกอร์อยู่ในแนวที่ถูกต้อง ใช้ "ตั้งค่า Stay Aligned" เพื่ออัเดตท่าทางเหล่านี้
settings-stay_aligned-relaxed_poses-standing = ปรับแทร็กเกอร์ขณะยืน
settings-stay_aligned-relaxed_poses-sitting = ปรับแทร็กเกอร์ขณะนั่งเก้าอี้
settings-stay_aligned-relaxed_poses-flat = ปรับแทร็กเกอร์ขณะนั่งบนพื้น หรือนอนหงาย
@@ -628,10 +628,10 @@ settings-general-fk_settings-leg_tweak-skating_correction = การแก้
settings-general-fk_settings-leg_tweak-toe_snap = เดาการหมุนเท้า
settings-general-fk_settings-leg_tweak-foot_plant = ปรับสมดุลเท้า
settings-general-fk_settings-leg_tweak-skating_correction-amount = ปริมาณการแก้ไขการไถล
settings-general-fk_settings-leg_tweak-skating_correction-description = การแก้ไขการไถล จะแก้ไขปัญหาที่เท้าสไลด์เหมือนเล่นสเก็ตน้ำแข็ง แต่สามารถลดความแม่นยำในการเคลื่อนไหวบางรูปแบบ เมื่อเปิดใช้งานแล้วต้องทำการรีเซ็ตแทร็กเกอร์ทั้งหมด แล้วตั้งศูนย์หรือปรับเทียบใหม่ในเกม
settings-general-fk_settings-leg_tweak-floor_clip-description = การลอกระดับพื้นสามารถลดหรือกำจัดการทะลุผ่านพื้นได้ เมื่อเปิดใช้งานแล้วต้องทำการรีเซ็ตแทร็กเกอร์ทั้งหมด แล้วตั้งศูนย์หรือปรับเทียบใหม่ในเกม
settings-general-fk_settings-leg_tweak-skating_correction-description = การแก้ไขการไถล จะแก้ไขปัญหาที่เท้าสไลด์เหมือนเล่นสเก็ตน้ำแข็ง แต่สามารถลดความแม่นยำในการเคลื่อนไหวบางรูปแบบ เมื่อเปิดใช้งานแล้วต้องทำการรีเซ็ตทั้งหมด แล้วตั้งศูนย์หรือปรับเทียบใหม่ในเกม
settings-general-fk_settings-leg_tweak-floor_clip-description = การลอกระดับพื้นสามารถลดหรือกำจัดการทะลุผ่านพื้นได้ เมื่อเปิดใช้งานแล้วต้องทำการรีเซ็ตทั้งหมด แล้วตั้งศูนย์หรือปรับเทียบใหม่ในเกม
settings-general-fk_settings-leg_tweak-toe_snap-description = การเดาการหมุนของเท้า จะพยายามคาดเดาการหมุนของเท้า หากไม่ได้ใช้แทร็กเกอร์เท้า
settings-general-fk_settings-leg_tweak-foot_plant-description = การปรับสมดุลย์เท้า จะหมุนเท้าให้ขนานกับพื้นเมื่อมีการสัมผัสพื้น
settings-general-fk_settings-leg_tweak-foot_plant-description = การปรับสมดุลเท้า จะหมุนเท้าให้ขนานกับพื้นเมื่อมีการสัมผัสพื้น
settings-general-fk_settings-leg_fk = การจับตำแหน่งขา
settings-general-fk_settings-leg_fk-reset_mounting_feet-description-v1 = บังคับรีเซ็ตการติดตั้งเท้าในระหว่างการรีเซ็ตการติดตั้งทั่วไป
settings-general-fk_settings-leg_fk-reset_mounting_feet-v1 = บังคับรีเซ็ตการติดตั้งเท้า
@@ -642,20 +642,20 @@ settings-general-fk_settings-enforce_joint_constraints-correct_constraints = แ
settings-general-fk_settings-enforce_joint_constraints-correct_constraints-description = แก้ไขการหมุนของข้อต่อเมื่อมีการหมุนเกินขีดจำกัด
settings-general-fk_settings-ik = ข้อมูลตำแหน่ง
settings-general-fk_settings-ik-use_position = ใช้ข้อมูลตำแหน่ง
settings-general-fk_settings-ik-use_position-description = เปิดใช้งานการใช้ข้อมูลตำแหน่งจากแทร็กเกอร์ที่รองรับ เมื่อเปิดใช้งานแล้วโปรดทำการรีเซ็ตแทร็กเกอร์ทั้งหมด แล้วตั้งศูนย์หรือปรับเทียบใหม่ในเกม
settings-general-fk_settings-ik-use_position-description = เปิดใช้งานการใช้ข้อมูลตำแหน่งจากแทร็กเกอร์ที่รองรับ เมื่อเปิดใช้งานแล้วโปรดทำการรีเซ็ตทั้งหมด แล้วตั้งศูนย์หรือปรับเทียบใหม่ในเกม
settings-general-fk_settings-arm_fk = การจับตำแหน่งแขน
settings-general-fk_settings-arm_fk-description = บังคับให้ใช้ตำแหน่งแขนจากแว่น VR แม้ว่าจะมีข้อมูลตำแหน่งมืออยู่ก็ตาม
settings-general-fk_settings-arm_fk-description = บังคับให้ติดตามแขนจากเฮดเซ็ต (HMD) แม้ว่าจะมีข้อมูลตำแหน่งมืออยู่ก็ตาม
settings-general-fk_settings-arm_fk-force_arms = บังคับใช้ตำแหน่งแขนจากแว่น
settings-general-fk_settings-reset_settings = ตั้งค่าการรีเซ็ต
settings-general-fk_settings-reset_settings-reset_hmd_pitch-description = รีเซ็ตความเอียง (การหมุนก้มหรือเงย) ของ HMD เมื่อทำการรีเซ็ตแทร็กเกอร์ทั้งหมด มีประโยชน์หากสวม HMD ไว้ที่หน้าผากสำหรับ VTubing หรือ MoCap ไม่ควรเปิดใช้งานสำหรับการใช้งาน VR ทั่วไป
settings-general-fk_settings-reset_settings-reset_hmd_pitch-description = รีเซ็ตความเอียง (การหมุนก้มหรือเงย) ของ HMD เมื่อทำการรีเซ็ตทั้งหมด มีประโยชน์หากสวม HMD ไว้ที่หน้าผากสำหรับ VTubing หรือ MoCap ไม่ควรเปิดใช้งานสำหรับการใช้งาน VR ทั่วไป
settings-general-fk_settings-reset_settings-reset_hmd_pitch = รีเซ็ตความเอียงของ HMD
settings-general-fk_settings-arm_fk-reset_mode-description = เปลี่ยนท่าทางแขนที่ใช้สำหรับการรีเซ็ตตั้งศูนย์การติดตั้ง
settings-general-fk_settings-arm_fk-back = ยื่นไปด้านหลัง
settings-general-fk_settings-arm_fk-back-description = โหมดค่าเริ่มต้น โดยแขนท่อนบนจะเอียงไปด้านหลัง และแขนท่อนล่างจะชี้ไปด้านหน้า
settings-general-fk_settings-arm_fk-tpose_up = ที-โพส (แขนขึ้น)
settings-general-fk_settings-arm_fk-tpose_up-description = กำหนดให้แขนแนบลำตัวระหว่างการรีเซ็ตแทร็กเกอร์ทั้งหมด และเหยียดออกด้านข้าง 90 องศา ระหว่างการรีเซ็ตตั้งศูนย์การติดตั้ง
settings-general-fk_settings-arm_fk-tpose_up-description = กำหนดให้แขนแนบลำตัวระหว่างการรีเซ็ตทั้งหมด และเหยียดออกด้านข้าง 90 องศา ระหว่างการรีเซ็ตตั้งศูนย์การติดตั้ง
settings-general-fk_settings-arm_fk-tpose_down = ที-โพส (แขนลง)
settings-general-fk_settings-arm_fk-tpose_down-description = กำหนดให้แขนเหยียดออกด้านข้าง 90 องศา ระหว่างการรีเซ็ตแทร็กเกอร์ทั้งหมดและแนบลำตัว ระหว่างการรีเซ็ตตั้งศูนย์การติดตั้ง
settings-general-fk_settings-arm_fk-tpose_down-description = กำหนดให้แขนเหยียดออกด้านข้าง 90 องศา ระหว่างการรีเซ็ตทั้งหมดและแนบลำตัว ระหว่างการรีเซ็ตตั้งศูนย์การติดตั้ง
settings-general-fk_settings-arm_fk-forward = ไปข้างหน้า
settings-general-fk_settings-arm_fk-forward-description = กำหนดให้แขนยกไปด้านหน้าทำมุม 90 องศา มีประโยชน์สำหรับงาน VTubing
settings-general-fk_settings-skeleton_settings-toggles = ตัวเลือกโครงกระดูก
@@ -670,7 +670,7 @@ settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_legs =
settings-general-fk_settings-skeleton_settings-impute_hip_from_chest_legs = คำนวณตำแหน่งสะโพกจากอกและขา
settings-general-fk_settings-skeleton_settings-impute_hip_from_waist_legs = คำนวณตำแหน่งสะโพกจากเอวและขา
settings-general-fk_settings-skeleton_settings-interp_hip_legs = เฉลี่ยค่าแกนตั้งและแกนยาวของสะโพกร่วมกับขา
settings-general-fk_settings-skeleton_settings-interp_knee_tracker_ankle = เฉลี่ยค่าแกนตั้งและแกนยาวของตัวแทร็กเกอร์เข่าร่วมกับข้อเท้า
settings-general-fk_settings-skeleton_settings-interp_knee_tracker_ankle = เฉลี่ยค่าแกนตั้งและแกนยาวของแทร็กเกอร์เข่าร่วมกับข้อเท้า
settings-general-fk_settings-skeleton_settings-interp_knee_ankle = เฉลี่ยค่าแกนตั้งและแกนยาวของเข่าร่วมกับข้อเท้า
settings-general-fk_settings-self_localization-title = โหมด Mocap
settings-general-fk_settings-self_localization-description = โหมด Mocap ช่วยให้โมเดลโครงกระดูกสามารถติดตามตำแหน่งโดยประมาณได้ โดยไม่ต้องใช้อุปกรณ์เฮดเซต (แว่น VR ) หรือแทร็กเกอร์อื่น ๆ โปรดทราบว่าฟังก์ชันนี้ต้องใช้แทร็กเกอร์ที่เท้าและศีรษะจึงจะทำงานได้ และยังอยู่ในช่วงทดลอง
@@ -679,7 +679,7 @@ settings-general-fk_settings-self_localization-description = โหมด Mocap
settings-general-gesture_control = การควบคุมด้วยท่าทาง
settings-general-gesture_control-subtitle = การรีเซ็ตด้วยการแตะ
settings-general-gesture_control-description = เปิดใช้การรีเซ็ตด้วยการแตะแทร็กเกอร์ แทร็กเกอร์ที่อยู่สูงที่สุดบนลำตัวจะใช้สำหรับการรีเซ็ตแกนตั้ง แทร็กเกอร์ที่อยู่สูงที่สุดบนขาซ้ายใช้สำหรับรีเซ็ตแทร็กเกอร์ทั้งหมด และแทร็กเกอร์ที่อยู่สูงที่สุดบนขาขวาใช้สำหรับรีเซ็ตตั้งศูนย์การติดตั้ง โดยการแตะจะต้องเกิดขึ้นภายในเวลา 0.3 วินาทีคูณด้วยจำนวนครั้งของการแตะเพื่อให้ระบบรับรู้
settings-general-gesture_control-description = เปิดใช้การรีเซ็ตด้วยการแตะแทร็กเกอร์ แทร็กเกอร์ที่อยู่สูงที่สุดบนลำตัวจะใช้สำหรับการรีเซ็ตแกนตั้ง แทร็กเกอร์ที่อยู่สูงที่สุดบนขาซ้ายใช้สำหรับรีเซ็ตทั้งหมด และแทร็กเกอร์ที่อยู่สูงที่สุดบนขาขวาใช้สำหรับรีเซ็ตตั้งศูนย์การติดตั้ง โดยการแตะจะต้องเกิดขึ้นภายในเวลา 0.3 วินาทีคูณด้วยจำนวนครั้งของการแตะเพื่อให้ระบบรับรู้
# 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 } ครั้ง
@@ -689,7 +689,7 @@ settings-general-gesture_control-trackers = { $amount } ตัว
settings-general-gesture_control-yawResetEnabled = ใช้การแตะเพื่อรีเซ็ตแกนตั้ง
settings-general-gesture_control-yawResetDelay = เวลาหน่วงก่อนรีเซ็ตแกนตั้ง
settings-general-gesture_control-yawResetTaps = แตะเพื่อรีเซ็ตแกนตั้ง
settings-general-gesture_control-fullResetEnabled = ใช้การแตะเพื่อรีเซ็ตแทร็กเกอร์ทั้งหมด
settings-general-gesture_control-fullResetEnabled = ใช้การแตะเพื่อรีเซ็ตทั้งหมด
settings-general-gesture_control-fullResetDelay = เวลาหน่วงก่อนรีเซ็ตทั้งหมด
settings-general-gesture_control-fullResetTaps = แตะเพื่อรีเซ็ตทั้งหมด
settings-general-gesture_control-mountingResetEnabled = ใช้การแตะเพื่อรีเซ็ตการตั้งศูนย์การติดตั้ง
@@ -729,7 +729,7 @@ settings-interface-appearance-decorations-label = ใช้แถบด้าน
settings-interface-notifications = การแจ้งเตือน
settings-general-interface-serial_detection = การตรวจจับอุปกรณ์ Serial
settings-general-interface-serial_detection-description = ตัวเลือกนี้จะแสดงหน้าต่างป๊อปอัพทุกครั้งที่คุณเสียบอุปกรณ์ Serial ใหม่ที่อาจเป็นแทร็กเกอร์ ช่วยลดขั้นตอนการตั้งค่าแทร็กเกอร์
settings-general-interface-serial_detection-label = ใช้การตรวจจับอุปกรณ์ซีเรียล
settings-general-interface-serial_detection-label = ใช้การตรวจจับอุปกรณ์ Serial
settings-general-interface-feedback_sound = การแจ้งเตือนด้วยเสียง
settings-general-interface-feedback_sound-description = ตัวเลือกนี้จะเล่นเสียงเมื่อมีการใช้การรีเซ็ต
settings-general-interface-feedback_sound-label = แจ้งเตือนด้วยเสียง
@@ -766,7 +766,7 @@ settings-interface-behavior-bvh_directory-label = ไดเร็กทอรี
## Serial settings
settings-serial = Serial Console
settings-serial = คอนโซล Serial
# This cares about multilines
settings-serial-description =
นี่คือฟีดข้อมูลสดสำหรับการสื่อสารแบบ Serial
@@ -823,7 +823,7 @@ settings-osc-vrchat = แทร็กเกอร์ OSC VRChat
# This cares about multilines
settings-osc-vrchat-description-v1 =
เปลี่ยนการตั้งค่าเฉพาะสำหรับมาตรฐานแทร็กเกอร์ OSC ที่ใช้ในการส่งข้อมูลการติดตาม
ไปยังแอปพลิเคชันที่ไม่ได้ใช้ SteamVR (เช่นอุปกรณ์ VR แบบเดี่ยว)
ไปยังแอปพลิเคชันที่ไม่ได้ใช้ SteamVR (เช่น เฮดเซ็ท VR แบบ Standalone )
ตรวจสอบให้แน่ใจว่าได้เปิดใช้งาน OSC ใน VRChat ผ่านเมนู Action Menu แล้วไปที่ ตัวเลือก>OSC > เปิดใช้งาน
settings-osc-vrchat-enable = เปิดใช้งาน
settings-osc-vrchat-enable-description = เปิดการรับและส่งข้อมูล
@@ -832,7 +832,7 @@ settings-osc-vrchat-oscqueryEnabled = เปิดใช้งาน OSCQuery
settings-osc-vrchat-oscqueryEnabled-description =
OSCQuery จะตรวจจับอินสแตนซ์ของ VRChat ที่กำลังทำงานโดยอัตโนมัติ และส่งข้อมูลไปให้
และยังสามารถประกาศตัวเองเพื่อให้ได้รับข้อมูลจาก HMD และของคอนโทรเลอร์จาก VRChat ได้อีกด้วย
หากต้องการอนุญาตให้รับข้อมูล HMD และตัวควบคุมจาก VRChat ให้ไปที่การตั้งค่าเมนูหลัก ใต้ "การติดตาม & IK" และเปิดใช้งาน "อนุญาตให้ส่งข้อมูลการติดตามศีษะและข้อมือ VR ผ่าน OSC"
หากต้องการอนุญาตให้รับข้อมูล HMD และตัวควบคุมจาก VRChat ให้ไปที่การตั้งค่าเมนูหลัก ใต้ "การติดตาม & IK" และเปิดใช้งาน "อนุญาตให้ส่งข้อมูลการติดตามศีษะและข้อมือ VR ผ่าน OSC"
settings-osc-vrchat-oscqueryEnabled-label = เปิดใช้งาน OSCQuery
settings-osc-vrchat-network = พอร์ตเครือข่าย
settings-osc-vrchat-network-description-v1 = ตั้งค่าพอร์ตสำหรับการรับฟังและการส่งข้อมูล สามารถปล่อยว่างไว้สำหรับ VRChat
@@ -872,18 +872,18 @@ settings-osc-vmc-network-port_out =
.label = พอร์ตขาออก
.placeholder = พอร์ตขาออก (ค่าเริ่มต้น: 39539)
settings-osc-vmc-network-address = ที่อยู่เครือข่าย
settings-osc-vmc-network-address-description = เลือกที่อยู่เครือข่ายที่จะส่งข้อมูลผ่าน VMC
settings-osc-vmc-network-address-description = เลือกที่อยู่เครือข่ายที่จะส่งข้อมูลผ่าน VMC
settings-osc-vmc-network-address-placeholder = ที่อยู่ IPV4
settings-osc-vmc-vrm = โมเดล VRM
settings-osc-vmc-vrm-description = โหลดโมเดล VRM เพื่อเปิดใช้งานการยึดศีรษะและเพิ่มความเข้ากันได้กับแอปพลิเคชันอื่น
settings-osc-vmc-vrm-untitled_model = โมเดลที่ไม่มีชื่อ
settings-osc-vmc-vrm-file_select = ลากและวางโมเดลหรือ <u>ค้นหา</u>
settings-osc-vmc-anchor_hip = ตรึงตำแหน่งที่สะโพก
settings-osc-vmc-anchor_hip-description = ตรึงการติดตามตำแหน่งไว้ที่สะโพก มีประโยชน์สำหรับการทำ VTubing ขณะนั่ง
settings-osc-vmc-anchor_hip-label = ตรึงตำแหน่งสะโพก
settings-osc-vmc-anchor_hip = ยึดตำแหน่งที่สะโพก
settings-osc-vmc-anchor_hip-description = ยึดการติดตามที่สะโพก มีประโยชน์สำหรับการทำ VTubing ในขณะนั่ง หากปิดใช้งาน ให้โหลดโมเดล VRM
settings-osc-vmc-anchor_hip-label = ยึดแหน่งที่สะโพก
settings-osc-vmc-mirror_tracking = สะท้อนตำแหน่งการติดตาม
settings-osc-vmc-mirror_tracking-description = สะท้อนการติดตามในแนวนอน
settings-osc-vmc-mirror_tracking-label = สะท้อนการติดตาม
settings-osc-vmc-mirror_tracking-label = สะท้อนตำแหน่งการติดตาม
## Common OSC settings
@@ -896,7 +896,7 @@ settings-utils-advanced = ขั้นสูง
settings-utils-advanced-reset-gui = รีเซ็ตตั้งค่า GUI
settings-utils-advanced-reset-gui-description = คืนค่าการตั้งค่าเริ่มต้นสำหรับอินเทอร์เฟซ
settings-utils-advanced-reset-gui-label = รีเซ็ต GUI
settings-utils-advanced-reset-server = รีเซ็ตตั้งค่าการแทร็กกิ้ง
settings-utils-advanced-reset-server = รีเซ็ตการตั้งค่าการติดตาม
settings-utils-advanced-reset-server-description = คืนค่าการจับตำแหน่งทั้งหมดเป็นค่าเริ่มต้น
settings-utils-advanced-reset-server-label = รีเซ็ตการจับตำแหน่ง
settings-utils-advanced-reset-all = รีเซ็ตการตั้งค่าทั้งหมด
@@ -904,17 +904,17 @@ settings-utils-advanced-reset-all-description = คืนค่าการต
settings-utils-advanced-reset-all-label = รีเซ็ตทั้งหมด
settings-utils-advanced-reset_warning =
{ $type ->
[gui] <b>คำเตือน:</b>การดำเนินการนี้จะรีเซ็ตการตั้งค่า GUI เป็นค่าเริ่มต้น คุณแน่ใจที่จะดำเนินการต่อไหม?
[gui] <b>คำเตือน:</b>การดำเนินการนี้จะรีเซ็ตการตั้งค่าอินเทอร์เฟซทั้งหมดเป็นค่าเริ่มต้น คุณแน่ใจที่จะดำเนินการต่อไหม?
[server] <b>คำเตือน:</b>การดำเนินการนี้จะรีเซ็ตการตั้งค่าการจับตำแหน่งเป็นค่าเริ่มต้น คุณแน่ใจที่จะดำเนินการต่อไหม?
*[all] <b>คำเตือน:</b>การดำเนินการนี้จะรีเซ็ตการตั้งค่าทั้งหมดเป็นค่าเริ่มต้น คุณแน่ใจที่จะดำเนินการต่อไหม?
}
settings-utils-advanced-reset_warning-reset = รีเซ็ตการตั้งค่า
settings-utils-advanced-reset_warning-cancel = ยกเลิก
settings-utils-advanced-open_data-v1 = โฟลเดอร์การตั้งค่า
settings-utils-advanced-open_data-description-v1 = เปิดโฟลเดอร์การตั้งค่าของ SlimeVR โดยจะมีไฟล์การตั้งค่าโปรแกรมด้านใน
settings-utils-advanced-open_data-description-v1 = เปิดโฟลเดอร์การตั้งค่าของ SlimeVR โดยภายในจะมีไฟล์การตั้งค่าโปรแกรม
settings-utils-advanced-open_data-label = เปิดโฟลเดอร์
settings-utils-advanced-open_logs = โฟลเดอร์บันทึก
settings-utils-advanced-open_logs-description = เปิดโฟลเดอร์บันทึกไฟล์ของ SlimeVR โดยจะมีไฟล์บันทึกการทำงานของแอป
settings-utils-advanced-open_logs-description = เปิดโฟลเดอร์บันทึกไฟล์ของ SlimeVR โดยภายในจะมีไฟล์บันทึกการทำงานของแอป
settings-utils-advanced-open_logs-label = เปิดโฟลเดอร์
## Home Screen
@@ -933,22 +933,24 @@ settings-tracking_checklist-active_steps-desc = รายการขั้น
onboarding-skip = ข้ามการตั้งค่า
onboarding-continue = ดำเนินการต่อ
onboarding-wip = อยู่ในระหว่างการดำเนินการ
onboarding-wip = ยังไม่พร้อมใช้งาน
onboarding-previous_step = ขั้นตอนก่อนหน้า
onboarding-setup_warning =
<b>คำเตือน:</b> การตั้งค่าเริ่มต้นนี้จำเป็นสำหรับการจับตำแหน่งที่ดี
จำเป็นต้องดำเนินกาหากนี่เป็นครั้งแรกที่คุณใช้ SlimeVR
จำเป็นต้องดำเนินกาหากนี่เป็นครั้งแรกที่คุณใช้ SlimeVR
onboarding-setup_warning-skip = ข้ามการตั้งค่า
onboarding-setup_warning-cancel = ดำเนินการตั้งค่าต่อ
## Wi-Fi setup
onboarding-wifi_creds-back = กลับไปที่หน้าบทนำ
onboarding-wifi_creds = ป้อนข้อมูลประจำตัว Wi-Fi
onboarding-wifi_creds-v2 = แทร็กเกอร์ที่ใช้ Wi-Fi
# This cares about multilines
onboarding-wifi_creds-description =
แทร็กเกอร์จะใช้ข้อมูลประจำตัวเหล่านี้ในการเชื่อมต่อแบบไร้สาย
โปรดใช้ข้อมูลประจำตัวที่คุณกำลังเชื่อมต่ออยู่ในปัจจุบัน
onboarding-wifi_creds-description-v2 =
แทร็กเกอร์ส่วนใหญ่ (เช่นแทร็กเกอร์ทางการของ SlimeVR ) ใช้ Wi-Fi เพื่อเชื่อมต่อกับเซิร์ฟเวอร์
โปรดใช้ข้อมูลเครือข่าย Wi-Fi ที่อุปกรณ์ของคุณกำลังเชื่อมต่ออยู่
และตรวจสอบให้แน่ใจว่าคุณใช้การเชื่อมต่อ Wi-Fi เป็นคลื่น 2.4GHz กับแทร็กเกอร์นี้
onboarding-wifi_creds-skip = ข้ามการตั้งค่า Wi-Fi
onboarding-wifi_creds-submit = ยืนยัน!
onboarding-wifi_creds-ssid =
@@ -958,29 +960,33 @@ onboarding-wifi_creds-ssid-required = ต้องระบุชื่อ Wi-Fi
onboarding-wifi_creds-password =
.label = รหัสผ่าน
.placeholder = ป้อนรหัสผ่าน
onboarding-wifi_creds-dongle-title = แทร็กเกอร์ที่ใช้ดองเกิล
onboarding-wifi_creds-dongle-description = หากแทร็กเกอร์ของคุณมาพร้อมกับดองเกิล ให้เสียบมันเข้ากับอุปกรณ์ของคุณ แล้วก็สามารถเริ่มต้นใช้งานได้เลย!
onboarding-wifi_creds-dongle-wip = ส่วนนี้กำลังอยู่ระหว่างการพัฒนา เป็นหน้าสำหรับจัดการแทร็กเกอรืที่เชื่อมต่อผ่านดองเกิลที่กำลังจะถูกทำขึ้นมาเร็วๆ นี้
onboarding-wifi_creds-dongle-continue = ดำเนินการต่อด้วยดองเกิล
## Mounting setup
onboarding-reset_tutorial-back = กลับไปยังการตั้งศูนย์การติดตั้งแทร็กเกอร์
onboarding-reset_tutorial = บทช่วยสอนการรีเซ็ต
onboarding-reset_tutorial-explanation = ขณะใช้งานแทร็กเกอร์ของคุณอาจคลาดเคลื่อนเนื่องจากการดริฟท์ของแกนตั้งของ IMU หรือจากการเคลื่อนที่ทางกายภาพของตัวแทร็กเกอร์เอง คุณมีวิธีการแก้ไขหลายวิธี
onboarding-reset_tutorial-explanation = ขณะที่คุณใช้แทร็กเกอร์ มันอาจเกิดการคลาดเคลื่อนขึ้นได้เนื่องจากการดริฟท์ของ IMU หรือจากการที่แทร็กเกอร์บนตัวคุณนั้นขยับออกจากตำแหน่ง คุณมีหลายวิธีในการแก้ไขปัญหานี้
onboarding-reset_tutorial-skip = ข้ามขั้นตอนนี้
# Cares about multiline
onboarding-reset_tutorial-0 =
แตะแทร็กเกอร์ที่ถูกเน้น { $taps } ครั้ง ในการรีเซ็ตแกนตั้ง
นี่จะทำให้แทร็กเกอร์หันไปด้านเดียวกับแว่น VR ของคุณ
แตะแทร็กเกอร์ที่ไฮไลท์ { $taps } ครั้ง เพื่อเรียกใช้การรีเซ็ตแกนตั้ง
นี่จะทำให้แทร็กเกอร์หันไปในทิศทางเดียวกับเฮดเซ็ท (HMD) ของคุณ
# Cares about multiline
onboarding-reset_tutorial-1 =
แตะแทร็กเกอร์ที่ถูกเน้น { $taps } ครั้ง ในการรีเซ็ตแทรกเกอร์ทั้งหมด
คุณจำเป็นจะต้องยืนตรง แขนแนบลำตัวในการรีเซ็ตนี้(i-pose) จะมีดีเลย์ 3 วินาที (สามารถปรับได้) ก่อนจะเริ่มการรีเซ็ต
นี่จะรีเซ็ตตำแหน่งและค่าหมุนของแทร็กเกอร์ทั้งหมดกลับมาที่เดิม ซึ่งช่วยแก้ปัญหาส่วนใหญ่ได้
แตะแทร็กเกอร์ที่ไฮไลท์ { $taps } ครั้ง เพื่อเรียกใช้การรีเซ็ตทั้งหมด
คุณจำเป็นจะต้องยืนตรง แขนแนบลำตัว(i-pose) จะนับถอยหลัง 3 วินาที (สามารถปรับได้) ก่อนที่การรีเซ็ตจะเกิดขึ้น
นี่จะรีเซ็ตตำแหน่งและการหมุนของแทร็กเกอร์ทั้งหมดของคุณ ซึ่งช่วยแก้ปัญหาส่วนใหญ่ได้
# Cares about multiline
onboarding-reset_tutorial-2 =
แตะไปยังแทร็กเกอร์ที่ถูกเน้น { $taps } ครั้ง เพื่อทำการรีเซ็ตตำแหน่งแทร็กเกอร์
แตะแทร็กเกอร์ที่ไฮไลท์ { $taps } ครั้ง เพื่อเรียกใช้การตั้งศูนย์การติดตั้ง
รีเซ็ตตำแหน่งนั้นช่วยปรับตำแหน่งที่แทร็กเกอร์ถูกวางบนตัวคุณจริงๆ ดังนั้นหากคุณเผลอเคลื่อนย้ายแทร็กเกอร์และเปลี่ยนทิศทางของมันไปมาก สิ่งนี้จะช่วยแก้ไขได้
การตั้งศูนย์การติดตั้งจะปรับแก้ตามวิธีการวางแทร็กเกอร์บนร่างกายของคุณ นี่จะช่วยคุณได้มากหากคุณเผลอเคลื่อนย้ายหรือเปลี่ยนทิศทางของแทร็กเกอร์จนมากเกินไป
คุณต้องอยู่ในท่าเหมือนกำลังเล่นสกีตามที่แสดงในตัวช่วยการติดตั้งอัตโนมัติ โดยจะนับถอยหลังใน 3 วิาที (สามารถกำหนดได้) ก่อนจะทำการรีเซ็ต
คุณต้องอยู่ในท่าเล่นสกีตามที่แสดงในตัวช่วยตั้งค่า โดยจะนับถอยหลังใน 3 วิาที (สามารถกำหนดได้) ก่อนที่การรีเซ็ตจะเกิดขึ้น
## Setup start
@@ -995,25 +1001,25 @@ onboarding-done-close = ปิดการตั้งค่า
## Tracker connection setup
onboarding-connect_tracker-back = กลับไปหน้าข้อมูล Wi-Fi
onboarding-connect_tracker-back = กลับไปหน้าข้อมูลเครือข่าย Wi-Fi
onboarding-connect_tracker-title = เชื่อมต่อแทร็กเกอร์
onboarding-connect_tracker-description-p0-v1 = มาถึงส่วนที่สนุกแล้ว การเชื่อมต่อแทร็กเกอร์!
onboarding-connect_tracker-description-p0-v1 = มาถึงส่วนที่น่าสนใจแล้ว คือการเชื่อมต่อแทร็กเกอร์!
onboarding-connect_tracker-description-p1-v1 = เชื่อมต่อแทร็กเกอร์ทีละตัวผ่านพอร์ต USB
onboarding-connect_tracker-issue-serial = ฉันมีปัญหาในการเชื่อมต่อ!
onboarding-connect_tracker-usb = USB แทร็กเกอร์
onboarding-connect_tracker-connection_status-none = กำลังมองหาแทร็กเกอร์...
onboarding-connect_tracker-connection_status-none = กำลังค้นหาแทร็กเกอร์
onboarding-connect_tracker-connection_status-serial_init = กำลังเชื่อมต่อกับอุปกรณ์ Serial
onboarding-connect_tracker-connection_status-obtaining_mac_address = กำลังรับ MAC address ของแทร็กเกอร์
onboarding-connect_tracker-connection_status-provisioning = กำลังส่งข้อมูล Wi-Fi
onboarding-connect_tracker-connection_status-provisioning = กำลังส่งข้อมูลเครือข่าย Wi-Fi
onboarding-connect_tracker-connection_status-connecting = กำลังพยายามเชื่อมต่อ Wi-Fi
onboarding-connect_tracker-connection_status-looking_for_server = กำลังหาเซิร์ฟเวอร์
onboarding-connect_tracker-connection_status-connection_error = ไม่สามารถเชื่อมต่อกับ Wi-Fi
onboarding-connect_tracker-connection_status-could_not_find_server = ไม่พบเซิร์ฟเวอร์
onboarding-connect_tracker-connection_status-done = เชื่อมต่อกับเซิร์ฟเวอร์แล้ว
onboarding-connect_tracker-connection_status-no_serial_log = ไม่สามารถรับบันทึกจากแทร็กเกอร์ได้
onboarding-connect_tracker-connection_status-no_serial_device_found = ไม่สามารถหาแทร็กเกอร์จาก USB
onboarding-connect_tracker-connection_status-no_serial_device_found = ไม่พบแทร็กเกอร์จาก USB
onboarding-connect_serial-error-modal-no_serial_log = แทร็กเกอร์คุณเปิดอยู่หรือเปล่า?
onboarding-connect_serial-error-modal-no_serial_log-desc = ตรวจสอบให้แน่ใจว่าแทร็กเกอร์นั้นเปิดอยู่และเชื่อมต่อกับคอมพิวเตอร์ของคุณ
onboarding-connect_serial-error-modal-no_serial_log-desc = ตรวจสอบให้แน่ใจว่าแทร็กเกอร์เปิดอยู่และเชื่อมต่อกับคอมพิวเตอร์ของคุณ
onboarding-connect_serial-error-modal-no_serial_device_found = ไม่พบแทร็กเกอร์
onboarding-connect_serial-error-modal-no_serial_device_found-desc =
โปรดเชื่อมต่อแทร็กเกอร์ด้วยสาย USB เข้ากับคอมพิวเตอร์ของคุณและเปิดแทร็กเกอร์
@@ -1036,8 +1042,8 @@ onboarding-connect_tracker-next = ฉันเชื่อมต่อแทร
## Tracker calibration tutorial
onboarding-calibration_tutorial = บทเรียนการตั้งศูนย์ IMU
onboarding-calibration_tutorial-subtitle = นี่จะช่วยลดค่าดริฟท์ของแทร็กเกอร์!
onboarding-calibration_tutorial-description-v1 = หลังจากเปิดแทร็กเกอร์แล้ว ให้วางไว้บนพื้นผิวที่มั่นคงสักครู่เพื่อทำการตั้งศูนย์ การตั้งศูนย์ IMU สามารถทำได้ตลอดเวลาหลังจากเปิดแทร็กเกอร์—หน้าจอนี้เพียงแค่ให้บทช่วยสอน หากต้องการเริ่ม ให้คลิกปุ่ม "{ onboarding-calibration_tutorial-calibrate }" จากนั้น <b>อย่าขยับแทร็กเกอร์ของคุณ!</b>
onboarding-calibration_tutorial-subtitle = นี่จะช่วยลดการดริฟท์ของแทร็กเกอร์!
onboarding-calibration_tutorial-description-v1 = หลังจากเปิดแทร็กเกอร์แล้ว ให้วางไว้บนพื้นที่เรียบนิ่งๆสักครู่เพื่อทำการตั้งศูนย์ การตั้งศูนย์ IMU สามารถทำได้ตลอดเวลาหลังจากเปิดแทร็กเกอร์—หน้าจอนี้เพียงแค่ให้บทช่วยสอน หากต้องการเริ่ม ให้คลิกปุ่ม "{ onboarding-calibration_tutorial-calibrate }" จากนั้น <b>อย่าขยับแทร็กเกอร์ของคุณ!</b>
onboarding-calibration_tutorial-calibrate = ฉันวางแทร็กเกอร์บนโต๊ะแล้ว
onboarding-calibration_tutorial-status-waiting = กำลังรอคุณอยู่
onboarding-calibration_tutorial-status-calibrating = กำลังตั้งศูนย์
@@ -1048,7 +1054,7 @@ onboarding-calibration_tutorial-skip = ข้ามบทช่วยสอน
## Tracker assignment tutorial
onboarding-assignment_tutorial = วิธีเตรียมแทร็กเกอร์ Slime ก่อนสวมใส่
onboarding-assignment_tutorial-first_step = 1. ติดสติกเกอร์ส่วนของร่างกาย (หากคุณมี) บนแทร็กเกอร์ตามที่คุณเลือก
onboarding-assignment_tutorial-first_step = 1. ติดสติกเกอร์บอกส่วนของร่างกาย (หากคุณมี) บนแทร็กเกอร์ตามที่คุณเลือก
# This text has a character limit of around 11 characters, so please keep it short
onboarding-assignment_tutorial-sticker = สติกเกอร์
onboarding-assignment_tutorial-second_step-v2 = 2. ติดสายรัดเข้ากับแทร็กเกอร์ของคุณ โดยให้ด้านหนามเตยของสายรัดหันไปในทิศทางเดียวกับหน้าของแทร็กเกอร์:
@@ -1057,17 +1063,17 @@ onboarding-assignment_tutorial-done = ฉันแปะสติกเกอร
## Tracker assignment setup
onboarding-assign_trackers-back = กลับไปยังการตั้งค่า Wi-Fi
onboarding-assign_trackers-back = กลับไปยังการตั้งค่าข้อมูลเครือข่าย Wi-Fi
onboarding-assign_trackers-title = กำหนดตำแหน่งแทร็กเกอร์
onboarding-assign_trackers-description = มาเลือกกันเลยว่าแทร็กเกอร์ไหนจะไปอยู่ตรงไหน คลิกที่ตำแหน่งที่คุณต้องการกำหนดแทร็กเกอร์
onboarding-assign_trackers-description = มาเลือกกันเลยว่าแทร็กเกอร์ไหนจะไปอยู่ตรงไหน คลิกที่ตำแหน่งที่คุณต้องการกำหนดแทร็กเกอร์ได้เลย
onboarding-assign_trackers-unassign_all = ยกเลิกการกำหนดแทร็กเกอร์ทั้งหมด
# 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 } จาก { $trackers } ตัว ได้ถูกกำหนดตำแหน่งแล้ว
onboarding-assign_trackers-advanced = แสดงตำแหน่งที่กำหนดได้เพิ่มเติม
onboarding-assign_trackers-next = ฉันได้กำหนดตำแหน่งหมดแล้ว
onboarding-assign_trackers-mirror_view = สะท้อนด้านตำแหน่ง
onboarding-assign_trackers-next = ฉันกำหนดแทร็กเกอร์ทั้งหมดแล้ว
onboarding-assign_trackers-mirror_view = มุมมองภาพสะท้อน
onboarding-assign_trackers-option-amount = x{ $trackersCount }
onboarding-assign_trackers-option-label =
{ $mode ->
@@ -1095,7 +1101,7 @@ onboarding-assign_trackers-warning-LEFT_FOOT =
[0] กำหนดตำแหน่งเท้าซ้ายแล้ว แต่ยังต้องกำหนดข้อเท้าซ้าย, ต้นขาซ้าย และส่วนใดส่วนหนึ่งระหว่าง อก, สะโพก หรือ เอว เพิ่มเติมด้วย!
[1] กำหนดตำแหน่งเท้าซ้ายแล้ว แต่ยังต้องกำหนดต้นขาซ้าย และส่วนใดส่วนหนึ่งระหว่าง อก, สะโพก หรือ เอว เพิ่มเติมด้วย!
[2] กำหนดตำแหน่งเท้าซ้ายแล้ว แต่ยังต้องกำหนดข้อเท้าซ้าย และส่วนใดส่วนหนึ่งระหว่าง อก, สะโพก หรือ เอว เพิ่มเติมด้วย!
[3] เท้าซ้าย ถูกกำหนดแล้ว แต่คุณต้องกำหนด และส่วนใดส่วนหนึ่งระหว่าง อก สะโพก หรือ เอว ด้วย
[3] เท้าซ้าย ถูกกำหนดแล้ว แต่คุณต้องกำหนด และส่วนใดส่วนหนึ่งระหว่าง อก, สะโพก หรือ เอว ด้วย
[4] กำหนดตำแหน่งเท้าซ้ายแล้ว แต่ยังต้องกำหนดส่วนใดส่วนหนึ่งระหว่าง อก, สะโพก หรือ เอว เพิ่มเติมด้วย!
[5] กำหนดตำแหน่งเท้าซ้ายแล้ว แต่ยังต้องกำหนดต้นขาซ้ายเพิ่มเติมด้วย!
[6] กำหนดตำแหน่งเท้าซ้ายแล้ว แต่ยังต้องกำหนดข้อเท้าซ้ายเพิ่มเติมด้วย!
@@ -1158,21 +1164,21 @@ onboarding-assign_trackers-warning-WAIST =
onboarding-choose_mounting = ต้องการใช้วิธีการตั้งศูนย์การติดตั้งแบบใด?
# Multiline text
onboarding-choose_mounting-description = การตั้งศูนย์การติดตั้งจะแก้ไขการวางแนวของแทร็กเกอร์บนร่างกายของคุณ
onboarding-choose_mounting-description = การตั้งศูนย์การติดตั้งจะแก้ไขทิศทางการติดตั้งของแทร็กเกอร์บนร่างกายของคุณ
onboarding-choose_mounting-auto_mounting = ตั้งศูนย์การติดตั้งอัตโนมัติ
# Italicized text
onboarding-choose_mounting-auto_mounting-label-v2 = แนะนำ
onboarding-choose_mounting-auto_mounting-description = ะบบจะตรวจจับการวางแนวการติดตั้งของแทร็กเกอร์ทั้งหมดของคุณโดยอัตโนมัติ จากท่าทาง 2 ท่า
onboarding-choose_mounting-auto_mounting-description = ะบบจะตรวจจับทิศทางการติดตั้งของแทร็กเกอร์ทั้งหมดของคุณโดยอัตโนมัติ จากท่าทาง 2 ท่า
onboarding-choose_mounting-manual_mounting = ตั้งศูนย์การติดตั้งด้วยตัวเอง
# Italicized text
onboarding-choose_mounting-manual_mounting-label-v2 = อาจมีความแม่นยำไม่เพียงพอ
onboarding-choose_mounting-manual_mounting-description = คุณสามารถเลือกการวางแนวการติดตั้งด้วยตนเองสำหรับแทร็กเกอร์แต่ละตัว
onboarding-choose_mounting-manual_mounting-description = คุณสามารถเลือกทิศทางการติดตั้งด้วยตนเองสำหรับแทร็กเกอร์แต่ละตัว
# Multiline text
onboarding-choose_mounting-manual_modal-title =
คุณแน่ใจหรือไม่ว่าต้องการ
ทำการตั้งศูนย์การติดตั้งแบบอัตโนมัติ?
onboarding-choose_mounting-manual_modal-description = <b>แนะนำให้ผู้ใช้ใหม่ใช้การตั้งศูนย์การติดตั้งด้วยตนเอง</b> เนื่องจากท่าทางสำหรับการตั้งศูนย์แบบอัตโนมัตินั้นอาจทำได้ยากในช่วงแรกและอาจต้องอาศัยการฝึกฝน
onboarding-choose_mounting-manual_modal-confirm = ฉันรู้ว่าฉันทําอะไรอยู่
onboarding-choose_mounting-manual_modal-confirm = ฉันรู้ว่าฉันทอะไรอยู่
onboarding-choose_mounting-manual_modal-cancel = ยกเลิก
## Tracker manual mounting setup
@@ -1187,7 +1193,7 @@ onboarding-manual_mounting-next = ขั้นตอนถัดไป
onboarding-automatic_mounting-back = กลับไปยังเข้าสู่ VR
onboarding-automatic_mounting-title = ตั้งศูนย์การติดตั้งแทร็กเกอร์
onboarding-automatic_mounting-description = เพื่อให้ SlimeVR ทำงานได้ เราจะต้องทำการตั้งค่าการติดตั้งของแทร็กเกอร์ของคุณให้ตรงกับการติดตั้งบนร่างกายจริง
onboarding-automatic_mounting-description = เพื่อให้แทร็กเกอร์ SlimeVR ทำงานได้ เราจำเป็นต้องกำหนดทิศทางการติดตั้งให้กับแทร็กเกอร์ของคุณเพื่อจัดแนวให้ตรงกับการติดตั้งแทร็กเกอร์บนร่างกายคุณ
onboarding-automatic_mounting-manual_mounting = ตั้งศูนย์การติดตั้งด้วยตนเอง
onboarding-automatic_mounting-next = ขั้นตอนถัดไป
onboarding-automatic_mounting-prev_step = ขั้นตอนก่อนหน้า
@@ -1196,30 +1202,30 @@ 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-mounting_reset-step-1 = 2. กดปุ่ม "ตั้งศูนย์การติดตั้ง" และรอ 3 วินาที ก่อนที่ทิศทางการติดตั้งของแทร็กเกอร์จะถูกรีเซ็ต
onboarding-automatic_mounting-mounting_reset-feet-step-0 = 1. ยืนเขย่งปลายเท้าทั้งสองข้างโดยให้เท้าชี้ไปด้านหน้า หรืออีกทางเลือกหนึ่งคือคุณสามารถทำได้ขณะนั่งอยู่บนเก้าอี้
onboarding-automatic_mounting-mounting_reset-feet-step-1 = 2. กดปุ่ม "ตั้งศูนย์เท้า" และรอ 3 วินาที ก่อนที่การวางแนวการติดตั้งของแทร็กเกอร์จะถูกรีเซ็ต
onboarding-automatic_mounting-preparation-title = การเตรียมความพร้อม
onboarding-automatic_mounting-preparation-v2-step-0 = 1. กดที่ปุ่ม "รีเซ็ตแทร็กเกอร์ทั้งหมด"
onboarding-automatic_mounting-mounting_reset-feet-step-1 = 2. กดปุ่ม "ตั้งศูนย์เท้า" และรอ 3 วินาที ก่อนที่ทิศทางการติดตั้งของแทร็กเกอร์จะถูกรีเซ็ต
onboarding-automatic_mounting-preparation-title = การเตรียมตัว
onboarding-automatic_mounting-preparation-v2-step-0 = 1. กดที่ปุ่ม "รีเซ็ตทั้งหมด"
onboarding-automatic_mounting-preparation-v2-step-1 = 2. ยืนตัวตรง แขนแนบลำตัว ตรวจสอบให้แน่ใจว่ากำลังมองตรงไปข้างหน้า
onboarding-automatic_mounting-preparation-v2-step-2 = 3. ค้างท่าทางไว้จนกว่าตัวจับเวลา 3 วินาทีจะสิ้นสุดลง
onboarding-automatic_mounting-put_trackers_on-title = ใส่แทร็กเกอร์ของคุณ
onboarding-automatic_mounting-put_trackers_on-description = เพื่อตั้งศูนย์การวางแนวการติดตั้ง เราจะใช้แทร็กเกอร์ที่คุณกำหนดตำแหน่งไปเมื่อสักครู่ โปรดสวมใส่แทร็กเกอร์ของคุณ โดยคุณสามารถดูว่าแทร็กเกอร์ใดคือส่วนใดได้จากภาพด้านขวา
onboarding-automatic_mounting-put_trackers_on-next = ฉันใส่แทร็กเกอร์ทั้งหมดแล้ว
onboarding-automatic_mounting-put_trackers_on-description = เพื่อตั้งศูนย์ทิศทางการติดตั้ง เราจะใช้แทร็กเกอร์ที่คุณกำหนดตำแหน่งไปเมื่อสักครู่ โปรดสวมใส่แทร็กเกอร์ของคุณ โดยคุณสามารถดูว่าแทร็กเกอร์ใดคือส่วนใดได้จากภาพด้านขวา
onboarding-automatic_mounting-put_trackers_on-next = ฉันสวมแทร็กเกอร์ทั้งหมดแล้ว
onboarding-automatic_mounting-return-home = เสร็จแล้ว
## Tracker manual proportions setupa
onboarding-manual_proportions-back-scaled = กลับไปที่สัดส่วนที่อ้างอิงขนาด
onboarding-manual_proportions-title = ปรับสัดส่วนร่างกายด้วยตนเอง
onboarding-manual_proportions-fine_tuning_button = ปรับค่าสัดส่วนร่างกายโดยอัตโนมัติ
onboarding-manual_proportions-fine_tuning_button-disabled-tooltip = กรุณาเชื่อมแว่น VR ของคุณเพื่อใช้งานการปรับค่าโดยอัตโนมัติ
onboarding-manual_proportions-fine_tuning_button = ปรับสัดส่วนโดยละเอียดอัตโนมัติ
onboarding-manual_proportions-fine_tuning_button-disabled-tooltip = โปรดเชื่อมต่อเฮดเซ็ท VR เพื่อใช้การปรับโดยละเอียดอัตโนมัติ
onboarding-manual_proportions-export = ส่งออกค่าสัดส่วน
onboarding-manual_proportions-import = นำเข้าค่าสัดส่วน
onboarding-manual_proportions-file_type = ไฟล์ข้อมูลสัดส่วน
onboarding-manual_proportions-normal_increment = เพิ่มจำนวนแบบปกติ
onboarding-manual_proportions-precise_increment = เพิ่มจำนวนแบบละเอียด
onboarding-manual_proportions-grouped_proportions = กลุ่มสัดส่วนร่างกาย
onboarding-manual_proportions-grouped_proportions = สัดส่วนแบบกลุ่ม
onboarding-manual_proportions-all_proportions = สัดส่วนทั้งหมด
onboarding-manual_proportions-estimated_height = ความสูงของผู้ใช้โดยประมาณ
@@ -1231,8 +1237,8 @@ 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-put_trackers_on-description = เราจะใช้แทร็กเกอรที่ถูกกำหนดตำแหน่งไว้แล้วในการตั้งศูนย์สัดส่วน ใส่แทร็กเกอร์ของคุณได้เลย หากไม่แน่ใจว่าแทร็กเกอร์เป็นตัวไหน สามารถดูได้จากภาพด้านขวา
onboarding-automatic_proportions-put_trackers_on-next = ฉันสวมแทร็กเกอร์ครบทุกตัวแล้ว
onboarding-automatic_proportions-requirements-title = สิ่งที่ต้องการ
# Each line of text is a different list item
onboarding-automatic_proportions-requirements-descriptionv2 =
@@ -1245,8 +1251,10 @@ onboarding-automatic_proportions-requirements-next = ฉันได้อ่า
onboarding-automatic_proportions-check_height-title-v3 = วัดความสูงของเฮดเซ็ท
onboarding-automatic_proportions-check_height-description-v2 = ความสูงเฮดเซ็ท (HMD) ควรจะต่ำกว่าความสูงจริงของคุณเล็กน้อย เนื่องจากเฮดเซ็ทจะวัดความสูงระดับสายตา การวัดนี้จะถูกใช้เป็นพื้นฐานสำหรับการคำนวณสัดส่วนร่างกายของคุณ
# All the text is in bold!
onboarding-automatic_proportions-check_height-calculation_warning-v3 = ให้เริ่มต้นการวัดในขณะที่ยืนตัว<u>ตรง</u>เพื่อวัดความสูงของคุณ ระวังอย่าให้มือของคุณยกสูงเกินเฮดเซ็ท เพราะอาจส่งผลต่อการวัด!
onboarding-automatic_proportions-check_height-guardian_tip = หากคุณใช้อุปกรณ์แว่น VR แบบเดี่ยวๆ โปรดตรวจสอบให้แน่ใจว่าได้เปิดใช้งาน Guardian /Boundary เพื่อให้การวัดความสูงถูกต้อง!
onboarding-automatic_proportions-check_height-calculation_warning-v3 = ให้เริ่มต้นการวัดในขณะที่ยืนตัว <u>ตรง</u> เพื่อวัดความสูงของคุณ ระวังอย่าให้มือของคุณยกสูงเกินเฮดเซ็ท เพราะอาจส่งผลต่อการวัด!
onboarding-automatic_proportions-check_height-guardian_tip =
หากคุณใช้เฮดเซ็ท VR แบบ Standalone โปรดตรวจสอบให้แน่ใจว่าได้เปิด Guardian /
Boundary เพื่อให้ความสูงของคุณถูกต้อง!
# Context is that the height is unknown
onboarding-automatic_proportions-check_height-unknown = ไม่ทราบ
# Shows an element below it
@@ -1255,10 +1263,10 @@ onboarding-automatic_proportions-check_height-measure-start = เริ่มก
onboarding-automatic_proportions-check_height-measure-stop = หยุดการวัด
onboarding-automatic_proportions-check_height-measure-reset = ทำการวัดอีกครั้ง
onboarding-automatic_proportions-check_height-next_step = ใช้ความสูงจากเฮดเซ็ทคุณ
onboarding-automatic_proportions-check_floor_height-title = วัดความสูงของพื้นของคุณ (ไม่บังคับ)
onboarding-automatic_proportions-check_floor_height-description = ในบางกรณีแว่นของคุณอาจมีการตั้งค่าความสูงของพื้นที่ไม่ถูกต้อง ทำให้ความสูงของแว่นวัดได้สูงกว่าที่ควร คุณสามารถวัดความ"สูง" ของพื้นให้ถูกต้องได้
onboarding-automatic_proportions-check_floor_height-title = วัดความสูงพื้นของคุณ (ไม่บังคับ)
onboarding-automatic_proportions-check_floor_height-description = ในบางกรณี ความสูงพื้นของเฮดเซ็ทอาจไม่ได้ถูกตั้งค่าอย่างถูกต้อง ทำให้ความสูงที่วัดได้สูงเกินกว่าที่ควรจะเป็น คุณสามารถวัด "ความสูง" ของพื้นเพื่อแก้ไขความสูงของเฮดเซ็ทคุณได้
# All the text is in bold!
onboarding-automatic_proportions-check_floor_height-calculation_warning-v2 = เริ่มต้นการวัดโดยการวาง Controller บนพื้นเพื่อวัดความสูงของพื้นของคุณ ถ้าคุณมั่นใจแล้วว่าความสูงของพื้นคุณถูกต้อง คุณสามารถข้ามขั้นตอนนี้ได้
onboarding-automatic_proportions-check_floor_height-calculation_warning-v2 = เริ่มการวัดและวางคอนโทรลเลอร์ไว้บนพื้นเพื่อวัดความสูง หากคุณแน่ใจว่าความสูงพื้นถูกต้อง คุณสามารถข้ามขั้นตอนนี้ได้
# Shows an element below it
onboarding-automatic_proportions-check_floor_height-floor_height = ความสูงของพื้นของคุณคือ:
onboarding-automatic_proportions-check_floor_height-full_height = ความสูงโดยประมาณของคุณคือ:
@@ -1291,7 +1299,7 @@ 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 = ปรับสัดส่วนร่างกายของคุณสำเร็จแล้ว
onboarding-automatic_proportions-done-description = การตั้งศูนย์สัดส่วนร่างกายของคุณเสร็จสมบูรณ์แล้ว!
onboarding-automatic_proportions-error_modal-v2 =
<b>คำเตือน:</b> เกิดข้อผิดพลาดระหว่างการประมาณสัดส่วน!
อาจเกิดจากตำแหน่งการติดตั้งแทร็กเกอร์ที่ไม่ถูกต้อง โปรดตรวจสอบว่าแทร็กเกอร์ทำงานอย่างถูกต้อง แล้วลองอีกครั้ง
@@ -1308,7 +1316,7 @@ onboarding-user_height-title = ความสูงของคุณคือ
onboarding-user_height-description = เราต้องการความสูงของคุณเพื่อคำนวณสัดส่วนร่างกายและแสดงการเคลื่อนไหวของคุณอย่างแม่นยำ คุณสามารถให้ SlimeVR คำนวณให้ หรือป้อนความสูงเองด้วยตนเอง
onboarding-user_height-need_head_tracker = จำเป็นต้องใช้เฮดเซ็ต (หรือแทร็กเกอร์ส่วนหัว) และคอนโทรลเลอร์ที่มีการติดตามตำแหน่งเพื่อทำการตั้งศูนย์
onboarding-user_height-calculate = คำนวณความสูงของฉันโดยอัตโนมัติ
onboarding-user_height-next_step = ดำเนินการต่อและบันทึก
onboarding-user_height-next_step = บันทึกและดำเนินการต่อ
onboarding-user_height-manual-proportions = ปรับสัดส่วนด้วยตัวเอง
onboarding-user_height-calibration-title = ความคืบหน้าการตั้งศูนย์
onboarding-user_height-calibration-RECORDING_FLOOR = แตะพื้นด้วยปลายคอนโทรลเลอร์ของคุณ
@@ -1317,14 +1325,14 @@ onboarding-user_height-calibration-WAITING_FOR_FW_LOOK = ยืนขึ้น
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-ok = ตรวจสอบให้แน่ใจว่าหัวของคุณอยู่ในแนวระนาบ
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-low = อย่ามองที่พื้น
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-high = อย่าเงยหน้าสูงเกินไป
onboarding-user_height-calibration-WAITING_FOR_CONTROLLER_PITCH = ตรวจสอบให้แน่ใจว่าคอนโทรลเลอร์ชี้ลง
onboarding-user_height-calibration-WAITING_FOR_CONTROLLER_PITCH = ตรวจสอบให้แน่ใจว่าคอนโทรลเลอร์นั้นชี้ลง
onboarding-user_height-calibration-RECORDING_HEIGHT = ยืนขึ้นอีกครั้งแล้วยืนนิ่งๆ!
onboarding-user_height-calibration-DONE = สําเร็จ!
onboarding-user_height-calibration-DONE = สเร็จ!
onboarding-user_height-calibration-ERROR_TIMEOUT = การตั้งศูนย์หมดเวลา ลองใหม่อีกครั้ง
onboarding-user_height-calibration-ERROR_TOO_HIGH = ความสูงของผู้ใช้ที่ตรวจพบสูงเกินไป ลองใหม่อีกครั้ง
onboarding-user_height-calibration-ERROR_TOO_SMALL = ความสูงของผู้ใช้ที่ตรวจพบเตี้ยเกินไป ตรวจสอบให้แน่ใจว่ายืนตัวตรงเต็มที่ระหว่างกระบวนการ
onboarding-user_height-calibration-ERROR_TOO_SMALL = ความสูงของผู้ใช้ที่ตรวจพบเตี้ยเกินไป ตรวจสอบให้แน่ใจว่ายืนตัวตรงในระหว่างการตั้งศูนย์
onboarding-user_height-calibration-error = ตั้งศูนย์ไม่สำเร็จ
onboarding-user_height-manual-tip = ขณะปรับความสูงของคุณ ให้ลองทำท่าทางต่างๆ และดูว่าโครงกระดูกตรงกับร่างกายของคุณอย่างไร
onboarding-user_height-manual-tip = ขณะปรับความสูงของคุณ ให้ลองทำท่าทางต่างๆ และดูว่าการเคลื่อนไหวของโครงกระดูกตรงกับร่างกายของคุณหรือไม่
onboarding-user_height-reset-warning = คุณได้ตั้งค่าสัดส่วนไว้แล้วโดยใช้หน้าสัดส่วนแบบปรับเอง การดำเนินการต่อจะเป็นการรีเซ็ตสัดส่วนเหล่านี้เพื่อใช้เฉพาะความสูงของคุณเท่านั้น คุณต้องการดำเนินการต่อหรือไม่?
## Stay Aligned setup
@@ -1363,7 +1371,7 @@ onboarding-stay_aligned-done = เสร็จแล้ว
## Home
home-no_trackers = ไม่พบแทร็กเกอร์หรือยังไม่ได้ถูกกำหนด
home-no_trackers = ไม่พบหรือไม่ได้กำหนดแทร็กเกอร์
home-settings = การตั้งค่าหน้าหลัก
home-settings-close = ปิด
@@ -1371,22 +1379,22 @@ home-settings-close = ปิด
trackers_still_on-modal-title = แทร็กเกอร์ยังคงเปิดอยู่
trackers_still_on-modal-description =
มีแทร็กเกอร์เปิดค้างไว้อยู่
คุณแน่ใจที่จะปิด SlimeVR?
มีแทร็กเกอร์อยู่ตั้งแต่หนึ่งตัวขึ้นไปเปิดอยู่
คุณยังต้องการออกจาก SlimeVR หรือไม่?
trackers_still_on-modal-confirm = ออกจาก SlimeVR
trackers_still_on-modal-cancel = ใจเย็นๆก่อน....
## Status system
status_system-StatusTrackerReset = เราแนะนำให้คุณทำการรีเซ็ตทั้งหมดเพราะว่าแทร็กเกอร์หนึ่งตัวหรือมากกว่านั้นยังไม่ได้ถูกปรับ
status_system-StatusTrackerReset = แนะนำให้ทำการรีเซ็ตทั้งหมด เนื่องจากมีแทร็กเกอร์ที่ยังไม่ได้ปรับค่าตั้งแต่หนึ่งตัวขึ้นไป
status_system-StatusSteamVRDisconnected =
{ $type ->
[steamvr_feeder] ขณะนี้ยังไม่มีการเชื่อมต่อกับแอป SlimeVR Feeder
*[steamvr] ขณะนี้ยังไม่มีการเชื่อมต่อกับ SteamVR ผ่านไดรเวอร์ SlimeVR
}
status_system-StatusTrackerError = แทร็กเกอร์ { $trackerName } เกิดข้อผิดพลาด
status_system-StatusUnassignedHMD = แว่น VR ของคุณควรจะถูกกำหนดเป็นแทร็กเกอร์ส่วนหัว
status_system-StatusPublicNetwork = โปรไฟล์เครือข่ายของคุณตอนนี้ถูกตั้งค่าเป็นสาธารณะ ({ $adapters }) ซึ่งไม่แนะนำสำหรับการทำงานของ SlimeVR <PublicFixLink>ดูวิธีการแก้ไขให้เหมาะสมที่นี่</PublicFixLink>
status_system-StatusUnassignedHMD = เฮดเซ็ท VR ของคุณควรจะถูกกำหนดเป็นแทร็กเกอร์ส่วนหัว
status_system-StatusPublicNetwork = โปรไฟล์เครือข่ายของคุณตอนนี้ถูกตั้งค่าเป็นสาธารณะ ({ $adapters }) ในขณะนี้ ซึ่งไม่แนะนำสำหรับการทำงานของ SlimeVR <PublicFixLink>สามารถดูวิธีการแก้ไขได้ที่นี่</PublicFixLink>
## Firmware tool globals
@@ -1399,15 +1407,15 @@ firmware_tool-loading = กำลังโหลด...
## Firmware tool Steps
firmware_tool = เครื่องมือเฟิร์มแวร์ DIY
firmware_tool-description = ให้คุณตั้งค่าและแฟลชเฟิร์มแวร์แทร็กเกอร์ DIY ของคุณ
firmware_tool-not_available = ไอ่หย๊า เครื่องมือเฟิร์มแวร์ยังไม่พร้อมใช้งานในขณะนี้ โปรดกลับมาใหม่ทีหลัง!
firmware_tool-not_compatible = Firmware นี้เข้ากันไม่ได้กับเซิร์ฟเวอร์เวอร์ชันนี้ โปรดอัปเดตเซิร์ฟเวอร์ของคุณ!
firmware_tool-select_source = เลือกเฟิร์มแวร์ที่จะแฟลช
firmware_tool-select_source-description = เลือกเฟิร์มแวร์ที่คุณต้องการแฟลชลงบนบอร์ดของคุณ
firmware_tool-description = ช่วยให้คุณกำหนดค่าและลงเฟิร์มแวร์แทร็กเกอร์ DIY ของคุณ
firmware_tool-not_available = ขออภัย เครื่องมือเฟิร์มแวร์ยังไม่พร้อมใช้งานในขณะนี้ โปรดกลับมาในภายหลัง!
firmware_tool-not_compatible = เครื่องมือเฟิร์มแวร์ไม่เข้ากันกับ SlimeVR Server เวอร์ชันนี้ โปรดอัปเดต SlimeVR Server ของคุณ!
firmware_tool-select_source = เลือกเฟิร์มแวร์ที่คุณจะติดตั้ง
firmware_tool-select_source-description = เลือกเฟิร์มแวร์ที่คุณต้องการลงบนบอร์ดของคุณ
firmware_tool-select_source-error = ไม่สามารถโหลดแหล่งที่มาได้
firmware_tool-select_source-board_type = ชนิดของบอร์ด
firmware_tool-select_source-firmware = แหล่งที่มาของเฟิร์มแวร์
firmware_tool-select_source-version = เวอร์ชันของเฟิร์มแวร์
firmware_tool-select_source-version = เวอร์ชันของเฟิร์มแวร์
firmware_tool-select_source-official = ทางการ
firmware_tool-select_source-dev = รุ่นพัฒนา
firmware_tool-board_defaults = กำหนดค่าบอร์ดของคุณ
@@ -1417,84 +1425,84 @@ firmware_tool-board_defaults-reset = รีเซ็ตเป็นค่าเ
firmware_tool-board_defaults-error-required = ช่องที่จำเป็น
firmware_tool-board_defaults-error-format = รูปแบบไม่ถูกต้อง
firmware_tool-board_defaults-error-format-number = ไม่ใช่ตัวเลข
firmware_tool-flash_method_step = วิธีการลง Firmware
firmware_tool-flash_method_step-description = กรุณาเลือกวิธีการลง Firmware ที่คุณต้องการ
firmware_tool-flash_method_step = วิธีการลงเฟิร์มแวร์
firmware_tool-flash_method_step-description = กรุณาเลือกวิธีการลงเฟิร์มแวร์ที่คุณต้องการใช้
firmware_tool-flash_method_step-ota-v2 =
.label = Wi-Fi
.description = ใช้การอัปเดตแบบ Over-the-air (OTA) โดยแทร็กเกอร์คุณจะใช้ Wi-Fi เพื่ออัปเดตเฟิร์มแวร์ ใช้งานได้เฉพาะแทร็กเกอร์ที่ได้รับการตั้งค่าแล้วเท่านั้น
firmware_tool-flash_method_step-ota-info =
เราใช้ข้อมูลรับรอง Wi-Fi ของคุณเพื่อแฟลชแทร็กเกอร์และยืนยันว่าทุกอย่างทำงานได้อย่างถูกต้อง
เราใช้ข้อมูลรับรอง Wi-Fi ของคุณเพื่อลงเฟิร์มแวร์แทร็กเกอร์และยืนยันว่าทุกอย่างทำงานได้อย่างถูกต้อง
<b>เราไม่จัดเก็บข้อมูล Wi-Fi ของคุณ!</b>
firmware_tool-flash_method_step-serial-v2 =
.label = USB
.description = ใช้สาย USB เพื่ออัปเดตแทร็กเกอร์ของคุณ
firmware_tool-flashbtn_step = กรุณากดปุ่ม Boot
firmware_tool-flashbtn_step-description = มีสิ่งที่คุณควรจะรับทราบก่อนจะไปยังขั้นตอนถัดไป
firmware_tool-flashbtn_step-board_SLIMEVR = ปิดแทร็กเกอร์ของคุณ ถอดอุปกรณ์ออกจากเคสพลาสติก(ถ้ามี) แล้วต่อสาย USB จากแทร็กเกอร์เข้าสู่คอมพิวเตอร์ จากนั้นทำตามขั้นตอนตามชนิดบอร์ดของ SlimeVR ของคุณ
firmware_tool-flashbtn_step-board_SLIMEVR = ปิดแทร็กเกอร์ของคุณ ถอดบอร์ดออกจากเคส(ถ้ามี) แล้วต่อสาย USB จากแทร็กเกอร์เข้าสู่คอมพิวเตอร์ จากนั้นทำตามขั้นตอนตามชนิดบอร์ดของ SlimeVR คุณ
firmware_tool-flashbtn_step-board_SLIMEVR-r11-v2 = เปิดแทร็กเกอร์ขณะทำการลัดวงจรแพด FLASH สี่เหลี่ยมอันที่สองจากขอบด้านบนของบอร์ดเข้ากับฝาโลหะของไมโครคอนโทรลเลอร์ ไฟ LED ของแทร็กเกอร์ควรกะพริบสั้นๆ
firmware_tool-flashbtn_step-board_SLIMEVR-r12-v2 = เปิดแทร็กเกอร์ขณะทำการลัดวงจรแพด FLASH วงกลมที่ด้านบนของบอร์ดเข้ากับฝาครอบโลหะของไมโครคอนโทรลเลอร์ ไฟ LED ของแทร็กเกอร์ควรกะพริบสั้นๆ
firmware_tool-flashbtn_step-board_SLIMEVR-r14-v2 = เปิดแทร็กเกอร์ขณะกดปุ่ม FLASH ที่ด้านบนของบอร์ดค้างไว้ ไฟ LED ของแทร็กเกอร์ควรกะพริบสั้นๆ
firmware_tool-flashbtn_step-board_OTHER =
ก่อนการแฟลช คุณอาจต้องตั้งค่าแทร็กเกอร์ให้อยู่ในโหมดบูตโหลดเดอร์ก่อน
โดยส่วนใหญ่ คุณจะต้องกดปุ่มบูตบนบอร์ดก่อนที่กระบวนการแฟลชจะเริ่มต้น
หากกระบวนการแฟลชหมดเวลาที่จุดเริ่มต้น อาจหมายความว่าแทร็กเกอร์ไม่ได้อยู่ในโหมดบูตโหลดเดอร์
โปรดดูคำแนะนำการแฟลชของบอร์ดของคุณเพื่อทราบวิธีเปิดโหมดบูตโหลดเดอร์
firmware_tool-flash_method_ota-title = กำลังแฟลชผ่าน Wi-Fi
ก่อนลงเฟิร์มแวร์ คุณอาจต้องตั้งค่าแทร็กเกอร์ให้อยู่ในโหมดบูตโหลดเดอร์ก่อน
โดยส่วนใหญ่ คุณจะต้องกดปุ่มบูตบนบอร์ดก่อนที่กระบวนการลงเฟิร์มแวร์จะเริ่มต้น
หากกระบวนการหมดเวลาตั้งแต่เริ่มต้น อาจหมายความว่าแทร็กเกอร์ไม่ได้อยู่ในโหมดบูตโหลดเดอร์
โปรดดูคำแนะนำการลงเฟิร์มแวร์ของบอร์ดของคุณเพื่อทราบวิธีเปิดโหมดบูตโหลดเดอร์
firmware_tool-flash_method_ota-title = กำลังลงเฟิร์มแวร์ผ่าน Wi-Fi
firmware_tool-flash_method_ota-devices = พบอุปกรณ์ OTA:
firmware_tool-flash_method_ota-no_devices = ไม่พบบอร์ดที่เราสามารถอัเดตได้ผ่าน OTA กรุณาตรวจสอบว่าคุณได้เลือกชนิดของบอร์ดที่ถูกต้อง
firmware_tool-flash_method_serial-title = กำลังแฟลชผ่าน USB
firmware_tool-flash_method_serial-wifi = ข้อมูล Wi-Fi:
firmware_tool-flash_method_serial-devices-label = พบอุปกรณ์ซีเรียล:
firmware_tool-flash_method_serial-devices-placeholder = เลือกอุปกรณ์ซีเรียลของคุณ
firmware_tool-flash_method_serial-no_devices = ไม่พบอุปกรณ์ซีเรียลที่เข้ากันได้ กรุณาตรวจสอบว่าแทร็กเกอร์ของคุณเสียบอยู่
firmware_tool-flash_method_ota-no_devices = ไม่พบบอร์ดที่สามารถอัเดตโดยใช้ OTA ได้ ตรวจสอบให้แน่ใจว่าคุณเลือกประเภทบอร์ดได้ถูกต้อง
firmware_tool-flash_method_serial-title = กำลังลงเฟิร์มแวร์ผ่าน USB
firmware_tool-flash_method_serial-wifi = ข้อมูลเครือข่าย Wi-Fi:
firmware_tool-flash_method_serial-devices-label = พบอุปกรณ์ Serial:
firmware_tool-flash_method_serial-devices-placeholder = เลือกอุปกรณ์ Serial ของคุณ
firmware_tool-flash_method_serial-no_devices = ไม่พบอุปกรณ์ Serial ที่เข้ากันได้ ตรวจสอบให้แน่ใจว่าได้เสียบแทร็กเกอร์แล้ว
firmware_tool-build_step = สร้างเฟิร์มแวร์
firmware_tool-build_step-description = กำลังสร้างเฟิร์มแวร์ โปรดรอสักครู่
firmware_tool-flashing_step = ติดตั้งเฟิร์มแวร์
firmware_tool-flashing_step-description = กำลังติดตั้งเฟิร์มแวร์ให้แทร็กเกอร์ของคุณ กรุณาทำตามคำแนะนำบนหน้าจอ
firmware_tool-build_step-description = เฟิร์มแวร์กำลังสร้าง โปรดรอสักครู่
firmware_tool-flashing_step = งเฟิร์มแวร์
firmware_tool-flashing_step-description = กำลังงเฟิร์มแวร์ให้แทร็กเกอร์ของคุณ กรุณาทำตามคำแนะนำบนหน้าจอ
firmware_tool-flashing_step-warning-v2 = อย่าถอดสาย หรือปิดแทร็กเกอร์ในระหว่างกระบวนการอัปโหลด เว้นแต่จะได้รับคำแนะนำ ไม่อย่างนั้นอาจทำให้บอร์ดของคุณใช้งานไม่ได้
firmware_tool-flashing_step-flash_more = ติดตั้งเฟิร์มแวร์ให้แทร็กเกอร์ตัวอื่น
firmware_tool-flashing_step-flash_more = งเฟิร์มแวร์ให้แทร็กเกอร์ตัวอื่น
firmware_tool-flashing_step-exit = ออก
## firmware tool build status
firmware_tool-build-QUEUED = กำลังรอการสร้าง...
firmware_tool-build-CREATING_BUILD_FOLDER = กำลังสร้าง Build folder
firmware_tool-build-CREATING_BUILD_FOLDER = กำลังสร้างโฟลเดอร์บิลด์
firmware_tool-build-DOWNLOADING_SOURCE = กำลังดาวน์โหลดซอร์สโค้ด
firmware_tool-build-EXTRACTING_SOURCE = กำลังแตกไฟล์ซอร์สโค้ด
firmware_tool-build-BUILDING = กำลังสร้างตัว Firmware
firmware_tool-build-SAVING = บันทึกค่าที่สร้างไว้
firmware_tool-build-DONE = การสร้างเสร็จสมบูรณ์
firmware_tool-build-ERROR = ไม่สามารถสร้าง Firmware ได้
firmware_tool-build-BUILDING = กำลังสร้างเฟิร์มแวร์
firmware_tool-build-SAVING = กำลังบันทึกไฟล์บิลด์
firmware_tool-build-DONE = สร้างเสร็จสมบูรณ์
firmware_tool-build-ERROR = ไม่สามารถสร้างเฟิร์มแวร์ได้
## Firmware update status
firmware_update-status-DOWNLOADING = กำลังโหลด Firmware
firmware_update-status-NEED_MANUAL_REBOOT-v2 = กรุณปิดและเปิดแทร็กเกอร์ของคุณใหม่อีกครั้ง
firmware_update-status-DOWNLOADING = กำลังดาวน์โหลดเฟิร์มแวร์
firmware_update-status-NEED_MANUAL_REBOOT-v2 = โปรดปิดและเปิดแทร็กเกอร์ของคุณอีกครั้ง
firmware_update-status-AUTHENTICATING = กำลังยืนยันตัวตนกับ MCU
firmware_update-status-UPLOADING = กำลังอัปโหลดเฟิร์มแวร์
firmware_update-status-SYNCING_WITH_MCU = กำลังซิงโครไนซ์กับ MCU
firmware_update-status-REBOOTING = กำลังดำเนินการอัปเดต
firmware_update-status-PROVISIONING = ตั้งค่าข้อมูลการเชื่อมต่อ Wi-Fi
firmware_update-status-DONE = อัเดตสำเร็จ!
firmware_update-status-ERROR_DEVICE_NOT_FOUND = ไม่สามารถหาตัวอุปกรณ์ได้
firmware_update-status-ERROR_TIMEOUT = กระบวนการอัปเดตหมดเวลาการเชื่อมต่อ
firmware_update-status-ERROR_DOWNLOAD_FAILED = ไม่สามารถดาวน์โหลด Firmware ได้
firmware_update-status-ERROR_AUTHENTICATION_FAILED = ไม่สามารถยืนยันตัวตนหรือเชื่อมต่อกับ MCU ได้
firmware_update-status-ERROR_UPLOAD_FAILED = ไม่สามารถอัปโหลดเฟิร์มแวร์ได้
firmware_update-status-ERROR_PROVISIONING_FAILED = ไม่สามารถตั้งข้อมูลการเชื่อมต่อ Wi-Fi ได้
firmware_update-status-ERROR_UNSUPPORTED_METHOD = ยังไม่รองรับวิธีการอัเดตนี้
firmware_update-status-SYNCING_WITH_MCU = กำลังซิง์กับ MCU
firmware_update-status-REBOOTING = กำลังใช้การอัปเดต
firmware_update-status-PROVISIONING = ตั้งค่าข้อมูลเครือข่าย Wi-Fi
firmware_update-status-DONE = อัเดตสำเร็จ!
firmware_update-status-ERROR_DEVICE_NOT_FOUND = ไม่พบอุปกรณ์
firmware_update-status-ERROR_TIMEOUT = กระบวนการอัปเดตหมดเวลา
firmware_update-status-ERROR_DOWNLOAD_FAILED = ไม่สามารถดาวน์โหลดเฟิร์มแวร์
firmware_update-status-ERROR_AUTHENTICATION_FAILED = ไม่สามารถยืนยันตัวตนกับ MCU
firmware_update-status-ERROR_UPLOAD_FAILED = ไม่สามารถอัปโหลดเฟิร์มแวร์
firmware_update-status-ERROR_PROVISIONING_FAILED = ไม่สามารถตั้งค่าข้อมูลเครือข่าย Wi-Fi
firmware_update-status-ERROR_UNSUPPORTED_METHOD = ยังไม่รองรับวิธีการอัเดตนี้
firmware_update-status-ERROR_UNKNOWN = เกิดข้อผิดพลาดที่ไม่รู้จัก
## Dedicated Firmware Update Page
firmware_update-title = อัเดตเฟิร์มแวร์
firmware_update-title = อัเดตเฟิร์มแวร์
firmware_update-devices = อุปกรณ์ที่พร้อมใช้งาน
firmware_update-devices-description = โปรดเลือกตัวแทร็กเกอร์ที่คุณต้องการอัปเดตเป็น Firmware SlimeVR เวอร์ชันล่าสุด
firmware_update-no_devices = กรุณาตรวจสอบว่าแทร็กเกอร์ที่คุณต้องการจะอัเดนั้นเปิดอยู่ และต่อเข้ากับ Wi-Fi!
firmware_update-devices-description = โปรดเลือกแทร็กเกอร์ที่คุณต้องการอัปเดตเป็นเฟิร์มแวร์ SlimeVR เวอร์ชันล่าสุด
firmware_update-no_devices = กรุณาตรวจสอบว่าแทร็กเกอร์ที่คุณต้องการจะอัเดนั้นเปิดอยู่ และต่อเข้ากับ Wi-Fi!
firmware_update-changelog-title = กำลังอัปเดตเป็น { $version }
firmware_update-looking_for_devices = กำลังมองหาอุปกรณ์เพื่ออัเดต...
firmware_update-looking_for_devices = กำลังมองหาอุปกรณ์เพื่ออัเดต...
firmware_update-retry = ลองอีกครั้ง
firmware_update-update = อัเดตแทร็กเกอร์ที่เลือก
firmware_update-update = อัเดตแทร็กเกอร์ที่เลือก
firmware_update-exit = ออก
## Tray Menu
@@ -1507,9 +1515,12 @@ tray_menu-quit = ออก
tray_or_exit_modal-title = คุณต้องการให้ปุ่มปิดทำอะไร?
# Multiline text
tray_or_exit_modal-description = นี่จะให้คุณเลือกว่าจะเป็นการปิดโปรแกรมหรือเป็นการพับเก็บโปรแกรมเมื่อกดปุ่มปิด
tray_or_exit_modal-radio-exit = ออกโปรแกรมเมื่อปิด
tray_or_exit_modal-radio-tray = พับไปยัง System tray
tray_or_exit_modal-description =
เลือกที่จะออกจากโปรแกรม หรือย่อไปที่ถาดระบบเมื่อคลิกปุ่มปิด
คุณสามารถเปลี่ยนการตั้งค่านี้ได้ภายหลังในส่วนการตั้งค่าอินเทอร์เฟซ
tray_or_exit_modal-radio-exit = ออกเมื่อปิด
tray_or_exit_modal-radio-tray = ย่อไปที่ถาดระบบ
tray_or_exit_modal-submit = บันทึก
tray_or_exit_modal-cancel = ยกเลิก
@@ -1522,30 +1533,30 @@ unknown_device-modal-description =
unknown_device-modal-confirm = แน่นอน
unknown_device-modal-forget = เพิกเฉย
# VRChat config warnings
vrc_config-page-title = คำเตือนการตั้งค่าของ VRChat
vrc_config-page-title = คำเตือนการตั้งค่าใน VRChat
vrc_config-page-desc = หน้านี้แสดงการตั้งค่าใน VRChat ของคุณ และการตั้งค่าที่ไม่เข้ากับ SlimeVR เราแนะนำเป็นอย่างยิ่งให้คุณแก้ไขการแจ้งเตือนที่แสดงให้เห็นเพื่อประสบการณ์การใช้ SlimeVR ที่ดีที่สุด
vrc_config-page-help = ไม่พบการตั้งค่าใช่ไหม?
vrc_config-page-help-desc = สามารถดู<a>เอกสารประกอบการตั้งค่าตรงนี!</a>
vrc_config-page-big_menu = แทร็กกิ้ง & IK (หน้าเมนูใหญ่)
vrc_config-page-help-desc = สามารถดู <a>เอกสารประกอบการตั้งค่าได้ที่นี!</a>
vrc_config-page-big_menu = แทร็กกิ้ง & IK (หน้าเมนูใหญ่)
vrc_config-page-big_menu-desc = การตั้งค่าที่เกี่ยวกับ IK ในเมนูการตั้งค่าหลัก
vrc_config-page-wrist_menu = แทร็กกิ้ง & IK (เมนูบนข้อมือ)
vrc_config-page-wrist_menu-desc = การตั้งค่าที่เกี่ยวกับ IK ในเมนูตั้งค่าเล็ก (เมนูบนข้อมือ)
vrc_config-page-wrist_menu-desc = การตั้งค่าเกี่ยวกับ IK ในเมนูตั้งค่าเล็ก (เมนูบนข้อมือ)
vrc_config-on = เปิด
vrc_config-off = ปิด
vrc_config-invalid = คุณมีการตั้งค่าใน VRchat ที่ไม่ถูกต้อง!
vrc_config-invalid = คุณมีการตั้งค่าใน VRChat ที่ไม่ถูกต้อง!
vrc_config-show_more = แสดงข้อมูลเพิ่มเติม
vrc_config-setting_name = ชื่อการตั้งค่าใน VRchat
vrc_config-recommended_value = ค่าที่แนะนำ
vrc_config-setting_name = ชื่อการตั้งค่าใน VRChat
vrc_config-recommended_value = การตั้งค่าที่แนะนำ
vrc_config-current_value = การตั้งค่าปัจจุบัน
vrc_config-mute = ปิดคำเตือนการตั้งค่า
vrc_config-mute-btn = ปิดคำเตือน
vrc_config-unmute-btn = เลิกแจ้งเตือน
vrc_config-legacy_mode = การตั้งศูนย์แบบเก่า
vrc_config-disable_shoulder_tracking = ปิดใช้งานการจับตำแหน่งไหล
vrc_config-unmute-btn = แสดงคำเตือน
vrc_config-legacy_mode = ใช้การแก้ไข IK แบบเก่า
vrc_config-disable_shoulder_tracking = ปิดการใช้งานการติดตามไหล
vrc_config-shoulder_width_compensation = การชดเชยความกว้างของไหล่
vrc_config-spine_mode = โหมดกระดูกสันหลัง FBT
vrc_config-tracker_model = โมเดลแทร็กเกอร์ FBT
vrc_config-avatar_measurement_type = การวัดของอวาตาร์
vrc_config-avatar_measurement_type = การวัดขนาดอวาตาร์
vrc_config-calibration_range = ช่วงการตั้งศูนย์
vrc_config-calibration_visuals = แสดงภาพการตั้งศูนย์
vrc_config-user_height = ความสูงจริงของผู้ใช้
@@ -1564,46 +1575,49 @@ vrc_config-avatar_measurement_type-ARM_SPAN = ช่วงแขน
## Error collection consent modal
error_collection_modal-title = อนุญาตให้เราเก็บข้อมูลขอผิดพลาดหรือไม่?
error_collection_modal-title = อนุญาตให้เราเก็บข้อมูลขอผิดพลาดหรือไม่?
error_collection_modal-description_v2 =
{ settings-interface-behavior-error_tracking-description_v2 }
คุณสามารถเปลี่ยนการตั้งค่านี้ในภายหลังได้ในแถบ พฤติกรรมการทำงาน ภายในหน้าการตั้งค่า
error_collection_modal-confirm = ฉันตกลง
error_collection_modal-cancel = ฉันไม่ต้องการ
tracking_checklist = รายการเตรียมความพร้อมแทร็กกิ้ง
tracking_checklist-settings = รายการเตรียมพร้อมแทร็กเกอร์
## Tracking checklist section
tracking_checklist = รายการเตรียมพร้อมแทร็กเกอร์
tracking_checklist-settings = การตั้งค่ารายการเตรียมพร้อมแทร็กเกอร์
tracking_checklist-settings-close = ปิด
tracking_checklist-status-incomplete = คุณยังไม่พร้อมที่จะใช้ SlimeVR!
tracking_checklist-status-partial = คุณมี { $count } คำเตือน
tracking_checklist-status-partial = คุณมี { $count } คำเตือน!
tracking_checklist-status-complete = คุณพร้อมที่จะใช้ SlimeVR แล้ว!
tracking_checklist-MOUNTING_CALIBRATION = ตั้งศูนย์การติดตั้ง
tracking_checklist-MOUNTING_CALIBRATION = ทำการตั้งศูนย์การติดตั้ง
tracking_checklist-FEET_MOUNTING_CALIBRATION = ตั้งศูนย์การติดตั้งแทร็กเกอร์เท้า
tracking_checklist-FULL_RESET = รีเซ็ตแทร็กเกอร์ทั้งหมด
tracking_checklist-FULL_RESET = ทำการรีเซ็ตทั้งหมด
tracking_checklist-FULL_RESET-desc = แทร็กเกอร์บางส่วนจำเป็นต้องทำการรีเซ็ต
tracking_checklist-STEAMVR_DISCONNECTED = SteamVR ไม่ได้ทำงานอยู่
tracking_checklist-STEAMVR_DISCONNECTED-desc = SteamVR ไม่ได้ทำงานอยู่ คุณใช้งานเพื่อเล่น VR ใช่หรือไม่?
tracking_checklist-STEAMVR_DISCONNECTED-desc = SteamVR ไม่ได้ทำงานอยู่ คุณจะใช้เพื่อเล่น VR ใช่หรือไม่?
tracking_checklist-STEAMVR_DISCONNECTED-open = เปิด SteamVR
tracking_checklist-TRACKERS_REST_CALIBRATION = ตั้งศูนย์แทร็กเกอร์ของคุณ
tracking_checklist-TRACKERS_REST_CALIBRATION-desc = คุณยังไม่ได้ทำการตั้งศูนย์แทร็กเกอร์ โปรดวางแทร็กเกอร์ของคุณ (ที่ไฮไลต์ด้วยสีเหลือง) ไว้บนพื้นที่ราบเวลาสองสามวินาที
tracking_checklist-TRACKER_ERROR = แทร็กเกอร์มีปัญหา
tracking_checklist-TRACKER_ERROR-desc = ตัวแทร็กเกอร์บางส่วนของคุณมีปัญหา โปรดทำการรีสตาร์ทแทร็กเกอร์ที่ไฮไลต์ด้วยสีเหลือง
tracking_checklist-VRCHAT_SETTINGS = การตั้งค่าของ VRChat
tracking_checklist-VRCHAT_SETTINGS-desc = คุณมีการตั้งค่าของ VRChat ที่ไม่ถูกต้อง! ซึ่งอาจส่งผลเสียต่อการจับตำแหน่งของแทร็กเกอร์คุณ
tracking_checklist-TRACKER_ERROR = แทร็กเกอร์ที่มีปัญหา
tracking_checklist-TRACKER_ERROR-desc = แทร็กเกอร์บางตัวของคุณมีปัญหา โปรดทำการรีสตาร์ทแทร็กเกอร์ที่ไฮไลต์ด้วยสีเหลือง
tracking_checklist-VRCHAT_SETTINGS = การตั้งค่าใน VRChat
tracking_checklist-VRCHAT_SETTINGS-desc = คุณมีการตั้งค่าใน VRChat ที่ไม่ถูกต้อง! ซึ่งอาจส่งผลเสียต่อการจับตำแหน่งของแทร็กเกอร์คุณ
tracking_checklist-VRCHAT_SETTINGS-open = ไปยังคำเตือนการตั้งค่า VRChat
tracking_checklist-UNASSIGNED_HMD = อุปกรณ์แว่น VR ไม่ได้ถูกกำหนดที่ส่วนหัว
tracking_checklist-UNASSIGNED_HMD-desc = ควรระบุอุปกรณ์แว่น VR ให้เป็นแทร็กเกอร์ส่วนหัว
tracking_checklist-UNASSIGNED_HMD = เฮดเซ็ท VR ไม่ได้ถูกกำหนดที่ส่วนหัว
tracking_checklist-UNASSIGNED_HMD-desc = ควรระบุเฮตเซ็ท VR ให้เป็นแทร็กเกอร์ส่วนหัว
tracking_checklist-NETWORK_PROFILE_PUBLIC = แก้ไขโปรไฟล์เครือข่าย
tracking_checklist-NETWORK_PROFILE_PUBLIC-desc =
โปรไฟล์เครือข่ายของคุณ ({ $adapters }) ถูกตั้งค่าเป็น สาธารณะ (Public) อยู่ในขณะนี้ ซึ่งไม่แนะนำสำหรับการทำงานที่ถูกต้องของ SlimeVR
<PublicFixLink>ดูวิธีการแก้ไขได้ที่นี่</PublicFixLink>
tracking_checklist-NETWORK_PROFILE_PUBLIC-open = เปิด Control Panel
tracking_checklist-STAY_ALIGNED_CONFIGURED = ตั้งค่า Stay Aligned
tracking_checklist-STAY_ALIGNED_CONFIGURED-desc = บันทึกท่าท่างแบบใน Stay Aligned เพื่อลดค่าดริฟท์
tracking_checklist-STAY_ALIGNED_CONFIGURED-desc = บันทึกท่าท่างใน Stay Aligned เพื่อลดการดริฟท์
tracking_checklist-STAY_ALIGNED_CONFIGURED-open = เปิดตัวช่วยการตั้งค่า Stay Aligned
tracking_checklist-ignore = ละเว้น
preview-mocap_mode_soon = โหมด Mocap (เร็ว ๆ นี้™)
preview-disable_render = ปิดการแสดงตัวอย่าง
preview-disabled_render = ปิดใช้งานการแสดงผล
preview-disabled_render = การแสดงตัวอย่างถูกปิด
toolbar-mounting_calibration = ตั้งศูนย์การติดตั้ง
toolbar-mounting_calibration-default = ร่างกาย
toolbar-mounting_calibration-feet = เท้า

View File

@@ -376,3 +376,6 @@ settings-osc-vrchat-network-address = Ağ adresi
## Error collection consent modal
## Tracking checklist section

View File

@@ -615,11 +615,6 @@ onboarding-setup_warning-cancel = Продовжити налаштування
## Wi-Fi setup
onboarding-wifi_creds-back = Повернутися до вступу
onboarding-wifi_creds = Введіть дані Wi-Fi
# This cares about multilines
onboarding-wifi_creds-description =
Трекери використовуватимуть ці дані для бездротового підключення.
Будь ласка, використовуйте дані, до яких ви зараз підключені.
onboarding-wifi_creds-skip = Пропустити налаштування Wi-Fi
onboarding-wifi_creds-submit = Підтвердити!
onboarding-wifi_creds-ssid =
@@ -856,3 +851,6 @@ unknown_device-modal-forget = Ігнорувати
## Error collection consent modal
## Tracking checklist section

View File

@@ -652,11 +652,6 @@ onboarding-setup_warning-cancel = Tiếp tục thiết lập
## Wi-Fi setup
onboarding-wifi_creds-back = Quay lại giới thiệu
onboarding-wifi_creds = Nhập thông tin Wi-Fi
# This cares about multilines
onboarding-wifi_creds-description =
Tracker sẽ sử dụng thông tin này để kết nối đến mạng
Hãy nhập thông tin mạng Wi-Fi bạn đang dùng
onboarding-wifi_creds-skip = Bỏ qua cài đặt Wi-Fi
onboarding-wifi_creds-submit = Gửi
onboarding-wifi_creds-ssid =
@@ -1037,3 +1032,6 @@ unknown_device-modal-forget = Bỏ qua
## Error collection consent modal
## Tracking checklist section

View File

@@ -24,7 +24,7 @@ version_update-close = 关闭
## Tips
tips-find_tracker = 分不清哪个追踪器是哪个了?摇一摇它,对应的那个将高亮显示。
tips-find_tracker = 不确定哪个追踪器是哪个?在现实中摇动一个追踪器,对应的那个将在屏幕上高亮显示。
tips-do_not_move_heels = 确保你的脚跟在录制的时候不会发生移动!
tips-file_select = 拖放文档或 <u>浏览文档</u> 以使用
tips-tap_setup = 你可以缓慢地敲击2次追踪器来选中它而不是从菜单中选取。
@@ -33,6 +33,10 @@ tips-failed_webgl = WebGL初始化失败
## Units
unit-meter = 米
unit-foot = 英尺
unit-inch = 英寸
unit-cm = 厘米
## Body parts
@@ -241,6 +245,10 @@ reset-mounting = 重置佩戴
reset-mounting-feet = 重置脚部佩戴
reset-mounting-fingers = 重置手指佩戴
reset-yaw = 重置航向轴
reset-error-no_feet_tracker = 未分配脚部追踪器
reset-error-no_fingers_tracker = 未分配手指追踪器
reset-error-mounting-need_full_reset = 佩戴校准前需要先执行完整重置
reset-error-yaw-need_full_reset = 航向轴重置前需要先执行完整重置
## Serial detection stuff
@@ -260,10 +268,12 @@ navbar-trackers_assign = 追踪器分配
navbar-mounting = 佩戴校准
navbar-onboarding = 向导
navbar-settings = 设置
navbar-connect_trackers = 连接追踪器
## Biovision hierarchy recording
bvh-start_recording = 录制 BVH 文件
bvh-stop_recording = 保存 BVH 记录
bvh-recording = 录制中...
bvh-save_title = 保存BVH记录
@@ -407,6 +417,8 @@ tracker-settings-update-up_to_date = 已是最新
tracker-settings-update-blocked = 更新不可用。没有其他可用版本
tracker-settings-update = 立即更新
tracker-settings-update-title = 固件版本
tracker-settings-current-version = 当前版本
tracker-settings-latest-version = 最新版本
## Tracker part card info
@@ -472,6 +484,7 @@ mounting_selection_menu-close = 关闭
settings-sidebar-title = 设置
settings-sidebar-general = 通用设置
settings-sidebar-steamvr = SteamVR
settings-sidebar-tracker_mechanics = 追踪器设置
settings-sidebar-stay_aligned = 持续校准
settings-sidebar-fk_settings = FK 设置
@@ -479,9 +492,12 @@ settings-sidebar-gesture_control = 手势控制
settings-sidebar-interface = 交互界面
settings-sidebar-osc_router = OSC 路由
settings-sidebar-osc_trackers = VRChat OSC 追踪器
settings-sidebar-osc_vmc = VMC
settings-sidebar-utils = 工具
settings-sidebar-serial = 串口控制台
settings-sidebar-appearance = 外观
settings-sidebar-home = 主界面
settings-sidebar-checklist = 追踪检查清单
settings-sidebar-notifications = 通知
settings-sidebar-behavior = 行为
settings-sidebar-firmware-tool = DIY固件工具
@@ -904,9 +920,15 @@ settings-utils-advanced-open_logs-label = 打开文件夹
## Home Screen
settings-home-list-layout = 追踪器列表布局
settings-home-list-layout-desc = 选择主界面的显示布局
settings-home-list-layout-grid = 网格
settings-home-list-layout-table = 列表
## Tracking Checlist
settings-tracking_checklist-active_steps = 启用的检查项
settings-tracking_checklist-active_steps-desc = 追踪检查清单中所有项目的列表。您可以禁用不需要的步骤。
## Setup/onboarding menu
@@ -923,11 +945,13 @@ onboarding-setup_warning-cancel = 继续设置
## Wi-Fi setup
onboarding-wifi_creds-back = 返回简介
onboarding-wifi_creds = 输入 Wi-Fi 凭据
onboarding-wifi_creds-v2 = 通过 Wi-Fi 连接
# This cares about multilines
onboarding-wifi_creds-description =
追踪器将使用这些凭据连接到 Wi-Fi
使用当前连接到 Wi-Fi 的凭据
onboarding-wifi_creds-description-v2 =
大多数追踪器(例如官方的 SlimeVR 追踪器)都通过 Wi-Fi 连接服务器。
输入当前设备连接的网络的 Wi-Fi 凭证。
请确保输入的是 2.4GHz 频段的 Wi-Fi 凭证!
onboarding-wifi_creds-skip = 跳过 Wi-Fi 设置
onboarding-wifi_creds-submit = 提交!
onboarding-wifi_creds-ssid =
@@ -937,6 +961,10 @@ onboarding-wifi_creds-ssid-required = Wi-Fi 名称为必填项
onboarding-wifi_creds-password =
.label = 密码
.placeholder = 输入密码
onboarding-wifi_creds-dongle-title = 通过接收器连接
onboarding-wifi_creds-dongle-description = 如果你的追踪器附带接收器,将其插入电脑即可直接开始使用!
onboarding-wifi_creds-dongle-wip = 此部分仍在开发中。将来会推出用于管理接收器连接追踪器的专属页面。
onboarding-wifi_creds-dongle-continue = 继续,使用接收器
## Mounting setup
@@ -1040,7 +1068,8 @@ onboarding-assignment_tutorial-done = 我把贴纸和绑带都弄好了!
onboarding-assign_trackers-back = 返回 Wi-Fi 凭据设置
onboarding-assign_trackers-title = 分配追踪器
onboarding-assign_trackers-description = 让我们选择哪个追踪器在哪里。单击要放置追踪器的部位
onboarding-assign_trackers-description = 让我们选择追踪器的佩戴位置。点击对应部位即可分配。
onboarding-assign_trackers-unassign_all = 取消分配所有追踪器
# 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
@@ -1175,6 +1204,8 @@ 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-mounting_reset-feet-step-0 = 1. 双脚朝前,踮起脚尖站立。或者,您也可以坐在椅子上完成这个动作。
onboarding-automatic_mounting-mounting_reset-feet-step-1 = 2. 点击“脚部校准”按钮并等待 3 秒,追踪器的佩戴方向将会重置。
onboarding-automatic_mounting-preparation-title = 准备
onboarding-automatic_mounting-preparation-v2-step-0 = 1. 按下“完全重置”按钮。
onboarding-automatic_mounting-preparation-v2-step-1 = 2. 站直并向前看,双臂放在身体两侧。
@@ -1186,6 +1217,7 @@ onboarding-automatic_mounting-return-home = 完成
## Tracker manual proportions setupa
onboarding-manual_proportions-back-scaled = 返回使用缩放比例
onboarding-manual_proportions-title = 手动调整身体比例
onboarding-manual_proportions-fine_tuning_button = 自动微调身体比例
onboarding-manual_proportions-fine_tuning_button-disabled-tooltip = 请连接 VR头戴显示器 以使用自动微调
@@ -1281,6 +1313,30 @@ onboarding-automatic_proportions-smol_warning-cancel = 返回
## User height calibration
onboarding-user_height-title = 你的身高是多少?
onboarding-user_height-description = 我们需要你的身高来计算躯干比例,以准确呈现你的动作。你可以让 SlimeVR 自动计算身高,也可以手动输入。
onboarding-user_height-need_head_tracker = 进行校准需要具备定位功能的头戴显示器与控制器。
onboarding-user_height-calculate = 自动计算我的身高
onboarding-user_height-next_step = 保存并继续
onboarding-user_height-manual-proportions = 手动调整躯干比例
onboarding-user_height-calibration-title = 校准进度
onboarding-user_height-calibration-RECORDING_FLOOR = 用控制器的前端触碰地面
onboarding-user_height-calibration-WAITING_FOR_RISE = 回到站姿
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK = 回到站姿并向前看
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-ok = 确保你的头部水平
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-low = 不要往地面看
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-high = 不要往高处看
onboarding-user_height-calibration-WAITING_FOR_CONTROLLER_PITCH = 确保控制器方向朝下
onboarding-user_height-calibration-RECORDING_HEIGHT = 重新站直并保持姿势不动!
onboarding-user_height-calibration-DONE = 完成!
onboarding-user_height-calibration-ERROR_TIMEOUT = 校准超时,请重试。
onboarding-user_height-calibration-ERROR_TOO_HIGH = 检测到的用户身高数值过大,请重试。
onboarding-user_height-calibration-ERROR_TOO_SMALL = 检测到的用户身高数值过小。请确保在校准结束时身体站直并平视前方。
onboarding-user_height-calibration-error = 校准失败
onboarding-user_height-manual-tip = 在调整身高时,尝试不同姿势,看看骨架是否与你的身体动作匹配。
onboarding-user_height-reset-warning =
<b>警告:</b> 这会将您的身体比例重置为仅基于身高的默认比例。
您确定要执行此操作吗?
## Stay Aligned setup
@@ -1319,6 +1375,8 @@ onboarding-stay_aligned-done = 完成
## Home
home-no_trackers = 未检测到或未分配追踪器
home-settings = 主界面设置
home-settings-close = 关闭
## Trackers Still On notification
@@ -1357,7 +1415,7 @@ firmware_tool-not_available = 哦不,固件工具目前不可用。稍后再
firmware_tool-not_compatible = 固件工具与此版本的服务端不兼容。请更新您的服务端!
firmware_tool-select_source = 选择要刷写的固件
firmware_tool-select_source-description = 选择要在电路板上刷写的固件
firmware_tool-select_source-error = 无法加载固件
firmware_tool-select_source-error = 无法加载固件源代码
firmware_tool-select_source-board_type = 电路板类型
firmware_tool-select_source-firmware = 固件来源
firmware_tool-select_source-version = 固件版本
@@ -1382,6 +1440,9 @@ firmware_tool-flash_method_step-serial-v2 =
firmware_tool-flashbtn_step = 按下启动/Boot按钮
firmware_tool-flashbtn_step-description = 在进入下一步之前,您需要做几件事情。
firmware_tool-flashbtn_step-board_SLIMEVR = 关闭追踪器,拆下外壳(如果有的话),使用 USB 数据线连接到计算机,然后根据您的 SlimeVR 电路板版本执行以下步骤之一:
firmware_tool-flashbtn_step-board_SLIMEVR-r11-v2 = 保持短接电路板正面边缘第二个矩形 FLASH 焊盘和单片机模块的金属屏蔽罩,同时打开追踪器电源。追踪器的指示灯将会短暂闪烁。
firmware_tool-flashbtn_step-board_SLIMEVR-r12-v2 = 保持短接电路板正面圆形 FLASH 焊盘和单片机模块的金属屏蔽罩,同时打开追踪器电源。追踪器的指示灯将会短暂闪烁。
firmware_tool-flashbtn_step-board_SLIMEVR-r14-v2 = 按住电路板正面的 FLASH 按钮的同时打开追踪器电源。追踪器的指示灯将会短暂闪烁。
firmware_tool-flashbtn_step-board_OTHER =
在烧录固件之前您可能需要将追踪器置于bootloader模式。
通常这意味着在开始固件烧录过程之前,按下板上的引导/boot按钮。
@@ -1521,3 +1582,49 @@ error_collection_modal-description_v2 =
您可以稍后在设置页面的行为部分中更改此设置。
error_collection_modal-confirm = 我同意
error_collection_modal-cancel = 还是算了
## Tracking checklist section
tracking_checklist = 追踪检查清单
tracking_checklist-settings = 追踪检查清单设置
tracking_checklist-settings-close = 关闭
tracking_checklist-status-incomplete = 使用 SlimeVR 前的准备工作尚未完成!
tracking_checklist-status-partial = 你有 { $count } 个警告!
tracking_checklist-status-complete = 已经准备好使用 SlimeVR
tracking_checklist-MOUNTING_CALIBRATION = 进行佩戴校准
tracking_checklist-FEET_MOUNTING_CALIBRATION = 进行脚部佩戴校准
tracking_checklist-FULL_RESET = 进行完整重置
tracking_checklist-FULL_RESET-desc = 有些追踪器需要进行重置
tracking_checklist-STEAMVR_DISCONNECTED = SteamVR 未在运行
tracking_checklist-STEAMVR_DISCONNECTED-desc = SteamVR 未在运行。你要将追踪器用于 VR 吗?
tracking_checklist-STEAMVR_DISCONNECTED-open = 启动 SteamVR
tracking_checklist-TRACKERS_REST_CALIBRATION = 校准追踪器
tracking_checklist-TRACKERS_REST_CALIBRATION-desc = 您尚未执行追踪器校准。请将(黄色高亮显示的)追踪器放置在平稳表面上,并静置数秒。
tracking_checklist-TRACKER_ERROR = 追踪器出现错误
tracking_checklist-TRACKER_ERROR-desc = 有追踪器发生错误,请重启黄色高亮标记的追踪器。
tracking_checklist-VRCHAT_SETTINGS = 调整 VRChat 设置
tracking_checklist-VRCHAT_SETTINGS-desc = VRChat 的设置有问题!这会影响到在 VRChat 中使用 SlimeVR 的体验。
tracking_checklist-VRCHAT_SETTINGS-open = 前往 VRChat 警告页面
tracking_checklist-UNASSIGNED_HMD = VR 头戴显示器未分配给头部
tracking_checklist-UNASSIGNED_HMD-desc = VR 头戴显示器应该被分配为头部追踪器。
tracking_checklist-NETWORK_PROFILE_PUBLIC = 更改网络配置文件类型
tracking_checklist-NETWORK_PROFILE_PUBLIC-desc =
检测到您的部分网卡被设为“公用网络”:
{ $adapters }
这可能会影响 SlimeVR 的正常运行。
<PublicFixLink>点击此处查看如何更改设置。</PublicFixLink>
tracking_checklist-NETWORK_PROFILE_PUBLIC-open = 打开控制面板
tracking_checklist-STAY_ALIGNED_CONFIGURED = 调整持续校准设置
tracking_checklist-STAY_ALIGNED_CONFIGURED-desc = 记录持续校准所使用的姿势以减缓漂移现象
tracking_checklist-STAY_ALIGNED_CONFIGURED-open = 打开持续校准设置
tracking_checklist-ignore = 忽略
preview-mocap_mode_soon = 动作捕捉模式(即将推出™)
preview-disable_render = 禁用预览
preview-disabled_render = 预览已禁用
toolbar-mounting_calibration = 佩戴校准
toolbar-mounting_calibration-default = 身体
toolbar-mounting_calibration-feet = 脚部
toolbar-mounting_calibration-fingers = 手指
toolbar-drift_reset = 漂移重置
toolbar-assigned_trackers = { $count } 个已分配的追踪器
toolbar-unassigned_trackers = { $count } 个未分配的追踪器

View File

@@ -33,6 +33,10 @@ tips-failed_webgl = 初始化 WebGL 失敗。
## Units
unit-meter = 公尺
unit-foot = 英尺
unit-inch = 英吋
unit-cm = 公分
## Body parts
@@ -270,6 +274,7 @@ navbar-trackers_assign = 追蹤器分配
navbar-mounting = 配戴校正
navbar-onboarding = 快速設定
navbar-settings = 詳細設定
navbar-connect_trackers = 連接追蹤器
## Biovision hierarchy recording
@@ -418,6 +423,8 @@ tracker-settings-update-up_to_date = 已為最新版本
tracker-settings-update-blocked = 無法更新,沒有其他可用版本。
tracker-settings-update = 立即更新
tracker-settings-update-title = 韌體版本
tracker-settings-current-version = 目前版本
tracker-settings-latest-version = 最新版本
## Tracker part card info
@@ -940,11 +947,6 @@ onboarding-setup_warning-cancel = 繼續設定
## Wi-Fi setup
onboarding-wifi_creds-back = 返回簡介
onboarding-wifi_creds = 輸入 Wi-Fi 認證資訊
# This cares about multilines
onboarding-wifi_creds-description =
追蹤器將使用該認證資訊以進行無線連接,
請使用目前連接中的認證資訊。
onboarding-wifi_creds-skip = 跳過 Wi-Fi 設定
onboarding-wifi_creds-submit = 送出!
onboarding-wifi_creds-ssid =
@@ -1058,6 +1060,7 @@ onboarding-assignment_tutorial-done = 我把貼紙跟綁帶都弄上了
onboarding-assign_trackers-back = 返回到 Wi-Fi 認證資訊設定
onboarding-assign_trackers-title = 分配追蹤器
onboarding-assign_trackers-description = 這些追蹤器要放在身上的哪個部位呢?請點選要放置追蹤器的部位
onboarding-assign_trackers-unassign_all = 解除全部分配
# 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
@@ -1205,6 +1208,7 @@ onboarding-automatic_mounting-return-home = 完成
## Tracker manual proportions setupa
onboarding-manual_proportions-back-scaled = 返回使用縮放比例
onboarding-manual_proportions-title = 手動調整軀幹比例
onboarding-manual_proportions-fine_tuning_button = 自動微調軀幹比例
onboarding-manual_proportions-fine_tuning_button-disabled-tooltip = 請連接 VR 頭戴顯示器以使用此功能
@@ -1222,7 +1226,7 @@ onboarding-manual_proportions-estimated_height = 預估的使用者身高
onboarding-automatic_proportions-back = 返回重置教學
onboarding-automatic_proportions-title = 測量你的身體比例
onboarding-automatic_proportions-description = 為了讓 SlimeVR 追蹤器正常使用,我們需要知道你的骨頭長度。這個簡短的流程將會進行這方面的測量。
onboarding-automatic_proportions-manual = 進行手動校正
onboarding-automatic_proportions-manual = 手動調整軀幹比例
onboarding-automatic_proportions-prev_step = 上一步
onboarding-automatic_proportions-put_trackers_on-title = 請戴好追蹤器
onboarding-automatic_proportions-put_trackers_on-description = 為了校準你的軀幹比例,我們將使用你剛才分配的追蹤器。戴上你所有的追蹤器,你可以在右邊的圖中看到追蹤器的對應部位。
@@ -1300,6 +1304,30 @@ onboarding-automatic_proportions-smol_warning-cancel = 返回
## User height calibration
onboarding-user_height-title = 你的身高是多少?
onboarding-user_height-description = 我們需要使用你的身高來計算軀幹比例,以準確呈現你的動作。你可以讓 SlimeVR 自動求得身高,也可以手動輸入。
onboarding-user_height-need_head_tracker = 進行校正需要具備定位功能的頭戴顯示器與控制器。
onboarding-user_height-calculate = 自動計算我的身高
onboarding-user_height-next_step = 繼續並儲存
onboarding-user_height-manual-proportions = 手動調整軀幹比例
onboarding-user_height-calibration-title = 校正進度
onboarding-user_height-calibration-RECORDING_FLOOR = 以控制器前端碰觸地面
onboarding-user_height-calibration-WAITING_FOR_RISE = 回到站姿
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK = 回到站姿並向前看
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-ok = 確保你的頭部保持水平
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-low = 不要朝地板看
onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-high = 不要朝高處看
onboarding-user_height-calibration-WAITING_FOR_CONTROLLER_PITCH = 確保控制器朝下
onboarding-user_height-calibration-RECORDING_HEIGHT = 維持站姿並站直!
onboarding-user_height-calibration-DONE = 完成!
onboarding-user_height-calibration-ERROR_TIMEOUT = 校正逾時,請再試一次。
onboarding-user_height-calibration-ERROR_TOO_HIGH = 偵測到的使用者身高太高,請再試一次。
onboarding-user_height-calibration-ERROR_TOO_SMALL = 偵測到的使用者身高太低,請確保在校正結尾時維持站直並向前看的姿勢。
onboarding-user_height-calibration-error = 校正失敗
onboarding-user_height-manual-tip = 調整身高時,請嘗試使用不同的姿勢來確保骨架與你的身體吻合。
onboarding-user_height-reset-warning =
<b>警告:</b> 這會將軀幹比例重置為僅基於身高的比例。
你確定要執行此操作嗎?
## Stay Aligned setup
@@ -1405,6 +1433,9 @@ firmware_tool-flash_method_step-serial-v2 =
firmware_tool-flashbtn_step = 進入燒錄模式
firmware_tool-flashbtn_step-description = 在進入下一步前,請先進行以下操作
firmware_tool-flashbtn_step-board_SLIMEVR = 關閉追蹤器電源,移除外殼(若有的話),並用 USB 線連接到這台電腦上,然後根據你持有的 SlimeVR 追蹤器主板的版本,進行下述操作:
firmware_tool-flashbtn_step-board_SLIMEVR-r11-v2 = 將追蹤器上方第二個 FLASH 方形接點與微控制器的金屬遮罩短路,同時開啟追蹤器開關。追蹤器指示燈應該會短暫閃爍並熄滅。
firmware_tool-flashbtn_step-board_SLIMEVR-r12-v2 = 將追蹤器上方的 FLASH 圓形接點與微控制器的金屬遮罩短路,同時開啟追蹤器開關。追蹤器指示燈應該會短暫閃爍並熄滅。
firmware_tool-flashbtn_step-board_SLIMEVR-r14-v2 = 按住追蹤器上方的 FLASH 按鈕,同時開啟追蹤器開關。追蹤器指示燈應該會短暫閃爍並熄滅。
firmware_tool-flashbtn_step-board_OTHER =
在燒錄前,你可能需要將追蹤器切換進 Bootloader開機載入程式
多數狀況下,在燒錄開始前按下 BOOT 按鈕即可開始燒錄。
@@ -1545,6 +1576,9 @@ error_collection_modal-description_v2 =
若之後要變更此設定,可以在「詳細設定」頁面中的「行為」來變更。
error_collection_modal-confirm = 我同意
error_collection_modal-cancel = 我不想要
## Tracking checklist section
tracking_checklist = 追蹤清單
tracking_checklist-settings = 追蹤清單設定
tracking_checklist-settings-close = 關閉

Binary file not shown.

Before

Width:  |  Height:  |  Size: 348 KiB

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -18,6 +18,8 @@ SUBSYSTEMS=="usb", ATTRS{idVendor}=="1A86", ATTRS{idProduct}=="7522", MODE="0660
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1A86", ATTRS{idProduct}=="7523", MODE="0660", TAG+="uaccess"
# CH341
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1A86", ATTRS{idProduct}=="5523", MODE="0660", TAG+="uaccess"
# CH343
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1A86", ATTRS{idProduct}=="55D3", MODE="0660", TAG+="uaccess"
# CH9102x
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1A86", ATTRS{idProduct}=="55D4", MODE="0660", TAG+="uaccess"
@@ -26,8 +28,10 @@ SUBSYSTEMS=="usb", ATTRS{idVendor}=="1A86", ATTRS{idProduct}=="55D4", MODE="0660
SUBSYSTEMS=="usb", ATTRS{idVendor}=="10C4", ATTRS{idProduct}=="EA60", MODE="0660", TAG+="uaccess"
## Espressif
# ESP32-C3
# ESP32-S3 / ESP32-C3 / ESP32-C5 / ESP32-C6 / ESP32-C61 / ESP32-H2 / ESP32-P4
SUBSYSTEMS=="usb", ATTRS{idVendor}=="303A", ATTRS{idProduct}=="1001", MODE="0660", TAG+="uaccess"
# ESP32-S2
SUBSYSTEMS=="usb", ATTRS{idVendor}=="303A", ATTRS{idProduct}=="0002", MODE="0660", TAG+="uaccess"
## FTDI
# FT232BM/L/Q, FT245BM/L/Q

View File

@@ -274,12 +274,7 @@ fn setup_tauri(
app.manage(Mutex::new(window_state));
if cli.no_start_server {
log::info!("Skipping server start.");
return Ok(());
}
if server_running() {
if cli.skip_server_start_if_running && server_running() {
log::info!("Skipping server start: server is already running.");
return Ok(());
}

View File

@@ -48,7 +48,7 @@ pub struct Cli {
#[clap(long)]
pub launch_from_path: Option<PathBuf>,
#[clap(long)]
pub no_start_server: bool,
pub skip_server_start_if_running: bool,
#[clap(flatten)]
verbose: clap_verbosity_flag::Verbosity,
}

View File

@@ -22,7 +22,7 @@
}
@screen sm {
--right-section-w: 35%;
--right-section-w: 36%;
}
@screen md {

View File

@@ -33,7 +33,7 @@ export function NavButton({
state={state}
className={classnames(
'flex flex-col justify-center xs:gap-4 mobile:gap-2',
'xs:w-[85px] mobile:w-[65px] mobile:h-[65px]',
'mobile:w-[65px] mobile:h-[65px]',
'xs:py-3 mobile:py-4 rounded-md mobile:rounded-b-none group select-text',
{
'bg-accent-background-50 fill-accent-background-20': doesMatch,
@@ -96,7 +96,7 @@ export function MainLinks() {
</NavButton>
<NavButton
to="/onboarding/wifi-creds"
icon={<WifiIcon value={1} disabled />}
icon={<WifiIcon value={1} disabled variant="navbar" />}
state={{ alonePage: true }}
>
{l10n.getString('navbar-connect_trackers')}

View File

@@ -85,7 +85,9 @@ function BasicResetButton(options: UseResetOptions & { customName?: string }) {
spacing={5}
preferedDirection={error ? 'bottom' : 'top'}
>
<div
<button
type="button"
disabled={disabled}
className={classNames(
MAINBUTTON_CLASSES({ disabled }),
'rounded-lg',
@@ -135,7 +137,7 @@ function BasicResetButton(options: UseResetOptions & { customName?: string }) {
{timer}
</Typography>
</div>
</div>
</button>
</Tooltip>
);
}

View File

@@ -156,9 +156,9 @@ export function TopBar({
<>
<div className="flex gap-0 flex-col">
<div className="h-[3px]" />
<div data-tauri-drag-region className="flex gap-2 h-[38px] z-50">
<div data-tauri-drag-region className="flex gap-2 h-[38px] z-49">
<div
className="flex px-2 py-2 justify-around z-50"
className="flex px-2 py-2 justify-around z-49"
data-tauri-drag-region
>
<div className="flex gap-2" data-tauri-drag-region>

View File

@@ -107,7 +107,13 @@ export function Button({
to={to}
className={classes}
state={state}
onClick={(ev) => disabled && ev.preventDefault()}
onClick={(ev) => {
if (disabled) {
ev.preventDefault();
return;
}
if (props.onClick) return props.onClick(ev as any);
}}
>
<ButtonContent icon={icon} loading={loading}>
{id && (

View File

@@ -59,7 +59,7 @@ function DropdownItem({
secondary:
'text-background-20 checked-hover:text-background-10 checked-hover:bg-background-60 focus:text-background-10 focus:bg-background-60',
tertiary:
'bg-accent-background-30 checked-hover:bg-accent-background-20 focus:bg-accent-background-20',
'bg-accent-background-30 checked-hover:bg-accent-background-20 focus:bg-accent-background-20 text-background-10',
};
const ref = useRef<HTMLDivElement>(null);

View File

@@ -80,7 +80,8 @@ export function FirmwareIcon({
<div>
{showUpdate &&
showUpdate !== 'unavailable' &&
showUpdate !== 'updated' && <UpdateIcon showUpdate={'can-update'} />}
showUpdate !== 'updated' &&
showUpdate !== 'blocked' && <UpdateIcon showUpdate={showUpdate} />}
</div>
);
}

View File

@@ -59,14 +59,14 @@ export function PersonFrontIcon({ mirror = true }: { mirror?: boolean }) {
/>
<circle
className="body-part-circle"
cx="81.5"
cx="82"
cy="80"
r={CIRCLE_RADIUS}
id={BodyPart[BodyPart.NECK]}
/>
<circle
className="body-part-circle"
cx="81.5"
cx="82"
cy="35"
r={CIRCLE_RADIUS}
id={BodyPart[BodyPart.HEAD]}

View File

@@ -10,7 +10,7 @@ export function TipBox({
whitespace = false,
className,
}: {
children: ReactNode;
children?: ReactNode;
hideIcon?: boolean;
whitespace?: boolean;
className?: string;

View File

@@ -24,6 +24,7 @@ interface TooltipProps {
disabled?: boolean;
tag?: string;
spacing?: number;
bindTo?: string;
}
interface TooltipPos {
@@ -344,9 +345,13 @@ export function DrawerTooltip({
elem.classList.add(classNames('animate-pulse'));
elem.classList.add(classNames('scale-[110%]'));
elem.classList.add(classNames('duration-500'));
touchTimeout.current = setTimeout(() => {
if (elem.hasAttribute('disabled')) {
open();
}, TOOLTIP_DELAY) as unknown as number;
} else {
touchTimeout.current = setTimeout(() => {
open();
}, TOOLTIP_DELAY) as unknown as number;
}
}
};
@@ -360,12 +365,16 @@ export function DrawerTooltip({
};
const touchEnd = (e: MouseEvent | TouchEvent) => {
if (Date.now() - touchTimestamp.current > TOOLTIP_DELAY) {
// open drawer
e.preventDefault(); // cancel the click event
if (
e.currentTarget instanceof HTMLButtonElement &&
e.currentTarget.hasAttribute('disabled')
) {
e.preventDefault();
return;
}
if (Date.now() - touchTimestamp.current < TOOLTIP_DELAY) {
clearTimeout(touchTimeout.current);
open();
close();
}
};
@@ -394,12 +403,14 @@ export function DrawerTooltip({
elem.addEventListener('touchstart', touchStart);
elem.addEventListener('touchend', touchEnd);
elem.addEventListener('touchcancel', touchEnd);
return () => {
elem.removeEventListener('scroll', scroll);
elem.removeEventListener('touchstart', touchStart);
elem.removeEventListener('touchend', touchEnd);
elem.removeEventListener('touchcancel', touchEnd);
clearTimeout(touchTimeout.current);
};
}
@@ -438,7 +449,7 @@ export function DrawerTooltip({
</button>
</div>
<div
className="p-2 overflow-y-auto"
className="p-4 overflow-y-auto"
style={{ maxHeight: 'calc(100vh - 49px - 44px)' }}
>
{children}
@@ -458,11 +469,16 @@ export function Tooltip({
variant = 'auto',
disabled = false,
tag = 'div',
bindTo,
spacing = 10,
}: TooltipProps) {
const childRef = useRef<HTMLElement | null>(null);
const isAndroid = window.__ANDROID__?.isThere();
if (bindTo) {
childRef.current = document.querySelector(bindTo);
}
let portal = null;
if (variant === 'auto') {
portal = isAndroid ? (
@@ -498,7 +514,13 @@ export function Tooltip({
return (
<>
{createElement(tag, { className: 'contents', ref: childRef }, children)}
{bindTo
? children
: createElement(
tag,
{ className: 'contents', ref: childRef },
children
)}
{!disabled && createPortal(portal, document.body)}
</>
);

View File

@@ -11,6 +11,9 @@ export function BatteryIcon({
charging: boolean;
}) {
const col = useMemo(() => {
if (disabled) return 'fill-background-40';
else if (charging) return 'fill-status-success';
const colorsMap: { [key: number]: string } = {
0.4: 'fill-status-success',
0.2: 'fill-status-warning',
@@ -20,10 +23,8 @@ export function BatteryIcon({
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 colorsMap[+val] || 'fill-background-10';
}, [value, disabled, charging]);
return (
<svg
@@ -59,13 +60,21 @@ export function BatteryIcon({
/>
</mask>
<g mask="url(#mask0_4_39)" className={classNames(col, 'opacity-100')}>
<rect width={value * 18} height="9" />
<rect width={charging ? 18 : value * 18} height="9" />
</g>
{charging && (
{charging && value <= 1 && (
<path
d="M 0.93561138,11.744353 2.4349252,6.1488377 H 0.0312815 L 3.5761014,0.00903018 2.2061799,5.1216451 h 2.4534885 z"
d="M 7.7638355,8.4189633 8.0112251,4.9834646 5.7712838,4.9834645 8.5644084,0.07977871 8.3170195,3.5152773 H 10.55696 Z"
fill="#081e30"
transform="translate(5,-1)"
/>
)}
{charging && value > 1 && (
<path
d="M 5.5342464,4.6225095 C 6.1777799,5.0106205 6.6131537,5.2516456 7.5253371,6.545223 8.4340868,4.4016445 8.7809738,3.661475 10.605195,1.5520288"
fill="none"
stroke="#081e30"
strokeWidth={1.5}
strokeLinecap="square"
/>
)}
</svg>

View File

@@ -1,4 +1,51 @@
import { useConfig } from '@/hooks/config';
export function SlimeVRIcon({ drag }: { drag?: boolean }) {
const { config } = useConfig();
if (config?.theme == 'snep') {
return (
<svg
width="49"
height="29"
viewBox="-4 -2 49 33"
fill="none"
xmlns="http://www.w3.org/2000/svg"
data-tauri-drag-region={drag}
>
<path
d="m 1.6647024,15.257308 4.84329,-5.8061114 5.1394996,4.7526114"
stroke="#FFCCE5"
strokeWidth="3"
strokeLinecap="round"
/>
<path
d="m 22.099692,14.390108 5.7806,-4.8728814 4.2323,5.5751814"
stroke="#FFCCE5"
strokeWidth="3"
strokeLinecap="round"
/>
<path
d="m 9.7241618,27.517333 c 2.9071362,-0.836166 5.2501762,-1.583484 7.0857782,-3.854543 1.787374,2.222439 3.963276,3.063619 7.087706,3.839132"
stroke="#FFCCE5"
strokeWidth="3"
strokeLinecap="round"
/>
<path
d="m 19.337465,19.962745 c -1.861871,0.437141 -3.433485,0.530797 -5.209565,0.06165 1.286223,0.173275 2.222982,0.778091 2.686704,1.605299 0.327959,-0.839305 1.382466,-1.47415 2.522861,-1.666949 z"
stroke="#FFCCE5"
strokeWidth="3"
strokeLinecap="round"
strokeLinejoin="round"
/>
<path
d="m 35.942918,2.6356084 c 6.330566,-1.5164535 11.583704,-1.69795947 15.609729,0.9503118 2.180495,1.4343036 1.678869,4.6673575 0.754839,5.9005803 -2.596688,3.4655715 -9.485458,7.3237605 -5.116612,11.0623905 -4.998324,0.352073 -3.13787,5.686673 1.260384,6.928864"
stroke="#FFCCE5"
strokeWidth="3"
strokeLinecap="round"
/>
</svg>
);
}
return (
<svg
width="49"

View File

@@ -1,4 +1,39 @@
import { useConfig } from '@/hooks/config';
export function SlimeVRIcon({ width = 28 }: { width?: number }) {
const { config } = useConfig();
if (config?.theme == 'snep') {
return (
<svg
xmlns="http://www.w3.org/2000/svg"
fillRule="evenodd"
strokeMiterlimit="10"
clipRule="evenodd"
width={width}
viewBox="0 0 380 380"
>
<g fill="none" stroke="#fff">
<path strokeWidth="13.62" d="m 58.065408,191.74 37,-39 39,36" />
<path strokeWidth="13.62" d="m 194.06861,187.74 38,-35 36,38" />
<path
strokeLinecap="square"
strokeWidth="17"
d="m 264.21323,100.54097 c 36.55564,-13.927358 80.48248,-20.252638 96.44182,-0.16058 15.95933,20.09207 -5.55378,62.57663 -18.85775,71.31398 -13.30397,8.73734 -24.9251,23.65102 11.38415,55.001 -41.88653,1.00415 -20.70613,38.05812 4.23915,51.07844"
/>
<path
strokeLinecap="round"
strokeWidth="17"
d="m 178.71549,220.85825 c -11.18717,2.62658 -20.63024,3.18933 -31.30189,0.37013 7.7283,1.04116 13.35686,4.67519 16.14313,9.6455 1.97058,-5.04296 8.30663,-8.85748 15.15876,-10.01593 z"
/>
<path
strokeLinecap="square"
strokeWidth="17"
d="m 114.0349,266.90992 c 14.41809,-4.43279 38.26495,-10.17404 49.29422,-23.81979 10.73948,13.35362 31.14902,18.81171 48.74742,23.621"
/>
</g>
</svg>
);
}
return (
<svg
xmlns="http://www.w3.org/2000/svg"

View File

@@ -1,6 +1,11 @@
export function USBIcon() {
export function USBIcon({ size = 48 }: { size?: number }) {
return (
<svg xmlns="http://www.w3.org/2000/svg" height="48" width="48">
<svg
xmlns="http://www.w3.org/2000/svg"
height={size}
width={size}
viewBox="0 0 48 48"
>
<path d="M24 44q-1.6 0-2.6-1t-1-2.6q0-1.1.55-2 .55-.9 1.55-1.45V31.4h-7.4q-1.2 0-2.1-.9-.9-.9-.9-2.1v-5.45q-1-.45-1.55-1.325T10 19.6q0-1.6 1-2.6t2.6-1q1.6 0 2.6 1t1 2.6q0 1.15-.55 2.025T15.1 22.95v5.45h7.4v-17h-4L24 3.95l5.5 7.45h-4v17h7.4v-5.2h-2.1V16H38v7.2h-2.1v5.2q0 1.2-.9 2.1-.9.9-2.1.9h-7.4v5.55q1 .55 1.55 1.5t.55 1.95q0 1.6-1 2.6T24 44Z" />
</svg>
);

View File

@@ -2,10 +2,14 @@ import classNames from 'classnames';
import { useMemo } from 'react';
export function WifiIcon({
variant = 'progress',
value,
size = 16,
disabled = false,
}: {
variant?: 'progress' | 'navbar';
value: number | null;
size?: number;
disabled?: boolean;
}) {
const percent = useMemo(
@@ -21,6 +25,8 @@ export function WifiIcon({
const y = useMemo(() => (1 - percent) * 13, [percent]);
const col = useMemo(() => {
if (variant === 'navbar') return 'fill-inherit';
const colorsMap: { [key: number]: string } = {
0.4: 'fill-status-success',
0.2: 'fill-status-warning',
@@ -33,12 +39,12 @@ export function WifiIcon({
return disabled
? 'fill-background-40'
: colorsMap[+val] || 'fill-background-10';
}, [percent, disabled]);
}, [percent, disabled, variant]);
return (
<svg
width="16"
height="13"
width={size}
height={size}
viewBox="0 0 16 13"
xmlns="http://www.w3.org/2000/svg"
>

View File

@@ -231,7 +231,10 @@ function OTADevicesList({
const allDevices = useAtomValue(devicesAtom);
const devices =
allDevices.filter(({ trackers }) => {
allDevices.filter(({ hardwareInfo, trackers }) => {
// filter out devices we can't update
if (!hardwareInfo?.officialBoardType) return false;
// if the device has no trackers it is prob misconfigured so we skip for safety
if (trackers.length <= 0) return false;

View File

@@ -101,13 +101,10 @@ export function SelectSourceSetep({
curr.push({
name: source.source,
official: source.official,
disabled:
!partialBoard?.board ||
!source.availableBoards.includes(partialBoard.board),
});
return curr;
},
[] as { name: string; official: boolean; disabled: boolean }[]
[] as { name: string; official: boolean }[]
)
.sort((a, b) => {
if (a.official !== b.official) return a.official ? -1 : 1;
@@ -115,6 +112,7 @@ export function SelectSourceSetep({
}),
possibleBoards: sources
?.reduce((curr, source) => {
if (source.source !== partialBoard?.source) return curr;
const unknownBoards = source.availableBoards.filter(
(b) => !curr.includes(b)
);
@@ -136,6 +134,7 @@ export function SelectSourceSetep({
possibleVersions: sources
?.reduce(
(curr, source) => {
if (source.source !== partialBoard?.source) return curr;
if (!curr.find(({ name }) => source.version === name))
curr.push({
disabled:
@@ -193,6 +192,25 @@ export function SelectSourceSetep({
{!isFetching && !isError && (
<div className="flex flex-col gap-2">
<div className="grid md:grid-cols-3 gap-4">
<div className="flex flex-col gap-1 w-full">
<Localized id="firmware_tool-select_source-firmware">
<Typography variant="section-title" />
</Localized>
<div className="flex flex-col gap-4 md:max-h-[305px] overflow-y-auto bg-background-80 rounded-lg p-4">
{sourcesGroupped?.map(({ name, official }) => (
<Selector
active={partialBoard?.source === name}
key={`${name}`}
tag={official ? 'official' : undefined}
onClick={() => {
if (partialBoard?.source !== name)
setPartialBoard({ source: name });
}}
text={formatSource(name, official)}
/>
))}
</div>
</div>
<div className="flex flex-col gap-1 w-full">
<Localized id="firmware_tool-select_source-board_type">
<Typography variant="section-title" />
@@ -203,7 +221,7 @@ export function SelectSourceSetep({
active={partialBoard?.board === board}
key={`${board}`}
onClick={() => {
setPartialBoard({ board });
setPartialBoard((curr) => ({ ...curr, board }));
}}
tag={
board.startsWith('BOARD_SLIMEVR')
@@ -219,30 +237,15 @@ export function SelectSourceSetep({
}
/>
))}
{partialBoard?.source && possibleBoards?.length === 0 && (
<Typography id="firmware_tool-select_source-no_boards" />
)}
{!partialBoard?.source && (
<Typography id="firmware_tool-select_source-not_selected" />
)}
</div>
</div>
<div className="flex flex-col gap-1 w-full">
<Localized id="firmware_tool-select_source-firmware">
<Typography variant="section-title" />
</Localized>
<div className="flex flex-col gap-4 md:max-h-[305px] overflow-y-auto bg-background-80 rounded-lg p-4">
{sourcesGroupped?.map(({ name, official, disabled }) => (
<Selector
active={partialBoard?.source === name}
disabled={disabled}
key={`${name}`}
tag={official ? 'official' : undefined}
onClick={() => {
setPartialBoard((curr) => ({
...curr,
source: name,
}));
}}
text={formatSource(name, official)}
/>
))}
</div>
</div>
<div className="flex flex-col gap-1 w-full">
<Localized id="firmware_tool-select_source-version">
<Typography variant="section-title" />
@@ -268,6 +271,12 @@ export function SelectSourceSetep({
text={name}
/>
))}
{partialBoard?.source && possibleVersions?.length === 0 && (
<Typography id="firmware_tool-select_source-no_versions" />
)}
{!partialBoard?.source && (
<Typography id="firmware_tool-select_source-not_selected" />
)}
</div>
</div>
</div>

View File

@@ -20,7 +20,7 @@ export function HomeSettingsModal({
>
<div className="flex flex-col gap-4">
<Typography variant="main-title" id="home-settings" />
<HomeLayoutSettings />
<HomeLayoutSettings variant="modal" />
<div className="flex justify-end">
<Button
variant="tertiary"

View File

@@ -28,18 +28,23 @@ export function ResetButtonIcon(options: UseResetOptions) {
}
export function ResetButton({
onClick,
className,
onReseted,
children,
onFailed,
...options
}: {
onClick?: () => void;
className?: string;
children?: ReactNode;
onReseted?: () => void;
onFailed?: () => void;
} & UseResetOptions) {
const { triggerReset, status, timer, disabled, name, error } = useReset(
options,
onReseted
onReseted,
onFailed
);
return (
@@ -60,7 +65,10 @@ export function ResetButton({
>
<Button
icon={<ResetButtonIcon {...options} />}
onClick={triggerReset}
onClick={() => {
if (onClick) onClick();
triggerReset();
}}
className={classNames(
'border-2 py-[5px]',
status === 'finished'

View File

@@ -105,7 +105,7 @@ export function BodyAssignment({
onlyAssigned = false,
dotSize,
}: {
assignMode: AssignMode;
assignMode: AssignMode | null;
mirror: boolean;
onlyAssigned?: boolean;
rolesWithErrors?: Partial<Record<BodyPart, BodyPartError>>;
@@ -148,8 +148,7 @@ export function BodyAssignment({
const hasBodyPart = useCallback(
(part: BodyPart) =>
COMMONS.includes(part) ||
assignMode === AssignMode.All ||
ASSIGNMENT_MODES[assignMode].includes(part),
(assignMode && ASSIGNMENT_MODES[assignMode].includes(part)),
[assignMode]
);

View File

@@ -5,6 +5,9 @@ import { Button } from '@/components/commons/Button';
import { Input } from '@/components/commons/Input';
import { Typography } from '@/components/commons/Typography';
import classNames from 'classnames';
import { USBIcon } from '@/components/commons/icon/UsbIcon';
import { WifiIcon } from '@/components/commons/icon/WifiIcon';
import { WarningBox } from '@/components/commons/TipBox';
export function WifiCredsPage() {
const { l10n } = useLocalization();
@@ -14,96 +17,114 @@ export function WifiCredsPage() {
applyProgress(0.2);
return (
<form
className="flex flex-col w-full h-full"
onSubmit={handleSubmit(submitWifiCreds)}
>
<div className="flex flex-col w-full h-full xs:justify-center items-center relative ">
<div className="flex mobile:flex-col xs:gap-10 px-4">
<div className="flex flex-col max-w-sm">
<Typography variant="main-title">
{l10n.getString('onboarding-wifi_creds')}
</Typography>
<>
{l10n
.getString('onboarding-wifi_creds-description')
.split('\n')
.map((line, i) => (
<Typography key={i}>{line}</Typography>
))}
</>
{!state.alonePage && (
<Button
variant="secondary"
to="/onboarding/home"
className="mt-auto mb-10 self-start"
>
{l10n.getString('onboarding-previous_step')}
</Button>
)}
</div>
<div
className={classNames(
'flex flex-col gap-3 p-10 rounded-xl max-w-sm sentry-mask',
!state.alonePage && 'bg-background-70',
state.alonePage && 'bg-background-60'
)}
>
<Localized
id="onboarding-wifi_creds-ssid"
attrs={{ placeholder: true, label: true }}
>
<Input
control={control}
rules={{ required: true }}
name="ssid"
type="text"
label="SSID"
placeholder="ssid"
variant="secondary"
/>
</Localized>
<Localized
id="onboarding-wifi_creds-password"
attrs={{ placeholder: true, label: true }}
>
<Input
control={control}
rules={{
validate: {
validPassword: (v: string | undefined) =>
v === undefined ||
v.length === 0 ||
new Blob([v]).size >= 8,
},
}}
name="password"
type="password"
label="Password"
placeholder="password"
variant="secondary"
/>
</Localized>
<div className="flex flex-row gap-3">
<Button
variant="secondary"
className={state.alonePage ? 'opacity-0' : ''}
state={{ alonePage: state.alonePage }}
to={'/onboarding/trackers-assign'}
>
{l10n.getString('onboarding-wifi_creds-skip')}
</Button>
<Button
type="submit"
variant="primary"
disabled={!formState.isValid}
>
{l10n.getString('onboarding-wifi_creds-submit')}
</Button>
<div className="flex flex-col w-full h-full xs:justify-center items-center">
<div className="grid xs:grid-cols-2 gap-4 max-w-6xl p-4">
<div className="flex flex-col gap-2">
<div className="flex gap-2 items-center">
<div className="bg-accent-background-30 rounded-full p-2 fill-background-10">
<USBIcon size={24} />
</div>
<Typography
variant="main-title"
id="onboarding-wifi_creds-dongle-title"
/>
</div>
<div className={classNames('flex flex-col gap-2 flex-grow p-2')}>
<Typography
whitespace="whitespace-pre-wrap"
id="onboarding-wifi_creds-dongle-description"
/>
<Localized id="onboarding-wifi_creds-dongle-wip">
<WarningBox whitespace>WARNING</WarningBox>
</Localized>
</div>
<div className="flex px-2 p-6">
<Button
variant="primary"
to={state.alonePage ? '/' : '/onboarding/trackers-assign'}
id="onboarding-wifi_creds-dongle-continue"
/>
</div>
</div>
<form
className="flex flex-col gap-2"
onSubmit={handleSubmit(submitWifiCreds)}
>
<div className="flex gap-2 items-center">
<div className="bg-accent-background-30 rounded-full p-2 fill-background-10">
<WifiIcon variant="navbar" value={1} size={24} />
</div>
<Typography variant="main-title" id="onboarding-wifi_creds-v2" />
</div>
<div className="flex flex-col gap-2 w-full h-full p-2">
<Typography
id="onboarding-wifi_creds-description-v2"
whitespace="whitespace-pre-wrap"
/>
<div
className={classNames(
'flex flex-col gap-3 p-5 rounded-xl sentry-mask',
!state.alonePage && 'bg-background-70',
state.alonePage && 'bg-background-60'
)}
>
<Localized
id="onboarding-wifi_creds-ssid"
attrs={{ placeholder: true, label: true }}
>
<Input
control={control}
rules={{ required: true }}
name="ssid"
type="text"
label="SSID"
placeholder="ssid"
variant="secondary"
/>
</Localized>
<Localized
id="onboarding-wifi_creds-password"
attrs={{ placeholder: true, label: true }}
>
<Input
control={control}
rules={{
validate: {
validPassword: (v: string | undefined) =>
v === undefined ||
v.length === 0 ||
new Blob([v]).size >= 8,
},
}}
name="password"
type="password"
label="Password"
placeholder="password"
variant="secondary"
/>
</Localized>
<div className="flex flex-row gap-3 justify-between">
<Button
variant="secondary"
className={state.alonePage ? 'opacity-0' : ''}
state={{ alonePage: state.alonePage }}
to={'/onboarding/trackers-assign'}
>
{l10n.getString('onboarding-wifi_creds-skip')}
</Button>
<Button
type="submit"
variant="primary"
disabled={!formState.isValid}
>
{l10n.getString('onboarding-wifi_creds-submit')}
</Button>
</div>
</div>
</div>
</form>
</div>
</form>
</div>
);
}

View File

@@ -35,6 +35,7 @@ import { ProgressBar } from '@/components/commons/ProgressBar';
import { useBreakpoint } from '@/hooks/breakpoint';
import { useConfig } from '@/hooks/config';
import { ProportionsResetModal } from './ProportionsResetModal';
import * as Sentry from '@sentry/react';
const statusSteps = [
// Order matters be carefull
@@ -237,6 +238,7 @@ function UserHeightStatus({
export function ScaledProportionsPage() {
const [hmdHeight, setHmdHeight] = useState(0);
const [tmpHeight, setTmpHeight] = useState(0);
const [lastUsed, setLastUsed] = useState<'manual' | 'auto' | null>(null);
const { config, setConfig } = useConfig();
const { applyProgress, state } = useOnboarding();
@@ -297,6 +299,7 @@ export function ScaledProportionsPage() {
new SkeletonResetAllRequestT()
);
setConfig({ lastUsedProportions: 'scaled' });
setLastUsed('manual');
};
useRPCPacket(
@@ -311,6 +314,7 @@ export function ScaledProportionsPage() {
if (res.status === UserHeightCalibrationStatus.DONE) {
setConfig({ lastUsedProportions: 'scaled' });
setLastUsed('auto');
}
}
);
@@ -322,6 +326,14 @@ export function ScaledProportionsPage() {
}
);
useEffect(() => {
if (lastUsed !== null) {
Sentry.metrics.count('scaled_proportions', 1, {
attributes: { calibration: lastUsed },
});
}
}, [lastUsed]);
useEffect(() => {
sendRPCPacket(
RpcMessage.SkeletonConfigRequest,
@@ -418,7 +430,9 @@ export function ScaledProportionsPage() {
) {
setTmpHeight(height);
setResetModal('manual');
} else setHmdHeight(height);
} else {
applyHeight(height);
}
setAuto(false);
}}
/>

View File

@@ -75,7 +75,7 @@ export function VerifyResultsStep({
hasRecording === ProcessStatus.FULFILLED && (
<Typography>
{l10n.getString(
'onboarding-automatic-proportions-verify-results-processing'
'onboarding-automatic_proportions-verify_results-processing'
)}
</Typography>
)}

View File

@@ -1,4 +1,4 @@
import { useCallback, useMemo, useState } from 'react';
import { ReactNode, useCallback, useMemo, useState } from 'react';
import { AssignTrackerRequestT, BodyPart, RpcMessage } from 'solarxr-protocol';
import { useOnboarding } from '@/hooks/onboarding';
import { useWebsocketAPI } from '@/hooks/websocket-api';
@@ -12,16 +12,16 @@ import { TipBox } from '@/components/commons/TipBox';
import { Typography } from '@/components/commons/Typography';
import { BodyAssignment } from '@/components/onboarding/BodyAssignment';
import { MountingSelectionMenu } from './MountingSelectionMenu';
import { useLocalization } from '@fluent/react';
import { Localized } from '@fluent/react';
import { useBreakpoint } from '@/hooks/breakpoint';
import { Quaternion } from 'three';
import { AssignMode, defaultConfig, useConfig } from '@/hooks/config';
import { assignedTrackersAtom, FlatDeviceTracker } from '@/store/app-store';
import { useAtomValue } from 'jotai';
import * as Sentry from '@sentry/react';
export function ManualMountingPage() {
const { isMobile } = useBreakpoint('mobile');
const { l10n } = useLocalization();
const { applyProgress, state } = useOnboarding();
const { sendRPCPacket } = useWebsocketAPI();
const { config } = useConfig();
@@ -59,6 +59,12 @@ export function ManualMountingPage() {
assignreq.allowDriftCompensation = false;
sendRPCPacket(RpcMessage.AssignTrackerRequest, assignreq);
Sentry.metrics.count('manual_mounting_set', 1, {
attributes: {
part: BodyPart[assignreq.bodyPosition],
direction: assignreq.mountingOrientation,
},
});
});
setSelectRole(BodyPart.NONE);
@@ -96,28 +102,26 @@ export function ManualMountingPage() {
<div className="flex flex-col gap-5 h-full items-center w-full xs:justify-center relative overflow-y-auto">
<div className="flex xs:flex-row mobile:flex-col h-full px-8 xs:w-full xs:justify-center mobile:px-4 items-center">
<div className="flex flex-col w-full xs:max-w-sm gap-3">
<Typography variant="main-title">
{l10n.getString('onboarding-manual_mounting')}
</Typography>
<Typography>
{l10n.getString('onboarding-manual_mounting-description')}
</Typography>
<TipBox>{l10n.getString('tips-find_tracker')}</TipBox>
<Typography variant="main-title" id="onboarding-manual_mounting" />
<Typography id="onboarding-manual_mounting-description" />
<Typography id="tips-find_tracker" />
<Localized id="tips-find_tracker">
<TipBox />
</Localized>
<div className="flex flex-row gap-3 mt-auto">
<Button
variant="secondary"
to="/onboarding/mounting/choose"
state={state}
>
{l10n.getString('onboarding-previous_step')}
</Button>
id="onboarding-previous_step"
/>
{!state.alonePage && (
<Button
variant="primary"
to="/onboarding/body-proportions/scaled"
>
{l10n.getString('onboarding-manual_mounting-next')}
</Button>
id="onboarding-manual_mounting-next"
/>
)}
</div>
</div>
@@ -135,3 +139,109 @@ export function ManualMountingPage() {
</>
);
}
export function ManualMountingPageStayAligned({
children,
}: {
children: ReactNode;
}) {
const { isMobile } = useBreakpoint('mobile');
const { sendRPCPacket } = useWebsocketAPI();
const { config } = useConfig();
const [selectedRole, setSelectRole] = useState<BodyPart>(BodyPart.NONE);
const assignedTrackers = useAtomValue(assignedTrackersAtom);
const trackerPartGrouped = useMemo(
() =>
assignedTrackers.reduce<{ [key: number]: FlatDeviceTracker[] }>(
(curr, td) => {
const key = td.tracker.info?.bodyPart || BodyPart.NONE;
return {
...curr,
[key]: [...(curr[key] || []), td],
};
},
{}
),
[assignedTrackers]
);
const onDirectionSelected = (mountingOrientationDegrees: Quaternion) => {
(trackerPartGrouped[selectedRole] || []).forEach((td) => {
const assignreq = new AssignTrackerRequestT();
assignreq.bodyPosition = td.tracker.info?.bodyPart || BodyPart.NONE;
assignreq.mountingOrientation = MountingOrientationDegreesToQuatT(
mountingOrientationDegrees
);
assignreq.trackerId = td.tracker.trackerId;
assignreq.allowDriftCompensation = false;
sendRPCPacket(RpcMessage.AssignTrackerRequest, assignreq);
Sentry.metrics.count('manual_mounting_set', 1, {
attributes: {
part: BodyPart[assignreq.bodyPosition],
direction: assignreq.mountingOrientation,
},
});
});
setSelectRole(BodyPart.NONE);
};
const getCurrRotation = useCallback(
(role: BodyPart) => {
if (role === BodyPart.NONE) return undefined;
const trackers = trackerPartGrouped[role] || [];
const [mountingOrientation, ...orientation] = trackers
.map((td) => td.tracker.info?.mountingOrientation)
.filter((orientation) => !!orientation)
.map((orientation) => QuaternionFromQuatT(orientation));
const identicalOrientations =
mountingOrientation !== undefined &&
orientation.every((quat) =>
similarQuaternions(quat, mountingOrientation)
);
return identicalOrientations ? mountingOrientation : undefined;
},
[trackerPartGrouped]
);
return (
<>
<MountingSelectionMenu
bodyPart={selectedRole}
currRotation={getCurrRotation(selectedRole)}
isOpen={selectedRole !== BodyPart.NONE}
onClose={() => setSelectRole(BodyPart.NONE)}
onDirectionSelected={onDirectionSelected}
/>
<div className="flex flex-col gap-5 h-full items-center w-full xs:justify-center relative overflow-y-auto">
<div className="flex xs:flex-row mobile:flex-col h-full px-8 xs:w-full xs:justify-center mobile:px-4 items-center">
<div className="flex flex-col w-full xs:max-w-sm gap-3">
<Typography variant="main-title" id="onboarding-manual_mounting" />
<Typography id="onboarding-manual_mounting-description" />
<Typography id="tips-find_tracker" />
<Localized id="tips-find_tracker">
<TipBox />
</Localized>
{children}
</div>
<div className="flex flex-row justify-center">
<BodyAssignment
width={isMobile ? 160 : undefined}
mirror={config?.mirrorView ?? defaultConfig.mirrorView}
onlyAssigned={true}
assignMode={AssignMode.All}
onRoleSelected={setSelectRole}
/>
</div>
</div>
</div>
</>
);
}

View File

@@ -5,6 +5,7 @@ import { SkipSetupWarningModal } from '@/components/onboarding/SkipSetupWarningM
import classNames from 'classnames';
import { Typography } from '@/components/commons/Typography';
import { Button } from '@/components/commons/Button';
import * as Sentry from '@sentry/react';
export function MountingChoose() {
const { l10n } = useLocalization();
@@ -66,6 +67,11 @@ export function MountingChoose() {
variant="primary"
to={'/onboarding/mounting/auto'}
className="self-start mt-auto"
onClick={() => {
Sentry.metrics.count('mounting_choose', 1, {
attributes: { choose: 'auto' },
});
}}
state={{ alonePage: state.alonePage }}
>
{l10n.getString('onboarding-manual_mounting-auto_mounting')}
@@ -111,6 +117,11 @@ export function MountingChoose() {
to="/onboarding/mounting/manual"
className="self-start mt-auto"
state={{ alonePage: state.alonePage }}
onClick={() => {
Sentry.metrics.count('mounting_choose', 1, {
attributes: { choose: 'manual' },
});
}}
>
{l10n.getString(
'onboarding-automatic_mounting-manual_mounting'

View File

@@ -238,7 +238,7 @@ export function MountingSelectionMenu({
shouldCloseOnEsc
onRequestClose={onClose}
overlayClassName={classNames(
'fixed top-0 right-0 left-0 bottom-0 flex flex-col items-center w-full h-full bg-background-90 bg-opacity-90 z-20'
'fixed top-0 right-0 left-0 bottom-0 flex flex-col items-center w-full h-full bg-background-90 bg-opacity-90 z-50'
)}
className={classNames(
'focus:ring-transparent focus:ring-offset-transparent focus:outline-transparent outline-none mt-20 z-10'

View File

@@ -1,32 +1,33 @@
import { useState } from 'react';
import { Button } from '@/components/commons/Button';
import { Typography } from '@/components/commons/Typography';
import { ResetType } from 'solarxr-protocol';
import { ResetButton } from '@/components/home/ResetButton';
import { useLocalization } from '@fluent/react';
import { useBreakpoint } from '@/hooks/breakpoint';
import { VerticalStepComponentProps } from '@/components/commons/VerticalStepper';
import { BaseModal } from '@/components/commons/BaseModal';
import { ManualMountingPageStayAligned } from '@/components/onboarding/pages/mounting/ManualMounting';
export function VerifyMountingStep({
nextStep,
prevStep,
}: VerticalStepComponentProps) {
const { isMobile } = useBreakpoint('mobile');
const { l10n } = useLocalization();
const [isOpen, setOpen] = useState(false);
const [disableMounting, setDisableMounting] = useState(false);
const goNextStep = () => {
setDisableMounting(false);
setOpen(false);
nextStep();
};
return (
<div className="flex flex-col flex-grow justify-between py-2 gap-2">
<div className="flex flex-col flex-grow">
<div className="flex flex-grow flex-col gap-4 max-w-sm">
<div className="flex flex-col gap-2">
<Typography>
{l10n.getString(
'onboarding-automatic_mounting-mounting_reset-step-0'
)}
</Typography>
<Typography>
{l10n.getString(
'onboarding-automatic_mounting-mounting_reset-step-1'
)}
</Typography>
<Typography id="onboarding-automatic_mounting-mounting_reset-step-0" />
<Typography id="onboarding-automatic_mounting-mounting_reset-step-1" />
</div>
</div>
@@ -50,13 +51,36 @@ export function VerifyMountingStep({
</div>
)}
<div className="flex gap-3 justify-between">
<Button variant={'secondary'} onClick={prevStep}>
{l10n.getString('onboarding-automatic_mounting-prev_step')}
</Button>
<Button
variant={'secondary'}
onClick={prevStep}
id="onboarding-automatic_mounting-prev_step"
/>
<Button
disabled={disableMounting}
variant={'secondary'}
className="self-start mt-auto"
onClick={() => setOpen(true)}
id="onboarding-automatic_mounting-manual_mounting"
/>
<BaseModal isOpen={isOpen} onRequestClose={() => setOpen(false)}>
<ManualMountingPageStayAligned>
<div className="flex flex-row gap-3 mt-auto">
<Button
variant="primary"
onClick={goNextStep}
id="onboarding-stay_aligned-manual_mounting-done"
/>
</div>
</ManualMountingPageStayAligned>
</BaseModal>
<ResetButton
onClick={() => setDisableMounting(true)}
type={ResetType.Mounting}
group="default"
onReseted={nextStep}
onReseted={goNextStep}
onFailed={() => setDisableMounting(false)}
/>
</div>
</div>

View File

@@ -1,6 +1,6 @@
import { Radio } from '@/components/commons/Radio';
import { Typography } from '@/components/commons/Typography';
import { AssignMode, defaultConfig, useConfig } from '@/hooks/config';
import { AssignMode, useConfig } from '@/hooks/config';
import { ASSIGNMENT_MODES } from '@/components/onboarding/BodyAssignment';
import { useLocalization } from '@fluent/react';
import { useForm } from 'react-hook-form';
@@ -61,11 +61,20 @@ export function TrackerAssignOptions({
const connectedIMUTrackers = useAtomValue(connectedIMUTrackersAtom);
const { config, setConfig } = useConfig();
const { control, watch, setValue } = useForm<{
const getPreferredSet = () => {
return (
(Object.entries(ASSIGN_MODE_OPTIONS).find(
([_, count]) => count >= connectedIMUTrackers.length
)?.[0] as AssignMode) ?? AssignMode.All
);
};
const { control, watch } = useForm<{
assignMode: AssignMode;
}>({
defaultValues: {
assignMode: config?.assignMode ?? defaultConfig.assignMode,
assignMode: config?.assignMode || getPreferredSet(),
},
});
const { assignMode } = watch();
@@ -74,19 +83,6 @@ export function TrackerAssignOptions({
setConfig({ assignMode });
}, [assignMode]);
useEffect(() => {
if (connectedIMUTrackers.length <= ASSIGN_MODE_OPTIONS[assignMode]) return;
const selectedAssignMode =
(Object.entries(ASSIGN_MODE_OPTIONS).find(
([_, count]) => count >= connectedIMUTrackers.length
)?.[0] as AssignMode) ?? AssignMode.All;
if (assignMode !== selectedAssignMode) {
setValue('assignMode', selectedAssignMode);
}
}, [connectedIMUTrackers, assignMode]);
if (variant == 'dropdown')
return (
<Dropdown

View File

@@ -354,7 +354,7 @@ export function TrackersAssignPage() {
onlyAssigned={false}
highlightedRoles={firstError?.affectedRoles || []}
rolesWithErrors={rolesWithErrors}
assignMode={config?.assignMode ?? defaultConfig.assignMode}
assignMode={config?.assignMode ?? null}
mirror={mirrorView}
onRoleSelected={tryOpenChokerWarning}
/>

View File

@@ -1,30 +1,16 @@
import { ReactNode, useContext, useLayoutEffect } from 'react';
import { ReactNode } from 'react';
import { ConfigContextC, loadConfig, useConfigProvider } from '@/hooks/config';
import { DEFAULT_LOCALE, LangContext } from '@/i18n/config';
import { getSentryOrCompute } from '@/utils/sentry';
const config = await loadConfig();
if (config?.errorTracking !== undefined) {
// load sentry ASAP to catch early errors
getSentryOrCompute(config.errorTracking ?? false);
getSentryOrCompute(config.errorTracking ?? false, config.uuid);
}
export function ConfigContextProvider({ children }: { children: ReactNode }) {
const context = useConfigProvider(config);
const { changeLocales } = useContext(LangContext);
useLayoutEffect(() => {
changeLocales([config?.lang || DEFAULT_LOCALE]);
}, []);
useLayoutEffect(() => {
if (config?.errorTracking !== undefined) {
// Alows for sentry to refresh if user change the setting once the gui
// is initialized
getSentryOrCompute(config.errorTracking ?? false);
}
}, [config?.errorTracking]);
return (
<ConfigContextC.Provider value={context}>

View File

@@ -14,6 +14,7 @@ import {
SettingsResponseT,
SteamVRTrackersSettingT,
TapDetectionSettingsT,
HIDSettingsT,
} from 'solarxr-protocol';
import { useConfig } from '@/hooks/config';
import { useWebsocketAPI } from '@/hooks/websocket-api';
@@ -74,6 +75,7 @@ export type SettingsForm = {
usePosition: boolean;
enforceConstraints: boolean;
correctConstraints: boolean;
fingersMitten: boolean;
};
ratios: {
imputeWaistFromChestHip: number;
@@ -101,6 +103,9 @@ export type SettingsForm = {
};
resetsSettings: ResetSettingsForm;
stayAligned: StayAlignedSettingsForm;
hidSettings: {
trackersOverHID: boolean;
};
};
const defaultValues: SettingsForm = {
@@ -130,6 +135,7 @@ const defaultValues: SettingsForm = {
usePosition: true,
enforceConstraints: true,
correctConstraints: true,
fingersMitten: false,
},
ratios: {
imputeWaistFromChestHip: 0.3,
@@ -156,6 +162,7 @@ const defaultValues: SettingsForm = {
legTweaks: { correctionStrength: 0.3 },
resetsSettings: defaultResetSettings,
stayAligned: defaultStayAlignedSettings,
hidSettings: { trackersOverHID: false },
};
export function GeneralSettings() {
@@ -226,6 +233,7 @@ export function GeneralSettings() {
toggles.usePosition = values.toggles.usePosition;
toggles.enforceConstraints = values.toggles.enforceConstraints;
toggles.correctConstraints = values.toggles.correctConstraints;
toggles.fingersMitten = values.toggles.fingersMitten;
modelSettings.toggles = toggles;
}
@@ -277,6 +285,10 @@ export function GeneralSettings() {
settings.stayAligned = serializeStayAlignedSettings(values.stayAligned);
const hidSettings = new HIDSettingsT();
hidSettings.trackersOverHid = values.hidSettings.trackersOverHID;
settings.hidSettings = hidSettings;
if (values.resetsSettings) {
settings.resetsSettings = loadResetSettings(values.resetsSettings);
}
@@ -392,6 +404,12 @@ export function GeneralSettings() {
);
}
if (settings.hidSettings) {
formData.hidSettings = {
trackersOverHID: settings.hidSettings.trackersOverHid,
};
}
reset({ ...getValues(), ...formData });
});
@@ -689,6 +707,28 @@ export function GeneralSettings() {
settingType="general"
id="mechanics-magnetometer"
/>
<div className="flex flex-col pt-5 pb-3">
<Typography variant="section-title">
{l10n.getString(
'settings-general-tracker_mechanics-trackers_over_usb'
)}
</Typography>
<Localized
id="settings-general-tracker_mechanics-trackers_over_usb-description"
elems={{ b: <b /> }}
>
<Typography />
</Localized>
</div>
<CheckBox
variant="toggle"
outlined
control={control}
name="hidSettings.trackersOverHID"
label={l10n.getString(
'settings-general-tracker_mechanics-trackers_over_usb-enabled-label'
)}
/>
</>
</SettingsPagePaneLayout>
<SettingsPagePaneLayout icon={<WrenchIcon />} id="fksettings">
@@ -999,6 +1039,15 @@ export function GeneralSettings() {
'settings-general-fk_settings-skeleton_settings-extended_knees_model'
)}
/>
<CheckBox
variant="toggle"
outlined
control={control}
name="toggles.fingersMitten"
label={l10n.getString(
'settings-general-fk_settings-skeleton_settings-fingers_mitten'
)}
/>
</div>
<div className="flex flex-col">
<div className="flex flex-col pt-2 pb-3 gap-2">

View File

@@ -16,6 +16,7 @@ import classNames from 'classnames';
import { ReactNode, useEffect } from 'react';
import { useForm } from 'react-hook-form';
import { TrackingChecklistStepId } from 'solarxr-protocol';
import * as Sentry from '@sentry/react';
type StepsForm = { steps: Record<TrackingChecklistStepId, boolean> };
export function TrackingChecklistSettings({
@@ -53,11 +54,11 @@ export function TrackingChecklistSettings({
// doing it this way prevents calling ignore step for every step.
// that prevent sending a packet for steps that didnt change
if (!value && !ignoredSteps.includes(stepId)) {
ignoreStep(stepId, true);
ignoreStep(stepId, true, false);
}
if (value && ignoredSteps.includes(stepId)) {
ignoreStep(stepId, false);
ignoreStep(stepId, false, false);
}
}
};
@@ -130,11 +131,19 @@ export function LayoutSelector({
);
}
export function HomeLayoutSettings() {
export function HomeLayoutSettings({
variant,
}: {
variant: 'settings' | 'modal';
}) {
const { config, setConfig } = useConfig();
const setLayout = (layout: Config['homeLayout']) =>
const setLayout = (layout: Config['homeLayout']) => {
setConfig({ homeLayout: layout });
Sentry.metrics.count('change_layout', 1, {
attributes: { layout, from: variant },
});
};
return (
<div className="flex flex-col gap-2">
@@ -178,7 +187,7 @@ export function HomeScreenSettings() {
<div className="flex flex-col gap-2">
<SettingsPagePaneLayout icon={<HomeIcon />}>
<Typography variant="main-title" id="home-settings" />
<HomeLayoutSettings />
<HomeLayoutSettings variant="settings" />
</SettingsPagePaneLayout>
<SettingsPagePaneLayout icon={<CheckIcon size={18} />}>
<Typography variant="main-title" id="tracking_checklist" />

View File

@@ -464,6 +464,12 @@ export function InterfaceSettings() {
value={'asexual'}
colors="!bg-asexual-flag"
/>
<ThemeSelector
control={control}
name="appearance.theme"
value={'snep'}
colors="!bg-snep"
/>
</div>
</div>

View File

@@ -2,11 +2,14 @@ import { useConfig } from '@/hooks/config';
import { useLocaleConfig } from '@/i18n/config';
import { BatteryIcon } from '@/components/commons/icon/BatteryIcon';
import { Typography } from '@/components/commons/Typography';
import { Tooltip } from '@/components/commons/Tooltip';
export function TrackerBattery({
value,
voltage,
runtime,
disabled,
moreInfo = false,
textColor = 'primary',
}: {
/**
@@ -14,7 +17,9 @@ export function TrackerBattery({
*/
value: number;
voltage?: number | null;
runtime?: bigint | null;
disabled?: boolean;
moreInfo?: boolean;
textColor?: string;
}) {
const { currentLocales } = useLocaleConfig();
@@ -28,31 +33,49 @@ export function TrackerBattery({
});
const charging = (voltage || 0) > 4.3;
const showVoltage = voltage && config?.debug;
const debug = config?.debug || config?.devSettings.moreInfo;
const showVoltage = moreInfo && voltage && debug;
return (
<div className="flex gap-2">
<div className="flex flex-col justify-around">
<BatteryIcon value={value} disabled={disabled} charging={charging} />
<Tooltip
disabled={charging || !runtime || debug}
preferedDirection="left"
content=<Typography>{percentFormatter.format(value)}</Typography>
>
<div className="flex gap-2">
<div className="flex flex-col justify-around">
<BatteryIcon value={value} disabled={disabled} charging={charging} />
</div>
{((!charging || showVoltage) && (
<div className="w-15">
{!charging && runtime != null && runtime > 0 && (
<Typography color={textColor}>
{(runtime / BigInt(3600000000)).toString() +
'h ' +
(
(runtime % BigInt(3600000000)) /
BigInt(60000000)
).toString() +
'min'}
</Typography>
)}
{!charging && (!runtime || debug) && (
<Typography color={textColor}>
{percentFormatter.format(value)}
</Typography>
)}
{showVoltage && (
<Typography color={textColor}>
{voltageFormatter.format(voltage)}V
</Typography>
)}
</div>
)) || (
<div className="flex flex-col justify-center w-15">
<div className="w-5 h-1 bg-background-30 rounded-full" />
</div>
)}
</div>
{((!charging || showVoltage) && (
<div className="w-10">
{!charging && (
<Typography color={textColor}>
{percentFormatter.format(value)}
</Typography>
)}
{showVoltage && (
<Typography color={textColor}>
{voltageFormatter.format(voltage)}V
</Typography>
)}
</div>
)) || (
<div className="flex flex-col justify-center w-10">
<div className="w-5 h-1 bg-background-30 rounded-full" />
</div>
)}
</div>
</Tooltip>
);
}

View File

@@ -51,7 +51,9 @@ function TrackerBig({
<TrackerBattery
voltage={device.hardwareStatus.batteryVoltage}
value={device.hardwareStatus.batteryPctEstimate / 100}
runtime={device.hardwareStatus.batteryRuntimeEstimate}
disabled={tracker.status === TrackerStatusEnum.DISCONNECTED}
moreInfo={true}
/>
)}
<div className="flex gap-2">
@@ -119,6 +121,7 @@ function TrackerSmol({
<TrackerBattery
voltage={device.hardwareStatus.batteryVoltage}
value={device.hardwareStatus.batteryPctEstimate / 100}
runtime={device.hardwareStatus.batteryRuntimeEstimate}
disabled={tracker.status === TrackerStatusEnum.DISCONNECTED}
/>
)}

View File

@@ -6,6 +6,7 @@ import { Typography } from '@/components/commons/Typography';
import { useLocalization } from '@fluent/react';
import { WarningIcon } from '@/components/commons/icon/WarningIcon';
import { FlatDeviceTracker } from '@/store/app-store';
import { useBreakpoint } from '@/hooks/breakpoint';
function Tracker({
tracker,
@@ -46,6 +47,7 @@ export function TrackerPartCard({
direction: 'left' | 'right';
onClick?: MouseEventHandler<HTMLDivElement>;
}) {
const { isXs } = useBreakpoint('xs');
const { l10n } = useLocalization();
const [velocities, setVelocities] = useState<number[]>([]);
@@ -78,7 +80,7 @@ export function TrackerPartCard({
(showCard && (
<div
className={classNames(
'flex flex-col gap-1 control xs:w-32 hover:bg-background-50 cursor-pointer px-2 py-1 rounded-md relative transition-[box-shadow] duration-200 ease-linear',
'flex flex-col gap-1 control xs:w-auto hover:bg-background-50 cursor-pointer px-2 py-1 rounded-md relative transition-[box-shadow] duration-200 ease-linear',
direction === 'left' ? 'items-start' : 'items-end'
)}
id={BodyPart[role]}
@@ -99,7 +101,10 @@ export function TrackerPartCard({
<WarningIcon />
</div>
)}
<Typography variant="section-title" whitespace="whitespace-nowrap">
<Typography
variant={isXs ? 'section-title' : 'standard'}
whitespace={isXs ? 'whitespace-nowrap' : undefined}
>
{l10n.getString('body_part-' + BodyPart[role])}
</Typography>
{td?.map(({ tracker }, index) => (

View File

@@ -199,7 +199,7 @@ export function TrackerSettingsPage() {
shakeHighlight={false}
/>
)}
{
{tracker?.device?.hardwareInfo?.hardwareIdentifier != 'Unknown' && (
<div className="flex flex-col bg-background-70 p-3 rounded-lg gap-2">
<Typography
variant="section-title"
@@ -208,40 +208,53 @@ export function TrackerSettingsPage() {
Firmware version
</Typography>
<div className="flex gap-2 flex-col">
<div className="flex justify-between gap-2">
<Typography id="tracker-settings-build-date" />
<Typography
whitespace="whitespace-pre-wrap"
textAlign="text-end"
>
{tracker?.device?.hardwareInfo?.firmwareDate || '--'}
</Typography>
</div>
<div className="flex justify-between gap-2">
<Typography id="tracker-settings-current-version" />
<Typography
whitespace="whitespace-pre-wrap"
textAlign="text-end"
>
v{tracker?.device?.hardwareInfo?.firmwareVersion}
{tracker?.device?.hardwareInfo?.firmwareVersion
? `v${tracker?.device?.hardwareInfo?.firmwareVersion}`
: '--'}
</Typography>
</div>
<div className="flex justify-between gap-2">
<Typography id="tracker-settings-latest-version" />
{!updateUnavailable && (
<>
{currentFirmwareRelease && (
<Typography
color={
needUpdate === 'updated'
? undefined
: 'text-accent-background-10'
}
textAlign="text-end"
whitespace="whitespace-pre-wrap"
>
{currentFirmwareRelease.name}
</Typography>
)}
</>
)}
{updateUnavailable && (
<Typography id="tracker-settings-update-unavailable-v2">
No releases found
</Typography>
)}
</div>
{!!tracker?.device?.hardwareInfo?.officialBoardType && (
<div className="flex justify-between gap-2">
<Typography id="tracker-settings-latest-version" />
{!updateUnavailable && (
<>
{currentFirmwareRelease && (
<Typography
color={
needUpdate === 'updated'
? undefined
: 'text-accent-background-10'
}
textAlign="text-end"
whitespace="whitespace-pre-wrap"
>
{currentFirmwareRelease.name}
</Typography>
)}
</>
)}
{updateUnavailable && (
<Typography id="tracker-settings-update-unavailable-v2">
No releases found
</Typography>
)}
</div>
)}
</div>
{!updateUnavailable && (
<Tooltip
@@ -280,7 +293,7 @@ export function TrackerSettingsPage() {
</Tooltip>
)}
</div>
}
)}
<div className="flex flex-col bg-background-70 p-3 rounded-lg gap-2 overflow-x-auto">
<div className="flex justify-between">
@@ -308,10 +321,11 @@ export function TrackerSettingsPage() {
<div className="flex justify-between">
<Typography>{l10n.getString('tracker-infos-url')}</Typography>
<Typography>
udp://
{IPv4.fromNumber(
tracker?.device?.hardwareInfo?.ipAddress?.addr || 0
).toString()}
{tracker?.device?.hardwareInfo?.ipAddress?.addr
? `udp://${IPv4.fromNumber(
tracker?.device?.hardwareInfo?.ipAddress?.addr || 0
).toString()}`
: '--'}
</Typography>
</div>
<div className="flex justify-between">
@@ -367,6 +381,37 @@ export function TrackerSettingsPage() {
{tracker?.device?.hardwareInfo?.networkProtocolVersion || '--'}
</Typography>
</div>
{tracker?.device?.hardwareStatus?.packetsReceived !== null && (
<>
<div className="flex justify-between">
<Typography>
{l10n.getString('tracker-infos-packet_loss')}
</Typography>
<Typography>
{(
(tracker?.device?.hardwareStatus?.packetLoss ?? 0) * 100
).toFixed(0)}
%
</Typography>
</div>
<div className="flex justify-between">
<Typography>
{l10n.getString('tracker-infos-packets_lost')}
</Typography>
<Typography>
{tracker?.device?.hardwareStatus?.packetsLost ?? '0'}
</Typography>
</div>
<div className="flex justify-between">
<Typography>
{l10n.getString('tracker-infos-packets_received')}
</Typography>
<Typography>
{tracker?.device?.hardwareStatus?.packetsReceived ?? '0'}
</Typography>
</div>
</>
)}
</div>
{tracker?.tracker && (
<IMUVisualizerWidget tracker={tracker?.tracker} />

View File

@@ -1,15 +1,24 @@
import { WifiIcon } from '@/components/commons/icon/WifiIcon';
import { Typography } from '@/components/commons/Typography';
import { Tooltip } from '@/components/commons/Tooltip';
export function TrackerWifi({
rssi,
ping,
rssiShowNumeric,
disabled,
packetLoss,
packetsLost,
packetsReceived,
showPacketLoss = false,
textColor = 'primary',
}: {
rssi: number | null;
ping: number | null;
packetLoss?: number | null;
packetsLost?: number | null;
packetsReceived?: number | null;
showPacketLoss?: boolean;
rssiShowNumeric?: boolean;
disabled?: boolean;
textColor?: string;
@@ -31,6 +40,17 @@ export function TrackerWifi({
{rssi} dBm
</Typography>
)}
{showPacketLoss && packetsReceived != null && (
<Tooltip
preferedDirection="top"
content={<Typography id="tracker-infos-packet_loss" />}
>
<Typography
color={textColor}
whitespace="whitespace-nowrap"
>{`${((packetLoss ?? 0) * 100).toFixed(0)}% (${packetsLost ?? 0} / ${packetsReceived})`}</Typography>
</Tooltip>
)}
</div>
)) || (
<div className="flex flex-col justify-center w-12">

View File

@@ -104,7 +104,6 @@ export function TrackerRotCell({
function Header({
name,
className,
first = false,
last = false,
show = true,
@@ -116,17 +115,15 @@ function Header({
show?: boolean;
}) {
return (
<th
className={classNames('text-start px-2', {
<div
className={classNames('text-start px-2 flex items-center', {
hidden: !show,
'pl-4': first,
'pr-4': last,
})}
>
<div className={className}>
<Typography id={name} whitespace="whitespace-nowrap" />
</div>
</th>
<Typography id={name} whitespace="whitespace-nowrap" />
</div>
);
}
@@ -147,7 +144,9 @@ function Cell({
const velocity = useVelocity();
return (
<td className={classNames('py-2 group overflow-hidden', { hidden: !show })}>
<div
className={classNames('py-2 group overflow-hidden', { hidden: !show })}
>
<div
style={{
boxShadow: `0px 0px ${Math.floor(velocity * 8)}px ${Math.floor(
@@ -161,7 +160,7 @@ function Cell({
>
{children}
</div>
</td>
</div>
);
}
@@ -171,10 +170,12 @@ function Row({
data,
highlightedTrackers,
clickedTracker,
gridTemplateColumns,
}: {
data: FlatDeviceTracker;
highlightedTrackers: highlightedTrackers | undefined;
clickedTracker: (tracker: TrackerDataT) => void;
gridTemplateColumns: string;
}) {
const { config } = useConfig();
const fontColor = config?.devSettings?.highContrast ? 'primary' : 'secondary';
@@ -191,6 +192,11 @@ function Row({
return (
<TrackerRowProvider.Provider value={data}>
<div className="relative z-10">
<div className="absolute top-2 left-5">
<FirmwareIcon tracker={tracker} device={device} />
</div>
</div>
<Tooltip
disabled={!warning}
preferedDirection="top"
@@ -202,16 +208,14 @@ function Row({
</div>
)
}
tag="tr"
spacing={-5}
>
<>
<div className="relative z-10">
<div className="absolute top-2 left-5">
<FirmwareIcon tracker={tracker} device={device} />
</div>
</div>
<tr className="group" onClick={() => clickedTracker(tracker)}>
<div
className="group grid items-center"
style={{ gridTemplateColumns }}
onClick={() => clickedTracker(tracker)}
>
<Cell first>
<TrackerNameCell tracker={tracker} warning={warning} />
</Cell>
@@ -225,7 +229,9 @@ function Row({
<TrackerBattery
value={device.hardwareStatus.batteryPctEstimate / 100}
voltage={device.hardwareStatus.batteryVoltage}
runtime={device.hardwareStatus.batteryRuntimeEstimate}
disabled={tracker.status === TrackerStatusEnum.DISCONNECTED}
moreInfo={config?.devSettings.moreInfo}
textColor={fontColor}
/>
)}
@@ -239,6 +245,10 @@ function Row({
ping={device?.hardwareStatus?.ping}
disabled={tracker.status === TrackerStatusEnum.DISCONNECTED}
textColor={fontColor}
showPacketLoss
packetLoss={device.hardwareStatus.packetLoss}
packetsLost={device.hardwareStatus.packetsLost}
packetsReceived={device.hardwareStatus.packetsReceived}
/>
)}
</Cell>
@@ -287,7 +297,7 @@ function Row({
).toString()}
</Typography>
</Cell>
</tr>
</div>
</>
</Tooltip>
</TrackerRowProvider.Provider>
@@ -307,7 +317,7 @@ export function TrackersTable({
const filteringEnabled =
config?.debug && config?.devSettings?.filterSlimesAndHMD;
const sortingEnabled = config?.debug && config?.devSettings?.sortByName;
// TODO: fix memo
const filteredSortedTrackers = useMemo(() => {
const list = filteringEnabled
? flatTrackers.filter((t) => isHMD(t) || isSlime(t))
@@ -321,49 +331,62 @@ export function TrackersTable({
const moreInfo = config?.devSettings?.moreInfo;
const gridTemplateColumns = useMemo(() => {
const cols = [
'minmax(15rem, 1.5fr)', // Name
'9rem', // Type
'9rem', // Battery
'9rem', // Ping (w-24)
'5rem', // TPS
config?.devSettings?.preciseRotation ? '11rem' : '9rem', // Rotation
'9rem', // Temp
];
if (moreInfo) {
cols.push('9rem'); // Linear Acc
cols.push('9rem'); // Position
cols.push('9rem'); // Stay Aligned
cols.push('11rem'); // URL
}
return cols.join(' ');
}, [config?.devSettings?.preciseRotation, moreInfo]);
return (
<div className="w-full overflow-x-auto py-2 px-2">
<table className="w-full" cellPadding={0} cellSpacing={0}>
<tr>
<div className="min-w-fit">
<div className="grid items-center mb-1" style={{ gridTemplateColumns }}>
<Header name={'tracker-table-column-name'} first />
<Header name={'tracker-table-column-type'} />
<Header name={'tracker-table-column-battery'} />
<Header name={'tracker-table-column-ping'} className="w-24" />
<Header name={'tracker-table-column-ping'} />
<Header name={'tracker-table-column-tps'} />
<Header
name={'tracker-table-column-rotation'}
className={classNames({
'w-44': config?.devSettings?.preciseRotation,
'w-32': !config?.devSettings?.preciseRotation,
})}
/>
<Header name={'tracker-table-column-rotation'} />
<Header name={'tracker-table-column-temperature'} last={!moreInfo} />
<Header
name={'tracker-table-column-linear-acceleration'}
className="w-36"
show={moreInfo}
/>
<Header name={'tracker-table-column-position'} show={moreInfo} />
<Header name={'tracker-table-column-stay_aligned'} show={moreInfo} />
<Header
name={'tracker-table-column-position'}
className="w-36"
show={moreInfo}
/>
<Header
name={'tracker-table-column-stay_aligned'}
className="w-36"
name={'tracker-table-column-url'}
show={moreInfo}
last={moreInfo}
/>
<Header name={'tracker-table-column-url'} show={moreInfo} />
</tr>
{filteredSortedTrackers.map((data) => (
<Row
clickedTracker={clickedTracker}
data={data}
highlightedTrackers={highlightedTrackers}
/>
))}
</table>
</div>
<div className="flex flex-col gap-y-0">
{filteredSortedTrackers.map((data) => (
<Row
key={data.tracker.trackerId?.trackerNum}
clickedTracker={clickedTracker}
data={data}
highlightedTrackers={highlightedTrackers}
gridTemplateColumns={gridTemplateColumns}
/>
))}
</div>
</div>
</div>
);
}

View File

@@ -109,7 +109,10 @@ const stepContentLookup: Record<
context: TrackingChecklistContext
) => JSX.Element
> = {
[TrackingChecklistStepId.TRACKERS_REST_CALIBRATION]: (step, { toggle }) => {
[TrackingChecklistStepId.TRACKERS_REST_CALIBRATION]: (
step,
{ toggleSession }
) => {
return (
<div className="space-y-2.5">
<Typography id="tracking_checklist-TRACKERS_REST_CALIBRATION-desc" />
@@ -118,7 +121,7 @@ const stepContentLookup: Record<
<Button
id="tracking_checklist-ignore"
variant="secondary"
onClick={() => toggle(step.id)}
onClick={() => toggleSession(step.id)}
/>
)}
</div>
@@ -166,7 +169,7 @@ const stepContentLookup: Record<
</div>
);
},
[TrackingChecklistStepId.STEAMVR_DISCONNECTED]: (step, { toggle }) => {
[TrackingChecklistStepId.STEAMVR_DISCONNECTED]: (step, { toggleSession }) => {
return (
<>
<div className="space-y-2.5">
@@ -181,7 +184,7 @@ const stepContentLookup: Record<
<Button
id="tracking_checklist-ignore"
variant="secondary"
onClick={() => toggle(step.id)}
onClick={() => toggleSession(step.id)}
/>
)}
</div>
@@ -195,7 +198,10 @@ const stepContentLookup: Record<
[TrackingChecklistStepId.UNASSIGNED_HMD]: () => {
return <Typography id="tracking_checklist-UNASSIGNED_HMD-desc" />;
},
[TrackingChecklistStepId.NETWORK_PROFILE_PUBLIC]: (step, { toggle }) => {
[TrackingChecklistStepId.NETWORK_PROFILE_PUBLIC]: (
step,
{ toggleSession }
) => {
const data = step.extraData as TrackingChecklistPublicNetworksT | null;
return (
<>
@@ -226,7 +232,7 @@ const stepContentLookup: Record<
<Button
id="tracking_checklist-ignore"
variant="secondary"
onClick={() => toggle(step.id)}
onClick={() => toggleSession(step.id)}
/>
)}
</div>
@@ -234,7 +240,7 @@ const stepContentLookup: Record<
</>
);
},
[TrackingChecklistStepId.VRCHAT_SETTINGS]: (step, { toggle }) => {
[TrackingChecklistStepId.VRCHAT_SETTINGS]: (step, { toggleSession }) => {
return (
<>
<div className="space-y-2.5">
@@ -249,7 +255,7 @@ const stepContentLookup: Record<
<Button
id="tracking_checklist-ignore"
variant="secondary"
onClick={() => toggle(step.id)}
onClick={() => toggleSession(step.id)}
/>
)}
</div>
@@ -257,7 +263,7 @@ const stepContentLookup: Record<
</>
);
},
[TrackingChecklistStepId.MOUNTING_CALIBRATION]: (step, { toggle }) => {
[TrackingChecklistStepId.MOUNTING_CALIBRATION]: (step, { toggleSession }) => {
return (
<div className="space-y-2.5">
<Typography id="onboarding-automatic_mounting-mounting_reset-step-0" />
@@ -275,14 +281,17 @@ const stepContentLookup: Record<
<Button
id="tracking_checklist-ignore"
variant="secondary"
onClick={() => toggle(step.id)}
onClick={() => toggleSession(step.id)}
/>
)}
</div>
</div>
);
},
[TrackingChecklistStepId.FEET_MOUNTING_CALIBRATION]: (step, { toggle }) => {
[TrackingChecklistStepId.FEET_MOUNTING_CALIBRATION]: (
step,
{ toggleSession }
) => {
return (
<div className="space-y-2.5">
<Typography id="onboarding-automatic_mounting-mounting_reset-feet-step-0" />
@@ -309,14 +318,17 @@ const stepContentLookup: Record<
<Button
id="tracking_checklist-ignore"
variant="secondary"
onClick={() => toggle(step.id)}
onClick={() => toggleSession(step.id)}
/>
)}
</div>
</div>
);
},
[TrackingChecklistStepId.STAY_ALIGNED_CONFIGURED]: (step, { toggle }) => {
[TrackingChecklistStepId.STAY_ALIGNED_CONFIGURED]: (
step,
{ toggleSession }
) => {
return (
<>
<div className="space-y-2.5">
@@ -332,7 +344,7 @@ const stepContentLookup: Record<
<Button
id="tracking_checklist-ignore"
variant="secondary"
onClick={() => toggle(step.id)}
onClick={() => toggleSession(step.id)}
/>
)}
</div>

View File

@@ -1,4 +1,4 @@
import { createContext, useContext, useEffect, useState } from 'react';
import { createContext, useContext, useEffect, useLayoutEffect, useState } from 'react';
import {
DataFeedMessage,
DataFeedUpdateT,
@@ -12,8 +12,9 @@ import { useBonesDataFeedConfig, useDataFeedConfig } from './datafeed-config';
import { useWebsocketAPI } from './websocket-api';
import { useAtomValue, useSetAtom } from 'jotai';
import { bonesAtom, datafeedAtom, devicesAtom } from '@/store/app-store';
import { updateSentryContext } from '@/utils/sentry';
import { getSentryOrCompute, updateSentryContext } from '@/utils/sentry';
import { fetchCurrentFirmwareRelease, FirmwareRelease } from './firmware-update';
import { DEFAULT_LOCALE, LangContext } from '@/i18n/config';
export interface AppContext {
currentFirmwareRelease: FirmwareRelease | null;
@@ -22,6 +23,7 @@ export interface AppContext {
export function useProvideAppContext(): AppContext {
const { useRPCPacket, sendDataFeedPacket, useDataFeedPacket, isConnected } =
useWebsocketAPI();
const { changeLocales } = useContext(LangContext);
const { config } = useConfig();
const { dataFeedConfig } = useDataFeedConfig();
const bonesDataFeedConfig = useBonesDataFeedConfig();
@@ -58,14 +60,30 @@ export function useProvideAppContext(): AppContext {
});
useEffect(() => {
if (!config) return;
const interval = setInterval(() => {
fetchCurrentFirmwareRelease().then((res) => setCurrentFirmwareRelease(res));
fetchCurrentFirmwareRelease(config.uuid).then(setCurrentFirmwareRelease);
}, 1000);
return () => {
clearInterval(interval);
};
}, [config?.uuid]);
useLayoutEffect(() => {
changeLocales([config?.lang || DEFAULT_LOCALE]);
}, []);
useLayoutEffect(() => {
if (!config) return;
if (config.errorTracking !== undefined) {
console.log('change');
// Alows for sentry to refresh if user change the setting once the gui
// is initialized
getSentryOrCompute(config.errorTracking ?? false, config.uuid);
}
}, [config]);
return {
currentFirmwareRelease,
};

View File

@@ -13,6 +13,7 @@ import { useWebsocketAPI } from './websocket-api';
import { useLocalization } from '@fluent/react';
import { log } from '@/utils/logging';
import { useConfig } from './config';
import * as Sentry from '@sentry/react';
export enum ProcessStatus {
PENDING,
@@ -81,6 +82,7 @@ export function useProvideAutobone(): AutoboneContext {
const applyProcessing = () => {
sendRPCPacket(RpcMessage.AutoBoneApplyRequest, new AutoBoneApplyRequestT());
setConfig({ lastUsedProportions: 'autobone' });
Sentry.metrics.count('autobone', 1);
};
useRPCPacket(

View File

@@ -9,6 +9,7 @@ import { load, Store } from '@tauri-apps/plugin-store';
import { useIsTauri } from './breakpoint';
import { waitUntil } from '@/utils/a11y';
import { isTauri } from '@tauri-apps/api/core';
import { v4 as uuidv4 } from 'uuid';
export interface WindowConfig {
width: number;
@@ -26,6 +27,7 @@ export enum AssignMode {
}
export interface Config {
uuid: string;
debug: boolean;
lang: string;
doneOnboarding: boolean;
@@ -39,7 +41,7 @@ export interface Config {
fonts: string[];
useTray: boolean | null;
mirrorView: boolean;
assignMode: AssignMode;
assignMode: AssignMode | null;
discordPresence: boolean;
errorTracking: boolean | null;
decorations: boolean;
@@ -57,6 +59,7 @@ export interface ConfigContext {
}
export const defaultConfig: Config = {
uuid: uuidv4(),
lang: 'en',
debug: false,
doneOnboarding: false,
@@ -69,7 +72,7 @@ export const defaultConfig: Config = {
fonts: ['poppins'],
useTray: null,
mirrorView: true,
assignMode: AssignMode.Core,
assignMode: null,
discordPresence: false,
errorTracking: null,
decorations: false,
@@ -117,13 +120,16 @@ export const loadConfig = async () => {
if (!json) throw new Error('Config has ceased existing for some reason');
const loadedConfig = fallbackToDefaults(JSON.parse(json));
// set(loadedConfig);
// setLoading(false);
if (!loadedConfig.uuid) {
// Make sure the config always has a uuid
loadedConfig.uuid = uuidv4();
await store.set('config.json', JSON.stringify(loadedConfig));
}
return loadedConfig;
} catch (e) {
error(e);
// setConfig(defaultConfig);
// setLoading(false);
return null;
}
};

11
gui/src/hooks/crypto.ts Normal file
View File

@@ -0,0 +1,11 @@
// implemetation of https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function
export function normalizedHash(str: string) {
let hash = 2166136261;
for (let i = 0; i < str.length; i++) {
hash ^= str.charCodeAt(i);
hash = Math.imul(hash, 16777619); // FNV prime
}
// Convert to unsigned 32-bit integer and normalize (0, 1)
return (hash >>> 0) / 2 ** 32;
}

View File

@@ -2,7 +2,7 @@ import { BoardType, DeviceDataT } from 'solarxr-protocol';
import { fetch as tauriFetch } from '@tauri-apps/plugin-http';
import { cacheWrap } from './cache';
import semver from 'semver';
import { hostname, locale, platform, version } from '@tauri-apps/plugin-os';
import { normalizedHash } from './crypto';
export interface FirmwareRelease {
name: string;
@@ -12,18 +12,6 @@ export interface FirmwareRelease {
userCanUpdate: boolean;
}
// implemetation of https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function
const hash = (str: string) => {
let hash = 2166136261;
for (let i = 0; i < str.length; i++) {
hash ^= str.charCodeAt(i);
hash = Math.imul(hash, 16777619); // FNV prime
}
// Convert to unsigned 32-bit integer and normalize (0, 1)
return (hash >>> 0) / 2 ** 32;
};
const firstAsset = (assets: any[], name: string) =>
assets.find((asset: any) => asset.name === name && asset.browser_download_url);
@@ -35,7 +23,7 @@ const todaysRange = (deployData: [number, Date][]): number => {
return maxRange;
};
const checkUserCanUpdate = async (url: string, fwVersion: string) => {
const checkUserCanUpdate = async (uuid: string, url: string, fwVersion: string) => {
const deployDataJson = JSON.parse(
(await cacheWrap(
`firmware-${fwVersion}-deploy`,
@@ -67,12 +55,13 @@ const checkUserCanUpdate = async (url: string, fwVersion: string) => {
const todayUpdateRange = todaysRange(deployData);
if (!todayUpdateRange) return false;
const uniqueUserKey = `${await hostname()}-${await locale()}-${platform()}-${version()}`;
// Make it so the hash change every version. Prevent the same user from getting the same delay
return hash(`${uniqueUserKey}-${fwVersion}`) <= todayUpdateRange;
return normalizedHash(`${uuid}-${fwVersion}`) <= todayUpdateRange;
};
export async function fetchCurrentFirmwareRelease(): Promise<FirmwareRelease | null> {
export async function fetchCurrentFirmwareRelease(
uuid: string
): Promise<FirmwareRelease | null> {
const releases: any[] | null = JSON.parse(
(await cacheWrap(
'firmware-releases',
@@ -104,6 +93,7 @@ export async function fetchCurrentFirmwareRelease(): Promise<FirmwareRelease | n
}
const userCanUpdate = await checkUserCanUpdate(
uuid,
deployAsset.browser_download_url,
version
);
@@ -139,9 +129,6 @@ export function checkForUpdate(
if (
!device.hardwareInfo?.officialBoardType ||
![BoardType.SLIMEVR, BoardType.SLIMEVR_V1_2].includes(
device.hardwareInfo.officialBoardType
) ||
!semver.valid(currentFirmwareRelease.version) ||
!semver.valid(device.hardwareInfo.firmwareVersion?.toString() ?? 'none')
) {
@@ -153,6 +140,14 @@ export function checkForUpdate(
currentFirmwareRelease.version
);
if (
![BoardType.SLIMEVR, BoardType.SLIMEVR_V1_2].includes(
device.hardwareInfo.officialBoardType
)
) {
return canUpdate ? 'unavailable' : 'updated';
}
if (
canUpdate &&
device.hardwareStatus?.batteryPctEstimate != null &&

View File

@@ -8,6 +8,7 @@ import {
import { useWebsocketAPI } from './websocket-api';
import { useEffect, useMemo, useState } from 'react';
import { useConfig } from './config';
import * as Sentry from '@sentry/react';
type LabelBase = {
value: number;
@@ -193,6 +194,7 @@ export function useManualProportions({ type }: { type: 'linear' | 'ratio' }): {
}
sendRPCPacket(RpcMessage.SkeletonConfigRequest, new SkeletonConfigRequestT());
setConfig({ lastUsedProportions: 'manual' });
Sentry.metrics.count('manual_proportions_change', 1, { attributes: params });
},
};
}

View File

@@ -12,6 +12,7 @@ import { useAtomValue } from 'jotai';
import { assignedTrackersAtom, serverGuardsAtom } from '@/store/app-store';
import { FEET_BODY_PARTS, FINGER_BODY_PARTS } from './body-parts';
import { useLocaleConfig } from '@/i18n/config';
import * as Sentry from '@sentry/react';
export type ResetBtnStatus = 'idle' | 'counting' | 'finished';
@@ -26,13 +27,16 @@ export const BODY_PARTS_GROUPS: Record<MountingResetGroup, BodyPart[]> = {
fingers: FINGER_BODY_PARTS,
};
export function useReset(options: UseResetOptions, onReseted?: () => void) {
export function useReset(
options: UseResetOptions,
onReseted?: () => void,
onFailed?: () => void
) {
if (options.type === ResetType.Mounting && !options.group) options.group = 'default';
const serverGuards = useAtomValue(serverGuardsAtom);
const { currentLocales } = useLocaleConfig();
const { sendRPCPacket, useRPCPacket } = useWebsocketAPI();
const finishedTimeoutRef = useRef<NodeJS.Timeout>();
const [status, setStatus] = useState<ResetBtnStatus>('idle');
const [progress, setProgress] = useState(0);
@@ -45,6 +49,13 @@ export function useReset(options: UseResetOptions, onReseted?: () => void) {
req.resetType = options.type;
req.bodyParts = parts;
sendRPCPacket(RpcMessage.ResetRequest, req);
Sentry.metrics.count('reset_click', 1, {
attributes: {
resetType: ResetType[options.type],
group: options.type === ResetType.Mounting ? options.group : undefined,
},
});
};
const onResetFinished = () => {
@@ -54,6 +65,7 @@ export function useReset(options: UseResetOptions, onReseted?: () => void) {
const onResetCanceled = () => {
if (status !== 'finished') setStatus('idle');
if (onFailed) onFailed();
};
useEffect(() => {

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