Compare commits
72 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 | ||
|
|
4cab877daa | ||
|
|
71366b9d52 | ||
|
|
de2dee45e4 | ||
|
|
522ec4c96a | ||
|
|
dc2937bdb0 | ||
|
|
57aaf2e7ee | ||
|
|
b30e4dadbe | ||
|
|
9a5c694278 | ||
|
|
f6bad3f3de | ||
|
|
5a4d1399b7 | ||
|
|
7fc0c88331 | ||
|
|
9eb63b6fb9 | ||
|
|
50620dd42f | ||
|
|
7b1e4a84d3 | ||
|
|
917092eb00 | ||
|
|
4df2d8771c | ||
|
|
a92dec8805 | ||
|
|
942f64a2f1 | ||
|
|
5211d340d2 | ||
|
|
f3cefdcc61 | ||
|
|
00e0824a84 | ||
|
|
7f9f6f4b18 | ||
|
|
81bf58f8c0 | ||
|
|
2d35456645 | ||
|
|
25da8715fe | ||
|
|
e366c5909c | ||
|
|
ed04b70713 | ||
|
|
e6bcbd9b3a | ||
|
|
fc44d902f1 | ||
|
|
c975949c35 | ||
|
|
c611570524 | ||
|
|
02e0af8c51 | ||
|
|
e4e5a884ef | ||
|
|
6d005223c7 | ||
|
|
975f340a63 | ||
|
|
cdb4d15d60 | ||
|
|
f343b0e80c | ||
|
|
dad0188854 |
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
|
||||
|
||||
8
.github/workflows/build-gui.yml
vendored
@@ -41,7 +41,7 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ubuntu-20.04, windows-latest, macos-latest]
|
||||
os: [ubuntu-22.04, windows-latest, macos-latest]
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
@@ -54,11 +54,11 @@ jobs:
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- if: matrix.os == 'ubuntu-20.04'
|
||||
- if: matrix.os == 'ubuntu-22.04'
|
||||
name: Set up Linux dependencies
|
||||
uses: awalsh128/cache-apt-pkgs-action@latest
|
||||
with:
|
||||
packages: libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf
|
||||
packages: libgtk-3-dev webkit2gtk-4.1 libappindicator3-dev librsvg2-dev patchelf
|
||||
# Increment to invalidate the cache
|
||||
version: 1.0
|
||||
# Enables a workaround to attempt to run pre and post install scripts
|
||||
@@ -91,7 +91,7 @@ jobs:
|
||||
# A file, directory or wildcard pattern that describes what to upload
|
||||
path: target/release/slimevr.exe
|
||||
|
||||
- if: matrix.os == 'ubuntu-20.04'
|
||||
- if: matrix.os == 'ubuntu-22.04'
|
||||
name: Upload a Build Artifact (Linux)
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
|
||||
10
.github/workflows/gradle.yaml
vendored
@@ -23,7 +23,7 @@ jobs:
|
||||
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
|
||||
@@ -52,7 +52,7 @@ jobs:
|
||||
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
|
||||
@@ -85,7 +85,7 @@ jobs:
|
||||
|
||||
|
||||
bundle-linux:
|
||||
runs-on: ubuntu-20.04
|
||||
runs-on: ubuntu-22.04
|
||||
needs: [build, test]
|
||||
if: contains(fromJSON('["workflow_dispatch", "create"]'), github.event_name)
|
||||
steps:
|
||||
@@ -101,7 +101,7 @@ jobs:
|
||||
- name: Set up Linux dependencies
|
||||
uses: awalsh128/cache-apt-pkgs-action@latest
|
||||
with:
|
||||
packages: libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf libfuse2
|
||||
packages: libgtk-3-dev webkit2gtk-4.1 libappindicator3-dev librsvg2-dev patchelf libfuse2
|
||||
# Increment to invalidate the cache
|
||||
version: 1.0
|
||||
# Enables a workaround to attempt to run pre and post install scripts
|
||||
@@ -112,7 +112,7 @@ jobs:
|
||||
- name: Cache cargo dependencies
|
||||
uses: Swatinem/rust-cache@v2
|
||||
with:
|
||||
shared-key: "ubuntu-20.04"
|
||||
shared-key: "ubuntu-22.04"
|
||||
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v3
|
||||
|
||||
1
.gitignore
vendored
@@ -36,6 +36,7 @@ build/
|
||||
|
||||
# direnv has been claimed for Nix usage
|
||||
.direnv/
|
||||
.devenv
|
||||
|
||||
# Ignore Android local properties
|
||||
local.properties
|
||||
|
||||
36
.husky/pre-commit
Executable file
@@ -0,0 +1,36 @@
|
||||
#!/usr/bin/env sh
|
||||
. "$(dirname -- "$0")/_/husky.sh"
|
||||
|
||||
YELLOW="\033[1;33m"
|
||||
GREEN="\033[1;32m"
|
||||
RESET="\033[0m"
|
||||
|
||||
if git rev-parse -q --verify MERGE_HEAD; then
|
||||
echo -e "${YELLOW}Skipping precommit hook because of merge${RESET}"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
APP_PRE_COMMIT_OPTIONS="$(dirname "$0")/_/pre-commit.options"
|
||||
|
||||
if ! [ -f "$APP_PRE_COMMIT_OPTIONS" ]; then
|
||||
echo -e "${YELLOW}\nSkipping pre-commit hook."
|
||||
echo -e "If you want to use pre-commit for lint-staged, run:\n"
|
||||
echo -e " ${GREEN}echo -e 'APP_LINT=true;' > ${APP_PRE_COMMIT_OPTIONS}${RESET}"
|
||||
echo -e "${YELLOW}\nIt will add some delay before committing!\n${RESET}"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
source $APP_PRE_COMMIT_OPTIONS
|
||||
|
||||
if [ -n "${APP_LINT}" ] && [ "${APP_LINT}" == "true" ]; then
|
||||
echo -e "${GREEN}[husky] [pre-commit] [lint-staged]${RESET}"
|
||||
case "$(uname -sr)" in
|
||||
CYGWIN*|MINGW*|MINGW32*|MSYS*)
|
||||
npx.cmd lint-staged
|
||||
;;
|
||||
|
||||
*)
|
||||
npx lint-staged
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
9
.lintstagedrc.mjs
Normal file
@@ -0,0 +1,9 @@
|
||||
export default {
|
||||
'server/**/*.{java,kt,kts}': (filenames) =>
|
||||
filenames.map(
|
||||
(filename) =>
|
||||
`./gradlew${
|
||||
process.platform === 'win32' ? '.bat' : ''
|
||||
} spotlessApply "-PspotlessIdeHook=${filename}"`
|
||||
),
|
||||
};
|
||||
1472
Cargo.lock
generated
@@ -15,3 +15,8 @@ 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" }
|
||||
tauri-build = { 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>
|
||||
|
||||
312
flake.lock
generated
@@ -1,5 +1,59 @@
|
||||
{
|
||||
"nodes": {
|
||||
"devenv": {
|
||||
"inputs": {
|
||||
"flake-compat": "flake-compat",
|
||||
"nix": "nix",
|
||||
"nixpkgs": "nixpkgs",
|
||||
"pre-commit-hooks": "pre-commit-hooks"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1692203620,
|
||||
"narHash": "sha256-9SF/H8oCWv166q5o+JtV7tK+koydgFMu02HCB27UWpU=",
|
||||
"owner": "cachix",
|
||||
"repo": "devenv",
|
||||
"rev": "eee80243720b7f284128873a9694a520d9967b2f",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "cachix",
|
||||
"repo": "devenv",
|
||||
"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": 1690933134,
|
||||
"narHash": "sha256-ab989mN63fQZBFrkk4Q8bYxQCktuHmBIBqUG1jl6/FQ=",
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"rev": "59cf3f1447cfc75087e7273b04b31e689a8599fb",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"id": "flake-parts",
|
||||
"type": "indirect"
|
||||
}
|
||||
},
|
||||
"flake-utils": {
|
||||
"inputs": {
|
||||
"systems": "systems"
|
||||
@@ -19,15 +73,12 @@
|
||||
}
|
||||
},
|
||||
"flake-utils_2": {
|
||||
"inputs": {
|
||||
"systems": "systems_2"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1681202837,
|
||||
"narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=",
|
||||
"lastModified": 1653893745,
|
||||
"narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "cfacdce06f30d2b68473a46042957675eebb3401",
|
||||
"rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -36,28 +87,111 @@
|
||||
"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": 1688922987,
|
||||
"narHash": "sha256-RnQwrCD5anqWfyDAVbfFIeU+Ha6cwt5QcIwIkaGRzQw=",
|
||||
"owner": "nlewo",
|
||||
"repo": "nix2container",
|
||||
"rev": "ab381a7d714ebf96a83882264245dbd34f0a7ec8",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nlewo",
|
||||
"repo": "nix2container",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1686412476,
|
||||
"narHash": "sha256-inl9SVk6o5h75XKC79qrDCAobTD1Jxh6kVYTZKHzewA=",
|
||||
"lastModified": 1678875422,
|
||||
"narHash": "sha256-T3o6NcQPwXjxJMn2shz86Chch4ljXgZn746c2caGxd8=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "21951114383770f96ae528d0ae68824557768e81",
|
||||
"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,32 +201,109 @@
|
||||
"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": 1686364106,
|
||||
"narHash": "sha256-h4gCQg+jizmAbdg6UPlhxQVk4A7Ar/zoLa0wx3wBya0=",
|
||||
"owner": "oxalica",
|
||||
"repo": "rust-overlay",
|
||||
"rev": "ba011dd1c5028dbb880bc3b0f427e0ff689e6203",
|
||||
"dir": "lib",
|
||||
"lastModified": 1690881714,
|
||||
"narHash": "sha256-h/nXluEqdiQHs1oSgkOOWF+j8gcJMWhwnZ9PFabN6q0=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "9e1960bc196baf6881340d53dccb203a951745a2",
|
||||
"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": 1692356644,
|
||||
"narHash": "sha256-AYkPFT+CbCVSBmh0WwIzPpwhEJ4Yy3A7JZvUkGJIg5o=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "8ecc900b2f695d74dea35a92f8a9f9b32c8ea33d",
|
||||
"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",
|
||||
"flake-parts": "flake-parts",
|
||||
"mk-shell-bin": "mk-shell-bin",
|
||||
"nix2container": "nix2container",
|
||||
"nixpkgs": "nixpkgs_2"
|
||||
}
|
||||
},
|
||||
"systems": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
@@ -107,21 +318,6 @@
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"systems_2": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
|
||||
172
flake.nix
@@ -1,87 +1,109 @@
|
||||
{
|
||||
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";
|
||||
};
|
||||
|
||||
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 = {
|
||||
self,
|
||||
nixpkgs,
|
||||
flake-utils,
|
||||
rust-overlay,
|
||||
}:
|
||||
flake-utils.lib.eachDefaultSystem
|
||||
(
|
||||
system: let
|
||||
overlays = [(import rust-overlay)];
|
||||
pkgs = import nixpkgs {
|
||||
inherit system overlays;
|
||||
};
|
||||
rustTarget = pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml;
|
||||
nativeBuildInputs = with pkgs; [
|
||||
curl
|
||||
gcc
|
||||
openssl
|
||||
pkgconfig
|
||||
which
|
||||
zlib
|
||||
outputs = inputs @ {flake-parts, ...}:
|
||||
flake-parts.lib.mkFlake {inherit inputs;} {
|
||||
imports = [
|
||||
inputs.devenv.flakeModule
|
||||
];
|
||||
systems = ["x86_64-linux" "i686-linux" "x86_64-darwin" "aarch64-linux" "aarch64-darwin"];
|
||||
|
||||
freetype
|
||||
expat
|
||||
];
|
||||
buildInputs = with pkgs; [
|
||||
appimagekit
|
||||
atk
|
||||
cairo
|
||||
dbus
|
||||
dbus.lib
|
||||
dprint
|
||||
gdk-pixbuf
|
||||
glib.out
|
||||
gobject-introspection
|
||||
gtk3
|
||||
harfbuzz
|
||||
libayatana-appindicator-gtk3
|
||||
libffi
|
||||
libsoup
|
||||
openssl.out
|
||||
pango
|
||||
pkg-config
|
||||
treefmt
|
||||
webkitgtk
|
||||
zlib
|
||||
gst_all_1.gstreamer
|
||||
gst_all_1.gst-plugins-base
|
||||
gst_all_1.gst-plugins-good
|
||||
gst_all_1.gst-plugins-bad
|
||||
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.
|
||||
|
||||
# Some nice things to have
|
||||
exa
|
||||
fd
|
||||
# Equivalent to inputs'.nixpkgs.legacyPackages.hello;
|
||||
# packages.default = pkgs.hello;
|
||||
|
||||
jdk17 # JDK17
|
||||
nodejs
|
||||
gradle
|
||||
];
|
||||
in {
|
||||
devShells.default = pkgs.mkShell {
|
||||
nativeBuildInputs =
|
||||
nativeBuildInputs
|
||||
++ [
|
||||
];
|
||||
buildInputs =
|
||||
buildInputs
|
||||
++ [
|
||||
rustTarget
|
||||
devenv.shells.default = {
|
||||
name = "slimevr";
|
||||
|
||||
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
|
||||
];
|
||||
|
||||
# https://devenv.sh/reference/options/
|
||||
packages =
|
||||
[
|
||||
]
|
||||
++ lib.optionals pkgs.stdenv.isLinux (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
|
||||
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;
|
||||
|
||||
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.
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
0
gradlew.bat
vendored
Normal file → Executable file
@@ -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": {
|
||||
|
||||
3
gui/.gitignore
vendored
@@ -28,3 +28,6 @@ yarn-error.log*
|
||||
# vite
|
||||
/dist
|
||||
/stats.html
|
||||
|
||||
# eslint
|
||||
.eslintcache
|
||||
|
||||
5
gui/.lintstagedrc.mjs
Normal file
@@ -0,0 +1,5 @@
|
||||
export default {
|
||||
"**/*.{ts,tsx}": () => "tsc -p tsconfig.json --noEmit",
|
||||
"**/*.{js,jsx,ts,tsx}": "eslint --max-warnings=0 --cache --fix",
|
||||
"**/*.{js,jsx,ts,tsx,css,md,json}": "prettier --write"
|
||||
};
|
||||
@@ -8,12 +8,18 @@
|
||||
"@fontsource/poppins": "^4.5.8",
|
||||
"@formatjs/intl-localematcher": "^0.2.32",
|
||||
"@react-three/fiber": "^8.10.0",
|
||||
"@tauri-apps/api": "^1.4.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",
|
||||
"@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",
|
||||
@@ -25,6 +31,7 @@
|
||||
"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-responsive": "^9.0.2",
|
||||
@@ -41,8 +48,8 @@
|
||||
"dev": "tauri dev",
|
||||
"skipbundler": "tauri build -b none",
|
||||
"tauri": "tauri",
|
||||
"lint": "eslint --max-warnings=0 \"src/**/*.{js,jsx,ts,tsx,json}\" && prettier --check \"src/**/*.{js,jsx,ts,tsx,css,md,json}\"",
|
||||
"lint:fix": "eslint --fix \"src/**/*.{js,jsx,ts,tsx,json}\"",
|
||||
"lint": "tsc --noEmit && eslint --max-warnings=0 \"src/**/*.{js,jsx,ts,tsx,json}\" && prettier --check \"src/**/*.{js,jsx,ts,tsx,css,md,json}\"",
|
||||
"lint:fix": "tsc --noEmit && eslint --fix --max-warnings=0 \"src/**/*.{js,jsx,ts,tsx,json}\" && npm run format",
|
||||
"format": "prettier --write \"src/**/*.{js,jsx,ts,tsx,css,md,json}\"",
|
||||
"preview-vite": "vite preview",
|
||||
"javaversion-build": "cd src-tauri/src/ && javac JavaVersion.java && jar cvfe JavaVersion.jar JavaVersion JavaVersion.class"
|
||||
@@ -65,11 +72,13 @@
|
||||
]
|
||||
},
|
||||
"devDependencies": {
|
||||
"@dword-design/eslint-plugin-import-alias": "^4.0.8",
|
||||
"@tailwindcss/forms": "^0.5.3",
|
||||
"@tauri-apps/cli": "^1.4.0",
|
||||
"@tauri-apps/cli": "^2.0.0-alpha.10",
|
||||
"@types/file-saver": "^2.0.5",
|
||||
"@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",
|
||||
"@typescript-eslint/eslint-plugin": "^5.60.1",
|
||||
|
||||
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 11 KiB |
@@ -7,7 +7,7 @@
|
||||
|
||||
## Websocket (server) status
|
||||
|
||||
websocket-connecting = جاري التوصيل بالسيرفر
|
||||
websocket-connecting = يتم التوصيل بالسيرفر
|
||||
websocket-connection_lost = انقطع الاتصال بالسيرفر. يتم إعادة التوصيل...
|
||||
|
||||
## Update notification
|
||||
@@ -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 = محاكاة فايف
|
||||
@@ -671,8 +683,8 @@ onboarding-assignment_tutorial = كيفية تحضير جهاز تعقب Slime
|
||||
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 = 2. قم بتوصيل الشريط بجهاز التعقب، مع الحفاظ على جانب الفيلكرو من الشريط في نفس اتجاه وجه السلايم لجهاز التعقب:
|
||||
onboarding-assignment_tutorial-second_step-continuation-v2 = يجب أن يكون جانب الفيلكرو للامتداد متجها للأعلى مثل الصورة التالية:
|
||||
onboarding-assignment_tutorial-done = وضعت الملصقات والأشرطة!
|
||||
|
||||
## Tracker assignment setup
|
||||
@@ -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
|
||||
@@ -863,9 +878,9 @@ onboarding-automatic_proportions-check_height-fetch_height = أنا واقف!
|
||||
# Context is that the height is unknown
|
||||
onboarding-automatic_proportions-check_height-unknown = مجهول
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-height = طولك هو
|
||||
onboarding-automatic_proportions-check_height-hmd_height1 = طولك من خلال HMD
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-hmd_height = وارتفاع HMD هو
|
||||
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 = سنقوم الآن بتسجيل بعض الوضعيات والحركات المحددة. ستتم مطالبتك بذلك في الشاشة التالية. كن مستعدا للبدء عند الضغط على الزر!
|
||||
|
||||
@@ -351,11 +351,19 @@ settings-general-fk_settings-leg_fk = leg twacking
|
||||
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-skeleton_settings = skeweton sewttings
|
||||
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
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis_model = extwended pewvis modew
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees_model = extwended nee modew
|
||||
settings-general-fk_settings-skeleton_settings-ratios = skeweton watios
|
||||
settings-general-fk_settings-skeleton_settings-ratios-description = change da vawue of skeweton settings. u may need to ajust ur pawpowshuns aftew changin dese.
|
||||
settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_hip = impute waist fwom chest to hip
|
||||
settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_legs = impute waist fwom chest to wegs
|
||||
settings-general-fk_settings-skeleton_settings-impute_hip_from_chest_legs = impute hip fwom chest to wegs
|
||||
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-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
|
||||
@@ -651,8 +659,8 @@ onboarding-assignment_tutorial = how to pwepawe a Swime Twackew befowe puting it
|
||||
onboarding-assignment_tutorial-first_step = 1. pwace a body pawt stickew (if you has wun) on da twackew accowding to u choosing :3
|
||||
# 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 = 2. put da stwap to u twackew, keep da hook an woop side of the stwap face in the fowlowing owientation:
|
||||
onboarding-assignment_tutorial-second_step-continuation = da hook an woop side fow da extenson shouwd be in this owientation:
|
||||
onboarding-assignment_tutorial-second_step-v2 = 2. attach da stwap to youw twackew, keeping da vewcwo side of da stwap facing da same diwecshun as da swime face of youw twackew:
|
||||
onboarding-assignment_tutorial-second_step-continuation-v2 = da vewcwo side fow da extenshun shud be facing up wike da fowwowing image:
|
||||
onboarding-assignment_tutorial-done = i put da stickew an stwap on :3
|
||||
|
||||
## Tracker assignment setup
|
||||
@@ -839,9 +847,9 @@ onboarding-automatic_proportions-check_height-fetch_height = am standing!
|
||||
# Context is that the height is unknown
|
||||
onboarding-automatic_proportions-check_height-unknown = unnown
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-height = youw height is
|
||||
onboarding-automatic_proportions-check_height-hmd_height1 = youw hmd heit is
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-hmd_height = an hmd height is
|
||||
onboarding-automatic_proportions-check_height-height1 = so youw actuaw heit is
|
||||
onboarding-automatic_proportions-check_height-next_step = dey awe fine
|
||||
onboarding-automatic_proportions-start_recording-title = get wowdy to move
|
||||
onboarding-automatic_proportions-start_recording-description = we'we now going to wowcawd some specific poses and moves. these will be pwompted in teh wowst screen. be wowdy to stawt when teh buttawn is pwessed!
|
||||
|
||||
@@ -322,9 +322,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-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 +349,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.
|
||||
@@ -612,8 +624,8 @@ onboarding-assignment_tutorial = How to prepare a Slime Tracker before putting i
|
||||
onboarding-assignment_tutorial-first_step = 1. Place a body part sticker (if you have one) on the tracker according to your choosing
|
||||
# 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 = 2. Attach the strap to your tracker, keeping the hook and loop side of the strap face in the following orientation:
|
||||
onboarding-assignment_tutorial-second_step-continuation = The hook and loop side for the extension should be in this orientation:
|
||||
onboarding-assignment_tutorial-second_step-v2 = 2. Attach the strap to your tracker, keeping the velcro side of the strap facing the same direction as the slime face of your tracker:
|
||||
onboarding-assignment_tutorial-second_step-continuation-v2 = The velcro side for the extension should be facing up like the following image:
|
||||
onboarding-assignment_tutorial-done = I put stickers and straps!
|
||||
|
||||
## Tracker assignment setup
|
||||
@@ -747,6 +759,9 @@ onboarding-choose_proportions-manual_proportions = Manual proportions
|
||||
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
|
||||
|
||||
@@ -351,11 +351,19 @@ settings-general-fk_settings-leg_fk = Tracking de piernas
|
||||
settings-general-fk_settings-arm_fk = Trackeo de brazos
|
||||
settings-general-fk_settings-arm_fk-description = Cambia cómo el movimiento de los brazos es detectado.
|
||||
settings-general-fk_settings-arm_fk-force_arms = Forzar brazos desde el HMD
|
||||
settings-general-fk_settings-skeleton_settings = Ajustes de esqueleto
|
||||
settings-general-fk_settings-skeleton_settings-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
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis_model = Modelo extendido del pelvis
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees_model = Modelo extendido de la rodilla
|
||||
settings-general-fk_settings-skeleton_settings-ratios = Radios del esqueleto
|
||||
settings-general-fk_settings-skeleton_settings-ratios-description = Cambia los valores de los ajustes del esqueleto. Podes llegar a necesitar reajustar tus proporciones después de cambiar estos valores.
|
||||
settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_hip = Imputar de la cintura al pecho hasta la cadera
|
||||
settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_legs = Imputar de la cintura al pecho hasta las piernas
|
||||
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-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
|
||||
@@ -651,8 +659,8 @@ onboarding-assignment_tutorial = Como preparar un Tracker Slime antes de ponerte
|
||||
onboarding-assignment_tutorial-first_step = 1. Pon un sticker con la parte del cuerpo de tu elección (si tenes uno)
|
||||
# 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 = 2. Coloque la correa en el tracker, manteniendo el lado con velcro de la correa en la siguiente orientación:
|
||||
onboarding-assignment_tutorial-second_step-continuation = El lado con velcro en las extensiones deben también estar en la siguiente orientación:
|
||||
onboarding-assignment_tutorial-second_step-v2 = 2. Coloca la tira de velcro a tu tracker, manteniendo el lado del velcro de la tira, mirando para la misma dirección que la cara del slime de tu sensor:
|
||||
onboarding-assignment_tutorial-second_step-continuation-v2 = El lado del velcro de la tira para la extensión deberá estar viendo para arriba como en la siguiente imagen:
|
||||
onboarding-assignment_tutorial-done = ¡Puse las correas y stickers!
|
||||
|
||||
## Tracker assignment setup
|
||||
@@ -838,9 +846,9 @@ onboarding-automatic_proportions-check_height-fetch_height = Estoy de pie
|
||||
# Context is that the height is unknown
|
||||
onboarding-automatic_proportions-check_height-unknown = Desconocida
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-height = Su altura es
|
||||
onboarding-automatic_proportions-check_height-hmd_height1 = La altura de tu HMD es
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-hmd_height = Y la altura del VR es
|
||||
onboarding-automatic_proportions-check_height-height1 = entonces tu altura real es
|
||||
onboarding-automatic_proportions-check_height-next_step = Están bien
|
||||
onboarding-automatic_proportions-start_recording-title = Prepárate para moverte
|
||||
onboarding-automatic_proportions-start_recording-description = Ahora vamos a grabar poses y movimientos en específico. Estas serán mostradas en la siguiente ventana. ¡Prepárate para empezar cuando presiones el botón!
|
||||
|
||||
@@ -81,6 +81,7 @@ skeleton_bone-ELBOW_OFFSET = Compensacion de los codos
|
||||
reset-reset_all = Reiniciar todas las proporciones
|
||||
reset-full = Reiniciar
|
||||
reset-mounting = Reiniciar montura
|
||||
reset-yaw = Restablecimiento horizontal
|
||||
|
||||
## Serial detection stuff
|
||||
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
### SlimeVR complete GUI translations
|
||||
|
||||
|
||||
# Please developers (not translators) don't reuse a key inside another key
|
||||
# or concat text with a translation string in the code, use the appropriate
|
||||
# features like variables and selectors in each appropriate case!
|
||||
@@ -13,10 +10,19 @@
|
||||
websocket-connecting = Serveriga ühendamine
|
||||
websocket-connection_lost = Ühendus serveriga on kaotatud. Ühenduse taastamine...
|
||||
|
||||
## Update notification
|
||||
|
||||
version_update-title = Uus versioon olemas: { $version }
|
||||
version_update-description = Vajutades "{ version_update-update }" tõmbab programm alla SlimeVR installeri.
|
||||
version_update-update = Värskenda
|
||||
version_update-close = Sulge
|
||||
|
||||
## Tips
|
||||
|
||||
tips-find_tracker = Ei ole kindel milline jälgija on mis? Raputage jälgijat ja vaadake milline jälgija tõstetakse esile.
|
||||
tips-find_tracker = Ei ole kindel milline jälgija on mis? Raputage jälgijat, ning õige jälgija tõstetakse esile.
|
||||
tips-do_not_move_heels = Veenduge, et teie kannad ei liigu salvestamise ajal!
|
||||
tips-file_select = Pukseerige failid kasutamiseks, või <u>sirvi</u>.
|
||||
tips-tap_setup = Saate jälgija valimiseks menüüst valimise asemel aeglaselt oma jälgijat 2 korda puudutada.
|
||||
|
||||
## Body parts
|
||||
|
||||
@@ -30,6 +36,7 @@ body_part-RIGHT_HAND = Parem käsi
|
||||
body_part-RIGHT_UPPER_LEG = Parem reis
|
||||
body_part-RIGHT_LOWER_LEG = Parem säär
|
||||
body_part-RIGHT_FOOT = Parem jalg
|
||||
body_part-UPPER_CHEST = Rinna ülaosa
|
||||
body_part-CHEST = Rind
|
||||
body_part-WAIST = Vöökoht
|
||||
body_part-HIP = Puus
|
||||
@@ -46,19 +53,23 @@ body_part-LEFT_FOOT = Vasak jalg
|
||||
skeleton_bone-NONE = Mitte midagi
|
||||
skeleton_bone-HEAD = Pea Nihe
|
||||
skeleton_bone-NECK = Kaela Pikkus
|
||||
skeleton_bone-CHEST = Chest Length
|
||||
skeleton_bone-CHEST_OFFSET = Chest Offset
|
||||
skeleton_bone-WAIST = Waist Length
|
||||
skeleton_bone-HIP = Hip Lengthskeleton_bone-CHEST = Rinna Vahemaa
|
||||
skeleton_bone-torso_group = Torso pikkus
|
||||
skeleton_bone-UPPER_CHEST = Rinna ülaosa pikkus
|
||||
skeleton_bone-CHEST_OFFSET = Rindkere nihe
|
||||
skeleton_bone-CHEST = Rinna pikkus
|
||||
skeleton_bone-WAIST = Vööümbermõõt
|
||||
skeleton_bone-HIP = Puusa pikkus
|
||||
skeleton_bone-HIP_OFFSET = Puusa Nihe
|
||||
skeleton_bone-HIPS_WIDTH = Puusa Laius
|
||||
skeleton_bone-UPPER_LEG = Upper Leg Length
|
||||
skeleton_bone-leg_group = Jala pikkus
|
||||
skeleton_bone-UPPER_LEG = Jala ülaosa pikkus
|
||||
skeleton_bone-LOWER_LEG = Lower Leg Length
|
||||
skeleton_bone-FOOT_LENGTH = Jala Pikkus
|
||||
skeleton_bone-FOOT_SHIFT = Jala Nihe
|
||||
skeleton_bone-SKELETON_OFFSET = Skeletti Nihe
|
||||
skeleton_bone-SHOULDERS_DISTANCE = Õlgade Kaugus
|
||||
skeleton_bone-SHOULDERS_WIDTH = Õlgade Laius
|
||||
skeleton_bone-arm_group = Käe pikkus
|
||||
skeleton_bone-UPPER_ARM = Õlavarre Pikkus
|
||||
skeleton_bone-LOWER_ARM = Käsivarre Kaugus
|
||||
skeleton_bone-HAND_Y = Käte kaugus Y
|
||||
@@ -70,6 +81,7 @@ skeleton_bone-ELBOW_OFFSET = Küünarnuki Nihe
|
||||
reset-reset_all = Lähtesta kõik proportsioonid
|
||||
reset-full = Lähtesta
|
||||
reset-mounting = Lähtesta Paigaldusasend
|
||||
reset-yaw = Lähtesta lengerdus
|
||||
|
||||
## Serial detection stuff
|
||||
|
||||
@@ -90,11 +102,16 @@ navbar-mounting = Jälgijate Paigalduse Kalibreerimine
|
||||
navbar-onboarding = Häälestusviisard
|
||||
navbar-settings = Seaded
|
||||
|
||||
## Bounding volume hierarchy recording
|
||||
## Biovision hierarchy recording
|
||||
|
||||
bvh-start_recording = Salvesta BVH
|
||||
bvh-recording = Salvestamine...
|
||||
|
||||
## Tracking pause
|
||||
|
||||
tracking-unpaused = Peata jälgimine
|
||||
tracking-paused = Jätka jälgimine
|
||||
|
||||
## Widget: Overlay settings
|
||||
|
||||
widget-overlay = Ülekate
|
||||
@@ -105,13 +122,17 @@ widget-overlay-is_mirrored_label = Näita Ülekatet Peeglina
|
||||
|
||||
widget-drift_compensation-clear = Selgem triivi kompenseerimine
|
||||
|
||||
## Widget: Clear Reset Mounting
|
||||
|
||||
widget-clear_mounting = Lähtesta paigaldusasend
|
||||
|
||||
## Widget: Developer settings
|
||||
|
||||
widget-developer_mode = Arendaja režiim
|
||||
widget-developer_mode-high_contrast = Kõrge kontrastsus
|
||||
widget-developer_mode-precise_rotation = Täpne pööre
|
||||
widget-developer_mode-fast_data_feed = Kiire andmevoog
|
||||
widget-developer_mode-filter_slimes_and_hmd = Filtreerige slimid ja HMD-d
|
||||
widget-developer_mode-filter_slimes_and_hmd = Filtreerige Slimed ja HMD-d
|
||||
widget-developer_mode-sort_by_name = Sorteeri nime järgi
|
||||
widget-developer_mode-raw_slime_rotation = Toores pööre
|
||||
widget-developer_mode-more_info = Rohkem infot
|
||||
@@ -121,6 +142,7 @@ widget-developer_mode-more_info = Rohkem infot
|
||||
widget-imu_visualizer = Rotatsiooni
|
||||
widget-imu_visualizer-rotation_raw = Toores
|
||||
widget-imu_visualizer-rotation_preview = Eelvaade
|
||||
widget-imu_visualizer-rotation_hide = Peida
|
||||
|
||||
## Tracker status
|
||||
|
||||
@@ -147,9 +169,15 @@ tracker-table-column-url = URL
|
||||
## Tracker rotation
|
||||
|
||||
tracker-rotation-front = Ees
|
||||
tracker-rotation-front_left = Ees vasakul
|
||||
tracker-rotation-front_right = Ees paremal
|
||||
tracker-rotation-left = Vasak
|
||||
tracker-rotation-right = Parem
|
||||
tracker-rotation-back = Taga
|
||||
tracker-rotation-back_left = Taga vasakul
|
||||
tracker-rotation-back_right = Taga paremal
|
||||
tracker-rotation-custom = Kohandatud
|
||||
tracker-rotation-overriden = (tühistatud paigalduse lähtestamine tõttu)
|
||||
|
||||
## Tracker information
|
||||
|
||||
@@ -159,6 +187,9 @@ tracker-infos-custom_name = Kohandatud Nimi
|
||||
tracker-infos-url = Jälgija URL
|
||||
tracker-infos-version = Püsivara versioon
|
||||
tracker-infos-hardware_rev = Riistvara revisjon
|
||||
tracker-infos-hardware_identifier = Riistvara ID
|
||||
tracker-infos-imu = IMU sensor
|
||||
tracker-infos-board_type = Põhiplaat
|
||||
|
||||
## Tracker settings
|
||||
|
||||
@@ -211,6 +242,7 @@ tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } paremale re
|
||||
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } paremale säärele?
|
||||
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } paremale jalale?
|
||||
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } paremale kontrollerile?
|
||||
tracker_selection_menu-UPPER_CHEST = { -tracker_selection-part } rinnale?
|
||||
tracker_selection_menu-CHEST = { -tracker_selection-part } rind?
|
||||
tracker_selection_menu-WAIST = { -tracker_selection-part } vöökoht?
|
||||
tracker_selection_menu-HIP = { -tracker_selection-part } puus?
|
||||
@@ -247,8 +279,11 @@ settings-sidebar-fk_settings = FK seaded
|
||||
settings-sidebar-gesture_control = Žesti juhtimine
|
||||
settings-sidebar-interface = Liides
|
||||
settings-sidebar-osc_router = OSC ruuter
|
||||
settings-sidebar-osc_trackers = VRChati OSC Jälgija
|
||||
settings-sidebar-utils = Olemus / Lisad
|
||||
settings-sidebar-serial = Jadakonsool
|
||||
settings-sidebar-appearance = Välimus
|
||||
settings-sidebar-notifications = Teavitused
|
||||
|
||||
## SteamVR settings
|
||||
|
||||
@@ -305,15 +340,32 @@ settings-general-fk_settings-leg_tweak-floor_clip = Põranda läbimine
|
||||
# since this largely prevents this it corrects for it hence skating correction (note this may be renamed to sliding correction)
|
||||
# definition - Guesses when each foot is in contact with the ground and uses that information to improve tracking
|
||||
settings-general-fk_settings-leg_tweak-skating_correction = Libisemise korrigeerimine
|
||||
settings-general-fk_settings-leg_tweak-toe_snap = Varba klõpsatus maha
|
||||
settings-general-fk_settings-leg_tweak-foot_plant = Jalg maas
|
||||
settings-general-fk_settings-leg_tweak-skating_correction-amount = Libisemise korrigeerimine jõud
|
||||
settings-general-fk_settings-leg_tweak-skating_correction-description = Uisukorrektsioon korrigeerib uisutamist, kuid võib vähendada teatud liikumismustrite täpsust. Selle lubamisel veenduge, et mängus lähtestatakse jälgimine ja kalibreeritakse jälgimine uuesti.
|
||||
settings-general-fk_settings-leg_tweak-floor_clip-description = Põrandaklõpsatus võib vähendada või isegi välistada jalgade läbi põranda minemise. Selle lubamisel veenduge, et mängus lähtestatakse jälgimine ja kalibreeritakse jälgimine uuesti.
|
||||
settings-general-fk_settings-leg_tweak-toe_snap-description = Varvaste klõpsatus maha üritab ära arvata jalgade pöörlemist, kui jalgade jälgijaid ei kasutata.
|
||||
settings-general-fk_settings-leg_tweak-foot_plant-description = Jalg-maas pöörab jalad kokkupuutel maapinnaga paralleelseks.
|
||||
settings-general-fk_settings-leg_fk = Jalgade jälgimine
|
||||
settings-general-fk_settings-arm_fk = Käe jälgimine
|
||||
settings-general-fk_settings-arm_fk-description = Muuda viisi kuidas käsi jälgitakse.
|
||||
settings-general-fk_settings-arm_fk-force_arms = Sunni käed HMD-st
|
||||
settings-general-fk_settings-skeleton_settings = Skeletti seaded
|
||||
settings-general-fk_settings-skeleton_settings-toggles = Skeleti lülitid
|
||||
settings-general-fk_settings-skeleton_settings-description = Lülita skeletti seaded sisse või välja. Soovitatud on see sisse jätta.
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine = Selgroo laiendamine
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis = Vaagnaluu laiendamine
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees = Põlve laiendamine
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine_model = Laiendatud selgroo mudel
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis_model = Laiendatud vaagna mudel
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees_model = Laiendatud põlve mudel
|
||||
settings-general-fk_settings-skeleton_settings-ratios = Skeleti suhted
|
||||
settings-general-fk_settings-skeleton_settings-ratios-description = Muutke skeleti seadete väärtusi. Võimalik, et peate pärast nende muutmist oma proportsioone kohandama.
|
||||
settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_hip = Imputeeri vöökoht rinnast ja puusast
|
||||
settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_legs = Imputeeri vöökoht rinnast ja jalgadest
|
||||
settings-general-fk_settings-skeleton_settings-impute_hip_from_chest_legs = Imputeeri puusakoht rinnast ja jalgadest
|
||||
settings-general-fk_settings-skeleton_settings-impute_hip_from_waist_legs = Imputeeri puusakoht vöökohast ja jalgadest
|
||||
settings-general-fk_settings-skeleton_settings-interp_hip_legs = Leia keskmine puusa lengerdus ja pöörlemine jalgade abiga
|
||||
settings-general-fk_settings-skeleton_settings-interp_knee_tracker_ankle = Leia keskmine põlvede lengerdus ja pöörlemine säärte abiga
|
||||
settings-general-fk_settings-self_localization-title = Mocapi režiim
|
||||
settings-general-fk_settings-self_localization-description = Mocap-režiim võimaldab skeletil ligikaudselt jälgida oma asukohta ilma peakomplekti või muude jälgijateta. Pange tähele, et see nõuab jalgade ja peajälgijate olemasolu ning on endiselt eksperimentaalne.
|
||||
settings-general-fk_settings-vive_emulation-title = Vive-i emulatsioon
|
||||
settings-general-fk_settings-vive_emulation-description = Emuleeri vöökoha jälgija probleeme mis Vive jälgijatel on. See on nali ja teeb jälgijate täpsuse halvaks.
|
||||
settings-general-fk_settings-vive_emulation-label = Luba Vive-i emulatsioon
|
||||
@@ -322,30 +374,63 @@ settings-general-fk_settings-vive_emulation-label = Luba Vive-i emulatsioon
|
||||
|
||||
settings-general-gesture_control = Žesti juhtimine
|
||||
settings-general-gesture_control-subtitle = Puudutusepõhised lähtestused
|
||||
settings-general-gesture_control-description = Lubab lähtestada jälgija puudutades jälgijat. Jälgija kere kõige kõrgemal osal kasutatakse kiireks lähtestamiseks, jälgija vasaku jala kõige kõrgemal osal kasutatakse lähtestamiseks ja jälgija parema jala kõige kõrgemal osal kasutatakse paigalduse lähtestamiseks. Vajutused peavad toimuma 0.6 sekundi jooksul, et need registreeritaks.
|
||||
settings-general-gesture_control-description = Lubab lähtestada jälgija puudutades jälgijat. Jälgija kere kõige kõrgemal osal kasutatakse kiireks lähtestamiseks, jälgija vasaku jala kõige kõrgemal osal kasutatakse lähtestamiseks ja jälgija parema jala kõige kõrgemal osal kasutatakse paigalduse lähtestamiseks. Vajutused peavad toimuma 0.3 sekundi jooksul, et need registreeritaks.
|
||||
# This is a unit: 3 taps, 2 taps, 1 tap
|
||||
# $amount (Number) - Amount of taps (touches to the tracker's case)
|
||||
settings-general-gesture_control-taps =
|
||||
{ $amount ->
|
||||
[one] 1 tap
|
||||
*[other] { $amount } taps
|
||||
[one] 1 puudutus
|
||||
*[other] { $amount } puudutusi
|
||||
}
|
||||
# This is a unit: 3 trackers, 2 trackers, 1 tracker
|
||||
# $amount (Number) - Amount of trackers
|
||||
settings-general-gesture_control-trackers =
|
||||
{ $amount ->
|
||||
[one] 1 jälgija
|
||||
*[other] { $amount } jälgijat
|
||||
}
|
||||
settings-general-gesture_control-yawResetEnabled = Luba puudutamine lengerduse lähtestamiseks
|
||||
settings-general-gesture_control-yawResetDelay = Lengerduse lähtestamise viivitus
|
||||
settings-general-gesture_control-yawResetTaps = Puudutust lengerduse lähtestamiseks
|
||||
settings-general-gesture_control-fullResetEnabled = Luba puudutus täielikuks lähtestamiseks
|
||||
settings-general-gesture_control-fullResetDelay = Tavalise lähtestamise viivitus
|
||||
settings-general-gesture_control-fullResetTaps = Puudutust tavaliseks lähtestamiseks
|
||||
settings-general-gesture_control-mountingResetEnabled = Luba, et vajutus lähtestab paigalduseasendi
|
||||
settings-general-gesture_control-mountingResetDelay = Paigaldusasendi lähtestamise viivitus
|
||||
settings-general-gesture_control-mountingResetTaps = Paigaldusasendi lähtestamise vajutus
|
||||
# The number of trackers that can have higher acceleration before a tap is rejected
|
||||
settings-general-gesture_control-numberTrackersOverThreshold = Jälgijad üle läve
|
||||
settings-general-gesture_control-numberTrackersOverThreshold-description = Suurendage seda väärtust, kui puudutuse tuvastamine ei tööta. Ärge suurendage seda üle selle, mis on vajalik puudutuse tuvastuse toimimiseks, kuna see põhjustaks rohkem valepositiivseid tulemusi.
|
||||
|
||||
## Interface settings
|
||||
## Appearance settings
|
||||
|
||||
settings-general-interface = Liides
|
||||
settings-interface-appearance = Välimus
|
||||
settings-general-interface-dev_mode = Arendaja režiim
|
||||
settings-general-interface-dev_mode-description = See režiim on kasulik, kui on vaja põhjalike andmeid või või suhelda ühendatud jälgijatega kõrgemal tasemel.
|
||||
settings-general-interface-dev_mode-label = Arendaja režiim
|
||||
settings-general-interface-serial_detection = Jadaseadme märkamine
|
||||
settings-general-interface-serial_detection-description = See valik näitab hüpikakent iga kord kui panna sisse uus jada seade, mis võib olla jälgija. See aitab jälgija seadistusprotsessi parandada.
|
||||
settings-general-interface-serial_detection-label = Jadaseadme märkamine
|
||||
settings-general-interface-theme = Värviteema
|
||||
settings-general-interface-lang = Vaikekeel
|
||||
settings-general-interface-lang-description = Muutke vaikekeelt, mida soovite kasutada.
|
||||
settings-general-interface-lang-placeholder = Vali keel, mida kasutada
|
||||
# Keep the font name untranslated
|
||||
settings-interface-appearance-font = GUI font
|
||||
settings-interface-appearance-font-description = See muudab liidese kasutatavat fonti.
|
||||
settings-interface-appearance-font-placeholder = Vaikimisi font
|
||||
settings-interface-appearance-font-os_font = OS-i font
|
||||
settings-interface-appearance-font-slime_font = Vaikimisi font
|
||||
settings-interface-appearance-font_size = Fondi mastaapimise alus
|
||||
settings-interface-appearance-font_size-description = See mõjutab kogu liidese fondi suurust, välja arvatud see seadete paneel.
|
||||
|
||||
## Notification settings
|
||||
|
||||
settings-interface-notifications = Teavitused
|
||||
settings-general-interface-serial_detection = Jadaseadme märkamine
|
||||
settings-general-interface-serial_detection-description = See valik näitab hüpikakent iga kord kui panna sisse uus jada seade, mis võib olla jälgija. See aitab jälgija seadistusprotsessi parandada.
|
||||
settings-general-interface-serial_detection-label = Jadaseadme märkamine
|
||||
settings-general-interface-feedback_sound = Tagasiside heli
|
||||
settings-general-interface-feedback_sound-description = See suvand esitab lähtestamise käivitamisel heli.
|
||||
settings-general-interface-feedback_sound-label = Tagasiside heli
|
||||
settings-general-interface-feedback_sound-volume = Tagasiside helitugevus
|
||||
|
||||
## Serial settings
|
||||
|
||||
@@ -417,19 +502,56 @@ settings-osc-vrchat-network-address-placeholder = VRChat ip aadress
|
||||
settings-osc-vrchat-network-trackers = Jälgia
|
||||
settings-osc-vrchat-network-trackers-description = Lülita sisse/välja teatud jälgijate andmete saatmise OSC kaudu.
|
||||
settings-osc-vrchat-network-trackers-chest = Rind
|
||||
settings-osc-vrchat-network-trackers-waist = Vöökoht
|
||||
settings-osc-vrchat-network-trackers-hip = Puus
|
||||
settings-osc-vrchat-network-trackers-knees = Põlved
|
||||
settings-osc-vrchat-network-trackers-feet = Jalad
|
||||
settings-osc-vrchat-network-trackers-elbows = Küünarnukid
|
||||
|
||||
## VMC OSC settings
|
||||
|
||||
settings-osc-vmc = Virtual Motion Capture
|
||||
# This cares about multilines
|
||||
settings-osc-vmc-description =
|
||||
VMC (Virtual Motion Capture) protokollile omaste sätete muutmine
|
||||
SlimeVR-i luuandmete saatmiseks ja luuandmete vastuvõtmiseks teistest rakendustest.
|
||||
settings-osc-vmc-enable = Luba
|
||||
settings-osc-vmc-enable-description = Lülitage andmete sisestamine sisse/välja.
|
||||
settings-osc-vmc-enable-label = Luba
|
||||
settings-osc-vmc-network = Pordid
|
||||
settings-osc-vmc-network-description = Määrake pordid VMC kaudu andmete kuulamiseks ja saatmiseks.
|
||||
settings-osc-vmc-network-port_in =
|
||||
.label = Port sisse
|
||||
.placeholder = Port sisse (vaikimisi: 39540)
|
||||
settings-osc-vmc-network-port_out =
|
||||
.label = Port välja
|
||||
.placeholder = Port välja (vaikimisi 39539)
|
||||
settings-osc-vmc-network-address = Võrgu aadress
|
||||
settings-osc-vmc-network-address-description = Valige, millisel aadressil soovite VMC kaudu andmeid saata.
|
||||
settings-osc-vmc-network-address-placeholder = IPV4 aadress
|
||||
settings-osc-vmc-vrm = VRM-mudel
|
||||
settings-osc-vmc-vrm-description = Laadige VRM-mudel, et võimaldada peaankurdamist ja suuremat ühilduvust teiste rakendustega.
|
||||
settings-osc-vmc-vrm-model_unloaded = Mudelit pole laaditud
|
||||
settings-osc-vmc-vrm-model_loaded =
|
||||
{ $titled ->
|
||||
[true] Mudel laaditud: { $name }
|
||||
*[other] Pealkirjata mudel on laaditud
|
||||
}
|
||||
settings-osc-vmc-vrm-file_select = Kasutatava mudeli pukseerimine või <u>sirvimine</u>
|
||||
settings-osc-vmc-anchor_hip = Ankurda puusadel
|
||||
settings-osc-vmc-anchor_hip-description = Ankurdage jälgimine puusadele, mis on kasulik istuva VTubingu jaoks. Keelamise korral laadige VRM-mudel.
|
||||
settings-osc-vmc-anchor_hip-label = Ankurda puusadel
|
||||
|
||||
## Setup/onboarding menu
|
||||
|
||||
onboarding-skip = Jäta seadistamine vahele
|
||||
onboarding-continue = Jätka
|
||||
onboarding-wip = Töö käib
|
||||
onboarding-previous_step = Eelmine samm
|
||||
onboarding-setup_warning =
|
||||
<b>Hoiatus:</b> Hea jälgimise jaoks on vajalik esialgne seadistamine,
|
||||
see on vajalik, kui kasutate SlimeVR-i esimest korda.
|
||||
onboarding-setup_warning-skip = Jäta seadistamine vahele
|
||||
onboarding-setup_warning-cancel = Jätka seadistamist
|
||||
|
||||
## Wi-Fi setup
|
||||
|
||||
@@ -445,22 +567,37 @@ onboarding-wifi_creds-ssid =
|
||||
.label = SSID
|
||||
.placeholder = Sisesta SSID
|
||||
onboarding-wifi_creds-password =
|
||||
.label = parool
|
||||
.label = Parool
|
||||
.placeholder = Sisesta parool
|
||||
|
||||
## Mounting setup
|
||||
|
||||
onboarding-reset_tutorial-back = Minge tagasi paigaldus kalibreerimisse
|
||||
onboarding-reset_tutorial = Lähtesta õpetus
|
||||
onboarding-reset_tutorial-description = See funktsioon pole valmis, vajutage lihtsalt nuppu Jätka
|
||||
onboarding-reset_tutorial-explanation = Kui kasutate oma jälgijaid, võivad need IMU lengerdamise tõttu joondusest välja tulla või kuna olete neid füüsiliselt liigutanud. Teil on selle parandamiseks mitu võimalust.
|
||||
onboarding-reset_tutorial-skip = Jäta samm vahele
|
||||
# Cares about multiline
|
||||
onboarding-reset_tutorial-0 =
|
||||
Puudutage { $taps } korda esiletõstetud jälgijat, et käivitada lengerduse lähtestamine.
|
||||
|
||||
See setib jälgijad teie HMD-ga samas suunas.
|
||||
# Cares about multiline
|
||||
onboarding-reset_tutorial-1 =
|
||||
Täieliku lähtestamise käivitamiseks puudutage esiletõstetud jälgijat { $taps } korda.
|
||||
|
||||
Sa pead seisma (i-poosis). Enne kui see juhtub, on 3-sekundiline viivitus (konfigureeritav).
|
||||
See lähtestab täielikult kõigi teie jälgijate asukoha ja pöörlemise. See peaks lahendama enamiku probleeme.
|
||||
# Cares about multiline
|
||||
onboarding-reset_tutorial-2 =
|
||||
Puudutage { $taps } korda esiletõstetud jälgijat, et lähtestada paigaldus.
|
||||
|
||||
Paigaldamise lähtestamine aitab kaasa sellele, kuidas jälgijad teile tegelikult pannakse, nii et kui te neid kogemata liigutasite ja muutsite nende orientatsiooni suure summa võrra, aitab see.
|
||||
|
||||
Peate olema poosis, nagu suusatate, nagu see on näidatud automaatse paigaldamise viisardil, ja teil on 3-sekundiline viivitus (konfigureeritav), enne kui see käivitub.
|
||||
|
||||
## Setup start
|
||||
|
||||
onboarding-home = Tere tulemast SlimeVR-i
|
||||
# This cares about multilines and it's centered!!
|
||||
onboarding-home-description =
|
||||
Toome kogu keha jälgimise
|
||||
kõigile
|
||||
onboarding-home-start = Hakkame sättima!
|
||||
|
||||
## Enter VR part of setup
|
||||
@@ -505,6 +642,27 @@ onboarding-connect_tracker-connected_trackers =
|
||||
} connected
|
||||
onboarding-connect_tracker-next = Olen ühendanud kõik oma jälgijad
|
||||
|
||||
## Tracker calibration tutorial
|
||||
|
||||
onboarding-calibration_tutorial = IMU kalibreerimise õpetus
|
||||
onboarding-calibration_tutorial-subtitle = See aitab vähendada jälgija driftimist!
|
||||
onboarding-calibration_tutorial-description = Iga kord, kui lülitate oma jälgijad sisse, peavad nad kalibreerimiseks hetkeks tasasel pinnal olema. Teeme sama, klõpsates nuppu "{ onboarding-calibration_tutorial-calibrate }", <b>ärge liigutage neid!</b>
|
||||
onboarding-calibration_tutorial-calibrate = Panin oma jälgijad lauale
|
||||
onboarding-calibration_tutorial-status-waiting = Ootan sind
|
||||
onboarding-calibration_tutorial-status-calibrating = Kalibreerimine
|
||||
onboarding-calibration_tutorial-status-success = Võimas!
|
||||
onboarding-calibration_tutorial-status-error = Jälgija liigutati
|
||||
|
||||
## Tracker assignment tutorial
|
||||
|
||||
onboarding-assignment_tutorial = Kuidas valmistada Slime Trackerit enne selle külge panemist
|
||||
onboarding-assignment_tutorial-first_step = 1. Asetage kehaosa kleebis (kui teil see on) jälgijale vastavalt oma valikule
|
||||
# This text has a character limit of around 11 characters, so please keep it short
|
||||
onboarding-assignment_tutorial-sticker = Kleebis
|
||||
onboarding-assignment_tutorial-second_step-v2 = 2. Kinnitage rihm oma jälgija külge, hoides rihma takjakülge jälgimisseadme pealmise poolega samas suunas:
|
||||
onboarding-assignment_tutorial-second_step-continuation-v2 = Extensioni takjapaela pool peaks olema ülespoole suunatud nagu järgmine pilt:
|
||||
onboarding-assignment_tutorial-done = Panin kleepsud ja rihmad külge!
|
||||
|
||||
## Tracker assignment setup
|
||||
|
||||
onboarding-assign_trackers-back = Minge tagasi Wi-Fi andmetesse
|
||||
@@ -524,6 +682,17 @@ onboarding-assign_trackers-next = Määrasin kõikide jälgijate asukohad
|
||||
## Tracker assignment warnings
|
||||
|
||||
|
||||
## Tracker mounting method choose
|
||||
|
||||
onboarding-choose_mounting-auto_mounting = Automaatne paigaldamine
|
||||
# Italized text
|
||||
onboarding-choose_mounting-auto_mounting-label = Eksperimentaalne
|
||||
onboarding-choose_mounting-auto_mounting-description = See tuvastab automaatselt kõigi teie jälgijate paigaldussuuna 2 poosist
|
||||
onboarding-choose_mounting-manual_mounting = Käsitsi paigaldamine
|
||||
# Italized text
|
||||
onboarding-choose_mounting-manual_mounting-label = Soovitatud
|
||||
onboarding-choose_mounting-manual_mounting-description = See võimaldab teil valida iga jälgija paigaldussuuna käsitsi
|
||||
|
||||
## Tracker manual mounting setup
|
||||
|
||||
onboarding-manual_mounting-back = Minge tagasi, et siseneda VR-i
|
||||
@@ -553,12 +722,29 @@ onboarding-automatic_mounting-put_trackers_on-title = Pange kõik jälgijad peal
|
||||
onboarding-automatic_mounting-put_trackers_on-description = Et kalibreerida jälgijate paigaldus asendi pööret pange kõik jälgijad peale ja nüüd te näete mis on mis jälgijad paremal pool ekraani.
|
||||
onboarding-automatic_mounting-put_trackers_on-next = Mul on kõik jälgijad küljes
|
||||
|
||||
## Tracker proportions method choose
|
||||
|
||||
onboarding-choose_proportions = Millist proportsiooni kalibreerimismeetodit kasutada?
|
||||
# Multiline string
|
||||
onboarding-choose_proportions-description =
|
||||
Keha proportsioone kasutatakse teie keha mõõtude tundmiseks. Neid on vaja, et arvutada jälgijate asukohad.
|
||||
Kui teie keha proportsioonid ei vasta salvestatud proportsioonidele, on teie jälgimistäpsus halvem ja märkate selliseid asju nagu jalgade uisutamine või libistamine või keha ei sobi teie avatariga hästi.
|
||||
onboarding-choose_proportions-auto_proportions = Automaatsed proportsioonid
|
||||
# Italized text
|
||||
onboarding-choose_proportions-auto_proportions-subtitle = Soovitatud
|
||||
# Italized text
|
||||
onboarding-choose_proportions-manual_proportions-subtitle = Väikeste puudutuste jaoks
|
||||
onboarding-choose_proportions-manual_proportions-description = See võimaldab teil proportsioone käsitsi reguleerida, muutes neid otseselt
|
||||
onboarding-choose_proportions-export = Ekspordi proportsioonid
|
||||
onboarding-choose_proportions-file_type = Keha proportsioonide fail
|
||||
|
||||
## Tracker manual proportions setup
|
||||
|
||||
onboarding-manual_proportions-back = Mine tagasi lähtestamise õppetusse
|
||||
onboarding-manual_proportions-title = Käsitsi keha proportsioonid
|
||||
onboarding-manual_proportions-precision = Täpne reguleerimine
|
||||
onboarding-manual_proportions-auto = Automaatne kalibreerimine
|
||||
onboarding-manual_proportions-ratio = Kohandamine suhtarvugruppide järgi
|
||||
|
||||
## Tracker automatic proportions setup
|
||||
|
||||
@@ -570,22 +756,34 @@ onboarding-automatic_proportions-prev_step = Eelmine Samm
|
||||
onboarding-automatic_proportions-put_trackers_on-title = Pange kõik jälgijad peale
|
||||
onboarding-automatic_proportions-put_trackers_on-description = Et kalibreerida teie proportsioone pange kõik jälgijad peale ja te näete mis on mis jälgijad paremal pool ekraani.
|
||||
onboarding-automatic_proportions-put_trackers_on-next = Mul on kõik jälgijad küljes
|
||||
onboarding-automatic_proportions-preparation-title = Ettevalmistus
|
||||
onboarding-automatic_proportions-preparation-description = Võtke tool ja pange see täpselt enda seljataha maha mänguruumi sisse. Olge valmis maha istuma et seadistada autobone.
|
||||
onboarding-automatic_proportions-preparation-next = Ma olen enda tooli ees
|
||||
onboarding-automatic_proportions-requirements-title = Nõuded
|
||||
onboarding-automatic_proportions-requirements-next = Olen lugenud nõudeid
|
||||
onboarding-automatic_proportions-check_height-title = Kontrollige oma pikkust
|
||||
onboarding-automatic_proportions-check_height-description = Me kasutame teie pikkust oma mõõtmiste alusena, kasutades HMD kõrgust teie tegeliku kõrguse ligikaudseks arvutamiseks, kuid parem on ise kontrollida, kas need on õiged!
|
||||
onboarding-automatic_proportions-check_height-fetch_height = Ma seisan!
|
||||
# Context is that the height is unknown
|
||||
onboarding-automatic_proportions-check_height-unknown = Tundmatu
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-hmd_height1 = Teie HMD kõrgus on
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-height1 = nii et teie tegelik kõrgus on
|
||||
onboarding-automatic_proportions-check_height-next_step = Nendega on kõik korras
|
||||
onboarding-automatic_proportions-start_recording-title = Olge valmis liikuma
|
||||
onboarding-automatic_proportions-start_recording-description = Me nüüd salvestame teatud poose ja liigutusi neid näete järgmisel ekraanil. Olge valmis, kui te vajutate nuppu!
|
||||
onboarding-automatic_proportions-start_recording-next = Alusta salvestamist
|
||||
onboarding-automatic_proportions-recording-title = REC
|
||||
onboarding-automatic_proportions-recording-description-p0 = Salvestamine on pooleli...
|
||||
onboarding-automatic_proportions-recording-description-p1 = Tehke allpool näidatud liigutusi:
|
||||
onboarding-automatic_proportions-recording-steps-0 = Painutage põlvi paar korda.
|
||||
onboarding-automatic_proportions-recording-steps-1 = Istuge toolile ja tõuske püsti.
|
||||
onboarding-automatic_proportions-recording-steps-2 = Keerake ülakeha vasakule, seejärel paremale.
|
||||
onboarding-automatic_proportions-recording-steps-3 = Keerake ülakeha paremale, seejärel vasakule.
|
||||
onboarding-automatic_proportions-recording-steps-4 = Liigutage ringi, kuni taimer lõpeb.
|
||||
# Each line of text is a different list item
|
||||
onboarding-automatic_proportions-recording-steps =
|
||||
Sirgelt püsti seistes pöörage pea ringi igas suunas.
|
||||
Painutage selg ettepoole ja kükitage. Kükitades vaadake vasakule, seejärel paremale.
|
||||
Keerake ülakeha vasakule (vastupäeva), seejärel sirutage alla maapinna poole.
|
||||
Keerake ülakeha paremale (päripäeva), seejärel sirutage alla maapinna poole.
|
||||
Pöörage puusi ringiratast, nagu kasutaksite hularõngast.
|
||||
Kui salvestusel on veel aega, korrake juhiseid, kuni aeg on läbi.
|
||||
onboarding-automatic_proportions-recording-processing = Tulemuse töötlemine
|
||||
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 15)
|
||||
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 20)
|
||||
onboarding-automatic_proportions-recording-timer =
|
||||
{ $time ->
|
||||
[one] 1 sekund
|
||||
@@ -599,7 +797,17 @@ onboarding-automatic_proportions-verify_results-redo = Tee salvestus uuesti
|
||||
onboarding-automatic_proportions-verify_results-confirm = Nad on õiged
|
||||
onboarding-automatic_proportions-done-title = Kere mõõdetud ja salvestatud.
|
||||
onboarding-automatic_proportions-done-description = Teie keha proportsioonid kalibreerimine on valmis!
|
||||
onboarding-automatic_proportions-error_modal-confirm = Sain aru!
|
||||
|
||||
## Home
|
||||
|
||||
home-no_trackers = Jälgijaid ei tuvastatud ega määratud
|
||||
|
||||
## Status system
|
||||
|
||||
status_system-StatusSteamVRDisconnected =
|
||||
{ $type ->
|
||||
[steamvr_feeder] Praegu ei ole SlimeVR-feeder äpiga ühendatud.
|
||||
*[other] Praegu ei ole SlimeVR-draiveri kaudu SteamVR-iga ühendatud.
|
||||
}
|
||||
status_system-StatusTrackerError = Jälgijal { $trackerName } on tõrge.
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
### SlimeVR complete GUI translations
|
||||
|
||||
|
||||
# Please developers (not translators) don't reuse a key inside another key
|
||||
# or concat text with a translation string in the code, use the appropriate
|
||||
# features like variables and selectors in each appropriate case!
|
||||
@@ -13,10 +10,19 @@
|
||||
websocket-connecting = Yhdistetään palvelimeen
|
||||
websocket-connection_lost = Yhteys epäonnistui. Yritetään uudelleen...
|
||||
|
||||
## Update notification
|
||||
|
||||
version_update-title = Uusi versio saatavilla: { $version }
|
||||
version_update-description = Valitsemalla "{ version_update-update }" lataa SlimeVR-asennusohjelman.
|
||||
version_update-update = Päivitys
|
||||
version_update-close = Sulje
|
||||
|
||||
## Tips
|
||||
|
||||
tips-find_tracker = Epävarma, mikä jäljitin on mikä? Ravista jäljitintä ja se korostaa vastaavan kohdan.
|
||||
tips-do_not_move_heels = Varmista, että kantapääsi ei liiku tallennuksen aikana!
|
||||
tips-file_select = Vedä ja pudota käytettäviä tiedostoja tai <u>selaa</u>.
|
||||
tips-tap_setup = Voit hitaasti napauttaa 2 kertaa jäljitintä valitaksesi sen, sen sijaan, että valitsisit sen valikosta.
|
||||
|
||||
## Body parts
|
||||
|
||||
@@ -30,6 +36,7 @@ body_part-RIGHT_HAND = Oikea käsi
|
||||
body_part-RIGHT_UPPER_LEG = Oikea reisi
|
||||
body_part-RIGHT_LOWER_LEG = Oikea nilkka
|
||||
body_part-RIGHT_FOOT = Oikea jalkaterä
|
||||
body_part-UPPER_CHEST = Ylärinta
|
||||
body_part-CHEST = Rinta
|
||||
body_part-WAIST = Vyötärö
|
||||
body_part-HIP = Lonkka
|
||||
@@ -47,8 +54,9 @@ skeleton_bone-NONE = Ei mikään
|
||||
skeleton_bone-HEAD = Pään säätö
|
||||
skeleton_bone-NECK = Kaulan pituus
|
||||
skeleton_bone-torso_group = Vartalon pituus
|
||||
skeleton_bone-CHEST = Rinnan pituus
|
||||
skeleton_bone-UPPER_CHEST = Ylärinnan pituus
|
||||
skeleton_bone-CHEST_OFFSET = Rinnan keskitys
|
||||
skeleton_bone-CHEST = Rinnan pituus
|
||||
skeleton_bone-WAIST = Vyötärön pituus
|
||||
skeleton_bone-HIP = Lonkan pituus
|
||||
skeleton_bone-HIP_OFFSET = Lonkan keskitys
|
||||
@@ -94,11 +102,16 @@ navbar-mounting = Asennuksen Kalibrointi
|
||||
navbar-onboarding = Asennustoiminto
|
||||
navbar-settings = Asetukset
|
||||
|
||||
## Bounding volume hierarchy recording
|
||||
## Biovision hierarchy recording
|
||||
|
||||
bvh-start_recording = Tallenna BVH
|
||||
bvh-recording = Tallennetaan...
|
||||
|
||||
## Tracking pause
|
||||
|
||||
tracking-unpaused = Keskeytä jäljitys
|
||||
tracking-paused = Jatka jäljitystä
|
||||
|
||||
## Widget: Overlay settings
|
||||
|
||||
widget-overlay = Overlay
|
||||
@@ -109,6 +122,10 @@ widget-overlay-is_mirrored_label = Näytä Overlay Peilinä
|
||||
|
||||
widget-drift_compensation-clear = Tyhjennä ajautumakompensaatio
|
||||
|
||||
## Widget: Clear Reset Mounting
|
||||
|
||||
widget-clear_mounting = Tyhjennä asennuksen nollaus
|
||||
|
||||
## Widget: Developer settings
|
||||
|
||||
widget-developer_mode = Kehittäjätila
|
||||
@@ -125,6 +142,7 @@ widget-developer_mode-more_info = Lisätietoja
|
||||
widget-imu_visualizer = Kierto
|
||||
widget-imu_visualizer-rotation_raw = Käsittelemätön
|
||||
widget-imu_visualizer-rotation_preview = Esikatselu
|
||||
widget-imu_visualizer-rotation_hide = Piilota
|
||||
|
||||
## Tracker status
|
||||
|
||||
@@ -151,9 +169,15 @@ tracker-table-column-url = URL
|
||||
## Tracker rotation
|
||||
|
||||
tracker-rotation-front = Etu
|
||||
tracker-rotation-front_left = Etu-vasen
|
||||
tracker-rotation-front_right = Etu-oikea
|
||||
tracker-rotation-left = Vasen
|
||||
tracker-rotation-right = Oikea
|
||||
tracker-rotation-back = Taka
|
||||
tracker-rotation-back_left = Taka-vasen
|
||||
tracker-rotation-back_right = Taka-oikea
|
||||
tracker-rotation-custom = Mukautettu
|
||||
tracker-rotation-overriden = (asennusnollauksen ohittama)
|
||||
|
||||
## Tracker information
|
||||
|
||||
@@ -163,6 +187,9 @@ tracker-infos-custom_name = Mukautettu Nimi
|
||||
tracker-infos-url = Jäljittimen URL
|
||||
tracker-infos-version = Laiteohjelmiston Versio
|
||||
tracker-infos-hardware_rev = Laitteston Tarkistus
|
||||
tracker-infos-hardware_identifier = Laitteiston ID
|
||||
tracker-infos-imu = IMU-Sensor
|
||||
tracker-infos-board_type = Päälevy
|
||||
|
||||
## Tracker settings
|
||||
|
||||
@@ -205,6 +232,28 @@ body_assignment_menu-unassign_tracker = Poista jäljittimen määritys
|
||||
# maybe your language does.
|
||||
-tracker_selection-part = Minkä jäljittimen valitset
|
||||
tracker_selection_menu-NONE = Minkä jäljittimen määrityksen haluat poistaa?
|
||||
tracker_selection_menu-HEAD = { -tracker_selection-part } pää?
|
||||
tracker_selection_menu-NECK = { -tracker_selection-part } kaula?
|
||||
tracker_selection_menu-RIGHT_SHOULDER = { -tracker_selection-part } oikea olkapää?
|
||||
tracker_selection_menu-RIGHT_UPPER_ARM = { -tracker_selection-part } oikea olkavarsi?
|
||||
tracker_selection_menu-RIGHT_LOWER_ARM = { -tracker_selection-part } oikea kyynärvarsi?
|
||||
tracker_selection_menu-RIGHT_HAND = { -tracker_selection-part } oikea käsi?
|
||||
tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } oikea reisi?
|
||||
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } oikea nilkka?
|
||||
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } oikea jalkaterä?
|
||||
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } oikea ohjain?
|
||||
tracker_selection_menu-UPPER_CHEST = { -tracker_selection-part } ylärinta?
|
||||
tracker_selection_menu-CHEST = { -tracker_selection-part } rinta?
|
||||
tracker_selection_menu-WAIST = { -tracker_selection-part } vyötärö?
|
||||
tracker_selection_menu-HIP = { -tracker_selection-part } lonkka?
|
||||
tracker_selection_menu-LEFT_SHOULDER = { -tracker_selection-part } vasen olkapää?
|
||||
tracker_selection_menu-LEFT_UPPER_ARM = { -tracker_selection-part } vasen olkavarsi?
|
||||
tracker_selection_menu-LEFT_LOWER_ARM = { -tracker_selection-part } vasen kyynärvarsi?
|
||||
tracker_selection_menu-LEFT_HAND = { -tracker_selection-part } vasen käsi?
|
||||
tracker_selection_menu-LEFT_UPPER_LEG = { -tracker_selection-part } vasen reisi?
|
||||
tracker_selection_menu-LEFT_LOWER_LEG = { -tracker_selection-part } vasen nilkka?
|
||||
tracker_selection_menu-LEFT_FOOT = { -tracker_selection-part } vasen jalkaterä?
|
||||
tracker_selection_menu-LEFT_CONTROLLER = { -tracker_selection-part } vasen ohjain?
|
||||
tracker_selection_menu-unassigned = Määrittämättömät jäljittimet
|
||||
tracker_selection_menu-assigned = Määritetyt jäljittimet
|
||||
tracker_selection_menu-dont_assign = Älä määritä
|
||||
@@ -230,8 +279,11 @@ settings-sidebar-fk_settings = Jäljityksen asetukset
|
||||
settings-sidebar-gesture_control = Eleohjaus
|
||||
settings-sidebar-interface = Käyttöliittymä
|
||||
settings-sidebar-osc_router = OSC-reititin
|
||||
settings-sidebar-osc_trackers = VRChat OSC-jäljittimet
|
||||
settings-sidebar-utils = Lisäohjelmat
|
||||
settings-sidebar-serial = Sarjakonsoli
|
||||
settings-sidebar-appearance = Ulkonäkö
|
||||
settings-sidebar-notifications = Ilmoitukset
|
||||
|
||||
## SteamVR settings
|
||||
|
||||
@@ -299,11 +351,21 @@ settings-general-fk_settings-leg_fk = Jalkojen jäljitys
|
||||
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-skeleton_settings = Luurangon asetukset
|
||||
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 = Laajennettu selkäranka
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis = Laajennettu lantioluu
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees = Laajennettu polvi
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine_model = Laajennettu selkärankamalli
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis_model = Laajennettu lantiomalli
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees_model = Laajennettu polvimalli
|
||||
settings-general-fk_settings-skeleton_settings-ratios = Luurankosuhteet
|
||||
settings-general-fk_settings-skeleton_settings-ratios-description = Muuta luurankoasetusten arvoja. Saatat joutua säätämään mittasuhteitasi muutosten jälkeen.
|
||||
settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_hip = Laskelmoi vyötärö rinnasta lantioon
|
||||
settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_legs = Laskelmoi vyötärö rinnasta jalkoihin
|
||||
settings-general-fk_settings-skeleton_settings-impute_hip_from_chest_legs = Laskelmoi lonkka rinnasta jalkoihin
|
||||
settings-general-fk_settings-skeleton_settings-impute_hip_from_waist_legs = Laskelmoi lantio vyötäröstä jalkoihin
|
||||
settings-general-fk_settings-skeleton_settings-interp_hip_legs = Keskimääritä lonkan kallistus jaloilla'
|
||||
settings-general-fk_settings-skeleton_settings-interp_knee_tracker_ankle = Keskimääritä polvijäljittimen kallistus nilkoilla'
|
||||
settings-general-fk_settings-self_localization-title = Mocap-tila
|
||||
settings-general-fk_settings-self_localization-description = Mocap-tila sallii luurangon karkeasti seurata omaa sijaintiaan ilman laseja tai muita jäljittimiä. Huomioi, että tämä vaatii jalka- ja pääjäljittimien toimimista ja on vielä kokeellinen.
|
||||
settings-general-fk_settings-vive_emulation-title = Vive-emulointi
|
||||
settings-general-fk_settings-vive_emulation-description = Emuloi vyötäröjäljittimen ongelmia, joita Vive jäljittimillä on. Tämä on vitsi ja pahentaa jäljitystä.
|
||||
settings-general-fk_settings-vive_emulation-label = Ota Vive-emulointi käyttöön
|
||||
@@ -320,6 +382,13 @@ settings-general-gesture_control-taps =
|
||||
[one] 1 napautus
|
||||
*[other] { $amount } napautusta
|
||||
}
|
||||
# This is a unit: 3 trackers, 2 trackers, 1 tracker
|
||||
# $amount (Number) - Amount of trackers
|
||||
settings-general-gesture_control-trackers =
|
||||
{ $amount ->
|
||||
[one] 1 jäljitin
|
||||
*[other] { $amount } jäljitintä
|
||||
}
|
||||
settings-general-gesture_control-yawResetEnabled = Ota käyttöön kallistumanollaus napautus
|
||||
settings-general-gesture_control-yawResetDelay = Kallistumanollaus viive
|
||||
settings-general-gesture_control-yawResetTaps = Napautuksia kallistumanollaukseen.
|
||||
@@ -329,13 +398,32 @@ settings-general-gesture_control-fullResetTaps = Napautuksia täysinollaukseen
|
||||
settings-general-gesture_control-mountingResetEnabled = Ota käyttöön asennusnollaus napautus
|
||||
settings-general-gesture_control-mountingResetDelay = Asennusnollaus viive
|
||||
settings-general-gesture_control-mountingResetTaps = Napautuksia asennusnollaukseen
|
||||
# The number of trackers that can have higher acceleration before a tap is rejected
|
||||
settings-general-gesture_control-numberTrackersOverThreshold = Jäljittimet yli kynnysarvon
|
||||
settings-general-gesture_control-numberTrackersOverThreshold-description = Suurenna tätä arvoa jos napautustunnistus ei toimi. Älä suurenna yli sen, mikä on tarpeellista, koska se voi aiheuttaa enemmän virheitä.
|
||||
|
||||
## Interface settings
|
||||
## Appearance settings
|
||||
|
||||
settings-general-interface = Käyttöliittymä
|
||||
settings-interface-appearance = Ulkonäkö
|
||||
settings-general-interface-dev_mode = Kehittäjätila
|
||||
settings-general-interface-dev_mode-description = Tämä tila voi olla hyödyllinen, jos tarvitset perusteellisia tietoja tai haluat olla tekemisissä yhdistettyjen jäljittimien kanssa edistyneemmällä tasolla.
|
||||
settings-general-interface-dev_mode-label = Kehittäjätila
|
||||
settings-general-interface-theme = Väri teema
|
||||
settings-general-interface-lang = Valitse kieli
|
||||
settings-general-interface-lang-description = Vaihda oletuskieli, jota haluat käyttää.
|
||||
settings-general-interface-lang-placeholder = Valitse käytettävä kieli
|
||||
# Keep the font name untranslated
|
||||
settings-interface-appearance-font = GUI-fontti
|
||||
settings-interface-appearance-font-description = Tämä muuttaa käyttöliittymän käyttämää fonttia.
|
||||
settings-interface-appearance-font-placeholder = Oletusfontti
|
||||
settings-interface-appearance-font-os_font = OS-fontti
|
||||
settings-interface-appearance-font-slime_font = Oletusfontti
|
||||
settings-interface-appearance-font_size = Perusfontin skaalaus
|
||||
settings-interface-appearance-font_size-description = Tämä vaikuttaa koko käyttöliittymän fonttikokoon tätä asetuspaneelia lukuun ottamatta.
|
||||
|
||||
## Notification settings
|
||||
|
||||
settings-interface-notifications = Ilmoitukset
|
||||
settings-general-interface-serial_detection = Sarjalaitteen tunnistus
|
||||
settings-general-interface-serial_detection-description = Tämä vaihtoehto näyttää ponnahdusikkunan aina, kun liität uuden sarjalaitteen, joka voi olla jäljitin. Se auttaa parantamaan jäljittimen asennusprosessia.
|
||||
settings-general-interface-serial_detection-label = Sarjalaitteen tunnistus
|
||||
@@ -343,10 +431,6 @@ settings-general-interface-feedback_sound = Palaute ääni
|
||||
settings-general-interface-feedback_sound-description = Tämä asetus toistaa äänen nollauksen tapahtuessa.
|
||||
settings-general-interface-feedback_sound-label = Palaute ääni
|
||||
settings-general-interface-feedback_sound-volume = Palaute äänen voimakkuus
|
||||
settings-general-interface-theme = Väri teema
|
||||
settings-general-interface-lang = Valitse kieli
|
||||
settings-general-interface-lang-description = Vaihda oletuskieli, jota haluat käyttää.
|
||||
settings-general-interface-lang-placeholder = Valitse käytettävä kieli
|
||||
|
||||
## Serial settings
|
||||
|
||||
@@ -418,6 +502,7 @@ settings-osc-vrchat-network-address-placeholder = VRChat IP-osoite
|
||||
settings-osc-vrchat-network-trackers = Jäljittimet
|
||||
settings-osc-vrchat-network-trackers-description = Vaihda tiettyjen jäljittimien lähettäminen OSC:n kautta.
|
||||
settings-osc-vrchat-network-trackers-chest = Rinta
|
||||
settings-osc-vrchat-network-trackers-hip = Lonkka
|
||||
settings-osc-vrchat-network-trackers-knees = Polvet
|
||||
settings-osc-vrchat-network-trackers-feet = Jalat
|
||||
settings-osc-vrchat-network-trackers-elbows = Kyynärpäät
|
||||
@@ -451,13 +536,22 @@ settings-osc-vmc-vrm-model_loaded =
|
||||
[true] Malli ladattu: { $name }
|
||||
*[other] Nimetön malli ladattu
|
||||
}
|
||||
settings-osc-vmc-vrm-file_select = Vedä ja pudota mallia käytettäväksi tai <u>selaa</u>
|
||||
settings-osc-vmc-anchor_hip = Ankkuri lantiolla
|
||||
settings-osc-vmc-anchor_hip-description = Ankkuroi jäljitin lonkalle, hyödyllinen istuvaan VTubing. Jos poistat käytöstä, lataa VRM-malli.
|
||||
settings-osc-vmc-anchor_hip-label = Ankkuroi lonkalle
|
||||
|
||||
## Setup/onboarding menu
|
||||
|
||||
onboarding-skip = Ohita asennus
|
||||
onboarding-continue = Jatka
|
||||
onboarding-wip = Keskeneräinen
|
||||
onboarding-previous_step = Edellinen vaihe
|
||||
onboarding-setup_warning =
|
||||
<b>Varoitus:</b> Alkuasennus vaaditaan hyvään jäljitykseen,
|
||||
sitä tarvitaan, jos käytät SlimeVR:ää ensimmäistä kertaa.
|
||||
onboarding-setup_warning-skip = Ohita asennus
|
||||
onboarding-setup_warning-cancel = Jatka asennusta
|
||||
|
||||
## Wi-Fi setup
|
||||
|
||||
@@ -480,7 +574,26 @@ onboarding-wifi_creds-password =
|
||||
|
||||
onboarding-reset_tutorial-back = Palaa asennuksen kalibrointiin
|
||||
onboarding-reset_tutorial = Nollaa tutoriaali
|
||||
onboarding-reset_tutorial-description = Tämä ominaisuus ei ole valmis, paina vain Jatka
|
||||
onboarding-reset_tutorial-explanation = Kun käytät jäljittimiä, ne saattavat epälinjoittua IMU:n ajautumisen tai fyysisen siirron takia. Sinulla on useita tapoja korjata tämä.
|
||||
onboarding-reset_tutorial-skip = Ohita vaihe
|
||||
# Cares about multiline
|
||||
onboarding-reset_tutorial-0 =
|
||||
Napauta { $taps } kertaa korostettua jäljitintä käynnistääksesi kallistuman nollauksen.
|
||||
|
||||
Tämä osoittaa jäljittimet samaan suuntaan kuin HMD.
|
||||
# Cares about multiline
|
||||
onboarding-reset_tutorial-1 =
|
||||
Napauta { $taps } kertaa korostettua jäljitintä käynnistääksesi täysinollauksen.
|
||||
|
||||
Sinun on seisottava paikallasi (i-pose) tätä varten. On 3 sekunnin viive (muokattavissa), ennen kuin se tapahtuu.
|
||||
Tämä täysin nollaa kaikkien jäljittimien sijainnin ja kierron. Sen pitäisi korjata useimmat ongelmat.
|
||||
# Cares about multiline
|
||||
onboarding-reset_tutorial-2 =
|
||||
Napauta { $taps } kertaa korostettua jäljitintä käynnistääksesi asennuksen nollaus.
|
||||
|
||||
Asennuksen nollaus auttaa siinä, kuinka jäljittimet on todella asetettu sinulla, joten jos vahingossa siirsit ja muutit suuresti niiden suuntaa, tämä auttaa.
|
||||
|
||||
Sinun on oltava hiihto-asennossa, kuten on näytettynä Automaattisessa Asennuksessa ja sinulla on 3 sekunnin viive (muokattavissa), ennen kuin se käynnistyy.
|
||||
|
||||
## Setup start
|
||||
|
||||
@@ -506,30 +619,237 @@ onboarding-connect_tracker-back = Palaa Wi-Fi-tunnistetietoihin
|
||||
onboarding-connect_tracker-title = Yhdistä jäljittimet
|
||||
onboarding-connect_tracker-description-p0 = Nyt hauskaan osaan, kaikkien jäljittimien yhdistämiseen!
|
||||
onboarding-connect_tracker-description-p1 = Yhdistä vain kaikki, joita ei ole vielä yhdistetty, USB-portin kautta.
|
||||
onboarding-connect_tracker-issue-serial = Minulla on ongelmia yhteyden muodostamisessa!
|
||||
onboarding-connect_tracker-usb = USB-jäljitin
|
||||
onboarding-connect_tracker-connection_status-none = Etsitään jäljittimiä
|
||||
onboarding-connect_tracker-connection_status-serial_init = Yhdistetään sarjalaitteeseen
|
||||
onboarding-connect_tracker-connection_status-provisioning = Lähetetään Wi-Fi-tunnistetietoja
|
||||
onboarding-connect_tracker-connection_status-connecting = Yritetään muodostaa yhteys Wi-Fi-verkkoon
|
||||
onboarding-connect_tracker-connection_status-looking_for_server = Etsitään palvelinta
|
||||
onboarding-connect_tracker-connection_status-connection_error = Wi-Fi-yhteyden muodostaminen epäonnistui
|
||||
onboarding-connect_tracker-connection_status-could_not_find_server = Palvelinta ei löytynyt
|
||||
onboarding-connect_tracker-connection_status-done = Yhdistetty palvelimeen
|
||||
# $amount (Number) - Amount of trackers connected (this is a number, but you can use CLDR plural rules for your language)
|
||||
# More info on https://www.unicode.org/cldr/cldr-aux/charts/22/supplemental/language_plural_rules.html
|
||||
# English in this case only has 2 plural rules, which are "one" and "other",
|
||||
# we use 0 in an explicit way because there is no plural rule in english for 0, so we directly say
|
||||
# if $amount is 0 then we say "No trackers connected"
|
||||
onboarding-connect_tracker-connected_trackers =
|
||||
{ $amount ->
|
||||
[0] Jäljittimiä ei ole yhdistetty
|
||||
[one] 1 jäljitin yhdistetty
|
||||
*[other] { $amount } jäljitintä yhdistetty
|
||||
}
|
||||
onboarding-connect_tracker-next = Yhdistin kaikki jäljittimeni
|
||||
|
||||
## Tracker calibration tutorial
|
||||
|
||||
onboarding-calibration_tutorial = IMU-kalibrointi tutoriaali
|
||||
onboarding-calibration_tutorial-subtitle = Tämä auttaa vähentämään jäljittimen ajautumaa!
|
||||
onboarding-calibration_tutorial-description = Joka kerta, kun käynnistät jäljittimet, niiden täytyy levätä hetken tasaisella alustalla kalibroidakseen. Tehdään sama asia painamalla "{ onboarding-calibration_tutorial-calibrate }" nappia, <b>älä liikuta niitä!</b>
|
||||
onboarding-calibration_tutorial-calibrate = Asetin jäljittimeni pöydälle
|
||||
onboarding-calibration_tutorial-status-waiting = Odotetaan sinua
|
||||
onboarding-calibration_tutorial-status-calibrating = Kalibroi
|
||||
onboarding-calibration_tutorial-status-success = Kiva!
|
||||
onboarding-calibration_tutorial-status-error = Jäljitintä liikutettiin
|
||||
|
||||
## Tracker assignment tutorial
|
||||
|
||||
onboarding-assignment_tutorial = Kuinka valmistellaan Slime-jäljitin ennen käyttöä
|
||||
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-continuation-v2 = Jatkeen tarranauhapuolen tulee olla ylöspäin seuraavan kuvan mukaisesti:
|
||||
onboarding-assignment_tutorial-done = Laitoin tarrat ja hihnat!
|
||||
|
||||
## Tracker assignment setup
|
||||
|
||||
onboarding-assign_trackers-back = Palaa Wi-Fi-tunnistetietoihin
|
||||
onboarding-assign_trackers-title = Määritä jäljittimet
|
||||
onboarding-assign_trackers-description = Valitaan, mikä jäljitin menee minne. Napsauta paikkaa, johon haluat sijoittaa jäljittimen
|
||||
# Look at translation of onboarding-connect_tracker-connected_trackers on how to use plurals
|
||||
# $assigned (Number) - Trackers that have been assigned a body part
|
||||
# $trackers (Number) - Trackers connected to the server
|
||||
onboarding-assign_trackers-assigned =
|
||||
{ $trackers ->
|
||||
[one] { $assigned } / 1 jäljitintä määritetty
|
||||
*[other] { $assigned } / { $trackers } jäljittimiä määritetty
|
||||
}
|
||||
onboarding-assign_trackers-advanced = Näytä tarkempia määrityssijainteja
|
||||
onboarding-assign_trackers-next = Määritin kaikki jäljittimet
|
||||
|
||||
## 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 ->
|
||||
[6] Vasen jalkaterä on määritetty, mutta myös vasen nilkka on määritettävä!
|
||||
[5] Vasen jalkaterä on määritetty, mutta myös vasen reisi on määritettävä!
|
||||
[4] Vasen jalkaterä on määritetty, mutta myös vasen nilkka ja vasen reisi on määritettävä!
|
||||
[3] Vasen jalkaterä on määritetty, mutta joko rinta, lantio tai vyötärö on myös määritettävä!
|
||||
[2] Vasen jalkaterä on määritetty, mutta myös vasen nilkka ja joko rinta, lantio tai vyötärö on määritettävä!
|
||||
[1] Vasen jalkaterä on määritetty, mutta myös vasen reisi ja joko rinta, lantio tai vyötärö on määritettävä!
|
||||
[0] Vasen jalkaterä on määritetty, mutta myös vasen nilkka, vasen reisi ja joko rinta, lantio tai vyötärö on määritettävä!
|
||||
*[other] Vasen jalkaterä on määritetty, mutta myös tuntematon määrittelemätön osa on määritettävä!
|
||||
}
|
||||
# $unassigned (Number) - Bits are based on BodyAssignment.ASSIGNMENT_RULES order
|
||||
onboarding-assign_trackers-warning-RIGHT_FOOT =
|
||||
{ $unassigned ->
|
||||
[6] Oikea jalkaterä on määritetty, mutta myös oikea nilkka on määritettävä!
|
||||
[5] Oikea jalkaterä on määritetty, mutta myös oikea reisi on määritettävä!
|
||||
[4] Oikea jalkaterä on määritetty, mutta myös oikea nilkka ja oikea reisi on määritettävä!
|
||||
[3] Oikea jalkaterä on määritetty, mutta joko rinta, lantio tai vyötärö on myös määritettävä!
|
||||
[2] Oikea jalkaterä on määritetty, mutta myös oikea nilkka ja joko rinta, lantio tai vyötärö on määritettävä!
|
||||
[1] Oikea jalkaterä on määritetty, mutta myös oikea reisi ja joko rinta, lantio tai vyötärö on määritettävä!
|
||||
[0] Oikea jalkaterä on määritetty, mutta myös oikea nilkka, oikea reisi ja joko rinta, lantio tai vyötärö on määritettävä!
|
||||
*[other] Oikea jalkaterä on määritetty, mutta myös tuntematon määrittelemätön osa on määritettävä!
|
||||
}
|
||||
# $unassigned (Number) - Bits are based on BodyAssignment.ASSIGNMENT_RULES order
|
||||
onboarding-assign_trackers-warning-LEFT_LOWER_LEG =
|
||||
{ $unassigned ->
|
||||
[0] Vasen nilkka on määritetty, mutta myös vasen reisi ja joko rinta, lantio tai vyötärö on määritettävä!
|
||||
[1] Vasen nilkka on määritetty, mutta joko rinta, lantio tai vyötärö on myös määritettävä!
|
||||
[2] Vasen nilkka on määritetty, mutta myös vasen reisi on määritettävä!
|
||||
*[other] Vasen nilkka on määritetty, mutta myös tuntematon määrittelemätön osa on määritettävä!
|
||||
}
|
||||
# $unassigned (Number) - Bits are based on BodyAssignment.ASSIGNMENT_RULES order
|
||||
onboarding-assign_trackers-warning-RIGHT_LOWER_LEG =
|
||||
{ $unassigned ->
|
||||
[0] Oikea nilkka on määritetty, mutta myös oikea reisi ja joko rinta, lantio tai vyötärö on määritettävä!
|
||||
[1] Oikea nilkka on määritetty, mutta joko rinta, lantio tai vyötärö on myös määritettävä!
|
||||
[2] Oikea nilkka on määritetty, mutta myös oikea reisi on määritettävä!
|
||||
*[other] Oikea nilkka on määritetty, mutta myös tuntematon määrittelemätön osa on määritettävä!
|
||||
}
|
||||
# $unassigned (Number) - Bits are based on BodyAssignment.ASSIGNMENT_RULES order
|
||||
onboarding-assign_trackers-warning-LEFT_UPPER_LEG =
|
||||
{ $unassigned ->
|
||||
[0] Vasen reisi on määritetty, mutta myös rinta, lantio tai vyötärö on määritettävä!
|
||||
*[other] Vasen reisi on määritetty, mutta myös tuntematon määrittelemätön osa on määritettävä!
|
||||
}
|
||||
# $unassigned (Number) - Bits are based on BodyAssignment.ASSIGNMENT_RULES order
|
||||
onboarding-assign_trackers-warning-RIGHT_UPPER_LEG =
|
||||
{ $unassigned ->
|
||||
[0] Oikea reisi on määritetty, mutta myös rinta, lantio tai vyötärö on määritettävä!
|
||||
*[other] Oikea reisi on määritetty, mutta myös tuntematon määrittelemätön osa on määritettävä!
|
||||
}
|
||||
# $unassigned (Number) - Bits are based on BodyAssignment.ASSIGNMENT_RULES order
|
||||
onboarding-assign_trackers-warning-HIP =
|
||||
{ $unassigned ->
|
||||
[0] Lonkka on määritetty, mutta myös rinta on määritettävä!
|
||||
*[other] Lonkka on määritetty, mutta myös tuntematon määrittelemätön osa on määritettävä!
|
||||
}
|
||||
# $unassigned (Number) - Bits are based on BodyAssignment.ASSIGNMENT_RULES order
|
||||
onboarding-assign_trackers-warning-WAIST =
|
||||
{ $unassigned ->
|
||||
[0] Vyötärö on määritetty, mutta myös rinta on määritettävä!
|
||||
*[other] Vyötärö on määritetty, mutta myös tuntematon määrittelemätön osa on määritettävä!
|
||||
}
|
||||
|
||||
## Tracker mounting method choose
|
||||
|
||||
onboarding-choose_mounting = Mitä asennuskalibrointimenetelmää käytetään?
|
||||
# Multiline text
|
||||
onboarding-choose_mounting-description = Asennussuuntaus korjaa jäljittimien sijoittelun kehossasi.
|
||||
onboarding-choose_mounting-auto_mounting = Automaattinen asennus
|
||||
# Italized text
|
||||
onboarding-choose_mounting-auto_mounting-label = Kokeellinen
|
||||
onboarding-choose_mounting-auto_mounting-description = Tämä tunnistaa automaattisesti kaikkien jäljittimiesi asennussuunnat 2 asennosta
|
||||
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
|
||||
|
||||
## Tracker manual mounting setup
|
||||
|
||||
onboarding-manual_mounting-back = Palaa takaisin VR:ään
|
||||
onboarding-manual_mounting = Manuaalinen Asennus
|
||||
onboarding-manual_mounting-description = Napsauta jokaista jäljitintä ja valitse, mihin suuntaan ne on asennettu
|
||||
onboarding-manual_mounting-auto_mounting = Automaattinen asennus
|
||||
onboarding-manual_mounting-next = Seuraava vaihe
|
||||
|
||||
## Tracker automatic mounting setup
|
||||
|
||||
onboarding-automatic_mounting-back = Palaa takaisin VR:ään
|
||||
onboarding-automatic_mounting-title = Asennuksen Kalibrointi
|
||||
onboarding-automatic_mounting-description = Jotta SlimeVR jäljittimet toimisivat, meidän on määritettävä jäljittimille asennuksen kierto, jotta ne voidaan kohdistaa fyysisen jäljittimen asennuksen kanssa.
|
||||
onboarding-automatic_mounting-manual_mounting = Manuaalinen asennus
|
||||
onboarding-automatic_mounting-next = Seuraava vaihe
|
||||
onboarding-automatic_mounting-prev_step = Edellinen vaihe
|
||||
onboarding-automatic_mounting-done-title = Asennuskierrokset kalibroitu.
|
||||
onboarding-automatic_mounting-done-description = Asennuskalibrointi on valmis!
|
||||
onboarding-automatic_mounting-done-restart = Yritä uudelleen
|
||||
onboarding-automatic_mounting-mounting_reset-title = Asennuksen Nollaus
|
||||
onboarding-automatic_mounting-mounting_reset-step-0 = 1. Kyykisty "hiihtoasentoon" siten, että jalat ovat koukussa, ylävartalo kallistettuna eteenpäin ja kädet koukussa.
|
||||
onboarding-automatic_mounting-mounting_reset-step-1 = 2. Paina "Nollaa Asennus" -painiketta ja odota 3 sekuntia, ennen kuin jäljittimien asennuskierrot nollautuvat.
|
||||
onboarding-automatic_mounting-preparation-title = Valmistelu
|
||||
onboarding-automatic_mounting-preparation-step-0 = 1. Seiso pystyssä kädet sivuilla.
|
||||
onboarding-automatic_mounting-preparation-step-1 = 2. Paina "Täysinollaus" -painiketta ja odota 3 sekuntia, ennen kuin jäljittimet nollautuvat.
|
||||
onboarding-automatic_mounting-put_trackers_on-title = Laita jäljittimet päällesi
|
||||
onboarding-automatic_mounting-put_trackers_on-description = Kalibroidaksemme asennuskierrokset käytämme juuri määrittämiäsi jäljittimiä. Laita kaikki jäljittimet päällesi, näet mitkä ovat mitäkin oikealla olevassa kuvassa.
|
||||
onboarding-automatic_mounting-put_trackers_on-next = Minulla on kaikki jäljittimet päällä
|
||||
|
||||
## Tracker proportions method choose
|
||||
|
||||
onboarding-choose_proportions = Mitä kalibrointimenetelmää käytetään?
|
||||
onboarding-choose_proportions-auto_proportions = Automaattiset mittasuhteet
|
||||
onboarding-choose_proportions-manual_proportions = Manuaaliset mittasuhteet
|
||||
|
||||
## Tracker manual proportions setup
|
||||
|
||||
onboarding-manual_proportions-title = Manuaaliset kehon mittasuhteet
|
||||
onboarding-manual_proportions-precision = Tarkka säätö
|
||||
onboarding-manual_proportions-auto = Automaattiset mittasuhteet
|
||||
onboarding-manual_proportions-ratio = Säädä suhderyhmien mukaan
|
||||
|
||||
## Tracker automatic proportions setup
|
||||
|
||||
onboarding-automatic_proportions-title = Mittaa kehosi
|
||||
onboarding-automatic_proportions-manual = Manuaaliset mittasuhteet
|
||||
onboarding-automatic_proportions-prev_step = Edellinen vaihe
|
||||
onboarding-automatic_proportions-put_trackers_on-title = Laita jäljittimet päällesi
|
||||
onboarding-automatic_proportions-put_trackers_on-next = Minulla on kaikki jäljittimet päällä
|
||||
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-fetch_height = Seison
|
||||
# Context is that the height is unknown
|
||||
onboarding-automatic_proportions-check_height-unknown = Tuntematon
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-hmd_height1 = HMD-korkeus on
|
||||
# Shows an element below it
|
||||
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-next = Aloita tallennus
|
||||
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
|
||||
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 20)
|
||||
onboarding-automatic_proportions-recording-timer =
|
||||
{ $time ->
|
||||
[one] 1 sekuntti jäljellä
|
||||
*[other] { $time } sekuntia jäljellä
|
||||
}
|
||||
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-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-confirm = Ymmäretty!
|
||||
|
||||
## Home
|
||||
|
||||
home-no_trackers = Jäjittimiä ei havaittu tai määritetty
|
||||
|
||||
## Status system
|
||||
|
||||
status_system-StatusTrackerReset = On suositeltavaa suorittaa täydellinen nollaus, koska yhtä tai useampaa jäljitintä ei ole säädetty.
|
||||
status_system-StatusSteamVRDisconnected =
|
||||
{ $type ->
|
||||
[steamvr_feeder] Tällä hetkellä ei ole yhdistetty SlimeVR Feeder -sovellukseen.
|
||||
*[other] Tällä hetkellä ei ole yhdistetty SteamVR:ään SlimeVR-ajurin kautta.
|
||||
}
|
||||
status_system-StatusTrackerError = { $trackerName } jäljittimessä on virhe
|
||||
|
||||
@@ -20,7 +20,7 @@ version_update-close = Fermer
|
||||
## Tips
|
||||
|
||||
tips-find_tracker = Impossible de différencier vos capteurs ? Secouez-en un pour qu'il soit mis en évidence.
|
||||
tips-do_not_move_heels = Assurez-vous de ne pas bouger vos pieds pendant la calibration !
|
||||
tips-do_not_move_heels = Assurez-vous de ne pas bouger vos pieds pendant l'enregistrement !
|
||||
tips-file_select = Glissez et déposez des fichiers à utiliser, ou <u>parcourir</u>.
|
||||
tips-tap_setup = Vous pouvez tapoter lentement votre capteur 2 fois pour le choisir au lieu de le sélectionner depuis le menu.
|
||||
|
||||
@@ -348,9 +348,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 +375,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
|
||||
@@ -659,8 +671,8 @@ onboarding-assignment_tutorial = Comment préparer un capteur Slime avant de le
|
||||
onboarding-assignment_tutorial-first_step = 1. Placez un autocollant de partie du corps (si vous en avez un) sur le capteur selon votre choix
|
||||
# This text has a character limit of around 11 characters, so please keep it short
|
||||
onboarding-assignment_tutorial-sticker = Autocollant
|
||||
onboarding-assignment_tutorial-second_step = 2. Attachez la sangle à votre capteur en gardant le côté velcro de la sangle dans l’orientation suivante:
|
||||
onboarding-assignment_tutorial-second_step-continuation = La partie velcro pour l’extension doit être dans cette orientation:
|
||||
onboarding-assignment_tutorial-second_step-v2 = 2. Attachez la sangle à votre capteur en gardant le velcro de la sangle dans la même direction que le visage du capteur :
|
||||
onboarding-assignment_tutorial-second_step-continuation-v2 = Le velcro de l’extension doit être orienté vers le haut comme dans l’image suivante :
|
||||
onboarding-assignment_tutorial-done = J'ai mis les autocollants et les sangles !
|
||||
|
||||
## Tracker assignment setup
|
||||
@@ -809,6 +821,9 @@ onboarding-choose_proportions-manual_proportions = Proportions manuelles
|
||||
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
|
||||
|
||||
@@ -346,9 +346,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 +373,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
|
||||
@@ -658,8 +670,8 @@ onboarding-assignment_tutorial = Come preparare uno Slime Tracker prima di indos
|
||||
onboarding-assignment_tutorial-first_step = 1. Posiziona un adesivo di una parte del corpo sul tracker in base alla tua scelta (se ne hai uno)
|
||||
# This text has a character limit of around 11 characters, so please keep it short
|
||||
onboarding-assignment_tutorial-sticker = Adesivo
|
||||
onboarding-assignment_tutorial-second_step = 2. Fissa il cinturino al tracker, mantenendo il lato del gancio e dell'anello del cintutino nel seguente orientamento:
|
||||
onboarding-assignment_tutorial-second_step-continuation = Il lato del gancio e dell'anello del cinturino per l'estensione dovrebbe essere in questo orientamento:
|
||||
onboarding-assignment_tutorial-second_step-v2 = 2. Fissare il cinturino al tracker, mantenendo il lato in velcro del cinturino rivolto nella stessa direzione del lato frontale del tuo slime tracker:
|
||||
onboarding-assignment_tutorial-second_step-continuation-v2 = Il lato del velcro per l'estensione dovrebbe essere rivolto verso l'alto come nell'immagine seguente:
|
||||
onboarding-assignment_tutorial-done = Ho messo gli adesivi e i cinturini!
|
||||
|
||||
## Tracker assignment setup
|
||||
@@ -808,6 +820,9 @@ onboarding-choose_proportions-manual_proportions = Proporzioni manuali
|
||||
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
|
||||
@@ -845,9 +860,9 @@ onboarding-automatic_proportions-check_height-fetch_height = Sono in piedi!
|
||||
# Context is that the height is unknown
|
||||
onboarding-automatic_proportions-check_height-unknown = Sconosciuto
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-height = La tua altezza è
|
||||
onboarding-automatic_proportions-check_height-hmd_height1 = L'altezza del tuo HMD è
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-hmd_height = E l'altezza del HMD è
|
||||
onboarding-automatic_proportions-check_height-height1 = quindi la tua altezza effettiva è
|
||||
onboarding-automatic_proportions-check_height-next_step = Sono corretti
|
||||
onboarding-automatic_proportions-start_recording-title = Preparati a muoverti
|
||||
onboarding-automatic_proportions-start_recording-description = Ora registreremo alcune pose e movimenti specifici. Questi verranno descritte nelle schermate successive. Preparati a iniziare quando premi il pulsante!
|
||||
|
||||
@@ -36,6 +36,7 @@ body_part-RIGHT_HAND = 오른손
|
||||
body_part-RIGHT_UPPER_LEG = 오른쪽 다리 위
|
||||
body_part-RIGHT_LOWER_LEG = 오른쪽 다리 아래
|
||||
body_part-RIGHT_FOOT = 오른발
|
||||
body_part-UPPER_CHEST = 가슴 위
|
||||
body_part-CHEST = 가슴
|
||||
body_part-WAIST = 허리
|
||||
body_part-HIP = 골반
|
||||
@@ -53,8 +54,9 @@ skeleton_bone-NONE = 없음
|
||||
skeleton_bone-HEAD = 머리 밀림
|
||||
skeleton_bone-NECK = 목 길이
|
||||
skeleton_bone-torso_group = 몸통 길이
|
||||
skeleton_bone-CHEST = 가슴 길이
|
||||
skeleton_bone-UPPER_CHEST = 가슴 위쪽 길이
|
||||
skeleton_bone-CHEST_OFFSET = 가슴 오프셋
|
||||
skeleton_bone-CHEST = 가슴 길이
|
||||
skeleton_bone-WAIST = 허리 길이
|
||||
skeleton_bone-HIP = 골반 길이
|
||||
skeleton_bone-HIP_OFFSET = 골반 오프셋
|
||||
@@ -120,6 +122,10 @@ widget-overlay-is_mirrored_label = 오버레이 반전
|
||||
|
||||
widget-drift_compensation-clear = 틀어짐 보정 초기화
|
||||
|
||||
## Widget: Clear Reset Mounting
|
||||
|
||||
widget-clear_mounting = 착용 방향 정렬 초기화
|
||||
|
||||
## Widget: Developer settings
|
||||
|
||||
widget-developer_mode = 개발자 모드
|
||||
@@ -163,9 +169,15 @@ tracker-table-column-url = URL
|
||||
## Tracker rotation
|
||||
|
||||
tracker-rotation-front = 앞쪽
|
||||
tracker-rotation-front_left = 왼쪽 앞
|
||||
tracker-rotation-front_right = 오른쪽 앞
|
||||
tracker-rotation-left = 왼쪽
|
||||
tracker-rotation-right = 오른쪽
|
||||
tracker-rotation-back = 뒤쪽
|
||||
tracker-rotation-back_left = 왼쪽 뒤
|
||||
tracker-rotation-back_right = 오른쪽 뒤
|
||||
tracker-rotation-custom = 사용자 지정
|
||||
tracker-rotation-overriden = (착용 방향 보정으로 재정의됨)
|
||||
|
||||
## Tracker information
|
||||
|
||||
@@ -230,6 +242,7 @@ tracker_selection_menu-RIGHT_UPPER_LEG = 오른쪽 다리 위{ -tracker_selectio
|
||||
tracker_selection_menu-RIGHT_LOWER_LEG = 오른쪽 다리 아래{ -tracker_selection-part }
|
||||
tracker_selection_menu-RIGHT_FOOT = 오른쪽 발{ -tracker_selection-part }
|
||||
tracker_selection_menu-RIGHT_CONTROLLER = 오른쪽 컨트롤러{ -tracker_selection-part }
|
||||
tracker_selection_menu-UPPER_CHEST = 가슴 위{ -tracker_selection-part }
|
||||
tracker_selection_menu-CHEST = 가슴{ -tracker_selection-part }
|
||||
tracker_selection_menu-WAIST = 허리{ -tracker_selection-part }
|
||||
tracker_selection_menu-HIP = 골반{ -tracker_selection-part }
|
||||
@@ -269,6 +282,8 @@ settings-sidebar-osc_router = OSC 라우터
|
||||
settings-sidebar-osc_trackers = VRChat OSC 트래커
|
||||
settings-sidebar-utils = 유틸리티
|
||||
settings-sidebar-serial = 시리얼 콘솔
|
||||
settings-sidebar-appearance = 모양
|
||||
settings-sidebar-notifications = 알림
|
||||
|
||||
## SteamVR settings
|
||||
|
||||
@@ -336,11 +351,10 @@ settings-general-fk_settings-leg_fk = 발 트래킹
|
||||
settings-general-fk_settings-arm_fk = 팔 운동학
|
||||
settings-general-fk_settings-arm_fk-description = 팔이 추적되는 방식을 변경할 수 있어요.
|
||||
settings-general-fk_settings-arm_fk-force_arms = 팔을 HMD에서만 받아오기
|
||||
settings-general-fk_settings-skeleton_settings = 골격 설정
|
||||
settings-general-fk_settings-skeleton_settings-description = 골격 설정을 설정하거나 해제해요. 이것들은 켜두는 게 좋아요.
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine = 척추 확장
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis = 골반 확장
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees = 무릎 확장
|
||||
settings-general-fk_settings-skeleton_settings-ratios = 골격 비율
|
||||
settings-general-fk_settings-self_localization-title = Mocap 모드
|
||||
settings-general-fk_settings-self_localization-description = Mocap 모드에서는 헤드셋이나 다른 트래커 없이 골격이 자신의 위치를 대략적으로 추적할 수 있어요. 발과 머리 트래커가 필요하고 아직 실험적이에요.
|
||||
settings-general-fk_settings-vive_emulation-title = VIVE 에뮬레이션
|
||||
settings-general-fk_settings-vive_emulation-description = 바이브 트래커가 가지고 있는 허리 트래커 문제를 따라해보세요! 사실 이건 장난이고 추적을 더 악화시켜요.
|
||||
settings-general-fk_settings-vive_emulation-label = VIVE 에뮬레이션 활성화
|
||||
@@ -356,6 +370,9 @@ settings-general-gesture_control-taps =
|
||||
{ $amount ->
|
||||
*[other] { $amount } 탭
|
||||
}
|
||||
# This is a unit: 3 trackers, 2 trackers, 1 tracker
|
||||
# $amount (Number) - Amount of trackers
|
||||
settings-general-gesture_control-trackers = { $amount } 트래커
|
||||
settings-general-gesture_control-yawResetEnabled = 탭해서 Yaw 정렬 활성화
|
||||
settings-general-gesture_control-yawResetDelay = Yaw 정렬 딜레이
|
||||
settings-general-gesture_control-yawResetTaps = Yaw 정렬 탭 횟수
|
||||
@@ -365,13 +382,32 @@ settings-general-gesture_control-fullResetTaps = 탭해서 전체 정렬
|
||||
settings-general-gesture_control-mountingResetEnabled = 탭해서 착용 방향 정렬 활성화
|
||||
settings-general-gesture_control-mountingResetDelay = 착용 방향 정렬 딜레이
|
||||
settings-general-gesture_control-mountingResetTaps = 탭해서 착용 방향 정렬
|
||||
# The number of trackers that can have higher acceleration before a tap is rejected
|
||||
settings-general-gesture_control-numberTrackersOverThreshold = 트래커 감지 한계
|
||||
settings-general-gesture_control-numberTrackersOverThreshold-description = 몸을 움직이면서 제스처 제어를 하고 싶은데 잘 작동하지 않는다면 이 값을 늘리세요. 탭 탐지가 작동하는 데 필요한 값 이상으로 늘리지 마세요. 더 많은 오작동이 발생할 수 있어요.
|
||||
|
||||
## Interface settings
|
||||
## Appearance settings
|
||||
|
||||
settings-general-interface = 인터페이스
|
||||
settings-interface-appearance = 모양
|
||||
settings-general-interface-dev_mode = 개발자 모드
|
||||
settings-general-interface-dev_mode-description = 이 모드는 더 많은 데이터가 필요하거나 고급 수준에서 연결된 트래커와 상호 작용하는 경우에 유용할 수 있어요.
|
||||
settings-general-interface-dev_mode-label = 개발자 모드
|
||||
settings-general-interface-theme = 컬러 테마
|
||||
settings-general-interface-lang = 언어 선택
|
||||
settings-general-interface-lang-description = 사용하고 싶은 기본 언어를 선택하세요.
|
||||
settings-general-interface-lang-placeholder = 사용할 언어를 선택하세요
|
||||
# Keep the font name untranslated
|
||||
settings-interface-appearance-font = GUI 글꼴
|
||||
settings-interface-appearance-font-description = 이렇게 하면 인터페이스에서 사용하는 글꼴이 변경돼요.
|
||||
settings-interface-appearance-font-placeholder = 기본 글꼴
|
||||
settings-interface-appearance-font-os_font = OS 글꼴
|
||||
settings-interface-appearance-font-slime_font = 기본 글꼴
|
||||
settings-interface-appearance-font_size = 글꼴 크기 조정
|
||||
settings-interface-appearance-font_size-description = 변경하면 이 설정 패널을 제외하고 모든 인터페이스의 글꼴 크기가 달라져요.
|
||||
|
||||
## Notification settings
|
||||
|
||||
settings-interface-notifications = 알림
|
||||
settings-general-interface-serial_detection = 시리얼 디바이스 감지
|
||||
settings-general-interface-serial_detection-description = 이 옵션은 트래커일 수도 있는 새로운 시리얼 디바이스를 연결할 때마다 팝업을 표시해요. 트래커 설정 프로세스를 개선하는 데 도움이 될 거예요.
|
||||
settings-general-interface-serial_detection-label = 시리얼 디바이스 감지
|
||||
@@ -379,10 +415,6 @@ settings-general-interface-feedback_sound = 피드백 사운드
|
||||
settings-general-interface-feedback_sound-description = 이 옵션을 켜면 트래커를 정렬할 때 효과음을 재생해요
|
||||
settings-general-interface-feedback_sound-label = 피드백 사운드
|
||||
settings-general-interface-feedback_sound-volume = 피드백 사운드 음량
|
||||
settings-general-interface-theme = 컬러 테마
|
||||
settings-general-interface-lang = 언어 선택
|
||||
settings-general-interface-lang-description = 사용하고 싶은 기본 언어를 선택하세요.
|
||||
settings-general-interface-lang-placeholder = 사용할 언어를 선택하세요
|
||||
|
||||
## Serial settings
|
||||
|
||||
@@ -526,6 +558,27 @@ onboarding-wifi_creds-password =
|
||||
|
||||
onboarding-reset_tutorial-back = 착용 방향 정렬로 돌아가기
|
||||
onboarding-reset_tutorial = 정렬 튜토리얼
|
||||
onboarding-reset_tutorial-explanation =
|
||||
트래커를 사용하다 보면 Yaw 드리프트 또는 트래커가 미끄러져서 틀어짐이 발생할 수 있어요.
|
||||
지금부터 그런 문제를 해결하는 방법을 알려 드릴게요.
|
||||
onboarding-reset_tutorial-skip = 무시하고 건너뛰기
|
||||
# Cares about multiline
|
||||
onboarding-reset_tutorial-0 =
|
||||
Yaw 정렬을 시도하려면 강조된 트래커를 { $taps }번 탭하세요.
|
||||
그러면 트래커는 HMD가 바라보는 면과 같은 방향으로 정렬될 거예요.
|
||||
# Cares about multiline
|
||||
onboarding-reset_tutorial-1 =
|
||||
전체 정렬을 시도하려면 강조된 트래커를 { $taps }번 탭하세요.
|
||||
|
||||
탭한 다음 3초 뒤에(설정에서 변경 가능) 실제 보정이 이뤄지기 때문에 그 사이에 일어나서 차렷 자세로 보정을 기다리면 돼요.
|
||||
전체 정렬은 모든 트래커의 위치와 각도를 원래대로 되돌리기 때문에 대부분의 틀어짐 문제를 해결할 수 있어요.
|
||||
# Cares about multiline
|
||||
onboarding-reset_tutorial-2 =
|
||||
착용 방향 정렬을 시도하려면 강조된 트래커를 { $taps }번 탭하세요.
|
||||
|
||||
착용 방향 정렬은 실제로 몸에 있는 트래커의 위치를 감지할 수 있어요. 트래커를 정확한 방향으로 착용하지 않거나 실수로 움직여서 트래커가 미끄러져도 착용 방향 정렬을 통해 해결할 수 있어요.
|
||||
|
||||
자동 착용 방향 설정 마법사에서 봤던 것처럼 스키를 타는 듯한 자세로 몸을 구부리고 있으세요. 탭한 다음 3초 뒤에(설정에서 변경 가능) 보정이 시작될 거예요.
|
||||
|
||||
## Setup start
|
||||
|
||||
@@ -577,6 +630,9 @@ onboarding-connect_tracker-next = 모든 트래커를 잘 연결했어요
|
||||
|
||||
onboarding-calibration_tutorial = IMU 캘리브레이션 튜토리얼
|
||||
onboarding-calibration_tutorial-subtitle = 트래커 틀어짐을 줄이는 데 도움이 될 거예요!
|
||||
onboarding-calibration_tutorial-description =
|
||||
매번 트래커의 전원을 켤 때마다 평평한 바닥에 트래커를 두고 잠시 기다려서 보정을 수행해야 해요. <b>(트래커를 움직이지 마세요!)</b>
|
||||
어떻게 하면 되는지 "{ onboarding-calibration_tutorial-calibrate }"를 눌러 같이 따라해보죠!
|
||||
onboarding-calibration_tutorial-status-calibrating = 캘리브레이팅
|
||||
|
||||
## Tracker assignment tutorial
|
||||
@@ -714,11 +770,11 @@ onboarding-choose_proportions = 신체 비율을 설정하기 위해 어떤 방
|
||||
onboarding-choose_proportions-auto_proportions = 자동으로 비율 설정
|
||||
# Italized text
|
||||
onboarding-choose_proportions-auto_proportions-subtitle = 권장
|
||||
onboarding-choose_proportions-auto_proportions-description = 이렇게 하면 움직임 샘플을 기록하고 알고리즘을 통과해서 자동으로 신체 비율을 설정할 수 있어요
|
||||
onboarding-choose_proportions-manual_proportions = 수동으로 비율 설정
|
||||
# Italized text
|
||||
onboarding-choose_proportions-manual_proportions-subtitle = 정밀하게 설정하고 싶다면
|
||||
onboarding-choose_proportions-manual_proportions-description = 이렇게 하면 신체 비율을 직접 수정하여 수동으로 조절할 수 있어요
|
||||
onboarding-choose_proportions-export = 다른 이름으로 저장
|
||||
|
||||
## Tracker manual proportions setup
|
||||
|
||||
@@ -776,6 +832,7 @@ 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-confirm = 이해했어요!
|
||||
|
||||
## Home
|
||||
|
||||
@@ -783,3 +840,10 @@ home-no_trackers = 감지되거나 할당된 트래커가 없어요.
|
||||
|
||||
## Status system
|
||||
|
||||
status_system-StatusTrackerReset = 아직 정렬되지 않은 트래커가 있어서 전체 정렬을 수행해주세요.
|
||||
status_system-StatusSteamVRDisconnected =
|
||||
{ $type ->
|
||||
[steamvr_feeder] SlimeVR 피더와 통신할 수 없어요.
|
||||
*[other] SlimeVR 드라이버를 통해 SteamVR과 통신할 수 없어요.
|
||||
}
|
||||
status_system-StatusTrackerError = { $trackerName } 트래커에 문제가 발생했어요.
|
||||
|
||||
@@ -122,6 +122,10 @@ widget-overlay-is_mirrored_label = Overlay weergeven als spiegel
|
||||
|
||||
widget-drift_compensation-clear = Reset huidige drift compensatie
|
||||
|
||||
## Widget: Clear Reset Mounting
|
||||
|
||||
widget-clear_mounting = Reset montage legen
|
||||
|
||||
## Widget: Developer settings
|
||||
|
||||
widget-developer_mode = Developer Mode
|
||||
@@ -165,9 +169,15 @@ tracker-table-column-url = URL
|
||||
## Tracker rotation
|
||||
|
||||
tracker-rotation-front = Voorzijde
|
||||
tracker-rotation-front_left = Linksvoor
|
||||
tracker-rotation-front_right = Rechtsvoor
|
||||
tracker-rotation-left = Links
|
||||
tracker-rotation-right = Rechts
|
||||
tracker-rotation-back = Achterzijde
|
||||
tracker-rotation-back_left = Linksachter
|
||||
tracker-rotation-back_right = Rechtsachter
|
||||
tracker-rotation-custom = Aangepast
|
||||
tracker-rotation-overriden = (overschreven door montage reset)
|
||||
|
||||
## Tracker information
|
||||
|
||||
@@ -272,6 +282,8 @@ settings-sidebar-osc_router = OSC-router
|
||||
settings-sidebar-osc_trackers = VRChat OSC Trackers
|
||||
settings-sidebar-utils = Hulpmiddelen
|
||||
settings-sidebar-serial = Serieel console
|
||||
settings-sidebar-appearance = Uiterlijk
|
||||
settings-sidebar-notifications = Notificaties
|
||||
|
||||
## SteamVR settings
|
||||
|
||||
@@ -341,11 +353,22 @@ settings-general-fk_settings-leg_fk = Been tracking
|
||||
settings-general-fk_settings-arm_fk = Arm tracking
|
||||
settings-general-fk_settings-arm_fk-description = Verander de manier waarop de armen worden getrackt.
|
||||
settings-general-fk_settings-arm_fk-force_arms = Dwing armen vanuit HMD
|
||||
settings-general-fk_settings-skeleton_settings = Skeleton instellingen
|
||||
settings-general-fk_settings-arm_fk-reset_mode-description = Pas de verwachte armhouding aan voor het resetten van de montage.
|
||||
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 = Uitgebreide rug
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis = Uitgebreide bekken
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees = Uitgebreide knieën
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine_model = Uitgebreid ruggengraat model
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis_model = Uitgebreid bekken model
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees_model = Uitgebreid knie model
|
||||
settings-general-fk_settings-skeleton_settings-ratios = skelet verhoudingen
|
||||
settings-general-fk_settings-skeleton_settings-ratios-description = Pas de waardes van de skelet instellingen aan. Het kan zijn dat je hierna je lichaams proporties moet aanpassen.
|
||||
settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_hip = Bereken taille van borst naar heup
|
||||
settings-general-fk_settings-skeleton_settings-impute_waist_from_chest_legs = Bereken taille van borst naar benen
|
||||
settings-general-fk_settings-skeleton_settings-impute_hip_from_chest_legs = Bereken heup van borst naar benen
|
||||
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-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
|
||||
settings-general-fk_settings-vive_emulation-description = Emuleer de problemen met de taille van Vive trackers. Dit is een mop en maakt tracking slechter.
|
||||
settings-general-fk_settings-vive_emulation-label = Vive-emulatie inschakelen
|
||||
@@ -362,6 +385,13 @@ settings-general-gesture_control-taps =
|
||||
[one] 1 tik
|
||||
*[other] { $amount } tikken
|
||||
}
|
||||
# This is a unit: 3 trackers, 2 trackers, 1 tracker
|
||||
# $amount (Number) - Amount of trackers
|
||||
settings-general-gesture_control-trackers =
|
||||
{ $amount ->
|
||||
[one] één
|
||||
*[other] anders
|
||||
}
|
||||
settings-general-gesture_control-yawResetEnabled = Activeer tikken voor horizontale reset
|
||||
settings-general-gesture_control-yawResetDelay = Vertraging horizontale reset
|
||||
settings-general-gesture_control-yawResetTaps = Hoeveelheid tikken voor horizontale reset
|
||||
@@ -371,13 +401,32 @@ settings-general-gesture_control-fullResetTaps = Hoeveelheid tikken voor volledi
|
||||
settings-general-gesture_control-mountingResetEnabled = Activeer tikken voor bevestigingskalibratie
|
||||
settings-general-gesture_control-mountingResetDelay = Vertraging bevestigingskalibratie
|
||||
settings-general-gesture_control-mountingResetTaps = Hoeveelheid tikken voor bevestigingskalibratie
|
||||
# The number of trackers that can have higher acceleration before a tap is rejected
|
||||
settings-general-gesture_control-numberTrackersOverThreshold = Trackers over drempelwaarde
|
||||
settings-general-gesture_control-numberTrackersOverThreshold-description = Verhoog deze waarde als de tik detectie niet werkt. Zet deze waarde niet te hoog om tik detectie te laten werken, dit kan vals positieve resultaten creëren.
|
||||
|
||||
## Interface settings
|
||||
## Appearance settings
|
||||
|
||||
settings-general-interface = Interface
|
||||
settings-interface-appearance = Uiterlijk
|
||||
settings-general-interface-dev_mode = Ontwikkelaarsmodus
|
||||
settings-general-interface-dev_mode-description = Deze modus kan nuttig zijn als je diepgaande gegevens nodig hebt of op een geavanceerd niveau wilt communiceren met aangesloten trackers.
|
||||
settings-general-interface-dev_mode-label = Ontwikkelaarsmodus
|
||||
settings-general-interface-theme = Themakleur
|
||||
settings-general-interface-lang = Selecteer taal
|
||||
settings-general-interface-lang-description = Verander de standaardtaal die je wilt gebruiken.
|
||||
settings-general-interface-lang-placeholder = Selecteer de te gebruiken taal
|
||||
# Keep the font name untranslated
|
||||
settings-interface-appearance-font = GUI lettertype
|
||||
settings-interface-appearance-font-description = Dit past het lettertype aan welke gebruikt wordt binnen het interface
|
||||
settings-interface-appearance-font-placeholder = Standaard lettertype
|
||||
settings-interface-appearance-font-os_font = Besturingssysteem lettertype
|
||||
settings-interface-appearance-font-slime_font = Standaard lettertype
|
||||
settings-interface-appearance-font_size = Standaard lettertype grote
|
||||
settings-interface-appearance-font_size-description = Dit past het lettertype grote aan voor het gehele interfeace, behalve voor deze instellingen pagina.
|
||||
|
||||
## Notification settings
|
||||
|
||||
settings-interface-notifications = Notificaties
|
||||
settings-general-interface-serial_detection = Detectie van seriële apparaten
|
||||
settings-general-interface-serial_detection-description = Met deze optie verschijnt er elke keer dat je een nieuw serieel apparaat aansluit dat mogelijk een tracker is, een pop-up. Dit helpt bij het verbeteren van het instelproces van een tracker.
|
||||
settings-general-interface-serial_detection-label = Detectie van seriële apparaten
|
||||
@@ -385,10 +434,6 @@ 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-theme = Themakleur
|
||||
settings-general-interface-lang = Selecteer taal
|
||||
settings-general-interface-lang-description = Verander de standaardtaal die je wilt gebruiken.
|
||||
settings-general-interface-lang-placeholder = Selecteer de te gebruiken taal
|
||||
|
||||
## Serial settings
|
||||
|
||||
@@ -532,7 +577,26 @@ onboarding-wifi_creds-password =
|
||||
|
||||
onboarding-reset_tutorial-back = Ga terug naar de bevestigingskalibratie
|
||||
onboarding-reset_tutorial = Reset tutorial
|
||||
onboarding-reset_tutorial-explanation = Terwijl je jouw trackers gebruikt, kunnen ze uit de lijn raken vanwege IMU-yaw-drift, of omdat je ze fysiek hebt verplaatst. Je hebt verschillende manieren om dit op te lossen.
|
||||
onboarding-reset_tutorial-skip = Stap overslaan
|
||||
# Cares about multiline
|
||||
onboarding-reset_tutorial-0 =
|
||||
Tik { $taps } keer op de gemarkeerde tracker om de yaw-reset te activeren.
|
||||
|
||||
Hierdoor staan de trackers in dezelfde richting als je HMD.
|
||||
# Cares about multiline
|
||||
onboarding-reset_tutorial-1 =
|
||||
Tik { $taps } keer op de gemarkeerde tracker om een volledige reset uit te voeren.
|
||||
|
||||
Hiervoor moet je staan (i-pose). Er is een vertraging van 3 seconden (instelbaar) voordat het daadwerkelijk gebeurt.
|
||||
Hiermee wordt de positie en rotatie van al je trackers volledig gereset. Dit zou de meeste problemen moeten oplossen.
|
||||
# Cares about multiline
|
||||
onboarding-reset_tutorial-2 =
|
||||
Tik { $taps } keer op de gemarkeerde tracker om de montage opnieuw in te stellen.
|
||||
|
||||
Montage-reset helpt bij hoe de trackers daadwerkelijk op je worden geplaatst, dus als je ze per ongeluk hebt verplaatst en de oriëntatie ervan voor een groot deel hebt veranderd, zal dit helpen.
|
||||
|
||||
Je moet in een houding staan alsof je aan het skiën bent, zoals wordt weergegeven in de Automatische montage wizard, je hebt een vertraging van 3 seconden (instelbaar) voordat deze wordt geactiveerd.
|
||||
|
||||
## Setup start
|
||||
|
||||
@@ -598,8 +662,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
|
||||
@@ -737,12 +801,17 @@ 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-description = We kunnen je verhoudingen proberen approximeren door middel van jouw bewegingen
|
||||
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
|
||||
@@ -773,6 +842,20 @@ onboarding-automatic_proportions-requirements-description =
|
||||
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 =
|
||||
We gebruiken je lengte als een basis voor onze metingen middels de HMD's hoogte, hiermee bepalen we je echte lengte.
|
||||
Maar het is beter om zelf te controleren of dit klopt.
|
||||
# All the text is in bold!
|
||||
onboarding-automatic_proportions-check_height-calculation_warning = Druk op de knop terwijl je <u>rechtop</u> staat om je lengte te berekenen. Je hebt 3 seconden na dat je op de knop drukt!
|
||||
onboarding-automatic_proportions-check_height-fetch_height = Ik sta!
|
||||
# Context is that the height is unknown
|
||||
onboarding-automatic_proportions-check_height-unknown = Onbekend
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-hmd_height1 = Je HMD lengte is
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-height1 = Je echte lengte is
|
||||
onboarding-automatic_proportions-check_height-next_step = Ze zijn goed
|
||||
onboarding-automatic_proportions-start_recording-title = Zorg dat je klaar bent om te bewegen
|
||||
onboarding-automatic_proportions-start_recording-description = We gaan nu enkele specifieke houdingen en bewegingen opnemen. Deze worden in het volgende scherm geprompt. Zorg dat je klaar bent om te beginnen als de knop wordt ingedrukt!
|
||||
onboarding-automatic_proportions-start_recording-next = Start opname
|
||||
@@ -802,6 +885,10 @@ onboarding-automatic_proportions-verify_results-redo = Opname opnieuw doen
|
||||
onboarding-automatic_proportions-verify_results-confirm = Ze zijn correct
|
||||
onboarding-automatic_proportions-done-title = Lichaam gemeten en opgeslagen.
|
||||
onboarding-automatic_proportions-done-description = Je kalibratie voor lichaamsverhoudingen is voltooid!
|
||||
onboarding-automatic_proportions-error_modal =
|
||||
<b>Waarschuwing:</b> Er is een error ontstaan bij het schatten van de proporties!
|
||||
Check alsjeblieft <docs>de docs</docs> of join onze <discord>Discord</Discord> voor hulp ^_^
|
||||
onboarding-automatic_proportions-error_modal-confirm = Begrepen!
|
||||
|
||||
## Home
|
||||
|
||||
|
||||
@@ -348,9 +348,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 +375,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
|
||||
@@ -665,8 +677,8 @@ 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 = 2. Przymocuj pasek do trackera, utrzymując stronę paska z haczykiem i pętelką w następującej orientacji:
|
||||
onboarding-assignment_tutorial-second_step-continuation = Strona z haczykiem i pętelką dla przedłużenia powinna być w tej orientacji:
|
||||
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!
|
||||
|
||||
## Tracker assignment setup
|
||||
@@ -817,6 +829,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
|
||||
@@ -855,9 +870,9 @@ onboarding-automatic_proportions-check_height-fetch_height = Stoję!
|
||||
# Context is that the height is unknown
|
||||
onboarding-automatic_proportions-check_height-unknown = Nieznany
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-height = Twój wzrost to
|
||||
onboarding-automatic_proportions-check_height-hmd_height1 = Twoja wysokość HMD to
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-hmd_height = A wysokość HMD jest
|
||||
onboarding-automatic_proportions-check_height-height1 = Twoje rzeczywisty wzrost to
|
||||
onboarding-automatic_proportions-check_height-next_step = Są w porządku
|
||||
onboarding-automatic_proportions-start_recording-title = Bądź gotowy żeby się ruszać
|
||||
onboarding-automatic_proportions-start_recording-description = Będziemy teraz nagrywać specyficzne pozycje i ruchy. Będą one pokazane w następnym okienku. Bądź gotowy po naciśnięciu przycisku!
|
||||
|
||||
@@ -177,6 +177,7 @@ tracker-rotation-back = Сзади
|
||||
tracker-rotation-back_left = Левая сторона задней части
|
||||
tracker-rotation-back_right = Правая сторона задней части
|
||||
tracker-rotation-custom = Пользовательское
|
||||
tracker-rotation-overriden = (перезаписан крепёжным сбросом)
|
||||
|
||||
## Tracker information
|
||||
|
||||
@@ -350,12 +351,19 @@ settings-general-fk_settings-leg_fk = Трекинг ноги
|
||||
settings-general-fk_settings-arm_fk = Трекинг руки
|
||||
settings-general-fk_settings-arm_fk-description = Измените способ отслеживания рук.
|
||||
settings-general-fk_settings-arm_fk-force_arms = Руки от HMD
|
||||
settings-general-fk_settings-skeleton_settings-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 = Усредните рыскание и перекат бедра c рысканьем и перекатом ног
|
||||
settings-general-fk_settings-skeleton_settings-interp_knee_tracker_ankle = Усредните рыскание и крен коленных трекеров с рысканьем и креном трекеров лодыжек
|
||||
settings-general-fk_settings-self_localization-title = Режим Mocap
|
||||
settings-general-fk_settings-self_localization-description = Режим Mocap позволяет скелету примерно отслеживать свое собственное положение без использования гарнитуры или других трекеров. Обратите внимание, что для работы этого требуются трекеры ног и головы, и это все еще экспериментальный метод.
|
||||
settings-general-fk_settings-vive_emulation-title = Эмуляция Vive
|
||||
@@ -657,8 +665,8 @@ onboarding-assignment_tutorial = Как подготовить Slime Треке
|
||||
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 = 2. Прикрепите ремешок к трекеру, держа липучку в том же направлении, что и верхняя сторона трекера:
|
||||
onboarding-assignment_tutorial-second_step-continuation-v2 = Липучка расширения должна смотреть вверх, как показано на следующей картинке:
|
||||
onboarding-assignment_tutorial-done = Я наклеил стикеры и ремешки!
|
||||
|
||||
## Tracker assignment setup
|
||||
@@ -800,11 +808,18 @@ onboarding-choose_proportions-description =
|
||||
onboarding-choose_proportions-auto_proportions = Автоматическая привязка
|
||||
# Italized text
|
||||
onboarding-choose_proportions-auto_proportions-subtitle = Рекомендуется
|
||||
onboarding-choose_proportions-auto_proportions-descriptionv2 =
|
||||
Приложение попытаеться угадать ваши пропорции, записывая образец ваших движений и пропуская его через алгоритм.
|
||||
|
||||
<b>Для этого необходимо, чтобы ваш HMD был подключен к 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
|
||||
@@ -835,6 +850,18 @@ onboarding-automatic_proportions-requirements-description =
|
||||
Ваши трекеры и гарнитура правильно работают на сервере SlimeVR.
|
||||
Ваша гарнитура передает данные о местоположении на сервер SlimeVR (обычно это означает, что SteamVR запущен и подключен к SlimeVR с помощью драйвера SlimeVR SteamVR).
|
||||
onboarding-automatic_proportions-requirements-next = Я прочитал требования
|
||||
onboarding-automatic_proportions-check_height-title = Проверьте ваш рост
|
||||
onboarding-automatic_proportions-check_height-description = Мы используем ваш рост в качестве основы для наших измерений, используя высоту HMD как приблизительное значение к вашему фактическому росту, но лучше проверить, верны ли эти значения самому!
|
||||
# All the text is in bold!
|
||||
onboarding-automatic_proportions-check_height-calculation_warning = Для рассчёта вашего роста, пожалуйста, нажимите кнопку стоя, <u>смотря вперёд</u>. У вас будут 3 секунды после того, как вы нажмете кнопку!
|
||||
onboarding-automatic_proportions-check_height-fetch_height = Я стою!
|
||||
# Context is that the height is unknown
|
||||
onboarding-automatic_proportions-check_height-unknown = Неизвестно
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-hmd_height1 = Высота вашего 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 = Начать запись
|
||||
@@ -866,6 +893,10 @@ onboarding-automatic_proportions-verify_results-redo = Перезаписать
|
||||
onboarding-automatic_proportions-verify_results-confirm = Они правильные
|
||||
onboarding-automatic_proportions-done-title = Тело измерено и сохранено.
|
||||
onboarding-automatic_proportions-done-description = Калибровка пропорций вашего тела завершена!
|
||||
onboarding-automatic_proportions-error_modal =
|
||||
<b>Предупреждение:</b> Была обнаружена ошибка при расчёте пропорций!
|
||||
Пожалуйста, <docs>ознакомьтесь с документацией</docs>, или присоединитесь к нашему <discord>Discord серверу</discord> для получения помощи ^_^
|
||||
onboarding-automatic_proportions-error_modal-confirm = Принято!
|
||||
|
||||
## Home
|
||||
|
||||
|
||||
@@ -348,14 +348,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-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-skeleton_settings = 骨架设置
|
||||
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 = 延伸脊柱模型
|
||||
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 = 动作捕捉模式
|
||||
settings-general-fk_settings-self_localization-description = 动作捕捉模式允许在没有头戴设备或其他追踪器的情况下粗略地跟踪骨架姿态。请注意,本功能需要脚部和头部追踪器,且现阶段依然是实验性的。
|
||||
settings-general-fk_settings-vive_emulation-title = Vive 模拟
|
||||
@@ -645,8 +665,8 @@ onboarding-assignment_tutorial = 在佩戴 Slime 追踪器之前的准备工作
|
||||
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 = 2. 将绑带穿过追踪器,确保绑带有粘扣面的朝向与追踪器上的笑脸标志同向:
|
||||
onboarding-assignment_tutorial-second_step-continuation-v2 = 扩展追踪器的粘扣朝向应如下图所示:
|
||||
onboarding-assignment_tutorial-done = 我把贴纸和绑带都弄好了!
|
||||
|
||||
## Tracker assignment setup
|
||||
@@ -791,6 +811,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
|
||||
@@ -829,9 +852,9 @@ onboarding-automatic_proportions-check_height-fetch_height = 我站好了!
|
||||
# Context is that the height is unknown
|
||||
onboarding-automatic_proportions-check_height-unknown = 未知
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-height = 你的身高是
|
||||
onboarding-automatic_proportions-check_height-hmd_height1 = 你的头戴设备的高度是
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-hmd_height = 然后,头戴设备的高度是
|
||||
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 = 我们现在要记录一些特定的姿势和动作。这些将在下一个屏幕中提示。当按钮被按下时,准备好开始!
|
||||
|
||||
@@ -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 = 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 +369,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 模擬
|
||||
@@ -374,7 +386,7 @@ settings-general-fk_settings-vive_emulation-label = 開啟 Vive 模擬
|
||||
|
||||
settings-general-gesture_control = 手勢控制
|
||||
settings-general-gesture_control-subtitle = 敲擊重置
|
||||
settings-general-gesture_control-description = 使用敲擊追蹤器的方法觸發重置。敲擊軀幹所配戴的最高的追蹤器會啟用左右偏擺重置,敲擊左腳配戴最高的追蹤器會觸發完整重置,敲擊右腳配戴最高的追蹤器會觸發配戴重置。請注意,需要在 0.6 秒內滿足敲擊次數才會觸發。
|
||||
settings-general-gesture_control-description = 使用敲擊追蹤器的方法觸發重置。敲擊軀幹所配戴的最高的追蹤器會啟用左右偏擺重置,敲擊左腳配戴最高的追蹤器會觸發完整重置,敲擊右腳配戴最高的追蹤器會觸發配戴重置。請注意,需要在 0.3 秒內滿足敲擊次數才會觸發。
|
||||
# This is a unit: 3 taps, 2 taps, 1 tap
|
||||
# $amount (Number) - Amount of taps (touches to the tracker's case)
|
||||
settings-general-gesture_control-taps =
|
||||
@@ -651,8 +663,8 @@ onboarding-assignment_tutorial = 戴上 Slime 追蹤器前的準備事項
|
||||
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 = 2. 將綁帶有魔鬼氈(魔術貼)的一面朝向臉部標誌穿過追蹤器:
|
||||
onboarding-assignment_tutorial-second_step-continuation-v2 = 延伸追蹤器的穿法應照下圖所示:
|
||||
onboarding-assignment_tutorial-done = 我把貼紙跟綁帶都弄上了
|
||||
|
||||
## Tracker assignment setup
|
||||
@@ -761,7 +773,7 @@ onboarding-manual_mounting-next = 下一步
|
||||
|
||||
onboarding-automatic_mounting-back = 返回到進入 VR
|
||||
onboarding-automatic_mounting-title = 配戴校正
|
||||
onboarding-automatic_mounting-description = 為了讓 SlimeVR 追蹤器正常運作,我們需要為你的追蹤器設定一個配戴方向,以使其與你的物理追蹤器配戴方式對齊。
|
||||
onboarding-automatic_mounting-description = 為了讓 SlimeVR 追蹤器正常運作,我們需要為每個追蹤器設定配戴方向,以符合您實際的追蹤器配戴方式。
|
||||
onboarding-automatic_mounting-manual_mounting = 進行手動設定
|
||||
onboarding-automatic_mounting-next = 下一步
|
||||
onboarding-automatic_mounting-prev_step = 上一步
|
||||
@@ -797,6 +809,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
|
||||
@@ -835,9 +850,9 @@ onboarding-automatic_proportions-check_height-fetch_height = 我站著了!
|
||||
# Context is that the height is unknown
|
||||
onboarding-automatic_proportions-check_height-unknown = 不明
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-height = 您的身高為
|
||||
onboarding-automatic_proportions-check_height-hmd_height1 = 您的頭戴顯示器高度是
|
||||
# Shows an element below it
|
||||
onboarding-automatic_proportions-check_height-hmd_height = 然後頭戴顯示器的高度是
|
||||
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 = 我們現在要記錄一些特定的姿勢和動作,將會在下一個畫面中提示。當按鈕被按下時,準備好開始!
|
||||
@@ -855,7 +870,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 = 錄製結果
|
||||
|
||||
|
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,15 +21,22 @@ default = ["custom-protocol"]
|
||||
custom-protocol = ["tauri/custom-protocol"]
|
||||
|
||||
[build-dependencies]
|
||||
tauri-build = { version = "1.2", features = [] }
|
||||
tauri-build = { version = "2.0.0-alpha.6", features = [] }
|
||||
cfg_aliases = "0.1"
|
||||
shadow-rs = "0.23"
|
||||
|
||||
[dependencies]
|
||||
serde_json = "1"
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
tauri = { version = "1.4", features = ["devtools", "dialog", "dialog-save", "fs-all", "os-all", "path-all", "shell-execute", "shell-open", "window-close", "window-maximize", "window-minimize", "window-set-resizable", "window-set-size", "window-set-title", "window-start-dragging", "window-unmaximize", "window-unminimize"] }
|
||||
tauri-runtime = "0.14"
|
||||
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", rev = "4ab90f048eab2918344f97dc8e04413a404e392d" }
|
||||
tauri-plugin-fs = { git = "https://github.com/tauri-apps/plugins-workspace", rev = "4ab90f048eab2918344f97dc8e04413a404e392d" }
|
||||
tauri-plugin-os = { git = "https://github.com/tauri-apps/plugins-workspace", rev = "4ab90f048eab2918344f97dc8e04413a404e392d" }
|
||||
tauri-plugin-shell = { git = "https://github.com/tauri-apps/plugins-workspace", rev = "4ab90f048eab2918344f97dc8e04413a404e392d" }
|
||||
tauri-plugin-window = { git = "https://github.com/tauri-apps/plugins-workspace", rev = "4ab90f048eab2918344f97dc8e04413a404e392d", features = [
|
||||
"devtools",
|
||||
] }
|
||||
flexi_logger = "0.25"
|
||||
log-panics = { version = "2", features = ["with-backtrace"] }
|
||||
log = "0.4"
|
||||
@@ -44,6 +51,8 @@ shadow-rs = { version = "0.23", default-features = false }
|
||||
const_format = "0.2.30"
|
||||
cfg-if = "1"
|
||||
color-eyre = "0.6"
|
||||
rfd = "0.11.4"
|
||||
dirs-next = "2.0.0"
|
||||
|
||||
[target.'cfg(windows)'.dependencies]
|
||||
win32job = "1"
|
||||
|
||||
@@ -11,10 +11,10 @@ use std::time::Instant;
|
||||
use clap::Parser;
|
||||
use color_eyre::Result;
|
||||
use state::WindowState;
|
||||
use tauri::api::process::{Command, CommandChild};
|
||||
use tauri::Manager;
|
||||
use tauri::RunEvent;
|
||||
use tauri::WindowEvent;
|
||||
use tauri_plugin_shell::process::CommandChild;
|
||||
|
||||
use crate::util::{
|
||||
get_launch_path, show_error, valid_java_paths, Cli, JAVA_BIN, MINIMUM_JAVA_VERSION,
|
||||
@@ -71,12 +71,27 @@ fn main() -> Result<()> {
|
||||
use flexi_logger::{
|
||||
Age, Cleanup, Criterion, Duplicate, FileSpec, Logger, Naming, WriteMode,
|
||||
};
|
||||
use tauri::api::path::app_log_dir;
|
||||
use tauri::path::Error;
|
||||
|
||||
// Based on https://docs.rs/tauri/2.0.0-alpha.10/src/tauri/path/desktop.rs.html#238-256
|
||||
#[cfg(target_os = "macos")]
|
||||
let path = dirs_next::home_dir().ok_or(Error::UnknownPath).map(|dir| {
|
||||
dir.join("Library/Logs")
|
||||
.join(&tauri_context.config().tauri.bundle.identifier)
|
||||
});
|
||||
|
||||
#[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")
|
||||
});
|
||||
|
||||
Logger::try_with_env_or_str("info")?
|
||||
.log_to_file(FileSpec::default().directory(
|
||||
app_log_dir(tauri_context.config()).expect("We need a log dir"),
|
||||
))
|
||||
.log_to_file(
|
||||
FileSpec::default().directory(path.expect("We need a log dir")),
|
||||
)
|
||||
.format_for_files(util::logger_format)
|
||||
.format_for_stderr(util::logger_format)
|
||||
.rotate(
|
||||
@@ -109,13 +124,13 @@ fn main() -> Result<()> {
|
||||
if !webview2_exists() {
|
||||
// This makes a dialog appear which let's you press Ok or Cancel
|
||||
// If you press Ok it will open the SlimeVR installer documentation
|
||||
use tauri::api::dialog::{
|
||||
blocking::MessageDialogBuilder, MessageDialogButtons, MessageDialogKind,
|
||||
};
|
||||
use rfd::{MessageButtons, MessageDialog, MessageLevel};
|
||||
|
||||
let confirm = MessageDialogBuilder::new("SlimeVR", "Couldn't find WebView2 installed. You can install it with the SlimeVR installer")
|
||||
.buttons(MessageDialogButtons::OkCancel)
|
||||
.kind(MessageDialogKind::Error)
|
||||
let confirm = MessageDialog::new()
|
||||
.set_title("SlimeVR")
|
||||
.set_description("Couldn't find WebView2 installed. You can install it with the SlimeVR installer")
|
||||
.set_buttons(MessageButtons::OkCancel)
|
||||
.set_level(MessageLevel::Error)
|
||||
.show();
|
||||
if confirm {
|
||||
open::that("https://docs.slimevr.dev/server-setup/installing-and-connecting.html#install-the-latest-slimevr-installer").unwrap();
|
||||
@@ -126,10 +141,11 @@ fn main() -> Result<()> {
|
||||
|
||||
// Spawn server process
|
||||
let exit_flag = Arc::new(AtomicBool::new(false));
|
||||
let mut backend: Option<CommandChild> = None;
|
||||
let backend = Arc::new(Mutex::new(Option::<CommandChild>::None));
|
||||
let backend_termination = backend.clone();
|
||||
let run_path = get_launch_path(cli);
|
||||
|
||||
let stdout_recv = if let Some(p) = run_path {
|
||||
let server_info = if let Some(p) = run_path {
|
||||
log::info!("Server found on path: {}", p.to_str().unwrap());
|
||||
|
||||
// Check if any Java already installed is compatible
|
||||
@@ -144,13 +160,7 @@ fn main() -> Result<()> {
|
||||
};
|
||||
|
||||
log::info!("Using Java binary: {:?}", java_bin);
|
||||
let (recv, child) = Command::new(java_bin.to_str().unwrap())
|
||||
.current_dir(p)
|
||||
.args(["-Xmx512M", "-jar", "slimevr.jar", "run"])
|
||||
.spawn()
|
||||
.expect("Unable to start the server jar");
|
||||
backend = Some(child);
|
||||
Some(recv)
|
||||
Some((java_bin, p))
|
||||
} else {
|
||||
log::warn!("No server found. We will not start the server.");
|
||||
None
|
||||
@@ -158,6 +168,11 @@ fn main() -> Result<()> {
|
||||
|
||||
let exit_flag_terminated = exit_flag.clone();
|
||||
let build_result = tauri::Builder::default()
|
||||
.plugin(tauri_plugin_dialog::init())
|
||||
.plugin(tauri_plugin_fs::init())
|
||||
.plugin(tauri_plugin_os::init())
|
||||
.plugin(tauri_plugin_shell::init())
|
||||
.plugin(tauri_plugin_window::init())
|
||||
.invoke_handler(tauri::generate_handler![
|
||||
update_window_state,
|
||||
logging,
|
||||
@@ -166,12 +181,12 @@ fn main() -> Result<()> {
|
||||
])
|
||||
.setup(move |app| {
|
||||
let window_state =
|
||||
WindowState::open_state(app.path_resolver().app_config_dir().unwrap())
|
||||
WindowState::open_state(app.path().app_config_dir().unwrap())
|
||||
.unwrap_or_default();
|
||||
|
||||
let window = tauri::WindowBuilder::new(
|
||||
app,
|
||||
"local",
|
||||
"main",
|
||||
tauri::WindowUrl::App("index.html".into()),
|
||||
)
|
||||
.title("SlimeVR")
|
||||
@@ -189,15 +204,32 @@ fn main() -> Result<()> {
|
||||
|
||||
app.manage(Mutex::new(window_state));
|
||||
|
||||
if let Some(mut recv) = stdout_recv {
|
||||
if let Some((java_bin, p)) = server_info {
|
||||
let app_handle = app.app_handle();
|
||||
tauri::async_runtime::spawn(async move {
|
||||
use tauri::api::process::CommandEvent;
|
||||
use tauri_plugin_shell::{process::CommandEvent, ShellExt};
|
||||
|
||||
while let Some(cmd_event) = recv.recv().await {
|
||||
let (mut rx, child) = app_handle
|
||||
.shell()
|
||||
.command(java_bin.to_str().unwrap())
|
||||
.current_dir(p)
|
||||
.args(["-Xmx512M", "-jar", "slimevr.jar", "run"])
|
||||
.spawn()
|
||||
.expect("Unable to start the server jar");
|
||||
|
||||
{
|
||||
let mut lock = backend.lock().unwrap();
|
||||
*lock = Some(child)
|
||||
}
|
||||
|
||||
while let Some(cmd_event) = rx.recv().await {
|
||||
let emit_me = match cmd_event {
|
||||
CommandEvent::Stderr(s) => ("stderr", s),
|
||||
CommandEvent::Stdout(s) => ("stdout", s),
|
||||
CommandEvent::Stderr(v) => {
|
||||
("stderr", String::from_utf8(v).unwrap_or_default())
|
||||
}
|
||||
CommandEvent::Stdout(v) => {
|
||||
("stdout", String::from_utf8(v).unwrap_or_default())
|
||||
}
|
||||
CommandEvent::Error(s) => ("error", s),
|
||||
CommandEvent::Terminated(s) => {
|
||||
exit_flag_terminated.store(true, Ordering::Relaxed);
|
||||
@@ -207,7 +239,7 @@ fn main() -> Result<()> {
|
||||
};
|
||||
app_handle
|
||||
.emit_all("server-status", emit_me)
|
||||
.expect("Failed to emit");
|
||||
.expect("Check server log files. \nFailed to emit");
|
||||
}
|
||||
log::error!("Java server receiver died");
|
||||
app_handle
|
||||
@@ -236,19 +268,19 @@ fn main() -> Result<()> {
|
||||
RunEvent::ExitRequested { .. } => {
|
||||
let window_state = app_handle.state::<Mutex<WindowState>>();
|
||||
let lock = window_state.lock().unwrap();
|
||||
let config_dir =
|
||||
app_handle.path_resolver().app_config_dir().unwrap();
|
||||
let config_dir = app_handle.path().app_config_dir().unwrap();
|
||||
let window_state_res = lock.save_state(config_dir);
|
||||
match window_state_res {
|
||||
Ok(()) => log::info!("saved window state"),
|
||||
Err(e) => log::error!("failed to save window state: {}", e),
|
||||
}
|
||||
|
||||
let Some(ref mut child) = backend else { return };
|
||||
let mut lock = backend_termination.lock().unwrap();
|
||||
let Some(ref mut child) = *lock else { return };
|
||||
let write_result = child.write(b"exit\n");
|
||||
match write_result {
|
||||
Ok(()) => log::info!("send exit to backend"),
|
||||
Err(_) => log::info!("fail to send exit to backend"),
|
||||
Err(_) => log::error!("fail to send exit to backend"),
|
||||
}
|
||||
let ten_seconds = Duration::from_secs(10);
|
||||
let start_time = Instant::now();
|
||||
@@ -268,13 +300,13 @@ fn main() -> Result<()> {
|
||||
// I should log this anyways, don't want to dig a grave by not logging the error.
|
||||
log::error!("CreateWebview error {}", error);
|
||||
|
||||
use tauri::api::dialog::{
|
||||
blocking::MessageDialogBuilder, MessageDialogButtons, MessageDialogKind,
|
||||
};
|
||||
use rfd::{MessageButtons, MessageDialog, MessageLevel};
|
||||
|
||||
let confirm = MessageDialogBuilder::new("SlimeVR", "You seem to have a faulty installation of WebView2. You can check a guide on how to fix that in the docs!")
|
||||
.buttons(MessageDialogButtons::OkCancel)
|
||||
.kind(MessageDialogKind::Error)
|
||||
let confirm = MessageDialog::new()
|
||||
.set_title("SlimeVR")
|
||||
.set_description("You seem to have a faulty installation of WebView2. You can check a guide on how to fix that in the docs!")
|
||||
.set_buttons(MessageButtons::OkCancel)
|
||||
.set_level(MessageLevel::Error)
|
||||
.show();
|
||||
if confirm {
|
||||
open::that("https://docs.slimevr.dev/common-issues.html#webview2-is-missing--slimevr-gui-crashes-immediately--panicked-at--webview2error").unwrap();
|
||||
|
||||
@@ -10,7 +10,7 @@ use std::{
|
||||
|
||||
use clap::Parser;
|
||||
use const_format::concatcp;
|
||||
use flexi_logger::{DeferredNow, style};
|
||||
use flexi_logger::{style, DeferredNow};
|
||||
use log::Record;
|
||||
use shadow_rs::shadow;
|
||||
use tempfile::Builder;
|
||||
@@ -95,20 +95,17 @@ pub fn spawn_java(java: &OsStr, java_version: &OsStr) -> std::io::Result<Child>
|
||||
#[cfg(desktop)]
|
||||
pub fn show_error(text: &str) -> bool {
|
||||
use rand::{seq::SliceRandom, thread_rng};
|
||||
use tauri::api::dialog::{
|
||||
blocking::MessageDialogBuilder, MessageDialogButtons, MessageDialogKind,
|
||||
};
|
||||
use rfd::{MessageButtons, MessageDialog, MessageLevel};
|
||||
|
||||
MessageDialogBuilder::new(
|
||||
format!(
|
||||
MessageDialog::new()
|
||||
.set_title(&format!(
|
||||
"SlimeVR GUI crashed - {}",
|
||||
POSSIBLE_TITLES.choose(&mut thread_rng()).unwrap()
|
||||
),
|
||||
text,
|
||||
)
|
||||
.buttons(MessageDialogButtons::Ok)
|
||||
.kind(MessageDialogKind::Error)
|
||||
.show()
|
||||
))
|
||||
.set_description(text)
|
||||
.set_buttons(MessageButtons::Ok)
|
||||
.set_level(MessageLevel::Error)
|
||||
.show()
|
||||
}
|
||||
|
||||
#[cfg(mobile)]
|
||||
@@ -220,11 +217,11 @@ pub fn valid_java_paths() -> Vec<(OsString, i32)> {
|
||||
}
|
||||
|
||||
pub fn logger_format(
|
||||
w: &mut dyn std::io::Write,
|
||||
_now: &mut DeferredNow,
|
||||
record: &Record,
|
||||
w: &mut dyn std::io::Write,
|
||||
_now: &mut DeferredNow,
|
||||
record: &Record,
|
||||
) -> Result<(), std::io::Error> {
|
||||
let level = record.level();
|
||||
let level = record.level();
|
||||
let module_path = record.module_path().unwrap_or("<unnamed>");
|
||||
// optionally print target
|
||||
let target = if module_path.starts_with(record.target()) {
|
||||
@@ -232,11 +229,11 @@ pub fn logger_format(
|
||||
} else {
|
||||
format!(", {}", record.target())
|
||||
};
|
||||
write!(
|
||||
w,
|
||||
"{} [{}{target}] {}",
|
||||
style(level).paint(level.to_string()),
|
||||
record.module_path().unwrap_or("<unnamed>"),
|
||||
style(level).paint(record.args().to_string())
|
||||
)
|
||||
write!(
|
||||
w,
|
||||
"{} [{}{target}] {}",
|
||||
style(level).paint(level.to_string()),
|
||||
record.module_path().unwrap_or("<unnamed>"),
|
||||
style(level).paint(record.args().to_string())
|
||||
)
|
||||
}
|
||||
|
||||
@@ -9,6 +9,29 @@
|
||||
"beforeDevCommand": "npm run start",
|
||||
"beforeBuildCommand": "npm run build"
|
||||
},
|
||||
"plugins": {
|
||||
"shell": {
|
||||
"open": true
|
||||
},
|
||||
"fs": {
|
||||
"scope": ["$APP/*", "$APP"],
|
||||
"all": true
|
||||
},
|
||||
"os": {
|
||||
"all": true
|
||||
},
|
||||
"window": {
|
||||
"setResizable": true,
|
||||
"setTitle": true,
|
||||
"maximize": true,
|
||||
"unmaximize": true,
|
||||
"minimize": true,
|
||||
"unminimize": true,
|
||||
"close": true,
|
||||
"startDragging": true,
|
||||
"setSize": true
|
||||
}
|
||||
},
|
||||
"tauri": {
|
||||
"bundle": {
|
||||
"active": true,
|
||||
@@ -50,43 +73,15 @@
|
||||
"timestampUrl": ""
|
||||
}
|
||||
},
|
||||
"updater": {
|
||||
"active": false
|
||||
},
|
||||
"allowlist": {
|
||||
"dialog": {
|
||||
"all": false,
|
||||
"save": true
|
||||
},
|
||||
"shell": {
|
||||
"all": false,
|
||||
"execute": true,
|
||||
"open": true
|
||||
},
|
||||
"fs": {
|
||||
"scope": ["$APP/*", "$APP"],
|
||||
"all": true
|
||||
},
|
||||
"path": {
|
||||
"all": true
|
||||
},
|
||||
"os": {
|
||||
"all": true
|
||||
},
|
||||
"window": {
|
||||
"setResizable": true,
|
||||
"setTitle": true,
|
||||
"maximize": true,
|
||||
"unmaximize": true,
|
||||
"minimize": true,
|
||||
"unminimize": true,
|
||||
"close": true,
|
||||
"startDragging": true,
|
||||
"setSize": true
|
||||
}
|
||||
},
|
||||
"security": {
|
||||
"csp": null
|
||||
"csp": null,
|
||||
"dangerousRemoteDomainIpcAccess": [
|
||||
{
|
||||
"domain": "tauri.localhost",
|
||||
"windows": ["main"],
|
||||
"plugins": ["dialog", "fs", "os", "shell", "window"]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
import React from 'react';
|
||||
import { render, screen } from '@testing-library/react';
|
||||
import App from './App';
|
||||
|
||||
test('renders learn react link', () => {
|
||||
render(<App />);
|
||||
const linkElement = screen.getByText(/learn react/i);
|
||||
expect(linkElement).toBeInTheDocument();
|
||||
});
|
||||
168
gui/src/App.tsx
@@ -35,10 +35,9 @@ 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 { os } from '@tauri-apps/api';
|
||||
import * as os from '@tauri-apps/plugin-os';
|
||||
import { VMCSettings } from './components/settings/pages/VMCSettings';
|
||||
import { MountingChoose } from './components/onboarding/pages/mounting/MountingChoose';
|
||||
import { ProportionsChoose } from './components/onboarding/pages/body-proportions/ProportionsChoose';
|
||||
@@ -46,12 +45,14 @@ import { StatusProvider } from './components/providers/StatusSystemContext';
|
||||
import { VersionUpdateModal } from './components/VersionUpdateModal';
|
||||
import { CalibrationTutorialPage } from './components/onboarding/pages/CalibrationTutorial';
|
||||
import { AssignmentTutorialPage } from './components/onboarding/pages/assignment-preparation/AssignmentTutorial';
|
||||
import { open } from '@tauri-apps/api/shell';
|
||||
import { open } from '@tauri-apps/plugin-shell';
|
||||
import semver from 'semver';
|
||||
import { useBreakpoint } from './hooks/breakpoint';
|
||||
import { VRModePage } from './components/vr-mode/VRModePage';
|
||||
import { InterfaceSettings } from './components/settings/pages/InterfaceSettings';
|
||||
import { error, log } from './utils/logging';
|
||||
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';
|
||||
|
||||
|
||||
@@ -1,12 +1,32 @@
|
||||
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 { Quaternion } from 'three';
|
||||
import { QuaternionFromQuatT, similarQuaternions } from '@/maths/quaternion';
|
||||
import { useMemo } from 'react';
|
||||
|
||||
const _q = new Quaternion();
|
||||
|
||||
export function ClearMountingButton() {
|
||||
const { l10n } = useLocalization();
|
||||
const { sendRPCPacket } = useWebsocketAPI();
|
||||
const { useAssignedTrackers } = useTrackers();
|
||||
const assignedTrackers = useAssignedTrackers();
|
||||
|
||||
const trackerWithMounting = useMemo(
|
||||
() =>
|
||||
assignedTrackers.some(
|
||||
(d) =>
|
||||
!similarQuaternions(
|
||||
QuaternionFromQuatT(d?.tracker.info?.mountingResetOrientation),
|
||||
_q
|
||||
)
|
||||
),
|
||||
[assignedTrackers]
|
||||
);
|
||||
|
||||
const clearMounting = () => {
|
||||
const record = new ClearMountingResetRequestT();
|
||||
@@ -18,8 +38,7 @@ export function ClearMountingButton() {
|
||||
text={l10n.getString('widget-clear_mounting')}
|
||||
icon={<TrashIcon width={20} />}
|
||||
onClick={clearMounting}
|
||||
>
|
||||
{}
|
||||
</BigButton>
|
||||
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';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { appWindow } from '@tauri-apps/api/window';
|
||||
import { getCurrent } from '@tauri-apps/plugin-window';
|
||||
import { ReactNode, useContext, useEffect, useState } from 'react';
|
||||
import { NavLink, useMatch } from 'react-router-dom';
|
||||
import {
|
||||
@@ -6,7 +6,7 @@ import {
|
||||
ServerInfosRequestT,
|
||||
ServerInfosResponseT,
|
||||
} 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';
|
||||
@@ -14,11 +14,11 @@ import { SlimeVRIcon } from './commons/icon/SimevrIcon';
|
||||
import { ProgressBar } from './commons/ProgressBar';
|
||||
import { Typography } from './commons/Typography';
|
||||
import { DownloadIcon } from './commons/icon/DownloadIcon';
|
||||
import { open } from '@tauri-apps/api/shell';
|
||||
import { GH_REPO, VersionContext, DOCS_SITE } from '../App';
|
||||
import { open } from '@tauri-apps/plugin-shell';
|
||||
import { GH_REPO, VersionContext, DOCS_SITE } 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';
|
||||
|
||||
@@ -185,13 +185,13 @@ export function TopBar({
|
||||
<>
|
||||
<div
|
||||
className="flex items-center justify-center hover:bg-background-60 rounded-full w-7 h-7"
|
||||
onClick={() => appWindow.minimize()}
|
||||
onClick={() => getCurrent().minimize()}
|
||||
>
|
||||
<MinimiseIcon></MinimiseIcon>
|
||||
</div>
|
||||
<div
|
||||
className="flex items-center justify-center hover:bg-background-60 rounded-full w-7 h-7"
|
||||
onClick={() => appWindow.toggleMaximize()}
|
||||
onClick={() => getCurrent().toggleMaximize()}
|
||||
>
|
||||
<MaximiseIcon></MaximiseIcon>
|
||||
</div>
|
||||
@@ -199,7 +199,7 @@ export function TopBar({
|
||||
className="flex items-center justify-center hover:bg-background-60 rounded-full w-7 h-7"
|
||||
onClick={async () => {
|
||||
await invoke('update_window_state');
|
||||
appWindow.close();
|
||||
getCurrent().close();
|
||||
}}
|
||||
>
|
||||
<CloseIcon></CloseIcon>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { useState } from 'react';
|
||||
import { SetPauseTrackingRequestT, RpcMessage } from 'solarxr-protocol';
|
||||
import { useWebsocketAPI } from '../hooks/websocket-api';
|
||||
import { useWebsocketAPI } from '@/hooks/websocket-api';
|
||||
import { BigButton } from './commons/BigButton';
|
||||
import { PlayIcon } from './commons/icon/PlayIcon';
|
||||
import { PauseIcon } from './commons/icon/PauseIcon';
|
||||
|
||||
@@ -3,10 +3,10 @@ import { useContext, useState } from 'react';
|
||||
import { BaseModal } from './commons/BaseModal';
|
||||
import { Button } from './commons/Button';
|
||||
import { Typography } from './commons/Typography';
|
||||
import { open } from '@tauri-apps/api/shell';
|
||||
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,9 +15,9 @@ 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';
|
||||
|
||||
export function WidgetsComponent() {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { open } from '@tauri-apps/api/shell';
|
||||
import { open } from '@tauri-apps/plugin-shell';
|
||||
import { ReactNode } from 'react';
|
||||
|
||||
export function A({ href, children }: { href: string; children?: ReactNode }) {
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -6,7 +6,7 @@ import {
|
||||
UseFormGetValues,
|
||||
useWatch,
|
||||
} from 'react-hook-form';
|
||||
import { a11yClick } from '../../utils/a11y';
|
||||
import { a11yClick } from '@/utils/a11y';
|
||||
|
||||
export interface DropdownItem {
|
||||
label: string;
|
||||
|
||||
@@ -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({
|
||||
|
||||
@@ -12,7 +12,7 @@ export function NumberSelector({
|
||||
step,
|
||||
disabled = false,
|
||||
}: {
|
||||
label: string;
|
||||
label?: string;
|
||||
valueLabelFormat?: (value: number) => string;
|
||||
control: Control<any>;
|
||||
name: string;
|
||||
|
||||
@@ -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,9 @@ 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';
|
||||
|
||||
type StepComponentType = FC<{
|
||||
nextStep: () => void;
|
||||
|
||||
@@ -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';
|
||||
@@ -44,7 +44,7 @@ export function AssignmentTutorialPage() {
|
||||
<div>
|
||||
<Typography variant="section-title">
|
||||
{l10n.getString(
|
||||
'onboarding-assignment_tutorial-second_step'
|
||||
'onboarding-assignment_tutorial-second_step-v2'
|
||||
)}
|
||||
</Typography>
|
||||
</div>
|
||||
@@ -54,7 +54,7 @@ export function AssignmentTutorialPage() {
|
||||
<div>
|
||||
<Typography variant="section-title">
|
||||
{l10n.getString(
|
||||
'onboarding-assignment_tutorial-second_step-continuation'
|
||||
'onboarding-assignment_tutorial-second_step-continuation-v2'
|
||||
)}
|
||||
</Typography>
|
||||
</div>
|
||||
|
||||
@@ -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 { PersonFrontIcon } from '@/components/commons/PersonFrontIcon';
|
||||
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';
|
||||
|
||||
export function ButtonsControl() {
|
||||
const { l10n } = useLocalization();
|
||||
|
||||
@@ -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 { save } from '@tauri-apps/api/dialog';
|
||||
import { writeTextFile } from '@tauri-apps/api/fs';
|
||||
import { useIsTauri } from '../../../../hooks/breakpoint';
|
||||
import { useAppContext } from '../../../../hooks/app';
|
||||
import { error } from '../../../../utils/logging';
|
||||
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 { 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">
|
||||
@@ -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,6 @@
|
||||
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';
|
||||
|
||||
export function DoneStep({ variant }: { variant: 'onboarding' | 'alone' }) {
|
||||
const { l10n } = useLocalization();
|
||||
|
||||
@@ -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({
|
||||
|
||||
@@ -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,17 +1,17 @@
|
||||
import { 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';
|
||||
|
||||
export function ManualMountingPage() {
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
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';
|
||||
|
||||
export function MountingChoose() {
|
||||
const { l10n } = useLocalization();
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
import classNames from 'classnames';
|
||||
import { MouseEventHandler } from 'react';
|
||||
import ReactModal from 'react-modal';
|
||||
import { useElemSize, useLayout } from '../../../../hooks/layout';
|
||||
import { Button } from '../../../commons/Button';
|
||||
import { Typography } from '../../../commons/Typography';
|
||||
import { useElemSize, useLayout } from '@/hooks/layout';
|
||||
import { Button } from '@/components/commons/Button';
|
||||
import { Typography } from '@/components/commons/Typography';
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { FootIcon } from '../../../commons/icon/FootIcon';
|
||||
import { rotationToQuatMap } from '../../../../maths/quaternion';
|
||||
import { FootIcon } from '@/components/commons/icon/FootIcon';
|
||||
import { rotationToQuatMap } from '@/maths/quaternion';
|
||||
import { Quaternion } from 'three';
|
||||
import { SlimeUpIcon } from '../../../commons/icon/SlimeUpIcon';
|
||||
import { SlimeUpIcon } from '@/components/commons/icon/SlimeUpIcon';
|
||||
import { BodyPart } from 'solarxr-protocol';
|
||||
import { PawIcon } from '../../../commons/icon/PawIcon';
|
||||
import { useLocaleConfig } from '../../../../i18n/config';
|
||||
import { PawIcon } from '@/components/commons/icon/PawIcon';
|
||||
import { useLocaleConfig } from '@/i18n/config';
|
||||
|
||||
// All body parts that are right or left, are by default left!
|
||||
export const mapPart: Record<
|
||||
|
||||
@@ -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 DoneStep({
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import { ResetType } from 'solarxr-protocol';
|
||||
import { Button } from '../../../../commons/Button';
|
||||
import { Typography } from '../../../../commons/Typography';
|
||||
import { ResetButton } from '../../../../home/ResetButton';
|
||||
import { Button } from '@/components/commons/Button';
|
||||
import { Typography } from '@/components/commons/Typography';
|
||||
import { ResetButton } from '@/components/home/ResetButton';
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { useBreakpoint } from '../../../../../hooks/breakpoint';
|
||||
import { useBreakpoint } from '@/hooks/breakpoint';
|
||||
|
||||
export function MountingResetStep({
|
||||
nextStep,
|
||||
|
||||