Compare commits
97 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5ff5f81a88 | ||
|
|
99f71088ec | ||
|
|
fcdcac1ed2 | ||
|
|
37b57bea1f | ||
|
|
77285787ec | ||
|
|
2f5d2b214e | ||
|
|
319344254d | ||
|
|
86011f323b | ||
|
|
f9a8384369 | ||
|
|
90ced8cacf | ||
|
|
8253110130 | ||
|
|
563713e788 | ||
|
|
93c319ce68 | ||
|
|
abaf8a19ae | ||
|
|
49becc4f08 | ||
|
|
24f6fdacae | ||
|
|
c54b0d4044 | ||
|
|
bec4d74ccf | ||
|
|
583629d8e0 | ||
|
|
60535bda30 | ||
|
|
3675213820 | ||
|
|
900a5d30f7 | ||
|
|
4d21b61549 | ||
|
|
c3c7fc896c | ||
|
|
c3b4727017 | ||
|
|
99d0756997 | ||
|
|
ff218488a7 | ||
|
|
8fa535d8b8 | ||
|
|
d2a9a21b8f | ||
|
|
2dbc25b529 | ||
|
|
eefe7efbfa | ||
|
|
25bd05082c | ||
|
|
cc5bd5d938 | ||
|
|
751c2e2f3b | ||
|
|
59863fa7f3 | ||
|
|
82b5a74a4b | ||
|
|
4079dee383 | ||
|
|
af69d94681 | ||
|
|
923235aaee | ||
|
|
79eeca9c1c | ||
|
|
335fe5edeb | ||
|
|
68c484b6c5 | ||
|
|
70f4925b3e | ||
|
|
3aa0587387 | ||
|
|
74c3f41867 | ||
|
|
a39c8c2018 | ||
|
|
4fa5c3f767 | ||
|
|
71d271bfdb | ||
|
|
f1b3b56484 | ||
|
|
a614c225da | ||
|
|
8ae3ecc1b3 | ||
|
|
e79c7ebf0e | ||
|
|
3a50153980 | ||
|
|
d37466cf9f | ||
|
|
029bd9da81 | ||
|
|
d3f323b438 | ||
|
|
ce4639bed0 | ||
|
|
4ebd863580 | ||
|
|
1fb32e8458 | ||
|
|
871ffa5571 | ||
|
|
56b105697f | ||
|
|
3a0014db25 | ||
|
|
c3d10f1407 | ||
|
|
a2bbe7097c | ||
|
|
415a07461e | ||
|
|
4bd31fb02f | ||
|
|
2bc50b2bc2 | ||
|
|
e37b11844f | ||
|
|
92f709e2f9 | ||
|
|
7fe3d82540 | ||
|
|
12b5461849 | ||
|
|
9b43f77c31 | ||
|
|
d3fab10ea7 | ||
|
|
de51497cee | ||
|
|
a19de94130 | ||
|
|
e11b80c8e0 | ||
|
|
9b3f9eccab | ||
|
|
3752a11f84 | ||
|
|
7c89185a40 | ||
|
|
4284e1f52c | ||
|
|
7a37773441 | ||
|
|
4dc8ce979d | ||
|
|
6a30da671d | ||
|
|
3f307605cc | ||
|
|
185dc8d674 | ||
|
|
55d6a01a4c | ||
|
|
34f357572a | ||
|
|
1aaf01f2ca | ||
|
|
bc5f9a17c4 | ||
|
|
7231f46804 | ||
|
|
b467af8c46 | ||
|
|
4393a6f137 | ||
|
|
5d773a37ab | ||
|
|
17306c1976 | ||
|
|
6dfc8a8101 | ||
|
|
ac5a68d33d | ||
|
|
f2d663c341 |
11
.envrc
@@ -1 +1,10 @@
|
||||
use flake
|
||||
if ! has nix_direnv_version || ! nix_direnv_version 2.2.1; then
|
||||
source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/2.2.1/direnvrc" "sha256-zelF0vLbEl5uaqrfIzbgNzJWGmLzCmYAkInj/LNxvKs="
|
||||
fi
|
||||
|
||||
nix_direnv_watch_file rust-toolchain.toml
|
||||
nix_direnv_watch_file package.json
|
||||
if ! use flake . --impure
|
||||
then
|
||||
echo "devenv could not be built. The devenv environment was not loaded. Make the necessary changes to devenv.nix and hit enter to try again." >&2
|
||||
fi
|
||||
|
||||
6
.github/CODEOWNERS
vendored
@@ -10,11 +10,11 @@
|
||||
/gui/src/i18n/ @ImUrX @Louka3000
|
||||
/l10n.toml @ImUrX @Louka3000
|
||||
|
||||
/gui/src/components/settings/ @Louka3000 @loucass003
|
||||
/gui/src/components/settings/ @Louka3000 @loucass003 @ImUrX
|
||||
|
||||
# Rust part of the GUI
|
||||
/gui/src-tauri/ @ImUrX @TheButlah
|
||||
/Cargo.lock @ImUrX @TheButlah
|
||||
/gui/src-tauri/ @ImUrX
|
||||
/Cargo.lock @ImUrX
|
||||
|
||||
# Some server code~
|
||||
/server/ @ButterscotchV @Eirenliel @Louka3000
|
||||
|
||||
62
.github/workflows/gradle.yaml
vendored
@@ -22,8 +22,9 @@ jobs:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Get tags
|
||||
run: git fetch --tags origin --recurse-submodules=no
|
||||
run: git fetch --tags origin --recurse-submodules=no --force
|
||||
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v3
|
||||
@@ -51,8 +52,9 @@ jobs:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Get tags
|
||||
run: git fetch --tags origin --recurse-submodules=no
|
||||
run: git fetch --tags origin --recurse-submodules=no --force
|
||||
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v3
|
||||
@@ -84,6 +86,62 @@ jobs:
|
||||
server/desktop/build/libs/*
|
||||
|
||||
|
||||
bundle-android:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Get tags
|
||||
run: git fetch --tags origin --recurse-submodules=no --force
|
||||
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
java-version: "17"
|
||||
distribution: "adopt"
|
||||
|
||||
- name: Setup Gradle
|
||||
uses: gradle/gradle-build-action@v2
|
||||
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'npm'
|
||||
|
||||
- name: Build GUI
|
||||
run: |
|
||||
npm ci
|
||||
cd gui && npm run build
|
||||
|
||||
- name: Build with Gradle
|
||||
run: ./gradlew :server:android:assembleDebug
|
||||
|
||||
- name: Upload the Android Build Artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
# Artifact name
|
||||
name: "SlimeVR-Android" # optional, default is artifact
|
||||
# A file, directory or wildcard pattern that describes what to upload
|
||||
path: server/android/build/outputs/apk/*
|
||||
|
||||
- name: Prepare for release
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
run: |
|
||||
cp server/android/build/outputs/apk/debug/android-debug.apk ./SlimeVR-android.apk
|
||||
|
||||
- name: Upload to draft release
|
||||
uses: softprops/action-gh-release@v1
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
with:
|
||||
draft: true
|
||||
generate_release_notes: true
|
||||
files: |
|
||||
./SlimeVR-android.apk
|
||||
|
||||
|
||||
bundle-linux:
|
||||
runs-on: ubuntu-22.04
|
||||
needs: [build, test]
|
||||
|
||||
1
.gitignore
vendored
@@ -36,6 +36,7 @@ build/
|
||||
|
||||
# direnv has been claimed for Nix usage
|
||||
.direnv/
|
||||
.devenv
|
||||
|
||||
# Ignore Android local properties
|
||||
local.properties
|
||||
|
||||
1299
Cargo.lock
generated
@@ -15,7 +15,3 @@ repository = "https://github.com/SlimeVR/SlimeVR-Server"
|
||||
[profile.release]
|
||||
lto = "thin"
|
||||
strip = "debuginfo" # Only affects Unix binaries with DWARF
|
||||
|
||||
[patch.crates-io]
|
||||
tauri = { git = "https://github.com/imurx/tauri", branch = "ipc-backport" }
|
||||
tauri-runtime = { git = "https://github.com/imurx/tauri", branch = "ipc-backport" }
|
||||
|
||||
@@ -48,7 +48,6 @@ work. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
|
||||
tracking (FBT) in virtual reality. With no base station required, SlimeVR makes wireless
|
||||
VR FBT affordable and comfortable.
|
||||
</p>
|
||||
|
||||
</description>
|
||||
|
||||
<launchable type="desktop-id">dev.slimevr.SlimeVR.desktop</launchable>
|
||||
@@ -59,6 +58,14 @@ work. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
<releases>
|
||||
<release version="0.9.1" date="2023-08-30"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.1</url></release>
|
||||
<release version="0.9.1-rc.4" type="development" date="2023-08-28"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.1-rc.4</url></release>
|
||||
<release version="0.9.1-rc.3" type="development" date="2023-08-19"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.1-rc.3</url></release>
|
||||
<release version="0.9.1-rc.2" type="development" date="2023-08-15"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.1-rc.2</url></release>
|
||||
<release version="0.9.1-rc.1" type="development" date="2023-08-13"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.1-rc.1</url></release>
|
||||
<release version="0.9.0" date="2023-08-05"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.0</url></release>
|
||||
<release version="0.9.0-rc.2" type="development" date="2023-08-02"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.0-rc.2</url></release>
|
||||
<release version="0.9.0-rc.1" type="development" date="2023-07-31"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.0-rc.1</url></release>
|
||||
<release version="0.8.3" date="2023-07-09"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.3</url></release>
|
||||
<release version="0.8.2" date="2023-07-09"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.2</url></release>
|
||||
<release version="0.8.2-rc.1" type="development" date="2023-07-07"><url>https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.2-rc.1</url></release>
|
||||
|
||||
404
flake.lock
generated
@@ -1,15 +1,88 @@
|
||||
{
|
||||
"nodes": {
|
||||
"devenv": {
|
||||
"inputs": {
|
||||
"flake-compat": "flake-compat",
|
||||
"nix": "nix",
|
||||
"nixpkgs": "nixpkgs",
|
||||
"pre-commit-hooks": "pre-commit-hooks"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1697058441,
|
||||
"narHash": "sha256-gjtW+nkM9suMsjyid63HPmt6WZQEvuVqA5cOAf4lLM0=",
|
||||
"owner": "cachix",
|
||||
"repo": "devenv",
|
||||
"rev": "55294461a62d90c8626feca22f52b0d3d0e18e39",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "cachix",
|
||||
"repo": "devenv",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"fenix": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs_2",
|
||||
"rust-analyzer-src": "rust-analyzer-src"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1695709315,
|
||||
"narHash": "sha256-XKzbb4NqYmUVlORwjCT//RGeQiJa+6LuGYllpaLP5lQ=",
|
||||
"owner": "nix-community",
|
||||
"repo": "fenix",
|
||||
"rev": "f5845b16d889d8bf9930fe1098820074da4cbce9",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "fenix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-compat": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1673956053,
|
||||
"narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=",
|
||||
"owner": "edolstra",
|
||||
"repo": "flake-compat",
|
||||
"rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "edolstra",
|
||||
"repo": "flake-compat",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-parts": {
|
||||
"inputs": {
|
||||
"nixpkgs-lib": "nixpkgs-lib"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1696343447,
|
||||
"narHash": "sha256-B2xAZKLkkeRFG5XcHHSXXcP7To9Xzr59KXeZiRf4vdQ=",
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"rev": "c9afaba3dfa4085dbd2ccb38dfade5141e33d9d4",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"id": "flake-parts",
|
||||
"type": "indirect"
|
||||
}
|
||||
},
|
||||
"flake-utils": {
|
||||
"inputs": {
|
||||
"systems": "systems"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1689068808,
|
||||
"narHash": "sha256-6ixXo3wt24N/melDWjq70UuHQLxGV8jZvooRanIHXw0=",
|
||||
"lastModified": 1685518550,
|
||||
"narHash": "sha256-o2d0KcvaXzTrPRIo0kOLV0/QXHhDQ5DTi+OxcjO8xqY=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "919d646de7be200f3bf08cb76ae1f09402b6f9b4",
|
||||
"rev": "a1720a10a6cfe8234c0e93907ffe81be440f4cef",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -23,11 +96,11 @@
|
||||
"systems": "systems_2"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1681202837,
|
||||
"narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=",
|
||||
"lastModified": 1694529238,
|
||||
"narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "cfacdce06f30d2b68473a46042957675eebb3401",
|
||||
"rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -36,28 +109,145 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-utils_3": {
|
||||
"locked": {
|
||||
"lastModified": 1659877975,
|
||||
"narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"gitignore": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"devenv",
|
||||
"pre-commit-hooks",
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1660459072,
|
||||
"narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=",
|
||||
"owner": "hercules-ci",
|
||||
"repo": "gitignore.nix",
|
||||
"rev": "a20de23b925fd8264fd7fad6454652e142fd7f73",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hercules-ci",
|
||||
"repo": "gitignore.nix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"lowdown-src": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1633514407,
|
||||
"narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=",
|
||||
"owner": "kristapsdz",
|
||||
"repo": "lowdown",
|
||||
"rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "kristapsdz",
|
||||
"repo": "lowdown",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"mk-shell-bin": {
|
||||
"locked": {
|
||||
"lastModified": 1677004959,
|
||||
"narHash": "sha256-/uEkr1UkJrh11vD02aqufCxtbF5YnhRTIKlx5kyvf+I=",
|
||||
"owner": "rrbutani",
|
||||
"repo": "nix-mk-shell-bin",
|
||||
"rev": "ff5d8bd4d68a347be5042e2f16caee391cd75887",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "rrbutani",
|
||||
"repo": "nix-mk-shell-bin",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nix": {
|
||||
"inputs": {
|
||||
"lowdown-src": "lowdown-src",
|
||||
"nixpkgs": [
|
||||
"devenv",
|
||||
"nixpkgs"
|
||||
],
|
||||
"nixpkgs-regression": "nixpkgs-regression"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1676545802,
|
||||
"narHash": "sha256-EK4rZ+Hd5hsvXnzSzk2ikhStJnD63odF7SzsQ8CuSPU=",
|
||||
"owner": "domenkozar",
|
||||
"repo": "nix",
|
||||
"rev": "7c91803598ffbcfe4a55c44ac6d49b2cf07a527f",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "domenkozar",
|
||||
"ref": "relaxed-flakes",
|
||||
"repo": "nix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nix2container": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils_2",
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1697285352,
|
||||
"narHash": "sha256-tRGLm/DO8+anGUCgLYxTF5EPqWv8EZ9MVFWRdh285HU=",
|
||||
"owner": "nlewo",
|
||||
"repo": "nix2container",
|
||||
"rev": "9d7f33ef0058f4df4c0912025f43c758a3289d76",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nlewo",
|
||||
"repo": "nix2container",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixgl": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils_3",
|
||||
"nixpkgs": "nixpkgs_3"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1685908677,
|
||||
"narHash": "sha256-E4zUPEUFyVWjVm45zICaHRpfGepfkE9Z2OECV9HXfA4=",
|
||||
"owner": "guibou",
|
||||
"repo": "nixGL",
|
||||
"rev": "489d6b095ab9d289fe11af0219a9ff00fe87c7c5",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "guibou",
|
||||
"repo": "nixGL",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1691654369,
|
||||
"narHash": "sha256-gSILTEx1jRaJjwZxRlnu3ZwMn1FVNk80qlwiCX8kmpo=",
|
||||
"lastModified": 1678875422,
|
||||
"narHash": "sha256-T3o6NcQPwXjxJMn2shz86Chch4ljXgZn746c2caGxd8=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "ce5e4a6ef2e59d89a971bc434ca8ca222b9c7f5e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"id": "nixpkgs",
|
||||
"ref": "nixos-unstable",
|
||||
"type": "indirect"
|
||||
}
|
||||
},
|
||||
"nixpkgs_2": {
|
||||
"locked": {
|
||||
"lastModified": 1681358109,
|
||||
"narHash": "sha256-eKyxW4OohHQx9Urxi7TQlFBTDWII+F+x2hklDOQPB50=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "96ba1c52e54e74c3197f4d43026b3f3d92e83ff9",
|
||||
"rev": "126f49a01de5b7e35a43fd43f891ecf6d3a51459",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -67,29 +257,157 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils",
|
||||
"nixpkgs": "nixpkgs",
|
||||
"rust-overlay": "rust-overlay"
|
||||
}
|
||||
},
|
||||
"rust-overlay": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils_2",
|
||||
"nixpkgs": "nixpkgs_2"
|
||||
},
|
||||
"nixpkgs-lib": {
|
||||
"locked": {
|
||||
"lastModified": 1691892594,
|
||||
"narHash": "sha256-Lt9/WUnI/ZqBYnHOC3n6Lg5jTfd/ZI+39jZx5HmolSQ=",
|
||||
"owner": "oxalica",
|
||||
"repo": "rust-overlay",
|
||||
"rev": "c638e10caf94caaa97fb1df74e3bb467dc9b92db",
|
||||
"dir": "lib",
|
||||
"lastModified": 1696019113,
|
||||
"narHash": "sha256-X3+DKYWJm93DRSdC5M6K5hLqzSya9BjibtBsuARoPco=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "f5892ddac112a1e9b3612c39af1b72987ee5783a",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "oxalica",
|
||||
"repo": "rust-overlay",
|
||||
"dir": "lib",
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-regression": {
|
||||
"locked": {
|
||||
"lastModified": 1643052045,
|
||||
"narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-stable": {
|
||||
"locked": {
|
||||
"lastModified": 1685801374,
|
||||
"narHash": "sha256-otaSUoFEMM+LjBI1XL/xGB5ao6IwnZOXc47qhIgJe8U=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "c37ca420157f4abc31e26f436c1145f8951ff373",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-23.05",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs_2": {
|
||||
"locked": {
|
||||
"lastModified": 1695360818,
|
||||
"narHash": "sha256-JlkN3R/SSoMTa+CasbxS1gq+GpGxXQlNZRUh9+LIy/0=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "e35dcc04a3853da485a396bdd332217d0ac9054f",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs_3": {
|
||||
"locked": {
|
||||
"lastModified": 1695360818,
|
||||
"narHash": "sha256-JlkN3R/SSoMTa+CasbxS1gq+GpGxXQlNZRUh9+LIy/0=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "e35dcc04a3853da485a396bdd332217d0ac9054f",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs_4": {
|
||||
"locked": {
|
||||
"lastModified": 1697456312,
|
||||
"narHash": "sha256-roiSnrqb5r+ehnKCauPLugoU8S36KgmWraHgRqVYndo=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "ca012a02bf8327be9e488546faecae5e05d7d749",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"pre-commit-hooks": {
|
||||
"inputs": {
|
||||
"flake-compat": [
|
||||
"devenv",
|
||||
"flake-compat"
|
||||
],
|
||||
"flake-utils": "flake-utils",
|
||||
"gitignore": "gitignore",
|
||||
"nixpkgs": [
|
||||
"devenv",
|
||||
"nixpkgs"
|
||||
],
|
||||
"nixpkgs-stable": "nixpkgs-stable"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1688056373,
|
||||
"narHash": "sha256-2+SDlNRTKsgo3LBRiMUcoEUb6sDViRNQhzJquZ4koOI=",
|
||||
"owner": "cachix",
|
||||
"repo": "pre-commit-hooks.nix",
|
||||
"rev": "5843cf069272d92b60c3ed9e55b7a8989c01d4c7",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "cachix",
|
||||
"repo": "pre-commit-hooks.nix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"devenv": "devenv",
|
||||
"fenix": "fenix",
|
||||
"flake-parts": "flake-parts",
|
||||
"mk-shell-bin": "mk-shell-bin",
|
||||
"nix2container": "nix2container",
|
||||
"nixgl": "nixgl",
|
||||
"nixpkgs": "nixpkgs_4"
|
||||
}
|
||||
},
|
||||
"rust-analyzer-src": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1695642814,
|
||||
"narHash": "sha256-xR1+YaPcutqXN7BYYCyHPU8VVh/gjW+bVFTfA+vHpv0=",
|
||||
"owner": "rust-lang",
|
||||
"repo": "rust-analyzer",
|
||||
"rev": "d3cc3bc00e310ff49268ce0c593eaa6bf4724bbd",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "rust-lang",
|
||||
"ref": "nightly",
|
||||
"repo": "rust-analyzer",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
|
||||
194
flake.nix
@@ -1,87 +1,137 @@
|
||||
{
|
||||
description = "Server app for SlimeVR ecosystem";
|
||||
description = "Affordable full-body tracking for VR!";
|
||||
|
||||
inputs.nixpkgs.url = "nixpkgs/nixos-unstable";
|
||||
inputs.flake-utils.url = "github:numtide/flake-utils";
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||
devenv.url = "github:cachix/devenv";
|
||||
nix2container.url = "github:nlewo/nix2container";
|
||||
nix2container.inputs.nixpkgs.follows = "nixpkgs";
|
||||
mk-shell-bin.url = "github:rrbutani/nix-mk-shell-bin";
|
||||
nixgl.url = "github:guibou/nixGL";
|
||||
fenix.url = "github:nix-community/fenix";
|
||||
};
|
||||
|
||||
inputs.rust-overlay.url = "github:oxalica/rust-overlay";
|
||||
nixConfig = {
|
||||
extra-trusted-public-keys = "devenv.cachix.org-1:w1cLUi8dv3hnoSPGAuibQv+f9TZLr6cv/Hm9XgU50cw=";
|
||||
extra-substituters = "https://devenv.cachix.org";
|
||||
};
|
||||
|
||||
outputs = {
|
||||
outputs = inputs @ {
|
||||
self,
|
||||
nixpkgs,
|
||||
flake-utils,
|
||||
rust-overlay,
|
||||
flake-parts,
|
||||
nixgl,
|
||||
...
|
||||
}:
|
||||
flake-utils.lib.eachDefaultSystem
|
||||
(
|
||||
system: let
|
||||
overlays = [(import rust-overlay)];
|
||||
pkgs = import nixpkgs {
|
||||
inherit system overlays;
|
||||
flake-parts.lib.mkFlake {inherit inputs;} {
|
||||
imports = [
|
||||
inputs.devenv.flakeModule
|
||||
];
|
||||
systems = ["x86_64-linux" "i686-linux" "x86_64-darwin" "aarch64-linux" "aarch64-darwin"];
|
||||
|
||||
perSystem = {
|
||||
config,
|
||||
self',
|
||||
inputs',
|
||||
pkgs,
|
||||
system,
|
||||
lib,
|
||||
...
|
||||
}: {
|
||||
# Per-system attributes can be defined here. The self' and inputs'
|
||||
# module parameters provide easy access to attributes of the same
|
||||
# system.
|
||||
|
||||
# Equivalent to inputs'.nixpkgs.legacyPackages.hello;
|
||||
# packages.default = pkgs.hello;
|
||||
_module.args.pkgs = import self.inputs.nixpkgs {
|
||||
inherit system;
|
||||
overlays = [nixgl.overlay];
|
||||
};
|
||||
rustTarget = pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml;
|
||||
nativeBuildInputs = with pkgs; [
|
||||
curl
|
||||
gcc
|
||||
openssl
|
||||
pkgconfig
|
||||
which
|
||||
zlib
|
||||
|
||||
freetype
|
||||
expat
|
||||
];
|
||||
buildInputs = with pkgs; [
|
||||
appimagekit
|
||||
atk
|
||||
cairo
|
||||
dbus
|
||||
dbus.lib
|
||||
dprint
|
||||
gdk-pixbuf
|
||||
glib.out
|
||||
gobject-introspection
|
||||
gtk3
|
||||
harfbuzz
|
||||
libffi
|
||||
libsoup_3
|
||||
openssl.out
|
||||
pango
|
||||
pkg-config
|
||||
treefmt
|
||||
webkitgtk_4_1
|
||||
zlib
|
||||
gst_all_1.gstreamer
|
||||
gst_all_1.gst-plugins-base
|
||||
gst_all_1.gst-plugins-good
|
||||
gst_all_1.gst-plugins-bad
|
||||
librsvg
|
||||
devenv.shells.default = let
|
||||
fenixpkgs = inputs'.fenix.packages;
|
||||
rust_toolchain = lib.importTOML ./rust-toolchain.toml;
|
||||
in {
|
||||
name = "slimevr";
|
||||
|
||||
# Some nice things to have
|
||||
exa
|
||||
fd
|
||||
imports = [
|
||||
# This is just like the imports in devenv.nix.
|
||||
# See https://devenv.sh/guides/using-with-flake-parts/#import-a-devenv-module
|
||||
# ./devenv-foo.nix
|
||||
];
|
||||
|
||||
jdk17 # JDK17
|
||||
nodejs
|
||||
gradle
|
||||
];
|
||||
in {
|
||||
devShells.default = pkgs.mkShell {
|
||||
nativeBuildInputs =
|
||||
nativeBuildInputs
|
||||
++ [
|
||||
];
|
||||
buildInputs =
|
||||
buildInputs
|
||||
++ [
|
||||
rustTarget
|
||||
# https://devenv.sh/reference/options/
|
||||
packages =
|
||||
(with pkgs; [
|
||||
pkgs.nixgl.nixGLIntel
|
||||
cacert
|
||||
])
|
||||
++ lib.optionals pkgs.stdenv.isLinux (with pkgs; [
|
||||
appimagekit
|
||||
atk
|
||||
cairo
|
||||
dbus
|
||||
dbus.lib
|
||||
dprint
|
||||
gdk-pixbuf
|
||||
glib.out
|
||||
glib-networking
|
||||
gobject-introspection
|
||||
gtk3
|
||||
harfbuzz
|
||||
libffi
|
||||
libsoup_3
|
||||
openssl.out
|
||||
pango
|
||||
pkg-config
|
||||
treefmt
|
||||
webkitgtk_4_1
|
||||
zlib
|
||||
gst_all_1.gstreamer
|
||||
gst_all_1.gst-plugins-base
|
||||
gst_all_1.gst-plugins-good
|
||||
gst_all_1.gst-plugins-bad
|
||||
librsvg
|
||||
freetype
|
||||
expat
|
||||
])
|
||||
++ lib.optionals pkgs.stdenv.isDarwin [
|
||||
pkgs.darwin.apple_sdk.frameworks.Security
|
||||
];
|
||||
|
||||
shellHook = ''
|
||||
alias ls=exa
|
||||
alias find=fd
|
||||
languages.java = {
|
||||
enable = true;
|
||||
gradle.enable = true;
|
||||
jdk.package = pkgs.jdk17;
|
||||
};
|
||||
languages.kotlin.enable = true;
|
||||
|
||||
languages.javascript = {
|
||||
enable = true;
|
||||
corepack.enable = true;
|
||||
};
|
||||
|
||||
languages.rust = {
|
||||
enable = true;
|
||||
toolchain = fenixpkgs.fromToolchainName {
|
||||
name = rust_toolchain.toolchain.channel;
|
||||
sha256 = "sha256-rLP8+fTxnPHoR96ZJiCa/5Ans1OojI7MLsmSqR2ip8o=";
|
||||
};
|
||||
components = rust_toolchain.toolchain.components;
|
||||
};
|
||||
|
||||
env = {
|
||||
GIO_EXTRA_MODULES = "${pkgs.glib-networking}/lib/gio/modules:${pkgs.dconf.lib}/lib/gio/modules";
|
||||
};
|
||||
|
||||
enterShell = with pkgs; ''
|
||||
'';
|
||||
};
|
||||
}
|
||||
);
|
||||
};
|
||||
flake = {
|
||||
# The usual flake attributes can be defined here, including system-
|
||||
# agnostic ones like nixosModule and system-enumerating ones, although
|
||||
# those are more easily expressed in perSystem.
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"es2021": true,
|
||||
"jest": true
|
||||
},
|
||||
"extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"],
|
||||
"extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended", "plugin:@dword-design/import-alias/recommended"],
|
||||
"parser": "@typescript-eslint/parser",
|
||||
"parserOptions": {
|
||||
"ecmaFeatures": {
|
||||
@@ -30,6 +30,14 @@
|
||||
"argsIgnorePattern": "^_",
|
||||
"varsIgnorePattern": "^_"
|
||||
}
|
||||
],
|
||||
"@dword-design/import-alias/prefer-alias": [
|
||||
"error",
|
||||
{
|
||||
"alias": {
|
||||
"@": "./src/"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
export default {
|
||||
"**/*.{ts,tsx}": () => "tsc -p tsconfig.json --noEmit",
|
||||
"**/*.{js,jsx,ts,tsx}": "eslint --cache --fix",
|
||||
"**/*.{js,jsx,ts,tsx}": "eslint --max-warnings=0 --cache --fix",
|
||||
"**/*.{js,jsx,ts,tsx,css,md,json}": "prettier --write"
|
||||
};
|
||||
|
||||
@@ -7,19 +7,20 @@
|
||||
"@fluent/react": "^0.14.1",
|
||||
"@fontsource/poppins": "^4.5.8",
|
||||
"@formatjs/intl-localematcher": "^0.2.32",
|
||||
"@react-three/fiber": "^8.10.0",
|
||||
"@tauri-apps/api": "^2.0.0-alpha.5",
|
||||
"@tauri-apps/plugin-app": "github:tauri-apps/tauri-plugin-app#v2",
|
||||
"@tauri-apps/plugin-dialog": "github:tauri-apps/tauri-plugin-dialog#v2",
|
||||
"@tauri-apps/plugin-fs": "github:tauri-apps/tauri-plugin-fs#v2",
|
||||
"@tauri-apps/plugin-os": "github:tauri-apps/tauri-plugin-os#v2",
|
||||
"@tauri-apps/plugin-shell": "github:tauri-apps/tauri-plugin-shell#v2",
|
||||
"@tauri-apps/plugin-window": "github:tauri-apps/tauri-plugin-window#v2",
|
||||
"@react-three/drei": "^9.80.3",
|
||||
"@react-three/fiber": "^8.13.6",
|
||||
"@tauri-apps/api": "=2.0.0-alpha.8",
|
||||
"@tauri-apps/plugin-app": "=2.0.0-alpha.1",
|
||||
"@tauri-apps/plugin-dialog": "=2.0.0-alpha.1",
|
||||
"@tauri-apps/plugin-fs": "=2.0.0-alpha.1",
|
||||
"@tauri-apps/plugin-os": "=2.0.0-alpha.2",
|
||||
"@tauri-apps/plugin-shell": "=2.0.0-alpha.1",
|
||||
"@tauri-apps/plugin-window": "=2.0.0-alpha.1",
|
||||
"@vitejs/plugin-react": "^3.0.0",
|
||||
"browser-fs-access": "^0.34.1",
|
||||
"browserslist": "^4.18.1",
|
||||
"classnames": "^2.3.1",
|
||||
"eslint-config-react-app": "^7.0.0",
|
||||
"file-saver": "^2.0.5",
|
||||
"flatbuffers": "^22.10.26",
|
||||
"identity-obj-proxy": "^3.0.0",
|
||||
"intl-pluralrules": "^1.3.1",
|
||||
@@ -31,13 +32,14 @@
|
||||
"react": "^18.0.0",
|
||||
"react-dev-utils": "^12.0.0",
|
||||
"react-dom": "^18.0.0",
|
||||
"react-helmet": "^6.1.0",
|
||||
"react-hook-form": "^7.29.0",
|
||||
"react-modal": "3.15.1",
|
||||
"react-modal": "^3.15.1",
|
||||
"react-responsive": "^9.0.2",
|
||||
"react-router-dom": "^6.2.2",
|
||||
"semver": "^7.5.3",
|
||||
"solarxr-protocol": "file:../solarxr-protocol",
|
||||
"three": "^0.148.0",
|
||||
"three": "^0.155.0",
|
||||
"ts-pattern": "^5.0.1",
|
||||
"typescript": "^5.1.6"
|
||||
},
|
||||
@@ -71,13 +73,15 @@
|
||||
]
|
||||
},
|
||||
"devDependencies": {
|
||||
"@dword-design/eslint-plugin-import-alias": "^4.0.8",
|
||||
"@tailwindcss/forms": "^0.5.3",
|
||||
"@tauri-apps/cli": "^2.0.0-alpha.10",
|
||||
"@tauri-apps/cli": "=2.0.0-alpha.17",
|
||||
"@types/file-saver": "^2.0.5",
|
||||
"@types/react": "18.0.25",
|
||||
"@types/react": "^18.0.25",
|
||||
"@types/react-dom": "^18.0.5",
|
||||
"@types/react-helmet": "^6.1.6",
|
||||
"@types/react-modal": "3.13.1",
|
||||
"@types/three": "^0.148.0",
|
||||
"@types/three": "^0.155.0",
|
||||
"@typescript-eslint/eslint-plugin": "^5.60.1",
|
||||
"@typescript-eslint/parser": "^5.60.1",
|
||||
"autoprefixer": "^10.4.4",
|
||||
@@ -89,7 +93,7 @@
|
||||
"eslint-plugin-jsx-a11y": "^6.7.1",
|
||||
"eslint-plugin-react": "^7.32.2",
|
||||
"eslint-plugin-react-hooks": "^4.6.0",
|
||||
"postcss": "^8.4.24",
|
||||
"postcss": "^8.4.31",
|
||||
"prettier": "^2.8.8",
|
||||
"pretty-quick": "^3.1.3",
|
||||
"rollup-plugin-visualizer": "^5.9.2",
|
||||
|
||||
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 11 KiB |
@@ -348,9 +348,20 @@ settings-general-fk_settings-leg_tweak-floor_clip-description = يمكن أن ي
|
||||
settings-general-fk_settings-leg_tweak-toe_snap-description = الانجذاب إلى أصابع القدم يحاول تخمين دوران قدميك إذا لم تكن أجهزة تعقب القدم قيد الاستخدام.
|
||||
settings-general-fk_settings-leg_tweak-foot_plant-description = تثبيت اصبع القدم يحاول تخمين دوران قدميك إذا لم تكن أجهزة تعقب القدم قيد الاستخدام.
|
||||
settings-general-fk_settings-leg_fk = تعقب الساق
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet-description = تمكين إعادة ضبط تركيب القدمين عن طريق المشي على رؤوس الأصابع.
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet = إعادة تعيين تركيب القدمين
|
||||
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-arm_fk-reset_mode-description = قم بتغيير وضع الذراع المتوقع لإعادة ضبط المتصاعد.
|
||||
settings-general-fk_settings-arm_fk-back = العودة
|
||||
settings-general-fk_settings-arm_fk-back-description = الوضع الافتراضي، مع وضع الذراعين العلويين إلى الخلف والساعدين للأمام.
|
||||
settings-general-fk_settings-arm_fk-tpose_up = تي بوز (أعلى)
|
||||
settings-general-fk_settings-arm_fk-tpose_up-description = يتوقع أن تكون ذراعيك لأسفل على الجانبين أثناء إعادة الضبط الكامل ، و 90 درجة حتى الجانبين أثناء إعادة ضبط التركيب.
|
||||
settings-general-fk_settings-arm_fk-tpose_down = تي بوز (لأسفل)
|
||||
settings-general-fk_settings-arm_fk-tpose_down-description = يتوقع أن تكون ذراعيك 90 درجة لأعلى على الجانبين أثناء إعادة الضبط الكامل ، ولأسفل على الجانبين أثناء إعادة ضبط التركيب.
|
||||
settings-general-fk_settings-arm_fk-forward = أمامي
|
||||
settings-general-fk_settings-arm_fk-forward-description = يتوقع أن تكون ذراعيك 90 درجة للأمام. مفيد ل VTubing.
|
||||
settings-general-fk_settings-skeleton_settings-toggles = تبديل الهيكل العظمي
|
||||
settings-general-fk_settings-skeleton_settings-description = تبديل إعدادات الهيكل العظمي أو إيقافه. يوصى بتركها شغالة.
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine_model = نموذج العمود الفقري الممتد
|
||||
@@ -364,6 +375,7 @@ settings-general-fk_settings-skeleton_settings-impute_hip_from_chest_legs = خص
|
||||
settings-general-fk_settings-skeleton_settings-impute_hip_from_waist_legs = خصص الورك من الخصر إلى الساقين
|
||||
settings-general-fk_settings-skeleton_settings-interp_hip_legs = متوسط انعراج الفخذ وتدحرج مع الساقين'
|
||||
settings-general-fk_settings-skeleton_settings-interp_knee_tracker_ankle = متوسط الانحراف وتدحرج مع الكاحلين
|
||||
settings-general-fk_settings-skeleton_settings-interp_knee_ankle = متوسط انحراف الركبتين ولفة مع الكاحلين
|
||||
settings-general-fk_settings-self_localization-title = وضع Mocap
|
||||
settings-general-fk_settings-self_localization-description = يسمح وضع Mocap للهيكل العظمي بتعقب موضعه تقريبا بدون سماعة رأس أو أجهزة تعقب أخرى. لاحظ أن هذا يتطلب أجهزة تعقب القدمين والرأس للعمل ولا تزال تجريبية.
|
||||
settings-general-fk_settings-vive_emulation-title = محاكاة فايف
|
||||
@@ -825,6 +837,9 @@ onboarding-choose_proportions-manual_proportions = النسب اليدوية
|
||||
onboarding-choose_proportions-manual_proportions-subtitle = للمسات الصغيرة
|
||||
onboarding-choose_proportions-manual_proportions-description = سيسمح لك بتعديل النسب يدويًا عن طريق تعديلها مباشرة
|
||||
onboarding-choose_proportions-export = تصدير النسب
|
||||
onboarding-choose_proportions-import = استيراد النسب
|
||||
onboarding-choose_proportions-import-success = تم استيراده
|
||||
onboarding-choose_proportions-import-failed = فشل
|
||||
onboarding-choose_proportions-file_type = ملف نسب الجسم
|
||||
|
||||
## Tracker manual proportions setup
|
||||
|
||||
@@ -124,6 +124,7 @@ widget-drift_compensation-clear = Driftkompensation zurücksetzen
|
||||
|
||||
## Widget: Clear Reset Mounting
|
||||
|
||||
widget-clear_mounting = Befestigungs-Reset zurücksetzen
|
||||
|
||||
## Widget: Developer settings
|
||||
|
||||
@@ -143,6 +144,11 @@ widget-imu_visualizer-rotation_raw = Rohe Drehung
|
||||
widget-imu_visualizer-rotation_preview = Vorschau
|
||||
widget-imu_visualizer-rotation_hide = Ausblenden
|
||||
|
||||
## Widget: Skeleton Visualizer
|
||||
|
||||
widget-skeleton_visualizer-preview = Skelett Vorschau
|
||||
widget-skeleton_visualizer-hide = Ausblenden
|
||||
|
||||
## Tracker status
|
||||
|
||||
tracker-status-none = Kein Status
|
||||
@@ -151,6 +157,7 @@ tracker-status-error = Fehler
|
||||
tracker-status-disconnected = Getrennt
|
||||
tracker-status-occluded = Verdeckt
|
||||
tracker-status-ok = Verbunden
|
||||
tracker-status-timed_out = Zeitüberschreitung
|
||||
|
||||
## Tracker status columns
|
||||
|
||||
@@ -241,6 +248,7 @@ tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } dem rechten
|
||||
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } dem rechten Unterschenkel zugewiesen werden?
|
||||
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } dem rechten Fuß zugewiesen werden?
|
||||
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } dem rechten Controller zugewiesen werden?
|
||||
tracker_selection_menu-UPPER_CHEST = { -tracker_selection-part } obere Brust?
|
||||
tracker_selection_menu-CHEST = { -tracker_selection-part } der Brust zugewiesen werden?
|
||||
tracker_selection_menu-WAIST = { -tracker_selection-part } der Taille zugewiesen werden?
|
||||
tracker_selection_menu-HIP = { -tracker_selection-part } der Hüfte zugewiesen werden?
|
||||
@@ -346,15 +354,36 @@ settings-general-fk_settings-leg_tweak-floor_clip-description = Bodenclip kann d
|
||||
settings-general-fk_settings-leg_tweak-toe_snap-description = Zehen-Ausrichtung versucht, die Rotation Ihrer Füße zu erraten, wenn keine Fuß-Tracker verwendet werden.
|
||||
settings-general-fk_settings-leg_tweak-foot_plant-description = Fußkorrektur richtet Ihre Füße parallel zum Boden aus, wenn sie den Boden berühren.
|
||||
settings-general-fk_settings-leg_fk = Beintracking
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet-description = Aktiviert das Zurücksetzen der Fußausrichtung, indem Sie auf die Zehenspitzen stehen.
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet = Fußausrichtung zurücksetzen
|
||||
settings-general-fk_settings-arm_fk = Arm-Tracking
|
||||
settings-general-fk_settings-arm_fk-description = Ändern Sie die Art und Weise, wie die Arme berechnet werden.
|
||||
settings-general-fk_settings-arm_fk-force_arms = Arme vom VR-Headset erzwingen
|
||||
settings-general-fk_settings-skeleton_settings = Skeletteinstellungen
|
||||
settings-general-fk_settings-arm_fk-reset_mode-description = Ändern Sie, welche Armhaltung für den Befestigungs-Reset erwartet wird.
|
||||
settings-general-fk_settings-arm_fk-back = nach Hinten
|
||||
settings-general-fk_settings-arm_fk-back-description = Der Standardmodus, bei dem die Oberarme nach hinten und die Unterarme nach vorne gehen.
|
||||
settings-general-fk_settings-arm_fk-tpose_up = T-Pose (oben)
|
||||
settings-general-fk_settings-arm_fk-tpose_up-description = Erwartet, dass deine Arme während des vollständigen Zurücksetzens seitlich nach unten gerichtet sind und während des Befestigungs-Reset um 90 Grad nach außen gerichtet sind.
|
||||
settings-general-fk_settings-arm_fk-tpose_down = T-Pose (unten)
|
||||
settings-general-fk_settings-arm_fk-tpose_down-description = Erwartet, dass deine Arme während des vollständigen Zurücksetzens um 90 Grad nach außen gerichtet sind und während des Befestigungs-Reset seitlich nach unten.
|
||||
settings-general-fk_settings-arm_fk-forward = Vorwärts
|
||||
settings-general-fk_settings-arm_fk-forward-description = Erwartet, dass deine Arme um 90 Grad nach vorne gerichtet sind. Nützlich für VTubing.
|
||||
settings-general-fk_settings-skeleton_settings-toggles = Skelett-Schalter
|
||||
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_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-skeleton_settings-ratios = Skelettverhältnisse
|
||||
settings-general-fk_settings-skeleton_settings-ratios-description = Ändert die Werte der Skeletteinstellungen. Nachdem Sie diese geändert haben, müssen Sie möglicherweise Ihre Proportionen anpassen.
|
||||
settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_hip = Taille aus Brust zu Hüfte berechnen
|
||||
settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_legs = Taille von Brust zu Beine berechnen
|
||||
settings-general-fk_settings-skeleton_settings-impute_hip_from_chest_legs = Hüfte von Brust zu Beine berechnen
|
||||
settings-general-fk_settings-skeleton_settings-impute_hip_from_waist_legs = Hüfte von Taille zu Beine berechnen
|
||||
settings-general-fk_settings-skeleton_settings-interp_hip_legs = Interpolieren der horizontalen und Torsionsrotation der Hüfte mit denen der Beine
|
||||
settings-general-fk_settings-skeleton_settings-interp_knee_tracker_ankle = Interpolation der horizontalen und Torsionsrotationen der Knietracker mit denen der Fußgelenke
|
||||
settings-general-fk_settings-skeleton_settings-interp_knee_ankle = Interpolation der horizontalen und Torsionsrotationen der Knie mit denen der Fußgelenke
|
||||
settings-general-fk_settings-self_localization-title = Motion-Capture-Modus
|
||||
settings-general-fk_settings-self_localization-description = Der Motion-Capture-Modus ermöglicht es dem Skelett, ungefähr die eigene Position ohne Headset oder Tracker zu verfolgen. Beachten Sie, dass diese Funktion Fuß- und Kopf-Tracker benötigt und noch experimentell ist.
|
||||
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
|
||||
@@ -375,8 +404,8 @@ settings-general-gesture_control-taps =
|
||||
# $amount (Number) - Amount of trackers
|
||||
settings-general-gesture_control-trackers =
|
||||
{ $amount ->
|
||||
[one] Tracker
|
||||
*[other] Tracker
|
||||
[one] 1 Tracker
|
||||
*[other] { $amount } Tracker
|
||||
}
|
||||
settings-general-gesture_control-yawResetEnabled = Horizontaler Reset durch Antippen
|
||||
settings-general-gesture_control-yawResetDelay = Verzögerung für einen horizontalen Reset
|
||||
@@ -389,6 +418,7 @@ settings-general-gesture_control-mountingResetDelay = Befestigungs-Reset-Verzög
|
||||
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
|
||||
settings-general-gesture_control-numberTrackersOverThreshold-description = Erhöhen Sie diesen Wert wenn Tipp-Erkennung nicht funktioniert. Setzen Sie den Wert nicht höher als benötigt, da dies Fehlauslöser verursachen kann.
|
||||
|
||||
## Appearance settings
|
||||
|
||||
@@ -407,6 +437,7 @@ 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
|
||||
settings-interface-appearance-font_size-description = Verändert die Schriftgröße der gesamten Oberfläche außer diesem Einstellungs-Panel.
|
||||
|
||||
## Notification settings
|
||||
|
||||
@@ -418,6 +449,9 @@ 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-connected_trackers_warning = Warnung zu verbundenen Trackern
|
||||
settings-general-interface-connected_trackers_warning-description = Diese Option zeigt jedes Mal ein Pop-up-Fenster an, wenn Sie versuchen, SlimeVR zu beenden, während ein oder mehrere Tracker verbunden sind. Es erinnert Sie daran, die Tracker auszuschalten, um die Akkulaufzeit zu verlängern.
|
||||
settings-general-interface-connected_trackers_warning-label = Warnung vor verbundenen Trackern beim Verlassen
|
||||
|
||||
## Serial settings
|
||||
|
||||
@@ -569,6 +603,13 @@ onboarding-reset_tutorial-1 =
|
||||
|
||||
Sie müssen dafür in einer I-Pose stehen. Es gibt eine Verzögerung von 3 Sekunden (konfigurierbar), bevor der Reset tatsächlich durchgeführt wird.
|
||||
Dadurch werden die Position und Rotation aller Ihrer Tracker vollständig zurückgesetzt. Dies sollte die meisten Probleme beheben.
|
||||
# Cares about multiline
|
||||
onboarding-reset_tutorial-2 =
|
||||
Tippen Sie { $taps } mal auf den markierten Tracker um einen Befestigungs-Reset auszulösen.
|
||||
|
||||
Ein Befestigungs-Reset hilft dabei, die Tracker neu auszurichten, so wie diese tatsächlich an Ihnen angebracht sind. Zum Beispiel, wenn Sie ein Tracker versehentlich verschoben haben und dessen Orientierung sich stark verändert hat.
|
||||
|
||||
Sie müssen sich in einer "Skifahren"-Pose, wie im Befestigungs-Assistenten gezeigt wird, befinden. Nach dem Auslösen wird der Reset nach 3 Sekunden (konfigurierbar) durchgeführt.
|
||||
|
||||
## Setup start
|
||||
|
||||
@@ -634,7 +675,8 @@ onboarding-assignment_tutorial = So bereiten Sie einen SlimeVR-Tracker vor, bevo
|
||||
onboarding-assignment_tutorial-first_step = 1. Platzieren Sie einen Körperteilaufkleber (falls vorhanden) auf dem Tracker Ihrer Wahl
|
||||
# This text has a character limit of around 11 characters, so please keep it short
|
||||
onboarding-assignment_tutorial-sticker = Aufkleber
|
||||
onboarding-assignment_tutorial-second_step-continuation = Die Klettseite für die Verlängerung sollte in dieser Ausrichtung sein:
|
||||
onboarding-assignment_tutorial-second_step-v2 = 2. Befestigen Sie den Riemen an ihrem Tracker, wobei die Klettseite des Riemens in dieselbe Richtung zeigt wie das SlimeVR Logo Ihres Trackers:
|
||||
onboarding-assignment_tutorial-second_step-continuation-v2 = Die Klettseite für den Erweiterungstracker sollte nach oben zeigen, wie in der folgenden Abbildung:
|
||||
onboarding-assignment_tutorial-done = Ich habe Aufkleber und Bänder angebracht!
|
||||
|
||||
## Tracker assignment setup
|
||||
@@ -734,6 +776,13 @@ onboarding-choose_mounting-manual_mounting = Manuelle Befestigungsposition
|
||||
# Italized text
|
||||
onboarding-choose_mounting-manual_mounting-label = Empfohlen
|
||||
onboarding-choose_mounting-manual_mounting-description = Auf diese Weise können Sie die Montagerichtung für jeden Tracker manuell auswählen
|
||||
# Multiline text
|
||||
onboarding-choose_mounting-manual_modal-title =
|
||||
Sind Sie sich sicher, dass Sie
|
||||
die automatische Tracker-Ausrichtung durchführen möchten?
|
||||
onboarding-choose_mounting-manual_modal-description = <b>Die manuelle Tracker-Ausrichtung wird für neue Benutzer empfohlen</b>, da die Posen der automatischen Tracker-Ausrichtung anfangs schwer zu treffen sind und möglicherweise etwas Übung erfordern.
|
||||
onboarding-choose_mounting-manual_modal-confirm = Ich bin mir sicher, was ich tue
|
||||
onboarding-choose_mounting-manual_modal-cancel = Abbruch
|
||||
|
||||
## Tracker manual mounting setup
|
||||
|
||||
@@ -771,8 +820,13 @@ onboarding-choose_proportions-auto_proportions = Automatische Proportionen
|
||||
# Italized text
|
||||
onboarding-choose_proportions-auto_proportions-subtitle = Empfohlen
|
||||
onboarding-choose_proportions-manual_proportions = Manuelle Körperproportionen
|
||||
# Italized text
|
||||
onboarding-choose_proportions-manual_proportions-subtitle = Für kleine Anpassungen
|
||||
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
|
||||
onboarding-choose_proportions-import = Proportionen importieren
|
||||
onboarding-choose_proportions-import-success = Importiert
|
||||
onboarding-choose_proportions-import-failed = Fehlgeschlagen
|
||||
onboarding-choose_proportions-file_type = Körperproportions-Datei
|
||||
|
||||
## Tracker manual proportions setup
|
||||
@@ -799,16 +853,20 @@ onboarding-automatic_proportions-check_height-title = Überprüfen Sie Ihre Kör
|
||||
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
|
||||
onboarding-automatic_proportions-recording-title = Aufnahme
|
||||
onboarding-automatic_proportions-recording-description-p0 = Aufnahme läuft...
|
||||
onboarding-automatic_proportions-recording-description-p1 = Machen Sie die unten beschriebenen Bewegungen:
|
||||
# Each line of text is a different list item
|
||||
onboarding-automatic_proportions-recording-steps =
|
||||
Stehen Sie aufrecht und drehen Sie den Kopf im Kreis.
|
||||
Beugen Sie den Rücken nach vorne und gehen Sie in die Hocke. Schauen Sie in der Hocke erst nach links, dann nach rechts.
|
||||
Drehen Sie Ihren Oberkörper nach links (gegen den Uhrzeigersinn), dann strecken Sie sich nach unten zum Boden.
|
||||
Drehen Sie Ihren Oberkörper nach rechts (im Uhrzeigersinn) und strecken Sie ihn dann nach unten zum Boden.
|
||||
Rollen Sie Ihre Hüften in einer kreisförmigen Bewegung, als ob Sie einen Hula-Hoop-Reifen benutzen würden.
|
||||
Wenn die Aufnahme noch nicht zu Ende ist, können Sie diese Schritte wiederholen, bis sie zu Ende ist.
|
||||
onboarding-automatic_proportions-recording-processing = Aufnahme wird verarbeitet...
|
||||
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 20)
|
||||
onboarding-automatic_proportions-recording-timer =
|
||||
@@ -824,11 +882,17 @@ onboarding-automatic_proportions-verify_results-redo = Aufnahme wiederholen
|
||||
onboarding-automatic_proportions-verify_results-confirm = Ergebnisse sind korrekt
|
||||
onboarding-automatic_proportions-done-title = Körper gemessen und gespeichert.
|
||||
onboarding-automatic_proportions-done-description = Ihre Körperproportionen-Kalibrierung ist abgeschlossen!
|
||||
onboarding-automatic_proportions-error_modal-confirm = Verstanden!
|
||||
|
||||
## Home
|
||||
|
||||
home-no_trackers = Keine Tracker erkannt oder zugewiesen
|
||||
|
||||
## Trackers Still On notification
|
||||
|
||||
trackers_still_on-modal-confirm = SlimeVR beenden
|
||||
trackers_still_on-modal-cancel = Bitte warten...
|
||||
|
||||
## Status system
|
||||
|
||||
status_system-StatusTrackerReset = Es wird empfohlen, einen vollständigen Reset durchzuführen, da ein oder mehrere Tracker nicht kalibriert sind.
|
||||
|
||||
@@ -144,6 +144,11 @@ widget-imu_visualizer-rotation_raw = waw
|
||||
widget-imu_visualizer-rotation_preview = pwewiew
|
||||
widget-imu_visualizer-rotation_hide = hoide
|
||||
|
||||
## Widget: Skeleton Visualizer
|
||||
|
||||
widget-skeleton_visualizer-preview = Skeweton pweview
|
||||
widget-skeleton_visualizer-hide = hoide
|
||||
|
||||
## Tracker status
|
||||
|
||||
tracker-status-none = no stawtus
|
||||
@@ -152,6 +157,7 @@ tracker-status-error = ewwow
|
||||
tracker-status-disconnected = disconnyected
|
||||
tracker-status-occluded = occwuded
|
||||
tracker-status-ok = oki
|
||||
tracker-status-timed_out = Timed owt
|
||||
|
||||
## Tracker status columns
|
||||
|
||||
@@ -348,9 +354,20 @@ settings-general-fk_settings-leg_tweak-floor_clip-description = fwoow-cwip can r
|
||||
settings-general-fk_settings-leg_tweak-toe_snap-description = toe-snap atempts to gwess da wotation of ur fweet if fweet tracker thingys arewnt in use
|
||||
settings-general-fk_settings-leg_tweak-foot_plant-description = pawb-pwant wotates youw feet to be pawawwew to the gwound wen in cawntact.
|
||||
settings-general-fk_settings-leg_fk = leg twacking
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet-description = Enyabwe pawb Meownting Weset by tiptoeing.
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet = Pawb Meownting Weset
|
||||
settings-general-fk_settings-arm_fk = awm twacking
|
||||
settings-general-fk_settings-arm_fk-description = chawnge teh way teh awms awe twacked.
|
||||
settings-general-fk_settings-arm_fk-force_arms = fowce awms fwom hmd
|
||||
settings-general-fk_settings-arm_fk-reset_mode-description = Change which awm pose is expected fow meownting weset.
|
||||
settings-general-fk_settings-arm_fk-back = bak
|
||||
settings-general-fk_settings-arm_fk-back-description = The defauwt mode, wit da uppew awms going back and wowew awms going fowwawd.
|
||||
settings-general-fk_settings-arm_fk-tpose_up = T-pose (up)
|
||||
settings-general-fk_settings-arm_fk-tpose_up-description = Expects youw awms to be down on the sides duwing Fuww Weset, and 90 degwees up to the sides duwing Meownting Weset.
|
||||
settings-general-fk_settings-arm_fk-tpose_down = T-pose (down)
|
||||
settings-general-fk_settings-arm_fk-tpose_down-description = Expects youw awms to be 90 degwees up to the sides duwing Fuww Weset, and down on the sides duwing Meownting Weset.
|
||||
settings-general-fk_settings-arm_fk-forward = Fowwawd
|
||||
settings-general-fk_settings-arm_fk-forward-description = Expects youw awms to be up 90 degwees fowwawd. Usefuw fow VTubing.
|
||||
settings-general-fk_settings-skeleton_settings-toggles = skeweton toggews
|
||||
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_model = extwended spine modew
|
||||
@@ -364,6 +381,7 @@ settings-general-fk_settings-skeleton_settings-impute_hip_from_chest_legs = impu
|
||||
settings-general-fk_settings-skeleton_settings-impute_hip_from_waist_legs = impute hip fwom waist to wegs
|
||||
settings-general-fk_settings-skeleton_settings-interp_hip_legs = awewage da hip's yaw and woll wiff da legs'
|
||||
settings-general-fk_settings-skeleton_settings-interp_knee_tracker_ankle = awewage da knee twackews' yaw and woll wiff da ankews'
|
||||
settings-general-fk_settings-skeleton_settings-interp_knee_ankle = Avewage the knees' yaw and woww with the ankews'
|
||||
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
|
||||
@@ -431,6 +449,9 @@ 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-connected_trackers_warning = Connected twackews wawning
|
||||
settings-general-interface-connected_trackers_warning-description = This option wiww show a pop-up evewy time you twy exiting SwimeVR whiwe having one ow mowe connected twackews. It weminds you to tuwn off youw twackews when you awe done to pwesewve battewy wife.
|
||||
settings-general-interface-connected_trackers_warning-label = Connected twackews wawning on exit
|
||||
|
||||
## Serial settings
|
||||
|
||||
@@ -513,7 +534,7 @@ settings-osc-vmc = viwtuaw motion captuwe
|
||||
# This cares about multilines
|
||||
settings-osc-vmc-description =
|
||||
change settings specific to the vmc (viwtuaw motion captuwe) pwotocow
|
||||
to send swimevr's twacking data and weceive twacking data fwom othew apps.
|
||||
to send SwimeVR's twacking data and weceive twacking data fwom othew apps.
|
||||
settings-osc-vmc-enable = enaybwe
|
||||
settings-osc-vmc-enable-description = toggle teh sending awnd wweceiving of data
|
||||
settings-osc-vmc-enable-label = enaybwe
|
||||
@@ -597,7 +618,7 @@ onboarding-reset_tutorial-2 =
|
||||
|
||||
## Setup start
|
||||
|
||||
onboarding-home = wewcome to swimevr
|
||||
onboarding-home = wewcome to SwimeVR
|
||||
onboarding-home-start = wets get set up!
|
||||
|
||||
## Enter VR part of setup
|
||||
@@ -760,6 +781,13 @@ onboarding-choose_mounting-manual_mounting = manyul meownting
|
||||
# Italized text
|
||||
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
|
||||
# Multiline text
|
||||
onboarding-choose_mounting-manual_modal-title =
|
||||
Awe you suwe you want to do
|
||||
the automatic mounting cawibwation?
|
||||
onboarding-choose_mounting-manual_modal-description = <b>The manuaw mounting cawibwation is wecommended fow new usews</b>, as the automatic mounting cawibwation's poses can be hawd to get wight fiwst and may wequiwe some pwactice.
|
||||
onboarding-choose_mounting-manual_modal-confirm = I'm suwe of what I'm doing
|
||||
onboarding-choose_mounting-manual_modal-cancel = cancew :o
|
||||
|
||||
## Tracker manual mounting setup
|
||||
|
||||
@@ -800,15 +828,18 @@ 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-descriptionv2 =
|
||||
dis wiww guess youw pwopowshuns by wecowding a sampwe of youw movement and passing it thru an algowithm.
|
||||
onboarding-choose_proportions-auto_proportions-descriptionv3 =
|
||||
This wiww guess youw pwopowtions by wecowding a sampwe of youw movements and passing it thwough an awgowithm.
|
||||
|
||||
<b>dis wequiwes having youw hmd connected to SwimeVR!</b>
|
||||
<b>This wequiwes having youw headset (HMD) connected to SwimeVR and on youw head!</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-export = expowt pawpowshuns
|
||||
onboarding-choose_proportions-import = Impowt pwopowtions
|
||||
onboarding-choose_proportions-import-success = Impowted
|
||||
onboarding-choose_proportions-import-failed = Faiwed
|
||||
onboarding-choose_proportions-file_type = body pawpowshuns file
|
||||
|
||||
## Tracker manual proportions setup
|
||||
@@ -831,13 +862,12 @@ onboarding-automatic_proportions-put_trackers_on-description = to cawybwate yowu
|
||||
onboarding-automatic_proportions-put_trackers_on-next = i have awl my twackaws on
|
||||
onboarding-automatic_proportions-requirements-title = wequiyements
|
||||
# Each line of text is a different list item
|
||||
onboarding-automatic_proportions-requirements-description =
|
||||
u have at weast enyough twackews to twack youw pawbs (genyewawwy 5 twackews).
|
||||
u have youw twackews and headset on.
|
||||
u awe weawing youw twackews and headset.
|
||||
ur twackews and headset awe connyected to da SwimeVR sewvew.
|
||||
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-descriptionv2 =
|
||||
You have at weast enough twackews to twack youw pawbs (genewawwy 5 twackews).
|
||||
You have youw twackews and headset on and awe weawing them.
|
||||
Youw twackews and headset awe connected to the SwimeVR sewvew and awe wowking pwopewwy (ex. no stuttewing, disconnecting, etc).
|
||||
Youw headset is wepowting positionaw data to the SwimeVR sewvew (this genewawwy means having SteamVR wunning and connected to SwimeVR using SwimeVR's SteamVR dwivew).
|
||||
Youw twacking is wowking and is accuwatewy wepwesenting youw movements (ex. you have pewfowmed a fuww weset and they move the wight diwection when kicking, bending ovew, sitting, etc).
|
||||
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!
|
||||
@@ -889,6 +919,15 @@ onboarding-automatic_proportions-error_modal-confirm = undewstood!
|
||||
|
||||
home-no_trackers = no twackaws detecyted owo wowigned
|
||||
|
||||
## Trackers Still On notification
|
||||
|
||||
trackers_still_on-modal-title = Twackews stiww on
|
||||
trackers_still_on-modal-description =
|
||||
One ow mowe twackews awe stiww on.
|
||||
Do you stiww want to exit SwimeVR?
|
||||
trackers_still_on-modal-confirm = Exit SwimeVR
|
||||
trackers_still_on-modal-cancel = Howd on...
|
||||
|
||||
## Status system
|
||||
|
||||
status_system-StatusTrackerReset = it wecommended to pewfowm a fuwl weset as one or mowe twackews awe unadjussed. -w-
|
||||
|
||||
@@ -117,7 +117,7 @@ widget-developer_mode = Developer Mode
|
||||
widget-developer_mode-high_contrast = High contrast
|
||||
widget-developer_mode-precise_rotation = Precise rotation
|
||||
widget-developer_mode-fast_data_feed = Fast data feed
|
||||
widget-developer_mode-filter_slimes_and_hmd = Filter slimes and HMD
|
||||
widget-developer_mode-filter_slimes_and_hmd = Filter Slimes and HMD
|
||||
widget-developer_mode-sort_by_name = Sort by name
|
||||
widget-developer_mode-raw_slime_rotation = Raw rotation
|
||||
widget-developer_mode-more_info = More info
|
||||
@@ -128,6 +128,10 @@ widget-imu_visualizer-rotation_raw = Raw
|
||||
widget-imu_visualizer-rotation_preview = Preview
|
||||
widget-imu_visualizer-rotation_hide = Hide
|
||||
|
||||
## Widget: Skeleton Visualizer
|
||||
widget-skeleton_visualizer-preview = Skeleton preview
|
||||
widget-skeleton_visualizer-hide = Hide
|
||||
|
||||
## Tracker status
|
||||
tracker-status-none = No Status
|
||||
tracker-status-busy = Busy
|
||||
@@ -135,6 +139,7 @@ tracker-status-error = Error
|
||||
tracker-status-disconnected = Disconnected
|
||||
tracker-status-occluded = Occluded
|
||||
tracker-status-ok = OK
|
||||
tracker-status-timed_out = Timed out
|
||||
|
||||
## Tracker status columns
|
||||
tracker-table-column-name = Name
|
||||
@@ -322,9 +327,20 @@ settings-general-fk_settings-leg_tweak-floor_clip-description = Floor-clip can R
|
||||
settings-general-fk_settings-leg_tweak-toe_snap-description = Toe-snap attempts to guess the rotation of your feet if feet trackers are not in use.
|
||||
settings-general-fk_settings-leg_tweak-foot_plant-description = Foot-plant rotates your feet to be parallel to the ground when in contact.
|
||||
settings-general-fk_settings-leg_fk = Leg tracking
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet-description = Enable feet Mounting Reset by tiptoeing.
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet = Feet Mounting Reset
|
||||
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-description = Force arms to be tracked from the headset (HMD) even if positional hand data is available.
|
||||
settings-general-fk_settings-arm_fk-force_arms = Force arms from HMD
|
||||
settings-general-fk_settings-arm_fk-reset_mode-description = Change which arm pose is expected for mounting reset.
|
||||
settings-general-fk_settings-arm_fk-back = Back
|
||||
settings-general-fk_settings-arm_fk-back-description = The default mode, with the upper arms going back and lower arms going forward.
|
||||
settings-general-fk_settings-arm_fk-tpose_up = T-pose (up)
|
||||
settings-general-fk_settings-arm_fk-tpose_up-description = Expects your arms to be down on the sides during Full Reset, and 90 degrees up to the sides during Mounting Reset.
|
||||
settings-general-fk_settings-arm_fk-tpose_down = T-pose (down)
|
||||
settings-general-fk_settings-arm_fk-tpose_down-description = Expects your arms to be 90 degrees up to the sides during Full Reset, and down on the sides during Mounting Reset.
|
||||
settings-general-fk_settings-arm_fk-forward = Forward
|
||||
settings-general-fk_settings-arm_fk-forward-description = Expects your arms to be up 90 degrees forward. Useful for VTubing.
|
||||
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_model = Extended spine model
|
||||
@@ -338,6 +354,7 @@ settings-general-fk_settings-skeleton_settings-impute_hip_from_chest_legs = Impu
|
||||
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-skeleton_settings-interp_knee_ankle = Average the knees' 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.
|
||||
@@ -402,6 +419,9 @@ 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-connected_trackers_warning = Connected trackers warning
|
||||
settings-general-interface-connected_trackers_warning-description = This option will show a pop-up every time you try exiting SlimeVR while having one or more connected trackers. It reminds you to turn off your trackers when you are done to preserve battery life.
|
||||
settings-general-interface-connected_trackers_warning-label = Connected trackers warning on exit
|
||||
|
||||
## Serial settings
|
||||
settings-serial = Serial Console
|
||||
@@ -451,7 +471,7 @@ settings-osc-router-network-address-placeholder = IPV4 address
|
||||
settings-osc-vrchat = VRChat OSC Trackers
|
||||
# This cares about multilines
|
||||
settings-osc-vrchat-description =
|
||||
Change VRChat-specific settings to receive HMD data and send
|
||||
Change VRChat-specific settings to receive headset (HMD) data and send
|
||||
tracker data for FBT without SteamVR (ex. Quest standalone).
|
||||
settings-osc-vrchat-enable = Enable
|
||||
settings-osc-vrchat-enable-description = Toggle the sending and receiving of data.
|
||||
@@ -542,7 +562,7 @@ onboarding-reset_tutorial-skip = Skip step
|
||||
# Cares about multiline
|
||||
onboarding-reset_tutorial-0 = Tap { $taps } times the highlighted tracker for triggering yaw reset.
|
||||
|
||||
This will make the trackers face the same direction as your HMD.
|
||||
This will make the trackers face the same direction as your headset (HMD).
|
||||
# Cares about multiline
|
||||
onboarding-reset_tutorial-1 = Tap { $taps } times the highlighted tracker for triggering full reset.
|
||||
|
||||
@@ -701,7 +721,12 @@ onboarding-choose_mounting-manual_mounting = Manual mounting
|
||||
# Italized text
|
||||
onboarding-choose_mounting-manual_mounting-label = Recommended
|
||||
onboarding-choose_mounting-manual_mounting-description = This will let you choose the mounting direction manually for each tracker
|
||||
|
||||
# Multiline text
|
||||
onboarding-choose_mounting-manual_modal-title = Are you sure you want to do
|
||||
the automatic mounting calibration?
|
||||
onboarding-choose_mounting-manual_modal-description = <b>The manual mounting calibration is recommended for new users</b>, as the automatic mounting calibration's poses can be hard to get right first and may require some practice.
|
||||
onboarding-choose_mounting-manual_modal-confirm = I'm sure of what I'm doing
|
||||
onboarding-choose_mounting-manual_modal-cancel = Cancel
|
||||
|
||||
## Tracker manual mounting setup
|
||||
onboarding-manual_mounting-back = Go Back to Enter VR
|
||||
@@ -738,15 +763,18 @@ 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-descriptionv2 =
|
||||
onboarding-choose_proportions-auto_proportions-descriptionv3 =
|
||||
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>
|
||||
<b>This requires having your headset (HMD) connected to SlimeVR and on your head!</b>
|
||||
onboarding-choose_proportions-manual_proportions = Manual proportions
|
||||
# Italized text
|
||||
onboarding-choose_proportions-manual_proportions-subtitle = For small touches
|
||||
onboarding-choose_proportions-manual_proportions-description = This will let you adjust your proportions manually by modifying them directly
|
||||
onboarding-choose_proportions-export = Export proportions
|
||||
onboarding-choose_proportions-import = Import proportions
|
||||
onboarding-choose_proportions-import-success = Imported
|
||||
onboarding-choose_proportions-import-failed = Failed
|
||||
onboarding-choose_proportions-file_type = Body proportions file
|
||||
|
||||
## Tracker manual proportions setup
|
||||
@@ -767,16 +795,15 @@ onboarding-automatic_proportions-put_trackers_on-description = To calibrate your
|
||||
onboarding-automatic_proportions-put_trackers_on-next = I have all my trackers on
|
||||
onboarding-automatic_proportions-requirements-title = Requirements
|
||||
# Each line of text is a different list item
|
||||
onboarding-automatic_proportions-requirements-description =
|
||||
onboarding-automatic_proportions-requirements-descriptionv2 =
|
||||
You have at least enough trackers to track your feet (generally 5 trackers).
|
||||
You have your trackers and headset on.
|
||||
You are wearing your trackers and headset.
|
||||
Your trackers and headset are connected to the SlimeVR server.
|
||||
Your trackers and headset are working properly within the SlimeVR server.
|
||||
You have your trackers and headset on and are wearing them.
|
||||
Your trackers and headset are connected to the SlimeVR server and are working properly (ex. no stuttering, disconnecting, etc).
|
||||
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).
|
||||
Your tracking is working and is accurately representing your movements (ex. you have performed a full reset and they move the right direction when kicking, bending over, sitting, etc).
|
||||
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!
|
||||
onboarding-automatic_proportions-check_height-description = We use your height as a basis of our measurements by using the headset's (HMD) 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!
|
||||
@@ -823,6 +850,14 @@ onboarding-automatic_proportions-error_modal-confirm = Understood!
|
||||
## Home
|
||||
home-no_trackers = No trackers detected or assigned
|
||||
|
||||
## Trackers Still On notification
|
||||
trackers_still_on-modal-title = Trackers still on
|
||||
trackers_still_on-modal-description =
|
||||
One or more trackers are still on.
|
||||
Do you still want to exit SlimeVR?
|
||||
trackers_still_on-modal-confirm = Exit SlimeVR
|
||||
trackers_still_on-modal-cancel = Hold on...
|
||||
|
||||
## Status system
|
||||
status_system-StatusTrackerReset = It is recommended to perform a full reset as one or more trackers are unadjusted.
|
||||
status_system-StatusSteamVRDisconnected = { $type ->
|
||||
|
||||
@@ -144,6 +144,11 @@ widget-imu_visualizer-rotation_raw = Raw
|
||||
widget-imu_visualizer-rotation_preview = Preview
|
||||
widget-imu_visualizer-rotation_hide = Ocultar
|
||||
|
||||
## Widget: Skeleton Visualizer
|
||||
|
||||
widget-skeleton_visualizer-preview = Previsualización del esqueleto
|
||||
widget-skeleton_visualizer-hide = Ocultar
|
||||
|
||||
## Tracker status
|
||||
|
||||
tracker-status-none = Sin estado
|
||||
@@ -152,6 +157,7 @@ tracker-status-error = Error
|
||||
tracker-status-disconnected = Desconectado
|
||||
tracker-status-occluded = Ocluido
|
||||
tracker-status-ok = Conectado
|
||||
tracker-status-timed_out = Conexión interrumpida
|
||||
|
||||
## Tracker status columns
|
||||
|
||||
@@ -348,9 +354,20 @@ settings-general-fk_settings-leg_tweak-floor_clip-description = El clip del suel
|
||||
settings-general-fk_settings-leg_tweak-toe_snap-description = El encajado de dedos intenta adivinar la rotación de los pies si sus respectivos trackers no están en uso.
|
||||
settings-general-fk_settings-leg_tweak-foot_plant-description = El plantado del pie rota los pies para que sean paralelos con el suelo al entrar en contacto.
|
||||
settings-general-fk_settings-leg_fk = Tracking de piernas
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet-description = Activar reinicio de montura para el pie mediante el pararse de puntillas.
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet = Reinicio de montura de pies
|
||||
settings-general-fk_settings-arm_fk = Trackeo de brazos
|
||||
settings-general-fk_settings-arm_fk-description = Cambia cómo el movimiento de los brazos es detectado.
|
||||
settings-general-fk_settings-arm_fk-force_arms = Forzar brazos desde el HMD
|
||||
settings-general-fk_settings-arm_fk-reset_mode-description = Cambiar que pose de brazos es esperada para el reinicio de montura.
|
||||
settings-general-fk_settings-arm_fk-back = Detrás
|
||||
settings-general-fk_settings-arm_fk-back-description = El modo predeterminado, con el brazo yendo por detrás y el antebrazo yendo para adelante.
|
||||
settings-general-fk_settings-arm_fk-tpose_up = T-pose (arriba)
|
||||
settings-general-fk_settings-arm_fk-tpose_up-description = Espera que tus brazos estén abajo hacia los lados durante un reinicio completo, y 90 grados hacia los lados durante un reinicio de montura.
|
||||
settings-general-fk_settings-arm_fk-tpose_down = T-pose (abajo)
|
||||
settings-general-fk_settings-arm_fk-tpose_down-description = Espera que tus brazos estén 90 grados arriba hacia los lados durante un reinicio completo, y abajo hacia los lados durante un reinicio de montura.
|
||||
settings-general-fk_settings-arm_fk-forward = Delante
|
||||
settings-general-fk_settings-arm_fk-forward-description = Espera que tus brazos estén 90 grados para delante. Útil para VTubing.
|
||||
settings-general-fk_settings-skeleton_settings-toggles = Interruptores del 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_model = Modelo extendido de la columna
|
||||
@@ -363,7 +380,8 @@ settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_legs = Im
|
||||
settings-general-fk_settings-skeleton_settings-impute_hip_from_chest_legs = Imputar de la cadera al pecho hasta las piernas
|
||||
settings-general-fk_settings-skeleton_settings-impute_hip_from_waist_legs = Imputar de la cadera a la cintura hasta las piernas
|
||||
settings-general-fk_settings-skeleton_settings-interp_hip_legs = Promediar la rotación del eje vertical y horizontal de la cadera con la de las piernas
|
||||
settings-general-fk_settings-skeleton_settings-interp_knee_tracker_ankle = Promediar la rotación del eje vertical y horizontal de la rodilla con la de los tobillos
|
||||
settings-general-fk_settings-skeleton_settings-interp_knee_tracker_ankle = Promediar la rotación del eje vertical y horizontal de los trackers de las rodillas con la de los tobillos
|
||||
settings-general-fk_settings-skeleton_settings-interp_knee_ankle = Promediar la rotación del eje vertical y horizontal de las rodillas con la de los tobillos
|
||||
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
|
||||
@@ -431,6 +449,9 @@ 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-connected_trackers_warning = Advertencia de trackers conectados
|
||||
settings-general-interface-connected_trackers_warning-description = Esta opción hará que aparezca un pop-up cada vez que intentas salir de SlimeVR mientras tienes uno o más trackers conectados. Te recuerda de apagar tus trackers cuando ya paraste de usarlos así preservas la duración de la batería.
|
||||
settings-general-interface-connected_trackers_warning-label = Advertencia de trackers conectados al salir
|
||||
|
||||
## Serial settings
|
||||
|
||||
@@ -760,6 +781,13 @@ onboarding-choose_mounting-manual_mounting = Montura manual
|
||||
# Italized text
|
||||
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.
|
||||
# Multiline text
|
||||
onboarding-choose_mounting-manual_modal-title =
|
||||
¿Está seguro de que quiere
|
||||
hacer la calibración automática de montura?
|
||||
onboarding-choose_mounting-manual_modal-description = <b>Está recomendado para nuevos usuarios el uso de la calibración manual de montura</b>, ya que las poses de la calibración automática pueden ser difíciles de hacer correctamente en el primer intento y requieran un poco de práctica.
|
||||
onboarding-choose_mounting-manual_modal-confirm = Estoy seguro de lo que hago
|
||||
onboarding-choose_mounting-manual_modal-cancel = Cancelar
|
||||
|
||||
## Tracker manual mounting setup
|
||||
|
||||
@@ -800,14 +828,18 @@ 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-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-auto_proportions-descriptionv3 =
|
||||
Esto estimará tus proporciones grabando una muestra de tus movimientos y pasándolos a través de un algoritmo.
|
||||
|
||||
<b>¡Esto requiere tener tu visor (HMD) conectado a SlimeVR y en tu cabeza!</b>
|
||||
onboarding-choose_proportions-manual_proportions = Proporciones manuales
|
||||
# Italized text
|
||||
onboarding-choose_proportions-manual_proportions-subtitle = Para toques pequeños
|
||||
onboarding-choose_proportions-manual_proportions-description = Esto te permitirá ajustar tus proporciones manualmente de forma directa
|
||||
onboarding-choose_proportions-export = Exportar proporciones
|
||||
onboarding-choose_proportions-import = Importar proporciones
|
||||
onboarding-choose_proportions-import-success = Importado
|
||||
onboarding-choose_proportions-import-failed = Error
|
||||
onboarding-choose_proportions-file_type = Archivo de proporciones del cuerpo
|
||||
|
||||
## Tracker manual proportions setup
|
||||
@@ -830,13 +862,12 @@ onboarding-automatic_proportions-put_trackers_on-description = Para calibrar tus
|
||||
onboarding-automatic_proportions-put_trackers_on-next = Tengo puestos todos mis sensores
|
||||
onboarding-automatic_proportions-requirements-title = Requisitos
|
||||
# Each line of text is a different list item
|
||||
onboarding-automatic_proportions-requirements-description =
|
||||
Tienes al menos suficientes trackers para rastrear tus pies (generalmente 5 trackers).
|
||||
Tienes tus trackers y VR encendidos.
|
||||
Tienes tus trackers y VR puestos.
|
||||
Tus trackers y VR están conectados al servidor de SlimeVR.
|
||||
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-descriptionv2 =
|
||||
Tienes suficientes sensores para mover tus pies (generalmente 5 sensores).
|
||||
Tienes tus sensores y visor encendidos y los tienes puestos.
|
||||
Tus sensores y visor están conectados al servidor de SlimeVR y están funcionando correctamente (ej: no se congela, no se desconecta, etc).
|
||||
Tu visor esta reportando datos posicionales al servidor de SlimeVR (esto generalmente significa tener SteamVR abierto y conectado a SlimeVR usando el driver de SlimeVR para SteamVR).
|
||||
Tus sensores están funcionando y están representando tus movimientos con precisión (ej: Realizaste un reinicio completo y se mueven en la dirección correcta cuando pateas, te agachas, te sientas, etc).
|
||||
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!
|
||||
@@ -888,6 +919,15 @@ onboarding-automatic_proportions-error_modal-confirm = ¡Entendido!
|
||||
|
||||
home-no_trackers = No hay sensores detectados o asignados
|
||||
|
||||
## Trackers Still On notification
|
||||
|
||||
trackers_still_on-modal-title = Los trackers siguen encendidos
|
||||
trackers_still_on-modal-description =
|
||||
Uno o más trackers siguen encendidos.
|
||||
¿Estás seguro que quieres salir de SlimeVR?
|
||||
trackers_still_on-modal-confirm = Salir de SlimeVR
|
||||
trackers_still_on-modal-cancel = Espera un momento...
|
||||
|
||||
## Status system
|
||||
|
||||
status_system-StatusTrackerReset = Se recomienda realizar un reinicio completo ya que uno o más trackers están sin reiniciar.
|
||||
|
||||
@@ -36,7 +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 = Abdomen superior
|
||||
body_part-UPPER_CHEST = Torso superior
|
||||
body_part-CHEST = Pecho
|
||||
body_part-WAIST = Cintura
|
||||
body_part-HIP = Cadera
|
||||
@@ -60,26 +60,26 @@ 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-HIPS_WIDTH = Ancho de la cadera
|
||||
skeleton_bone-leg_group = Longitud de la espinilla
|
||||
skeleton_bone-UPPER_LEG = Longitud del muslo
|
||||
skeleton_bone-LOWER_LEG = Longitud de la espinilla
|
||||
skeleton_bone-FOOT_LENGTH = Longitud 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-SHOULDERS_DISTANCE = Distancia de hombros
|
||||
skeleton_bone-SHOULDERS_WIDTH = Ancho de hombros
|
||||
skeleton_bone-arm_group = Longitud del brazo
|
||||
skeleton_bone-UPPER_ARM = Longitud del brazo
|
||||
skeleton_bone-LOWER_ARM = Longitud del antebrazo
|
||||
skeleton_bone-HAND_Y = Distancia Y de la mano
|
||||
skeleton_bone-HAND_Z = Distancia Z de la mano
|
||||
skeleton_bone-ELBOW_OFFSET = Compensacion de los codos
|
||||
|
||||
## Tracker reset buttons
|
||||
|
||||
reset-reset_all = Reiniciar todas las proporciones
|
||||
reset-full = Reiniciar
|
||||
reset-full = Reinicio completo
|
||||
reset-mounting = Reiniciar montura
|
||||
reset-yaw = Restablecimiento horizontal
|
||||
|
||||
@@ -96,7 +96,7 @@ serial_detection-close = Cerrar
|
||||
## Navigation bar
|
||||
|
||||
navbar-home = Inicio
|
||||
navbar-body_proportions = Proporciones corporales
|
||||
navbar-body_proportions = Proporciones físicas
|
||||
navbar-trackers_assign = Asignación de trackers
|
||||
navbar-mounting = Calibración de montura
|
||||
navbar-onboarding = Asistente de Configuración
|
||||
@@ -130,6 +130,7 @@ widget-drift_compensation-clear = Eliminar compensacion del drift
|
||||
widget-developer_mode = Modo de desarrollador
|
||||
widget-developer_mode-high_contrast = Contraste alto
|
||||
widget-developer_mode-precise_rotation = Rotación precisa
|
||||
widget-developer_mode-fast_data_feed = Flujo de datos rápido
|
||||
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
|
||||
@@ -142,6 +143,11 @@ widget-imu_visualizer-rotation_raw = Sin filtrar
|
||||
widget-imu_visualizer-rotation_preview = Previsualización
|
||||
widget-imu_visualizer-rotation_hide = Ocultar
|
||||
|
||||
## Widget: Skeleton Visualizer
|
||||
|
||||
widget-skeleton_visualizer-preview = Previsualización del esqueleto
|
||||
widget-skeleton_visualizer-hide = Ocultar
|
||||
|
||||
## Tracker status
|
||||
|
||||
tracker-status-none = Sin estatus
|
||||
@@ -175,6 +181,7 @@ tracker-rotation-back = Trasero
|
||||
tracker-rotation-back_left = Trasero-Izquierdo
|
||||
tracker-rotation-back_right = Trasero-Derecho
|
||||
tracker-rotation-custom = Personalizado
|
||||
tracker-rotation-overriden = (anulado por el reinicio de montura)
|
||||
|
||||
## Tracker information
|
||||
|
||||
@@ -238,6 +245,8 @@ 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-RIGHT_CONTROLLER = { -tracker_selection-part } mando derecho?
|
||||
tracker_selection_menu-UPPER_CHEST = { -tracker_selection-part } torso 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?
|
||||
@@ -261,7 +270,7 @@ tracker_selection_menu-neck_warning-cancel = Cancelar
|
||||
|
||||
## Mounting menu
|
||||
|
||||
mounting_selection_menu = ¿Dónde quieres que esté este tracker?
|
||||
mounting_selection_menu = ¿Dónde quieres colocar el tracker?
|
||||
mounting_selection_menu-close = Cerrar
|
||||
|
||||
## Sidebar settings
|
||||
@@ -273,8 +282,11 @@ 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-osc_trackers = VRChat OSC Trackers
|
||||
settings-sidebar-utils = Utilidades
|
||||
settings-sidebar-serial = Consola serial
|
||||
settings-sidebar-appearance = Apariencia
|
||||
settings-sidebar-notifications = Notificaciones
|
||||
|
||||
## SteamVR settings
|
||||
|
||||
@@ -313,6 +325,7 @@ 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
|
||||
settings-general-tracker_mechanics-drift_compensation-max_resets-label = Usar los últimos X reinicios.
|
||||
|
||||
## FK/Tracking settings
|
||||
|
||||
@@ -320,18 +333,42 @@ 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
|
||||
settings-general-fk_settings-leg_tweak-floor_clip = Anclado al suelo
|
||||
# Skating correction:
|
||||
# why the name - without this enabled the feet will often slide across the ground as if your skating across the ground,
|
||||
# since this largely prevents this it corrects for it hence skating correction (note this may be renamed to sliding correction)
|
||||
# definition - Guesses when each foot is in contact with the ground and uses that information to improve tracking
|
||||
settings-general-fk_settings-leg_tweak-skating_correction = Corrección del patinaje
|
||||
settings-general-fk_settings-leg_tweak-foot_plant = Planta del pie
|
||||
settings-general-fk_settings-leg_tweak-skating_correction-amount = Intensidad de la corrección del patinaje
|
||||
settings-general-fk_settings-leg_tweak-skating_correction-description = Corrección del patinaje corrige el deslizamiento en el suelo, pero puede disminuir la precisión en ciertos movimientos. Activar esta opción requerirá realizar un reinicio general y recalibrar en el juego.
|
||||
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-arm_fk-back = Parte posterior del brazo
|
||||
settings-general-fk_settings-arm_fk-back-description = Modo predeterminado, con los brazos hacia atrás y los antebrazos hacia adelante.
|
||||
settings-general-fk_settings-arm_fk-tpose_up = T-pose (arriba)
|
||||
settings-general-fk_settings-arm_fk-tpose_up-description = Se espera que tus brazos esten relajados, perpendicular a tu cuerpo durante el reinicio completo y 90 grados respecto a tu cuerpo durante el reinicio de montaje.
|
||||
settings-general-fk_settings-arm_fk-tpose_down = T-pose (abajo)
|
||||
settings-general-fk_settings-arm_fk-tpose_down-description = Se espera que tus brazos estén a 90 grados respecto a tu cuerpo durante el reinicio completo y relajados, perpendicular a tu cuerpo durante el reinicio del montaje.
|
||||
settings-general-fk_settings-arm_fk-forward = Siguiente
|
||||
settings-general-fk_settings-arm_fk-forward-description = Espera que tus brazos estén 90 grados hacia adelante. Útil para VTubing.
|
||||
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-skeleton_settings-extended_spine_model = Modelo de columna extendida
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis_model = Modelo de pelvis extendida
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees_model = Modelo de rodilla extendida
|
||||
settings-general-fk_settings-skeleton_settings-ratios = Proporciones del esqueleto
|
||||
settings-general-fk_settings-skeleton_settings-ratios-description = Cambia los valores de la configuración del esqueleto. Es posible que debas ajustar tus proporciones de nuevo.
|
||||
settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_hip = Atribuye la cintura desde el pecho hasta la cadera
|
||||
settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_legs = Atribuye la cintura desde el pecho hasta las piernas
|
||||
settings-general-fk_settings-skeleton_settings-impute_hip_from_chest_legs = Atribuye la cadera desde el pecho hasta las piernas
|
||||
settings-general-fk_settings-skeleton_settings-impute_hip_from_waist_legs = Atribuye la cadera desde la cintura hasta las piernas
|
||||
settings-general-fk_settings-skeleton_settings-interp_hip_legs = Promedia el balanceo de la cadera con el de las piernas
|
||||
settings-general-fk_settings-skeleton_settings-interp_knee_tracker_ankle = Promedia el balanceo de los trackers de rodilla con el de los tobillos.
|
||||
settings-general-fk_settings-skeleton_settings-interp_knee_ankle = Promedia el balanceo de las rodillas con la de los tobillos
|
||||
settings-general-fk_settings-self_localization-title = Modo Captura de movimiento
|
||||
settings-general-fk_settings-self_localization-description = El modo captura de movimiento permite al esqueleto seguir aproximadamente tu posición sin auriculares ni otros trackers. Ten en cuenta que esto requiere trrackers de pies y cabeza para funcionar y que aún está en fase experimental.
|
||||
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
|
||||
@@ -340,27 +377,59 @@ settings-general-fk_settings-vive_emulation-label = Habilitar emulación Vive
|
||||
|
||||
settings-general-gesture_control = Control de gestos
|
||||
settings-general-gesture_control-subtitle = Reinicio basado en toques
|
||||
settings-general-gesture_control-fullResetEnabled = Activa toque para reinicio completo
|
||||
settings-general-gesture_control-fullResetDelay = Retraso de reinicio completo
|
||||
settings-general-gesture_control-fullResetTaps = Da toquecitos para reinicio completo
|
||||
settings-general-gesture_control-mountingResetEnabled = Activa toquecitos para reiniciar montaje
|
||||
settings-general-gesture_control-mountingResetDelay = Reinicio de montaje retrasado
|
||||
settings-general-gesture_control-mountingResetTaps = Da toquecitos para reinicio de montaje
|
||||
# The number of trackers that can have higher acceleration before a tap is rejected
|
||||
settings-general-gesture_control-numberTrackersOverThreshold = Trackers por encima del limite
|
||||
settings-general-gesture_control-numberTrackersOverThreshold-description = Aumenta este valor si la detección de toqueteo no funciona. No lo aumentes por encima de lo necesario para que la detección de toques funcione, ya que crearía más falsos positivos
|
||||
|
||||
## Appearance settings
|
||||
|
||||
settings-interface-appearance = Apariencia
|
||||
settings-general-interface-dev_mode = Modo de desarrollador
|
||||
settings-general-interface-dev_mode-description = Este modo puede ser útil si necesitas datos en profundidad o para interactuar con los trackers conectados a un nivel más avanzado
|
||||
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
|
||||
settings-interface-appearance-font-description = Esto cambia la fuente utilizada por la interfaz
|
||||
settings-interface-appearance-font-placeholder = Fuente predeterminada
|
||||
settings-interface-appearance-font-os_font = Fuente SO
|
||||
settings-interface-appearance-font-slime_font = Fuente predeterminada
|
||||
settings-interface-appearance-font_size = Escala de la fuente base
|
||||
settings-interface-appearance-font_size-description = Esto afecta al tamaño de la fuente de toda la interfaz excepto este panel de configuración
|
||||
|
||||
## Notification settings
|
||||
|
||||
settings-interface-notifications = Notificaciones
|
||||
settings-general-interface-serial_detection = Detección de dispositivos seriales
|
||||
settings-general-interface-serial_detection-description = Esta opción mostrará una ventana emergente cada vez que conectes un nuevo dispositivo serie que podría ser un tracker. Ayuda a mejorar el proceso de configuración de un tracker.
|
||||
settings-general-interface-serial_detection-label = Detección de dispositivos seriales
|
||||
settings-general-interface-feedback_sound = Sonido de feedback
|
||||
settings-general-interface-feedback_sound-description = Esta opción reproducirá un sonido cuando se activa un reinicio
|
||||
settings-general-interface-feedback_sound-label = Sonido de feedback
|
||||
settings-general-interface-feedback_sound-volume = Volumen del sonido de feedback
|
||||
|
||||
## Serial settings
|
||||
|
||||
settings-serial = Consola serial
|
||||
# This cares about multilines
|
||||
settings-serial-description =
|
||||
Esta es una fuente de información en vivo para la comunicación serial.
|
||||
Puede ser útil si necesitas saber si el firmware está fallando.
|
||||
settings-serial-connection_lost = Conexión a puerto serial perdida, Reconectando...
|
||||
settings-serial-reboot = Reiniciar
|
||||
settings-serial-factory_reset = Restablecimiento de fábrica
|
||||
# This cares about multilines
|
||||
# <b>text</b> means that the text should be bold
|
||||
settings-serial-factory_reset-warning =
|
||||
<b>Advertencia:</b> Esto restablecerá la configuración de fábrica del tracker.
|
||||
Esto significa que los ajustes de Wi-Fi y calibración <b>se perderán</b>.
|
||||
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
|
||||
@@ -369,7 +438,9 @@ settings-serial-auto_dropdown_item = Automático
|
||||
|
||||
## OSC router settings
|
||||
|
||||
settings-osc-router = Router OSC
|
||||
settings-osc-router-enable = Habilitar
|
||||
settings-osc-router-enable-description = Activar el reenvío de mensajes
|
||||
settings-osc-router-enable-label = Habilitar
|
||||
settings-osc-router-network = Puertos de red
|
||||
settings-osc-router-network-address = Dirección de red
|
||||
@@ -378,30 +449,38 @@ settings-osc-router-network-address-placeholder = Dirección IPV4
|
||||
## OSC VRChat settings
|
||||
|
||||
settings-osc-vrchat-enable = Habilitar
|
||||
settings-osc-vrchat-enable-description = Alternar el envío y la recepción de datos
|
||||
settings-osc-vrchat-enable-label = Habilitar
|
||||
settings-osc-vrchat-network = Puertos de red
|
||||
settings-osc-vrchat-network-description = Configura los puertos para escuchar y enviar datos a VRChat.
|
||||
settings-osc-vrchat-network-address = Dirección de red
|
||||
settings-osc-vrchat-network-address-placeholder = Dirección IP de VRChat
|
||||
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
|
||||
settings-osc-vrchat-network-trackers-elbows = Codos
|
||||
|
||||
## VMC OSC settings
|
||||
|
||||
settings-osc-vmc = Captura de movimiento virtual
|
||||
settings-osc-vmc-enable = Habilitar
|
||||
settings-osc-vmc-enable-description = Alterna el envío y recepción de datos.
|
||||
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-description = Ancla el tracking a la cadera, útil para VTubing sentado. Si se deshabilita, carga un modelo VRM.
|
||||
settings-osc-vmc-anchor_hip-label = Anclar a la cadera
|
||||
|
||||
## Setup/onboarding menu
|
||||
|
||||
onboarding-skip = Omitir configuración
|
||||
onboarding-continue = Continuar
|
||||
onboarding-wip = Trabajo en progreso
|
||||
onboarding-previous_step = Paso anterior
|
||||
onboarding-setup_warning-skip = Omitir configuración
|
||||
onboarding-setup_warning-cancel = Continuar con la configuración
|
||||
@@ -409,12 +488,24 @@ onboarding-setup_warning-cancel = Continuar con la configuración
|
||||
## Wi-Fi setup
|
||||
|
||||
onboarding-wifi_creds-back = Volver a la introducción
|
||||
onboarding-wifi_creds = Introduce credenciales de Wi-Fi
|
||||
# This cares about multilines
|
||||
onboarding-wifi_creds-description =
|
||||
Los trackers utilizarán estas credenciales para conectarse de forma inalámbrica.
|
||||
Por favor, utiliza las credenciales a las que está conectado actualmente.
|
||||
onboarding-wifi_creds-skip = Omitir configuración Wi-Fi
|
||||
onboarding-wifi_creds-submit = ¡Enviar!
|
||||
onboarding-wifi_creds-ssid =
|
||||
.label = Nombre Wi-Fi
|
||||
.placeholder = Introduce nombre de Wi-Fi
|
||||
onboarding-wifi_creds-password =
|
||||
.label = Contraseña
|
||||
.placeholder = Introduce contraseña
|
||||
|
||||
## Mounting setup
|
||||
|
||||
onboarding-reset_tutorial = Tutorial para resetteo de trackers
|
||||
onboarding-reset_tutorial-explanation = Mientras usas tus trackers, es posible que se desalineen debido al balanceo de la IMU o porque es posible que se hayan movido físicamente. Tienes varias formas de solucionar este problema.
|
||||
onboarding-reset_tutorial-skip = Omitir paso
|
||||
|
||||
## Setup start
|
||||
@@ -424,48 +515,90 @@ onboarding-home-start = ¡Vamos a prepararnos!
|
||||
|
||||
## Enter VR part of setup
|
||||
|
||||
onboarding-enter_vr-back = Volver a la asignación del tracker
|
||||
onboarding-enter_vr-title = ¡Hora de entrar en VR!
|
||||
onboarding-enter_vr-description = ¡Ponte todos tus trackers y luego entra a la realidad virtual!
|
||||
onboarding-enter_vr-ready = Estoy listo
|
||||
|
||||
## Setup done
|
||||
|
||||
onboarding-done-title = ¡Todo listo!
|
||||
onboarding-done-description = Disfruta de la experiencia de full-body tracking
|
||||
onboarding-done-close = Cerrar configuración
|
||||
|
||||
## Tracker connection setup
|
||||
|
||||
onboarding-connect_tracker-back = Volver a credenciales de Wi-Fi
|
||||
onboarding-connect_tracker-title = Conectar trackers
|
||||
onboarding-connect_tracker-description-p0 = ¡Ahora a la parte divertida, conectando todos los trackers!
|
||||
onboarding-connect_tracker-description-p1 = Simplemente conecta todos los que aún no están conectados, a través de un puerto USB.
|
||||
onboarding-connect_tracker-issue-serial = ¡Tengo problemas para conectarme!
|
||||
onboarding-connect_tracker-usb = Tracker USB
|
||||
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-connection_error = No se puede conectar al Wi-Fi
|
||||
onboarding-connect_tracker-connection_status-could_not_find_server = No se pudo encontrar el servidor
|
||||
onboarding-connect_tracker-connection_status-done = Conectado al Server
|
||||
onboarding-connect_tracker-next = He conectado todos mis trackers
|
||||
|
||||
## 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-waiting = Esperando por ti
|
||||
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
|
||||
|
||||
onboarding-assignment_tutorial = Cómo preparar un Slime Tracker antes de ponértelo
|
||||
onboarding-assignment_tutorial-first_step = 1. Coloca una pegatina de parte del cuerpo (si tienes una) en el rastreador según tu elección.
|
||||
# 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-v2 = 2. Conecta la correa con su tracker, manteniendo el lado de velcro de la correa orientado en la misma dirección que la cara de Slime de su rastreador:
|
||||
onboarding-assignment_tutorial-second_step-continuation-v2 = El lado del velcro de la extensión debe quedar hacia arriba como en la siguiente imagen:
|
||||
onboarding-assignment_tutorial-done = ¡Le puse pegatinas y correas!
|
||||
|
||||
## Tracker assignment setup
|
||||
|
||||
onboarding-assign_trackers-back = Volver a credenciales de Wi-Fi
|
||||
onboarding-assign_trackers-title = Asignar trackers
|
||||
onboarding-assign_trackers-description = Elije qué tracker va a dónde. Haz clic en la ubicación donde deseas colocar un tracker
|
||||
onboarding-assign_trackers-advanced = Mostrar ubicaciones de asignación avanzadas
|
||||
onboarding-assign_trackers-next = He asignado todos los trackers
|
||||
|
||||
## Tracker assignment warnings
|
||||
|
||||
# Note for devs, number is used for representing boolean states per bit.
|
||||
# $unassigned (Number) - Bits are based on BodyAssignment.ASSIGNMENT_RULES order
|
||||
onboarding-assign_trackers-warning-LEFT_FOOT =
|
||||
{ $unassigned ->
|
||||
[0] El pie izquierdo está asignado, pero es necesario que también se asignen el tobillo izquierdo, el muslo izquierdo y el pecho, la cadera o la cintura!
|
||||
[1] El pie izquierdo está asignado, pero también es necesario que también se asignen el muslo izquierdo y el pecho, la cadera o la cintura!
|
||||
[2] El pie izquierdo está asignado, pero también es necesario que también se asignen el tobillo izquierdo y el pecho, la cadera o la cintura!
|
||||
[3] El pie izquierdo está asignado, pero también es necesario que también se asignen el pecho, la cadera o la cintura!
|
||||
[4] El pie izquierdo está asignado, pero también es necesario que también se asignen el tobillo izquierdo y el muslo izquierdo!
|
||||
[5] El pie izquierdo está asignado, pero también es necesario que también se asigne el muslo izquierdo!
|
||||
[6] El pie izquierdo está asignado, pero también es necesario que también se asigne el tobillo izquierdo!
|
||||
*[other] El pie izquierdo está asignado, pero también es necesario que también se asigne el Parte del cuerpo asignada desconocida.
|
||||
}
|
||||
# $unassigned (Number) - Bits are based on BodyAssignment.ASSIGNMENT_RULES order
|
||||
onboarding-assign_trackers-warning-RIGHT_FOOT =
|
||||
{ $unassigned ->
|
||||
[0] El pie derecho está asignado, pero es necesario que también se asignen el tobillo derecho, el muslo derecho y el pecho, la cadera o la cintura!
|
||||
[1] El pie derecho está asignado, pero es necesario que también se asignen el muslo derecho y el pecho, la cadera o la cintura!
|
||||
[2] El pie derecho está asignado, pero es necesario que también se asignen el tobillo derecho y el pecho, la cadera o la cintura!
|
||||
[3] El pie derecho está asignado, pero es necesario que también se asignen el pecho, la cadera o la cintura!
|
||||
[4] El pie derecho está asignado, pero es necesario que también se asignen tobillo derecho y el muslo derecho!
|
||||
[5] El pie derecho está asignado, pero es necesario que también se asigne el muslo derecho!
|
||||
[6] El pie derecho está asignado, pero es necesario que también se asigne el tobillo derecho!
|
||||
*[other] Pie derecho asignado, pero necesitas asignar Desconocido
|
||||
}
|
||||
|
||||
## Tracker mounting method choose
|
||||
|
||||
@@ -487,18 +620,25 @@ onboarding-automatic_mounting-preparation-title = Preparación
|
||||
|
||||
## Tracker proportions method choose
|
||||
|
||||
# Multiline string
|
||||
onboarding-choose_proportions-description =
|
||||
Las proporciones físicas se usan para saber las medidas de tu cuerpo. Son requeridas para calculas la posición de los trackers.
|
||||
Si las proporciones guardadas no coinciden con las reales, la calidad de tu tracking será peor y notaras fallos como deslizamiento, desplazamiento o tu cuerpo no coincidirá con tu avatar.
|
||||
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
|
||||
onboarding-choose_proportions-file_type = Archivo de proporciones físicas
|
||||
|
||||
## Tracker manual proportions setup
|
||||
|
||||
onboarding-manual_proportions-title = Proporciones físicas manuales
|
||||
onboarding-manual_proportions-auto = Proporciones automáticas
|
||||
|
||||
## Tracker automatic proportions setup
|
||||
|
||||
onboarding-automatic_proportions-title = Mide tu cuerpo
|
||||
onboarding-automatic_proportions-prev_step = Paso anterior
|
||||
onboarding-automatic_proportions-requirements-title = Requisitos
|
||||
onboarding-automatic_proportions-requirements-next = He leído los requisitos
|
||||
@@ -506,9 +646,14 @@ 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
|
||||
onboarding-automatic_proportions-done-title = Proporciones medidas y guardadas.
|
||||
onboarding-automatic_proportions-done-description = ¡Calibración de las proporciones físicas completada!
|
||||
|
||||
## Home
|
||||
|
||||
|
||||
## Trackers Still On notification
|
||||
|
||||
|
||||
## Status system
|
||||
|
||||
|
||||
@@ -144,6 +144,11 @@ widget-imu_visualizer-rotation_raw = Käsittelemätön
|
||||
widget-imu_visualizer-rotation_preview = Esikatselu
|
||||
widget-imu_visualizer-rotation_hide = Piilota
|
||||
|
||||
## Widget: Skeleton Visualizer
|
||||
|
||||
widget-skeleton_visualizer-preview = Luurangon esikatselu
|
||||
widget-skeleton_visualizer-hide = Piilota
|
||||
|
||||
## Tracker status
|
||||
|
||||
tracker-status-none = Ei tilaa
|
||||
@@ -152,6 +157,7 @@ tracker-status-error = Virhe
|
||||
tracker-status-disconnected = Katkaistu
|
||||
tracker-status-occluded = Peittynyt
|
||||
tracker-status-ok = OK
|
||||
tracker-status-timed_out = Aikakatkaistiin
|
||||
|
||||
## Tracker status columns
|
||||
|
||||
@@ -348,9 +354,14 @@ settings-general-fk_settings-leg_tweak-floor_clip-description = Floor clip voi v
|
||||
settings-general-fk_settings-leg_tweak-toe_snap-description = Toe snap yrittää arvata varpaiden asennon jos jalkaterän jäljitintä ei ole käytössä.
|
||||
settings-general-fk_settings-leg_tweak-foot_plant-description = Foot plant asettaa jalkateräsi yhdensuuntaisesti maan kanssa kosketuksessa.
|
||||
settings-general-fk_settings-leg_fk = Jalkojen jäljitys
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet = Jalkojen asennuksen nollaus
|
||||
settings-general-fk_settings-arm_fk = Käsivarsien jäljitys
|
||||
settings-general-fk_settings-arm_fk-description = Muuta tapaa, jolla käsivarsia jäljitetään.
|
||||
settings-general-fk_settings-arm_fk-force_arms = Pakota kädet HMD:ltä
|
||||
settings-general-fk_settings-arm_fk-back = Takaisin
|
||||
settings-general-fk_settings-arm_fk-tpose_up = T-asento (ylös)
|
||||
settings-general-fk_settings-arm_fk-tpose_down = T-asento (alas)
|
||||
settings-general-fk_settings-arm_fk-forward = Eteenpäin
|
||||
settings-general-fk_settings-skeleton_settings-toggles = Luurankoasetuksia
|
||||
settings-general-fk_settings-skeleton_settings-description = Ota tai poista käytöstä luurankoasetukset. On suositeltavaa jättää nämä päälle.
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine_model = Laajennettu selkärankamalli
|
||||
@@ -659,6 +670,7 @@ onboarding-assignment_tutorial = Kuinka valmistellaan Slime-jäljitin ennen käy
|
||||
onboarding-assignment_tutorial-first_step = 1. Aseta kehonosatarra (jos sinulla on) jäljittimeen valintasi mukaan
|
||||
# This text has a character limit of around 11 characters, so please keep it short
|
||||
onboarding-assignment_tutorial-sticker = Tarra
|
||||
onboarding-assignment_tutorial-second_step-v2 = 2. Kiinnitä hihna jäljittimeen pitäen hihnan tarranauhaa samaan suuntaan kuin jäljittimen etupuoli:
|
||||
onboarding-assignment_tutorial-second_step-continuation-v2 = Jatkeen tarranauhapuolen tulee olla ylöspäin seuraavan kuvan mukaisesti:
|
||||
onboarding-assignment_tutorial-done = Laitoin tarrat ja hihnat!
|
||||
|
||||
@@ -759,6 +771,8 @@ onboarding-choose_mounting-manual_mounting = Manuaalinen asennus
|
||||
# Italized text
|
||||
onboarding-choose_mounting-manual_mounting-label = Suositeltu
|
||||
onboarding-choose_mounting-manual_mounting-description = Näin voit valita asennussuunnan manuaalisesti kullekin jäljittimelle
|
||||
onboarding-choose_mounting-manual_modal-confirm = Tiedän mitä teen
|
||||
onboarding-choose_mounting-manual_modal-cancel = Peruuta
|
||||
|
||||
## Tracker manual mounting setup
|
||||
|
||||
@@ -794,6 +808,8 @@ onboarding-automatic_mounting-put_trackers_on-next = Minulla on kaikki jäljitti
|
||||
onboarding-choose_proportions = Mitä kalibrointimenetelmää käytetään?
|
||||
onboarding-choose_proportions-auto_proportions = Automaattiset mittasuhteet
|
||||
onboarding-choose_proportions-manual_proportions = Manuaaliset mittasuhteet
|
||||
onboarding-choose_proportions-import-failed = Epäonnistui
|
||||
onboarding-choose_proportions-file_type = Kehon mittasuhteet -tiedosto
|
||||
|
||||
## Tracker manual proportions setup
|
||||
|
||||
@@ -812,6 +828,9 @@ onboarding-automatic_proportions-put_trackers_on-next = Minulla on kaikki jälji
|
||||
onboarding-automatic_proportions-requirements-title = Vaatimukset
|
||||
onboarding-automatic_proportions-requirements-next = Olen lukenut vaatimukset
|
||||
onboarding-automatic_proportions-check_height-title = Tarkista pituutesi
|
||||
onboarding-automatic_proportions-check_height-description = Käytämme pituuttasi mittaustemme perustana käyttämällä HMD:n pituutta likiarvona todellisesta pituudestasi, mutta on parempi tarkistaa itse, ovatko ne oikein!
|
||||
# All the text is in bold!
|
||||
onboarding-automatic_proportions-check_height-calculation_warning = Paina painiketta <u>pystyasennossa</u> laskeaksesi pituutesi. Sinulla on 3 sekuntia painikkeen painamisen jälkeen!
|
||||
onboarding-automatic_proportions-check_height-fetch_height = Seison
|
||||
# Context is that the height is unknown
|
||||
onboarding-automatic_proportions-check_height-unknown = Tuntematon
|
||||
@@ -821,7 +840,9 @@ onboarding-automatic_proportions-check_height-hmd_height1 = HMD-korkeus on
|
||||
onboarding-automatic_proportions-check_height-height1 = Joten todellinen pituutesi on
|
||||
onboarding-automatic_proportions-check_height-next_step = Ne ovat hyvät
|
||||
onboarding-automatic_proportions-start_recording-title = Valmistaudu liikkumaan
|
||||
onboarding-automatic_proportions-start_recording-description = Aiomme nyt tallentaa joitain tiettyä asentoja ja liikkeitä. Näitä kysytään seuraavassa näytössä. Ole valmis aloittamaan, kun painat nappia!
|
||||
onboarding-automatic_proportions-start_recording-next = Aloita tallennus
|
||||
onboarding-automatic_proportions-recording-title = REC
|
||||
onboarding-automatic_proportions-recording-description-p0 = Tallennus käynnissä...
|
||||
onboarding-automatic_proportions-recording-description-p1 = Tee alla esitetyt liikkeet:
|
||||
onboarding-automatic_proportions-recording-processing = Käsitellään tuloksia
|
||||
@@ -835,15 +856,28 @@ onboarding-automatic_proportions-verify_results-title = Vahvista tulokset
|
||||
onboarding-automatic_proportions-verify_results-description = Tarkista alla olevat tulokset, näyttävätkö ne oikeilta?
|
||||
onboarding-automatic_proportions-verify_results-results = Tallennuksen tulokset
|
||||
onboarding-automatic_proportions-verify_results-processing = Käsitellään tuloksia
|
||||
onboarding-automatic_proportions-verify_results-redo = Tee tallennus uudelleen
|
||||
onboarding-automatic_proportions-verify_results-confirm = Nämä ovat oikein
|
||||
onboarding-automatic_proportions-done-title = Keho mitattu ja tallennettu.
|
||||
onboarding-automatic_proportions-done-description = Kehosi mittasuhteiden kalibrointi on valmis!
|
||||
onboarding-automatic_proportions-error_modal =
|
||||
<b>Varoitus:</b> Mittasuhteita arvioitaessa havaittiin virhe!
|
||||
<docs>Tarkista dokumentit</docs> tai liity <discord>Discordiin</discord> saadaksesi apua ^_^
|
||||
onboarding-automatic_proportions-error_modal-confirm = Ymmäretty!
|
||||
|
||||
## Home
|
||||
|
||||
home-no_trackers = Jäjittimiä ei havaittu tai määritetty
|
||||
|
||||
## Trackers Still On notification
|
||||
|
||||
trackers_still_on-modal-title = Jäljittimet ovat vielä päällä
|
||||
trackers_still_on-modal-description =
|
||||
Yksi tai useampi jäljitin on edelleen päällä.
|
||||
Haluatko silti poistua SlimeVR:stä?
|
||||
trackers_still_on-modal-confirm = Poistu SlimeVR:stä
|
||||
trackers_still_on-modal-cancel = Odota...
|
||||
|
||||
## Status system
|
||||
|
||||
status_system-StatusTrackerReset = On suositeltavaa suorittaa täydellinen nollaus, koska yhtä tai useampaa jäljitintä ei ole säädetty.
|
||||
|
||||
@@ -144,6 +144,11 @@ widget-imu_visualizer-rotation_raw = Brute
|
||||
widget-imu_visualizer-rotation_preview = Aperçu
|
||||
widget-imu_visualizer-rotation_hide = Masquer
|
||||
|
||||
## Widget: Skeleton Visualizer
|
||||
|
||||
widget-skeleton_visualizer-preview = Aperçu du squelette
|
||||
widget-skeleton_visualizer-hide = Masquer
|
||||
|
||||
## Tracker status
|
||||
|
||||
tracker-status-none = Pas de statut
|
||||
@@ -152,6 +157,7 @@ tracker-status-error = Erreur
|
||||
tracker-status-disconnected = Déconnecté
|
||||
tracker-status-occluded = Obstrué
|
||||
tracker-status-ok = OK
|
||||
tracker-status-timed_out = Délai expiré
|
||||
|
||||
## Tracker status columns
|
||||
|
||||
@@ -348,9 +354,20 @@ settings-general-fk_settings-leg_tweak-floor_clip-description = Le limitage au s
|
||||
settings-general-fk_settings-leg_tweak-toe_snap-description = La correction des orteils estime l'orientation de vos pieds si vous ne portez pas de capteurs sur ses derniers.
|
||||
settings-general-fk_settings-leg_tweak-foot_plant-description = La correction des pieds oriente vos pieds pour qu'ils soient parallèles au sol lorsqu'ils le touche.
|
||||
settings-general-fk_settings-leg_fk = Capture des jambes
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet-description = Activer la réinitialisation de l'alignement des pieds en allant sur la pointe des pieds.
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet = Réinitialisation de l'alignement des pieds
|
||||
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-arm_fk-reset_mode-description = Changer la pose des bras attendue pour la réinitialisation de l'alignement.
|
||||
settings-general-fk_settings-arm_fk-back = En arrière
|
||||
settings-general-fk_settings-arm_fk-back-description = Le mode par défaut, avec les bras vers l’arrière et les avant-bras vers l’avant.
|
||||
settings-general-fk_settings-arm_fk-tpose_up = T-pose (vers le haut)
|
||||
settings-general-fk_settings-arm_fk-tpose_up-description = S’attend à ce que vos bras soient vers le bas sur les côtés pendant la réinitialisation complète et à 90 degrés vers l'extérieur pendant la réinitialisation de l'alignement.
|
||||
settings-general-fk_settings-arm_fk-tpose_down = T-pose (vers le bas)
|
||||
settings-general-fk_settings-arm_fk-tpose_down-description = S’attend à ce que vos bras soient à 90 degrés vers l'extérieur pendant la réinitialisation complète et vers le bas sur les côtés pendant la réinitialisation de l'alignement.
|
||||
settings-general-fk_settings-arm_fk-forward = En avant
|
||||
settings-general-fk_settings-arm_fk-forward-description = S’attend à ce que vos bras soient levés 90 degrés vers l’avant. Utile pour le VTubing.
|
||||
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_model = Modèle de colonne vertébrale avancé
|
||||
@@ -364,6 +381,7 @@ settings-general-fk_settings-skeleton_settings-impute_hip_from_chest_legs = Inte
|
||||
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-skeleton_settings-interp_knee_ankle = Interpoler les rotations horizontales et de torsion des 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
|
||||
@@ -431,6 +449,9 @@ 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-connected_trackers_warning = Avertissement de capteurs connectés
|
||||
settings-general-interface-connected_trackers_warning-description = Cette option affichera une fenêtre contextuelle chaque fois que vous essaierez de quitter SlimeVR tout en ayant un ou plusieurs capteurs connectés. Il vous rappelle d’éteindre vos capteurs lorsque vous avez terminé pour préserver la durée de vie de la batterie.
|
||||
settings-general-interface-connected_trackers_warning-label = Avertissement de capteurs connectés en quittant
|
||||
|
||||
## Serial settings
|
||||
|
||||
@@ -760,6 +781,13 @@ onboarding-choose_mounting-manual_mounting = Alignement manuel
|
||||
# Italized text
|
||||
onboarding-choose_mounting-manual_mounting-label = Recommendée
|
||||
onboarding-choose_mounting-manual_mounting-description = Ceci vous permettra de choisir la direction de chaque capteur manuellement
|
||||
# Multiline text
|
||||
onboarding-choose_mounting-manual_modal-title =
|
||||
Êtes-vous sûr de vouloir faire
|
||||
la calibration automatique de l'alignement ?
|
||||
onboarding-choose_mounting-manual_modal-description = <b>La calibration manuel de l'alignement est recommandé pour les nouveaux utilisateurs</b>, car les poses de calibration automatique de l'alignement peuvent être difficiles à reproduire au départ et peuvent nécessiter un peu de pratique.
|
||||
onboarding-choose_mounting-manual_modal-confirm = Je suis sûr de ce que je fais
|
||||
onboarding-choose_mounting-manual_modal-cancel = Annuler
|
||||
|
||||
## Tracker manual mounting setup
|
||||
|
||||
@@ -800,15 +828,18 @@ 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-descriptionv2 =
|
||||
onboarding-choose_proportions-auto_proportions-descriptionv3 =
|
||||
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>
|
||||
<b>Cela nécessite d’avoir votre casque VR connecté à SlimeVR et sur votre tête !</b>
|
||||
onboarding-choose_proportions-manual_proportions = Proportions manuelles
|
||||
# Italized text
|
||||
onboarding-choose_proportions-manual_proportions-subtitle = Pour les retouches
|
||||
onboarding-choose_proportions-manual_proportions-description = Ceci vous permettra d'ajuster vos proportions manuellement en les modifiant directement
|
||||
onboarding-choose_proportions-export = Exporter les proportions
|
||||
onboarding-choose_proportions-import = Importer les proportions
|
||||
onboarding-choose_proportions-import-success = Importé
|
||||
onboarding-choose_proportions-import-failed = Raté
|
||||
onboarding-choose_proportions-file_type = Fichier de proportions
|
||||
|
||||
## Tracker manual proportions setup
|
||||
@@ -831,13 +862,12 @@ onboarding-automatic_proportions-put_trackers_on-description = Pour calibrer vos
|
||||
onboarding-automatic_proportions-put_trackers_on-next = J'ai tous mes capteurs
|
||||
onboarding-automatic_proportions-requirements-title = Exigences
|
||||
# Each line of text is a different list item
|
||||
onboarding-automatic_proportions-requirements-description =
|
||||
onboarding-automatic_proportions-requirements-descriptionv2 =
|
||||
Vous avez au moins assez de capteurs pour capturer vos pieds (généralement 5 capteurs).
|
||||
Vos capteurs et votre casque VR sont allumés.
|
||||
Vous portez vos capteurs et votre casque VR.
|
||||
Vos capteurs et votre casque VR sont connectés au serveur SlimeVR.
|
||||
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).
|
||||
Vos capteurs et votre casque VR sont allumés et sur vous.
|
||||
Vos capteurs et votre casque VR sont connectés au serveur SlimeVR et fonctionnent correctement (ex. pas de lag, déconnexions, etc).
|
||||
Votre casque envoie sa position au serveur SlimeVR (cela signifie généralement que SteamVR est ouvert et connecté à SlimeVR en utilisant le pilote SteamVR de SlimeVR).
|
||||
La capture des mouvements fonctionne et représente correctement vos mouvements (ex. vous avez effectué une réinitialisation complète des capteurs et ils bougent dans le bon sens lorsque vous donnez des coups de pieds, vous penchez, vous assoyez, etc).
|
||||
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 !
|
||||
@@ -889,6 +919,15 @@ onboarding-automatic_proportions-error_modal-confirm = Compris !
|
||||
|
||||
home-no_trackers = Aucun capteur détecté ou attribué
|
||||
|
||||
## Trackers Still On notification
|
||||
|
||||
trackers_still_on-modal-title = Capteurs encore allumés
|
||||
trackers_still_on-modal-description =
|
||||
Un ou plusieurs capteurs sont encore allumés.
|
||||
Voulez-vous quand même quitter SlimeVR ?
|
||||
trackers_still_on-modal-confirm = Quitter SlimeVR
|
||||
trackers_still_on-modal-cancel = Annuler...
|
||||
|
||||
## Status system
|
||||
|
||||
status_system-StatusTrackerReset = Il est recommandé d'effectuer une réinitialisation complète vu que un ou plusieurs capteurs sont ne sont pas ajustés.
|
||||
|
||||
@@ -110,13 +110,13 @@ bvh-recording = Registrazione in corso...
|
||||
## Tracking pause
|
||||
|
||||
tracking-unpaused = Pausa il tracking
|
||||
tracking-paused = Riprendio il tracking
|
||||
tracking-paused = Riprendi il tracking
|
||||
|
||||
## Widget: Overlay settings
|
||||
|
||||
widget-overlay = Overlay
|
||||
widget-overlay-is_visible_label = Mostra Overlay in SteamVR
|
||||
widget-overlay-is_mirrored_label = Includi uno specchio nel Overlay
|
||||
widget-overlay-is_mirrored_label = Mostra Overlay come specchio
|
||||
|
||||
## Widget: Drift compensation
|
||||
|
||||
@@ -144,6 +144,11 @@ widget-imu_visualizer-rotation_raw = Non processato
|
||||
widget-imu_visualizer-rotation_preview = Anteprima
|
||||
widget-imu_visualizer-rotation_hide = Nascondi
|
||||
|
||||
## Widget: Skeleton Visualizer
|
||||
|
||||
widget-skeleton_visualizer-preview = Anteprima dello scheletro
|
||||
widget-skeleton_visualizer-hide = Nascondi
|
||||
|
||||
## Tracker status
|
||||
|
||||
tracker-status-none = Nessuno stato
|
||||
@@ -152,6 +157,7 @@ tracker-status-error = Errore
|
||||
tracker-status-disconnected = Disconnesso
|
||||
tracker-status-occluded = Ostruito
|
||||
tracker-status-ok = OK
|
||||
tracker-status-timed_out = Tempo esaurito
|
||||
|
||||
## Tracker status columns
|
||||
|
||||
@@ -346,9 +352,20 @@ settings-general-fk_settings-leg_tweak-floor_clip-description = "Compenetrazione
|
||||
settings-general-fk_settings-leg_tweak-toe_snap-description = "Dita dei piedi piantate" prova ad indovinare la rotazione dei tuoi piedi quando non stai usando dei tracker per i piedi.
|
||||
settings-general-fk_settings-leg_tweak-foot_plant-description = "Piedi piantati" ruota i piedi in modo tale che siano paralleli al terreno quando in contatto con esso.
|
||||
settings-general-fk_settings-leg_fk = Tracking delle gambe
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet-description = Abilita Reset posizionamento dei piedi mettendosi in punta di piedi.
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet = Reset posizionamento dei piedi
|
||||
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-arm_fk-reset_mode-description = Cambia la posa delle braccia usata per il reset posizionamento.
|
||||
settings-general-fk_settings-arm_fk-back = Indietro
|
||||
settings-general-fk_settings-arm_fk-back-description = La modalità predefinita, con la parte superiori delle braccia che vanno indietro e le parte inferiori delle braccia che vanno avanti.
|
||||
settings-general-fk_settings-arm_fk-tpose_up = Posa a T (in alto)
|
||||
settings-general-fk_settings-arm_fk-tpose_up-description = Si aspetta che le braccia siano abbassate sui lati durante il Reset Completo e a 90 gradi con il busto ai lati per il Reset Posizionamento.
|
||||
settings-general-fk_settings-arm_fk-tpose_down = Posa a T (in basso)
|
||||
settings-general-fk_settings-arm_fk-tpose_down-description = Si aspetta che le braccia siano a 90 gradi con il busto ai lati durante il Reset Completo e abbassate sui lati per il Reset Posizionamento.
|
||||
settings-general-fk_settings-arm_fk-forward = Avanti
|
||||
settings-general-fk_settings-arm_fk-forward-description = Si aspetta che le tue braccia siano alzate di 90 gradi in avanti. Utile per VTubing.
|
||||
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_model = Modello di colonna vertebrale estesa
|
||||
@@ -362,6 +379,7 @@ settings-general-fk_settings-skeleton_settings-impute_hip_from_chest_legs = Impu
|
||||
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-skeleton_settings-interp_knee_ankle = Media dell'orientamento delle ginocchia 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
|
||||
@@ -430,6 +448,9 @@ 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-connected_trackers_warning = Avviso di tracker connessi
|
||||
settings-general-interface-connected_trackers_warning-description = Questa opzione mostrerà un pop-up ogni volta che proverai ad uscire da SmileVR mentre uno o più tracker sono connessi. Ció ti permetterà di ricordarti di spegnere i tuoi tracker per preservarne la durata delle batterie.
|
||||
settings-general-interface-connected_trackers_warning-label = Avviso di tracker connessi alla chiusura dell'applicazione
|
||||
|
||||
## Serial settings
|
||||
|
||||
@@ -759,6 +780,13 @@ onboarding-choose_mounting-manual_mounting = Posizionamento manuale
|
||||
# Italized text
|
||||
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
|
||||
# Multiline text
|
||||
onboarding-choose_mounting-manual_modal-title =
|
||||
Sei sicuro di voler fare
|
||||
la calibrazione automatica di posizionamento?
|
||||
onboarding-choose_mounting-manual_modal-description = <b>La calibrazione manuale è raccomandata per i nuovi utenti</b>, considerando che le pose necessarie per la calibrazione automatica di posizionamento possono risultare complicate al primo tentativo e potrebbero richiedere un po' di pratica.
|
||||
onboarding-choose_mounting-manual_modal-confirm = Sono sicurə di ciò che sto facendo.
|
||||
onboarding-choose_mounting-manual_modal-cancel = Annulla
|
||||
|
||||
## Tracker manual mounting setup
|
||||
|
||||
@@ -799,15 +827,18 @@ onboarding-choose_proportions-description =
|
||||
onboarding-choose_proportions-auto_proportions = Proporzioni automatiche
|
||||
# Italized text
|
||||
onboarding-choose_proportions-auto_proportions-subtitle = Raccomandato
|
||||
onboarding-choose_proportions-auto_proportions-descriptionv2 =
|
||||
onboarding-choose_proportions-auto_proportions-descriptionv3 =
|
||||
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>
|
||||
<b>Ciò richiede che il tuo visore (HMD) sia collegato a SlimeVR e indossato correttaments sulla tua testa</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-import = Importa le proporzioni del corpo
|
||||
onboarding-choose_proportions-import-success = Importate con successo
|
||||
onboarding-choose_proportions-import-failed = Importaggio fallito
|
||||
onboarding-choose_proportions-file_type = File delle proporzioni del corpo
|
||||
|
||||
## Tracker manual proportions setup
|
||||
@@ -830,12 +861,13 @@ onboarding-automatic_proportions-put_trackers_on-description = Per calibrare le
|
||||
onboarding-automatic_proportions-put_trackers_on-next = Sto indossando tutti i miei tracker
|
||||
onboarding-automatic_proportions-requirements-title = Requisiti
|
||||
# Each line of text is a different list item
|
||||
onboarding-automatic_proportions-requirements-description =
|
||||
onboarding-automatic_proportions-requirements-descriptionv2 =
|
||||
Hai almeno abbastanza tracker per tracciare i tuoi piedi (generalmente 5 tracker).
|
||||
Hai indossato i tuoi tracker e il visore.
|
||||
I tuoi tracker e il visore sono connessi al server di SlimeVR.
|
||||
I tuoi tracker e il visore stanno funzionando correttamente con il server di SlimeVR.
|
||||
Hai i tuoi tracker e il visore accessi e li stai indossando.
|
||||
I tuoi tracker e il visore sono connessi al server di SlimeVR e stanno funzionando correttamente (e.g. non si bloccano, disconnettono, etc.)
|
||||
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).
|
||||
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).
|
||||
Il tuo tracciamento funziona e rappresenta accuratamente i tuoi movimenti (e.g. hai eseguito un reset completo e i traker si muovono nella giusta direzione quando calci, ti pieghi, ti siedi, ecc.).
|
||||
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!
|
||||
@@ -887,6 +919,15 @@ onboarding-automatic_proportions-error_modal-confirm = Ho capito!
|
||||
|
||||
home-no_trackers = Nessun tracker rilevato o assegnato
|
||||
|
||||
## Trackers Still On notification
|
||||
|
||||
trackers_still_on-modal-title = I tracker sono ancora accesi
|
||||
trackers_still_on-modal-description =
|
||||
Uno o più tracker ancora accesi.
|
||||
Vuoi uscire comunque da SmileVR?
|
||||
trackers_still_on-modal-confirm = Chiudi SlimeVR
|
||||
trackers_still_on-modal-cancel = Attendi un momento...
|
||||
|
||||
## Status system
|
||||
|
||||
status_system-StatusTrackerReset = É consigliato eseguire un reset completo poiché uno o più tracker non sono regolati.
|
||||
|
||||
@@ -144,6 +144,11 @@ widget-imu_visualizer-rotation_raw = Raw
|
||||
widget-imu_visualizer-rotation_preview = 미리보기
|
||||
widget-imu_visualizer-rotation_hide = 숨기기
|
||||
|
||||
## Widget: Skeleton Visualizer
|
||||
|
||||
widget-skeleton_visualizer-preview = 골격 비율 미리보기
|
||||
widget-skeleton_visualizer-hide = 숨기기
|
||||
|
||||
## Tracker status
|
||||
|
||||
tracker-status-none = 알 수 없음
|
||||
@@ -152,6 +157,7 @@ tracker-status-error = 오류
|
||||
tracker-status-disconnected = 연결되지 않음
|
||||
tracker-status-occluded = 사용할 수 없음
|
||||
tracker-status-ok = 연결됨
|
||||
tracker-status-timed_out = 시간 초과
|
||||
|
||||
## Tracker status columns
|
||||
|
||||
@@ -330,7 +336,7 @@ settings-general-tracker_mechanics-drift_compensation-max_resets-label = 보정
|
||||
|
||||
## FK/Tracking settings
|
||||
|
||||
settings-general-fk_settings = FK 설정
|
||||
settings-general-fk_settings = 트래킹 설정
|
||||
# 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
|
||||
@@ -348,11 +354,34 @@ settings-general-fk_settings-leg_tweak-floor_clip-description = 플로어 클립
|
||||
settings-general-fk_settings-leg_tweak-toe_snap-description = 토 스냅은 발 트래커가 없을 때, 발 트래커가 있는 것처럼 예측해서 움직여주는 기능이에요.
|
||||
settings-general-fk_settings-leg_tweak-foot_plant-description = 풋 플랜트는 발이 바닥에 닿았을 때 바닥과 평평하게 회전시켜 줘요.
|
||||
settings-general-fk_settings-leg_fk = 발 트래킹
|
||||
settings-general-fk_settings-arm_fk = 팔 운동학
|
||||
settings-general-fk_settings-arm_fk-description = 팔이 추적되는 방식을 변경할 수 있어요.
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet-description = 까치발을 들어 발 트래커의 착용 방향 정렬을 활성화하기
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet = 발 트래커 착용 방향 정렬
|
||||
settings-general-fk_settings-arm_fk = 팔 트래킹
|
||||
settings-general-fk_settings-arm_fk-description = 손 컨트롤러 위치 데이터를 사용할 수 없는 경우에도 VR 헤드셋(HMD)으로부터 팔을 추적하도록 할 수 있어요.
|
||||
settings-general-fk_settings-arm_fk-force_arms = 팔을 HMD에서만 받아오기
|
||||
settings-general-fk_settings-arm_fk-reset_mode-description = 착용 방향 정렬에 사용되는 팔 자세 설정
|
||||
settings-general-fk_settings-arm_fk-back = 뒤쪽
|
||||
settings-general-fk_settings-arm_fk-back-description = 기본값. 위쪽 팔은 뒤를 향하고 아래쪽 팔은 앞을 향하게 하는 자세.
|
||||
settings-general-fk_settings-arm_fk-tpose_up = T-포즈(올리기)
|
||||
settings-general-fk_settings-arm_fk-tpose_up-description = 전체 정렬을 수행할 때에는 팔을 차렷 자세로 내리고, 착용 방향 정렬 중에는 팔을 좌우로 나란히 동작으로 펼치는 자세.
|
||||
settings-general-fk_settings-arm_fk-tpose_down = T-포즈(내리기)
|
||||
settings-general-fk_settings-arm_fk-tpose_down-description = 전체 정렬에서는 좌우로 나란히 자세, 착용 방향 정렬에서는 팔을 차렷 동작으로 내리는 자세
|
||||
settings-general-fk_settings-arm_fk-forward = 앞쪽
|
||||
settings-general-fk_settings-arm_fk-forward-description = 앞으로 나란히 자세. 앉아있거나 버튜버 활동 등에서 유용해요.
|
||||
settings-general-fk_settings-skeleton_settings-toggles = 골격 설정 제어
|
||||
settings-general-fk_settings-skeleton_settings-description = 골격 설정을 설정하거나 해제해요. 이것들은 켜두는 게 좋아요.
|
||||
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-skeleton_settings-interp_knee_ankle = 무릎 각도를 계산할 때 발목 각도를 합산
|
||||
settings-general-fk_settings-self_localization-title = Mocap 모드
|
||||
settings-general-fk_settings-self_localization-description = Mocap 모드에서는 헤드셋이나 다른 트래커 없이 골격이 자신의 위치를 대략적으로 추적할 수 있어요. 발과 머리 트래커가 필요하고 아직 실험적이에요.
|
||||
settings-general-fk_settings-vive_emulation-title = VIVE 에뮬레이션
|
||||
@@ -415,6 +444,9 @@ 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-connected_trackers_warning = 작동 중인 트래커 경고
|
||||
settings-general-interface-connected_trackers_warning-description = 이 옵션은 트래커가 연결되어 있는 채로 SlimeVR을 종료하려고 할 때 팝업을 표시합니다. 그렇게 하면 실수로 트래커를 끄지 않아 배터리가 방전되는 일을 예방할 수 있어요.
|
||||
settings-general-interface-connected_trackers_warning-label = 종료 시 작동 중인 트래커 경고 활성화
|
||||
|
||||
## Serial settings
|
||||
|
||||
@@ -633,7 +665,11 @@ onboarding-calibration_tutorial-subtitle = 트래커 틀어짐을 줄이는 데
|
||||
onboarding-calibration_tutorial-description =
|
||||
매번 트래커의 전원을 켤 때마다 평평한 바닥에 트래커를 두고 잠시 기다려서 보정을 수행해야 해요. <b>(트래커를 움직이지 마세요!)</b>
|
||||
어떻게 하면 되는지 "{ onboarding-calibration_tutorial-calibrate }"를 눌러 같이 따라해보죠!
|
||||
onboarding-calibration_tutorial-calibrate = 트래커들을 책상에 올려놓았습니다
|
||||
onboarding-calibration_tutorial-status-waiting = 대기 중
|
||||
onboarding-calibration_tutorial-status-calibrating = 캘리브레이팅
|
||||
onboarding-calibration_tutorial-status-success = 좋아요!
|
||||
onboarding-calibration_tutorial-status-error = 트래커가 움직였습니다
|
||||
|
||||
## Tracker assignment tutorial
|
||||
|
||||
@@ -641,8 +677,8 @@ onboarding-assignment_tutorial = 슬라임 트래커를 착용하기 전에 준
|
||||
onboarding-assignment_tutorial-first_step = 1. 신체 부위가 적힌 스티커를 가지고 있다면 트래커에 붙여보세요
|
||||
# This text has a character limit of around 11 characters, so please keep it short
|
||||
onboarding-assignment_tutorial-sticker = 스티커
|
||||
onboarding-assignment_tutorial-second_step = 2. 스트랩의 벨크로 테이프 쪽을 그림과 같은 방향으로 유지하면서 스트랩을 트래커에 끼우세요:
|
||||
onboarding-assignment_tutorial-second_step-continuation = 익스텐션 트래커의 벨크로 테이프는 다음과 같은 방향으로 끼워주세요:
|
||||
onboarding-assignment_tutorial-second_step-v2 = 스트랩의 벨크로 접착면이 Slime 얼굴 그림 쪽을 향하게 끼워주세요:
|
||||
onboarding-assignment_tutorial-second_step-continuation-v2 = 확장 모듈의 벨크로 접착면이 다음 이미지처럼 위를 바라봐야 합니다:
|
||||
onboarding-assignment_tutorial-done = 스트랩과 스티커를 트래커에 잘 부착했어요!
|
||||
|
||||
## Tracker assignment setup
|
||||
@@ -731,9 +767,18 @@ onboarding-choose_mounting = 착용 방향을 정렬하기 위해 어떤 방법
|
||||
# Multiline text
|
||||
onboarding-choose_mounting-description = 착용 방향 정렬은 트래커가 몸에 착용된 방향을 찾아 수정하도록 도와줘요.
|
||||
onboarding-choose_mounting-auto_mounting = 자동으로 방향 설정
|
||||
# Italized text
|
||||
onboarding-choose_mounting-auto_mounting-label = 실험적
|
||||
onboarding-choose_mounting-auto_mounting-description = 이렇게 하면 두 가지 자세로 모든 트래커의 착용 방향을 자동으로 설정할 수 있어요
|
||||
onboarding-choose_mounting-manual_mounting = 수동으로 방향 설정
|
||||
# Italized text
|
||||
onboarding-choose_mounting-manual_mounting-label = 권장됨
|
||||
onboarding-choose_mounting-manual_mounting-description = 이렇게 하면 각 트래커의 착용 방향을 직접 고를 수 있어요
|
||||
# Multiline text
|
||||
onboarding-choose_mounting-manual_modal-title = 자동으로 착용 방향을 설정하시겠어요?
|
||||
onboarding-choose_mounting-manual_modal-description = 자동 착용 방향 정렬은 복잡한 자세와 올바르게 설정된 트래커가 필요하기 때문에 처음 사용하시는 분에게는 조금 어려울 수 있어요. 그래서 <b>수동 착용 방향 정렬을 추천드려요!</b>
|
||||
onboarding-choose_mounting-manual_modal-confirm = 네, 알고 있어요!
|
||||
onboarding-choose_mounting-manual_modal-cancel = 취소
|
||||
|
||||
## Tracker manual mounting setup
|
||||
|
||||
@@ -767,14 +812,25 @@ onboarding-automatic_mounting-put_trackers_on-next = 모든 트래커를 착용
|
||||
## Tracker proportions method choose
|
||||
|
||||
onboarding-choose_proportions = 신체 비율을 설정하기 위해 어떤 방법을 사용할래요?
|
||||
# Multiline string
|
||||
onboarding-choose_proportions-description =
|
||||
신체 비율은 신체 각 부분의 길이를 파악하는데 사용됩니다. 이 값은 트래커의 위치를 정확히 계산하기 위해 필수적입니다.
|
||||
신체 비율이 저장된 비율과 일치하지 않으면 추적 정밀도가 떨어지고 스케이트를 타거나 미끄러지는 것처럼 보이고 아바타와 실제 몸이 잘 일치하지 않을 수 있어요.
|
||||
onboarding-choose_proportions-auto_proportions = 자동으로 비율 설정
|
||||
# Italized text
|
||||
onboarding-choose_proportions-auto_proportions-subtitle = 권장
|
||||
onboarding-choose_proportions-auto_proportions-descriptionv3 =
|
||||
몸을 이리저리 움직여 샘플을 기록한 다음 알고리즘을 통해 연산하는 방식으로 신체 비율을 추산합니다.
|
||||
<b>사용하기 위해서는 VR 헤드셋이 SlimeVR과 연결되어 있어야 해요</b>
|
||||
onboarding-choose_proportions-manual_proportions = 수동으로 비율 설정
|
||||
# Italized text
|
||||
onboarding-choose_proportions-manual_proportions-subtitle = 정밀하게 설정하고 싶다면
|
||||
onboarding-choose_proportions-manual_proportions-description = 이렇게 하면 신체 비율을 직접 수정하여 수동으로 조절할 수 있어요
|
||||
onboarding-choose_proportions-manual_proportions-description = 이 옵션을 사용하면 신체 비율을 직접 입력해 수동으로 조절할 수 있어요.
|
||||
onboarding-choose_proportions-export = 다른 이름으로 저장
|
||||
onboarding-choose_proportions-import = 신체 비율 가져오기
|
||||
onboarding-choose_proportions-import-success = 가져오기 완료
|
||||
onboarding-choose_proportions-import-failed = 가져오기 실패
|
||||
onboarding-choose_proportions-file_type = 신체 비율 파일
|
||||
|
||||
## Tracker manual proportions setup
|
||||
|
||||
@@ -793,18 +849,29 @@ onboarding-automatic_proportions-manual = 수동 신체 비율 설정
|
||||
onboarding-automatic_proportions-prev_step = 뒤로
|
||||
onboarding-automatic_proportions-put_trackers_on-title = 트래커를 착용하세요
|
||||
onboarding-automatic_proportions-put_trackers_on-description = 비율을 조정하기 위해 방금 할당한 트래커를 사용할 거예요. 모든 트래커를 착용하면 오른쪽 그림에서 어떤 것이 있는지 알 수 있어요.
|
||||
onboarding-automatic_proportions-put_trackers_on-next = 트래커를 다 착용했어요
|
||||
onboarding-automatic_proportions-put_trackers_on-next = 트래커를 모두 착용했어요
|
||||
onboarding-automatic_proportions-requirements-title = 요구사항
|
||||
# Each line of text is a different list item
|
||||
onboarding-automatic_proportions-requirements-description =
|
||||
발까지 추적할 수 있는 적어도 5개의 트래커가 있어야 해요.
|
||||
전원이 켜진 트래커와 헤드셋이 필요해요.
|
||||
트래커와 헤드셋을 착용하고 있어야 해요.
|
||||
트래커와 헤드셋이 SlimeVR 서버와 연결되어 있어야 해요.
|
||||
트래커와 헤드셋이 SlimeVR 서버에서 제대로 작동하고 있어야 해요.
|
||||
헤드셋이 SlimeVR 서버에 위치 데이터를 보고하고 있어야 해요. (SteamVR이 실행 중이고 SlimeVR의 SteamVR 드라이버를 사용하여 SlimeVR에 연결되어 있어야 해요).
|
||||
onboarding-automatic_proportions-requirements-descriptionv2 =
|
||||
다리를 추적하기 위해 최소 5개 이상의 트래커를 착용하세요.
|
||||
VR 헤드셋을 착용하세요.
|
||||
VR 헤드셋과 컨트롤러의 위치 정보가 SlimeVR 서버에 실시간으로 표시되는지 확인하세요.
|
||||
SlimeVR 서버에 연결된 트래커와 VR 헤드셋이 끊김이나 렉 없이 제대로 표시되는지 확인하세요. (이것은 SteamVR이 실행 중이며 SlimeVR의 SteamVR 드라이버를 사용하여 SlimeVR에 올바르게 연결되어 있다는 것을 의미합니다)
|
||||
트래커의 제대로 작동하고 나의 움직임을 올바르게 반영중인지 확인하세요. (예: 전체 정렬을 수행했으며 발차기, 허리 숙이기, 앉기 등 올바른 방향으로 움직임)
|
||||
onboarding-automatic_proportions-requirements-next = 요구사항을 모두 읽었어요
|
||||
onboarding-automatic_proportions-start_recording-title = 움직일 준비
|
||||
onboarding-automatic_proportions-check_height-title = 키를 확인하세요
|
||||
onboarding-automatic_proportions-check_height-description = 이 과정에서는 VR 헤드셋(HMD)의 높이를 사용하여 실제 키의 대략적인 값으로 삼고, 이를 측정의 기준으로 활용합니다. 하지만 직접 확인하는 것이 더 정확해요!
|
||||
# All the text is in bold!
|
||||
onboarding-automatic_proportions-check_height-calculation_warning = 버튼을 누른 후 3초 이내에 <u>바르게 서서</u> 키를 측정해 주세요!
|
||||
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-hmd_height1 = VR 헤드셋(HMD) 높이
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-height1 = 실제 키
|
||||
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 = 기록 시작하기
|
||||
onboarding-automatic_proportions-recording-title = REC
|
||||
@@ -832,18 +899,28 @@ 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> 서버에서 도움을 받으세요 ^_^
|
||||
onboarding-automatic_proportions-error_modal-confirm = 이해했어요!
|
||||
|
||||
## Home
|
||||
|
||||
home-no_trackers = 감지되거나 할당된 트래커가 없어요.
|
||||
|
||||
## Trackers Still On notification
|
||||
|
||||
trackers_still_on-modal-title = 트래커가 아직 켜져 있어요!
|
||||
trackers_still_on-modal-description = 하나 이상의 트래커가 여전히 켜져 있는 것으로 보여요. SlimeVR을 종료할까요?
|
||||
trackers_still_on-modal-confirm = SlimeVR 종료
|
||||
trackers_still_on-modal-cancel = 돌아가기
|
||||
|
||||
## Status system
|
||||
|
||||
status_system-StatusTrackerReset = 아직 정렬되지 않은 트래커가 있어서 전체 정렬을 수행해주세요.
|
||||
status_system-StatusTrackerReset = 전체 정렬을 수행해 아직 정렬되지 않은 트래커를 정렬해주세요.
|
||||
status_system-StatusSteamVRDisconnected =
|
||||
{ $type ->
|
||||
[steamvr_feeder] SlimeVR 피더와 통신할 수 없어요.
|
||||
*[other] SlimeVR 드라이버를 통해 SteamVR과 통신할 수 없어요.
|
||||
[steamvr_feeder] SlimeVR 피더와 연결되지 않음
|
||||
*[other] SlimeVR 드라이버가 SteamVR과 연결되지 않음
|
||||
}
|
||||
status_system-StatusTrackerError = { $trackerName } 트래커에 문제가 발생했어요.
|
||||
|
||||
@@ -144,6 +144,11 @@ widget-imu_visualizer-rotation_raw = Rauw
|
||||
widget-imu_visualizer-rotation_preview = Preview
|
||||
widget-imu_visualizer-rotation_hide = Verbergen
|
||||
|
||||
## Widget: Skeleton Visualizer
|
||||
|
||||
widget-skeleton_visualizer-preview = Skelet voorbeeld
|
||||
widget-skeleton_visualizer-hide = Verbergen
|
||||
|
||||
## Tracker status
|
||||
|
||||
tracker-status-none = Geen status
|
||||
@@ -152,6 +157,7 @@ tracker-status-error = Fout
|
||||
tracker-status-disconnected = Verbinding verbroken
|
||||
tracker-status-occluded = Verborgen
|
||||
tracker-status-ok = OK
|
||||
tracker-status-timed_out = Timed Out
|
||||
|
||||
## Tracker status columns
|
||||
|
||||
@@ -350,9 +356,20 @@ settings-general-fk_settings-leg_tweak-floor_clip-description =
|
||||
settings-general-fk_settings-leg_tweak-toe_snap-description = Toe-snap probeert de rotatie van uw voeten te raden als voet-trackers niet worden gebruikt.
|
||||
settings-general-fk_settings-leg_tweak-foot_plant-description = Foot-plant roteert je voeten zodat ze evenwijdig aan de grond zijn wanneer ze in contact zijn.
|
||||
settings-general-fk_settings-leg_fk = Been tracking
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet-description = Schakel Montage Reset voor de voeten in door op je tenen te staan.
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet = Voeten montage reset.
|
||||
settings-general-fk_settings-arm_fk = Arm tracking
|
||||
settings-general-fk_settings-arm_fk-description = Verander de manier waarop de armen worden getrackt.
|
||||
settings-general-fk_settings-arm_fk-force_arms = Dwing armen vanuit HMD
|
||||
settings-general-fk_settings-arm_fk-reset_mode-description = Pas de verwachte armhouding aan voor het resetten van de montage.
|
||||
settings-general-fk_settings-arm_fk-back = Achterzijde
|
||||
settings-general-fk_settings-arm_fk-back-description = De standaardmodus, waarbij de bovenarmen naar achteren gaan en de onderarmen naar voren.
|
||||
settings-general-fk_settings-arm_fk-tpose_up = T-pose (omhoog)
|
||||
settings-general-fk_settings-arm_fk-tpose_up-description = Verwacht je armen langs je zeiden te hangen tijdens een volledige reset, en 90 graden omhoog langs je zeiden tijdens een Montage Reset.
|
||||
settings-general-fk_settings-arm_fk-tpose_down = T-pose (omlaag)
|
||||
settings-general-fk_settings-arm_fk-tpose_down-description = Verwacht dat je armen 90 graden naar de zijkanten zijn tijdens een Volledige reset, en aan de zijkanten naar beneden tijdens een montage reset.
|
||||
settings-general-fk_settings-arm_fk-forward = Voorwaards
|
||||
settings-general-fk_settings-arm_fk-forward-description = Verwacht dat je armen 90 graden naar voren staan. Handig voor VTubing.
|
||||
settings-general-fk_settings-skeleton_settings-toggles = Skelet schakelaars
|
||||
settings-general-fk_settings-skeleton_settings-description = Schakel skeleton instellingen in of uit. Het is aanbevolen om deze aan te laten.
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine_model = Uitgebreid ruggengraat model
|
||||
@@ -366,6 +383,7 @@ settings-general-fk_settings-skeleton_settings-impute_hip_from_chest_legs = Bere
|
||||
settings-general-fk_settings-skeleton_settings-impute_hip_from_waist_legs = Bereken heup van taille naar benen
|
||||
settings-general-fk_settings-skeleton_settings-interp_hip_legs = Bereken het gemiddelde van de 'yaw en roll van de heup met die van de benen'
|
||||
settings-general-fk_settings-skeleton_settings-interp_knee_tracker_ankle = Bereken het gemiddelde van de 'yaw en roll van de knie trackers met die van de enkels'
|
||||
settings-general-fk_settings-skeleton_settings-interp_knee_ankle = Bereken het gemiddelde van de 'yaw en roll van de knie trackers met die van de enkels'
|
||||
settings-general-fk_settings-self_localization-title = Mocap modus
|
||||
settings-general-fk_settings-self_localization-description = Mocap modus staat het skelet model toe om zijn eigen positie te bepalen zonder het gebruik van een headset of andere trackers. Dit vergt wel het gebruik van voet en hoofd trackers, dit is momenteel nog expirimenteel.
|
||||
settings-general-fk_settings-vive_emulation-title = Vive-emulatie
|
||||
@@ -433,6 +451,8 @@ settings-general-interface-feedback_sound = Feedback geluid
|
||||
settings-general-interface-feedback_sound-description = Speelt een geluid telkens de reset wordt uitgevoerd
|
||||
settings-general-interface-feedback_sound-label = Feedback geluid
|
||||
settings-general-interface-feedback_sound-volume = Feedback geluid volume
|
||||
settings-general-interface-connected_trackers_warning = Waarschuwing voor verbonden trackers
|
||||
settings-general-interface-connected_trackers_warning-label = Waarschuwing voor verbonden trackers bij het afsluiten
|
||||
|
||||
## Serial settings
|
||||
|
||||
@@ -661,8 +681,8 @@ onboarding-assignment_tutorial = Hoe een Slime Tracker voor te bereiden voordat
|
||||
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-second_step-v2 = Bevestig de strap aan de tracker met de klittenbandzijde in dezelfde richting als de voorzijde van de tracker:
|
||||
onboarding-assignment_tutorial-second_step-continuation-v2 = De klittenbandzijde van de extensie moet naar boven gericht zijn, zoals in de foto afgebeeld:
|
||||
onboarding-assignment_tutorial-done = Ik heb stickers en riemen geplaatst!
|
||||
|
||||
## Tracker assignment setup
|
||||
@@ -762,6 +782,8 @@ onboarding-choose_mounting-manual_mounting = Handmatige bevestiging
|
||||
# Italized text
|
||||
onboarding-choose_mounting-manual_mounting-label = Aanbevolen
|
||||
onboarding-choose_mounting-manual_mounting-description = Hiermee kunt u de montagerichting handmatig kiezen voor elke tracker
|
||||
onboarding-choose_mounting-manual_modal-confirm = Ik weet zeker wat ik doe
|
||||
onboarding-choose_mounting-manual_modal-cancel = Annuleren
|
||||
|
||||
## Tracker manual mounting setup
|
||||
|
||||
@@ -800,14 +822,14 @@ onboarding-choose_proportions-description = Lichaamsverhoudingen worden gebruikt
|
||||
onboarding-choose_proportions-auto_proportions = Automatische verhoudingen
|
||||
# Italized text
|
||||
onboarding-choose_proportions-auto_proportions-subtitle = Aanbevolen
|
||||
onboarding-choose_proportions-auto_proportions-descriptionv2 =
|
||||
Dit zal je proporties gokken met jouw bewegingen op basis van een opname, waarna deze door een algoritme gehaald worden.
|
||||
<b>Hiervoor moet een HMD verbonden zijn aan SlimeVR!</b>
|
||||
onboarding-choose_proportions-manual_proportions = Handmatige lichaamsverhoudingen
|
||||
# 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-import = Importeer proporties
|
||||
onboarding-choose_proportions-import-success = geïmporteerd
|
||||
onboarding-choose_proportions-import-failed = Mislukt
|
||||
onboarding-choose_proportions-file_type = Lichaamsproporties bestand
|
||||
|
||||
## Tracker manual proportions setup
|
||||
@@ -829,14 +851,6 @@ onboarding-automatic_proportions-put_trackers_on-title = Doe je trackers aan
|
||||
onboarding-automatic_proportions-put_trackers_on-description = Om je verhoudingen te kalibreren, gaan we gebruik maken van de trackers die je net hebt toegewezen. Doe al je trackers aan, je kunt zien welke trackers welke zijn in de figuur rechts.
|
||||
onboarding-automatic_proportions-put_trackers_on-next = Ik heb al mijn trackers aan
|
||||
onboarding-automatic_proportions-requirements-title = Vereisten
|
||||
# Each line of text is a different list item
|
||||
onboarding-automatic_proportions-requirements-description =
|
||||
Je hebt in ieder geval genoeg trackers om je voeten te volgen (over het algemeen 5 trackers).
|
||||
Je hebt je trackers en headset op.
|
||||
Je draagt je trackers en headset.
|
||||
Je trackers en headset zijn verbonden met de SlimeVR server.
|
||||
Je trackers en headset werken goed binnen de SlimeVR server.
|
||||
Je headset rapporteert positiegegevens aan de SlimeVR-server (dit betekent over het algemeen dat SteamVR wordt uitgevoerd en verbonden met SlimeVR met behulp van SlimeVR's SteamVR-stuurprogramma).
|
||||
onboarding-automatic_proportions-requirements-next = Ik heb de vereisten gelezen
|
||||
onboarding-automatic_proportions-check_height-title = Controleer je lengte
|
||||
onboarding-automatic_proportions-check_height-description =
|
||||
@@ -890,6 +904,15 @@ onboarding-automatic_proportions-error_modal-confirm = Begrepen!
|
||||
|
||||
home-no_trackers = Geen trackers gedetecteerd of toegewezen
|
||||
|
||||
## Trackers Still On notification
|
||||
|
||||
trackers_still_on-modal-title = Trackers staan nog steeds aan
|
||||
trackers_still_on-modal-description =
|
||||
Een of meer trackers staan nog aan.
|
||||
Wil je SlimeVR toch afsluiten?
|
||||
trackers_still_on-modal-confirm = SlimeVR afsluiten
|
||||
trackers_still_on-modal-cancel = Wacht even...
|
||||
|
||||
## Status system
|
||||
|
||||
status_system-StatusTrackerReset = Het wordt aanbevolen om een volledige reset uit te voeren omdat een of meer trackers niet zijn aangepast.
|
||||
|
||||
@@ -144,6 +144,11 @@ widget-imu_visualizer-rotation_raw = Raw
|
||||
widget-imu_visualizer-rotation_preview = Podgląd
|
||||
widget-imu_visualizer-rotation_hide = Ukryj
|
||||
|
||||
## Widget: Skeleton Visualizer
|
||||
|
||||
widget-skeleton_visualizer-preview = Podgląd szkieletu
|
||||
widget-skeleton_visualizer-hide = Ukryj
|
||||
|
||||
## Tracker status
|
||||
|
||||
tracker-status-none = Brak Statusu
|
||||
@@ -348,9 +353,20 @@ settings-general-fk_settings-leg_tweak-floor_clip-description = Floor-clip może
|
||||
settings-general-fk_settings-leg_tweak-toe_snap-description = Toe-snap próbuje odgadnąć obrót twoich stóp, jeśli trackery stóp nie są używane.
|
||||
settings-general-fk_settings-leg_tweak-foot_plant-description = Foot-plant obraca stopy, aby były równoległe do podłoża podczas kontaktu.
|
||||
settings-general-fk_settings-leg_fk = Śledzenie nóg
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet-description = Włącz resetowanie montażu stóp, chodząc na palcach.
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet = Reset mocowania stóp
|
||||
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-arm_fk-reset_mode-description = Zmień pozycję ramienia oczekiwaną przy resetowaniu montażu.
|
||||
settings-general-fk_settings-arm_fk-back = Wstecz
|
||||
settings-general-fk_settings-arm_fk-back-description = Tryb domyślny, w którym górne ramiona cofają się, a dolne ramiona przesuwają się do przodu.
|
||||
settings-general-fk_settings-arm_fk-tpose_up = T-pose (w górę)
|
||||
settings-general-fk_settings-arm_fk-tpose_up-description = Oczekuje, że podczas pełnego resetu twoje ramiona będą opuszczone na boki w 90 stopni w górę podczas resetu montażowego.
|
||||
settings-general-fk_settings-arm_fk-tpose_down = T-pose (w dół)
|
||||
settings-general-fk_settings-arm_fk-tpose_down-description = Oczekuje, że Twoje ramiona będą ustawione pod kątem w 90 stopni na boki podczas Pełnego Resetu i w dół po bokach podczas Resetu Montażowego.
|
||||
settings-general-fk_settings-arm_fk-forward = Do przodu
|
||||
settings-general-fk_settings-arm_fk-forward-description = Oczekuje, że Twoje ramiona będą uniesione pod kątem 90 stopni do przodu. Przydatne w VTubingu.
|
||||
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_model = Wydłużony model kręgosłupa
|
||||
@@ -364,6 +380,7 @@ settings-general-fk_settings-skeleton_settings-impute_hip_from_chest_legs = Przy
|
||||
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-skeleton_settings-interp_knee_ankle = Średnie odchylenie kolan i przechylenie 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
|
||||
@@ -435,6 +452,9 @@ 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-connected_trackers_warning = Ostrzeżenie o podłączonych trackerach
|
||||
settings-general-interface-connected_trackers_warning-description = Ta opcja wyświetli wyskakujące okienko za każdym razem, gdy spróbujesz wyjść ze SlimeVR, mając jeden lub więcej podłączonych trackerów. Przypomina o wyłączeniu trackerów, gdy skończysz, aby wydłużyć żywotność baterii.
|
||||
settings-general-interface-connected_trackers_warning-label = Ostrzeżenie o podłączonych trackerach przy wyjściu
|
||||
|
||||
## Serial settings
|
||||
|
||||
@@ -665,6 +685,7 @@ onboarding-assignment_tutorial = Jak przygotować Slime Tracker przed założeni
|
||||
onboarding-assignment_tutorial-first_step = 1. Umieść naklejkę z częścią ciała (jeśli ją posiadasz) na trackerze według własnego uznania
|
||||
# This text has a character limit of around 11 characters, so please keep it short
|
||||
onboarding-assignment_tutorial-sticker = Naklejka
|
||||
onboarding-assignment_tutorial-second_step-v2 = 2. Przymocuj pasek do trackera, tak aby rzep paska był skierowany w tę samą stronę, co slime face część trackera:
|
||||
onboarding-assignment_tutorial-second_step-continuation-v2 = Strona z rzepem dla przedłużenia powinna być skierowana do góry, jak na poniższym obrazku:
|
||||
onboarding-assignment_tutorial-done = Umieszczam naklejki i paski!
|
||||
|
||||
@@ -767,6 +788,13 @@ onboarding-choose_mounting-manual_mounting = Montaż ręczny
|
||||
# Italized text
|
||||
onboarding-choose_mounting-manual_mounting-label = Zalecany
|
||||
onboarding-choose_mounting-manual_mounting-description = Umożliwi to ręczne wybranie kierunku montażu dla każdego trackera
|
||||
# Multiline text
|
||||
onboarding-choose_mounting-manual_modal-title =
|
||||
Czy na pewno chcesz to zrobić
|
||||
automatyczna kalibracja montażu?
|
||||
onboarding-choose_mounting-manual_modal-description = <b> Ręczna kalibracja montażu jest zalecana dla nowych użytkowników </b> , ponieważ prawidłowe ustawienie pozycji automatycznej kalibracji montażu może być trudne i może wymagać pewnej praktyki.
|
||||
onboarding-choose_mounting-manual_modal-confirm = Jestem pewien tego, co robię
|
||||
onboarding-choose_mounting-manual_modal-cancel = Anuluj
|
||||
|
||||
## Tracker manual mounting setup
|
||||
|
||||
@@ -816,6 +844,9 @@ onboarding-choose_proportions-manual_proportions = Ręczne proporcje
|
||||
onboarding-choose_proportions-manual_proportions-subtitle = Drobne detale
|
||||
onboarding-choose_proportions-manual_proportions-description = Umożliwi to ręczne dostosowanie proporcji poprzez ich bezpośrednią modyfikację
|
||||
onboarding-choose_proportions-export = Eksportuj proporcje
|
||||
onboarding-choose_proportions-import = Importuj proporcje
|
||||
onboarding-choose_proportions-import-success = Importowane
|
||||
onboarding-choose_proportions-import-failed = Niepowodzenie
|
||||
onboarding-choose_proportions-file_type = Proporcje ciała
|
||||
|
||||
## Tracker manual proportions setup
|
||||
@@ -898,6 +929,15 @@ onboarding-automatic_proportions-error_modal-confirm = Zrozumiano!
|
||||
|
||||
home-no_trackers = Nie wykryto trackerów
|
||||
|
||||
## Trackers Still On notification
|
||||
|
||||
trackers_still_on-modal-title = Trackery nadal włączone
|
||||
trackers_still_on-modal-description =
|
||||
Jeden lub więcej modułów śledzących jest nadal włączonych.
|
||||
Czy nadal chcesz wyjść ze SlimeVR?
|
||||
trackers_still_on-modal-confirm = Wyjdź ze SlimeVR
|
||||
trackers_still_on-modal-cancel = Poczekaj!
|
||||
|
||||
## Status system
|
||||
|
||||
status_system-StatusTrackerReset = Zaleca się wykonanie pełnego resetu, ponieważ jeden lub więcej trackerów nie jest wyregulowanych.
|
||||
|
||||
@@ -36,6 +36,7 @@ body_part-RIGHT_HAND = Mão Direita
|
||||
body_part-RIGHT_UPPER_LEG = Coxa direita
|
||||
body_part-RIGHT_LOWER_LEG = Canela direita
|
||||
body_part-RIGHT_FOOT = Pé direito
|
||||
body_part-UPPER_CHEST = Peito Superior
|
||||
body_part-CHEST = Peito
|
||||
body_part-WAIST = Cintura
|
||||
body_part-HIP = Quadril
|
||||
@@ -52,12 +53,15 @@ body_part-LEFT_FOOT = Pé esquerdo
|
||||
skeleton_bone-NONE = Nada
|
||||
skeleton_bone-HEAD = Deslocamento da Cabeça
|
||||
skeleton_bone-NECK = Tamanho do Pescoço
|
||||
skeleton_bone-CHEST = Chest Length
|
||||
skeleton_bone-torso_group = Tamanho do Tronco
|
||||
skeleton_bone-UPPER_CHEST = Tamanho do Peito Superior
|
||||
skeleton_bone-CHEST_OFFSET = Chest Offset
|
||||
skeleton_bone-CHEST = Chest Length
|
||||
skeleton_bone-WAIST = Waist Length
|
||||
skeleton_bone-HIP = Hip Length
|
||||
skeleton_bone-HIP_OFFSET = Compensação do Quadril
|
||||
skeleton_bone-HIPS_WIDTH = Largura do Quadril
|
||||
skeleton_bone-leg_group = Tamanho da Perna
|
||||
skeleton_bone-UPPER_LEG = Upper Leg Length
|
||||
skeleton_bone-LOWER_LEG = Lower Leg Length
|
||||
skeleton_bone-FOOT_LENGTH = Tamanho do Pé
|
||||
@@ -65,6 +69,7 @@ skeleton_bone-FOOT_SHIFT = Compensação do Pé
|
||||
skeleton_bone-SKELETON_OFFSET = Compensação do Esqueleto
|
||||
skeleton_bone-SHOULDERS_DISTANCE = Distância dos Ombros
|
||||
skeleton_bone-SHOULDERS_WIDTH = Largura dos Ombros
|
||||
skeleton_bone-arm_group = Tamanho do Braço
|
||||
skeleton_bone-UPPER_ARM = Tamanho do Braço Superior
|
||||
skeleton_bone-LOWER_ARM = Distância do Antebraço
|
||||
skeleton_bone-HAND_Y = Distância da mão Y
|
||||
@@ -114,6 +119,9 @@ widget-overlay-is_mirrored_label = Mostrar Overlay como espelho
|
||||
|
||||
widget-drift_compensation-clear = Refazer compensação de drift
|
||||
|
||||
## Widget: Clear Reset Mounting
|
||||
|
||||
|
||||
## Widget: Developer settings
|
||||
|
||||
widget-developer_mode = Modo de desenvolvedor
|
||||
@@ -131,6 +139,9 @@ widget-imu_visualizer = Rotation
|
||||
widget-imu_visualizer-rotation_raw = Raw
|
||||
widget-imu_visualizer-rotation_preview = Preview
|
||||
|
||||
## Widget: Skeleton Visualizer
|
||||
|
||||
|
||||
## Tracker status
|
||||
|
||||
tracker-status-none = Sem Status
|
||||
@@ -258,6 +269,7 @@ settings-sidebar-interface = Interface
|
||||
settings-sidebar-osc_router = Roteador OSC
|
||||
settings-sidebar-utils = Utilidades
|
||||
settings-sidebar-serial = Console Serial
|
||||
settings-sidebar-notifications = Notificações
|
||||
|
||||
## SteamVR settings
|
||||
|
||||
@@ -318,11 +330,7 @@ settings-general-fk_settings-leg_tweak-skating_correction-amount = Força da cor
|
||||
settings-general-fk_settings-arm_fk = Opções do Braço
|
||||
settings-general-fk_settings-arm_fk-description = Muda o jeito que os braços são rastreados.
|
||||
settings-general-fk_settings-arm_fk-force_arms = Forçar braços do HMD
|
||||
settings-general-fk_settings-skeleton_settings = Opções do esqueleto
|
||||
settings-general-fk_settings-skeleton_settings-description = Ligar ou desligar opções do esqueleto. É recomendado deixar eles ligados.
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine = Estender coluna
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis = Estender pélvis
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees = Estender joelho
|
||||
settings-general-fk_settings-vive_emulation-title = Emulação de Vive
|
||||
settings-general-fk_settings-vive_emulation-description = Emule o problema de tracker da cintura que o Vive tracker tem. Isso é uma piada e faz o tracking ficar pior.
|
||||
settings-general-fk_settings-vive_emulation-label = Ativar emulação de Vive
|
||||
@@ -343,19 +351,21 @@ settings-general-gesture_control-mountingResetEnabled = Toques para o reset de p
|
||||
settings-general-gesture_control-mountingResetDelay = Delay do reset de posição
|
||||
settings-general-gesture_control-mountingResetTaps = Toques para o reset de posição
|
||||
|
||||
## Interface settings
|
||||
## Appearance settings
|
||||
|
||||
settings-general-interface = Interface
|
||||
settings-general-interface-dev_mode = Modo de desenvolvedor
|
||||
settings-general-interface-dev_mode-description = Este modo pode ser útil se precisar de dados específicos ou para interagir com trackers conectados a um nível mais avançado
|
||||
settings-general-interface-dev_mode-label = Modo de desenvolvedor
|
||||
settings-general-interface-serial_detection = Detecção de dispositivo serial
|
||||
settings-general-interface-serial_detection-description = Esta opção mostrará um pop-up toda vez que você conectar um novo dispositivo serial que pode ser um tracker. Ajuda a melhorar o processo de configuração de um tracker
|
||||
settings-general-interface-serial_detection-label = Detecção de dispositivo serial
|
||||
settings-general-interface-lang = Selecione o idioma
|
||||
settings-general-interface-lang-description = Alterar o idioma padrão que pretende utilizar
|
||||
settings-general-interface-lang-placeholder = Selecione o idioma que vai usar
|
||||
|
||||
## Notification settings
|
||||
|
||||
settings-general-interface-serial_detection = Detecção de dispositivo serial
|
||||
settings-general-interface-serial_detection-description = Esta opção mostrará um pop-up toda vez que você conectar um novo dispositivo serial que pode ser um tracker. Ajuda a melhorar o processo de configuração de um tracker
|
||||
settings-general-interface-serial_detection-label = Detecção de dispositivo serial
|
||||
|
||||
## Serial settings
|
||||
|
||||
settings-serial = Console Serial
|
||||
@@ -460,7 +470,6 @@ onboarding-wifi_creds-password =
|
||||
|
||||
onboarding-reset_tutorial-back = Voltar para a Calibragem de Posição
|
||||
onboarding-reset_tutorial = Resetar Tutorial
|
||||
onboarding-reset_tutorial-description = Esse recurso não está concluído, apenas aperte continue
|
||||
|
||||
## Setup start
|
||||
|
||||
@@ -677,5 +686,8 @@ onboarding-automatic_proportions-done-description = Sua calibragem de proporçã
|
||||
|
||||
home-no_trackers = Nenhum tracker detectado ou atribuído
|
||||
|
||||
## Trackers Still On notification
|
||||
|
||||
|
||||
## Status system
|
||||
|
||||
|
||||
@@ -358,6 +358,10 @@ 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 = Усредните рыскание и перекат бедра c рысканьем и перекатом ног
|
||||
settings-general-fk_settings-skeleton_settings-interp_knee_tracker_ankle = Усредните рыскание и крен коленных трекеров с рысканьем и креном трекеров лодыжек
|
||||
settings-general-fk_settings-self_localization-title = Режим Mocap
|
||||
@@ -813,6 +817,9 @@ onboarding-choose_proportions-manual_proportions = Ручные пропорци
|
||||
onboarding-choose_proportions-manual_proportions-subtitle = Для небольших штрихов
|
||||
onboarding-choose_proportions-manual_proportions-description = Это позволит вам настроить пропорции вручную, изменив их напрямую.
|
||||
onboarding-choose_proportions-export = Экспорт пропорций
|
||||
onboarding-choose_proportions-import = Ввод пропорций
|
||||
onboarding-choose_proportions-import-success = Введён
|
||||
onboarding-choose_proportions-import-failed = Неудача
|
||||
onboarding-choose_proportions-file_type = Файл пропорций тела
|
||||
|
||||
## Tracker manual proportions setup
|
||||
|
||||
@@ -53,6 +53,8 @@ body_part-LEFT_FOOT = Bàn chân trái
|
||||
skeleton_bone-NONE = Chưa được gán
|
||||
skeleton_bone-HEAD = Sai số đầu
|
||||
skeleton_bone-NECK = Chiều dài cổ
|
||||
skeleton_bone-torso_group = Độ dài thân
|
||||
skeleton_bone-UPPER_CHEST = Độ dài ngực trên
|
||||
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
|
||||
@@ -70,6 +72,8 @@ 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-HAND_Y = Khoảng cách tay Y
|
||||
skeleton_bone-HAND_Z = Khoảng cách tay Z
|
||||
skeleton_bone-ELBOW_OFFSET = Sai số khuỷu tay
|
||||
|
||||
## Tracker reset buttons
|
||||
@@ -77,6 +81,7 @@ 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-yaw = Reset Yaw
|
||||
|
||||
## Serial detection stuff
|
||||
|
||||
@@ -139,6 +144,11 @@ widget-imu_visualizer-rotation_raw = Gốc
|
||||
widget-imu_visualizer-rotation_preview = Qua xử lí
|
||||
widget-imu_visualizer-rotation_hide = Ẩn
|
||||
|
||||
## Widget: Skeleton Visualizer
|
||||
|
||||
widget-skeleton_visualizer-preview = Xem trước khung xương
|
||||
widget-skeleton_visualizer-hide = Ẩn
|
||||
|
||||
## Tracker status
|
||||
|
||||
tracker-status-none = Không có trạng thái
|
||||
@@ -147,6 +157,7 @@ tracker-status-error = Lỗi
|
||||
tracker-status-disconnected = Đã ngắt kết nối
|
||||
tracker-status-occluded = Nghẽn
|
||||
tracker-status-ok = Đã kết nối
|
||||
tracker-status-timed_out = Hết thời gian chờ
|
||||
|
||||
## Tracker status columns
|
||||
|
||||
@@ -164,10 +175,15 @@ tracker-table-column-url = Đường dẫn
|
||||
## Tracker rotation
|
||||
|
||||
tracker-rotation-front = Trước
|
||||
tracker-rotation-front_left = Phía trước-Bên trái
|
||||
tracker-rotation-front_right = Phía trước-Bên phải
|
||||
tracker-rotation-left = Trái
|
||||
tracker-rotation-right = Phải
|
||||
tracker-rotation-back = Sau
|
||||
tracker-rotation-back_left = Phía sau-Bên trái
|
||||
tracker-rotation-back_right = Phía sau-Bên phải
|
||||
tracker-rotation-custom = Tùy chọn
|
||||
tracker-rotation-overriden = (được ghi đè bởi reset hướng gắn tracker)
|
||||
|
||||
## Tracker information
|
||||
|
||||
@@ -231,6 +247,7 @@ tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } bắp chân
|
||||
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } cẳng chân phải?
|
||||
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } bàn chân phải?
|
||||
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } tay cầm bên phải?
|
||||
tracker_selection_menu-UPPER_CHEST = { -tracker_selection-part } ngực trên?
|
||||
tracker_selection_menu-CHEST = { -tracker_selection-part } ngực?
|
||||
tracker_selection_menu-WAIST = { -tracker_selection-part } eo?
|
||||
tracker_selection_menu-HIP = { -tracker_selection-part } hông?
|
||||
@@ -245,6 +262,11 @@ 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
|
||||
# This line cares about multilines.
|
||||
# <b>text</b> means that the text should be bold.
|
||||
tracker_selection_menu-neck_warning =
|
||||
<b>Cảnh báo:</b> Tracker ở cổ rất nguy hiểm và có thể gây tử vong nếu điều chỉnh quá chặt,
|
||||
Dây đeo có thể cắt lưu thông máu đến đầu của bạn!
|
||||
tracker_selection_menu-neck_warning-done = Tôi hiểu những rủi ro
|
||||
tracker_selection_menu-neck_warning-cancel = Hủy
|
||||
|
||||
@@ -265,6 +287,7 @@ 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-appearance = Giao diện
|
||||
settings-sidebar-notifications = Thông báo
|
||||
|
||||
## SteamVR settings
|
||||
@@ -322,10 +345,26 @@ settings-general-fk_settings-leg_tweak-floor_clip = Ngăn xuyên sàn
|
||||
# since this largely prevents this it corrects for it hence skating correction (note this may be renamed to sliding correction)
|
||||
# definition - Guesses when each foot is in contact with the ground and uses that information to improve tracking
|
||||
settings-general-fk_settings-leg_tweak-skating_correction = Sửa trượt
|
||||
settings-general-fk_settings-leg_tweak-toe_snap = Đoán hướng xoay chân
|
||||
settings-general-fk_settings-leg_tweak-skating_correction-amount = Mức độ sửa
|
||||
settings-general-fk_settings-leg_tweak-skating_correction-description = Sửa trượt sẽ điều chỉnh nhằm giảm thiểu hiện tượng trượt băng nhưng có thể làm giảm độ chính xác trong một vài kiểu chuyển động nhất định. Khi bật tính năng này, vui lòng đảm bảo thực hiện thao tác đặt lại hoàn toàn và hiệu chỉnh lại trong trò chơi.
|
||||
settings-general-fk_settings-leg_tweak-floor_clip-description = Ngăn xuyên sàn có thể giảm hoặc loại bỏ khả năng tracker của bạn đi xuyên sàn nhà. Khi bật tính năng này, vui lòng đảm bảo thực hiện thao tác đặt lại hoàn toàn và hiệu chỉnh lại trong trò chơi.
|
||||
settings-general-fk_settings-leg_tweak-toe_snap-description = Đoán hướng xoay chân sẽ đoán hướng xoay của chân đồng thời khóa ngón chân của bạn vào mặt sàn bạn nếu bạn không sử dụng tracker cho chân.
|
||||
settings-general-fk_settings-leg_fk = Track chân
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet-description = Đặt lại hướng gắn tracker bàn chân bằng cách nhón chân.
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet = Đặt lại hướng gắn tracker bàn chân
|
||||
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-arm_fk-reset_mode-description = Thay đổi tư thế cánh tay để đặt lại hướng gắn tracker.
|
||||
settings-general-fk_settings-arm_fk-back = Khuỷu tay ra sau
|
||||
settings-general-fk_settings-arm_fk-back-description = Chế độ mặc định, với cánh tay trên trỏ về phía sau và cánh tay dưới hướng về phía trước.
|
||||
settings-general-fk_settings-arm_fk-tpose_up = T-pose
|
||||
settings-general-fk_settings-arm_fk-tpose_up-description = Hai tay của bạn sẽ hướng xuống ở hai bên khi đặt lại hoàn toàn, và đưa lên 90 độ sang hai bên khi đặt lại hướng gắn tracker.
|
||||
settings-general-fk_settings-arm_fk-tpose_down = T-pose (ngược lại)
|
||||
settings-general-fk_settings-arm_fk-tpose_down-description = Hai tay của bạn sẽ đưa lên 90 độ sang hai bên khi đặt lại hoàn toàn, và hai tay hướng xuống hai bên khi đặt lại hướng gắn tracker.
|
||||
settings-general-fk_settings-arm_fk-forward = Hai tay ra trước
|
||||
settings-general-fk_settings-arm_fk-forward-description = Hai cánh tay của bạn nâng lên 90 độ về phía trước. Hữu dụng cho việc VTubing.
|
||||
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-self_localization-title = Chế độ Mocap
|
||||
settings-general-fk_settings-vive_emulation-title = Giả lập tracker Vive
|
||||
@@ -353,6 +392,7 @@ settings-general-gesture_control-mountingResetTaps = Số lần chạm cho đặ
|
||||
|
||||
## Appearance settings
|
||||
|
||||
settings-interface-appearance = 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
|
||||
@@ -360,6 +400,8 @@ 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)
|
||||
# Keep the font name untranslated
|
||||
settings-interface-appearance-font = Phông chữ cho GUI
|
||||
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
|
||||
@@ -447,6 +489,7 @@ settings-osc-vrchat-network-trackers-elbows = Khuỷu tay
|
||||
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
|
||||
settings-osc-vmc-vrm = Model VRM
|
||||
|
||||
## Setup/onboarding menu
|
||||
|
||||
@@ -564,6 +607,9 @@ onboarding-assign_trackers-next = Hoàn thành
|
||||
|
||||
## Tracker mounting method choose
|
||||
|
||||
# Italized text
|
||||
onboarding-choose_mounting-auto_mounting-label = Thử nghiệm
|
||||
onboarding-choose_mounting-manual_modal-cancel = Hủy
|
||||
|
||||
## Tracker manual mounting setup
|
||||
|
||||
@@ -596,6 +642,22 @@ onboarding-automatic_mounting-put_trackers_on-next = Tiếp tục
|
||||
|
||||
## Tracker proportions method choose
|
||||
|
||||
onboarding-choose_proportions-auto_proportions = Đo kích thước cơ thể tự động
|
||||
# Italized text
|
||||
onboarding-choose_proportions-auto_proportions-subtitle = Khuyến khích dùng
|
||||
onboarding-choose_proportions-auto_proportions-descriptionv3 =
|
||||
Tính năng này sẽ đoán tỷ lệ cơ thể của bạn bằng cách ghi lại một mẫu chuyển động của bạn và chuyển nó qua một thuật toán.
|
||||
|
||||
<b>Tính năng này sẽ yêu cầu headset của bạn (HMD) được kết nối với SlimeVR và đang nằm ở trên đầu của bạn!</b>
|
||||
onboarding-choose_proportions-manual_proportions = Đo kích thước cơ thể thủ công
|
||||
# Italized text
|
||||
onboarding-choose_proportions-manual_proportions-subtitle = Cho chính xác
|
||||
onboarding-choose_proportions-manual_proportions-description = Tính năng này sẽ cho phép bạn điều chỉnh tỉ lệ cơ thể của mình theo cách thủ công bằng cách chỉnh sửa các con số một cách trực tiếp
|
||||
onboarding-choose_proportions-export = Xuất tỉ lệ cơ thể
|
||||
onboarding-choose_proportions-import = Nhập tỉ lệ cơ thể
|
||||
onboarding-choose_proportions-import-success = Đã được nhập
|
||||
onboarding-choose_proportions-import-failed = Thất bại
|
||||
onboarding-choose_proportions-file_type = File tỉ lệ cơ thể
|
||||
|
||||
## Tracker manual proportions setup
|
||||
|
||||
@@ -615,16 +677,40 @@ onboarding-automatic_proportions-put_trackers_on-title = Đeo tracker lên ngư
|
||||
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-requirements-title = Yêu cầu
|
||||
# Each line of text is a different list item
|
||||
onboarding-automatic_proportions-requirements-descriptionv2 =
|
||||
Bạn có ít nhất đủ tracker để theo dõi bàn chân của mình (thường là 5 tracker).
|
||||
Bạn đã bật tracker và headset và đang đeo chúng.
|
||||
Tracker và headset của bạn được kết nối với máy chủ SlimeVR và đang hoạt động bình thường (ví dụ: không bị lag, ngắt kết nối, v.v.).
|
||||
Headset của bạn đang báo cáo dữ liệu vị trí cho máy chủ SlimeVR (điều này thường có nghĩa là SteamVR đang chạy và kết nối với SlimeVR bằng driver SteamVR của SlimeVR).
|
||||
Tracking của bạn đang hoạt động và thể hiện chính xác các chuyển động của bạn (ví dụ: bạn đã thực hiện thiết đặt lại hoàn toàn và chúng di chuyển đúng hướng khi đá, cúi xuống, ngồi, v.v.).
|
||||
onboarding-automatic_proportions-requirements-next = Tôi đã đọc các yêu cầu
|
||||
onboarding-automatic_proportions-check_height-title = Kiểm tra chiều cao của bạn
|
||||
onboarding-automatic_proportions-check_height-description = Chúng tôi sử dụng chiều cao của bạn làm cơ sở cho các phép đo của chúng tôi bằng cách sử dụng chiều cao của headset (HMD) làm chiều cao ước tính thực tế của bạn, nhưng tốt hơn hết bạn nên tự kiểm tra xem chúng có đúng không!
|
||||
# All the text is in bold!
|
||||
onboarding-automatic_proportions-check_height-calculation_warning = Vui lòng nhấn nút trong khi đứng <u>thẳng</u> để tính chiều cao của bạn. Bạn có 3 giây sau khi nhấn nút!
|
||||
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õ
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-hmd_height1 = Chiều cao của HMD là
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-height1 = vậy chiều cao thật của bạn là
|
||||
onboarding-automatic_proportions-check_height-next_step = Những chỉ số này là đúng
|
||||
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:
|
||||
# Each line of text is a different list item
|
||||
onboarding-automatic_proportions-recording-steps =
|
||||
Đứng thẳng, xoay đầu một vòng tròn.
|
||||
Cong lưng về phía trước và ngồi xổm. Trong khi ngồi xổm, nhìn sang trái, sau đó sang phải.
|
||||
Xoay phần thân trên của bạn sang trái (ngược chiều kim đồng hồ), sau đó đưa tay xuống đất.
|
||||
Xoay phần thân trên của bạn sang phải (theo chiều kim đồng hồ), sau đó với tay xuống đất.
|
||||
Xoay hông của bạn theo chuyển động tròn như thể bạn đang xoay vòng hula.
|
||||
Nếu còn thời gian, bạn có thể lặp lại các bước này cho đến khi kết thúc.
|
||||
onboarding-automatic_proportions-recording-processing = Đang xử lí kết quả...
|
||||
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 20)
|
||||
onboarding-automatic_proportions-recording-timer =
|
||||
@@ -640,12 +726,24 @@ 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 =
|
||||
<b>Cảnh báo:</b> Một lỗi đã được tìm thấy trong khi ước tính tỷ lệ cơ thể!
|
||||
Vui lòng <docs>kiểm tra tài liệu</docs> hoặc tham gia <discord>Discord</discord> của chúng tôi để được trợ giúp ^_^
|
||||
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
|
||||
|
||||
## Trackers Still On notification
|
||||
|
||||
trackers_still_on-modal-title = Tracker vẫn còn bật
|
||||
trackers_still_on-modal-description =
|
||||
Vẫn còn một hoặc nhiều tracker vẫn đang bật.
|
||||
Bạn vẫn muốn thoát khỏi SlimeVR?
|
||||
trackers_still_on-modal-confirm = Thoát SlimeVR
|
||||
trackers_still_on-modal-cancel = Vui lòng đợi...
|
||||
|
||||
## 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.
|
||||
|
||||
@@ -144,6 +144,11 @@ widget-imu_visualizer-rotation_raw = 原始旋转
|
||||
widget-imu_visualizer-rotation_preview = 预览
|
||||
widget-imu_visualizer-rotation_hide = 隐藏
|
||||
|
||||
## Widget: Skeleton Visualizer
|
||||
|
||||
widget-skeleton_visualizer-preview = 骨架预览
|
||||
widget-skeleton_visualizer-hide = 隐藏
|
||||
|
||||
## Tracker status
|
||||
|
||||
tracker-status-none = 无状态
|
||||
@@ -348,9 +353,20 @@ settings-general-fk_settings-leg_tweak-floor_clip-description = 地板限制可
|
||||
settings-general-fk_settings-leg_tweak-toe_snap-description = 脚趾着地可以在没有脚部追踪器的情况下尝试猜测脚部的俯仰。
|
||||
settings-general-fk_settings-leg_tweak-foot_plant-description = 脚掌着地会在脚与地面接触时保持脚掌与地板平行。
|
||||
settings-general-fk_settings-leg_fk = 腿部追踪
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet-description = 开启脚部佩戴重置。(佩戴重置时需要踮起脚尖)
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet = 脚部佩戴重置
|
||||
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-arm_fk-reset_mode-description = 更改佩戴重置时使用的手臂姿势。
|
||||
settings-general-fk_settings-arm_fk-back = 向后弯折
|
||||
settings-general-fk_settings-arm_fk-back-description = 默认,重置时大臂向后,小臂向前,类似滑雪。
|
||||
settings-general-fk_settings-arm_fk-tpose_up = T-pose(抬起)
|
||||
settings-general-fk_settings-arm_fk-tpose_up-description = 完整重置时手臂垂下,呈立正姿势;佩戴重置时手臂向两侧伸平。
|
||||
settings-general-fk_settings-arm_fk-tpose_down = T-pose(放下)
|
||||
settings-general-fk_settings-arm_fk-tpose_down-description = 完整重置时手臂向两侧伸平;佩戴重置时手臂垂下,呈立正姿势。
|
||||
settings-general-fk_settings-arm_fk-forward = 向前伸平
|
||||
settings-general-fk_settings-arm_fk-forward-description = 重置时手臂向前伸平,有利于坐姿进行虚拟直播。
|
||||
settings-general-fk_settings-skeleton_settings-toggles = 骨架设置
|
||||
settings-general-fk_settings-skeleton_settings-description = 打开或关闭骨架设置。建议保持这些设置不变。
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine_model = 延伸脊柱模型
|
||||
@@ -363,7 +379,8 @@ settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_legs =
|
||||
settings-general-fk_settings-skeleton_settings-impute_hip_from_chest_legs = 用胸部到腿部的数据推算髋部
|
||||
settings-general-fk_settings-skeleton_settings-impute_hip_from_waist_legs = 用腰部到腿部的数据推算髋部
|
||||
settings-general-fk_settings-skeleton_settings-interp_hip_legs = 平均髋部与腿部间航向轴和横滚轴的数值
|
||||
settings-general-fk_settings-skeleton_settings-interp_knee_tracker_ankle = 平均膝盖与小腿间航向轴和横滚轴的数值
|
||||
settings-general-fk_settings-skeleton_settings-interp_knee_tracker_ankle = 平均膝盖追踪器与小腿间航向轴和横滚轴的数值
|
||||
settings-general-fk_settings-skeleton_settings-interp_knee_ankle = 平均膝盖与小腿间航向轴和横滚轴的数值
|
||||
settings-general-fk_settings-self_localization-title = 动作捕捉模式
|
||||
settings-general-fk_settings-self_localization-description = 动作捕捉模式允许在没有头戴设备或其他追踪器的情况下粗略地跟踪骨架姿态。请注意,本功能需要脚部和头部追踪器,且现阶段依然是实验性的。
|
||||
settings-general-fk_settings-vive_emulation-title = Vive 模拟
|
||||
@@ -426,6 +443,9 @@ 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-connected_trackers_warning = 已连接追踪器警告
|
||||
settings-general-interface-connected_trackers_warning-description = 启用本选项后,每次当退出 SlimeVR 时仍有追踪器连接着会显示通知,提醒你在使用完毕时关闭追踪器电源来节省电池电量。
|
||||
settings-general-interface-connected_trackers_warning-label = 退出时,有追踪器连接中则显示警告
|
||||
|
||||
## Serial settings
|
||||
|
||||
@@ -750,6 +770,11 @@ onboarding-choose_mounting-manual_mounting = 手动设置佩戴方向
|
||||
# Italized text
|
||||
onboarding-choose_mounting-manual_mounting-label = 推荐
|
||||
onboarding-choose_mounting-manual_mounting-description = 这将需要你手动选择每个追踪器的佩戴方向
|
||||
# Multiline text
|
||||
onboarding-choose_mounting-manual_modal-title = 确定要进行自动佩戴校准?
|
||||
onboarding-choose_mounting-manual_modal-description = <b>我们建议新手使用手动佩戴校准</b>,因为自动佩戴校准的姿势要一次做正确比较困难,可能需要一些练习。
|
||||
onboarding-choose_mounting-manual_modal-confirm = 我已知晓
|
||||
onboarding-choose_mounting-manual_modal-cancel = 取消
|
||||
|
||||
## Tracker manual mounting setup
|
||||
|
||||
@@ -799,6 +824,9 @@ onboarding-choose_proportions-manual_proportions = 手动调整身体比例
|
||||
onboarding-choose_proportions-manual_proportions-subtitle = 用于精细调整
|
||||
onboarding-choose_proportions-manual_proportions-description = 这将需要你手动修改以调整你的身体比例
|
||||
onboarding-choose_proportions-export = 导出身体比例
|
||||
onboarding-choose_proportions-import = 导入身体比例
|
||||
onboarding-choose_proportions-import-success = 导入成功
|
||||
onboarding-choose_proportions-import-failed = 导入失败
|
||||
onboarding-choose_proportions-file_type = 身体比例文件
|
||||
|
||||
## Tracker manual proportions setup
|
||||
@@ -875,6 +903,15 @@ onboarding-automatic_proportions-error_modal-confirm = 了解!
|
||||
|
||||
home-no_trackers = 未检测到或未分配追踪器
|
||||
|
||||
## Trackers Still On notification
|
||||
|
||||
trackers_still_on-modal-title = 有追踪器的电源还开着
|
||||
trackers_still_on-modal-description =
|
||||
至少有一个追踪器的电源还开着。
|
||||
确定要退出 SlimeVR 吗?
|
||||
trackers_still_on-modal-confirm = 退出 SlimeVR
|
||||
trackers_still_on-modal-cancel = 等会…
|
||||
|
||||
## Status system
|
||||
|
||||
status_system-StatusTrackerReset = 建议执行完整重置,因为有至少一个追踪器未被调整。
|
||||
|
||||
@@ -144,6 +144,11 @@ widget-imu_visualizer-rotation_raw = 原始旋轉
|
||||
widget-imu_visualizer-rotation_preview = 預覽
|
||||
widget-imu_visualizer-rotation_hide = 隱藏
|
||||
|
||||
## Widget: Skeleton Visualizer
|
||||
|
||||
widget-skeleton_visualizer-preview = 骨架預覽
|
||||
widget-skeleton_visualizer-hide = 隱藏
|
||||
|
||||
## Tracker status
|
||||
|
||||
tracker-status-none = 無
|
||||
@@ -152,6 +157,7 @@ tracker-status-error = 錯誤
|
||||
tracker-status-disconnected = 連線中斷
|
||||
tracker-status-occluded = 被遮擋
|
||||
tracker-status-ok = 已連線
|
||||
tracker-status-timed_out = 已逾時
|
||||
|
||||
## Tracker status columns
|
||||
|
||||
@@ -348,9 +354,20 @@ settings-general-fk_settings-leg_tweak-floor_clip-description = 地板限制功
|
||||
settings-general-fk_settings-leg_tweak-toe_snap-description = 腳趾跟地功能在沒有腳部的追蹤器時,會嘗試猜測腳掌的旋轉角度。
|
||||
settings-general-fk_settings-leg_tweak-foot_plant-description = 腳底貼地功能會在腳底與地面接觸時,將腳部旋轉成與地板平行。
|
||||
settings-general-fk_settings-leg_fk = 腿部追蹤
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet-description = 開啟腳部配戴重置,進行配戴重置時需要踮起腳尖。
|
||||
settings-general-fk_settings-leg_fk-reset_mounting_feet = 腳部配戴重置
|
||||
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-arm_fk-reset_mode-description = 更改配戴重置時,手臂需要做出的姿勢。
|
||||
settings-general-fk_settings-arm_fk-back = 收肘姿勢
|
||||
settings-general-fk_settings-arm_fk-back-description = 預設模式,重置時手肘朝後,前臂向前。
|
||||
settings-general-fk_settings-arm_fk-tpose_up = T 型姿勢(抬起)
|
||||
settings-general-fk_settings-arm_fk-tpose_up-description = 完整重置時手臂向下,呈立正姿勢;配戴重置時手臂向兩側伸展,與身體呈 90 度。
|
||||
settings-general-fk_settings-arm_fk-tpose_down = T 型姿勢(放下)
|
||||
settings-general-fk_settings-arm_fk-tpose_down-description = 完整重置時手臂向兩側伸展,與身體呈 90 度;配戴重置時手臂向下,呈立正姿勢。
|
||||
settings-general-fk_settings-arm_fk-forward = 向前伸展
|
||||
settings-general-fk_settings-arm_fk-forward-description = 重置時手臂向前伸展,與身體呈 90 度,可用於坐姿進行虛擬直播。
|
||||
settings-general-fk_settings-skeleton_settings-toggles = 骨架設定
|
||||
settings-general-fk_settings-skeleton_settings-description = 開啟或關閉骨架設定。建議保持這些設定開啟。
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine_model = 延伸脊椎模型
|
||||
@@ -358,12 +375,13 @@ 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-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-skeleton_settings-interp_knee_ankle = 膝部的偏航軸與翻滾軸,與腳踝定位平均的比例
|
||||
settings-general-fk_settings-self_localization-title = 動作捕捉模式
|
||||
settings-general-fk_settings-self_localization-description = 動作捕捉模式允許在沒有頭戴顯示器或其他追蹤器時,粗略的追蹤身體骨架的定位。請注意,本功能需要腳部與頭部的追蹤器,並且本功能仍在實驗階段。
|
||||
settings-general-fk_settings-vive_emulation-title = Vive 模擬
|
||||
@@ -426,6 +444,9 @@ 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-connected_trackers_warning = 已連接追蹤器警告
|
||||
settings-general-interface-connected_trackers_warning-description = 啟用本選項後,每次當退出 SlimeVR 時仍有追蹤器連接著會顯示通知,提醒你在使用完畢時關閉追蹤器電源來節省電池電量。
|
||||
settings-general-interface-connected_trackers_warning-label = 當退出程式時,有追蹤器連接中則顯示警告
|
||||
|
||||
## Serial settings
|
||||
|
||||
@@ -748,6 +769,11 @@ onboarding-choose_mounting-manual_mounting = 手動配戴校正
|
||||
# Italized text
|
||||
onboarding-choose_mounting-manual_mounting-label = 推薦使用
|
||||
onboarding-choose_mounting-manual_mounting-description = 本選項可以讓你選擇每個追蹤器的配戴方位
|
||||
# Multiline text
|
||||
onboarding-choose_mounting-manual_modal-title = 確定要進行自動配戴校正?
|
||||
onboarding-choose_mounting-manual_modal-description = <b>我們建議新手使用手動配戴校正</b>,因為自動配戴校正的姿勢要一次做正確比較困難,可能需要一些練習。
|
||||
onboarding-choose_mounting-manual_modal-confirm = 我確定要這樣做
|
||||
onboarding-choose_mounting-manual_modal-cancel = 取消
|
||||
|
||||
## Tracker manual mounting setup
|
||||
|
||||
@@ -788,15 +814,18 @@ onboarding-choose_proportions-description =
|
||||
onboarding-choose_proportions-auto_proportions = 自動軀幹比例校正
|
||||
# Italized text
|
||||
onboarding-choose_proportions-auto_proportions-subtitle = 推薦使用
|
||||
onboarding-choose_proportions-auto_proportions-descriptionv2 =
|
||||
onboarding-choose_proportions-auto_proportions-descriptionv3 =
|
||||
本選項會從您的身體動作錄製一段樣本,並通過演算法來推算您的軀幹比例。
|
||||
|
||||
<b>使用本功能需要連接頭戴顯示器到 SlimeVR!</b>
|
||||
<b>使用本功能需要連接頭戴顯示器到 SlimeVR,並且配戴在頭部!</b>
|
||||
onboarding-choose_proportions-manual_proportions = 手動軀幹比例校正
|
||||
# Italized text
|
||||
onboarding-choose_proportions-manual_proportions-subtitle = 適合進行微調
|
||||
onboarding-choose_proportions-manual_proportions-description = 本選項可以讓你直接修改軀幹比例的設定值
|
||||
onboarding-choose_proportions-export = 匯出軀幹比例
|
||||
onboarding-choose_proportions-import = 匯入軀幹比例
|
||||
onboarding-choose_proportions-import-success = 匯入成功
|
||||
onboarding-choose_proportions-import-failed = 匯入失敗
|
||||
onboarding-choose_proportions-file_type = 軀幹比例描述檔
|
||||
|
||||
## Tracker manual proportions setup
|
||||
@@ -819,13 +848,14 @@ onboarding-automatic_proportions-put_trackers_on-description = 為了校準你
|
||||
onboarding-automatic_proportions-put_trackers_on-next = 我所有的追蹤器都戴好了!
|
||||
onboarding-automatic_proportions-requirements-title = 使用需求
|
||||
# Each line of text is a different list item
|
||||
onboarding-automatic_proportions-requirements-description =
|
||||
onboarding-automatic_proportions-requirements-descriptionv2 =
|
||||
你需要足夠的追蹤器以進行足部追蹤(通常為 5 個)。
|
||||
你已經打開追蹤器與頭戴顯示器的電源。
|
||||
追蹤器的電源已經打開並已經穿著在身上。
|
||||
你需要穿戴上追蹤器與頭戴顯示器。
|
||||
你的追蹤器與頭戴顯示器都已經連接到 SlimeVR 伺服器。
|
||||
你的追蹤器與頭戴顯示器在 SlimeVR 伺服器中運作正常。
|
||||
你的頭戴顯示器會回報定位資料給 SlimeVR 伺服器(通常為執行 SteamVR 並透過 SlimeVR 的 SteamVR 驅動程式來連接 SlimeVR)。
|
||||
追蹤器與頭戴顯示器都已經連接到 SlimeVR 伺服器,並且正常運作(亦即沒有卡頓或斷線等狀況)。
|
||||
追蹤器與頭戴顯示器在 SlimeVR 伺服器中運作正常。
|
||||
頭戴顯示器會回報定位資料給 SlimeVR 伺服器(通常為執行 SteamVR 並透過 SlimeVR 的 SteamVR 驅動程式來連接 SlimeVR)。
|
||||
追蹤狀態正常且能反映你的移動姿態(例如,進行完全重置後,踢腿、彎曲、坐下時的肢體方向是正確的)。
|
||||
onboarding-automatic_proportions-requirements-next = 我已閱讀使用需求
|
||||
onboarding-automatic_proportions-check_height-title = 檢查您的身高
|
||||
onboarding-automatic_proportions-check_height-description = 我們會透過頭戴顯示器回報的高度來推算您的實際身高,但我們仍建議您檢查一下數值是否正確。
|
||||
@@ -855,7 +885,7 @@ onboarding-automatic_proportions-recording-steps =
|
||||
如果進度條還沒走完,可以重複以上動作直到錄製結束。
|
||||
onboarding-automatic_proportions-recording-processing = 正在處理結果
|
||||
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 20)
|
||||
onboarding-automatic_proportions-recording-timer = 剩餘 { $time } 秒
|
||||
onboarding-automatic_proportions-recording-timer = 剩下 { $time } 秒
|
||||
onboarding-automatic_proportions-verify_results-title = 檢查結果
|
||||
onboarding-automatic_proportions-verify_results-description = 檢查下面的結果,它們看起來是正確的嗎?
|
||||
onboarding-automatic_proportions-verify_results-results = 錄製結果
|
||||
@@ -873,9 +903,18 @@ onboarding-automatic_proportions-error_modal-confirm = 瞭解!
|
||||
|
||||
home-no_trackers = 未偵測到或未分配追蹤器
|
||||
|
||||
## Trackers Still On notification
|
||||
|
||||
trackers_still_on-modal-title = 有追蹤器的電源還開著
|
||||
trackers_still_on-modal-description =
|
||||
至少有一個追蹤器的電源還開著。
|
||||
確定要退出 SlimeVR 嗎?
|
||||
trackers_still_on-modal-confirm = 退出 SlimeVR
|
||||
trackers_still_on-modal-cancel = 先不要…
|
||||
|
||||
## Status system
|
||||
|
||||
status_system-StatusTrackerReset = 建議執行完全重置,因為有至少一個追蹤器尚未調整
|
||||
status_system-StatusTrackerReset = 有至少一個追蹤器尚未進行調整,建議執行完整重置。
|
||||
status_system-StatusSteamVRDisconnected =
|
||||
{ $type ->
|
||||
[steamvr_feeder] 尚未連接 SlimeVR 資料迴送程式
|
||||
|
||||
|
Before Width: | Height: | Size: 126 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 218 KiB After Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 192 KiB After Width: | Height: | Size: 6.3 KiB |
1
gui/public/logo.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" stroke-miterlimit="10" clip-rule="evenodd" version="1.1" viewBox="0 0 380 380" xml:space="preserve"><style>svg{background-color:#663499}</style><rect id="bg" width="100%" height="100%" fill="#663499"/><g id="logo" fill="none" stroke="#fff"><path id="left" stroke-width="13.62" d="m72.867 191.74 37-39 39 36"/><path id="right" stroke-width="13.62" d="m208.87 187.74 38-35 36 38"/><path id="outer" stroke-linecap="square" stroke-width="17" d="m56.867 253.74s130.61-31.182 248 5c13.45 4.146 20.244 2.975 20-8s1.909-126.06-46-131"/></g></svg>
|
||||
|
After Width: | Height: | Size: 598 B |
|
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 15 KiB |
@@ -1,7 +1,16 @@
|
||||
{
|
||||
"short_name": "React App",
|
||||
"name": "Create React App Sample",
|
||||
"name": "SlimeVR GUI",
|
||||
"short_name": "SlimeVR GUI",
|
||||
"description": "A web interface for controlling the SlimeVR Server software",
|
||||
"display": "standalone",
|
||||
"theme_color": "#663499",
|
||||
"background_color": "#663499",
|
||||
"icons": [
|
||||
{
|
||||
"src": "logo.svg",
|
||||
"type": "image/svg+xml",
|
||||
"sizes": "any 512x512 192x192"
|
||||
},
|
||||
{
|
||||
"src": "favicon.ico",
|
||||
"sizes": "64x64 32x32 24x24 16x16",
|
||||
@@ -17,9 +26,5 @@
|
||||
"type": "image/png",
|
||||
"sizes": "512x512"
|
||||
}
|
||||
],
|
||||
"start_url": ".",
|
||||
"display": "standalone",
|
||||
"theme_color": "#000000",
|
||||
"background_color": "#ffffff"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -21,22 +21,20 @@ default = ["custom-protocol"]
|
||||
custom-protocol = ["tauri/custom-protocol"]
|
||||
|
||||
[build-dependencies]
|
||||
tauri-build = { version = "2.0.0-alpha.6", features = [] }
|
||||
tauri-build = { version = "2.0.0-alpha", features = [] }
|
||||
cfg_aliases = "0.1"
|
||||
shadow-rs = "0.23"
|
||||
|
||||
[dependencies]
|
||||
serde_json = "1"
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
tauri = { version = "2.0.0-alpha.10", features = ["devtools"] }
|
||||
tauri-runtime = "0.13.0-alpha.6"
|
||||
tauri-plugin-dialog = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" }
|
||||
tauri-plugin-fs = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" }
|
||||
tauri-plugin-os = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" }
|
||||
tauri-plugin-shell = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" }
|
||||
tauri-plugin-window = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2", features = [
|
||||
"devtools",
|
||||
] }
|
||||
tauri = { version = "2.0.0-alpha", features = ["devtools"] }
|
||||
tauri-runtime = "1.0.0-alpha"
|
||||
tauri-plugin-dialog = "2.0.0-alpha"
|
||||
tauri-plugin-fs = "2.0.0-alpha"
|
||||
tauri-plugin-os = "2.0.0-alpha"
|
||||
tauri-plugin-shell = "2.0.0-alpha"
|
||||
tauri-plugin-window = { version = "2.0.0-alpha", features = ["devtools"] }
|
||||
flexi_logger = "0.25"
|
||||
log-panics = { version = "2", features = ["with-backtrace"] }
|
||||
log = "0.4"
|
||||
|
||||
@@ -81,12 +81,10 @@ fn main() -> Result<()> {
|
||||
});
|
||||
|
||||
#[cfg(not(target_os = "macos"))]
|
||||
let path = dirs_next::data_dir()
|
||||
.ok_or(Error::UnknownPath)
|
||||
.map(|dir| {
|
||||
dir.join(&tauri_context.config().tauri.bundle.identifier)
|
||||
.join("logs")
|
||||
});
|
||||
let path = dirs_next::data_dir().ok_or(Error::UnknownPath).map(|dir| {
|
||||
dir.join(&tauri_context.config().tauri.bundle.identifier)
|
||||
.join("logs")
|
||||
});
|
||||
|
||||
Logger::try_with_env_or_str("info")?
|
||||
.log_to_file(
|
||||
@@ -205,7 +203,7 @@ fn main() -> Result<()> {
|
||||
app.manage(Mutex::new(window_state));
|
||||
|
||||
if let Some((java_bin, p)) = server_info {
|
||||
let app_handle = app.app_handle();
|
||||
let app_handle = app.app_handle().clone();
|
||||
tauri::async_runtime::spawn(async move {
|
||||
use tauri_plugin_shell::{process::CommandEvent, ShellExt};
|
||||
|
||||
|
||||
164
gui/src/App.tsx
@@ -35,7 +35,6 @@ import { SerialDetectionModal } from './components/SerialDetectionModal';
|
||||
import { VRCOSCSettings } from './components/settings/pages/VRCOSCSettings';
|
||||
import { TopBar } from './components/TopBar';
|
||||
import { TrackerSettingsPage } from './components/tracker/TrackerSettings';
|
||||
import { useConfig } from './hooks/config';
|
||||
import { OSCRouterSettings } from './components/settings/pages/OSCRouterSettings';
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import * as os from '@tauri-apps/plugin-os';
|
||||
@@ -52,6 +51,8 @@ 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';
|
||||
import { AppLayout } from './AppLayout';
|
||||
import { Preload } from './components/Preload';
|
||||
|
||||
export const GH_REPO = 'SlimeVR/SlimeVR-Server';
|
||||
export const VersionContext = createContext('');
|
||||
@@ -59,92 +60,94 @@ export const DOCS_SITE = 'https://docs.slimevr.dev';
|
||||
export const SLIMEVR_DISCORD = 'https://discord.gg/slimevr';
|
||||
|
||||
function Layout() {
|
||||
const { loading } = useConfig();
|
||||
|
||||
if (loading) return <></>;
|
||||
|
||||
const { isMobile } = useBreakpoint('mobile');
|
||||
|
||||
return (
|
||||
<>
|
||||
<SerialDetectionModal></SerialDetectionModal>
|
||||
<VersionUpdateModal></VersionUpdateModal>
|
||||
<Routes>
|
||||
<Route
|
||||
path="/"
|
||||
element={
|
||||
<MainLayoutRoute isMobile={isMobile}>
|
||||
<Home />
|
||||
</MainLayoutRoute>
|
||||
}
|
||||
/>
|
||||
<Route
|
||||
path="/vr-mode"
|
||||
element={
|
||||
<MainLayoutRoute isMobile={isMobile}>
|
||||
<VRModePage />
|
||||
</MainLayoutRoute>
|
||||
}
|
||||
/>
|
||||
<Route
|
||||
path="/tracker/:trackernum/:deviceid"
|
||||
element={
|
||||
<MainLayoutRoute background={false} isMobile={isMobile}>
|
||||
<TrackerSettingsPage />
|
||||
</MainLayoutRoute>
|
||||
}
|
||||
/>
|
||||
<Route
|
||||
path="/settings"
|
||||
element={
|
||||
<SettingsLayoutRoute>
|
||||
<Outlet></Outlet>
|
||||
</SettingsLayoutRoute>
|
||||
}
|
||||
>
|
||||
<Route path="trackers" element={<GeneralSettings />} />
|
||||
<Route path="serial" element={<Serial />} />
|
||||
<Route path="osc/router" element={<OSCRouterSettings />} />
|
||||
<Route path="osc/vrchat" element={<VRCOSCSettings />} />
|
||||
<Route path="osc/vmc" element={<VMCSettings />} />
|
||||
<Route path="interface" element={<InterfaceSettings />} />
|
||||
<Route element={<AppLayout />}>
|
||||
<Route
|
||||
path="/"
|
||||
element={
|
||||
<MainLayoutRoute isMobile={isMobile}>
|
||||
<Home />
|
||||
</MainLayoutRoute>
|
||||
}
|
||||
/>
|
||||
<Route
|
||||
path="/vr-mode"
|
||||
element={
|
||||
<MainLayoutRoute isMobile={isMobile}>
|
||||
<VRModePage />
|
||||
</MainLayoutRoute>
|
||||
}
|
||||
/>
|
||||
<Route
|
||||
path="/tracker/:trackernum/:deviceid"
|
||||
element={
|
||||
<MainLayoutRoute background={false} isMobile={isMobile}>
|
||||
<TrackerSettingsPage />
|
||||
</MainLayoutRoute>
|
||||
}
|
||||
/>
|
||||
<Route
|
||||
path="/settings"
|
||||
element={
|
||||
<SettingsLayoutRoute>
|
||||
<Outlet />
|
||||
</SettingsLayoutRoute>
|
||||
}
|
||||
>
|
||||
<Route path="trackers" element={<GeneralSettings />} />
|
||||
<Route path="serial" element={<Serial />} />
|
||||
<Route path="osc/router" element={<OSCRouterSettings />} />
|
||||
<Route path="osc/vrchat" element={<VRCOSCSettings />} />
|
||||
<Route path="osc/vmc" element={<VMCSettings />} />
|
||||
<Route path="interface" element={<InterfaceSettings />} />
|
||||
</Route>
|
||||
<Route
|
||||
path="/onboarding"
|
||||
element={
|
||||
<OnboardingLayout>
|
||||
<Outlet />
|
||||
</OnboardingLayout>
|
||||
}
|
||||
>
|
||||
<Route path="home" element={<HomePage />} />
|
||||
<Route path="wifi-creds" element={<WifiCredsPage />} />
|
||||
<Route path="connect-trackers" element={<ConnectTrackersPage />} />
|
||||
<Route
|
||||
path="calibration-tutorial"
|
||||
element={<CalibrationTutorialPage />}
|
||||
/>
|
||||
<Route
|
||||
path="assign-tutorial"
|
||||
element={<AssignmentTutorialPage />}
|
||||
/>
|
||||
<Route path="trackers-assign" element={<TrackersAssignPage />} />
|
||||
<Route path="enter-vr" element={<EnterVRPage />} />
|
||||
<Route path="mounting/choose" element={<MountingChoose />}></Route>
|
||||
<Route path="mounting/auto" element={<AutomaticMountingPage />} />
|
||||
<Route path="mounting/manual" element={<ManualMountingPage />} />
|
||||
<Route path="reset-tutorial" element={<ResetTutorialPage />} />
|
||||
<Route
|
||||
path="body-proportions/choose"
|
||||
element={<ProportionsChoose />}
|
||||
/>
|
||||
<Route
|
||||
path="body-proportions/auto"
|
||||
element={<AutomaticProportionsPage />}
|
||||
/>
|
||||
<Route
|
||||
path="body-proportions/manual"
|
||||
element={<ManualProportionsPage />}
|
||||
/>
|
||||
<Route path="done" element={<DonePage />} />
|
||||
</Route>
|
||||
<Route path="*" element={<TopBar></TopBar>}></Route>
|
||||
</Route>
|
||||
<Route
|
||||
path="/onboarding"
|
||||
element={
|
||||
<OnboardingLayout>
|
||||
<Outlet></Outlet>
|
||||
</OnboardingLayout>
|
||||
}
|
||||
>
|
||||
<Route path="home" element={<HomePage />} />
|
||||
<Route path="wifi-creds" element={<WifiCredsPage />} />
|
||||
<Route path="connect-trackers" element={<ConnectTrackersPage />} />
|
||||
<Route
|
||||
path="calibration-tutorial"
|
||||
element={<CalibrationTutorialPage />}
|
||||
/>
|
||||
<Route path="assign-tutorial" element={<AssignmentTutorialPage />} />
|
||||
<Route path="trackers-assign" element={<TrackersAssignPage />} />
|
||||
<Route path="enter-vr" element={<EnterVRPage />} />
|
||||
<Route path="mounting/choose" element={<MountingChoose />}></Route>
|
||||
<Route path="mounting/auto" element={<AutomaticMountingPage />} />
|
||||
<Route path="mounting/manual" element={<ManualMountingPage />} />
|
||||
<Route path="reset-tutorial" element={<ResetTutorialPage />} />
|
||||
<Route
|
||||
path="body-proportions/choose"
|
||||
element={<ProportionsChoose />}
|
||||
/>
|
||||
<Route
|
||||
path="body-proportions/auto"
|
||||
element={<AutomaticProportionsPage />}
|
||||
/>
|
||||
<Route
|
||||
path="body-proportions/manual"
|
||||
element={<ManualProportionsPage />}
|
||||
/>
|
||||
<Route path="done" element={<DonePage />} />
|
||||
</Route>
|
||||
<Route path="*" element={<TopBar></TopBar>}></Route>
|
||||
</Routes>
|
||||
</>
|
||||
);
|
||||
@@ -250,6 +253,7 @@ export default function App() {
|
||||
<StatusProvider>
|
||||
<VersionContext.Provider value={updateFound}>
|
||||
<div className="h-full w-full text-standard bg-background-80 text-background-10">
|
||||
<Preload />
|
||||
<div className="flex-col h-full">
|
||||
{!websocketAPI.isConnected && (
|
||||
<>
|
||||
|
||||
51
gui/src/AppLayout.tsx
Normal file
@@ -0,0 +1,51 @@
|
||||
import { useLayoutEffect } from 'react';
|
||||
import { useConfig } from './hooks/config';
|
||||
import { Outlet, useNavigate } from 'react-router-dom';
|
||||
|
||||
export function AppLayout() {
|
||||
const { loading, config } = useConfig();
|
||||
const navigate = useNavigate();
|
||||
|
||||
useLayoutEffect(() => {
|
||||
if (loading || !config) return;
|
||||
if (config.theme !== undefined) {
|
||||
document.documentElement.dataset.theme = config.theme;
|
||||
}
|
||||
|
||||
if (config.fonts !== undefined) {
|
||||
document.documentElement.style.setProperty(
|
||||
'--font-name',
|
||||
config.fonts.map((x) => `"${x}"`).join(',')
|
||||
);
|
||||
}
|
||||
|
||||
if (config.textSize !== undefined) {
|
||||
document.documentElement.style.setProperty(
|
||||
'--font-size',
|
||||
`${config.textSize}rem`
|
||||
);
|
||||
}
|
||||
}, [config, loading]);
|
||||
|
||||
useLayoutEffect(() => {
|
||||
if (config && !config.doneOnboarding) {
|
||||
navigate('/onboarding/home');
|
||||
}
|
||||
}, [config?.doneOnboarding]);
|
||||
|
||||
// const location = useLocation();
|
||||
// const navigationType = useNavigationType();
|
||||
// useEffect(() => {
|
||||
// if (import.meta.env.PROD) return;
|
||||
// console.log('The current URL is', { ...location });
|
||||
// console.log('The last navigation action was', navigationType);
|
||||
// }, [location, navigationType]);
|
||||
|
||||
if (loading) return <></>;
|
||||
|
||||
return (
|
||||
<>
|
||||
<Outlet />
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -5,7 +5,7 @@ import {
|
||||
RecordBVHStatusT,
|
||||
RpcMessage,
|
||||
} from 'solarxr-protocol';
|
||||
import { useWebsocketAPI } from '../hooks/websocket-api';
|
||||
import { useWebsocketAPI } from '@/hooks/websocket-api';
|
||||
import { BigButton } from './commons/BigButton';
|
||||
import { RecordIcon } from './commons/icon/RecordIcon';
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { ClearDriftCompensationRequestT, RpcMessage } from 'solarxr-protocol';
|
||||
import { useWebsocketAPI } from '../hooks/websocket-api';
|
||||
import { useWebsocketAPI } from '@/hooks/websocket-api';
|
||||
import { BigButton } from './commons/BigButton';
|
||||
import { TrashIcon } from './commons/icon/TrashIcon';
|
||||
|
||||
@@ -16,7 +16,7 @@ export function ClearDriftCompensationButton() {
|
||||
return (
|
||||
<BigButton
|
||||
text={l10n.getString('widget-drift_compensation-clear')}
|
||||
icon={<TrashIcon width={20} />}
|
||||
icon={<TrashIcon size={20} />}
|
||||
onClick={clearDriftCompensation}
|
||||
>
|
||||
{}
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { ClearMountingResetRequestT, RpcMessage } from 'solarxr-protocol';
|
||||
import { useWebsocketAPI } from '../hooks/websocket-api';
|
||||
import { useWebsocketAPI } from '@/hooks/websocket-api';
|
||||
import { BigButton } from './commons/BigButton';
|
||||
import { TrashIcon } from './commons/icon/TrashIcon';
|
||||
import { useTrackers } from '../hooks/tracker';
|
||||
import { useTrackers } from '@/hooks/tracker';
|
||||
import { Quaternion } from 'three';
|
||||
import { QuaternionFromQuatT, similarQuaternions } from '../maths/quaternion';
|
||||
import { QuaternionFromQuatT, similarQuaternions } from '@/maths/quaternion';
|
||||
import { useMemo } from 'react';
|
||||
|
||||
const _q = new Quaternion();
|
||||
@@ -36,7 +36,7 @@ export function ClearMountingButton() {
|
||||
return (
|
||||
<BigButton
|
||||
text={l10n.getString('widget-clear_mounting')}
|
||||
icon={<TrashIcon width={20} />}
|
||||
icon={<TrashIcon size={20} />}
|
||||
onClick={clearMounting}
|
||||
disabled={!trackerWithMounting}
|
||||
/>
|
||||
|
||||
@@ -6,10 +6,10 @@ import {
|
||||
RpcMessage,
|
||||
SettingsRequestT,
|
||||
} from 'solarxr-protocol';
|
||||
import { useElemSize, useLayout } from '../hooks/layout';
|
||||
import { useElemSize, useLayout } from '@/hooks/layout';
|
||||
import { Navbar } from './Navbar';
|
||||
import { TopBar } from './TopBar';
|
||||
import { useWebsocketAPI } from '../hooks/websocket-api';
|
||||
import { useWebsocketAPI } from '@/hooks/websocket-api';
|
||||
import { WidgetsComponent } from './WidgetsComponent';
|
||||
|
||||
export function MainLayoutRoute({
|
||||
|
||||
@@ -8,7 +8,7 @@ import { HumanIcon } from './commons/icon/HumanIcon';
|
||||
import { RulerIcon } from './commons/icon/RulerIcon';
|
||||
import { SparkleIcon } from './commons/icon/SparkleIcon';
|
||||
import { WrenchIcon } from './commons/icon/WrenchIcons';
|
||||
import { useBreakpoint } from '../hooks/breakpoint';
|
||||
import { useBreakpoint } from '@/hooks/breakpoint';
|
||||
|
||||
export function NavButton({
|
||||
to,
|
||||
|
||||
48
gui/src/components/Preload.tsx
Normal file
@@ -0,0 +1,48 @@
|
||||
import { Helmet } from 'react-helmet';
|
||||
export function Preload() {
|
||||
return (
|
||||
<Helmet>
|
||||
<link rel="preload" href="/images/front-standing-pose.webp" as="image" />
|
||||
<link rel="preload" href="/images/slime-girl.webp" as="image" />
|
||||
<link rel="preload" href="/images/mounting-reset-pose.webp" as="image" />
|
||||
<link rel="preload" href="/images/reset-pose.webp" as="image" />
|
||||
<link rel="preload" href="/images/slimes.webp" as="image" />
|
||||
|
||||
<link
|
||||
rel="preload"
|
||||
href="/sounds/quick-reset-started-sound.mp3"
|
||||
as="audio"
|
||||
/>
|
||||
<link
|
||||
rel="preload"
|
||||
href="/sounds/full-reset-started-sound.mp3"
|
||||
as="audio"
|
||||
/>
|
||||
<link
|
||||
rel="preload"
|
||||
href="/sounds/mounting-reset-started-sound.mp3"
|
||||
as="audio"
|
||||
/>
|
||||
<link rel="preload" href="/sounds/first-tap.mp3" as="audio" />
|
||||
<link rel="preload" href="/sounds/second-tap.mp3" as="audio" />
|
||||
<link rel="preload" href="/sounds/third-tap.mp3" as="audio" />
|
||||
<link rel="preload" href="/sounds/fourth-tap.mp3" as="audio" />
|
||||
<link rel="preload" href="/sounds/fifth-tap.mp3" as="audio" />
|
||||
<link rel="preload" href="/sounds/end-tap.mp3" as="audio" />
|
||||
<link rel="preload" href="/sounds/tapextrasetup.mp3" as="audio" />
|
||||
|
||||
<link
|
||||
rel="preload"
|
||||
href="/models/tracker.gltf"
|
||||
as="fetch"
|
||||
crossOrigin="anonymous"
|
||||
/>
|
||||
<link
|
||||
rel="preload"
|
||||
href="/models/extension.gltf"
|
||||
as="fetch"
|
||||
crossOrigin="anonymous"
|
||||
/>
|
||||
</Helmet>
|
||||
);
|
||||
}
|
||||
@@ -6,9 +6,9 @@ import {
|
||||
RpcMessage,
|
||||
SerialDeviceT,
|
||||
} from 'solarxr-protocol';
|
||||
import { useConfig } from '../hooks/config';
|
||||
import { useWebsocketAPI } from '../hooks/websocket-api';
|
||||
import { useWifiForm, WifiFormData } from '../hooks/wifi-form';
|
||||
import { useConfig } from '@/hooks/config';
|
||||
import { useWebsocketAPI } from '@/hooks/websocket-api';
|
||||
import { useWifiForm, WifiFormData } from '@/hooks/wifi-form';
|
||||
import { BaseModal } from './commons/BaseModal';
|
||||
import { Button } from './commons/Button';
|
||||
import { BulbIcon } from './commons/icon/BulbIcon';
|
||||
|
||||
@@ -5,8 +5,9 @@ import {
|
||||
RpcMessage,
|
||||
ServerInfosRequestT,
|
||||
ServerInfosResponseT,
|
||||
TrackerStatus,
|
||||
} from 'solarxr-protocol';
|
||||
import { useWebsocketAPI } from '../hooks/websocket-api';
|
||||
import { useWebsocketAPI } from '@/hooks/websocket-api';
|
||||
import { CloseIcon } from './commons/icon/CloseIcon';
|
||||
import { MaximiseIcon } from './commons/icon/MaximiseIcon';
|
||||
import { MinimiseIcon } from './commons/icon/MinimiseIcon';
|
||||
@@ -15,12 +16,15 @@ import { ProgressBar } from './commons/ProgressBar';
|
||||
import { Typography } from './commons/Typography';
|
||||
import { DownloadIcon } from './commons/icon/DownloadIcon';
|
||||
import { open } from '@tauri-apps/plugin-shell';
|
||||
import { GH_REPO, VersionContext, DOCS_SITE } from '../App';
|
||||
import { DOCS_SITE, GH_REPO, VersionContext } from '@/App';
|
||||
import classNames from 'classnames';
|
||||
import { QuestionIcon } from './commons/icon/QuestionIcon';
|
||||
import { useBreakpoint, useIsTauri } from '../hooks/breakpoint';
|
||||
import { useBreakpoint, useIsTauri } from '@/hooks/breakpoint';
|
||||
import { GearIcon } from './commons/icon/GearIcon';
|
||||
import { invoke } from '@tauri-apps/api';
|
||||
import { useTrackers } from '@/hooks/tracker';
|
||||
import { TrackersStillOnModal } from './TrackersStillOnModal';
|
||||
import { useConfig } from '@/hooks/config';
|
||||
|
||||
export function VersionTag() {
|
||||
return (
|
||||
@@ -49,11 +53,20 @@ export function TopBar({
|
||||
const isTauri = useIsTauri();
|
||||
const { isMobile } = useBreakpoint('mobile');
|
||||
const { useRPCPacket, sendRPCPacket } = useWebsocketAPI();
|
||||
const { useConnectedIMUTrackers } = useTrackers();
|
||||
const connectedIMUTrackers = useConnectedIMUTrackers();
|
||||
const { config } = useConfig();
|
||||
const version = useContext(VersionContext);
|
||||
const [localIp, setLocalIp] = useState<string | null>(null);
|
||||
const [showConnectedTrackersWarning, setConnectedTrackerWarning] =
|
||||
useState(false);
|
||||
const doesMatchSettings = useMatch({
|
||||
path: '/settings/*',
|
||||
});
|
||||
const closeApp = async () => {
|
||||
await invoke('update_window_state');
|
||||
getCurrent().close();
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
sendRPCPacket(RpcMessage.ServerInfosRequest, new ServerInfosRequestT());
|
||||
@@ -197,9 +210,17 @@ export function TopBar({
|
||||
</div>
|
||||
<div
|
||||
className="flex items-center justify-center hover:bg-background-60 rounded-full w-7 h-7"
|
||||
onClick={async () => {
|
||||
await invoke('update_window_state');
|
||||
getCurrent().close();
|
||||
onClick={() => {
|
||||
if (
|
||||
config?.connectedTrackersWarning &&
|
||||
connectedIMUTrackers.filter(
|
||||
(t) => t.tracker.status !== TrackerStatus.TIMED_OUT
|
||||
).length > 0
|
||||
) {
|
||||
setConnectedTrackerWarning(true);
|
||||
} else {
|
||||
closeApp();
|
||||
}
|
||||
}}
|
||||
>
|
||||
<CloseIcon></CloseIcon>
|
||||
@@ -214,6 +235,11 @@ export function TopBar({
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
<TrackersStillOnModal
|
||||
isOpen={showConnectedTrackersWarning}
|
||||
accept={() => closeApp()}
|
||||
cancel={() => setConnectedTrackerWarning(false)}
|
||||
></TrackersStillOnModal>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
51
gui/src/components/TrackersStillOnModal.tsx
Normal file
@@ -0,0 +1,51 @@
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { BaseModal } from './commons/BaseModal';
|
||||
import { Button } from './commons/Button';
|
||||
import { Typography } from './commons/Typography';
|
||||
|
||||
export function TrackersStillOnModal({
|
||||
isOpen = true,
|
||||
cancel,
|
||||
accept,
|
||||
}: {
|
||||
/**
|
||||
* Is the parent/sibling component opened?
|
||||
*/
|
||||
isOpen: boolean;
|
||||
/**
|
||||
* Function to trigger when you still want to close the app
|
||||
*/
|
||||
accept: () => void;
|
||||
/**
|
||||
* Function to trigger when cancelling app close
|
||||
*/
|
||||
cancel?: () => void;
|
||||
}) {
|
||||
const { l10n } = useLocalization();
|
||||
|
||||
return (
|
||||
<BaseModal isOpen={isOpen} onRequestClose={cancel}>
|
||||
<div className="flex flex-col gap-3">
|
||||
<>
|
||||
<div className="flex flex-col items-center gap-3 fill-accent-background-20">
|
||||
<div className="flex flex-col items-center gap-2">
|
||||
<Typography variant="main-title">
|
||||
{l10n.getString('trackers_still_on-modal-title')}
|
||||
</Typography>
|
||||
<Typography variant="standard">
|
||||
{l10n.getString('trackers_still_on-modal-description')}
|
||||
</Typography>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<Button variant="primary" onClick={accept}>
|
||||
{l10n.getString('trackers_still_on-modal-confirm')}
|
||||
</Button>
|
||||
<Button variant="tertiary" onClick={cancel}>
|
||||
{l10n.getString('trackers_still_on-modal-cancel')}
|
||||
</Button>
|
||||
</>
|
||||
</div>
|
||||
</BaseModal>
|
||||
);
|
||||
}
|
||||
@@ -1,7 +1,12 @@
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { useState } from 'react';
|
||||
import { SetPauseTrackingRequestT, RpcMessage } from 'solarxr-protocol';
|
||||
import { useWebsocketAPI } from '../hooks/websocket-api';
|
||||
import {
|
||||
SetPauseTrackingRequestT,
|
||||
RpcMessage,
|
||||
TrackingPauseStateResponseT,
|
||||
TrackingPauseStateRequestT,
|
||||
} from 'solarxr-protocol';
|
||||
import { useWebsocketAPI } from '@/hooks/websocket-api';
|
||||
import { BigButton } from './commons/BigButton';
|
||||
import { PlayIcon } from './commons/icon/PlayIcon';
|
||||
import { PauseIcon } from './commons/icon/PauseIcon';
|
||||
@@ -10,16 +15,26 @@ export function TrackingPauseButton(
|
||||
props: React.HTMLAttributes<HTMLButtonElement>
|
||||
) {
|
||||
const { l10n } = useLocalization();
|
||||
const { sendRPCPacket } = useWebsocketAPI();
|
||||
const { useRPCPacket, sendRPCPacket } = useWebsocketAPI();
|
||||
const [trackingPause, setTrackingPause] = useState(false);
|
||||
|
||||
const toggleTracking = () => {
|
||||
const pause = new SetPauseTrackingRequestT();
|
||||
pause.pauseTracking = !trackingPause;
|
||||
setTrackingPause(pause.pauseTracking);
|
||||
const pause = new SetPauseTrackingRequestT(!trackingPause);
|
||||
sendRPCPacket(RpcMessage.SetPauseTrackingRequest, pause);
|
||||
};
|
||||
|
||||
useRPCPacket(
|
||||
RpcMessage.TrackingPauseStateResponse,
|
||||
(data: TrackingPauseStateResponseT) => {
|
||||
setTrackingPause(data.trackingPaused);
|
||||
}
|
||||
);
|
||||
|
||||
sendRPCPacket(
|
||||
RpcMessage.TrackingPauseStateRequest,
|
||||
new TrackingPauseStateRequestT()
|
||||
);
|
||||
|
||||
return (
|
||||
<BigButton
|
||||
text={l10n.getString(
|
||||
|
||||
@@ -5,8 +5,8 @@ import { Button } from './commons/Button';
|
||||
import { Typography } from './commons/Typography';
|
||||
import { open } from '@tauri-apps/plugin-shell';
|
||||
import semver from 'semver';
|
||||
import { GH_REPO, VersionContext } from '../App';
|
||||
import { error } from '../utils/logging';
|
||||
import { GH_REPO, VersionContext } from '@/App';
|
||||
import { error } from '@/utils/logging';
|
||||
|
||||
export function VersionUpdateModal() {
|
||||
const { l10n } = useLocalization();
|
||||
|
||||
@@ -6,7 +6,7 @@ import { ResetButton } from './home/ResetButton';
|
||||
import { OverlayWidget } from './widgets/OverlayWidget';
|
||||
import { TipBox } from './commons/TipBox';
|
||||
import { DeveloperModeWidget } from './widgets/DeveloperModeWidget';
|
||||
import { useConfig } from '../hooks/config';
|
||||
import { useConfig } from '@/hooks/config';
|
||||
import {
|
||||
ResetType,
|
||||
RpcMessage,
|
||||
@@ -15,10 +15,11 @@ import {
|
||||
StatusData,
|
||||
} from 'solarxr-protocol';
|
||||
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 { parseStatusToLocale, useStatusContext } from '@/hooks/status-system';
|
||||
import { useWebsocketAPI } from '@/hooks/websocket-api';
|
||||
import { useAppContext } from '@/hooks/app';
|
||||
import { ClearMountingButton } from './ClearMountingButton';
|
||||
import { ToggleableSkeletonVisualizerWidget } from './widgets/SkeletonVisualizerWidget';
|
||||
|
||||
export function WidgetsComponent() {
|
||||
const { config } = useConfig();
|
||||
@@ -58,6 +59,9 @@ export function WidgetsComponent() {
|
||||
<div className="w-full">
|
||||
<OverlayWidget></OverlayWidget>
|
||||
</div>
|
||||
<div className="mb-2">
|
||||
<ToggleableSkeletonVisualizerWidget height={400} />
|
||||
</div>
|
||||
<div className="w-full flex flex-col gap-3 mb-2">
|
||||
{unprioritizedStatuses.map((status) => (
|
||||
<Localized
|
||||
|
||||
@@ -8,8 +8,8 @@ import {
|
||||
useState,
|
||||
} from 'react';
|
||||
import { BodyPart, TrackerDataT } from 'solarxr-protocol';
|
||||
import { FlatDeviceTracker } from '../../hooks/app';
|
||||
import { useTracker } from '../../hooks/tracker';
|
||||
import { FlatDeviceTracker } from '@/hooks/app';
|
||||
import { useTracker } from '@/hooks/tracker';
|
||||
import { PersonFrontIcon } from './PersonFrontIcon';
|
||||
|
||||
interface SlotDot {
|
||||
|
||||
@@ -2,7 +2,7 @@ import classNames from 'classnames';
|
||||
import { ReactNode, useLayoutEffect, useRef, useState } from 'react';
|
||||
import { BodyPart } from 'solarxr-protocol';
|
||||
import { PersonFrontIcon } from './PersonFrontIcon';
|
||||
import { useBreakpoint } from '../../hooks/breakpoint';
|
||||
import { useBreakpoint } from '@/hooks/breakpoint';
|
||||
|
||||
export function BodyInteractions({
|
||||
leftControls,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { BodyPart } from 'solarxr-protocol';
|
||||
import { useLocaleConfig } from '../../i18n/config';
|
||||
import { useLocaleConfig } from '@/i18n/config';
|
||||
import { AnkleIcon } from './icon/AnkleIcon';
|
||||
import { ChestIcon } from './icon/ChestIcon';
|
||||
import { ControllerIcon } from './icon/ControllerIcon';
|
||||
@@ -33,6 +33,8 @@ export const mapPart: Record<
|
||||
[BodyPart.CHEST]: ({ width }) => <ChestIcon width={width}></ChestIcon>,
|
||||
[BodyPart.HEAD]: ({ width }) => <HeadsetIcon width={width}></HeadsetIcon>,
|
||||
[BodyPart.HIP]: ({ width }) => <HipIcon width={width}></HipIcon>,
|
||||
[BodyPart.LEFT_HIP]: ({ width }) => <HipIcon width={width}></HipIcon>, // Unused
|
||||
[BodyPart.RIGHT_HIP]: ({ width }) => <HipIcon width={width}></HipIcon>, // Unused
|
||||
[BodyPart.LEFT_FOOT]: ({ width, currentLocales }) =>
|
||||
currentLocales.includes('en-x-owo') ? (
|
||||
<PawIcon></PawIcon>
|
||||
|
||||
@@ -47,7 +47,7 @@ export function Button({
|
||||
rounded = false,
|
||||
...props
|
||||
}: {
|
||||
children: ReactNode;
|
||||
children?: ReactNode;
|
||||
icon?: ReactNode;
|
||||
variant: 'primary' | 'secondary' | 'tertiary' | 'quaternary';
|
||||
to?: string;
|
||||
|
||||
@@ -5,6 +5,7 @@ import { Control, Controller } from 'react-hook-form';
|
||||
export function CheckBox({
|
||||
label,
|
||||
variant = 'checkbox',
|
||||
color = 'primary',
|
||||
control,
|
||||
outlined,
|
||||
name,
|
||||
@@ -16,6 +17,7 @@ export function CheckBox({
|
||||
control: Control<any>;
|
||||
name: string;
|
||||
variant?: 'checkbox' | 'toggle';
|
||||
color?: 'primary' | 'secondary' | 'tertiary';
|
||||
outlined?: boolean;
|
||||
} & React.HTMLProps<HTMLInputElement>) {
|
||||
const classes = useMemo(() => {
|
||||
@@ -44,8 +46,11 @@ export function CheckBox({
|
||||
<div
|
||||
className={classNames(
|
||||
{
|
||||
'bg-background-60 rounded-lg text-background-10': outlined,
|
||||
'rounded-lg': outlined,
|
||||
'text-background-30': !outlined,
|
||||
'bg-background-60': outlined && color === 'primary',
|
||||
'bg-background-70': outlined && color === 'secondary',
|
||||
'bg-background-50': outlined && color === 'tertiary',
|
||||
},
|
||||
'flex items-center gap-2 w-full'
|
||||
)}
|
||||
@@ -72,7 +77,9 @@ export function CheckBox({
|
||||
<div
|
||||
className={classNames(classes.toggle, {
|
||||
'bg-accent-background-30': value,
|
||||
'bg-background-50': !value,
|
||||
'bg-background-50':
|
||||
(!value && color == 'primary') || color == 'secondary',
|
||||
'bg-background-40': !value && color == 'tertiary',
|
||||
})}
|
||||
>
|
||||
<div
|
||||
|
||||
@@ -1,12 +1,33 @@
|
||||
import classNames from 'classnames';
|
||||
import { useEffect, useState } from 'react';
|
||||
import {
|
||||
Control,
|
||||
Controller,
|
||||
UseFormGetValues,
|
||||
useWatch,
|
||||
} from 'react-hook-form';
|
||||
import { a11yClick } from '../../utils/a11y';
|
||||
import { useEffect, useRef, useState } from 'react';
|
||||
import { Control, Controller, UseControllerProps } from 'react-hook-form';
|
||||
import { a11yClick } from '@/utils/a11y';
|
||||
import { createPortal } from 'react-dom';
|
||||
import { useElemSize } from '@/hooks/layout';
|
||||
import { ArrowDownIcon } from './icon/ArrowIcons';
|
||||
|
||||
interface DropdownProps {
|
||||
direction?: DropdownDirection;
|
||||
variant?: 'primary' | 'secondary' | 'tertiary';
|
||||
alignment?: 'right' | 'left';
|
||||
display?: 'fit' | 'block';
|
||||
placeholder: string;
|
||||
control: Control<any>;
|
||||
name: string;
|
||||
items: DropdownItem[];
|
||||
maxHeight?: string | number;
|
||||
rules?: UseControllerProps<any>['rules'];
|
||||
}
|
||||
|
||||
type DropdownItemsProps = Pick<
|
||||
DropdownProps,
|
||||
'direction' | 'variant' | 'alignment' | 'display' | 'items' | 'maxHeight'
|
||||
> & {
|
||||
onSelectItem: (item: DropdownItem) => void;
|
||||
onBackdropClick: () => void;
|
||||
value: string;
|
||||
dropdownBounds: DOMRect;
|
||||
};
|
||||
|
||||
export interface DropdownItem {
|
||||
label: string;
|
||||
@@ -16,200 +37,188 @@ export interface DropdownItem {
|
||||
|
||||
export type DropdownDirection = 'up' | 'down';
|
||||
|
||||
export function DropdownItems({
|
||||
display,
|
||||
direction,
|
||||
variant,
|
||||
alignment,
|
||||
items,
|
||||
maxHeight,
|
||||
value,
|
||||
dropdownBounds,
|
||||
onSelectItem,
|
||||
onBackdropClick,
|
||||
}: DropdownItemsProps) {
|
||||
const { height, width, ref } = useElemSize<HTMLDivElement>();
|
||||
|
||||
const GAP = 8;
|
||||
|
||||
return (
|
||||
<>
|
||||
<div
|
||||
className="z-[999] fixed top-0 w-full h-full"
|
||||
onClick={onBackdropClick}
|
||||
></div>
|
||||
<div
|
||||
ref={ref}
|
||||
className={classNames(
|
||||
'z-[1000] fixed rounded shadow',
|
||||
'overflow-y-auto dropdown-scroll overflow-x-hidden text-background-10',
|
||||
variant == 'primary' && 'bg-background-60',
|
||||
variant == 'secondary' && 'bg-background-70',
|
||||
variant == 'tertiary' && 'bg-accent-background-30',
|
||||
height == 0 && 'opacity-0' // Avoid flicker while the component find its position
|
||||
)}
|
||||
style={{
|
||||
maxHeight: maxHeight,
|
||||
left:
|
||||
alignment === 'left'
|
||||
? dropdownBounds.left
|
||||
: dropdownBounds.left + dropdownBounds.width - width,
|
||||
top:
|
||||
direction == 'down'
|
||||
? dropdownBounds.bottom + GAP
|
||||
: dropdownBounds.top - height - GAP,
|
||||
minWidth: display === 'block' ? dropdownBounds.width : 'inherit',
|
||||
}}
|
||||
>
|
||||
<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' &&
|
||||
'checked-hover:bg-background-50 text-background-20 ' +
|
||||
'checked-hover:text-background-10',
|
||||
variant == 'secondary' &&
|
||||
'checked-hover:bg-background-60 text-background-20 ' +
|
||||
'checked-hover:text-background-10',
|
||||
variant == 'tertiary' &&
|
||||
'bg-accent-background-30 checked-hover:bg-accent-background-20'
|
||||
)}
|
||||
onClick={() => {
|
||||
onSelectItem(item);
|
||||
}}
|
||||
onKeyDown={(ev) => {
|
||||
if (!a11yClick(ev)) return;
|
||||
onSelectItem(item);
|
||||
}}
|
||||
key={item.value}
|
||||
tabIndex={0}
|
||||
data-checked={item.value === value}
|
||||
>
|
||||
{item.label}
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
export function Dropdown({
|
||||
direction = 'up',
|
||||
variant = 'primary',
|
||||
alignment = 'right',
|
||||
display = 'fit',
|
||||
maxHeight = '50vh',
|
||||
placeholder,
|
||||
control,
|
||||
getValues,
|
||||
rules,
|
||||
name,
|
||||
items = [],
|
||||
}: {
|
||||
direction?: DropdownDirection;
|
||||
variant?: 'primary' | 'secondary' | 'tertiary';
|
||||
alignment?: 'right' | 'left';
|
||||
display?: 'fit' | 'block';
|
||||
placeholder: string;
|
||||
control: Control<any>;
|
||||
getValues: UseFormGetValues<any>;
|
||||
name: string;
|
||||
items: DropdownItem[];
|
||||
}) {
|
||||
const itemRefs: Record<string, HTMLLIElement> = {};
|
||||
const [isOpen, setOpen] = useState(false);
|
||||
const formValue = {
|
||||
...{ value: useWatch({ control, name }) as string },
|
||||
...{ value: getValues(name) as string },
|
||||
}: DropdownProps) {
|
||||
const ref = useRef<HTMLDivElement | null>(null);
|
||||
const [isOpen, setOpenState] = useState(false);
|
||||
const [dropdownBounds, setDropdownBounds] = useState<DOMRect>();
|
||||
|
||||
const updateBounds = () => {
|
||||
if (!ref.current) return;
|
||||
setDropdownBounds(ref.current?.getBoundingClientRect());
|
||||
};
|
||||
|
||||
const onResize = () => {
|
||||
// We could have two behaviours here:
|
||||
// 1 - We update the bounds of the dropdown so the size and position match.
|
||||
// Works but have a slight delay when resizing, kinda looks laggy
|
||||
// 2 - We close the dropdown on resize.
|
||||
// We could consider this as the same as clicking outside of the dropdown
|
||||
// This is the approach choosen RN
|
||||
setOpen(false);
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
if (!isOpen) return;
|
||||
|
||||
const curItem = itemRefs[formValue.value];
|
||||
const dropdownParent = curItem
|
||||
? (curItem.closest('.dropdown-scroll') as HTMLElement | null)
|
||||
: null;
|
||||
if (curItem && dropdownParent) {
|
||||
dropdownParent.scroll({
|
||||
top: curItem.offsetTop - dropdownParent.offsetHeight / 2,
|
||||
});
|
||||
}
|
||||
|
||||
function onWheelEvent() {
|
||||
if (isOpen && !document.querySelector('div.dropdown-scroll:hover')) {
|
||||
setOpen(false);
|
||||
}
|
||||
}
|
||||
|
||||
function onTouchEvent(event: TouchEvent) {
|
||||
// Check if we touch scroll outside of the dropdown
|
||||
if (
|
||||
isOpen &&
|
||||
!document
|
||||
.querySelector('div.dropdown-scroll')
|
||||
?.contains(event.target as HTMLDivElement)
|
||||
) {
|
||||
setOpen(false);
|
||||
}
|
||||
}
|
||||
|
||||
function onClick(event: MouseEvent) {
|
||||
const isInDropdownScroll = document
|
||||
.querySelector('div.dropdown-scroll')
|
||||
?.contains(event.target as HTMLDivElement);
|
||||
const isInDropdown = !!(event.target as HTMLDivElement).closest(
|
||||
'.dropdown'
|
||||
);
|
||||
if (isOpen && !isInDropdownScroll && !isInDropdown) {
|
||||
setOpen(false);
|
||||
}
|
||||
}
|
||||
|
||||
document.addEventListener('click', onClick, false);
|
||||
document.addEventListener('touchmove', onTouchEvent, false);
|
||||
// TS doesn't let me specify { passive: true }, but I believe it will work anyways
|
||||
document.addEventListener('wheel', onWheelEvent, { passive: true });
|
||||
window.addEventListener('resize', onResize);
|
||||
return () => {
|
||||
document.removeEventListener('wheel', onWheelEvent);
|
||||
document.removeEventListener('click', onClick);
|
||||
document.removeEventListener('touchmove', onTouchEvent);
|
||||
window.removeEventListener('resize', onResize);
|
||||
};
|
||||
}, [isOpen]);
|
||||
}, []);
|
||||
|
||||
const setOpen = (open: boolean | ((prevState: boolean) => boolean)) => {
|
||||
updateBounds();
|
||||
setOpenState(open);
|
||||
};
|
||||
|
||||
return (
|
||||
<Controller
|
||||
control={control}
|
||||
name={name}
|
||||
rules={rules}
|
||||
render={({ field: { onChange, value } }) => (
|
||||
<>
|
||||
{isOpen && (
|
||||
<div
|
||||
className="absolute top-0 left-0 w-full h-full bg-transparent"
|
||||
onClick={() => setOpen(false)}
|
||||
></div>
|
||||
)}
|
||||
<div
|
||||
ref={ref}
|
||||
className={classNames(
|
||||
'relative',
|
||||
'min-h-[42px] text-background-10 px-5 py-3 rounded-md focus:ring-4 text-center dropdown',
|
||||
'flex cursor-pointer',
|
||||
variant == 'primary' && 'bg-background-60 hover:bg-background-50',
|
||||
variant == 'secondary' &&
|
||||
'bg-background-70 hover:bg-background-60',
|
||||
variant == 'tertiary' &&
|
||||
'bg-accent-background-30 hover:bg-accent-background-20',
|
||||
display === 'fit' && 'w-fit',
|
||||
display === 'block' && 'w-full'
|
||||
)}
|
||||
onClick={() => setOpen((open) => !open)}
|
||||
onKeyDown={(ev) => a11yClick(ev) && setOpen((open) => !open)}
|
||||
tabIndex={0}
|
||||
>
|
||||
<div className="flex-grow text-standard">
|
||||
{items.find((i) => i.value == value)?.label || placeholder}
|
||||
</div>
|
||||
<div
|
||||
className={classNames(
|
||||
'min-h-[35px] text-background-10 px-5 py-2.5 rounded-md focus:ring-4 text-center dropdown',
|
||||
'flex cursor-pointer',
|
||||
variant == 'primary' &&
|
||||
'bg-background-60 hover:bg-background-50',
|
||||
variant == 'secondary' &&
|
||||
'bg-background-70 hover:bg-background-60',
|
||||
variant == 'tertiary' &&
|
||||
'bg-accent-background-30 hover:bg-accent-background-20'
|
||||
'ml-2 fill-background-10',
|
||||
direction == 'up' && 'rotate-180',
|
||||
direction == 'down' && 'rotate-0'
|
||||
)}
|
||||
onClick={() => setOpen((open) => !open)}
|
||||
onKeyDown={(ev) => a11yClick(ev) && setOpen((open) => !open)}
|
||||
tabIndex={0}
|
||||
>
|
||||
<div className="flex-grow text-standard">
|
||||
{items.find((i) => i.value == value)?.label || placeholder}
|
||||
</div>
|
||||
<div
|
||||
className={classNames(
|
||||
'ml-2',
|
||||
direction == 'up' && 'rotate-180',
|
||||
direction == 'down' && 'rotate-0'
|
||||
)}
|
||||
>
|
||||
<svg
|
||||
className="justify-end w-4 h-4 "
|
||||
aria-hidden="true"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
viewBox="0 0 24 24"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
strokeLinecap="round"
|
||||
strokeLinejoin="round"
|
||||
strokeWidth="2"
|
||||
d="M19 9l-7 7-7-7"
|
||||
></path>
|
||||
</svg>
|
||||
</div>
|
||||
<ArrowDownIcon size={16}></ArrowDownIcon>
|
||||
</div>
|
||||
{isOpen && (
|
||||
<div
|
||||
className={classNames(
|
||||
'absolute z-10 rounded shadow min-w-max max-h-[50vh]',
|
||||
'overflow-y-auto dropdown-scroll overflow-x-hidden',
|
||||
display === 'fit' && 'w-fit',
|
||||
display === 'block' && 'w-full',
|
||||
direction === 'up' && 'bottom-[45px]',
|
||||
direction === 'down' && 'top-[45px]',
|
||||
variant == 'primary' && 'bg-background-60',
|
||||
variant == 'secondary' && 'bg-background-70',
|
||||
variant == 'tertiary' && 'bg-accent-background-30',
|
||||
alignment === 'right' && 'right-0',
|
||||
alignment === 'left' && 'left-0'
|
||||
)}
|
||||
>
|
||||
<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' &&
|
||||
'checked-hover:bg-background-50 text-background-20 ' +
|
||||
'checked-hover:text-background-10',
|
||||
variant == 'secondary' &&
|
||||
'checked-hover:bg-background-60 text-background-20 ' +
|
||||
'checked-hover:text-background-10',
|
||||
variant == 'tertiary' &&
|
||||
'bg-accent-background-30 checked-hover:bg-accent-background-20'
|
||||
)}
|
||||
onClick={() => {
|
||||
onChange(item.value);
|
||||
setOpen(false);
|
||||
}}
|
||||
onKeyDown={(ev) => {
|
||||
if (!a11yClick(ev)) return;
|
||||
onChange(item.value);
|
||||
setOpen(false);
|
||||
}}
|
||||
ref={(ref) => (ref ? (itemRefs[item.value] = ref) : {})}
|
||||
key={item.value}
|
||||
tabIndex={0}
|
||||
data-checked={item.value === value}
|
||||
>
|
||||
{item.label}
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
{isOpen &&
|
||||
dropdownBounds &&
|
||||
createPortal(
|
||||
<DropdownItems
|
||||
items={items}
|
||||
dropdownBounds={dropdownBounds}
|
||||
direction={direction}
|
||||
display={display}
|
||||
alignment={alignment}
|
||||
maxHeight={maxHeight}
|
||||
variant={variant}
|
||||
value={value}
|
||||
onSelectItem={(item) => {
|
||||
setOpen(false);
|
||||
onChange(item.value);
|
||||
}}
|
||||
onBackdropClick={() => {
|
||||
setOpen(false);
|
||||
}}
|
||||
></DropdownItems>,
|
||||
document.body
|
||||
)}
|
||||
</>
|
||||
)}
|
||||
/>
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
import classNames from 'classnames';
|
||||
import { forwardRef, MouseEvent, useMemo, useState } from 'react';
|
||||
import { Control, Controller, UseControllerProps } from 'react-hook-form';
|
||||
import {
|
||||
Control,
|
||||
Controller,
|
||||
FieldError,
|
||||
UseControllerProps,
|
||||
} from 'react-hook-form';
|
||||
import { EyeIcon } from './icon/EyeIcon';
|
||||
|
||||
interface InputProps {
|
||||
@@ -14,6 +19,7 @@ export const InputInside = forwardRef<
|
||||
{
|
||||
variant?: 'primary' | 'secondary' | 'tertiary';
|
||||
label?: string;
|
||||
error?: FieldError;
|
||||
onChange: () => void;
|
||||
} & Partial<HTMLInputElement>
|
||||
>(function AppInput(
|
||||
@@ -21,10 +27,12 @@ export const InputInside = forwardRef<
|
||||
type,
|
||||
placeholder,
|
||||
label,
|
||||
disabled,
|
||||
autocomplete,
|
||||
name,
|
||||
onChange,
|
||||
value,
|
||||
error,
|
||||
variant = 'primary',
|
||||
},
|
||||
ref
|
||||
@@ -38,16 +46,40 @@ export const InputInside = forwardRef<
|
||||
|
||||
const classes = useMemo(() => {
|
||||
const variantsMap = {
|
||||
primary: classNames('bg-background-60 border-background-60'),
|
||||
secondary: classNames('bg-background-50 border-background-50'),
|
||||
tertiary: classNames('bg-background-40 border-background-40'),
|
||||
primary: classNames({
|
||||
'placeholder:text-background-30 bg-background-60 border-background-60':
|
||||
!disabled,
|
||||
'text-background-30 placeholder:text-background-30 border-background-70 bg-background-70':
|
||||
disabled,
|
||||
}),
|
||||
secondary: classNames({
|
||||
'placeholder:text-background-30 bg-background-50 border-background-50':
|
||||
!disabled,
|
||||
'text-background-40 placeholder:text-background-40 border-background-70 bg-background-70':
|
||||
disabled,
|
||||
}),
|
||||
tertiary: classNames({
|
||||
'placeholder:text-background-30 bg-background-40 border-background-40':
|
||||
!disabled,
|
||||
'text-background-30 placeholder:text-background-30 border-background-70 bg-background-70':
|
||||
disabled,
|
||||
}),
|
||||
};
|
||||
|
||||
return classNames(
|
||||
variantsMap[variant],
|
||||
'w-full focus:ring-transparent focus:ring-offset-transparent focus:outline-transparent rounded-md focus:border-accent-background-40 placeholder:text-background-30 text-standard relative'
|
||||
'w-full focus:ring-transparent focus:ring-offset-transparent min-h-[42px] z-10',
|
||||
'focus:outline-transparent rounded-md focus:border-accent-background-40',
|
||||
'text-standard relative transition-colors',
|
||||
error && 'border-status-critical border-1'
|
||||
);
|
||||
}, [variant]);
|
||||
}, [variant, disabled, error]);
|
||||
|
||||
const computedValue = disabled
|
||||
? placeholder
|
||||
: value !== undefined
|
||||
? value
|
||||
: '';
|
||||
|
||||
return (
|
||||
<label className="flex flex-col gap-1">
|
||||
@@ -60,7 +92,8 @@ export const InputInside = forwardRef<
|
||||
autoComplete={autocomplete ? 'off' : 'on'}
|
||||
onChange={onChange}
|
||||
name={name}
|
||||
value={value || ''}
|
||||
value={computedValue} // Do we want that behaviour ?
|
||||
disabled={disabled}
|
||||
ref={ref}
|
||||
></input>
|
||||
{type === 'password' && (
|
||||
@@ -71,18 +104,24 @@ export const InputInside = forwardRef<
|
||||
<EyeIcon></EyeIcon>
|
||||
</div>
|
||||
)}
|
||||
{error?.message && (
|
||||
<div className="absolute top-[38px] z-0 pt-1.5 bg-background-70 px-1 w-full rounded-b-md text-status-critical">
|
||||
{error.message}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</label>
|
||||
);
|
||||
});
|
||||
|
||||
export const Input = ({
|
||||
type,
|
||||
type = 'text',
|
||||
control,
|
||||
name,
|
||||
placeholder,
|
||||
label,
|
||||
autocomplete,
|
||||
disabled,
|
||||
variant = 'primary',
|
||||
rules,
|
||||
}: {
|
||||
@@ -95,7 +134,10 @@ export const Input = ({
|
||||
control={control}
|
||||
name={name}
|
||||
rules={rules}
|
||||
render={({ field: { onChange, value, ref, name } }) => (
|
||||
render={({
|
||||
field: { onChange, value, ref, name },
|
||||
fieldState: { error },
|
||||
}) => (
|
||||
<InputInside
|
||||
type={type}
|
||||
autocomplete={autocomplete}
|
||||
@@ -103,6 +145,8 @@ export const Input = ({
|
||||
placeholder={placeholder}
|
||||
variant={variant}
|
||||
value={value}
|
||||
disabled={disabled}
|
||||
error={error}
|
||||
onChange={onChange}
|
||||
ref={ref}
|
||||
name={name}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { useEffect, useMemo, useContext } from 'react';
|
||||
import { useForm } from 'react-hook-form';
|
||||
import { useConfig } from '../../hooks/config';
|
||||
import { langs, LangContext } from '../../i18n/config';
|
||||
import { useConfig } from '@/hooks/config';
|
||||
import { langs, LangContext } from '@/i18n/config';
|
||||
import { Dropdown, DropdownDirection } from './Dropdown';
|
||||
|
||||
export function LangSelector({
|
||||
@@ -15,11 +15,9 @@ export function LangSelector({
|
||||
const { changeLocales } = useContext(LangContext);
|
||||
const { l10n } = useLocalization();
|
||||
const { config, setConfig } = useConfig();
|
||||
const { control, watch, handleSubmit, getValues } = useForm<{ lang: string }>(
|
||||
{
|
||||
defaultValues: { lang: config?.lang || 'en' },
|
||||
}
|
||||
);
|
||||
const { control, watch, handleSubmit } = useForm<{ lang: string }>({
|
||||
defaultValues: { lang: config?.lang || 'en' },
|
||||
});
|
||||
|
||||
const languagesItems = useMemo(
|
||||
() => langs.map(({ key, name }) => ({ label: name, value: key })),
|
||||
@@ -39,7 +37,6 @@ export function LangSelector({
|
||||
return (
|
||||
<Dropdown
|
||||
control={control}
|
||||
getValues={getValues}
|
||||
name="lang"
|
||||
placeholder={l10n.getString(
|
||||
'settings-general-interface-lang-placeholder'
|
||||
|
||||
@@ -7,7 +7,7 @@ export function Radio({
|
||||
name,
|
||||
label,
|
||||
value,
|
||||
desciption,
|
||||
description,
|
||||
// input props
|
||||
disabled,
|
||||
...props
|
||||
@@ -15,8 +15,8 @@ export function Radio({
|
||||
control: Control<any>;
|
||||
name: string;
|
||||
label: string;
|
||||
value: string | number;
|
||||
desciption?: string | null;
|
||||
value: string;
|
||||
description?: string | null;
|
||||
} & React.HTMLProps<HTMLInputElement>) {
|
||||
return (
|
||||
<Controller
|
||||
@@ -24,14 +24,12 @@ export function Radio({
|
||||
name={name}
|
||||
render={({ field: { onChange, ref, name, value: checked } }) => (
|
||||
<label
|
||||
className={classNames(
|
||||
'w-full bg-background-60 p-3 rounded-md flex gap-3 border-2',
|
||||
{
|
||||
'border-accent-background-30': value == checked,
|
||||
'border-transparent': value != checked,
|
||||
'cursor-pointer': !disabled,
|
||||
}
|
||||
)}
|
||||
className={classNames('w-full p-3 rounded-md flex gap-3 border-2', {
|
||||
'border-accent-background-30': value == checked,
|
||||
'border-transparent': value != checked,
|
||||
'bg-background-60 cursor-pointer': !disabled,
|
||||
'bg-background-80 cursor-not-allowed': disabled,
|
||||
})}
|
||||
>
|
||||
<input
|
||||
type="radio"
|
||||
@@ -43,14 +41,15 @@ export function Radio({
|
||||
ref={ref}
|
||||
onChange={onChange}
|
||||
value={value}
|
||||
disabled={disabled}
|
||||
checked={value == checked}
|
||||
{...props}
|
||||
/>
|
||||
<div className="flex flex-col gap-2">
|
||||
<Typography bold>{label}</Typography>
|
||||
{desciption && (
|
||||
{description && (
|
||||
<Typography variant="standard" color="secondary">
|
||||
{desciption}
|
||||
{description}
|
||||
</Typography>
|
||||
)}
|
||||
</div>
|
||||
|
||||
@@ -13,7 +13,7 @@ export function ThemeSelector({
|
||||
control: Control<any>;
|
||||
name: string;
|
||||
colors: string | undefined;
|
||||
value: string | number;
|
||||
value: string;
|
||||
} & React.HTMLProps<HTMLInputElement>) {
|
||||
return (
|
||||
<Controller
|
||||
|
||||
@@ -8,6 +8,7 @@ export function Typography({
|
||||
whitespace = 'whitespace-normal',
|
||||
children,
|
||||
italic = false,
|
||||
textAlign,
|
||||
}: {
|
||||
variant?:
|
||||
| 'main-title'
|
||||
@@ -25,7 +26,14 @@ export function Typography({
|
||||
| 'whitespace-pre'
|
||||
| 'whitespace-pre-line'
|
||||
| 'whitespace-pre-wrap';
|
||||
children: ReactNode;
|
||||
textAlign?:
|
||||
| 'text-left'
|
||||
| 'text-center'
|
||||
| 'text-right'
|
||||
| 'text-justify'
|
||||
| 'text-start'
|
||||
| 'text-end';
|
||||
children?: ReactNode;
|
||||
}) {
|
||||
const tag = useMemo(() => {
|
||||
const tags = {
|
||||
@@ -55,9 +63,10 @@ export function Typography({
|
||||
color === 'secondary' && 'text-background-30',
|
||||
typeof color === 'string' && color,
|
||||
whitespace,
|
||||
textAlign,
|
||||
italic && 'italic',
|
||||
]),
|
||||
},
|
||||
children
|
||||
children || []
|
||||
);
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ export function ArrowDownIcon({ size = 24 }: { size?: number }) {
|
||||
);
|
||||
}
|
||||
|
||||
export function ArrowUpIcon({ size = 24 }: { size: number }) {
|
||||
export function ArrowUpIcon({ size = 24 }: { size?: number }) {
|
||||
return (
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
|
||||
@@ -7,8 +7,10 @@ export enum SlimeState {
|
||||
|
||||
export function LoaderIcon({
|
||||
slimeState = SlimeState.HAPPY,
|
||||
size = 85,
|
||||
}: {
|
||||
slimeState: SlimeState;
|
||||
size?: number | string;
|
||||
}) {
|
||||
return (
|
||||
<>
|
||||
@@ -16,28 +18,28 @@ export function LoaderIcon({
|
||||
hidden={slimeState !== SlimeState.JUMPY}
|
||||
src="/images/jumping-slime.gif"
|
||||
alt="Slime jumping"
|
||||
width="85"
|
||||
width={size}
|
||||
// className="crisp-edges"
|
||||
></img>
|
||||
<img
|
||||
hidden={slimeState !== SlimeState.HAPPY}
|
||||
src="/images/happy-slime.gif"
|
||||
alt="Happy slime"
|
||||
width="85"
|
||||
width={size}
|
||||
// className="crisp-edges"
|
||||
></img>
|
||||
<img
|
||||
hidden={slimeState !== SlimeState.SAD}
|
||||
src="/images/sad-slime.gif"
|
||||
alt="Sad slime"
|
||||
width="85"
|
||||
width={size}
|
||||
// className="crisp-edges"
|
||||
></img>
|
||||
<img
|
||||
hidden={slimeState !== SlimeState.CURIOUS}
|
||||
src="/images/curious-slime.gif"
|
||||
alt="Slime looking for something"
|
||||
width="85"
|
||||
width={size}
|
||||
// className="crisp-edges"
|
||||
></img>
|
||||
</>
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
export function TrashIcon({ width = 33 }: { width: number }) {
|
||||
export function TrashIcon({ size = 33 }: { size?: number }) {
|
||||
return (
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
width={width}
|
||||
height="29"
|
||||
width={size}
|
||||
height={size}
|
||||
>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
import { Localized, useLocalization } from '@fluent/react';
|
||||
import { NavLink, useNavigate } from 'react-router-dom';
|
||||
import { StatusData, TrackerDataT } from 'solarxr-protocol';
|
||||
import { useConfig } from '../../hooks/config';
|
||||
import { useTrackers } from '../../hooks/tracker';
|
||||
import { Typography } from '../commons/Typography';
|
||||
import { TrackerCard } from '../tracker/TrackerCard';
|
||||
import { TrackersTable } from '../tracker/TrackersTable';
|
||||
import { useConfig } from '@/hooks/config';
|
||||
import { useTrackers } from '@/hooks/tracker';
|
||||
import { Typography } from '@/components/commons/Typography';
|
||||
import { TrackerCard } from '@/components/tracker/TrackerCard';
|
||||
import { TrackersTable } from '@/components/tracker/TrackersTable';
|
||||
import {
|
||||
parseStatusToLocale,
|
||||
trackerStatusRelated,
|
||||
useStatusContext,
|
||||
} from '../../hooks/status-system';
|
||||
} from '@/hooks/status-system';
|
||||
import { useMemo } from 'react';
|
||||
import { WarningBox } from '../commons/TipBox';
|
||||
import { HeadsetIcon } from '../commons/icon/HeadsetIcon';
|
||||
import { WarningBox } from '@/components/commons/TipBox';
|
||||
import { HeadsetIcon } from '@/components/commons/icon/HeadsetIcon';
|
||||
import classNames from 'classnames';
|
||||
|
||||
const DONT_REPEAT_STATUSES = [StatusData.StatusTrackerReset];
|
||||
|
||||
@@ -6,18 +6,18 @@ import {
|
||||
RpcMessage,
|
||||
StatusData,
|
||||
} from 'solarxr-protocol';
|
||||
import { useConfig } from '../../hooks/config';
|
||||
import { useCountdown } from '../../hooks/countdown';
|
||||
import { useWebsocketAPI } from '../../hooks/websocket-api';
|
||||
import { playSoundOnResetStarted } from '../../sounds/sounds';
|
||||
import { BigButton } from '../commons/BigButton';
|
||||
import { Button } from '../commons/Button';
|
||||
import { useConfig } from '@/hooks/config';
|
||||
import { useCountdown } from '@/hooks/countdown';
|
||||
import { useWebsocketAPI } from '@/hooks/websocket-api';
|
||||
import { playSoundOnResetStarted } from '@/sounds/sounds';
|
||||
import { BigButton } from '@/components/commons/BigButton';
|
||||
import { Button } from '@/components/commons/Button';
|
||||
import {
|
||||
MountingResetIcon,
|
||||
YawResetIcon,
|
||||
FullResetIcon,
|
||||
} from '../commons/icon/ResetIcon';
|
||||
import { useStatusContext } from '../../hooks/status-system';
|
||||
} from '@/components/commons/icon/ResetIcon';
|
||||
import { useStatusContext } from '@/hooks/status-system';
|
||||
|
||||
export function ResetButton({
|
||||
type,
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import { useMemo } from 'react';
|
||||
import { BodyPart } from 'solarxr-protocol';
|
||||
import { FlatDeviceTracker } from '../../hooks/app';
|
||||
import { useTrackers } from '../../hooks/tracker';
|
||||
import { BodyInteractions } from '../commons/BodyInteractions';
|
||||
import { TrackerPartCard } from '../tracker/TrackerPartCard';
|
||||
import { FlatDeviceTracker } from '@/hooks/app';
|
||||
import { useTrackers } from '@/hooks/tracker';
|
||||
import { BodyInteractions } from '@/components/commons/BodyInteractions';
|
||||
import { TrackerPartCard } from '@/components/tracker/TrackerPartCard';
|
||||
import { BodyPartError } from './pages/trackers-assign/TrackerAssignment';
|
||||
|
||||
export const SPINE_PARTS = [
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { Button } from '../commons/Button';
|
||||
import { WarningBox } from '../commons/TipBox';
|
||||
import { Button } from '@/components/commons/Button';
|
||||
import { WarningBox } from '@/components/commons/TipBox';
|
||||
import { Localized, useLocalization } from '@fluent/react';
|
||||
import { BaseModal } from '../commons/BaseModal';
|
||||
import { BaseModal } from '@/components/commons/BaseModal';
|
||||
import ReactModal from 'react-modal';
|
||||
|
||||
export function NeckWarningModal({
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
import { ReactNode } from 'react';
|
||||
import {
|
||||
OnboardingContextC,
|
||||
useProvideOnboarding,
|
||||
} from '../../hooks/onboarding';
|
||||
import { OnboardingContextC, useProvideOnboarding } from '@/hooks/onboarding';
|
||||
|
||||
export function OnboardingContextProvider({
|
||||
children,
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import { ReactNode, useState } from 'react';
|
||||
import { useLayout } from '../../hooks/layout';
|
||||
import { useOnboarding } from '../../hooks/onboarding';
|
||||
import { MainLayoutRoute } from '../MainLayout';
|
||||
import { TopBar } from '../TopBar';
|
||||
import { useBreakpoint } from '../../hooks/breakpoint';
|
||||
import { useLayout } from '@/hooks/layout';
|
||||
import { useOnboarding } from '@/hooks/onboarding';
|
||||
import { MainLayoutRoute } from '@/components/MainLayout';
|
||||
import { TopBar } from '@/components/TopBar';
|
||||
import { useBreakpoint } from '@/hooks/breakpoint';
|
||||
import { SkipSetupButton } from './SkipSetupButton';
|
||||
import { SkipSetupWarningModal } from './SkipSetupWarningModal';
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import classNames from 'classnames';
|
||||
import { useEffect } from 'react';
|
||||
import { EscapeIcon } from '../commons/icon/EscapeIcon';
|
||||
import { EscapeIcon } from '@/components/commons/icon/EscapeIcon';
|
||||
|
||||
export function SkipSetupButton({
|
||||
modalVisible,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { Button } from '../commons/Button';
|
||||
import { WarningBox } from '../commons/TipBox';
|
||||
import { Button } from '@/components/commons/Button';
|
||||
import { WarningBox } from '@/components/commons/TipBox';
|
||||
import { Localized, useLocalization } from '@fluent/react';
|
||||
import { BaseModal } from '../commons/BaseModal';
|
||||
import { BaseModal } from '@/components/commons/BaseModal';
|
||||
import ReactModal from 'react-modal';
|
||||
import { useNavigate } from 'react-router-dom';
|
||||
|
||||
|
||||
@@ -7,9 +7,10 @@ import {
|
||||
useRef,
|
||||
useState,
|
||||
} from 'react';
|
||||
import { useElemSize } from '../../hooks/layout';
|
||||
import { CheckIcon } from '../commons/icon/CheckIcon';
|
||||
import { Typography } from '../commons/Typography';
|
||||
import { useElemSize } from '@/hooks/layout';
|
||||
import { CheckIcon } from '@/components/commons/icon/CheckIcon';
|
||||
import { Typography } from '@/components/commons/Typography';
|
||||
import { useDebouncedEffect } from '@/hooks/timeout';
|
||||
|
||||
type StepComponentType = FC<{
|
||||
nextStep: () => void;
|
||||
@@ -99,6 +100,7 @@ export function StepperSlider({
|
||||
const ref = useRef<HTMLDivElement | null>(null);
|
||||
const { width } = useElemSize(ref);
|
||||
const [stepsContainers, setSteps] = useState(0);
|
||||
const [shouldAnimate, setShouldAnimate] = useState(true);
|
||||
const [step, setStep] = useState(0);
|
||||
|
||||
useEffect(() => {
|
||||
@@ -122,11 +124,26 @@ export function StepperSlider({
|
||||
setStep(0);
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
setShouldAnimate(false);
|
||||
}, [width]);
|
||||
|
||||
// Make it so if you resize the window it wont try to move the slide with an animation
|
||||
useDebouncedEffect(
|
||||
() => {
|
||||
setShouldAnimate(true);
|
||||
},
|
||||
[width],
|
||||
500
|
||||
);
|
||||
|
||||
return (
|
||||
<div className="w-full flex flex-col gap-4">
|
||||
<div className="w-full flex" ref={ref}>
|
||||
<div
|
||||
className="transition-transform duration-500 flex gap-8"
|
||||
className={classNames('flex gap-8', {
|
||||
'transition-transform duration-500 ': shouldAnimate,
|
||||
})}
|
||||
style={{ transform: `translateX(-${(width + 32) * step}px)` }}
|
||||
>
|
||||
{steps.map(({ type, component: StepComponent }, index) => (
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
import { Localized, useLocalization } from '@fluent/react';
|
||||
import { useOnboarding } from '../../../hooks/onboarding';
|
||||
import { Button } from '../../commons/Button';
|
||||
import { Typography } from '../../commons/Typography';
|
||||
import { useOnboarding } from '@/hooks/onboarding';
|
||||
import { Button } from '@/components/commons/Button';
|
||||
import { Typography } from '@/components/commons/Typography';
|
||||
import { useMemo, useState } from 'react';
|
||||
import { ProgressBar } from '../../commons/ProgressBar';
|
||||
import { LoaderIcon, SlimeState } from '../../commons/icon/LoaderIcon';
|
||||
import { useCountdown } from '../../../hooks/countdown';
|
||||
import { ProgressBar } from '@/components/commons/ProgressBar';
|
||||
import { LoaderIcon, SlimeState } from '@/components/commons/icon/LoaderIcon';
|
||||
import { useCountdown } from '@/hooks/countdown';
|
||||
import classNames from 'classnames';
|
||||
import { TaybolIcon } from '../../commons/icon/TaybolIcon';
|
||||
import { TaybolIcon } from '@/components/commons/icon/TaybolIcon';
|
||||
|
||||
export enum CalibrationStatus {
|
||||
SUCCESS,
|
||||
|
||||
@@ -9,19 +9,19 @@ import {
|
||||
WifiProvisioningStatus,
|
||||
WifiProvisioningStatusResponseT,
|
||||
} from 'solarxr-protocol';
|
||||
import { useLayout } from '../../../hooks/layout';
|
||||
import { useOnboarding } from '../../../hooks/onboarding';
|
||||
import { useTrackers } from '../../../hooks/tracker';
|
||||
import { useWebsocketAPI } from '../../../hooks/websocket-api';
|
||||
import { ArrowLink } from '../../commons/ArrowLink';
|
||||
import { Button } from '../../commons/Button';
|
||||
import { LoaderIcon, SlimeState } from '../../commons/icon/LoaderIcon';
|
||||
import { ProgressBar } from '../../commons/ProgressBar';
|
||||
import { TipBox } from '../../commons/TipBox';
|
||||
import { Typography } from '../../commons/Typography';
|
||||
import { TrackerCard } from '../../tracker/TrackerCard';
|
||||
import { useBnoExists } from '../../../hooks/imu-logic';
|
||||
import { useBreakpoint } from '../../../hooks/breakpoint';
|
||||
import { useLayout } from '@/hooks/layout';
|
||||
import { useOnboarding } from '@/hooks/onboarding';
|
||||
import { useTrackers } from '@/hooks/tracker';
|
||||
import { useWebsocketAPI } from '@/hooks/websocket-api';
|
||||
import { ArrowLink } from '@/components/commons/ArrowLink';
|
||||
import { Button } from '@/components/commons/Button';
|
||||
import { LoaderIcon, SlimeState } from '@/components/commons/icon/LoaderIcon';
|
||||
import { ProgressBar } from '@/components/commons/ProgressBar';
|
||||
import { TipBox } from '@/components/commons/TipBox';
|
||||
import { Typography } from '@/components/commons/Typography';
|
||||
import { TrackerCard } from '@/components/tracker/TrackerCard';
|
||||
import { useBnoExists } from '@/hooks/imu-logic';
|
||||
import { useBreakpoint } from '@/hooks/breakpoint';
|
||||
|
||||
const BOTTOM_HEIGHT = 80;
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { useOnboarding } from '../../../hooks/onboarding';
|
||||
import { Button } from '../../commons/Button';
|
||||
import { SlimeVRIcon } from '../../commons/icon/SimevrIcon';
|
||||
import { Typography } from '../../commons/Typography';
|
||||
import { useOnboarding } from '@/hooks/onboarding';
|
||||
import { Button } from '@/components/commons/Button';
|
||||
import { SlimeVRIcon } from '@/components/commons/icon/SimevrIcon';
|
||||
import { Typography } from '@/components/commons/Typography';
|
||||
|
||||
export function DonePage() {
|
||||
const { l10n } = useLocalization();
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { useOnboarding } from '../../../hooks/onboarding';
|
||||
import { ArrowLink } from '../../commons/ArrowLink';
|
||||
import { Button } from '../../commons/Button';
|
||||
import { Typography } from '../../commons/Typography';
|
||||
import { useOnboarding } from '@/hooks/onboarding';
|
||||
import { ArrowLink } from '@/components/commons/ArrowLink';
|
||||
import { Button } from '@/components/commons/Button';
|
||||
import { Typography } from '@/components/commons/Typography';
|
||||
|
||||
export function EnterVRPage() {
|
||||
const { l10n } = useLocalization();
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { useOnboarding } from '../../../hooks/onboarding';
|
||||
import { Button } from '../../commons/Button';
|
||||
import { SlimeVRIcon } from '../../commons/icon/SimevrIcon';
|
||||
import { LangSelector } from '../../commons/LangSelector';
|
||||
import { Typography } from '../../commons/Typography';
|
||||
import { useOnboarding } from '@/hooks/onboarding';
|
||||
import { Button } from '@/components/commons/Button';
|
||||
import { SlimeVRIcon } from '@/components/commons/icon/SimevrIcon';
|
||||
import { LangSelector } from '@/components/commons/LangSelector';
|
||||
import { Typography } from '@/components/commons/Typography';
|
||||
|
||||
export function HomePage() {
|
||||
const { l10n } = useLocalization();
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { useOnboarding } from '../../../hooks/onboarding';
|
||||
import { Button } from '../../commons/Button';
|
||||
import { Typography } from '../../commons/Typography';
|
||||
import { useOnboarding } from '@/hooks/onboarding';
|
||||
import { Button } from '@/components/commons/Button';
|
||||
import { Typography } from '@/components/commons/Typography';
|
||||
import { useState, useMemo, useEffect } from 'react';
|
||||
import {
|
||||
BodyPart,
|
||||
@@ -12,12 +12,12 @@ import {
|
||||
SettingsRequestT,
|
||||
SettingsResponseT,
|
||||
} from 'solarxr-protocol';
|
||||
import { useTrackers } from '../../../hooks/tracker';
|
||||
import { BodyDisplay } from '../../commons/BodyDisplay';
|
||||
import { useWebsocketAPI } from '../../../hooks/websocket-api';
|
||||
import { useTrackers } from '@/hooks/tracker';
|
||||
import { BodyDisplay } from '@/components/commons/BodyDisplay';
|
||||
import { useWebsocketAPI } from '@/hooks/websocket-api';
|
||||
import classNames from 'classnames';
|
||||
import { useBreakpoint } from '../../../hooks/breakpoint';
|
||||
import { log } from '../../../utils/logging';
|
||||
import { useBreakpoint } from '@/hooks/breakpoint';
|
||||
import { log } from '@/utils/logging';
|
||||
|
||||
export function ResetTutorialPage() {
|
||||
const { isMobile } = useBreakpoint('mobile');
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
import { Localized, useLocalization } from '@fluent/react';
|
||||
import { useOnboarding } from '../../../hooks/onboarding';
|
||||
import { useWifiForm } from '../../../hooks/wifi-form';
|
||||
import { Button } from '../../commons/Button';
|
||||
import { Input } from '../../commons/Input';
|
||||
import { Typography } from '../../commons/Typography';
|
||||
import { useOnboarding } from '@/hooks/onboarding';
|
||||
import { useWifiForm } from '@/hooks/wifi-form';
|
||||
import { Button } from '@/components/commons/Button';
|
||||
import { Input } from '@/components/commons/Input';
|
||||
import { Typography } from '@/components/commons/Typography';
|
||||
import classNames from 'classnames';
|
||||
import { useTrackers } from '../../../hooks/tracker';
|
||||
import { useBnoExists } from '../../../hooks/imu-logic';
|
||||
import { useTrackers } from '@/hooks/tracker';
|
||||
import { useBnoExists } from '@/hooks/imu-logic';
|
||||
|
||||
export function WifiCredsPage() {
|
||||
const { l10n } = useLocalization();
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { useOnboarding } from '../../../../hooks/onboarding';
|
||||
import { Button } from '../../../commons/Button';
|
||||
import { Typography } from '../../../commons/Typography';
|
||||
import { useTrackers } from '../../../../hooks/tracker';
|
||||
import { useBnoExists } from '../../../../hooks/imu-logic';
|
||||
import { useOnboarding } from '@/hooks/onboarding';
|
||||
import { Button } from '@/components/commons/Button';
|
||||
import { Typography } from '@/components/commons/Typography';
|
||||
import { useTrackers } from '@/hooks/tracker';
|
||||
import { useBnoExists } from '@/hooks/imu-logic';
|
||||
import { StickerSlime } from './StickerSlime';
|
||||
import { TrackerArrow } from './TrackerArrow';
|
||||
import { ExtensionArrow } from './ExtensionArrow';
|
||||
|
||||
@@ -1,21 +1,18 @@
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { RpcMessage, SkeletonResetAllRequestT } from 'solarxr-protocol';
|
||||
import {
|
||||
AutoboneContextC,
|
||||
useProvideAutobone,
|
||||
} from '../../../../hooks/autobone';
|
||||
import { useOnboarding } from '../../../../hooks/onboarding';
|
||||
import { useWebsocketAPI } from '../../../../hooks/websocket-api';
|
||||
import { Button } from '../../../commons/Button';
|
||||
import { Typography } from '../../../commons/Typography';
|
||||
import { StepperSlider } from '../../StepperSlider';
|
||||
import { AutoboneContextC, useProvideAutobone } from '@/hooks/autobone';
|
||||
import { useOnboarding } from '@/hooks/onboarding';
|
||||
import { useWebsocketAPI } from '@/hooks/websocket-api';
|
||||
import { Button } from '@/components/commons/Button';
|
||||
import { Typography } from '@/components/commons/Typography';
|
||||
import { StepperSlider } from '@/components/onboarding/StepperSlider';
|
||||
import { DoneStep } from './autobone-steps/Done';
|
||||
import { RequirementsStep } from './autobone-steps/Requirements';
|
||||
import { PutTrackersOnStep } from './autobone-steps/PutTrackersOn';
|
||||
import { Recording } from './autobone-steps/Recording';
|
||||
import { StartRecording } from './autobone-steps/StartRecording';
|
||||
import { VerifyResultsStep } from './autobone-steps/VerifyResults';
|
||||
import { useCountdown } from '../../../../hooks/countdown';
|
||||
import { useCountdown } from '@/hooks/countdown';
|
||||
import { CheckHeight } from './autobone-steps/СheckHeight';
|
||||
|
||||
export function AutomaticProportionsPage() {
|
||||
|
||||
@@ -12,12 +12,15 @@ import {
|
||||
LabelType,
|
||||
ProportionChangeType,
|
||||
useManualProportions,
|
||||
} from '../../../../hooks/manual-proportions';
|
||||
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';
|
||||
} from '@/hooks/manual-proportions';
|
||||
import { useLocaleConfig } from '@/i18n/config';
|
||||
import { Typography } from '@/components/commons/Typography';
|
||||
import {
|
||||
ArrowDownIcon,
|
||||
ArrowUpIcon,
|
||||
} from '@/components/commons/icon/ArrowIcons';
|
||||
import { useBreakpoint } from '@/hooks/breakpoint';
|
||||
import { debounce } from '@/hooks/timeout';
|
||||
|
||||
function IncrementButton({
|
||||
children,
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
import { useForm } from 'react-hook-form';
|
||||
import { RpcMessage, SkeletonResetAllRequestT } from 'solarxr-protocol';
|
||||
import { useOnboarding } from '../../../../hooks/onboarding';
|
||||
import { useWebsocketAPI } from '../../../../hooks/websocket-api';
|
||||
import { Button } from '../../../commons/Button';
|
||||
import { CheckBox } from '../../../commons/Checkbox';
|
||||
import { PersonFrontIcon } from '../../../commons/PersonFrontIcon';
|
||||
import { Typography } from '../../../commons/Typography';
|
||||
import { useOnboarding } from '@/hooks/onboarding';
|
||||
import { useWebsocketAPI } from '@/hooks/websocket-api';
|
||||
import { Button } from '@/components/commons/Button';
|
||||
import { CheckBox } from '@/components/commons/Checkbox';
|
||||
import { Typography } from '@/components/commons/Typography';
|
||||
import { BodyProportions } from './BodyProportions';
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { useEffect, useMemo } from 'react';
|
||||
import { useBreakpoint } from '../../../../hooks/breakpoint';
|
||||
import { useBreakpoint } from '@/hooks/breakpoint';
|
||||
import { SkeletonVisualizerWidget } from '@/components/widgets/SkeletonVisualizerWidget';
|
||||
|
||||
export function ButtonsControl() {
|
||||
const { l10n } = useLocalization();
|
||||
@@ -101,7 +101,7 @@ export function ManualProportionsPage() {
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex-col flex-grow gap-3 rounded-xl fill-background-50 items-center hidden md:flex">
|
||||
<PersonFrontIcon width={200}></PersonFrontIcon>
|
||||
<SkeletonVisualizerWidget height="65vh" maxHeight={600} />
|
||||
</div>
|
||||
</div>
|
||||
{!isMobile && (
|
||||
|
||||
@@ -1,25 +1,34 @@
|
||||
import { useOnboarding } from '../../../../hooks/onboarding';
|
||||
import { useOnboarding } from '@/hooks/onboarding';
|
||||
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';
|
||||
import { Typography } from '@/components/commons/Typography';
|
||||
import { Button } from '@/components/commons/Button';
|
||||
import {
|
||||
SkeletonConfigResponseT,
|
||||
RpcMessage,
|
||||
SkeletonConfigRequestT,
|
||||
SkeletonBone,
|
||||
ChangeSkeletonConfigRequestT,
|
||||
} from 'solarxr-protocol';
|
||||
import { useWebsocketAPI } from '../../../../hooks/websocket-api';
|
||||
import saveAs from 'file-saver';
|
||||
import { useWebsocketAPI } from '@/hooks/websocket-api';
|
||||
import { save } from '@tauri-apps/plugin-dialog';
|
||||
import { writeTextFile } from '@tauri-apps/plugin-fs';
|
||||
import { useIsTauri } from '../../../../hooks/breakpoint';
|
||||
import { useAppContext } from '../../../../hooks/app';
|
||||
import { error } from '../../../../utils/logging';
|
||||
import { useIsTauri } from '@/hooks/breakpoint';
|
||||
import { useAppContext } from '@/hooks/app';
|
||||
import { error } from '@/utils/logging';
|
||||
import { fileOpen, fileSave } from 'browser-fs-access';
|
||||
import { useDebouncedEffect } from '@/hooks/timeout';
|
||||
|
||||
export const MIN_HEIGHT = 0.4;
|
||||
export const MAX_HEIGHT = 4;
|
||||
export const DEFAULT_HEIGHT = 1.5;
|
||||
export const CURRENT_EXPORT_VERSION = 1;
|
||||
|
||||
enum ImportStatus {
|
||||
FAILED,
|
||||
SUCCESS,
|
||||
OK,
|
||||
}
|
||||
|
||||
export function ProportionsChoose() {
|
||||
const isTauri = useIsTauri();
|
||||
@@ -27,8 +36,15 @@ export function ProportionsChoose() {
|
||||
const { applyProgress, state } = useOnboarding();
|
||||
const { useRPCPacket, sendRPCPacket } = useWebsocketAPI();
|
||||
const [animated, setAnimated] = useState(false);
|
||||
const [importState, setImportState] = useState(ImportStatus.OK);
|
||||
const { computedTrackers } = useAppContext();
|
||||
|
||||
useDebouncedEffect(
|
||||
() => setImportState(ImportStatus.OK),
|
||||
[importState],
|
||||
2000
|
||||
);
|
||||
|
||||
const hmdTracker = useMemo(
|
||||
() =>
|
||||
computedTrackers.find(
|
||||
@@ -48,9 +64,27 @@ export function ProportionsChoose() {
|
||||
[hmdTracker?.tracker.position?.y]
|
||||
);
|
||||
|
||||
const importStatusKey = useMemo(() => {
|
||||
switch (importState) {
|
||||
case ImportStatus.FAILED:
|
||||
return 'onboarding-choose_proportions-import-failed';
|
||||
case ImportStatus.SUCCESS:
|
||||
return 'onboarding-choose_proportions-import-success';
|
||||
case ImportStatus.OK:
|
||||
return 'onboarding-choose_proportions-import';
|
||||
}
|
||||
}, [importState]);
|
||||
|
||||
useRPCPacket(
|
||||
RpcMessage.SkeletonConfigResponse,
|
||||
(data: SkeletonConfigResponseT) => {
|
||||
(data: SkeletonConfigExport) => {
|
||||
// Convert the skeleton part enums into a string
|
||||
data.skeletonParts.forEach((x) => {
|
||||
if (typeof x.bone === 'number')
|
||||
x.bone = SkeletonBone[x.bone] as SkeletonBoneKey;
|
||||
});
|
||||
data.version = CURRENT_EXPORT_VERSION;
|
||||
|
||||
const blob = new Blob([JSON.stringify(data)], {
|
||||
type: 'application/json',
|
||||
});
|
||||
@@ -71,13 +105,52 @@ export function ProportionsChoose() {
|
||||
error(err);
|
||||
});
|
||||
} else {
|
||||
saveAs(blob, 'body-proportions.json');
|
||||
fileSave(blob, {
|
||||
fileName: 'body-proportions.json',
|
||||
extensions: ['.json'],
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
applyProgress(0.85);
|
||||
|
||||
const onImport = async () => {
|
||||
const file = await fileOpen({
|
||||
mimeTypes: ['application/json'],
|
||||
});
|
||||
|
||||
const text = await file.text();
|
||||
const config = JSON.parse(text) as SkeletonConfigExport;
|
||||
if (
|
||||
!config?.skeletonParts?.length ||
|
||||
!Array.isArray(config.skeletonParts)
|
||||
) {
|
||||
error(
|
||||
'failed to import body proportions because skeletonParts is not an array/empty'
|
||||
);
|
||||
return setImportState(ImportStatus.FAILED);
|
||||
}
|
||||
|
||||
for (const bone of [...config.skeletonParts]) {
|
||||
if (
|
||||
(typeof bone.bone === 'string' && !(bone.bone in SkeletonBone)) ||
|
||||
(typeof bone.bone === 'number' &&
|
||||
typeof SkeletonBone[bone.bone] !== 'string')
|
||||
) {
|
||||
error(
|
||||
`failed to import body proportions because ${bone.bone} is not a valid bone`
|
||||
);
|
||||
return setImportState(ImportStatus.FAILED);
|
||||
}
|
||||
}
|
||||
|
||||
parseConfigImport(config).forEach((req) =>
|
||||
sendRPCPacket(RpcMessage.ChangeSkeletonConfigRequest, req)
|
||||
);
|
||||
setImportState(ImportStatus.SUCCESS);
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className="flex flex-col gap-5 h-full items-center w-full xs:justify-center mobile:overflow-y-auto relative px-4 pb-4">
|
||||
@@ -171,7 +244,7 @@ export function ProportionsChoose() {
|
||||
</div>
|
||||
<div>
|
||||
<Localized
|
||||
id="onboarding-choose_proportions-auto_proportions-descriptionv2"
|
||||
id="onboarding-choose_proportions-auto_proportions-descriptionv3"
|
||||
elems={{ b: <b></b> }}
|
||||
>
|
||||
<Typography
|
||||
@@ -196,7 +269,7 @@ export function ProportionsChoose() {
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex flex-row">
|
||||
<div className="flex flex-row gap-3">
|
||||
{!state.alonePage && (
|
||||
<Button variant="secondary" to="/onboarding/reset-tutorial">
|
||||
{l10n.getString('onboarding-previous_step')}
|
||||
@@ -214,9 +287,46 @@ export function ProportionsChoose() {
|
||||
>
|
||||
{l10n.getString('onboarding-choose_proportions-export')}
|
||||
</Button>
|
||||
<Button
|
||||
variant={!state.alonePage ? 'secondary' : 'tertiary'}
|
||||
className={classNames(
|
||||
'transition-colors',
|
||||
importState === ImportStatus.FAILED && 'bg-status-critical',
|
||||
importState === ImportStatus.SUCCESS && 'bg-status-success'
|
||||
)}
|
||||
onClick={onImport}
|
||||
>
|
||||
{l10n.getString(importStatusKey)}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
function parseConfigImport(
|
||||
config: SkeletonConfigExport
|
||||
): ChangeSkeletonConfigRequestT[] {
|
||||
if (!config.version) config.version = 1;
|
||||
if (config.version < 1) {
|
||||
// Add config migration stuff here, this one is just an example.
|
||||
}
|
||||
|
||||
return config.skeletonParts.map((part) => {
|
||||
const bone =
|
||||
typeof part.bone === 'string' ? SkeletonBone[part.bone] : part.bone;
|
||||
|
||||
return new ChangeSkeletonConfigRequestT(bone, part.value);
|
||||
});
|
||||
}
|
||||
|
||||
type SkeletonBoneKey = keyof typeof SkeletonBone;
|
||||
|
||||
interface SkeletonConfigExport {
|
||||
version?: number;
|
||||
skeletonParts: {
|
||||
bone: SkeletonBoneKey | SkeletonBone;
|
||||
value: number;
|
||||
}[];
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
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';
|
||||
import { BaseModal } from '@/components/commons/BaseModal';
|
||||
import { WarningBox } from '@/components/commons/TipBox';
|
||||
import { Button } from '@/components/commons/Button';
|
||||
import { A } from '@/components/commons/A';
|
||||
import { DOCS_SITE, SLIMEVR_DISCORD } from '@/App';
|
||||
|
||||
export function AutoboneErrorModal({
|
||||
isOpen = true,
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { Typography } from '../../../../commons/Typography';
|
||||
import { Typography } from '@/components/commons/Typography';
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { Button } from '../../../../commons/Button';
|
||||
import { Button } from '@/components/commons/Button';
|
||||
import { SkeletonVisualizerWidget } from '@/components/widgets/SkeletonVisualizerWidget';
|
||||
|
||||
export function DoneStep({ variant }: { variant: 'onboarding' | 'alone' }) {
|
||||
const { l10n } = useLocalization();
|
||||
@@ -16,13 +17,14 @@ export function DoneStep({ variant }: { variant: 'onboarding' | 'alone' }) {
|
||||
</Typography>
|
||||
</div>
|
||||
|
||||
<div className="flex">
|
||||
<div className="flex gap-3">
|
||||
{variant === 'onboarding' && (
|
||||
<Button variant="primary" to="/onboarding/done">
|
||||
{l10n.getString('onboarding-continue')}
|
||||
</Button>
|
||||
)}
|
||||
</div>
|
||||
<SkeletonVisualizerWidget />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import { useBreakpoint } from '../../../../../hooks/breakpoint';
|
||||
import { useTrackers } from '../../../../../hooks/tracker';
|
||||
import { BodyDisplay } from '../../../../commons/BodyDisplay';
|
||||
import { Button } from '../../../../commons/Button';
|
||||
import { TipBox } from '../../../../commons/TipBox';
|
||||
import { Typography } from '../../../../commons/Typography';
|
||||
import { useBreakpoint } from '@/hooks/breakpoint';
|
||||
import { useTrackers } from '@/hooks/tracker';
|
||||
import { BodyDisplay } from '@/components/commons/BodyDisplay';
|
||||
import { Button } from '@/components/commons/Button';
|
||||
import { TipBox } from '@/components/commons/TipBox';
|
||||
import { Typography } from '@/components/commons/Typography';
|
||||
import { useLocalization } from '@fluent/react';
|
||||
|
||||
export function PutTrackersOnStep({
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
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 { ProcessStatus, useAutobone } from '@/hooks/autobone';
|
||||
import { ProgressBar } from '@/components/commons/ProgressBar';
|
||||
import { TipBox } from '@/components/commons/TipBox';
|
||||
import { Typography } from '@/components/commons/Typography';
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { P, match } from 'ts-pattern';
|
||||
import { AutoboneErrorModal } from './AutoboneErrorModal';
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { Button } from '../../../../commons/Button';
|
||||
import { Typography } from '../../../../commons/Typography';
|
||||
import { Button } from '@/components/commons/Button';
|
||||
import { Typography } from '@/components/commons/Typography';
|
||||
import { useLocalization } from '@fluent/react';
|
||||
|
||||
export function RequirementsStep({
|
||||
@@ -26,7 +26,7 @@ export function RequirementsStep({
|
||||
<>
|
||||
{l10n
|
||||
.getString(
|
||||
'onboarding-automatic_proportions-requirements-description'
|
||||
'onboarding-automatic_proportions-requirements-descriptionv2'
|
||||
)
|
||||
.split('\n')
|
||||
.map((line, i) => (
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { useAutobone } from '../../../../../hooks/autobone';
|
||||
import { Button } from '../../../../commons/Button';
|
||||
import { TipBox } from '../../../../commons/TipBox';
|
||||
import { Typography } from '../../../../commons/Typography';
|
||||
import { useAutobone } from '@/hooks/autobone';
|
||||
import { Button } from '@/components/commons/Button';
|
||||
import { TipBox } from '@/components/commons/TipBox';
|
||||
import { Typography } from '@/components/commons/Typography';
|
||||
import { useLocalization } from '@fluent/react';
|
||||
|
||||
export function StartRecording({
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import classNames from 'classnames';
|
||||
import { ProcessStatus, useAutobone } from '../../../../../hooks/autobone';
|
||||
import { Button } from '../../../../commons/Button';
|
||||
import { Typography } from '../../../../commons/Typography';
|
||||
import { ProcessStatus, useAutobone } from '@/hooks/autobone';
|
||||
import { Button } from '@/components/commons/Button';
|
||||
import { Typography } from '@/components/commons/Typography';
|
||||
import { useLocalization } from '@fluent/react';
|
||||
|
||||
export function VerifyResultsStep({
|
||||
|
||||
@@ -5,16 +5,19 @@ import {
|
||||
HeightResponseT,
|
||||
RpcMessage,
|
||||
} from 'solarxr-protocol';
|
||||
import { useWebsocketAPI } from '../../../../../hooks/websocket-api';
|
||||
import { Button } from '../../../../commons/Button';
|
||||
import { Typography } from '../../../../commons/Typography';
|
||||
import { useWebsocketAPI } from '@/hooks/websocket-api';
|
||||
import { Button } from '@/components/commons/Button';
|
||||
import { Typography } from '@/components/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';
|
||||
import { NumberSelector } from '@/components/commons/NumberSelector';
|
||||
import {
|
||||
DEFAULT_HEIGHT,
|
||||
MIN_HEIGHT,
|
||||
} from '@/components/onboarding/pages/body-proportions/ProportionsChoose';
|
||||
import { useLocaleConfig } from '@/i18n/config';
|
||||
import { useCountdown } from '@/hooks/countdown';
|
||||
|
||||
interface HeightForm {
|
||||
height: number;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { useOnboarding } from '../../../../hooks/onboarding';
|
||||
import { Typography } from '../../../commons/Typography';
|
||||
import { Step, StepperSlider } from '../../StepperSlider';
|
||||
import { useOnboarding } from '@/hooks/onboarding';
|
||||
import { Typography } from '@/components/commons/Typography';
|
||||
import { Step, StepperSlider } from '@/components/onboarding/StepperSlider';
|
||||
import { DoneStep } from './mounting-steps/Done';
|
||||
import { MountingResetStep } from './mounting-steps/MountingReset';
|
||||
import { PreparationStep } from './mounting-steps/Preparation';
|
||||
|
||||
@@ -1,24 +1,26 @@
|
||||
import { useMemo, useState } from 'react';
|
||||
import { useEffect, useMemo, useState } from 'react';
|
||||
import { AssignTrackerRequestT, BodyPart, RpcMessage } from 'solarxr-protocol';
|
||||
import { FlatDeviceTracker } from '../../../../hooks/app';
|
||||
import { useOnboarding } from '../../../../hooks/onboarding';
|
||||
import { useTrackers } from '../../../../hooks/tracker';
|
||||
import { useWebsocketAPI } from '../../../../hooks/websocket-api';
|
||||
import { MountingOrientationDegreesToQuatT } from '../../../../maths/quaternion';
|
||||
import { Button } from '../../../commons/Button';
|
||||
import { TipBox } from '../../../commons/TipBox';
|
||||
import { Typography } from '../../../commons/Typography';
|
||||
import { BodyAssignment } from '../../BodyAssignment';
|
||||
import { FlatDeviceTracker } from '@/hooks/app';
|
||||
import { useOnboarding } from '@/hooks/onboarding';
|
||||
import { useTrackers } from '@/hooks/tracker';
|
||||
import { useWebsocketAPI } from '@/hooks/websocket-api';
|
||||
import { MountingOrientationDegreesToQuatT } from '@/maths/quaternion';
|
||||
import { Button } from '@/components/commons/Button';
|
||||
import { TipBox } from '@/components/commons/TipBox';
|
||||
import { Typography } from '@/components/commons/Typography';
|
||||
import { BodyAssignment } from '@/components/onboarding/BodyAssignment';
|
||||
import { MountingSelectionMenu } from './MountingSelectionMenu';
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { useBreakpoint } from '../../../../hooks/breakpoint';
|
||||
import { useBreakpoint } from '@/hooks/breakpoint';
|
||||
import { Quaternion } from 'three';
|
||||
import { useConfig } from '@/hooks/config';
|
||||
|
||||
export function ManualMountingPage() {
|
||||
const { isMobile } = useBreakpoint('mobile');
|
||||
const { l10n } = useLocalization();
|
||||
const { applyProgress, state } = useOnboarding();
|
||||
const { sendRPCPacket } = useWebsocketAPI();
|
||||
const { setConfig } = useConfig();
|
||||
|
||||
const [selectedRole, setSelectRole] = useState<BodyPart>(BodyPart.NONE);
|
||||
|
||||
@@ -27,6 +29,10 @@ export function ManualMountingPage() {
|
||||
const { useAssignedTrackers } = useTrackers();
|
||||
const assignedTrackers = useAssignedTrackers();
|
||||
|
||||
useEffect(() => {
|
||||
setConfig({ doneManualMounting: true });
|
||||
}, []);
|
||||
|
||||
const trackerPartGrouped = useMemo(
|
||||
() =>
|
||||
assignedTrackers.reduce<{ [key: number]: FlatDeviceTracker[] }>(
|
||||
|
||||
@@ -1,16 +1,22 @@
|
||||
import { useOnboarding } from '../../../../hooks/onboarding';
|
||||
import { useOnboarding } from '@/hooks/onboarding';
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { useState } from 'react';
|
||||
import { SkipSetupWarningModal } from '../../SkipSetupWarningModal';
|
||||
import { SkipSetupWarningModal } from '@/components/onboarding/SkipSetupWarningModal';
|
||||
import classNames from 'classnames';
|
||||
import { Typography } from '../../../commons/Typography';
|
||||
import { Button } from '../../../commons/Button';
|
||||
import { Typography } from '@/components/commons/Typography';
|
||||
import { Button } from '@/components/commons/Button';
|
||||
import { TryManualFirstModal } from './TryManualFirstModal';
|
||||
import { useConfig } from '@/hooks/config';
|
||||
import { useNavigate } from 'react-router';
|
||||
|
||||
export function MountingChoose() {
|
||||
const { l10n } = useLocalization();
|
||||
const { applyProgress, skipSetup, state } = useOnboarding();
|
||||
const navigate = useNavigate();
|
||||
const { config, setConfig } = useConfig();
|
||||
const [animated, setAnimated] = useState(false);
|
||||
const [skipWarning, setSkipWarning] = useState(false);
|
||||
const [manualModal, setManualModal] = useState(false);
|
||||
|
||||
applyProgress(0.65);
|
||||
|
||||
@@ -66,7 +72,16 @@ export function MountingChoose() {
|
||||
</div>
|
||||
<Button
|
||||
variant={!state.alonePage ? 'secondary' : 'tertiary'}
|
||||
to="/onboarding/mounting/auto"
|
||||
to={
|
||||
config?.doneManualMounting
|
||||
? '/onboarding/mounting/auto'
|
||||
: undefined
|
||||
}
|
||||
onClick={
|
||||
!config?.doneManualMounting
|
||||
? () => setManualModal(true)
|
||||
: undefined
|
||||
}
|
||||
className="self-start mt-auto"
|
||||
state={{ alonePage: state.alonePage }}
|
||||
>
|
||||
@@ -137,6 +152,14 @@ export function MountingChoose() {
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
<TryManualFirstModal
|
||||
isOpen={manualModal}
|
||||
accept={() => {
|
||||
setConfig({ doneManualMounting: true });
|
||||
navigate('/onboarding/mounting/auto');
|
||||
}}
|
||||
cancel={() => setManualModal(false)}
|
||||
></TryManualFirstModal>
|
||||
<SkipSetupWarningModal
|
||||
accept={skipSetup}
|
||||
onClose={() => setSkipWarning(false)}
|
||||
|
||||