mirror of
https://github.com/SlimeVR/SlimeVR-Server.git
synced 2026-04-06 02:01:58 +02:00
Compare commits
186 Commits
v18.0.0-rc
...
mitten
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8d91838fab | ||
|
|
0236a05f26 | ||
|
|
28deb357da | ||
|
|
4d93f87a01 | ||
|
|
88adfce242 | ||
|
|
3d02795dbc | ||
|
|
7ff50f78eb | ||
|
|
0e3aaf105c | ||
|
|
f638540886 | ||
|
|
343d69d690 | ||
|
|
e2d7d354c6 | ||
|
|
cc6f297b92 | ||
|
|
2add43e71a | ||
|
|
0a493ac345 | ||
|
|
17bb2703d1 | ||
|
|
f0981bf709 | ||
|
|
99de554c18 | ||
|
|
f95a4d56d7 | ||
|
|
1df3c9d322 | ||
|
|
e0838cce6c | ||
|
|
e25d3201c2 | ||
|
|
5d14f14139 | ||
|
|
09e81f5ace | ||
|
|
8f57ef2de4 | ||
|
|
ea242960b3 | ||
|
|
35ac14a7de | ||
|
|
690a8b5c6e | ||
|
|
255b8b2865 | ||
|
|
e27ec63985 | ||
|
|
9f8be6551c | ||
|
|
f09cd687c7 | ||
|
|
686499f8dd | ||
|
|
a3bcc61892 | ||
|
|
faf70c9a39 | ||
|
|
2aa8d3a056 | ||
|
|
23df46ca33 | ||
|
|
8407f52777 | ||
|
|
b44dcaa9c2 | ||
|
|
ff0d823aff | ||
|
|
2e8bfa5373 | ||
|
|
87940ddd03 | ||
|
|
6208979ce9 | ||
|
|
9a27fb1320 | ||
|
|
53129328d0 | ||
|
|
2d79c5a0e9 | ||
|
|
74f5a92ce1 | ||
|
|
146930279c | ||
|
|
0c33579858 | ||
|
|
c9783d097b | ||
|
|
d3eafb8d06 | ||
|
|
09d44b51d6 | ||
|
|
cf357e71f5 | ||
|
|
122efacc52 | ||
|
|
7f536528d0 | ||
|
|
3982249ebf | ||
|
|
388bea2e72 | ||
|
|
921a760817 | ||
|
|
55bcec4dda | ||
|
|
bb08e8dc6a | ||
|
|
a82f950eb6 | ||
|
|
e2dbaab8ba | ||
|
|
3611bb5cc7 | ||
|
|
f01f599526 | ||
|
|
6847526ce8 | ||
|
|
c5f28a6a01 | ||
|
|
86d7d5fdc6 | ||
|
|
781f4d489a | ||
|
|
5a42426048 | ||
|
|
44643f2cc6 | ||
|
|
d902515f4f | ||
|
|
f9df08aefd | ||
|
|
28b18e0d42 | ||
|
|
247c063791 | ||
|
|
ab248287cc | ||
|
|
9a26fc98b8 | ||
|
|
16a2ac8474 | ||
|
|
c4acf4cc41 | ||
|
|
4b0a2d27d0 | ||
|
|
2c6708bfe7 | ||
|
|
2880623cce | ||
|
|
17400ca337 | ||
|
|
3276f6db7a | ||
|
|
db59537adc | ||
|
|
4f1fd82923 | ||
|
|
f6ccb5970f | ||
|
|
c937b91267 | ||
|
|
2d1f32b950 | ||
|
|
8acba98bcc | ||
|
|
d7ba1b8335 | ||
|
|
d20e9bfd94 | ||
|
|
3d54a86bd8 | ||
|
|
c9883f5eb4 | ||
|
|
8bd36fac25 | ||
|
|
ab4d507d9f | ||
|
|
9efb985260 | ||
|
|
2c2c227187 | ||
|
|
63cca6756e | ||
|
|
b0d7fefa5e | ||
|
|
35a5cb47d9 | ||
|
|
dfc4383271 | ||
|
|
185431a733 | ||
|
|
5b68a01186 | ||
|
|
2c4dd4085f | ||
|
|
4d3ff0e9c9 | ||
|
|
ee6182bb23 | ||
|
|
9576d6e034 | ||
|
|
227ddc87d2 | ||
|
|
b3b7730b2c | ||
|
|
075a155f13 | ||
|
|
79a3b66e43 | ||
|
|
fe58968718 | ||
|
|
276e73e724 | ||
|
|
01dd916498 | ||
|
|
6ebf9792ac | ||
|
|
02f8195b5b | ||
|
|
7b4946f41d | ||
|
|
5f4c90128f | ||
|
|
6a2a30e319 | ||
|
|
8a5f27e8d9 | ||
|
|
199bec40e1 | ||
|
|
9d32220275 | ||
|
|
8b689d6df8 | ||
|
|
490005ae69 | ||
|
|
575778ab85 | ||
|
|
85ee162d58 | ||
|
|
712fa6a1ad | ||
|
|
819481adcd | ||
|
|
bc26227443 | ||
|
|
ac43ca947e | ||
|
|
4451d8aaf4 | ||
|
|
79a9e15c5a | ||
|
|
5403cdb28e | ||
|
|
272f37374e | ||
|
|
4147578dc8 | ||
|
|
65bd03c272 | ||
|
|
4835e89c5f | ||
|
|
7ea4516545 | ||
|
|
2f208fe08a | ||
|
|
db584baed3 | ||
|
|
1d41627fb1 | ||
|
|
63b8d4c8cb | ||
|
|
8e60ecd070 | ||
|
|
6ee173791e | ||
|
|
b9d72c0a40 | ||
|
|
36b2e01d88 | ||
|
|
569315f6dc | ||
|
|
a4fab8afed | ||
|
|
d1e3c35693 | ||
|
|
d12f3c4854 | ||
|
|
e32903f36f | ||
|
|
ab126c336c | ||
|
|
79a6d62506 | ||
|
|
08f691b5b6 | ||
|
|
b12632fd1a | ||
|
|
54f3ab4634 | ||
|
|
415168d040 | ||
|
|
6be313144e | ||
|
|
98e571c94b | ||
|
|
1561c464e9 | ||
|
|
4992d599aa | ||
|
|
90b3dfe0db | ||
|
|
ab87c5b1e8 | ||
|
|
3ee6c065cf | ||
|
|
d1249d2b44 | ||
|
|
94a70d3b2e | ||
|
|
b67162eb43 | ||
|
|
4390d35e00 | ||
|
|
19126c0d4d | ||
|
|
0cf0f6cb49 | ||
|
|
d3d3838761 | ||
|
|
4984026f6b | ||
|
|
bb7e825c41 | ||
|
|
bc96ddd555 | ||
|
|
ec85284f78 | ||
|
|
867287e740 | ||
|
|
2e93187021 | ||
|
|
2a19d67974 | ||
|
|
176f7e4271 | ||
|
|
3a6c60d912 | ||
|
|
066c28adb4 | ||
|
|
364ed3209c | ||
|
|
dab6ec28af | ||
|
|
b221250ba7 | ||
|
|
215635634f | ||
|
|
184133a613 | ||
|
|
32248c75cf |
2
.github/CODEOWNERS
vendored
2
.github/CODEOWNERS
vendored
@@ -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
|
||||
|
||||
|
||||
6
.github/workflows/build-gui.yml
vendored
6
.github/workflows/build-gui.yml
vendored
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
57
.github/workflows/gradle.yaml
vendored
57
.github/workflows/gradle.yaml
vendored
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -374,3 +374,6 @@ settings-osc-vrchat-network-trackers-feet = Πόδια
|
||||
|
||||
## Error collection consent modal
|
||||
|
||||
|
||||
## Tracking checklist section
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -384,3 +384,6 @@ home-no_trackers = לא זוהו או הוקצו חיישנים
|
||||
|
||||
## Error collection consent modal
|
||||
|
||||
|
||||
## Tracking checklist section
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -694,3 +694,6 @@ settings-general-gesture_control-trackers =
|
||||
|
||||
error_collection_modal-confirm = Sutinku
|
||||
error_collection_modal-cancel = Nesutinku
|
||||
|
||||
## Tracking checklist section
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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ń
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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 = เท้า
|
||||
|
||||
@@ -376,3 +376,6 @@ settings-osc-vrchat-network-address = Ağ adresi
|
||||
|
||||
## Error collection consent modal
|
||||
|
||||
|
||||
## Tracking checklist section
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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 } 个未分配的追踪器
|
||||
|
||||
@@ -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.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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
|
||||
|
||||
@@ -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(());
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
}
|
||||
|
||||
@screen sm {
|
||||
--right-section-w: 35%;
|
||||
--right-section-w: 36%;
|
||||
}
|
||||
|
||||
@screen md {
|
||||
|
||||
@@ -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')}
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 && (
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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]}
|
||||
|
||||
@@ -10,7 +10,7 @@ export function TipBox({
|
||||
whitespace = false,
|
||||
className,
|
||||
}: {
|
||||
children: ReactNode;
|
||||
children?: ReactNode;
|
||||
hideIcon?: boolean;
|
||||
whitespace?: boolean;
|
||||
className?: string;
|
||||
|
||||
@@ -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)}
|
||||
</>
|
||||
);
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
|
||||
@@ -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"
|
||||
>
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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]
|
||||
);
|
||||
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}}
|
||||
/>
|
||||
|
||||
@@ -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>
|
||||
)}
|
||||
|
||||
@@ -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>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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}
|
||||
/>
|
||||
|
||||
@@ -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}>
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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}
|
||||
/>
|
||||
)}
|
||||
|
||||
@@ -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) => (
|
||||
|
||||
@@ -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} />
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
11
gui/src/hooks/crypto.ts
Normal 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;
|
||||
}
|
||||
@@ -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 &&
|
||||
|
||||
@@ -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 });
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user