Compare commits
113 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8a6778155d | ||
|
|
7a968c3086 | ||
|
|
9730c78049 | ||
|
|
1a57820e31 | ||
|
|
c85facfba7 | ||
|
|
72deebdf87 | ||
|
|
5ab5e3e1bc | ||
|
|
7b84b041aa | ||
|
|
775d78731d | ||
|
|
ecbe1fb75d | ||
|
|
c273594163 | ||
|
|
51b1e2170e | ||
|
|
56d114c461 | ||
|
|
0d47d69134 | ||
|
|
329d77d0f4 | ||
|
|
e7673338b5 | ||
|
|
9715326a99 | ||
|
|
93c910be6a | ||
|
|
06520b9baa | ||
|
|
23dd9aab18 | ||
|
|
0367e3a62d | ||
|
|
f84efc413d | ||
|
|
414482c139 | ||
|
|
a6b3465ea5 | ||
|
|
dddedd9a60 | ||
|
|
d89a4c2704 | ||
|
|
0ad237a219 | ||
|
|
9c980f06f9 | ||
|
|
f607693d83 | ||
|
|
27faa1908c | ||
|
|
39cd1f9ba9 | ||
|
|
c59f20a79a | ||
|
|
e7de25dfab | ||
|
|
74f1d8ed61 | ||
|
|
ad41c46092 | ||
|
|
f3346bbeee | ||
|
|
ca6f82492d | ||
|
|
02acc6ede1 | ||
|
|
d9c631fcf6 | ||
|
|
ea9df2c31f | ||
|
|
e18bd2d382 | ||
|
|
b6a681b1bb | ||
|
|
793dd374f8 | ||
|
|
97b617bb24 | ||
|
|
1aa32b8264 | ||
|
|
5c2c6749c3 | ||
|
|
e472b12e83 | ||
|
|
75fc1c37d3 | ||
|
|
9c4b9b401e | ||
|
|
4243951214 | ||
|
|
2f61d5b4b8 | ||
|
|
35e6b8b721 | ||
|
|
82db6a1ff5 | ||
|
|
17be65d2a2 | ||
|
|
db2f7fbd49 | ||
|
|
95f1bfd52f | ||
|
|
7511e0098e | ||
|
|
f0f2731387 | ||
|
|
5f3182e2c6 | ||
|
|
8b4a2843a1 | ||
|
|
d227b97843 | ||
|
|
7f11534fc1 | ||
|
|
af2cf10c16 | ||
|
|
efd20ee7b2 | ||
|
|
c076ebabb3 | ||
|
|
9e650dad08 | ||
|
|
dc22b503e8 | ||
|
|
0bd6a9002a | ||
|
|
9c7558cae8 | ||
|
|
d89a53ef44 | ||
|
|
525f29f3c5 | ||
|
|
c94d71c24f | ||
|
|
31ff3f4868 | ||
|
|
a6911e072c | ||
|
|
bf062c9b65 | ||
|
|
8945e05354 | ||
|
|
ea3cdb7658 | ||
|
|
ae40121a31 | ||
|
|
f64a45fb2e | ||
|
|
cb19aa17cc | ||
|
|
4564671b38 | ||
|
|
60f74d6d5c | ||
|
|
4450260dd0 | ||
|
|
55f030a145 | ||
|
|
3038de8a5f | ||
|
|
338e153834 | ||
|
|
544efb6efe | ||
|
|
0e64f1241f | ||
|
|
ffe530dc94 | ||
|
|
a8ce510f70 | ||
|
|
1b17fcbec3 | ||
|
|
01f1d2ee56 | ||
|
|
d14a7bb5e7 | ||
|
|
a14a2ea253 | ||
|
|
b67de108e7 | ||
|
|
e4a4f38c15 | ||
|
|
858354eee8 | ||
|
|
fcb736d371 | ||
|
|
f6d8026761 | ||
|
|
cb5e27875c | ||
|
|
72f506822a | ||
|
|
4e942fded5 | ||
|
|
463e558e7f | ||
|
|
a1db52144a | ||
|
|
81b7ea0967 | ||
|
|
a489e32828 | ||
|
|
6eaf04ba64 | ||
|
|
b8ceaa6bc0 | ||
|
|
6b7c47d36c | ||
|
|
c0f8fb1758 | ||
|
|
07600f0133 | ||
|
|
3634bedef1 | ||
|
|
e864487246 |
6
.github/CODEOWNERS
vendored
@@ -1,9 +1,9 @@
|
||||
# Global code owner
|
||||
* @Eirenliel
|
||||
|
||||
# Make Loucas the owner of all GUI stuff
|
||||
/gui/ @loucass003
|
||||
/package-lock.json @loucass003
|
||||
# Make Loucas and Uriel the owners of all GUI stuff
|
||||
/gui/ @loucass003 @ImUrX
|
||||
/package-lock.json @loucass003 @ImUrX
|
||||
|
||||
# Uriel and Erimel responsible for i18n
|
||||
/gui/public/i18n/ @ImUrX @Louka3000
|
||||
|
||||
3
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: SlimeVR
|
||||
25
.github/workflows/gradle.yaml
vendored
@@ -22,6 +22,8 @@ jobs:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Get tags
|
||||
run: git fetch --tags origin --recurse-submodules=no
|
||||
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v3
|
||||
@@ -32,6 +34,9 @@ jobs:
|
||||
- name: Setup Gradle
|
||||
uses: gradle/gradle-build-action@v2
|
||||
|
||||
- run: mkdir ./gui/dist && touch ./gui/dist/somefile
|
||||
shell: bash
|
||||
|
||||
- name: Check code formatting
|
||||
run: ./gradlew spotlessCheck
|
||||
|
||||
@@ -46,6 +51,8 @@ jobs:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Get tags
|
||||
run: git fetch --tags origin --recurse-submodules=no
|
||||
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v3
|
||||
@@ -65,7 +72,7 @@ jobs:
|
||||
# Artifact name
|
||||
name: "SlimeVR-Server" # optional, default is artifact
|
||||
# A file, directory or wildcard pattern that describes what to upload
|
||||
path: server/build/libs/*
|
||||
path: server/desktop/build/libs/*
|
||||
|
||||
- name: Upload to draft release
|
||||
uses: softprops/action-gh-release@v1
|
||||
@@ -74,7 +81,7 @@ jobs:
|
||||
draft: true
|
||||
generate_release_notes: true
|
||||
files: |
|
||||
server/build/libs/*
|
||||
server/desktop/build/libs/*
|
||||
|
||||
|
||||
bundle-linux:
|
||||
@@ -89,7 +96,7 @@ jobs:
|
||||
- uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: "SlimeVR-Server"
|
||||
path: server/build/libs/
|
||||
path: server/desktop/build/libs/
|
||||
|
||||
- name: Set up Linux dependencies
|
||||
uses: awalsh128/cache-apt-pkgs-action@latest
|
||||
@@ -134,7 +141,7 @@ jobs:
|
||||
cd target/release/bundle/appimage
|
||||
chmod a+x slimevr*.AppImage
|
||||
./slimevr*.AppImage --appimage-extract
|
||||
cp $( git rev-parse --show-toplevel )/server/build/libs/slimevr.jar squashfs-root/slimevr.jar
|
||||
cp $( git rev-parse --show-toplevel )/server/desktop/build/libs/slimevr.jar squashfs-root/slimevr.jar
|
||||
chmod 644 squashfs-root/slimevr.jar
|
||||
appimagetool squashfs-root slimevr*.AppImage
|
||||
|
||||
@@ -172,7 +179,7 @@ jobs:
|
||||
- uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: "SlimeVR-Server"
|
||||
path: server/build/libs/
|
||||
path: server/desktop/build/libs/
|
||||
|
||||
- name: Cache cargo dependencies
|
||||
uses: Swatinem/rust-cache@v2
|
||||
@@ -193,7 +200,7 @@ jobs:
|
||||
- name: Modify Application
|
||||
run: |
|
||||
cd target/release/bundle/macos/slimevr.app/Contents/MacOS
|
||||
cp $( git rev-parse --show-toplevel )/server/build/libs/slimevr.jar ./
|
||||
cp $( git rev-parse --show-toplevel )/server/desktop/build/libs/slimevr.jar ./
|
||||
cd ../../../../dmg/
|
||||
./bundle_dmg.sh --volname slimevr --icon slimevr 180 170 --app-drop-link 480 170 \
|
||||
--window-size 660 400 --hide-extension ../macos/slimevr.app \
|
||||
@@ -237,7 +244,7 @@ jobs:
|
||||
- uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: "SlimeVR-Server"
|
||||
path: server/build/libs/
|
||||
path: server/desktop/build/libs/
|
||||
|
||||
- name: Cache cargo dependencies
|
||||
uses: Swatinem/rust-cache@v2
|
||||
@@ -260,8 +267,8 @@ jobs:
|
||||
run: |
|
||||
mkdir SlimeVR
|
||||
cp gui/src-tauri/icons/icon.ico ./SlimeVR/run.ico
|
||||
cp server/build/libs/slimevr.jar ./SlimeVR/slimevr.jar
|
||||
cp server/resources/* ./SlimeVR/
|
||||
cp server/desktop/build/libs/slimevr.jar ./SlimeVR/slimevr.jar
|
||||
cp server/core/resources/* ./SlimeVR/
|
||||
cp target/release/slimevr.exe ./SlimeVR/
|
||||
7z a -tzip SlimeVR-win64.zip ./SlimeVR/
|
||||
|
||||
|
||||
3
.gitignore
vendored
@@ -36,3 +36,6 @@ build/
|
||||
|
||||
# direnv has been claimed for Nix usage
|
||||
.direnv/
|
||||
|
||||
# Ignore Android local properties
|
||||
local.properties
|
||||
|
||||
413
Cargo.lock
generated
@@ -11,3 +11,7 @@ edition = "2021"
|
||||
license = "MIT OR Apache-2.0"
|
||||
rust-version = "1.65" # This version stabilized GATs and let-else
|
||||
repository = "https://github.com/SlimeVR/SlimeVR-Server"
|
||||
|
||||
[profile.release]
|
||||
lto = "thin"
|
||||
strip = "debuginfo" # Only affects Unix binaries with DWARF
|
||||
|
||||
@@ -1,26 +1,3 @@
|
||||
buildscript {
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath("org.jetbrains.kotlinx:atomicfu-gradle-plugin:0.20.2")
|
||||
}
|
||||
}
|
||||
|
||||
plugins {
|
||||
kotlin("jvm") version "1.8.21"
|
||||
}
|
||||
|
||||
subprojects {
|
||||
plugins.apply("kotlinx-atomicfu")
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation(kotlin("stdlib-jdk8"))
|
||||
}
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
kotlin {
|
||||
jvmToolchain(17)
|
||||
id("org.ajoberstar.grgit") version "5.2.0"
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ work. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
|
||||
<url type="contribute">https://github.com/SlimeVR/SlimeVR-Server/blob/main/CONTRIBUTING.md</url>
|
||||
<url type="contact">https://discord.gg/SlimeVR</url>
|
||||
<recommends>
|
||||
<display_length compare="ge">880</display_length>
|
||||
<display_length compare="ge">300</display_length>
|
||||
</recommends>
|
||||
<supports>
|
||||
<control>pointing</control>
|
||||
@@ -44,8 +44,7 @@ work. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
|
||||
|
||||
<description>
|
||||
<p>
|
||||
<code>SlimeVR</code>
|
||||
is a set of open hardware sensors and open source software that facilitates full-body
|
||||
SlimeVR is a set of open hardware sensors and open source software that facilitates full-body
|
||||
tracking (FBT) in virtual reality. With no base station required, SlimeVR makes wireless
|
||||
VR FBT affordable and comfortable.
|
||||
</p>
|
||||
@@ -60,6 +59,17 @@ work. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
<releases>
|
||||
<release version="0.8.3" date="2023-07-09"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.3</url></release>
|
||||
<release version="0.8.2" date="2023-07-09"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.2</url></release>
|
||||
<release version="0.8.2-rc.1" type="development" date="2023-07-07"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.2-rc.1</url></release>
|
||||
<release version="0.8.1" date="2023-07-04"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.1</url></release>
|
||||
<release version="0.8.0" date="2023-06-22"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.0</url></release>
|
||||
<release version="0.8.0-rc.3" type="development" date="2023-06-20"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.0-rc.3</url></release>
|
||||
<release version="0.8.0-rc.2" type="development" date="2023-06-15"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.0-rc.2</url></release>
|
||||
<release version="0.8.0-rc.1" type="development" date="2023-06-01"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.0-rc.1</url></release>
|
||||
<release version="0.7.1" date="2023-04-14"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.7.1</url></release>
|
||||
<release version="0.7.0" date="2023-04-11"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.7.0</url></release>
|
||||
<release version="0.6.3" date="2023-02-22"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.6.3</url></release>
|
||||
<release version="0.6.2" date="2023-02-17"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.6.2</url></release>
|
||||
<release version="0.6.1" date="2023-02-12"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.6.1</url></release>
|
||||
<release version="0.6.0" date="2023-01-05"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.6.0</url></release>
|
||||
|
||||
@@ -8,3 +8,12 @@ org.gradle.jvmargs=--add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAME
|
||||
kotlin.code.style=official
|
||||
# https://github.com/Kotlin/kotlinx-atomicfu#atomicfu-compiler-plugin
|
||||
kotlinx.atomicfu.enableJvmIrTransformation=true
|
||||
|
||||
android.useAndroidX=true
|
||||
android.nonTransitiveRClass=true
|
||||
org.gradle.unsafe.configuration-cache=false
|
||||
|
||||
kotlinVersion=1.9.0-RC
|
||||
spotlessVersion=6.12.0
|
||||
shadowJarVersion=8.1.1
|
||||
buildconfigVersion=3.1.0
|
||||
|
||||
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,6 +1,6 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip
|
||||
networkTimeout=10000
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
||||
7
gradlew
vendored
@@ -85,6 +85,9 @@ done
|
||||
APP_BASE_NAME=${0##*/}
|
||||
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD=maximum
|
||||
|
||||
@@ -194,10 +197,6 @@ if "$cygwin" || "$msys" ; then
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
|
||||
# Collect all arguments for the java command;
|
||||
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
|
||||
# shell script including quotes and variable substitutions, so put them in
|
||||
|
||||
5
gui/.gitignore
vendored
@@ -25,5 +25,6 @@ yarn-error.log*
|
||||
|
||||
*.log
|
||||
|
||||
|
||||
/dist
|
||||
# vite
|
||||
/dist
|
||||
/stats.html
|
||||
|
||||
@@ -29,10 +29,11 @@
|
||||
"react-modal": "3.15.1",
|
||||
"react-responsive": "^9.0.2",
|
||||
"react-router-dom": "^6.2.2",
|
||||
"semver": "^7.5.0",
|
||||
"semver": "^7.5.3",
|
||||
"solarxr-protocol": "file:../solarxr-protocol",
|
||||
"three": "^0.148.0",
|
||||
"typescript": "^4.6.3"
|
||||
"ts-pattern": "^5.0.1",
|
||||
"typescript": "^5.1.6"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "vite --force",
|
||||
@@ -64,29 +65,30 @@
|
||||
]
|
||||
},
|
||||
"devDependencies": {
|
||||
"@tailwindcss/forms": "^0.5.0",
|
||||
"@tailwindcss/forms": "^0.5.3",
|
||||
"@tauri-apps/cli": "^1.4.0",
|
||||
"@types/file-saver": "^2.0.5",
|
||||
"@types/react": "18.0.25",
|
||||
"@types/react-dom": "^18.0.5",
|
||||
"@types/react-modal": "3.13.1",
|
||||
"@types/three": "^0.148.0",
|
||||
"@typescript-eslint/eslint-plugin": "^5.59.6",
|
||||
"@typescript-eslint/parser": "^5.59.0",
|
||||
"@typescript-eslint/eslint-plugin": "^5.60.1",
|
||||
"@typescript-eslint/parser": "^5.60.1",
|
||||
"autoprefixer": "^10.4.4",
|
||||
"cross-env": "^7.0.3",
|
||||
"eslint": "^8.18.0",
|
||||
"eslint": "^8.44.0",
|
||||
"eslint-config-airbnb": "^19.0.4",
|
||||
"eslint-import-resolver-typescript": "^3.1.1",
|
||||
"eslint-plugin-import": "^2.26.0",
|
||||
"eslint-plugin-jsx-a11y": "^6.6.0",
|
||||
"eslint-plugin-react": "^7.30.1",
|
||||
"eslint-import-resolver-typescript": "^3.5.5",
|
||||
"eslint-plugin-import": "^2.27.5",
|
||||
"eslint-plugin-jsx-a11y": "^6.7.1",
|
||||
"eslint-plugin-react": "^7.32.2",
|
||||
"eslint-plugin-react-hooks": "^4.6.0",
|
||||
"postcss": "^8.4.12",
|
||||
"prettier": "^2.7.1",
|
||||
"postcss": "^8.4.24",
|
||||
"prettier": "^2.8.8",
|
||||
"pretty-quick": "^3.1.3",
|
||||
"rollup-plugin-visualizer": "^5.9.2",
|
||||
"tailwind-gradient-mask-image": "^1.0.0",
|
||||
"tailwindcss": "^3.3.1",
|
||||
"vite": "^4.0.3"
|
||||
"tailwindcss": "^3.3.2",
|
||||
"vite": "^4.3.9"
|
||||
}
|
||||
}
|
||||
|
||||
BIN
gui/public/fonts/Lexend[HEXP,wght].woff2
Normal file
BIN
gui/public/fonts/NotoSansCJK-VF.otf.woff2
Normal file
BIN
gui/public/fonts/OpenDyslexic-Bold-Italic.woff
Normal file
BIN
gui/public/fonts/OpenDyslexic-Bold.woff
Normal file
BIN
gui/public/fonts/OpenDyslexic-Italic.woff
Normal file
BIN
gui/public/fonts/OpenDyslexic-Regular.woff
Normal file
BIN
gui/public/fonts/Ubuntu-R.woff2
Normal file
BIN
gui/public/fonts/twemoji-glyf_colr_1.woff2
Normal file
BIN
gui/public/fonts/twemoji-picosvg.woff2
Normal file
@@ -122,6 +122,10 @@ widget-overlay-is_mirrored_label = عكس تراكب الشاشة
|
||||
|
||||
widget-drift_compensation-clear = حذف تعويض الانجراف
|
||||
|
||||
## Widget: Clear Reset Mounting
|
||||
|
||||
widget-clear_mounting = مسح إعادة تعيين التركيب
|
||||
|
||||
## Widget: Developer settings
|
||||
|
||||
widget-developer_mode = وضع المطوّر
|
||||
@@ -165,9 +169,15 @@ tracker-table-column-url = عنوان URL
|
||||
## Tracker rotation
|
||||
|
||||
tracker-rotation-front = المقدمة
|
||||
tracker-rotation-front_left = أمامي-يسار
|
||||
tracker-rotation-front_right = أمامي -يمين
|
||||
tracker-rotation-left = اليسار
|
||||
tracker-rotation-right = اليمين
|
||||
tracker-rotation-back = الخلف
|
||||
tracker-rotation-back_left = الخلف اليسار
|
||||
tracker-rotation-back_right = الخلف الأيمن
|
||||
tracker-rotation-custom = مخصص
|
||||
tracker-rotation-overriden = (تم تجاوزه عن طريق إعادة الضبط المتصاعد)
|
||||
|
||||
## Tracker information
|
||||
|
||||
@@ -272,6 +282,8 @@ settings-sidebar-osc_router = راوتر أوه أس سي
|
||||
settings-sidebar-osc_trackers = أجهزة تعقب في ار تشات أوه أس سي
|
||||
settings-sidebar-utils = الأدوات المساعدة
|
||||
settings-sidebar-serial = وحدة التحكم التسلسلية
|
||||
settings-sidebar-appearance = مظهر
|
||||
settings-sidebar-notifications = إشعارات
|
||||
|
||||
## SteamVR settings
|
||||
|
||||
@@ -339,11 +351,21 @@ settings-general-fk_settings-leg_fk = تعقب الساق
|
||||
settings-general-fk_settings-arm_fk = تعقب الذراع
|
||||
settings-general-fk_settings-arm_fk-description = تغيير طريقة تعقب الذراعين.
|
||||
settings-general-fk_settings-arm_fk-force_arms = إجبار الذراعين من ايتش أم دي
|
||||
settings-general-fk_settings-skeleton_settings = إعدادات الهيكل العظمي
|
||||
settings-general-fk_settings-skeleton_settings-toggles = تبديل الهيكل العظمي
|
||||
settings-general-fk_settings-skeleton_settings-description = تبديل إعدادات الهيكل العظمي أو إيقافه. يوصى بتركها شغالة.
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine = العمود الفقري الممتد
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis = الحوض الممتد
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees = الركبة الممتدة
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine_model = نموذج العمود الفقري الممتد
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis_model = نموذج الحوض الممتد
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees_model = نموذج الركبة الممتدة
|
||||
settings-general-fk_settings-skeleton_settings-ratios = نسب الهيكل العظمي
|
||||
settings-general-fk_settings-skeleton_settings-ratios-description = تغيير قيم إعدادات الهيكل العظمي. قد تحتاج إلى ضبط النسب الخاصة بك بعد تغييرها.
|
||||
settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_hip = خصص الخصر من الصدر إلى الورك
|
||||
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-self_localization-title = وضع Mocap
|
||||
settings-general-fk_settings-self_localization-description = يسمح وضع Mocap للهيكل العظمي بتعقب موضعه تقريبا بدون سماعة رأس أو أجهزة تعقب أخرى. لاحظ أن هذا يتطلب أجهزة تعقب القدمين والرأس للعمل ولا تزال تجريبية.
|
||||
settings-general-fk_settings-vive_emulation-title = محاكاة فايف
|
||||
settings-general-fk_settings-vive_emulation-description = محاكاة مشاكل تعقب الخصر التي تعاني منها أجهزة تعقب فايف. هذه مزحة وتجعل التتبع أسوأ.
|
||||
settings-general-fk_settings-vive_emulation-label = تمكين محاكاة فايف
|
||||
@@ -364,6 +386,17 @@ settings-general-gesture_control-taps =
|
||||
[many] { $amount } نقرات
|
||||
*[other] { $amount } نقرات
|
||||
}
|
||||
# This is a unit: 3 trackers, 2 trackers, 1 tracker
|
||||
# $amount (Number) - Amount of trackers
|
||||
settings-general-gesture_control-trackers =
|
||||
{ $amount ->
|
||||
[zero] لا أجهزة تعقب
|
||||
[one] جهاز تعقب واحد
|
||||
[two] جهازي تعقب
|
||||
[few] { "" }
|
||||
[many] { "" }
|
||||
*[other] { $amount } أجهزة تعقب
|
||||
}
|
||||
settings-general-gesture_control-yawResetEnabled = تمكين النقر لإعادة التعيين الانعراج
|
||||
settings-general-gesture_control-yawResetDelay = إعادة تعيين التأخير الانعراج
|
||||
settings-general-gesture_control-yawResetTaps = عدد النقرات لإعادة تعيين الانعراج
|
||||
@@ -373,13 +406,32 @@ settings-general-gesture_control-fullResetTaps = عدد النقرات لإعا
|
||||
settings-general-gesture_control-mountingResetEnabled = تمكين النقر لإعادة تعيين التركيب
|
||||
settings-general-gesture_control-mountingResetDelay = تأخير إعادة تعيين التركيب
|
||||
settings-general-gesture_control-mountingResetTaps = نقرات لإعادة تعيين التركيب
|
||||
# The number of trackers that can have higher acceleration before a tap is rejected
|
||||
settings-general-gesture_control-numberTrackersOverThreshold = أجهزة تعقب فوق قيمة القطع
|
||||
settings-general-gesture_control-numberTrackersOverThreshold-description = قم بزيادة هذه القيمة إذا كان اكتشاف النقر لا يعمل. لا تقم بزيادته فوق ما هو مطلوب لجعل اكتشاف النقر يعمل لأنه قد يتسبب في المزيد من الإيجابيات الخاطئة.
|
||||
|
||||
## Interface settings
|
||||
## Appearance settings
|
||||
|
||||
settings-general-interface = واجهة المستخدم
|
||||
settings-interface-appearance = مظهر
|
||||
settings-general-interface-dev_mode = وضع المطوّر
|
||||
settings-general-interface-dev_mode-description = يمكن أن يكون هذا الوضع مفيدًا إذا كنت بحاجة إلى بيانات متعمقة أو للتفاعل مع أجهزة التعقب المتصلة على مستوى أكثر تقدمًا.
|
||||
settings-general-interface-dev_mode-label = وضع المطوّر
|
||||
settings-general-interface-theme = موضوع اللون
|
||||
settings-general-interface-lang = اختر اللغة
|
||||
settings-general-interface-lang-description = قم بتغيير اللغة الافتراضية التي تريد استخدامها.
|
||||
settings-general-interface-lang-placeholder = اختر اللغة التي تريد استخدامها
|
||||
# Keep the font name untranslated
|
||||
settings-interface-appearance-font = خط واجهة المستخدم الرسومية
|
||||
settings-interface-appearance-font-description = هذا يغير الخط المستخدم من قبل الواجهة.
|
||||
settings-interface-appearance-font-placeholder = الخط الافتراضي
|
||||
settings-interface-appearance-font-os_font = خط نظام التشغيل
|
||||
settings-interface-appearance-font-slime_font = الخط الافتراضي
|
||||
settings-interface-appearance-font_size = قياس الخط الأساسي
|
||||
settings-interface-appearance-font_size-description = يؤثر هذا على حجم خط الواجهة بأكملها باستثناء لوحة الإعدادات هذه.
|
||||
|
||||
## Notification settings
|
||||
|
||||
settings-interface-notifications = إشعارات
|
||||
settings-general-interface-serial_detection = الكشف عن جهاز تسلسلي
|
||||
settings-general-interface-serial_detection-description = سيعرض هذا الخيار نافذة منبثقة في كل مرة تقوم فيها بتوصيل جهاز تسلسلي جديد يمكن أن يكون جهاز تعقب. يساعد في تحسين عملية إعداد جهاز التعقب.
|
||||
settings-general-interface-serial_detection-label = الكشف عن جهاز تسلسلي
|
||||
@@ -387,10 +439,6 @@ settings-general-interface-feedback_sound = صوت ردود الفعل
|
||||
settings-general-interface-feedback_sound-description = سيصدر هذا الخيار صوتًا عند تشغيل إعادة الضبط
|
||||
settings-general-interface-feedback_sound-label = صوت ردود الفعل
|
||||
settings-general-interface-feedback_sound-volume = حجم صوت ردود الفعل
|
||||
settings-general-interface-theme = موضوع اللون
|
||||
settings-general-interface-lang = اختر اللغة
|
||||
settings-general-interface-lang-description = قم بتغيير اللغة الافتراضية التي تريد استخدامها.
|
||||
settings-general-interface-lang-placeholder = اختر اللغة التي تريد استخدامها
|
||||
|
||||
## Serial settings
|
||||
|
||||
@@ -768,7 +816,10 @@ onboarding-choose_proportions-description =
|
||||
onboarding-choose_proportions-auto_proportions = النسب التلقائية
|
||||
# Italized text
|
||||
onboarding-choose_proportions-auto_proportions-subtitle = الموصى به
|
||||
onboarding-choose_proportions-auto_proportions-description = سيقدر هذا النسب الخاصة بك عن طريق تسجيل عينة من حركاتك وتمريرها من خلال برنامج
|
||||
onboarding-choose_proportions-auto_proportions-descriptionv2 =
|
||||
سيؤدي ذلك إلى تخمين نسبك عن طريق تسجيل عينة من تحركاتك وتمريرها عبر خوارزمية.
|
||||
|
||||
<b>هذا يتطلب توصيل HMD الخاص بك ب SlimeVR!</b>
|
||||
onboarding-choose_proportions-manual_proportions = النسب اليدوية
|
||||
# Italized text
|
||||
onboarding-choose_proportions-manual_proportions-subtitle = للمسات الصغيرة
|
||||
@@ -804,6 +855,18 @@ onboarding-automatic_proportions-requirements-description =
|
||||
تعمل أجهزة التتبع وسماعات الرأس بشكل صحيح داخل سرفر سلايم في ار .
|
||||
تقوم سماعة الرأس الخاصة بك بالإبلاغ عن بيانات الموقع إلى سرفر سلايم في ار (وهذا يعني بشكل عام تشغيل سلايم في ار وتوصيله بـ سلايم في ار باستخدام برنامج تشغيل ستيم في ار من سلايم في ار ).
|
||||
onboarding-automatic_proportions-requirements-next = لقد قرأت المتطلبات
|
||||
onboarding-automatic_proportions-check_height-title = تحقق من طولك
|
||||
onboarding-automatic_proportions-check_height-description = نستخدم طولك كأساس لقياساتنا باستخدام ارتفاع HMD كتقريب لطولك الفعلي ، ولكن من الأفضل التحقق مما إذا كانت صحيحة بنفسك!
|
||||
# All the text is in bold!
|
||||
onboarding-automatic_proportions-check_height-calculation_warning = يرجى الضغط على الزر أثناء الوقوف <u>في وضع مستقيم</u> لحساب طولك. لديك 3 ثوان بعد الضغط على الزر!
|
||||
onboarding-automatic_proportions-check_height-fetch_height = أنا واقف!
|
||||
# Context is that the height is unknown
|
||||
onboarding-automatic_proportions-check_height-unknown = مجهول
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-height = طولك هو
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-hmd_height = وارتفاع HMD هو
|
||||
onboarding-automatic_proportions-check_height-next_step = انهم بخير
|
||||
onboarding-automatic_proportions-start_recording-title = استعد للتحرك
|
||||
onboarding-automatic_proportions-start_recording-description = سنقوم الآن بتسجيل بعض الوضعيات والحركات المحددة. ستتم مطالبتك بذلك في الشاشة التالية. كن مستعدا للبدء عند الضغط على الزر!
|
||||
onboarding-automatic_proportions-start_recording-next = بدء التسجيل
|
||||
@@ -837,6 +900,10 @@ onboarding-automatic_proportions-verify_results-redo = إعادة التسجيل
|
||||
onboarding-automatic_proportions-verify_results-confirm = تبدو صحيحة
|
||||
onboarding-automatic_proportions-done-title = تم قياس الجسم و حفظه.
|
||||
onboarding-automatic_proportions-done-description = اكتملت معايرة نسب جسمك!
|
||||
onboarding-automatic_proportions-error_modal =
|
||||
<b>تحذير:</b> تم العثور على خطأ أثناء تقدير النسب!
|
||||
يرجى <docs>التحقق من المستندات</docs> أو الانضمام إلى <discord>Discord</discord> للحصول على المساعدة ^_^
|
||||
onboarding-automatic_proportions-error_modal-confirm = مفهوم!
|
||||
|
||||
## Home
|
||||
|
||||
|
||||
@@ -36,6 +36,7 @@ body_part-RIGHT_HAND = Rechte Hand
|
||||
body_part-RIGHT_UPPER_LEG = Rechter Oberschenkel
|
||||
body_part-RIGHT_LOWER_LEG = Rechter Unterschenkel
|
||||
body_part-RIGHT_FOOT = Rechter Fuß
|
||||
body_part-UPPER_CHEST = Obere Brust
|
||||
body_part-CHEST = Brust
|
||||
body_part-WAIST = Taille
|
||||
body_part-HIP = Hüfte
|
||||
@@ -53,8 +54,9 @@ skeleton_bone-NONE = Keine
|
||||
skeleton_bone-HEAD = Kopfverschiebung
|
||||
skeleton_bone-NECK = Halslänge
|
||||
skeleton_bone-torso_group = Oberkörperhöhe
|
||||
skeleton_bone-CHEST = Brustabstand
|
||||
skeleton_bone-UPPER_CHEST = Obere Brustlänge
|
||||
skeleton_bone-CHEST_OFFSET = Brustversatz
|
||||
skeleton_bone-CHEST = Brustabstand
|
||||
skeleton_bone-WAIST = Taillenabstand
|
||||
skeleton_bone-HIP = Hüftlänge
|
||||
skeleton_bone-HIP_OFFSET = Hüftversatz
|
||||
@@ -120,6 +122,9 @@ widget-overlay-is_mirrored_label = Visualisierung spiegeln
|
||||
|
||||
widget-drift_compensation-clear = Driftkompensation zurücksetzen
|
||||
|
||||
## Widget: Clear Reset Mounting
|
||||
|
||||
|
||||
## Widget: Developer settings
|
||||
|
||||
widget-developer_mode = Entwicklermodus
|
||||
@@ -163,9 +168,15 @@ tracker-table-column-url = Adresse
|
||||
## Tracker rotation
|
||||
|
||||
tracker-rotation-front = Vorne
|
||||
tracker-rotation-front_left = Vorne-Links
|
||||
tracker-rotation-front_right = Vorne-Rechts
|
||||
tracker-rotation-left = Links
|
||||
tracker-rotation-right = Rechts
|
||||
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 information
|
||||
|
||||
@@ -269,6 +280,8 @@ settings-sidebar-osc_router = OSC-Router
|
||||
settings-sidebar-osc_trackers = VRChat OSC-Tracker
|
||||
settings-sidebar-utils = Werkzeuge
|
||||
settings-sidebar-serial = Serielle Konsole
|
||||
settings-sidebar-appearance = Erscheinungsbild
|
||||
settings-sidebar-notifications = Benachrichtigungen
|
||||
|
||||
## SteamVR settings
|
||||
|
||||
@@ -338,9 +351,10 @@ settings-general-fk_settings-arm_fk-description = Ändern Sie die Art und Weise,
|
||||
settings-general-fk_settings-arm_fk-force_arms = Arme vom VR-Headset erzwingen
|
||||
settings-general-fk_settings-skeleton_settings = Skeletteinstellungen
|
||||
settings-general-fk_settings-skeleton_settings-description = Schalten Sie Skeletteinstellungen ein oder aus. Es wird empfohlen, diese eingeschaltet zu lassen.
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine = Erweiterte Wirbelsäule
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis = Erweiterter Beckenbereich
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees = Erweiterte Knie
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine_model = Erweitertes Wirbelsäulen-Modell
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis_model = Erweitertes Pelvis-Modell
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees_model = Erweitertes Knie-Modell
|
||||
settings-general-fk_settings-self_localization-title = Motion-Capture-Modus
|
||||
settings-general-fk_settings-vive_emulation-title = Vive-Simulierung
|
||||
settings-general-fk_settings-vive_emulation-description = Simuliere die Tracking-Probleme, welche bei Vive-Trackern auftreten. Dies ist ein Scherz und verschlechtert das Tracking.
|
||||
settings-general-fk_settings-vive_emulation-label = Vive-Simulierung
|
||||
@@ -357,6 +371,13 @@ settings-general-gesture_control-taps =
|
||||
[one] 1-mal antippen
|
||||
*[other] { $amount }-mal antippen
|
||||
}
|
||||
# This is a unit: 3 trackers, 2 trackers, 1 tracker
|
||||
# $amount (Number) - Amount of trackers
|
||||
settings-general-gesture_control-trackers =
|
||||
{ $amount ->
|
||||
[one] Tracker
|
||||
*[other] Tracker
|
||||
}
|
||||
settings-general-gesture_control-yawResetEnabled = Horizontaler Reset durch Antippen
|
||||
settings-general-gesture_control-yawResetDelay = Verzögerung für einen horizontalen Reset
|
||||
settings-general-gesture_control-yawResetTaps = Antipp-Anzahl für einen horizontalen Reset
|
||||
@@ -366,13 +387,30 @@ settings-general-gesture_control-fullResetTaps = Antipp-Anzahl für einen vollst
|
||||
settings-general-gesture_control-mountingResetEnabled = Antippen für Befestigungs-Reset
|
||||
settings-general-gesture_control-mountingResetDelay = Befestigungs-Reset-Verzögerung
|
||||
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
|
||||
|
||||
## Interface settings
|
||||
## Appearance settings
|
||||
|
||||
settings-general-interface = Bedienoberfläche
|
||||
settings-interface-appearance = Erscheinungsbild
|
||||
settings-general-interface-dev_mode = Entwicklermodus
|
||||
settings-general-interface-dev_mode-description = Der Entwicklermodus stellt mehr Daten dar und erlaubt auch erweiterte Einstellungen, so wie erweiterte Optionen bei verbundenen Trackern.
|
||||
settings-general-interface-dev_mode-label = Entwicklermodus
|
||||
settings-general-interface-theme = Farbschema
|
||||
settings-general-interface-lang = Sprachauswahl
|
||||
settings-general-interface-lang-description = Ändern Sie die Standard-Sprache, die Sie verwenden möchten
|
||||
settings-general-interface-lang-placeholder = Wählen Sie die zu verwendende Sprache aus
|
||||
# Keep the font name untranslated
|
||||
settings-interface-appearance-font = GUI-Schriftart
|
||||
settings-interface-appearance-font-description = Verändert die Schriftart der Benutzeroberfläche.
|
||||
settings-interface-appearance-font-placeholder = Standard-Schriftart
|
||||
settings-interface-appearance-font-os_font = Betriebssystem-Schriftart
|
||||
settings-interface-appearance-font-slime_font = Standard-Schriftart
|
||||
settings-interface-appearance-font_size = Standard-Schriftgröße
|
||||
|
||||
## Notification settings
|
||||
|
||||
settings-interface-notifications = Benachrichtigungen
|
||||
settings-general-interface-serial_detection = Serielle Geräteerkennung
|
||||
settings-general-interface-serial_detection-description = Diese Option zeigt jedes Mal ein Pop-up-Fenster an, wenn ein neues serielles Gerät angeschlossen wird, das ein Tracker sein könnte. Dies hilft beim Einrichtungsprozess des Trackers
|
||||
settings-general-interface-serial_detection-label = Serielle Geräteerkennung
|
||||
@@ -380,10 +418,6 @@ settings-general-interface-feedback_sound = Feedback-Geräusch
|
||||
settings-general-interface-feedback_sound-description = Diese Option wird ein Geräusch abspielen, wenn ein Reset ausgeführt wurde.
|
||||
settings-general-interface-feedback_sound-label = Feedback-Geräusch
|
||||
settings-general-interface-feedback_sound-volume = Feedback-Sound-Lautstärke
|
||||
settings-general-interface-theme = Farbschema
|
||||
settings-general-interface-lang = Sprachauswahl
|
||||
settings-general-interface-lang-description = Ändern Sie die Standard-Sprache, die Sie verwenden möchten
|
||||
settings-general-interface-lang-placeholder = Wählen Sie die zu verwendende Sprache aus
|
||||
|
||||
## Serial settings
|
||||
|
||||
@@ -736,7 +770,6 @@ onboarding-choose_proportions = Welche Kalibrierungsmethode ist zu verwenden?
|
||||
onboarding-choose_proportions-auto_proportions = Automatische Proportionen
|
||||
# Italized text
|
||||
onboarding-choose_proportions-auto_proportions-subtitle = Empfohlen
|
||||
onboarding-choose_proportions-auto_proportions-description = Dadurch werden Ihre Proportionen erraten, indem Stichproben Ihrer Bewegungen verrechnet werden
|
||||
onboarding-choose_proportions-manual_proportions = Manuelle Körperproportionen
|
||||
onboarding-choose_proportions-manual_proportions-description = Auf diese Weise können Sie Ihre Proportionen manuell anpassen, indem Sie diese direkt ändern
|
||||
onboarding-choose_proportions-export = Proportionen exportieren
|
||||
@@ -748,6 +781,7 @@ onboarding-manual_proportions-back = Gehen Sie zurück zum Reset-Tutorial
|
||||
onboarding-manual_proportions-title = Manuelle Körperproportionen
|
||||
onboarding-manual_proportions-precision = Feinanpassung
|
||||
onboarding-manual_proportions-auto = Automatische Kalibrierung
|
||||
onboarding-manual_proportions-ratio = Anpassung nach Proportionen
|
||||
|
||||
## Tracker automatic proportions setup
|
||||
|
||||
@@ -761,6 +795,14 @@ onboarding-automatic_proportions-put_trackers_on-description = Um Ihre Proportio
|
||||
onboarding-automatic_proportions-put_trackers_on-next = Ich habe alle meine Tracker angelegt
|
||||
onboarding-automatic_proportions-requirements-title = Anforderungen
|
||||
onboarding-automatic_proportions-requirements-next = Ich habe die Anforderungen gelesen
|
||||
onboarding-automatic_proportions-check_height-title = Überprüfen Sie Ihre Körpergröße
|
||||
onboarding-automatic_proportions-check_height-fetch_height = Ich stehe!
|
||||
# Context is that the height is unknown
|
||||
onboarding-automatic_proportions-check_height-unknown = Unbekannt
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-height = Ihre Körpergröße ist
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-hmd_height = Und Ihre Headset-Höhe ist
|
||||
onboarding-automatic_proportions-start_recording-title = Bereiten Sie sich auf ein paar Bewegungen vor
|
||||
onboarding-automatic_proportions-start_recording-description = Wir werden nun einige bestimmte Posen und Bewegungen aufnehmen. Diese werden im nächsten Bildschirm angezeigt. Bereiten Sie sicht darauf vor, wenn Sie den Knopf drücken!
|
||||
onboarding-automatic_proportions-start_recording-next = Aufnahme starten
|
||||
|
||||
@@ -36,6 +36,7 @@ body_part-RIGHT_HAND = wight pawb
|
||||
body_part-RIGHT_UPPER_LEG = wight uppew weg
|
||||
body_part-RIGHT_LOWER_LEG = wight wowwe weg
|
||||
body_part-RIGHT_FOOT = wight pawb
|
||||
body_part-UPPER_CHEST = uppew chest
|
||||
body_part-CHEST = chwest~
|
||||
body_part-WAIST = wyayst~
|
||||
body_part-HIP = hyip
|
||||
@@ -53,8 +54,9 @@ skeleton_bone-NONE = none
|
||||
skeleton_bone-HEAD = hed shyft
|
||||
skeleton_bone-NECK = nyeck wength
|
||||
skeleton_bone-torso_group = towso wength
|
||||
skeleton_bone-CHEST = chwest wength
|
||||
skeleton_bone-UPPER_CHEST = uppew chest wength
|
||||
skeleton_bone-CHEST_OFFSET = chwest awfset
|
||||
skeleton_bone-CHEST = chwest wength
|
||||
skeleton_bone-WAIST = weyst wength
|
||||
skeleton_bone-HIP = hip wength
|
||||
skeleton_bone-HIP_OFFSET = hyip awfset
|
||||
@@ -120,6 +122,10 @@ widget-overlay-is_mirrored_label = dispway owovelay as miwwow
|
||||
|
||||
widget-drift_compensation-clear = cwear dwift compensation
|
||||
|
||||
## Widget: Clear Reset Mounting
|
||||
|
||||
widget-clear_mounting = cweaw weset meownting
|
||||
|
||||
## Widget: Developer settings
|
||||
|
||||
widget-developer_mode = devwowwewow mode
|
||||
@@ -163,9 +169,15 @@ tracker-table-column-url = uawl
|
||||
## Tracker rotation
|
||||
|
||||
tracker-rotation-front = fwowt
|
||||
tracker-rotation-front_left = fwont-weft
|
||||
tracker-rotation-front_right = fwont-wight
|
||||
tracker-rotation-left = lewft
|
||||
tracker-rotation-right = wight
|
||||
tracker-rotation-back = bak
|
||||
tracker-rotation-back_left = back-weft
|
||||
tracker-rotation-back_right = back-wight
|
||||
tracker-rotation-custom = custowm
|
||||
tracker-rotation-overriden = (ovewwidden by meownting weset)
|
||||
|
||||
## Tracker information
|
||||
|
||||
@@ -230,6 +242,7 @@ tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } wight tigh?
|
||||
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } wight ankew?
|
||||
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } wight pawb?
|
||||
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } wight contwowwaw?
|
||||
tracker_selection_menu-UPPER_CHEST = { -tracker_selection-part } uppew chest?
|
||||
tracker_selection_menu-CHEST = { -tracker_selection-part } chwest?
|
||||
tracker_selection_menu-WAIST = { -tracker_selection-part } waste?
|
||||
tracker_selection_menu-HIP = { -tracker_selection-part } hiyp?
|
||||
@@ -269,6 +282,8 @@ settings-sidebar-osc_router = OSC wouwter
|
||||
settings-sidebar-osc_trackers = VRChawt OSC Twayckaws
|
||||
settings-sidebar-utils = utiwities
|
||||
settings-sidebar-serial = sewiaw cownsaw
|
||||
settings-sidebar-appearance = appeawance
|
||||
settings-sidebar-notifications = notificashuns
|
||||
|
||||
## SteamVR settings
|
||||
|
||||
@@ -338,9 +353,11 @@ settings-general-fk_settings-arm_fk-description = chawnge teh way teh awms awe t
|
||||
settings-general-fk_settings-arm_fk-force_arms = fowce awms fwom hmd
|
||||
settings-general-fk_settings-skeleton_settings = skeweton sewttings
|
||||
settings-general-fk_settings-skeleton_settings-description = toggwe skeweton sewttings on owow off. is wowcommended to weawve these on~
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine = ewtended spine
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis = ewtended pelvis
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees = ewtended neey
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine_model = extwended spine modew
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis_model = extwended pewvis modew
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees_model = extwended nee modew
|
||||
settings-general-fk_settings-self_localization-title = mocap mowd
|
||||
settings-general-fk_settings-self_localization-description = mocap mowd awwows da skeweton to wuffly twack is own posishun without a hedset or other twackews. note dat dis wequiwes feet and hed twackews to wowk and is stiwll expewimentaw.
|
||||
settings-general-fk_settings-vive_emulation-title = vive emuwation
|
||||
settings-general-fk_settings-vive_emulation-description = emuwate the waist twackew pwobwems that vive twackews hawe. tis is a jowke and mawkes twacking wowse eheh ^^
|
||||
settings-general-fk_settings-vive_emulation-label = enabwe vive emuwation
|
||||
@@ -357,6 +374,13 @@ settings-general-gesture_control-taps =
|
||||
[one] 1 bap
|
||||
*[other] { $amount } baps
|
||||
}
|
||||
# This is a unit: 3 trackers, 2 trackers, 1 tracker
|
||||
# $amount (Number) - Amount of trackers
|
||||
settings-general-gesture_control-trackers =
|
||||
{ $amount ->
|
||||
[one] 1 twackew
|
||||
*[other] { $amount } twackews
|
||||
}
|
||||
settings-general-gesture_control-yawResetEnabled = enabwe bap to yaw weset
|
||||
settings-general-gesture_control-yawResetDelay = yaw weset deway
|
||||
settings-general-gesture_control-yawResetTaps = baps fow yaw weset
|
||||
@@ -366,13 +390,32 @@ settings-general-gesture_control-fullResetTaps = baps fow fuww weset
|
||||
settings-general-gesture_control-mountingResetEnabled = enable wap to weset mountwing
|
||||
settings-general-gesture_control-mountingResetDelay = mountwing weset deway
|
||||
settings-general-gesture_control-mountingResetTaps = baps for mountwing weset
|
||||
# The number of trackers that can have higher acceleration before a tap is rejected
|
||||
settings-general-gesture_control-numberTrackersOverThreshold = twackews over thweshowd
|
||||
settings-general-gesture_control-numberTrackersOverThreshold-description = incwease dis vawue if da bap detecshun is nawt wowking. dont incwease it above what is need to make bap detecshun wowk as it wowd cauwse mowe fawse pawsitives.
|
||||
|
||||
## Interface settings
|
||||
## Appearance settings
|
||||
|
||||
settings-general-interface = intewface
|
||||
settings-interface-appearance = appeawance
|
||||
settings-general-interface-dev_mode = devwowwewow mode
|
||||
settings-general-interface-dev_mode-description = this mode can be wowseffuw if you need in-dipth data owow to intewact with cownnected twackaws on a wowowe wowadvanced wowwevew
|
||||
settings-general-interface-dev_mode-label = devwowwewow mode
|
||||
settings-general-interface-theme = cowor theem
|
||||
settings-general-interface-lang = sewect wanguage
|
||||
settings-general-interface-lang-description = change the defawwt wanguage yuw want to use
|
||||
settings-general-interface-lang-placeholder = sewect teh wanguage to use
|
||||
# Keep the font name untranslated
|
||||
settings-interface-appearance-font = gui fawnt
|
||||
settings-interface-appearance-font-description = dis change da fawnt use by da intewface.
|
||||
settings-interface-appearance-font-placeholder = defawt fawnt
|
||||
settings-interface-appearance-font-os_font = os fawnt
|
||||
settings-interface-appearance-font-slime_font = defawt fawnt
|
||||
settings-interface-appearance-font_size = bass fawn scawing
|
||||
settings-interface-appearance-font_size-description = dis affects da fawnt size of da whol intewface except dis setting panew.
|
||||
|
||||
## Notification settings
|
||||
|
||||
settings-interface-notifications = notificashuns
|
||||
settings-general-interface-serial_detection = shewyaw device deteccion
|
||||
settings-general-interface-serial_detection-description = this option will shaww a pawp-up evewy time yuw pwug a new shewyaw device that cawwld be a twayckaw. it helps iympwooving teh setup pwocess of a twayckaw
|
||||
settings-general-interface-serial_detection-label = shewyaw device deteccion
|
||||
@@ -380,10 +423,6 @@ settings-general-interface-feedback_sound = feeback sownd
|
||||
settings-general-interface-feedback_sound-description = dis awptshun wiww pway a sownd wen a weset is twiggered (meow~!)
|
||||
settings-general-interface-feedback_sound-label = feeback sownd
|
||||
settings-general-interface-feedback_sound-volume = feedback sownd volyume
|
||||
settings-general-interface-theme = cowor theem
|
||||
settings-general-interface-lang = sewect wanguage
|
||||
settings-general-interface-lang-description = change the defawwt wanguage yuw want to use
|
||||
settings-general-interface-lang-placeholder = sewect teh wanguage to use
|
||||
|
||||
## Serial settings
|
||||
|
||||
@@ -527,7 +566,7 @@ onboarding-wifi_creds-password =
|
||||
|
||||
onboarding-reset_tutorial-back = gaww bawwk to meownting cawwibwation
|
||||
onboarding-reset_tutorial = weset wtutowial
|
||||
onboarding-reset_tutorial-description = dis featuwe isn't done, just pwess continyue
|
||||
onboarding-reset_tutorial-explanation = whiwe you use youw twackews dey mite get out of awignment becus of imu yaw dwift, or because u might have moved dem physicawwy. you have sevewew way to fix dis.
|
||||
onboarding-reset_tutorial-skip = skip sedup
|
||||
# Cares about multiline
|
||||
onboarding-reset_tutorial-0 =
|
||||
@@ -707,11 +746,11 @@ onboarding-choose_mounting = wut meownting cawibwation mefod to use?
|
||||
onboarding-choose_mounting-description = meownting owientation correct fow da pwacement of twackews on u body.
|
||||
onboarding-choose_mounting-auto_mounting = awtomawic meownting
|
||||
# Italized text
|
||||
onboarding-choose_mounting-auto_mounting-subtitle = wecommended
|
||||
onboarding-choose_mounting-auto_mounting-label = expewimentaw
|
||||
onboarding-choose_mounting-auto_mounting-description = dis will automaticawwy detec da meownting diwecshuns fow aww of ya twackews fwom 2 poses
|
||||
onboarding-choose_mounting-manual_mounting = manyul meownting
|
||||
# Italized text
|
||||
onboarding-choose_mounting-manual_mounting-subtitle = if yu know wut u r doin
|
||||
onboarding-choose_mounting-manual_mounting-label = wecommended
|
||||
onboarding-choose_mounting-manual_mounting-description = dis will let u chose da meownting diwecshun manuwawwy fow eech twackew
|
||||
|
||||
## Tracker manual mounting setup
|
||||
@@ -753,12 +792,15 @@ onboarding-choose_proportions-description =
|
||||
onboarding-choose_proportions-auto_proportions = awtomatic pwopowtions
|
||||
# Italized text
|
||||
onboarding-choose_proportions-auto_proportions-subtitle = wecommended
|
||||
onboarding-choose_proportions-auto_proportions-description = dis will guess ur pwopowshuns by wecowding a sampwe of ur movement and pass it thwough an ai
|
||||
onboarding-choose_proportions-auto_proportions-descriptionv2 =
|
||||
dis wiww guess youw pwopowshuns by wecowding a sampwe of youw movement and passing it thru an algowithm.
|
||||
|
||||
<b>dis wequiwes having youw hmd connected to SwimeVR!</b>
|
||||
onboarding-choose_proportions-manual_proportions = manuwal pwopowtions
|
||||
# Italized text
|
||||
onboarding-choose_proportions-manual_proportions-subtitle = fow smol touchies
|
||||
onboarding-choose_proportions-manual_proportions-description = dis will let u ajust ur pwopowtions manuwally by modifying dem diwectwy
|
||||
onboarding-choose_proportions-save = sav pawpwotions
|
||||
onboarding-choose_proportions-export = expowt pawpowshuns
|
||||
onboarding-choose_proportions-file_type = body pawpowshuns file
|
||||
|
||||
## Tracker manual proportions setup
|
||||
@@ -789,6 +831,18 @@ onboarding-automatic_proportions-requirements-description =
|
||||
ur twackews and headset awe wowking pwopewwy within the SwimeVR sewvew.
|
||||
ur headset is wepowting positionyaw data to the SwimeVR sewvew (this genyewawwy wenyewawwy means having SteamVR wunnying and connyected to SwimeVR using SwimeVR's SteamVR dwivew).
|
||||
onboarding-automatic_proportions-requirements-next = i have wed da wequiwemens
|
||||
onboarding-automatic_proportions-check_height-title = check youw height
|
||||
onboarding-automatic_proportions-check_height-description = we use youw height as a basis of ouw measuwements by using da hmd's height as an appwoximashun of youw actuwaw height, but is better to check if they are right youwsewf!
|
||||
# All the text is in bold!
|
||||
onboarding-automatic_proportions-check_height-calculation_warning = pwease pwess da button while standing <u>upwight</u> to cawcuwate youw height. you hav 3 second aftew you pwess da button! >w<
|
||||
onboarding-automatic_proportions-check_height-fetch_height = am standing!
|
||||
# Context is that the height is unknown
|
||||
onboarding-automatic_proportions-check_height-unknown = unnown
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-height = youw height is
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-hmd_height = an hmd height is
|
||||
onboarding-automatic_proportions-check_height-next_step = dey awe fine
|
||||
onboarding-automatic_proportions-start_recording-title = get wowdy to move
|
||||
onboarding-automatic_proportions-start_recording-description = we'we now going to wowcawd some specific poses and moves. these will be pwompted in teh wowst screen. be wowdy to stawt when teh buttawn is pwessed!
|
||||
onboarding-automatic_proportions-start_recording-next = stawt wowcawding
|
||||
@@ -818,6 +872,10 @@ onboarding-automatic_proportions-verify_results-redo = wedo wecowding
|
||||
onboarding-automatic_proportions-verify_results-confirm = tehywee coowect
|
||||
onboarding-automatic_proportions-done-title = bawdy meowsured anwd sayved uwu
|
||||
onboarding-automatic_proportions-done-description = yoww body pwopowwtions cawybowwation is cowowplete! ^w^
|
||||
onboarding-automatic_proportions-error_modal =
|
||||
<b>wawning:</b> an ewwow was fownd whiwe estimating pawpowshuns! ;w;
|
||||
pwease <docs>check da docs</docs> or join ouw <discord>Discord</discord> fow hewp >~>
|
||||
onboarding-automatic_proportions-error_modal-confirm = undewstood!
|
||||
|
||||
## Home
|
||||
|
||||
|
||||
@@ -109,6 +109,9 @@ widget-overlay-is_mirrored_label = Display Overlay as Mirror
|
||||
## Widget: Drift compensation
|
||||
widget-drift_compensation-clear = Clear drift compensation
|
||||
|
||||
## Widget: Clear Reset Mounting
|
||||
widget-clear_mounting = Clear reset mounting
|
||||
|
||||
## Widget: Developer settings
|
||||
widget-developer_mode = Developer Mode
|
||||
widget-developer_mode-high_contrast = High contrast
|
||||
@@ -147,9 +150,15 @@ tracker-table-column-url = URL
|
||||
|
||||
## Tracker rotation
|
||||
tracker-rotation-front = Front
|
||||
tracker-rotation-front_left = Front-Left
|
||||
tracker-rotation-front_right = Front-Right
|
||||
tracker-rotation-left = Left
|
||||
tracker-rotation-right = Right
|
||||
tracker-rotation-back = Back
|
||||
tracker-rotation-back_left = Back-Left
|
||||
tracker-rotation-back_right = Back-Right
|
||||
tracker-rotation-custom = Custom
|
||||
tracker-rotation-overriden = (overriden by mounting reset)
|
||||
|
||||
## Tracker information
|
||||
tracker-infos-manufacturer = Manufacturer
|
||||
@@ -249,6 +258,8 @@ settings-sidebar-osc_router = OSC router
|
||||
settings-sidebar-osc_trackers = VRChat OSC Trackers
|
||||
settings-sidebar-utils = Utilities
|
||||
settings-sidebar-serial = Serial console
|
||||
settings-sidebar-appearance = Appearance
|
||||
settings-sidebar-notifications = Notifications
|
||||
|
||||
## SteamVR settings
|
||||
settings-general-steamvr = SteamVR
|
||||
@@ -314,11 +325,23 @@ settings-general-fk_settings-leg_fk = Leg tracking
|
||||
settings-general-fk_settings-arm_fk = Arm tracking
|
||||
settings-general-fk_settings-arm_fk-description = Force arms to be tracked from the HMD even if positional hand data is available.
|
||||
settings-general-fk_settings-arm_fk-force_arms = Force arms from HMD
|
||||
settings-general-fk_settings-skeleton_settings = Skeleton settings
|
||||
settings-general-fk_settings-skeleton_settings-toggles = Skeleton toggles
|
||||
settings-general-fk_settings-skeleton_settings-description = Toggle skeleton settings on or off. It is recommended to leave these on.
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine = Extended spine
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis = Extended pelvis
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees = Extended knee
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine_model = Extended spine model
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis_model = Extended pelvis model
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees_model = Extended knee model
|
||||
settings-general-fk_settings-skeleton_settings-ratios = Skeleton ratios
|
||||
settings-general-fk_settings-skeleton_settings-ratios-description = Change the values of skeleton settings. You may need to adjust your proportions after changing these.
|
||||
settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_hip = Impute waist from chest to hip
|
||||
settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_legs = Impute waist from chest to legs
|
||||
settings-general-fk_settings-skeleton_settings-impute_hip_from_chest_legs = Impute hip from chest to legs
|
||||
settings-general-fk_settings-skeleton_settings-impute_hip_from_waist_legs = Impute hip from waist to legs
|
||||
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-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.
|
||||
|
||||
settings-general-fk_settings-vive_emulation-title = Vive emulation
|
||||
settings-general-fk_settings-vive_emulation-description = Emulate the waist tracker problems that Vive trackers have. This is a joke and makes tracking worse.
|
||||
settings-general-fk_settings-vive_emulation-label = Enable Vive emulation
|
||||
@@ -326,13 +349,19 @@ settings-general-fk_settings-vive_emulation-label = Enable Vive emulation
|
||||
## Gesture control settings (tracker tapping)
|
||||
settings-general-gesture_control = Gesture control
|
||||
settings-general-gesture_control-subtitle = Tap based resets
|
||||
settings-general-gesture_control-description = Allows for resets to be triggered by tapping a tracker. The tracker highest up on your torso is used for Yaw Reset, the tracker highest up on your left leg is used for Full Reset, and the tracker highest up on your right leg is used for Mounting Reset. It should be mentioned that taps must happen within 0.6 seconds to be registered.
|
||||
settings-general-gesture_control-description = Allows for resets to be triggered by tapping a tracker. The tracker highest up on your torso is used for Yaw Reset, the tracker highest up on your left leg is used for Full Reset, and the tracker highest up on your right leg is used for Mounting Reset. Taps must occur within the time limit of 0.3 seconds times the number of taps to be recognized.
|
||||
# This is a unit: 3 taps, 2 taps, 1 tap
|
||||
# $amount (Number) - Amount of taps (touches to the tracker's case)
|
||||
settings-general-gesture_control-taps = { $amount ->
|
||||
[one] 1 tap
|
||||
*[other] { $amount } taps
|
||||
}
|
||||
# This is a unit: 3 trackers, 2 trackers, 1 tracker
|
||||
# $amount (Number) - Amount of trackers
|
||||
settings-general-gesture_control-trackers = { $amount ->
|
||||
[one] 1 tracker
|
||||
*[other] { $amount } trackers
|
||||
}
|
||||
settings-general-gesture_control-yawResetEnabled = Enable tap to yaw reset
|
||||
settings-general-gesture_control-yawResetDelay = Yaw reset delay
|
||||
settings-general-gesture_control-yawResetTaps = Taps for yaw reset
|
||||
@@ -342,23 +371,37 @@ settings-general-gesture_control-fullResetTaps = Taps for full reset
|
||||
settings-general-gesture_control-mountingResetEnabled = Enable tap to reset mounting
|
||||
settings-general-gesture_control-mountingResetDelay = Mounting reset delay
|
||||
settings-general-gesture_control-mountingResetTaps = Taps for mounting reset
|
||||
# The number of trackers that can have higher acceleration before a tap is rejected
|
||||
settings-general-gesture_control-numberTrackersOverThreshold = Trackers over threshold
|
||||
settings-general-gesture_control-numberTrackersOverThreshold-description = Increase this value if tap detection is not working. Do not increase it above what is needed to make tap detection work as it would cause more false positives.
|
||||
|
||||
## Interface settings
|
||||
settings-general-interface = Interface
|
||||
## Appearance settings
|
||||
settings-interface-appearance = Appearance
|
||||
settings-general-interface-dev_mode = Developer Mode
|
||||
settings-general-interface-dev_mode-description = This mode can be useful if you need in-depth data or to interact with connected trackers on a more advanced level.
|
||||
settings-general-interface-dev_mode-label = Developer Mode
|
||||
settings-general-interface-serial_detection = Serial device detection
|
||||
settings-general-interface-serial_detection-description = This option will show a pop-up every time you plug a new serial device that could be a tracker. It helps improving the setup process of a tracker.
|
||||
settings-general-interface-serial_detection-label = Serial device detection
|
||||
settings-general-interface-feedback_sound = Feedback sound
|
||||
settings-general-interface-feedback_sound-description = This option will play a sound when a reset is triggered
|
||||
settings-general-interface-feedback_sound-label = Feedback sound
|
||||
settings-general-interface-feedback_sound-volume = Feedback sound volume
|
||||
settings-general-interface-theme = Color theme
|
||||
settings-general-interface-lang = Select language
|
||||
settings-general-interface-lang-description = Change the default language you want to use.
|
||||
settings-general-interface-lang-placeholder = Select the language to use
|
||||
# Keep the font name untranslated
|
||||
settings-interface-appearance-font = GUI font
|
||||
settings-interface-appearance-font-description = This changes the font used by the interface.
|
||||
settings-interface-appearance-font-placeholder = Default font
|
||||
settings-interface-appearance-font-os_font = OS font
|
||||
settings-interface-appearance-font-slime_font = Default font
|
||||
settings-interface-appearance-font_size = Base font scaling
|
||||
settings-interface-appearance-font_size-description = This affects the font size of the whole interface except this settings panel.
|
||||
|
||||
## Notification settings
|
||||
settings-interface-notifications = Notifications
|
||||
settings-general-interface-serial_detection = Serial device detection
|
||||
settings-general-interface-serial_detection-description = This option will show a pop-up every time you plug a new serial device that could be a tracker. It helps improving the setup process of a tracker.
|
||||
settings-general-interface-serial_detection-label = Serial device detection
|
||||
settings-general-interface-feedback_sound = Feedback sound
|
||||
settings-general-interface-feedback_sound-description = This option will play a sound when a reset is triggered.
|
||||
settings-general-interface-feedback_sound-label = Feedback sound
|
||||
settings-general-interface-feedback_sound-volume = Feedback sound volume
|
||||
|
||||
## Serial settings
|
||||
settings-serial = Serial Console
|
||||
@@ -442,7 +485,7 @@ settings-osc-vmc-enable = Enable
|
||||
settings-osc-vmc-enable-description = Toggle the sending and receiving of data.
|
||||
settings-osc-vmc-enable-label = Enable
|
||||
settings-osc-vmc-network = Network ports
|
||||
settings-osc-vmc-network-description = Set the ports for listening and sending data via VMC
|
||||
settings-osc-vmc-network-description = Set the ports for listening and sending data via VMC.
|
||||
settings-osc-vmc-network-port_in =
|
||||
.label = Port In
|
||||
.placeholder = Port in (default: 39540)
|
||||
@@ -450,10 +493,10 @@ settings-osc-vmc-network-port_out =
|
||||
.label = Port Out
|
||||
.placeholder = Port out (default: 39539)
|
||||
settings-osc-vmc-network-address = Network address
|
||||
settings-osc-vmc-network-address-description = Choose which address to send out data at via VMC
|
||||
settings-osc-vmc-network-address-description = Choose which address to send out data at via VMC.
|
||||
settings-osc-vmc-network-address-placeholder = IPV4 address
|
||||
settings-osc-vmc-vrm = VRM Model
|
||||
settings-osc-vmc-vrm-description = Load a VRM model to allow head anchor and enable a higher compatibility with other applications
|
||||
settings-osc-vmc-vrm-description = Load a VRM model to allow head anchor and enable a higher compatibility with other applications.
|
||||
settings-osc-vmc-vrm-model_unloaded = No model loaded
|
||||
settings-osc-vmc-vrm-model_loaded = { $titled ->
|
||||
*[false] Untitled model loaded
|
||||
@@ -695,7 +738,10 @@ onboarding-choose_proportions-description = Body proportions are used to know th
|
||||
onboarding-choose_proportions-auto_proportions = Automatic proportions
|
||||
# Italized text
|
||||
onboarding-choose_proportions-auto_proportions-subtitle = Recommended
|
||||
onboarding-choose_proportions-auto_proportions-description = This will guess your proportions by recording a sample of your movements and passing it through an algorithm
|
||||
onboarding-choose_proportions-auto_proportions-descriptionv2 =
|
||||
This will guess your proportions by recording a sample of your movements and passing it through an algorithm.
|
||||
|
||||
<b>This requires having your HMD connected to SlimeVR!</b>
|
||||
onboarding-choose_proportions-manual_proportions = Manual proportions
|
||||
# Italized text
|
||||
onboarding-choose_proportions-manual_proportions-subtitle = For small touches
|
||||
@@ -729,6 +775,18 @@ onboarding-automatic_proportions-requirements-description =
|
||||
Your trackers and headset are working properly within the SlimeVR server.
|
||||
Your headset is reporting positional data to the SlimeVR server (this generally means having SteamVR running and connected to SlimeVR using SlimeVR's SteamVR driver).
|
||||
onboarding-automatic_proportions-requirements-next = I have read the requirements
|
||||
onboarding-automatic_proportions-check_height-title = Check your height
|
||||
onboarding-automatic_proportions-check_height-description = We use your height as a basis of our measurements by using the HMD's height as an approximation of your actual height, but it's better to check if they are right yourself!
|
||||
# All the text is in bold!
|
||||
onboarding-automatic_proportions-check_height-calculation_warning = Please press the button while standing <u>upright</u> to calculate your height. You have 3 seconds after you press the button!
|
||||
onboarding-automatic_proportions-check_height-fetch_height = I'm standing!
|
||||
# Context is that the height is unknown
|
||||
onboarding-automatic_proportions-check_height-unknown = Unknown
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-hmd_height1 = Your HMD height is
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-height1 = so your actual height is
|
||||
onboarding-automatic_proportions-check_height-next_step = They are fine
|
||||
onboarding-automatic_proportions-start_recording-title = Get ready to move
|
||||
onboarding-automatic_proportions-start_recording-description = We're now going to record some specific poses and moves. These will be prompted in the next screen. Be ready to start when the button is pressed!
|
||||
onboarding-automatic_proportions-start_recording-next = Start Recording
|
||||
@@ -757,6 +815,10 @@ onboarding-automatic_proportions-verify_results-redo = Redo recording
|
||||
onboarding-automatic_proportions-verify_results-confirm = They're correct
|
||||
onboarding-automatic_proportions-done-title = Body measured and saved.
|
||||
onboarding-automatic_proportions-done-description = Your body proportions' calibration is complete!
|
||||
onboarding-automatic_proportions-error_modal =
|
||||
<b>Warning:</b> An error was found while estimating proportions!
|
||||
Please <docs>check the docs</docs> or join our <discord>Discord</discord> for help ^_^
|
||||
onboarding-automatic_proportions-error_modal-confirm = Understood!
|
||||
|
||||
## Home
|
||||
home-no_trackers = No trackers detected or assigned
|
||||
|
||||
@@ -36,6 +36,7 @@ body_part-RIGHT_HAND = Mano derecha
|
||||
body_part-RIGHT_UPPER_LEG = Muslo derecho
|
||||
body_part-RIGHT_LOWER_LEG = Tobillo derecho
|
||||
body_part-RIGHT_FOOT = Pie derecho
|
||||
body_part-UPPER_CHEST = Pecho superior
|
||||
body_part-CHEST = Pecho
|
||||
body_part-WAIST = Cintura
|
||||
body_part-HIP = Cadera
|
||||
@@ -53,8 +54,9 @@ skeleton_bone-NONE = Nada
|
||||
skeleton_bone-HEAD = Inclinación de cabeza
|
||||
skeleton_bone-NECK = Largo del cuello
|
||||
skeleton_bone-torso_group = Largo del torso
|
||||
skeleton_bone-CHEST = Largo del pecho
|
||||
skeleton_bone-UPPER_CHEST = Largo del pecho superior
|
||||
skeleton_bone-CHEST_OFFSET = Chest Offset
|
||||
skeleton_bone-CHEST = Largo del pecho
|
||||
skeleton_bone-WAIST = Largo de la cintura
|
||||
skeleton_bone-HIP = Largo de la cadera
|
||||
skeleton_bone-HIP_OFFSET = Desplazamiento de la cadera
|
||||
@@ -118,7 +120,11 @@ widget-overlay-is_mirrored_label = Mostrar interfaz reflejada
|
||||
|
||||
## Widget: Drift compensation
|
||||
|
||||
widget-drift_compensation-clear = Limpiar compensación de desviación
|
||||
widget-drift_compensation-clear = Olvidar compensación de drift
|
||||
|
||||
## Widget: Clear Reset Mounting
|
||||
|
||||
widget-clear_mounting = Olvidar reinicio de montura
|
||||
|
||||
## Widget: Developer settings
|
||||
|
||||
@@ -163,9 +169,15 @@ tracker-table-column-url = URL
|
||||
## Tracker rotation
|
||||
|
||||
tracker-rotation-front = Frente
|
||||
tracker-rotation-front_left = Frente izquierdo
|
||||
tracker-rotation-front_right = Frente derecho
|
||||
tracker-rotation-left = Izquierda
|
||||
tracker-rotation-right = Derecha
|
||||
tracker-rotation-back = Atrás
|
||||
tracker-rotation-back_left = Atrás izquierdo
|
||||
tracker-rotation-back_right = Atrás derecho
|
||||
tracker-rotation-custom = Personalizado
|
||||
tracker-rotation-overriden = (siendo invalidado por el reinicio de montura)
|
||||
|
||||
## Tracker information
|
||||
|
||||
@@ -230,6 +242,7 @@ tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } muslo derec
|
||||
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } tobillo derecho?
|
||||
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } pie derecho?
|
||||
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } mando derecho?
|
||||
tracker_selection_menu-UPPER_CHEST = { -tracker_selection-part } pecho superior?
|
||||
tracker_selection_menu-CHEST = { -tracker_selection-part } pecho?
|
||||
tracker_selection_menu-WAIST = { -tracker_selection-part } cintura?
|
||||
tracker_selection_menu-HIP = { -tracker_selection-part } cadera?
|
||||
@@ -269,6 +282,8 @@ settings-sidebar-osc_router = Router OSC
|
||||
settings-sidebar-osc_trackers = Sensores OSC de VRChat
|
||||
settings-sidebar-utils = Utilidades
|
||||
settings-sidebar-serial = Consola serial
|
||||
settings-sidebar-appearance = Apariencia
|
||||
settings-sidebar-notifications = Notificaciones
|
||||
|
||||
## SteamVR settings
|
||||
|
||||
@@ -338,9 +353,11 @@ settings-general-fk_settings-arm_fk-description = Cambia cómo el movimiento de
|
||||
settings-general-fk_settings-arm_fk-force_arms = Forzar brazos desde el HMD
|
||||
settings-general-fk_settings-skeleton_settings = Ajustes de esqueleto
|
||||
settings-general-fk_settings-skeleton_settings-description = Habilita o deshabilita los ajustes de esqueleto. Es recomendado dejar estos ajustes habilitados.
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine = Extención de columna
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis = Extención de pelvis
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees = Extención de rodillas
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine_model = Modelo extendido de la columna
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis_model = Modelo extendido del pelvis
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees_model = Modelo extendido de la rodilla
|
||||
settings-general-fk_settings-self_localization-title = Modo mocap
|
||||
settings-general-fk_settings-self_localization-description = El modo mocap permite al esqueleto rastrear de forma aproximada su propia posición sin un casco o otros sensores. Nota que esto requiere que los trackers en el pie y cabeza estén y sigue siendo experimental.
|
||||
settings-general-fk_settings-vive_emulation-title = Vive emulation
|
||||
settings-general-fk_settings-vive_emulation-description = Emulate the waist tracker problems that Vive trackers have. This is a joke and makes tracking worse.
|
||||
settings-general-fk_settings-vive_emulation-label = Habilitar emulación de Vive
|
||||
@@ -357,6 +374,13 @@ settings-general-gesture_control-taps =
|
||||
[one] 1 toque
|
||||
*[other] { $amount } toques
|
||||
}
|
||||
# This is a unit: 3 trackers, 2 trackers, 1 tracker
|
||||
# $amount (Number) - Amount of trackers
|
||||
settings-general-gesture_control-trackers =
|
||||
{ $amount ->
|
||||
[one] 1 tracker
|
||||
*[other] { $amount } trackers
|
||||
}
|
||||
settings-general-gesture_control-yawResetEnabled = Activar toques para reinicio horizontal
|
||||
settings-general-gesture_control-yawResetDelay = Retraso del reinicio horizontal
|
||||
settings-general-gesture_control-yawResetTaps = Toques para reinicio horizontal
|
||||
@@ -366,13 +390,32 @@ settings-general-gesture_control-fullResetTaps = Toques para reinicio completo
|
||||
settings-general-gesture_control-mountingResetEnabled = Activar toques para reinicio de montura
|
||||
settings-general-gesture_control-mountingResetDelay = Retraso del reinicio de montura
|
||||
settings-general-gesture_control-mountingResetTaps = Toques para reinicio de montura
|
||||
# The number of trackers that can have higher acceleration before a tap is rejected
|
||||
settings-general-gesture_control-numberTrackersOverThreshold = Trackers sobre el límite
|
||||
settings-general-gesture_control-numberTrackersOverThreshold-description = Aumente este valor si la detección de toques no funciona. No lo aumente mas de lo necesario para que funciona ya que puede causar que la detección tenga más falsas positivas.
|
||||
|
||||
## Interface settings
|
||||
## Appearance settings
|
||||
|
||||
settings-general-interface = Interfaz
|
||||
settings-interface-appearance = Apariencia
|
||||
settings-general-interface-dev_mode = Modo desarrollador
|
||||
settings-general-interface-dev_mode-description = Este modo puede ser útil si es que necesitas información a fondo o para un nivel de interacción más avanzado con los sensores conectados.
|
||||
settings-general-interface-dev_mode-label = Modo desarrollador
|
||||
settings-general-interface-theme = Tema de color
|
||||
settings-general-interface-lang = Selecciona un idioma
|
||||
settings-general-interface-lang-description = Cambia el idioma que quieras usar.
|
||||
settings-general-interface-lang-placeholder = Selecciona el idioma a utilizar
|
||||
# Keep the font name untranslated
|
||||
settings-interface-appearance-font = Fuente de la interfaz
|
||||
settings-interface-appearance-font-description = Esto cambia el estilo de letra utilizado por la interfaz.
|
||||
settings-interface-appearance-font-placeholder = Fuente predeterminada
|
||||
settings-interface-appearance-font-os_font = Fuente del sistema operativo
|
||||
settings-interface-appearance-font-slime_font = Fuente predeterminada
|
||||
settings-interface-appearance-font_size = Tamaño base de la fuente
|
||||
settings-interface-appearance-font_size-description = Esto afecta al tamaño de las letras en toda la interfaz excepto en este panel de ajustes.
|
||||
|
||||
## Notification settings
|
||||
|
||||
settings-interface-notifications = Notificaciones
|
||||
settings-general-interface-serial_detection = Detección de dispositivo serial
|
||||
settings-general-interface-serial_detection-description = Esta opción mostrará un notificación cada vez que conectes un nuevo dispositivo serial que pueda ser un sensor. Ayuda a mejorar el proceso de configuración de un sensor.
|
||||
settings-general-interface-serial_detection-label = Detección de dispositivo serial
|
||||
@@ -380,10 +423,6 @@ settings-general-interface-feedback_sound = Sonido de feedback
|
||||
settings-general-interface-feedback_sound-description = Esta opción reproducirá un sonido cuando se realice un reinicio.
|
||||
settings-general-interface-feedback_sound-label = Sonido de feedback
|
||||
settings-general-interface-feedback_sound-volume = Volumen del sonido de feedback
|
||||
settings-general-interface-theme = Tema de color
|
||||
settings-general-interface-lang = Selecciona un idioma
|
||||
settings-general-interface-lang-description = Cambia el idioma que quieras usar.
|
||||
settings-general-interface-lang-placeholder = Selecciona el idioma a utilizar
|
||||
|
||||
## Serial settings
|
||||
|
||||
@@ -527,25 +566,25 @@ onboarding-wifi_creds-password =
|
||||
|
||||
onboarding-reset_tutorial-back = Volver a la calibración de montura
|
||||
onboarding-reset_tutorial = Reiniciar tutorial
|
||||
onboarding-reset_tutorial-description = Esta aún parte no está finalizada, por favor presione continuar
|
||||
onboarding-reset_tutorial-explanation = Mientras estés usando tus trackers, estos pueden empezar a desalinearse por el drift horizontal del IMU, o porque los moviste físicamente. Hay varias formas de arreglar este tipo de problemas.
|
||||
onboarding-reset_tutorial-skip = Saltar paso
|
||||
# Cares about multiline
|
||||
onboarding-reset_tutorial-0 =
|
||||
Toca { $taps } veces el tracker resaltado para activar el reinicio horizontal.
|
||||
|
||||
|
||||
Esto va a hacer que tus sensores miren para la misma dirección que tu HMD.
|
||||
# Cares about multiline
|
||||
onboarding-reset_tutorial-1 =
|
||||
Toca { $taps } veces el tracker resaltado para activar el reinicio completo.
|
||||
|
||||
|
||||
Se requiere que estas de forma parada (pose en i). Esto tiene un delay de 3 segundos (configurable) antes de que actualmente suceda.
|
||||
Esto reinicia completamente la posición y rotación de todos tus sensores, debería de arreglar la mayoría de tus problemas.
|
||||
# Cares about multiline
|
||||
onboarding-reset_tutorial-2 =
|
||||
Toca { $taps } veces el tracker resaltado para activar el reinicio de montura.
|
||||
|
||||
|
||||
El reinicio de montura ayuda en como tus sensores están puestos en tu cuerpo, ya que si los movistes o cambiaste para donde están orientados bastante, esto debería de ayudar.
|
||||
|
||||
|
||||
Requiere que estas en una pose como que estás esquiando, como se muestra en el tutorial de montura automática y tenes un retraso de 3 segundos (configurable) antes de que actualmente suceda.
|
||||
|
||||
## Setup start
|
||||
@@ -707,11 +746,11 @@ onboarding-choose_mounting = ¿Qué método de calibración de montura quiere us
|
||||
onboarding-choose_mounting-description = La orientación de montura corrige la colocación (o orientación) de los trackers en tu cuerpo.
|
||||
onboarding-choose_mounting-auto_mounting = Montura automática
|
||||
# Italized text
|
||||
onboarding-choose_mounting-auto_mounting-subtitle = Recomendado
|
||||
onboarding-choose_mounting-auto_mounting-label = Experimental
|
||||
onboarding-choose_mounting-auto_mounting-description = Esto detectará automáticamente las direcciones de montura para todos tus trackers a partir de 2 poses
|
||||
onboarding-choose_mounting-manual_mounting = Montura manual
|
||||
# Italized text
|
||||
onboarding-choose_mounting-manual_mounting-subtitle = Si sabes lo que estás haciendo
|
||||
onboarding-choose_mounting-manual_mounting-label = Recomendado
|
||||
onboarding-choose_mounting-manual_mounting-description = Esto te permitirá elegir la dirección de montura manualmente para cada tracker.
|
||||
|
||||
## Tracker manual mounting setup
|
||||
@@ -753,7 +792,9 @@ onboarding-choose_proportions-description =
|
||||
onboarding-choose_proportions-auto_proportions = Proporciones automáticas
|
||||
# Italized text
|
||||
onboarding-choose_proportions-auto_proportions-subtitle = Recomendado
|
||||
onboarding-choose_proportions-auto_proportions-description = Esto adivinará tus proporciones en base de muestras de tus movimientos y pasándola a través de un algoritmo.
|
||||
onboarding-choose_proportions-auto_proportions-descriptionv2 =
|
||||
Esto adivinará tus proporciones grabando una muestra de tus movimientos y pasándola por un algoritmo.
|
||||
<b>¡Esto requiere tener tu VR conectado a SlimeVR!</b>
|
||||
onboarding-choose_proportions-manual_proportions = Proporciones manuales
|
||||
# Italized text
|
||||
onboarding-choose_proportions-manual_proportions-subtitle = Para toques pequeños
|
||||
@@ -789,6 +830,18 @@ onboarding-automatic_proportions-requirements-description =
|
||||
Tus trackers y VR están funcionando correctamente con el servidor de SlimeVR.
|
||||
Tu VR está reportando datos posicionales al servidor de SlimeVR (esto generalmente implica que SteamVR esté corriendo y conectado a SlimeVR usando el driver de SlimeVR para SteamVR).
|
||||
onboarding-automatic_proportions-requirements-next = He leído los requisitos
|
||||
onboarding-automatic_proportions-check_height-title = Compruebe su altura
|
||||
onboarding-automatic_proportions-check_height-description = Utilizamos tu altura como base de nuestras mediciones utilizando la altura del VR como aproximación a tu altura real, ¡Pero es mejor que compruebes tú mismo si son correctas!
|
||||
# All the text is in bold!
|
||||
onboarding-automatic_proportions-check_height-calculation_warning = Por favor, pulse el botón mientras está <u>de pie</u> para calcular su altura. ¡Tienes unos 3 segundos después de pulsar el botón!
|
||||
onboarding-automatic_proportions-check_height-fetch_height = Estoy de pie
|
||||
# Context is that the height is unknown
|
||||
onboarding-automatic_proportions-check_height-unknown = Desconocida
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-height = Su altura es
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-hmd_height = Y la altura del VR es
|
||||
onboarding-automatic_proportions-check_height-next_step = Están bien
|
||||
onboarding-automatic_proportions-start_recording-title = Prepárate para moverte
|
||||
onboarding-automatic_proportions-start_recording-description = Ahora vamos a grabar poses y movimientos en específico. Estas serán mostradas en la siguiente ventana. ¡Prepárate para empezar cuando presiones el botón!
|
||||
onboarding-automatic_proportions-start_recording-next = Empezar grabación
|
||||
@@ -818,6 +871,10 @@ onboarding-automatic_proportions-verify_results-redo = Rehacer grabación
|
||||
onboarding-automatic_proportions-verify_results-confirm = Son correctos
|
||||
onboarding-automatic_proportions-done-title = Cuerpo medido y guardado.
|
||||
onboarding-automatic_proportions-done-description = ¡La calibración de tus proporciones corporales fue completada!
|
||||
onboarding-automatic_proportions-error_modal =
|
||||
<b>Atención:</b> ¡Se ha encontrado un error durante la estimación de sus proporciones!
|
||||
Por favor <docs>fijate la documentación</docs> o únete a nuestro <discord>Discord</discord> para obtener ayuda ^_^
|
||||
onboarding-automatic_proportions-error_modal-confirm = ¡Entendido!
|
||||
|
||||
## Home
|
||||
|
||||
|
||||
513
gui/public/i18n/es-ES/translation.ftl
Normal file
@@ -0,0 +1,513 @@
|
||||
# Please developers (not translators) don't reuse a key inside another key
|
||||
# or concat text with a translation string in the code, use the appropriate
|
||||
# features like variables and selectors in each appropriate case!
|
||||
# And also comment the string if it's something not easy to translate, so you help
|
||||
# translators on what it means
|
||||
|
||||
|
||||
## Websocket (server) status
|
||||
|
||||
websocket-connecting = Conectándose al servidor
|
||||
websocket-connection_lost = Conexión con el servidor perdida. Intentando reconectar...
|
||||
|
||||
## Update notification
|
||||
|
||||
version_update-title = Nueva versión disponible: { $version }
|
||||
version_update-description = Al hacer clic en "{ version_update-update }" se descargará el instalador de SlimeVR.
|
||||
version_update-update = Actualizar
|
||||
version_update-close = Cerrar
|
||||
|
||||
## Tips
|
||||
|
||||
tips-find_tracker = ¿No estás seguro de qué tracker es el correcto? Agitalo y se resaltará el tracker correspondiente.
|
||||
tips-do_not_move_heels = Asegúrate de no mover los talones durante el guardado de datos.
|
||||
tips-file_select = Arrastra y suelta los archivos para usarlos o <u>navega</u>.
|
||||
tips-tap_setup = Haz clic en el menú o golpea suavemente el tracker 2 veces para seleccionarlo automaticamente.
|
||||
|
||||
## Body parts
|
||||
|
||||
body_part-NONE = Sin asignar
|
||||
body_part-HEAD = Cabeza
|
||||
body_part-NECK = Cuello
|
||||
body_part-RIGHT_SHOULDER = Hombro derecho
|
||||
body_part-RIGHT_UPPER_ARM = Brazo derecho
|
||||
body_part-RIGHT_LOWER_ARM = Antebrazo derecho
|
||||
body_part-RIGHT_HAND = Mano derecha
|
||||
body_part-RIGHT_UPPER_LEG = Muslo derecho
|
||||
body_part-RIGHT_LOWER_LEG = Tobillo derecho
|
||||
body_part-RIGHT_FOOT = Pie derecho
|
||||
body_part-UPPER_CHEST = Abdomen superior
|
||||
body_part-CHEST = Pecho
|
||||
body_part-WAIST = Cintura
|
||||
body_part-HIP = Cadera
|
||||
body_part-LEFT_SHOULDER = Hombro izquierdo
|
||||
body_part-LEFT_UPPER_ARM = Brazo izquierdo
|
||||
body_part-LEFT_LOWER_ARM = Antebrazo izquierdo
|
||||
body_part-LEFT_HAND = Mano izquierda
|
||||
body_part-LEFT_UPPER_LEG = Muslo izquierdo
|
||||
body_part-LEFT_LOWER_LEG = Tobillo Izquierdo
|
||||
body_part-LEFT_FOOT = Pie izquierdo
|
||||
|
||||
## Proportions
|
||||
|
||||
skeleton_bone-NONE = Ninguno
|
||||
skeleton_bone-HEAD = Desplazamiento de la cabeza
|
||||
skeleton_bone-NECK = Longitud del cuello
|
||||
skeleton_bone-torso_group = Longitud del torso
|
||||
skeleton_bone-UPPER_CHEST = Longitud del torso superior
|
||||
skeleton_bone-CHEST_OFFSET = Compensacion del pecho
|
||||
skeleton_bone-CHEST = Longitud del pecho
|
||||
skeleton_bone-WAIST = Longitud de cintura
|
||||
skeleton_bone-HIP = Longitud de cadera
|
||||
skeleton_bone-HIP_OFFSET = Compensacion de cadera
|
||||
skeleton_bone-HIPS_WIDTH = Ancho de la Cadera
|
||||
skeleton_bone-leg_group = Largo de las piernas
|
||||
skeleton_bone-UPPER_LEG = Largo de la zona alta de las piernas
|
||||
skeleton_bone-LOWER_LEG = Largo de la zona baja de las piernas
|
||||
skeleton_bone-FOOT_LENGTH = Largo del pie
|
||||
skeleton_bone-FOOT_SHIFT = Desplazamiento del pie
|
||||
skeleton_bone-SKELETON_OFFSET = Compensacion del esqueleto
|
||||
skeleton_bone-SHOULDERS_DISTANCE = Distancia de los hombros
|
||||
skeleton_bone-SHOULDERS_WIDTH = Ancho de los hombros
|
||||
skeleton_bone-arm_group = Largo del brazo
|
||||
skeleton_bone-UPPER_ARM = Largo de la zona alta del brazo
|
||||
skeleton_bone-LOWER_ARM = Largo del antebrazo
|
||||
skeleton_bone-HAND_Y = Distancia de la mano Y
|
||||
skeleton_bone-HAND_Z = Distancia de la mano Z
|
||||
skeleton_bone-ELBOW_OFFSET = Compensacion de los codos
|
||||
|
||||
## Tracker reset buttons
|
||||
|
||||
reset-reset_all = Reiniciar todas las proporciones
|
||||
reset-full = Reiniciar
|
||||
reset-mounting = Reiniciar montura
|
||||
|
||||
## Serial detection stuff
|
||||
|
||||
serial_detection-new_device-p0 = ¡Nuevo dispositivo serial detectado!
|
||||
serial_detection-new_device-p1 = ¡Introduce las credenciales de tu red Wi-Fi!
|
||||
serial_detection-new_device-p2 = Por favor, selecciona lo que desea hacer con él
|
||||
serial_detection-open_wifi = Conectar a una red Wi-Fi
|
||||
serial_detection-open_serial = Abrir la consola serial
|
||||
serial_detection-submit = ¡Enviar!
|
||||
serial_detection-close = Cerrar
|
||||
|
||||
## Navigation bar
|
||||
|
||||
navbar-home = Inicio
|
||||
navbar-body_proportions = Proporciones corporales
|
||||
navbar-trackers_assign = Asignación de trackers
|
||||
navbar-mounting = Calibración de montura
|
||||
navbar-onboarding = Asistente de Configuración
|
||||
navbar-settings = Configuración
|
||||
|
||||
## Biovision hierarchy recording
|
||||
|
||||
bvh-start_recording = Grabar BVH
|
||||
bvh-recording = Grabando...
|
||||
|
||||
## Tracking pause
|
||||
|
||||
tracking-unpaused = Pausar tracking
|
||||
tracking-paused = Reanudar tracking
|
||||
|
||||
## Widget: Overlay settings
|
||||
|
||||
widget-overlay = Overlay
|
||||
widget-overlay-is_visible_label = Mostrar overlay en SteamVR
|
||||
widget-overlay-is_mirrored_label = Mostrar overlay como espejo
|
||||
|
||||
## Widget: Drift compensation
|
||||
|
||||
widget-drift_compensation-clear = Eliminar compensacion del drift
|
||||
|
||||
## Widget: Clear Reset Mounting
|
||||
|
||||
|
||||
## Widget: Developer settings
|
||||
|
||||
widget-developer_mode = Modo de desarrollador
|
||||
widget-developer_mode-high_contrast = Contraste alto
|
||||
widget-developer_mode-precise_rotation = Rotación precisa
|
||||
widget-developer_mode-filter_slimes_and_hmd = Filtrar Slimes y HMD
|
||||
widget-developer_mode-sort_by_name = Ordenar por nombre
|
||||
widget-developer_mode-raw_slime_rotation = Rotación sin filtrar
|
||||
widget-developer_mode-more_info = Más información
|
||||
|
||||
## Widget: IMU Visualizer
|
||||
|
||||
widget-imu_visualizer = Rotación
|
||||
widget-imu_visualizer-rotation_raw = Sin filtrar
|
||||
widget-imu_visualizer-rotation_preview = Previsualización
|
||||
widget-imu_visualizer-rotation_hide = Ocultar
|
||||
|
||||
## Tracker status
|
||||
|
||||
tracker-status-none = Sin estatus
|
||||
tracker-status-busy = Ocupado
|
||||
tracker-status-error = Error
|
||||
tracker-status-disconnected = Desconectado
|
||||
tracker-status-occluded = Ocluída
|
||||
tracker-status-ok = Ok
|
||||
|
||||
## Tracker status columns
|
||||
|
||||
tracker-table-column-name = Nombre
|
||||
tracker-table-column-type = Tipo
|
||||
tracker-table-column-battery = Batería
|
||||
tracker-table-column-ping = Ping
|
||||
tracker-table-column-tps = TPS
|
||||
tracker-table-column-temperature = Temperatura °C
|
||||
tracker-table-column-linear-acceleration = Aceleración X/Y/Z
|
||||
tracker-table-column-rotation = Rotación X/Y/Z
|
||||
tracker-table-column-position = Posición X/Y/Z
|
||||
tracker-table-column-url = URL
|
||||
|
||||
## Tracker rotation
|
||||
|
||||
tracker-rotation-front = Frontal
|
||||
tracker-rotation-front_left = Frontal-Izquierdo
|
||||
tracker-rotation-front_right = Frontal-Derecho
|
||||
tracker-rotation-left = Izquierda
|
||||
tracker-rotation-right = Derecha
|
||||
tracker-rotation-back = Trasero
|
||||
tracker-rotation-back_left = Trasero-Izquierdo
|
||||
tracker-rotation-back_right = Trasero-Derecho
|
||||
tracker-rotation-custom = Personalizado
|
||||
|
||||
## Tracker information
|
||||
|
||||
tracker-infos-manufacturer = Fabricante
|
||||
tracker-infos-display_name = Nombre visible
|
||||
tracker-infos-custom_name = Nombre personalizado
|
||||
tracker-infos-url = URL del Tracker
|
||||
tracker-infos-version = Versión del firmware
|
||||
tracker-infos-hardware_rev = Revisión del hardware
|
||||
tracker-infos-hardware_identifier = ID de hardware
|
||||
tracker-infos-imu = Sensor IMU
|
||||
tracker-infos-board_type = Placa principal
|
||||
|
||||
## Tracker settings
|
||||
|
||||
tracker-settings-back = Volver a la lista de trackers
|
||||
tracker-settings-title = Configuración de los trackers
|
||||
tracker-settings-assignment_section = Asignación
|
||||
tracker-settings-assignment_section-description = Parte del cuerpo que tiene el tracker asignado.
|
||||
tracker-settings-assignment_section-edit = Editar asignación
|
||||
tracker-settings-mounting_section = Posición de montura
|
||||
tracker-settings-mounting_section-description = ¿Donde está montado el tracker?
|
||||
tracker-settings-mounting_section-edit = Editar montura
|
||||
tracker-settings-drift_compensation_section = Permitir compensación de drift
|
||||
tracker-settings-drift_compensation_section-description = ¿Debería este tracker compensar el drifteo cuando la compensación de drifteo está activada?
|
||||
tracker-settings-drift_compensation_section-edit = Permitir compensación de drift
|
||||
# The .<name> means it's an attribute and it's related to the top key.
|
||||
# In this case that is the settings for the assignment section.
|
||||
tracker-settings-name_section = Nombre del tracker
|
||||
tracker-settings-name_section-description = Dale un sobrenombre lindo :)
|
||||
tracker-settings-name_section-placeholder = Pata izquierda del Eevee
|
||||
|
||||
## Tracker part card info
|
||||
|
||||
tracker-part_card-no_name = Sin nombre
|
||||
tracker-part_card-unassigned = Sin asignar
|
||||
|
||||
## Body assignment menu
|
||||
|
||||
body_assignment_menu = ¿Donde quieres que esté este tracker?
|
||||
body_assignment_menu-description = Elige una ubicación donde desees asignar este tracker. También puedes administrar todos los trackers a la vez en lugar de uno por uno.
|
||||
body_assignment_menu-show_advanced_locations = Mostrar asignación de extremidades avanzada
|
||||
body_assignment_menu-manage_trackers = Administrar todos los trackers
|
||||
body_assignment_menu-unassign_tracker = Desasignar tracker
|
||||
|
||||
## Tracker assignment menu
|
||||
|
||||
# A -translation_key (with a dash in the front) means that it's a label.
|
||||
# It can only be used in the translation file, it's nice for reusing names and that kind of stuff.
|
||||
#
|
||||
# We are using it here because english doesn't require changing the text in each case but
|
||||
# maybe your language does.
|
||||
-tracker_selection-part = ¿Que tracker asignar a tu
|
||||
tracker_selection_menu-NONE = ¿Qué tracker deseas desasignar?
|
||||
tracker_selection_menu-HEAD = { -tracker_selection-part } cabeza?
|
||||
tracker_selection_menu-NECK = { -tracker_selection-part } cuello?
|
||||
tracker_selection_menu-RIGHT_SHOULDER = { -tracker_selection-part } hombro derecho?
|
||||
tracker_selection_menu-RIGHT_UPPER_ARM = { -tracker_selection-part } brazo derecho?
|
||||
tracker_selection_menu-RIGHT_LOWER_ARM = { -tracker_selection-part } antebrazo derecho?
|
||||
tracker_selection_menu-RIGHT_HAND = { -tracker_selection-part } mano derecha?
|
||||
tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } muslo derecho?
|
||||
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } tobillo derecho?
|
||||
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } pie derecho?
|
||||
tracker_selection_menu-CHEST = { -tracker_selection-part } pecho?
|
||||
tracker_selection_menu-WAIST = { -tracker_selection-part } cintura?
|
||||
tracker_selection_menu-HIP = { -tracker_selection-part } cadera?
|
||||
tracker_selection_menu-LEFT_SHOULDER = { -tracker_selection-part } hombro izquierdo?
|
||||
tracker_selection_menu-LEFT_UPPER_ARM = { -tracker_selection-part } brazo izquierdo?
|
||||
tracker_selection_menu-LEFT_LOWER_ARM = { -tracker_selection-part } antebrazo izquierdo?
|
||||
tracker_selection_menu-LEFT_HAND = { -tracker_selection-part } mano izquierda?
|
||||
tracker_selection_menu-LEFT_UPPER_LEG = { -tracker_selection-part } muslo izquierdo?
|
||||
tracker_selection_menu-LEFT_LOWER_LEG = { -tracker_selection-part } tobillo izquierdo?
|
||||
tracker_selection_menu-LEFT_FOOT = { -tracker_selection-part } pie izquierdo?
|
||||
tracker_selection_menu-unassigned = Trackers sin asignar
|
||||
tracker_selection_menu-assigned = Trackers asignados
|
||||
tracker_selection_menu-dont_assign = No asignar
|
||||
# This line cares about multilines.
|
||||
# <b>text</b> means that the text should be bold.
|
||||
tracker_selection_menu-neck_warning =
|
||||
<b>Advertencia:</b> Un tracker en el cuello puede ser mortal si está ajustado demasiado fuerte,
|
||||
la correa podría cortar la circulación a tu cabeza!
|
||||
tracker_selection_menu-neck_warning-done = Entiendo los riesgos
|
||||
tracker_selection_menu-neck_warning-cancel = Cancelar
|
||||
|
||||
## Mounting menu
|
||||
|
||||
mounting_selection_menu = ¿Dónde quieres que esté este tracker?
|
||||
mounting_selection_menu-close = Cerrar
|
||||
|
||||
## Sidebar settings
|
||||
|
||||
settings-sidebar-title = Configuración
|
||||
settings-sidebar-general = General
|
||||
settings-sidebar-tracker_mechanics = Mecánicas del tracker
|
||||
settings-sidebar-fk_settings = Configuración del tracking
|
||||
settings-sidebar-gesture_control = Control de los gestos
|
||||
settings-sidebar-interface = Interfaz
|
||||
settings-sidebar-osc_router = Router OSC
|
||||
settings-sidebar-utils = Utilidades
|
||||
settings-sidebar-serial = Consola serial
|
||||
|
||||
## SteamVR settings
|
||||
|
||||
settings-general-steamvr = SteamVR
|
||||
settings-general-steamvr-subtitle = Trackers de SteamVR
|
||||
# Not all translation keys support multiline, only the ones that specify it will actually
|
||||
# split it in lines (that also means you can split in lines however you want in those).
|
||||
# The first spaces (not tabs) for indentation will be ignored, just to make the file look nice when writing.
|
||||
# This one is one of this cases that cares about multilines
|
||||
settings-general-steamvr-description =
|
||||
Activa o desactiva trackers específicos de SteamVR.
|
||||
Útil para juegos o aplicaciones que solo soportan ciertos trackers.
|
||||
settings-general-steamvr-trackers-waist = Cintura
|
||||
settings-general-steamvr-trackers-chest = Pecho
|
||||
settings-general-steamvr-trackers-feet = Pies
|
||||
settings-general-steamvr-trackers-knees = Rodillas
|
||||
settings-general-steamvr-trackers-elbows = Codos
|
||||
settings-general-steamvr-trackers-hands = Manos
|
||||
|
||||
## Tracker mechanics
|
||||
|
||||
settings-general-tracker_mechanics = Mecánicas del tracker
|
||||
settings-general-tracker_mechanics-filtering = Filtro
|
||||
# This also cares about multilines
|
||||
settings-general-tracker_mechanics-filtering-description =
|
||||
Escoge el tipo de filtro para tus trackers.
|
||||
Predicción predice el movimiento mientras que Suavizado suaviza el movimiento.
|
||||
settings-general-tracker_mechanics-filtering-type = Tipo de filtro
|
||||
settings-general-tracker_mechanics-filtering-type-none = Sin filtrar
|
||||
settings-general-tracker_mechanics-filtering-type-none-description = Usa las rotaciones tal como son. No hará ningún filtrado.
|
||||
settings-general-tracker_mechanics-filtering-type-smoothing = Suavizado
|
||||
settings-general-tracker_mechanics-filtering-type-smoothing-description = Suaviza los movimientos pero añade algo de latencia.
|
||||
settings-general-tracker_mechanics-filtering-type-prediction = Predicción
|
||||
settings-general-tracker_mechanics-filtering-type-prediction-description = Reduce la latencia y hace que los movimientos sean mas inmediatos, pero puede aumentar la fluctuación.
|
||||
settings-general-tracker_mechanics-filtering-amount = Cantidad
|
||||
settings-general-tracker_mechanics-drift_compensation = Compensación en la desviación
|
||||
settings-general-tracker_mechanics-drift_compensation-enabled-label = Compensación en la desviación
|
||||
settings-general-tracker_mechanics-drift_compensation-amount-label = Cantidad de compensación
|
||||
|
||||
## FK/Tracking settings
|
||||
|
||||
settings-general-fk_settings = Configuración de FK Tracking
|
||||
# Floor clip:
|
||||
# why the name - came from the idea of noclip in video games, but is the opposite where clipping to the floor is a desired feature
|
||||
# definition - Prevents the foot trackers from going lower than they where when a reset was performed
|
||||
settings-general-fk_settings-leg_tweak-floor_clip = Floor clip
|
||||
# Skating correction:
|
||||
# why the name - without this enabled the feet will often slide across the ground as if your skating across the ground,
|
||||
# since this largely prevents this it corrects for it hence skating correction (note this may be renamed to sliding correction)
|
||||
# definition - Guesses when each foot is in contact with the ground and uses that information to improve tracking
|
||||
settings-general-fk_settings-leg_tweak-skating_correction = Corrección del patinaje
|
||||
settings-general-fk_settings-leg_tweak-skating_correction-amount = Intensidad de la corrección del patinaje
|
||||
settings-general-fk_settings-leg_fk = Tracking de piernas
|
||||
settings-general-fk_settings-arm_fk = Tracking de brazos
|
||||
settings-general-fk_settings-arm_fk-description = Forzar el seguimiento de los brazos desde el HMD incluso si hay datos de posición de la mano disponibles.
|
||||
settings-general-fk_settings-arm_fk-force_arms = Forzar brazos desde el HMD
|
||||
settings-general-fk_settings-skeleton_settings-description = Activa o desactiva la configuración del esqueleto. Se recomienda dejar esta opción activada.
|
||||
settings-general-fk_settings-vive_emulation-title = Emulación Vive
|
||||
settings-general-fk_settings-vive_emulation-description = Emula los problemas de cintura que lo Vive trackers producen. Es una broma y produce peor tracking.
|
||||
settings-general-fk_settings-vive_emulation-label = Habilitar emulación Vive
|
||||
|
||||
## Gesture control settings (tracker tapping)
|
||||
|
||||
settings-general-gesture_control = Control de gestos
|
||||
settings-general-gesture_control-subtitle = Reinicio basado en toques
|
||||
|
||||
## Appearance settings
|
||||
|
||||
settings-general-interface-dev_mode = Modo de desarrollador
|
||||
settings-general-interface-dev_mode-label = Modo de desarrollador
|
||||
settings-general-interface-theme = Temas
|
||||
settings-general-interface-lang = Seleccionar idioma
|
||||
settings-general-interface-lang-description = Cambiar el idioma predeterminado que deseas utilizar.
|
||||
settings-general-interface-lang-placeholder = Seleccionar el idioma que desea utilizar
|
||||
|
||||
## Notification settings
|
||||
|
||||
settings-general-interface-serial_detection = Detección de dispositivos seriales
|
||||
settings-general-interface-serial_detection-label = Detección de dispositivos seriales
|
||||
|
||||
## Serial settings
|
||||
|
||||
settings-serial = Consola serial
|
||||
settings-serial-connection_lost = Conexión a puerto serial perdida, Reconectando...
|
||||
settings-serial-reboot = Reiniciar
|
||||
settings-serial-factory_reset = Restablecimiento de fábrica
|
||||
settings-serial-factory_reset-warning-ok = Sé lo que estoy haciendo
|
||||
settings-serial-factory_reset-warning-cancel = Cancelar
|
||||
settings-serial-get_infos = Obtener información
|
||||
settings-serial-serial_select = Selecciona un puerto serial
|
||||
settings-serial-auto_dropdown_item = Automático
|
||||
|
||||
## OSC router settings
|
||||
|
||||
settings-osc-router-enable = Habilitar
|
||||
settings-osc-router-enable-label = Habilitar
|
||||
settings-osc-router-network = Puertos de red
|
||||
settings-osc-router-network-address = Dirección de red
|
||||
settings-osc-router-network-address-placeholder = Dirección IPV4
|
||||
|
||||
## OSC VRChat settings
|
||||
|
||||
settings-osc-vrchat-enable = Habilitar
|
||||
settings-osc-vrchat-enable-label = Habilitar
|
||||
settings-osc-vrchat-network = Puertos de red
|
||||
settings-osc-vrchat-network-address = Dirección de red
|
||||
settings-osc-vrchat-network-trackers = Trackers
|
||||
settings-osc-vrchat-network-trackers-chest = Pecho
|
||||
settings-osc-vrchat-network-trackers-hip = Cadera
|
||||
settings-osc-vrchat-network-trackers-knees = Rodillas
|
||||
settings-osc-vrchat-network-trackers-feet = Pies
|
||||
|
||||
## VMC OSC settings
|
||||
|
||||
settings-osc-vmc-enable = Habilitar
|
||||
settings-osc-vmc-enable-label = Habilitar
|
||||
settings-osc-vmc-network = Puertos de red
|
||||
settings-osc-vmc-network-address = Dirección de red
|
||||
settings-osc-vmc-network-address-placeholder = Dirección IPV4
|
||||
settings-osc-vmc-vrm-model_unloaded = No hay modelo cargado
|
||||
settings-osc-vmc-anchor_hip = Anclar a la cadera
|
||||
settings-osc-vmc-anchor_hip-label = Anclar a la cadera
|
||||
|
||||
## Setup/onboarding menu
|
||||
|
||||
onboarding-skip = Omitir configuración
|
||||
onboarding-continue = Continuar
|
||||
onboarding-previous_step = Paso anterior
|
||||
onboarding-setup_warning-skip = Omitir configuración
|
||||
onboarding-setup_warning-cancel = Continuar con la configuración
|
||||
|
||||
## Wi-Fi setup
|
||||
|
||||
onboarding-wifi_creds-back = Volver a la introducción
|
||||
onboarding-wifi_creds-skip = Omitir configuración Wi-Fi
|
||||
onboarding-wifi_creds-submit = ¡Enviar!
|
||||
|
||||
## Mounting setup
|
||||
|
||||
onboarding-reset_tutorial = Tutorial para resetteo de trackers
|
||||
onboarding-reset_tutorial-skip = Omitir paso
|
||||
|
||||
## Setup start
|
||||
|
||||
onboarding-home = Bienvenido a SlimeVR
|
||||
onboarding-home-start = ¡Vamos a prepararnos!
|
||||
|
||||
## Enter VR part of setup
|
||||
|
||||
onboarding-enter_vr-title = ¡Hora de entrar en VR!
|
||||
onboarding-enter_vr-ready = Estoy listo
|
||||
|
||||
## Setup done
|
||||
|
||||
onboarding-done-title = ¡Todo listo!
|
||||
onboarding-done-close = Cerrar configuración
|
||||
|
||||
## Tracker connection setup
|
||||
|
||||
onboarding-connect_tracker-title = Conectar trackers
|
||||
onboarding-connect_tracker-description-p0 = ¡Ahora a la parte divertida, conectando todos los trackers!
|
||||
onboarding-connect_tracker-issue-serial = ¡Tengo problemas para conectarme!
|
||||
onboarding-connect_tracker-connection_status-none = Buscando trackers
|
||||
onboarding-connect_tracker-connection_status-serial_init = Conectándose al dispositivo serial
|
||||
onboarding-connect_tracker-connection_status-provisioning = Enviando credenciales Wi-Fi
|
||||
onboarding-connect_tracker-connection_status-connecting = Intentando conectarse a una red Wi-Fi
|
||||
onboarding-connect_tracker-connection_status-looking_for_server = Buscando servidor
|
||||
onboarding-connect_tracker-connection_status-could_not_find_server = No se pudo encontrar el servidor
|
||||
|
||||
## Tracker calibration tutorial
|
||||
|
||||
onboarding-calibration_tutorial = Tutorial de calibración de IMU
|
||||
onboarding-calibration_tutorial-subtitle = ¡Esto ayudará a reducir el drift de los trackers!
|
||||
onboarding-calibration_tutorial-calibrate = Mis trackers estan en una superficie plana
|
||||
onboarding-calibration_tutorial-status-calibrating = Calibrando
|
||||
onboarding-calibration_tutorial-status-success = ¡Bien!
|
||||
onboarding-calibration_tutorial-status-error = El tracker se ha movido
|
||||
|
||||
## Tracker assignment tutorial
|
||||
|
||||
# This text has a character limit of around 11 characters, so please keep it short
|
||||
onboarding-assignment_tutorial-sticker = Sticker
|
||||
|
||||
## Tracker assignment setup
|
||||
|
||||
onboarding-assign_trackers-title = Asignar trackers
|
||||
onboarding-assign_trackers-advanced = Mostrar ubicaciones de asignación avanzadas
|
||||
onboarding-assign_trackers-next = He asignado todos los trackers
|
||||
|
||||
## Tracker assignment warnings
|
||||
|
||||
|
||||
## Tracker mounting method choose
|
||||
|
||||
# Italized text
|
||||
onboarding-choose_mounting-auto_mounting-label = Experimental
|
||||
# Italized text
|
||||
onboarding-choose_mounting-manual_mounting-label = Recomendado
|
||||
|
||||
## Tracker manual mounting setup
|
||||
|
||||
onboarding-manual_mounting-next = Siguiente paso
|
||||
|
||||
## Tracker automatic mounting setup
|
||||
|
||||
onboarding-automatic_mounting-next = Siguiente paso
|
||||
onboarding-automatic_mounting-prev_step = Paso anterior
|
||||
onboarding-automatic_mounting-done-restart = Volver a intentarlo
|
||||
onboarding-automatic_mounting-preparation-title = Preparación
|
||||
|
||||
## Tracker proportions method choose
|
||||
|
||||
onboarding-choose_proportions-auto_proportions = Proporciones automáticas
|
||||
# Italized text
|
||||
onboarding-choose_proportions-auto_proportions-subtitle = Recomendado
|
||||
onboarding-choose_proportions-manual_proportions = Proporciones manuales
|
||||
onboarding-choose_proportions-export = Exportar proporciones
|
||||
|
||||
## Tracker manual proportions setup
|
||||
|
||||
onboarding-manual_proportions-auto = Proporciones automáticas
|
||||
|
||||
## Tracker automatic proportions setup
|
||||
|
||||
onboarding-automatic_proportions-prev_step = Paso anterior
|
||||
onboarding-automatic_proportions-requirements-title = Requisitos
|
||||
onboarding-automatic_proportions-requirements-next = He leído los requisitos
|
||||
onboarding-automatic_proportions-recording-title = REC
|
||||
onboarding-automatic_proportions-recording-processing = Procesando los resultados
|
||||
onboarding-automatic_proportions-verify_results-title = Verificar resultados
|
||||
onboarding-automatic_proportions-verify_results-processing = Procesando los resultados
|
||||
|
||||
## Home
|
||||
|
||||
|
||||
## Status system
|
||||
|
||||
@@ -36,6 +36,7 @@ body_part-RIGHT_HAND = Main droite
|
||||
body_part-RIGHT_UPPER_LEG = Cuisse droite
|
||||
body_part-RIGHT_LOWER_LEG = Cheville droite
|
||||
body_part-RIGHT_FOOT = Pied droit
|
||||
body_part-UPPER_CHEST = Poitrine supérieure
|
||||
body_part-CHEST = Poitrine
|
||||
body_part-WAIST = Taille
|
||||
body_part-HIP = Hanche
|
||||
@@ -53,8 +54,9 @@ skeleton_bone-NONE = Aucun
|
||||
skeleton_bone-HEAD = Décalage de la tête
|
||||
skeleton_bone-NECK = Longueur du cou
|
||||
skeleton_bone-torso_group = Longueur du torse
|
||||
skeleton_bone-CHEST = Longueur de la poitrine
|
||||
skeleton_bone-UPPER_CHEST = Longueur de la poitrine supérieure
|
||||
skeleton_bone-CHEST_OFFSET = Décalage de la poitrine
|
||||
skeleton_bone-CHEST = Longueur de la poitrine
|
||||
skeleton_bone-WAIST = Longueur de la taille
|
||||
skeleton_bone-HIP = Longueur des hanches
|
||||
skeleton_bone-HIP_OFFSET = Décalage de la hanche
|
||||
@@ -120,6 +122,10 @@ widget-overlay-is_mirrored_label = Afficher le squelette en tant que miroir
|
||||
|
||||
widget-drift_compensation-clear = Réinitialiser la compensation de la dérive
|
||||
|
||||
## Widget: Clear Reset Mounting
|
||||
|
||||
widget-clear_mounting = Mettre à zéro la réinitialisation de l'alignement
|
||||
|
||||
## Widget: Developer settings
|
||||
|
||||
widget-developer_mode = Mode développeur
|
||||
@@ -163,9 +169,15 @@ tracker-table-column-url = URL
|
||||
## Tracker rotation
|
||||
|
||||
tracker-rotation-front = Avant
|
||||
tracker-rotation-front_left = Avant-Gauche
|
||||
tracker-rotation-front_right = Avant-Droite
|
||||
tracker-rotation-left = Gauche
|
||||
tracker-rotation-right = Droite
|
||||
tracker-rotation-back = Arrière
|
||||
tracker-rotation-back_left = Arrière-Gauche
|
||||
tracker-rotation-back_right = Arrière-Droite
|
||||
tracker-rotation-custom = Personnalisé
|
||||
tracker-rotation-overriden = (remplacé par la réinitialisation du montage)
|
||||
|
||||
## Tracker information
|
||||
|
||||
@@ -230,6 +242,7 @@ tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } cuisse droi
|
||||
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } cheville droite ?
|
||||
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } pied droit ?
|
||||
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } manette droite ?
|
||||
tracker_selection_menu-UPPER_CHEST = { -tracker_selection-part } poitrine supérieure ?
|
||||
tracker_selection_menu-CHEST = { -tracker_selection-part } poitrine ?
|
||||
tracker_selection_menu-WAIST = { -tracker_selection-part } taille ?
|
||||
tracker_selection_menu-HIP = { -tracker_selection-part } hanche ?
|
||||
@@ -269,6 +282,8 @@ settings-sidebar-osc_router = Routeur OSC
|
||||
settings-sidebar-osc_trackers = Capteurs OSC VRChat
|
||||
settings-sidebar-utils = Utilitaires
|
||||
settings-sidebar-serial = Console série
|
||||
settings-sidebar-appearance = Apparence
|
||||
settings-sidebar-notifications = Notifications
|
||||
|
||||
## SteamVR settings
|
||||
|
||||
@@ -336,11 +351,21 @@ settings-general-fk_settings-leg_fk = Capture des jambes
|
||||
settings-general-fk_settings-arm_fk = Capture des bras
|
||||
settings-general-fk_settings-arm_fk-description = Changez la façon dont les bras sont captés.
|
||||
settings-general-fk_settings-arm_fk-force_arms = Forcer les bras en provenance du casque VR
|
||||
settings-general-fk_settings-skeleton_settings = Paramètres du squelette
|
||||
settings-general-fk_settings-skeleton_settings-toggles = Bascules du squelette
|
||||
settings-general-fk_settings-skeleton_settings-description = Activez ou désactivez des paramètres avancés de capture.
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine = Colone vertébrale avancée
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis = Bassin avancé
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees = Genoux avancés
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine_model = Modèle de colonne vertébrale avancé
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis_model = Modèle de bassin avancé
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees_model = Modèle de genou avancé
|
||||
settings-general-fk_settings-skeleton_settings-ratios = Ratios du squelette
|
||||
settings-general-fk_settings-skeleton_settings-ratios-description = Modifiez les valeurs des paramètres du squelette. Vous devrez peut-être ajuster vos proportions après les avoir modifiées.
|
||||
settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_hip = Interpoler la taille de la poitrine à la hanche
|
||||
settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_legs = Interpoler la taille de la poitrine aux jambes
|
||||
settings-general-fk_settings-skeleton_settings-impute_hip_from_chest_legs = Interpoler la hanche de la poitrine aux jambes
|
||||
settings-general-fk_settings-skeleton_settings-impute_hip_from_waist_legs = Interpoler la hanche de la taille aux jambes
|
||||
settings-general-fk_settings-skeleton_settings-interp_hip_legs = Interpoler la rotation horizontale et de torsion de la hanche avec celle des jambes
|
||||
settings-general-fk_settings-skeleton_settings-interp_knee_tracker_ankle = Interpoler les rotations horizontales et de torsion des capteurs de genoux avec celles des chevilles
|
||||
settings-general-fk_settings-self_localization-title = Mode Mocap
|
||||
settings-general-fk_settings-self_localization-description = Le mode Mocap permet au squelette de suivre grossièrement sa propre position sans casque ou autres capteurs. Ce mode nécessite des capteurs de pieds et de tête afin de fonctionner et est encore expérimental.
|
||||
settings-general-fk_settings-vive_emulation-title = Émulation Vive
|
||||
settings-general-fk_settings-vive_emulation-description = Simule les problèmes des capteurs de taille que capteurs Vive ont. Cette optionest une blague et rend la capture des mouvements pire.
|
||||
settings-general-fk_settings-vive_emulation-label = Activer l'émulation Vive
|
||||
@@ -357,6 +382,13 @@ settings-general-gesture_control-taps =
|
||||
[one] 1 tap
|
||||
*[other] { $amount } taps
|
||||
}
|
||||
# This is a unit: 3 trackers, 2 trackers, 1 tracker
|
||||
# $amount (Number) - Amount of trackers
|
||||
settings-general-gesture_control-trackers =
|
||||
{ $amount ->
|
||||
[one] 1 capteur
|
||||
*[other] { $amount } capteurs
|
||||
}
|
||||
settings-general-gesture_control-yawResetEnabled = Tapoter pour réinitialisation horizontale
|
||||
settings-general-gesture_control-yawResetDelay = Délai de réinitialisation horizontale
|
||||
settings-general-gesture_control-yawResetTaps = Nombre de tapes pour réinitialisation horizontale
|
||||
@@ -366,24 +398,39 @@ settings-general-gesture_control-fullResetTaps = Nombre de tapes pour réinitial
|
||||
settings-general-gesture_control-mountingResetEnabled = Tapoter pour réinitialisation de l'alignement
|
||||
settings-general-gesture_control-mountingResetDelay = Délai de réinitialisation de l'alignement
|
||||
settings-general-gesture_control-mountingResetTaps = Nombre de tapes pour la réinitialisation de l'alignement
|
||||
# The number of trackers that can have higher acceleration before a tap is rejected
|
||||
settings-general-gesture_control-numberTrackersOverThreshold = Capteurs au-dessus du seuil
|
||||
settings-general-gesture_control-numberTrackersOverThreshold-description = Augmentez cette valeur si la détection des tapotements ne fonctionne pas. N'augmentez pas cette valeur au-delà de ce qui est nécessaire pour que la détection des tapotements fonctionne, car cela pourrait entraîner des faux positifs.
|
||||
|
||||
## Interface settings
|
||||
## Appearance settings
|
||||
|
||||
settings-general-interface = Interface
|
||||
settings-interface-appearance = Apparence
|
||||
settings-general-interface-dev_mode = Mode développeur
|
||||
settings-general-interface-dev_mode-description = Ce mode peut être utile pour avoir des données approfondies ou pour interagir avec des capteurs connectés à un niveau plus avancé.
|
||||
settings-general-interface-dev_mode-label = Mode développeur
|
||||
settings-general-interface-serial_detection = Détection de périphérique série
|
||||
settings-general-interface-serial_detection-description = Cette option affichera une fenêtre chaque fois qu'un nouveau périphérique série qui pourrait être un capteur est connecté.
|
||||
settings-general-interface-serial_detection-label = Détection de périphérique série
|
||||
settings-general-interface-feedback_sound = Son de retour
|
||||
settings-general-interface-feedback_sound-description = Cette option va jouer un son lorsqu'une réanitilisation est enclenchée
|
||||
settings-general-interface-feedback_sound-label = Son de retour
|
||||
settings-general-interface-feedback_sound-volume = Volume du son de retour
|
||||
settings-general-interface-theme = Thème
|
||||
settings-general-interface-lang = Langue
|
||||
settings-general-interface-lang-description = Choisir la langue par défaut.
|
||||
settings-general-interface-lang-placeholder = Langue
|
||||
# Keep the font name untranslated
|
||||
settings-interface-appearance-font = Police de l'interface
|
||||
settings-interface-appearance-font-description = Cela change la police d'écriture utilisée par l'interface.
|
||||
settings-interface-appearance-font-placeholder = Police par défaut
|
||||
settings-interface-appearance-font-os_font = Police du système d’exploitation
|
||||
settings-interface-appearance-font-slime_font = Police par défaut
|
||||
settings-interface-appearance-font_size = Agrandissement du texte
|
||||
settings-interface-appearance-font_size-description = Cela affecte la taille du texte de toute l'interface, sauf de ce menu.
|
||||
|
||||
## Notification settings
|
||||
|
||||
settings-interface-notifications = Notifications
|
||||
settings-general-interface-serial_detection = Détection de périphérique série
|
||||
settings-general-interface-serial_detection-description = Cette option affichera une fenêtre chaque fois qu'un nouveau périphérique série qui pourrait être un capteur est connecté.
|
||||
settings-general-interface-serial_detection-label = Détection de périphérique série
|
||||
settings-general-interface-feedback_sound = Son de retour
|
||||
settings-general-interface-feedback_sound-description = Cette option va jouer un son lorsqu'une réanitilisation est enclenchée.
|
||||
settings-general-interface-feedback_sound-label = Son de retour
|
||||
settings-general-interface-feedback_sound-volume = Volume du son de retour
|
||||
|
||||
## Serial settings
|
||||
|
||||
@@ -753,7 +800,10 @@ onboarding-choose_proportions-description =
|
||||
onboarding-choose_proportions-auto_proportions = Proportions automatiques
|
||||
# Italized text
|
||||
onboarding-choose_proportions-auto_proportions-subtitle = Recommendée
|
||||
onboarding-choose_proportions-auto_proportions-description = Ceci estimera vos proportions en enregistrant un extrait de vos mouvements et en le faisant traiter par un algorithme
|
||||
onboarding-choose_proportions-auto_proportions-descriptionv2 =
|
||||
Cela permettra d'estimer vos proportions en enregistrant un échantillon de vos mouvements et en le faisant passer par un algorithme.
|
||||
|
||||
<b>Cela nécessite d’avoir votre casque VR connecté à SlimeVR !</b>
|
||||
onboarding-choose_proportions-manual_proportions = Proportions manuelles
|
||||
# Italized text
|
||||
onboarding-choose_proportions-manual_proportions-subtitle = Pour les retouches
|
||||
@@ -789,6 +839,18 @@ onboarding-automatic_proportions-requirements-description =
|
||||
Vos capteurs et votre casque VR fonctionnent correctement au sein du serveur SlimeVR.
|
||||
Votre casque envoie sa position au serveur SlimeVR (cela signifie généralement que SteamVR est ouvert et connecté à SlimeVR en utilisant le driver SteamVR de SlimeVR).
|
||||
onboarding-automatic_proportions-requirements-next = J'ai lu les exigences
|
||||
onboarding-automatic_proportions-check_height-title = Vérifiez votre taille
|
||||
onboarding-automatic_proportions-check_height-description = Nous utilisons votre taille comme la base de nos mesures en utilisant la hauteur de votre casque comme approximation de votre taille réelle, mais il est préférable de vérifier si elles sont correctes vous-même !
|
||||
# All the text is in bold!
|
||||
onboarding-automatic_proportions-check_height-calculation_warning = Veuillez appuyer sur le bouton en vous <u>tenant debout</u> pour calculer votre taille. Vous avez un délais de 3 secondes après avoir appuyé sur le bouton !
|
||||
onboarding-automatic_proportions-check_height-fetch_height = Je suis debout !
|
||||
# Context is that the height is unknown
|
||||
onboarding-automatic_proportions-check_height-unknown = Inconnu
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-hmd_height1 = La hauteur de votre casque est
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-height1 = donc votre taille est
|
||||
onboarding-automatic_proportions-check_height-next_step = Ils sont bons
|
||||
onboarding-automatic_proportions-start_recording-title = Préparez-vous à bouger
|
||||
onboarding-automatic_proportions-start_recording-description = Nous allons maintenant enregistrer quelques positions et mouvements spécifiques. Ceux-ci seront inscris sur l’écran suivant. Soyez prêt à commencer dès que vous appuyez sur le bouton !
|
||||
onboarding-automatic_proportions-start_recording-next = Commencer l'enregistrement
|
||||
@@ -818,6 +880,10 @@ onboarding-automatic_proportions-verify_results-redo = Refaire l'enregistrement
|
||||
onboarding-automatic_proportions-verify_results-confirm = Les résultats sont corrects
|
||||
onboarding-automatic_proportions-done-title = Calibration terminée
|
||||
onboarding-automatic_proportions-done-description = La calibration de vos proportions est terminée !
|
||||
onboarding-automatic_proportions-error_modal =
|
||||
<b>Avertissement :</b> Une erreur a été détectée lors de l’estimation des proportions !
|
||||
Veuillez <docs>consulter la documentation</docs> ou rejoindre notre <discord>Discord</discord> pour obtenir de l’aide ^_^
|
||||
onboarding-automatic_proportions-error_modal-confirm = Compris !
|
||||
|
||||
## Home
|
||||
|
||||
|
||||
@@ -36,6 +36,7 @@ body_part-RIGHT_HAND = Mano destra
|
||||
body_part-RIGHT_UPPER_LEG = Coscia destra
|
||||
body_part-RIGHT_LOWER_LEG = Caviglia destra
|
||||
body_part-RIGHT_FOOT = Piede destro
|
||||
body_part-UPPER_CHEST = Parte superiore del petto
|
||||
body_part-CHEST = Petto
|
||||
body_part-WAIST = Girovita
|
||||
body_part-HIP = Bacino
|
||||
@@ -53,8 +54,9 @@ skeleton_bone-NONE = Nessuna selezione
|
||||
skeleton_bone-HEAD = Correzione per la testa
|
||||
skeleton_bone-NECK = Lunghezza del collo
|
||||
skeleton_bone-torso_group = Lunghezza del torso
|
||||
skeleton_bone-CHEST = Lunghezza del torace
|
||||
skeleton_bone-UPPER_CHEST = Lunghezza della parte superiore del petto
|
||||
skeleton_bone-CHEST_OFFSET = Correzione per il petto
|
||||
skeleton_bone-CHEST = Lunghezza del torace
|
||||
skeleton_bone-WAIST = Lunghezza del girovita
|
||||
skeleton_bone-HIP = Lunghezza del bacino
|
||||
skeleton_bone-HIP_OFFSET = Correzione per il bacino
|
||||
@@ -120,6 +122,10 @@ widget-overlay-is_mirrored_label = Includi uno specchio nel Overlay
|
||||
|
||||
widget-drift_compensation-clear = Rimuovi compensazione per il drift
|
||||
|
||||
## Widget: Clear Reset Mounting
|
||||
|
||||
widget-clear_mounting = Ripristina impostazioni di reset posizionamento
|
||||
|
||||
## Widget: Developer settings
|
||||
|
||||
widget-developer_mode = Modalità sviluppatore
|
||||
@@ -163,9 +169,15 @@ tracker-table-column-url = URL
|
||||
## Tracker rotation
|
||||
|
||||
tracker-rotation-front = Davanti
|
||||
tracker-rotation-front_left = Anteriore sinistra
|
||||
tracker-rotation-front_right = Anteriore destra
|
||||
tracker-rotation-left = Sinistra
|
||||
tracker-rotation-right = Destra
|
||||
tracker-rotation-back = Dietro
|
||||
tracker-rotation-back_left = Posteriore sinistra
|
||||
tracker-rotation-back_right = Posteriore destra
|
||||
tracker-rotation-custom = Personalizzata
|
||||
tracker-rotation-overriden = (sovrascritto dal reset posizionamento)
|
||||
|
||||
## Tracker information
|
||||
|
||||
@@ -230,6 +242,7 @@ tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } coscia dest
|
||||
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } caviglia destra?
|
||||
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } piede destro?
|
||||
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } controller destro?
|
||||
tracker_selection_menu-UPPER_CHEST = { -tracker_selection-part } parte superiore del petto?
|
||||
tracker_selection_menu-CHEST = { -tracker_selection-part } petto?
|
||||
tracker_selection_menu-WAIST = { -tracker_selection-part } girovita?
|
||||
tracker_selection_menu-HIP = { -tracker_selection-part } bacino?
|
||||
@@ -269,6 +282,8 @@ settings-sidebar-osc_router = Router OSC
|
||||
settings-sidebar-osc_trackers = Tracker OSC per VRChat
|
||||
settings-sidebar-utils = Strumenti
|
||||
settings-sidebar-serial = Console seriale
|
||||
settings-sidebar-appearance = Aspetto
|
||||
settings-sidebar-notifications = Notifiche
|
||||
|
||||
## SteamVR settings
|
||||
|
||||
@@ -334,11 +349,21 @@ settings-general-fk_settings-leg_fk = Tracking delle gambe
|
||||
settings-general-fk_settings-arm_fk = Tracking delle braccia
|
||||
settings-general-fk_settings-arm_fk-description = Cambia la modalità di tracking delle braccia.
|
||||
settings-general-fk_settings-arm_fk-force_arms = Forza il calcolo della posizione delle braccia a utilizzare il HMD
|
||||
settings-general-fk_settings-skeleton_settings = Impostazioni dello scheletro
|
||||
settings-general-fk_settings-skeleton_settings-toggles = Interruttori per lo scheletro
|
||||
settings-general-fk_settings-skeleton_settings-description = Abilita o disabilita le impostazioni dello scheletro. É raccomandato lasciare queste impostazioni attive.
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine = Colonna vertebrale estesa
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis = Bacino esteso
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees = Ginocchia estese
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine_model = Modello di colonna vertebrale estesa
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis_model = modello di bacino esteso
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees_model = Modello di ginocchio esteso
|
||||
settings-general-fk_settings-skeleton_settings-ratios = Proporzioni dello scheletro
|
||||
settings-general-fk_settings-skeleton_settings-ratios-description = Modifica i valori delle impostazioni dello scheletro. Potrebbe essere necessario regolare le proporzioni dopo aver modificato queste impostazioni.
|
||||
settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_hip = Imputazione dei valori del girovita dalla combinazione del petto e bacino
|
||||
settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_legs = Imputazione dei valori del girovita dalla combinazione del petto e gambe
|
||||
settings-general-fk_settings-skeleton_settings-impute_hip_from_chest_legs = Imputazione dei valori del bacino dalla combinazione del petto e gambe
|
||||
settings-general-fk_settings-skeleton_settings-impute_hip_from_waist_legs = Imputazione dei valori del bacino dalla combinazione del girovita e gambe
|
||||
settings-general-fk_settings-skeleton_settings-interp_hip_legs = Media dell'orientamento del bacino e la rotazione delle gambe
|
||||
settings-general-fk_settings-skeleton_settings-interp_knee_tracker_ankle = Media dell'orientamento del ginocchio e la rotazione delle caviglie
|
||||
settings-general-fk_settings-self_localization-title = Modalità Mocap
|
||||
settings-general-fk_settings-self_localization-description = La modalità Mocap consente allo scheletro di tracciare approssimativamente la propria posizione senza visore o altri tracker. Si noti che questo richiede trakers per piedi e la testa per funzionare ed è ancora in fase sperimentale.
|
||||
settings-general-fk_settings-vive_emulation-title = Imitazione Vive
|
||||
settings-general-fk_settings-vive_emulation-description = Imita i problemi che hanno i Vive tracker utilizzati sul girovita. Questo è uno scherzo e peggiora il tracciamento.
|
||||
settings-general-fk_settings-vive_emulation-label = Abilita l'imitazione Vive
|
||||
@@ -355,6 +380,14 @@ settings-general-gesture_control-taps =
|
||||
[one] 1 tocco
|
||||
*[other] { $amount } tocchi
|
||||
}
|
||||
# This is a unit: 3 trackers, 2 trackers, 1 tracker
|
||||
# $amount (Number) - Amount of trackers
|
||||
settings-general-gesture_control-trackers =
|
||||
{ $amount ->
|
||||
[one] 1 tracker
|
||||
[many] { $amount } tracker
|
||||
*[other] { $amount } tracker
|
||||
}
|
||||
settings-general-gesture_control-yawResetEnabled = Abilita tocco per il reset orientamento
|
||||
settings-general-gesture_control-yawResetDelay = Ritardo per il reset orientamento
|
||||
settings-general-gesture_control-yawResetTaps = Numero di tocchi per il reset orientamento
|
||||
@@ -364,13 +397,32 @@ settings-general-gesture_control-fullResetTaps = Numero di tocchi per il reset c
|
||||
settings-general-gesture_control-mountingResetEnabled = Abilita tocco per reset posizionamento
|
||||
settings-general-gesture_control-mountingResetDelay = Ritardo per il reset posizionamento
|
||||
settings-general-gesture_control-mountingResetTaps = Numero di tocchi per il reset posizionamento
|
||||
# The number of trackers that can have higher acceleration before a tap is rejected
|
||||
settings-general-gesture_control-numberTrackersOverThreshold = Tracker sopra il limite
|
||||
settings-general-gesture_control-numberTrackersOverThreshold-description = Aumenta questo valore se il rilevamento del tocco non funziona. Non aumentarlo al di sopra di quanto necessario per far funzionare il rilevamento del tocco in quanto causerebbe più falsi positivi.
|
||||
|
||||
## Interface settings
|
||||
## Appearance settings
|
||||
|
||||
settings-general-interface = Interfaccia
|
||||
settings-interface-appearance = Aspetto
|
||||
settings-general-interface-dev_mode = Modalità sviluppatore
|
||||
settings-general-interface-dev_mode-description = Questa modalità è utile se hai bisogno di dati approfonditi o devi interagire in maniera più avanzata con i tracker connessi.
|
||||
settings-general-interface-dev_mode-label = Modalità sviluppatore
|
||||
settings-general-interface-theme = Colore di tema
|
||||
settings-general-interface-lang = Seleziona la lingua
|
||||
settings-general-interface-lang-description = Seleziona la lingua che vuoi utilizzare
|
||||
settings-general-interface-lang-placeholder = Seleziona la lingua da utilizzare
|
||||
# Keep the font name untranslated
|
||||
settings-interface-appearance-font = Font della GUI
|
||||
settings-interface-appearance-font-description = Questo cambia il font utilizzato dall'interfaccia.
|
||||
settings-interface-appearance-font-placeholder = Font predefinito
|
||||
settings-interface-appearance-font-os_font = Font di sistema
|
||||
settings-interface-appearance-font-slime_font = Font predefinito
|
||||
settings-interface-appearance-font_size = Ridimensionamento del font di base
|
||||
settings-interface-appearance-font_size-description = Questo influisce sulla dimensione del font dell'intera interfaccia ad eccezione di questo pannello delle impostazioni.
|
||||
|
||||
## Notification settings
|
||||
|
||||
settings-interface-notifications = Notifiche
|
||||
settings-general-interface-serial_detection = Rilevazione nuovi dispositivi seriali
|
||||
settings-general-interface-serial_detection-description = Questa opzione mostrerà un pop-up ogni volta che colleghi un nuovo dispositivo seriale che potrebbe essere un tracker. Aiuta a facilitare la configurazione iniziale di un tracker
|
||||
settings-general-interface-serial_detection-label = Rilevazione nuovi dispositivi seriali
|
||||
@@ -378,10 +430,6 @@ settings-general-interface-feedback_sound = Suono di feedback
|
||||
settings-general-interface-feedback_sound-description = Questa opzione riprodurrà un suono quando viene effettuato un reset
|
||||
settings-general-interface-feedback_sound-label = Suono di feedback
|
||||
settings-general-interface-feedback_sound-volume = Volume del suono di feedback
|
||||
settings-general-interface-theme = Colore di tema
|
||||
settings-general-interface-lang = Seleziona la lingua
|
||||
settings-general-interface-lang-description = Seleziona la lingua che vuoi utilizzare
|
||||
settings-general-interface-lang-placeholder = Seleziona la lingua da utilizzare
|
||||
|
||||
## Serial settings
|
||||
|
||||
@@ -525,7 +573,7 @@ onboarding-wifi_creds-password =
|
||||
|
||||
onboarding-reset_tutorial-back = Torna alla calibrazione posizionamento
|
||||
onboarding-reset_tutorial = Tutorial di reset
|
||||
onboarding-reset_tutorial-description = Questa funzionalità non è completa, premi continua
|
||||
onboarding-reset_tutorial-explanation = Mentre usi i tuoi tracker, potrebbero perdere l'allineamento a causa del drift dell'orientamento dell'IMU, o perché potresti averli spostati fisicamente. Hai diversi modi per risolvere questo problema.
|
||||
onboarding-reset_tutorial-skip = Salta passaggio
|
||||
# Cares about multiline
|
||||
onboarding-reset_tutorial-0 =
|
||||
@@ -597,9 +645,22 @@ onboarding-connect_tracker-next = Ho collegato tutti i miei tracker
|
||||
|
||||
onboarding-calibration_tutorial = Tutorial di calibrazione IMU
|
||||
onboarding-calibration_tutorial-subtitle = Ciò aiuterà a ridurre il drift del tracker!
|
||||
onboarding-calibration_tutorial-description = Ogni volta che accendi i tracker, devono riposare per un momento su una superficie piana per calibrare. Facciamo la stessa cosa cliccando sul pulsante "{ onboarding-calibration_tutorial-calibrate }", <b>non muoverli!</b>
|
||||
onboarding-calibration_tutorial-calibrate = Ho messo i miei tracker sul tavolo
|
||||
onboarding-calibration_tutorial-status-waiting = Ti aspettiamo
|
||||
onboarding-calibration_tutorial-status-calibrating = Calibrazione in corso
|
||||
onboarding-calibration_tutorial-status-success = Bene!
|
||||
onboarding-calibration_tutorial-status-error = Il tracker è stato mosso
|
||||
|
||||
## Tracker assignment tutorial
|
||||
|
||||
onboarding-assignment_tutorial = Come preparare uno Slime Tracker prima di indossarlo
|
||||
onboarding-assignment_tutorial-first_step = 1. Posiziona un adesivo di una parte del corpo sul tracker in base alla tua scelta (se ne hai uno)
|
||||
# This text has a character limit of around 11 characters, so please keep it short
|
||||
onboarding-assignment_tutorial-sticker = Adesivo
|
||||
onboarding-assignment_tutorial-second_step = 2. Fissa il cinturino al tracker, mantenendo il lato del gancio e dell'anello del cintutino nel seguente orientamento:
|
||||
onboarding-assignment_tutorial-second_step-continuation = Il lato del gancio e dell'anello del cinturino per l'estensione dovrebbe essere in questo orientamento:
|
||||
onboarding-assignment_tutorial-done = Ho messo gli adesivi e i cinturini!
|
||||
|
||||
## Tracker assignment setup
|
||||
|
||||
@@ -688,13 +749,15 @@ onboarding-assign_trackers-warning-WAIST =
|
||||
## Tracker mounting method choose
|
||||
|
||||
onboarding-choose_mounting = Quale metodo di calibrazione del posizionamento vuoi usare?
|
||||
# Multiline text
|
||||
onboarding-choose_mounting-description = L'orientamento di posizionamento corregge la posizione dei tracker sul corpo.
|
||||
onboarding-choose_mounting-auto_mounting = Posizionamento automatico
|
||||
# Italized text
|
||||
onboarding-choose_mounting-auto_mounting-subtitle = Raccomandato
|
||||
onboarding-choose_mounting-auto_mounting-label = Sperimentale
|
||||
onboarding-choose_mounting-auto_mounting-description = Questo processo identificherá automaticamente le direzioni per la posizione di montaggio di tutti i traker facendo 2 pose
|
||||
onboarding-choose_mounting-manual_mounting = Posizionamento manuale
|
||||
# Italized text
|
||||
onboarding-choose_mounting-manual_mounting-subtitle = Se sai cosa stai facendo
|
||||
onboarding-choose_mounting-manual_mounting-label = Raccomandato
|
||||
onboarding-choose_mounting-manual_mounting-description = Questo processo ti lascerá scegliere manualmente le direzioni per la posizione di montaggio di tutti i tracker
|
||||
|
||||
## Tracker manual mounting setup
|
||||
@@ -729,14 +792,23 @@ onboarding-automatic_mounting-put_trackers_on-next = Sto indossando tutti i miei
|
||||
## Tracker proportions method choose
|
||||
|
||||
onboarding-choose_proportions = Quale metodo di calibrazione delle proporzioni vuoi usare?
|
||||
# Multiline string
|
||||
onboarding-choose_proportions-description =
|
||||
"Proporzioni del corpo" vengono utilizzate per conoscere le misure del tuo corpo. Sono necessarie per calcolare le posizioni dei tracker.
|
||||
Quando le proporzioni del tuo corpo non corrispondono a quelle salvate, la tua precisione di tracciamento sarà peggiore e noterai cose come slittamento o la posizione del tuo corpo non corrisponderá bene alla posizione del tuo avatar.
|
||||
onboarding-choose_proportions-auto_proportions = Proporzioni automatiche
|
||||
# Italized text
|
||||
onboarding-choose_proportions-auto_proportions-subtitle = Raccomandato
|
||||
onboarding-choose_proportions-auto_proportions-description = Questo processo indovinerá le tue proporzioni del corpo registrando alcuni specifici movimenti che sono poi elaborati tramite un algoritmo
|
||||
onboarding-choose_proportions-auto_proportions-descriptionv2 =
|
||||
Questo indovinerà le tue proporzioni registrando un campione dei tuoi movimenti e passandolo attraverso un algoritmo.
|
||||
|
||||
<b>Ciò richiede che il tuo HMD sia collegato a SlimeVR!</b>
|
||||
onboarding-choose_proportions-manual_proportions = Proporzioni manuali
|
||||
# Italized text
|
||||
onboarding-choose_proportions-manual_proportions-subtitle = Per piccole modifiche
|
||||
onboarding-choose_proportions-manual_proportions-description = Questo processo ti permetterà di regolare manualmente le proporzioni del corpo modificandole direttamente.
|
||||
onboarding-choose_proportions-export = Esporta le proporzioni del corpo
|
||||
onboarding-choose_proportions-file_type = File delle proporzioni del corpo
|
||||
|
||||
## Tracker manual proportions setup
|
||||
|
||||
@@ -765,6 +837,18 @@ onboarding-automatic_proportions-requirements-description =
|
||||
I tuoi tracker e il visore stanno funzionando correttamente con il server di SlimeVR.
|
||||
Il tuo visore sta riportando dati di posizione al server di SlimeVR (ciò significa generalmente avere SteamVR in esecuzione e connesso a SlimeVR usando il driver di SlimeVR per SteamVR).
|
||||
onboarding-automatic_proportions-requirements-next = Ho letto i requisiti.
|
||||
onboarding-automatic_proportions-check_height-title = Controlla la tua altezza
|
||||
onboarding-automatic_proportions-check_height-description = Usiamo la tua altezza come base delle nostre misurazioni utilizzando l'altezza dell'HMD come approssimazione della tua altezza effettiva, ma è meglio controllare se il valore è giusto!
|
||||
# All the text is in bold!
|
||||
onboarding-automatic_proportions-check_height-calculation_warning = Si prega di premere il pulsante stando in piedi <u>in posizione eretta</u> per calcolare l'altezza. Hai 3 secondi dopo aver premuto il pulsante!
|
||||
onboarding-automatic_proportions-check_height-fetch_height = Sono in piedi!
|
||||
# Context is that the height is unknown
|
||||
onboarding-automatic_proportions-check_height-unknown = Sconosciuto
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-height = La tua altezza è
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-hmd_height = E l'altezza del HMD è
|
||||
onboarding-automatic_proportions-check_height-next_step = Sono corretti
|
||||
onboarding-automatic_proportions-start_recording-title = Preparati a muoverti
|
||||
onboarding-automatic_proportions-start_recording-description = Ora registreremo alcune pose e movimenti specifici. Questi verranno descritte nelle schermate successive. Preparati a iniziare quando premi il pulsante!
|
||||
onboarding-automatic_proportions-start_recording-next = Inizia registrazione
|
||||
@@ -794,6 +878,10 @@ onboarding-automatic_proportions-verify_results-redo = Rifai registrazione
|
||||
onboarding-automatic_proportions-verify_results-confirm = Sono corretti
|
||||
onboarding-automatic_proportions-done-title = Corpo misurato e salvato.
|
||||
onboarding-automatic_proportions-done-description = La calibrazione delle proporzioni del tuo corpo è completa!
|
||||
onboarding-automatic_proportions-error_modal =
|
||||
<b>Avvertimento:</b> È stato riscontrato un errore durante la stima delle proporzioni!
|
||||
Per piacere, <docs>controlla la documentazione</docs> o unisciti al nostro <discord>Discord</discord> per ricevere aiuto ^_^
|
||||
onboarding-automatic_proportions-error_modal-confirm = Ho capito!
|
||||
|
||||
## Home
|
||||
|
||||
@@ -801,3 +889,10 @@ home-no_trackers = Nessun tracker rilevato o assegnato
|
||||
|
||||
## Status system
|
||||
|
||||
status_system-StatusTrackerReset = É consigliato eseguire un reset completo poiché uno o più tracker non sono regolati.
|
||||
status_system-StatusSteamVRDisconnected =
|
||||
{ $type ->
|
||||
[steamvr_feeder] Attualmente non è connesso a SlimeVR Feeder App.
|
||||
*[other] Attualmente non è connesso a SteamVR tramite il driver SlimeVR.
|
||||
}
|
||||
status_system-StatusTrackerError = Il tracker { $trackerName } ha un errore.
|
||||
|
||||
@@ -120,6 +120,9 @@ widget-overlay-is_mirrored_label = オーバーレイをミラーとして表示
|
||||
|
||||
widget-drift_compensation-clear = ドリフト補正をクリアする
|
||||
|
||||
## Widget: Clear Reset Mounting
|
||||
|
||||
|
||||
## Widget: Developer settings
|
||||
|
||||
widget-developer_mode = 開発者モード
|
||||
@@ -166,6 +169,7 @@ tracker-rotation-front = 前
|
||||
tracker-rotation-left = 左
|
||||
tracker-rotation-right = 右
|
||||
tracker-rotation-back = 後
|
||||
tracker-rotation-custom = カスタム
|
||||
|
||||
## Tracker information
|
||||
|
||||
@@ -267,6 +271,7 @@ settings-sidebar-osc_router = OSCルーター
|
||||
settings-sidebar-osc_trackers = VRChatOSCトラッカー
|
||||
settings-sidebar-utils = ユーティリティ
|
||||
settings-sidebar-serial = シリアルコンソール
|
||||
settings-sidebar-notifications = 通知
|
||||
|
||||
## SteamVR settings
|
||||
|
||||
@@ -328,11 +333,8 @@ settings-general-fk_settings-leg_fk = 足のトラッキング
|
||||
settings-general-fk_settings-arm_fk = アームトラッキング
|
||||
settings-general-fk_settings-arm_fk-description = 腕の追従方法を変更する。
|
||||
settings-general-fk_settings-arm_fk-force_arms = Force arms from HMD
|
||||
settings-general-fk_settings-skeleton_settings = スケルトン設定
|
||||
settings-general-fk_settings-skeleton_settings-description = スケルトン設定のオン/オフを切り替えます。これらはオンのままにしておくことをお勧めします。
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine = Extended spine
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis = Extended pelvis
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees = Extended knee
|
||||
settings-general-fk_settings-self_localization-title = モーションキャプチャモード
|
||||
settings-general-fk_settings-vive_emulation-title = Viveエミュレーション
|
||||
settings-general-fk_settings-vive_emulation-description = Viveトラッカーが抱える腰トラッカーの問題をエミュレートします。
|
||||
settings-general-fk_settings-vive_emulation-label = Viveエミュレーションの有効化
|
||||
@@ -359,22 +361,28 @@ settings-general-gesture_control-mountingResetEnabled = タップによるマウ
|
||||
settings-general-gesture_control-mountingResetDelay = マウントリセットディレイ
|
||||
settings-general-gesture_control-mountingResetTaps = タップによるマウントリセット
|
||||
|
||||
## Interface settings
|
||||
## Appearance settings
|
||||
|
||||
settings-general-interface = インターフェース
|
||||
settings-general-interface-dev_mode = 開発者モード
|
||||
settings-general-interface-dev_mode-description = このモードは、詳細なデータが必要な場合や、接続されたトラッカーをより高度なレベルで操作する場合に役立ちます。
|
||||
settings-general-interface-dev_mode-label = 開発者モード
|
||||
settings-general-interface-theme = カラーテーマ
|
||||
settings-general-interface-lang = 言語を選択
|
||||
settings-general-interface-lang-description = 使用したいデフォルトの言語を変更する
|
||||
settings-general-interface-lang-placeholder = 使用する言語を選択する
|
||||
# Keep the font name untranslated
|
||||
settings-interface-appearance-font = GUIフォント
|
||||
settings-interface-appearance-font-os_font = OSフォント
|
||||
|
||||
## Notification settings
|
||||
|
||||
settings-interface-notifications = 通知
|
||||
settings-general-interface-serial_detection = シリアルデバイスの検出
|
||||
settings-general-interface-serial_detection-description = このオプションは、トラッカーとなり得る新しいシリアルデバイスを接続するたびにポップアップを表示します。これはトラッカーの設定プロセスを改善するのに役立ちます。
|
||||
settings-general-interface-serial_detection-label = シリアルデバイスの検出
|
||||
settings-general-interface-feedback_sound = フィードバック音
|
||||
settings-general-interface-feedback_sound-label = フィードバック音
|
||||
settings-general-interface-feedback_sound-volume = フィードバック音量
|
||||
settings-general-interface-theme = カラーテーマ
|
||||
settings-general-interface-lang = 言語を選択
|
||||
settings-general-interface-lang-description = 使用したいデフォルトの言語を変更する
|
||||
settings-general-interface-lang-placeholder = 使用する言語を選択する
|
||||
|
||||
## Serial settings
|
||||
|
||||
@@ -570,6 +578,8 @@ onboarding-assign_trackers-next = すべてのトラッカーを割り当てま
|
||||
|
||||
## Tracker mounting method choose
|
||||
|
||||
# Italized text
|
||||
onboarding-choose_mounting-auto_mounting-label = 実験的な
|
||||
|
||||
## Tracker manual mounting setup
|
||||
|
||||
@@ -624,6 +634,8 @@ onboarding-automatic_proportions-put_trackers_on-description = プロポーシ
|
||||
onboarding-automatic_proportions-put_trackers_on-next = すべてのトラッカーを装着しました
|
||||
onboarding-automatic_proportions-requirements-title = 要件
|
||||
onboarding-automatic_proportions-requirements-next = 要件を読みました
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-height = あなたの身長は
|
||||
onboarding-automatic_proportions-start_recording-title = 測定の準備をする
|
||||
onboarding-automatic_proportions-start_recording-description = これから具体的なポーズや動きを記録します。これらは次の画面に表示されます。ボタンが押されたらすぐに始められるように準備しておいてください!
|
||||
onboarding-automatic_proportions-start_recording-next = レコーディングスタート
|
||||
|
||||
@@ -13,7 +13,7 @@ websocket-connection_lost = Verbinding met de server verbroken. Opniew verbindin
|
||||
## Update notification
|
||||
|
||||
version_update-title = Nieuwe versie beschikbaar: { $version }
|
||||
version_update-description = Als u op "Bijwerken" klikt, wordt het SlimeVR-installatieprogramma voor je gedownload.
|
||||
version_update-description = Als je op "{ version_update-update }" klikt, wordt het SlimeVR-installatieprogramma voor je gedownload.
|
||||
version_update-update = Bijwerken
|
||||
version_update-close = Sluiten
|
||||
|
||||
@@ -28,7 +28,7 @@ tips-tap_setup = Je kan langzaam 2 keer op je tracker tikken om deze te kiezen i
|
||||
|
||||
body_part-NONE = Niet toegewezen
|
||||
body_part-HEAD = Hoofd
|
||||
body_part-NECK = Neck
|
||||
body_part-NECK = Nek
|
||||
body_part-RIGHT_SHOULDER = Rechterschouder
|
||||
body_part-RIGHT_UPPER_ARM = Rechterbovenarm
|
||||
body_part-RIGHT_LOWER_ARM = Rechteronderarm
|
||||
@@ -36,6 +36,7 @@ body_part-RIGHT_HAND = Rechterhand
|
||||
body_part-RIGHT_UPPER_LEG = Rechterdij
|
||||
body_part-RIGHT_LOWER_LEG = Rechterenkel
|
||||
body_part-RIGHT_FOOT = Rechtervoet
|
||||
body_part-UPPER_CHEST = Bovenborst
|
||||
body_part-CHEST = Borst
|
||||
body_part-WAIST = Taille
|
||||
body_part-HIP = Heup
|
||||
@@ -51,11 +52,12 @@ body_part-LEFT_FOOT = Linkervoet
|
||||
|
||||
skeleton_bone-NONE = Geen
|
||||
skeleton_bone-HEAD = Hoofdverschuiving
|
||||
skeleton_bone-NECK = Necklengte
|
||||
skeleton_bone-torso_group = Torso lengte
|
||||
skeleton_bone-CHEST = Borstafstand
|
||||
skeleton_bone-NECK = Neklengte
|
||||
skeleton_bone-torso_group = Romp lengte
|
||||
skeleton_bone-UPPER_CHEST = Bovenborst Lengte
|
||||
skeleton_bone-CHEST_OFFSET = Borstoffset
|
||||
skeleton_bone-WAIST = Tailleafstand
|
||||
skeleton_bone-CHEST = Borstafstand
|
||||
skeleton_bone-WAIST = Taille lengte
|
||||
skeleton_bone-HIP = Heuplengte
|
||||
skeleton_bone-HIP_OFFSET = Heupoffset
|
||||
skeleton_bone-HIPS_WIDTH = Heupbreedte
|
||||
@@ -64,7 +66,7 @@ skeleton_bone-UPPER_LEG = Bovenbeenlengte
|
||||
skeleton_bone-LOWER_LEG = Onderbeenlengte
|
||||
skeleton_bone-FOOT_LENGTH = Voetlengte
|
||||
skeleton_bone-FOOT_SHIFT = Voetverschuiving
|
||||
skeleton_bone-SKELETON_OFFSET = Skelettenoffset
|
||||
skeleton_bone-SKELETON_OFFSET = Skelet offset
|
||||
skeleton_bone-SHOULDERS_DISTANCE = Schoudersafstand
|
||||
skeleton_bone-SHOULDERS_WIDTH = Schouderbreedte
|
||||
skeleton_bone-arm_group = Armlengte
|
||||
@@ -77,16 +79,16 @@ skeleton_bone-ELBOW_OFFSET = Elleboogoffset
|
||||
## Tracker reset buttons
|
||||
|
||||
reset-reset_all = Alle afmetingen resetten
|
||||
reset-full = Resetten
|
||||
reset-mounting = Bevestiging resetten
|
||||
reset-yaw = Horizontale reset
|
||||
reset-full = Volledige reset
|
||||
reset-mounting = Reset montage
|
||||
reset-yaw = Yaw Reset
|
||||
|
||||
## Serial detection stuff
|
||||
|
||||
serial_detection-new_device-p0 = Nieuw serieel apparaat gedetecteerd!
|
||||
serial_detection-new_device-p1 = Voer je WiFi-inloggegevens in!
|
||||
serial_detection-new_device-p2 = Selecteer wat je wil doen
|
||||
serial_detection-open_wifi = Verbinding maken met WiFi
|
||||
serial_detection-open_wifi = Verbind met Wi-Fi
|
||||
serial_detection-open_serial = Seriële console openen
|
||||
serial_detection-submit = Verzenden!
|
||||
serial_detection-close = Sluiten
|
||||
@@ -94,10 +96,10 @@ serial_detection-close = Sluiten
|
||||
## Navigation bar
|
||||
|
||||
navbar-home = Startpagina
|
||||
navbar-body_proportions = Lichaams- verhoudingen
|
||||
navbar-trackers_assign = Tracker- toewijzing
|
||||
navbar-mounting = Bevestigings- kalibratie
|
||||
navbar-onboarding = Setupgids
|
||||
navbar-body_proportions = Lichaamsverhoudingen
|
||||
navbar-trackers_assign = Tracker-toewijzing
|
||||
navbar-mounting = Bevestigings-kalibratie
|
||||
navbar-onboarding = Installatiewizard
|
||||
navbar-settings = Instellingen
|
||||
|
||||
## Biovision hierarchy recording
|
||||
@@ -108,7 +110,7 @@ bvh-recording = Opname bezig...
|
||||
## Tracking pause
|
||||
|
||||
tracking-unpaused = Pauzeer tracking
|
||||
tracking-paused = Herneem tracking
|
||||
tracking-paused = Hervat tracking
|
||||
|
||||
## Widget: Overlay settings
|
||||
|
||||
@@ -118,7 +120,7 @@ widget-overlay-is_mirrored_label = Overlay weergeven als spiegel
|
||||
|
||||
## Widget: Drift compensation
|
||||
|
||||
widget-drift_compensation-clear = Reset huidige drift compensatie waarden
|
||||
widget-drift_compensation-clear = Reset huidige drift compensatie
|
||||
|
||||
## Widget: Developer settings
|
||||
|
||||
@@ -127,7 +129,7 @@ widget-developer_mode-high_contrast = Hoog contrast
|
||||
widget-developer_mode-precise_rotation = Precieze rotatie
|
||||
widget-developer_mode-fast_data_feed = Snelle data feed
|
||||
widget-developer_mode-filter_slimes_and_hmd = Filter slimes en HMD
|
||||
widget-developer_mode-sort_by_name = Op naam sorteren
|
||||
widget-developer_mode-sort_by_name = Sorteer op naam
|
||||
widget-developer_mode-raw_slime_rotation = Ruwe rotatie
|
||||
widget-developer_mode-more_info = Meer informatie
|
||||
|
||||
@@ -187,7 +189,7 @@ tracker-settings-assignment_section = Toewijzing
|
||||
tracker-settings-assignment_section-description = Aan welk lichaamsdeel de tracker is toegewezen.
|
||||
tracker-settings-assignment_section-edit = Toewijzing bewerken
|
||||
tracker-settings-mounting_section = Bevestigingsorientatie
|
||||
tracker-settings-mounting_section-description = Hoe is de tracker georiënteerd?
|
||||
tracker-settings-mounting_section-description = Waar is de tracker gemonteerd?
|
||||
tracker-settings-mounting_section-edit = Bevestiging bewerken
|
||||
tracker-settings-drift_compensation_section = Laat drift compensatie toe
|
||||
tracker-settings-drift_compensation_section-description = Moet deze tracker compenseren voor drift wanneer drift compensatie is ingeschakeld?
|
||||
@@ -230,6 +232,7 @@ tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } rechterdij?
|
||||
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } rechterenkel?
|
||||
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } rechtervoet?
|
||||
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } rechtercontroller?
|
||||
tracker_selection_menu-UPPER_CHEST = { -tracker_selection-part } bovenborst?
|
||||
tracker_selection_menu-CHEST = { -tracker_selection-part } borst?
|
||||
tracker_selection_menu-WAIST = { -tracker_selection-part } taille?
|
||||
tracker_selection_menu-HIP = { -tracker_selection-part } heup?
|
||||
@@ -328,6 +331,12 @@ settings-general-fk_settings-leg_tweak-skating_correction = Skating-correctie
|
||||
settings-general-fk_settings-leg_tweak-toe_snap = Teen snap
|
||||
settings-general-fk_settings-leg_tweak-foot_plant = Voetplant
|
||||
settings-general-fk_settings-leg_tweak-skating_correction-amount = Skating-correctie sterkte
|
||||
settings-general-fk_settings-leg_tweak-skating_correction-description = Schaatscorrectie corrigeert voor schaatsen, maar kan de nauwkeurigheid van bepaalde bewegingspatronen verminderen. Zorg ervoor dat je bij het inschakelen een volledige reset uitvoert en opnieuw kalibreert in het spel.
|
||||
settings-general-fk_settings-leg_tweak-floor_clip-description =
|
||||
Floor-clip kan het doorknippen van de vloer verminderen of zelfs elimineren.
|
||||
Zorg ervoor dat u bij het inschakelen een volledige reset uitvoert en opnieuw kalibreert in het spel.
|
||||
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-arm_fk = Arm tracking
|
||||
settings-general-fk_settings-arm_fk-description = Verander de manier waarop de armen worden getrackt.
|
||||
@@ -585,6 +594,13 @@ onboarding-calibration_tutorial-status-error = De tracker werd verplaatst
|
||||
|
||||
## Tracker assignment tutorial
|
||||
|
||||
onboarding-assignment_tutorial = Hoe een Slime Tracker voor te bereiden voordat u deze aantrekt
|
||||
onboarding-assignment_tutorial-first_step = 1. Plaats een lichaamsdeelsticker (als je die hebt) op de tracker naar keuze
|
||||
# This text has a character limit of around 11 characters, so please keep it short
|
||||
onboarding-assignment_tutorial-sticker = Sticker
|
||||
onboarding-assignment_tutorial-second_step = Bevestig de riem aan je tracker, waarbij je de haak-en-luskant van het bandje in de volgende richting houdt:
|
||||
onboarding-assignment_tutorial-second_step-continuation = De haak-en-luskant voor de verlenging moet in deze richting staan:
|
||||
onboarding-assignment_tutorial-done = Ik heb stickers en riemen geplaatst!
|
||||
|
||||
## Tracker assignment setup
|
||||
|
||||
@@ -673,6 +689,8 @@ onboarding-assign_trackers-warning-WAIST =
|
||||
## Tracker mounting method choose
|
||||
|
||||
onboarding-choose_mounting = Welke montagekalibratiemethode moet worden gebruikt?
|
||||
# Multiline text
|
||||
onboarding-choose_mounting-description = De oriëntatie van de montage corrigeert de plaatsing van trackers op uw lichaam.
|
||||
onboarding-choose_mounting-auto_mounting = Automatische bevestiging
|
||||
# Italized text
|
||||
onboarding-choose_mounting-auto_mounting-label = Experimenteel
|
||||
@@ -714,6 +732,8 @@ onboarding-automatic_mounting-put_trackers_on-next = Ik heb al mijn trackers aan
|
||||
## Tracker proportions method choose
|
||||
|
||||
onboarding-choose_proportions = Welke verhoudingskalibratiemethode moet worden gebruikt?
|
||||
# Multiline string
|
||||
onboarding-choose_proportions-description = Lichaamsverhoudingen worden gebruikt om de maten van je lichaam te kennen. Die zijn nodig om de posities van de trackers te berekenen. Wanneer de verhoudingen van uw lichaam niet overeenkomen met de opgeslagen verhoudingen, zal je trackingprecisie slechter zijn en zal je dingen opmerken zoals schaatsen of glijden, of je lichaam past niet goed bij je avatar.
|
||||
onboarding-choose_proportions-auto_proportions = Automatische verhoudingen
|
||||
# Italized text
|
||||
onboarding-choose_proportions-auto_proportions-subtitle = Aanbevolen
|
||||
@@ -722,6 +742,8 @@ onboarding-choose_proportions-manual_proportions = Handmatige lichaamsverhouding
|
||||
# Italized text
|
||||
onboarding-choose_proportions-manual_proportions-subtitle = Voor kleine details
|
||||
onboarding-choose_proportions-manual_proportions-description = Hier kan je jouw verhoudingen handmatig aanpassen
|
||||
onboarding-choose_proportions-export = Export proporties
|
||||
onboarding-choose_proportions-file_type = Lichaamsproporties bestand
|
||||
|
||||
## Tracker manual proportions setup
|
||||
|
||||
@@ -787,3 +809,10 @@ home-no_trackers = Geen trackers gedetecteerd of toegewezen
|
||||
|
||||
## Status system
|
||||
|
||||
status_system-StatusTrackerReset = Het wordt aanbevolen om een volledige reset uit te voeren omdat een of meer trackers niet zijn aangepast.
|
||||
status_system-StatusSteamVRDisconnected =
|
||||
{ $type ->
|
||||
[steamvr_feeder] Momenteel niet verbonden naar de SlimeVR Feeder App.
|
||||
*[other] Momenteel niet verbonden naar SteamVR via de SlimeVR driver.
|
||||
}
|
||||
status_system-StatusTrackerError = De { $trackerName } tracker heeft een error.
|
||||
|
||||
@@ -122,6 +122,10 @@ widget-overlay-is_mirrored_label = Pokaż Overlay jako Lustro
|
||||
|
||||
widget-drift_compensation-clear = Wyczyść kompensację dryfu
|
||||
|
||||
## Widget: Clear Reset Mounting
|
||||
|
||||
widget-clear_mounting = Wyczyść resetowanie montażu
|
||||
|
||||
## Widget: Developer settings
|
||||
|
||||
widget-developer_mode = Tryb Dewelopera
|
||||
@@ -165,9 +169,15 @@ tracker-table-column-url = URL
|
||||
## Tracker rotation
|
||||
|
||||
tracker-rotation-front = Przód
|
||||
tracker-rotation-front_left = Przedni lewy
|
||||
tracker-rotation-front_right = Przedni prawy
|
||||
tracker-rotation-left = Lewa
|
||||
tracker-rotation-right = Prawa
|
||||
tracker-rotation-back = Tył
|
||||
tracker-rotation-back_left = Lewy tył
|
||||
tracker-rotation-back_right = Prawy tył
|
||||
tracker-rotation-custom = Własne
|
||||
tracker-rotation-overriden = (nadpisany przez reset montażu)
|
||||
|
||||
## Tracker information
|
||||
|
||||
@@ -272,6 +282,8 @@ settings-sidebar-osc_router = OSC router
|
||||
settings-sidebar-osc_trackers = Śledzenie VRChat OSC
|
||||
settings-sidebar-utils = Narzędzia
|
||||
settings-sidebar-serial = Konsola Seryjna
|
||||
settings-sidebar-appearance = Wygląd
|
||||
settings-sidebar-notifications = Powiadomienia
|
||||
|
||||
## SteamVR settings
|
||||
|
||||
@@ -339,11 +351,21 @@ settings-general-fk_settings-leg_fk = Śledzenie nóg
|
||||
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
|
||||
settings-general-fk_settings-skeleton_settings = Ustawienia szkieletu
|
||||
settings-general-fk_settings-skeleton_settings-toggles = Przełączniki szkieletowe
|
||||
settings-general-fk_settings-skeleton_settings-description = Włącz lub wyłącz ustawienia szkieletu. Zaleca się pozostawienie ich włączonych.
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine = Wydłużony kręgosłup
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis = Rozszerzona miednica
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees = Wydłużone kolano
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine_model = Wydłużony model kręgosłupa
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis_model = Rozszerzony model miednicy
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees_model = Model z przedłużonym kolanem
|
||||
settings-general-fk_settings-skeleton_settings-ratios = Współczynniki szkieletu
|
||||
settings-general-fk_settings-skeleton_settings-ratios-description = Zmień wartości ustawień szkieletu. Po zmianie może być konieczne dostosowanie proporcji.
|
||||
settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_hip = Przypisz talię od klatki piersiowej do bioder
|
||||
settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_legs = Przypisz talię od klatki piersiowej do nóg
|
||||
settings-general-fk_settings-skeleton_settings-impute_hip_from_chest_legs = Przypisz biodro od klatki piersiowej do nóg
|
||||
settings-general-fk_settings-skeleton_settings-impute_hip_from_waist_legs = Przypisz biodro od pasa do nóg
|
||||
settings-general-fk_settings-skeleton_settings-interp_hip_legs = Średnie odchylenie biodra i przetoczenie nogami
|
||||
settings-general-fk_settings-skeleton_settings-interp_knee_tracker_ankle = Uśrednij odchylenie i przechylenie nakolanników za pomocą kostek
|
||||
settings-general-fk_settings-self_localization-title = Tryb Mocap
|
||||
settings-general-fk_settings-self_localization-description = Tryb Mocap pozwala szkieletowi z grubsza śledzić własną pozycję bez headsetu lub innych trackerów. Pamiętaj, że wymaga to śledzenia stóp i głowy do działania i nadal jest eksperymentalne.
|
||||
settings-general-fk_settings-vive_emulation-title = Emulacja Vive
|
||||
settings-general-fk_settings-vive_emulation-description = Naśladuj problemy z trackerem talii, które mają trackery Vive. To żart i pogarsza śledzenie.
|
||||
settings-general-fk_settings-vive_emulation-label = Włącz emulację Vive
|
||||
@@ -362,6 +384,15 @@ settings-general-gesture_control-taps =
|
||||
[many] { $amount } dotknięć
|
||||
*[other] { $amount } dotknięć
|
||||
}
|
||||
# This is a unit: 3 trackers, 2 trackers, 1 tracker
|
||||
# $amount (Number) - Amount of trackers
|
||||
settings-general-gesture_control-trackers =
|
||||
{ $amount ->
|
||||
[one] 1 tracker
|
||||
[few] 2 trackery
|
||||
[many] { $amount } trackery
|
||||
*[other] { $amount } trackery
|
||||
}
|
||||
settings-general-gesture_control-yawResetEnabled = Włącz stuknięcie, aby zresetować odchylanie
|
||||
settings-general-gesture_control-yawResetDelay = Opóźnienie resetowania odchylenia
|
||||
settings-general-gesture_control-yawResetTaps = Stuknięcie do resetowania odchylenia
|
||||
@@ -371,13 +402,32 @@ settings-general-gesture_control-fullResetTaps = Stuknij do pełnego resetu
|
||||
settings-general-gesture_control-mountingResetEnabled = Włącz stuknięcie, aby zresetować położenie
|
||||
settings-general-gesture_control-mountingResetDelay = Opóźnienie resetowania położenia
|
||||
settings-general-gesture_control-mountingResetTaps = Stuknięcie do resetowania położenia
|
||||
# The number of trackers that can have higher acceleration before a tap is rejected
|
||||
settings-general-gesture_control-numberTrackersOverThreshold = Trackery ponad progiem
|
||||
settings-general-gesture_control-numberTrackersOverThreshold-description = Zwiększ tę wartość, jeśli wykrywanie dotknięcia nie działa. Nie zwiększaj go ponad to, co jest potrzebne, aby wykrywanie dotknięcia działało, ponieważ spowoduje to fałszywe alarmy
|
||||
|
||||
## Interface settings
|
||||
## Appearance settings
|
||||
|
||||
settings-general-interface = Interfejs
|
||||
settings-interface-appearance = Wygląd
|
||||
settings-general-interface-dev_mode = Tryb Dewelopera
|
||||
settings-general-interface-dev_mode-description = Ten tryb przydaje się do sprawdzania większej ilości danych.
|
||||
settings-general-interface-dev_mode-label = Tryb Dewelopera
|
||||
settings-general-interface-theme = Motyw kolorystyczny
|
||||
settings-general-interface-lang = Wybierz Język
|
||||
settings-general-interface-lang-description = Zmień podstawowy język jaki chcesz używać
|
||||
settings-general-interface-lang-placeholder = Wybierz Język który będziesz używać
|
||||
# Keep the font name untranslated
|
||||
settings-interface-appearance-font = Czcionka interfejsu użytkownika
|
||||
settings-interface-appearance-font-description = Spowoduje to zmianę czcionki używanej przez interfejs
|
||||
settings-interface-appearance-font-placeholder = Domyślna czcionka
|
||||
settings-interface-appearance-font-os_font = Czcionka systemu operacyjnego
|
||||
settings-interface-appearance-font-slime_font = Domyślna czcionka
|
||||
settings-interface-appearance-font_size = Skalowanie czcionki bazowej
|
||||
settings-interface-appearance-font_size-description = Wpływa to na rozmiar czcionki całego interfejsu z wyjątkiem tego panelu ustawień
|
||||
|
||||
## Notification settings
|
||||
|
||||
settings-interface-notifications = Powiadomienia
|
||||
settings-general-interface-serial_detection = Wykrywanie urządzeń
|
||||
settings-general-interface-serial_detection-description = Ta opcja daje powiadomienia jeżeli serwer wykryje urządzenie które może być trackerem
|
||||
settings-general-interface-serial_detection-label = Wykrywanie urządzeń
|
||||
@@ -385,10 +435,6 @@ settings-general-interface-feedback_sound = Dźwięk Informacji
|
||||
settings-general-interface-feedback_sound-description = Ta opcja odtworzy dźwięk, gdy reset zostanie uruchomiony
|
||||
settings-general-interface-feedback_sound-label = Dźwięk Informacji
|
||||
settings-general-interface-feedback_sound-volume = Poziom głośności sprzężenia zwrotnego
|
||||
settings-general-interface-theme = Motyw kolorystyczny
|
||||
settings-general-interface-lang = Wybierz Język
|
||||
settings-general-interface-lang-description = Zmień podstawowy język jaki chcesz używać
|
||||
settings-general-interface-lang-placeholder = Wybierz Język który będziesz używać
|
||||
|
||||
## Serial settings
|
||||
|
||||
@@ -762,7 +808,10 @@ onboarding-choose_proportions-description =
|
||||
onboarding-choose_proportions-auto_proportions = Proporcje automatyczne
|
||||
# Italized text
|
||||
onboarding-choose_proportions-auto_proportions-subtitle = Zalecana
|
||||
onboarding-choose_proportions-auto_proportions-description = To odgadnie twoje proporcje, rejestrując próbkę twoich ruchów i przepuszczając ją przez sztuczną inteligencję
|
||||
onboarding-choose_proportions-auto_proportions-descriptionv2 =
|
||||
To odgadnie twoje proporcje, rejestrując próbkę twoich ruchów i przepuszczając ją przez algorytm.
|
||||
|
||||
<b>Wymaga podłączenia HMD do SlimeVR!</b>
|
||||
onboarding-choose_proportions-manual_proportions = Ręczne proporcje
|
||||
# Italized text
|
||||
onboarding-choose_proportions-manual_proportions-subtitle = Drobne detale
|
||||
@@ -798,6 +847,18 @@ onboarding-automatic_proportions-requirements-description =
|
||||
Twoje urządzenia śledzące i zestaw VR działają poprawnie na serwerze SlimeVR.
|
||||
Twój zestaw VR przesyła dane pozycyjne do serwera SlimeVR (oznacza to ogólnie, że SteamVR działa i jest połączony ze SlimeVR za pomocą sterownika SlimeVR dla SteamVR).
|
||||
onboarding-automatic_proportions-requirements-next = Zapoznałem się z wymaganiami
|
||||
onboarding-automatic_proportions-check_height-title = Sprawdź swój wzrost
|
||||
onboarding-automatic_proportions-check_height-description = Używamy Twojego wzrostu jako podstawy naszych pomiarów, używając wzrostu HMD jako przybliżenia Twojego rzeczywistego wzrostu, ale lepiej samemu sprawdzić, czy są prawidłowe!
|
||||
# All the text is in bold!
|
||||
onboarding-automatic_proportions-check_height-calculation_warning = Naciśnij przycisk stojąc <u>wyprostowany</u>, aby obliczyć swój wzrost. Masz 3 sekundy po naciśnięciu przycisku!
|
||||
onboarding-automatic_proportions-check_height-fetch_height = Stoję!
|
||||
# Context is that the height is unknown
|
||||
onboarding-automatic_proportions-check_height-unknown = Nieznany
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-height = Twój wzrost to
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-hmd_height = A wysokość HMD jest
|
||||
onboarding-automatic_proportions-check_height-next_step = Są w porządku
|
||||
onboarding-automatic_proportions-start_recording-title = Bądź gotowy żeby się ruszać
|
||||
onboarding-automatic_proportions-start_recording-description = Będziemy teraz nagrywać specyficzne pozycje i ruchy. Będą one pokazane w następnym okienku. Bądź gotowy po naciśnięciu przycisku!
|
||||
onboarding-automatic_proportions-start_recording-next = Uruchom nagrywanie
|
||||
@@ -829,6 +890,10 @@ onboarding-automatic_proportions-verify_results-redo = Powtórz Nagrywanie
|
||||
onboarding-automatic_proportions-verify_results-confirm = Są Prawidłowe
|
||||
onboarding-automatic_proportions-done-title = Zmierzono oraz Zapisano.
|
||||
onboarding-automatic_proportions-done-description = Twoja kalibracja ciała została zakończona!
|
||||
onboarding-automatic_proportions-error_modal =
|
||||
<b>Ostrzeżenie:</b> Wykryto błąd podczas szacowania proporcji!
|
||||
Proszę <docs>sprawdź dokumenty</docs> lub dołącz do naszego <discord>Discord</discord>, aby uzyskać pomoc ^_^
|
||||
onboarding-automatic_proportions-error_modal-confirm = Zrozumiano!
|
||||
|
||||
## Home
|
||||
|
||||
|
||||
@@ -36,6 +36,7 @@ body_part-RIGHT_HAND = Правая рука
|
||||
body_part-RIGHT_UPPER_LEG = Правое бедро
|
||||
body_part-RIGHT_LOWER_LEG = Правая голень
|
||||
body_part-RIGHT_FOOT = Правая ступня
|
||||
body_part-UPPER_CHEST = Верхняя часть груди
|
||||
body_part-CHEST = Грудь
|
||||
body_part-WAIST = Талия
|
||||
body_part-HIP = Таз
|
||||
@@ -53,8 +54,9 @@ skeleton_bone-NONE = Пусто
|
||||
skeleton_bone-HEAD = Голова
|
||||
skeleton_bone-NECK = Длина шеи
|
||||
skeleton_bone-torso_group = Длина туловища
|
||||
skeleton_bone-CHEST = Длина груди
|
||||
skeleton_bone-UPPER_CHEST = Длина верхней части груди
|
||||
skeleton_bone-CHEST_OFFSET = Смещение груди
|
||||
skeleton_bone-CHEST = Длина груди
|
||||
skeleton_bone-WAIST = Длина талии
|
||||
skeleton_bone-HIP = Длина таза
|
||||
skeleton_bone-HIP_OFFSET = Смещение таза
|
||||
@@ -120,6 +122,10 @@ widget-overlay-is_mirrored_label = Показывать оверлей как з
|
||||
|
||||
widget-drift_compensation-clear = Очистить компенсацию дрифта
|
||||
|
||||
## Widget: Clear Reset Mounting
|
||||
|
||||
widget-clear_mounting = Обнулить сброс выравнивания
|
||||
|
||||
## Widget: Developer settings
|
||||
|
||||
widget-developer_mode = Режим разработчика
|
||||
@@ -163,9 +169,14 @@ tracker-table-column-url = URL
|
||||
## Tracker rotation
|
||||
|
||||
tracker-rotation-front = Спереди
|
||||
tracker-rotation-front_left = Левая сторона передней части
|
||||
tracker-rotation-front_right = Правая сторона передней части
|
||||
tracker-rotation-left = Слева
|
||||
tracker-rotation-right = Справа
|
||||
tracker-rotation-back = Сзади
|
||||
tracker-rotation-back_left = Левая сторона задней части
|
||||
tracker-rotation-back_right = Правая сторона задней части
|
||||
tracker-rotation-custom = Пользовательское
|
||||
|
||||
## Tracker information
|
||||
|
||||
@@ -230,6 +241,7 @@ tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } право
|
||||
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } правой лодышке?
|
||||
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } правой ступне?
|
||||
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } правому контроллеру?
|
||||
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 } тазу?
|
||||
@@ -269,6 +281,8 @@ settings-sidebar-osc_router = OSC роутер
|
||||
settings-sidebar-osc_trackers = VRChat OSC Трекеры
|
||||
settings-sidebar-utils = Утилиты
|
||||
settings-sidebar-serial = Консоль
|
||||
settings-sidebar-appearance = Внешность
|
||||
settings-sidebar-notifications = Уведомление
|
||||
|
||||
## SteamVR settings
|
||||
|
||||
@@ -336,11 +350,14 @@ settings-general-fk_settings-leg_fk = Трекинг ноги
|
||||
settings-general-fk_settings-arm_fk = Трекинг руки
|
||||
settings-general-fk_settings-arm_fk-description = Измените способ отслеживания рук.
|
||||
settings-general-fk_settings-arm_fk-force_arms = Руки от HMD
|
||||
settings-general-fk_settings-skeleton_settings = Настройки скелета
|
||||
settings-general-fk_settings-skeleton_settings-description = Включите или выключите настройки скелета. Рекомендуется оставить их включенными.
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine = Удлиненный позвоночник
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis = Расширенный таз
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees = Вытянутое колено
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine_model = Модель вытянутого позвоночника
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis_model = Модель удлиненного таза
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees_model = Модель с удлиненным коленом
|
||||
settings-general-fk_settings-skeleton_settings-ratios = Соотношения скелета
|
||||
settings-general-fk_settings-skeleton_settings-ratios-description = Измените значения параметров скелета. Возможно, вам придется скорректировать пропорции после их изменения.
|
||||
settings-general-fk_settings-self_localization-title = Режим Mocap
|
||||
settings-general-fk_settings-self_localization-description = Режим Mocap позволяет скелету примерно отслеживать свое собственное положение без использования гарнитуры или других трекеров. Обратите внимание, что для работы этого требуются трекеры ног и головы, и это все еще экспериментальный метод.
|
||||
settings-general-fk_settings-vive_emulation-title = Эмуляция Vive
|
||||
settings-general-fk_settings-vive_emulation-description = Имитируйте проблемы с отслеживанием талии, которые возникают у трекеров Vive. Это шутка, и она ухудшает отслеживание.
|
||||
settings-general-fk_settings-vive_emulation-label = Включить эмуляцию Vive
|
||||
@@ -359,6 +376,15 @@ settings-general-gesture_control-taps =
|
||||
[many] { $amount } нажатий
|
||||
*[other] { $amount } нажатий
|
||||
}
|
||||
# This is a unit: 3 trackers, 2 trackers, 1 tracker
|
||||
# $amount (Number) - Amount of trackers
|
||||
settings-general-gesture_control-trackers =
|
||||
{ $amount ->
|
||||
[one] 1 трекер
|
||||
[few] { $amount } трекера
|
||||
[many] { $amount } трекеров
|
||||
*[other] { $amount } трекеров
|
||||
}
|
||||
settings-general-gesture_control-yawResetEnabled = Включить нажатие для сброса
|
||||
settings-general-gesture_control-yawResetDelay = Задержка сброса
|
||||
settings-general-gesture_control-yawResetTaps = Нажатия для сброса
|
||||
@@ -368,13 +394,32 @@ settings-general-gesture_control-fullResetTaps = Нажатия для полн
|
||||
settings-general-gesture_control-mountingResetEnabled = Включить нажатия для сброса крепления
|
||||
settings-general-gesture_control-mountingResetDelay = Задержка сброса крепления
|
||||
settings-general-gesture_control-mountingResetTaps = Нажатия для сброса крепления
|
||||
# The number of trackers that can have higher acceleration before a tap is rejected
|
||||
settings-general-gesture_control-numberTrackersOverThreshold = Трекеры превышают порог
|
||||
settings-general-gesture_control-numberTrackersOverThreshold-description = Увеличьте это значение, если обнаружение касания не работает. Не увеличивайте его выше того, что необходимо для работы обнаружения касания, так как это приведет к большему количеству ложных срабатываний.
|
||||
|
||||
## Interface settings
|
||||
## Appearance settings
|
||||
|
||||
settings-general-interface = Интерфейс
|
||||
settings-interface-appearance = Внешность
|
||||
settings-general-interface-dev_mode = Режим разработчика
|
||||
settings-general-interface-dev_mode-description = Этот режим может быть полезен, если вам нужны подробные данные или для взаимодействия с подключенными трекерами на более продвинутом уровне.
|
||||
settings-general-interface-dev_mode-label = Режим разработчика
|
||||
settings-general-interface-theme = Варианты оформления
|
||||
settings-general-interface-lang = Выбрать язык
|
||||
settings-general-interface-lang-description = Измените язык по умолчанию, который вы хотите использовать.
|
||||
settings-general-interface-lang-placeholder = Выберите язык для использования
|
||||
# Keep the font name untranslated
|
||||
settings-interface-appearance-font = Шрифт GUI
|
||||
settings-interface-appearance-font-description = Это изменяет шрифт, используемый интерфейсом.
|
||||
settings-interface-appearance-font-placeholder = Шрифт по умолчанию
|
||||
settings-interface-appearance-font-os_font = Шрифт ОС
|
||||
settings-interface-appearance-font-slime_font = Шрифт по умолчанию
|
||||
settings-interface-appearance-font_size = Базовое масштабирование шрифта
|
||||
settings-interface-appearance-font_size-description = Это влияет на размер шрифта всего интерфейса, за исключением этой панели настроек.
|
||||
|
||||
## Notification settings
|
||||
|
||||
settings-interface-notifications = Уведомления
|
||||
settings-general-interface-serial_detection = Обнаружение серийного устройства
|
||||
settings-general-interface-serial_detection-description = Эта опция будет показывать всплывающее окно каждый раз, когда вы подключаете новое серийное устройство, которое может быть трекером. Это помогает улучшить процесс настройки трекера.
|
||||
settings-general-interface-serial_detection-label = Обнаружение серийного устройства
|
||||
@@ -382,10 +427,6 @@ settings-general-interface-feedback_sound = Звук обратной связи
|
||||
settings-general-interface-feedback_sound-description = Эта опция будет воспроизводить звук при срабатывании сброса.
|
||||
settings-general-interface-feedback_sound-label = Звук обратной связи
|
||||
settings-general-interface-feedback_sound-volume = Громкость реакции интерфейса на косание треккера
|
||||
settings-general-interface-theme = Варианты оформления
|
||||
settings-general-interface-lang = Выбрать язык
|
||||
settings-general-interface-lang-description = Измените язык по умолчанию, который вы хотите использовать.
|
||||
settings-general-interface-lang-placeholder = Выберите язык для использования
|
||||
|
||||
## Serial settings
|
||||
|
||||
@@ -759,7 +800,6 @@ onboarding-choose_proportions-description =
|
||||
onboarding-choose_proportions-auto_proportions = Автоматическая привязка
|
||||
# Italized text
|
||||
onboarding-choose_proportions-auto_proportions-subtitle = Рекомендуется
|
||||
onboarding-choose_proportions-auto_proportions-description = Это позволит угадать ваши пропорции, записав образец ваших движений и передав его через алгоритм.
|
||||
onboarding-choose_proportions-manual_proportions = Ручные пропорции
|
||||
# Italized text
|
||||
onboarding-choose_proportions-manual_proportions-subtitle = Для небольших штрихов
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
### SlimeVR complete GUI translations
|
||||
|
||||
|
||||
# Please developers (not translators) don't reuse a key inside another key
|
||||
# or concat text with a translation string in the code, use the appropriate
|
||||
# features like variables and selectors in each appropriate case!
|
||||
@@ -13,10 +10,19 @@
|
||||
websocket-connecting = Đang kết nối với máy chủ
|
||||
websocket-connection_lost = Kết nối với máy chủ đã mất. Đang kết nối lại...
|
||||
|
||||
## Update notification
|
||||
|
||||
version_update-title = Phiên bản mới có thể cập nhật:
|
||||
version_update-description = Nhấp vào "{ version_update-update }" sẽ tải xuống trình cài đặt SlimeVR cho bạn.
|
||||
version_update-update = Cập nhật
|
||||
version_update-close = Đóng
|
||||
|
||||
## Tips
|
||||
|
||||
tips-find_tracker = Không rõ tracker nào đang được chọn? Di chuyển nó và trong menu sẽ sáng lên tracker đó
|
||||
tips-do_not_move_heels = Không di chuyển gót chân trong khi đo
|
||||
tips-file_select = Kéo và thả tệp để sử dụng hoặc <u>duyệt</u>.
|
||||
tips-tap_setup = Bạn có thể từ từ nhấn vào 2 lần trình theo dõi của mình để chọn nó thay vì chọn nó từ menu.
|
||||
|
||||
## Body parts
|
||||
|
||||
@@ -30,7 +36,7 @@ body_part-RIGHT_HAND = Tay phải
|
||||
body_part-RIGHT_UPPER_LEG = Bắp chân phải
|
||||
body_part-RIGHT_LOWER_LEG = Cẳng chân phải
|
||||
body_part-RIGHT_FOOT = Bàn chân phải
|
||||
body_part-RIGHT_CONTROLLER = Tay cầm bên phải
|
||||
body_part-UPPER_CHEST = Ngực trên
|
||||
body_part-CHEST = Ngực
|
||||
body_part-WAIST = Eo
|
||||
body_part-HIP = Hông
|
||||
@@ -41,19 +47,19 @@ body_part-LEFT_HAND = Tay trái
|
||||
body_part-LEFT_UPPER_LEG = Bắp chân trái
|
||||
body_part-LEFT_LOWER_LEG = Cẳng chân trái
|
||||
body_part-LEFT_FOOT = Bàn chân trái
|
||||
body_part-LEFT_CONTROLLER = Tay cầm bên trái
|
||||
|
||||
## Proportions
|
||||
|
||||
skeleton_bone-NONE = Chưa được gán
|
||||
skeleton_bone-HEAD = Sai số đầu
|
||||
skeleton_bone-NECK = Chiều dài cổ
|
||||
skeleton_bone-CHEST = Khoảng cách ngực
|
||||
skeleton_bone-CHEST_OFFSET = Sai số ngực
|
||||
skeleton_bone-CHEST = Khoảng cách ngực
|
||||
skeleton_bone-WAIST = Khoảng cách eo
|
||||
skeleton_bone-HIP = Khoảng cách hông
|
||||
skeleton_bone-HIP_OFFSET = Sai số hông
|
||||
skeleton_bone-HIPS_WIDTH = Chiều rộng hông
|
||||
skeleton_bone-leg_group = Chiều dài chân
|
||||
skeleton_bone-UPPER_LEG = Chiều dài bắp chân
|
||||
skeleton_bone-LOWER_LEG = Chiều dài cẳng chân
|
||||
skeleton_bone-FOOT_LENGTH = Chiều dài bàn chân
|
||||
@@ -61,10 +67,9 @@ skeleton_bone-FOOT_SHIFT = Sai số bàn chân
|
||||
skeleton_bone-SKELETON_OFFSET = Sai số thân
|
||||
skeleton_bone-SHOULDERS_DISTANCE = Khoảng cách vai
|
||||
skeleton_bone-SHOULDERS_WIDTH = Chiều rộng vai
|
||||
skeleton_bone-arm_group = Chiều dài cánh tay
|
||||
skeleton_bone-UPPER_ARM = Chiều dài bắp tay
|
||||
skeleton_bone-LOWER_ARM = Chiều dài cẳng tay
|
||||
skeleton_bone-CONTROLLER_Y = Khoảng cách tay cầm theo trục Y
|
||||
skeleton_bone-CONTROLLER_Z = Khoảng cách tay cầm theo trục Z
|
||||
skeleton_bone-ELBOW_OFFSET = Sai số khuỷu tay
|
||||
|
||||
## Tracker reset buttons
|
||||
@@ -72,7 +77,6 @@ skeleton_bone-ELBOW_OFFSET = Sai số khuỷu tay
|
||||
reset-reset_all = Đặt lại tất cả bộ phận
|
||||
reset-full = Đặt lại
|
||||
reset-mounting = Đặt lại hướng gắn tracker
|
||||
reset-quick = Đặt lại nhanh
|
||||
|
||||
## Serial detection stuff
|
||||
|
||||
@@ -93,17 +97,30 @@ navbar-mounting = Cân chỉnh hướng gắn tracker
|
||||
navbar-onboarding = Trình thiết lập
|
||||
navbar-settings = Cài đặt
|
||||
|
||||
## Bounding volume hierarchy recording
|
||||
## Biovision hierarchy recording
|
||||
|
||||
bvh-start_recording = Ghi BVH
|
||||
bvh-recording = Đang ghi...
|
||||
|
||||
## Tracking pause
|
||||
|
||||
tracking-unpaused = Tạm dừng tracking
|
||||
tracking-paused = Bỏ dừng theo dõi
|
||||
|
||||
## Widget: Overlay settings
|
||||
|
||||
widget-overlay = Overlay
|
||||
widget-overlay-is_visible_label = Xem overlay trên SteamVR
|
||||
widget-overlay-is_mirrored_label = Xem overlay trong gương
|
||||
|
||||
## Widget: Drift compensation
|
||||
|
||||
widget-drift_compensation-clear = Xóa sai số
|
||||
|
||||
## Widget: Clear Reset Mounting
|
||||
|
||||
widget-clear_mounting = Đặt lại hướng gắn tracker
|
||||
|
||||
## Widget: Developer settings
|
||||
|
||||
widget-developer_mode = Chế độ nhà phát triển
|
||||
@@ -120,6 +137,7 @@ widget-developer_mode-more_info = Thêm thông tin
|
||||
widget-imu_visualizer = Góc quay
|
||||
widget-imu_visualizer-rotation_raw = Gốc
|
||||
widget-imu_visualizer-rotation_preview = Qua xử lí
|
||||
widget-imu_visualizer-rotation_hide = Ẩn
|
||||
|
||||
## Tracker status
|
||||
|
||||
@@ -149,6 +167,7 @@ tracker-rotation-front = Trước
|
||||
tracker-rotation-left = Trái
|
||||
tracker-rotation-right = Phải
|
||||
tracker-rotation-back = Sau
|
||||
tracker-rotation-custom = Tùy chọn
|
||||
|
||||
## Tracker information
|
||||
|
||||
@@ -156,6 +175,10 @@ tracker-infos-manufacturer = Nhà sản xuất
|
||||
tracker-infos-display_name = Tên hiển thị
|
||||
tracker-infos-custom_name = Tên gọi
|
||||
tracker-infos-url = Đường dẫn
|
||||
tracker-infos-version = Phiên bản firmware
|
||||
tracker-infos-hardware_rev = Revision phần cứng
|
||||
tracker-infos-hardware_identifier = Hardware ID
|
||||
tracker-infos-imu = Cảm biến IMU (IMU Sensor)
|
||||
|
||||
## Tracker settings
|
||||
|
||||
@@ -222,6 +245,8 @@ tracker_selection_menu-LEFT_CONTROLLER = { -tracker_selection-part } tay cầm b
|
||||
tracker_selection_menu-unassigned = Chưa gắn vị trí
|
||||
tracker_selection_menu-assigned = Đã gán vị trí
|
||||
tracker_selection_menu-dont_assign = Không gắn
|
||||
tracker_selection_menu-neck_warning-done = Tôi hiểu những rủi ro
|
||||
tracker_selection_menu-neck_warning-cancel = Hủy
|
||||
|
||||
## Mounting menu
|
||||
|
||||
@@ -237,8 +262,10 @@ settings-sidebar-fk_settings = Cài đặt tracker
|
||||
settings-sidebar-gesture_control = Cử chỉ điều khiển
|
||||
settings-sidebar-interface = Giao diện
|
||||
settings-sidebar-osc_router = Router OSC
|
||||
settings-sidebar-osc_trackers = Trình theo dõi VRChat OSC
|
||||
settings-sidebar-utils = Công cụ
|
||||
settings-sidebar-serial = Cổng Serial
|
||||
settings-sidebar-notifications = Thông báo
|
||||
|
||||
## SteamVR settings
|
||||
|
||||
@@ -286,8 +313,6 @@ settings-general-tracker_mechanics-drift_compensation-max_resets-label = Số l
|
||||
## FK/Tracking settings
|
||||
|
||||
settings-general-fk_settings = Cài đặt nâng cao
|
||||
settings-general-fk_settings-leg_tweak = Chân
|
||||
settings-general-fk_settings-leg_tweak-description = "Ngăn xuyên sàn" có thể giảm thiểu khả năng chân xuống thấp hơn sàn sau khi đặt lại vị trí tracker, có thể gây vấn đề nếu đang đứng bằng đầu gối. "Sửa trượt" giúp giảm thiểu tình trạng chân có chuyển động nhỏ so với sàn khi đứng yên, có thể làm giảm độ chính xác với một số chuyển động cụ thể
|
||||
# Floor clip:
|
||||
# why the name - came from the idea of noclip in video games, but is the opposite where clipping to the floor is a desired feature
|
||||
# definition - Prevents the foot trackers from going lower than they where when a reset was performed
|
||||
@@ -301,11 +326,8 @@ settings-general-fk_settings-leg_tweak-skating_correction-amount = Mức độ s
|
||||
settings-general-fk_settings-arm_fk = Track cánh tay
|
||||
settings-general-fk_settings-arm_fk-description = Thay đổi cách cánh tay được track
|
||||
settings-general-fk_settings-arm_fk-force_arms = Lấy dữ liệu cánh tay từ kính
|
||||
settings-general-fk_settings-skeleton_settings = Cài đặt khung cơ thể
|
||||
settings-general-fk_settings-skeleton_settings-description = Bật hoặc tắt các cài đặt về khung cơ thể. Các lựa chọn này nên được giữ bật
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine = Xương sống kéo dài
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis = Xương chậu kéo dài
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees = Đầu gối kéo dài
|
||||
settings-general-fk_settings-self_localization-title = Chế độ Mocap
|
||||
settings-general-fk_settings-vive_emulation-title = Giả lập tracker Vive
|
||||
settings-general-fk_settings-vive_emulation-description = Giả lập cách tracker của Vive gặp vấn đề với việc theo dõi eo, đây là 1 tính năng được làm cho vui và sẽ làm giảm độ chính xác
|
||||
settings-general-fk_settings-vive_emulation-label = Giả lập tracker Vive
|
||||
@@ -322,28 +344,33 @@ settings-general-gesture_control-taps =
|
||||
[one] 1 tap
|
||||
*[other] { $amount } lần
|
||||
}
|
||||
settings-general-gesture_control-quickResetEnabled = Chạm để đặt lại nhanh
|
||||
settings-general-gesture_control-quickResetDelay = Thời gian delay trước khi đặt lại nhanh
|
||||
settings-general-gesture_control-quickResetTaps = Số lần chạm cho đặt lại nhanh
|
||||
settings-general-gesture_control-resetEnabled = Chạm để đặt lại
|
||||
settings-general-gesture_control-resetDelay = Thời gian delay trước khi đặt lại
|
||||
settings-general-gesture_control-resetTaps = Số lần chạm cho đặt lại
|
||||
# This is a unit: 3 trackers, 2 trackers, 1 tracker
|
||||
# $amount (Number) - Amount of trackers
|
||||
settings-general-gesture_control-trackers = { $amount } trackers
|
||||
settings-general-gesture_control-mountingResetEnabled = Chạm để đặt lại hướng gắn tracker
|
||||
settings-general-gesture_control-mountingResetDelay = Thời gian delay trước khi đặt lại hướng gắn tracker
|
||||
settings-general-gesture_control-mountingResetTaps = Số lần chạm cho đặt lại hướng gắn tracker
|
||||
|
||||
## Interface settings
|
||||
## Appearance settings
|
||||
|
||||
settings-general-interface = Giao diện
|
||||
settings-general-interface-dev_mode = Chế độ nhà phát triển
|
||||
settings-general-interface-dev_mode-description = Hữu dụng nếu cần thêm thông tin chi tiết của tracker hay can thiệp sâu hơn vào tracker
|
||||
settings-general-interface-dev_mode-label = Chế độ nhà phát triển
|
||||
settings-general-interface-serial_detection = Nhận dạng thiết bị Serial mới
|
||||
settings-general-interface-serial_detection-description = Hiển thị pop-up mỗi lần một thiết bị Serial mới được kết nối qua USB (có thể là tracker), giúp cải thiện quá trình thiết lập tracker
|
||||
settings-general-interface-serial_detection-label = Nhận dạng thiết bị Serial mới
|
||||
settings-general-interface-theme = Màu giao diện
|
||||
settings-general-interface-lang = Thay đổi ngôn ngữ (Change language)
|
||||
settings-general-interface-lang-description = Đổi ngôn ngữ hiển thị (Change the default language you want to use)
|
||||
settings-general-interface-lang-placeholder = Chọn ngôn ngữ để sử dụng (Select the language to use)
|
||||
settings-interface-appearance-font-placeholder = Phông chữ mặc định
|
||||
settings-interface-appearance-font-os_font = Phông chữ hệ điều hành
|
||||
settings-interface-appearance-font-slime_font = Phông chữ mặc định
|
||||
|
||||
## Notification settings
|
||||
|
||||
settings-interface-notifications = Thông báo
|
||||
settings-general-interface-serial_detection = Nhận dạng thiết bị Serial mới
|
||||
settings-general-interface-serial_detection-description = Hiển thị pop-up mỗi lần một thiết bị Serial mới được kết nối qua USB (có thể là tracker), giúp cải thiện quá trình thiết lập tracker
|
||||
settings-general-interface-serial_detection-label = Nhận dạng thiết bị Serial mới
|
||||
settings-general-interface-feedback_sound-description = Tùy chọn này sẽ phát âm thanh khi thiết lập lại được kích hoạt.
|
||||
|
||||
## Serial settings
|
||||
|
||||
@@ -355,6 +382,8 @@ settings-serial-description =
|
||||
settings-serial-connection_lost = Kết nối đến Serial đã mất, đang kết nối lại...
|
||||
settings-serial-reboot = Khởi động lại
|
||||
settings-serial-factory_reset = Khôi phục cài đặt gốc
|
||||
settings-serial-factory_reset-warning-ok = Tôi biết mình đang làm gì
|
||||
settings-serial-factory_reset-warning-cancel = Hủy
|
||||
settings-serial-get_infos = Lấy thông tin
|
||||
settings-serial-serial_select = Chọn cổng Serial
|
||||
settings-serial-auto_dropdown_item = Tự động
|
||||
@@ -408,16 +437,25 @@ settings-osc-vrchat-network-address-placeholder = Địa chỉ IP của thiết
|
||||
settings-osc-vrchat-network-trackers = Cấu hình Tracker
|
||||
settings-osc-vrchat-network-trackers-description = Chọn các tracker mà SlimeVR sẽ gửi dữ liệu OSC đến VRChat
|
||||
settings-osc-vrchat-network-trackers-chest = Ngực
|
||||
settings-osc-vrchat-network-trackers-waist = Eo
|
||||
settings-osc-vrchat-network-trackers-hip = Hông
|
||||
settings-osc-vrchat-network-trackers-knees = Đầu gối
|
||||
settings-osc-vrchat-network-trackers-feet = Bàn chân
|
||||
settings-osc-vrchat-network-trackers-elbows = Khuỷu tay
|
||||
|
||||
## VMC OSC settings
|
||||
|
||||
settings-osc-vmc-enable = Bật
|
||||
settings-osc-vmc-enable-description = Cho phép nhận và gửi dữ liệu OSC
|
||||
settings-osc-vmc-enable-label = Chuyển tiếp dữ liệu OSC
|
||||
|
||||
## Setup/onboarding menu
|
||||
|
||||
onboarding-skip = Bỏ qua cài đặt
|
||||
onboarding-continue = Tiếp tục
|
||||
onboarding-wip = Chưa hoàn thiện
|
||||
onboarding-previous_step = Quay lại
|
||||
onboarding-setup_warning-skip = Bỏ qua cài đặt
|
||||
onboarding-setup_warning-cancel = Tiếp tục thiết lập
|
||||
|
||||
## Wi-Fi setup
|
||||
|
||||
@@ -440,15 +478,12 @@ onboarding-wifi_creds-password =
|
||||
|
||||
onboarding-reset_tutorial-back = Quay lại cân chỉnh vị trí gắn tracker
|
||||
onboarding-reset_tutorial = Làm lại
|
||||
onboarding-reset_tutorial-description = Tính năng này chưa hoàn thiện, vui lòng bấm tiếp tục và quay lại sau
|
||||
onboarding-reset_tutorial-explanation = Trong khi bạn sử dụng trình theo dõi của mình, tracker có thể bị lệch khỏi căn chỉnh do IMU bị trượt, trôi dạt hoặc vì bạn có thể đã di chuyển chúng về mặt vật lý. Bạn có một số cách để khắc phục điều này.
|
||||
onboarding-reset_tutorial-skip = Bỏ qua bước
|
||||
|
||||
## Setup start
|
||||
|
||||
onboarding-home = Chào mừng bạn đến với SlimeVR!
|
||||
# This cares about multilines and it's centered!!
|
||||
onboarding-home-description =
|
||||
Mang FBT đến
|
||||
với mọi người
|
||||
onboarding-home-start = Bắt đầu thiết lập!
|
||||
|
||||
## Enter VR part of setup
|
||||
@@ -472,11 +507,14 @@ onboarding-connect_tracker-description-p0 = Cập nhật thông tin Wi-Fi cho tr
|
||||
onboarding-connect_tracker-description-p1 = Hãy kết nối các tracker chưa thiết lập qua cổng USB
|
||||
onboarding-connect_tracker-issue-serial = Có vấn đề với việc kết nối? Kiểm tra thông tin qua cổng Serial
|
||||
onboarding-connect_tracker-usb = USB Tracker
|
||||
onboarding-connect_tracker-connection_status-none = Đang tìm tracker
|
||||
onboarding-connect_tracker-connection_status-serial_init = Kết nối với thiết bị nối tiếp serial
|
||||
onboarding-connect_tracker-connection_status-provisioning = Đang gửi thông tin Wi-Fi
|
||||
onboarding-connect_tracker-connection_status-connecting = Đang gửi thông tin Wi-Fi
|
||||
onboarding-connect_tracker-connection_status-connected = Đã kết nối đến Wi-Fi
|
||||
onboarding-connect_tracker-connection_status-error = Không thể kết nối đến Wi-Fi
|
||||
onboarding-connect_tracker-connection_status-start_connecting = Đang tìm tracker
|
||||
onboarding-connect_tracker-connection_status-handshake = Đã kết nối đến máy chủ SlimeVR
|
||||
onboarding-connect_tracker-connection_status-looking_for_server = Đang tìm máy chủ
|
||||
onboarding-connect_tracker-connection_status-connection_error = Không thể kết nối đến Wi-Fi
|
||||
onboarding-connect_tracker-connection_status-could_not_find_server = Không thể tìm thấy máy chủ
|
||||
onboarding-connect_tracker-connection_status-done = Đã kết nối đến máy chủ SlimeVR
|
||||
# $amount (Number) - Amount of trackers connected (this is a number, but you can use CLDR plural rules for your language)
|
||||
# More info on https://www.unicode.org/cldr/cldr-aux/charts/22/supplemental/language_plural_rules.html
|
||||
# English in this case only has 2 plural rules, which are "one" and "other",
|
||||
@@ -490,6 +528,21 @@ onboarding-connect_tracker-connected_trackers =
|
||||
} đã giao
|
||||
onboarding-connect_tracker-next = Đã kết nối với tất cả tracker
|
||||
|
||||
## Tracker calibration tutorial
|
||||
|
||||
onboarding-calibration_tutorial-subtitle = Cái này sẽ giúp giảm trôi trượt theo dõi!
|
||||
onboarding-calibration_tutorial-calibrate = Tôi đã đặt thiết bị theo dõi của mình lên bàn
|
||||
onboarding-calibration_tutorial-status-waiting = Đang chờ bạn hoàn thành
|
||||
onboarding-calibration_tutorial-status-success = Nice!
|
||||
|
||||
## Tracker assignment tutorial
|
||||
|
||||
onboarding-assignment_tutorial = Làm thế nào để chuẩn bị một Slime Tracker trước khi đưa nó vào
|
||||
onboarding-assignment_tutorial-first_step = 1. Đặt nhãn dán bộ phận cơ thể (nếu có) trên tracker theo lựa chọn của bạn
|
||||
# This text has a character limit of around 11 characters, so please keep it short
|
||||
onboarding-assignment_tutorial-sticker = Sticker
|
||||
onboarding-assignment_tutorial-done = Tôi đã dán nhãn dán và dây đai!
|
||||
|
||||
## Tracker assignment setup
|
||||
|
||||
onboarding-assign_trackers-back = Quay lại cài đặt Wi-Fi
|
||||
@@ -506,6 +559,12 @@ onboarding-assign_trackers-assigned =
|
||||
onboarding-assign_trackers-advanced = Xem thêm vị trí đặt
|
||||
onboarding-assign_trackers-next = Hoàn thành
|
||||
|
||||
## Tracker assignment warnings
|
||||
|
||||
|
||||
## Tracker mounting method choose
|
||||
|
||||
|
||||
## Tracker manual mounting setup
|
||||
|
||||
onboarding-manual_mounting-back = Quay lại chuẩn bị cân chỉnh
|
||||
@@ -535,6 +594,9 @@ onboarding-automatic_mounting-put_trackers_on-title = Đeo tracker lên người
|
||||
onboarding-automatic_mounting-put_trackers_on-description = Để cân chỉnh hướng gắn của tracker, SlimeVR sẽ tiến hành đo góc nghiêng của tracker khi đang đeo để cân chỉnh hướng gắn, hãy đeo tracker theo đúng vị trí đã thiết lập
|
||||
onboarding-automatic_mounting-put_trackers_on-next = Tiếp tục
|
||||
|
||||
## Tracker proportions method choose
|
||||
|
||||
|
||||
## Tracker manual proportions setup
|
||||
|
||||
onboarding-manual_proportions-back = Quay lại cân chỉnh hướng gắn
|
||||
@@ -552,22 +614,19 @@ onboarding-automatic_proportions-prev_step = Quay lại
|
||||
onboarding-automatic_proportions-put_trackers_on-title = Đeo tracker lên người
|
||||
onboarding-automatic_proportions-put_trackers_on-description = Để đo kích thước cơ thể, SlimeVR sẽ sử dụng một thuật toán để dự đoán kích thước của các bộ phận, hãy đeo tracker theo đúng vị trí đã thiết lập như hình bên
|
||||
onboarding-automatic_proportions-put_trackers_on-next = Tiếp tục
|
||||
onboarding-automatic_proportions-preparation-title = Chuẩn bị
|
||||
onboarding-automatic_proportions-preparation-description = Chuẩn bị một chiếc ghế trong khu vực chơi vì quá trình đo sẽ yêu cầu đến việc ngồi xuống
|
||||
onboarding-automatic_proportions-preparation-next = Đã có ghế ngồi sau lưng
|
||||
onboarding-automatic_proportions-requirements-title = Yêu cầu
|
||||
onboarding-automatic_proportions-requirements-next = Tôi đã đọc các yêu cầu
|
||||
onboarding-automatic_proportions-check_height-fetch_height = Tôi đang đứng!
|
||||
# Context is that the height is unknown
|
||||
onboarding-automatic_proportions-check_height-unknown = Không rõ
|
||||
onboarding-automatic_proportions-start_recording-title = Chuẩn bị đo
|
||||
onboarding-automatic_proportions-start_recording-description = Phần mềm sẽ đo một số chuyển động, cử chỉ cụ thể, hãy chuẩn bị cho việc di chuyển theo yêu cầu trong phần tiếp theo
|
||||
onboarding-automatic_proportions-start_recording-next = Bắt đầu
|
||||
onboarding-automatic_proportions-recording-title = REC
|
||||
onboarding-automatic_proportions-recording-description-p0 = Đang ghi...
|
||||
onboarding-automatic_proportions-recording-description-p1 = Thực hiện các thao tác sau:
|
||||
onboarding-automatic_proportions-recording-steps-0 = Uốn duỗi chân vài lần (squat)
|
||||
onboarding-automatic_proportions-recording-steps-1 = Ngồi lên ghế rồi đứng lên
|
||||
onboarding-automatic_proportions-recording-steps-2 = Vặn thân sang trái và uốn người sang phải
|
||||
onboarding-automatic_proportions-recording-steps-3 = Vặn thân sang phải và uốn người sang trái
|
||||
onboarding-automatic_proportions-recording-steps-4 = Làm thêm các chuyển động khác đến khi hết thời gian
|
||||
onboarding-automatic_proportions-recording-processing = Đang xử lí kết quả...
|
||||
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 15)
|
||||
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 20)
|
||||
onboarding-automatic_proportions-recording-timer =
|
||||
{ $time ->
|
||||
[one] 1 second
|
||||
@@ -581,7 +640,18 @@ onboarding-automatic_proportions-verify_results-redo = Thử lại
|
||||
onboarding-automatic_proportions-verify_results-confirm = Kết quả tương đối chính xác
|
||||
onboarding-automatic_proportions-done-title = Đã lưu chỉ số đo
|
||||
onboarding-automatic_proportions-done-description = Quá trình đo đã hoàn tất
|
||||
onboarding-automatic_proportions-error_modal-confirm = Đã hiểu!
|
||||
|
||||
## Home
|
||||
|
||||
home-no_trackers = Không tìm thấy tracker / Tracker chưa được gán
|
||||
|
||||
## Status system
|
||||
|
||||
status_system-StatusTrackerReset = Bạn nên thực hiện thiết lập lại toàn bộ vì một hoặc nhiều trình theo dõi không được điều chỉnh.
|
||||
status_system-StatusSteamVRDisconnected =
|
||||
{ $type ->
|
||||
[steamvr_feeder] Hiện đang không kết nối với SteamVR thông qua trình điều khiển SlimeVR Feeder App.
|
||||
*[other] Hiện đang không kết nối với SteamVR thông qua driver SlimeVR.
|
||||
}
|
||||
status_system-StatusTrackerError = Tracker { $trackerName } có lỗi.
|
||||
|
||||
@@ -19,7 +19,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次追踪器来选中它,而不是从菜单中选取。
|
||||
@@ -36,6 +36,7 @@ body_part-RIGHT_HAND = 右手
|
||||
body_part-RIGHT_UPPER_LEG = 右大腿
|
||||
body_part-RIGHT_LOWER_LEG = 右小腿
|
||||
body_part-RIGHT_FOOT = 右脚
|
||||
body_part-UPPER_CHEST = 上胸
|
||||
body_part-CHEST = 胸部
|
||||
body_part-WAIST = 腰部
|
||||
body_part-HIP = 髋部
|
||||
@@ -53,6 +54,7 @@ skeleton_bone-NONE = 无
|
||||
skeleton_bone-HEAD = 头部偏移
|
||||
skeleton_bone-NECK = 颈部长度
|
||||
skeleton_bone-torso_group = 躯干长度
|
||||
skeleton_bone-UPPER_CHEST = 上胸长度
|
||||
skeleton_bone-CHEST_OFFSET = 胸部偏移
|
||||
skeleton_bone-CHEST = 胸部长度
|
||||
skeleton_bone-WAIST = 腰部长度
|
||||
@@ -64,7 +66,7 @@ skeleton_bone-UPPER_LEG = 大腿长度
|
||||
skeleton_bone-LOWER_LEG = 小腿长度
|
||||
skeleton_bone-FOOT_LENGTH = 脚部长度
|
||||
skeleton_bone-FOOT_SHIFT = 脚部偏移
|
||||
skeleton_bone-SKELETON_OFFSET = 骨骼偏移
|
||||
skeleton_bone-SKELETON_OFFSET = 骨架偏移
|
||||
skeleton_bone-SHOULDERS_DISTANCE = 肩膀距离
|
||||
skeleton_bone-SHOULDERS_WIDTH = 肩膀宽度
|
||||
skeleton_bone-arm_group = 手臂长度
|
||||
@@ -120,6 +122,10 @@ widget-overlay-is_mirrored_label = 镜像显示覆盖层
|
||||
|
||||
widget-drift_compensation-clear = 清除漂移补偿数据
|
||||
|
||||
## Widget: Clear Reset Mounting
|
||||
|
||||
widget-clear_mounting = 清除重置佩戴
|
||||
|
||||
## Widget: Developer settings
|
||||
|
||||
widget-developer_mode = 开发者选项
|
||||
@@ -163,9 +169,15 @@ tracker-table-column-url = 地址
|
||||
## Tracker rotation
|
||||
|
||||
tracker-rotation-front = 前
|
||||
tracker-rotation-front_left = 左前
|
||||
tracker-rotation-front_right = 右前
|
||||
tracker-rotation-left = 左
|
||||
tracker-rotation-right = 右
|
||||
tracker-rotation-back = 后
|
||||
tracker-rotation-back_left = 左后
|
||||
tracker-rotation-back_right = 右后
|
||||
tracker-rotation-custom = 自定义
|
||||
tracker-rotation-overriden = (被重置佩戴覆盖)
|
||||
|
||||
## Tracker information
|
||||
|
||||
@@ -230,6 +242,7 @@ tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part }右大腿?
|
||||
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part }右小腿?
|
||||
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part }右脚?
|
||||
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part }右控制器?
|
||||
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 }髋部?
|
||||
@@ -269,6 +282,8 @@ settings-sidebar-osc_router = OSC 路由
|
||||
settings-sidebar-osc_trackers = VRChat OSC 追踪器
|
||||
settings-sidebar-utils = 工具
|
||||
settings-sidebar-serial = 串口控制台
|
||||
settings-sidebar-appearance = 外观
|
||||
settings-sidebar-notifications = 通知
|
||||
|
||||
## SteamVR settings
|
||||
|
||||
@@ -279,8 +294,8 @@ settings-general-steamvr-subtitle = SteamVR 追踪器
|
||||
# The first spaces (not tabs) for indentation will be ignored, just to make the file look nice when writing.
|
||||
# This one is one of this cases that cares about multilines
|
||||
settings-general-steamvr-description =
|
||||
启用或禁用特定的追踪器
|
||||
对于只支持特定追踪器的应用会很有用。
|
||||
启用或禁用特定的 SteamVR 追踪器
|
||||
对于只支持特定追踪器的游戏或应用会很有用。
|
||||
settings-general-steamvr-trackers-waist = 腰部
|
||||
settings-general-steamvr-trackers-chest = 胸部
|
||||
settings-general-steamvr-trackers-feet = 脚部
|
||||
@@ -338,9 +353,11 @@ settings-general-fk_settings-arm_fk-description = 即使有手臂位置数据可
|
||||
settings-general-fk_settings-arm_fk-force_arms = 强制使用头显数据追踪手臂
|
||||
settings-general-fk_settings-skeleton_settings = 骨架设置
|
||||
settings-general-fk_settings-skeleton_settings-description = 打开或关闭骨架设置。建议保持这些设置不变。
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine = 脊柱延伸
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis = 骨盆延伸
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees = 膝盖延伸
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine_model = 延伸脊柱模型
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis_model = 延伸骨盆模型
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees_model = 伸展膝盖模型
|
||||
settings-general-fk_settings-self_localization-title = 动作捕捉模式
|
||||
settings-general-fk_settings-self_localization-description = 动作捕捉模式允许在没有头戴设备或其他追踪器的情况下粗略地跟踪骨架姿态。请注意,本功能需要脚部和头部追踪器,且现阶段依然是实验性的。
|
||||
settings-general-fk_settings-vive_emulation-title = Vive 模拟
|
||||
settings-general-fk_settings-vive_emulation-description = 模拟Vive追踪器的腰部丢追问题。( 注:这是一个玩笑功能,会劣化追踪质量。)
|
||||
settings-general-fk_settings-vive_emulation-label = 开启 Vive 模拟
|
||||
@@ -356,6 +373,9 @@ settings-general-gesture_control-taps =
|
||||
{ $amount ->
|
||||
*[other] { $amount }次敲击
|
||||
}
|
||||
# This is a unit: 3 trackers, 2 trackers, 1 tracker
|
||||
# $amount (Number) - Amount of trackers
|
||||
settings-general-gesture_control-trackers = { $amount } 个追踪器
|
||||
settings-general-gesture_control-yawResetEnabled = 开启敲击重置航向轴
|
||||
settings-general-gesture_control-yawResetDelay = 敲击重置航向轴延迟
|
||||
settings-general-gesture_control-yawResetTaps = 重置航向轴敲击次数
|
||||
@@ -365,13 +385,32 @@ settings-general-gesture_control-fullResetTaps = 完整重置敲击次数
|
||||
settings-general-gesture_control-mountingResetEnabled = 开启敲击重置佩戴
|
||||
settings-general-gesture_control-mountingResetDelay = 敲击重置佩戴延迟
|
||||
settings-general-gesture_control-mountingResetTaps = 重置佩戴敲击次数
|
||||
# The number of trackers that can have higher acceleration before a tap is rejected
|
||||
settings-general-gesture_control-numberTrackersOverThreshold = 可触发敲击重置的追踪器数量
|
||||
settings-general-gesture_control-numberTrackersOverThreshold-description = 如敲击重置不起作用请增加此值。请在保证敲击重置可用的情况下将此值设置的尽可能低,否则会导致误报。
|
||||
|
||||
## Interface settings
|
||||
## Appearance settings
|
||||
|
||||
settings-general-interface = 交互界面
|
||||
settings-interface-appearance = 外观
|
||||
settings-general-interface-dev_mode = 开发者模式
|
||||
settings-general-interface-dev_mode-description = 如果你需要深入的数据或更深入地与连接的追踪器进行交互,打开此模式将会非常有用。
|
||||
settings-general-interface-dev_mode-description = 如果你需要深入的资料或对连接的追踪器进行进阶调整,开启此模式将会非常有用。
|
||||
settings-general-interface-dev_mode-label = 开发者模式
|
||||
settings-general-interface-theme = 主题颜色
|
||||
settings-general-interface-lang = 选择语言
|
||||
settings-general-interface-lang-description = 更改要使用的默认语言
|
||||
settings-general-interface-lang-placeholder = 选择要使用的语言
|
||||
# Keep the font name untranslated
|
||||
settings-interface-appearance-font = 字体
|
||||
settings-interface-appearance-font-description = 修改使用的字体。
|
||||
settings-interface-appearance-font-placeholder = 默认字体
|
||||
settings-interface-appearance-font-os_font = 系统字体
|
||||
settings-interface-appearance-font-slime_font = 默认字体
|
||||
settings-interface-appearance-font_size = 字体缩放
|
||||
settings-interface-appearance-font_size-description = 这会影响除此设置面板外所有界面的字体大小。
|
||||
|
||||
## Notification settings
|
||||
|
||||
settings-interface-notifications = 通知
|
||||
settings-general-interface-serial_detection = 串口设备检测
|
||||
settings-general-interface-serial_detection-description = 每次插入可能是追踪器的新串口设备时,此选项都会显示一个弹出窗口。这有助于改进追踪器的设置过程。
|
||||
settings-general-interface-serial_detection-label = 串口设备检测
|
||||
@@ -379,10 +418,6 @@ settings-general-interface-feedback_sound = 声音反馈
|
||||
settings-general-interface-feedback_sound-description = 开启此选项会在触发重置时发出提示音
|
||||
settings-general-interface-feedback_sound-label = 声音反馈
|
||||
settings-general-interface-feedback_sound-volume = 提示音音量
|
||||
settings-general-interface-theme = 主题颜色
|
||||
settings-general-interface-lang = 选择语言
|
||||
settings-general-interface-lang-description = 更改要使用的默认语言
|
||||
settings-general-interface-lang-placeholder = 选择要使用的语言
|
||||
|
||||
## Serial settings
|
||||
|
||||
@@ -411,7 +446,7 @@ settings-osc-router = OSC 路由
|
||||
# This cares about multilines
|
||||
settings-osc-router-description =
|
||||
从另一个程序转发 OSC 信息。
|
||||
在使用另一个 VRChat 的 OSC 程序时会很有用。
|
||||
例如需要在 VRChat 同时使用另一个 OSC 程序。
|
||||
settings-osc-router-enable = 启用
|
||||
settings-osc-router-enable-description = 控制信息转发功能的开关。
|
||||
settings-osc-router-enable-label = 启用
|
||||
@@ -747,7 +782,10 @@ onboarding-choose_proportions-description =
|
||||
onboarding-choose_proportions-auto_proportions = 自动调整身体比例
|
||||
# Italized text
|
||||
onboarding-choose_proportions-auto_proportions-subtitle = 推荐
|
||||
onboarding-choose_proportions-auto_proportions-description = 这将录制你的运动样本并通过AI来猜测你的身体比例
|
||||
onboarding-choose_proportions-auto_proportions-descriptionv2 =
|
||||
这将录制你的运动样本并通过算法来推测你的身体比例。
|
||||
|
||||
<b>需要连接头戴设备到 SlimeVR!</b>
|
||||
onboarding-choose_proportions-manual_proportions = 手动调整身体比例
|
||||
# Italized text
|
||||
onboarding-choose_proportions-manual_proportions-subtitle = 用于精细调整
|
||||
@@ -783,6 +821,18 @@ onboarding-automatic_proportions-requirements-description =
|
||||
你的追踪器和头戴设备在 SlimeVR 服务器中工作正常。
|
||||
你的头戴设备在回报位置信息给 SlimeVR 服务器(通常需要 SteamVR 正在运行且通过 SlimeVR 的 SteamVR 驱动连接到 SlimeVR)。
|
||||
onboarding-automatic_proportions-requirements-next = 我已阅读
|
||||
onboarding-automatic_proportions-check_height-title = 检查你的身高
|
||||
onboarding-automatic_proportions-check_height-description = 我们会使用头戴设备回报的高度来推算您的实际身高,但我们仍建议您检查一下数值是否正确。
|
||||
# All the text is in bold!
|
||||
onboarding-automatic_proportions-check_height-calculation_warning = 请<u>站直</u>后按下按钮以计算身高,按下后您有 3 秒钟来调整姿势。
|
||||
onboarding-automatic_proportions-check_height-fetch_height = 我站好了!
|
||||
# Context is that the height is unknown
|
||||
onboarding-automatic_proportions-check_height-unknown = 未知
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-height = 你的身高是
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-hmd_height = 然后,头戴设备的高度是
|
||||
onboarding-automatic_proportions-check_height-next_step = 数值没问题
|
||||
onboarding-automatic_proportions-start_recording-title = 准备录制运动
|
||||
onboarding-automatic_proportions-start_recording-description = 我们现在要记录一些特定的姿势和动作。这些将在下一个屏幕中提示。当按钮被按下时,准备好开始!
|
||||
onboarding-automatic_proportions-start_recording-next = 开始录制
|
||||
@@ -808,6 +858,10 @@ onboarding-automatic_proportions-verify_results-redo = 重新录制
|
||||
onboarding-automatic_proportions-verify_results-confirm = 他们是正确的!
|
||||
onboarding-automatic_proportions-done-title = 身体数据已测量并保存。
|
||||
onboarding-automatic_proportions-done-description = 你的身体比例校准已完成!
|
||||
onboarding-automatic_proportions-error_modal =
|
||||
<b>警告:</b> 推算身体比例时发生错误!
|
||||
请 <docs>阅读文档</docs> 或加入我们的 <discord>Discord</discord> 寻求帮助 ^_^
|
||||
onboarding-automatic_proportions-error_modal-confirm = 了解!
|
||||
|
||||
## Home
|
||||
|
||||
|
||||
@@ -19,7 +19,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 次追蹤器來選擇它。
|
||||
@@ -34,7 +34,7 @@ body_part-RIGHT_UPPER_ARM = 右上臂
|
||||
body_part-RIGHT_LOWER_ARM = 右前臂
|
||||
body_part-RIGHT_HAND = 右手
|
||||
body_part-RIGHT_UPPER_LEG = 右大腿
|
||||
body_part-RIGHT_LOWER_LEG = 右小腿
|
||||
body_part-RIGHT_LOWER_LEG = 右腳踝
|
||||
body_part-RIGHT_FOOT = 右腳
|
||||
body_part-UPPER_CHEST = 上胸
|
||||
body_part-CHEST = 胸部
|
||||
@@ -45,7 +45,7 @@ body_part-LEFT_UPPER_ARM = 左上臂
|
||||
body_part-LEFT_LOWER_ARM = 左前臂
|
||||
body_part-LEFT_HAND = 左手
|
||||
body_part-LEFT_UPPER_LEG = 左大腿
|
||||
body_part-LEFT_LOWER_LEG = 左小腿
|
||||
body_part-LEFT_LOWER_LEG = 左腳踝
|
||||
body_part-LEFT_FOOT = 左腳
|
||||
|
||||
## Proportions
|
||||
@@ -122,6 +122,10 @@ widget-overlay-is_mirrored_label = 鏡像顯示內嵌介面
|
||||
|
||||
widget-drift_compensation-clear = 清除偏移補償數據
|
||||
|
||||
## Widget: Clear Reset Mounting
|
||||
|
||||
widget-clear_mounting = 清除配戴重置
|
||||
|
||||
## Widget: Developer settings
|
||||
|
||||
widget-developer_mode = 開發者選項
|
||||
@@ -165,9 +169,15 @@ tracker-table-column-url = URL
|
||||
## Tracker rotation
|
||||
|
||||
tracker-rotation-front = 前
|
||||
tracker-rotation-front_left = 左前方
|
||||
tracker-rotation-front_right = 右前方
|
||||
tracker-rotation-left = 左
|
||||
tracker-rotation-right = 右
|
||||
tracker-rotation-back = 後
|
||||
tracker-rotation-back_left = 左後方
|
||||
tracker-rotation-back_right = 右後方
|
||||
tracker-rotation-custom = 自訂
|
||||
tracker-rotation-overriden = (本設定已被配戴重置覆蓋)
|
||||
|
||||
## Tracker information
|
||||
|
||||
@@ -229,7 +239,7 @@ tracker_selection_menu-RIGHT_UPPER_ARM = { -tracker_selection-part }右上臂?
|
||||
tracker_selection_menu-RIGHT_LOWER_ARM = { -tracker_selection-part }右前臂?
|
||||
tracker_selection_menu-RIGHT_HAND = { -tracker_selection-part }右手?
|
||||
tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part }右大腿?
|
||||
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part }右小腿?
|
||||
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part }右腳踝?
|
||||
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part }右腳?
|
||||
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part }右控制器?
|
||||
tracker_selection_menu-UPPER_CHEST = { -tracker_selection-part }上胸?
|
||||
@@ -241,7 +251,7 @@ 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 }左手?
|
||||
tracker_selection_menu-LEFT_UPPER_LEG = { -tracker_selection-part }左大腿?
|
||||
tracker_selection_menu-LEFT_LOWER_LEG = { -tracker_selection-part }左小腿?
|
||||
tracker_selection_menu-LEFT_LOWER_LEG = { -tracker_selection-part }左腳踝?
|
||||
tracker_selection_menu-LEFT_FOOT = { -tracker_selection-part }左腳?
|
||||
tracker_selection_menu-LEFT_CONTROLLER = { -tracker_selection-part }左控制器?
|
||||
tracker_selection_menu-unassigned = 尚未分配的追蹤器
|
||||
@@ -272,6 +282,8 @@ settings-sidebar-osc_router = OSC 路由
|
||||
settings-sidebar-osc_trackers = VRChat OSC 追蹤器
|
||||
settings-sidebar-utils = 工具
|
||||
settings-sidebar-serial = 串列埠終端
|
||||
settings-sidebar-appearance = 外觀
|
||||
settings-sidebar-notifications = 通知
|
||||
|
||||
## SteamVR settings
|
||||
|
||||
@@ -282,8 +294,8 @@ settings-general-steamvr-subtitle = SteamVR 追蹤器
|
||||
# The first spaces (not tabs) for indentation will be ignored, just to make the file look nice when writing.
|
||||
# This one is one of this cases that cares about multilines
|
||||
settings-general-steamvr-description =
|
||||
開啟或關閉特定的 SteamVR 追蹤器。
|
||||
對於只支援特定追蹤器的遊戲或應用程式會很有用。
|
||||
開啟或關閉特定的 SteamVR 追蹤器,
|
||||
對於只支援特定追蹤器的遊戲或應用程式,本功能會有所幫助。
|
||||
settings-general-steamvr-trackers-waist = 腰部
|
||||
settings-general-steamvr-trackers-chest = 胸部
|
||||
settings-general-steamvr-trackers-feet = 腳部
|
||||
@@ -339,11 +351,21 @@ settings-general-fk_settings-leg_fk = 腿部追蹤
|
||||
settings-general-fk_settings-arm_fk = 手臂追蹤
|
||||
settings-general-fk_settings-arm_fk-description = 強制透過頭戴顯示器來追蹤手臂,即使有手部的定位資料。
|
||||
settings-general-fk_settings-arm_fk-force_arms = 強制從頭戴顯示器進行手臂追蹤
|
||||
settings-general-fk_settings-skeleton_settings = 骨架設定
|
||||
settings-general-fk_settings-skeleton_settings-toggles = 骨架設定
|
||||
settings-general-fk_settings-skeleton_settings-description = 開啟或關閉骨架設定。建議保持這些設定開啟。
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine = 脊椎延伸
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis = 骨盆延伸
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees = 膝蓋延伸
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine_model = 延伸脊椎模型
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis_model = 延伸骨盆模型
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees_model = 延伸膝蓋模型
|
||||
settings-general-fk_settings-skeleton_settings-ratios = 骨架比例
|
||||
settings-general-fk_settings-skeleton_settings-ratios-description = 修改骨架設定的參數,您可能需要在修改後調整軀幹比例。
|
||||
settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_hip = 從胸部與臀部推算腰部
|
||||
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-self_localization-title = 動作捕捉模式
|
||||
settings-general-fk_settings-self_localization-description = 動作捕捉模式允許在沒有頭戴顯示器或其他追蹤器時,粗略的追蹤身體骨架的定位。請注意,本功能需要腳部與頭部的追蹤器,並且本功能仍在實驗階段。
|
||||
settings-general-fk_settings-vive_emulation-title = Vive 模擬
|
||||
settings-general-fk_settings-vive_emulation-description = 模擬 Vive 追蹤器的腰部追蹤失效問題。( 註:這是一個玩笑功能,會降低追蹤品質。)
|
||||
settings-general-fk_settings-vive_emulation-label = 開啟 Vive 模擬
|
||||
@@ -359,6 +381,9 @@ settings-general-gesture_control-taps =
|
||||
{ $amount ->
|
||||
*[other] { $amount } 次敲擊
|
||||
}
|
||||
# This is a unit: 3 trackers, 2 trackers, 1 tracker
|
||||
# $amount (Number) - Amount of trackers
|
||||
settings-general-gesture_control-trackers = { $amount } 個追蹤器
|
||||
settings-general-gesture_control-yawResetEnabled = 敲擊以左右偏擺重置
|
||||
settings-general-gesture_control-yawResetDelay = 左右偏擺重置延遲
|
||||
settings-general-gesture_control-yawResetTaps = 左右偏擺重置敲擊次數
|
||||
@@ -368,30 +393,45 @@ settings-general-gesture_control-fullResetTaps = 完整重置敲擊次數
|
||||
settings-general-gesture_control-mountingResetEnabled = 敲擊以配戴重置
|
||||
settings-general-gesture_control-mountingResetDelay = 重置佩戴延遲
|
||||
settings-general-gesture_control-mountingResetTaps = 重置佩戴敲擊次數
|
||||
# The number of trackers that can have higher acceleration before a tap is rejected
|
||||
settings-general-gesture_control-numberTrackersOverThreshold = 觸發敲擊判定的最多追蹤器數量
|
||||
settings-general-gesture_control-numberTrackersOverThreshold-description = 如果敲擊偵測無法作動,請嘗試增加此值以降低敲擊判定的門檻。為避免誤判,請勿設定超過所需要的數值。
|
||||
|
||||
## Interface settings
|
||||
## Appearance settings
|
||||
|
||||
settings-general-interface = 使用者介面
|
||||
settings-interface-appearance = 外觀
|
||||
settings-general-interface-dev_mode = 開發者模式
|
||||
settings-general-interface-dev_mode-description = 如果你需要深入的資料或與連線的追蹤器進行進階互動,開啟此模式將會非常有用。
|
||||
settings-general-interface-dev_mode-description = 本功能會提供更深入的資料,也能與已連線的追蹤器進行更進一步的控制。
|
||||
settings-general-interface-dev_mode-label = 開發者模式
|
||||
settings-general-interface-theme = 佈景主題色彩
|
||||
settings-general-interface-lang = 選擇語言
|
||||
settings-general-interface-lang-description = 更改所使用的介面語言。
|
||||
settings-general-interface-lang-placeholder = 選擇要使用的語言
|
||||
# Keep the font name untranslated
|
||||
settings-interface-appearance-font = UI 字體
|
||||
settings-interface-appearance-font-description = 本設定會修改 UI 所使用的字體。
|
||||
settings-interface-appearance-font-placeholder = 預設字體
|
||||
settings-interface-appearance-font-os_font = 作業系統字體
|
||||
settings-interface-appearance-font-slime_font = 預設字體
|
||||
settings-interface-appearance-font_size = 文字縮放
|
||||
settings-interface-appearance-font_size-description = 本設定會影響整個 UI 的文字大小,除了本設定面板以外。
|
||||
|
||||
## Notification settings
|
||||
|
||||
settings-interface-notifications = 通知
|
||||
settings-general-interface-serial_detection = 串列埠裝置檢測
|
||||
settings-general-interface-serial_detection-description = 每次插入新串列埠的裝置(可能是追蹤器)時,此選項會顯示一個彈出視窗。這有助於改進追蹤器的設定流程。
|
||||
settings-general-interface-serial_detection-label = 串列埠裝置檢測
|
||||
settings-general-interface-feedback_sound = 聲音回饋
|
||||
settings-general-interface-feedback_sound-description = 啟用本選項後,觸發重置時會發出提示音
|
||||
settings-general-interface-feedback_sound-description = 啟用本選項後,觸發重置時會發出提示音。
|
||||
settings-general-interface-feedback_sound-label = 聲音回饋
|
||||
settings-general-interface-feedback_sound-volume = 聲音回饋音量
|
||||
settings-general-interface-theme = 佈景主題色彩
|
||||
settings-general-interface-lang = 選擇語言
|
||||
settings-general-interface-lang-description = 更改要使用的預設語言
|
||||
settings-general-interface-lang-placeholder = 選擇要使用的語言
|
||||
|
||||
## Serial settings
|
||||
|
||||
settings-serial = 串列埠終端
|
||||
# This cares about multilines
|
||||
settings-serial-description = 這裡用於顯示串列埠的即時資訊,有助於瞭解韌體是否發生問題。
|
||||
settings-serial-description = 這裡用於顯示串列埠的即時資訊,可能有助於瞭解韌體是否發生問題。
|
||||
settings-serial-connection_lost = 串列埠連線中斷,正在重新連線……
|
||||
settings-serial-reboot = 重新啟動
|
||||
settings-serial-factory_reset = 恢復出廠設定
|
||||
@@ -412,7 +452,7 @@ settings-osc-router = OSC 路由
|
||||
# This cares about multilines
|
||||
settings-osc-router-description =
|
||||
從另一個程式轉發 OSC 訊息。
|
||||
例如在 VRChat 同時使用另一個 OSC 程式時,此功能會有幫助。
|
||||
例如需要在 VRChat 同時使用另一個 OSC 程式時,可以使用本功能。
|
||||
settings-osc-router-enable = 啟用
|
||||
settings-osc-router-enable-description = 切換轉發 OSC 訊息。
|
||||
settings-osc-router-enable-label = 啟用
|
||||
@@ -465,13 +505,13 @@ settings-osc-vrchat-network-trackers-elbows = 肘部
|
||||
settings-osc-vmc = Virtual Motion Capture
|
||||
# This cares about multilines
|
||||
settings-osc-vmc-description =
|
||||
修改 VMC (Virtual Motion Capture) 協定的相關設定
|
||||
以傳送 SlimeVR 的骨骼資料,並接收來自其他應用程式的骨骼資料
|
||||
修改 VMC (Virtual Motion Capture) 協定的相關設定,
|
||||
以傳送 SlimeVR 的骨骼資料,並接收來自其他應用程式的骨骼資料。
|
||||
settings-osc-vmc-enable = 啟用
|
||||
settings-osc-vmc-enable-description = 切換資料的傳送和接收。
|
||||
settings-osc-vmc-enable-label = 啟用
|
||||
settings-osc-vmc-network = 連接埠
|
||||
settings-osc-vmc-network-description = 設定用於監聽和傳送 VMC 資料的連接埠
|
||||
settings-osc-vmc-network-description = 設定用於監聽和傳送 VMC 資料的連接埠。
|
||||
settings-osc-vmc-network-port_in =
|
||||
.label = 輸入埠
|
||||
.placeholder = 輸入埠(預設:39540)
|
||||
@@ -479,10 +519,10 @@ 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-description = 載入 VRM 模型以允許頭部錨定,並與其他應用程式有更高的相容性。
|
||||
settings-osc-vmc-vrm-model_unloaded = 未載入模型
|
||||
settings-osc-vmc-vrm-model_loaded =
|
||||
{ $titled ->
|
||||
@@ -544,7 +584,7 @@ onboarding-reset_tutorial-1 =
|
||||
onboarding-reset_tutorial-2 =
|
||||
對所標記之追蹤器敲擊 { $taps } 次即可觸發配戴重置。
|
||||
|
||||
配戴校正能對追蹤器實際的配戴方式進行調整,因此若您不小心移動到追蹤器,或是大幅度的變更配戴方向,這個功能會有所幫助。
|
||||
配戴重置能對追蹤器實際的配戴方式進行調整,因此若您不小心移動到追蹤器,或是大幅度的變更配戴方向,這個功能會有所幫助。
|
||||
|
||||
做此校正時需要進行滑雪姿勢,如自動配戴校正的畫面所示。在觸發 3 秒後(可修改)才會真正進行重置。
|
||||
|
||||
@@ -748,7 +788,10 @@ onboarding-choose_proportions-description =
|
||||
onboarding-choose_proportions-auto_proportions = 自動軀幹比例校正
|
||||
# Italized text
|
||||
onboarding-choose_proportions-auto_proportions-subtitle = 推薦使用
|
||||
onboarding-choose_proportions-auto_proportions-description = 本選項會透過演算法,分析身體的移動來推算軀幹比例
|
||||
onboarding-choose_proportions-auto_proportions-descriptionv2 =
|
||||
本選項會從您的身體動作錄製一段樣本,並通過演算法來推算您的軀幹比例。
|
||||
|
||||
<b>使用本功能需要連接頭戴顯示器到 SlimeVR!</b>
|
||||
onboarding-choose_proportions-manual_proportions = 手動軀幹比例校正
|
||||
# Italized text
|
||||
onboarding-choose_proportions-manual_proportions-subtitle = 適合進行微調
|
||||
@@ -784,6 +827,18 @@ onboarding-automatic_proportions-requirements-description =
|
||||
你的追蹤器與頭戴顯示器在 SlimeVR 伺服器中運作正常。
|
||||
你的頭戴顯示器會回報定位資料給 SlimeVR 伺服器(通常為執行 SteamVR 並透過 SlimeVR 的 SteamVR 驅動程式來連接 SlimeVR)。
|
||||
onboarding-automatic_proportions-requirements-next = 我已閱讀使用需求
|
||||
onboarding-automatic_proportions-check_height-title = 檢查您的身高
|
||||
onboarding-automatic_proportions-check_height-description = 我們會透過頭戴顯示器回報的高度來推算您的實際身高,但我們仍建議您檢查一下數值是否正確。
|
||||
# All the text is in bold!
|
||||
onboarding-automatic_proportions-check_height-calculation_warning = 請<u>站直</u>並按下按鈕以計算身高,按下按鈕後您有 3 秒鐘來調整姿勢。
|
||||
onboarding-automatic_proportions-check_height-fetch_height = 我站著了!
|
||||
# Context is that the height is unknown
|
||||
onboarding-automatic_proportions-check_height-unknown = 不明
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-height = 您的身高為
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-hmd_height = 然後頭戴顯示器的高度是
|
||||
onboarding-automatic_proportions-check_height-next_step = 數值沒問題
|
||||
onboarding-automatic_proportions-start_recording-title = 準備擺動作囉
|
||||
onboarding-automatic_proportions-start_recording-description = 我們現在要記錄一些特定的姿勢和動作,將會在下一個畫面中提示。當按鈕被按下時,準備好開始!
|
||||
onboarding-automatic_proportions-start_recording-next = 開始錄製
|
||||
@@ -809,6 +864,10 @@ onboarding-automatic_proportions-verify_results-redo = 重新錄製
|
||||
onboarding-automatic_proportions-verify_results-confirm = 他們是正確的!
|
||||
onboarding-automatic_proportions-done-title = 身體資料已測量並儲存。
|
||||
onboarding-automatic_proportions-done-description = 你的身體比例校正已完成!
|
||||
onboarding-automatic_proportions-error_modal =
|
||||
<b>警告:</b> 推算軀幹比例時發生錯誤。
|
||||
請<docs>閱讀文件</docs>或加入我們的 <discord>Discord</discord> 伺服器以尋求協助 ^_^
|
||||
onboarding-automatic_proportions-error_modal-confirm = 瞭解!
|
||||
|
||||
## Home
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 312 KiB |
BIN
gui/public/images/boxslime.webp
Normal file
|
After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 1.5 MiB |
BIN
gui/public/images/front-standing-pose.webp
Normal file
|
After Width: | Height: | Size: 151 KiB |
|
Before Width: | Height: | Size: 1.1 MiB |
BIN
gui/public/images/mounting-reset-pose.webp
Normal file
|
After Width: | Height: | Size: 108 KiB |
|
Before Width: | Height: | Size: 998 KiB |
BIN
gui/public/images/reset-pose.webp
Normal file
|
After Width: | Height: | Size: 97 KiB |
|
Before Width: | Height: | Size: 758 KiB |
BIN
gui/public/images/slime-girl.webp
Normal file
|
After Width: | Height: | Size: 127 KiB |
|
Before Width: | Height: | Size: 426 KiB |
BIN
gui/public/images/slimes.webp
Normal file
|
After Width: | Height: | Size: 46 KiB |
|
Before Width: | Height: | Size: 387 KiB |
BIN
gui/public/images/slimetower.webp
Normal file
|
After Width: | Height: | Size: 20 KiB |
@@ -30,7 +30,8 @@ serde_json = "1"
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
tauri = { version = "1.4", features = ["devtools", "dialog", "dialog-save", "fs-all", "os-all", "path-all", "shell-execute", "shell-open", "window-close", "window-maximize", "window-minimize", "window-set-resizable", "window-set-size", "window-set-title", "window-start-dragging", "window-unmaximize", "window-unminimize"] }
|
||||
tauri-runtime = "0.14"
|
||||
pretty_env_logger = "0.5"
|
||||
flexi_logger = "0.25"
|
||||
log-panics = { version = "2", features = ["with-backtrace"] }
|
||||
log = "0.4"
|
||||
clap = { version = "4.0.29", features = ["derive"] }
|
||||
clap-verbosity-flag = "2"
|
||||
@@ -38,7 +39,7 @@ rand = "0.8.5"
|
||||
tempfile = "3"
|
||||
which = "4.3"
|
||||
glob = "0.3"
|
||||
open = "4"
|
||||
open = "5"
|
||||
shadow-rs = { version = "0.23", default-features = false }
|
||||
const_format = "0.2.30"
|
||||
cfg-if = "1"
|
||||
|
||||
@@ -9,6 +9,7 @@ use std::time::Duration;
|
||||
use std::time::Instant;
|
||||
|
||||
use clap::Parser;
|
||||
use color_eyre::Result;
|
||||
use state::WindowState;
|
||||
use tauri::api::process::{Command, CommandChild};
|
||||
use tauri::Manager;
|
||||
@@ -38,22 +39,55 @@ fn update_window_state(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn main() {
|
||||
#[tauri::command]
|
||||
fn logging(msg: String) {
|
||||
log::info!(target: "webview", "{}", msg)
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn erroring(msg: String) {
|
||||
log::error!(target: "webview", "{}", msg)
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn warning(msg: String) {
|
||||
log::warn!(target: "webview", "{}", msg)
|
||||
}
|
||||
|
||||
fn main() -> Result<()> {
|
||||
log_panics::init();
|
||||
let hook = panic::take_hook();
|
||||
// Make an error dialog box when panicking
|
||||
panic::set_hook(Box::new(|panic_info| {
|
||||
println!("{}", panic_info);
|
||||
panic::set_hook(Box::new(move |panic_info| {
|
||||
show_error(&panic_info.to_string());
|
||||
hook(panic_info);
|
||||
}));
|
||||
|
||||
let cli = Cli::parse();
|
||||
let tauri_context = tauri::generate_context!();
|
||||
|
||||
// Set up loggers and global handlers
|
||||
{
|
||||
if std::env::var_os("RUST_LOG").is_none() {
|
||||
std::env::set_var("RUST_LOG", "info")
|
||||
}
|
||||
pretty_env_logger::init();
|
||||
}
|
||||
let _logger = {
|
||||
use flexi_logger::{
|
||||
Age, Cleanup, Criterion, Duplicate, FileSpec, Logger, Naming, WriteMode,
|
||||
};
|
||||
use tauri::api::path::app_log_dir;
|
||||
|
||||
Logger::try_with_env_or_str("info")?
|
||||
.log_to_file(FileSpec::default().directory(
|
||||
app_log_dir(tauri_context.config()).expect("We need a log dir"),
|
||||
))
|
||||
.format_for_files(util::logger_format)
|
||||
.format_for_stderr(util::logger_format)
|
||||
.rotate(
|
||||
Criterion::Age(Age::Day),
|
||||
Naming::Timestamps,
|
||||
Cleanup::KeepLogFiles(2),
|
||||
)
|
||||
.duplicate_to_stderr(Duplicate::All)
|
||||
.write_mode(WriteMode::BufferAndFlush)
|
||||
.start()?
|
||||
};
|
||||
|
||||
// Ensure child processes die when spawned on windows
|
||||
// and then check for WebView2's existence
|
||||
@@ -86,7 +120,7 @@ fn main() {
|
||||
if confirm {
|
||||
open::that("https://docs.slimevr.dev/server-setup/installing-and-connecting.html#install-the-latest-slimevr-installer").unwrap();
|
||||
}
|
||||
return;
|
||||
return Ok(());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -106,7 +140,7 @@ fn main() {
|
||||
.or_else(|| valid_java_paths().first().map(|x| x.0.to_owned()));
|
||||
let Some(java_bin) = java_bin else {
|
||||
show_error(&format!("Couldn't find a compatible Java version, please download Java {} or higher", MINIMUM_JAVA_VERSION));
|
||||
return;
|
||||
return Ok(());
|
||||
};
|
||||
|
||||
log::info!("Using Java binary: {:?}", java_bin);
|
||||
@@ -124,7 +158,12 @@ fn main() {
|
||||
|
||||
let exit_flag_terminated = exit_flag.clone();
|
||||
let build_result = tauri::Builder::default()
|
||||
.invoke_handler(tauri::generate_handler![update_window_state])
|
||||
.invoke_handler(tauri::generate_handler![
|
||||
update_window_state,
|
||||
logging,
|
||||
erroring,
|
||||
warning
|
||||
])
|
||||
.setup(move |app| {
|
||||
let window_state =
|
||||
WindowState::open_state(app.path_resolver().app_config_dir().unwrap())
|
||||
@@ -190,7 +229,7 @@ fn main() {
|
||||
WindowEvent::Resized(_) => std::thread::sleep(std::time::Duration::from_nanos(1)),
|
||||
_ => (),
|
||||
})
|
||||
.build(tauri::generate_context!());
|
||||
.build(tauri_context);
|
||||
match build_result {
|
||||
Ok(app) => {
|
||||
app.run(move |app_handle, event| match event {
|
||||
@@ -246,4 +285,6 @@ fn main() {
|
||||
show_error(&error.to_string());
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -10,6 +10,8 @@ use std::{
|
||||
|
||||
use clap::Parser;
|
||||
use const_format::concatcp;
|
||||
use flexi_logger::{DeferredNow, style};
|
||||
use log::Record;
|
||||
use shadow_rs::shadow;
|
||||
use tempfile::Builder;
|
||||
|
||||
@@ -216,3 +218,25 @@ pub fn valid_java_paths() -> Vec<(OsString, i32)> {
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
pub fn logger_format(
|
||||
w: &mut dyn std::io::Write,
|
||||
_now: &mut DeferredNow,
|
||||
record: &Record,
|
||||
) -> Result<(), std::io::Error> {
|
||||
let level = record.level();
|
||||
let module_path = record.module_path().unwrap_or("<unnamed>");
|
||||
// optionally print target
|
||||
let target = if module_path.starts_with(record.target()) {
|
||||
"".to_string()
|
||||
} else {
|
||||
format!(", {}", record.target())
|
||||
};
|
||||
write!(
|
||||
w,
|
||||
"{} [{}{target}] {}",
|
||||
style(level).paint(level.to_string()),
|
||||
record.module_path().unwrap_or("<unnamed>"),
|
||||
style(level).paint(record.args().to_string())
|
||||
)
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
"deb": {
|
||||
"depends": ["openjdk-17-jre-headless"],
|
||||
"files": {
|
||||
"/usr/share/slimevr/slimevr.jar": "../../server/build/libs/slimevr.jar"
|
||||
"/usr/share/slimevr/slimevr.jar": "../../server/desktop/build/libs/slimevr.jar"
|
||||
}
|
||||
},
|
||||
"appimage": {
|
||||
|
||||
@@ -50,10 +50,13 @@ import { open } from '@tauri-apps/api/shell';
|
||||
import semver from 'semver';
|
||||
import { useBreakpoint } from './hooks/breakpoint';
|
||||
import { VRModePage } from './components/vr-mode/VRModePage';
|
||||
import { InterfaceSettings } from './components/settings/pages/InterfaceSettings';
|
||||
import { error, log } from './utils/logging';
|
||||
|
||||
export const GH_REPO = 'SlimeVR/SlimeVR-Server';
|
||||
export const VersionContext = createContext('');
|
||||
export const DOCS_SITE = 'https://docs.slimevr.dev/';
|
||||
export const DOCS_SITE = 'https://docs.slimevr.dev';
|
||||
export const SLIMEVR_DISCORD = 'https://discord.gg/slimevr';
|
||||
|
||||
function Layout() {
|
||||
const { loading } = useConfig();
|
||||
@@ -103,6 +106,7 @@ function Layout() {
|
||||
<Route path="osc/router" element={<OSCRouterSettings />} />
|
||||
<Route path="osc/vrchat" element={<VRCOSCSettings />} />
|
||||
<Route path="osc/vmc" element={<VMCSettings />} />
|
||||
<Route path="interface" element={<InterfaceSettings />} />
|
||||
</Route>
|
||||
<Route
|
||||
path="/onboarding"
|
||||
@@ -166,19 +170,19 @@ export default function App() {
|
||||
setUpdateFound(releases[0].tag_name);
|
||||
}
|
||||
}
|
||||
fetchReleases().catch(() => console.error('failed to fetch releases'));
|
||||
fetchReleases().catch(() => error('failed to fetch releases'));
|
||||
}, []);
|
||||
|
||||
if (window.__TAURI_METADATA__) {
|
||||
useEffect(() => {
|
||||
os.type()
|
||||
.then((type) => document.body.classList.add(type.toLowerCase()))
|
||||
.catch(console.error);
|
||||
.catch(error);
|
||||
|
||||
return () => {
|
||||
os.type()
|
||||
.then((type) => document.body.classList.remove(type.toLowerCase()))
|
||||
.catch(console.error);
|
||||
.catch(error);
|
||||
};
|
||||
}, []);
|
||||
}
|
||||
@@ -192,6 +196,7 @@ export default function App() {
|
||||
if ('stderr' === eventType) {
|
||||
// This strange invocation is what lets us lose the line information in the console
|
||||
// See more here: https://stackoverflow.com/a/48994308
|
||||
// These two are fine to keep with console.log, they are server logs
|
||||
setTimeout(
|
||||
console.log.bind(
|
||||
console,
|
||||
@@ -210,11 +215,11 @@ export default function App() {
|
||||
)
|
||||
);
|
||||
} else if (eventType === 'error') {
|
||||
console.error('Error: %s', s);
|
||||
error('Error: %s', s);
|
||||
} else if (eventType === 'terminated') {
|
||||
console.error('Server Process Terminated: %s', s);
|
||||
error('Server Process Terminated: %s', s);
|
||||
} else if (eventType === 'other') {
|
||||
console.log('Other process event: %s', s);
|
||||
log('Other process event: %s', s);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
25
gui/src/components/ClearMountingButton.tsx
Normal file
@@ -0,0 +1,25 @@
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { ClearMountingResetRequestT, RpcMessage } from 'solarxr-protocol';
|
||||
import { useWebsocketAPI } from '../hooks/websocket-api';
|
||||
import { BigButton } from './commons/BigButton';
|
||||
import { TrashIcon } from './commons/icon/TrashIcon';
|
||||
|
||||
export function ClearMountingButton() {
|
||||
const { l10n } = useLocalization();
|
||||
const { sendRPCPacket } = useWebsocketAPI();
|
||||
|
||||
const clearMounting = () => {
|
||||
const record = new ClearMountingResetRequestT();
|
||||
sendRPCPacket(RpcMessage.ClearMountingResetRequest, record);
|
||||
};
|
||||
|
||||
return (
|
||||
<BigButton
|
||||
text={l10n.getString('widget-clear_mounting')}
|
||||
icon={<TrashIcon width={20} />}
|
||||
onClick={clearMounting}
|
||||
>
|
||||
{}
|
||||
</BigButton>
|
||||
);
|
||||
}
|
||||
@@ -77,7 +77,7 @@ export function MainLayoutRoute({
|
||||
>
|
||||
<div
|
||||
className={classNames(
|
||||
'flex flex-col rounded-xl w-full overflow-hidden mobile:overflow-y-auto',
|
||||
'flex flex-col rounded-xl w-full overflow-clip mobile:overflow-y-auto',
|
||||
background && 'bg-background-70'
|
||||
)}
|
||||
>
|
||||
|
||||
@@ -6,6 +6,7 @@ import { Typography } from './commons/Typography';
|
||||
import { open } from '@tauri-apps/api/shell';
|
||||
import semver from 'semver';
|
||||
import { GH_REPO, VersionContext } from '../App';
|
||||
import { error } from '../utils/logging';
|
||||
|
||||
export function VersionUpdateModal() {
|
||||
const { l10n } = useLocalization();
|
||||
@@ -24,7 +25,7 @@ export function VersionUpdateModal() {
|
||||
);
|
||||
}
|
||||
} catch {
|
||||
console.error('failed to parse new version');
|
||||
error('failed to parse new version');
|
||||
}
|
||||
|
||||
return (
|
||||
|
||||
@@ -10,17 +10,19 @@ import { useConfig } from '../hooks/config';
|
||||
import {
|
||||
ResetType,
|
||||
RpcMessage,
|
||||
SettingsRequestT,
|
||||
SettingsResponseT,
|
||||
StatusData,
|
||||
} from 'solarxr-protocol';
|
||||
import { useMemo, useState } from 'react';
|
||||
import { useEffect, useMemo, useState } from 'react';
|
||||
import { parseStatusToLocale, useStatusContext } from '../hooks/status-system';
|
||||
import { useWebsocketAPI } from '../hooks/websocket-api';
|
||||
import { useAppContext } from '../hooks/app';
|
||||
import { ClearMountingButton } from './ClearMountingButton';
|
||||
|
||||
export function WidgetsComponent() {
|
||||
const { config } = useConfig();
|
||||
const { useRPCPacket } = useWebsocketAPI();
|
||||
const { useRPCPacket, sendRPCPacket } = useWebsocketAPI();
|
||||
const [driftCompensationEnabled, setDriftCompensationEnabled] =
|
||||
useState(false);
|
||||
const { trackers } = useAppContext();
|
||||
@@ -31,6 +33,10 @@ export function WidgetsComponent() {
|
||||
[statuses]
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
sendRPCPacket(RpcMessage.SettingsRequest, new SettingsRequestT());
|
||||
}, []);
|
||||
|
||||
useRPCPacket(RpcMessage.SettingsResponse, (settings: SettingsResponseT) => {
|
||||
if (settings.driftCompensation != null)
|
||||
setDriftCompensationEnabled(settings.driftCompensation.enabled);
|
||||
@@ -41,9 +47,8 @@ export function WidgetsComponent() {
|
||||
<div className="grid grid-cols-2 gap-2 w-full [&>*:nth-child(odd):last-of-type]:col-span-full">
|
||||
<ResetButton type={ResetType.Yaw} variant="big"></ResetButton>
|
||||
<ResetButton type={ResetType.Full} variant="big"></ResetButton>
|
||||
{config?.debug && (
|
||||
<ResetButton type={ResetType.Mounting} variant="big"></ResetButton>
|
||||
)}
|
||||
<ResetButton type={ResetType.Mounting} variant="big"></ResetButton>
|
||||
<ClearMountingButton></ClearMountingButton>
|
||||
<BVHButton></BVHButton>
|
||||
<TrackingPauseButton></TrackingPauseButton>
|
||||
{driftCompensationEnabled && (
|
||||
@@ -53,7 +58,7 @@ export function WidgetsComponent() {
|
||||
<div className="w-full">
|
||||
<OverlayWidget></OverlayWidget>
|
||||
</div>
|
||||
<div className="w-full flex flex-col max-h-[33%] gap-3 overflow-y-auto mb-2">
|
||||
<div className="w-full flex flex-col gap-3 mb-2">
|
||||
{unprioritizedStatuses.map((status) => (
|
||||
<Localized
|
||||
id={`status_system-${StatusData[status.dataType]}`}
|
||||
|
||||
14
gui/src/components/commons/A.tsx
Normal file
@@ -0,0 +1,14 @@
|
||||
import { open } from '@tauri-apps/api/shell';
|
||||
import { ReactNode } from 'react';
|
||||
|
||||
export function A({ href, children }: { href: string; children?: ReactNode }) {
|
||||
return (
|
||||
<a
|
||||
href="javascript:void(0)"
|
||||
onClick={() => open(href).catch(() => window.open(href, '_blank'))}
|
||||
className="underline"
|
||||
>
|
||||
{children}
|
||||
</a>
|
||||
);
|
||||
}
|
||||
@@ -19,7 +19,7 @@ export function BigButton({
|
||||
{...props}
|
||||
type="button"
|
||||
className={classNames(
|
||||
'flex flex-col justify-center rounded-md py-3 gap-1 px-3 cursor-pointer items-center ',
|
||||
'flex flex-col justify-center rounded-md py-3 gap-1 px-3 cursor-pointer items-center',
|
||||
{
|
||||
'bg-background-60 hover:bg-background-60 cursor-not-allowed text-background-40 fill-background-40':
|
||||
disabled,
|
||||
@@ -30,7 +30,7 @@ export function BigButton({
|
||||
)}
|
||||
>
|
||||
<div className="flex justify-around">{icon}</div>
|
||||
<div className="flex text-default flex-grow">{text}</div>
|
||||
<div className="flex text-default flex-grow items-center">{text}</div>
|
||||
</button>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import classNames from 'classnames';
|
||||
import React, { ReactNode, useMemo } from 'react';
|
||||
import { NavLink } from 'react-router-dom';
|
||||
import { LoaderIcon } from './icon/LoaderIcon';
|
||||
import { LoaderIcon, SlimeState } from './icon/LoaderIcon';
|
||||
|
||||
function ButtonContent({
|
||||
loading,
|
||||
@@ -29,7 +29,7 @@ function ButtonContent({
|
||||
</div>
|
||||
{loading && (
|
||||
<div className="absolute top-0 left-0 w-full h-full flex justify-center items-center fill-background-10">
|
||||
<LoaderIcon youSpinMeRightRoundBabyRightRound></LoaderIcon>
|
||||
<LoaderIcon slimeState={SlimeState.JUMPY}></LoaderIcon>
|
||||
</div>
|
||||
)}
|
||||
</>
|
||||
|
||||
@@ -6,11 +6,12 @@ import {
|
||||
UseFormGetValues,
|
||||
useWatch,
|
||||
} from 'react-hook-form';
|
||||
import { a11yClick } from '../utils/a11y';
|
||||
import { a11yClick } from '../../utils/a11y';
|
||||
|
||||
export interface DropdownItem {
|
||||
label: string;
|
||||
value: string;
|
||||
fontName?: string;
|
||||
}
|
||||
|
||||
export type DropdownDirection = 'up' | 'down';
|
||||
@@ -130,7 +131,7 @@ export function Dropdown({
|
||||
onKeyDown={(ev) => a11yClick(ev) && setOpen((open) => !open)}
|
||||
tabIndex={0}
|
||||
>
|
||||
<div className="flex-grow">
|
||||
<div className="flex-grow text-standard">
|
||||
{items.find((i) => i.value == value)?.label || placeholder}
|
||||
</div>
|
||||
<div
|
||||
@@ -176,6 +177,7 @@ export function Dropdown({
|
||||
<ul className="py-1 text-sm flex flex-col">
|
||||
{items.map((item) => (
|
||||
<li
|
||||
style={item.fontName ? { fontFamily: item.fontName } : {}}
|
||||
className={classNames(
|
||||
'py-2 px-4 min-w-max cursor-pointer',
|
||||
variant == 'primary' &&
|
||||
|
||||
@@ -10,6 +10,7 @@ export function NumberSelector({
|
||||
min,
|
||||
max,
|
||||
step,
|
||||
disabled = false,
|
||||
}: {
|
||||
label: string;
|
||||
valueLabelFormat?: (value: number) => string;
|
||||
@@ -18,6 +19,7 @@ export function NumberSelector({
|
||||
min: number;
|
||||
max: number;
|
||||
step: number | ((value: number, add: boolean) => number);
|
||||
disabled?: boolean;
|
||||
}) {
|
||||
const stepFn =
|
||||
typeof step === 'function'
|
||||
@@ -32,18 +34,18 @@ export function NumberSelector({
|
||||
render={({ field: { onChange, value } }) => (
|
||||
<div className="flex flex-col gap-1 w-full">
|
||||
<Typography bold>{label}</Typography>
|
||||
<div className="flex gap-2 bg-background-60 p-2 rounded-lg">
|
||||
<div className="flex gap-5 bg-background-60 p-2 rounded-lg">
|
||||
<div className="flex">
|
||||
<Button
|
||||
variant="tertiary"
|
||||
rounded
|
||||
onClick={() => onChange(stepFn(value, false))}
|
||||
disabled={stepFn(value, false) < min}
|
||||
disabled={stepFn(value, false) < min || disabled}
|
||||
>
|
||||
-
|
||||
</Button>
|
||||
</div>
|
||||
<div className="flex flex-grow justify-center items-center w-10">
|
||||
<div className="flex flex-grow justify-center items-center w-10 text-standard">
|
||||
{valueLabelFormat ? valueLabelFormat(value) : value}
|
||||
</div>
|
||||
<div className="flex">
|
||||
@@ -51,7 +53,7 @@ export function NumberSelector({
|
||||
variant="tertiary"
|
||||
rounded
|
||||
onClick={() => onChange(stepFn(value, true))}
|
||||
disabled={stepFn(value, true) > max}
|
||||
disabled={stepFn(value, true) > max || disabled}
|
||||
>
|
||||
+
|
||||
</Button>
|
||||
|
||||
@@ -12,7 +12,7 @@ export function PersonFrontIcon({ width }: { width?: number }) {
|
||||
<image
|
||||
height={'105%'}
|
||||
x="8.5%"
|
||||
href="/images/front-standing-pose.png"
|
||||
href="/images/front-standing-pose.webp"
|
||||
></image>
|
||||
{/* <path d="M84.53 224.074C83.953 230.874 88.569 266.874 90.951 280.984C92.085 287.671 95.195 298.565 94.076 304.349C92.476 312.411 92.017 322.843 92.896 328.918C93.451 332.607 95.196 349.618 92.696 355.845C91.389 359.108 88.996 375.832 88.996 375.832C82.756 391.587 86.278 390.812 86.278 390.812C88.21 393.183 91.519 390.998 91.519 390.998C92.1549 391.464 92.9388 391.682 93.7241 391.612C94.5094 391.542 95.2421 391.188 95.785 390.616C97.949 392.407 100.471 390.396 100.471 390.396C103.189 391.807 105.71 389.205 105.71 389.205C107.271 389.991 107.653 388.998 107.653 388.998C112.337 388.698 105.039 373.706 105.039 373.706C103.291 360.242 106.773 352.748 106.773 352.748C118.178 318.926 118.758 309.948 114.199 297.204C112.915 293.524 112.59 292.067 113.181 290.47C114.547 286.783 113.551 271.953 115.217 266.064C118.431 254.706 121.602 225.903 123.254 212.464C125.475 194.364 115.388 170.088 115.388 170.088C113.179 160.21 116.418 125.016 116.418 125.016C120.941 132.054 120.768 144.477 120.768 144.477C120.05 157.506 131.294 177.42 131.294 177.42C136.694 185.649 138.742 193.456 138.742 194.036C138.742 196.407 138.223 202.145 138.223 202.145L138.43 207.145C138.803 209.721 139.034 212.316 139.123 214.918C138.28 227.953 140.35 225.501 140.35 225.501C142.098 225.501 144.018 215.011 144.018 215.011C144.018 217.711 143.357 225.811 144.818 228.869C146.564 232.512 147.848 228.244 147.871 227.387C148.333 210.787 149.33 215.138 149.33 215.138C150.301 228.602 151.494 231.644 153.63 230.591C155.25 229.818 153.769 214.433 153.769 214.433C156.544 223.572 158.649 225.027 158.649 225.027C163.229 228.243 160.397 219.361 159.76 217.602C156.371 208.256 156.267 205.017 156.267 205.017C160.501 213.417 163.692 213.104 163.692 213.104C167.822 211.786 160.083 199.894 155.548 194.197C153.234 191.297 150.248 187.408 149.384 185.097C147.973 181.188 146.907 168.62 146.907 168.62C146.48 153.79 142.813 147.348 142.813 147.348C136.544 137.314 135.365 118.598 135.365 118.598L135.09 87C132.89 65.445 117.01 65.29 117.01 65.29C100.957 62.9 98.723 57.714 98.723 57.714C95.323 52.821 97.266 43.44 97.266 43.44C100.087 41.145 101.175 35.053 101.175 35.053C105.859 31.461 105.63 26.205 103.466 26.262C101.73 26.308 102.123 24.87 102.123 24.87C105.052 1.208 84.046 0 84.046 0H80.836C80.836 0 59.821 1.208 62.746 24.864C62.746 24.864 63.139 26.304 61.388 26.256C59.23 26.199 59.029 31.456 63.696 35.047C63.696 35.047 64.783 41.137 67.605 43.434C67.605 43.434 69.548 52.814 66.148 57.708C66.148 57.708 63.922 62.894 47.861 65.284C47.861 65.284 31.952 65.44 29.788 86.994L29.488 118.594C29.488 118.594 28.331 137.311 22.038 147.344C22.038 147.344 18.389 153.787 17.967 168.616C17.967 168.616 16.898 181.184 15.492 185.093C14.635 187.393 11.653 191.276 9.32001 194.193C4.74601 199.878 -2.94199 211.745 1.17101 213.1C1.17101 213.1 4.37901 213.412 8.59601 205.013C8.59601 205.013 8.50901 208.229 5.12501 217.598C4.46001 219.334 1.63201 228.217 6.21301 225.024C6.21301 225.024 8.33501 223.567 11.093 214.43C11.093 214.43 9.61301 229.815 11.26 230.588C13.412 231.642 14.586 228.599 15.56 215.135C15.56 215.135 16.56 210.787 17.017 227.384C17.04 228.241 18.295 232.509 20.049 228.866C21.529 225.811 20.864 217.727 20.864 215.008C20.864 215.008 22.764 225.498 24.536 225.498C24.536 225.498 26.624 227.95 25.767 214.915C25.628 212.786 26.375 208.415 26.467 207.142L26.667 202.142C26.667 202.142 26.146 196.417 26.146 194.033C26.146 193.442 28.194 185.646 33.594 177.417C33.594 177.417 44.826 157.494 44.103 144.474C44.103 144.474 43.947 132.051 48.47 125.013C48.47 125.013 51.68 160.205 49.505 170.085C49.505 170.085 39.405 194.358 41.629 212.461C43.27 225.937 46.435 254.702 49.657 266.061C51.34 271.938 50.345 286.761 51.693 290.467C52.301 292.076 51.982 293.558 50.675 297.201C46.141 309.947 46.718 318.925 58.123 352.745C58.123 352.745 61.633 360.239 59.859 373.703C59.859 373.703 52.572 388.695 57.239 388.995C57.239 388.995 57.604 389.988 59.182 389.202C59.182 389.202 61.703 391.802 64.427 390.393C64.427 390.393 66.95 392.407 69.106 390.613C69.6451 391.185 70.3751 391.54 71.158 391.61C71.9409 391.681 72.7225 391.462 73.355 390.995C73.355 390.995 76.664 393.227 78.63 390.809C78.63 390.809 82.123 391.584 75.904 375.829C75.904 375.829 73.522 359.129 72.209 355.842C69.709 349.621 71.474 332.57 72.009 328.915C72.87 322.806 72.409 312.398 70.835 304.346C69.684 298.575 72.801 287.679 73.952 280.981C76.317 266.881 80.952 230.881 80.373 224.071L82.288 224.743C83.0863 224.756 83.8692 224.522 84.53 224.074Z" /> */}
|
||||
<circle
|
||||
|
||||
72
gui/src/components/commons/Range.tsx
Normal file
@@ -0,0 +1,72 @@
|
||||
import classNames from 'classnames';
|
||||
import { Control, Controller } from 'react-hook-form';
|
||||
|
||||
export function Range({
|
||||
control,
|
||||
name,
|
||||
values,
|
||||
min,
|
||||
max,
|
||||
step,
|
||||
// input props
|
||||
...props
|
||||
}: {
|
||||
control: Control<any>;
|
||||
name: string;
|
||||
max: number;
|
||||
min: number;
|
||||
step: number;
|
||||
values: { value: number; label: string; defaultValue?: boolean }[];
|
||||
} & React.HTMLProps<HTMLInputElement>) {
|
||||
return (
|
||||
<Controller
|
||||
control={control}
|
||||
name={name}
|
||||
render={({ field: { onChange, ref, name, value } }) => (
|
||||
<label className="text-standard w-full text-center flex items-center flex-col">
|
||||
<input
|
||||
type="range"
|
||||
className=" text-background-10 border-accent-background-30"
|
||||
style={{
|
||||
width: 'calc(88% - 0.5vw)',
|
||||
}}
|
||||
name={name}
|
||||
ref={ref}
|
||||
value={value}
|
||||
onChange={onChange}
|
||||
list={`${name}-datalist`}
|
||||
min={min}
|
||||
max={max}
|
||||
step={step}
|
||||
{...props}
|
||||
/>
|
||||
<datalist id={`${name}-datalist`} className="">
|
||||
{values.map(({ value }, i) => (
|
||||
<option key={i}>{value}</option>
|
||||
))}
|
||||
</datalist>
|
||||
<div className="w-full flex flex-nowrap overflow-clip">
|
||||
{Array((max - min) / step + 1)
|
||||
.fill(0)
|
||||
.map((_v, i) => {
|
||||
const value = values.find(
|
||||
({ value }) => i * step + min === value
|
||||
);
|
||||
return (
|
||||
<span
|
||||
key={i}
|
||||
className={classNames(
|
||||
'flex-1',
|
||||
value?.defaultValue && 'text-status-success'
|
||||
)}
|
||||
>
|
||||
{value?.label}
|
||||
</span>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
</label>
|
||||
)}
|
||||
/>
|
||||
);
|
||||
}
|
||||
16
gui/src/components/commons/icon/BellIcon.tsx
Normal file
@@ -0,0 +1,16 @@
|
||||
export function BellIcon({ width = 24 }: { width?: number }) {
|
||||
return (
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
strokeWidth={1.5}
|
||||
width={width}
|
||||
>
|
||||
<path
|
||||
strokeLinecap="round"
|
||||
strokeLinejoin="round"
|
||||
d="M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0"
|
||||
/>
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
@@ -1,4 +1,10 @@
|
||||
export function PawIcon({ width = 24 }: { width?: number }) {
|
||||
export function PawIcon({
|
||||
width = 24,
|
||||
transform = '',
|
||||
}: {
|
||||
width?: number;
|
||||
transform?: string;
|
||||
}) {
|
||||
return (
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
@@ -7,7 +13,7 @@ export function PawIcon({ width = 24 }: { width?: number }) {
|
||||
viewBox="0 0 512 512"
|
||||
>
|
||||
<path
|
||||
transform="scale(0.75, 0.75) translate(96, 96)"
|
||||
transform={`${transform} scale(0.75, 0.75) translate(96, 96)`}
|
||||
d="M490.39 182.75c-5.55-13.19-14.77-22.7-26.67-27.49l-.16-.06a46.46 46.46 0 00-17-3.2h-.64c-27.24.41-55.05 23.56-69.19 57.61-10.37 24.9-11.56 51.68-3.18 71.64 5.54 13.2 14.78 22.71 26.73 27.5l.13.05a46.53 46.53 0 0017 3.2c27.5 0 55.6-23.15 70-57.65 10.24-24.87 11.37-51.63 2.98-71.6zM381.55 329.61c-15.71-9.44-30.56-18.37-40.26-34.41C314.53 250.8 298.37 224 256 224s-58.57 26.8-85.39 71.2c-9.72 16.06-24.6 25-40.36 34.48-18.07 10.86-36.74 22.08-44.8 44.16a66.93 66.93 0 00-4.65 25c0 35.95 28 65.2 62.4 65.2 17.75 0 36.64-6.15 56.63-12.66 19.22-6.26 39.09-12.73 56.27-12.73s37 6.47 56.15 12.73C332.2 457.85 351 464 368.8 464c34.35 0 62.3-29.25 62.3-65.2a67 67 0 00-4.75-25c-8.06-22.1-26.74-33.33-44.8-44.19zM150 188.85c11.9 14.93 27 23.15 42.52 23.15a42.88 42.88 0 006.33-.47c32.37-4.76 52.54-44.26 45.92-90C242 102.3 234.6 84.39 224 71.11 212.12 56.21 197 48 181.49 48a42.88 42.88 0 00-6.33.47c-32.37 4.76-52.54 44.26-45.92 90 2.76 19.2 10.16 37.09 20.76 50.38zm163.16 22.68a42.88 42.88 0 006.33.47c15.53 0 30.62-8.22 42.52-23.15 10.59-13.29 17.95-31.18 20.75-50.4 6.62-45.72-13.55-85.22-45.92-90a42.88 42.88 0 00-6.33-.47C315 48 299.88 56.21 288 71.11c-10.6 13.28-18 31.19-20.76 50.44-6.62 45.72 13.55 85.22 45.92 89.98zM111.59 308.8l.14-.05c11.93-4.79 21.16-14.29 26.69-27.48 8.38-20 7.2-46.75-3.15-71.65C120.94 175.16 92.85 152 65.38 152a46.4 46.4 0 00-17 3.2l-.14.05c-11.9 4.75-21.13 14.29-26.66 27.48-8.38 20-7.2 46.75 3.15 71.65C39.06 288.84 67.15 312 94.62 312a46.4 46.4 0 0016.97-3.2z"
|
||||
></path>
|
||||
</svg>
|
||||
|
||||
26
gui/src/components/commons/icon/SlimeUpIcon.tsx
Normal file
@@ -0,0 +1,26 @@
|
||||
export function SlimeUpIcon({ width = 60 }: { width?: number }) {
|
||||
return (
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width={width}
|
||||
version="1.1"
|
||||
viewBox="0 0 16 65.837"
|
||||
>
|
||||
<g transform="translate(-57.584 -23.825)">
|
||||
<rect
|
||||
width="13.926"
|
||||
height="42.377"
|
||||
x="59.526"
|
||||
y="35.434"
|
||||
strokeWidth="0.265"
|
||||
rx="6.963"
|
||||
ry="3.423"
|
||||
></rect>
|
||||
<path
|
||||
strokeWidth="0.195"
|
||||
d="M59.587 23.923c.514 0 .978.382 1.313 1.001.336.62.402 1.512.543 2.425l1.376 8.937v40.902l-1.38 8.95c-.14.917-.206 1.805-.542 2.425-.335.619-.8 1.001-1.314 1.001-1.028 0-2.14-1.59-1.856-3.427l1.38-8.949V36.286l-1.377-8.937c-.281-1.826.828-3.426 1.857-3.426z"
|
||||
></path>
|
||||
</g>
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
@@ -1,6 +1,11 @@
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { useMemo } from 'react';
|
||||
import { ResetRequestT, ResetType, RpcMessage } from 'solarxr-protocol';
|
||||
import {
|
||||
ResetRequestT,
|
||||
ResetType,
|
||||
RpcMessage,
|
||||
StatusData,
|
||||
} from 'solarxr-protocol';
|
||||
import { useConfig } from '../../hooks/config';
|
||||
import { useCountdown } from '../../hooks/countdown';
|
||||
import { useWebsocketAPI } from '../../hooks/websocket-api';
|
||||
@@ -12,6 +17,7 @@ import {
|
||||
YawResetIcon,
|
||||
FullResetIcon,
|
||||
} from '../commons/icon/ResetIcon';
|
||||
import { useStatusContext } from '../../hooks/status-system';
|
||||
|
||||
export function ResetButton({
|
||||
type,
|
||||
@@ -24,8 +30,18 @@ export function ResetButton({
|
||||
}) {
|
||||
const { l10n } = useLocalization();
|
||||
const { sendRPCPacket } = useWebsocketAPI();
|
||||
const { statuses } = useStatusContext();
|
||||
const { config } = useConfig();
|
||||
|
||||
const needsFullReset = useMemo(
|
||||
() =>
|
||||
type === ResetType.Mounting &&
|
||||
Object.values(statuses).some(
|
||||
(status) => status.dataType === StatusData.StatusTrackerReset
|
||||
),
|
||||
[statuses]
|
||||
);
|
||||
|
||||
const reset = () => {
|
||||
const req = new ResetRequestT();
|
||||
req.resetType = type;
|
||||
@@ -75,7 +91,7 @@ export function ResetButton({
|
||||
maybePlaySoundOnResetStarted(type);
|
||||
}}
|
||||
variant="primary"
|
||||
disabled={isCounting}
|
||||
disabled={isCounting || needsFullReset}
|
||||
>
|
||||
<div className="relative">
|
||||
<div className="opacity-0 h-0">{text}</div>
|
||||
@@ -91,7 +107,7 @@ export function ResetButton({
|
||||
startCountdown();
|
||||
maybePlaySoundOnResetStarted(type);
|
||||
}}
|
||||
disabled={isCounting}
|
||||
disabled={isCounting || needsFullReset}
|
||||
></BigButton>
|
||||
),
|
||||
};
|
||||
|
||||
@@ -59,7 +59,7 @@ export function ConnectTrackersPage() {
|
||||
const { isMobile } = useBreakpoint('mobile');
|
||||
const { l10n } = useLocalization();
|
||||
const { layoutHeight, ref } = useLayout<HTMLDivElement>();
|
||||
const { useConnectedTrackers } = useTrackers();
|
||||
const { useConnectedIMUTrackers } = useTrackers();
|
||||
const { applyProgress, state } = useOnboarding();
|
||||
const navigate = useNavigate();
|
||||
const { sendRPCPacket, useRPCPacket } = useWebsocketAPI();
|
||||
@@ -68,9 +68,9 @@ export function ConnectTrackersPage() {
|
||||
|
||||
applyProgress(0.4);
|
||||
|
||||
const connectedTrackers = useConnectedTrackers();
|
||||
const connectedIMUTrackers = useConnectedIMUTrackers();
|
||||
|
||||
const bnoExists = useBnoExists(connectedTrackers);
|
||||
const bnoExists = useBnoExists(connectedIMUTrackers);
|
||||
|
||||
useEffect(() => {
|
||||
if (!state.wifi) {
|
||||
@@ -222,7 +222,7 @@ export function ConnectTrackersPage() {
|
||||
<div className="flex flex-col xs:flex-grow">
|
||||
<Typography color="secondary" bold>
|
||||
{l10n.getString('onboarding-connect_tracker-connected_trackers', {
|
||||
amount: connectedTrackers.length,
|
||||
amount: connectedIMUTrackers.length,
|
||||
})}
|
||||
</Typography>
|
||||
|
||||
@@ -237,8 +237,8 @@ export function ConnectTrackersPage() {
|
||||
>
|
||||
<div className="grid lg:grid-cols-2 md:grid-cols-1 gap-2 pr-1">
|
||||
{Array.from({
|
||||
...connectedTrackers,
|
||||
length: Math.max(connectedTrackers.length, 1),
|
||||
...connectedIMUTrackers,
|
||||
length: Math.max(connectedIMUTrackers.length, 1),
|
||||
}).map((tracker, index) => (
|
||||
<div key={index}>
|
||||
{!tracker && (
|
||||
|
||||
@@ -36,7 +36,7 @@ export function HomePage() {
|
||||
></div>
|
||||
<img
|
||||
className="absolute"
|
||||
src="/images/slime-girl.png"
|
||||
src="/images/slime-girl.webp"
|
||||
style={{
|
||||
width: '35%',
|
||||
maxWidth: 800,
|
||||
@@ -46,7 +46,7 @@ export function HomePage() {
|
||||
/>
|
||||
<img
|
||||
className="absolute"
|
||||
src="/images/slimes.png"
|
||||
src="/images/slimes.webp"
|
||||
style={{
|
||||
width: '35%',
|
||||
maxWidth: 800,
|
||||
|
||||
@@ -17,6 +17,7 @@ import { BodyDisplay } from '../../commons/BodyDisplay';
|
||||
import { useWebsocketAPI } from '../../../hooks/websocket-api';
|
||||
import classNames from 'classnames';
|
||||
import { useBreakpoint } from '../../../hooks/breakpoint';
|
||||
import { log } from '../../../utils/logging';
|
||||
|
||||
export function ResetTutorialPage() {
|
||||
const { isMobile } = useBreakpoint('mobile');
|
||||
@@ -82,7 +83,7 @@ export function ResetTutorialPage() {
|
||||
RpcMessage.ResetResponse,
|
||||
({ status, resetType }: ResetResponseT) => {
|
||||
if (status !== ResetStatus.STARTED) return;
|
||||
console.log(status);
|
||||
log(status);
|
||||
if (resetType === RESET_TYPE_ORDER[curIndex]) {
|
||||
setCurIndex(curIndex + 1);
|
||||
}
|
||||
|
||||
@@ -12,12 +12,12 @@ export function WifiCredsPage() {
|
||||
const { l10n } = useLocalization();
|
||||
const { applyProgress, state } = useOnboarding();
|
||||
const { control, handleSubmit, submitWifiCreds, formState } = useWifiForm();
|
||||
const { useConnectedTrackers } = useTrackers();
|
||||
const connectedTrackers = useConnectedTrackers();
|
||||
const { useConnectedIMUTrackers } = useTrackers();
|
||||
const connectedIMUTrackers = useConnectedIMUTrackers();
|
||||
|
||||
applyProgress(0.2);
|
||||
|
||||
const bnoExists = useBnoExists(connectedTrackers);
|
||||
const bnoExists = useBnoExists(connectedIMUTrackers);
|
||||
|
||||
return (
|
||||
<form
|
||||
|
||||
@@ -11,9 +11,9 @@ import { ExtensionArrow } from './ExtensionArrow';
|
||||
export function AssignmentTutorialPage() {
|
||||
const { l10n } = useLocalization();
|
||||
const { applyProgress } = useOnboarding();
|
||||
const { useConnectedTrackers } = useTrackers();
|
||||
const connectedTrackers = useConnectedTrackers();
|
||||
const bnoExists = useBnoExists(connectedTrackers);
|
||||
const { useConnectedIMUTrackers } = useTrackers();
|
||||
const connectedIMUTrackers = useConnectedIMUTrackers();
|
||||
const bnoExists = useBnoExists(connectedIMUTrackers);
|
||||
|
||||
applyProgress(0.46);
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@ import { Recording } from './autobone-steps/Recording';
|
||||
import { StartRecording } from './autobone-steps/StartRecording';
|
||||
import { VerifyResultsStep } from './autobone-steps/VerifyResults';
|
||||
import { useCountdown } from '../../../../hooks/countdown';
|
||||
import { CheckHeight } from './autobone-steps/СheckHeight';
|
||||
|
||||
export function AutomaticProportionsPage() {
|
||||
const { l10n } = useLocalization();
|
||||
@@ -53,6 +54,7 @@ export function AutomaticProportionsPage() {
|
||||
steps={[
|
||||
{ type: 'numbered', component: PutTrackersOnStep },
|
||||
{ type: 'numbered', component: RequirementsStep },
|
||||
{ type: 'numbered', component: CheckHeight },
|
||||
{ type: 'numbered', component: StartRecording },
|
||||
{ type: 'fullsize', component: Recording },
|
||||
{ type: 'numbered', component: VerifyResultsStep },
|
||||
|
||||
@@ -6,7 +6,6 @@ import {
|
||||
useEffect,
|
||||
useRef,
|
||||
UIEvent,
|
||||
MouseEvent,
|
||||
useMemo,
|
||||
} from 'react';
|
||||
import {
|
||||
@@ -17,6 +16,8 @@ import {
|
||||
import { useLocaleConfig } from '../../../../i18n/config';
|
||||
import { Typography } from '../../../commons/Typography';
|
||||
import { ArrowDownIcon, ArrowUpIcon } from '../../../commons/icon/ArrowIcons';
|
||||
import { useBreakpoint } from '../../../../hooks/breakpoint';
|
||||
import { debounce } from '../../../../hooks/timeout';
|
||||
|
||||
function IncrementButton({
|
||||
children,
|
||||
@@ -52,15 +53,21 @@ export function BodyProportions({
|
||||
const { bodyParts, dispatch, state, setRatioMode } = useManualProportions();
|
||||
const { l10n } = useLocalization();
|
||||
const { currentLocales } = useLocaleConfig();
|
||||
const { isTall } = useBreakpoint('tall');
|
||||
|
||||
const srcollerRef = useRef<HTMLDivElement | null>(null);
|
||||
const offsetItems = isTall ? 2 : 1;
|
||||
const itemsToDisplay = offsetItems * 2 + 1;
|
||||
const itemHeight = 80;
|
||||
const scrollHeight = itemHeight * itemsToDisplay;
|
||||
|
||||
const scrollerRef = useRef<HTMLDivElement | null>(null);
|
||||
|
||||
const cmFormat = Intl.NumberFormat(currentLocales, {
|
||||
style: 'unit',
|
||||
unit: 'centimeter',
|
||||
maximumFractionDigits: 1,
|
||||
});
|
||||
const percentageFormat = Intl.NumberFormat(currentLocales, {
|
||||
const percentageFormat = new Intl.NumberFormat(currentLocales, {
|
||||
style: 'percent',
|
||||
maximumFractionDigits: 1,
|
||||
});
|
||||
@@ -78,41 +85,48 @@ export function BodyProportions({
|
||||
}, [type]);
|
||||
|
||||
useEffect(() => {
|
||||
if (srcollerRef.current && bodyParts.length > 0) {
|
||||
moveToIndex(1);
|
||||
if (scrollerRef.current && bodyParts.length > 0) {
|
||||
selectId(bodyParts[offsetItems].label);
|
||||
}
|
||||
}, [srcollerRef, bodyParts.length]);
|
||||
}, [scrollerRef, bodyParts.length]);
|
||||
|
||||
const handleUIEvent = (e: UIEvent<HTMLDivElement>) => {
|
||||
const target = e.target as HTMLDivElement;
|
||||
|
||||
const itemHeight = target.offsetHeight / 3;
|
||||
|
||||
const itemHeight = target.offsetHeight / itemsToDisplay;
|
||||
const atSnappingPoint = target.scrollTop % itemHeight === 0;
|
||||
const index = Math.round(target.scrollTop / itemHeight);
|
||||
const elem = scrollerRef.current?.childNodes[
|
||||
index + offsetItems
|
||||
] as HTMLDivElement;
|
||||
|
||||
elem.scrollIntoView({ behavior: 'smooth', block: 'center' });
|
||||
|
||||
if (atSnappingPoint) {
|
||||
const index = target.scrollTop / itemHeight;
|
||||
const elem = srcollerRef.current?.childNodes[index + 1] as HTMLDivElement;
|
||||
const elem = scrollerRef.current?.childNodes[
|
||||
index + offsetItems
|
||||
] as HTMLDivElement;
|
||||
const id = elem.getAttribute('itemid');
|
||||
|
||||
if (id) selectNew(id);
|
||||
}
|
||||
};
|
||||
|
||||
const clickPart = (id: string) => (e: MouseEvent<HTMLDivElement>) => {
|
||||
const target = e.target as HTMLDivElement;
|
||||
target.scrollIntoView({ behavior: 'smooth', block: 'center' });
|
||||
const moveToId = (id: string) => {
|
||||
if (!scrollerRef.current) return;
|
||||
const index = bodyParts.findIndex(({ label }) => label === id);
|
||||
scrollerRef.current.scrollTo({
|
||||
top: index * itemHeight,
|
||||
behavior: 'smooth',
|
||||
});
|
||||
};
|
||||
|
||||
const clickPart = (id: string) => () => {
|
||||
moveToId(id);
|
||||
selectNew(id);
|
||||
};
|
||||
|
||||
const moveToIndex = (index: number, smooth = true) => {
|
||||
// We add one because of the offset placeholder
|
||||
const elem = srcollerRef.current?.childNodes[index + 1] as HTMLDivElement;
|
||||
elem?.scrollIntoView({
|
||||
behavior: smooth ? 'smooth' : 'auto',
|
||||
block: 'center',
|
||||
});
|
||||
|
||||
const id = elem.getAttribute('itemid');
|
||||
const selectId = (id: string) => {
|
||||
moveToId(id);
|
||||
if (id) selectNew(id);
|
||||
};
|
||||
|
||||
@@ -170,15 +184,12 @@ export function BodyProportions({
|
||||
}, [state]);
|
||||
|
||||
const move = (action: 'next' | 'prev') => {
|
||||
const elem = srcollerRef.current?.querySelector(
|
||||
const elem = scrollerRef.current?.querySelector(
|
||||
`div[itemid=${state.currentLabel}]`
|
||||
);
|
||||
|
||||
const moveId = (id: string, elem: HTMLDivElement) => {
|
||||
elem?.scrollIntoView({
|
||||
behavior: 'smooth',
|
||||
block: 'center',
|
||||
});
|
||||
const moveId = (id: string) => {
|
||||
moveToId(id);
|
||||
selectNew(id);
|
||||
};
|
||||
|
||||
@@ -186,14 +197,14 @@ export function BodyProportions({
|
||||
const prevElem = elem?.previousSibling as HTMLDivElement;
|
||||
const prevId = prevElem.getAttribute('itemid');
|
||||
if (!prevId) return;
|
||||
moveId(prevId, prevElem);
|
||||
moveId(prevId);
|
||||
}
|
||||
|
||||
if (action === 'next') {
|
||||
const nextElem = elem?.nextSibling as HTMLDivElement;
|
||||
const nextId = nextElem.getAttribute('itemid');
|
||||
if (!nextId) return;
|
||||
moveId(nextId, nextElem);
|
||||
moveId(nextId);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -264,7 +275,7 @@ export function BodyProportions({
|
||||
className={classNames(
|
||||
'h-12 w-32 rounded-lg bg-background-60 flex flex-col justify-center',
|
||||
'items-center fill-background-10',
|
||||
srcollerRef?.current?.scrollTop ?? 0 > 0
|
||||
scrollerRef?.current?.scrollTop ?? 0 > 0
|
||||
? 'opacity-100 active:bg-accent-background-30'
|
||||
: 'opacity-50'
|
||||
)}
|
||||
@@ -273,11 +284,17 @@ export function BodyProportions({
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
ref={srcollerRef}
|
||||
onScroll={handleUIEvent}
|
||||
className="h-60 flex-grow flex-col overflow-y-auto snap-y snap-mandatory snap-always no-scrollbar"
|
||||
ref={scrollerRef}
|
||||
onScroll={debounce(handleUIEvent, 150)} // Debounce at 150ms to match the animation speed and prevent snaping between two animations
|
||||
className={classNames(
|
||||
'flex-grow flex-col overflow-y-auto',
|
||||
'no-scrollbar'
|
||||
)}
|
||||
style={{ height: scrollHeight }}
|
||||
>
|
||||
<div className="h-20 snap-start "></div>
|
||||
{Array.from({ length: offsetItems }).map((_, index) => (
|
||||
<div style={{ height: itemHeight }} key={index}></div>
|
||||
))}
|
||||
{bodyParts.map((part) => {
|
||||
const { label, value: originalValue, type, ...props } = part;
|
||||
const value =
|
||||
@@ -292,7 +309,8 @@ export function BodyProportions({
|
||||
key={label}
|
||||
itemID={label}
|
||||
onClick={clickPart(label)}
|
||||
className="snap-start h-20 flex-col flex justify-center"
|
||||
style={{ height: itemHeight }}
|
||||
className="flex-col flex justify-center"
|
||||
>
|
||||
<div
|
||||
className={classNames(
|
||||
@@ -320,7 +338,13 @@ export function BodyProportions({
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
<div className="h-20 snap-start"></div>
|
||||
{Array.from({ length: offsetItems }).map((_, index) => (
|
||||
<div
|
||||
className="h-20"
|
||||
style={{ height: itemHeight }}
|
||||
key={index}
|
||||
></div>
|
||||
))}
|
||||
</div>
|
||||
<div className="flex justify-center">
|
||||
<div
|
||||
@@ -328,9 +352,9 @@ export function BodyProportions({
|
||||
className={classNames(
|
||||
'h-12 w-32 rounded-lg bg-background-60 flex flex-col justify-center',
|
||||
'items-center fill-background-10',
|
||||
srcollerRef?.current?.scrollTop !==
|
||||
(srcollerRef?.current?.scrollHeight ?? 0) -
|
||||
(srcollerRef?.current?.offsetHeight ?? 0)
|
||||
scrollerRef?.current?.scrollTop !==
|
||||
(scrollerRef?.current?.scrollHeight ?? 0) -
|
||||
(scrollerRef?.current?.offsetHeight ?? 0)
|
||||
? 'opacity-100 active:bg-accent-background-30'
|
||||
: 'opacity-50'
|
||||
)}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { useOnboarding } from '../../../../hooks/onboarding';
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { useState } from 'react';
|
||||
import { Localized, useLocalization } from '@fluent/react';
|
||||
import { useMemo, useState } from 'react';
|
||||
import classNames from 'classnames';
|
||||
import { Typography } from '../../../commons/Typography';
|
||||
import { Button } from '../../../commons/Button';
|
||||
@@ -14,6 +14,12 @@ import saveAs from 'file-saver';
|
||||
import { save } from '@tauri-apps/api/dialog';
|
||||
import { writeTextFile } from '@tauri-apps/api/fs';
|
||||
import { useIsTauri } from '../../../../hooks/breakpoint';
|
||||
import { useAppContext } from '../../../../hooks/app';
|
||||
import { error } from '../../../../utils/logging';
|
||||
|
||||
export const MIN_HEIGHT = 0.4;
|
||||
export const MAX_HEIGHT = 4;
|
||||
export const DEFAULT_HEIGHT = 1.5;
|
||||
|
||||
export function ProportionsChoose() {
|
||||
const isTauri = useIsTauri();
|
||||
@@ -21,6 +27,26 @@ export function ProportionsChoose() {
|
||||
const { applyProgress, state } = useOnboarding();
|
||||
const { useRPCPacket, sendRPCPacket } = useWebsocketAPI();
|
||||
const [animated, setAnimated] = useState(false);
|
||||
const { computedTrackers } = useAppContext();
|
||||
|
||||
const hmdTracker = useMemo(
|
||||
() =>
|
||||
computedTrackers.find(
|
||||
(tracker) =>
|
||||
tracker.tracker.trackerId?.trackerNum === 1 &&
|
||||
tracker.tracker.trackerId.deviceId?.id === undefined
|
||||
),
|
||||
[computedTrackers]
|
||||
);
|
||||
|
||||
const beneathFloor = useMemo(
|
||||
() =>
|
||||
!(
|
||||
hmdTracker?.tracker.position &&
|
||||
hmdTracker.tracker.position.y >= MIN_HEIGHT
|
||||
),
|
||||
[hmdTracker?.tracker.position?.y]
|
||||
);
|
||||
|
||||
useRPCPacket(
|
||||
RpcMessage.SkeletonConfigResponse,
|
||||
@@ -42,7 +68,7 @@ export function ProportionsChoose() {
|
||||
path ? writeTextFile(path, JSON.stringify(data)) : undefined
|
||||
)
|
||||
.catch((err) => {
|
||||
console.error(err);
|
||||
error(err);
|
||||
});
|
||||
} else {
|
||||
saveAs(blob, 'body-proportions.json');
|
||||
@@ -125,7 +151,7 @@ export function ProportionsChoose() {
|
||||
<img
|
||||
onMouseEnter={() => setAnimated(() => true)}
|
||||
onAnimationEnd={() => setAnimated(() => false)}
|
||||
src="/images/slimetower.png"
|
||||
src="/images/slimetower.webp"
|
||||
className={classNames(
|
||||
'absolute w-[100px] -right-2 -top-24',
|
||||
animated && 'animate-[bounce_1s_1]'
|
||||
@@ -144,15 +170,23 @@ export function ProportionsChoose() {
|
||||
</Typography>
|
||||
</div>
|
||||
<div>
|
||||
<Typography color="secondary">
|
||||
{l10n.getString(
|
||||
'onboarding-choose_proportions-auto_proportions-description'
|
||||
)}
|
||||
</Typography>
|
||||
<Localized
|
||||
id="onboarding-choose_proportions-auto_proportions-descriptionv2"
|
||||
elems={{ b: <b></b> }}
|
||||
>
|
||||
<Typography
|
||||
color="secondary"
|
||||
whitespace="whitespace-pre-line"
|
||||
>
|
||||
Description for autobone
|
||||
</Typography>
|
||||
</Localized>
|
||||
</div>
|
||||
</div>
|
||||
<Button
|
||||
variant="primary"
|
||||
// Check if we are in dev mode and just let it be used
|
||||
disabled={beneathFloor && import.meta.env.PROD}
|
||||
to="/onboarding/body-proportions/auto"
|
||||
className="self-start mt-auto"
|
||||
state={{ alonePage: state.alonePage }}
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
import { Localized, useLocalization } from '@fluent/react';
|
||||
import ReactModal from 'react-modal';
|
||||
import { BaseModal } from '../../../../commons/BaseModal';
|
||||
import { WarningBox } from '../../../../commons/TipBox';
|
||||
import { Button } from '../../../../commons/Button';
|
||||
import { A } from '../../../../commons/A';
|
||||
import { DOCS_SITE, SLIMEVR_DISCORD } from '../../../../../App';
|
||||
|
||||
export function AutoboneErrorModal({
|
||||
isOpen = true,
|
||||
onClose,
|
||||
...props
|
||||
}: {
|
||||
/**
|
||||
* Is the parent/sibling component opened?
|
||||
*/
|
||||
isOpen: boolean;
|
||||
/**
|
||||
* Function to trigger when closed or accepted
|
||||
*/
|
||||
onClose: () => void;
|
||||
} & ReactModal.Props) {
|
||||
const { l10n } = useLocalization();
|
||||
|
||||
return (
|
||||
<BaseModal
|
||||
isOpen={isOpen}
|
||||
shouldCloseOnOverlayClick
|
||||
shouldCloseOnEsc
|
||||
onRequestClose={onClose}
|
||||
className={props.className}
|
||||
overlayClassName={props.overlayClassName}
|
||||
>
|
||||
<div className="flex w-full h-full flex-col ">
|
||||
<div className="flex w-full flex-col flex-grow items-center gap-3">
|
||||
<Localized
|
||||
id="onboarding-automatic_proportions-error_modal"
|
||||
elems={{
|
||||
b: <b></b>,
|
||||
docs: (
|
||||
<A
|
||||
href={`${DOCS_SITE}/server/body-config.html#common-issues--debugging`}
|
||||
></A>
|
||||
),
|
||||
discord: <A href={SLIMEVR_DISCORD}></A>,
|
||||
}}
|
||||
>
|
||||
<WarningBox>
|
||||
<b>Warning:</b> An autobone error happened!
|
||||
</WarningBox>
|
||||
</Localized>
|
||||
|
||||
<div className="flex flex-row gap-3 pt-5 place-content-center">
|
||||
<Button variant="primary" onClick={onClose}>
|
||||
{l10n.getString(
|
||||
'onboarding-automatic_proportions-error_modal-confirm'
|
||||
)}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</BaseModal>
|
||||
);
|
||||
}
|
||||
@@ -1,22 +1,49 @@
|
||||
import { useEffect } from 'react';
|
||||
import { useAutobone } from '../../../../../hooks/autobone';
|
||||
import { ReactNode, useEffect, useState } from 'react';
|
||||
import { ProcessStatus, useAutobone } from '../../../../../hooks/autobone';
|
||||
import { ProgressBar } from '../../../../commons/ProgressBar';
|
||||
import { TipBox } from '../../../../commons/TipBox';
|
||||
import { Typography } from '../../../../commons/Typography';
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { P, match } from 'ts-pattern';
|
||||
import { AutoboneErrorModal } from './AutoboneErrorModal';
|
||||
|
||||
export function Recording({ nextStep }: { nextStep: () => void }) {
|
||||
export function Recording({
|
||||
nextStep,
|
||||
resetSteps,
|
||||
}: {
|
||||
nextStep: () => void;
|
||||
resetSteps: () => void;
|
||||
}) {
|
||||
const { l10n } = useLocalization();
|
||||
const { progress, hasCalibration, hasRecording } = useAutobone();
|
||||
const { progress, hasCalibration, hasRecording, eta } = useAutobone();
|
||||
const [modalOpen, setModalOpen] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
if (progress === 1 && hasCalibration) {
|
||||
if (
|
||||
hasRecording === ProcessStatus.REJECTED ||
|
||||
hasCalibration === ProcessStatus.REJECTED
|
||||
) {
|
||||
setModalOpen(true);
|
||||
}
|
||||
if (progress !== 1) return;
|
||||
|
||||
if (
|
||||
hasRecording === ProcessStatus.FULFILLED &&
|
||||
hasCalibration === ProcessStatus.FULFILLED
|
||||
) {
|
||||
nextStep();
|
||||
}
|
||||
}, [progress, hasCalibration]);
|
||||
}, [progress, hasCalibration, hasRecording]);
|
||||
|
||||
return (
|
||||
<div className="flex flex-col items-center w-full justify-between">
|
||||
<AutoboneErrorModal
|
||||
isOpen={modalOpen}
|
||||
onClose={() => {
|
||||
setModalOpen(false);
|
||||
resetSteps();
|
||||
}}
|
||||
></AutoboneErrorModal>
|
||||
<div className="flex gap-1 flex-col justify-center items-center">
|
||||
<div className="flex text-status-critical justify-center items-center gap-1">
|
||||
<div className="w-2 h-2 rounded-lg bg-status-critical"></div>
|
||||
@@ -51,19 +78,39 @@ export function Recording({ nextStep }: { nextStep: () => void }) {
|
||||
<TipBox>{l10n.getString('tips-do_not_move_heels')}</TipBox>
|
||||
</div>
|
||||
<div className="flex flex-col gap-2 items-center w-full max-w-[150px]">
|
||||
<ProgressBar progress={progress} height={2}></ProgressBar>
|
||||
<ProgressBar
|
||||
progress={progress}
|
||||
height={2}
|
||||
colorClass={match([hasCalibration, hasRecording])
|
||||
.returnType<string | undefined>()
|
||||
.with(
|
||||
P.union(
|
||||
[ProcessStatus.REJECTED, P._],
|
||||
[P._, ProcessStatus.REJECTED]
|
||||
),
|
||||
() => 'bg-status-critical'
|
||||
)
|
||||
.with(
|
||||
[ProcessStatus.FULFILLED, ProcessStatus.FULFILLED],
|
||||
() => 'bg-status-success'
|
||||
)
|
||||
.otherwise(() => undefined)}
|
||||
></ProgressBar>
|
||||
<Typography color="secondary">
|
||||
{!hasCalibration && hasRecording
|
||||
? l10n.getString(
|
||||
{match([hasCalibration, hasRecording])
|
||||
.returnType<ReactNode>()
|
||||
.with([ProcessStatus.PENDING, ProcessStatus.FULFILLED], () =>
|
||||
l10n.getString(
|
||||
'onboarding-automatic_proportions-recording-processing'
|
||||
)
|
||||
: l10n.getString(
|
||||
)
|
||||
.with([ProcessStatus.PENDING, ProcessStatus.PENDING], () =>
|
||||
l10n.getString(
|
||||
'onboarding-automatic_proportions-recording-timer',
|
||||
{
|
||||
// TODO: The progress should be communicated by the server in SolarXR
|
||||
time: Math.round(20 * (1 - progress)),
|
||||
}
|
||||
)}
|
||||
{ time: Math.round(eta) }
|
||||
)
|
||||
)
|
||||
.otherwise(() => '')}
|
||||
</Typography>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import classNames from 'classnames';
|
||||
import { useAutobone } from '../../../../../hooks/autobone';
|
||||
import { ProcessStatus, useAutobone } from '../../../../../hooks/autobone';
|
||||
import { Button } from '../../../../commons/Button';
|
||||
import { Typography } from '../../../../commons/Typography';
|
||||
import { useLocalization } from '@fluent/react';
|
||||
@@ -69,13 +69,14 @@ export function VerifyResultsStep({
|
||||
<Typography bold>{(value * 100).toFixed(2)} CM</Typography>
|
||||
</div>
|
||||
))}
|
||||
{!hasCalibration && hasRecording && (
|
||||
<Typography>
|
||||
{l10n.getString(
|
||||
'onboarding-automatic-proportions-verify-results-processing'
|
||||
)}
|
||||
</Typography>
|
||||
)}
|
||||
{hasCalibration === ProcessStatus.PENDING &&
|
||||
hasRecording === ProcessStatus.FULFILLED && (
|
||||
<Typography>
|
||||
{l10n.getString(
|
||||
'onboarding-automatic-proportions-verify-results-processing'
|
||||
)}
|
||||
</Typography>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -0,0 +1,176 @@
|
||||
import {
|
||||
AutoBoneSettingsT,
|
||||
ChangeSettingsRequestT,
|
||||
HeightRequestT,
|
||||
HeightResponseT,
|
||||
RpcMessage,
|
||||
} from 'solarxr-protocol';
|
||||
import { useWebsocketAPI } from '../../../../../hooks/websocket-api';
|
||||
import { Button } from '../../../../commons/Button';
|
||||
import { Typography } from '../../../../commons/Typography';
|
||||
import { Localized, useLocalization } from '@fluent/react';
|
||||
import { useForm } from 'react-hook-form';
|
||||
import { useMemo, useState } from 'react';
|
||||
import { NumberSelector } from '../../../../commons/NumberSelector';
|
||||
import { DEFAULT_HEIGHT, MIN_HEIGHT } from '../ProportionsChoose';
|
||||
import { useLocaleConfig } from '../../../../../i18n/config';
|
||||
import { useCountdown } from '../../../../../hooks/countdown';
|
||||
|
||||
interface HeightForm {
|
||||
height: number;
|
||||
hmdHeight: number;
|
||||
}
|
||||
|
||||
export function CheckHeight({
|
||||
nextStep,
|
||||
prevStep,
|
||||
variant,
|
||||
}: {
|
||||
nextStep: () => void;
|
||||
prevStep: () => void;
|
||||
variant: 'onboarding' | 'alone';
|
||||
}) {
|
||||
const { l10n } = useLocalization();
|
||||
const { control, handleSubmit, setValue } = useForm<HeightForm>();
|
||||
const [fetchedHeight, setFetchedHeight] = useState(false);
|
||||
const { sendRPCPacket, useRPCPacket } = useWebsocketAPI();
|
||||
const { timer, isCounting, startCountdown } = useCountdown({
|
||||
duration: 3,
|
||||
onCountdownEnd: () => {
|
||||
setFetchedHeight(true);
|
||||
sendRPCPacket(RpcMessage.HeightRequest, new HeightRequestT());
|
||||
},
|
||||
});
|
||||
const { currentLocales } = useLocaleConfig();
|
||||
|
||||
const mFormat = useMemo(
|
||||
() =>
|
||||
new Intl.NumberFormat(currentLocales, {
|
||||
style: 'unit',
|
||||
unit: 'meter',
|
||||
maximumFractionDigits: 2,
|
||||
}),
|
||||
[currentLocales]
|
||||
);
|
||||
|
||||
const sFormat = useMemo(
|
||||
() => new Intl.RelativeTimeFormat(currentLocales, { style: 'short' }),
|
||||
[currentLocales]
|
||||
);
|
||||
|
||||
useRPCPacket(
|
||||
RpcMessage.HeightResponse,
|
||||
({ hmdHeight, estimatedFullHeight }: HeightResponseT) => {
|
||||
setValue('height', estimatedFullHeight || DEFAULT_HEIGHT);
|
||||
setValue('hmdHeight', hmdHeight);
|
||||
}
|
||||
);
|
||||
|
||||
const onSubmit = (values: HeightForm) => {
|
||||
const changeSettings = new ChangeSettingsRequestT();
|
||||
const autobone = new AutoBoneSettingsT();
|
||||
autobone.targetFullHeight = values.height;
|
||||
autobone.targetHmdHeight = values.hmdHeight;
|
||||
changeSettings.autoBoneSettings = autobone;
|
||||
|
||||
sendRPCPacket(RpcMessage.ChangeSettingsRequest, changeSettings);
|
||||
nextStep();
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className="flex flex-col flex-grow">
|
||||
<div className="flex flex-grow flex-col gap-4">
|
||||
<Typography variant="main-title" bold>
|
||||
{l10n.getString(
|
||||
'onboarding-automatic_proportions-check_height-title'
|
||||
)}
|
||||
</Typography>
|
||||
<div>
|
||||
<Typography color="secondary">
|
||||
{l10n.getString(
|
||||
'onboarding-automatic_proportions-check_height-description'
|
||||
)}
|
||||
</Typography>
|
||||
<Localized
|
||||
id="onboarding-automatic_proportions-check_height-calculation_warning"
|
||||
elems={{ u: <span className="underline"></span> }}
|
||||
>
|
||||
<Typography color="secondary" bold>
|
||||
Press the button to get your height!
|
||||
</Typography>
|
||||
</Localized>
|
||||
|
||||
<Button
|
||||
variant="primary"
|
||||
className="mt-2"
|
||||
onClick={startCountdown}
|
||||
disabled={isCounting}
|
||||
>
|
||||
{isCounting
|
||||
? sFormat.format(timer, 'second')
|
||||
: l10n.getString(
|
||||
'onboarding-automatic_proportions-check_height-fetch_height'
|
||||
)}
|
||||
</Button>
|
||||
</div>
|
||||
<form className="flex flex-col self-center items-center justify-center">
|
||||
<NumberSelector
|
||||
control={control}
|
||||
name="hmdHeight"
|
||||
label={l10n.getString(
|
||||
'onboarding-automatic_proportions-check_height-hmd_height1'
|
||||
)}
|
||||
valueLabelFormat={(value) =>
|
||||
isNaN(value)
|
||||
? l10n.getString(
|
||||
'onboarding-automatic_proportions-check_height-unknown'
|
||||
)
|
||||
: mFormat.format(value)
|
||||
}
|
||||
min={MIN_HEIGHT}
|
||||
max={4}
|
||||
step={0.01}
|
||||
disabled={true}
|
||||
/>
|
||||
<NumberSelector
|
||||
control={control}
|
||||
name="height"
|
||||
label={l10n.getString(
|
||||
'onboarding-automatic_proportions-check_height-height1'
|
||||
)}
|
||||
valueLabelFormat={(value) =>
|
||||
isNaN(value)
|
||||
? l10n.getString(
|
||||
'onboarding-automatic_proportions-check_height-unknown'
|
||||
)
|
||||
: mFormat.format(value)
|
||||
}
|
||||
min={MIN_HEIGHT}
|
||||
max={4}
|
||||
step={0.01}
|
||||
/>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div className="flex gap-3 mobile:justify-between">
|
||||
<Button
|
||||
variant={variant === 'onboarding' ? 'secondary' : 'tertiary'}
|
||||
onClick={prevStep}
|
||||
>
|
||||
{l10n.getString('onboarding-automatic_proportions-prev_step')}
|
||||
</Button>
|
||||
<Button
|
||||
variant="primary"
|
||||
onClick={handleSubmit(onSubmit)}
|
||||
disabled={!fetchedHeight}
|
||||
>
|
||||
{l10n.getString(
|
||||
'onboarding-automatic_proportions-check_height-next_step'
|
||||
)}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -12,6 +12,7 @@ import { BodyAssignment } from '../../BodyAssignment';
|
||||
import { MountingSelectionMenu } from './MountingSelectionMenu';
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { useBreakpoint } from '../../../../hooks/breakpoint';
|
||||
import { Quaternion } from 'three';
|
||||
|
||||
export function ManualMountingPage() {
|
||||
const { isMobile } = useBreakpoint('mobile');
|
||||
@@ -41,7 +42,7 @@ export function ManualMountingPage() {
|
||||
[assignedTrackers]
|
||||
);
|
||||
|
||||
const onDirectionSelected = (mountingOrientationDegrees: number) => {
|
||||
const onDirectionSelected = (mountingOrientationDegrees: Quaternion) => {
|
||||
(trackerPartGrouped[selectedRole] || []).forEach((td) => {
|
||||
const assignreq = new AssignTrackerRequestT();
|
||||
|
||||
@@ -62,6 +63,7 @@ export function ManualMountingPage() {
|
||||
return (
|
||||
<>
|
||||
<MountingSelectionMenu
|
||||
bodyPart={selectedRole}
|
||||
isOpen={selectedRole !== BodyPart.NONE}
|
||||
onClose={() => setSelectRole(BodyPart.NONE)}
|
||||
onDirectionSelected={onDirectionSelected}
|
||||
|
||||
@@ -87,7 +87,7 @@ export function MountingChoose() {
|
||||
<img
|
||||
onMouseEnter={() => setAnimated(() => true)}
|
||||
onAnimationEnd={() => setAnimated(() => false)}
|
||||
src="/images/boxslime.png"
|
||||
src="/images/boxslime.webp"
|
||||
className={classNames(
|
||||
'absolute w-[100px] -right-2 -top-10',
|
||||
animated && 'animate-[bounce_1s_1]'
|
||||
|
||||
@@ -3,31 +3,156 @@ import { MouseEventHandler } from 'react';
|
||||
import ReactModal from 'react-modal';
|
||||
import { useElemSize, useLayout } from '../../../../hooks/layout';
|
||||
import { Button } from '../../../commons/Button';
|
||||
import { AnkleIcon } from '../../../commons/icon/AnkleIcon';
|
||||
import { Typography } from '../../../commons/Typography';
|
||||
import { rotationToQuatMap } from '../../../tracker/TrackerSettings';
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { FootIcon } from '../../../commons/icon/FootIcon';
|
||||
import { rotationToQuatMap } from '../../../../maths/quaternion';
|
||||
import { Quaternion } from 'three';
|
||||
import { SlimeUpIcon } from '../../../commons/icon/SlimeUpIcon';
|
||||
import { BodyPart } from 'solarxr-protocol';
|
||||
import { PawIcon } from '../../../commons/icon/PawIcon';
|
||||
import { useLocaleConfig } from '../../../../i18n/config';
|
||||
|
||||
function MoutingOrientationCard({
|
||||
orientation,
|
||||
onClick,
|
||||
// All body parts that are right or left, are by default left!
|
||||
export const mapPart: Record<
|
||||
BodyPart,
|
||||
({
|
||||
width,
|
||||
currentLocales,
|
||||
}: {
|
||||
width?: number;
|
||||
currentLocales: string[];
|
||||
}) => JSX.Element
|
||||
> = {
|
||||
[BodyPart.UPPER_CHEST]: ({ width }) => <FootIcon width={width}></FootIcon>,
|
||||
[BodyPart.CHEST]: ({ width }) => <FootIcon width={width}></FootIcon>,
|
||||
[BodyPart.HEAD]: ({ width }) => <FootIcon width={width}></FootIcon>,
|
||||
[BodyPart.HIP]: ({ width }) => <FootIcon width={width}></FootIcon>,
|
||||
[BodyPart.LEFT_FOOT]: ({ width, currentLocales }) =>
|
||||
currentLocales.includes('en-x-owo') ? (
|
||||
<PawIcon
|
||||
width={width ? width * 0.75 : undefined}
|
||||
transform="translate(40, -50)"
|
||||
></PawIcon>
|
||||
) : (
|
||||
<FootIcon width={width}></FootIcon>
|
||||
),
|
||||
[BodyPart.LEFT_HAND]: ({ width }) => <FootIcon width={width}></FootIcon>,
|
||||
[BodyPart.LEFT_LOWER_ARM]: ({ width }) => <FootIcon width={width}></FootIcon>,
|
||||
[BodyPart.LEFT_LOWER_LEG]: ({ width, currentLocales }) =>
|
||||
currentLocales.includes('en-x-owo') ? (
|
||||
<PawIcon
|
||||
width={width ? width * 0.75 : undefined}
|
||||
transform="translate(40, -50)"
|
||||
></PawIcon>
|
||||
) : (
|
||||
<FootIcon width={width}></FootIcon>
|
||||
),
|
||||
[BodyPart.LEFT_SHOULDER]: ({ width }) => <FootIcon width={width}></FootIcon>,
|
||||
[BodyPart.LEFT_UPPER_ARM]: ({ width }) => <FootIcon width={width}></FootIcon>,
|
||||
[BodyPart.LEFT_UPPER_LEG]: ({ width, currentLocales }) =>
|
||||
currentLocales.includes('en-x-owo') ? (
|
||||
<PawIcon
|
||||
width={width ? width * 0.75 : undefined}
|
||||
transform="translate(40, -50)"
|
||||
></PawIcon>
|
||||
) : (
|
||||
<FootIcon width={width}></FootIcon>
|
||||
),
|
||||
[BodyPart.NECK]: ({ width }) => <FootIcon width={width}></FootIcon>,
|
||||
[BodyPart.NONE]: ({ width }) => <FootIcon width={width}></FootIcon>,
|
||||
[BodyPart.RIGHT_FOOT]: ({ width, currentLocales }) =>
|
||||
currentLocales.includes('en-x-owo') ? (
|
||||
<PawIcon
|
||||
width={width ? width * 0.75 : undefined}
|
||||
transform="translate(40, -50)"
|
||||
></PawIcon>
|
||||
) : (
|
||||
<FootIcon width={width} flipped></FootIcon>
|
||||
),
|
||||
[BodyPart.RIGHT_HAND]: ({ width }) => <FootIcon width={width}></FootIcon>,
|
||||
[BodyPart.RIGHT_LOWER_ARM]: ({ width }) => (
|
||||
<FootIcon width={width}></FootIcon>
|
||||
),
|
||||
[BodyPart.RIGHT_LOWER_LEG]: ({ width, currentLocales }) =>
|
||||
currentLocales.includes('en-x-owo') ? (
|
||||
<PawIcon
|
||||
width={width ? width * 0.75 : undefined}
|
||||
transform="translate(40, -50)"
|
||||
></PawIcon>
|
||||
) : (
|
||||
<FootIcon width={width} flipped></FootIcon>
|
||||
),
|
||||
[BodyPart.RIGHT_SHOULDER]: ({ width }) => <FootIcon width={width}></FootIcon>,
|
||||
[BodyPart.RIGHT_UPPER_ARM]: ({ width }) => (
|
||||
<FootIcon width={width}></FootIcon>
|
||||
),
|
||||
[BodyPart.RIGHT_UPPER_LEG]: ({ width, currentLocales }) =>
|
||||
currentLocales.includes('en-x-owo') ? (
|
||||
<PawIcon
|
||||
width={width ? width * 0.75 : undefined}
|
||||
transform="translate(40, -50)"
|
||||
></PawIcon>
|
||||
) : (
|
||||
<FootIcon width={width} flipped></FootIcon>
|
||||
),
|
||||
[BodyPart.WAIST]: ({ width }) => <FootIcon width={width}></FootIcon>,
|
||||
};
|
||||
|
||||
export function MountingBodyPartIcon({
|
||||
bodyPart = BodyPart.NONE,
|
||||
width = 24,
|
||||
}: {
|
||||
orientation: string;
|
||||
onClick?: MouseEventHandler<HTMLDivElement>;
|
||||
bodyPart?: BodyPart;
|
||||
width?: number;
|
||||
}) {
|
||||
// FIXME: Dont use AnkleIcon for this please
|
||||
const { currentLocales } = useLocaleConfig();
|
||||
return mapPart[bodyPart]({ width, currentLocales });
|
||||
}
|
||||
|
||||
function PieSliceOfFeet({
|
||||
onClick,
|
||||
id,
|
||||
d,
|
||||
noText = false,
|
||||
trackerTransform,
|
||||
trackerWidth = 10,
|
||||
}: {
|
||||
onClick?: MouseEventHandler<SVGGElement>;
|
||||
id: string;
|
||||
d: string;
|
||||
noText?: boolean;
|
||||
trackerTransform: string;
|
||||
trackerWidth?: number;
|
||||
}) {
|
||||
const { l10n } = useLocalization();
|
||||
|
||||
return (
|
||||
<div
|
||||
<g
|
||||
onClick={onClick}
|
||||
className="xs:h-32 mobile:h-20 bg-background-60 rounded-md flex justify-between p-4 hover:bg-background-50"
|
||||
className={classNames('group fill-background-10 stroke-background-10')}
|
||||
>
|
||||
<div className="flex flex-col justify-center">
|
||||
<Typography variant="main-title">{orientation}</Typography>
|
||||
</div>
|
||||
<div className="flex flex-col justify-center fill-white">
|
||||
<AnkleIcon width={58}></AnkleIcon>
|
||||
</div>
|
||||
</div>
|
||||
<path
|
||||
d={d}
|
||||
className={classNames(
|
||||
'fill-background-40 opacity-50 stroke-background-90',
|
||||
'group-hover:fill-background-30 group-active:fill-background-20'
|
||||
)}
|
||||
transform="translate(125 125)"
|
||||
id={id}
|
||||
></path>
|
||||
<text dy="-5" strokeWidth="1">
|
||||
<textPath xlinkHref={`#${id}`} startOffset="50%" textAnchor="middle">
|
||||
{!noText ? l10n.getString(id) : ''}
|
||||
</textPath>
|
||||
</text>
|
||||
<g
|
||||
transform={trackerTransform}
|
||||
className="fill-none stroke-none group-hover:fill-accent-background-20"
|
||||
>
|
||||
<SlimeUpIcon width={trackerWidth}></SlimeUpIcon>
|
||||
</g>
|
||||
</g>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -35,10 +160,12 @@ export function MountingSelectionMenu({
|
||||
isOpen = true,
|
||||
onClose,
|
||||
onDirectionSelected,
|
||||
bodyPart,
|
||||
}: {
|
||||
isOpen: boolean;
|
||||
onClose: () => void;
|
||||
onDirectionSelected: (direction: number) => void;
|
||||
onDirectionSelected: (direction: Quaternion) => void;
|
||||
bodyPart?: BodyPart;
|
||||
}) {
|
||||
const { l10n } = useLocalization();
|
||||
const { ref: refTrackers, layoutHeight: trackersHeight } =
|
||||
@@ -68,23 +195,82 @@ export function MountingSelectionMenu({
|
||||
ref={refTrackers}
|
||||
style={{ height: trackersHeight - optionsHeight }}
|
||||
>
|
||||
<div className="grid xs:grid-cols-2 xs:grid-rows-2 mobile:grid-cols-1 gap-6 w-full">
|
||||
<MoutingOrientationCard
|
||||
orientation={l10n.getString('tracker-rotation-left')}
|
||||
onClick={() => onDirectionSelected(rotationToQuatMap.LEFT)}
|
||||
/>
|
||||
<MoutingOrientationCard
|
||||
orientation={l10n.getString('tracker-rotation-right')}
|
||||
onClick={() => onDirectionSelected(rotationToQuatMap.RIGHT)}
|
||||
/>
|
||||
<MoutingOrientationCard
|
||||
orientation={l10n.getString('tracker-rotation-front')}
|
||||
onClick={() => onDirectionSelected(rotationToQuatMap.FRONT)}
|
||||
/>
|
||||
<MoutingOrientationCard
|
||||
orientation={l10n.getString('tracker-rotation-back')}
|
||||
onClick={() => onDirectionSelected(rotationToQuatMap.BACK)}
|
||||
/>
|
||||
<div className="flex justify-center items-center gap-6 w-full">
|
||||
<svg
|
||||
width="400"
|
||||
viewBox="0 0 250 250"
|
||||
className="fill-background-40"
|
||||
>
|
||||
<g transform="translate(80, 0)" className="fill-background-10">
|
||||
<MountingBodyPartIcon width={100} bodyPart={bodyPart} />
|
||||
</g>
|
||||
<g strokeWidth="4" className="stroke-background-90">
|
||||
<PieSliceOfFeet
|
||||
d="M0 0-89 44A99 99 0 0 1-89-44Z"
|
||||
onClick={() => onDirectionSelected(rotationToQuatMap.LEFT)}
|
||||
id="tracker-rotation-left"
|
||||
trackerTransform="translate(75, 0) scale(-1, 1)"
|
||||
></PieSliceOfFeet>
|
||||
<PieSliceOfFeet
|
||||
d="M0 0-89-44A99 99 0 0 1-44-89Z"
|
||||
onClick={() =>
|
||||
onDirectionSelected(rotationToQuatMap.FRONT_LEFT)
|
||||
}
|
||||
id="tracker-rotation_left_front"
|
||||
noText={true}
|
||||
trackerTransform="translate(-2, 175) rotate(-135)"
|
||||
trackerWidth={7}
|
||||
></PieSliceOfFeet>
|
||||
<PieSliceOfFeet
|
||||
onClick={() => onDirectionSelected(rotationToQuatMap.FRONT)}
|
||||
d="M0 0-44-89A99 99 0 0 1 44-89Z"
|
||||
id="tracker-rotation-front"
|
||||
trackerTransform="translate(0, 75) rotate(-90)"
|
||||
></PieSliceOfFeet>
|
||||
<PieSliceOfFeet
|
||||
d="M0 0 44-89A99 99 0 0 1 89-44Z"
|
||||
onClick={() =>
|
||||
onDirectionSelected(rotationToQuatMap.FRONT_RIGHT)
|
||||
}
|
||||
id="tracker-rotation-front_right"
|
||||
noText={true}
|
||||
trackerTransform="translate(73, 0) rotate(-45)"
|
||||
trackerWidth={7}
|
||||
></PieSliceOfFeet>
|
||||
<PieSliceOfFeet
|
||||
d="M0 0 89-44A99 99 0 0 1 89 44Z"
|
||||
onClick={() => onDirectionSelected(rotationToQuatMap.RIGHT)}
|
||||
id="tracker-rotation-right"
|
||||
trackerTransform="translate(175,0)"
|
||||
></PieSliceOfFeet>
|
||||
<PieSliceOfFeet
|
||||
d="M0 0 89 44A99 99 0 0 1 44 89Z"
|
||||
onClick={() =>
|
||||
onDirectionSelected(rotationToQuatMap.BACK_RIGHT)
|
||||
}
|
||||
id="tracker-rotation-back_right"
|
||||
noText={true}
|
||||
trackerTransform="translate(252, 75) rotate(45)"
|
||||
trackerWidth={7}
|
||||
></PieSliceOfFeet>
|
||||
<PieSliceOfFeet
|
||||
d="M0 0 44 89A99 99 0 0 1-44 89Z"
|
||||
onClick={() => onDirectionSelected(rotationToQuatMap.BACK)}
|
||||
id="tracker-rotation-back"
|
||||
trackerTransform="translate(250, 175) rotate(90)"
|
||||
></PieSliceOfFeet>
|
||||
<PieSliceOfFeet
|
||||
d="M0 0-44 89A99 99 0 0 1-89 44Z"
|
||||
onClick={() =>
|
||||
onDirectionSelected(rotationToQuatMap.BACK_LEFT)
|
||||
}
|
||||
id="tracker-rotation-back_left"
|
||||
noText={true}
|
||||
trackerTransform="translate(177, 250) rotate(135)"
|
||||
trackerWidth={7}
|
||||
></PieSliceOfFeet>
|
||||
</g>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -43,7 +43,7 @@ export function MountingResetStep({
|
||||
{isMobile && (
|
||||
<div className="flex flex-col pt-1 items-center fill-background-50 justify-center px-12">
|
||||
<img
|
||||
src="/images/mounting-reset-pose.png"
|
||||
src="/images/mounting-reset-pose.webp"
|
||||
width={125}
|
||||
alt="mounting reset ski pose"
|
||||
/>
|
||||
@@ -67,7 +67,7 @@ export function MountingResetStep({
|
||||
{!isMobile && (
|
||||
<div className="flex flex-col pt-1 items-center fill-background-50 justify-center px-12">
|
||||
<img
|
||||
src="/images/mounting-reset-pose.png"
|
||||
src="/images/mounting-reset-pose.webp"
|
||||
width={125}
|
||||
alt="mounting reset ski pose"
|
||||
/>
|
||||
|
||||
@@ -40,7 +40,7 @@ export function PreparationStep({
|
||||
{isMobile && (
|
||||
<div className="flex flex-col pt-1 items-center fill-background-50 justify-center px-12">
|
||||
<img
|
||||
src="/images/reset-pose.png"
|
||||
src="/images/reset-pose.webp"
|
||||
width={100}
|
||||
alt="Reset position"
|
||||
/>
|
||||
@@ -62,7 +62,7 @@ export function PreparationStep({
|
||||
</div>
|
||||
{!isMobile && (
|
||||
<div className="flex flex-col pt-1 items-center fill-background-50 justify-center px-12">
|
||||
<img src="/images/reset-pose.png" width={90} alt="Reset position" />
|
||||
<img src="/images/reset-pose.webp" width={90} alt="Reset position" />
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
@@ -20,6 +20,10 @@ export function SettingSelectorMobile() {
|
||||
label: l10n.getString('settings-sidebar-general'),
|
||||
value: { url: '/settings/trackers', scrollTo: 'steamvr' },
|
||||
},
|
||||
{
|
||||
label: l10n.getString('settings-sidebar-interface'),
|
||||
value: { url: '/settings/interface', scrollTo: 'appearance' },
|
||||
},
|
||||
{
|
||||
label: l10n.getString('settings-sidebar-osc_router'),
|
||||
value: { url: '/settings/osc/router', scrollTo: 'router' },
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import classNames from 'classnames';
|
||||
import { ReactNode, useEffect, useRef } from 'react';
|
||||
import { useLocation } from 'react-router-dom';
|
||||
import { useBreakpoint } from '../../hooks/breakpoint';
|
||||
|
||||
export function SettingsPageLayout({
|
||||
children,
|
||||
@@ -11,6 +12,7 @@ export function SettingsPageLayout({
|
||||
} & React.HTMLAttributes<HTMLDivElement>) {
|
||||
const pageRef = useRef<HTMLDivElement | null>(null);
|
||||
const { state } = useLocation();
|
||||
const { isMobile } = useBreakpoint('mobile');
|
||||
|
||||
useEffect(() => {
|
||||
const typedState: { scrollTo: string } = state;
|
||||
@@ -27,8 +29,12 @@ export function SettingsPageLayout({
|
||||
'.overflow-y-auto'
|
||||
) as HTMLElement | null;
|
||||
if (closestScroll) {
|
||||
// The 45 is just enough padding for making the scroll look perfect
|
||||
closestScroll.scroll({ top: elem.offsetTop - 45, behavior: 'smooth' });
|
||||
// The 40 is just enough padding for making the scroll look perfect
|
||||
const topPadding = isMobile ? 80 : 40;
|
||||
closestScroll.scroll({
|
||||
top: elem.offsetTop - topPadding,
|
||||
behavior: 'smooth',
|
||||
});
|
||||
}
|
||||
}
|
||||
}, [state]);
|
||||
|
||||
@@ -63,33 +63,43 @@ export function SettingsSidebar() {
|
||||
<SettingsLink to="/settings/trackers" scrollTo="gestureControl">
|
||||
{l10n.getString('settings-sidebar-gesture_control')}
|
||||
</SettingsLink>
|
||||
<SettingsLink to="/settings/trackers" scrollTo="interface">
|
||||
{l10n.getString('settings-sidebar-interface')}
|
||||
</SettingsLink>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex flex-col gap-3">
|
||||
<Typography variant="section-title">OSC</Typography>
|
||||
<div className="flex flex-col gap-2">
|
||||
<SettingsLink to="/settings/osc/router" scrollTo="router">
|
||||
{l10n.getString('settings-sidebar-osc_router')}
|
||||
</SettingsLink>
|
||||
<SettingsLink to="/settings/osc/vrchat" scrollTo="vrchat">
|
||||
{l10n.getString('settings-sidebar-osc_trackers')}
|
||||
</SettingsLink>
|
||||
<SettingsLink to="/settings/osc/vmc" scrollTo="vmc">
|
||||
VMC
|
||||
</SettingsLink>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex flex-col gap-3">
|
||||
<Typography variant="section-title">
|
||||
{l10n.getString('settings-sidebar-utils')}
|
||||
{l10n.getString('settings-sidebar-interface')}
|
||||
</Typography>
|
||||
<div className="flex flex-col gap-2">
|
||||
<SettingsLink to="/settings/serial">
|
||||
{l10n.getString('settings-sidebar-serial')}
|
||||
<SettingsLink to="/settings/interface" scrollTo="notifications">
|
||||
{l10n.getString('settings-sidebar-notifications')}
|
||||
</SettingsLink>
|
||||
<SettingsLink to="/settings/interface" scrollTo="appearance">
|
||||
{l10n.getString('settings-sidebar-appearance')}
|
||||
</SettingsLink>
|
||||
</div>
|
||||
<div className="flex flex-col gap-3">
|
||||
<Typography variant="section-title">OSC</Typography>
|
||||
<div className="flex flex-col gap-2">
|
||||
<SettingsLink to="/settings/osc/router" scrollTo="router">
|
||||
{l10n.getString('settings-sidebar-osc_router')}
|
||||
</SettingsLink>
|
||||
<SettingsLink to="/settings/osc/vrchat" scrollTo="vrchat">
|
||||
{l10n.getString('settings-sidebar-osc_trackers')}
|
||||
</SettingsLink>
|
||||
<SettingsLink to="/settings/osc/vmc" scrollTo="vmc">
|
||||
VMC
|
||||
</SettingsLink>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex flex-col gap-3">
|
||||
<Typography variant="section-title">
|
||||
{l10n.getString('settings-sidebar-utils')}
|
||||
</Typography>
|
||||
<div className="flex flex-col gap-2">
|
||||
<SettingsLink to="/settings/serial">
|
||||
{l10n.getString('settings-sidebar-serial')}
|
||||
</SettingsLink>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -7,6 +7,7 @@ import {
|
||||
FilteringSettingsT,
|
||||
FilteringType,
|
||||
LegTweaksSettingsT,
|
||||
ModelRatiosT,
|
||||
ModelSettingsT,
|
||||
ModelTogglesT,
|
||||
RpcMessage,
|
||||
@@ -19,13 +20,10 @@ import { useConfig } from '../../../hooks/config';
|
||||
import { useWebsocketAPI } from '../../../hooks/websocket-api';
|
||||
import { useLocaleConfig } from '../../../i18n/config';
|
||||
import { CheckBox } from '../../commons/Checkbox';
|
||||
import { SquaresIcon } from '../../commons/icon/SquaresIcon';
|
||||
import { SteamIcon } from '../../commons/icon/SteamIcon';
|
||||
import { WrenchIcon } from '../../commons/icon/WrenchIcons';
|
||||
import { LangSelector } from '../../commons/LangSelector';
|
||||
import { NumberSelector } from '../../commons/NumberSelector';
|
||||
import { Radio } from '../../commons/Radio';
|
||||
import { ThemeSelector } from '../../commons/ThemeSelector';
|
||||
import { Typography } from '../../commons/Typography';
|
||||
import {
|
||||
SettingsPageLayout,
|
||||
@@ -60,6 +58,15 @@ interface SettingsForm {
|
||||
viveEmulation: boolean;
|
||||
toeSnap: boolean;
|
||||
footPlant: boolean;
|
||||
selfLocalization: boolean;
|
||||
};
|
||||
ratios: {
|
||||
imputeWaistFromChestHip: number;
|
||||
imputeWaistFromChestLegs: number;
|
||||
imputeHipFromChestLegs: number;
|
||||
imputeHipFromWaistLegs: number;
|
||||
interpHipLegs: number;
|
||||
interpKneeTrackerAnkle: number;
|
||||
};
|
||||
tapDetection: {
|
||||
mountingResetEnabled: boolean;
|
||||
@@ -71,17 +78,11 @@ interface SettingsForm {
|
||||
yawResetTaps: number;
|
||||
fullResetTaps: number;
|
||||
mountingResetTaps: number;
|
||||
numberTrackersOverThreshold;
|
||||
};
|
||||
legTweaks: {
|
||||
correctionStrength: number;
|
||||
};
|
||||
interface: {
|
||||
devmode: boolean;
|
||||
watchNewDevices: boolean;
|
||||
feedbackSound: boolean;
|
||||
feedbackSoundVolume: number;
|
||||
theme: string;
|
||||
};
|
||||
}
|
||||
|
||||
const defaultValues = {
|
||||
@@ -103,6 +104,15 @@ const defaultValues = {
|
||||
viveEmulation: false,
|
||||
toeSnap: false,
|
||||
flootPlant: true,
|
||||
selfLocalization: false,
|
||||
},
|
||||
ratios: {
|
||||
imputeWaistFromChestHip: 0.3,
|
||||
imputeWaistFromChestLegs: 0.2,
|
||||
imputeHipFromChestLegs: 0.45,
|
||||
imputeHipFromWaistLegs: 0.4,
|
||||
interpHipLegs: 0.25,
|
||||
interpKneeTrackerAnkle: 0.85,
|
||||
},
|
||||
filtering: { amount: 0.1, type: FilteringType.NONE },
|
||||
driftCompensation: {
|
||||
@@ -120,25 +130,19 @@ const defaultValues = {
|
||||
yawResetTaps: 2,
|
||||
fullResetTaps: 3,
|
||||
mountingResetTaps: 3,
|
||||
numberTrackersOverThreshold: 1,
|
||||
},
|
||||
legTweaks: { correctionStrength: 0.3 },
|
||||
interface: {
|
||||
devmode: false,
|
||||
watchNewDevices: true,
|
||||
feedbackSound: true,
|
||||
feedbackSoundVolume: 0.5,
|
||||
theme: 'slime',
|
||||
},
|
||||
};
|
||||
|
||||
export function GeneralSettings() {
|
||||
const { l10n } = useLocalization();
|
||||
const { config, setConfig } = useConfig();
|
||||
const { config } = useConfig();
|
||||
// const { state } = useLocation();
|
||||
const { currentLocales } = useLocaleConfig();
|
||||
// const pageRef = useRef<HTMLFormElement | null>(null);
|
||||
|
||||
const percentageFormat = Intl.NumberFormat(currentLocales, {
|
||||
const percentageFormat = new Intl.NumberFormat(currentLocales, {
|
||||
style: 'percent',
|
||||
maximumFractionDigits: 0,
|
||||
});
|
||||
@@ -163,22 +167,44 @@ export function GeneralSettings() {
|
||||
}
|
||||
|
||||
const modelSettings = new ModelSettingsT();
|
||||
const toggles = new ModelTogglesT();
|
||||
toggles.floorClip = values.toggles.floorClip;
|
||||
toggles.skatingCorrection = values.toggles.skatingCorrection;
|
||||
toggles.extendedKnee = values.toggles.extendedKnee;
|
||||
toggles.extendedPelvis = values.toggles.extendedPelvis;
|
||||
toggles.extendedSpine = values.toggles.extendedSpine;
|
||||
toggles.forceArmsFromHmd = values.toggles.forceArmsFromHmd;
|
||||
toggles.viveEmulation = values.toggles.viveEmulation;
|
||||
toggles.toeSnap = values.toggles.toeSnap;
|
||||
toggles.footPlant = values.toggles.footPlant;
|
||||
|
||||
const legTweaks = new LegTweaksSettingsT();
|
||||
legTweaks.correctionStrength = values.legTweaks.correctionStrength;
|
||||
if (values.toggles) {
|
||||
const toggles = new ModelTogglesT();
|
||||
toggles.floorClip = values.toggles.floorClip;
|
||||
toggles.skatingCorrection = values.toggles.skatingCorrection;
|
||||
toggles.extendedKnee = values.toggles.extendedKnee;
|
||||
toggles.extendedPelvis = values.toggles.extendedPelvis;
|
||||
toggles.extendedSpine = values.toggles.extendedSpine;
|
||||
toggles.forceArmsFromHmd = values.toggles.forceArmsFromHmd;
|
||||
toggles.viveEmulation = values.toggles.viveEmulation;
|
||||
toggles.toeSnap = values.toggles.toeSnap;
|
||||
toggles.footPlant = values.toggles.footPlant;
|
||||
toggles.selfLocalization = values.toggles.selfLocalization;
|
||||
modelSettings.toggles = toggles;
|
||||
}
|
||||
|
||||
if (values.ratios) {
|
||||
const ratios = new ModelRatiosT();
|
||||
ratios.imputeWaistFromChestHip =
|
||||
values.ratios.imputeWaistFromChestHip || -1;
|
||||
ratios.imputeWaistFromChestLegs =
|
||||
values.ratios.imputeWaistFromChestLegs || -1;
|
||||
ratios.imputeHipFromChestLegs =
|
||||
values.ratios.imputeHipFromChestLegs || -1;
|
||||
ratios.imputeHipFromWaistLegs =
|
||||
values.ratios.imputeHipFromWaistLegs || -1;
|
||||
ratios.interpHipLegs = values.ratios.interpHipLegs || -1;
|
||||
ratios.interpKneeTrackerAnkle =
|
||||
values.ratios.interpKneeTrackerAnkle || -1;
|
||||
modelSettings.ratios = ratios;
|
||||
}
|
||||
|
||||
if (values.legTweaks) {
|
||||
const legTweaks = new LegTweaksSettingsT();
|
||||
legTweaks.correctionStrength = values.legTweaks.correctionStrength;
|
||||
modelSettings.legTweaks = legTweaks;
|
||||
}
|
||||
|
||||
modelSettings.toggles = toggles;
|
||||
modelSettings.legTweaks = legTweaks;
|
||||
settings.modelSettings = modelSettings;
|
||||
|
||||
const tapDetection = new TapDetectionSettingsT();
|
||||
@@ -192,6 +218,8 @@ export function GeneralSettings() {
|
||||
values.tapDetection.mountingResetEnabled;
|
||||
tapDetection.mountingResetDelay = values.tapDetection.mountingResetDelay;
|
||||
tapDetection.mountingResetTaps = values.tapDetection.mountingResetTaps;
|
||||
tapDetection.numberTrackersOverThreshold =
|
||||
values.tapDetection.numberTrackersOverThreshold;
|
||||
tapDetection.setupMode = false;
|
||||
settings.tapDetectionSettings = tapDetection;
|
||||
|
||||
@@ -207,14 +235,6 @@ export function GeneralSettings() {
|
||||
settings.driftCompensation = driftCompensation;
|
||||
|
||||
sendRPCPacket(RpcMessage.ChangeSettingsRequest, settings);
|
||||
|
||||
setConfig({
|
||||
debug: values.interface.devmode,
|
||||
watchNewDevices: values.interface.watchNewDevices,
|
||||
feedbackSound: values.interface.feedbackSound,
|
||||
feedbackSoundVolume: values.interface.feedbackSoundVolume,
|
||||
theme: values.interface.theme,
|
||||
});
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
@@ -227,15 +247,7 @@ export function GeneralSettings() {
|
||||
}, []);
|
||||
|
||||
useRPCPacket(RpcMessage.SettingsResponse, (settings: SettingsResponseT) => {
|
||||
const formData: DefaultValues<SettingsForm> = {
|
||||
interface: {
|
||||
devmode: config?.debug,
|
||||
watchNewDevices: config?.watchNewDevices,
|
||||
feedbackSound: config?.feedbackSound,
|
||||
feedbackSoundVolume: config?.feedbackSoundVolume,
|
||||
theme: config?.theme,
|
||||
},
|
||||
};
|
||||
const formData: DefaultValues<SettingsForm> = {};
|
||||
|
||||
if (settings.filtering) {
|
||||
formData.filtering = settings.filtering;
|
||||
@@ -262,6 +274,19 @@ export function GeneralSettings() {
|
||||
);
|
||||
}
|
||||
|
||||
if (settings.modelSettings?.ratios) {
|
||||
formData.ratios = Object.keys(settings.modelSettings?.ratios).reduce(
|
||||
(curr, key: string) => ({
|
||||
...curr,
|
||||
[key]:
|
||||
(settings.modelSettings?.ratios &&
|
||||
(settings.modelSettings.ratios as any)[key]) ||
|
||||
0.0,
|
||||
}),
|
||||
{}
|
||||
);
|
||||
}
|
||||
|
||||
if (settings.tapDetectionSettings) {
|
||||
formData.tapDetection = {
|
||||
yawResetEnabled:
|
||||
@@ -291,6 +316,9 @@ export function GeneralSettings() {
|
||||
mountingResetTaps:
|
||||
settings.tapDetectionSettings.mountingResetTaps ||
|
||||
defaultValues.tapDetection.mountingResetTaps,
|
||||
numberTrackersOverThreshold:
|
||||
settings.tapDetectionSettings.numberTrackersOverThreshold ||
|
||||
defaultValues.tapDetection.numberTrackersOverThreshold,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -650,7 +678,7 @@ export function GeneralSettings() {
|
||||
<div className="flex flex-col pt-2 pb-3">
|
||||
<Typography bold>
|
||||
{l10n.getString(
|
||||
'settings-general-fk_settings-skeleton_settings'
|
||||
'settings-general-fk_settings-skeleton_settings-toggles'
|
||||
)}
|
||||
</Typography>
|
||||
<Typography color="secondary">
|
||||
@@ -666,7 +694,7 @@ export function GeneralSettings() {
|
||||
control={control}
|
||||
name="toggles.extendedSpine"
|
||||
label={l10n.getString(
|
||||
'settings-general-fk_settings-skeleton_settings-extended_spine'
|
||||
'settings-general-fk_settings-skeleton_settings-extended_spine_model'
|
||||
)}
|
||||
/>
|
||||
<CheckBox
|
||||
@@ -675,7 +703,7 @@ export function GeneralSettings() {
|
||||
control={control}
|
||||
name="toggles.extendedPelvis"
|
||||
label={l10n.getString(
|
||||
'settings-general-fk_settings-skeleton_settings-extended_pelvis'
|
||||
'settings-general-fk_settings-skeleton_settings-extended_pelvis_model'
|
||||
)}
|
||||
/>
|
||||
<CheckBox
|
||||
@@ -684,10 +712,105 @@ export function GeneralSettings() {
|
||||
control={control}
|
||||
name="toggles.extendedKnee"
|
||||
label={l10n.getString(
|
||||
'settings-general-fk_settings-skeleton_settings-extended_knees'
|
||||
'settings-general-fk_settings-skeleton_settings-extended_knees_model'
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
<div className="flex flex-col pt-2 pb-3">
|
||||
<div className="flex flex-col pt-2 pb-3">
|
||||
<Typography bold>
|
||||
{l10n.getString(
|
||||
'settings-general-fk_settings-skeleton_settings-ratios'
|
||||
)}
|
||||
</Typography>
|
||||
<Typography color="secondary">
|
||||
{l10n.getString(
|
||||
'settings-general-fk_settings-skeleton_settings-ratios-description'
|
||||
)}
|
||||
</Typography>
|
||||
</div>
|
||||
<div className="grid sm:grid-cols-2 gap-3 pb-3">
|
||||
<NumberSelector
|
||||
control={control}
|
||||
name="ratios.imputeWaistFromChestHip"
|
||||
label={l10n.getString(
|
||||
'settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_hip'
|
||||
)}
|
||||
valueLabelFormat={(value) =>
|
||||
percentageFormat.format(value)
|
||||
}
|
||||
min={0.0}
|
||||
max={1.0}
|
||||
step={0.05}
|
||||
/>
|
||||
<NumberSelector
|
||||
control={control}
|
||||
name="ratios.imputeWaistFromChestLegs"
|
||||
label={l10n.getString(
|
||||
'settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_legs'
|
||||
)}
|
||||
valueLabelFormat={(value) =>
|
||||
percentageFormat.format(value)
|
||||
}
|
||||
min={0.0}
|
||||
max={1.0}
|
||||
step={0.05}
|
||||
/>
|
||||
<NumberSelector
|
||||
control={control}
|
||||
name="ratios.imputeHipFromChestLegs"
|
||||
label={l10n.getString(
|
||||
'settings-general-fk_settings-skeleton_settings-impute_hip_from_chest_legs'
|
||||
)}
|
||||
valueLabelFormat={(value) =>
|
||||
percentageFormat.format(value)
|
||||
}
|
||||
min={0.0}
|
||||
max={1.0}
|
||||
step={0.05}
|
||||
/>
|
||||
<NumberSelector
|
||||
control={control}
|
||||
name="ratios.imputeHipFromWaistLegs"
|
||||
label={l10n.getString(
|
||||
'settings-general-fk_settings-skeleton_settings-impute_hip_from_waist_legs'
|
||||
)}
|
||||
valueLabelFormat={(value) =>
|
||||
percentageFormat.format(value)
|
||||
}
|
||||
min={0.0}
|
||||
max={1.0}
|
||||
step={0.05}
|
||||
/>
|
||||
<NumberSelector
|
||||
control={control}
|
||||
name="ratios.interpHipLegs"
|
||||
label={l10n.getString(
|
||||
'settings-general-fk_settings-skeleton_settings-interp_hip_legs'
|
||||
)}
|
||||
valueLabelFormat={(value) =>
|
||||
percentageFormat.format(value)
|
||||
}
|
||||
min={0.0}
|
||||
max={1.0}
|
||||
step={0.05}
|
||||
/>
|
||||
<NumberSelector
|
||||
control={control}
|
||||
name="ratios.interpKneeTrackerAnkle"
|
||||
label={l10n.getString(
|
||||
'settings-general-fk_settings-skeleton_settings-interp_knee_tracker_ankle'
|
||||
)}
|
||||
valueLabelFormat={(value) =>
|
||||
percentageFormat.format(value)
|
||||
}
|
||||
min={0.0}
|
||||
max={1.0}
|
||||
step={0.05}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-col pt-2 pb-3">
|
||||
<Typography bold>
|
||||
{l10n.getString(
|
||||
@@ -711,6 +834,29 @@ export function GeneralSettings() {
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
<div className="flex flex-col pt-2 pb-3">
|
||||
<Typography bold>
|
||||
{l10n.getString(
|
||||
'settings-general-fk_settings-self_localization-title'
|
||||
)}
|
||||
</Typography>
|
||||
<Typography color="secondary">
|
||||
{l10n.getString(
|
||||
'settings-general-fk_settings-self_localization-description'
|
||||
)}
|
||||
</Typography>
|
||||
</div>
|
||||
<div className="grid sm:grid-cols-1 gap3 pb5">
|
||||
<CheckBox
|
||||
variant="toggle"
|
||||
outlined
|
||||
control={control}
|
||||
name="toggles.selfLocalization"
|
||||
label={l10n.getString(
|
||||
'settings-general-fk_settings-self_localization-title'
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
</>
|
||||
@@ -843,162 +989,35 @@ export function GeneralSettings() {
|
||||
step={1}
|
||||
/>
|
||||
</div>
|
||||
</>
|
||||
</SettingsPagePaneLayout>
|
||||
|
||||
<SettingsPagePaneLayout
|
||||
icon={<SquaresIcon></SquaresIcon>}
|
||||
id="interface"
|
||||
>
|
||||
<>
|
||||
<Typography variant="main-title">
|
||||
{l10n.getString('settings-general-interface')}
|
||||
</Typography>
|
||||
|
||||
<Typography bold>
|
||||
{l10n.getString('settings-general-interface-dev_mode')}
|
||||
</Typography>
|
||||
<div className="flex flex-col pt-1 pb-2">
|
||||
<Typography color="secondary">
|
||||
{l10n.getString(
|
||||
'settings-general-interface-dev_mode-description'
|
||||
)}
|
||||
</Typography>
|
||||
</div>
|
||||
<div className="grid sm:grid-cols-2 pb-4">
|
||||
<CheckBox
|
||||
variant="toggle"
|
||||
control={control}
|
||||
outlined
|
||||
name="interface.devmode"
|
||||
label={l10n.getString(
|
||||
'settings-general-interface-dev_mode-label'
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<Typography bold>
|
||||
{l10n.getString('settings-general-interface-serial_detection')}
|
||||
</Typography>
|
||||
<div className="flex flex-col pt-1 pb-2">
|
||||
<Typography color="secondary">
|
||||
{l10n.getString(
|
||||
'settings-general-interface-serial_detection-description'
|
||||
)}
|
||||
</Typography>
|
||||
</div>
|
||||
<div className="grid sm:grid-cols-2 pb-4">
|
||||
<CheckBox
|
||||
variant="toggle"
|
||||
control={control}
|
||||
outlined
|
||||
name="interface.watchNewDevices"
|
||||
label={l10n.getString(
|
||||
'settings-general-interface-serial_detection-label'
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<Typography bold>
|
||||
{l10n.getString('settings-general-interface-feedback_sound')}
|
||||
</Typography>
|
||||
<div className="flex flex-col pt-1 pb-2">
|
||||
<Typography color="secondary">
|
||||
{l10n.getString(
|
||||
'settings-general-interface-feedback_sound-description'
|
||||
)}
|
||||
</Typography>
|
||||
</div>
|
||||
<div className="grid sm:grid-cols-2 pb-4">
|
||||
<CheckBox
|
||||
variant="toggle"
|
||||
control={control}
|
||||
outlined
|
||||
name="interface.feedbackSound"
|
||||
label={l10n.getString(
|
||||
'settings-general-interface-feedback_sound-label'
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
<div className="grid sm:grid-cols-2 pb-4">
|
||||
<NumberSelector
|
||||
control={control}
|
||||
name="interface.feedbackSoundVolume"
|
||||
label={l10n.getString(
|
||||
'settings-general-interface-feedback_sound-volume'
|
||||
)}
|
||||
valueLabelFormat={(value) => percentageFormat.format(value)}
|
||||
min={0.1}
|
||||
max={1.0}
|
||||
step={0.1}
|
||||
/>
|
||||
</div>
|
||||
<div className="pb-4">
|
||||
<Typography bold>
|
||||
{l10n.getString('settings-general-interface-theme')}
|
||||
</Typography>
|
||||
<div className="flex flex-wrap gap-3 pt-2">
|
||||
<ThemeSelector
|
||||
{config?.debug && (
|
||||
<div className="grid sm:grid-cols-1 gap-2 pt-2">
|
||||
<Typography bold>
|
||||
{l10n.getString(
|
||||
'settings-general-gesture_control-numberTrackersOverThreshold'
|
||||
)}
|
||||
</Typography>
|
||||
<Typography color="secondary">
|
||||
{l10n.getString(
|
||||
'settings-general-gesture_control-numberTrackersOverThreshold-description'
|
||||
)}
|
||||
</Typography>
|
||||
<NumberSelector
|
||||
control={control}
|
||||
name="interface.theme"
|
||||
value={'slime'}
|
||||
colors="!bg-slime"
|
||||
></ThemeSelector>
|
||||
<ThemeSelector
|
||||
control={control}
|
||||
name="interface.theme"
|
||||
value={'slime-green'}
|
||||
colors="!bg-slime-green"
|
||||
></ThemeSelector>
|
||||
<ThemeSelector
|
||||
control={control}
|
||||
name="interface.theme"
|
||||
value={'slime-yellow'}
|
||||
colors="!bg-slime-yellow"
|
||||
></ThemeSelector>
|
||||
<ThemeSelector
|
||||
control={control}
|
||||
name="interface.theme"
|
||||
value={'slime-orange'}
|
||||
colors="!bg-slime-orange"
|
||||
></ThemeSelector>
|
||||
<ThemeSelector
|
||||
control={control}
|
||||
name="interface.theme"
|
||||
value={'slime-red'}
|
||||
colors="!bg-slime-red"
|
||||
></ThemeSelector>
|
||||
<ThemeSelector
|
||||
control={control}
|
||||
name="interface.theme"
|
||||
value={'dark'}
|
||||
colors="!bg-dark"
|
||||
></ThemeSelector>
|
||||
<ThemeSelector
|
||||
control={control}
|
||||
name="interface.theme"
|
||||
value={'light'}
|
||||
colors="!bg-light"
|
||||
></ThemeSelector>
|
||||
<ThemeSelector
|
||||
control={control}
|
||||
name="interface.theme"
|
||||
value={'trans'}
|
||||
colors="!bg-trans-flag"
|
||||
></ThemeSelector>
|
||||
name="tapDetection.numberTrackersOverThreshold"
|
||||
valueLabelFormat={(value) =>
|
||||
l10n.getString(
|
||||
'settings-general-gesture_control-trackers',
|
||||
{
|
||||
amount: Math.round(value),
|
||||
}
|
||||
)
|
||||
}
|
||||
min={1}
|
||||
max={20}
|
||||
step={1}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<Typography bold>
|
||||
{l10n.getString('settings-general-interface-lang')}
|
||||
</Typography>
|
||||
<div className="flex flex-col pt-1 pb-2">
|
||||
<Typography color="secondary">
|
||||
{l10n.getString('settings-general-interface-lang-description')}
|
||||
</Typography>
|
||||
</div>
|
||||
<div className="grid sm:grid-cols-2 pb-4">
|
||||
<LangSelector alignment="left" />
|
||||
</div>
|
||||
)}
|
||||
</>
|
||||
</SettingsPagePaneLayout>
|
||||
</form>
|
||||
|
||||
338
gui/src/components/settings/pages/InterfaceSettings.tsx
Normal file
@@ -0,0 +1,338 @@
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { useEffect } from 'react';
|
||||
import { useForm } from 'react-hook-form';
|
||||
import { CheckBox } from '../../commons/Checkbox';
|
||||
import { Typography } from '../../commons/Typography';
|
||||
import {
|
||||
SettingsPageLayout,
|
||||
SettingsPagePaneLayout,
|
||||
} from '../SettingsPageLayout';
|
||||
import { defaultConfig, useConfig } from '../../../hooks/config';
|
||||
import { ThemeSelector } from '../../commons/ThemeSelector';
|
||||
import { SquaresIcon } from '../../commons/icon/SquaresIcon';
|
||||
import { NumberSelector } from '../../commons/NumberSelector';
|
||||
import { useLocaleConfig } from '../../../i18n/config';
|
||||
import { LangSelector } from '../../commons/LangSelector';
|
||||
import { BellIcon } from '../../commons/icon/BellIcon';
|
||||
import { Range } from '../../commons/Range';
|
||||
import { Dropdown } from '../../commons/Dropdown';
|
||||
|
||||
interface InterfaceSettingsForm {
|
||||
appearance: {
|
||||
devmode: boolean;
|
||||
theme: string;
|
||||
textSize: number;
|
||||
fonts: string;
|
||||
};
|
||||
notifications: {
|
||||
watchNewDevices: boolean;
|
||||
feedbackSound: boolean;
|
||||
feedbackSoundVolume: number;
|
||||
};
|
||||
}
|
||||
|
||||
export function InterfaceSettings() {
|
||||
const { currentLocales } = useLocaleConfig();
|
||||
const { l10n } = useLocalization();
|
||||
const { config, setConfig } = useConfig();
|
||||
const { control, watch, handleSubmit, getValues } =
|
||||
useForm<InterfaceSettingsForm>({
|
||||
defaultValues: {
|
||||
appearance: {
|
||||
devmode: config?.debug ?? defaultConfig.debug,
|
||||
theme: config?.theme ?? defaultConfig.theme,
|
||||
textSize: config?.textSize ?? defaultConfig.textSize,
|
||||
fonts: config?.fonts.join(',') ?? defaultConfig.fonts.join(','),
|
||||
},
|
||||
notifications: {
|
||||
watchNewDevices:
|
||||
config?.watchNewDevices ?? defaultConfig.watchNewDevices,
|
||||
feedbackSound: config?.feedbackSound ?? defaultConfig.feedbackSound,
|
||||
feedbackSoundVolume:
|
||||
config?.feedbackSoundVolume ?? defaultConfig.feedbackSoundVolume,
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
const onSubmit = (values: InterfaceSettingsForm) => {
|
||||
setConfig({
|
||||
debug: values.appearance.devmode,
|
||||
watchNewDevices: values.notifications.watchNewDevices,
|
||||
feedbackSound: values.notifications.feedbackSound,
|
||||
feedbackSoundVolume: values.notifications.feedbackSoundVolume,
|
||||
theme: values.appearance.theme,
|
||||
fonts: values.appearance.fonts.split(','),
|
||||
textSize: values.appearance.textSize,
|
||||
});
|
||||
};
|
||||
|
||||
const percentageFormat = Intl.NumberFormat(currentLocales, {
|
||||
style: 'percent',
|
||||
maximumFractionDigits: 0,
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
const subscription = watch(() => handleSubmit(onSubmit)());
|
||||
return () => subscription.unsubscribe();
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<SettingsPageLayout>
|
||||
<form
|
||||
className="flex flex-col gap-2 w-full"
|
||||
style={
|
||||
{
|
||||
'--font-size': '12rem',
|
||||
'--font-size-standard': '12rem',
|
||||
'--font-size-vr': '16rem',
|
||||
'--font-size-title': '25rem',
|
||||
} as React.CSSProperties
|
||||
}
|
||||
>
|
||||
<SettingsPagePaneLayout icon={<BellIcon></BellIcon>} id="notifications">
|
||||
<>
|
||||
<Typography variant="main-title">
|
||||
{l10n.getString('settings-interface-notifications')}
|
||||
</Typography>
|
||||
|
||||
<Typography bold>
|
||||
{l10n.getString('settings-general-interface-serial_detection')}
|
||||
</Typography>
|
||||
<div className="flex flex-col pt-1 pb-2">
|
||||
<Typography color="secondary">
|
||||
{l10n.getString(
|
||||
'settings-general-interface-serial_detection-description'
|
||||
)}
|
||||
</Typography>
|
||||
</div>
|
||||
<div className="grid sm:grid-cols-2 pb-4">
|
||||
<CheckBox
|
||||
variant="toggle"
|
||||
control={control}
|
||||
outlined
|
||||
name="notifications.watchNewDevices"
|
||||
label={l10n.getString(
|
||||
'settings-general-interface-serial_detection-label'
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<Typography bold>
|
||||
{l10n.getString('settings-general-interface-feedback_sound')}
|
||||
</Typography>
|
||||
<div className="flex flex-col pt-1 pb-2">
|
||||
<Typography color="secondary">
|
||||
{l10n.getString(
|
||||
'settings-general-interface-feedback_sound-description'
|
||||
)}
|
||||
</Typography>
|
||||
</div>
|
||||
<div className="grid sm:grid-cols-2 pb-4">
|
||||
<CheckBox
|
||||
variant="toggle"
|
||||
control={control}
|
||||
outlined
|
||||
name="notifications.feedbackSound"
|
||||
label={l10n.getString(
|
||||
'settings-general-interface-feedback_sound-label'
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
<div className="grid sm:grid-cols-2 pb-4">
|
||||
<NumberSelector
|
||||
control={control}
|
||||
name="notifications.feedbackSoundVolume"
|
||||
label={l10n.getString(
|
||||
'settings-general-interface-feedback_sound-volume'
|
||||
)}
|
||||
valueLabelFormat={(value) => percentageFormat.format(value)}
|
||||
min={0.1}
|
||||
max={1.0}
|
||||
step={0.1}
|
||||
/>
|
||||
</div>
|
||||
</>
|
||||
</SettingsPagePaneLayout>
|
||||
|
||||
<SettingsPagePaneLayout
|
||||
icon={<SquaresIcon></SquaresIcon>}
|
||||
id="appearance"
|
||||
>
|
||||
<>
|
||||
<Typography variant="main-title">
|
||||
{l10n.getString('settings-interface-appearance')}
|
||||
</Typography>
|
||||
|
||||
<Typography bold>
|
||||
{l10n.getString('settings-general-interface-dev_mode')}
|
||||
</Typography>
|
||||
<div className="flex flex-col pt-1 pb-2">
|
||||
<Typography color="secondary">
|
||||
{l10n.getString(
|
||||
'settings-general-interface-dev_mode-description'
|
||||
)}
|
||||
</Typography>
|
||||
</div>
|
||||
<div className="grid sm:grid-cols-2 pb-4">
|
||||
<CheckBox
|
||||
variant="toggle"
|
||||
control={control}
|
||||
outlined
|
||||
name="appearance.devmode"
|
||||
label={l10n.getString(
|
||||
'settings-general-interface-dev_mode-label'
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="pb-4">
|
||||
<Typography bold>
|
||||
{l10n.getString('settings-general-interface-theme')}
|
||||
</Typography>
|
||||
<div className="flex flex-wrap gap-3 pt-2">
|
||||
<ThemeSelector
|
||||
control={control}
|
||||
name="appearance.theme"
|
||||
value={'slime'}
|
||||
colors="!bg-slime"
|
||||
></ThemeSelector>
|
||||
<ThemeSelector
|
||||
control={control}
|
||||
name="appearance.theme"
|
||||
value={'slime-green'}
|
||||
colors="!bg-slime-green"
|
||||
></ThemeSelector>
|
||||
<ThemeSelector
|
||||
control={control}
|
||||
name="appearance.theme"
|
||||
value={'slime-yellow'}
|
||||
colors="!bg-slime-yellow"
|
||||
></ThemeSelector>
|
||||
<ThemeSelector
|
||||
control={control}
|
||||
name="appearance.theme"
|
||||
value={'slime-orange'}
|
||||
colors="!bg-slime-orange"
|
||||
></ThemeSelector>
|
||||
<ThemeSelector
|
||||
control={control}
|
||||
name="appearance.theme"
|
||||
value={'slime-red'}
|
||||
colors="!bg-slime-red"
|
||||
></ThemeSelector>
|
||||
<ThemeSelector
|
||||
control={control}
|
||||
name="appearance.theme"
|
||||
value={'dark'}
|
||||
colors="!bg-dark"
|
||||
></ThemeSelector>
|
||||
<ThemeSelector
|
||||
control={control}
|
||||
name="appearance.theme"
|
||||
value={'light'}
|
||||
colors="!bg-light"
|
||||
></ThemeSelector>
|
||||
<ThemeSelector
|
||||
control={control}
|
||||
name="appearance.theme"
|
||||
value={'trans'}
|
||||
colors="!bg-trans-flag"
|
||||
></ThemeSelector>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<Typography bold>
|
||||
{l10n.getString('settings-interface-appearance-font')}
|
||||
</Typography>
|
||||
<div className="flex flex-col pt-1 pb-2">
|
||||
<Typography color="secondary">
|
||||
{l10n.getString(
|
||||
'settings-interface-appearance-font-description'
|
||||
)}
|
||||
</Typography>
|
||||
</div>
|
||||
<div className="grid sm:grid-cols-2 pb-4">
|
||||
<Dropdown
|
||||
control={control}
|
||||
getValues={getValues}
|
||||
name="appearance.fonts"
|
||||
placeholder={l10n.getString(
|
||||
'settings-interface-appearance-font-placeholder'
|
||||
)}
|
||||
/* Supports multiple items by separating them with a comma */
|
||||
items={[
|
||||
{
|
||||
label: l10n.getString(
|
||||
'settings-interface-appearance-font-slime_font'
|
||||
),
|
||||
value: 'poppins',
|
||||
fontName: 'poppins',
|
||||
},
|
||||
{
|
||||
label: 'OpenDyslexic',
|
||||
value: 'OpenDyslexic',
|
||||
fontName: 'OpenDyslexic',
|
||||
},
|
||||
{ label: 'Lexend', value: 'Lexend', fontName: 'Lexend' },
|
||||
{ label: 'Ubuntu', value: 'Ubuntu', fontName: 'Ubuntu' },
|
||||
{
|
||||
label: 'Noto Sans (CJK)',
|
||||
value: 'Noto Sans CJK',
|
||||
fontName: 'Noto Sans CJK',
|
||||
},
|
||||
{
|
||||
label: l10n.getString(
|
||||
'settings-interface-appearance-font-os_font'
|
||||
),
|
||||
value: 'ui-sans-serif',
|
||||
},
|
||||
]}
|
||||
alignment="left"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<Typography bold>
|
||||
{l10n.getString('settings-interface-appearance-font_size')}
|
||||
</Typography>
|
||||
<div className="flex flex-col pt-1 pb-2">
|
||||
<Typography color="secondary">
|
||||
{l10n.getString(
|
||||
'settings-interface-appearance-font_size-description'
|
||||
)}
|
||||
</Typography>
|
||||
</div>
|
||||
<div className="grid sm:grid-cols-2 pb-4">
|
||||
<Range
|
||||
control={control}
|
||||
name="appearance.textSize"
|
||||
min={10}
|
||||
max={15}
|
||||
step={1}
|
||||
values={[
|
||||
{ value: 10, label: '10pt' },
|
||||
{ value: 11, label: '11pt' },
|
||||
{ value: 12, label: '12pt', defaultValue: true },
|
||||
{ value: 13, label: '13pt' },
|
||||
{ value: 14, label: '14pt' },
|
||||
{ value: 15, label: '15pt' },
|
||||
]}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<Typography bold>
|
||||
{l10n.getString('settings-general-interface-lang')}
|
||||
</Typography>
|
||||
<div className="flex flex-col pt-1 pb-2">
|
||||
<Typography color="secondary">
|
||||
{l10n.getString('settings-general-interface-lang-description')}
|
||||
</Typography>
|
||||
</div>
|
||||
<div className="grid sm:grid-cols-2 pb-4">
|
||||
<LangSelector alignment="left" />
|
||||
</div>
|
||||
</>
|
||||
</SettingsPagePaneLayout>
|
||||
</form>
|
||||
</SettingsPageLayout>
|
||||
);
|
||||
}
|
||||
@@ -219,7 +219,7 @@ export function Serial() {
|
||||
</div>
|
||||
<div className="" ref={toolbarRef}>
|
||||
<div className="border-t-2 pt-2 border-background-60 border-solid m-2 gap-2 flex flex-row">
|
||||
<div className="flex flex-grow gap-2 mobile:grid mobile:grid-cols-2 mobile:grid-rows-2">
|
||||
<div className="flex flex-grow flex-wrap gap-2 mobile:grid mobile:grid-cols-2 mobile:grid-rows-2">
|
||||
<Button variant="quaternary" onClick={reboot}>
|
||||
{l10n.getString('settings-serial-reboot')}
|
||||
</Button>
|
||||
|
||||
@@ -15,11 +15,12 @@ import { FileInput } from '../../commons/FileInput';
|
||||
import { VMCIcon } from '../../commons/icon/VMCIcon';
|
||||
import { Input } from '../../commons/Input';
|
||||
import { Typography } from '../../commons/Typography';
|
||||
import { magic } from '../../utils/formatting';
|
||||
import { magic } from '../../../utils/formatting';
|
||||
import {
|
||||
SettingsPageLayout,
|
||||
SettingsPagePaneLayout,
|
||||
} from '../SettingsPageLayout';
|
||||
import { error } from '../../../utils/logging';
|
||||
|
||||
interface VMCSettingsForm {
|
||||
vmc: {
|
||||
@@ -287,7 +288,7 @@ async function parseVRMFile(vrm: File): Promise<string | null> {
|
||||
let cursor = 0;
|
||||
const magicBytes = headerView.getUint32(cursor, true);
|
||||
if (magicBytes !== magic`glTF`) {
|
||||
console.error(
|
||||
error(
|
||||
`.vrm file starts with ${magicBytes.toString(
|
||||
16
|
||||
)} instead of ${magic`glTF`.toString(16)}`
|
||||
@@ -298,7 +299,7 @@ async function parseVRMFile(vrm: File): Promise<string | null> {
|
||||
|
||||
const versionNumber = headerView.getUint32(cursor, true);
|
||||
if (versionNumber !== 2) {
|
||||
console.error('unsupported glTF version');
|
||||
error('unsupported glTF version');
|
||||
return null;
|
||||
}
|
||||
cursor += 4;
|
||||
@@ -310,7 +311,7 @@ async function parseVRMFile(vrm: File): Promise<string | null> {
|
||||
cursor += 4;
|
||||
const jsonMagicBytes = headerView.getUint32(cursor, true);
|
||||
if (jsonMagicBytes !== magic`JSON`) {
|
||||
console.error(
|
||||
error(
|
||||
`first chunk contains ${jsonMagicBytes.toString(
|
||||
16
|
||||
)} instead of ${magic`JSON`.toString(16)}`
|
||||
|
||||
@@ -24,6 +24,7 @@ export function TrackerBattery({
|
||||
});
|
||||
const voltageFormatter = new Intl.NumberFormat(currentLocales, {
|
||||
maximumFractionDigits: 2,
|
||||
minimumFractionDigits: 2,
|
||||
});
|
||||
|
||||
return (
|
||||
|
||||