mirror of
https://github.com/SlimeVR/SlimeVR-Server.git
synced 2026-04-06 10:11:59 +02:00
Compare commits
167 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b73e147d17 | ||
|
|
4dae31a138 | ||
|
|
74351dbb00 | ||
|
|
ec541685a2 | ||
|
|
cd4388e605 | ||
|
|
a36a6bceee | ||
|
|
0043c30c36 | ||
|
|
f030496659 | ||
|
|
32d0674aad | ||
|
|
3e308b222f | ||
|
|
a8a5a5c93c | ||
|
|
d87514a9ea | ||
|
|
4dac09e61e | ||
|
|
995c07dc08 | ||
|
|
961c32a8da | ||
|
|
87ba356fb0 | ||
|
|
580178de05 | ||
|
|
0e8b8dc500 | ||
|
|
9415eceb85 | ||
|
|
03f9115f75 | ||
|
|
30ca65e875 | ||
|
|
9cde4058ad | ||
|
|
564be6112a | ||
|
|
3374e45d62 | ||
|
|
48493c8c15 | ||
|
|
e858464064 | ||
|
|
64a8b1aab0 | ||
|
|
0c787b6675 | ||
|
|
6c7550ee56 | ||
|
|
c5d666d335 | ||
|
|
6b042ff903 | ||
|
|
0dd5ec7dfe | ||
|
|
50eef6ea7f | ||
|
|
db64d48bfe | ||
|
|
a008958f37 | ||
|
|
148a1edeac | ||
|
|
03eeb87498 | ||
|
|
c3d8eba264 | ||
|
|
269a79c87a | ||
|
|
de995bbc15 | ||
|
|
773372ef95 | ||
|
|
5789f6ac92 | ||
|
|
f762c641ec | ||
|
|
cbbd499391 | ||
|
|
93f7a7482b | ||
|
|
4d7c931b69 | ||
|
|
ac6c7da1be | ||
|
|
3c5dc4d8b5 | ||
|
|
caac02975c | ||
|
|
77858e11f3 | ||
|
|
af807aa9c1 | ||
|
|
3826a49837 | ||
|
|
2450bb0abe | ||
|
|
2d297d6622 | ||
|
|
2afc2d1c58 | ||
|
|
8dfeedaf2b | ||
|
|
3b75b5168f | ||
|
|
97818e1504 | ||
|
|
003bb61dfb | ||
|
|
c6b9d2b0e0 | ||
|
|
8c1061adca | ||
|
|
95b2cb15e4 | ||
|
|
f35da6557b | ||
|
|
1be691e045 | ||
|
|
5dd5399e99 | ||
|
|
34818e925c | ||
|
|
f93d165d6e | ||
|
|
25b69f2ca9 | ||
|
|
84735029f6 | ||
|
|
7790e0fdac | ||
|
|
f4e13f837b | ||
|
|
b912e0003a | ||
|
|
a8fa180ab7 | ||
|
|
1ca3980e90 | ||
|
|
9130b9911a | ||
|
|
f16827eb52 | ||
|
|
66d679ef70 | ||
|
|
9cfde38cdf | ||
|
|
80b24486b3 | ||
|
|
3c2ee9278c | ||
|
|
e4667b384a | ||
|
|
81c58a8ce4 | ||
|
|
8ce06e4c8b | ||
|
|
2c24e4d335 | ||
|
|
d6218a240a | ||
|
|
76de35e28c | ||
|
|
e7cf1a3008 | ||
|
|
88f649ae5c | ||
|
|
f273d3a9bb | ||
|
|
79a0df7b28 | ||
|
|
ad9e5e0060 | ||
|
|
48c35d9a78 | ||
|
|
9407c6f0d4 | ||
|
|
3dd94b3aa3 | ||
|
|
fbf509ec79 | ||
|
|
5a231ba9ef | ||
|
|
9a8c1f1d7b | ||
|
|
871a62e0a5 | ||
|
|
372031ad42 | ||
|
|
9227ee4820 | ||
|
|
4ffbc86588 | ||
|
|
df43e5fcdf | ||
|
|
7bc208fec3 | ||
|
|
2ee9d5080f | ||
|
|
47c76c9c9e | ||
|
|
88db845f0e | ||
|
|
efe5b006c3 | ||
|
|
3a59325797 | ||
|
|
30d4869217 | ||
|
|
03f68a598f | ||
|
|
ba362e0098 | ||
|
|
410e5901e6 | ||
|
|
5ee67480da | ||
|
|
60e7c9c098 | ||
|
|
b4bff05723 | ||
|
|
0eb986b342 | ||
|
|
04006b1caa | ||
|
|
aa6eb9ffb1 | ||
|
|
7e2ed8380c | ||
|
|
51506b88b6 | ||
|
|
1b16cb84a5 | ||
|
|
645331657f | ||
|
|
ac30bfaaeb | ||
|
|
072d6d6661 | ||
|
|
f04f833939 | ||
|
|
6218b5808e | ||
|
|
8eba520090 | ||
|
|
05c421f51f | ||
|
|
629310f953 | ||
|
|
e7e0ee9d7d | ||
|
|
c9e82adda2 | ||
|
|
4b237d0b1b | ||
|
|
2dda66bc55 | ||
|
|
6a25a584b2 | ||
|
|
90fddbf66a | ||
|
|
7d0f2b0e08 | ||
|
|
3f022cd09e | ||
|
|
78f9780147 | ||
|
|
aa9d9486f3 | ||
|
|
aeae54d39e | ||
|
|
c972bb005d | ||
|
|
7913b2e839 | ||
|
|
51e9ecfd72 | ||
|
|
9b624f5d9a | ||
|
|
c3e2987e82 | ||
|
|
f7d34480de | ||
|
|
5247891ff0 | ||
|
|
e5c05fc864 | ||
|
|
b33d3cd41f | ||
|
|
e88357fb40 | ||
|
|
49994286fc | ||
|
|
cae2573a98 | ||
|
|
18aae19573 | ||
|
|
def3da6580 | ||
|
|
b5f12b46e0 | ||
|
|
5c59c4e385 | ||
|
|
7fd94c36f5 | ||
|
|
bb4861635d | ||
|
|
0a2d5674f7 | ||
|
|
1ac0a380db | ||
|
|
171877ee49 | ||
|
|
e45da2b979 | ||
|
|
46fedc2d3a | ||
|
|
6f8037f9f9 | ||
|
|
9d63191ff3 | ||
|
|
1bcf8467a6 | ||
|
|
eb55a3e1d4 |
23
.editorconfig
Normal file
23
.editorconfig
Normal file
@@ -0,0 +1,23 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
charset = utf-8
|
||||
|
||||
# Fluent files only support spaces for indentation
|
||||
[*.ftl]
|
||||
indent_size = 4
|
||||
indent_style = space
|
||||
|
||||
# Current config in eslint uses 2 spaces for indentation
|
||||
[*.{.tsx,ts,jsx,js}]
|
||||
indent_size = 2
|
||||
indent_style = space
|
||||
max_line_length = 88
|
||||
|
||||
# This is how everything should actually be
|
||||
[*.{kt,kts,java,rs}]
|
||||
indent_size = 4
|
||||
indent_style = tab
|
||||
max_line_length = 88
|
||||
26
.github/CODEOWNERS
vendored
Normal file
26
.github/CODEOWNERS
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
# Global code owner
|
||||
* @Eirenliel
|
||||
|
||||
# Make Loucas the owner of all GUI stuff
|
||||
/gui/ @loucass003
|
||||
|
||||
# Uriel and Erimel responsible for i18n
|
||||
/gui/public/i18n/ @ImUrX @Louka3000
|
||||
/gui/src/i18n/ @ImUrX @Louka3000 @loucass003
|
||||
|
||||
/gui/src/components/settings/ @Louka3000 @loucass003
|
||||
|
||||
/gui/src-tauri/ @ImUrX @TheButlah
|
||||
|
||||
# Some server code~
|
||||
/server/ @ButterscotchV @Eirenliel @Louka3000
|
||||
|
||||
/server/src/main/java/dev/slimevr/autobone/ @ButterscotchV
|
||||
/server/src/main/java/dev/slimevr/poserecorder/ @ButterscotchV
|
||||
/server/src/main/java/dev/slimevr/posestreamer/ @ButterscotchV
|
||||
|
||||
/server/src/main/java/dev/slimevr/osc/ @Louka3000
|
||||
/server/src/main/java/dev/slimevr/vr/processor/ @Louka3000
|
||||
/server/src/main/java/dev/slimevr/filtering/ @Louka3000
|
||||
|
||||
server/src/main/java/dev/slimevr/config/ @loucass003
|
||||
47
.github/workflows/build-gui.yml
vendored
47
.github/workflows/build-gui.yml
vendored
@@ -1,22 +1,29 @@
|
||||
name: Build GUI
|
||||
|
||||
on:
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- .github/workflows/build-gui.yml
|
||||
- gui/**
|
||||
- package*.json
|
||||
pull_request:
|
||||
paths:
|
||||
- .github/workflows/build-gui.yml
|
||||
- gui/**
|
||||
- package*.json
|
||||
workflow_dispatch:
|
||||
create:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: windows-latest
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
node-version: [16.x]
|
||||
os: [ubuntu-20.04, windows-latest]
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
env:
|
||||
# Don't mark warnings as errors
|
||||
@@ -27,24 +34,48 @@ jobs:
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- if: matrix.os == 'ubuntu-20.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
|
||||
# Increment to invalidate the cache
|
||||
version: 1.0
|
||||
# Enables a workaround to attempt to run pre and post install scripts
|
||||
execute_install_scripts: true
|
||||
# Disables uploading logs as a build artifact
|
||||
debug: false
|
||||
|
||||
- name: Cache cargo dependencies
|
||||
uses: Swatinem/rust-cache@v2
|
||||
with:
|
||||
shared-key: "tauri"
|
||||
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
node-version-file: '.node-version'
|
||||
cache: 'npm'
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
npm ci
|
||||
npm run tauri build
|
||||
npm run skipbundler
|
||||
|
||||
- name: Upload a Build Artifact
|
||||
- if: matrix.os == 'windows-latest'
|
||||
name: Upload a Build Artifact
|
||||
uses: actions/upload-artifact@v3.1.0
|
||||
with:
|
||||
# Artifact name
|
||||
name: SlimeVR-GUI
|
||||
# A file, directory or wildcard pattern that describes what to upload
|
||||
path: gui/target/release/slimevr-ui.exe
|
||||
path: target/release/slimevr.exe
|
||||
|
||||
- if: matrix.os == 'ubuntu-20.04'
|
||||
name: Upload a Build Artifact
|
||||
uses: actions/upload-artifact@v3.1.0
|
||||
with:
|
||||
# Artifact name
|
||||
name: SlimeVR-GUI-Linux
|
||||
# A file, directory or wildcard pattern that describes what to upload
|
||||
path: target/release/slimevr
|
||||
|
||||
75
.github/workflows/gradle.yaml
vendored
75
.github/workflows/gradle.yaml
vendored
@@ -3,7 +3,13 @@
|
||||
|
||||
name: SlimeVR Server
|
||||
|
||||
on: [push, pull_request]
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
pull_request:
|
||||
workflow_dispatch:
|
||||
create:
|
||||
|
||||
jobs:
|
||||
test:
|
||||
@@ -58,4 +64,69 @@ jobs:
|
||||
# Artifact name
|
||||
name: "SlimeVR-Server" # optional, default is artifact
|
||||
# A file, directory or wildcard pattern that describes what to upload
|
||||
path: build/libs/*
|
||||
path: server/build/libs/*
|
||||
|
||||
bundle:
|
||||
runs-on: ubuntu-20.04
|
||||
needs: build
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: "SlimeVR-Server"
|
||||
path: server/build/libs/
|
||||
|
||||
- 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
|
||||
# Increment to invalidate the cache
|
||||
version: 1.0
|
||||
# Enables a workaround to attempt to run pre and post install scripts
|
||||
execute_install_scripts: true
|
||||
# Disables uploading logs as a build artifact
|
||||
debug: false
|
||||
|
||||
- name: Cache cargo dependencies
|
||||
uses: Swatinem/rust-cache@v2
|
||||
with:
|
||||
shared-key: "tauri"
|
||||
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'npm'
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
npm ci
|
||||
npm run tauri build
|
||||
|
||||
- uses: actions/upload-artifact@v3.1.0
|
||||
with:
|
||||
name: SlimeVR-GUI-Deb
|
||||
path: target/release/bundle/deb/slimevr*.deb
|
||||
|
||||
- name: Install appimage-builder
|
||||
run: |
|
||||
wget "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage"
|
||||
chmod a+x appimagetool-x86_64.AppImage
|
||||
sudo mv appimagetool-x86_64.AppImage /usr/local/bin/appimagetool
|
||||
|
||||
- name: Modify and Build AppImage
|
||||
run: |
|
||||
cd target/release/bundle/appimage
|
||||
chmod a+x slimevr*.AppImage
|
||||
./slimevr*.AppImage --appimage-extract
|
||||
cp $( git rev-parse --show-toplevel )/server/build/libs/slimevr.jar squashfs-root/slimevr.jar
|
||||
chmod 644 squashfs-root/slimevr.jar
|
||||
appimagetool squashfs-root slimevr*.AppImage
|
||||
|
||||
- uses: actions/upload-artifact@v3.1.0
|
||||
with:
|
||||
name: SlimeVR-GUI-AppImage
|
||||
path: target/release/bundle/appimage/slimevr*.AppImage
|
||||
|
||||
5
.gitignore
vendored
5
.gitignore
vendored
@@ -27,4 +27,7 @@
|
||||
|
||||
|
||||
# ignore gradle build folder
|
||||
build/
|
||||
build/
|
||||
|
||||
# Rust build artifacts
|
||||
/target
|
||||
|
||||
1
.node-version
Normal file
1
.node-version
Normal file
@@ -0,0 +1 @@
|
||||
18.12.1
|
||||
3
.vscode/extensions.json
vendored
3
.vscode/extensions.json
vendored
@@ -8,7 +8,8 @@
|
||||
"dbaeumer.vscode-eslint",
|
||||
"esbenp.prettier-vscode",
|
||||
"rust-lang.rust-analyzer",
|
||||
"bradlc.vscode-tailwindcss"
|
||||
"bradlc.vscode-tailwindcss",
|
||||
"EditorConfig.EditorConfig"
|
||||
],
|
||||
// List of extensions recommended by VS Code that should not be recommended for users of this workspace.
|
||||
"unwantedRecommendations": []
|
||||
|
||||
@@ -64,11 +64,20 @@ Import the formatting settings defined in `spotless.xml`, like this:
|
||||
Eclipse will only do a subset of the checks in `spotless`, so you may still want to do
|
||||
`./gradlew spotlessApply` if you ever see an error from spotless.
|
||||
|
||||
### Version bumping
|
||||
* Create the git tag instead of making it from releases, you can do it by just ``git tag VERSION``,
|
||||
example ``git tag v0.5.0``
|
||||
* You need to push this change with ``git push origin VERSION`` or ``git push origin --tags``
|
||||
(will push all tags you made).
|
||||
|
||||
We recommend committing first and then making the tag, that tag will point to the commit you are currently
|
||||
on.
|
||||
|
||||
## Code Licensing
|
||||
SlimeVR uses an MIT license, and some parts of the project use a dual MIT/Apache 2.0
|
||||
license. Be sure that any code that you reference, or dependencies you add, are
|
||||
compatible with these licenses. `GPL-v3` for example is not compatible because it
|
||||
requires any and all code that depends on it to *also* be licensed under `GPL-v3`.
|
||||
SlimeVR uses dual MIT and Apache-2.0 license. Be sure that any code that you reference,
|
||||
or dependencies you add, are compatible with these licenses. `GPL-v3` for example is
|
||||
not compatible because it requires any and all code that depends on it to *also* be
|
||||
licensed under `GPL-v3`.
|
||||
|
||||
## Discord
|
||||
We use discord *a lot* to coordinate and discuss development. Come join us at
|
||||
|
||||
909
gui/Cargo.lock → Cargo.lock
generated
909
gui/Cargo.lock → Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
13
Cargo.toml
Normal file
13
Cargo.toml
Normal file
@@ -0,0 +1,13 @@
|
||||
[workspace]
|
||||
# Use 2021 edition resolver, better resolves crate features.
|
||||
resolver = "2"
|
||||
|
||||
# A list of all rust crates in the workspace.
|
||||
members = ["gui/src-tauri"]
|
||||
|
||||
# These settings can be inherited by workspace members
|
||||
[workspace.package]
|
||||
edition = "2021"
|
||||
license = "MIT OR Apache-2.0"
|
||||
rust-version = "1.65" # This version stabilized GATs and let-else
|
||||
repository = "https://github.com/SlimeVR/SlimeVR-Server"
|
||||
21
LICENSE
21
LICENSE
@@ -1,21 +0,0 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2021 Eiren Rain, SlimeVR
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -186,7 +186,7 @@
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright 2022 SlimeVR Contributors
|
||||
Copyright 2020 Eiren Rain and SlimeVR Contributors
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
@@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2022 SlimeVR Contributors
|
||||
Copyright (c) 2020 Eiren Rain and SlimeVR Contributors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
40
README.md
40
README.md
@@ -12,23 +12,47 @@ Integrations:
|
||||
* Integrations with other systems will be added later
|
||||
|
||||
## How to use
|
||||
|
||||
It's recommended to download installer from here: https://github.com/SlimeVR/SlimeVR-Installer/releases/latest/download/slimevr_web_installer.exe
|
||||
|
||||
Latest instructions are [on our site](https://docs.slimevr.dev/server-setup/slimevr-setup.html).
|
||||
|
||||
## License Clarification
|
||||
**SlimeVR software** (including server, firmware, drivers, installer, documents, and others - see
|
||||
licence for each case specifically) **is distributed under a dual MIT/Apache 2.0 License
|
||||
([LICENSE-MIT] and [LICENSE-APACHE]). The software is the copyright of the SlimeVR
|
||||
contributors.**
|
||||
|
||||
**SlimeVR software** (including server, firmware, drivers, installator, documents, and others - see licence for each case specifically) **is distributed under the [MIT License](https://github.com/SlimeVR/SlimeVR-Server/blob/main/LICENSE) and is copyright of Eiren Rain and SlimeVR.** The MIT Licence is a permissive license giving you rights to modify and distribute the software with little strings attached.
|
||||
**However, these licenses have some limits, and if you wish to distribute software based
|
||||
on SlimeVR, you need to be aware of them:**
|
||||
|
||||
**However, the MIT License has some limits, and if you wish to distribute software based on SlimeVR, you need to be aware of them:**
|
||||
* When distributing any software that uses or is based on SlimeVR, you have to provide
|
||||
to the end-user at least one of the original, unmodified [LICENSE-MIT] or
|
||||
[LICENSE-APACHE] files from SlimeVR. This includes the `Copyright (c) 2020 Eiren Rain
|
||||
and SlimeVR Contributors` part of the license. It is insufficient to use a generic MIT
|
||||
or Apache-2.0 License, **it must be the original license file**.
|
||||
* This applies even if you distribute software without the source code. In this case,
|
||||
one way to provide it to the end-user is to have a menu in your application that lists
|
||||
all the open source licenses used, including SlimeVR's.
|
||||
|
||||
* When distributing any software that uses or is based on SlimeVR, you have to provide to the end-user the original, unmodified `LICENSE` file from SlimeVR. This file is located [here](https://github.com/SlimeVR/SlimeVR-Server/blob/main/LICENSE). This includes the `Copyright (c) 2021 Eiren Rain, SlimeVR` part of the license. It is not sufficient to use a generic MIT License, it must be the original license file.
|
||||
* This applies even if you distribute software without the source code. In this case, one way to provide it to the end-user is to have a menu in your application that lists all the open source licenses used, including SlimeVR's.
|
||||
|
||||
Please refer to the [LICENSE](https://github.com/SlimeVR/SlimeVR-Server/blob/main/LICENSE) file if you are at any point uncertain what the exact the requirements are.
|
||||
Please refer to the [LICENSE-MIT] and [LICENSE-APACHE] files if you are at any point
|
||||
uncertain what the exact requirements are.
|
||||
|
||||
## Contributions
|
||||
By contributing to this project you are placing all your code under MIT or less restricting licenses, and you certify that the code you have used is compatible with those licenses or is authored by you. If you're doing so on your work time, you certify that your employer is okay with this.
|
||||
Any contributions submitted for inclusion in this repository will be dual-licensed under
|
||||
either:
|
||||
|
||||
- MIT License ([LICENSE-MIT])
|
||||
- Apache License, Version 2.0 ([LICENSE-APACHE])
|
||||
|
||||
Unless you explicitly state otherwise, any contribution intentionally submitted for
|
||||
inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual
|
||||
licensed as above, without any additional terms or conditions.
|
||||
|
||||
You also certify that the code you have used is compatible with those licenses or is
|
||||
authored by you. If you're doing so on your work time, you certify that your employer is
|
||||
okay with this and that you are authorized to provide the above licenses.
|
||||
|
||||
For a how-to on contributing, see [CONTRIBUTING.md](CONTRIBUTING.md).
|
||||
|
||||
[LICENSE-MIT]: LICENSE-MIT
|
||||
[LICENSE-APACHE]: LICENSE-APACHE
|
||||
|
||||
@@ -4,3 +4,5 @@ org.gradle.jvmargs=--add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAME
|
||||
--add-exports jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED \
|
||||
--add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED \
|
||||
--add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED
|
||||
|
||||
kotlin.code.style=official
|
||||
|
||||
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,5 +1,5 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
||||
3
gui/.gitignore
vendored
3
gui/.gitignore
vendored
@@ -24,3 +24,6 @@ yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
*.log
|
||||
|
||||
|
||||
/dist
|
||||
@@ -1,3 +0,0 @@
|
||||
[workspace]
|
||||
resolver = "2"
|
||||
members = ["src-tauri"]
|
||||
@@ -1,6 +0,0 @@
|
||||
This codebase is dual-licensed under either
|
||||
|
||||
* MIT License (docs/LICENSE-MIT or http://opensource.org/licenses/MIT)
|
||||
* Apache License, Version 2.0 (docs/LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
|
||||
|
||||
at your option.
|
||||
6
gui/LICENSE.md
Normal file
6
gui/LICENSE.md
Normal file
@@ -0,0 +1,6 @@
|
||||
This directory and all subdirectories are dual-licensed under either
|
||||
|
||||
* MIT License ([/LICENSE-MIT](/LICENSE-MIT))
|
||||
* Apache License, Version 2.0 ([/LICENSE-APACHE](/LICENSE-APACHE))
|
||||
|
||||
at your option.
|
||||
@@ -28,27 +28,3 @@ Launch in dev mode
|
||||
```
|
||||
npm run tauri dev
|
||||
```
|
||||
|
||||
## Contributing
|
||||
|
||||
By contributing to this project you are placing all your code under MIT or less restricting licenses, and you certify that the code you have used is compatible with those licenses or is authored by you. If you're doing so on your work time, you certify that your employer is okay with this.
|
||||
|
||||
## License
|
||||
|
||||
All code in this repository is dual-licensed under either:
|
||||
|
||||
- MIT License ([LICENSE-MIT](docs/LICENSE-MIT))
|
||||
- Apache License, Version 2.0 ([LICENSE-APACHE](docs/LICENSE-APACHE))
|
||||
|
||||
at your option. This means you can select the license you prefer!
|
||||
|
||||
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
|
||||
|
||||
### Complying with the license
|
||||
|
||||
Please note that these licenses are very permissive, but if you wish to distribute software based on this code, you need to be aware of the following limits of these licenses:
|
||||
|
||||
- When distributing any software that uses or is based on SlimeVR, you have to provide to the end-user the original, unmodified `LICENSE-MIT` or `LICENSE-APACHE` file (or both) from SlimeVR. This includes the `Copyright (c) 2022 SlimeVR Contributors` part of the license. It is not sufficient to use a generic MIT/Apache License, it must be the original license file.
|
||||
- This applies even if you distribute software without the source code. In this case, one way to provide it to the end-user is to have a menu in your application that lists all the open source licenses used, including SlimeVR's.
|
||||
|
||||
Please refer to the original license files if you are at any point uncertain what the exact the requirements are.
|
||||
|
||||
@@ -1,104 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const paths = require('./paths');
|
||||
|
||||
// Make sure that including paths.js after env.js will read .env variables.
|
||||
delete require.cache[require.resolve('./paths')];
|
||||
|
||||
const NODE_ENV = process.env.NODE_ENV;
|
||||
if (!NODE_ENV) {
|
||||
throw new Error(
|
||||
'The NODE_ENV environment variable is required but was not specified.'
|
||||
);
|
||||
}
|
||||
|
||||
// https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use
|
||||
const dotenvFiles = [
|
||||
`${paths.dotenv}.${NODE_ENV}.local`,
|
||||
// Don't include `.env.local` for `test` environment
|
||||
// since normally you expect tests to produce the same
|
||||
// results for everyone
|
||||
NODE_ENV !== 'test' && `${paths.dotenv}.local`,
|
||||
`${paths.dotenv}.${NODE_ENV}`,
|
||||
paths.dotenv,
|
||||
].filter(Boolean);
|
||||
|
||||
// Load environment variables from .env* files. Suppress warnings using silent
|
||||
// if this file is missing. dotenv will never modify any environment variables
|
||||
// that have already been set. Variable expansion is supported in .env files.
|
||||
// https://github.com/motdotla/dotenv
|
||||
// https://github.com/motdotla/dotenv-expand
|
||||
dotenvFiles.forEach(dotenvFile => {
|
||||
if (fs.existsSync(dotenvFile)) {
|
||||
require('dotenv-expand')(
|
||||
require('dotenv').config({
|
||||
path: dotenvFile,
|
||||
})
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
// We support resolving modules according to `NODE_PATH`.
|
||||
// This lets you use absolute paths in imports inside large monorepos:
|
||||
// https://github.com/facebook/create-react-app/issues/253.
|
||||
// It works similar to `NODE_PATH` in Node itself:
|
||||
// https://nodejs.org/api/modules.html#modules_loading_from_the_global_folders
|
||||
// Note that unlike in Node, only *relative* paths from `NODE_PATH` are honored.
|
||||
// Otherwise, we risk importing Node.js core modules into an app instead of webpack shims.
|
||||
// https://github.com/facebook/create-react-app/issues/1023#issuecomment-265344421
|
||||
// We also resolve them to make sure all tools using them work consistently.
|
||||
const appDirectory = fs.realpathSync(process.cwd());
|
||||
process.env.NODE_PATH = (process.env.NODE_PATH || '')
|
||||
.split(path.delimiter)
|
||||
.filter(folder => folder && !path.isAbsolute(folder))
|
||||
.map(folder => path.resolve(appDirectory, folder))
|
||||
.join(path.delimiter);
|
||||
|
||||
// Grab NODE_ENV and REACT_APP_* environment variables and prepare them to be
|
||||
// injected into the application via DefinePlugin in webpack configuration.
|
||||
const REACT_APP = /^REACT_APP_/i;
|
||||
|
||||
function getClientEnvironment(publicUrl) {
|
||||
const raw = Object.keys(process.env)
|
||||
.filter(key => REACT_APP.test(key))
|
||||
.reduce(
|
||||
(env, key) => {
|
||||
env[key] = process.env[key];
|
||||
return env;
|
||||
},
|
||||
{
|
||||
// Useful for determining whether we’re running in production mode.
|
||||
// Most importantly, it switches React into the correct mode.
|
||||
NODE_ENV: process.env.NODE_ENV || 'development',
|
||||
// Useful for resolving the correct path to static assets in `public`.
|
||||
// For example, <img src={process.env.PUBLIC_URL + '/img/logo.png'} />.
|
||||
// This should only be used as an escape hatch. Normally you would put
|
||||
// images into the `src` and `import` them in code to get their paths.
|
||||
PUBLIC_URL: publicUrl,
|
||||
// We support configuring the sockjs pathname during development.
|
||||
// These settings let a developer run multiple simultaneous projects.
|
||||
// They are used as the connection `hostname`, `pathname` and `port`
|
||||
// in webpackHotDevClient. They are used as the `sockHost`, `sockPath`
|
||||
// and `sockPort` options in webpack-dev-server.
|
||||
WDS_SOCKET_HOST: process.env.WDS_SOCKET_HOST,
|
||||
WDS_SOCKET_PATH: process.env.WDS_SOCKET_PATH,
|
||||
WDS_SOCKET_PORT: process.env.WDS_SOCKET_PORT,
|
||||
// Whether or not react-refresh is enabled.
|
||||
// It is defined here so it is available in the webpackHotDevClient.
|
||||
FAST_REFRESH: process.env.FAST_REFRESH !== 'false',
|
||||
}
|
||||
);
|
||||
// Stringify all values so we can feed into webpack DefinePlugin
|
||||
const stringified = {
|
||||
'process.env': Object.keys(raw).reduce((env, key) => {
|
||||
env[key] = JSON.stringify(raw[key]);
|
||||
return env;
|
||||
}, {}),
|
||||
};
|
||||
|
||||
return { raw, stringified };
|
||||
}
|
||||
|
||||
module.exports = getClientEnvironment;
|
||||
@@ -1,66 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const crypto = require('crypto');
|
||||
const chalk = require('react-dev-utils/chalk');
|
||||
const paths = require('./paths');
|
||||
|
||||
// Ensure the certificate and key provided are valid and if not
|
||||
// throw an easy to debug error
|
||||
function validateKeyAndCerts({ cert, key, keyFile, crtFile }) {
|
||||
let encrypted;
|
||||
try {
|
||||
// publicEncrypt will throw an error with an invalid cert
|
||||
encrypted = crypto.publicEncrypt(cert, Buffer.from('test'));
|
||||
} catch (err) {
|
||||
throw new Error(
|
||||
`The certificate "${chalk.yellow(crtFile)}" is invalid.\n${err.message}`
|
||||
);
|
||||
}
|
||||
|
||||
try {
|
||||
// privateDecrypt will throw an error with an invalid key
|
||||
crypto.privateDecrypt(key, encrypted);
|
||||
} catch (err) {
|
||||
throw new Error(
|
||||
`The certificate key "${chalk.yellow(keyFile)}" is invalid.\n${
|
||||
err.message
|
||||
}`
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Read file and throw an error if it doesn't exist
|
||||
function readEnvFile(file, type) {
|
||||
if (!fs.existsSync(file)) {
|
||||
throw new Error(
|
||||
`You specified ${chalk.cyan(
|
||||
type
|
||||
)} in your env, but the file "${chalk.yellow(file)}" can't be found.`
|
||||
);
|
||||
}
|
||||
return fs.readFileSync(file);
|
||||
}
|
||||
|
||||
// Get the https config
|
||||
// Return cert files if provided in env, otherwise just true or false
|
||||
function getHttpsConfig() {
|
||||
const { SSL_CRT_FILE, SSL_KEY_FILE, HTTPS } = process.env;
|
||||
const isHttps = HTTPS === 'true';
|
||||
|
||||
if (isHttps && SSL_CRT_FILE && SSL_KEY_FILE) {
|
||||
const crtFile = path.resolve(paths.appPath, SSL_CRT_FILE);
|
||||
const keyFile = path.resolve(paths.appPath, SSL_KEY_FILE);
|
||||
const config = {
|
||||
cert: readEnvFile(crtFile, 'SSL_CRT_FILE'),
|
||||
key: readEnvFile(keyFile, 'SSL_KEY_FILE'),
|
||||
};
|
||||
|
||||
validateKeyAndCerts({ ...config, keyFile, crtFile });
|
||||
return config;
|
||||
}
|
||||
return isHttps;
|
||||
}
|
||||
|
||||
module.exports = getHttpsConfig;
|
||||
@@ -1,29 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
const babelJest = require('babel-jest').default;
|
||||
|
||||
const hasJsxRuntime = (() => {
|
||||
if (process.env.DISABLE_NEW_JSX_TRANSFORM === 'true') {
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
require.resolve('react/jsx-runtime');
|
||||
return true;
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
})();
|
||||
|
||||
module.exports = babelJest.createTransformer({
|
||||
presets: [
|
||||
[
|
||||
require.resolve('babel-preset-react-app'),
|
||||
{
|
||||
runtime: hasJsxRuntime ? 'automatic' : 'classic',
|
||||
},
|
||||
],
|
||||
],
|
||||
babelrc: false,
|
||||
configFile: false,
|
||||
});
|
||||
@@ -1,14 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
// This is a custom Jest transformer turning style imports into empty objects.
|
||||
// http://facebook.github.io/jest/docs/en/webpack.html
|
||||
|
||||
module.exports = {
|
||||
process() {
|
||||
return 'module.exports = {};';
|
||||
},
|
||||
getCacheKey() {
|
||||
// The output is always the same.
|
||||
return 'cssTransform';
|
||||
},
|
||||
};
|
||||
@@ -1,40 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
const path = require('path');
|
||||
const camelcase = require('camelcase');
|
||||
|
||||
// This is a custom Jest transformer turning file imports into filenames.
|
||||
// http://facebook.github.io/jest/docs/en/webpack.html
|
||||
|
||||
module.exports = {
|
||||
process(src, filename) {
|
||||
const assetFilename = JSON.stringify(path.basename(filename));
|
||||
|
||||
if (filename.match(/\.svg$/)) {
|
||||
// Based on how SVGR generates a component name:
|
||||
// https://github.com/smooth-code/svgr/blob/01b194cf967347d43d4cbe6b434404731b87cf27/packages/core/src/state.js#L6
|
||||
const pascalCaseFilename = camelcase(path.parse(filename).name, {
|
||||
pascalCase: true,
|
||||
});
|
||||
const componentName = `Svg${pascalCaseFilename}`;
|
||||
return `const React = require('react');
|
||||
module.exports = {
|
||||
__esModule: true,
|
||||
default: ${assetFilename},
|
||||
ReactComponent: React.forwardRef(function ${componentName}(props, ref) {
|
||||
return {
|
||||
$$typeof: Symbol.for('react.element'),
|
||||
type: 'svg',
|
||||
ref: ref,
|
||||
key: null,
|
||||
props: Object.assign({}, props, {
|
||||
children: ${assetFilename}
|
||||
})
|
||||
};
|
||||
}),
|
||||
};`;
|
||||
}
|
||||
|
||||
return `module.exports = ${assetFilename};`;
|
||||
},
|
||||
};
|
||||
@@ -1,134 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const paths = require('./paths');
|
||||
const chalk = require('react-dev-utils/chalk');
|
||||
const resolve = require('resolve');
|
||||
|
||||
/**
|
||||
* Get additional module paths based on the baseUrl of a compilerOptions object.
|
||||
*
|
||||
* @param {Object} options
|
||||
*/
|
||||
function getAdditionalModulePaths(options = {}) {
|
||||
const baseUrl = options.baseUrl;
|
||||
|
||||
if (!baseUrl) {
|
||||
return '';
|
||||
}
|
||||
|
||||
const baseUrlResolved = path.resolve(paths.appPath, baseUrl);
|
||||
|
||||
// We don't need to do anything if `baseUrl` is set to `node_modules`. This is
|
||||
// the default behavior.
|
||||
if (path.relative(paths.appNodeModules, baseUrlResolved) === '') {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Allow the user set the `baseUrl` to `appSrc`.
|
||||
if (path.relative(paths.appSrc, baseUrlResolved) === '') {
|
||||
return [paths.appSrc];
|
||||
}
|
||||
|
||||
// If the path is equal to the root directory we ignore it here.
|
||||
// We don't want to allow importing from the root directly as source files are
|
||||
// not transpiled outside of `src`. We do allow importing them with the
|
||||
// absolute path (e.g. `src/Components/Button.js`) but we set that up with
|
||||
// an alias.
|
||||
if (path.relative(paths.appPath, baseUrlResolved) === '') {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Otherwise, throw an error.
|
||||
throw new Error(
|
||||
chalk.red.bold(
|
||||
"Your project's `baseUrl` can only be set to `src` or `node_modules`." +
|
||||
' Create React App does not support other values at this time.'
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get webpack aliases based on the baseUrl of a compilerOptions object.
|
||||
*
|
||||
* @param {*} options
|
||||
*/
|
||||
function getWebpackAliases(options = {}) {
|
||||
const baseUrl = options.baseUrl;
|
||||
|
||||
if (!baseUrl) {
|
||||
return {};
|
||||
}
|
||||
|
||||
const baseUrlResolved = path.resolve(paths.appPath, baseUrl);
|
||||
|
||||
if (path.relative(paths.appPath, baseUrlResolved) === '') {
|
||||
return {
|
||||
src: paths.appSrc,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get jest aliases based on the baseUrl of a compilerOptions object.
|
||||
*
|
||||
* @param {*} options
|
||||
*/
|
||||
function getJestAliases(options = {}) {
|
||||
const baseUrl = options.baseUrl;
|
||||
|
||||
if (!baseUrl) {
|
||||
return {};
|
||||
}
|
||||
|
||||
const baseUrlResolved = path.resolve(paths.appPath, baseUrl);
|
||||
|
||||
if (path.relative(paths.appPath, baseUrlResolved) === '') {
|
||||
return {
|
||||
'^src/(.*)$': '<rootDir>/src/$1',
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
function getModules() {
|
||||
// Check if TypeScript is setup
|
||||
const hasTsConfig = fs.existsSync(paths.appTsConfig);
|
||||
const hasJsConfig = fs.existsSync(paths.appJsConfig);
|
||||
|
||||
if (hasTsConfig && hasJsConfig) {
|
||||
throw new Error(
|
||||
'You have both a tsconfig.json and a jsconfig.json. If you are using TypeScript please remove your jsconfig.json file.'
|
||||
);
|
||||
}
|
||||
|
||||
let config;
|
||||
|
||||
// If there's a tsconfig.json we assume it's a
|
||||
// TypeScript project and set up the config
|
||||
// based on tsconfig.json
|
||||
if (hasTsConfig) {
|
||||
const ts = require(resolve.sync('typescript', {
|
||||
basedir: paths.appNodeModules,
|
||||
}));
|
||||
config = ts.readConfigFile(paths.appTsConfig, ts.sys.readFile).config;
|
||||
// Otherwise we'll check if there is jsconfig.json
|
||||
// for non TS projects.
|
||||
} else if (hasJsConfig) {
|
||||
config = require(paths.appJsConfig);
|
||||
}
|
||||
|
||||
config = config || {};
|
||||
const options = config.compilerOptions || {};
|
||||
|
||||
const additionalModulePaths = getAdditionalModulePaths(options);
|
||||
|
||||
return {
|
||||
additionalModulePaths: additionalModulePaths,
|
||||
webpackAliases: getWebpackAliases(options),
|
||||
jestAliases: getJestAliases(options),
|
||||
hasTsConfig,
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = getModules();
|
||||
@@ -1,77 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
const getPublicUrlOrPath = require('react-dev-utils/getPublicUrlOrPath');
|
||||
|
||||
// Make sure any symlinks in the project folder are resolved:
|
||||
// https://github.com/facebook/create-react-app/issues/637
|
||||
const appDirectory = fs.realpathSync(process.cwd());
|
||||
const resolveApp = relativePath => path.resolve(appDirectory, relativePath);
|
||||
|
||||
// We use `PUBLIC_URL` environment variable or "homepage" field to infer
|
||||
// "public path" at which the app is served.
|
||||
// webpack needs to know it to put the right <script> hrefs into HTML even in
|
||||
// single-page apps that may serve index.html for nested URLs like /todos/42.
|
||||
// We can't use a relative path in HTML because we don't want to load something
|
||||
// like /todos/42/static/js/bundle.7289d.js. We have to know the root.
|
||||
const publicUrlOrPath = getPublicUrlOrPath(
|
||||
process.env.NODE_ENV === 'development',
|
||||
require(resolveApp('package.json')).homepage,
|
||||
process.env.PUBLIC_URL
|
||||
);
|
||||
|
||||
const buildPath = process.env.BUILD_PATH || 'build';
|
||||
|
||||
const moduleFileExtensions = [
|
||||
'web.mjs',
|
||||
'mjs',
|
||||
'web.js',
|
||||
'js',
|
||||
'web.ts',
|
||||
'ts',
|
||||
'web.tsx',
|
||||
'tsx',
|
||||
'json',
|
||||
'web.jsx',
|
||||
'jsx',
|
||||
];
|
||||
|
||||
// Resolve file paths in the same order as webpack
|
||||
const resolveModule = (resolveFn, filePath) => {
|
||||
const extension = moduleFileExtensions.find(extension =>
|
||||
fs.existsSync(resolveFn(`${filePath}.${extension}`))
|
||||
);
|
||||
|
||||
if (extension) {
|
||||
return resolveFn(`${filePath}.${extension}`);
|
||||
}
|
||||
|
||||
return resolveFn(`${filePath}.js`);
|
||||
};
|
||||
|
||||
// config after eject: we're in ./config/
|
||||
module.exports = {
|
||||
dotenv: resolveApp('.env'),
|
||||
appPath: resolveApp('.'),
|
||||
appBuild: resolveApp(buildPath),
|
||||
appPublic: resolveApp('public'),
|
||||
appHtml: resolveApp('public/index.html'),
|
||||
appIndexJs: resolveModule(resolveApp, 'src/index'),
|
||||
appPackageJson: resolveApp('package.json'),
|
||||
appSrc: resolveApp('src'),
|
||||
appTsConfig: resolveApp('tsconfig.json'),
|
||||
appJsConfig: resolveApp('jsconfig.json'),
|
||||
yarnLockFile: resolveApp('yarn.lock'),
|
||||
testsSetup: resolveModule(resolveApp, 'src/setupTests'),
|
||||
proxySetup: resolveApp('src/setupProxy.js'),
|
||||
appNodeModules: resolveApp('node_modules'),
|
||||
appWebpackCache: resolveApp('node_modules/.cache'),
|
||||
appTsBuildInfoFile: resolveApp('node_modules/.cache/tsconfig.tsbuildinfo'),
|
||||
swSrc: resolveModule(resolveApp, 'src/service-worker'),
|
||||
publicUrlOrPath,
|
||||
};
|
||||
|
||||
|
||||
|
||||
module.exports.moduleFileExtensions = moduleFileExtensions;
|
||||
@@ -1,753 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const webpack = require('webpack');
|
||||
const resolve = require('resolve');
|
||||
const HtmlWebpackPlugin = require('html-webpack-plugin');
|
||||
const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin');
|
||||
const InlineChunkHtmlPlugin = require('react-dev-utils/InlineChunkHtmlPlugin');
|
||||
const TerserPlugin = require('terser-webpack-plugin');
|
||||
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
|
||||
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
|
||||
const { WebpackManifestPlugin } = require('webpack-manifest-plugin');
|
||||
const InterpolateHtmlPlugin = require('react-dev-utils/InterpolateHtmlPlugin');
|
||||
const WorkboxWebpackPlugin = require('workbox-webpack-plugin');
|
||||
const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin');
|
||||
const getCSSModuleLocalIdent = require('react-dev-utils/getCSSModuleLocalIdent');
|
||||
const ESLintPlugin = require('eslint-webpack-plugin');
|
||||
const paths = require('./paths');
|
||||
const modules = require('./modules');
|
||||
const getClientEnvironment = require('./env');
|
||||
const ModuleNotFoundPlugin = require('react-dev-utils/ModuleNotFoundPlugin');
|
||||
const ForkTsCheckerWebpackPlugin =
|
||||
process.env.TSC_COMPILE_ON_ERROR === 'true'
|
||||
? require('react-dev-utils/ForkTsCheckerWarningWebpackPlugin')
|
||||
: require('react-dev-utils/ForkTsCheckerWebpackPlugin');
|
||||
const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin');
|
||||
|
||||
const createEnvironmentHash = require('./webpack/persistentCache/createEnvironmentHash');
|
||||
|
||||
// Source maps are resource heavy and can cause out of memory issue for large source files.
|
||||
const shouldUseSourceMap = process.env.GENERATE_SOURCEMAP !== 'false';
|
||||
|
||||
const reactRefreshRuntimeEntry = require.resolve('react-refresh/runtime');
|
||||
const reactRefreshWebpackPluginRuntimeEntry = require.resolve(
|
||||
'@pmmmwh/react-refresh-webpack-plugin'
|
||||
);
|
||||
const babelRuntimeEntry = require.resolve('babel-preset-react-app');
|
||||
const babelRuntimeEntryHelpers = require.resolve(
|
||||
'@babel/runtime/helpers/esm/assertThisInitialized',
|
||||
{ paths: [babelRuntimeEntry] }
|
||||
);
|
||||
const babelRuntimeRegenerator = require.resolve('@babel/runtime/regenerator', {
|
||||
paths: [babelRuntimeEntry],
|
||||
});
|
||||
|
||||
// Some apps do not need the benefits of saving a web request, so not inlining the chunk
|
||||
// makes for a smoother build process.
|
||||
const shouldInlineRuntimeChunk = process.env.INLINE_RUNTIME_CHUNK !== 'false';
|
||||
|
||||
const emitErrorsAsWarnings = process.env.ESLINT_NO_DEV_ERRORS === 'true';
|
||||
const disableESLintPlugin = process.env.DISABLE_ESLINT_PLUGIN === 'true';
|
||||
|
||||
const imageInlineSizeLimit = parseInt(
|
||||
process.env.IMAGE_INLINE_SIZE_LIMIT || '10000'
|
||||
);
|
||||
|
||||
// Check if TypeScript is setup
|
||||
const useTypeScript = fs.existsSync(paths.appTsConfig);
|
||||
|
||||
// Check if Tailwind config exists
|
||||
const useTailwind = fs.existsSync(
|
||||
path.join(paths.appPath, 'tailwind.config.js')
|
||||
);
|
||||
|
||||
// Get the path to the uncompiled service worker (if it exists).
|
||||
const swSrc = paths.swSrc;
|
||||
|
||||
// style files regexes
|
||||
const cssRegex = /\.css$/;
|
||||
const cssModuleRegex = /\.module\.css$/;
|
||||
const sassRegex = /\.(scss|sass)$/;
|
||||
const sassModuleRegex = /\.module\.(scss|sass)$/;
|
||||
|
||||
const hasJsxRuntime = (() => {
|
||||
if (process.env.DISABLE_NEW_JSX_TRANSFORM === 'true') {
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
require.resolve('react/jsx-runtime');
|
||||
return true;
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
})();
|
||||
|
||||
// This is the production and development configuration.
|
||||
// It is focused on developer experience, fast rebuilds, and a minimal bundle.
|
||||
module.exports = function (webpackEnv) {
|
||||
const isEnvDevelopment = webpackEnv === 'development';
|
||||
const isEnvProduction = webpackEnv === 'production';
|
||||
|
||||
// Variable used for enabling profiling in Production
|
||||
// passed into alias object. Uses a flag if passed into the build command
|
||||
const isEnvProductionProfile =
|
||||
isEnvProduction && process.argv.includes('--profile');
|
||||
|
||||
// We will provide `paths.publicUrlOrPath` to our app
|
||||
// as %PUBLIC_URL% in `index.html` and `process.env.PUBLIC_URL` in JavaScript.
|
||||
// Omit trailing slash as %PUBLIC_URL%/xyz looks better than %PUBLIC_URL%xyz.
|
||||
// Get environment variables to inject into our app.
|
||||
const env = getClientEnvironment(paths.publicUrlOrPath.slice(0, -1));
|
||||
|
||||
const shouldUseReactRefresh = env.raw.FAST_REFRESH;
|
||||
|
||||
// common function to get style loaders
|
||||
const getStyleLoaders = (cssOptions, preProcessor) => {
|
||||
const loaders = [
|
||||
isEnvDevelopment && require.resolve('style-loader'),
|
||||
isEnvProduction && {
|
||||
loader: MiniCssExtractPlugin.loader,
|
||||
// css is located in `static/css`, use '../../' to locate index.html folder
|
||||
// in production `paths.publicUrlOrPath` can be a relative path
|
||||
options: paths.publicUrlOrPath.startsWith('.')
|
||||
? { publicPath: '../../' }
|
||||
: {},
|
||||
},
|
||||
{
|
||||
loader: require.resolve('css-loader'),
|
||||
options: cssOptions,
|
||||
},
|
||||
{
|
||||
// Options for PostCSS as we reference these options twice
|
||||
// Adds vendor prefixing based on your specified browser support in
|
||||
// package.json
|
||||
loader: require.resolve('postcss-loader'),
|
||||
options: {
|
||||
postcssOptions: {
|
||||
// Necessary for external CSS imports to work
|
||||
// https://github.com/facebook/create-react-app/issues/2677
|
||||
ident: 'postcss',
|
||||
config: false,
|
||||
plugins: !useTailwind
|
||||
? [
|
||||
'postcss-flexbugs-fixes',
|
||||
[
|
||||
'postcss-preset-env',
|
||||
{
|
||||
autoprefixer: {
|
||||
flexbox: 'no-2009',
|
||||
},
|
||||
stage: 3,
|
||||
},
|
||||
],
|
||||
// Adds PostCSS Normalize as the reset css with default options,
|
||||
// so that it honors browserslist config in package.json
|
||||
// which in turn let's users customize the target behavior as per their needs.
|
||||
'postcss-normalize',
|
||||
]
|
||||
: [
|
||||
'tailwindcss',
|
||||
'postcss-flexbugs-fixes',
|
||||
[
|
||||
'postcss-preset-env',
|
||||
{
|
||||
autoprefixer: {
|
||||
flexbox: 'no-2009',
|
||||
},
|
||||
stage: 3,
|
||||
},
|
||||
],
|
||||
],
|
||||
},
|
||||
sourceMap: isEnvProduction ? shouldUseSourceMap : isEnvDevelopment,
|
||||
},
|
||||
},
|
||||
].filter(Boolean);
|
||||
if (preProcessor) {
|
||||
loaders.push(
|
||||
{
|
||||
loader: require.resolve('resolve-url-loader'),
|
||||
options: {
|
||||
sourceMap: isEnvProduction ? shouldUseSourceMap : isEnvDevelopment,
|
||||
root: paths.appSrc,
|
||||
},
|
||||
},
|
||||
{
|
||||
loader: require.resolve(preProcessor),
|
||||
options: {
|
||||
sourceMap: true,
|
||||
},
|
||||
}
|
||||
);
|
||||
}
|
||||
return loaders;
|
||||
};
|
||||
|
||||
return {
|
||||
target: ['browserslist'],
|
||||
mode: isEnvProduction ? 'production' : isEnvDevelopment && 'development',
|
||||
// Stop compilation early in production
|
||||
bail: isEnvProduction,
|
||||
devtool: isEnvProduction
|
||||
? shouldUseSourceMap
|
||||
? 'source-map'
|
||||
: false
|
||||
: isEnvDevelopment && 'cheap-module-source-map',
|
||||
// These are the "entry points" to our application.
|
||||
// This means they will be the "root" imports that are included in JS bundle.
|
||||
entry: paths.appIndexJs,
|
||||
output: {
|
||||
// The build folder.
|
||||
path: paths.appBuild,
|
||||
// Add /* filename */ comments to generated require()s in the output.
|
||||
pathinfo: isEnvDevelopment,
|
||||
// There will be one main bundle, and one file per asynchronous chunk.
|
||||
// In development, it does not produce real files.
|
||||
filename: isEnvProduction
|
||||
? 'static/js/[name].[contenthash:8].js'
|
||||
: isEnvDevelopment && 'static/js/bundle.js',
|
||||
// There are also additional JS chunk files if you use code splitting.
|
||||
chunkFilename: isEnvProduction
|
||||
? 'static/js/[name].[contenthash:8].chunk.js'
|
||||
: isEnvDevelopment && 'static/js/[name].chunk.js',
|
||||
assetModuleFilename: 'static/media/[name].[hash][ext]',
|
||||
// webpack uses `publicPath` to determine where the app is being served from.
|
||||
// It requires a trailing slash, or the file assets will get an incorrect path.
|
||||
// We inferred the "public path" (such as / or /my-project) from homepage.
|
||||
publicPath: paths.publicUrlOrPath,
|
||||
// Point sourcemap entries to original disk location (format as URL on Windows)
|
||||
devtoolModuleFilenameTemplate: isEnvProduction
|
||||
? info =>
|
||||
path
|
||||
.relative(paths.appSrc, info.absoluteResourcePath)
|
||||
.replace(/\\/g, '/')
|
||||
: isEnvDevelopment &&
|
||||
(info => path.resolve(info.absoluteResourcePath).replace(/\\/g, '/')),
|
||||
},
|
||||
cache: {
|
||||
type: 'filesystem',
|
||||
version: createEnvironmentHash(env.raw),
|
||||
cacheDirectory: paths.appWebpackCache,
|
||||
store: 'pack',
|
||||
buildDependencies: {
|
||||
defaultWebpack: ['webpack/lib/'],
|
||||
config: [__filename],
|
||||
tsconfig: [paths.appTsConfig, paths.appJsConfig].filter(f =>
|
||||
fs.existsSync(f)
|
||||
),
|
||||
},
|
||||
},
|
||||
infrastructureLogging: {
|
||||
level: 'none',
|
||||
},
|
||||
optimization: {
|
||||
minimize: isEnvProduction,
|
||||
minimizer: [
|
||||
// This is only used in production mode
|
||||
new TerserPlugin({
|
||||
terserOptions: {
|
||||
parse: {
|
||||
// We want terser to parse ecma 8 code. However, we don't want it
|
||||
// to apply any minification steps that turns valid ecma 5 code
|
||||
// into invalid ecma 5 code. This is why the 'compress' and 'output'
|
||||
// sections only apply transformations that are ecma 5 safe
|
||||
// https://github.com/facebook/create-react-app/pull/4234
|
||||
ecma: 8,
|
||||
},
|
||||
compress: {
|
||||
ecma: 5,
|
||||
warnings: false,
|
||||
// Disabled because of an issue with Uglify breaking seemingly valid code:
|
||||
// https://github.com/facebook/create-react-app/issues/2376
|
||||
// Pending further investigation:
|
||||
// https://github.com/mishoo/UglifyJS2/issues/2011
|
||||
comparisons: false,
|
||||
// Disabled because of an issue with Terser breaking valid code:
|
||||
// https://github.com/facebook/create-react-app/issues/5250
|
||||
// Pending further investigation:
|
||||
// https://github.com/terser-js/terser/issues/120
|
||||
inline: 2,
|
||||
},
|
||||
mangle: {
|
||||
safari10: true,
|
||||
},
|
||||
// Added for profiling in devtools
|
||||
keep_classnames: isEnvProductionProfile,
|
||||
keep_fnames: isEnvProductionProfile,
|
||||
output: {
|
||||
ecma: 5,
|
||||
comments: false,
|
||||
// Turned on because emoji and regex is not minified properly using default
|
||||
// https://github.com/facebook/create-react-app/issues/2488
|
||||
ascii_only: true,
|
||||
},
|
||||
},
|
||||
}),
|
||||
// This is only used in production mode
|
||||
new CssMinimizerPlugin(),
|
||||
],
|
||||
},
|
||||
resolve: {
|
||||
// This allows you to set a fallback for where webpack should look for modules.
|
||||
// We placed these paths second because we want `node_modules` to "win"
|
||||
// if there are any conflicts. This matches Node resolution mechanism.
|
||||
// https://github.com/facebook/create-react-app/issues/253
|
||||
modules: ['node_modules', paths.appNodeModules].concat(
|
||||
modules.additionalModulePaths || []
|
||||
),
|
||||
// These are the reasonable defaults supported by the Node ecosystem.
|
||||
// We also include JSX as a common component filename extension to support
|
||||
// some tools, although we do not recommend using it, see:
|
||||
// https://github.com/facebook/create-react-app/issues/290
|
||||
// `web` extension prefixes have been added for better support
|
||||
// for React Native Web.
|
||||
extensions: paths.moduleFileExtensions
|
||||
.map(ext => `.${ext}`)
|
||||
.filter(ext => useTypeScript || !ext.includes('ts')),
|
||||
alias: {
|
||||
// Support React Native Web
|
||||
// https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-native-for-web/
|
||||
'react-native': 'react-native-web',
|
||||
// Allows for better profiling with ReactDevTools
|
||||
...(isEnvProductionProfile && {
|
||||
'react-dom$': 'react-dom/profiling',
|
||||
'scheduler/tracing': 'scheduler/tracing-profiling',
|
||||
}),
|
||||
...(modules.webpackAliases || {}),
|
||||
},
|
||||
plugins: [
|
||||
// Prevents users from importing files from outside of src/ (or node_modules/).
|
||||
// This often causes confusion because we only process files within src/ with babel.
|
||||
// To fix this, we prevent you from importing files out of src/ -- if you'd like to,
|
||||
// please link the files into your node_modules/ and let module-resolution kick in.
|
||||
// Make sure your source files are compiled, as they will not be processed in any way.
|
||||
new ModuleScopePlugin(paths.appSrc, [
|
||||
paths.appPackageJson,
|
||||
reactRefreshRuntimeEntry,
|
||||
reactRefreshWebpackPluginRuntimeEntry,
|
||||
babelRuntimeEntry,
|
||||
babelRuntimeEntryHelpers,
|
||||
babelRuntimeRegenerator,
|
||||
]),
|
||||
],
|
||||
},
|
||||
module: {
|
||||
strictExportPresence: true,
|
||||
rules: [
|
||||
// Handle node_modules packages that contain sourcemaps
|
||||
shouldUseSourceMap && {
|
||||
enforce: 'pre',
|
||||
exclude: /@babel(?:\/|\\{1,2})runtime/,
|
||||
test: /\.(js|mjs|jsx|ts|tsx|css)$/,
|
||||
loader: require.resolve('source-map-loader'),
|
||||
},
|
||||
{
|
||||
// "oneOf" will traverse all following loaders until one will
|
||||
// match the requirements. When no loader matches it will fall
|
||||
// back to the "file" loader at the end of the loader list.
|
||||
oneOf: [
|
||||
// TODO: Merge this config once `image/avif` is in the mime-db
|
||||
// https://github.com/jshttp/mime-db
|
||||
{
|
||||
test: [/\.avif$/],
|
||||
type: 'asset',
|
||||
mimetype: 'image/avif',
|
||||
parser: {
|
||||
dataUrlCondition: {
|
||||
maxSize: imageInlineSizeLimit,
|
||||
},
|
||||
},
|
||||
},
|
||||
// "url" loader works like "file" loader except that it embeds assets
|
||||
// smaller than specified limit in bytes as data URLs to avoid requests.
|
||||
// A missing `test` is equivalent to a match.
|
||||
{
|
||||
test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/],
|
||||
type: 'asset',
|
||||
parser: {
|
||||
dataUrlCondition: {
|
||||
maxSize: imageInlineSizeLimit,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
test: /\.svg$/,
|
||||
use: [
|
||||
{
|
||||
loader: require.resolve('@svgr/webpack'),
|
||||
options: {
|
||||
prettier: false,
|
||||
svgo: false,
|
||||
svgoConfig: {
|
||||
plugins: [{ removeViewBox: false }],
|
||||
},
|
||||
titleProp: true,
|
||||
ref: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
loader: require.resolve('file-loader'),
|
||||
options: {
|
||||
name: 'static/media/[name].[hash].[ext]',
|
||||
},
|
||||
},
|
||||
],
|
||||
issuer: {
|
||||
and: [/\.(ts|tsx|js|jsx|md|mdx)$/],
|
||||
},
|
||||
},
|
||||
// Process application JS with Babel.
|
||||
// The preset includes JSX, Flow, TypeScript, and some ESnext features.
|
||||
{
|
||||
test: /\.(js|mjs|jsx|ts|tsx)$/,
|
||||
include: paths.appSrc,
|
||||
loader: require.resolve('babel-loader'),
|
||||
options: {
|
||||
customize: require.resolve(
|
||||
'babel-preset-react-app/webpack-overrides'
|
||||
),
|
||||
presets: [
|
||||
[
|
||||
require.resolve('babel-preset-react-app'),
|
||||
{
|
||||
runtime: hasJsxRuntime ? 'automatic' : 'classic',
|
||||
},
|
||||
],
|
||||
],
|
||||
|
||||
plugins: [
|
||||
isEnvDevelopment &&
|
||||
shouldUseReactRefresh &&
|
||||
require.resolve('react-refresh/babel'),
|
||||
].filter(Boolean),
|
||||
// This is a feature of `babel-loader` for webpack (not Babel itself).
|
||||
// It enables caching results in ./node_modules/.cache/babel-loader/
|
||||
// directory for faster rebuilds.
|
||||
cacheDirectory: true,
|
||||
// See #6846 for context on why cacheCompression is disabled
|
||||
cacheCompression: false,
|
||||
compact: isEnvProduction,
|
||||
},
|
||||
},
|
||||
// Process any JS outside of the app with Babel.
|
||||
// Unlike the application JS, we only compile the standard ES features.
|
||||
{
|
||||
test: /\.(js|mjs)$/,
|
||||
exclude: /@babel(?:\/|\\{1,2})runtime/,
|
||||
loader: require.resolve('babel-loader'),
|
||||
options: {
|
||||
babelrc: false,
|
||||
configFile: false,
|
||||
compact: false,
|
||||
presets: [
|
||||
[
|
||||
require.resolve('babel-preset-react-app/dependencies'),
|
||||
{ helpers: true },
|
||||
],
|
||||
],
|
||||
cacheDirectory: true,
|
||||
// See #6846 for context on why cacheCompression is disabled
|
||||
cacheCompression: false,
|
||||
|
||||
// Babel sourcemaps are needed for debugging into node_modules
|
||||
// code. Without the options below, debuggers like VSCode
|
||||
// show incorrect code and set breakpoints on the wrong lines.
|
||||
sourceMaps: shouldUseSourceMap,
|
||||
inputSourceMap: shouldUseSourceMap,
|
||||
},
|
||||
},
|
||||
// "postcss" loader applies autoprefixer to our CSS.
|
||||
// "css" loader resolves paths in CSS and adds assets as dependencies.
|
||||
// "style" loader turns CSS into JS modules that inject <style> tags.
|
||||
// In production, we use MiniCSSExtractPlugin to extract that CSS
|
||||
// to a file, but in development "style" loader enables hot editing
|
||||
// of CSS.
|
||||
// By default we support CSS Modules with the extension .module.css
|
||||
{
|
||||
test: cssRegex,
|
||||
exclude: cssModuleRegex,
|
||||
use: getStyleLoaders({
|
||||
importLoaders: 1,
|
||||
sourceMap: isEnvProduction
|
||||
? shouldUseSourceMap
|
||||
: isEnvDevelopment,
|
||||
modules: {
|
||||
mode: 'icss',
|
||||
},
|
||||
}),
|
||||
// Don't consider CSS imports dead code even if the
|
||||
// containing package claims to have no side effects.
|
||||
// Remove this when webpack adds a warning or an error for this.
|
||||
// See https://github.com/webpack/webpack/issues/6571
|
||||
sideEffects: true,
|
||||
},
|
||||
// Adds support for CSS Modules (https://github.com/css-modules/css-modules)
|
||||
// using the extension .module.css
|
||||
{
|
||||
test: cssModuleRegex,
|
||||
use: getStyleLoaders({
|
||||
importLoaders: 1,
|
||||
sourceMap: isEnvProduction
|
||||
? shouldUseSourceMap
|
||||
: isEnvDevelopment,
|
||||
modules: {
|
||||
mode: 'local',
|
||||
getLocalIdent: getCSSModuleLocalIdent,
|
||||
},
|
||||
}),
|
||||
},
|
||||
// Opt-in support for SASS (using .scss or .sass extensions).
|
||||
// By default we support SASS Modules with the
|
||||
// extensions .module.scss or .module.sass
|
||||
{
|
||||
test: sassRegex,
|
||||
exclude: sassModuleRegex,
|
||||
use: getStyleLoaders(
|
||||
{
|
||||
importLoaders: 3,
|
||||
sourceMap: isEnvProduction
|
||||
? shouldUseSourceMap
|
||||
: isEnvDevelopment,
|
||||
modules: {
|
||||
mode: 'icss',
|
||||
},
|
||||
},
|
||||
'sass-loader'
|
||||
),
|
||||
// Don't consider CSS imports dead code even if the
|
||||
// containing package claims to have no side effects.
|
||||
// Remove this when webpack adds a warning or an error for this.
|
||||
// See https://github.com/webpack/webpack/issues/6571
|
||||
sideEffects: true,
|
||||
},
|
||||
// Adds support for CSS Modules, but using SASS
|
||||
// using the extension .module.scss or .module.sass
|
||||
{
|
||||
test: sassModuleRegex,
|
||||
use: getStyleLoaders(
|
||||
{
|
||||
importLoaders: 3,
|
||||
sourceMap: isEnvProduction
|
||||
? shouldUseSourceMap
|
||||
: isEnvDevelopment,
|
||||
modules: {
|
||||
mode: 'local',
|
||||
getLocalIdent: getCSSModuleLocalIdent,
|
||||
},
|
||||
},
|
||||
'sass-loader'
|
||||
),
|
||||
},
|
||||
// "file" loader makes sure those assets get served by WebpackDevServer.
|
||||
// When you `import` an asset, you get its (virtual) filename.
|
||||
// In production, they would get copied to the `build` folder.
|
||||
// This loader doesn't use a "test" so it will catch all modules
|
||||
// that fall through the other loaders.
|
||||
{
|
||||
// Exclude `js` files to keep "css" loader working as it injects
|
||||
// its runtime that would otherwise be processed through "file" loader.
|
||||
// Also exclude `html` and `json` extensions so they get processed
|
||||
// by webpacks internal loaders.
|
||||
exclude: [/^$/, /\.(js|mjs|jsx|ts|tsx)$/, /\.html$/, /\.json$/],
|
||||
type: 'asset/resource',
|
||||
},
|
||||
// ** STOP ** Are you adding a new loader?
|
||||
// Make sure to add the new loader(s) before the "file" loader.
|
||||
],
|
||||
},
|
||||
].filter(Boolean),
|
||||
},
|
||||
plugins: [
|
||||
// Generates an `index.html` file with the <script> injected.
|
||||
new HtmlWebpackPlugin(
|
||||
Object.assign(
|
||||
{},
|
||||
{
|
||||
inject: true,
|
||||
template: paths.appHtml,
|
||||
},
|
||||
isEnvProduction
|
||||
? {
|
||||
minify: {
|
||||
removeComments: true,
|
||||
collapseWhitespace: true,
|
||||
removeRedundantAttributes: true,
|
||||
useShortDoctype: true,
|
||||
removeEmptyAttributes: true,
|
||||
removeStyleLinkTypeAttributes: true,
|
||||
keepClosingSlash: true,
|
||||
minifyJS: true,
|
||||
minifyCSS: true,
|
||||
minifyURLs: true,
|
||||
},
|
||||
}
|
||||
: undefined
|
||||
)
|
||||
),
|
||||
// Inlines the webpack runtime script. This script is too small to warrant
|
||||
// a network request.
|
||||
// https://github.com/facebook/create-react-app/issues/5358
|
||||
isEnvProduction &&
|
||||
shouldInlineRuntimeChunk &&
|
||||
new InlineChunkHtmlPlugin(HtmlWebpackPlugin, [/runtime-.+[.]js/]),
|
||||
// Makes some environment variables available in index.html.
|
||||
// The public URL is available as %PUBLIC_URL% in index.html, e.g.:
|
||||
// <link rel="icon" href="%PUBLIC_URL%/favicon.ico">
|
||||
// It will be an empty string unless you specify "homepage"
|
||||
// in `package.json`, in which case it will be the pathname of that URL.
|
||||
new InterpolateHtmlPlugin(HtmlWebpackPlugin, env.raw),
|
||||
// This gives some necessary context to module not found errors, such as
|
||||
// the requesting resource.
|
||||
new ModuleNotFoundPlugin(paths.appPath),
|
||||
// Makes some environment variables available to the JS code, for example:
|
||||
// if (process.env.NODE_ENV === 'production') { ... }. See `./env.js`.
|
||||
// It is absolutely essential that NODE_ENV is set to production
|
||||
// during a production build.
|
||||
// Otherwise React will be compiled in the very slow development mode.
|
||||
new webpack.DefinePlugin(env.stringified),
|
||||
// Experimental hot reloading for React .
|
||||
// https://github.com/facebook/react/tree/main/packages/react-refresh
|
||||
isEnvDevelopment &&
|
||||
shouldUseReactRefresh &&
|
||||
new ReactRefreshWebpackPlugin({
|
||||
overlay: false,
|
||||
}),
|
||||
// Watcher doesn't work well if you mistype casing in a path so we use
|
||||
// a plugin that prints an error when you attempt to do this.
|
||||
// See https://github.com/facebook/create-react-app/issues/240
|
||||
isEnvDevelopment && new CaseSensitivePathsPlugin(),
|
||||
isEnvProduction &&
|
||||
new MiniCssExtractPlugin({
|
||||
// Options similar to the same options in webpackOptions.output
|
||||
// both options are optional
|
||||
filename: 'static/css/[name].[contenthash:8].css',
|
||||
chunkFilename: 'static/css/[name].[contenthash:8].chunk.css',
|
||||
}),
|
||||
// Generate an asset manifest file with the following content:
|
||||
// - "files" key: Mapping of all asset filenames to their corresponding
|
||||
// output file so that tools can pick it up without having to parse
|
||||
// `index.html`
|
||||
// - "entrypoints" key: Array of files which are included in `index.html`,
|
||||
// can be used to reconstruct the HTML if necessary
|
||||
new WebpackManifestPlugin({
|
||||
fileName: 'asset-manifest.json',
|
||||
publicPath: paths.publicUrlOrPath,
|
||||
generate: (seed, files, entrypoints) => {
|
||||
const manifestFiles = files.reduce((manifest, file) => {
|
||||
manifest[file.name] = file.path;
|
||||
return manifest;
|
||||
}, seed);
|
||||
const entrypointFiles = entrypoints.main.filter(
|
||||
fileName => !fileName.endsWith('.map')
|
||||
);
|
||||
|
||||
return {
|
||||
files: manifestFiles,
|
||||
entrypoints: entrypointFiles,
|
||||
};
|
||||
},
|
||||
}),
|
||||
// Moment.js is an extremely popular library that bundles large locale files
|
||||
// by default due to how webpack interprets its code. This is a practical
|
||||
// solution that requires the user to opt into importing specific locales.
|
||||
// https://github.com/jmblog/how-to-optimize-momentjs-with-webpack
|
||||
// You can remove this if you don't use Moment.js:
|
||||
new webpack.IgnorePlugin({
|
||||
resourceRegExp: /^\.\/locale$/,
|
||||
contextRegExp: /moment$/,
|
||||
}),
|
||||
// Generate a service worker script that will precache, and keep up to date,
|
||||
// the HTML & assets that are part of the webpack build.
|
||||
isEnvProduction &&
|
||||
fs.existsSync(swSrc) &&
|
||||
new WorkboxWebpackPlugin.InjectManifest({
|
||||
swSrc,
|
||||
dontCacheBustURLsMatching: /\.[0-9a-f]{8}\./,
|
||||
exclude: [/\.map$/, /asset-manifest\.json$/, /LICENSE/],
|
||||
// Bump up the default maximum size (2mb) that's precached,
|
||||
// to make lazy-loading failure scenarios less likely.
|
||||
// See https://github.com/cra-template/pwa/issues/13#issuecomment-722667270
|
||||
maximumFileSizeToCacheInBytes: 5 * 1024 * 1024,
|
||||
}),
|
||||
// TypeScript type checking
|
||||
useTypeScript &&
|
||||
new ForkTsCheckerWebpackPlugin({
|
||||
async: isEnvDevelopment,
|
||||
typescript: {
|
||||
typescriptPath: resolve.sync('typescript', {
|
||||
basedir: paths.appNodeModules,
|
||||
}),
|
||||
configOverwrite: {
|
||||
compilerOptions: {
|
||||
sourceMap: isEnvProduction
|
||||
? shouldUseSourceMap
|
||||
: isEnvDevelopment,
|
||||
skipLibCheck: true,
|
||||
inlineSourceMap: false,
|
||||
declarationMap: false,
|
||||
noEmit: true,
|
||||
incremental: true,
|
||||
tsBuildInfoFile: paths.appTsBuildInfoFile,
|
||||
},
|
||||
},
|
||||
context: paths.appPath,
|
||||
diagnosticOptions: {
|
||||
syntactic: true,
|
||||
},
|
||||
mode: 'write-references',
|
||||
// profile: true,
|
||||
},
|
||||
issue: {
|
||||
// This one is specifically to match during CI tests,
|
||||
// as micromatch doesn't match
|
||||
// '../cra-template-typescript/template/src/App.tsx'
|
||||
// otherwise.
|
||||
include: [
|
||||
{ file: '../**/src/**/*.{ts,tsx}' },
|
||||
{ file: '**/src/**/*.{ts,tsx}' },
|
||||
],
|
||||
exclude: [
|
||||
{ file: '**/src/**/__tests__/**' },
|
||||
{ file: '**/src/**/?(*.){spec|test}.*' },
|
||||
{ file: '**/src/setupProxy.*' },
|
||||
{ file: '**/src/setupTests.*' },
|
||||
],
|
||||
},
|
||||
logger: {
|
||||
infrastructure: 'silent',
|
||||
},
|
||||
}),
|
||||
!disableESLintPlugin &&
|
||||
new ESLintPlugin({
|
||||
// Plugin options
|
||||
extensions: ['js', 'mjs', 'jsx', 'ts', 'tsx'],
|
||||
formatter: require.resolve('react-dev-utils/eslintFormatter'),
|
||||
eslintPath: require.resolve('eslint'),
|
||||
failOnError: !(isEnvDevelopment && emitErrorsAsWarnings),
|
||||
context: paths.appSrc,
|
||||
cache: true,
|
||||
cacheLocation: path.resolve(
|
||||
paths.appNodeModules,
|
||||
'.cache/.eslintcache'
|
||||
),
|
||||
// ESLint class options
|
||||
cwd: paths.appPath,
|
||||
resolvePluginsRelativeTo: __dirname,
|
||||
baseConfig: {
|
||||
extends: [require.resolve('eslint-config-react-app/base')],
|
||||
rules: {
|
||||
...(!hasJsxRuntime && {
|
||||
'react/react-in-jsx-scope': 'error',
|
||||
}),
|
||||
},
|
||||
},
|
||||
}),
|
||||
].filter(Boolean),
|
||||
// Turn off performance processing because we utilize
|
||||
// our own hints via the FileSizeReporter
|
||||
performance: false,
|
||||
};
|
||||
};
|
||||
@@ -1,9 +0,0 @@
|
||||
'use strict';
|
||||
const { createHash } = require('crypto');
|
||||
|
||||
module.exports = env => {
|
||||
const hash = createHash('md5');
|
||||
hash.update(JSON.stringify(env));
|
||||
|
||||
return hash.digest('hex');
|
||||
};
|
||||
@@ -1,127 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
const fs = require('fs');
|
||||
const evalSourceMapMiddleware = require('react-dev-utils/evalSourceMapMiddleware');
|
||||
const noopServiceWorkerMiddleware = require('react-dev-utils/noopServiceWorkerMiddleware');
|
||||
const ignoredFiles = require('react-dev-utils/ignoredFiles');
|
||||
const redirectServedPath = require('react-dev-utils/redirectServedPathMiddleware');
|
||||
const paths = require('./paths');
|
||||
const getHttpsConfig = require('./getHttpsConfig');
|
||||
|
||||
const host = process.env.HOST || '0.0.0.0';
|
||||
const sockHost = process.env.WDS_SOCKET_HOST;
|
||||
const sockPath = process.env.WDS_SOCKET_PATH; // default: '/ws'
|
||||
const sockPort = process.env.WDS_SOCKET_PORT;
|
||||
|
||||
module.exports = function (proxy, allowedHost) {
|
||||
const disableFirewall =
|
||||
!proxy || process.env.DANGEROUSLY_DISABLE_HOST_CHECK === 'true';
|
||||
return {
|
||||
// WebpackDevServer 2.4.3 introduced a security fix that prevents remote
|
||||
// websites from potentially accessing local content through DNS rebinding:
|
||||
// https://github.com/webpack/webpack-dev-server/issues/887
|
||||
// https://medium.com/webpack/webpack-dev-server-middleware-security-issues-1489d950874a
|
||||
// However, it made several existing use cases such as development in cloud
|
||||
// environment or subdomains in development significantly more complicated:
|
||||
// https://github.com/facebook/create-react-app/issues/2271
|
||||
// https://github.com/facebook/create-react-app/issues/2233
|
||||
// While we're investigating better solutions, for now we will take a
|
||||
// compromise. Since our WDS configuration only serves files in the `public`
|
||||
// folder we won't consider accessing them a vulnerability. However, if you
|
||||
// use the `proxy` feature, it gets more dangerous because it can expose
|
||||
// remote code execution vulnerabilities in backends like Django and Rails.
|
||||
// So we will disable the host check normally, but enable it if you have
|
||||
// specified the `proxy` setting. Finally, we let you override it if you
|
||||
// really know what you're doing with a special environment variable.
|
||||
// Note: ["localhost", ".localhost"] will support subdomains - but we might
|
||||
// want to allow setting the allowedHosts manually for more complex setups
|
||||
allowedHosts: disableFirewall ? 'all' : [allowedHost],
|
||||
headers: {
|
||||
'Access-Control-Allow-Origin': '*',
|
||||
'Access-Control-Allow-Methods': '*',
|
||||
'Access-Control-Allow-Headers': '*',
|
||||
},
|
||||
// Enable gzip compression of generated files.
|
||||
compress: true,
|
||||
static: {
|
||||
// By default WebpackDevServer serves physical files from current directory
|
||||
// in addition to all the virtual build products that it serves from memory.
|
||||
// This is confusing because those files won’t automatically be available in
|
||||
// production build folder unless we copy them. However, copying the whole
|
||||
// project directory is dangerous because we may expose sensitive files.
|
||||
// Instead, we establish a convention that only files in `public` directory
|
||||
// get served. Our build script will copy `public` into the `build` folder.
|
||||
// In `index.html`, you can get URL of `public` folder with %PUBLIC_URL%:
|
||||
// <link rel="icon" href="%PUBLIC_URL%/favicon.ico">
|
||||
// In JavaScript code, you can access it with `process.env.PUBLIC_URL`.
|
||||
// Note that we only recommend to use `public` folder as an escape hatch
|
||||
// for files like `favicon.ico`, `manifest.json`, and libraries that are
|
||||
// for some reason broken when imported through webpack. If you just want to
|
||||
// use an image, put it in `src` and `import` it from JavaScript instead.
|
||||
directory: paths.appPublic,
|
||||
publicPath: [paths.publicUrlOrPath],
|
||||
// By default files from `contentBase` will not trigger a page reload.
|
||||
watch: {
|
||||
// Reportedly, this avoids CPU overload on some systems.
|
||||
// https://github.com/facebook/create-react-app/issues/293
|
||||
// src/node_modules is not ignored to support absolute imports
|
||||
// https://github.com/facebook/create-react-app/issues/1065
|
||||
ignored: ignoredFiles(paths.appSrc),
|
||||
},
|
||||
},
|
||||
client: {
|
||||
webSocketURL: {
|
||||
// Enable custom sockjs pathname for websocket connection to hot reloading server.
|
||||
// Enable custom sockjs hostname, pathname and port for websocket connection
|
||||
// to hot reloading server.
|
||||
hostname: sockHost,
|
||||
pathname: sockPath,
|
||||
port: sockPort,
|
||||
},
|
||||
overlay: {
|
||||
errors: true,
|
||||
warnings: false,
|
||||
},
|
||||
},
|
||||
devMiddleware: {
|
||||
// It is important to tell WebpackDevServer to use the same "publicPath" path as
|
||||
// we specified in the webpack config. When homepage is '.', default to serving
|
||||
// from the root.
|
||||
// remove last slash so user can land on `/test` instead of `/test/`
|
||||
publicPath: paths.publicUrlOrPath.slice(0, -1),
|
||||
},
|
||||
|
||||
https: getHttpsConfig(),
|
||||
host,
|
||||
historyApiFallback: {
|
||||
// Paths with dots should still use the history fallback.
|
||||
// See https://github.com/facebook/create-react-app/issues/387.
|
||||
disableDotRule: true,
|
||||
index: paths.publicUrlOrPath,
|
||||
},
|
||||
// `proxy` is run between `before` and `after` `webpack-dev-server` hooks
|
||||
proxy,
|
||||
onBeforeSetupMiddleware(devServer) {
|
||||
// Keep `evalSourceMapMiddleware`
|
||||
// middlewares before `redirectServedPath` otherwise will not have any effect
|
||||
// This lets us fetch source contents from webpack for the error overlay
|
||||
devServer.app.use(evalSourceMapMiddleware(devServer));
|
||||
|
||||
if (fs.existsSync(paths.proxySetup)) {
|
||||
// This registers user provided middleware for proxy reasons
|
||||
require(paths.proxySetup)(devServer.app);
|
||||
}
|
||||
},
|
||||
onAfterSetupMiddleware(devServer) {
|
||||
// Redirect to `PUBLIC_URL` or `homepage` from `package.json` if url not match
|
||||
devServer.app.use(redirectServedPath(paths.publicUrlOrPath));
|
||||
|
||||
// This service worker file is effectively a 'no-op' that will reset any
|
||||
// previous service worker registered for the same host:port combination.
|
||||
// We do this in development to avoid hitting the production cache if
|
||||
// it used the same host and port.
|
||||
// https://github.com/facebook/create-react-app/issues/2272#issuecomment-302832432
|
||||
devServer.app.use(noopServiceWorkerMiddleware(paths.publicUrlOrPath));
|
||||
},
|
||||
};
|
||||
};
|
||||
20
gui/index.html
Normal file
20
gui/index.html
Normal file
@@ -0,0 +1,20 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<link rel="icon" href="/favicon.ico" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta name="theme-color" content="#000000" />
|
||||
|
||||
<link rel="apple-touch-icon" href="/logo192.png" />
|
||||
|
||||
<link rel="manifest" href="/manifest.json" />
|
||||
|
||||
<title>React App</title>
|
||||
</head>
|
||||
<body>
|
||||
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||
<div id="root"></div>
|
||||
<script type="module" src="/src/index.tsx"></script>
|
||||
</body>
|
||||
</html>
|
||||
26539
gui/package-lock.json
generated
26539
gui/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
132
gui/package.json
132
gui/package.json
@@ -1,85 +1,57 @@
|
||||
{
|
||||
"name": "slimevr-ui",
|
||||
"version": "0.3.1",
|
||||
"version": "0.5.1",
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.16.0",
|
||||
"@fluent/bundle": "^0.17.1",
|
||||
"@fluent/react": "^0.14.1",
|
||||
"@fontsource/poppins": "^4.5.8",
|
||||
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.3",
|
||||
"@svgr/webpack": "^6.2.1",
|
||||
"@tauri-apps/api": "^1.0.2",
|
||||
"add": "^2.0.6",
|
||||
"babel-jest": "^27.4.2",
|
||||
"babel-loader": "^8.2.3",
|
||||
"babel-plugin-named-asset-import": "^0.3.8",
|
||||
"babel-preset-react-app": "^10.0.1",
|
||||
"bfj": "^7.0.2",
|
||||
"@formatjs/intl-localematcher": "^0.2.32",
|
||||
"@react-three/fiber": "^8.10.0",
|
||||
"@tauri-apps/api": "^1.2.0",
|
||||
"@vitejs/plugin-react": "^3.0.0",
|
||||
"browserslist": "^4.18.1",
|
||||
"camelcase": "^6.2.1",
|
||||
"case-sensitive-paths-webpack-plugin": "^2.4.0",
|
||||
"classnames": "^2.3.1",
|
||||
"css-loader": "^6.5.1",
|
||||
"css-minimizer-webpack-plugin": "^3.2.0",
|
||||
"dotenv": "^10.0.0",
|
||||
"dotenv-expand": "^5.1.0",
|
||||
"eslint-config-react-app": "^7.0.0",
|
||||
"eslint-webpack-plugin": "^3.1.1",
|
||||
"file-loader": "^6.2.0",
|
||||
"flatbuffers": "^22.10.26",
|
||||
"fs-extra": "^10.0.0",
|
||||
"html-webpack-plugin": "^5.5.0",
|
||||
"identity-obj-proxy": "^3.0.0",
|
||||
"intl-pluralrules": "^1.3.1",
|
||||
"ip-num": "^1.4.1",
|
||||
"jest": "^27.4.3",
|
||||
"jest-resolve": "^27.4.2",
|
||||
"jest-watch-typeahead": "^1.0.0",
|
||||
"math3d": "^0.2.2",
|
||||
"mini-css-extract-plugin": "^2.4.5",
|
||||
"postcss": "^8.4.4",
|
||||
"postcss-flexbugs-fixes": "^5.0.2",
|
||||
"postcss-loader": "^6.2.1",
|
||||
"postcss-normalize": "^10.0.1",
|
||||
"postcss-preset-env": "^7.0.1",
|
||||
"prompts": "^2.4.2",
|
||||
"quaternion": "^1.3.0",
|
||||
"react": "^18.0.0",
|
||||
"react-app-polyfill": "^3.0.0",
|
||||
"react-dev-utils": "^12.0.0",
|
||||
"react-dom": "^18.0.0",
|
||||
"react-hook-form": "^7.29.0",
|
||||
"react-modal": "3.15.1",
|
||||
"react-refresh": "^0.11.0",
|
||||
"react-router-dom": "^6.2.2",
|
||||
"resolve": "^1.20.0",
|
||||
"resolve-url-loader": "^4.0.0",
|
||||
"sass-loader": "^12.3.0",
|
||||
"semver": "^7.3.5",
|
||||
"solarxr-protocol": "file:../solarxr-protocol",
|
||||
"source-map-loader": "^3.0.0",
|
||||
"style-loader": "^3.3.1",
|
||||
"tailwindcss": "^3.0.2",
|
||||
"terser-webpack-plugin": "^5.2.5",
|
||||
"typescript": "^4.6.3",
|
||||
"web-vitals": "^2.1.4",
|
||||
"webpack": "^5.64.4",
|
||||
"webpack-dev-server": "^4.6.0",
|
||||
"webpack-manifest-plugin": "^4.0.2",
|
||||
"workbox-webpack-plugin": "^6.4.1"
|
||||
"three": "^0.148.0",
|
||||
"typescript": "^4.6.3"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "cross-env BROWSER=none node scripts/start.js",
|
||||
"build": "node scripts/build.js",
|
||||
"test": "node scripts/test.js",
|
||||
"start": "vite --force",
|
||||
"build": "vite build",
|
||||
"dev": "tauri dev",
|
||||
"skipbundler": "tauri build -b none",
|
||||
"tauri": "tauri",
|
||||
"lint": "eslint src/**/*.{js,jsx,ts,tsx,json}",
|
||||
"lint:fix": "eslint --fix src/**/*.{js,jsx,ts,tsx,json}",
|
||||
"format": "prettier --write src/**/*.{js,jsx,ts,tsx,css,md,json} --config ./.prettierrc"
|
||||
"format": "prettier --write src/**/*.{js,jsx,ts,tsx,css,md,json} --config ./.prettierrc",
|
||||
"preview-vite": "vite preview",
|
||||
"javaversion-build": "cd src-tauri/src/ && javac JavaVersion.java && jar cvfe JavaVersion.jar JavaVersion JavaVersion.class"
|
||||
},
|
||||
"eslintConfig": {
|
||||
"extends": [
|
||||
"react-app",
|
||||
"react-app/jest"
|
||||
"react-app"
|
||||
]
|
||||
},
|
||||
"browserslist": {
|
||||
@@ -96,16 +68,11 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@tailwindcss/forms": "^0.5.0",
|
||||
"@tauri-apps/cli": "^1.0.2",
|
||||
"@testing-library/jest-dom": "^5.16.3",
|
||||
"@testing-library/react": "^13.3.0",
|
||||
"@testing-library/user-event": "^13.5.0",
|
||||
"@types/jest": "^27.4.1",
|
||||
"@types/math3d": "^0.2.3",
|
||||
"@types/node": "^16.11.26",
|
||||
"@tauri-apps/cli": "^1.2.2",
|
||||
"@types/react": "18.0.25",
|
||||
"@types/react-dom": "^18.0.5",
|
||||
"@types/react-modal": "3.13.1",
|
||||
"@types/three": "^0.148.0",
|
||||
"@typescript-eslint/eslint-plugin": "^5.43.0",
|
||||
"@typescript-eslint/parser": "^5.43.0",
|
||||
"autoprefixer": "^10.4.4",
|
||||
@@ -119,67 +86,10 @@
|
||||
"eslint-plugin-prettier": "^4.1.0",
|
||||
"eslint-plugin-react": "^7.30.1",
|
||||
"eslint-plugin-react-hooks": "^4.6.0",
|
||||
"husky": "^8.0.0",
|
||||
"node-polyfill-webpack-plugin": "^1.1.4",
|
||||
"postcss": "^8.4.12",
|
||||
"prettier": "^2.7.1",
|
||||
"pretty-quick": "^3.1.3",
|
||||
"tailwindcss": "^3.0.23"
|
||||
},
|
||||
"jest": {
|
||||
"roots": [
|
||||
"<rootDir>/src"
|
||||
],
|
||||
"collectCoverageFrom": [
|
||||
"src/**/*.{js,jsx,ts,tsx}",
|
||||
"!src/**/*.d.ts"
|
||||
],
|
||||
"setupFiles": [
|
||||
"react-app-polyfill/jsdom"
|
||||
],
|
||||
"setupFilesAfterEnv": [
|
||||
"<rootDir>/src/setupTests.ts"
|
||||
],
|
||||
"testMatch": [
|
||||
"<rootDir>/src/**/__tests__/**/*.{js,jsx,ts,tsx}",
|
||||
"<rootDir>/src/**/*.{spec,test}.{js,jsx,ts,tsx}"
|
||||
],
|
||||
"testEnvironment": "jsdom",
|
||||
"transform": {
|
||||
"^.+\\.(js|jsx|mjs|cjs|ts|tsx)$": "<rootDir>/config/jest/babelTransform.js",
|
||||
"^.+\\.css$": "<rootDir>/config/jest/cssTransform.js",
|
||||
"^(?!.*\\.(js|jsx|mjs|cjs|ts|tsx|css|json)$)": "<rootDir>/config/jest/fileTransform.js"
|
||||
},
|
||||
"transformIgnorePatterns": [
|
||||
"[/\\\\]node_modules[/\\\\].+\\.(js|jsx|mjs|cjs|ts|tsx)$",
|
||||
"^.+\\.module\\.(css|sass|scss)$"
|
||||
],
|
||||
"modulePaths": [],
|
||||
"moduleNameMapper": {
|
||||
"^react-native$": "react-native-web",
|
||||
"^.+\\.module\\.(css|sass|scss)$": "identity-obj-proxy"
|
||||
},
|
||||
"moduleFileExtensions": [
|
||||
"web.js",
|
||||
"js",
|
||||
"web.ts",
|
||||
"ts",
|
||||
"web.tsx",
|
||||
"tsx",
|
||||
"json",
|
||||
"web.jsx",
|
||||
"jsx",
|
||||
"node"
|
||||
],
|
||||
"watchPlugins": [
|
||||
"jest-watch-typeahead/filename",
|
||||
"jest-watch-typeahead/testname"
|
||||
],
|
||||
"resetMocks": true
|
||||
},
|
||||
"babel": {
|
||||
"presets": [
|
||||
"react-app"
|
||||
]
|
||||
"tailwindcss": "^3.0.23",
|
||||
"vite": "^4.0.3"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,4 +3,4 @@ module.exports = {
|
||||
tailwindcss: {},
|
||||
autoprefixer: {},
|
||||
},
|
||||
}
|
||||
};
|
||||
BIN
gui/public/fonts/TwemojiCountryFlags.woff2
Normal file
BIN
gui/public/fonts/TwemojiCountryFlags.woff2
Normal file
Binary file not shown.
520
gui/public/i18n/de/translation.ftl
Normal file
520
gui/public/i18n/de/translation.ftl
Normal file
@@ -0,0 +1,520 @@
|
||||
### 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!
|
||||
# And also comment the string if it's something not easy to translate, so you help
|
||||
# translators on what it means
|
||||
|
||||
## Websocket (server) status
|
||||
websocket-connecting = Verbindung zum Server wird hergestellt...
|
||||
websocket-connection_lost = Verbindung zum Server verloren. Versuche Verbindung wiederherzustellen ...
|
||||
|
||||
## Tips
|
||||
tips-find_tracker = Sie sind sich nicht sicher, welcher Tracker welcher ist? Schütteln Sie einen Tracker, um den zugehörigen Eintrag hervorzuheben.
|
||||
tips-do_not_move_heels = Stellen Sie sicher, dass Sie Ihre Fersen während der Aufnahme nicht bewegen!
|
||||
|
||||
## Body parts
|
||||
body_part-NONE = Nicht zugewiesen
|
||||
body_part-HEAD = Kopf
|
||||
body_part-NECK = Hals
|
||||
body_part-RIGHT_SHOULDER = Rechte Schulter
|
||||
body_part-RIGHT_UPPER_ARM = Rechter Oberarm
|
||||
body_part-RIGHT_LOWER_ARM = Rechter Unterarm
|
||||
body_part-RIGHT_HAND = Rechte Hand
|
||||
body_part-RIGHT_UPPER_LEG = Rechter Oberschenkel
|
||||
body_part-RIGHT_LOWER_LEG = Rechter Unterschenkel
|
||||
body_part-RIGHT_FOOT = Rechter Fuß
|
||||
body_part-RIGHT_CONTROLLER = Rechter Controller
|
||||
body_part-CHEST = Brust
|
||||
body_part-WAIST = Taille
|
||||
body_part-HIP = Hüfte
|
||||
body_part-LEFT_SHOULDER = Linke Schulter
|
||||
body_part-LEFT_UPPER_ARM = Linker Oberarm
|
||||
body_part-LEFT_LOWER_ARM = Linker Unterarm
|
||||
body_part-LEFT_HAND = Linke Hand
|
||||
body_part-LEFT_UPPER_LEG = Linker Oberschenkel
|
||||
body_part-LEFT_LOWER_LEG = Linker Unterschenkel
|
||||
body_part-LEFT_FOOT = Linker Fuß
|
||||
body_part-LEFT_CONTROLLER = Linker Controller
|
||||
|
||||
## Skeleton stuff
|
||||
skeleton_bone-NONE = Keine
|
||||
skeleton_bone-HEAD = Kopfverschiebung
|
||||
skeleton_bone-NECK = Halslänge
|
||||
skeleton_bone-CHEST = Brustabstand
|
||||
skeleton_bone-CHEST_OFFSET = Brustversatz
|
||||
skeleton_bone-WAIST = Taillenabstand
|
||||
skeleton_bone-HIP = Hüftlänge
|
||||
skeleton_bone-HIP_OFFSET = Hüftversatz
|
||||
skeleton_bone-HIPS_WIDTH = Hüftbreite
|
||||
skeleton_bone-UPPER_LEG = Linker Oberschenkellänge
|
||||
skeleton_bone-LOWER_LEG = Linker Unterschenkellänge
|
||||
skeleton_bone-FOOT_LENGTH = Fußlänge
|
||||
skeleton_bone-FOOT_SHIFT = Fußverschiebung
|
||||
skeleton_bone-SKELETON_OFFSET = Skelettversatz
|
||||
skeleton_bone-SHOULDERS_DISTANCE = Schulterentfernung
|
||||
skeleton_bone-SHOULDERS_WIDTH = Schulterbreite
|
||||
skeleton_bone-UPPER_ARM = Oberarmlänge
|
||||
skeleton_bone-LOWER_ARM = Unterarmlänge
|
||||
skeleton_bone-CONTROLLER_Y = Controller Abstand Y
|
||||
skeleton_bone-CONTROLLER_Z = Controller Abstand Z
|
||||
|
||||
## Tracker reset buttons
|
||||
reset-reset_all = Alle Proportionen zurücksetzen
|
||||
reset-full = Reset
|
||||
reset-mounting = Befestigungs-Reset
|
||||
reset-quick = Schneller Reset
|
||||
|
||||
## Serial detection stuff
|
||||
serial_detection-new_device-p0 = Neues serielles Gerät erkannt!
|
||||
serial_detection-new_device-p1 = Geben Sie Ihre WLAN-Zugangsdaten ein!
|
||||
serial_detection-new_device-p2 = Bitte wählen Sie, was Sie damit machen möchten
|
||||
serial_detection-open_wifi = Mit WLAN verbinden
|
||||
serial_detection-open_serial = Serielle Konsole öffnen
|
||||
serial_detection-submit = Absenden!
|
||||
serial_detection-close = Schließen
|
||||
|
||||
## Navigation bar
|
||||
navbar-home = Start
|
||||
navbar-body_proportions = Körpermaße
|
||||
navbar-trackers_assign = Tracker-Zuordnung
|
||||
navbar-mounting = Tracker-Ausrichtung
|
||||
navbar-onboarding = Einrichtungs-Assistent
|
||||
navbar-settings = Einstellungen
|
||||
|
||||
## Bounding volume hierarchy recording
|
||||
bvh-start_recording = BVH aufnehmen
|
||||
bvh-recording = Aufnahme läuft...
|
||||
|
||||
## Overlay settings
|
||||
overlay-is_visible_label = Visualisierungs-Overlay in SteamVR anzeigen
|
||||
overlay-is_mirrored_label = Visualisierung spiegeln
|
||||
|
||||
## Tracker status
|
||||
tracker-status-none = Kein Status
|
||||
tracker-status-busy = Beschäftigt
|
||||
tracker-status-error = Fehler
|
||||
tracker-status-disconnected = Getrennt
|
||||
tracker-status-occluded = Verdeckt
|
||||
tracker-status-ok = Verbunden
|
||||
|
||||
## Tracker status columns
|
||||
tracker-table-column-name = Name
|
||||
tracker-table-column-type = Typ
|
||||
tracker-table-column-battery = Batterie
|
||||
tracker-table-column-ping = Latenz
|
||||
tracker-table-column-rotation = Rotation X/Y/Z
|
||||
tracker-table-column-position = Position X/Y/Z
|
||||
tracker-table-column-url = Adresse
|
||||
|
||||
## Tracker rotation
|
||||
tracker-rotation-front = Vorne
|
||||
tracker-rotation-left = Links
|
||||
tracker-rotation-right = Rechts
|
||||
tracker-rotation-back = Hinten
|
||||
|
||||
## Tracker information
|
||||
tracker-infos-manufacturer = Hersteller
|
||||
tracker-infos-display_name = Anzeigename
|
||||
tracker-infos-custom_name = Benutzerdefinierter Name
|
||||
tracker-infos-url = Tracker-Adresse
|
||||
|
||||
## Tracker settings
|
||||
tracker-settings-back = Zurück zur Tracker-Liste
|
||||
tracker-settings-title = Tracker-Einstellungen
|
||||
tracker-settings-assignment_section = Zuweisung
|
||||
tracker-settings-assignment_section-description = Welcher Körperteil dem Tracker zugewiesen ist.
|
||||
tracker-settings-assignment_section-edit = Zuweisung bearbeiten
|
||||
tracker-settings-mounting_section = Befestigungsposition
|
||||
tracker-settings-mounting_section-description = Wo ist der Tracker befestigt?
|
||||
tracker-settings-mounting_section-edit = Befestigung bearbeiten
|
||||
tracker-settings-drift_compensation_section = Drift-Kompensierung
|
||||
tracker-settings-drift_compensation_section-description = Soll dieser Tracker Drift kompensieren, wenn die Drift-Kompensierung allgemein aktiviert ist?
|
||||
tracker-settings-drift_compensation_section-edit = Erlaube Drift Kompensierung
|
||||
# The .<name> means it's an attribute and it's related to the top key.
|
||||
# In this case that is the settings for the assignment section.
|
||||
tracker-settings-name_section = Trackername
|
||||
tracker-settings-name_section-description = Geben Sie ihm einen süßen Spitznamen :)
|
||||
tracker-settings-name_section-placeholder = NightyBeast's linkes Bein
|
||||
|
||||
## Tracker part card info
|
||||
tracker-part_card-no_name = Kein Name
|
||||
tracker-part_card-unassigned = Nicht zugewiesen
|
||||
|
||||
## Body assignment menu
|
||||
body_assignment_menu = Wo tragen Sie diesen Tracker?
|
||||
body_assignment_menu-description = Wählen Sie die Position aus, an dem Sie diesen Tracker befestigt haben. Alternativ können Sie auch alle Tracker auf einmal verwalten statt einzeln.
|
||||
body_assignment_menu-show_advanced_locations = Zeige erweiterte Tracker-Positionen
|
||||
body_assignment_menu-manage_trackers = Verwalte alle Tracker
|
||||
body_assignment_menu-unassign_tracker = Zuweisung des Trackers aufheben
|
||||
|
||||
## Tracker assignment menu
|
||||
# A -translation_key (with a dash in the front) means that it's a label.
|
||||
# It can only be used in the translation file, it's nice for reusing names and that kind of stuff.
|
||||
#
|
||||
# We are using it here because english doesn't require changing the text in each case but
|
||||
# maybe your language does.
|
||||
-tracker_selection-part = Welcher Tracker soll
|
||||
tracker_selection_menu-NONE = Welchen Tracker möchten Sie zuweisen?
|
||||
tracker_selection_menu-HEAD = { -tracker_selection-part } dem Kopf zugewiesen werden?
|
||||
tracker_selection_menu-NECK = { -tracker_selection-part } dem Nacken zugewiesen werden?
|
||||
tracker_selection_menu-RIGHT_SHOULDER = { -tracker_selection-part } der rechten Schulter zugewiesen werden?
|
||||
tracker_selection_menu-RIGHT_UPPER_ARM = { -tracker_selection-part } dem rechten Oberarm zugewiesen werden?
|
||||
tracker_selection_menu-RIGHT_LOWER_ARM = { -tracker_selection-part } dem rechten Unterarm zugewiesen werden?
|
||||
tracker_selection_menu-RIGHT_HAND = { -tracker_selection-part } der rechten Hand zugewiesen werden?
|
||||
tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } dem rechten Oberschenkel zugewiesen werden?
|
||||
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } dem rechten Unterschenkel zugewiesen werden?
|
||||
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } dem rechten Fuß zugewiesen werden?
|
||||
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } dem rechten Controller zugewiesen werden?
|
||||
tracker_selection_menu-CHEST = { -tracker_selection-part } der Brust zugewiesen werden?
|
||||
tracker_selection_menu-WAIST = { -tracker_selection-part } der Taille zugewiesen werden?
|
||||
tracker_selection_menu-HIP = { -tracker_selection-part } der Hüfte zugewiesen werden?
|
||||
tracker_selection_menu-LEFT_SHOULDER = { -tracker_selection-part } der linken Schulter zugewiesen werden?
|
||||
tracker_selection_menu-LEFT_UPPER_ARM = { -tracker_selection-part } dem linken Oberarm zugewiesen werden?
|
||||
tracker_selection_menu-LEFT_LOWER_ARM = { -tracker_selection-part } dem linken Unterarm zugewiesen werden?
|
||||
tracker_selection_menu-LEFT_HAND = { -tracker_selection-part } der linken Hand zugewiesen werden?
|
||||
tracker_selection_menu-LEFT_UPPER_LEG = { -tracker_selection-part } dem linken Oberschenkel zugewiesen werden?
|
||||
tracker_selection_menu-LEFT_LOWER_LEG = { -tracker_selection-part } dem linken Unterschenkel zugewiesen werden?
|
||||
tracker_selection_menu-LEFT_FOOT = { -tracker_selection-part } dem Linken Fuß zugewiesen zugewiesen werden?
|
||||
tracker_selection_menu-LEFT_CONTROLLER = { -tracker_selection-part } dem linken Controller zugewiesen werden?
|
||||
|
||||
tracker_selection_menu-unassigned = Nicht zugewiesene Tracker
|
||||
tracker_selection_menu-assigned = Zugewiesene Tracker
|
||||
tracker_selection_menu-dont_assign = Nicht zuweisen
|
||||
|
||||
## Mounting menu
|
||||
mounting_selection_menu = Wo möchten Sie diesen Tracker platzieren?
|
||||
mounting_selection_menu-close = Schließen
|
||||
|
||||
## Sidebar settings
|
||||
settings-sidebar-title = Einstellungen
|
||||
settings-sidebar-general = Allgemein
|
||||
settings-sidebar-tracker_mechanics = Tracker-Mechanik
|
||||
settings-sidebar-fk_settings = FK-Einstellungen
|
||||
settings-sidebar-gesture_control = Gestensteuerung
|
||||
settings-sidebar-interface = Bedienoberfläche
|
||||
settings-sidebar-osc_router = OSC-Router
|
||||
settings-sidebar-utils = Werkzeuge
|
||||
settings-sidebar-serial = Serielle Konsole
|
||||
|
||||
## SteamVR settings
|
||||
settings-general-steamvr = SteamVR
|
||||
settings-general-steamvr-subtitle = SteamVR-Tracker
|
||||
# Not all translation keys support multiline, only the ones that specify it will actually
|
||||
# split it in lines (that also means you can split in lines however you want in those).
|
||||
# The first spaces (not tabs) for indentation will be ignored, just to make the file look nice when writing.
|
||||
# This one is one of this cases that cares about multilines
|
||||
settings-general-steamvr-description =
|
||||
Aktivieren oder deaktivieren Sie bestimmte SteamVR-Tracker.
|
||||
Nützlich für Spiele oder Apps, die nur bestimmte Tracker unterstützen.
|
||||
settings-general-steamvr-trackers-waist = Taille
|
||||
settings-general-steamvr-trackers-chest = Brust
|
||||
settings-general-steamvr-trackers-feet = Füße
|
||||
settings-general-steamvr-trackers-knees = Knie
|
||||
settings-general-steamvr-trackers-elbows = Ellbogen
|
||||
settings-general-steamvr-trackers-hands = Hände
|
||||
|
||||
## Tracker mechanics
|
||||
settings-general-tracker_mechanics = Tracker-Verhalten
|
||||
settings-general-tracker_mechanics-filtering = Filtern
|
||||
# This also cares about multilines
|
||||
settings-general-tracker_mechanics-filtering-description =
|
||||
Wählen Sie den Filter-Typ für Ihre Tracker aus.
|
||||
Vorhersage: prognostiziert Bewegung. Glättung: Bewegung werden geglättet.
|
||||
settings-general-tracker_mechanics-filtering-type = Filter-Typ
|
||||
settings-general-tracker_mechanics-filtering-type-none = Kein Filter
|
||||
settings-general-tracker_mechanics-filtering-type-none-description = Verwendet die unveränderten Rotationsdaten der Tracker.
|
||||
settings-general-tracker_mechanics-filtering-type-smoothing = Glättung
|
||||
settings-general-tracker_mechanics-filtering-type-smoothing-description = Glättet Bewegungen, fügt aber etwas Verzögerung hinzu.
|
||||
settings-general-tracker_mechanics-filtering-type-prediction = Vorhersage
|
||||
settings-general-tracker_mechanics-filtering-type-prediction-description = Verringert die Latenz und macht die Bewegungen schneller, kann aber Zittern erhöhen.
|
||||
settings-general-tracker_mechanics-filtering-amount = Stärke
|
||||
settings-general-tracker_mechanics-drift_compensation = Drift-Kompensierung
|
||||
# This cares about multilines
|
||||
settings-general-tracker_mechanics-drift_compensation-description =
|
||||
Kompensiert IMU Drift auf der Gier-Achse durch Anwenden einer invertierten Rotation.
|
||||
Ändern Sie die Menge der Kompensierung und die Anzahl der Resets, welche für die Berechnung genutzt werden.
|
||||
settings-general-tracker_mechanics-drift_compensation-enabled-label = Drift-Kompensierung
|
||||
settings-general-tracker_mechanics-drift_compensation-amount-label = Kompensierungsmenge
|
||||
settings-general-tracker_mechanics-drift_compensation-max_resets-label = Nutze die letzten x Resets
|
||||
|
||||
## FK/Tracking settings
|
||||
settings-general-fk_settings = FK-Einstellungen
|
||||
settings-general-fk_settings-leg_tweak = Beinoptimierungen
|
||||
settings-general-fk_settings-leg_tweak-description = Bodenclip kann das einsinken in den Boden reduzieren oder sogar beseitigen, kann aber beim Knien Probleme verursachen. Die Rutsch-Korrektur verringert das Rutschen auf dem Boden, kann aber bei bestimmten Bewegungsmustern die Genauigkeit verringern.
|
||||
# Floor clip:
|
||||
# why the name - came from the idea of noclip in video games, but is the opposite where clipping to the floor is a desired feature
|
||||
# definition - Prevents the foot trackers from going lower than they where when a reset was performed
|
||||
settings-general-fk_settings-leg_tweak-floor_clip = Bodenclip
|
||||
# Skating correction:
|
||||
# why the name - without this enabled the feet will often slide across the ground as if your skating across the ground,
|
||||
# since this largely prevents this it corrects for it hence skating correction (note this may be renamed to sliding correction)
|
||||
# definition - Guesses when each foot is in contact with the ground and uses that information to improve tracking
|
||||
settings-general-fk_settings-leg_tweak-skating_correction = Rutschkorrektur
|
||||
settings-general-fk_settings-leg_tweak-skating_correction-amount = Rutschkorrekturstärke
|
||||
settings-general-fk_settings-arm_fk = Arm-Tracking
|
||||
settings-general-fk_settings-arm_fk-description = Ändern Sie die Art und Weise, wie die Arme berechnet werden.
|
||||
settings-general-fk_settings-arm_fk-force_arms = Arme vom VR-Headset erzwingen
|
||||
settings-general-fk_settings-skeleton_settings = Skeletteinstellungen
|
||||
settings-general-fk_settings-skeleton_settings-description = Schalten Sie Skeletteinstellungen ein oder aus. Es wird empfohlen, diese eingeschaltet zu lassen.
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine = Erweiterte Wirbelsäule
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis = Erweiterter Beckenbereich
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees = Erweiterte Knie
|
||||
settings-general-fk_settings-vive_emulation-title = Vive-Simulierung
|
||||
settings-general-fk_settings-vive_emulation-description = Simuliere die Tracking-Probleme, welche bei Vive-Trackern auftreten. Dies ist ein Scherz und verschlechtert das Tracking.
|
||||
settings-general-fk_settings-vive_emulation-label = Vive-Simulierung
|
||||
|
||||
## Gesture control settings (tracker tapping)
|
||||
settings-general-gesture_control = Gestensteuerung
|
||||
settings-general-gesture_control-subtitle = Reset durch Antippen
|
||||
settings-general-gesture_control-description = Erlaubt Reset durch das Antippen eines Trackers auszulösen. Der höchste Tracker auf dem Oberkörper wird für schnelle Resets genutzt, der höchste Tracker auf dem linken Bein wird für Reset genutzt und der höchste Tracker auf dem rechten Bein wird für Befestigungs-Reset genutzt. Das Antippen muss innerhalb von 0.5 Sekunden erfolgen, um erkannt zu werden.
|
||||
# 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-mal antippen
|
||||
*[other] { $amount }-mal antippen
|
||||
}
|
||||
settings-general-gesture_control-quickResetEnabled = Antippen für schnellen Reset
|
||||
settings-general-gesture_control-quickResetDelay = Verzögerung für schnellen Reset
|
||||
settings-general-gesture_control-quickResetTaps = Anzahl für schnellen Reset
|
||||
settings-general-gesture_control-resetEnabled = Antippen für Reset
|
||||
settings-general-gesture_control-resetDelay = Reset-Verzögerung
|
||||
settings-general-gesture_control-resetTaps = Anzahl für Reset
|
||||
settings-general-gesture_control-mountingResetEnabled = Antippen für Befestigungs-Reset
|
||||
settings-general-gesture_control-mountingResetDelay = Befestigungs-Reset-Verzügerung
|
||||
settings-general-gesture_control-mountingResetTaps = Anzahl für Befestigungs-Reset
|
||||
|
||||
## Interface settings
|
||||
settings-general-interface = Bedienoberfläche
|
||||
settings-general-interface-dev_mode = Entwicklermodus
|
||||
settings-general-interface-dev_mode-description = Der Entwicklermodus stellt mehr Daten dar und erlaubt auch erweiterte Einstellungen, so wie erweiterte Optionen bei verbundenen Trackern.
|
||||
settings-general-interface-dev_mode-label = Entwicklermodus
|
||||
settings-general-interface-serial_detection = Serielle Geräteerkennung
|
||||
settings-general-interface-serial_detection-description = Diese Option zeigt jedes Mal ein Pop-up-Fenster an, wenn ein neues serielles Gerät angeschlossen wird, das ein Tracker sein könnte. Dies hilft beim Einrichtungsprozess des Trackers
|
||||
settings-general-interface-serial_detection-label = Serielle Geräteerkennung
|
||||
settings-general-interface-lang = Sprachauswahl
|
||||
settings-general-interface-lang-description = Ändern Sie die Standard-Sprache, die Sie verwenden möchten
|
||||
settings-general-interface-lang-placeholder = Wählen Sie die zu verwendende Sprache aus
|
||||
|
||||
## Serial settings
|
||||
settings-serial = Serielle Konsole
|
||||
# This cares about multilines
|
||||
settings-serial-description =
|
||||
Dies ist ein Live-Ansicht der seriellen Kommunikation.
|
||||
Diese ist zur Unterstützung bei der Problemsuche mit Trackern.
|
||||
settings-serial-connection_lost = Verbindung zur seriellen Schnittstelle verloren, Verbindung wird wiederhergestellt...
|
||||
settings-serial-reboot = Neustart
|
||||
settings-serial-factory_reset = Werkseinstellungen zurücksetzen
|
||||
settings-serial-get_infos = Informationen abrufen
|
||||
settings-serial-serial_select = Wählen Sie einen seriellen Anschluss
|
||||
settings-serial-auto_dropdown_item = Auto
|
||||
|
||||
## OSC router settings
|
||||
settings-osc-router = OSC Router
|
||||
# This cares about multilines
|
||||
settings-osc-router-description =
|
||||
Senden von OSC Daten an ein andere Programm.
|
||||
Nützlich wenn z.B. ein anderes OSC Programm zusammen mit VRChat verwendet wird.
|
||||
settings-osc-router-enable = Aktivieren
|
||||
settings-osc-router-enable-description = Ein- und Ausschalten des Sendens und Empfangen von Daten
|
||||
settings-osc-router-enable-label = Aktivieren
|
||||
settings-osc-router-network = Netzwerk-Ports
|
||||
# This cares about multilines
|
||||
settings-osc-router-network-description =
|
||||
Setzte die Ports zum Empfangen und Versenden von Daten.
|
||||
Diese können die selben Ports sein, welche vom SlimeVR Server verwendet werden.
|
||||
settings-osc-router-network-port_in =
|
||||
.label = Eingangsport
|
||||
.placeholder = Eingangsport (Standard: 9002)
|
||||
settings-osc-router-network-port_out =
|
||||
.label = Ausgangsport
|
||||
.placeholder = Ausgangsport (Standard: 9000)
|
||||
settings-osc-router-network-address = Netzwerk-Adresse
|
||||
settings-osc-router-network-address-description = Setze die Adresse, welche zum versenden von Daten genutzt wird.
|
||||
settings-osc-router-network-address-placeholder = IPv4 Adresse
|
||||
|
||||
## OSC VRChat settings
|
||||
settings-osc-vrchat = VRChat-OSC-Trackers
|
||||
# This cares about multilines
|
||||
settings-osc-vrchat-description =
|
||||
Ändern Sie VRChat-spezifische Einstellungen, um Headset- und Tracker-Daten für FBT zu empfangen und zu senden (funktioniert auch im Standalone-Modus auf der Meta Quest).
|
||||
settings-osc-vrchat-enable = Aktivieren
|
||||
settings-osc-vrchat-enable-description = Ein- und Ausschalten des Sendens und Empfangen von Daten
|
||||
settings-osc-vrchat-enable-label = Aktivieren
|
||||
settings-osc-vrchat-network = Netzwerk-Ports
|
||||
settings-osc-vrchat-network-description = Festlegen der Ports zum Empfangen und Senden von Daten an VRChat
|
||||
settings-osc-vrchat-network-port_in =
|
||||
.label = Eingangsport
|
||||
.placeholder = Eingangsport (Standard: 9001)
|
||||
settings-osc-vrchat-network-port_out =
|
||||
.label = Ausgangsport
|
||||
.placeholder = Ausgangsport (Standard: 9000)
|
||||
settings-osc-vrchat-network-address = Netzwerkadresse
|
||||
settings-osc-vrchat-network-address-description = Wählen Sie, an welche Adresse die Daten an VRChat gesendet werden sollen (überprüfen Sie Ihre WLAN-Einstellungen auf Ihrem Gerät)
|
||||
settings-osc-vrchat-network-address-placeholder = VRChat-IP-Adresse
|
||||
settings-osc-vrchat-network-trackers = Tracker
|
||||
settings-osc-vrchat-network-trackers-description = Ein- und Ausschalten des Sendens und Empfangens von Daten
|
||||
settings-osc-vrchat-network-trackers-chest = Brust
|
||||
settings-osc-vrchat-network-trackers-waist = Taille
|
||||
settings-osc-vrchat-network-trackers-knees = Knie
|
||||
settings-osc-vrchat-network-trackers-feet = Füße
|
||||
settings-osc-vrchat-network-trackers-elbows = Ellbogen
|
||||
|
||||
## Setup/onboarding menu
|
||||
onboarding-skip = Einrichtung überspringen
|
||||
onboarding-continue = Fortsetzen
|
||||
onboarding-wip = Noch in Bearbeitung
|
||||
|
||||
## WiFi setup
|
||||
onboarding-wifi_creds-back = Zurück zur Einführung
|
||||
onboarding-wifi_creds = WLAN-Zugangsdaten eingeben
|
||||
# This cares about multilines
|
||||
onboarding-wifi_creds-description =
|
||||
Die Tracker nutzen diese Zugangsdaten, um sich mit dem WLAN zu verbinden.
|
||||
Bitte verwenden Sie die Zugangsdaten, mit denen ihr PC gerade verbunden sind.
|
||||
Dieses WLAN-Netzwerk muss ein 2.4 GHz-Netzwerk sein.
|
||||
onboarding-wifi_creds-skip = WLAN-Zugangsdaten überspringen
|
||||
onboarding-wifi_creds-submit = Weiter!
|
||||
onboarding-wifi_creds-ssid =
|
||||
.label = SSID
|
||||
.placeholder = SSID eingeben
|
||||
onboarding-wifi_creds-password =
|
||||
.label = Passwort
|
||||
.placeholder = Passwort eingeben
|
||||
|
||||
## Mounting setup
|
||||
onboarding-reset_tutorial-back = Zurück zur Trackerausrichtung
|
||||
onboarding-reset_tutorial = Tutorial neustarten
|
||||
onboarding-reset_tutorial-description = Diese Funktion ist noch nicht fertig, drücken Sie einfach auf Fortsetzen
|
||||
|
||||
## Setup start
|
||||
onboarding-home = Willkommen zu SlimeVR
|
||||
# This cares about multilines and it's centered!!
|
||||
onboarding-home-description =
|
||||
VR-Fullbody Tracking
|
||||
für alle
|
||||
onboarding-home-start = Los geht’s!
|
||||
|
||||
## Enter VR part of setup
|
||||
onboarding-enter_vr-back = Zurück zur Trackerzuweisung
|
||||
onboarding-enter_vr-title = Zeit für VR!
|
||||
onboarding-enter_vr-description = Ziehen Sie alle Tracker an und betreten Sie dann VR!
|
||||
onboarding-enter_vr-ready = Ich bin bereit!
|
||||
|
||||
## Setup done
|
||||
onboarding-done-title = Alles eingerichtet!
|
||||
onboarding-done-description = Genießen Sie die Fullbody-Erfahrung
|
||||
onboarding-done-close = Einrichtung schließen
|
||||
|
||||
## Tracker connection setup
|
||||
onboarding-connect_tracker-back = Zurück zu WLAN-Zugangsdaten
|
||||
onboarding-connect_tracker-title = Verbinde Tracker
|
||||
onboarding-connect_tracker-description-p0 = Nun zum unterhaltsamen Teil, verbinde alle Tracker!
|
||||
onboarding-connect_tracker-description-p1 = Verbinden Sie einfach alle Tracker, die noch nicht verbunden sind, über einen USB-Anschluss.
|
||||
onboarding-connect_tracker-issue-serial = Ich habe Schwierigkeiten die Tracker zu verbinden!
|
||||
onboarding-connect_tracker-usb = USB Tracker
|
||||
onboarding-connect_tracker-connection_status-connecting = Sende WLAN-Zugangsdaten
|
||||
onboarding-connect_tracker-connection_status-connected = Mit WLAN verbunden
|
||||
onboarding-connect_tracker-connection_status-error = Kann nicht mit WLAN verbinden
|
||||
onboarding-connect_tracker-connection_status-start_connecting = Suche nach Trackern
|
||||
onboarding-connect_tracker-connection_status-handshake = Mit dem Server verbunden
|
||||
# $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] Kein Tracker
|
||||
[one] 1 Tracker
|
||||
*[other] { $amount } Tracker
|
||||
} verbunden
|
||||
onboarding-connect_tracker-next = Ich habe alle meine Tracker verbunden.
|
||||
|
||||
## Tracker assignment setup
|
||||
onboarding-assign_trackers-back = Zurück zu den WLAN-Zugangsdaten
|
||||
onboarding-assign_trackers-title = Tracker zuweisen
|
||||
onboarding-assign_trackers-description = Wählen Sie nun aus, welcher Tracker wo befestigt ist. Klicken Sie auf einen Ort, an dem der Tracker platziert ist.
|
||||
# Look at translation of onboarding-connect_tracker-connected_trackers on how to use plurals
|
||||
# $assigned (Number) - Trackers that have been assigned a body part
|
||||
# $trackers (Number) - Trackers connected to the server
|
||||
onboarding-assign_trackers-assigned = { $assigned } von { $trackers ->
|
||||
[one] 1 Tracker
|
||||
*[other] { $trackers } Tracker
|
||||
} zugewiesen
|
||||
onboarding-assign_trackers-advanced = Erweiterte Zuweisungspositionen anzeigen
|
||||
onboarding-assign_trackers-next = Ich habe alle Tracker zugewiesen
|
||||
|
||||
## Tracker manual mounting setup
|
||||
onboarding-manual_mounting-back = Zurück zum Eintritt in VR
|
||||
onboarding-manual_mounting = Manuelle Definition der Befestigungsposition
|
||||
onboarding-manual_mounting-description = Klicken Sie auf jeden Tracker und wählen Sie aus, in welche Richtung diese montiert sind
|
||||
onboarding-manual_mounting-auto_mounting = Drehung automatisch ermitteln
|
||||
onboarding-manual_mounting-next = Nächster Schritt
|
||||
|
||||
## Tracker automatic mounting setup
|
||||
onboarding-automatic_mounting-back = Zurück zum Eintritt in VR
|
||||
onboarding-automatic_mounting-title = Kalibrierung der Tracker-Befestigung/Rotation
|
||||
onboarding-automatic_mounting-description = Damit die SlimeVR-Tracker korrekt funktionieren, müssen wir ihnen eine Drehung zuweisen, welche der Drehung entspricht wie diese befestigt sind.
|
||||
onboarding-automatic_mounting-manual_mounting = Drehung manuell einstellen
|
||||
onboarding-automatic_mounting-next = Nächster Schritt
|
||||
onboarding-automatic_mounting-prev_step = Vorheriger Schritt
|
||||
onboarding-automatic_mounting-done-title = Tracker Rotation kalibriert.
|
||||
onboarding-automatic_mounting-done-description = Ihre Rotations-Kalibrierung ist abgeschlossen!
|
||||
onboarding-automatic_mounting-done-restart = Zurück zum Start
|
||||
onboarding-automatic_mounting-mounting_reset-title = Drehungs-Reset
|
||||
onboarding-automatic_mounting-mounting_reset-step-0 = 1. Beugen Sie sich in die "Skifahren"-Pose mit gebeugten Beinen, geneigtem Oberkörper und gebeugten Armen.
|
||||
onboarding-automatic_mounting-mounting_reset-step-1 = 2. Drücken Sie die Schaltfläche "Befestigungs-Reset" und warten Sie 3 Sekunden, bevor die Drehungen der Tracker gesetzt werden.
|
||||
onboarding-automatic_mounting-preparation-title = Vorbereitung
|
||||
onboarding-automatic_mounting-preparation-step-0 = 1. Stehen Sie aufrecht mit Ihren Armen an den Seiten.
|
||||
onboarding-automatic_mounting-preparation-step-1 = 2. Drücken Sie die Schaltfläche "Reset" und warten Sie 3 Sekunden, bevor die Tracker zurückgesetzt werden.
|
||||
onboarding-automatic_mounting-put_trackers_on-title = Legen Sie Ihre Tracker an
|
||||
onboarding-automatic_mounting-put_trackers_on-description = Um die Drehung der Tracker zu kalibrieren, werden die Tracker verwendet, welche Sie gerade zugewiesen haben. Ziehen Sie alle Ihre Tracker an, in der Abbildung rechts können sie sehen um welchen Tracker es sich handelt.
|
||||
onboarding-automatic_mounting-put_trackers_on-next = Ich habe alle meine Tracker angelegt
|
||||
|
||||
## Tracker manual proportions setup
|
||||
onboarding-manual_proportions-back = Gehen Sie zurück zum Reset-Tutorial
|
||||
onboarding-manual_proportions-title = Manuelle Körperproportionen
|
||||
onboarding-manual_proportions-precision = Feinanpassung
|
||||
onboarding-manual_proportions-auto = Automatische Kalibrierung
|
||||
|
||||
## Tracker automatic proportions setup
|
||||
onboarding-automatic_proportions-back = Gehen Sie zurück zum Reset-Tutorial
|
||||
onboarding-automatic_proportions-title = Messen Sie Ihre Proportionen
|
||||
onboarding-automatic_proportions-description = Damit die SlimeVR-Tracker funktionieren, müssen wir Ihre Proportionen kennen. Diese kurze Kalibrierung wird sie für Sie messen.
|
||||
onboarding-automatic_proportions-manual = Manuelle Kalibrierung
|
||||
onboarding-automatic_proportions-prev_step = Vorheriger Schritt
|
||||
onboarding-automatic_proportions-put_trackers_on-title = Legen Sie Ihre Tracker an
|
||||
onboarding-automatic_proportions-put_trackers_on-description = Um Ihre Proportionen zu kalibrieren, werden wir die Tracker verwenden, die Sie gerade zugewiesen haben. Legen Sie alle Ihre Tracker an. Sie können rechts in der Abbildung sehen, welche welche sind.
|
||||
onboarding-automatic_proportions-put_trackers_on-next = Ich habe alle meine Tracker angelegt
|
||||
onboarding-automatic_proportions-preparation-title = Vorbereitung
|
||||
onboarding-automatic_proportions-preparation-description = Stellen Sie einen Stuhl direkt hinter Ihnen in Ihrem Spielbereich. Seien Sie bereit, während der Autobone-Einrichtung zu sitzen.
|
||||
onboarding-automatic_proportions-preparation-next = Ich stehe vor einem Stuhl
|
||||
onboarding-automatic_proportions-start_recording-title = Bereiten Sie sich auf ein paar Bewegungen vor
|
||||
onboarding-automatic_proportions-start_recording-description = Wir werden nun einige bestimmte Posen und Bewegungen aufnehmen. Diese werden im nächsten Bildschirm angezeigt. Bereiten Sie sicht darauf vor, wenn Sie den Knopf drücken!
|
||||
onboarding-automatic_proportions-start_recording-next = Aufnahme starten
|
||||
onboarding-automatic_proportions-recording-title = Aufnahme
|
||||
onboarding-automatic_proportions-recording-description-p0 = Aufnahme läuft...
|
||||
onboarding-automatic_proportions-recording-description-p1 = Machen Sie die unten beschriebenen Bewegungen:
|
||||
onboarding-automatic_proportions-recording-steps-0 = Beuge ein paar Mal die Knie.
|
||||
onboarding-automatic_proportions-recording-steps-1 = Bitte setzen Sie sich auf den Stuhl und stehen Sie wieder auf.
|
||||
onboarding-automatic_proportions-recording-steps-2 = Drehe den oberen Körper nach links, dann beuge dich nach rechts.
|
||||
onboarding-automatic_proportions-recording-steps-3 = Drehe den oberen Körper nach rechts, dann beuge dich nach links.
|
||||
onboarding-automatic_proportions-recording-steps-4 = Bewege dich, bis die Zeit abgelaufen ist.
|
||||
onboarding-automatic_proportions-recording-processing = Aufnahme wird verarbeitet...
|
||||
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 15)
|
||||
onboarding-automatic_proportions-recording-timer = { $time ->
|
||||
[one] 1 Sekunde verbleibend
|
||||
*[other] { $time } Sekunden verbleibend
|
||||
}
|
||||
onboarding-automatic_proportions-verify_results-title = Ergebnisse überprüfen
|
||||
onboarding-automatic_proportions-verify_results-description = Überprüfe die Ergebnisse unten, sehen sie korrekt aus?
|
||||
onboarding-automatic_proportions-verify_results-results = Aufnahme-Ergebnisse
|
||||
onboarding-automatic_proportions-verify_results-processing = Ergebnis wird bearbeitet
|
||||
onboarding-automatic_proportions-verify_results-redo = Aufnahme wiederholen
|
||||
onboarding-automatic_proportions-verify_results-confirm = Ergebnisse sind korrekt
|
||||
onboarding-automatic_proportions-done-title = Körper gemessen und gespeichert.
|
||||
onboarding-automatic_proportions-done-description = Deine Körperproportionen-Kalibrierung ist abgeschlossen!
|
||||
|
||||
## Home
|
||||
home-no_trackers = Keine Tracker erkannt oder zugewiesen
|
||||
|
||||
540
gui/public/i18n/en-x-owo/translation.ftl
Normal file
540
gui/public/i18n/en-x-owo/translation.ftl
Normal file
@@ -0,0 +1,540 @@
|
||||
### 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!
|
||||
# And also comment the string if it's something not easy to translate, so you help
|
||||
# translators on what it means
|
||||
|
||||
## Websocket (server) status
|
||||
websocket-connecting = weconnyecting to teh sewvew
|
||||
websocket-connection_lost = oopsie woopsie~ connyection wost to teh sewvew ;m;... uwu am twying to weconnyect owo!
|
||||
|
||||
## Tips
|
||||
tips-find_tracker = nawt suwe whicsh twayckyaw is whicsh? shayke a twackaw and it will hyighwight the cowowesponding iytem.
|
||||
tips-do_not_move_heels = ensuwe yoowr pawsies do nawt mowve duwing wecowding! ^w^
|
||||
|
||||
## Body parts
|
||||
body_part-NONE = unassyigned
|
||||
body_part-HEAD = hed
|
||||
body_part-NECK = nyecky wecky
|
||||
body_part-RIGHT_SHOULDER = wight shouwder~
|
||||
body_part-RIGHT_UPPER_ARM = wight uppew awm
|
||||
body_part-RIGHT_LOWER_ARM = wight wowwe awm
|
||||
body_part-RIGHT_HAND = wight pawb
|
||||
body_part-RIGHT_UPPER_LEG = wight uppew weg
|
||||
body_part-RIGHT_LOWER_LEG = wight wowwe weg
|
||||
body_part-RIGHT_FOOT = wight pawb
|
||||
body_part-RIGHT_CONTROLLER = wight wontwolew
|
||||
body_part-CHEST = chwest
|
||||
body_part-WAIST = wyayst
|
||||
body_part-HIP = hyip
|
||||
body_part-LEFT_SHOULDER = weft shouwder~
|
||||
body_part-LEFT_UPPER_ARM = weft uppew awm
|
||||
body_part-LEFT_LOWER_ARM = weft wowwe awm
|
||||
body_part-LEFT_HAND = weft pawb
|
||||
body_part-LEFT_UPPER_LEG = weft uppew weg
|
||||
body_part-LEFT_LOWER_LEG = weft wowwe weg
|
||||
body_part-LEFT_FOOT = weft pawb
|
||||
body_part-LEFT_CONTROLLER = weft wontwolew
|
||||
|
||||
## Proportions
|
||||
skeleton_bone-NONE = none
|
||||
skeleton_bone-HEAD = hed shyft
|
||||
skeleton_bone-NECK = nyeck wength
|
||||
skeleton_bone-CHEST = chwest wength
|
||||
skeleton_bone-CHEST_OFFSET = chwest awfset
|
||||
skeleton_bone-WAIST = weyst wength
|
||||
skeleton_bone-HIP = hip wength
|
||||
skeleton_bone-HIP_OFFSET = hyip awfset
|
||||
skeleton_bone-HIPS_WIDTH = hyips wiwdth
|
||||
skeleton_bone-UPPER_LEG = uppor weg wength
|
||||
skeleton_bone-LOWER_LEG = lowur weg wength
|
||||
skeleton_bone-FOOT_LENGTH = pawsies wength
|
||||
skeleton_bone-FOOT_SHIFT = pawsies shyft
|
||||
skeleton_bone-SKELETON_OFFSET = skeweton awfset
|
||||
skeleton_bone-SHOULDERS_DISTANCE = shouwdews disyance
|
||||
skeleton_bone-SHOULDERS_WIDTH = shouwdews wiwdth
|
||||
skeleton_bone-UPPER_ARM = uppew awm wength
|
||||
skeleton_bone-LOWER_ARM = fowewawm disyance
|
||||
skeleton_bone-CONTROLLER_Y = cyontwowla disance y
|
||||
skeleton_bone-CONTROLLER_Z = cyontwowla disance z
|
||||
skeleton_bone-ELBOW_OFFSET = ewbow awfsewt
|
||||
|
||||
## Tracker reset buttons
|
||||
reset-reset_all = weset aww pwopowtions~
|
||||
reset-full = weset~
|
||||
reset-mounting = weset meownting
|
||||
reset-quick = quick weset
|
||||
|
||||
## Serial detection stuff
|
||||
serial_detection-new_device-p0 = nyu sewiaw device detected~!
|
||||
serial_detection-new_device-p1 = entaw youw wi-fi cwedentiaws~!
|
||||
serial_detection-new_device-p2 = pwease sewect what youw want to do wit it
|
||||
serial_detection-open_wifi = cownnyect to wyfy~
|
||||
serial_detection-open_serial = awpen sewiaw console >w<
|
||||
serial_detection-submit = suwbmyt~!
|
||||
serial_detection-close = cwose
|
||||
|
||||
## Navigation bar
|
||||
navbar-home = howme
|
||||
navbar-body_proportions = body pwopowshons
|
||||
navbar-trackers_assign = twackaws assigwment
|
||||
navbar-mounting = meownting calibwation
|
||||
navbar-onboarding = suwep wisawd
|
||||
navbar-settings = sewtings
|
||||
|
||||
## Bounding volume hierarchy recording
|
||||
bvh-start_recording = wecowd bvh
|
||||
bvh-recording = wecowding...
|
||||
|
||||
## Widget: Overlay settings
|
||||
widget-overlay = owovelay
|
||||
widget-overlay-is_visible_label = show owovelay in steawmvr
|
||||
widget-overlay-is_mirrored_label = dispway owovelay as miwwow
|
||||
|
||||
## Widget: Developer settings
|
||||
widget-developer_mode = devwowwewow mode
|
||||
widget-developer_mode-high_contrast = high contwast
|
||||
widget-developer_mode-precise_rotation = pwecise wotation
|
||||
widget-developer_mode-fast_data_feed = fast data feed
|
||||
widget-developer_mode-filter_slimes_and_hmd = fiwtew swimes a-and HMD
|
||||
widget-developer_mode-sort_by_name = sowt by nyame
|
||||
widget-developer_mode-raw_slime_rotation = waw wotation
|
||||
widget-developer_mode-more_info = mowe info
|
||||
|
||||
## Widget: IMU Visualizer
|
||||
widget-imu_visualizer = wotation
|
||||
widget-imu_visualizer-rotation_raw = waw
|
||||
widget-imu_visualizer-rotation_preview = pwewiew
|
||||
|
||||
## Tracker status
|
||||
tracker-status-none = no stawtus
|
||||
tracker-status-busy = busy
|
||||
tracker-status-error = ewwow
|
||||
tracker-status-disconnected = disconnyected
|
||||
tracker-status-occluded = occwuded
|
||||
tracker-status-ok = oki
|
||||
|
||||
## Tracker status columns
|
||||
tracker-table-column-name = nayme
|
||||
tracker-table-column-type = type
|
||||
tracker-table-column-battery = battewy
|
||||
tracker-table-column-ping = pyng
|
||||
tracker-table-column-tps = tps
|
||||
tracker-table-column-temperature = temp. °C
|
||||
tracker-table-column-linear-acceleration = accew. X/Y/Z
|
||||
tracker-table-column-rotation = wotaytion x/y/z
|
||||
tracker-table-column-position = pawsytion x/y/z
|
||||
tracker-table-column-url = uawl
|
||||
|
||||
## Tracker rotation
|
||||
tracker-rotation-front = fwowt
|
||||
tracker-rotation-left = lewft
|
||||
tracker-rotation-right = wight
|
||||
tracker-rotation-back = bak
|
||||
|
||||
## Tracker information
|
||||
tracker-infos-manufacturer = mawufactuwer
|
||||
tracker-infos-display_name = dispway name
|
||||
tracker-infos-custom_name = custowm name
|
||||
tracker-infos-url = twackaw uawl
|
||||
|
||||
## Tracker settings
|
||||
tracker-settings-back = go bak to twackaws liwst
|
||||
tracker-settings-title = twackaw sewtings
|
||||
tracker-settings-assignment_section = assiwnment
|
||||
tracker-settings-assignment_section-description = what pawt of the bawdy the twackaw is assiwned to uwu
|
||||
tracker-settings-assignment_section-edit = ewdit assiwnment
|
||||
tracker-settings-mounting_section = meownting pawsition
|
||||
tracker-settings-mounting_section-description = whewe is the twackaw mownted?
|
||||
tracker-settings-mounting_section-edit = edit meownting
|
||||
tracker-settings-drift_compensation_section = awwow dwift compensation
|
||||
tracker-settings-drift_compensation_section-description = shouwd this twackew compensate fow its dwift when dwift compensation is enabwed?
|
||||
tracker-settings-drift_compensation_section-edit = awwow dwift compensation
|
||||
# The .<name> means it's an attribute and it's related to the top key.
|
||||
# In this case that is the settings for the assignment section.
|
||||
tracker-settings-name_section = twackaw name
|
||||
tracker-settings-name_section-description = owo whats dis?
|
||||
tracker-settings-name_section-placeholder = ewimewl's weft pawb
|
||||
|
||||
## Tracker part card info
|
||||
tracker-part_card-no_name = no name
|
||||
tracker-part_card-unassigned = unassigwed
|
||||
|
||||
## Body assignment menu
|
||||
body_assignment_menu = whewe doo yew want dis twayckaw to be?? >~>
|
||||
body_assignment_menu-description = chooce a wocation whewe yew want dis twayckaw to be assyigned. awtwernativewy, yew can chooce to manage awl twackaws at ownce instawd of won by won.
|
||||
body_assignment_menu-show_advanced_locations = show advawnced assyign wocations
|
||||
body_assignment_menu-manage_trackers = manage awl twackaws
|
||||
body_assignment_menu-unassign_tracker = unassyign twayckaw
|
||||
|
||||
## Tracker assignment menu
|
||||
# A -translation_key (with a dash in the front) means that it's a label.
|
||||
# It can only be used in the translation file, it's nice for reusing names and that kind of stuff.
|
||||
#
|
||||
# We are using it here because english doesn't require changing the text in each case but
|
||||
# maybe your language does.
|
||||
-tracker_selection-part = Which tracker to assign to your
|
||||
tracker_selection_menu-NONE = Which tracker do you want to be unassigned?
|
||||
tracker_selection_menu-HEAD = { -tracker_selection-part } head?
|
||||
tracker_selection_menu-NECK = { -tracker_selection-part } neck?
|
||||
tracker_selection_menu-RIGHT_SHOULDER = { -tracker_selection-part } right shoulder?
|
||||
tracker_selection_menu-RIGHT_UPPER_ARM = { -tracker_selection-part } right upper arm?
|
||||
tracker_selection_menu-RIGHT_LOWER_ARM = { -tracker_selection-part } right lower arm?
|
||||
tracker_selection_menu-RIGHT_HAND = { -tracker_selection-part } right hand?
|
||||
tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } right thigh?
|
||||
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } right ankle?
|
||||
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } right foot?
|
||||
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } right controller?
|
||||
tracker_selection_menu-CHEST = { -tracker_selection-part } chest?
|
||||
tracker_selection_menu-WAIST = { -tracker_selection-part } waist?
|
||||
tracker_selection_menu-HIP = { -tracker_selection-part } hip?
|
||||
tracker_selection_menu-LEFT_SHOULDER = { -tracker_selection-part } left shoulder?
|
||||
tracker_selection_menu-LEFT_UPPER_ARM = { -tracker_selection-part } left upper arm?
|
||||
tracker_selection_menu-LEFT_LOWER_ARM = { -tracker_selection-part } left lower arm?
|
||||
tracker_selection_menu-LEFT_HAND = { -tracker_selection-part } left hand?
|
||||
tracker_selection_menu-LEFT_UPPER_LEG = { -tracker_selection-part } left thigh?
|
||||
tracker_selection_menu-LEFT_LOWER_LEG = { -tracker_selection-part } left ankle?
|
||||
tracker_selection_menu-LEFT_FOOT = { -tracker_selection-part } left foot?
|
||||
tracker_selection_menu-LEFT_CONTROLLER = { -tracker_selection-part } left controller?
|
||||
|
||||
tracker_selection_menu-unassigned = unassyigned twackaws
|
||||
tracker_selection_menu-assigned = assyigned twackaws
|
||||
tracker_selection_menu-dont_assign = do nawt assyign
|
||||
|
||||
## Mounting menu
|
||||
mounting_selection_menu = whewe doo yew want dis twayckaw to be?
|
||||
mounting_selection_menu-close = cwose
|
||||
|
||||
## Sidebar settings
|
||||
settings-sidebar-title = settyings~
|
||||
settings-sidebar-general = genyawaw
|
||||
settings-sidebar-tracker_mechanics = twayckaw mechanics~
|
||||
settings-sidebar-fk_settings = fk settyings
|
||||
settings-sidebar-gesture_control = Gesture control
|
||||
settings-sidebar-interface = intyawface~
|
||||
settings-sidebar-osc_router = OSC wouwter
|
||||
settings-sidebar-utils = utiwities
|
||||
settings-sidebar-serial = sewiaw cownsaw
|
||||
|
||||
## SteamVR settings
|
||||
settings-general-steamvr = steamvr~
|
||||
settings-general-steamvr-subtitle = steamvr twayckaws~
|
||||
# Not all translation keys support multiline, only the ones that specify it will actually
|
||||
# split it in lines (that also means you can split in lines however you want in those).
|
||||
# The first spaces (not tabs) for indentation will be ignored, just to make the file look nice when writing.
|
||||
# This one is one of this cases that cares about multilines
|
||||
settings-general-steamvr-description =
|
||||
enyable or dysabywe specific twacking pawts.
|
||||
usefuw if yew want mowwe contwoww owew what swimevr does.
|
||||
settings-general-steamvr-trackers-waist = wyayst~
|
||||
settings-general-steamvr-trackers-chest = chwest~
|
||||
settings-general-steamvr-trackers-feet = pweets~
|
||||
settings-general-steamvr-trackers-knees = knyees~
|
||||
settings-general-steamvr-trackers-elbows = ewbows~
|
||||
settings-general-steamvr-trackers-hands = pawbsies~
|
||||
|
||||
## Tracker mechanics
|
||||
settings-general-tracker_mechanics = twayckaw mechanics~
|
||||
settings-general-tracker_mechanics-filtering = fiwtering~
|
||||
# This also cares about multilines
|
||||
settings-general-tracker_mechanics-filtering-description =
|
||||
chooce teh fiwwtewing type fow youw twackaws.
|
||||
pwediction pwedicts movment while smowthing smowthens movment.
|
||||
settings-general-tracker_mechanics-filtering-type = fiwtewing type~
|
||||
settings-general-tracker_mechanics-filtering-type-none = no fiwwtewing~
|
||||
settings-general-tracker_mechanics-filtering-type-none-description = use wowtations as is. wiw nawt do any fiwwtewing.
|
||||
settings-general-tracker_mechanics-filtering-type-smoothing = smowthing
|
||||
settings-general-tracker_mechanics-filtering-type-smoothing-description = smowthes movements but adds some watency~
|
||||
settings-general-tracker_mechanics-filtering-type-prediction = pwediction~
|
||||
settings-general-tracker_mechanics-filtering-type-prediction-description = wowduces wowcyancy and makes wowvements mowe wowappy, but may incwease jiwitty
|
||||
settings-general-tracker_mechanics-filtering-amount = amownt
|
||||
settings-general-tracker_mechanics-drift_compensation = dwift compensation
|
||||
# This cares about multilines
|
||||
settings-general-tracker_mechanics-drift_compensation-description =
|
||||
compensates imu yaw dwift by appwying an invewse wotation.
|
||||
change amownt of compensation and how many wesets awe taken into accouwnt.
|
||||
settings-general-tracker_mechanics-drift_compensation-enabled-label = dwift compensation
|
||||
settings-general-tracker_mechanics-drift_compensation-amount-label = compensation amownt
|
||||
settings-general-tracker_mechanics-drift_compensation-max_resets-label = nuwmbew of wesets uwsed
|
||||
|
||||
## FK/Tracking settings
|
||||
settings-general-fk_settings = fk sewttings
|
||||
settings-general-fk_settings-leg_tweak = leg tweeks
|
||||
settings-general-fk_settings-leg_tweak-description = floo-cwip can wowduce owow even ewiminates cwipping with teh fwoor but may cause pwobweems when on yowur neeys. skayting-cowwection cowwects fow wowce skating, but can wowcyancy accuwowacy in cewtain wowvement wowttewns.
|
||||
# Floor clip:
|
||||
# why the name - came from the idea of noclip in video games, but is the opposite where clipping to the floor is a desired feature
|
||||
# definition - Prevents the foot trackers from going lower than they where when a reset was performed
|
||||
settings-general-fk_settings-leg_tweak-floor_clip = fwoow cwip
|
||||
# Skating correction:
|
||||
# why the name - without this enabled the feet will often slide across the ground as if your skating across the ground,
|
||||
# since this largely prevents this it corrects for it hence skating correction (note this may be renamed to sliding correction)
|
||||
# definition - Guesses when each foot is in contact with the ground and uses that information to improve tracking
|
||||
settings-general-fk_settings-leg_tweak-skating_correction = skayting wowcowwection
|
||||
settings-general-fk_settings-leg_tweak-skating_correction-amount = skawting cowwection stwength
|
||||
settings-general-fk_settings-arm_fk = awm fk
|
||||
settings-general-fk_settings-arm_fk-description = chawnge teh way teh awms awe twacked.
|
||||
settings-general-fk_settings-arm_fk-force_arms = fowce awms fwom hmd
|
||||
settings-general-fk_settings-arm_fk-i_pose = uwse i powse insted of t powse
|
||||
settings-general-fk_settings-skeleton_settings = skeweton sewttings
|
||||
settings-general-fk_settings-skeleton_settings-description = toggwe skeweton sewttings on owow off. is wowcommended to weawve these on~
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine = ewtended spine
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis = ewtended pelvis
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees = ewtended neey
|
||||
settings-general-fk_settings-vive_emulation-title = vive emuwation
|
||||
settings-general-fk_settings-vive_emulation-description = emuwate the waist twackew pwobwems that vive twackews hawe. tis is a jowke and mawkes twacking wowse eheh ^^
|
||||
settings-general-fk_settings-vive_emulation-label = enabwe vive emuwation
|
||||
|
||||
## Gesture control settings (tracker tapping)
|
||||
settings-general-gesture_control = gestauw cantwol
|
||||
settings-general-gesture_control-subtitle = bap bwased wesets
|
||||
settings-general-gesture_control-description = allaws owr wesets wo be twiggered by wapping a twackaw. The twackaw hyighest wup on youwur twursuu is uwued for qwick weset, wa twackaw hyighest up on youwur weft weg is uwused for weset, and teh twackaw hyighest up on youwur wight weg is used for mmountwing weset. It showold we wentioned what waps muwst happen within 0.6 seconds wo be wegistered
|
||||
# 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 bap
|
||||
*[other] { $amount } baps
|
||||
}
|
||||
settings-general-gesture_control-quickResetEnabled = enable wap to quwuick weset
|
||||
settings-general-gesture_control-quickResetDelay = quwuick weset deway
|
||||
settings-general-gesture_control-quickResetTaps = baps for quwuick weset
|
||||
settings-general-gesture_control-resetEnabled = enable wap to weset
|
||||
settings-general-gesture_control-resetDelay = weset deway
|
||||
settings-general-gesture_control-resetTaps = baps for weset
|
||||
settings-general-gesture_control-mountingResetEnabled = enable wap to weset mountwing
|
||||
settings-general-gesture_control-mountingResetDelay = mountwing weset deway
|
||||
settings-general-gesture_control-mountingResetTaps = baps for mountwing weset
|
||||
|
||||
## Interface settings
|
||||
settings-general-interface = intewface
|
||||
settings-general-interface-dev_mode = devwowwewow mode
|
||||
settings-general-interface-dev_mode-description = this mode can be wowseffuw if you need in-dipth data owow to intewact with cownnected twackaws on a wowowe wowadvanced wowwevew
|
||||
settings-general-interface-dev_mode-label = devwowwewow mode
|
||||
settings-general-interface-serial_detection = shewyaw device deteccion
|
||||
settings-general-interface-serial_detection-description = this option will shaww a pawp-up evewy time yuw pwug a new shewyaw device that cawwld be a twayckaw. it helps iympwooving teh setup pwocess of a twayckaw
|
||||
settings-general-interface-serial_detection-label = shewyaw device deteccion
|
||||
settings-general-interface-lang = sewect wanguage
|
||||
settings-general-interface-lang-description = change the defawwt wanguage yuw want to use
|
||||
settings-general-interface-lang-placeholder = sewect teh wanguage to use
|
||||
|
||||
## Serial settings
|
||||
settings-serial = shewyaw console
|
||||
# This cares about multilines
|
||||
settings-serial-description =
|
||||
this is a wiwve infowmation feed fow shewyaw comyunicaytion
|
||||
may be usefuw if yuw need to know teh fiwmwawe is acting up
|
||||
settings-serial-connection_lost = connyection to shewyaw wost, weconnyecting... >~<
|
||||
settings-serial-reboot = weboot
|
||||
settings-serial-factory_reset = fawctowy reset
|
||||
settings-serial-get_infos = get infows
|
||||
settings-serial-serial_select = sewect a shewyaw pawt
|
||||
settings-serial-auto_dropdown_item = awto
|
||||
|
||||
## OSC router settings
|
||||
settings-osc-router = OSC wouwter
|
||||
# This cares about multilines
|
||||
settings-osc-router-description =
|
||||
fowwawd osc messages fwom anothew pwogwam
|
||||
usefuww fow uwsing anothew osc pwogwam with VRChat fow exampwe
|
||||
settings-osc-router-enable = enaybwe
|
||||
settings-osc-router-enable-description = toggle teh fowwawding of data
|
||||
settings-osc-router-enable-label = enaybwe
|
||||
settings-osc-router-network = network pawts
|
||||
# This cares about multilines
|
||||
settings-osc-router-network-description =
|
||||
set the pawts fow wistening awnd sending data
|
||||
these can be the same as othew powts uwsed in the swimevr sewvew
|
||||
settings-osc-router-network-port_in =
|
||||
.label = pawt in
|
||||
.placeholder = pawt in (defawwt: 9002)
|
||||
settings-osc-router-network-port_out =
|
||||
.label = pawt out
|
||||
.placeholder = pawt out (defawwt: 9000)
|
||||
settings-osc-router-network-address = network addwess
|
||||
settings-osc-router-network-address-description = choose which addwess to send out data at
|
||||
settings-osc-router-network-address-placeholder = IPV4 addwess
|
||||
|
||||
## OSC VRChat settings
|
||||
settings-osc-vrchat = VRChat OSC Trackers
|
||||
# This cares about multilines
|
||||
settings-osc-vrchat-description =
|
||||
change vwchat-specific settwings to wweceive hmd data awnd send
|
||||
twayckaws data fow fbt (wawwks on quest standalone).
|
||||
settings-osc-vrchat-enable = enaybwe
|
||||
settings-osc-vrchat-enable-description = toggle teh sending awnd wweceiving of data
|
||||
settings-osc-vrchat-enable-label = enaybwe
|
||||
settings-osc-vrchat-network = network pawts
|
||||
settings-osc-vrchat-network-description = set the pawts fow wistening awnd sending data to vwchawt
|
||||
settings-osc-vrchat-network-port_in =
|
||||
.label = pawt in
|
||||
.placeholder = pawt in (defawwt: 9001)
|
||||
settings-osc-vrchat-network-port_out =
|
||||
.label = pawt out
|
||||
.placeholder = pawt out (defawwt: 9000)
|
||||
settings-osc-vrchat-network-address = network addwess
|
||||
settings-osc-vrchat-network-address-description = choose which addwess to send out data to vwchat (check yuw wi-fi settwings on yuw device)
|
||||
settings-osc-vrchat-network-address-placeholder = vwchat ip addwess
|
||||
settings-osc-vrchat-network-trackers = trayckawws
|
||||
settings-osc-vrchat-network-trackers-description = toggle teh sending of spweciwic twackers viwa OSC
|
||||
settings-osc-vrchat-network-trackers-chest = chwest~
|
||||
settings-osc-vrchat-network-trackers-waist = wyayst~
|
||||
settings-osc-vrchat-network-trackers-knees = knyees~
|
||||
settings-osc-vrchat-network-trackers-feet = pweets~
|
||||
settings-osc-vrchat-network-trackers-elbows = ewbows~
|
||||
|
||||
## Setup/onboarding menu
|
||||
onboarding-skip = skipy setup
|
||||
onboarding-continue = continyue
|
||||
onboarding-wip = wowwk in pwowgress
|
||||
|
||||
## Wi-Fi setup
|
||||
onboarding-wifi_creds-back = gaww bawwk to intwoduction
|
||||
onboarding-wifi_creds = input wi-fi cwedentials
|
||||
# This cares about multilines
|
||||
onboarding-wifi_creds-description =
|
||||
teh twawckaws will use these cwedentials to connect wirelessly
|
||||
pwease use teh cwedentials that yaww awe cwowently cownyected to
|
||||
onboarding-wifi_creds-skip = skipy wi-fi settiwyngs
|
||||
onboarding-wifi_creds-submit = suwbmyt!
|
||||
onboarding-wifi_creds-ssid =
|
||||
.label = wi-fi nawme
|
||||
.placeholder = entew wi-fi nawme
|
||||
onboarding-wifi_creds-password =
|
||||
.label = passwowod
|
||||
.placeholder = entew passwowod
|
||||
|
||||
## Mounting setup
|
||||
onboarding-reset_tutorial-back = gaww bawwk to meownting cawwibwation
|
||||
onboarding-reset_tutorial = weset tutowial
|
||||
onboarding-reset_tutorial-description = dis featuwe isn't done, just pwess continyue
|
||||
|
||||
## Setup start
|
||||
onboarding-home = wewcome to swimevr
|
||||
# This cares about multilines and it's centered!!
|
||||
onboarding-home-description =
|
||||
bwinging fuww-bawdy twacking
|
||||
to everyone
|
||||
onboarding-home-start = wets get set up!
|
||||
|
||||
## Enter VR part of setup
|
||||
onboarding-enter_vr-back = gaww bawwk to twacker assignyment
|
||||
onboarding-enter_vr-title = time to entew vr!
|
||||
onboarding-enter_vr-description = put on awe yoaww twackaws and then entew vr!
|
||||
onboarding-enter_vr-ready = iym ready
|
||||
|
||||
## Setup done
|
||||
onboarding-done-title = yaww awe awe set!
|
||||
onboarding-done-description = enjoy yoaww fuww body expewwience
|
||||
onboarding-done-close = cwose the guide
|
||||
|
||||
## Tracker connection setup
|
||||
onboarding-connect_tracker-back = gaww bawwk to wi-fi cwedentials
|
||||
onboarding-connect_tracker-title = connect twackaws
|
||||
onboarding-connect_tracker-description-p0 = now onto teh fun pawwt, connecting awe teh twackaws!
|
||||
onboarding-connect_tracker-description-p1 = simply connect awe that awe nawt cownyected yet, through a usb powwt.
|
||||
onboarding-connect_tracker-issue-serial = i'm having twouble connecting!
|
||||
onboarding-connect_tracker-usb = usb twacker
|
||||
onboarding-connect_tracker-connection_status-connecting = sending wi-fi cwedentials
|
||||
onboarding-connect_tracker-connection_status-connected = cownyected to wi-fi
|
||||
onboarding-connect_tracker-connection_status-error = unabwe to cownyect to wi-fi
|
||||
onboarding-connect_tracker-connection_status-start_connecting = wooking for twackaws
|
||||
onboarding-connect_tracker-connection_status-handshake = cownyected to teh sewvew
|
||||
# $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] no twackers
|
||||
[one] 1 twackers
|
||||
*[other] { $amount } twackers
|
||||
} cownyected
|
||||
onboarding-connect_tracker-next = i cownyected awe my twackaws
|
||||
|
||||
## Tracker assignment setup
|
||||
onboarding-assign_trackers-back = go bak to wi-fi credyentials
|
||||
onboarding-assign_trackers-title = assign twackaws
|
||||
onboarding-assign_trackers-description = wets choyse which twackaw goes whewe. cwick on a wocation whewe yowo want to payce a twackaw
|
||||
# Look at translation of onboarding-connect_tracker-connected_trackers on how to use plurals
|
||||
# $assigned (Number) - Trackers that have been assigned a body part
|
||||
# $trackers (Number) - Trackers connected to the server
|
||||
onboarding-assign_trackers-assigned = { $assigned } of { $trackers ->
|
||||
[one] 1 twackaws
|
||||
*[other] { $trackers } twackaws
|
||||
} assigned
|
||||
onboarding-assign_trackers-advanced = show advanced assign wocations
|
||||
onboarding-assign_trackers-next = i assigned awe the twackaws
|
||||
|
||||
## Tracker manual mounting setup
|
||||
onboarding-manual_mounting-back = go bak to entaw vawe
|
||||
onboarding-manual_mounting = manual meownting
|
||||
onboarding-manual_mounting-description = cwick on evewy twackaw and sewect which way they awe mownted
|
||||
onboarding-manual_mounting-auto_mounting = awtomawic meownting
|
||||
onboarding-manual_mounting-next = newt stewp
|
||||
|
||||
## Tracker automatic mounting setup
|
||||
onboarding-automatic_mounting-back = go bak to entaw vawe
|
||||
onboarding-automatic_mounting-title = meownting cawibwation
|
||||
onboarding-automatic_mounting-description = fow SlimeVR twackaws to wowk, we need to assign a meownting wowation to yowo twackaws to awign them with yowo pwysical twackaw mounting.
|
||||
onboarding-automatic_mounting-manual_mounting = manually set meownting
|
||||
onboarding-automatic_mounting-next = next step
|
||||
onboarding-automatic_mounting-prev_step = pwevious step
|
||||
onboarding-automatic_mounting-done-title = mounting wowations cawibwated.
|
||||
onboarding-automatic_mounting-done-description = yowo meownting cawibwation is compwete!
|
||||
onboarding-automatic_mounting-done-restart = weturn to start
|
||||
onboarding-automatic_mounting-mounting_reset-title = meownting weset
|
||||
onboarding-automatic_mounting-mounting_reset-step-0 = 1. squawt in a "skiing" pose with yowo wegs bent, yowo upper body tilted fowwawds, and yowo awems bent.
|
||||
onboarding-automatic_mounting-mounting_reset-step-1 = 2. pwess the "weset meownting" button and wait fow 3 seconds befowe the twackaws' meownting wowations will weset.
|
||||
onboarding-automatic_mounting-preparation-title = pwepairation
|
||||
onboarding-automatic_mounting-preparation-step-0 = 1. stand upwight with yowo awems to yowo sides.
|
||||
onboarding-automatic_mounting-preparation-step-1 = 2. pwess the "weset" button and wait fow 3 seconds befowe the twackaws will weset.
|
||||
onboarding-automatic_mounting-put_trackers_on-title = put on yowo twackaws
|
||||
onboarding-automatic_mounting-put_trackers_on-description = to cawibwate meownting wowations, we'we gonna use the twackaws yowo just assigned. put on awe yowo twackaws, yowo can see which awe which in the figure to the wowight.
|
||||
onboarding-automatic_mounting-put_trackers_on-next = i haff awe my twackaws on
|
||||
|
||||
## Tracker manual proportions setup
|
||||
onboarding-manual_proportions-back = go bawck to weset tutowiaw
|
||||
onboarding-manual_proportions-title = manyuaw bodee pwopowtiesions
|
||||
onboarding-manual_proportions-precision = pwecision adjusty
|
||||
onboarding-manual_proportions-auto = owtomatic cawybwation
|
||||
|
||||
## Tracker automatic proportions setup
|
||||
onboarding-automatic_proportions-back = go bawck to weweset tutowiaw
|
||||
onboarding-automatic_proportions-title = measuwe yowuw bodee
|
||||
onboarding-automatic_proportions-description = fow swimevw twackaws to wowk, we need to know teh wowkty of yowuw bones. dis showt cawybwation will measuwe it fow yowu
|
||||
onboarding-automatic_proportions-manual = manyuaw cawybwation
|
||||
onboarding-automatic_proportions-prev_step = pwevious stwep
|
||||
onboarding-automatic_proportions-put_trackers_on-title = put on yowuw twackaws
|
||||
onboarding-automatic_proportions-put_trackers_on-description = to cawybwate yowuw pwopowtiesions, we'we gonna use teh twackaws yowu just assigned. put on awl yowuw twackaws, yowu can see which awe which in teh figuwe to teh wowight.
|
||||
onboarding-automatic_proportions-put_trackers_on-next = i have awl my twackaws on
|
||||
onboarding-automatic_proportions-preparation-title = pwepawation
|
||||
onboarding-automatic_proportions-preparation-description = pwace a chayaw diwectly behind yowu inside yowuw pway spawce. be pwepawed to sit down duwing teh owtobone setyup.
|
||||
onboarding-automatic_proportions-preparation-next = i am in fwont of a chayaw
|
||||
onboarding-automatic_proportions-start_recording-title = get wowdy to move
|
||||
onboarding-automatic_proportions-start_recording-description = we'we now going to wowcawd some specific poses and moves. these will be pwompted in teh wowst screen. be wowdy to stawt when teh buttawn is pwessed!
|
||||
onboarding-automatic_proportions-start_recording-next = stawt wowcawding
|
||||
onboarding-automatic_proportions-recording-title = wowcawd
|
||||
onboarding-automatic_proportions-recording-description-p0 = wowcawding in pwowgress...
|
||||
onboarding-automatic_proportions-recording-description-p1 = make teh moves shown bowow:
|
||||
onboarding-automatic_proportions-recording-steps-0 = bend knees a few times.
|
||||
onboarding-automatic_proportions-recording-steps-1 = sit on a chayaw then stawnd up.
|
||||
onboarding-automatic_proportions-recording-steps-2 = twist upwe wowdy wowft, then bend wowft.
|
||||
onboarding-automatic_proportions-recording-steps-3 = twist upwe wowdy wowight, then bend wowight.
|
||||
onboarding-automatic_proportions-recording-steps-4 = wiggy aweound until tymey ends.
|
||||
onboarding-automatic_proportions-recording-processing = pwowcessing teh wowesult
|
||||
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 15)
|
||||
onboarding-automatic_proportions-recording-timer = { $time ->
|
||||
[one] 1 second wowft
|
||||
*[other] { $time } secondsy wowft
|
||||
}
|
||||
onboarding-automatic_proportions-verify_results-title = vewify wowesults
|
||||
onboarding-automatic_proportions-verify_results-description = check teh wewesults below, do tehy weok coowect?
|
||||
onboarding-automatic_proportions-verify_results-results = wecowding wewesults
|
||||
onboarding-automatic_proportions-verify_results-processing = pwocessing teh wewesult
|
||||
onboarding-automatic_proportions-verify_results-redo = wedo wecowding
|
||||
onboarding-automatic_proportions-verify_results-confirm = tehywee coowect
|
||||
onboarding-automatic_proportions-done-title = bawdy meowsured anwd sayved uwu
|
||||
onboarding-automatic_proportions-done-description = yoww body pwopowwtions cawybowwation is cowowplete! ^w^
|
||||
|
||||
## Home
|
||||
home-no_trackers = no twackaws detecyted owo wowigned
|
||||
540
gui/public/i18n/en/translation.ftl
Normal file
540
gui/public/i18n/en/translation.ftl
Normal file
@@ -0,0 +1,540 @@
|
||||
### 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!
|
||||
# And also comment the string if it's something not easy to translate, so you help
|
||||
# translators on what it means
|
||||
|
||||
## Websocket (server) status
|
||||
websocket-connecting = Connecting to the server
|
||||
websocket-connection_lost = Connection lost to the server. Trying to reconnect...
|
||||
|
||||
## Tips
|
||||
tips-find_tracker = Not sure which tracker is which? Shake a tracker and it will highlight the corresponding item.
|
||||
tips-do_not_move_heels = Ensure your heels do not move during recording!
|
||||
|
||||
## Body parts
|
||||
body_part-NONE = Unassigned
|
||||
body_part-HEAD = Head
|
||||
body_part-NECK = Neck
|
||||
body_part-RIGHT_SHOULDER = Right shoulder
|
||||
body_part-RIGHT_UPPER_ARM = Right upper arm
|
||||
body_part-RIGHT_LOWER_ARM = Right lower arm
|
||||
body_part-RIGHT_HAND = Right hand
|
||||
body_part-RIGHT_UPPER_LEG = Right thigh
|
||||
body_part-RIGHT_LOWER_LEG = Right ankle
|
||||
body_part-RIGHT_FOOT = Right foot
|
||||
body_part-RIGHT_CONTROLLER = Right controller
|
||||
body_part-CHEST = Chest
|
||||
body_part-WAIST = Waist
|
||||
body_part-HIP = Hip
|
||||
body_part-LEFT_SHOULDER = Left shoulder
|
||||
body_part-LEFT_UPPER_ARM = Left upper arm
|
||||
body_part-LEFT_LOWER_ARM = Left lower arm
|
||||
body_part-LEFT_HAND = Left hand
|
||||
body_part-LEFT_UPPER_LEG = Left thigh
|
||||
body_part-LEFT_LOWER_LEG = Left ankle
|
||||
body_part-LEFT_FOOT = Left foot
|
||||
body_part-LEFT_CONTROLLER = Left controller
|
||||
|
||||
## Proportions
|
||||
skeleton_bone-NONE = None
|
||||
skeleton_bone-HEAD = Head Shift
|
||||
skeleton_bone-NECK = Neck Length
|
||||
skeleton_bone-CHEST = Chest Length
|
||||
skeleton_bone-CHEST_OFFSET = Chest Offset
|
||||
skeleton_bone-WAIST = Waist Length
|
||||
skeleton_bone-HIP = Hip Length
|
||||
skeleton_bone-HIP_OFFSET = Hip Offset
|
||||
skeleton_bone-HIPS_WIDTH = Hips Width
|
||||
skeleton_bone-UPPER_LEG = Upper Leg Length
|
||||
skeleton_bone-LOWER_LEG = Lower Leg Length
|
||||
skeleton_bone-FOOT_LENGTH = Foot Length
|
||||
skeleton_bone-FOOT_SHIFT = Foot Shift
|
||||
skeleton_bone-SKELETON_OFFSET = Skeleton Offset
|
||||
skeleton_bone-SHOULDERS_DISTANCE = Shoulders Distance
|
||||
skeleton_bone-SHOULDERS_WIDTH = Shoulders Width
|
||||
skeleton_bone-UPPER_ARM = Upper Arm Length
|
||||
skeleton_bone-LOWER_ARM = Lower Arm Length
|
||||
skeleton_bone-CONTROLLER_Y = Controller Distance Y
|
||||
skeleton_bone-CONTROLLER_Z = Controller Distance Z
|
||||
skeleton_bone-ELBOW_OFFSET = Elbow Offset
|
||||
|
||||
## Tracker reset buttons
|
||||
reset-reset_all = Reset all proportions
|
||||
reset-full = Reset
|
||||
reset-mounting = Reset Mounting
|
||||
reset-quick = Quick Reset
|
||||
|
||||
## Serial detection stuff
|
||||
serial_detection-new_device-p0 = New serial device detected!
|
||||
serial_detection-new_device-p1 = Enter your Wi-Fi credentials!
|
||||
serial_detection-new_device-p2 = Please select what you want to do with it
|
||||
serial_detection-open_wifi = Connect to Wi-Fi
|
||||
serial_detection-open_serial = Open Serial Console
|
||||
serial_detection-submit = Submit!
|
||||
serial_detection-close = Close
|
||||
|
||||
## Navigation bar
|
||||
navbar-home = Home
|
||||
navbar-body_proportions = Body Proportions
|
||||
navbar-trackers_assign = Tracker Assignment
|
||||
navbar-mounting = Mounting Calibration
|
||||
navbar-onboarding = Setup Wizard
|
||||
navbar-settings = Settings
|
||||
|
||||
## Bounding volume hierarchy recording
|
||||
bvh-start_recording = Record BVH
|
||||
bvh-recording = Recording...
|
||||
|
||||
## Widget: Overlay settings
|
||||
widget-overlay = Overlay
|
||||
widget-overlay-is_visible_label = Show Overlay in SteamVR
|
||||
widget-overlay-is_mirrored_label = Display Overlay as Mirror
|
||||
|
||||
## Widget: Developer settings
|
||||
widget-developer_mode = Developer Mode
|
||||
widget-developer_mode-high_contrast = High contrast
|
||||
widget-developer_mode-precise_rotation = Precise rotation
|
||||
widget-developer_mode-fast_data_feed = Fast data feed
|
||||
widget-developer_mode-filter_slimes_and_hmd = Filter slimes and HMD
|
||||
widget-developer_mode-sort_by_name = Sort by name
|
||||
widget-developer_mode-raw_slime_rotation = Raw rotation
|
||||
widget-developer_mode-more_info = More info
|
||||
|
||||
## Widget: IMU Visualizer
|
||||
widget-imu_visualizer = Rotation
|
||||
widget-imu_visualizer-rotation_raw = Raw
|
||||
widget-imu_visualizer-rotation_preview = Preview
|
||||
|
||||
## Tracker status
|
||||
tracker-status-none = No Status
|
||||
tracker-status-busy = Busy
|
||||
tracker-status-error = Error
|
||||
tracker-status-disconnected = Disconnected
|
||||
tracker-status-occluded = Occluded
|
||||
tracker-status-ok = OK
|
||||
|
||||
## Tracker status columns
|
||||
tracker-table-column-name = Name
|
||||
tracker-table-column-type = Type
|
||||
tracker-table-column-battery = Battery
|
||||
tracker-table-column-ping = Ping
|
||||
tracker-table-column-tps = TPS
|
||||
tracker-table-column-temperature = Temp. °C
|
||||
tracker-table-column-linear-acceleration = Accel. X/Y/Z
|
||||
tracker-table-column-rotation = Rotation X/Y/Z
|
||||
tracker-table-column-position = Position X/Y/Z
|
||||
tracker-table-column-url = URL
|
||||
|
||||
## Tracker rotation
|
||||
tracker-rotation-front = Front
|
||||
tracker-rotation-left = Left
|
||||
tracker-rotation-right = Right
|
||||
tracker-rotation-back = Back
|
||||
|
||||
## Tracker information
|
||||
tracker-infos-manufacturer = Manufacturer
|
||||
tracker-infos-display_name = Display Name
|
||||
tracker-infos-custom_name = Custom Name
|
||||
tracker-infos-url = Tracker URL
|
||||
|
||||
## Tracker settings
|
||||
tracker-settings-back = Go back to trackers list
|
||||
tracker-settings-title = Tracker settings
|
||||
tracker-settings-assignment_section = Assignment
|
||||
tracker-settings-assignment_section-description = What part of the body the tracker is assigned to.
|
||||
tracker-settings-assignment_section-edit = Edit assignment
|
||||
tracker-settings-mounting_section = Mounting position
|
||||
tracker-settings-mounting_section-description = Where is the tracker mounted?
|
||||
tracker-settings-mounting_section-edit = Edit mounting
|
||||
tracker-settings-drift_compensation_section = Allow drift compensation
|
||||
tracker-settings-drift_compensation_section-description = Should this tracker compensate for its drift when drift compensation is enabled?
|
||||
tracker-settings-drift_compensation_section-edit = Allow drift compensation
|
||||
# The .<name> means it's an attribute and it's related to the top key.
|
||||
# In this case that is the settings for the assignment section.
|
||||
tracker-settings-name_section = Tracker name
|
||||
tracker-settings-name_section-description = Give it a cute nickname :)
|
||||
tracker-settings-name_section-placeholder = NightyBeast's left leg
|
||||
|
||||
## Tracker part card info
|
||||
tracker-part_card-no_name = No name
|
||||
tracker-part_card-unassigned = Unassigned
|
||||
|
||||
## Body assignment menu
|
||||
body_assignment_menu = Where do you want this tracker to be?
|
||||
body_assignment_menu-description = Choose a location where you want this tracker to be assigned. Alternatively you can choose to manage all trackers at once instead of one by one.
|
||||
body_assignment_menu-show_advanced_locations = Show advanced assign locations
|
||||
body_assignment_menu-manage_trackers = Manage all trackers
|
||||
body_assignment_menu-unassign_tracker = Unassign tracker
|
||||
|
||||
## Tracker assignment menu
|
||||
# A -translation_key (with a dash in the front) means that it's a label.
|
||||
# It can only be used in the translation file, it's nice for reusing names and that kind of stuff.
|
||||
#
|
||||
# We are using it here because english doesn't require changing the text in each case but
|
||||
# maybe your language does.
|
||||
-tracker_selection-part = Which tracker to assign to your
|
||||
tracker_selection_menu-NONE = Which tracker do you want to be unassigned?
|
||||
tracker_selection_menu-HEAD = { -tracker_selection-part } head?
|
||||
tracker_selection_menu-NECK = { -tracker_selection-part } neck?
|
||||
tracker_selection_menu-RIGHT_SHOULDER = { -tracker_selection-part } right shoulder?
|
||||
tracker_selection_menu-RIGHT_UPPER_ARM = { -tracker_selection-part } right upper arm?
|
||||
tracker_selection_menu-RIGHT_LOWER_ARM = { -tracker_selection-part } right lower arm?
|
||||
tracker_selection_menu-RIGHT_HAND = { -tracker_selection-part } right hand?
|
||||
tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } right thigh?
|
||||
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } right ankle?
|
||||
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } right foot?
|
||||
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } right controller?
|
||||
tracker_selection_menu-CHEST = { -tracker_selection-part } chest?
|
||||
tracker_selection_menu-WAIST = { -tracker_selection-part } waist?
|
||||
tracker_selection_menu-HIP = { -tracker_selection-part } hip?
|
||||
tracker_selection_menu-LEFT_SHOULDER = { -tracker_selection-part } left shoulder?
|
||||
tracker_selection_menu-LEFT_UPPER_ARM = { -tracker_selection-part } left upper arm?
|
||||
tracker_selection_menu-LEFT_LOWER_ARM = { -tracker_selection-part } left lower arm?
|
||||
tracker_selection_menu-LEFT_HAND = { -tracker_selection-part } left hand?
|
||||
tracker_selection_menu-LEFT_UPPER_LEG = { -tracker_selection-part } left thigh?
|
||||
tracker_selection_menu-LEFT_LOWER_LEG = { -tracker_selection-part } left ankle?
|
||||
tracker_selection_menu-LEFT_FOOT = { -tracker_selection-part } left foot?
|
||||
tracker_selection_menu-LEFT_CONTROLLER = { -tracker_selection-part } left controller?
|
||||
|
||||
tracker_selection_menu-unassigned = Unassigned Trackers
|
||||
tracker_selection_menu-assigned = Assigned Trackers
|
||||
tracker_selection_menu-dont_assign = Do not assign
|
||||
|
||||
## Mounting menu
|
||||
mounting_selection_menu = Where do you want this tracker to be?
|
||||
mounting_selection_menu-close = Close
|
||||
|
||||
## Sidebar settings
|
||||
settings-sidebar-title = Settings
|
||||
settings-sidebar-general = General
|
||||
settings-sidebar-tracker_mechanics = Tracker mechanics
|
||||
settings-sidebar-fk_settings = Tracking settings
|
||||
settings-sidebar-gesture_control = Gesture control
|
||||
settings-sidebar-interface = Interface
|
||||
settings-sidebar-osc_router = OSC router
|
||||
settings-sidebar-utils = Utilities
|
||||
settings-sidebar-serial = Serial console
|
||||
|
||||
## SteamVR settings
|
||||
settings-general-steamvr = SteamVR
|
||||
settings-general-steamvr-subtitle = SteamVR trackers
|
||||
# Not all translation keys support multiline, only the ones that specify it will actually
|
||||
# split it in lines (that also means you can split in lines however you want in those).
|
||||
# The first spaces (not tabs) for indentation will be ignored, just to make the file look nice when writing.
|
||||
# This one is one of this cases that cares about multilines
|
||||
settings-general-steamvr-description =
|
||||
Enable or disable specific SteamVR trackers.
|
||||
Useful for games or apps that only support certain trackers.
|
||||
settings-general-steamvr-trackers-waist = Waist
|
||||
settings-general-steamvr-trackers-chest = Chest
|
||||
settings-general-steamvr-trackers-feet = Feet
|
||||
settings-general-steamvr-trackers-knees = Knees
|
||||
settings-general-steamvr-trackers-elbows = Elbows
|
||||
settings-general-steamvr-trackers-hands = Hands
|
||||
|
||||
## Tracker mechanics
|
||||
settings-general-tracker_mechanics = Tracker mechanics
|
||||
settings-general-tracker_mechanics-filtering = Filtering
|
||||
# This also cares about multilines
|
||||
settings-general-tracker_mechanics-filtering-description =
|
||||
Choose the filtering type for your trackers.
|
||||
Prediction predicts movement while smoothing smoothens movement.
|
||||
settings-general-tracker_mechanics-filtering-type = Filtering type
|
||||
settings-general-tracker_mechanics-filtering-type-none = No filtering
|
||||
settings-general-tracker_mechanics-filtering-type-none-description = Use rotations as is. Will not do any filtering.
|
||||
settings-general-tracker_mechanics-filtering-type-smoothing = Smoothing
|
||||
settings-general-tracker_mechanics-filtering-type-smoothing-description = Smooths movements but adds some latency.
|
||||
settings-general-tracker_mechanics-filtering-type-prediction = Prediction
|
||||
settings-general-tracker_mechanics-filtering-type-prediction-description = Reduces latency and makes movements more snappy, but may increase jitter.
|
||||
settings-general-tracker_mechanics-filtering-amount = Amount
|
||||
settings-general-tracker_mechanics-drift_compensation = Drift compensation
|
||||
# This cares about multilines
|
||||
settings-general-tracker_mechanics-drift_compensation-description =
|
||||
Compensates IMU yaw drift by applying an inverse rotation.
|
||||
Change amount of compensation and up to how many resets are taken into account.
|
||||
settings-general-tracker_mechanics-drift_compensation-enabled-label = Drift compensation
|
||||
settings-general-tracker_mechanics-drift_compensation-amount-label = Compensation amount
|
||||
settings-general-tracker_mechanics-drift_compensation-max_resets-label = Use up to x last resets
|
||||
|
||||
## FK/Tracking settings
|
||||
settings-general-fk_settings = Tracking settings
|
||||
settings-general-fk_settings-leg_tweak = Leg tweaks
|
||||
settings-general-fk_settings-leg_tweak-description = Floor-clip can Reduce or even eliminates clipping with the floor but may cause problems when on your knees. Skating-correction corrects for ice skating, but can decrease accuracy in certain movement patterns.
|
||||
# Floor clip:
|
||||
# why the name - came from the idea of noclip in video games, but is the opposite where clipping to the floor is a desired feature
|
||||
# definition - Prevents the foot trackers from going lower than they where when a reset was performed
|
||||
settings-general-fk_settings-leg_tweak-floor_clip = Floor clip
|
||||
# Skating correction:
|
||||
# why the name - without this enabled the feet will often slide across the ground as if your skating across the ground,
|
||||
# since this largely prevents this it corrects for it hence skating correction (note this may be renamed to sliding correction)
|
||||
# definition - Guesses when each foot is in contact with the ground and uses that information to improve tracking
|
||||
settings-general-fk_settings-leg_tweak-skating_correction = Skating correction
|
||||
settings-general-fk_settings-leg_tweak-skating_correction-amount = Skating correction strength
|
||||
settings-general-fk_settings-arm_fk = Arm tracking
|
||||
settings-general-fk_settings-arm_fk-description = Change the way the arms are tracked.
|
||||
settings-general-fk_settings-arm_fk-force_arms = Force arms from HMD
|
||||
settings-general-fk_settings-arm_fk-i_pose = Use i-pose instead of t-pose
|
||||
settings-general-fk_settings-skeleton_settings = Skeleton settings
|
||||
settings-general-fk_settings-skeleton_settings-description = Toggle skeleton settings on or off. It is recommended to leave these on.
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine = Extended spine
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis = Extended pelvis
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees = Extended knee
|
||||
settings-general-fk_settings-vive_emulation-title = Vive emulation
|
||||
settings-general-fk_settings-vive_emulation-description = Emulate the waist tracker problems that Vive trackers have. This is a joke and makes tracking worse.
|
||||
settings-general-fk_settings-vive_emulation-label = Enable Vive emulation
|
||||
|
||||
## Gesture control settings (tracker tapping)
|
||||
settings-general-gesture_control = Gesture control
|
||||
settings-general-gesture_control-subtitle = Tap based resets
|
||||
settings-general-gesture_control-description = Allows for resets to be triggered by tapping a tracker. The tracker highest up on your torso is used for Quick Reset, the tracker highest up on your left leg is used for Reset, and the tracker highest up on your right leg is used for Mounting Reset. It should be mentioned that taps must happen within 0.6 seconds to be registered.
|
||||
# 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
|
||||
}
|
||||
settings-general-gesture_control-quickResetEnabled = Enable tap to quick reset
|
||||
settings-general-gesture_control-quickResetDelay = Quick reset delay
|
||||
settings-general-gesture_control-quickResetTaps = Taps for quick reset
|
||||
settings-general-gesture_control-resetEnabled = Enable tap to reset
|
||||
settings-general-gesture_control-resetDelay = Reset delay
|
||||
settings-general-gesture_control-resetTaps = Taps for reset
|
||||
settings-general-gesture_control-mountingResetEnabled = Enable tap to reset mounting
|
||||
settings-general-gesture_control-mountingResetDelay = Mounting reset delay
|
||||
settings-general-gesture_control-mountingResetTaps = Taps for mounting reset
|
||||
|
||||
## Interface settings
|
||||
settings-general-interface = Interface
|
||||
settings-general-interface-dev_mode = Developer Mode
|
||||
settings-general-interface-dev_mode-description = This mode can be useful if you need in-depth data or to interact with connected trackers on a more advanced level.
|
||||
settings-general-interface-dev_mode-label = Developer Mode
|
||||
settings-general-interface-serial_detection = Serial device detection
|
||||
settings-general-interface-serial_detection-description = This option will show a pop-up every time you plug a new serial device that could be a tracker. It helps improving the setup process of a tracker.
|
||||
settings-general-interface-serial_detection-label = Serial device detection
|
||||
settings-general-interface-lang = Select language
|
||||
settings-general-interface-lang-description = Change the default language you want to use.
|
||||
settings-general-interface-lang-placeholder = Select the language to use
|
||||
|
||||
## Serial settings
|
||||
settings-serial = Serial Console
|
||||
# This cares about multilines
|
||||
settings-serial-description =
|
||||
This is a live information feed for serial communication.
|
||||
May be useful if you need to know the firmware is acting up.
|
||||
settings-serial-connection_lost = Connection to serial lost, Reconnecting...
|
||||
settings-serial-reboot = Reboot
|
||||
settings-serial-factory_reset = Factory Reset
|
||||
settings-serial-get_infos = Get Infos
|
||||
settings-serial-serial_select = Select a serial port
|
||||
settings-serial-auto_dropdown_item = Auto
|
||||
|
||||
## OSC router settings
|
||||
settings-osc-router = OSC router
|
||||
# This cares about multilines
|
||||
settings-osc-router-description =
|
||||
Forward OSC messages from another program.
|
||||
Useful for using another OSC program with VRChat for example.
|
||||
settings-osc-router-enable = Enable
|
||||
settings-osc-router-enable-description = Toggle the forwarding of messages.
|
||||
settings-osc-router-enable-label = Enable
|
||||
settings-osc-router-network = Network ports
|
||||
# This cares about multilines
|
||||
settings-osc-router-network-description =
|
||||
Set the ports for listening and sending data.
|
||||
These can be the same as other ports used in the SlimeVR server.
|
||||
settings-osc-router-network-port_in =
|
||||
.label = Port In
|
||||
.placeholder = Port in (default: 9002)
|
||||
settings-osc-router-network-port_out =
|
||||
.label = Port Out
|
||||
.placeholder = Port out (default: 9000)
|
||||
settings-osc-router-network-address = Network address
|
||||
settings-osc-router-network-address-description = Set the address to send out data at.
|
||||
settings-osc-router-network-address-placeholder = IPV4 address
|
||||
|
||||
## OSC VRChat settings
|
||||
settings-osc-vrchat = VRChat OSC Trackers
|
||||
# This cares about multilines
|
||||
settings-osc-vrchat-description =
|
||||
Change VRChat-specific settings to receive HMD data and send
|
||||
trackers data for FBT (works on Quest standalone).
|
||||
settings-osc-vrchat-enable = Enable
|
||||
settings-osc-vrchat-enable-description = Toggle the sending and receiving of data.
|
||||
settings-osc-vrchat-enable-label = Enable
|
||||
settings-osc-vrchat-network = Network ports
|
||||
settings-osc-vrchat-network-description = Set the ports for listening and sending data to VRChat.
|
||||
settings-osc-vrchat-network-port_in =
|
||||
.label = Port In
|
||||
.placeholder = Port in (default: 9001)
|
||||
settings-osc-vrchat-network-port_out =
|
||||
.label = Port Out
|
||||
.placeholder = Port out (default: 9000)
|
||||
settings-osc-vrchat-network-address = Network address
|
||||
settings-osc-vrchat-network-address-description = Choose which address to send out data to VRChat (check your Wi-Fi settings on your device).
|
||||
settings-osc-vrchat-network-address-placeholder = VRChat ip address
|
||||
settings-osc-vrchat-network-trackers = Trackers
|
||||
settings-osc-vrchat-network-trackers-description = Toggle the sending of specific trackers via OSC.
|
||||
settings-osc-vrchat-network-trackers-chest = Chest
|
||||
settings-osc-vrchat-network-trackers-waist = Waist
|
||||
settings-osc-vrchat-network-trackers-knees = Knees
|
||||
settings-osc-vrchat-network-trackers-feet = Feet
|
||||
settings-osc-vrchat-network-trackers-elbows = Elbows
|
||||
|
||||
## Setup/onboarding menu
|
||||
onboarding-skip = Skip setup
|
||||
onboarding-continue = Continue
|
||||
onboarding-wip = Work in progress
|
||||
|
||||
## Wi-Fi setup
|
||||
onboarding-wifi_creds-back = Go Back to introduction
|
||||
onboarding-wifi_creds = Input Wi-Fi credentials
|
||||
# This cares about multilines
|
||||
onboarding-wifi_creds-description =
|
||||
The Trackers will use these credentials to connect wirelessly.
|
||||
Please use the credentials that you are currently connected to.
|
||||
onboarding-wifi_creds-skip = Skip Wi-Fi settings
|
||||
onboarding-wifi_creds-submit = Submit!
|
||||
onboarding-wifi_creds-ssid =
|
||||
.label = Wi-Fi name
|
||||
.placeholder = Enter Wi-Fi name
|
||||
onboarding-wifi_creds-password =
|
||||
.label = Password
|
||||
.placeholder = Enter password
|
||||
|
||||
## Mounting setup
|
||||
onboarding-reset_tutorial-back = Go Back to Mounting calibration
|
||||
onboarding-reset_tutorial = Reset tutorial
|
||||
onboarding-reset_tutorial-description = This feature isn't done, just press continue
|
||||
|
||||
## Setup start
|
||||
onboarding-home = Welcome to SlimeVR
|
||||
# This cares about multilines and it's centered!!
|
||||
onboarding-home-description =
|
||||
Bringing full-body tracking
|
||||
to everyone
|
||||
onboarding-home-start = Lets get set up!
|
||||
|
||||
## Enter VR part of setup
|
||||
onboarding-enter_vr-back = Go Back to Tracker assignent
|
||||
onboarding-enter_vr-title = Time to enter VR!
|
||||
onboarding-enter_vr-description = Put on all your trackers and then enter VR!
|
||||
onboarding-enter_vr-ready = I'm ready
|
||||
|
||||
## Setup done
|
||||
onboarding-done-title = You're all set!
|
||||
onboarding-done-description = Enjoy your full body experience
|
||||
onboarding-done-close = Close the guide
|
||||
|
||||
## Tracker connection setup
|
||||
onboarding-connect_tracker-back = Go Back to Wi-Fi credentials
|
||||
onboarding-connect_tracker-title = Connect trackers
|
||||
onboarding-connect_tracker-description-p0 = Now onto the fun part, connecting all the trackers!
|
||||
onboarding-connect_tracker-description-p1 = Simply connect all that aren't connected yet, through a USB port.
|
||||
onboarding-connect_tracker-issue-serial = I'm having trouble connecting!
|
||||
onboarding-connect_tracker-usb = USB Tracker
|
||||
onboarding-connect_tracker-connection_status-connecting = Sending Wi-Fi credentials
|
||||
onboarding-connect_tracker-connection_status-connected = Connected to Wi-Fi
|
||||
onboarding-connect_tracker-connection_status-error = Unable to connect to Wi-Fi
|
||||
onboarding-connect_tracker-connection_status-start_connecting = Looking for trackers
|
||||
onboarding-connect_tracker-connection_status-handshake = Connected to the Server
|
||||
# $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] No trackers
|
||||
[one] 1 tracker
|
||||
*[other] { $amount } trackers
|
||||
} connected
|
||||
onboarding-connect_tracker-next = I connected all my trackers
|
||||
|
||||
## Tracker assignment setup
|
||||
onboarding-assign_trackers-back = Go Back to Wi-Fi Credentials
|
||||
onboarding-assign_trackers-title = Assign trackers
|
||||
onboarding-assign_trackers-description = Let's choose which tracker goes where. Click on a location where you want to place a tracker
|
||||
# Look at translation of onboarding-connect_tracker-connected_trackers on how to use plurals
|
||||
# $assigned (Number) - Trackers that have been assigned a body part
|
||||
# $trackers (Number) - Trackers connected to the server
|
||||
onboarding-assign_trackers-assigned = { $assigned } of { $trackers ->
|
||||
[one] 1 tracker
|
||||
*[other] { $trackers } trackers
|
||||
} assigned
|
||||
onboarding-assign_trackers-advanced = Show advanced assign locations
|
||||
onboarding-assign_trackers-next = I assigned all the trackers
|
||||
|
||||
## Tracker manual mounting setup
|
||||
onboarding-manual_mounting-back = Go Back to Enter VR
|
||||
onboarding-manual_mounting = Manual Mounting
|
||||
onboarding-manual_mounting-description = Click on every tracker and select which way they are mounted
|
||||
onboarding-manual_mounting-auto_mounting = Automatic mounting
|
||||
onboarding-manual_mounting-next = Next step
|
||||
|
||||
## Tracker automatic mounting setup
|
||||
onboarding-automatic_mounting-back = Go Back to Enter VR
|
||||
onboarding-automatic_mounting-title = Mounting Calibration
|
||||
onboarding-automatic_mounting-description = For SlimeVR trackers to work, we need to assign a mounting rotation to your trackers to align them with your physical tracker mounting.
|
||||
onboarding-automatic_mounting-manual_mounting = Manually set mounting
|
||||
onboarding-automatic_mounting-next = Next step
|
||||
onboarding-automatic_mounting-prev_step = Previous step
|
||||
onboarding-automatic_mounting-done-title = Mounting rotations calibrated.
|
||||
onboarding-automatic_mounting-done-description = Your mounting calibration is complete!
|
||||
onboarding-automatic_mounting-done-restart = Return to start
|
||||
onboarding-automatic_mounting-mounting_reset-title = Mounting Reset
|
||||
onboarding-automatic_mounting-mounting_reset-step-0 = 1. Squat in a "skiing" pose with your legs bent, your upper body tilted forwards, and your arms bent.
|
||||
onboarding-automatic_mounting-mounting_reset-step-1 = 2. Press the "Reset Mounting" button and wait for 3 seconds before the trackers' mounting rotations will reset.
|
||||
onboarding-automatic_mounting-preparation-title = Preparation
|
||||
onboarding-automatic_mounting-preparation-step-0 = 1. Stand upright with your arms to your sides.
|
||||
onboarding-automatic_mounting-preparation-step-1 = 2. Press the "Reset" button and wait for 3 seconds before the trackers will reset.
|
||||
onboarding-automatic_mounting-put_trackers_on-title = Put on your trackers
|
||||
onboarding-automatic_mounting-put_trackers_on-description = To calibrate mounting rotations, we're gonna use the trackers you just assigned. Put on all your trackers, you can see which are which in the figure to the right.
|
||||
onboarding-automatic_mounting-put_trackers_on-next = I have all my trackers on
|
||||
|
||||
## Tracker manual proportions setup
|
||||
onboarding-manual_proportions-back = Go Back to Reset tutorial
|
||||
onboarding-manual_proportions-title = Manual Body Proportions
|
||||
onboarding-manual_proportions-precision = Precision adjust
|
||||
onboarding-manual_proportions-auto = Automatic calibration
|
||||
|
||||
## Tracker automatic proportions setup
|
||||
onboarding-automatic_proportions-back = Go Back to Reset tutorial
|
||||
onboarding-automatic_proportions-title = Measure your body
|
||||
onboarding-automatic_proportions-description = For SlimeVR trackers to work, we need to know the length of your bones. This short calibration will measure it for you.
|
||||
onboarding-automatic_proportions-manual = Manual calibration
|
||||
onboarding-automatic_proportions-prev_step = Previous step
|
||||
onboarding-automatic_proportions-put_trackers_on-title = Put on your trackers
|
||||
onboarding-automatic_proportions-put_trackers_on-description = To calibrate your proportions, we're gonna use the trackers you just assigned. Put on all your trackers, you can see which are which in the figure to the right.
|
||||
onboarding-automatic_proportions-put_trackers_on-next = I have all my trackers on
|
||||
onboarding-automatic_proportions-preparation-title = Preparation
|
||||
onboarding-automatic_proportions-preparation-description = Place a chair directly behind you inside your play space. Be prepared to sit down during the autobone setup.
|
||||
onboarding-automatic_proportions-preparation-next = I am in front of a chair
|
||||
onboarding-automatic_proportions-start_recording-title = Get ready to move
|
||||
onboarding-automatic_proportions-start_recording-description = We're now going to record some specific poses and moves. These will be prompted in the next screen. Be ready to start when the button is pressed!
|
||||
onboarding-automatic_proportions-start_recording-next = Start Recording
|
||||
onboarding-automatic_proportions-recording-title = REC
|
||||
onboarding-automatic_proportions-recording-description-p0 = Recording in progress...
|
||||
onboarding-automatic_proportions-recording-description-p1 = Make the moves shown below:
|
||||
onboarding-automatic_proportions-recording-steps-0 = Bend knees a few times.
|
||||
onboarding-automatic_proportions-recording-steps-1 = Sit on a chair then stand up.
|
||||
onboarding-automatic_proportions-recording-steps-2 = Twist upper body left, then bend right.
|
||||
onboarding-automatic_proportions-recording-steps-3 = Twist upper body right, then bend left.
|
||||
onboarding-automatic_proportions-recording-steps-4 = Wiggle around until timer ends.
|
||||
onboarding-automatic_proportions-recording-processing = Processing the result
|
||||
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 15)
|
||||
onboarding-automatic_proportions-recording-timer = { $time ->
|
||||
[one] 1 second left
|
||||
*[other] { $time } seconds left
|
||||
}
|
||||
onboarding-automatic_proportions-verify_results-title = Verify results
|
||||
onboarding-automatic_proportions-verify_results-description = Check the results below, do they look correct?
|
||||
onboarding-automatic_proportions-verify_results-results = Recording results
|
||||
onboarding-automatic_proportions-verify_results-processing = Processing the result
|
||||
onboarding-automatic_proportions-verify_results-redo = Redo recording
|
||||
onboarding-automatic_proportions-verify_results-confirm = They're correct
|
||||
onboarding-automatic_proportions-done-title = Body measured and saved.
|
||||
onboarding-automatic_proportions-done-description = Your body proportions calibration is complete!
|
||||
|
||||
## Home
|
||||
home-no_trackers = No trackers detected or assigned
|
||||
540
gui/public/i18n/es-419/translation.ftl
Normal file
540
gui/public/i18n/es-419/translation.ftl
Normal file
@@ -0,0 +1,540 @@
|
||||
### 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!
|
||||
# And also comment the string if it's something not easy to translate, so you help
|
||||
# translators on what it means
|
||||
|
||||
## Websocket (server) status
|
||||
websocket-connecting = Conectando al servidor
|
||||
websocket-connection_lost = Conexión al servidor perdida. Intentando reconectar...
|
||||
|
||||
## Tips
|
||||
tips-find_tracker = ¿No estás seguro de cuál sensor es cuál? Agita un sensor y se resaltará donde está asignado.
|
||||
tips-do_not_move_heels = ¡Asegúrate de no mover los talones en la grabación!
|
||||
|
||||
## Body parts
|
||||
body_part-NONE = Sin asignar
|
||||
body_part-HEAD = Cabeza
|
||||
body_part-NECK = Cuello
|
||||
body_part-RIGHT_SHOULDER = Hombro derecho
|
||||
body_part-RIGHT_UPPER_ARM = Brazo superior derecho
|
||||
body_part-RIGHT_LOWER_ARM = Antebrazo derecho
|
||||
body_part-RIGHT_HAND = Mano derecha
|
||||
body_part-RIGHT_UPPER_LEG = Muslo derecho
|
||||
body_part-RIGHT_LOWER_LEG = Tobillo derecho
|
||||
body_part-RIGHT_FOOT = Pie derecho
|
||||
body_part-RIGHT_CONTROLLER = Control derecho
|
||||
body_part-CHEST = Pecho
|
||||
body_part-WAIST = Cintura
|
||||
body_part-HIP = Cadera
|
||||
body_part-LEFT_SHOULDER = Hombro izquierdo
|
||||
body_part-LEFT_UPPER_ARM = Brazo superior izquierdo
|
||||
body_part-LEFT_LOWER_ARM = Antebrazo izquierdo
|
||||
body_part-LEFT_HAND = Mano izquierda
|
||||
body_part-LEFT_UPPER_LEG = Muslo izquierdo
|
||||
body_part-LEFT_LOWER_LEG = Tobillo izquierdo
|
||||
body_part-LEFT_FOOT = Pie izquierdo
|
||||
body_part-LEFT_CONTROLLER = Control izquierdo
|
||||
|
||||
## Proportions
|
||||
skeleton_bone-NONE = Nada
|
||||
skeleton_bone-HEAD = Inclinación de cabeza
|
||||
skeleton_bone-NECK = Largo del cuello
|
||||
skeleton_bone-CHEST = Chest Length
|
||||
skeleton_bone-CHEST_OFFSET = Chest Offset
|
||||
skeleton_bone-WAIST = Waist Length
|
||||
skeleton_bone-HIP = Hip Length
|
||||
skeleton_bone-HIP_OFFSET = Desplazamiento de la cadera
|
||||
skeleton_bone-HIPS_WIDTH = Ancho de la cadera
|
||||
skeleton_bone-UPPER_LEG = Upper Leg Length
|
||||
skeleton_bone-LOWER_LEG = Lower Leg Length
|
||||
skeleton_bone-FOOT_LENGTH = Largo de pies
|
||||
skeleton_bone-FOOT_SHIFT = Desplazamiento de pies
|
||||
skeleton_bone-SKELETON_OFFSET = Desplazamiento del esqueleto
|
||||
skeleton_bone-SHOULDERS_DISTANCE = Distancia de los hombros
|
||||
skeleton_bone-SHOULDERS_WIDTH = Ancho de los hombros
|
||||
skeleton_bone-UPPER_ARM = Largo del brazo superior
|
||||
skeleton_bone-LOWER_ARM = Distancia del antebrazo
|
||||
skeleton_bone-CONTROLLER_Y = Distancia Y del mando
|
||||
skeleton_bone-CONTROLLER_Z = Distancia Z del mando
|
||||
skeleton_bone-ELBOW_OFFSET = Desplazamiento del codo
|
||||
|
||||
## Tracker reset buttons
|
||||
reset-reset_all = Reiniciar todas las proporciones
|
||||
reset-full = Reiniciar
|
||||
reset-mounting = Reiniciar montura
|
||||
reset-quick = Reinicio rápido
|
||||
|
||||
## Serial detection stuff
|
||||
serial_detection-new_device-p0 = ¡Nuevo dispositivo serial detectado!
|
||||
serial_detection-new_device-p1 = ¡Ingresa tus credenciales del Wi-Fi!
|
||||
serial_detection-new_device-p2 = Por favor selecciona que quieres hacer con el
|
||||
serial_detection-open_wifi = Conectarse al Wi-Fi
|
||||
serial_detection-open_serial = Abrir consola serial
|
||||
serial_detection-submit = ¡Enviar!
|
||||
serial_detection-close = Cerrar
|
||||
|
||||
## Navigation bar
|
||||
navbar-home = Inicio
|
||||
navbar-body_proportions = Proporciones corporales
|
||||
navbar-trackers_assign = Asignación de sensores
|
||||
navbar-mounting = Calibración de montura
|
||||
navbar-onboarding = Asistente de configuración
|
||||
navbar-settings = Ajustes
|
||||
|
||||
## Bounding volume hierarchy recording
|
||||
bvh-start_recording = Grabar BVH
|
||||
bvh-recording = Grabando...
|
||||
|
||||
## Widget: Overlay settings
|
||||
widget-overlay = Overlay
|
||||
widget-overlay-is_visible_label = Mostrar interfaz en SteamVR
|
||||
widget-overlay-is_mirrored_label = Mostrar interfaz reflejada
|
||||
|
||||
## Widget: Developer settings
|
||||
widget-developer_mode = Developer Mode
|
||||
widget-developer_mode-high_contrast = High contrast
|
||||
widget-developer_mode-precise_rotation = Precise rotation
|
||||
widget-developer_mode-fast_data_feed = Fast data feed
|
||||
widget-developer_mode-filter_slimes_and_hmd = Filter slimes and HMD
|
||||
widget-developer_mode-sort_by_name = Sort by name
|
||||
widget-developer_mode-raw_slime_rotation = Raw rotation
|
||||
widget-developer_mode-more_info = More info
|
||||
|
||||
## Widget: IMU Visualizer
|
||||
widget-imu_visualizer = Rotation
|
||||
widget-imu_visualizer-rotation_raw = Raw
|
||||
widget-imu_visualizer-rotation_preview = Preview
|
||||
|
||||
## Tracker status
|
||||
tracker-status-none = Sin estado
|
||||
tracker-status-busy = Ocupado
|
||||
tracker-status-error = Error
|
||||
tracker-status-disconnected = Desconectado
|
||||
tracker-status-occluded = Ocluido
|
||||
tracker-status-ok = Conectado
|
||||
|
||||
## Tracker status columns
|
||||
tracker-table-column-name = Nombre
|
||||
tracker-table-column-type = Tipo
|
||||
tracker-table-column-battery = Batería
|
||||
tracker-table-column-ping = Latencia
|
||||
tracker-table-column-tps = TPS
|
||||
tracker-table-column-temperature = Temp. °C
|
||||
tracker-table-column-linear-acceleration = Accel. X/Y/Z
|
||||
tracker-table-column-rotation = Rotación X/Y/Z
|
||||
tracker-table-column-position = Posición X/Y/Z
|
||||
tracker-table-column-url = URL
|
||||
|
||||
## Tracker rotation
|
||||
tracker-rotation-front = Frente
|
||||
tracker-rotation-left = Izquierda
|
||||
tracker-rotation-right = Derecha
|
||||
tracker-rotation-back = Atrás
|
||||
|
||||
## Tracker information
|
||||
tracker-infos-manufacturer = Fabricante
|
||||
tracker-infos-display_name = Nombre
|
||||
tracker-infos-custom_name = Nombre personalizado
|
||||
tracker-infos-url = URL del sensor
|
||||
|
||||
## Tracker settings
|
||||
tracker-settings-back = Volver a la lista de sensores
|
||||
tracker-settings-title = Ajustes de los sensores
|
||||
tracker-settings-assignment_section = Asignación
|
||||
tracker-settings-assignment_section-description = Parte del cuerpo asignado al sensor.
|
||||
tracker-settings-assignment_section-edit = Editar asignación
|
||||
tracker-settings-mounting_section = Posición de montura
|
||||
tracker-settings-mounting_section-description = ¿Dónde está montado el sensor?
|
||||
tracker-settings-mounting_section-edit = Editar montura
|
||||
tracker-settings-drift_compensation_section = Permitir compensación de desviación
|
||||
tracker-settings-drift_compensation_section-description = ¿Este sensor deberia compensar la desviación?
|
||||
tracker-settings-drift_compensation_section-edit = Permitir compensación de desviación
|
||||
# The .<name> means it's an attribute and it's related to the top key.
|
||||
# In this case that is the settings for the assignment section.
|
||||
tracker-settings-name_section = Nombre del sensor
|
||||
tracker-settings-name_section-description = Dale un apodo bonito :)
|
||||
tracker-settings-name_section-placeholder = Pierna izquierda de NightyBeast
|
||||
|
||||
## Tracker part card info
|
||||
tracker-part_card-no_name = Sin nombre
|
||||
tracker-part_card-unassigned = Sin asignar
|
||||
|
||||
## Body assignment menu
|
||||
body_assignment_menu = ¿Dónde quieres que esté este sensor?
|
||||
body_assignment_menu-description = Selecciona la posición donde quieres asignar este sensor. También puedes escoger administrar todos los sensores al mismo tiempo en vez de uno por uno.
|
||||
body_assignment_menu-show_advanced_locations = Mostrar posiciones de asignación avanzadas
|
||||
body_assignment_menu-manage_trackers = Administrar todos los sensores
|
||||
body_assignment_menu-unassign_tracker = Desasignar sensor
|
||||
|
||||
## Tracker assignment menu
|
||||
# A -translation_key (with a dash in the front) means that it's a label.
|
||||
# It can only be used in the translation file, it's nice for reusing names and that kind of stuff.
|
||||
#
|
||||
# We are using it here because english doesn't require changing the text in each case but
|
||||
# maybe your language does.
|
||||
-tracker_selection-part = ¿Qué sensor asignar a tu
|
||||
tracker_selection_menu-NONE = ¿Qué sensor quieres que esté sin asignar?
|
||||
tracker_selection_menu-HEAD = { -tracker_selection-part } cabeza?
|
||||
tracker_selection_menu-NECK = { -tracker_selection-part } cuello?
|
||||
tracker_selection_menu-RIGHT_SHOULDER = { -tracker_selection-part } hombro derecho?
|
||||
tracker_selection_menu-RIGHT_UPPER_ARM = { -tracker_selection-part } brazo superior derecho?
|
||||
tracker_selection_menu-RIGHT_LOWER_ARM = { -tracker_selection-part } antebrazo derecho?
|
||||
tracker_selection_menu-RIGHT_HAND = { -tracker_selection-part } mano derecha?
|
||||
tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } muslo derecho?
|
||||
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } tobillo derecho?
|
||||
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } pie derecho?
|
||||
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } mando derecho?
|
||||
tracker_selection_menu-CHEST = { -tracker_selection-part } pecho?
|
||||
tracker_selection_menu-WAIST = { -tracker_selection-part } cintura?
|
||||
tracker_selection_menu-HIP = { -tracker_selection-part } cadera?
|
||||
tracker_selection_menu-LEFT_SHOULDER = { -tracker_selection-part } hombro izquierdo?
|
||||
tracker_selection_menu-LEFT_UPPER_ARM = { -tracker_selection-part } brazo superior izquierdo?
|
||||
tracker_selection_menu-LEFT_LOWER_ARM = { -tracker_selection-part } antebrazo izquierdo?
|
||||
tracker_selection_menu-LEFT_HAND = { -tracker_selection-part } mano izquierda?
|
||||
tracker_selection_menu-LEFT_UPPER_LEG = { -tracker_selection-part } muslo izquierdo?
|
||||
tracker_selection_menu-LEFT_LOWER_LEG = { -tracker_selection-part } tobillo izquiero?
|
||||
tracker_selection_menu-LEFT_FOOT = { -tracker_selection-part } pie izquierdo?
|
||||
tracker_selection_menu-LEFT_CONTROLLER = { -tracker_selection-part } mando izquierdo?
|
||||
|
||||
tracker_selection_menu-unassigned = Sensores sin asignar
|
||||
tracker_selection_menu-assigned = Sensores asignados
|
||||
tracker_selection_menu-dont_assign = No asignar
|
||||
|
||||
## Mounting menu
|
||||
mounting_selection_menu = ¿Dónde quieres colocar el sensor?
|
||||
mounting_selection_menu-close = Cerrar
|
||||
|
||||
## Sidebar settings
|
||||
settings-sidebar-title = Ajustes
|
||||
settings-sidebar-general = General
|
||||
settings-sidebar-tracker_mechanics = Mecánicas del sensor
|
||||
settings-sidebar-fk_settings = Ajustes de FK
|
||||
settings-sidebar-gesture_control = Control de gestos
|
||||
settings-sidebar-interface = Interfaz
|
||||
settings-sidebar-osc_router = Router OSC
|
||||
settings-sidebar-utils = Utilidades
|
||||
settings-sidebar-serial = Consola serial
|
||||
|
||||
## SteamVR settings
|
||||
settings-general-steamvr = SteamVR
|
||||
settings-general-steamvr-subtitle = Sensores en SteamVR
|
||||
# Not all translation keys support multiline, only the ones that specify it will actually
|
||||
# split it in lines (that also means you can split in lines however you want in those).
|
||||
# The first spaces (not tabs) for indentation will be ignored, just to make the file look nice when writing.
|
||||
# This one is one of this cases that cares about multilines
|
||||
settings-general-steamvr-description =
|
||||
Habilita o deshabilita sensores de SteamVR en específico.
|
||||
Útil para juegos y aplicaciones que solo soportan ciertos sensores..
|
||||
settings-general-steamvr-trackers-waist = Cintura
|
||||
settings-general-steamvr-trackers-chest = Pecho
|
||||
settings-general-steamvr-trackers-feet = Pies
|
||||
settings-general-steamvr-trackers-knees = Rodillas
|
||||
settings-general-steamvr-trackers-elbows = Codos
|
||||
settings-general-steamvr-trackers-hands = Manos
|
||||
|
||||
## Tracker mechanics
|
||||
settings-general-tracker_mechanics = Mecánicas del sensor
|
||||
settings-general-tracker_mechanics-filtering = Filtrado
|
||||
# This also cares about multilines
|
||||
settings-general-tracker_mechanics-filtering-description =
|
||||
Selecciona un tipo de filtro para tus sensores.
|
||||
Predicción predice el movimiento mientras que el suavizado suaviza el movimiento.
|
||||
settings-general-tracker_mechanics-filtering-type = Tipos de filtro
|
||||
settings-general-tracker_mechanics-filtering-type-none = Sin filtro
|
||||
settings-general-tracker_mechanics-filtering-type-none-description = Usa las rotaciones como son. No se realizará ningún filtrado.
|
||||
settings-general-tracker_mechanics-filtering-type-smoothing = Suavizado
|
||||
settings-general-tracker_mechanics-filtering-type-smoothing-description = Suaviza los movimientos pero añade algo de latencia.
|
||||
settings-general-tracker_mechanics-filtering-type-prediction = Predicción
|
||||
settings-general-tracker_mechanics-filtering-type-prediction-description = Reduce la latencia y los movimientos serán más inmediatos, pero puede incrementar la inestabilidad.
|
||||
settings-general-tracker_mechanics-filtering-amount = Cantidad
|
||||
settings-general-tracker_mechanics-drift_compensation = Compensación de desviación
|
||||
# This cares about multilines
|
||||
settings-general-tracker_mechanics-drift_compensation-description =
|
||||
Compensa la desviación del eje vertical de los sensores aplicando una rotación inversa.
|
||||
Cambia la fuerza de la compensación y hasta cuantos reinicios tomar en cuenta.
|
||||
settings-general-tracker_mechanics-drift_compensation-enabled-label = Compensación de desviación
|
||||
settings-general-tracker_mechanics-drift_compensation-amount-label = Fuerza de la compensación
|
||||
settings-general-tracker_mechanics-drift_compensation-max_resets-label = Utilizar hasta los últimos x reinicios
|
||||
|
||||
## FK/Tracking settings
|
||||
settings-general-fk_settings = Ajustes de sensores
|
||||
settings-general-fk_settings-leg_tweak = Corrección de piernas
|
||||
settings-general-fk_settings-leg_tweak-description = El clip del suelo puede reducir o incluso eliminar el traspaso del piso pero puede causar problemas cuando te arrodilles. Corrección del patinaje corrige el patinaje, pero puede disminuir la precisión de ciertos movimientos.
|
||||
# Floor clip:
|
||||
# why the name - came from the idea of noclip in video games, but is the opposite where clipping to the floor is a desired feature
|
||||
# definition - Prevents the foot trackers from going lower than they where when a reset was performed
|
||||
settings-general-fk_settings-leg_tweak-floor_clip = Clip del suelo
|
||||
# Skating correction:
|
||||
# why the name - without this enabled the feet will often slide across the ground as if your skating across the ground,
|
||||
# since this largely prevents this it corrects for it hence skating correction (note this may be renamed to sliding correction)
|
||||
# definition - Guesses when each foot is in contact with the ground and uses that information to improve tracking
|
||||
settings-general-fk_settings-leg_tweak-skating_correction = Corrección del patinaje
|
||||
settings-general-fk_settings-leg_tweak-skating_correction-amount = Agresividad de la corrección del patinaje
|
||||
settings-general-fk_settings-arm_fk = Trackeo de brazos
|
||||
settings-general-fk_settings-arm_fk-description = Cambia cómo el movimiento de los brazos es detectado.
|
||||
settings-general-fk_settings-arm_fk-force_arms = Forzar brazos desde el HMD
|
||||
settings-general-fk_settings-arm_fk-i_pose = Use i-pose instead of t-pose
|
||||
settings-general-fk_settings-skeleton_settings = Ajustes de esqueleto
|
||||
settings-general-fk_settings-skeleton_settings-description = Habilita o deshabilita los ajustes de esqueleto. Es recomendado dejar estos ajustes habilitados.
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine = Extención de columna
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis = Extención de pelvis
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees = Extención de rodillas
|
||||
settings-general-fk_settings-vive_emulation-title = Vive emulation
|
||||
settings-general-fk_settings-vive_emulation-description = Emulate the waist tracker problems that Vive trackers have. This is a joke and makes tracking worse.
|
||||
settings-general-fk_settings-vive_emulation-label = Enable Vive emulation
|
||||
|
||||
## Gesture control settings (tracker tapping)
|
||||
settings-general-gesture_control = Control de gestos
|
||||
settings-general-gesture_control-subtitle = Reinicio basado en toques
|
||||
settings-general-gesture_control-description = Permite la ejecución de un reinicio al tocar un sensor. El sensor más alto en el torso es utilizado para el reinicio rápido, el sensor más alto en tu pierna izquierda es utilizado para el reinicio, y el sensor más alto en tu pierna derecha es utilizado para reiniciar la montura. Cabe destacar que los toques deben suceder dentro de 0.6 segundos para ser registrados.
|
||||
# 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 toque
|
||||
*[other] { $amount } toques
|
||||
}
|
||||
settings-general-gesture_control-quickResetEnabled = Activar toques para reinicio rápido
|
||||
settings-general-gesture_control-quickResetDelay = Retraso de reinicio rápido
|
||||
settings-general-gesture_control-quickResetTaps = Toques para reinicio rápido
|
||||
settings-general-gesture_control-resetEnabled = Activar toques para reinicio
|
||||
settings-general-gesture_control-resetDelay = Retraso de reinicio
|
||||
settings-general-gesture_control-resetTaps = Toques para reinicio
|
||||
settings-general-gesture_control-mountingResetEnabled = Activar toques para reinicio de montura
|
||||
settings-general-gesture_control-mountingResetDelay = Retraso de reinicio de montura
|
||||
settings-general-gesture_control-mountingResetTaps = Toques para reinicio de montura
|
||||
|
||||
## Interface settings
|
||||
settings-general-interface = Interfaz
|
||||
settings-general-interface-dev_mode = Modo desarrollador
|
||||
settings-general-interface-dev_mode-description = Este modo puede ser útil si es que necesitas información a fondo o para un nivel de interacción más avanzado con los sensores conectados.
|
||||
settings-general-interface-dev_mode-label = Modo desarrollador
|
||||
settings-general-interface-serial_detection = Detección de dispositivo serial
|
||||
settings-general-interface-serial_detection-description = Esta opción mostrará un notificación cada vez que conectes un nuevo dispositivo serial que pueda ser un sensor. Ayuda a mejorar el proceso de configuración de un sensor.
|
||||
settings-general-interface-serial_detection-label = Detección de dispositivo serial
|
||||
settings-general-interface-lang = Selecciona un idioma
|
||||
settings-general-interface-lang-description = Cambia el idioma que quieras usar.
|
||||
settings-general-interface-lang-placeholder = Selecciona el idioma a utilizar
|
||||
|
||||
## Serial settings
|
||||
settings-serial = Consola serial
|
||||
# This cares about multilines
|
||||
settings-serial-description =
|
||||
Esta es la comunicación serial actualizada en vivo.
|
||||
Puede ser util para saber si el firmware tiene problemas.
|
||||
settings-serial-connection_lost = Conexión serial perdida, reconectando...
|
||||
settings-serial-reboot = Reinciar
|
||||
settings-serial-factory_reset = Restauración de fábrica
|
||||
settings-serial-get_infos = Obtener información
|
||||
settings-serial-serial_select = Selecciona un puerto serial
|
||||
settings-serial-auto_dropdown_item = Auto
|
||||
|
||||
## OSC router settings
|
||||
settings-osc-router = Router OSC
|
||||
# This cares about multilines
|
||||
settings-osc-router-description =
|
||||
Redirecciona mensajes OSC recibidos de otro programa.
|
||||
Útil para usar otro programa OSC con VRChat por ejemplo.
|
||||
settings-osc-router-enable = Habilitar
|
||||
settings-osc-router-enable-description = Habilita el reenvío de mensajes.
|
||||
settings-osc-router-enable-label = Habilitar
|
||||
settings-osc-router-network = Puertos de conexión
|
||||
# This cares about multilines
|
||||
settings-osc-router-network-description =
|
||||
Establece los puertos de entrada y salida de datos
|
||||
Estos pueden ser lo mismos puertos usados en el servidor de SlimeVR.
|
||||
settings-osc-router-network-port_in =
|
||||
.label = Puerto de entrada
|
||||
.placeholder = Puerto de entrada (por defecto: 9002)
|
||||
settings-osc-router-network-port_out =
|
||||
.label = Puerto de salida
|
||||
.placeholder = Puerto de salida (por defecto: 9000)
|
||||
settings-osc-router-network-address = Dirección de red
|
||||
settings-osc-router-network-address-description = Establece la direción a la cuál se enviarán los datos.
|
||||
settings-osc-router-network-address-placeholder = Dirección IPv4
|
||||
|
||||
## OSC VRChat settings
|
||||
settings-osc-vrchat = Sensores OSC de VRChat
|
||||
# This cares about multilines
|
||||
settings-osc-vrchat-description =
|
||||
Cambiar ajustes específicos de VRChat para recibir datos del HMD y enviar
|
||||
datos de los sensores para seguimiento de cuerpo completo (funciona en Quest nativo).
|
||||
settings-osc-vrchat-enable = Habilitar
|
||||
settings-osc-vrchat-enable-description = Habilita el envio y recibo de datos.
|
||||
settings-osc-vrchat-enable-label = Habilitar
|
||||
settings-osc-vrchat-network = Puertos de conexión
|
||||
settings-osc-vrchat-network-description = Establece los puertos de entrada y salida de datos a VRChat.
|
||||
settings-osc-vrchat-network-port_in =
|
||||
.label = Puerto de entrada
|
||||
.placeholder = Puerto de entrada (por defecto: 9001)
|
||||
settings-osc-vrchat-network-port_out =
|
||||
.label = Puerto de salida
|
||||
.placeholder = Puerto de salida (por defecto: 9000)
|
||||
settings-osc-vrchat-network-address = Dirección de red
|
||||
settings-osc-vrchat-network-address-description = Establece la dirección donde se enviarán los datos de VRChat (revisa los ajustes de Wi-Fi de tu dispositivo que tenga el juego).
|
||||
settings-osc-vrchat-network-address-placeholder = Dirección IP de VRChat
|
||||
settings-osc-vrchat-network-trackers = Sensores
|
||||
settings-osc-vrchat-network-trackers-description = Habilita el envío de sensores específicos mediante OSC.
|
||||
settings-osc-vrchat-network-trackers-chest = Pecho
|
||||
settings-osc-vrchat-network-trackers-waist = Cintura
|
||||
settings-osc-vrchat-network-trackers-knees = Rodillas
|
||||
settings-osc-vrchat-network-trackers-feet = Pies
|
||||
settings-osc-vrchat-network-trackers-elbows = Codos
|
||||
|
||||
## Setup/onboarding menu
|
||||
onboarding-skip = Saltar configuración
|
||||
onboarding-continue = Continuar
|
||||
onboarding-wip = Trabajo en progreso
|
||||
|
||||
## Wi-Fi setup
|
||||
onboarding-wifi_creds-back = Volver a la introducción
|
||||
onboarding-wifi_creds = Ingresar credenciales del Wi-Fi
|
||||
# This cares about multilines
|
||||
onboarding-wifi_creds-description =
|
||||
Los sensores utilizarán estas credenciales para conectarse inalámbricamente.
|
||||
Por favor usa las credenciales del Wi-Fi al cuál estás conectado actualmente.
|
||||
onboarding-wifi_creds-skip = Saltar ajustes de Wi-Fi
|
||||
onboarding-wifi_creds-submit = ¡Enviar!
|
||||
onboarding-wifi_creds-ssid =
|
||||
.label = Nombre del WiFi
|
||||
.placeholder = Ingresa el nombre del WiFi
|
||||
onboarding-wifi_creds-password =
|
||||
.label = Contraseña
|
||||
.placeholder = Ingresa la contraseña
|
||||
|
||||
## Mounting setup
|
||||
onboarding-reset_tutorial-back = Volver a la calibración de montura
|
||||
onboarding-reset_tutorial = Reiniciar tutorial
|
||||
onboarding-reset_tutorial-description = Esta aún parte no está finalizada, por favor presione continuar
|
||||
|
||||
## Setup start
|
||||
onboarding-home = Bienvenido a SlimeVR
|
||||
# This cares about multilines and it's centered!!
|
||||
onboarding-home-description =
|
||||
¡Acercando el seguimiento
|
||||
de cuerpo completo a todos!
|
||||
onboarding-home-start = ¡Comencemos!
|
||||
|
||||
## Enter VR part of setup
|
||||
onboarding-enter_vr-back = Volver a la asignación de sensores
|
||||
onboarding-enter_vr-title = ¡Es hora de entrar a la RV!
|
||||
onboarding-enter_vr-description = ¡Ponte todos tus sensores y luego entra a la RV!
|
||||
onboarding-enter_vr-ready = Estoy listo
|
||||
|
||||
## Setup done
|
||||
onboarding-done-title = ¡Estás listo!
|
||||
onboarding-done-description = Disfruta moverte en la realidad virtual
|
||||
onboarding-done-close = Cerrar la guía
|
||||
|
||||
## Tracker connection setup
|
||||
onboarding-connect_tracker-back = Volver a las credenciales Wi-Fi
|
||||
onboarding-connect_tracker-title = Conecta tus sensores
|
||||
onboarding-connect_tracker-description-p0 = Ahora la parte divertida, ¡Conectar todos tus sensores!
|
||||
onboarding-connect_tracker-description-p1 = Simplemente conecta todos los sensores que aún no están conectados, por medio de un puerto USB.
|
||||
onboarding-connect_tracker-issue-serial = ¡Tengo problemas conectándolos!
|
||||
onboarding-connect_tracker-usb = Sensor USB
|
||||
onboarding-connect_tracker-connection_status-connecting = Enviando credenciales Wi-Fi
|
||||
onboarding-connect_tracker-connection_status-connected = Conectado al Wi-Fi
|
||||
onboarding-connect_tracker-connection_status-error = Incapaz de conectar al Wi-Fi
|
||||
onboarding-connect_tracker-connection_status-start_connecting = Buscando sensores
|
||||
onboarding-connect_tracker-connection_status-handshake = Conectado con el servidor
|
||||
# $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] No hay sensores conectados
|
||||
[one] 1 sensor conectado
|
||||
*[other] { $amount } sensores conectados
|
||||
}
|
||||
onboarding-connect_tracker-next = He conectado todos mis sensores
|
||||
|
||||
## Tracker assignment setup
|
||||
onboarding-assign_trackers-back = Volver a las credenciales Wi-Fi
|
||||
onboarding-assign_trackers-title = Asignación de sensores
|
||||
onboarding-assign_trackers-description = Debes escoger dónde van los sensores. Has clic en la ubicación donde quieras colocar un sensor
|
||||
# Look at translation of onboarding-connect_tracker-connected_trackers on how to use plurals
|
||||
# $assigned (Number) - Trackers that have been assigned a body part
|
||||
# $trackers (Number) - Trackers connected to the server
|
||||
onboarding-assign_trackers-assigned = { $assigned } de { $trackers ->
|
||||
[one] 1 sensor asignado
|
||||
*[other] { $trackers } sensores asignados
|
||||
}
|
||||
onboarding-assign_trackers-advanced = Mostrar ubicación de asignaciones avanzados.
|
||||
onboarding-assign_trackers-next = He asignado todos los sensores
|
||||
|
||||
## Tracker manual mounting setup
|
||||
onboarding-manual_mounting-back = Volver para entrar a la RV
|
||||
onboarding-manual_mounting = Montura manual
|
||||
onboarding-manual_mounting-description = Has clic en todos los sensores y selecciona en que dirección están montados
|
||||
onboarding-manual_mounting-auto_mounting = Montura automática
|
||||
onboarding-manual_mounting-next = Siguiente paso
|
||||
|
||||
## Tracker automatic mounting setup
|
||||
onboarding-automatic_mounting-back = Volver para entrar a la RV
|
||||
onboarding-automatic_mounting-title = Calibración de montura
|
||||
onboarding-automatic_mounting-description = Para que los sensores SlimeVR funcionen, necesitamos asignar una posición de montura a tus sensores para que se alinien con la montura física de tu sensor.
|
||||
onboarding-automatic_mounting-manual_mounting = Establecer montura manualmente
|
||||
onboarding-automatic_mounting-next = Siguiente paso
|
||||
onboarding-automatic_mounting-prev_step = Paso anterior
|
||||
onboarding-automatic_mounting-done-title = Ubicación de monturas calibradas.
|
||||
onboarding-automatic_mounting-done-description = ¡Tu calibración de monturas está completa!
|
||||
onboarding-automatic_mounting-done-restart = Volver al inicio
|
||||
onboarding-automatic_mounting-mounting_reset-title = Reinicio de montura
|
||||
onboarding-automatic_mounting-mounting_reset-step-0 = 1. Arrodíllate en una posición de «esquiar» con tus piernas dobladas, la parte superior de tu cuerpo inclinada hacia adelante, y tus brazos doblados.
|
||||
onboarding-automatic_mounting-mounting_reset-step-1 = 2. Presiona el botón «Reinicio de montura» y espera 3 segundos hasta que se reinicie la montura.
|
||||
onboarding-automatic_mounting-preparation-title = Preparación
|
||||
onboarding-automatic_mounting-preparation-step-0 = 1. Párate derecho con tus brazos a los costados.
|
||||
onboarding-automatic_mounting-preparation-step-1 = 2. Presiona el botón «Reiniciar» y espera 3 segundos hasta que se reinicien los sensores.
|
||||
onboarding-automatic_mounting-put_trackers_on-title = Ponte tus sensores
|
||||
onboarding-automatic_mounting-put_trackers_on-description = Para calibrar la ubicación de tus monturas, usaremos los sensores que has asignado. Ponte todos tus sensores, puedes ver cuál es cual en la figura de la derecha.
|
||||
onboarding-automatic_mounting-put_trackers_on-next = Tengo puestos todos mis sensores
|
||||
|
||||
## Tracker manual proportions setup
|
||||
onboarding-manual_proportions-back = Volver al tutorial de reinicio
|
||||
onboarding-manual_proportions-title = Proporciones de cuerpo manuales
|
||||
onboarding-manual_proportions-precision = Ajuste con precisión
|
||||
onboarding-manual_proportions-auto = Calibración automática
|
||||
|
||||
## Tracker automatic proportions setup
|
||||
onboarding-automatic_proportions-back = Volver al tutorial de reinicio
|
||||
onboarding-automatic_proportions-title = Mide tu cuerpo
|
||||
onboarding-automatic_proportions-description = Para que los sensores de SlimeVR funcionen, necesitamos saber el largo de tus huesos. Esta breve calibración los medirá por ti.
|
||||
onboarding-automatic_proportions-manual = Calibración manual
|
||||
onboarding-automatic_proportions-prev_step = Paso anterior
|
||||
onboarding-automatic_proportions-put_trackers_on-title = Ponte tus sensores
|
||||
onboarding-automatic_proportions-put_trackers_on-description = Para calibrar tus proporciones, usaremos los sensores que acabas de asignar. Ponte todos tus sensores, puedes ver cuál es cual en la figura de la derecha.
|
||||
onboarding-automatic_proportions-put_trackers_on-next = Tengo puestos todos mis sensores
|
||||
onboarding-automatic_proportions-preparation-title = Preparación
|
||||
onboarding-automatic_proportions-preparation-description = Coloca una silla directamente detrás de ti en tu area de juego. Prepárate para sentarte durante la configuración del autobone.
|
||||
onboarding-automatic_proportions-preparation-next = Estoy al frente de una silla
|
||||
onboarding-automatic_proportions-start_recording-title = Prepárate para moverte
|
||||
onboarding-automatic_proportions-start_recording-description = Ahora vamos a grabar poses y movimientos en específico. Estas serán mostradas en la siguiente ventana. ¡Prepárate para empezar cuando presiones el botón!
|
||||
onboarding-automatic_proportions-start_recording-next = Empezar grabación
|
||||
onboarding-automatic_proportions-recording-title = REC
|
||||
onboarding-automatic_proportions-recording-description-p0 = Grabación en proceso...
|
||||
onboarding-automatic_proportions-recording-description-p1 = Realiza los siguientes movimientos:
|
||||
onboarding-automatic_proportions-recording-steps-0 = Dobla tus rodillas unas cuantas veces.
|
||||
onboarding-automatic_proportions-recording-steps-1 = Sientate en una silla y párate.
|
||||
onboarding-automatic_proportions-recording-steps-2 = Gira tu torso hacia la izquierda, luego inclínate hacia la derecha.
|
||||
onboarding-automatic_proportions-recording-steps-3 = Gira tu torso hacia la derecha, luego inclínate hacia la izquierda.
|
||||
onboarding-automatic_proportions-recording-steps-4 = Menea tu cuerpo hasta que el tiempo se acabe.
|
||||
onboarding-automatic_proportions-recording-processing = Procesando el resultado
|
||||
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 15)
|
||||
onboarding-automatic_proportions-recording-timer = { $time ->
|
||||
[one] falta 1 segundo
|
||||
*[other] faltan { $time } segundos
|
||||
}
|
||||
onboarding-automatic_proportions-verify_results-title = Verificando resultados
|
||||
onboarding-automatic_proportions-verify_results-description = Comprueba abajo los resultados, ¿Parecen correctos?
|
||||
onboarding-automatic_proportions-verify_results-results = Grabando resultados
|
||||
onboarding-automatic_proportions-verify_results-processing = Procesando resultados
|
||||
onboarding-automatic_proportions-verify_results-redo = Rehacer grabación
|
||||
onboarding-automatic_proportions-verify_results-confirm = Son correctos
|
||||
onboarding-automatic_proportions-done-title = Cuerpo medido y guardado.
|
||||
onboarding-automatic_proportions-done-description = ¡La calibración de tus proporciones corporales fue completada!
|
||||
|
||||
## Home
|
||||
home-no_trackers = No hay sensores detectados o asignados
|
||||
521
gui/public/i18n/et/translation.ftl
Normal file
521
gui/public/i18n/et/translation.ftl
Normal file
@@ -0,0 +1,521 @@
|
||||
### 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!
|
||||
# And also comment the string if it's something not easy to translate, so you help
|
||||
# translators on what it means
|
||||
|
||||
## Websocket (server) status
|
||||
websocket-connecting = Serveriga ühendamine
|
||||
websocket-connection_lost = Ühendus serveriga on kaotatud. Ühenduse taastamine...
|
||||
|
||||
## Tips
|
||||
tips-find_tracker = Ei ole kindel milline jälgija on mis? Raputage jälgijat ja vaadake milline jälgija tõstetakse esile.
|
||||
tips-do_not_move_heels = Veenduge, et teie kannad ei liigu salvestamise ajal!
|
||||
|
||||
## Body parts
|
||||
body_part-NONE = Määramata
|
||||
body_part-HEAD = Pea
|
||||
body_part-NECK = Kael
|
||||
body_part-RIGHT_SHOULDER = Parem õlg
|
||||
body_part-RIGHT_UPPER_ARM = Parem õlavars
|
||||
body_part-RIGHT_LOWER_ARM = Parem küünarvars
|
||||
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-RIGHT_CONTROLLER = Parem kontroller
|
||||
body_part-CHEST = Rind
|
||||
body_part-WAIST = Vöökoht
|
||||
body_part-HIP = Puus
|
||||
body_part-LEFT_SHOULDER = Vasak õlg
|
||||
body_part-LEFT_UPPER_ARM = Vasak õlavars
|
||||
body_part-LEFT_LOWER_ARM = Vasak küünarvars
|
||||
body_part-LEFT_HAND = Vasak käsi
|
||||
body_part-LEFT_UPPER_LEG = Vasak reis
|
||||
body_part-LEFT_LOWER_LEG = Vasak säär
|
||||
body_part-LEFT_FOOT = Vasak jalg
|
||||
body_part-LEFT_CONTROLLER = Vasak kontroller
|
||||
|
||||
## Proportions
|
||||
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-HIP_OFFSET = Puusa Nihe
|
||||
skeleton_bone-HIPS_WIDTH = Puusa Laius
|
||||
skeleton_bone-UPPER_LEG = Upper Leg Length
|
||||
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-UPPER_ARM = Õlavarre Pikkus
|
||||
skeleton_bone-LOWER_ARM = Käsivarre Kaugus
|
||||
skeleton_bone-CONTROLLER_Y = Kontrolleri Kaugus Y
|
||||
skeleton_bone-CONTROLLER_Z = Kontrolleri Kaugus Z
|
||||
skeleton_bone-ELBOW_OFFSET = Küünarnuki Nihe
|
||||
|
||||
## Tracker reset buttons
|
||||
reset-reset_all = Lähtesta kõik proportsioonid
|
||||
reset-full = Lähtesta
|
||||
reset-mounting = Lähtesta Paigaldusasend
|
||||
reset-quick = Kiir Lähtestamine
|
||||
|
||||
## Serial detection stuff
|
||||
serial_detection-new_device-p0 = Uus jadaseade tuvastatud!
|
||||
serial_detection-new_device-p1 = Sisestage enda Wi-Fi andmed!
|
||||
serial_detection-new_device-p2 = Palun valige, mida te soovite sellega teha
|
||||
serial_detection-open_wifi = Ühendage Wi-Fi-ga
|
||||
serial_detection-open_serial = Avage Jadakonsool
|
||||
serial_detection-submit = Jätka!
|
||||
serial_detection-close = Sulge
|
||||
|
||||
## Navigation bar
|
||||
navbar-home = Kodu
|
||||
navbar-body_proportions = Keha Proportsioonid
|
||||
navbar-trackers_assign = Jälgija Määramine
|
||||
navbar-mounting = Jälgijate Paigalduse Kalibreerimine
|
||||
navbar-onboarding = Häälestusviisard
|
||||
navbar-settings = Seaded
|
||||
|
||||
## Bounding volume hierarchy recording
|
||||
bvh-start_recording = Salvesta BVH
|
||||
bvh-recording = Salvestamine...
|
||||
|
||||
## Overlay settings
|
||||
widget-overlay-is_visible_label = Näita Ülekatet SteamVR-is
|
||||
widget-overlay-is_mirrored_label = Näita Ülekatet Peeglina
|
||||
|
||||
## Tracker status
|
||||
tracker-status-none = Staatuseta
|
||||
tracker-status-busy = Hõivatud
|
||||
tracker-status-error = Viga
|
||||
tracker-status-disconnected = Ühendus katkestatud
|
||||
tracker-status-occluded = Jälgija kadunud
|
||||
tracker-status-ok = OK
|
||||
|
||||
## Tracker status columns
|
||||
tracker-table-column-name = Nimi
|
||||
tracker-table-column-type = Tüüp
|
||||
tracker-table-column-battery = Patarei
|
||||
tracker-table-column-ping = Ping
|
||||
tracker-table-column-rotation = Pööre X/Y/Z
|
||||
tracker-table-column-position = Positsioon X/Y/Z
|
||||
tracker-table-column-url = URL
|
||||
|
||||
## Tracker rotation
|
||||
tracker-rotation-front = Ees
|
||||
tracker-rotation-left = Vasak
|
||||
tracker-rotation-right = Parem
|
||||
tracker-rotation-back = Taga
|
||||
|
||||
## Tracker information
|
||||
tracker-infos-manufacturer = Tootja
|
||||
tracker-infos-display_name = Kuvatav Nimi
|
||||
tracker-infos-custom_name = Kohandatud Nimi
|
||||
tracker-infos-url = Jälgija URL
|
||||
|
||||
## Tracker settings
|
||||
tracker-settings-back = Minge tagasi jälgija loendise
|
||||
tracker-settings-title = Jälgija Seaded
|
||||
tracker-settings-assignment_section = Jälgija asukoha määramine
|
||||
tracker-settings-assignment_section-description = Mis kehaosale jälgija määratud on.
|
||||
tracker-settings-assignment_section-edit = Muuda jälgija asukohta
|
||||
tracker-settings-mounting_section = Paigaldusasend
|
||||
tracker-settings-mounting_section-description = Kuhu on jälgija paigaldatud.
|
||||
tracker-settings-mounting_section-edit = Muuda paigaldusasendit
|
||||
tracker-settings-drift_compensation_section = Allow drift compensation
|
||||
tracker-settings-drift_compensation_section-description = Should this tracker compensate for its drift when drift compensation is enabled?
|
||||
tracker-settings-drift_compensation_section-edit = Allow drift compensation
|
||||
# The .<name> means it's an attribute and it's related to the top key.
|
||||
# In this case that is the settings for the assignment section.
|
||||
tracker-settings-name_section = Jälgija Nimi
|
||||
tracker-settings-name_section-placeholder = NightyBeast-i vasak käsi
|
||||
tracker-settings-name_section-description = Anna talle armas hüüdnimi :)
|
||||
|
||||
## Tracker part card info
|
||||
tracker-part_card-no_name = Nimi puudub
|
||||
tracker-part_card-unassigned = Määramata
|
||||
|
||||
## Body assignment menu
|
||||
body_assignment_menu = Kus te soovite, et jälgija oleks?
|
||||
body_assignment_menu-description = Vali asukoht kuhu te soovite, et jälgija määratakse. Alternatiivina saate te hallata kõiki jälgijaid korraga mitte ükshaaval.
|
||||
body_assignment_menu-show_advanced_locations = Kuva täpsem määramise asukoht
|
||||
body_assignment_menu-manage_trackers = Halda kõiki jälgijaid
|
||||
body_assignment_menu-unassign_tracker = Tühista jälgija määramine
|
||||
|
||||
## Tracker assignment menu
|
||||
# A -translation_key (with a dash in the front) means that it's a label.
|
||||
# It can only be used in the translation file, it's nice for reusing names and that kind of stuff.
|
||||
#
|
||||
# We are using it here because english doesn't require changing the text in each case but
|
||||
# maybe your language does.
|
||||
-tracker_selection-part = Millist jälgijat määrata teie
|
||||
tracker_selection_menu-NONE = Millise jälgija määramist soovite tühistada?
|
||||
tracker_selection_menu-HEAD = { -tracker_selection-part } peale?
|
||||
tracker_selection_menu-NECK = { -tracker_selection-part } kaelale?
|
||||
tracker_selection_menu-RIGHT_SHOULDER = { -tracker_selection-part } paremale õlale?
|
||||
tracker_selection_menu-RIGHT_UPPER_ARM = { -tracker_selection-part } paremale õlavarrele?
|
||||
tracker_selection_menu-RIGHT_LOWER_ARM = { -tracker_selection-part } paremale küünarvarrele?
|
||||
tracker_selection_menu-RIGHT_HAND = { -tracker_selection-part } paremale käele?
|
||||
tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } paremale reiele?
|
||||
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-CHEST = { -tracker_selection-part } rind?
|
||||
tracker_selection_menu-WAIST = { -tracker_selection-part } vöökoht?
|
||||
tracker_selection_menu-HIP = { -tracker_selection-part } puus?
|
||||
tracker_selection_menu-LEFT_SHOULDER = { -tracker_selection-part } vasakule õlale?
|
||||
tracker_selection_menu-LEFT_UPPER_ARM = { -tracker_selection-part } vasakule õlavarrele?
|
||||
tracker_selection_menu-LEFT_LOWER_ARM = { -tracker_selection-part } vasakule küünarvarrele_
|
||||
tracker_selection_menu-LEFT_HAND = { -tracker_selection-part } vasakule käele?
|
||||
tracker_selection_menu-LEFT_UPPER_LEG = { -tracker_selection-part } vasakule reiele?
|
||||
tracker_selection_menu-LEFT_LOWER_LEG = { -tracker_selection-part } vasakule säärele?
|
||||
tracker_selection_menu-LEFT_FOOT = { -tracker_selection-part } vasakule jalale?
|
||||
tracker_selection_menu-LEFT_CONTROLLER = { -tracker_selection-part } vasakule kontrollerile?
|
||||
|
||||
tracker_selection_menu-unassigned = Määramata Jälgijad
|
||||
tracker_selection_menu-assigned = Määratud Jälgijad
|
||||
tracker_selection_menu-dont_assign = Ära määra jälgijat
|
||||
|
||||
## Mounting menu
|
||||
mounting_selection_menu = Kus te soovite, et see jälgija paikneks?
|
||||
mounting_selection_menu-close = Sulge
|
||||
|
||||
## Sidebar settings
|
||||
settings-sidebar-title = Seaded
|
||||
settings-sidebar-general = Tavaline
|
||||
settings-sidebar-tracker_mechanics = Jälgija mehaanika
|
||||
settings-sidebar-fk_settings = FK seaded
|
||||
settings-sidebar-gesture_control = Žesti juhtimine
|
||||
settings-sidebar-interface = Liides
|
||||
settings-sidebar-osc_router = OSC ruuter
|
||||
settings-sidebar-utils = Olemus / Lisad
|
||||
settings-sidebar-serial = Jadakonsool
|
||||
|
||||
## SteamVR settings
|
||||
settings-general-steamvr = SteamVR
|
||||
settings-general-steamvr-subtitle = SteamVR jälgijad
|
||||
# Not all translation keys support multiline, only the ones that specify it will actually
|
||||
# split it in lines (that also means you can split in lines however you want in those).
|
||||
# The first spaces (not tabs) for indentation will be ignored, just to make the file look nice when writing.
|
||||
# This one is one of this cases that cares about multilines
|
||||
settings-general-steamvr-description =
|
||||
Luba või keela spetsiifilised SteamVR-i jälgijad.
|
||||
Kasulik teatud mängudele või äppidele, mis toetavad ainult teatuid jälgijaid.
|
||||
settings-general-steamvr-trackers-waist = Vöökoht
|
||||
settings-general-steamvr-trackers-chest = Rind
|
||||
settings-general-steamvr-trackers-feet = Jalad
|
||||
settings-general-steamvr-trackers-knees = Põlved
|
||||
settings-general-steamvr-trackers-elbows = Küünarnukid
|
||||
settings-general-steamvr-trackers-hands = Käed
|
||||
|
||||
## Tracker mechanics
|
||||
settings-general-tracker_mechanics = Jälgija mehaanika
|
||||
settings-general-tracker_mechanics-filtering = Filtreerimine
|
||||
# This also cares about multilines
|
||||
settings-general-tracker_mechanics-filtering-description =
|
||||
Vali filtreerimis tüüp enda jälgijatele.
|
||||
Ennustus ennustab liikumist, aga silestamine silestab liikumist.
|
||||
settings-general-tracker_mechanics-filtering-type = Filtreerimise tüüp
|
||||
settings-general-tracker_mechanics-filtering-type-none = Ei mingit filtreerimist
|
||||
settings-general-tracker_mechanics-filtering-type-none-description = Kasutage pöörlemist nii nagu on. Ei tee mingit filtreerimist.
|
||||
settings-general-tracker_mechanics-filtering-type-smoothing = Silestamine
|
||||
settings-general-tracker_mechanics-filtering-type-smoothing-description = Teeb liigutused siledaks, aga lisab aega jälgija ja programmi vahel.
|
||||
settings-general-tracker_mechanics-filtering-type-prediction = Ennustamine
|
||||
settings-general-tracker_mechanics-filtering-type-prediction-description = Vähendab aega jälgija ja programmi vahel ja tee liigutused kiiremaks, aga võib lisada värinat.
|
||||
settings-general-tracker_mechanics-filtering-amount = Amount
|
||||
settings-general-tracker_mechanics-drift_compensation = Drift compensation
|
||||
# This cares about multilines
|
||||
settings-general-tracker_mechanics-drift_compensation-description =
|
||||
Compensates IMU yaw drift by applying an inverse rotation.
|
||||
Change amount of compensation and up to how many resets are taken into account.
|
||||
settings-general-tracker_mechanics-drift_compensation-enabled-label = Drift compensation
|
||||
settings-general-tracker_mechanics-drift_compensation-amount-label = Compensation amount
|
||||
settings-general-tracker_mechanics-drift_compensation-max_resets-label = Use up to x last resets
|
||||
|
||||
## FK/Tracking settings
|
||||
settings-general-fk_settings = Jälgija seaded
|
||||
settings-general-fk_settings-leg_tweak = Jälgija näpunäiteid
|
||||
settings-general-fk_settings-leg_tweak-description = Põranda läbimine saab vähendada või isegi elimineerida jalgade positsiooni läbimist põrandaga, võib põhjustada probleeme põlvedega. Libisemise korrigeerimine korregeerib jalgade libisemist liikudes, aga võib vähendada täpsust teatud liikumiste puhul.
|
||||
# Floor clip:
|
||||
# why the name - came from the idea of noclip in video games, but is the opposite where clipping to the floor is a desired feature
|
||||
# definition - Prevents the foot trackers from going lower than they where when a reset was performed
|
||||
settings-general-fk_settings-leg_tweak-floor_clip = Põranda läbimine
|
||||
# Skating correction:
|
||||
# why the name - without this enabled the feet will often slide across the ground as if your skating across the ground,
|
||||
# since this largely prevents this it corrects for it hence skating correction (note this may be renamed to sliding correction)
|
||||
# definition - Guesses when each foot is in contact with the ground and uses that information to improve tracking
|
||||
settings-general-fk_settings-leg_tweak-skating_correction = Libisemise korrigeerimine
|
||||
settings-general-fk_settings-leg_tweak-skating_correction-amount = Libisemise korrigeerimine jõud
|
||||
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-arm_fk-i_pose = Use i-pose instead of t-pose
|
||||
settings-general-fk_settings-skeleton_settings = Skeletti seaded
|
||||
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-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
|
||||
|
||||
## Gesture control settings (tracker tapping)
|
||||
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.
|
||||
# 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
|
||||
}
|
||||
settings-general-gesture_control-quickResetEnabled = Luba, et vajutus kiir lähtestab
|
||||
settings-general-gesture_control-quickResetDelay = Kiir lähtestamise viivitus
|
||||
settings-general-gesture_control-quickResetTaps = Kiir lähtestamis vajutus
|
||||
settings-general-gesture_control-resetEnabled = Luba, et vajutus lähtestab
|
||||
settings-general-gesture_control-resetDelay = Lähtestamise viivitus
|
||||
settings-general-gesture_control-resetTaps = Lähtestamise vajutus
|
||||
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
|
||||
|
||||
## Interface settings
|
||||
settings-general-interface = Liides
|
||||
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-lang = Vaikekeel
|
||||
settings-general-interface-lang-description = Muutke vaikekeelt, mida soovite kasutada.
|
||||
settings-general-interface-lang-placeholder = Vali keel, mida kasutada
|
||||
|
||||
## Serial settings
|
||||
settings-serial = Jadakonsool
|
||||
# This cares about multilines
|
||||
settings-serial-description =
|
||||
See on reaalajas teabevoog jadaside jaoks.
|
||||
Võib olla kasulik, kui on vaja teada, kas püsivara töötab.
|
||||
settings-serial-connection_lost = Ühendus jadakonsooliga kaotatud. Ühenduse taastamine...
|
||||
settings-serial-reboot = Taaskäivitage
|
||||
settings-serial-factory_reset = Tehaseseadete taastamine
|
||||
settings-serial-get_infos = Saa infot
|
||||
settings-serial-serial_select = Valige jadaport
|
||||
settings-serial-auto_dropdown_item = Auto
|
||||
|
||||
## OSC router settings
|
||||
settings-osc-router = OSC ruuter
|
||||
# This cares about multilines
|
||||
settings-osc-router-description =
|
||||
Edasta OSC-teated teisest programmidest.
|
||||
Kasulik, kui kasutada teist OSC programmi näiteks VRChat-iga.
|
||||
settings-osc-router-enable = Luba
|
||||
settings-osc-router-enable-description = Lülitage andmete sisestamine sisse/välja.
|
||||
settings-osc-router-enable-label = Luba
|
||||
settings-osc-router-network = Võrgupordid
|
||||
# This cares about multilines
|
||||
settings-osc-router-network-description =
|
||||
Lisage võrgupordid, mille pealt saata ja kuulata andmeid.
|
||||
Need võivad olla samad võrgupordid mida kasutab SlimeVR server.
|
||||
settings-osc-router-network-port_in =
|
||||
.label = Võrguport sisse
|
||||
.placeholder = Võrguport sisse (vaikimisi: 9002)
|
||||
settings-osc-router-network-port_out =
|
||||
.label = Võrguport välja
|
||||
.placeholder = Võrguport välja (vaikimisi: 9000)
|
||||
settings-osc-router-network-address = Võrgu aadress
|
||||
settings-osc-router-network-address-description = Lisage võrgu aadress kuhu saata andmeid.
|
||||
settings-osc-router-network-address-placeholder = IPV4 aadress
|
||||
|
||||
## OSC VRChat settings
|
||||
settings-osc-vrchat = VRChat OSC Jälgija
|
||||
# This cares about multilines
|
||||
settings-osc-vrchat-description =
|
||||
Muuda VRChat-i spetsiifiliseid seadeid, et saada ja saata HMD andmeid.
|
||||
Jälgijate andmed FBT jaoks (töötab Questi peal ilma arvuti ühenduseta).
|
||||
settings-osc-vrchat-enable = Luba
|
||||
settings-osc-vrchat-enable-description = Lülitage andmete sisestamine sisse/välja.
|
||||
settings-osc-vrchat-enable-label = Luba
|
||||
settings-osc-vrchat-network = Võrgupordid
|
||||
settings-osc-vrchat-network-description = Lisage võrgupordid andmete saamiseks ja saatmiseks VRChat-i.
|
||||
settings-osc-vrchat-network-port_in =
|
||||
.label = Võrguport sisse
|
||||
.placeholder = Võrguport sisse (vaikimisi: 9001)
|
||||
settings-osc-vrchat-network-port_out =
|
||||
.label = Võrguport välja
|
||||
.placeholder = Võrguport välja (vaikimisi: 9000)
|
||||
settings-osc-vrchat-network-address = Võrgu aadress
|
||||
settings-osc-vrchat-network-address-description = Vali, mis aadressile saata andmeid VRChat-i jaoks (kontrolli enda Wi-Fi seadeid seadmest).
|
||||
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-knees = Põlved
|
||||
settings-osc-vrchat-network-trackers-feet = Jalad
|
||||
settings-osc-vrchat-network-trackers-elbows = Küünarnukid
|
||||
|
||||
## Setup/onboarding menu
|
||||
onboarding-skip = Jäta seadistamine vahele
|
||||
onboarding-continue = Jätka
|
||||
onboarding-wip = Töö käib
|
||||
|
||||
## Wi-Fi setup
|
||||
onboarding-wifi_creds-back = Mine tagasi juhistele
|
||||
onboarding-wifi_creds = Sisestage enda Wi-Fi andmed!
|
||||
# This cares about multilines
|
||||
onboarding-wifi_creds-description =
|
||||
Jälgijad kasutavad neid andmeid, et ühendada juhtmevabalt.
|
||||
Palun kasutage neid Wi-Fi andmeid, millega te praegu olete ühendatud.
|
||||
onboarding-wifi_creds-skip = Jätke Wi-Fi seaded vahele.
|
||||
onboarding-wifi_creds-submit = Jätka!
|
||||
onboarding-wifi_creds-ssid =
|
||||
.label = SSID
|
||||
.placeholder = Sisesta SSID
|
||||
onboarding-wifi_creds-password =
|
||||
.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
|
||||
|
||||
## 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
|
||||
onboarding-enter_vr-back = Minge tagasi jälgijate määramisse
|
||||
onboarding-enter_vr-title = Aeg minna VR-i!
|
||||
onboarding-enter_vr-description = Pange selga kõik jälgijad ja VR prillid.
|
||||
onboarding-enter_vr-ready = Olen valmis
|
||||
|
||||
## Setup done
|
||||
onboarding-done-title = Kõik on valmis!
|
||||
onboarding-done-description = Nautige enda kogu keha jälgimis kogemust
|
||||
onboarding-done-close = Sulgege juhend
|
||||
|
||||
## Tracker connection setup
|
||||
onboarding-connect_tracker-back = Minge tagasi Wi-Fi andmetesse
|
||||
onboarding-connect_tracker-title = Ühendage jälgijad
|
||||
onboarding-connect_tracker-description-p0 = Nüüd lähme lõbusa osa juurde, ühendame kõik jälgijad-
|
||||
onboarding-connect_tracker-description-p1 = Lihtsalt ühendage kõik jälgijad, mis ei ole ühendatud läbi USB enda arvutisse.
|
||||
onboarding-connect_tracker-issue-serial = Mul on probleeme ühenduse loomisega!
|
||||
onboarding-connect_tracker-usb = USB Jälgija
|
||||
onboarding-connect_tracker-connection_status-connecting = Saadame Wi-Fi andmeid
|
||||
onboarding-connect_tracker-connection_status-connected = Ühendatud Wi-Fi võrguga
|
||||
onboarding-connect_tracker-connection_status-error = Wi-Fi-ga ei saa ühendust luua!
|
||||
onboarding-connect_tracker-connection_status-start_connecting = Jälgijate otsimine
|
||||
onboarding-connect_tracker-connection_status-handshake = Ühendatud serveriga
|
||||
# $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] Mitte ühtegi jälgijat ühendatud
|
||||
[one] 1 jälgija
|
||||
*[other] { $amount } jälgijat
|
||||
} connected
|
||||
onboarding-connect_tracker-next = Olen ühendanud kõik oma jälgijad
|
||||
|
||||
## Tracker assignment setup
|
||||
onboarding-assign_trackers-back = Minge tagasi Wi-Fi andmetesse
|
||||
onboarding-assign_trackers-title = Määrake jälgijad asukoht
|
||||
onboarding-assign_trackers-description = Valime mis jälgijad lähevad kuhu. Vajutage asukohale kuhu te tahate, et jälgija läheks.
|
||||
# Look at translation of onboarding-connect_tracker-connected_trackers on how to use plurals
|
||||
# $assigned (Number) - Trackers that have been assigned a body part
|
||||
# $trackers (Number) - Trackers connected to the server
|
||||
onboarding-assign_trackers-assigned = { $assigned } of { $trackers ->
|
||||
[one] 1 jälgija
|
||||
*[other] { $trackers } jälgijat
|
||||
} assigned
|
||||
onboarding-assign_trackers-advanced = Kuva täpsemad määramiskohad
|
||||
onboarding-assign_trackers-next = Määrasin kõikide jälgijate asukohad
|
||||
|
||||
## Tracker manual mounting setup
|
||||
onboarding-manual_mounting-back = Minge tagasi, et siseneda VR-i
|
||||
onboarding-manual_mounting = Käsitsi paigaldamine
|
||||
onboarding-manual_mounting-description = Vajutage iga jälgija peale ja valige, kuidas see on paigaldatud
|
||||
onboarding-manual_mounting-auto_mounting = Automaatne paigaldamine
|
||||
onboarding-manual_mounting-next = Järgmine Samm
|
||||
|
||||
## Tracker automatic mounting setup
|
||||
onboarding-automatic_mounting-back = Minge tagasi, et siseneda VR-i
|
||||
onboarding-automatic_mounting-title = Paigaldamis kalibreerimine
|
||||
onboarding-automatic_mounting-description = Et SlimeVR jälgijad töötaksid peame me nendele seadistama paigaldamise pöörde, et need joondada teie füüsilise jälgijate paigaldusega.
|
||||
onboarding-automatic_mounting-manual_mounting = Manuaalselt seadistamine
|
||||
onboarding-automatic_mounting-next = Järgmine Samm
|
||||
onboarding-automatic_mounting-prev_step = Eelmine Samm
|
||||
onboarding-automatic_mounting-done-title = Paigalduse pööre kalibreeritud.
|
||||
onboarding-automatic_mounting-done-description = Teie paigalduse kalibreerimine on valmis!
|
||||
onboarding-automatic_mounting-done-restart = Minge algusese
|
||||
onboarding-automatic_mounting-mounting_reset-title = Paigalduse lähtestamine
|
||||
onboarding-automatic_mounting-mounting_reset-step-0 = 1. Kükita suusaasendis, jalad kõverad, ülakeha kallutatud ettepoole ja käed kõverad.
|
||||
onboarding-automatic_mounting-mounting_reset-step-1 = 2. Vajutage "Lähtesta Paigaldusasend" nuppu ja oodage 3 sekuntit ja jälgijate paigaldusasend lähtestatakse.
|
||||
onboarding-automatic_mounting-preparation-title = Ettevalmistus
|
||||
onboarding-automatic_mounting-preparation-step-0 = 1. Seiske püsti, käed kõrval.
|
||||
onboarding-automatic_mounting-preparation-step-1 = 2. Vajutage "Lähtesta" nuppu ja oodage 3 sekundit ja jälgijad lähtestatakse.
|
||||
onboarding-automatic_mounting-put_trackers_on-title = Pange kõik jälgijad peale
|
||||
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 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
|
||||
|
||||
## Tracker automatic proportions setup
|
||||
onboarding-automatic_proportions-back = Mine tagasi lähtestamise õppetusse
|
||||
onboarding-automatic_proportions-title = Mõõtke oma keha
|
||||
onboarding-automatic_proportions-description = Et SlimeVR jälgijad töötaks peame me teadma teie kontide pikkust. See lühike kalibreerimine mõõdab selle teie jaoks.
|
||||
onboarding-automatic_proportions-manual = Manuaalne Kalibreerimine
|
||||
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-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.
|
||||
onboarding-automatic_proportions-recording-processing = Tulemuse töötlemine
|
||||
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 15)
|
||||
onboarding-automatic_proportions-recording-timer = { $time ->
|
||||
[one] 1 sekund
|
||||
*[other] { $time } sekundit
|
||||
}
|
||||
onboarding-automatic_proportions-verify_results-title = Kontrollige tulemust
|
||||
onboarding-automatic_proportions-verify_results-description = Kontrollige tulemust all, kas kõik näeb välja korrektne?
|
||||
onboarding-automatic_proportions-verify_results-results = Salvestame tulemused
|
||||
onboarding-automatic_proportions-verify_results-processing = Tulemuse töötlemine
|
||||
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!
|
||||
|
||||
## Home
|
||||
home-no_trackers = Jälgijaid ei tuvastatud ega määratud
|
||||
540
gui/public/i18n/fr/translation.ftl
Normal file
540
gui/public/i18n/fr/translation.ftl
Normal file
@@ -0,0 +1,540 @@
|
||||
### 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!
|
||||
# And also comment the string if it's something not easy to translate, so you help
|
||||
# translators on what it means
|
||||
|
||||
## Websocket (server) status
|
||||
websocket-connecting = Connexion au serveur..
|
||||
websocket-connection_lost = Connexion avec le serveur perdue. Reconnexion...
|
||||
|
||||
## 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!
|
||||
|
||||
## Body parts
|
||||
body_part-NONE = Non-assigné
|
||||
body_part-HEAD = Tête
|
||||
body_part-NECK = Cou
|
||||
body_part-RIGHT_SHOULDER = Épaule droite
|
||||
body_part-RIGHT_UPPER_ARM = Bras droit
|
||||
body_part-RIGHT_LOWER_ARM = Avant-bras droit
|
||||
body_part-RIGHT_HAND = Main droite
|
||||
body_part-RIGHT_UPPER_LEG = Cuisse droite
|
||||
body_part-RIGHT_LOWER_LEG = Cheville droite
|
||||
body_part-RIGHT_FOOT = Pied droit
|
||||
body_part-RIGHT_CONTROLLER = Right controller
|
||||
body_part-CHEST = Poitrine
|
||||
body_part-WAIST = Taille
|
||||
body_part-HIP = Hanche
|
||||
body_part-LEFT_SHOULDER = Épaule gauche
|
||||
body_part-LEFT_UPPER_ARM = Bras gauche
|
||||
body_part-LEFT_LOWER_ARM = Avant-bras gauche
|
||||
body_part-LEFT_HAND = Main gauche
|
||||
body_part-LEFT_UPPER_LEG = Cuisse gauche
|
||||
body_part-LEFT_LOWER_LEG = Cheville gauche
|
||||
body_part-LEFT_FOOT = Pied gauche
|
||||
body_part-LEFT_CONTROLLER = Left controller
|
||||
|
||||
## Proportions
|
||||
skeleton_bone-NONE = Aucun
|
||||
skeleton_bone-HEAD = Décalage de la tête
|
||||
skeleton_bone-NECK = Longueur du cou
|
||||
skeleton_bone-CHEST = Longueur de la poitrine
|
||||
skeleton_bone-CHEST_OFFSET = Écart de la poitrine
|
||||
skeleton_bone-WAIST = Longueur de la taille
|
||||
skeleton_bone-HIP = Longueur des hanches
|
||||
skeleton_bone-HIP_OFFSET = Écart de la hanche
|
||||
skeleton_bone-HIPS_WIDTH = Largeur des hanches
|
||||
skeleton_bone-UPPER_LEG = Longueur des jambes supérieures
|
||||
skeleton_bone-LOWER_LEG = Longueur des jambes inférieures
|
||||
skeleton_bone-FOOT_LENGTH = Longueur des pieds
|
||||
skeleton_bone-FOOT_SHIFT = Décalage des pieds
|
||||
skeleton_bone-SKELETON_OFFSET = Écart du squelette
|
||||
skeleton_bone-SHOULDERS_DISTANCE = Distance des épaules
|
||||
skeleton_bone-SHOULDERS_WIDTH = Largeur des épaules
|
||||
skeleton_bone-UPPER_ARM = Longueur des bras supérieurs
|
||||
skeleton_bone-LOWER_ARM = Longueur des avant-bras
|
||||
skeleton_bone-CONTROLLER_Y = Distance Y des contrôleurs
|
||||
skeleton_bone-CONTROLLER_Z = Distance Z des contrôleurs
|
||||
skeleton_bone-ELBOW_OFFSET = Écart des coudes
|
||||
|
||||
## Tracker reset buttons
|
||||
reset-reset_all = Réinitialiser toutes les proportions
|
||||
reset-full = Réinitialiser
|
||||
reset-mounting = Réinitialiser l'alignement
|
||||
reset-quick = Réinitialisation rapide
|
||||
|
||||
## Serial detection stuff
|
||||
serial_detection-new_device-p0 = Nouveau périphérique détecté!
|
||||
serial_detection-new_device-p1 = Entrez vos identifiants Wi-Fi!
|
||||
serial_detection-new_device-p2 = Veuillez sélectionner quoi en faire
|
||||
serial_detection-open_wifi = Connecter au Wi-Fi
|
||||
serial_detection-open_serial = Ouvrir la console série
|
||||
serial_detection-submit = Soumettre!
|
||||
serial_detection-close = Fermer
|
||||
|
||||
## Navigation bar
|
||||
navbar-home = Accueil
|
||||
navbar-body_proportions = Proportions du corps
|
||||
navbar-trackers_assign = Asignement des capteurs
|
||||
navbar-mounting = Alignement des capteurs
|
||||
navbar-onboarding = Assistant de configuration
|
||||
navbar-settings = Réglages
|
||||
|
||||
## Bounding volume hierarchy recording
|
||||
bvh-start_recording = Enregistrer BVH
|
||||
bvh-recording = Enregistrement...
|
||||
|
||||
## Widget: Overlay settings
|
||||
widget-overlay = Squelette
|
||||
widget-overlay-is_visible_label = Superposer le squelette dans SteamVR
|
||||
widget-overlay-is_mirrored_label = Afficher le squelette en tant que miroir
|
||||
|
||||
## Widget: Developer settings
|
||||
widget-developer_mode = Mode développeur
|
||||
widget-developer_mode-high_contrast = Contraste élevé
|
||||
widget-developer_mode-precise_rotation = Rotation précise
|
||||
widget-developer_mode-fast_data_feed = Flux de données rapide
|
||||
widget-developer_mode-filter_slimes_and_hmd = Filtrer les capteurs SlimeVR et le casque VR
|
||||
widget-developer_mode-sort_by_name = Trier par nom
|
||||
widget-developer_mode-raw_slime_rotation = Rotation brute
|
||||
widget-developer_mode-more_info = Plus d'informations
|
||||
|
||||
## Widget: IMU Visualizer
|
||||
widget-imu_visualizer = Rotation
|
||||
widget-imu_visualizer-rotation_raw = Brute
|
||||
widget-imu_visualizer-rotation_preview = Aperçu
|
||||
|
||||
## Tracker status
|
||||
tracker-status-none = Pas de statut
|
||||
tracker-status-busy = Occupé
|
||||
tracker-status-error = Erreur
|
||||
tracker-status-disconnected = Déconnecté
|
||||
tracker-status-occluded = Obstrué
|
||||
tracker-status-ok = OK
|
||||
|
||||
## Tracker status columns
|
||||
tracker-table-column-name = Nom
|
||||
tracker-table-column-type = Type
|
||||
tracker-table-column-battery = Batterie
|
||||
tracker-table-column-ping = Ping
|
||||
tracker-table-column-tps = TPS
|
||||
tracker-table-column-temperature = Temp. °C
|
||||
tracker-table-column-linear-acceleration = Accél. X/Y/Z
|
||||
tracker-table-column-rotation = Rotation X/Y/Z
|
||||
tracker-table-column-position = Position X/Y/Z
|
||||
tracker-table-column-url = URL
|
||||
|
||||
## Tracker rotation
|
||||
tracker-rotation-front = Avant
|
||||
tracker-rotation-left = Gauche
|
||||
tracker-rotation-right = Droite
|
||||
tracker-rotation-back = Arrière
|
||||
|
||||
## Tracker information
|
||||
tracker-infos-manufacturer = Fabricant
|
||||
tracker-infos-display_name = Nom
|
||||
tracker-infos-custom_name = Nom personnalisé
|
||||
tracker-infos-url = URL
|
||||
|
||||
## Tracker settings
|
||||
tracker-settings-back = Retour à la liste des capteurs
|
||||
tracker-settings-title = Paramètres du capteur
|
||||
tracker-settings-assignment_section = Assignement du capteur
|
||||
tracker-settings-assignment_section-description = À quelle partie du corps le capteur est assigné.
|
||||
tracker-settings-assignment_section-edit = Ré-assigner
|
||||
tracker-settings-mounting_section = Orientation du capteur
|
||||
tracker-settings-mounting_section-description = Dans quelle direction pointe le capteur?
|
||||
tracker-settings-mounting_section-edit = Changer l'orientation
|
||||
tracker-settings-drift_compensation_section = Permettre la compensation de la dérive
|
||||
tracker-settings-drift_compensation_section-description = Ce capteur devrait-il compenser pour sa dérive si l'option est activée?
|
||||
tracker-settings-drift_compensation_section-edit = Permettre la compensation de la dérive
|
||||
# The .<name> means it's an attribute and it's related to the top key.
|
||||
# In this case that is the settings for the assignment section.
|
||||
tracker-settings-name_section = Nom personalisé
|
||||
tracker-settings-name_section-description = Donnez-lui un joli surnom :3
|
||||
tracker-settings-name_section-placeholder = Patte gauche d'Erimel
|
||||
|
||||
## Tracker part card info
|
||||
tracker-part_card-no_name = Sans nom
|
||||
tracker-part_card-unassigned = Non attribué
|
||||
|
||||
## Body assignment menu
|
||||
body_assignment_menu = Où assigner ce capteur?
|
||||
body_assignment_menu-description = Choisissez l'endroit où assigner ce capteur. Vous pouvez également gérer tous les capteurs à la fois.
|
||||
body_assignment_menu-show_advanced_locations = Afficher les emplacements d'attribution avancés
|
||||
body_assignment_menu-manage_trackers = Gérer tous les capteurs
|
||||
body_assignment_menu-unassign_tracker = Désassigner
|
||||
|
||||
## Tracker assignment menu
|
||||
# A -translation_key (with a dash in the front) means that it's a label.
|
||||
# It can only be used in the translation file, it's nice for reusing names and that kind of stuff.
|
||||
#
|
||||
# We are using it here because english doesn't require changing the text in each case but
|
||||
# maybe your language does.
|
||||
-tracker_selection-part = Which tracker to assign to your
|
||||
tracker_selection_menu-NONE = Which tracker do you want to be unassigned?
|
||||
tracker_selection_menu-HEAD = { -tracker_selection-part } head?
|
||||
tracker_selection_menu-NECK = { -tracker_selection-part } neck?
|
||||
tracker_selection_menu-RIGHT_SHOULDER = { -tracker_selection-part } right shoulder?
|
||||
tracker_selection_menu-RIGHT_UPPER_ARM = { -tracker_selection-part } right upper arm?
|
||||
tracker_selection_menu-RIGHT_LOWER_ARM = { -tracker_selection-part } right lower arm?
|
||||
tracker_selection_menu-RIGHT_HAND = { -tracker_selection-part } right hand?
|
||||
tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } right thigh?
|
||||
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } right ankle?
|
||||
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } right foot?
|
||||
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } right controller?
|
||||
tracker_selection_menu-CHEST = { -tracker_selection-part } chest?
|
||||
tracker_selection_menu-WAIST = { -tracker_selection-part } waist?
|
||||
tracker_selection_menu-HIP = { -tracker_selection-part } hip?
|
||||
tracker_selection_menu-LEFT_SHOULDER = { -tracker_selection-part } left shoulder?
|
||||
tracker_selection_menu-LEFT_UPPER_ARM = { -tracker_selection-part } left upper arm?
|
||||
tracker_selection_menu-LEFT_LOWER_ARM = { -tracker_selection-part } left lower arm?
|
||||
tracker_selection_menu-LEFT_HAND = { -tracker_selection-part } left hand?
|
||||
tracker_selection_menu-LEFT_UPPER_LEG = { -tracker_selection-part } left thigh?
|
||||
tracker_selection_menu-LEFT_LOWER_LEG = { -tracker_selection-part } left ankle?
|
||||
tracker_selection_menu-LEFT_FOOT = { -tracker_selection-part } left foot?
|
||||
tracker_selection_menu-LEFT_CONTROLLER = { -tracker_selection-part } left controller?
|
||||
|
||||
tracker_selection_menu-unassigned = Capteurs non assignés
|
||||
tracker_selection_menu-assigned = Capteurs assignés
|
||||
tracker_selection_menu-dont_assign = Ne pas attribuer
|
||||
|
||||
## Mounting menu
|
||||
mounting_selection_menu = Dans quelle direction pointe ce capteur?
|
||||
mounting_selection_menu-close = Fermer
|
||||
|
||||
## Sidebar settings
|
||||
settings-sidebar-title = Réglages
|
||||
settings-sidebar-general = Général
|
||||
settings-sidebar-tracker_mechanics = Paramètres des capteurs
|
||||
settings-sidebar-fk_settings = Paramètres de la capture
|
||||
settings-sidebar-gesture_control = Contrôle gestuel
|
||||
settings-sidebar-interface = Interface
|
||||
settings-sidebar-osc_router = Routeur OSC
|
||||
settings-sidebar-utils = Utilitaires
|
||||
settings-sidebar-serial = Console série
|
||||
|
||||
## SteamVR settings
|
||||
settings-general-steamvr = SteamVR
|
||||
settings-general-steamvr-subtitle = Capteurs SteamVR
|
||||
# Not all translation keys support multiline, only the ones that specify it will actually
|
||||
# split it in lines (that also means you can split in lines however you want in those).
|
||||
# The first spaces (not tabs) for indentation will be ignored, just to make the file look nice when writing.
|
||||
# This one is one of this cases that cares about multilines
|
||||
settings-general-steamvr-description =
|
||||
Activez ou désactivez des capteurs SteamVR.
|
||||
Utile pour les jeux ou applications qui ne supportent que certains capteurs.
|
||||
settings-general-steamvr-trackers-waist = Taille
|
||||
settings-general-steamvr-trackers-chest = Poitrine
|
||||
settings-general-steamvr-trackers-feet = Pieds
|
||||
settings-general-steamvr-trackers-knees = Genoux
|
||||
settings-general-steamvr-trackers-elbows = Coudes
|
||||
settings-general-steamvr-trackers-hands = Mains
|
||||
|
||||
## Tracker mechanics
|
||||
settings-general-tracker_mechanics = Paramètres des capteurs
|
||||
settings-general-tracker_mechanics-filtering = Filtrage
|
||||
# This also cares about multilines
|
||||
settings-general-tracker_mechanics-filtering-description =
|
||||
Choisissez le type de filtrage pour vos capteurs.
|
||||
La prédiction prédit les mouvements tandis que la fluidification rend les mouvements plus fluides.
|
||||
settings-general-tracker_mechanics-filtering-type = Type de filtrage
|
||||
settings-general-tracker_mechanics-filtering-type-none = Pas de filtrage
|
||||
settings-general-tracker_mechanics-filtering-type-none-description = Utilisez les rotations telles quelles.
|
||||
settings-general-tracker_mechanics-filtering-type-smoothing = Fluidification
|
||||
settings-general-tracker_mechanics-filtering-type-smoothing-description = Fluidifie les mouvements mais ajoute un peu de latence.
|
||||
settings-general-tracker_mechanics-filtering-type-prediction = Prédiction
|
||||
settings-general-tracker_mechanics-filtering-type-prediction-description = Réduit la latence et rend les mouvements plus vifs, mais moins fluides.
|
||||
settings-general-tracker_mechanics-filtering-amount = Intensité du filtrage
|
||||
settings-general-tracker_mechanics-drift_compensation = Compensation de la dérive
|
||||
# This cares about multilines
|
||||
settings-general-tracker_mechanics-drift_compensation-description =
|
||||
Compense la dérive des gyroscopes en appliquant une rotation inverse.
|
||||
Modifier la force de la compensation et le nombre de réinitialisations prises en compte.
|
||||
settings-general-tracker_mechanics-drift_compensation-enabled-label = Compensation de la dérive
|
||||
settings-general-tracker_mechanics-drift_compensation-amount-label = Force de la compensation
|
||||
settings-general-tracker_mechanics-drift_compensation-max_resets-label = Nombre de réinitialisations prises en compte
|
||||
|
||||
## FK/Tracking settings
|
||||
settings-general-fk_settings = Paramètres de la capture
|
||||
settings-general-fk_settings-leg_tweak = Ajustement des jambes
|
||||
settings-general-fk_settings-leg_tweak-description = Le limitage au sol empêche vos pieds de traverser le sol, mais peut causer des problèmes lorsque vous êtes à genoux. La correction du glissement réduit le glissement, mais peut réduire la précision de certains mouvements.
|
||||
# Floor clip:
|
||||
# why the name - came from the idea of noclip in video games, but is the opposite where clipping to the floor is a desired feature
|
||||
# definition - Prevents the foot trackers from going lower than they where when a reset was performed
|
||||
settings-general-fk_settings-leg_tweak-floor_clip = Limitage au sol
|
||||
# Skating correction:
|
||||
# why the name - without this enabled the feet will often slide across the ground as if your skating across the ground,
|
||||
# since this largely prevents this it corrects for it hence skating correction (note this may be renamed to sliding correction)
|
||||
# definition - Guesses when each foot is in contact with the ground and uses that information to improve tracking
|
||||
settings-general-fk_settings-leg_tweak-skating_correction = Correction du glissement
|
||||
settings-general-fk_settings-leg_tweak-skating_correction-amount = Force de la correction du glissement
|
||||
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-i_pose = Utiliser la i-pose au lieu de la t-pose
|
||||
settings-general-fk_settings-skeleton_settings = Paramètres du squelette
|
||||
settings-general-fk_settings-skeleton_settings-description = Activez ou désactivez des paramètres avancés de capture.
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine = Colone vertébrale avancée
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis = Bassin avancé
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees = Genoux avancés
|
||||
settings-general-fk_settings-vive_emulation-title = Vive emulation
|
||||
settings-general-fk_settings-vive_emulation-description = Emulate the waist tracker problems that Vive trackers have. This is a joke and makes tracking worse.
|
||||
settings-general-fk_settings-vive_emulation-label = Enable Vive emulation
|
||||
|
||||
## Gesture control settings (tracker tapping)
|
||||
settings-general-gesture_control = Contrôle gestuel
|
||||
settings-general-gesture_control-subtitle = Double tape pour réinitialisation rapide
|
||||
settings-general-gesture_control-description = Permet de déclencher des réinitialisations en tapant un capteur. Le capteur le plus haut sur votre torse est utilisé pour la réinitialisation rapide, le capteur le plus haut sur votre jambe gauche est utilisé pour la réinitialisation, et le capteur le plus haut sur votre jambe droite est utilisé pour la réinitialisation de l'alignement. Les tapes doivent être enchainées en moins de 0,6 seconde pour être pris en compte.
|
||||
# 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
|
||||
}
|
||||
settings-general-gesture_control-quickResetEnabled = Taper pour réinitialisation rapide
|
||||
settings-general-gesture_control-quickResetDelay = Délai de réinitialisation rapide
|
||||
settings-general-gesture_control-quickResetTaps = Tapes pour réinitialisation rapide
|
||||
settings-general-gesture_control-resetEnabled = Taper pour réinitialisation
|
||||
settings-general-gesture_control-resetDelay = Délai de réinitialisation
|
||||
settings-general-gesture_control-resetTaps = Tapes pour réinitialisation
|
||||
settings-general-gesture_control-mountingResetEnabled = Taper pour réinitialisation de l'alignement
|
||||
settings-general-gesture_control-mountingResetDelay = Délai de réinitialisation de l'alignement
|
||||
settings-general-gesture_control-mountingResetTaps = Tapes pour la réinitialisation de l'alignement
|
||||
|
||||
## Interface settings
|
||||
settings-general-interface = Interface
|
||||
settings-general-interface-dev_mode = Mode développeur
|
||||
settings-general-interface-dev_mode-description = Ce mode peut être utile pour avoir des données approfondies ou pour interagir avec des capteurs connectés à un niveau plus avancé.
|
||||
settings-general-interface-dev_mode-label = Mode développeur
|
||||
settings-general-interface-serial_detection = Détection de périphérique série
|
||||
settings-general-interface-serial_detection-description = Cette option affichera une fenêtre chaque fois qu'un nouveau périphérique série qui pourrait être un capteur est connecté.
|
||||
settings-general-interface-serial_detection-label = Détection de périphérique série
|
||||
settings-general-interface-lang = Sélectionner la langue
|
||||
settings-general-interface-lang-description = Choisir la langue par défaut.
|
||||
settings-general-interface-lang-placeholder = Choisissez la langue
|
||||
|
||||
## Serial settings
|
||||
settings-serial = Console série
|
||||
# This cares about multilines
|
||||
settings-serial-description =
|
||||
Il s'agit d'un flux d'informations en direct pour la communication en série.
|
||||
Peut être utile pour savoir si un capteur fonctionne correctement.
|
||||
settings-serial-connection_lost = Connexion à l'appareil perdue, reconnexion...
|
||||
settings-serial-reboot = Redémarrer
|
||||
settings-serial-factory_reset = Remise à zéro
|
||||
settings-serial-get_infos = Obtenir des informations
|
||||
settings-serial-serial_select = Sélectionnez un port série
|
||||
settings-serial-auto_dropdown_item = Automatique
|
||||
|
||||
## OSC router settings
|
||||
settings-osc-router = Routeur OSC
|
||||
# This cares about multilines
|
||||
settings-osc-router-description =
|
||||
Transférez les messages OSC provenant d'un autre programme
|
||||
Utile pour utiliser un autre programme OSC avec VRChat par exemple.
|
||||
settings-osc-router-enable = Activer
|
||||
settings-osc-router-enable-description = Activer/désactiver le transfert de messages.
|
||||
settings-osc-router-enable-label = Activer
|
||||
settings-osc-router-network = Ports réseau
|
||||
# This cares about multilines
|
||||
settings-osc-router-network-description =
|
||||
Définissez les ports pour écouter et envoyer des données.
|
||||
Ces ports peuvent être les mêmes que les autres utilisés dans le serveur SlimeVR.
|
||||
settings-osc-router-network-port_in =
|
||||
.label = Port de réception
|
||||
.placeholder = Port de réception (par défaut: 9002)
|
||||
settings-osc-router-network-port_out =
|
||||
.label = Port d'envoi
|
||||
.placeholder = Port d'envoi (par défaut: 9000)
|
||||
settings-osc-router-network-address = Adresse réseau
|
||||
settings-osc-router-network-address-description = Choisissez l'adresse vers laquelle envoyer les données.
|
||||
settings-osc-router-network-address-placeholder = Adresse IPv4
|
||||
|
||||
## OSC VRChat settings
|
||||
settings-osc-vrchat = VRChat OSC Trackers
|
||||
# This cares about multilines
|
||||
settings-osc-vrchat-description =
|
||||
Modifiez les paramètres spécifiques à VRChat pour recevoir et envoyer
|
||||
des capteurs par OSC (fonctionne sur Quest sans PC).
|
||||
settings-osc-vrchat-enable = Activer
|
||||
settings-osc-vrchat-enable-description = Activer/désactiver l'envoi et la réception de données.
|
||||
settings-osc-vrchat-enable-label = Activer
|
||||
settings-osc-vrchat-network = Connexions réseau
|
||||
settings-osc-vrchat-network-description = Définissez les ports pour écouter et envoyer des données à VRChat.
|
||||
settings-osc-vrchat-network-port_in =
|
||||
.label = Port d'entrée
|
||||
.placeholder = Port de réception (par défaut : 9001)
|
||||
settings-osc-vrchat-network-port_out =
|
||||
.label = Port de sortie
|
||||
.placeholder = Port d'envoi (par défaut : 9000)
|
||||
settings-osc-vrchat-network-address = Adresse réseau
|
||||
settings-osc-vrchat-network-address-description = Choisissez l'adresse à laquelle envoyer les données à VRChat (vérifiez les réseaux Wi-Fi de votre appareil).
|
||||
settings-osc-vrchat-network-address-placeholder = Adresse IP VRChat
|
||||
settings-osc-vrchat-network-trackers = capteurs
|
||||
settings-osc-vrchat-network-trackers-description = Sélectionner quels capteurs envoyer via OSC.
|
||||
settings-osc-vrchat-network-trackers-chest = Poitrine
|
||||
settings-osc-vrchat-network-trackers-waist = Taille
|
||||
settings-osc-vrchat-network-trackers-knees = Genoux
|
||||
settings-osc-vrchat-network-trackers-feet = Pieds
|
||||
settings-osc-vrchat-network-trackers-elbows = Coudes
|
||||
|
||||
## Setup/onboarding menu
|
||||
onboarding-skip = Passer
|
||||
onboarding-continue = Continuer
|
||||
onboarding-wip = Pas encore implémenté
|
||||
|
||||
## Wi-Fi setup
|
||||
onboarding-wifi_creds-back = Retour à l'introduction
|
||||
onboarding-wifi_creds = Saisir les identifiants Wi-Fi
|
||||
# This cares about multilines
|
||||
onboarding-wifi_creds-description =
|
||||
Les capteurs utiliseront ces informations d'identification pour se connecter au réseau.
|
||||
Veuillez utiliser les identifiants avec lesquels vous êtes actuellement connecté.
|
||||
onboarding-wifi_creds-skip = Passer la configuration Wi-Fi
|
||||
onboarding-wifi_creds-submit = Valider
|
||||
onboarding-wifi_creds-ssid =
|
||||
.label = Nom du Wi-Fi
|
||||
.placeholder = Nom
|
||||
onboarding-wifi_creds-password =
|
||||
.label = Mot de passe du Wi-Fi
|
||||
.placeholder = Mot de passe
|
||||
|
||||
## Mounting setup
|
||||
onboarding-reset_tutorial-back = Retourner à l'alignement des capteurs
|
||||
onboarding-reset_tutorial = Didacticiel de réinitialisation
|
||||
onboarding-reset_tutorial-description = Cette fonctionnalité n'est pas encore terminée, appuyez simplement sur continuer
|
||||
|
||||
## Setup start
|
||||
onboarding-home = Bienvenue sur SlimeVR
|
||||
# This cares about multilines and it's centered!!
|
||||
onboarding-home-description =
|
||||
Rendre la capture des mouvements
|
||||
accessible à toutes et tous!
|
||||
onboarding-home-start = Commencer!
|
||||
|
||||
## Enter VR part of setup
|
||||
onboarding-enter_vr-back = Revenir à l'attribution des capteurs
|
||||
onboarding-enter_vr-title = Il est temps d'entrer en réalité virtuelle!
|
||||
onboarding-enter_vr-description = Enfilez tous vos capteurs puis entrez en réalité virtuelle!
|
||||
onboarding-enter_vr-ready = je suis prêt!
|
||||
|
||||
## Setup done
|
||||
onboarding-done-title = Vous êtes prêt!
|
||||
onboarding-done-description = Amusez-vous bien :)
|
||||
onboarding-done-close = Fermer le guide
|
||||
|
||||
## Tracker connection setup
|
||||
onboarding-connect_tracker-back = Revenir aux informations d'identification Wi-Fi
|
||||
onboarding-connect_tracker-title = Connecter les capteurs
|
||||
onboarding-connect_tracker-description-p0 = Passons maintenant à la partie amusante, en connectant tous les capteurs!
|
||||
onboarding-connect_tracker-description-p1 = Connectez chaque capteur qui n'est pas encore connecté via un port USB.
|
||||
onboarding-connect_tracker-issue-serial = J'ai du mal à me connecter!
|
||||
onboarding-connect_tracker-usb = Capteur USB
|
||||
onboarding-connect_tracker-connection_status-connecting = Envoi d'identifiants Wi-Fi
|
||||
onboarding-connect_tracker-connection_status-connected = Connecté au Wi-Fi
|
||||
onboarding-connect_tracker-connection_status-error = Impossible de se connecter au réseau
|
||||
onboarding-connect_tracker-connection_status-start_connecting = Recherche de capteurs
|
||||
onboarding-connect_tracker-connection_status-handshake = Connecté au serveur
|
||||
# $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] No trackers
|
||||
[one] 1 tracker
|
||||
*[other] { $amount } trackers
|
||||
} connected
|
||||
onboarding-connect_tracker-next = J'ai connecté tous mes capteurs
|
||||
|
||||
## Tracker assignment setup
|
||||
onboarding-assign_trackers-back = Revenir aux identifiants Wi-Fi
|
||||
onboarding-assign_trackers-title = Attribuer des capteurs
|
||||
onboarding-assign_trackers-description = Choisissons où mettre chaque capteur.
|
||||
# Look at translation of onboarding-connect_tracker-connected_trackers on how to use plurals
|
||||
# $assigned (Number) - Trackers that have been assigned a body part
|
||||
# $trackers (Number) - Trackers connected to the server
|
||||
onboarding-assign_trackers-assigned = { $assigned } of { $trackers ->
|
||||
[one] 1 tracker
|
||||
*[other] { $trackers } trackers
|
||||
} assigned
|
||||
onboarding-assign_trackers-advanced = Afficher les emplacements d'attribution avancés
|
||||
onboarding-assign_trackers-next = J'ai assigné tous mes capteurs
|
||||
|
||||
## Tracker manual mounting setup
|
||||
onboarding-manual_mounting-back = Retournez à entrer dans la réalité virtuelle
|
||||
onboarding-manual_mounting = Alignement manuel
|
||||
onboarding-manual_mounting-description = Cliquez sur chaque capteur et sélectionnez la manière dont ils sont orientés
|
||||
onboarding-manual_mounting-auto_mounting = Détection automatique
|
||||
onboarding-manual_mounting-next = Prochaine étape
|
||||
|
||||
## Tracker automatic mounting setup
|
||||
onboarding-automatic_mounting-back = Retournez à entrer dans la réalité virtuelle
|
||||
onboarding-automatic_mounting-title = Calibration de l'alignement des capteurs
|
||||
onboarding-automatic_mounting-description = Pour que vos capteurs SlimeVR fonctionnent, nous devons attribuer une rotation à vos capteurs pour les aligner avec la rotation réelle de ces derniers.
|
||||
onboarding-automatic_mounting-manual_mounting = Alignement manuel
|
||||
onboarding-automatic_mounting-next = Prochaine étape
|
||||
onboarding-automatic_mounting-prev_step = Étape précédente
|
||||
onboarding-automatic_mounting-done-title = C'est terminé!
|
||||
onboarding-automatic_mounting-done-description = L'alignement des capteurs est calibré!
|
||||
onboarding-automatic_mounting-done-restart = Retourner au début
|
||||
onboarding-automatic_mounting-mounting_reset-title = Réinitialisation de l'alignement
|
||||
onboarding-automatic_mounting-mounting_reset-step-0 = 1. Accroupissez-vous dans une pose de "ski" avec les jambes pliées, le haut du corps incliné vers l'avant et les bras pliés.
|
||||
onboarding-automatic_mounting-mounting_reset-step-1 = 2. Appuyez sur le bouton "Réinitialiser l'alignement" et attendez 3 secondes avant que l'alignement des capteurs se calibre.
|
||||
onboarding-automatic_mounting-preparation-title = Préparation
|
||||
onboarding-automatic_mounting-preparation-step-0 = 1. Tenez-vous debout avec vos bras à vos côtés.
|
||||
onboarding-automatic_mounting-preparation-step-1 = 2. Appuyez sur le bouton "Réinitialiser" et attendez 3 secondes avant que les capteurs ne se réinitialisent.
|
||||
onboarding-automatic_mounting-put_trackers_on-title = Enfilez vos capteurs
|
||||
onboarding-automatic_mounting-put_trackers_on-description = Pour calibrer l'alignement, nous allons utiliser les capteurs que vous venez d'affecter.
|
||||
onboarding-automatic_mounting-put_trackers_on-next = J'ai tous mes capteurs
|
||||
|
||||
## Tracker manual proportions setup
|
||||
onboarding-manual_proportions-back = Revenir au didacticiel de réinitialisation
|
||||
onboarding-manual_proportions-title = Proportions manuelles du corps
|
||||
onboarding-manual_proportions-precision = Ajustement de précision
|
||||
onboarding-manual_proportions-auto = Calibration automatique
|
||||
|
||||
## Tracker automatic proportions setup
|
||||
onboarding-automatic_proportions-back = Revenir au didacticiel de réinitialisation
|
||||
onboarding-automatic_proportions-title = Calibration des proportions du corps
|
||||
onboarding-automatic_proportions-description = Pour que les capteurs SlimeVR fonctionnent, nous devons connaître la longueur de vos os.
|
||||
onboarding-automatic_proportions-manual = Calibration manuelle
|
||||
onboarding-automatic_proportions-prev_step = Étape précédente
|
||||
onboarding-automatic_proportions-put_trackers_on-title = Enfilez vos capteurs
|
||||
onboarding-automatic_proportions-put_trackers_on-description = Pour calibrer vos proportions, nous allons utiliser les capteurs que vous venez d'assigner.
|
||||
onboarding-automatic_proportions-put_trackers_on-next = J'ai tous mes capteurs
|
||||
onboarding-automatic_proportions-preparation-title = Préparation
|
||||
onboarding-automatic_proportions-preparation-description = Placez une chaise directement derrière vous dans votre espace de jeu.
|
||||
onboarding-automatic_proportions-preparation-next = je suis devant une chaise
|
||||
onboarding-automatic_proportions-start_recording-title = Préparez-vous à bouger
|
||||
onboarding-automatic_proportions-start_recording-description = Nous allons maintenant enregistrer des poses et des mouvements spécifiques.
|
||||
onboarding-automatic_proportions-start_recording-next = Commencer l'enregistrement
|
||||
onboarding-automatic_proportions-recording-title = Enregistrement
|
||||
onboarding-automatic_proportions-recording-description-p0 = Enregistrement en cours...
|
||||
onboarding-automatic_proportions-recording-description-p1 = Effectuez les mouvements indiqués ci-dessous:
|
||||
onboarding-automatic_proportions-recording-steps-0 = Pliez les genoux plusieurs fois.
|
||||
onboarding-automatic_proportions-recording-steps-1 = Asseyez-vous sur une chaise puis levez-vous.
|
||||
onboarding-automatic_proportions-recording-steps-2 = Tournez le haut du corps vers la gauche, puis panchez vers la droite.
|
||||
onboarding-automatic_proportions-recording-steps-3 = Tournez le haut du corps vers la droite, puis panchez vers la gauche.
|
||||
onboarding-automatic_proportions-recording-steps-4 = Remuez jusqu'à ce que la minuterie se termine.
|
||||
onboarding-automatic_proportions-recording-processing = Traitement du résultat
|
||||
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 15)
|
||||
onboarding-automatic_proportions-recording-timer = { $time ->
|
||||
[one] 1 second left
|
||||
*[other] { $time } seconds left
|
||||
}
|
||||
onboarding-automatic_proportions-verify_results-title = Vérifier les résultats
|
||||
onboarding-automatic_proportions-verify_results-description = Les résultats ci-dessous vous semblent-ils corrects?
|
||||
onboarding-automatic_proportions-verify_results-results = Enregistrement des résultats
|
||||
onboarding-automatic_proportions-verify_results-processing = Traitement du résultat
|
||||
onboarding-automatic_proportions-verify_results-redo = Refaire l'enregistrement
|
||||
onboarding-automatic_proportions-verify_results-confirm = Les resultats sont corrects
|
||||
onboarding-automatic_proportions-done-title = Calibration terminée
|
||||
onboarding-automatic_proportions-done-description = Votre calibration est terminée!
|
||||
|
||||
## Home
|
||||
home-no_trackers = Aucun capteur détecté ou attribué
|
||||
540
gui/public/i18n/it/translation.ftl
Normal file
540
gui/public/i18n/it/translation.ftl
Normal file
@@ -0,0 +1,540 @@
|
||||
### 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!
|
||||
# And also comment the string if it's something not easy to translate, so you help
|
||||
# translators on what it means
|
||||
|
||||
## Websocket (server) status
|
||||
websocket-connecting = Connessione al server in corso
|
||||
websocket-connection_lost = Connessione con il server persa. Tentativo di riconnessione in corso...
|
||||
|
||||
## Tips
|
||||
tips-find_tracker = Non sei sicurə quale tracker è quale? Agitalo e l'oggetto corrispondente sarà evidenziato.
|
||||
tips-do_not_move_heels = Assicurati di non muovere i tuoi talloni durante la registrazione!
|
||||
|
||||
## Body parts
|
||||
body_part-NONE = Non assegnato
|
||||
body_part-HEAD = Testa
|
||||
body_part-NECK = Collo
|
||||
body_part-RIGHT_SHOULDER = Spalla destra
|
||||
body_part-RIGHT_UPPER_ARM = Braccio destro
|
||||
body_part-RIGHT_LOWER_ARM = Avambraccio destro
|
||||
body_part-RIGHT_HAND = Mano destra
|
||||
body_part-RIGHT_UPPER_LEG = Coscia destra
|
||||
body_part-RIGHT_LOWER_LEG = Caviglia destra
|
||||
body_part-RIGHT_FOOT = Piede destro
|
||||
body_part-RIGHT_CONTROLLER = Right controller
|
||||
body_part-CHEST = Petto
|
||||
body_part-WAIST = Girovita
|
||||
body_part-HIP = Fianchi
|
||||
body_part-LEFT_SHOULDER = Spalla sinistra
|
||||
body_part-LEFT_UPPER_ARM = Braccio sinistro
|
||||
body_part-LEFT_LOWER_ARM = Avambraccio sinistro
|
||||
body_part-LEFT_HAND = Mano sinistra
|
||||
body_part-LEFT_UPPER_LEG = Coscia sinistra
|
||||
body_part-LEFT_LOWER_LEG = Caviglia sinistra
|
||||
body_part-LEFT_FOOT = Piede sinistro
|
||||
body_part-LEFT_CONTROLLER = Left controller
|
||||
|
||||
## Proportions
|
||||
skeleton_bone-NONE = Non assegnato
|
||||
skeleton_bone-HEAD = Correzione Testa
|
||||
skeleton_bone-NECK = Lunghezza Collo
|
||||
skeleton_bone-CHEST = Chest Length
|
||||
skeleton_bone-CHEST_OFFSET = Chest Offset
|
||||
skeleton_bone-WAIST = Waist Length
|
||||
skeleton_bone-HIP = Hip Length
|
||||
skeleton_bone-HIP_OFFSET = Correzione Fianchi
|
||||
skeleton_bone-HIPS_WIDTH = Larghezza Fianchi
|
||||
skeleton_bone-UPPER_LEG = Upper Leg Length
|
||||
skeleton_bone-LOWER_LEG = Lower Leg Length
|
||||
skeleton_bone-FOOT_LENGTH = Lunghezza Piedi
|
||||
skeleton_bone-FOOT_SHIFT = Correzione Piedi
|
||||
skeleton_bone-SKELETON_OFFSET = Compensazione scheletro
|
||||
skeleton_bone-SHOULDERS_DISTANCE = Distanza Spalle
|
||||
skeleton_bone-SHOULDERS_WIDTH = Larghezza Spalle
|
||||
skeleton_bone-UPPER_ARM = Lunghezza Braccia
|
||||
skeleton_bone-LOWER_ARM = Distanza Avambracci
|
||||
skeleton_bone-CONTROLLER_Y = Distanza Y Controller
|
||||
skeleton_bone-CONTROLLER_Z = Distanza Z Controller
|
||||
skeleton_bone-ELBOW_OFFSET = Correzione Gomito
|
||||
|
||||
## Tracker reset buttons
|
||||
reset-reset_all = Ripristina tutte le proporzioni
|
||||
reset-full = Ripristina
|
||||
reset-mounting = Ripristina posizionamento
|
||||
reset-quick = Reset veloce
|
||||
|
||||
## Serial detection stuff
|
||||
serial_detection-new_device-p0 = Nuovo dispositivo seriale rilevato!
|
||||
serial_detection-new_device-p1 = Inserisci le tue credenziali Wi-Fi!
|
||||
serial_detection-new_device-p2 = Seleziona come utilizzare il tracker, per piacere
|
||||
serial_detection-open_wifi = Connetti al Wi-Fi
|
||||
serial_detection-open_serial = Apri la Serial Console
|
||||
serial_detection-submit = Conferma!
|
||||
serial_detection-close = Chiudi
|
||||
|
||||
## Navigation bar
|
||||
navbar-home = Home
|
||||
navbar-body_proportions = Proporzioni del corpo
|
||||
navbar-trackers_assign = Assegnazione dei tracker
|
||||
navbar-mounting = Calibrazione della posizionamento
|
||||
navbar-onboarding = Installazione guidata
|
||||
navbar-settings = Impostazioni
|
||||
|
||||
## Bounding volume hierarchy recording
|
||||
bvh-start_recording = Registra BVH
|
||||
bvh-recording = Registrazione in corso...
|
||||
|
||||
## Widget: Overlay settings
|
||||
widget-overlay = Overlay
|
||||
widget-overlay-is_visible_label = Mostra Overlay in SteamVR
|
||||
widget-overlay-is_mirrored_label = Includi uno specchio nel Overlay
|
||||
|
||||
## Widget: Developer settings
|
||||
widget-developer_mode = Developer Mode
|
||||
widget-developer_mode-high_contrast = High contrast
|
||||
widget-developer_mode-precise_rotation = Precise rotation
|
||||
widget-developer_mode-fast_data_feed = Fast data feed
|
||||
widget-developer_mode-filter_slimes_and_hmd = Filter slimes and HMD
|
||||
widget-developer_mode-sort_by_name = Sort by name
|
||||
widget-developer_mode-raw_slime_rotation = Raw rotation
|
||||
widget-developer_mode-more_info = More info
|
||||
|
||||
## Widget: IMU Visualizer
|
||||
widget-imu_visualizer = Rotation
|
||||
widget-imu_visualizer-rotation_raw = Raw
|
||||
widget-imu_visualizer-rotation_preview = Preview
|
||||
|
||||
## Tracker status
|
||||
tracker-status-none = Nessuno Stato
|
||||
tracker-status-busy = Occupato
|
||||
tracker-status-error = Errore
|
||||
tracker-status-disconnected = Disconnesso
|
||||
tracker-status-occluded = Ostruito
|
||||
tracker-status-ok = Connesso
|
||||
|
||||
## Tracker status columns
|
||||
tracker-table-column-name = Nome
|
||||
tracker-table-column-type = Tipologia
|
||||
tracker-table-column-battery = Batteria
|
||||
tracker-table-column-ping = Ping
|
||||
tracker-table-column-tps = TPS
|
||||
tracker-table-column-temperature = Temp. °C
|
||||
tracker-table-column-linear-acceleration = Accel. X/Y/Z
|
||||
tracker-table-column-rotation = Rotazione X/Y/Z
|
||||
tracker-table-column-position = Rotazione X/Y/Z
|
||||
tracker-table-column-url = URL
|
||||
|
||||
## Tracker rotation
|
||||
tracker-rotation-front = Davanti
|
||||
tracker-rotation-left = Sinistra
|
||||
tracker-rotation-right = Destra
|
||||
tracker-rotation-back = Dietro
|
||||
|
||||
## Tracker information
|
||||
tracker-infos-manufacturer = Produttore
|
||||
tracker-infos-display_name = Nome da visualizzare
|
||||
tracker-infos-custom_name = Nome Personalizzato
|
||||
tracker-infos-url = URL del tracker
|
||||
|
||||
## Tracker settings
|
||||
tracker-settings-back = Torna alla lista dei tracker
|
||||
tracker-settings-title = Impostazioni del tracker
|
||||
tracker-settings-assignment_section = Assegnazione
|
||||
tracker-settings-assignment_section-description = Definisce a che paste del corpo è assegnato il tracker.
|
||||
tracker-settings-assignment_section-edit = Cambia assegnazione
|
||||
tracker-settings-mounting_section = posizionamento di montaggio
|
||||
tracker-settings-mounting_section-description = Come è posizionato il tracker?
|
||||
tracker-settings-mounting_section-edit = Cambia posizionamento
|
||||
tracker-settings-drift_compensation_section = Allow drift compensation
|
||||
tracker-settings-drift_compensation_section-description = Should this tracker compensate for its drift when drift compensation is enabled?
|
||||
tracker-settings-drift_compensation_section-edit = Allow drift compensation
|
||||
# The .<name> means it's an attribute and it's related to the top key.
|
||||
# In this case that is the settings for the assignment section.
|
||||
tracker-settings-name_section = Nome del tracker
|
||||
tracker-settings-name_section-description = Scegli un nomignolo carino :)
|
||||
tracker-settings-name_section-placeholder = Gamba destra di NightyQueer
|
||||
|
||||
## Tracker part card info
|
||||
tracker-part_card-no_name = Nessun nome
|
||||
tracker-part_card-unassigned = Non assegnato
|
||||
|
||||
## Body assignment menu
|
||||
body_assignment_menu = Con che parte del corpo vuoi utilizzare il tracker?
|
||||
body_assignment_menu-description = Scegli una parte del corpo a cui assegnare questo tracker. Alternativamente puoi scegliere di gestire tutti i tracker in una schermata unica invece che singolarmente.
|
||||
body_assignment_menu-show_advanced_locations = Mostra impostazioni avanzate di Assegnazione
|
||||
body_assignment_menu-manage_trackers = Gestisci tutti i tracker
|
||||
body_assignment_menu-unassign_tracker = Rimuovi assegnazione del tracker
|
||||
|
||||
## Tracker assignment menu
|
||||
# A -translation_key (with a dash in the front) means that it's a label.
|
||||
# It can only be used in the translation file, it's nice for reusing names and that kind of stuff.
|
||||
#
|
||||
# We are using it here because english doesn't require changing the text in each case but
|
||||
# maybe your language does.
|
||||
-tracker_selection-part = Which tracker to assign to your
|
||||
tracker_selection_menu-NONE = Which tracker do you want to be unassigned?
|
||||
tracker_selection_menu-HEAD = { -tracker_selection-part } head?
|
||||
tracker_selection_menu-NECK = { -tracker_selection-part } neck?
|
||||
tracker_selection_menu-RIGHT_SHOULDER = { -tracker_selection-part } right shoulder?
|
||||
tracker_selection_menu-RIGHT_UPPER_ARM = { -tracker_selection-part } right upper arm?
|
||||
tracker_selection_menu-RIGHT_LOWER_ARM = { -tracker_selection-part } right lower arm?
|
||||
tracker_selection_menu-RIGHT_HAND = { -tracker_selection-part } right hand?
|
||||
tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } right thigh?
|
||||
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } right ankle?
|
||||
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } right foot?
|
||||
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } right controller?
|
||||
tracker_selection_menu-CHEST = { -tracker_selection-part } chest?
|
||||
tracker_selection_menu-WAIST = { -tracker_selection-part } waist?
|
||||
tracker_selection_menu-HIP = { -tracker_selection-part } hip?
|
||||
tracker_selection_menu-LEFT_SHOULDER = { -tracker_selection-part } left shoulder?
|
||||
tracker_selection_menu-LEFT_UPPER_ARM = { -tracker_selection-part } left upper arm?
|
||||
tracker_selection_menu-LEFT_LOWER_ARM = { -tracker_selection-part } left lower arm?
|
||||
tracker_selection_menu-LEFT_HAND = { -tracker_selection-part } left hand?
|
||||
tracker_selection_menu-LEFT_UPPER_LEG = { -tracker_selection-part } left thigh?
|
||||
tracker_selection_menu-LEFT_LOWER_LEG = { -tracker_selection-part } left ankle?
|
||||
tracker_selection_menu-LEFT_FOOT = { -tracker_selection-part } left foot?
|
||||
tracker_selection_menu-LEFT_CONTROLLER = { -tracker_selection-part } left controller?
|
||||
|
||||
tracker_selection_menu-unassigned = Tracker non assegnato
|
||||
tracker_selection_menu-assigned = Dispositivo assegnato
|
||||
tracker_selection_menu-dont_assign = Non assegnare
|
||||
|
||||
## Mounting menu
|
||||
mounting_selection_menu = Come è posizionato il tracker?
|
||||
mounting_selection_menu-close = Chiudi
|
||||
|
||||
## Sidebar settings
|
||||
settings-sidebar-title = Impostazioni
|
||||
settings-sidebar-general = Generali
|
||||
settings-sidebar-tracker_mechanics = Comportamento del tracker
|
||||
settings-sidebar-fk_settings = Impostazioni FK
|
||||
settings-sidebar-gesture_control = Controllo dei gesti
|
||||
settings-sidebar-interface = Interfaccia
|
||||
settings-sidebar-osc_router = OSC router
|
||||
settings-sidebar-utils = Strumenti
|
||||
settings-sidebar-serial = Serial console
|
||||
|
||||
## SteamVR settings
|
||||
settings-general-steamvr = SteamVR
|
||||
settings-general-steamvr-subtitle = Tracker di SteamVR
|
||||
# Not all translation keys support multiline, only the ones that specify it will actually
|
||||
# split it in lines (that also means you can split in lines however you want in those).
|
||||
# The first spaces (not tabs) for indentation will be ignored, just to make the file look nice when writing.
|
||||
# This one is one of this cases that cares about multilines
|
||||
settings-general-steamvr-description =
|
||||
Abilita o disabilita specifici tracker di SteamVR.
|
||||
Utile per alcuni giochi che utilizzano solo alcuni tracker di SteamVR.
|
||||
settings-general-steamvr-trackers-waist = Girovita
|
||||
settings-general-steamvr-trackers-chest = Petto
|
||||
settings-general-steamvr-trackers-feet = Piedi
|
||||
settings-general-steamvr-trackers-knees = Ginocchia
|
||||
settings-general-steamvr-trackers-elbows = Gomiti
|
||||
settings-general-steamvr-trackers-hands = Mani
|
||||
|
||||
## Tracker mechanics
|
||||
settings-general-tracker_mechanics = Comportamento del tracker
|
||||
settings-general-tracker_mechanics-filtering = Filtro movimenti
|
||||
# This also cares about multilines
|
||||
settings-general-tracker_mechanics-filtering-description =
|
||||
Scegli la tipologia di filtraggio movimenti per il tuo tracker.
|
||||
Predizione anticipa i movimenti, mentre Attenuazione attenua movimenti eccessivi.
|
||||
settings-general-tracker_mechanics-filtering-type = Tipologia di filtraggio
|
||||
settings-general-tracker_mechanics-filtering-type-none = Non usare alcun filtraggio
|
||||
settings-general-tracker_mechanics-filtering-type-none-description = Usa le rotazioni così come sono. Non eseguirà alcun filtro.
|
||||
settings-general-tracker_mechanics-filtering-type-smoothing = Attenuazione
|
||||
settings-general-tracker_mechanics-filtering-type-smoothing-description = Attenua movimenti eccessivi ma aggiunge ritardo.
|
||||
settings-general-tracker_mechanics-filtering-type-prediction = Predizione
|
||||
settings-general-tracker_mechanics-filtering-type-prediction-description = Riduce ritardo e rende movimenti più istantanei, ma può introdurre tremolio.
|
||||
settings-general-tracker_mechanics-filtering-amount = Quantità
|
||||
settings-general-tracker_mechanics-drift_compensation = Drift compensation
|
||||
# This cares about multilines
|
||||
settings-general-tracker_mechanics-drift_compensation-description =
|
||||
Compensates IMU yaw drift by applying an inverse rotation.
|
||||
Change amount of compensation and up to how many resets are taken into account.
|
||||
settings-general-tracker_mechanics-drift_compensation-enabled-label = Drift compensation
|
||||
settings-general-tracker_mechanics-drift_compensation-amount-label = Compensation amount
|
||||
settings-general-tracker_mechanics-drift_compensation-max_resets-label = Use up to x last resets
|
||||
|
||||
## FK/Tracking settings
|
||||
settings-general-fk_settings = Impostazioni FK
|
||||
settings-general-fk_settings-leg_tweak = Impostazioni Gambe
|
||||
settings-general-fk_settings-leg_tweak-description = "Compenetrazione pavimento" può ridurre o anche eliminare completamente la compenetrazione con il pavimento, ma può causare problemi quando in ginocchio. "Correzione pattinaggio" corregge l'effetto che fa sembrare che pattini sul ghiaccio, ma può peggiorare la precisione di certi movimenti.
|
||||
# Floor clip:
|
||||
# why the name - came from the idea of noclip in video games, but is the opposite where clipping to the floor is a desired feature
|
||||
# definition - Prevents the foot trackers from going lower than they where when a reset was performed
|
||||
settings-general-fk_settings-leg_tweak-floor_clip = Compenetrazione pavimento
|
||||
# Skating correction:
|
||||
# why the name - without this enabled the feet will often slide across the ground as if your skating across the ground,
|
||||
# since this largely prevents this it corrects for it hence skating correction (note this may be renamed to sliding correction)
|
||||
# definition - Guesses when each foot is in contact with the ground and uses that information to improve tracking
|
||||
settings-general-fk_settings-leg_tweak-skating_correction = Correzione pattinaggio
|
||||
settings-general-fk_settings-leg_tweak-skating_correction-amount = Forza fattore di correzione pattinaggio
|
||||
settings-general-fk_settings-arm_fk = FK Braccia
|
||||
settings-general-fk_settings-arm_fk-description = Cambia la modalità di tracciamento 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-i_pose = Use i-pose instead of t-pose
|
||||
settings-general-fk_settings-skeleton_settings = Impostazioni 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 = Estensione colonna vertebrale
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis = Estensione bacino
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees = Estensione ginocchia
|
||||
settings-general-fk_settings-vive_emulation-title = Vive emulation
|
||||
settings-general-fk_settings-vive_emulation-description = Emulate the waist tracker problems that Vive trackers have. This is a joke and makes tracking worse.
|
||||
settings-general-fk_settings-vive_emulation-label = Enable Vive emulation
|
||||
|
||||
## Gesture control settings (tracker tapping)
|
||||
settings-general-gesture_control = Controllo dei gesti
|
||||
settings-general-gesture_control-subtitle = Reset veloce con il doppio tocco
|
||||
settings-general-gesture_control-description = Abilita o disabilita il reset veloce con il doppio tocco. Quando attivato, un doppio tocco su una qualsiasi parte del tracker posizionato più in altro lungo il torso abiliterà il reset veloce. "Ritardo" è il ritardo dal momento in cui il gesto è eseguito e il Reset.
|
||||
# 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
|
||||
}
|
||||
settings-general-gesture_control-quickResetEnabled = Enable tap to quick reset
|
||||
settings-general-gesture_control-quickResetDelay = Quick reset delay
|
||||
settings-general-gesture_control-quickResetTaps = Taps for quick reset
|
||||
settings-general-gesture_control-resetEnabled = Enable tap to reset
|
||||
settings-general-gesture_control-resetDelay = Reset delay
|
||||
settings-general-gesture_control-resetTaps = Taps for reset
|
||||
settings-general-gesture_control-mountingResetEnabled = Enable tap to reset mounting
|
||||
settings-general-gesture_control-mountingResetDelay = Mounting reset delay
|
||||
settings-general-gesture_control-mountingResetTaps = Taps for mounting reset
|
||||
|
||||
## Interface settings
|
||||
settings-general-interface = Interfaccia
|
||||
settings-general-interface-dev_mode = Modalità sviluppatore
|
||||
settings-general-interface-dev_mode-description = Questa modalità è utile se hai bisogno di dati approfonditi o devi interagire in maniera più avanzata con i tracker connessi.
|
||||
settings-general-interface-dev_mode-label = Modalità sviluppatore
|
||||
settings-general-interface-serial_detection = Rilevazione nuovi dispositivi seriali
|
||||
settings-general-interface-serial_detection-description = Questa opzione mostrerà un pop-up ogni volta che colleghi un nuovo dispositivo seriale che potrebbe essere un tracker. Aiuta a facilitare la configurazione iniziale di un tracker
|
||||
settings-general-interface-serial_detection-label = Rilevazione nuovi dispositivi seriali
|
||||
settings-general-interface-lang = Seleziona la lingua
|
||||
settings-general-interface-lang-description = Seleziona la lingua che vuoi utilizzare
|
||||
settings-general-interface-lang-placeholder = Seleziona la lingua da utilizzare
|
||||
|
||||
## Serial settings
|
||||
settings-serial = Serial Console
|
||||
# This cares about multilines
|
||||
settings-serial-description =
|
||||
Questo è un feed di informazioni in tempo reale per la comunicazione seriale.
|
||||
Può essere utile se ti serve capire se il firmware sta avendo problemi.
|
||||
settings-serial-connection_lost = Connessione seriale persa. Riconnessione in corso...
|
||||
settings-serial-reboot = Riavvia
|
||||
settings-serial-factory_reset = Ripristino delle impostazioni di fabbrica
|
||||
settings-serial-get_infos = Ottieni informazioni
|
||||
settings-serial-serial_select = Seleziona una porta seriale
|
||||
settings-serial-auto_dropdown_item = Automatico
|
||||
|
||||
## OSC router settings
|
||||
settings-osc-router = OSC router
|
||||
# This cares about multilines
|
||||
settings-osc-router-description =
|
||||
Inoltra messaggi OSC da un altro programma.
|
||||
Utile per utilizzare un altro programma OSC con VRChat, per esempio.
|
||||
settings-osc-router-enable = Attiva
|
||||
settings-osc-router-enable-description = Attiva o disattiva l'inoltro dei messaggi
|
||||
settings-osc-router-enable-label = Attiva
|
||||
settings-osc-router-network = Porte di rete
|
||||
# This cares about multilines
|
||||
settings-osc-router-network-description =
|
||||
Impostare le porte di rete per l'ascolto e l'invio dei dati
|
||||
Queste possono essere le stesse porte di rete di altre porte utilizzate nel server di SlimeVR
|
||||
settings-osc-router-network-port_in =
|
||||
.label = Porta in ingresso
|
||||
.placeholder = Porta in ingresso (predefinito: 9002)
|
||||
settings-osc-router-network-port_out =
|
||||
.label = Porta in uscita
|
||||
.placeholder = Porta in uscita (predefinito: 9000)
|
||||
settings-osc-router-network-address = Indirizzo di rete
|
||||
settings-osc-router-network-address-description = Impostare l'indirizzo di rete a cui inviare i dati
|
||||
settings-osc-router-network-address-placeholder = Indirizzo IPV4
|
||||
|
||||
## OSC VRChat settings
|
||||
settings-osc-vrchat = VRChat OSC Trackers
|
||||
# This cares about multilines
|
||||
settings-osc-vrchat-description =
|
||||
Modifica le impostazioni specifiche a VRChat per ricevere e inviare dati del HMD
|
||||
Dati dei tracker per FBT (funziona su Quest standalone).
|
||||
settings-osc-vrchat-enable = Attiva
|
||||
settings-osc-vrchat-enable-description = Attiva o disattiva l'invio e la ricezione dei dati
|
||||
settings-osc-vrchat-enable-label = Attiva
|
||||
settings-osc-vrchat-network = Porte di rete
|
||||
settings-osc-vrchat-network-description = Impostare le porte di rete per ascoltare e inviare dati a VRChat
|
||||
settings-osc-vrchat-network-port_in =
|
||||
.label = Porta in ingresso
|
||||
.placeholder = Porta in ingresso (predefinito: 9002)
|
||||
settings-osc-vrchat-network-port_out =
|
||||
.label = Porta in uscita
|
||||
.placeholder = Porta in uscita (predefinito: 9000)
|
||||
settings-osc-vrchat-network-address = Indirizzo di rete
|
||||
settings-osc-vrchat-network-address-description = Scegli a quale indirizzo di rete inviare i dati di VRChat (controlla le impostazioni Wi-Fi sul tuo dispositivo)
|
||||
settings-osc-vrchat-network-address-placeholder = Indirizzo IP di VRChat
|
||||
settings-osc-vrchat-network-trackers = Tracker
|
||||
settings-osc-vrchat-network-trackers-description = Attiva o disattiva l'invio e la ricezione dei dati
|
||||
settings-osc-vrchat-network-trackers-chest = Petto
|
||||
settings-osc-vrchat-network-trackers-waist = Girovita
|
||||
settings-osc-vrchat-network-trackers-knees = Ginocchia
|
||||
settings-osc-vrchat-network-trackers-feet = Piedi
|
||||
settings-osc-vrchat-network-trackers-elbows = Gomiti
|
||||
|
||||
## Setup/onboarding menu
|
||||
onboarding-skip = Salta la configurazione
|
||||
onboarding-continue = Continua
|
||||
onboarding-wip = Lavori in corso
|
||||
|
||||
## Wi-Fi setup
|
||||
onboarding-wifi_creds-back = Torna all'introduzione
|
||||
onboarding-wifi_creds = Inserisci credenziali Wi-Fi
|
||||
# This cares about multilines
|
||||
onboarding-wifi_creds-description =
|
||||
I tracker utilizzeranno queste credenziali per connettersi in modalità wireless
|
||||
Si prega di utilizzare le stesse credenziali con cui si è attualmente connessi
|
||||
onboarding-wifi_creds-skip = Salta impostazioni Wi-Fi
|
||||
onboarding-wifi_creds-submit = Conferma!
|
||||
onboarding-wifi_creds-ssid =
|
||||
.label = SSID
|
||||
.placeholder = Enter SSID
|
||||
onboarding-wifi_creds-password =
|
||||
.label = Password
|
||||
.placeholder = Enter password
|
||||
|
||||
## Mounting setup
|
||||
onboarding-reset_tutorial-back = Torna alla calibrazione posizionamento
|
||||
onboarding-reset_tutorial = Tutorial di ripristino
|
||||
onboarding-reset_tutorial-description = Questa funzionalità non è completa, premi continua
|
||||
|
||||
## Setup start
|
||||
onboarding-home = Benvenuti a SlimeVR
|
||||
# This cares about multilines and it's centered!!
|
||||
onboarding-home-description =
|
||||
Portiamo full-body tracking
|
||||
a tuttə
|
||||
onboarding-home-start = Prepariamoci!
|
||||
|
||||
## Enter VR part of setup
|
||||
onboarding-enter_vr-back = Torna all'assegnazione dei tracker
|
||||
onboarding-enter_vr-title = È ora di entrare in VR!
|
||||
onboarding-enter_vr-description = Indossa tutti i tuoi tracker e entra in VR!
|
||||
onboarding-enter_vr-ready = Sono prontə!
|
||||
|
||||
## Setup done
|
||||
onboarding-done-title = È tutto pronto!
|
||||
onboarding-done-description = Goditi la tua esperienza di full-body tracking
|
||||
onboarding-done-close = Chiudi la guida
|
||||
|
||||
## Tracker connection setup
|
||||
onboarding-connect_tracker-back = Torna alle credenziali Wi-Fi
|
||||
onboarding-connect_tracker-title = Connetti i tracker
|
||||
onboarding-connect_tracker-description-p0 = Ora passiamo alla parte divertente, colleghiamo tutti i tracker!
|
||||
onboarding-connect_tracker-description-p1 = Collega semplicemente tutti i tracker che non sono ancora collegati tramite una porta USB.
|
||||
onboarding-connect_tracker-issue-serial = Ho problemi con la connessione!
|
||||
onboarding-connect_tracker-usb = Tracker USB
|
||||
onboarding-connect_tracker-connection_status-connecting = Invio credenziali Wi-Fi in corso.
|
||||
onboarding-connect_tracker-connection_status-connected = Connesso al Wi-Fi
|
||||
onboarding-connect_tracker-connection_status-error = Impossibile connettersi al Wi-Fi
|
||||
onboarding-connect_tracker-connection_status-start_connecting = Ricerca dei tracker in corso
|
||||
onboarding-connect_tracker-connection_status-handshake = Connesso al Server
|
||||
# $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] No trackers
|
||||
[one] 1 tracker
|
||||
*[other] { $amount } trackers
|
||||
} connected
|
||||
onboarding-connect_tracker-next = Ho collegato tutti i miei tracker
|
||||
|
||||
## Tracker assignment setup
|
||||
onboarding-assign_trackers-back = Torna alle credenziali Wi-Fi
|
||||
onboarding-assign_trackers-title = Assegna i tracker
|
||||
onboarding-assign_trackers-description = Scegliamo quale tracker va dove. Fare clic su una parte del corpo in cui si desidera assegnare un tracker
|
||||
# Look at translation of onboarding-connect_tracker-connected_trackers on how to use plurals
|
||||
# $assigned (Number) - Trackers that have been assigned a body part
|
||||
# $trackers (Number) - Trackers connected to the server
|
||||
onboarding-assign_trackers-assigned = { $assigned } of { $trackers ->
|
||||
[one] 1 tracker
|
||||
*[other] { $trackers } trackers
|
||||
} assigned
|
||||
onboarding-assign_trackers-advanced = Mostra impostazioni avanzate di assegnazione
|
||||
onboarding-assign_trackers-next = Ho assegnato tutti i miei tracker
|
||||
|
||||
## Tracker manual mounting setup
|
||||
onboarding-manual_mounting-back = Torna indietro per entrare in VR
|
||||
onboarding-manual_mounting = Posizionamento manuale
|
||||
onboarding-manual_mounting-description = Fare clic su ogni tracker e selezionare in che direzione sono montati
|
||||
onboarding-manual_mounting-auto_mounting = Posizionamento automatico
|
||||
onboarding-manual_mounting-next = Passo successivo
|
||||
|
||||
## Tracker automatic mounting setup
|
||||
onboarding-automatic_mounting-back = Torna indietro per entrare in VR
|
||||
onboarding-automatic_mounting-title = Calibrazione posizionamento
|
||||
onboarding-automatic_mounting-description = Affinché i tracker di SlimeVR funzionino, dobbiamo configurare una rotazione di posizione di montaggio ai tuoi tracker per allinearli con la posizione di montaggio del tuo tracker fisico.
|
||||
onboarding-automatic_mounting-manual_mounting = Imposta posizione manualmente
|
||||
onboarding-automatic_mounting-next = Passo successivo
|
||||
onboarding-automatic_mounting-prev_step = Passaggio precedente
|
||||
onboarding-automatic_mounting-done-title = Rotazione delle posizioni di montaggio calibrate.
|
||||
onboarding-automatic_mounting-done-description = La calibrazione della posizione é completa!
|
||||
onboarding-automatic_mounting-done-restart = Torna all'inizio
|
||||
onboarding-automatic_mounting-mounting_reset-title = Ripristina posizionamento
|
||||
onboarding-automatic_mounting-mounting_reset-step-0 = 1. Piegati come per sciare: con le gambe leggermente piegate e unite, la parte superiore del corpo inclinata in avanti e le braccia piegate.
|
||||
onboarding-automatic_mounting-mounting_reset-step-1 = 2. Premere il pulsante "Ripristina posizionamento" e attendere 3 secondi prima che le rotazioni delle posizioni di montaggio dei tracker vengano ripristinate.
|
||||
onboarding-automatic_mounting-preparation-title = Preparazione
|
||||
onboarding-automatic_mounting-preparation-step-0 = 1. Stai in piedi drittə con le braccia lungo i fianchi.
|
||||
onboarding-automatic_mounting-preparation-step-1 = 2. Premi il pulsante "Reset" e attendi 3 secondi prima che i tracker vengano ripristinati.
|
||||
onboarding-automatic_mounting-put_trackers_on-title = Indossa i tuoi tracker
|
||||
onboarding-automatic_mounting-put_trackers_on-description = Per calibrare le rotazioni delle posizioni montaggio useremo i tracker che hai appena assegnato. Indossa tutti i tuoi tracker, puoi vedere quali sono quali nella figura a destra.
|
||||
onboarding-automatic_mounting-put_trackers_on-next = Sto indossando tutti i miei tracker
|
||||
|
||||
## Tracker manual proportions setup
|
||||
onboarding-manual_proportions-back = Torna al tutorial di reset
|
||||
onboarding-manual_proportions-title = Impostazione manuale delle proporzioni del corpo
|
||||
onboarding-manual_proportions-precision = Regolazione di precisione
|
||||
onboarding-manual_proportions-auto = Calibrazione automatica
|
||||
|
||||
## Tracker automatic proportions setup
|
||||
onboarding-automatic_proportions-back = Torna al tutorial di reset
|
||||
onboarding-automatic_proportions-title = Misura il tuo corpo
|
||||
onboarding-automatic_proportions-description = Affinché i tracker di SlimeVR funzionino dobbiamo conoscere la lunghezza dei tuoi arti. Questa breve calibrazione le misurerà per te.
|
||||
onboarding-automatic_proportions-manual = Calibrazione manuale
|
||||
onboarding-automatic_proportions-prev_step = Passaggio precedente
|
||||
onboarding-automatic_proportions-put_trackers_on-title = Indossa i tuoi tracker
|
||||
onboarding-automatic_proportions-put_trackers_on-description = Per calibrare le tue proporzioni useremo i tracker che hai appena assegnato. Indossa tutti i tuoi tracker, puoi vedere quali sono quali nella figura a destra.
|
||||
onboarding-automatic_proportions-put_trackers_on-next = Sto indossando tutti i miei tracker
|
||||
onboarding-automatic_proportions-preparation-title = Preparazione
|
||||
onboarding-automatic_proportions-preparation-description = Posiziona una sedia direttamente dietro di te all'interno della tua area di gioco. Ti verrà richiesto di sederti durante certi passaggi della calibrazione delle proporzioni.
|
||||
onboarding-automatic_proportions-preparation-next = Sono davanti a una sedia
|
||||
onboarding-automatic_proportions-start_recording-title = Preparati a muoverti
|
||||
onboarding-automatic_proportions-start_recording-description = Ora registreremo alcune pose e movimenti specifici. Questi verranno descritte nelle schermate successive. Preparati a iniziare quando premi il pulsante!
|
||||
onboarding-automatic_proportions-start_recording-next = Inizia registrazione
|
||||
onboarding-automatic_proportions-recording-title = REC
|
||||
onboarding-automatic_proportions-recording-description-p0 = Registrazione in corso...
|
||||
onboarding-automatic_proportions-recording-description-p1 = Fai i movimenti mostrati di seguito:
|
||||
onboarding-automatic_proportions-recording-steps-0 = Piega le ginocchia un paio di volte.
|
||||
onboarding-automatic_proportions-recording-steps-1 = Siediti su una sedia e poi alzati.
|
||||
onboarding-automatic_proportions-recording-steps-2 = Ruota la parte superiore del corpo a sinistra, poi piegati a destra.
|
||||
onboarding-automatic_proportions-recording-steps-3 = Ruota la parte superiore del corpo a destra, poi piegati a sinistra.
|
||||
onboarding-automatic_proportions-recording-steps-4 = Muoviti un poco fino allo scadere del timer.
|
||||
onboarding-automatic_proportions-recording-processing = Elaborazione del risultato
|
||||
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 15)
|
||||
onboarding-automatic_proportions-recording-timer = { $time ->
|
||||
[one] 1 second left
|
||||
*[other] { $time } seconds left
|
||||
}
|
||||
onboarding-automatic_proportions-verify_results-title = Verifica i risultati
|
||||
onboarding-automatic_proportions-verify_results-description = Controlla i risultati qui sotto, sembrano corretti?
|
||||
onboarding-automatic_proportions-verify_results-results = Salvataggio dei risultati
|
||||
onboarding-automatic_proportions-verify_results-processing = Elaborazione del risultato
|
||||
onboarding-automatic_proportions-verify_results-redo = Rifai registrazione
|
||||
onboarding-automatic_proportions-verify_results-confirm = Sono corretti
|
||||
onboarding-automatic_proportions-done-title = Corpo misurato e salvato.
|
||||
onboarding-automatic_proportions-done-description = La calibrazione delle proporzioni del tuo corpo è completa!
|
||||
|
||||
## Home
|
||||
home-no_trackers = Nessun tracker rilevato o assegnato
|
||||
540
gui/public/i18n/ja/translation.ftl
Normal file
540
gui/public/i18n/ja/translation.ftl
Normal file
@@ -0,0 +1,540 @@
|
||||
### 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!
|
||||
# And also comment the string if it's something not easy to translate, so you help
|
||||
# translators on what it means
|
||||
|
||||
## Websocket (server) status
|
||||
websocket-connecting = サーバー接続中
|
||||
websocket-connection_lost = サーバーへの接続が失われました。再接続を試みています...
|
||||
|
||||
## Tips
|
||||
tips-find_tracker = どのトラッカーがどれだかわからない?トラッカーを振ると、該当する項目がハイライトされます。
|
||||
tips-do_not_move_heels = レコーディング中にかかとが動かないように注意しましょう!
|
||||
|
||||
## Body parts
|
||||
body_part-NONE = 未設定
|
||||
body_part-HEAD = 頭
|
||||
body_part-NECK = 首
|
||||
body_part-RIGHT_SHOULDER = 右肩
|
||||
body_part-RIGHT_UPPER_ARM = 右上腕
|
||||
body_part-RIGHT_LOWER_ARM = 右前腕
|
||||
body_part-RIGHT_HAND = 右手
|
||||
body_part-RIGHT_UPPER_LEG = 右膝
|
||||
body_part-RIGHT_LOWER_LEG = 右足
|
||||
body_part-RIGHT_FOOT = 右足先
|
||||
body_part-RIGHT_CONTROLLER = 右コントローラ
|
||||
body_part-CHEST = 胸
|
||||
body_part-WAIST = 腰
|
||||
body_part-HIP = ヒップ
|
||||
body_part-LEFT_SHOULDER = 左肩
|
||||
body_part-LEFT_UPPER_ARM = 左上腕
|
||||
body_part-LEFT_LOWER_ARM = 左前腕
|
||||
body_part-LEFT_HAND = 左手
|
||||
body_part-LEFT_UPPER_LEG = 左膝
|
||||
body_part-LEFT_LOWER_LEG = 左足
|
||||
body_part-LEFT_FOOT = 左足先
|
||||
body_part-LEFT_CONTROLLER = 左コントローラ
|
||||
|
||||
## Proportions
|
||||
skeleton_bone-NONE = 無し
|
||||
skeleton_bone-HEAD = ヘッドシフト
|
||||
skeleton_bone-NECK = 首長さ
|
||||
skeleton_bone-CHEST = 胸囲
|
||||
skeleton_bone-CHEST_OFFSET = 胸オフセット
|
||||
skeleton_bone-WAIST = ウエスト長さ
|
||||
skeleton_bone-HIP = ヒップ長さ
|
||||
skeleton_bone-HIP_OFFSET = ヒップオフセット
|
||||
skeleton_bone-HIPS_WIDTH = ヒップ幅
|
||||
skeleton_bone-UPPER_LEG = 膝長さ
|
||||
skeleton_bone-LOWER_LEG = 足長さ
|
||||
skeleton_bone-FOOT_LENGTH = 足先長さ
|
||||
skeleton_bone-FOOT_SHIFT = 足先シフト
|
||||
skeleton_bone-SKELETON_OFFSET = スケルトンオフセット
|
||||
skeleton_bone-SHOULDERS_DISTANCE = 肩の距離
|
||||
skeleton_bone-SHOULDERS_WIDTH = 肩幅
|
||||
skeleton_bone-UPPER_ARM = 上腕長さ
|
||||
skeleton_bone-LOWER_ARM = 前腕長さ
|
||||
skeleton_bone-CONTROLLER_Y = コントローラ距離 Y
|
||||
skeleton_bone-CONTROLLER_Z = コントローラ距離 Z
|
||||
skeleton_bone-ELBOW_OFFSET = 肘オフセット
|
||||
|
||||
## Tracker reset buttons
|
||||
reset-reset_all = すべてのプロポーションをリセット
|
||||
reset-full = リセット
|
||||
reset-mounting = リセットマウンティング
|
||||
reset-quick = クイックリセット
|
||||
|
||||
## Serial detection stuff
|
||||
serial_detection-new_device-p0 = 新しいシリアルデバイスを検出しました!
|
||||
serial_detection-new_device-p1 = Wi-Fiの認証情報を入力してください!
|
||||
serial_detection-new_device-p2 = 何をするか選択してください
|
||||
serial_detection-open_wifi = Wi-Fiに接続
|
||||
serial_detection-open_serial = シリアルコンソールを開く
|
||||
serial_detection-submit = 実行!
|
||||
serial_detection-close = 閉じる
|
||||
|
||||
## Navigation bar
|
||||
navbar-home = ホーム
|
||||
navbar-body_proportions = ボディプロポーション
|
||||
navbar-trackers_assign = トラッカー割り当て
|
||||
navbar-mounting = マウントキャリブレーション
|
||||
navbar-onboarding = セットアップ ウィザード
|
||||
navbar-settings = 設定
|
||||
|
||||
## Bounding volume hierarchy recording
|
||||
bvh-start_recording = BVHレコーディング
|
||||
bvh-recording = レコーディング中...
|
||||
|
||||
## Widget: Overlay settings
|
||||
widget-overlay = オーバーレイ設定
|
||||
widget-overlay-is_visible_label = SteamVRでオーバーレイを表示する
|
||||
widget-overlay-is_mirrored_label = オーバーレイをミラーとして表示する
|
||||
|
||||
## Widget: Developer settings
|
||||
widget-developer_mode = 開発者モード
|
||||
widget-developer_mode-high_contrast = ハイ コントラスト
|
||||
widget-developer_mode-precise_rotation = 正確な回転角度を表示
|
||||
widget-developer_mode-fast_data_feed = 高速表示モード
|
||||
widget-developer_mode-filter_slimes_and_hmd = SlimeVRとHMDのみを表示
|
||||
widget-developer_mode-sort_by_name = 表示名順
|
||||
widget-developer_mode-raw_slime_rotation = 元の回転角度
|
||||
widget-developer_mode-more_info = 他情報
|
||||
|
||||
## Widget: IMU Visualizer
|
||||
widget-imu_visualizer = Rotation
|
||||
widget-imu_visualizer-rotation_raw = Raw
|
||||
widget-imu_visualizer-rotation_preview = プレビュー
|
||||
|
||||
## Tracker status
|
||||
tracker-status-none = ステータスなし
|
||||
tracker-status-busy = Busy
|
||||
tracker-status-error = エラー
|
||||
tracker-status-disconnected = 切断
|
||||
tracker-status-occluded = Occluded
|
||||
tracker-status-ok = 接続中
|
||||
|
||||
## Tracker status columns
|
||||
tracker-table-column-name = Name
|
||||
tracker-table-column-type = Type
|
||||
tracker-table-column-battery = バッテリー
|
||||
tracker-table-column-ping = Ping
|
||||
tracker-table-column-tps = TPS
|
||||
tracker-table-column-temperature = 温度. °C
|
||||
tracker-table-column-linear-acceleration = 加速度. X/Y/Z
|
||||
tracker-table-column-rotation = 回転 X/Y/Z
|
||||
tracker-table-column-position = 位置 X/Y/Z
|
||||
tracker-table-column-url = URL
|
||||
|
||||
## Tracker rotation
|
||||
tracker-rotation-front = 前
|
||||
tracker-rotation-left = 左
|
||||
tracker-rotation-right = 右
|
||||
tracker-rotation-back = 後
|
||||
|
||||
## Tracker information
|
||||
tracker-infos-manufacturer = メーカ-
|
||||
tracker-infos-display_name = 表示名
|
||||
tracker-infos-custom_name = カスタム名称
|
||||
tracker-infos-url = トラッカーURL
|
||||
|
||||
## Tracker settings
|
||||
tracker-settings-back = トラッカーリストへ戻る
|
||||
tracker-settings-title = トラッカー設定
|
||||
tracker-settings-assignment_section = 割り当て
|
||||
tracker-settings-assignment_section-description = トラッカーが体のどの部位に装着されているか
|
||||
tracker-settings-assignment_section-edit = 割り当ての編集
|
||||
tracker-settings-mounting_section = 装着方向
|
||||
tracker-settings-mounting_section-description = トラッカーをどの方向に装着していますか?
|
||||
tracker-settings-mounting_section-edit = 装着向きの編集
|
||||
tracker-settings-drift_compensation_section = ドリフト補正を行う
|
||||
tracker-settings-drift_compensation_section-description = ドリフト補正が有効になっている場合、このトラッカーはドリフトを補正する必要がありますか?
|
||||
tracker-settings-drift_compensation_section-edit = ドリフト補正を行う
|
||||
# The .<name> means it's an attribute and it's related to the top key.
|
||||
# In this case that is the settings for the assignment section.
|
||||
tracker-settings-name_section = トラッカー名称
|
||||
tracker-settings-name_section-description = 自由に名称をつけてください
|
||||
tracker-settings-name_section-placeholder = NightyBeast's left leg
|
||||
|
||||
## Tracker part card info
|
||||
tracker-part_card-no_name = 名称無し
|
||||
tracker-part_card-unassigned = 未割り当て
|
||||
|
||||
## Body assignment menu
|
||||
body_assignment_menu = このトラッカーをどこに配置しますか?
|
||||
body_assignment_menu-description = このトラッカーを割り当てる場所を選択します。また、トラッカーを一つずつ管理するのではなく、すべてのトラッカーを一括して管理することもできます。
|
||||
body_assignment_menu-show_advanced_locations = 高度な割り当て場所の表示
|
||||
body_assignment_menu-manage_trackers = すべてのトラッカーの管理
|
||||
body_assignment_menu-unassign_tracker = トラッカーの割り当て解除
|
||||
|
||||
## Tracker assignment menu
|
||||
# A -translation_key (with a dash in the front) means that it's a label.
|
||||
# It can only be used in the translation file, it's nice for reusing names and that kind of stuff.
|
||||
#
|
||||
# We are using it here because english doesn't require changing the text in each case but
|
||||
# maybe your language does.
|
||||
-tracker_selection-part = どのトラッカーを{ $body-part }に割り当てますか?
|
||||
tracker_selection_menu-NONE = どのトラッカーに割り当てないか?
|
||||
tracker_selection_menu-HEAD = { -tracker_selection-part(body-part: "頭") }
|
||||
tracker_selection_menu-NECK = { -tracker_selection-part(body-part: "首") }
|
||||
tracker_selection_menu-RIGHT_SHOULDER = { -tracker_selection-part(body-part: "右肩") }
|
||||
tracker_selection_menu-RIGHT_UPPER_ARM = { -tracker_selection-part(body-part: "右上腕") }
|
||||
tracker_selection_menu-RIGHT_LOWER_ARM = { -tracker_selection-part(body-part: "右前腕") }
|
||||
tracker_selection_menu-RIGHT_HAND = { -tracker_selection-part(body-part: "右手") }
|
||||
tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part(body-part: "右太もも") }
|
||||
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part(body-part: "右足首") }
|
||||
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part(body-part: "右足先") }
|
||||
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part(body-part: "右コントローラ") }
|
||||
tracker_selection_menu-CHEST = { -tracker_selection-part(body-part: "胸") }
|
||||
tracker_selection_menu-WAIST = { -tracker_selection-part(body-part: "腰") }
|
||||
tracker_selection_menu-HIP = { -tracker_selection-part(body-part: "ヒップ") }
|
||||
tracker_selection_menu-LEFT_SHOULDER = { -tracker_selection-part(body-part: "左肩") }
|
||||
tracker_selection_menu-LEFT_UPPER_ARM = { -tracker_selection-part(body-part: "左上腕") }
|
||||
tracker_selection_menu-LEFT_LOWER_ARM = { -tracker_selection-part(body-part: "左前腕") }
|
||||
tracker_selection_menu-LEFT_HAND = { -tracker_selection-part(body-part: "左手") }
|
||||
tracker_selection_menu-LEFT_UPPER_LEG = { -tracker_selection-part(body-part: "左太もも") }
|
||||
tracker_selection_menu-LEFT_LOWER_LEG = { -tracker_selection-part(body-part: "左足首") }
|
||||
tracker_selection_menu-LEFT_FOOT = { -tracker_selection-part(body-part: "左足先") }
|
||||
tracker_selection_menu-LEFT_CONTROLLER = { -tracker_selection-part(body-part: "左コントローラ") }
|
||||
|
||||
tracker_selection_menu-unassigned = 未割り当てのトラッカー
|
||||
tracker_selection_menu-assigned = 割り当て済みのトラッカー
|
||||
tracker_selection_menu-dont_assign = 割り当てない
|
||||
|
||||
## Mounting menu
|
||||
mounting_selection_menu = このトラッカーをどこに配置しますか?
|
||||
mounting_selection_menu-close = 閉じる
|
||||
|
||||
## Sidebar settings
|
||||
settings-sidebar-title = 設定
|
||||
settings-sidebar-general = 一般
|
||||
settings-sidebar-tracker_mechanics = トラッカーメカニズム
|
||||
settings-sidebar-fk_settings = FK設定
|
||||
settings-sidebar-gesture_control = ジェスチャーコントロール
|
||||
settings-sidebar-interface = インターフェース
|
||||
settings-sidebar-osc_router = OSCルーター
|
||||
settings-sidebar-utils = ユーティリティ
|
||||
settings-sidebar-serial = シリアルコンソール
|
||||
|
||||
## SteamVR settings
|
||||
settings-general-steamvr = SteamVR
|
||||
settings-general-steamvr-subtitle = SteamVRのトラッカー
|
||||
# Not all translation keys support multiline, only the ones that specify it will actually
|
||||
# split it in lines (that also means you can split in lines however you want in those).
|
||||
# The first spaces (not tabs) for indentation will be ignored, just to make the file look nice when writing.
|
||||
# This one is one of this cases that cares about multilines
|
||||
settings-general-steamvr-description =
|
||||
有効化したい部位にチャックを入れてください。
|
||||
SlimeVRが行うことをよりコントロールしたい場合に便利です。
|
||||
settings-general-steamvr-trackers-waist = 腰
|
||||
settings-general-steamvr-trackers-chest = 胸
|
||||
settings-general-steamvr-trackers-feet = 足
|
||||
settings-general-steamvr-trackers-knees = 膝
|
||||
settings-general-steamvr-trackers-elbows = 肘
|
||||
settings-general-steamvr-trackers-hands = 手
|
||||
|
||||
## Tracker mechanics
|
||||
settings-general-tracker_mechanics = トラッカーメカニズム
|
||||
settings-general-tracker_mechanics-filtering = フィルター機能
|
||||
# This also cares about multilines
|
||||
settings-general-tracker_mechanics-filtering-description =
|
||||
トラッカーのフィルタリングの種類を選択します。
|
||||
Predictionは動きを予測し、Smoothingは動きを滑らかにする。
|
||||
settings-general-tracker_mechanics-filtering-type = フィルタータイプ
|
||||
settings-general-tracker_mechanics-filtering-type-none = フィルター無し
|
||||
settings-general-tracker_mechanics-filtering-type-none-description = トラッカーの値をそのまま使用します。フィルタリングは行いません。
|
||||
settings-general-tracker_mechanics-filtering-type-smoothing = スムージング
|
||||
settings-general-tracker_mechanics-filtering-type-smoothing-description = 動きを滑らかにしますが、若干の遅れが発生します
|
||||
settings-general-tracker_mechanics-filtering-type-prediction = プリディクション
|
||||
settings-general-tracker_mechanics-filtering-type-prediction-description = レイテンシーを減らし、動きをよりキビキビさせますが、ジッターが増加する場合があります。
|
||||
settings-general-tracker_mechanics-filtering-amount = 数値
|
||||
settings-general-tracker_mechanics-drift_compensation = ドリフト補正
|
||||
# This cares about multilines
|
||||
settings-general-tracker_mechanics-drift_compensation-description =
|
||||
逆回転をかけることで IMU のヨー軸ドリフトを補正します。
|
||||
補正量とリセット回数を変更します。
|
||||
settings-general-tracker_mechanics-drift_compensation-enabled-label = ドリフト補正
|
||||
settings-general-tracker_mechanics-drift_compensation-amount-label = 補正量
|
||||
settings-general-tracker_mechanics-drift_compensation-max_resets-label = 最大リセット回数
|
||||
|
||||
## FK settings
|
||||
settings-general-fk_settings = FK設定
|
||||
settings-general-fk_settings-leg_tweak = 脚の微調整
|
||||
settings-general-fk_settings-leg_tweak-description = フロアクリップは、床とのクリッピングを減らす、あるいはなくすことができますが、膝をついたときに問題が発生する可能性があります。スケーティング補正は足の滑りを補正できますが、特定の動作パターンでは精度が落ちることがあります。
|
||||
# Floor clip:
|
||||
# why the name - came from the idea of noclip in video games, but is the opposite where clipping to the floor is a desired feature
|
||||
# definition - Prevents the foot trackers from going lower than they where when a reset was performed
|
||||
settings-general-fk_settings-leg_tweak-floor_clip = フロアクリップ
|
||||
# Skating correction:
|
||||
# why the name - without this enabled the feet will often slide across the ground as if your skating across the ground,
|
||||
# since this largely prevents this it corrects for it hence skating correction (note this may be renamed to sliding correction)
|
||||
# definition - Guesses when each foot is in contact with the ground and uses that information to improve tracking
|
||||
settings-general-fk_settings-leg_tweak-skating_correction = スケーティング補正
|
||||
settings-general-fk_settings-leg_tweak-skating_correction-amount = スケーティング補正の強さ
|
||||
settings-general-fk_settings-arm_fk = アームトラッキング
|
||||
settings-general-fk_settings-arm_fk-description = 腕の追従方法を変更する。
|
||||
settings-general-fk_settings-arm_fk-force_arms = Force arms from HMD
|
||||
settings-general-fk_settings-arm_fk-i_pose = Use i-pose instead of t-pose
|
||||
settings-general-fk_settings-skeleton_settings = スケルトン設定
|
||||
settings-general-fk_settings-skeleton_settings-description = スケルトン設定のオン/オフを切り替えます。これらはオンのままにしておくことをお勧めします。
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine = Extended spine
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis = Extended pelvis
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees = Extended knee
|
||||
settings-general-fk_settings-vive_emulation-title = Viveエミュレーション
|
||||
settings-general-fk_settings-vive_emulation-description = Viveトラッカーが抱える腰トラッカーの問題をエミュレートします。
|
||||
settings-general-fk_settings-vive_emulation-label = Viveエミュレーションの有効化
|
||||
|
||||
## Gesture control settings (tracker tapping)
|
||||
settings-general-gesture_control = ジェスチャーコントロール
|
||||
settings-general-gesture_control-subtitle = ダブルタップクイックリセット
|
||||
settings-general-gesture_control-description = ダブルタップクイックリセットの有効・無効を設定します。有効にすると、最も高い胴体トラッカー上の任意の場所をダブルタップすると、クイックリセットが起動します。ディレイは、タップされてからリセットされるまでの時間です。
|
||||
# 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 } タップ
|
||||
}
|
||||
settings-general-gesture_control-quickResetEnabled = タップによるクイックリセットを有効にする
|
||||
settings-general-gesture_control-quickResetDelay = クイックリセットディレイ
|
||||
settings-general-gesture_control-quickResetTaps = タップによるクイックリセット
|
||||
settings-general-gesture_control-resetEnabled = タップによるリセットを有効にする
|
||||
settings-general-gesture_control-resetDelay = リセットディレイ
|
||||
settings-general-gesture_control-resetTaps = タップによるリセット
|
||||
settings-general-gesture_control-mountingResetEnabled = タップによるマウントリセットを有効にする
|
||||
settings-general-gesture_control-mountingResetDelay = マウントリセットディレイ
|
||||
settings-general-gesture_control-mountingResetTaps = タップによるマウントリセット
|
||||
|
||||
## Interface settings
|
||||
settings-general-interface = インターフェース
|
||||
settings-general-interface-dev_mode = 開発者モード
|
||||
settings-general-interface-dev_mode-description = このモードは、詳細なデータが必要な場合や、接続されたトラッカーをより高度なレベルで操作する場合に役立ちます。
|
||||
settings-general-interface-dev_mode-label = 開発者モード
|
||||
settings-general-interface-serial_detection = シリアルデバイスの検出
|
||||
settings-general-interface-serial_detection-description = このオプションは、トラッカーとなり得る新しいシリアルデバイスを接続するたびにポップアップを表示します。これはトラッカーの設定プロセスを改善するのに役立ちます。
|
||||
settings-general-interface-serial_detection-label = シリアルデバイスの検出
|
||||
settings-general-interface-lang = 言語を選択
|
||||
settings-general-interface-lang-description = 使用したいデフォルトの言語を変更する
|
||||
settings-general-interface-lang-placeholder = 使用する言語を選択する
|
||||
|
||||
## Serial settings
|
||||
settings-serial = シリアルコンソール
|
||||
# This cares about multilines
|
||||
settings-serial-description =
|
||||
シリアル通信のライブ情報フィードです。
|
||||
ファームウェアの動作を知る必要がある場合に有用かもしれません。
|
||||
settings-serial-connection_lost = シリアルへの接続が失われました、再接続中...
|
||||
settings-serial-reboot = リブート
|
||||
settings-serial-factory_reset = ファクトリーリセット
|
||||
settings-serial-get_infos = 情報取得
|
||||
settings-serial-serial_select = シリアルポートを選択
|
||||
settings-serial-auto_dropdown_item = 自動
|
||||
|
||||
## OSC router settings
|
||||
settings-osc-router = OSCルーター
|
||||
# This cares about multilines
|
||||
settings-osc-router-description =
|
||||
他のプログラムからの OSC メッセージを転送します。
|
||||
例えば、VRChat で他の OSC プログラムを使用する場合に便利です。
|
||||
settings-osc-router-enable = 有効
|
||||
settings-osc-router-enable-description = メッセージの転送を切り替えます。
|
||||
settings-osc-router-enable-label = 有効
|
||||
settings-osc-router-network = ネットワークポート
|
||||
# This cares about multilines
|
||||
settings-osc-router-network-description =
|
||||
データのリスニングと送信のためのポートを設定します。
|
||||
これらはSlimeVRサーバーで使用する他のポートと同じでかまいません。
|
||||
settings-osc-router-network-port_in =
|
||||
.label = ポートイン
|
||||
.placeholder = ポートイン (デフォルト: 9002)
|
||||
settings-osc-router-network-port_out =
|
||||
.label = ポートアウト
|
||||
.placeholder = ポートアウト (デフォルト: 9000)
|
||||
settings-osc-router-network-address = ネットワークアドレス
|
||||
settings-osc-router-network-address-description = データを送り出すアドレスを設定します。
|
||||
settings-osc-router-network-address-placeholder = IPV4アドレス
|
||||
|
||||
## OSC VRChat settings
|
||||
settings-osc-vrchat = VRChat OSCトラッカー
|
||||
# This cares about multilines
|
||||
settings-osc-vrchat-description =
|
||||
HMDのデータを受信して送信するためにVRChat固有の設定を変更する。
|
||||
FBT用のトラッカーデータ(Questスタンドアロンで動作します)
|
||||
settings-osc-vrchat-enable = 有効
|
||||
settings-osc-vrchat-enable-description = データの送受信を切り替える。
|
||||
settings-osc-vrchat-enable-label = 有効
|
||||
settings-osc-vrchat-network = ネットワークポート
|
||||
settings-osc-vrchat-network-description = VRChatへのデータを送受信するためのポートを設定します。
|
||||
settings-osc-vrchat-network-port_in =
|
||||
.label = ポートイン
|
||||
.placeholder = ポートイン (デフォルト: 9001)
|
||||
settings-osc-vrchat-network-port_out =
|
||||
.label = ポートアウト
|
||||
.placeholder = ポートアウト (デフォルト: 9000)
|
||||
settings-osc-vrchat-network-address = ネットワークアドレス
|
||||
settings-osc-vrchat-network-address-description = VRChatにデータを送信するアドレスを選択してください(デバイスのWi-Fi設定を確認してください)
|
||||
settings-osc-vrchat-network-address-placeholder = VRChatのIPアドレス
|
||||
settings-osc-vrchat-network-trackers = トラッカー
|
||||
settings-osc-vrchat-network-trackers-description = データの送受信を切り替える。
|
||||
settings-osc-vrchat-network-trackers-chest = 胸
|
||||
settings-osc-vrchat-network-trackers-waist = 腰
|
||||
settings-osc-vrchat-network-trackers-knees = 膝
|
||||
settings-osc-vrchat-network-trackers-feet = 足
|
||||
settings-osc-vrchat-network-trackers-elbows = 肘
|
||||
|
||||
## Setup/onboarding menu
|
||||
onboarding-skip = 設定をスキップする
|
||||
onboarding-continue = 続ける
|
||||
onboarding-wip = 実行中
|
||||
|
||||
## Wi-Fi setup
|
||||
onboarding-wifi_creds-back = 戻る
|
||||
onboarding-wifi_creds = Wi-Fi
|
||||
# This cares about multilines
|
||||
onboarding-wifi_creds-description =
|
||||
トラッカーはこれらの認証情報を使ってWi-Fiに接続します。
|
||||
現在接続している認証情報を使用してください。
|
||||
onboarding-wifi_creds-skip = Wi-Fi設定をスキップする
|
||||
onboarding-wifi_creds-submit = 実行!
|
||||
onboarding-wifi_creds-ssid =
|
||||
.label = Wi-Fi名
|
||||
.placeholder = Enter Wi-Fi名
|
||||
onboarding-wifi_creds-password =
|
||||
.label = Password
|
||||
.placeholder = Enter password
|
||||
|
||||
## Mounting setup
|
||||
onboarding-reset_tutorial-back = マウントキャリブレーションに戻る
|
||||
onboarding-reset_tutorial = リセットチュートリアル
|
||||
onboarding-reset_tutorial-description = この機能は終了していません。続けるを押してください。
|
||||
|
||||
## Setup start
|
||||
onboarding-home = SlimeVRへようこそ
|
||||
# This cares about multilines and it's centered!!
|
||||
onboarding-home-description =
|
||||
フルボディトラッキングを実現する
|
||||
すべての人に!
|
||||
onboarding-home-start = セットアップ開始!
|
||||
|
||||
## Enter VR part of setup
|
||||
onboarding-enter_vr-back = トラッカー割り当てに戻る
|
||||
onboarding-enter_vr-title = VRに入る時間だ!
|
||||
onboarding-enter_vr-description = トラッカーを全部つけて、VRに突入せよ!
|
||||
onboarding-enter_vr-ready = 準備完了
|
||||
|
||||
## Setup done
|
||||
onboarding-done-title = 準備完了です!
|
||||
onboarding-done-description = フルトラをお楽しみください
|
||||
onboarding-done-close = ガイドを閉じる
|
||||
|
||||
## Tracker connection setup
|
||||
onboarding-connect_tracker-back = Wi-Fi認証に戻る
|
||||
onboarding-connect_tracker-title = 接続中のトラッカー
|
||||
onboarding-connect_tracker-description-p0 = さあ、楽しい部分に移りましょう。すべてのトラッカーを接続します!
|
||||
onboarding-connect_tracker-description-p1 = まだ接続されていないトラッカーたちをUSBポートを通して接続するだけです。
|
||||
onboarding-connect_tracker-issue-serial = 接続に問題があります!
|
||||
onboarding-connect_tracker-usb = USBトラッカー
|
||||
onboarding-connect_tracker-connection_status-connecting = Wi-Fiの認証情報を送信中
|
||||
onboarding-connect_tracker-connection_status-connected = Wi-Fiに接続されました
|
||||
onboarding-connect_tracker-connection_status-error = Wi-Fiに接続できません
|
||||
onboarding-connect_tracker-connection_status-start_connecting = トラッカーを探しています
|
||||
onboarding-connect_tracker-connection_status-handshake = サーバーに接続されました
|
||||
# $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] No trackers
|
||||
[one] 1 tracker
|
||||
*[other] { $amount } trackers
|
||||
} connected
|
||||
onboarding-connect_tracker-next = すべてのトラッカーを接続しました
|
||||
|
||||
## Tracker assignment setup
|
||||
onboarding-assign_trackers-back = Wi-Fi認証に戻る
|
||||
onboarding-assign_trackers-title = トラッカーを割り当てる
|
||||
onboarding-assign_trackers-description = どのトラッカーをどこに置くか選んでみましょう。トラッカーを配置したい場所をクリックしてください。
|
||||
# Look at translation of onboarding-connect_tracker-connected_trackers on how to use plurals
|
||||
# $assigned (Number) - Trackers that have been assigned a body part
|
||||
# $trackers (Number) - Trackers connected to the server
|
||||
onboarding-assign_trackers-assigned = { $assigned } of { $trackers ->
|
||||
[one] 1 tracker
|
||||
*[other] { $trackers } trackers
|
||||
} assigned
|
||||
onboarding-assign_trackers-advanced = 高度な割り当て場所の表示
|
||||
onboarding-assign_trackers-next = すべてのトラッカーを割り当てました
|
||||
|
||||
## Tracker manual mounting setup
|
||||
onboarding-manual_mounting-back = VRの入力に戻る
|
||||
onboarding-manual_mounting = マニュアルマウント
|
||||
onboarding-manual_mounting-description = すべてのトラッカーをクリックし、どの方向にマウントするかを選択
|
||||
onboarding-manual_mounting-auto_mounting = 自動マウント
|
||||
onboarding-manual_mounting-next = 次のステップ
|
||||
|
||||
## Tracker automatic mounting setup
|
||||
onboarding-automatic_mounting-back = VRの入力に戻る
|
||||
onboarding-automatic_mounting-title = マウントキャリブレーション
|
||||
onboarding-automatic_mounting-description = SlimeVRのトラッカーを動作させるためには、物理的なトラッカーの取り付け位置と合わせるために、トラッカーの取り付け方向を合わせる必要があります。
|
||||
onboarding-automatic_mounting-manual_mounting = マニュアルマウント
|
||||
onboarding-automatic_mounting-next = 次のステップ
|
||||
onboarding-automatic_mounting-prev_step = 前のステップ
|
||||
onboarding-automatic_mounting-done-title = 取り付け方向の較正を行いました。
|
||||
onboarding-automatic_mounting-done-description = マウントのキャリブレーションが完了しました!
|
||||
onboarding-automatic_mounting-done-restart = 最初に戻る
|
||||
onboarding-automatic_mounting-mounting_reset-title = マウントリセット
|
||||
onboarding-automatic_mounting-mounting_reset-step-0 = 1. 足を曲げ、上体を前に倒し、腕を曲げた状態で、スキーのポーズでしゃがむ。
|
||||
onboarding-automatic_mounting-mounting_reset-step-1 = 2. リセットマウンティングボタンを押し、3秒待つと装着方向がリセットされます。
|
||||
onboarding-automatic_mounting-preparation-title = 準備
|
||||
onboarding-automatic_mounting-preparation-step-0 = 1. 両手を横に広げて直立します。
|
||||
onboarding-automatic_mounting-preparation-step-1 = 2. リセットボタンを押し、3秒待つとリセットされます。
|
||||
onboarding-automatic_mounting-put_trackers_on-title = トラッカーを装着する
|
||||
onboarding-automatic_mounting-put_trackers_on-description = マウントの方向を較正するために、先ほど割り当てたトラッカーを使用します。右の図でどれがどれだかわかると思います。
|
||||
onboarding-automatic_mounting-put_trackers_on-next = すべてのトラッカーを装着しました
|
||||
|
||||
## Tracker manual proportions setup
|
||||
onboarding-manual_proportions-back = チュートリアルをリセットする
|
||||
onboarding-manual_proportions-title = マニュアルボディプロポーション
|
||||
onboarding-manual_proportions-precision = 精度を調整する
|
||||
onboarding-manual_proportions-auto = 自動キャリブレーション
|
||||
|
||||
## Tracker automatic proportions setup
|
||||
onboarding-automatic_proportions-back = チュートリアルをリセットする
|
||||
onboarding-automatic_proportions-title = 自分の体の測定
|
||||
onboarding-automatic_proportions-description = SlimeVRのトラッカーが動作するためには、あなたの骨の長さを知る必要があります。この短いキャリブレーションでそれを測定します。
|
||||
onboarding-automatic_proportions-manual = 手動調整
|
||||
onboarding-automatic_proportions-prev_step = 前のステップ
|
||||
onboarding-automatic_proportions-put_trackers_on-title = トラッカーを装着する
|
||||
onboarding-automatic_proportions-put_trackers_on-description = プロポーションを調整するために、先ほど割り当てたトラッカーを使用します。右の図で、どれがどのトラッカーかわかると思います。
|
||||
onboarding-automatic_proportions-put_trackers_on-next = すべてのトラッカーを装着しました
|
||||
onboarding-automatic_proportions-preparation-title = 準備
|
||||
onboarding-automatic_proportions-preparation-description = プレイスペース内のあなたの真後ろに椅子を置いてください。オートボーンセットアップの間、座れるように準備してください。
|
||||
onboarding-automatic_proportions-preparation-next = 椅子の前にいます
|
||||
onboarding-automatic_proportions-start_recording-title = 測定の準備をする
|
||||
onboarding-automatic_proportions-start_recording-description = これから具体的なポーズや動きを記録します。これらは次の画面に表示されます。ボタンが押されたらすぐに始められるように準備しておいてください!
|
||||
onboarding-automatic_proportions-start_recording-next = レコーディングスタート
|
||||
onboarding-automatic_proportions-recording-title = REC
|
||||
onboarding-automatic_proportions-recording-description-p0 = レコーディング中...
|
||||
onboarding-automatic_proportions-recording-description-p1 = 以下に示すような動きをします。
|
||||
onboarding-automatic_proportions-recording-steps-0 = 膝を数回曲げてください
|
||||
onboarding-automatic_proportions-recording-steps-1 = 椅子に座り、立ち上がる
|
||||
onboarding-automatic_proportions-recording-steps-2 = 上半身を左にひねり、右に曲げる
|
||||
onboarding-automatic_proportions-recording-steps-3 = 上半身を右にひねり、左に曲げる
|
||||
onboarding-automatic_proportions-recording-steps-4 = タイマーが終わるまで体をくねらせる
|
||||
onboarding-automatic_proportions-recording-processing = 結果を処理中
|
||||
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 15)
|
||||
onboarding-automatic_proportions-recording-timer = { $time ->
|
||||
[one] 1 second left
|
||||
*[other] { $time } seconds left
|
||||
}
|
||||
onboarding-automatic_proportions-verify_results-title = 結果を確認
|
||||
onboarding-automatic_proportions-verify_results-description = 以下の結果を確認してください。正しく表示されていますか?
|
||||
onboarding-automatic_proportions-verify_results-results = 記録結果
|
||||
onboarding-automatic_proportions-verify_results-processing = 結果の処理
|
||||
onboarding-automatic_proportions-verify_results-redo = レコーディングやり直し
|
||||
onboarding-automatic_proportions-verify_results-confirm = 正確です
|
||||
onboarding-automatic_proportions-done-title = 体を測定して保存
|
||||
onboarding-automatic_proportions-done-description = ボディプロポーションのキャリブレーションが完了しました!
|
||||
|
||||
## Home
|
||||
home-no_trackers = トラッカーを検出できません。もしくは割り当てられていません。
|
||||
534
gui/public/i18n/ko/translation.ftl
Normal file
534
gui/public/i18n/ko/translation.ftl
Normal file
@@ -0,0 +1,534 @@
|
||||
### 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!
|
||||
# And also comment the string if it's something not easy to translate, so you help
|
||||
# translators on what it means
|
||||
|
||||
## Websocket (server) status
|
||||
websocket-connecting = 서버에 연결하는 중...
|
||||
websocket-connection_lost = 서버와의 연결이 끊어졌어요. 다시 연결하는 중...
|
||||
|
||||
## Tips
|
||||
tips-find_tracker = 내 트래커가 어떤 트래커인지 모르시겠다구요? 트래커를 흔들면 해당 항목이 빛날 거에요.
|
||||
tips-do_not_move_heels = 기록하는 동안 발뒤꿈치가 움직이지 않도록 조심하세요!
|
||||
|
||||
## Body parts
|
||||
body_part-NONE = 할당되지 않음
|
||||
body_part-HEAD = 머리
|
||||
body_part-NECK = 목
|
||||
body_part-RIGHT_SHOULDER = 오른쪽 어깨
|
||||
body_part-RIGHT_UPPER_ARM = 오른쪽 팔 위
|
||||
body_part-RIGHT_LOWER_ARM = 오른쪽 팔 아래
|
||||
body_part-RIGHT_HAND = 오른손
|
||||
body_part-RIGHT_UPPER_LEG = 오른쪽 다리 위
|
||||
body_part-RIGHT_LOWER_LEG = 오른쪽 다리 아래
|
||||
body_part-RIGHT_FOOT = 오른발
|
||||
body_part-RIGHT_CONTROLLER = 오른쪽 컨트롤러
|
||||
body_part-CHEST = 가슴
|
||||
body_part-WAIST = 허리
|
||||
body_part-HIP = 골반
|
||||
body_part-LEFT_SHOULDER = 오른쪽 어깨
|
||||
body_part-LEFT_UPPER_ARM = 왼쪽 팔 위
|
||||
body_part-LEFT_LOWER_ARM = 왼쪽 팔 아래
|
||||
body_part-LEFT_HAND = 왼손
|
||||
body_part-LEFT_UPPER_LEG = 왼쪽 다리 위
|
||||
body_part-LEFT_LOWER_LEG = 왼쪽 다리 아래
|
||||
body_part-LEFT_FOOT = 왼발
|
||||
body_part-LEFT_CONTROLLER = 왼쪽 컨트롤러
|
||||
|
||||
## Proportions
|
||||
skeleton_bone-NONE = 없음
|
||||
skeleton_bone-HEAD = 머리 밀림
|
||||
skeleton_bone-NECK = 목 길이
|
||||
skeleton_bone-CHEST = 가슴 길이
|
||||
skeleton_bone-CHEST_OFFSET = 가슴 오프셋
|
||||
skeleton_bone-WAIST = 허리 길이
|
||||
skeleton_bone-HIP = 골반 길이
|
||||
skeleton_bone-HIP_OFFSET = 골반 오프셋
|
||||
skeleton_bone-HIPS_WIDTH = 골반 너비
|
||||
skeleton_bone-UPPER_LEG = 위쪽 다리 길이
|
||||
skeleton_bone-LOWER_LEG = 아래쪽 다리 길이
|
||||
skeleton_bone-FOOT_LENGTH = 발 크기
|
||||
skeleton_bone-FOOT_SHIFT = 발 밀림
|
||||
skeleton_bone-SKELETON_OFFSET = 골격 오프셋
|
||||
skeleton_bone-SHOULDERS_DISTANCE = 어깨 거리
|
||||
skeleton_bone-SHOULDERS_WIDTH = 어깨 너비
|
||||
skeleton_bone-UPPER_ARM = 위쪽 팔 거리
|
||||
skeleton_bone-LOWER_ARM = 아래쪽 팔 길이
|
||||
skeleton_bone-CONTROLLER_Y = 컨트롤러 Y축 거리
|
||||
skeleton_bone-CONTROLLER_Z = 컨트롤러 Z축 거리
|
||||
skeleton_bone-ELBOW_OFFSET = 팔꿈치 오프셋
|
||||
|
||||
## Tracker reset buttons
|
||||
reset-reset_all = 모든 신체 비율 리셋
|
||||
reset-full = 리셋
|
||||
reset-mounting = 착용 방향 리셋
|
||||
reset-quick = 퀵 리셋
|
||||
|
||||
## Serial detection stuff
|
||||
serial_detection-new_device-p0 = 새로운 시리얼 디바이스를 찾았어요!
|
||||
serial_detection-new_device-p1 = Wi-Fi 자격 증명을 입력해주세요!
|
||||
serial_detection-new_device-p2 = 원하는 작업을 선택하세요
|
||||
serial_detection-open_wifi = Wi-Fi 연결
|
||||
serial_detection-open_serial = 시리얼 콘솔 열기
|
||||
serial_detection-submit = 저장!
|
||||
serial_detection-close = 닫기
|
||||
|
||||
## Navigation bar
|
||||
navbar-home = 홈
|
||||
navbar-body_proportions = 신체 비율
|
||||
navbar-trackers_assign = 트래커 위치
|
||||
navbar-mounting = 착용 방향 정렬
|
||||
navbar-onboarding = 설정 마법사
|
||||
navbar-settings = 설정
|
||||
|
||||
## Bounding volume hierarchy recording
|
||||
bvh-start_recording = BVH 기록
|
||||
bvh-recording = 기록중...
|
||||
|
||||
## Widget: Overlay settings
|
||||
widget-overlay = 오버레이
|
||||
widget-overlay-is_visible_label = SteamVR에서 오버레이 표시
|
||||
widget-overlay-is_mirrored_label = 오버레이 반전
|
||||
|
||||
## Widget: Developer settings
|
||||
widget-developer_mode = 개발자 모드
|
||||
widget-developer_mode-high_contrast = 고대비
|
||||
widget-developer_mode-precise_rotation = 회전 자세히 보기
|
||||
widget-developer_mode-fast_data_feed = 빠른 데이터 피드
|
||||
widget-developer_mode-filter_slimes_and_hmd = 트래커와 VR 헤드셋만 보기
|
||||
widget-developer_mode-sort_by_name = 이름순으로 정렬
|
||||
widget-developer_mode-raw_slime_rotation = 원시 회전값 보기
|
||||
widget-developer_mode-more_info = 더 많은 정보 보기
|
||||
|
||||
## Widget: IMU Visualizer
|
||||
widget-imu_visualizer = 회전
|
||||
widget-imu_visualizer-rotation_raw = Raw
|
||||
widget-imu_visualizer-rotation_preview = 미리보기
|
||||
|
||||
## Tracker status
|
||||
tracker-status-none = 알 수 없음
|
||||
tracker-status-busy = 바쁨
|
||||
tracker-status-error = 오류
|
||||
tracker-status-disconnected = 연결되지 않음
|
||||
tracker-status-occluded = 사용할 수 없음
|
||||
tracker-status-ok = 연결됨
|
||||
|
||||
## Tracker status columns
|
||||
tracker-table-column-name = 이름
|
||||
tracker-table-column-type = 타입
|
||||
tracker-table-column-battery = 배터리
|
||||
tracker-table-column-ping = Ping
|
||||
tracker-table-column-tps = TPS
|
||||
tracker-table-column-temperature = 온도 °C
|
||||
tracker-table-column-linear-acceleration = X/Y/Z 가속도
|
||||
tracker-table-column-rotation = X/Y/Z 회전
|
||||
tracker-table-column-position = X/Y/Z 위치
|
||||
tracker-table-column-url = URL
|
||||
|
||||
## Tracker rotation
|
||||
tracker-rotation-front = 앞쪽
|
||||
tracker-rotation-left = 왼쪽
|
||||
tracker-rotation-right = 오른쪽
|
||||
tracker-rotation-back = 뒤쪽
|
||||
|
||||
## Tracker information
|
||||
tracker-infos-manufacturer = 제조사
|
||||
tracker-infos-display_name = 표시되는 이름
|
||||
tracker-infos-custom_name = 사용자 정의 이름
|
||||
tracker-infos-url = 트래커 URL
|
||||
|
||||
## Tracker settings
|
||||
tracker-settings-back = 트래커 목록으로 돌아가기
|
||||
tracker-settings-title = 트래커 설정
|
||||
tracker-settings-assignment_section = 트래커 위치 지정
|
||||
tracker-settings-assignment_section-description = 트래커가 위치한 신체 부위
|
||||
tracker-settings-assignment_section-edit = 위치 수정
|
||||
tracker-settings-mounting_section = 착용 방향
|
||||
tracker-settings-mounting_section-description = 트래커는 어디에 착용하나요?
|
||||
tracker-settings-mounting_section-edit = 방향 수정
|
||||
tracker-settings-drift_compensation_section = 틀어짐 보정 사용
|
||||
tracker-settings-drift_compensation_section-description = 틀어짐 보정이 켜져 있을 때 이 트래커의 틀어짐을 보정할까요?
|
||||
tracker-settings-drift_compensation_section-edit = 틀어짐 보정 사용
|
||||
# The .<name> means it's an attribute and it's related to the top key.
|
||||
# In this case that is the settings for the assignment section.
|
||||
tracker-settings-name_section = 트래커 이름
|
||||
tracker-settings-name_section-description = 귀여운 이름을 지어주세요! >_<
|
||||
tracker-settings-name_section-placeholder = NightyBeast's left leg
|
||||
|
||||
## Tracker part card info
|
||||
tracker-part_card-no_name = 이름 없음
|
||||
tracker-part_card-unassigned = 할당되지 않음
|
||||
|
||||
## Body assignment menu
|
||||
body_assignment_menu = 트래커가 어디에 있나요?
|
||||
body_assignment_menu-description = 이 트래커를 할당할 위치를 선택하세요. 또는, 모든 트래커를 한 번에 설정할 수도 있어요.
|
||||
body_assignment_menu-show_advanced_locations = 고급 할당 위치 표시
|
||||
body_assignment_menu-manage_trackers = 모든 트래커 설정
|
||||
body_assignment_menu-unassign_tracker = 할당하지 않기
|
||||
|
||||
## Tracker assignment menu
|
||||
# A -translation_key (with a dash in the front) means that it's a label.
|
||||
# It can only be used in the translation file, it's nice for reusing names and that kind of stuff.
|
||||
#
|
||||
# We are using it here because english doesn't require changing the text in each case but
|
||||
# maybe your language does.
|
||||
-tracker_selection-part = 에 어떤 트래커를 할당할까요?
|
||||
tracker_selection_menu-NONE = 어떤 트래커를 할당 취소할까요?
|
||||
tracker_selection_menu-HEAD = 머리{ -tracker_selection-part }
|
||||
tracker_selection_menu-NECK = 목{ -tracker_selection-part }
|
||||
tracker_selection_menu-RIGHT_SHOULDER = 오른쪽 어께{ -tracker_selection-part }
|
||||
tracker_selection_menu-RIGHT_UPPER_ARM = 오른쪽 팔 위{ -tracker_selection-part }
|
||||
tracker_selection_menu-RIGHT_LOWER_ARM = 오른쪽 팔 아래{ -tracker_selection-part }
|
||||
tracker_selection_menu-RIGHT_HAND = 오른손{ -tracker_selection-part }
|
||||
tracker_selection_menu-RIGHT_UPPER_LEG = 오른쪽 다리 위{ -tracker_selection-part }
|
||||
tracker_selection_menu-RIGHT_LOWER_LEG = 오른쪽 다리 아래{ -tracker_selection-part }
|
||||
tracker_selection_menu-RIGHT_FOOT = 오른쪽 발{ -tracker_selection-part }
|
||||
tracker_selection_menu-RIGHT_CONTROLLER = 오른쪽 컨트롤러{ -tracker_selection-part }
|
||||
tracker_selection_menu-CHEST = 가슴{ -tracker_selection-part }
|
||||
tracker_selection_menu-WAIST = 허리{ -tracker_selection-part }
|
||||
tracker_selection_menu-HIP = 골반{ -tracker_selection-part }
|
||||
tracker_selection_menu-LEFT_SHOULDER = 왼쪽 어께{ -tracker_selection-part }
|
||||
tracker_selection_menu-LEFT_UPPER_ARM = 왼쪽 팔 위{ -tracker_selection-part }
|
||||
tracker_selection_menu-LEFT_LOWER_ARM = 왼쪽 팔 아래{ -tracker_selection-part }
|
||||
tracker_selection_menu-LEFT_HAND = 왼손{ -tracker_selection-part }
|
||||
tracker_selection_menu-LEFT_UPPER_LEG = 왼쪽 다리 위{ -tracker_selection-part }
|
||||
tracker_selection_menu-LEFT_LOWER_LEG = 왼쪽 다리 아래{ -tracker_selection-part }
|
||||
tracker_selection_menu-LEFT_FOOT = 왼쪽 발{ -tracker_selection-part }
|
||||
tracker_selection_menu-LEFT_CONTROLLER = 왼쪽 컨트롤러{ -tracker_selection-part }
|
||||
|
||||
tracker_selection_menu-unassigned = 할당되지 않은 트래커
|
||||
tracker_selection_menu-assigned = 할당된 트래커
|
||||
tracker_selection_menu-dont_assign = 할당하지 않기
|
||||
|
||||
## Mounting menu
|
||||
mounting_selection_menu = 트래커가 어디에 있나요?
|
||||
mounting_selection_menu-close = 닫기
|
||||
|
||||
## Sidebar settings
|
||||
settings-sidebar-title = 설정
|
||||
settings-sidebar-general = 일반
|
||||
settings-sidebar-tracker_mechanics = 트래커 역학
|
||||
settings-sidebar-fk_settings = FK 설정
|
||||
settings-sidebar-gesture_control = 제스처 제어
|
||||
settings-sidebar-interface = 인터페이스
|
||||
settings-sidebar-osc_router = OSC 라우터
|
||||
settings-sidebar-utils = 유틸리티
|
||||
settings-sidebar-serial = 시리얼 콘솔
|
||||
|
||||
## SteamVR settings
|
||||
settings-general-steamvr = SteamVR
|
||||
settings-general-steamvr-subtitle = SteamVR 트래커
|
||||
# Not all translation keys support multiline, only the ones that specify it will actually
|
||||
# split it in lines (that also means you can split in lines however you want in those).
|
||||
# The first spaces (not tabs) for indentation will be ignored, just to make the file look nice when writing.
|
||||
# This one is one of this cases that cares about multilines
|
||||
settings-general-steamvr-description =
|
||||
SteamVR 트래커를 켜거나 끄세요
|
||||
특정 트래커 구성만 허용하는 게임 또는 앱에서 유용해요.
|
||||
settings-general-steamvr-trackers-waist = Waist
|
||||
settings-general-steamvr-trackers-chest = Chest
|
||||
settings-general-steamvr-trackers-feet = Feet
|
||||
settings-general-steamvr-trackers-knees = Knees
|
||||
settings-general-steamvr-trackers-elbows = Elbows
|
||||
settings-general-steamvr-trackers-hands = Hands
|
||||
|
||||
## Tracker mechanics
|
||||
settings-general-tracker_mechanics = 트래커 역학
|
||||
settings-general-tracker_mechanics-filtering = 필터링
|
||||
# This also cares about multilines
|
||||
settings-general-tracker_mechanics-filtering-description =
|
||||
트래커의 필터링 유형을 선택하세요.
|
||||
Prediction은 움직임을 예측하고 Smoothing은 움직임을 부드럽게 해요.
|
||||
settings-general-tracker_mechanics-filtering-type = 필터링 타입
|
||||
settings-general-tracker_mechanics-filtering-type-none = 필터링 없음
|
||||
settings-general-tracker_mechanics-filtering-type-none-description = 어떠한 필터링도 사용하지 않아요. 있는 그대로의 회전 값을 사용해요.
|
||||
settings-general-tracker_mechanics-filtering-type-smoothing = Smoothing
|
||||
settings-general-tracker_mechanics-filtering-type-smoothing-description = 움직임을 부드럽게 하지만 약간의 대기 시간이 추가돼요.
|
||||
settings-general-tracker_mechanics-filtering-type-prediction = Prediction
|
||||
settings-general-tracker_mechanics-filtering-type-prediction-description = 대기 시간이 줄어들고 움직임이 더 빨라지지만 지터가 증가할 수 있어요.
|
||||
settings-general-tracker_mechanics-filtering-amount = 강도
|
||||
settings-general-tracker_mechanics-drift_compensation = 틀어짐 보정
|
||||
# This cares about multilines
|
||||
settings-general-tracker_mechanics-drift_compensation-description =
|
||||
틀어지는 방향의 반대 방향으로 회전해서 IMU yaw 드리프트를 보정할 수 있어요.
|
||||
보정하는 강도와 감지할 최근 리셋 횟수를 설정할 수 있어요.
|
||||
settings-general-tracker_mechanics-drift_compensation-enabled-label = 틀어짐 보정
|
||||
settings-general-tracker_mechanics-drift_compensation-amount-label = 보정 강도
|
||||
settings-general-tracker_mechanics-drift_compensation-max_resets-label = 보정에 사용할 최근 리셋 횟수
|
||||
|
||||
## FK/Tracking settings
|
||||
settings-general-fk_settings = FK 설정
|
||||
settings-general-fk_settings-leg_tweak = 다리 보정
|
||||
settings-general-fk_settings-leg_tweak-description = 플로어 클립은 바닥과의 클리핑을 줄이거나 제거할 수 있지만 무릎을 꿇을 때 문제를 일으킬 수 있어요. 스케이팅 보정은 아이스 스케이팅을 보정하지만, 특정 움직임 패턴에서 정확도를 저하시킬 수 있어요.
|
||||
# Floor clip:
|
||||
# why the name - came from the idea of noclip in video games, but is the opposite where clipping to the floor is a desired feature
|
||||
# definition - Prevents the foot trackers from going lower than they where when a reset was performed
|
||||
settings-general-fk_settings-leg_tweak-floor_clip = 플로어 클립
|
||||
# Skating correction:
|
||||
# why the name - without this enabled the feet will often slide across the ground as if your skating across the ground,
|
||||
# since this largely prevents this it corrects for it hence skating correction (note this may be renamed to sliding correction)
|
||||
# definition - Guesses when each foot is in contact with the ground and uses that information to improve tracking
|
||||
settings-general-fk_settings-leg_tweak-skating_correction = 스케이팅 보정
|
||||
settings-general-fk_settings-leg_tweak-skating_correction-amount = 스케이팅 보정 강도
|
||||
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-arm_fk-i_pose = Use i-pose instead of t-pose
|
||||
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-vive_emulation-title = VIVE 에뮬레이션
|
||||
settings-general-fk_settings-vive_emulation-description = 바이브 트래커가 가지고 있는 허리 트래커 문제를 따라해보세요! 사실 이건 장난이고 추적을 더 악화시켜요.
|
||||
settings-general-fk_settings-vive_emulation-label = VIVE 에뮬레이션 활성화
|
||||
|
||||
## Gesture control settings (tracker tapping)
|
||||
settings-general-gesture_control = 제스처 제어
|
||||
settings-general-gesture_control-subtitle = 두 번 탭해서 퀵 리셋하기
|
||||
settings-general-gesture_control-description = 활성화하면 가장 높이 있는 트래커의 아무 곳이나 두 번 탭해서 퀵 리셋을 활성화할 수 있어요. 두번 탭하는 간격은 딜레이로 조절할 수 있어요.
|
||||
# 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 ->
|
||||
*[other] { $amount } 탭
|
||||
}
|
||||
settings-general-gesture_control-quickResetEnabled = 탭해서 퀵 리셋 활성화
|
||||
settings-general-gesture_control-quickResetDelay = 퀵 리셋 딜레이
|
||||
settings-general-gesture_control-quickResetTaps = 탭해서 퀵 리셋
|
||||
settings-general-gesture_control-resetEnabled = 탭해서 리셋 활성화
|
||||
settings-general-gesture_control-resetDelay = 리셋 딜레이
|
||||
settings-general-gesture_control-resetTaps = 탭해서 리셋
|
||||
settings-general-gesture_control-mountingResetEnabled = 탭해서 착용 방향 정렬 활성화
|
||||
settings-general-gesture_control-mountingResetDelay = 착용 방향 정렬 딜레이
|
||||
settings-general-gesture_control-mountingResetTaps = 탭해서 착용 방향 정렬
|
||||
|
||||
## Interface settings
|
||||
settings-general-interface = 인터페이스
|
||||
settings-general-interface-dev_mode = 개발자 모드
|
||||
settings-general-interface-dev_mode-description = 이 모드는 더 많은 데이터가 필요하거나 고급 수준에서 연결된 트래커와 상호 작용하는 경우에 유용할 수 있어요.
|
||||
settings-general-interface-dev_mode-label = 개발자 모드
|
||||
settings-general-interface-serial_detection = 시리얼 디바이스 감지
|
||||
settings-general-interface-serial_detection-description = 이 옵션은 트래커일 수도 있는 새로운 시리얼 디바이스를 연결할 때마다 팝업을 표시해요. 트래커 설정 프로세스를 개선하는 데 도움이 될 거에요.
|
||||
settings-general-interface-serial_detection-label = 시리얼 디바이스 감지
|
||||
settings-general-interface-lang = 언어 선택
|
||||
settings-general-interface-lang-description = 사용하고 싶은 기본 언어를 선택하세요.
|
||||
settings-general-interface-lang-placeholder = 사용할 언어를 선택하세요
|
||||
|
||||
## Serial settings
|
||||
settings-serial = 시리얼 콘솔
|
||||
# This cares about multilines
|
||||
settings-serial-description =
|
||||
이 라이브 피드에서 시리얼 디바이스와 통신할 수 있어요.
|
||||
펌웨어가 제대로 작동하는지 알아야 할 때 유용할 거에요.
|
||||
settings-serial-connection_lost = 시리얼 연결 끊김, 다시 연결 중...
|
||||
settings-serial-reboot = 재부팅
|
||||
settings-serial-factory_reset = 공장 초기화
|
||||
settings-serial-get_infos = 정보 가져오기
|
||||
settings-serial-serial_select = 시리얼 포트 선택
|
||||
settings-serial-auto_dropdown_item = 자동
|
||||
|
||||
## OSC router settings
|
||||
settings-osc-router = OSC 라우터
|
||||
# This cares about multilines
|
||||
settings-osc-router-description =
|
||||
다른 프로그램에서 오는 OSC 메시지를 전달해요.
|
||||
예를 들어 VRChat과 함께 다른 OSC 프로그램을 사용하는 데 유용할 거에요.
|
||||
settings-osc-router-enable = 활성화
|
||||
settings-osc-router-enable-description = 활성화해서 메세지 전달 켜기
|
||||
settings-osc-router-enable-label = 활성화
|
||||
settings-osc-router-network = 네트워크 포트
|
||||
# This cares about multilines
|
||||
settings-osc-router-network-description =
|
||||
데이터 수신 및 전송을 위한 포트 설정
|
||||
이들은 SlimeVR 서버에서 사용되는 다른 포트와 동일할 수 있어요.
|
||||
settings-osc-router-network-port_in =
|
||||
.label = 들어오는 포트
|
||||
.placeholder = Port in (기본값: 9002)
|
||||
settings-osc-router-network-port_out =
|
||||
.label = 나가는 포트
|
||||
.placeholder = Port out (기본값: 9000)
|
||||
settings-osc-router-network-address = 네트워크 주소
|
||||
settings-osc-router-network-address-description = 데이터를 보낼 주소를 설정하세요.
|
||||
settings-osc-router-network-address-placeholder = IPV4 주소
|
||||
|
||||
## OSC VRChat settings
|
||||
settings-osc-vrchat = VRChat OSC Trackers
|
||||
# This cares about multilines
|
||||
settings-osc-vrchat-description =
|
||||
HMD 데이터 수신 및 전송을 위한 VRChat 관련 설정 변경
|
||||
FBT용 트래커 데이터(Quest 단독에서 작동)
|
||||
settings-osc-vrchat-enable = 활성화
|
||||
settings-osc-vrchat-enable-description = 활성화해서 데이터 송수신 전환
|
||||
settings-osc-vrchat-enable-label = 활성화
|
||||
settings-osc-vrchat-network = 네트워크 포트
|
||||
settings-osc-vrchat-network-description = VRChat과 데이터를 주고받는 포트 설정
|
||||
settings-osc-vrchat-network-port_in =
|
||||
.label = 들어오는 포트
|
||||
.placeholder = Port in (기본값: 9001)
|
||||
settings-osc-vrchat-network-port_out =
|
||||
.label = 나가는 포트
|
||||
.placeholder = Port out (기본값: 9000)
|
||||
settings-osc-vrchat-network-address = 네트워크 주소
|
||||
settings-osc-vrchat-network-address-description = VRChat으로 데이터를 보낼 주소를 선택하세요(장치의 Wi-Fi 설정 확인).
|
||||
settings-osc-vrchat-network-address-placeholder = VRChat IP 주소
|
||||
settings-osc-vrchat-network-trackers = 트래커
|
||||
settings-osc-vrchat-network-trackers-description = 활성화해서 데이터 송수신 전환
|
||||
settings-osc-vrchat-network-trackers-chest = Chest
|
||||
settings-osc-vrchat-network-trackers-waist = Waist
|
||||
settings-osc-vrchat-network-trackers-knees = Knees
|
||||
settings-osc-vrchat-network-trackers-feet = Feet
|
||||
settings-osc-vrchat-network-trackers-elbows = Elbows
|
||||
|
||||
## Setup/onboarding menu
|
||||
onboarding-skip = 설정 건너뛰기
|
||||
onboarding-continue = 계속하기
|
||||
onboarding-wip = 아직 공사 중이에요
|
||||
|
||||
## Wi-Fi setup
|
||||
onboarding-wifi_creds-back = 처음으로 돌아가기
|
||||
onboarding-wifi_creds = Wi-Fi 자격 증명을 입력하세요
|
||||
# This cares about multilines
|
||||
onboarding-wifi_creds-description =
|
||||
트래커는 이 자격 증명을 사용하여 무선으로 연결해요
|
||||
지금 연결되어 있는 자격 증명을 사용해주세요
|
||||
onboarding-wifi_creds-skip = Wi-Fi 설정 건너뛰기
|
||||
onboarding-wifi_creds-submit = 저장!
|
||||
onboarding-wifi_creds-ssid =
|
||||
.label = Wi-Fi 이름
|
||||
.placeholder = Wi-Fi 이름을 입력하세요
|
||||
onboarding-wifi_creds-password =
|
||||
.label = 암호
|
||||
.placeholder = 암호를 입력하세요
|
||||
|
||||
## Mounting setup
|
||||
onboarding-reset_tutorial-back = 착용 방향 정렬로 돌아가기
|
||||
onboarding-reset_tutorial = 리셋 튜토리얼
|
||||
onboarding-reset_tutorial-description = 이 기능은 아직 완성되지 않았어요, 지금은 일단 계속하기를 눌러주세요!
|
||||
|
||||
## Setup start
|
||||
onboarding-home = SlimeVR에 어서오세요!
|
||||
# This cares about multilines and it's centered!!
|
||||
onboarding-home-description =
|
||||
Bringing full-body tracking
|
||||
to everyone
|
||||
onboarding-home-start = 설정하러 가보죠!
|
||||
|
||||
## Enter VR part of setup
|
||||
onboarding-enter_vr-back = 트래커 위치 지정으로 돌아가기
|
||||
onboarding-enter_vr-title = VR에 들어갈 시간이에요!
|
||||
onboarding-enter_vr-description = 모든 트래커를 착용하고 VR에 입장하세요!
|
||||
onboarding-enter_vr-ready = 준비됐어요!
|
||||
|
||||
## Setup done
|
||||
onboarding-done-title = 모든 설정을 마쳤어요!
|
||||
onboarding-done-description = 풀바디 트래킹을 즐기세요!
|
||||
onboarding-done-close = 마법사 닫기
|
||||
|
||||
## Tracker connection setup
|
||||
onboarding-connect_tracker-back = Wi-Fi 자격 증명으로 돌아가기
|
||||
onboarding-connect_tracker-title = 트래커 연결
|
||||
onboarding-connect_tracker-description-p0 = 이제 모든 트래커를 연결하는 재미있는 부분으로 가봐요!
|
||||
onboarding-connect_tracker-description-p1 = 그냥 모든 트래커를 USB 포트에 연결하기만 하면 돼요
|
||||
onboarding-connect_tracker-issue-serial = 연결하는 데 문제가 생겼어요!
|
||||
onboarding-connect_tracker-usb = USB 트래커
|
||||
onboarding-connect_tracker-connection_status-connecting = Wi-Fi 자격증명 전송 중
|
||||
onboarding-connect_tracker-connection_status-connected = Wi-Fi 연결됨
|
||||
onboarding-connect_tracker-connection_status-error = Wi-Fi에 연결할 수 없음
|
||||
onboarding-connect_tracker-connection_status-start_connecting = 트래커 찾는 중
|
||||
onboarding-connect_tracker-connection_status-handshake = 서버에 연결됨
|
||||
# $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] 연결된 트래커가 없어요.
|
||||
*[other] 트래커 { $amount }개가 연결되었어요.
|
||||
}
|
||||
onboarding-connect_tracker-next = 모든 트래커를 잘 연결했어요
|
||||
|
||||
## Tracker assignment setup
|
||||
onboarding-assign_trackers-back = Wi-Fi 자격 증명으로 돌아가기
|
||||
onboarding-assign_trackers-title = 트래커 위치 지정
|
||||
onboarding-assign_trackers-description = 이제, 어떤 트래커가 어디에 있는지 선택할 시간이에요. 트래커를 배치할 위치를 클릭해보세요
|
||||
# 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 }개 중 { $assigned }개 연결됨
|
||||
onboarding-assign_trackers-advanced = 고급 할당 위치 보기
|
||||
onboarding-assign_trackers-next = 모든 트래커를 배치했어요
|
||||
|
||||
## Tracker manual mounting setup
|
||||
onboarding-manual_mounting-back = VR 입장 페이지로 돌아가기
|
||||
onboarding-manual_mounting = 수동으로 착용 방향 설정
|
||||
onboarding-manual_mounting-description = 트래커를 클릭한 다음, 트래커가 바라보는 방향을 선택해주세요
|
||||
onboarding-manual_mounting-auto_mounting = 자동으로 착용 방향 설정
|
||||
onboarding-manual_mounting-next = 다음 단계
|
||||
|
||||
## Tracker automatic mounting setup
|
||||
onboarding-automatic_mounting-back = VR 입장 페이지로 돌아가기
|
||||
onboarding-automatic_mounting-title = 착용 방향 정렬
|
||||
onboarding-automatic_mounting-description = SlimeVR 트래커가 작동하려면, 착용 방향을 정해야 해요. 이 단계에서는 실제 트래커의 회전과 맞게 착용 방향을 정렬할 거에요.
|
||||
onboarding-automatic_mounting-manual_mounting = 수동으로 착용 방향 설정
|
||||
onboarding-automatic_mounting-next = 다음 단계
|
||||
onboarding-automatic_mounting-prev_step = 이전 단계
|
||||
onboarding-automatic_mounting-done-title = 착용 방향이 정렬되었어요
|
||||
onboarding-automatic_mounting-done-description = 트래커의 착용 방향이 잘 설정되었어요!
|
||||
onboarding-automatic_mounting-done-restart = 다시 처음으로 돌아가기
|
||||
onboarding-automatic_mounting-mounting_reset-title = 착용 방향 정렬
|
||||
onboarding-automatic_mounting-mounting_reset-step-0 = 1. 팔, 다리를 구부린 다음 상체를 앞으로 기울여서 마치 스키를 타는 것처럼 쪼그리고 앉으세요.
|
||||
onboarding-automatic_mounting-mounting_reset-step-1 = 2. "착용 방향 재설정" 버튼을 누르고 착용 방향이 재설정될 때 까지 3초간 기다려주세요.
|
||||
onboarding-automatic_mounting-preparation-title = 준비
|
||||
onboarding-automatic_mounting-preparation-step-0 = 1. 팔을 몸에 붙이고 똑바로 서 주세요
|
||||
onboarding-automatic_mounting-preparation-step-1 = 2. "리셋" 버튼을 누르고 트래커가 리셋될 때까지 3초 동안 기다려주세요
|
||||
onboarding-automatic_mounting-put_trackers_on-title = 트래커를 착용해주세요
|
||||
onboarding-automatic_mounting-put_trackers_on-description = 트래커의 착용 방향이 돌아가는 것을 보정하기 위해 방금 할당한 트래커를 사용할 거에요. 모든 트래커를 착용했다면 오른쪽 그림에서 어떤 트래커인지 확인할 수 있어요.
|
||||
onboarding-automatic_mounting-put_trackers_on-next = 모든 트래커를 착용했어요
|
||||
|
||||
## Tracker manual proportions setup
|
||||
onboarding-manual_proportions-back = 리셋 튜토리얼로 돌아가기
|
||||
onboarding-manual_proportions-title = 수동 신체 비율 설정
|
||||
onboarding-manual_proportions-precision = 자세히 조절하기
|
||||
onboarding-manual_proportions-auto = 자동 신체 비율 설정
|
||||
|
||||
## Tracker automatic proportions setup
|
||||
onboarding-automatic_proportions-back = 리셋 튜토리얼로 돌아가기
|
||||
onboarding-automatic_proportions-title = 신체 비율을 측정해보세요
|
||||
onboarding-automatic_proportions-description = SlimeVR 트래커가 작동하려면 뼈의 길이를 알아야 하는데, 이 짧은 보정을 통해 측정할 수 있어요.
|
||||
onboarding-automatic_proportions-manual = 수동 신체 비율 설정
|
||||
onboarding-automatic_proportions-prev_step = 뒤로
|
||||
onboarding-automatic_proportions-put_trackers_on-title = 트래커를 착용하세요
|
||||
onboarding-automatic_proportions-put_trackers_on-description = 비율을 조정하기 위해 방금 할당한 트래커를 사용할 거에요. 모든 트래커를 착용하면 오른쪽 그림에서 어떤 것이 있는지 알 수 있어요.
|
||||
onboarding-automatic_proportions-put_trackers_on-next = 트래커를 다 착용했어요
|
||||
onboarding-automatic_proportions-preparation-title = 준비하기
|
||||
onboarding-automatic_proportions-preparation-description = 여러분의 놀이 공간 안에 여러분의 바로 뒤에 의자를 놓으세요. 오토본 설정 중에 앉을 수 있도록 준비해주세요.
|
||||
onboarding-automatic_proportions-preparation-next = 의자 앞에 서 있어요
|
||||
onboarding-automatic_proportions-start_recording-title = 움직일 준비
|
||||
onboarding-automatic_proportions-start_recording-description = 이제 몇 가지 특정 포즈와 동작을 기록할 거에요. 다음 화면에서 메시지가 표시되면 버튼을 눌러서 시작하세요!
|
||||
onboarding-automatic_proportions-start_recording-next = 기록 시작하기
|
||||
onboarding-automatic_proportions-recording-title = REC
|
||||
onboarding-automatic_proportions-recording-description-p0 = 기록하는 중...
|
||||
onboarding-automatic_proportions-recording-description-p1 = 아래에 표시된 동작을 따라 하세요
|
||||
onboarding-automatic_proportions-recording-steps-0 = 무릎을 몇 번 구부리세요
|
||||
onboarding-automatic_proportions-recording-steps-1 = 의자에 앉았다가 일어서세요.
|
||||
onboarding-automatic_proportions-recording-steps-2 = 상체를 왼쪽으로 비틀고 오른쪽으로 구부리세요.
|
||||
onboarding-automatic_proportions-recording-steps-3 = 상체를 오른쪽으로 비틀고 왼쪽으로 구부리세요.
|
||||
onboarding-automatic_proportions-recording-steps-4 = 타이머가 종료될 때까지 이리저리 움직여 보세요.
|
||||
onboarding-automatic_proportions-recording-processing = 결과 처리 중
|
||||
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 15)
|
||||
onboarding-automatic_proportions-recording-timer = { $time ->
|
||||
*[other] { $time } 초 남음
|
||||
}
|
||||
onboarding-automatic_proportions-verify_results-title = 결과를 확인하세요
|
||||
onboarding-automatic_proportions-verify_results-description = 아래 결과를 한번 보세요, 어때요?
|
||||
onboarding-automatic_proportions-verify_results-results = 기록 결과
|
||||
onboarding-automatic_proportions-verify_results-processing = 결과 처리중
|
||||
onboarding-automatic_proportions-verify_results-redo = 다시 기록하기
|
||||
onboarding-automatic_proportions-verify_results-confirm = 정확해요!
|
||||
onboarding-automatic_proportions-done-title = 몸을 측정하고 저장했어요
|
||||
onboarding-automatic_proportions-done-description = 신체 비율 보정이 완료되었어요!
|
||||
|
||||
## Home
|
||||
home-no_trackers = 감지되거나 할당된 트래커가 없어요.
|
||||
540
gui/public/i18n/nl/translation.ftl
Normal file
540
gui/public/i18n/nl/translation.ftl
Normal file
@@ -0,0 +1,540 @@
|
||||
### 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 appropiate
|
||||
# features like variables and selectors in each appropiate case!
|
||||
# And also comment the string if it's something not easy to translate so you help
|
||||
# translators on what it means
|
||||
|
||||
## Websocket (server) status
|
||||
websocket-connecting = Verbinden met de server
|
||||
websocket-connection_lost = Verbinding met de server verbroken. Opniew verbinding maken...
|
||||
|
||||
## Tips
|
||||
tips-find_tracker = Weet je niet welke tracker welke is? Schud een tracker en het corresponderende item zal worden gemarkeerd.
|
||||
tips-do_not_move_heels = Zorg ervoor dat je hielen tijdens het opnemen niet bewegen!
|
||||
|
||||
## Body parts
|
||||
body_part-NONE = Niet toegewezen
|
||||
body_part-HEAD = Hoofd
|
||||
body_part-NECK = Neck
|
||||
body_part-RIGHT_SHOULDER = Rechterschouder
|
||||
body_part-RIGHT_UPPER_ARM = Rechterbovenarm
|
||||
body_part-RIGHT_LOWER_ARM = Rechteronderarm
|
||||
body_part-RIGHT_HAND = Rechterhand
|
||||
body_part-RIGHT_UPPER_LEG = Rechterdij
|
||||
body_part-RIGHT_LOWER_LEG = Rechterenkel
|
||||
body_part-RIGHT_FOOT = Rechtervoet
|
||||
body_part-RIGHT_CONTROLLER = Rechtercontroller
|
||||
body_part-CHEST = Borst
|
||||
body_part-WAIST = Taille
|
||||
body_part-HIP = Heup
|
||||
body_part-LEFT_SHOULDER = Linkerschouder
|
||||
body_part-LEFT_UPPER_ARM = Linkerbovenarm
|
||||
body_part-LEFT_LOWER_ARM = Linkeronderarm
|
||||
body_part-LEFT_HAND = Linkerhand
|
||||
body_part-LEFT_UPPER_LEG = Linkerdij
|
||||
body_part-LEFT_LOWER_LEG = Linkerenkel
|
||||
body_part-LEFT_FOOT = Linkervoet
|
||||
body_part-LEFT_CONTROLLER = Linkercontroller
|
||||
|
||||
## Proportions
|
||||
skeleton_bone-NONE = Geen
|
||||
skeleton_bone-HEAD = Hoofdverschuiving
|
||||
skeleton_bone-NECK = Necklengte
|
||||
skeleton_bone-CHEST = Borstafstand
|
||||
skeleton_bone-CHEST_OFFSET = Borstoffset
|
||||
skeleton_bone-WAIST = Tailleafstand
|
||||
skeleton_bone-HIP = Heuplengte
|
||||
skeleton_bone-HIP_OFFSET = Heupoffset
|
||||
skeleton_bone-HIPS_WIDTH = Heupbreedte
|
||||
skeleton_bone-UPPER_LEG = Bovenbeenlengte
|
||||
skeleton_bone-LOWER_LEG = Onderbeenlengte
|
||||
skeleton_bone-FOOT_LENGTH = Voetlengte
|
||||
skeleton_bone-FOOT_SHIFT = Voetverschuiving
|
||||
skeleton_bone-SKELETON_OFFSET = Skelettenoffset
|
||||
skeleton_bone-SHOULDERS_DISTANCE = Schoudersafstand
|
||||
skeleton_bone-SHOULDERS_WIDTH = Schouderbreedte
|
||||
skeleton_bone-UPPER_ARM = Bovenarmlengte
|
||||
skeleton_bone-LOWER_ARM = Onderarmlengte
|
||||
skeleton_bone-CONTROLLER_Y = Controllerafstand Y
|
||||
skeleton_bone-CONTROLLER_Z = Controllerafstand Z
|
||||
skeleton_bone-ELBOW_OFFSET = Elleboogoffset
|
||||
|
||||
## Tracker reset buttons
|
||||
reset-reset_all = Alle afmetingen resetten
|
||||
reset-full = Resetten
|
||||
reset-mounting = Bevestiging resetten
|
||||
reset-quick = Snel resetten
|
||||
|
||||
## Serial detection stuff
|
||||
serial_detection-new_device-p0 = Nieuw serieel apparaat gedetecteerd!
|
||||
serial_detection-new_device-p1 = Voer je WiFi-inloggegevens in!
|
||||
serial_detection-new_device-p2 = Selecteer wat je wil doen
|
||||
serial_detection-open_wifi = Verbinden met WiFi
|
||||
serial_detection-open_serial = Open serieel console
|
||||
serial_detection-submit = Verzenden!
|
||||
serial_detection-close = Sluiten
|
||||
|
||||
## Navigation bar
|
||||
navbar-home = Startpagina
|
||||
navbar-body_proportions = Lichaams- verhoudingen
|
||||
navbar-trackers_assign = Tracker- toewijzing
|
||||
navbar-mounting = Bevestigings- kalibratie
|
||||
navbar-onboarding = Setupgids
|
||||
navbar-settings = Instellingen
|
||||
|
||||
## Bounding volume hierarchy recording
|
||||
bvh-start_recording = BVH opnemen
|
||||
bvh-recording = Opname bezig...
|
||||
|
||||
## Widget: Overlay settings
|
||||
widget-overlay = Overlay
|
||||
widget-overlay-is_visible_label = Overlay in SteamVR weergeven
|
||||
widget-overlay-is_mirrored_label = Overlay weergeven als spiegel
|
||||
|
||||
## Widget: Developer settings
|
||||
widget-developer_mode = Developer Mode
|
||||
widget-developer_mode-high_contrast = Hoog contrast
|
||||
widget-developer_mode-precise_rotation = Precieze rotatie
|
||||
widget-developer_mode-fast_data_feed = Snelle data feed
|
||||
widget-developer_mode-filter_slimes_and_hmd = Filter slimes en HMD
|
||||
widget-developer_mode-sort_by_name = Op naam sorteren
|
||||
widget-developer_mode-raw_slime_rotation = Ruwe rotatie
|
||||
widget-developer_mode-more_info = Meer informatie
|
||||
|
||||
## Widget: IMU Visualizer
|
||||
widget-imu_visualizer = Rotatie
|
||||
widget-imu_visualizer-rotation_raw = Rauw
|
||||
widget-imu_visualizer-rotation_preview = Preview
|
||||
|
||||
## Tracker status
|
||||
tracker-status-none = Geen status
|
||||
tracker-status-busy = Bezig
|
||||
tracker-status-error = Fout
|
||||
tracker-status-disconnected = Verbinding verbroken
|
||||
tracker-status-occluded = Verborgen
|
||||
tracker-status-ok = OK
|
||||
|
||||
## Tracker status columns
|
||||
tracker-table-column-name = Naam
|
||||
tracker-table-column-type = Type
|
||||
tracker-table-column-battery = Batterij
|
||||
tracker-table-column-ping = Ping
|
||||
tracker-table-column-tps = TPS
|
||||
tracker-table-column-temperature = Temp. °C
|
||||
tracker-table-column-linear-acceleration = Accel. X/Y/Z
|
||||
tracker-table-column-rotation = Rotatie X/Y/Z
|
||||
tracker-table-column-position = Positie X/Y/Z
|
||||
tracker-table-column-url = URL
|
||||
|
||||
## Tracker rotation
|
||||
tracker-rotation-front = Voorzijde
|
||||
tracker-rotation-left = Links
|
||||
tracker-rotation-right = Rechts
|
||||
tracker-rotation-back = Achterzijde
|
||||
|
||||
## Tracker information
|
||||
tracker-infos-manufacturer = Fabrikant
|
||||
tracker-infos-display_name = Weergavenaam
|
||||
tracker-infos-custom_name = Aangepaste naam
|
||||
tracker-infos-url = Tracker URL
|
||||
|
||||
## Tracker settings
|
||||
tracker-settings-back = Terug naar trackerslijst
|
||||
tracker-settings-title = Trackersinstellingen
|
||||
tracker-settings-assignment_section = Toewijzing
|
||||
tracker-settings-assignment_section-description = Aan welk lichaamsdeel de tracker is toegewezen.
|
||||
tracker-settings-assignment_section-edit = Toewijzing bewerken
|
||||
tracker-settings-mounting_section = Bevestigingsorientatie
|
||||
tracker-settings-mounting_section-description = Hoe is de tracker georiënteerd?
|
||||
tracker-settings-mounting_section-edit = Bevestiging bewerken
|
||||
tracker-settings-drift_compensation_section = Laat drift compensatie toe
|
||||
tracker-settings-drift_compensation_section-description = Moet deze tracker compenseren voor drift wanneer drift compensatie is ingeschakeld?
|
||||
tracker-settings-drift_compensation_section-edit = Laat drift compensatie toe
|
||||
# The .<name> means it's an attribute and it's related to the top key.
|
||||
# In this case that is the settings for the assignment section.
|
||||
tracker-settings-name_section = Trackernaam
|
||||
tracker-settings-name_section-placeholder = NightyBeast's linkerbeen
|
||||
tracker-settings-name_section-description = Geef een schattige bijnaam :)
|
||||
|
||||
## Tracker part card info
|
||||
tracker-part_card-no_name = Geen naam
|
||||
tracker-part_card-unassigned = Niet toegewezen
|
||||
|
||||
## Body assignment menu
|
||||
body_assignment_menu = Waar wil je deze tracker bevestigen?
|
||||
body_assignment_menu-description = Kies een locatie waar je deze tracker wilt toewijzen. Alternatief kun je kiezen om alle trackers tegelijk te beheren in plaats van één voor één.
|
||||
body_assignment_menu-show_advanced_locations = Geavanceerde bevestigingslocaties weergeven
|
||||
body_assignment_menu-manage_trackers = Beheer alle trackers
|
||||
body_assignment_menu-unassign_tracker = Tracker niet toewijzen
|
||||
|
||||
## Tracker assignment menu
|
||||
# A -translation_key (with a dash in the front) means that it's a label.
|
||||
# It can only be used in the translation file, it's nice for reusing names and that kind of stuff.
|
||||
#
|
||||
# We are using it here because english doesn't require changing the text in each case but
|
||||
# maybe your language does.
|
||||
-tracker_selection-part = Welke tracker wil je toewijzen aan je
|
||||
tracker_selection_menu-NONE = Van welke tracker will je de toewijzing ongedaan maken?
|
||||
tracker_selection_menu-HEAD = { -tracker_selection-part } hoofd?
|
||||
tracker_selection_menu-NECK = { -tracker_selection-part } nek?
|
||||
tracker_selection_menu-RIGHT_SHOULDER = { -tracker_selection-part } rechterschouder?
|
||||
tracker_selection_menu-RIGHT_UPPER_ARM = { -tracker_selection-part } rechterbovenarm?
|
||||
tracker_selection_menu-RIGHT_LOWER_ARM = { -tracker_selection-part } rechteronderarm?
|
||||
tracker_selection_menu-RIGHT_HAND = { -tracker_selection-part } rechterhand?
|
||||
tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } rechterdij?
|
||||
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } rechterenkel?
|
||||
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } rechtervoet?
|
||||
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } rechtercontroller?
|
||||
tracker_selection_menu-CHEST = { -tracker_selection-part } borst?
|
||||
tracker_selection_menu-WAIST = { -tracker_selection-part } taille?
|
||||
tracker_selection_menu-HIP = { -tracker_selection-part } heup?
|
||||
tracker_selection_menu-LEFT_SHOULDER = { -tracker_selection-part } linkerschouder?
|
||||
tracker_selection_menu-LEFT_UPPER_ARM = { -tracker_selection-part } linkerbovenarm?
|
||||
tracker_selection_menu-LEFT_LOWER_ARM = { -tracker_selection-part } linkeronderarm?
|
||||
tracker_selection_menu-LEFT_HAND = { -tracker_selection-part } linkerhand?
|
||||
tracker_selection_menu-LEFT_UPPER_LEG = { -tracker_selection-part } linkerdij?
|
||||
tracker_selection_menu-LEFT_LOWER_LEG = { -tracker_selection-part } linkerenkel?
|
||||
tracker_selection_menu-LEFT_FOOT = { -tracker_selection-part } linkervoet?
|
||||
tracker_selection_menu-LEFT_CONTROLLER = { -tracker_selection-part } linkercontroller?
|
||||
|
||||
tracker_selection_menu-unassigned = Niet toegewezen trackers
|
||||
tracker_selection_menu-assigned = Toegewezen trackers
|
||||
tracker_selection_menu-dont_assign = Niet toewijzen
|
||||
|
||||
## Mounting menu
|
||||
mounting_selection_menu = Waar wil je deze tracker hebben bevestigd?
|
||||
mounting_selection_menu-close = Sluiten
|
||||
|
||||
## Sidebar settings
|
||||
settings-sidebar-title = Instellingen
|
||||
settings-sidebar-general = Algemeen
|
||||
settings-sidebar-tracker_mechanics = Trackersinstellingen
|
||||
settings-sidebar-fk_settings = FK-instellingen
|
||||
settings-sidebar-gesture_control = Tikbediening
|
||||
settings-sidebar-interface = Interface
|
||||
settings-sidebar-osc_router = OSC-router
|
||||
settings-sidebar-utils = Hulpmiddelen
|
||||
settings-sidebar-serial = Serieel console
|
||||
|
||||
## SteamVR settings
|
||||
settings-general-steamvr = SteamVR
|
||||
settings-general-steamvr-subtitle = SteamVR trackers
|
||||
# Not all translation keys support multiline, only the ones that specify it will actually
|
||||
# split it in lines (that also means you can split in lines however you want in those).
|
||||
# The first spaces (not tabs) for indentation will be ignored, just to make the file look nice when writing.
|
||||
# This one is one of this cases that cares about multilines
|
||||
settings-general-steamvr-description =
|
||||
Schakel specifieke SteamVR trackers in of uit.
|
||||
Handig voor games of apps die alleen bepaalde trackers ondersteunen.
|
||||
settings-general-steamvr-trackers-waist = Taille
|
||||
settings-general-steamvr-trackers-chest = Borst
|
||||
settings-general-steamvr-trackers-feet = Voeten
|
||||
settings-general-steamvr-trackers-knees = Knieën
|
||||
settings-general-steamvr-trackers-elbows = Ellebogen
|
||||
settings-general-steamvr-trackers-hands = Handen
|
||||
|
||||
## Tracker mechanics
|
||||
settings-general-tracker_mechanics = Tracker aanpassingen
|
||||
settings-general-tracker_mechanics-filtering = Filtering
|
||||
# This also cares about multilines
|
||||
settings-general-tracker_mechanics-filtering-description =
|
||||
Kies het type filter voor uw trackers.
|
||||
Voorspelling voorspelt beweging terwijl smoothing bewegingen vloeiender maakt.
|
||||
settings-general-tracker_mechanics-filtering-type = Filtering type
|
||||
settings-general-tracker_mechanics-filtering-type-none = Geen filtering
|
||||
settings-general-tracker_mechanics-filtering-type-none-description = Gebruik rotaties zoals ze zijn. Zal geen filtering uitvoeren.
|
||||
settings-general-tracker_mechanics-filtering-type-smoothing = Smoothing
|
||||
settings-general-tracker_mechanics-filtering-type-smoothing-description = Maakt bewegingen vloeiender, maar voegt enige latentie toe.
|
||||
settings-general-tracker_mechanics-filtering-type-prediction = Voorspelling
|
||||
settings-general-tracker_mechanics-filtering-type-prediction-description = Verlaagt latentie en maakt bewegingen snappier, maar kan jitter verhogen.
|
||||
settings-general-tracker_mechanics-filtering-amount = Hoeveelheid
|
||||
settings-general-tracker_mechanics-drift_compensation = Drift compensatie
|
||||
# This cares about multilines
|
||||
settings-general-tracker_mechanics-drift_compensation-description =
|
||||
Compenseert voor IMU yaw drift door de toevoeging van een omgekeerde rotatie.
|
||||
Veranderd de sterkte van de compensatie en hoeveel resets worden gebruikt.
|
||||
settings-general-tracker_mechanics-drift_compensation-enabled-label = Drift compensate
|
||||
settings-general-tracker_mechanics-drift_compensation-amount-label = Compensatiesterkte
|
||||
settings-general-tracker_mechanics-drift_compensation-max_resets-label = Gebruik de laatste x resets
|
||||
|
||||
## FK/Tracking settings
|
||||
settings-general-fk_settings = Tracking instellingen
|
||||
settings-general-fk_settings-leg_tweak = Aanpassingen van tracking gedrag voor benen
|
||||
settings-general-fk_settings-leg_tweak-description = Floor-clip verminderd de kans dat je voeten door de grond gaan, maar kan problemen veroorzaken als je op je knieën bent. Skating-correctie corrigeert ongewenst glijden van je voeten, maar kan de nauwkeurigheid in bepaalde bewegingspatronen verminderen.
|
||||
# Floor clip:
|
||||
# why the name - came from the idea of noclip in video games, but is the opposite where clipping to the floor is a desired feature
|
||||
# definition - Prevents the foot trackers from going lower than they where when a reset was performed
|
||||
settings-general-fk_settings-leg_tweak-floor_clip = Floor-clip
|
||||
# Skating correction:
|
||||
# why the name - without this enabled the feet will often slide across the ground as if your skating across the ground,
|
||||
# since this largely prevents this it corrects for it hence skating correction (note this may be renamed to sliding correction)
|
||||
# definition - Guesses when each foot is in contact with the ground and uses that information to improve tracking
|
||||
settings-general-fk_settings-leg_tweak-skating_correction = Skating-correctie
|
||||
settings-general-fk_settings-leg_tweak-skating_correction-amount = Skating-correctie sterkte
|
||||
settings-general-fk_settings-arm_fk = Arm tracking
|
||||
settings-general-fk_settings-arm_fk-description = Verander de manier waarop de armen worden getrackt.
|
||||
settings-general-fk_settings-arm_fk-force_arms = Dwing armen vanuit HMD
|
||||
settings-general-fk_settings-arm_fk-i_pose = Use i-pose instead of t-pose
|
||||
settings-general-fk_settings-skeleton_settings = Skeleton instellingen
|
||||
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-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
|
||||
|
||||
## Gesture control settings (tracker tapping)
|
||||
settings-general-gesture_control = Gesture control
|
||||
settings-general-gesture_control-subtitle = Op tik gebaseerde resets
|
||||
settings-general-gesture_control-description = Maakt het mogelijk om resets te activeren door op een tracker te tikken. De tracker het hoogst op je bovenlichaam wordt gebruikt voor Quick Reset, de tracker het hoogst op je linkerbeen voor Reset en de tracker het hoogst op je rechterbeen voor Mounting Reset. Het moet worden vermeld dat tikken binnen 0,6 seconden moeten gebeuren om geregistreerd te worden.
|
||||
# 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 tik
|
||||
*[other] { $amount } tikken
|
||||
}
|
||||
settings-general-gesture_control-quickResetEnabled = Activeer tikken voor snelle reset
|
||||
settings-general-gesture_control-quickResetDelay = Vertraging snelle reset
|
||||
settings-general-gesture_control-quickResetTaps = Hoeveelheid tikken voor snelle reset
|
||||
settings-general-gesture_control-resetEnabled = Activeer tikken voor reset
|
||||
settings-general-gesture_control-resetDelay = Vertraging reset
|
||||
settings-general-gesture_control-resetTaps = Hoeveelheid tikken voor reset
|
||||
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
|
||||
|
||||
## Interface settings
|
||||
settings-general-interface = Interface
|
||||
settings-general-interface-dev_mode = Ontwikkelaarsmodus
|
||||
settings-general-interface-dev_mode-description = Deze modus kan nuttig zijn als u diepgaande gegevens nodig hebt of op een geavanceerd niveau wilt communiceren met aangesloten trackers.
|
||||
settings-general-interface-dev_mode-label = Ontwikkelaarsmodus
|
||||
settings-general-interface-serial_detection = Detectie van seriële apparaten
|
||||
settings-general-interface-serial_detection-description = Met deze optie verschijnt er elke keer dat u 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
|
||||
settings-general-interface-lang = Selecteer taal
|
||||
settings-general-interface-lang-description = Verander de standaardtaal die u wilt gebruiken.
|
||||
settings-general-interface-lang-placeholder = Selecteer de te gebruiken taal
|
||||
|
||||
## Serial settings
|
||||
settings-serial = Seriele console
|
||||
# This cares about multilines
|
||||
settings-serial-description =
|
||||
Dit is een live-informatiefeed voor seriële communicatie.
|
||||
Kan nuttig zijn voor het debuggen van trackers.
|
||||
settings-serial-connection_lost = Verbinding met seriële poort verloren, opnieuw verbinden...
|
||||
settings-serial-reboot = Opnieuw opstarten
|
||||
settings-serial-factory_reset = Fabrieksinstellingen herstellen
|
||||
settings-serial-get_infos = Informatie ophalen
|
||||
settings-serial-serial_select = Selecteer een seriële poort
|
||||
settings-serial-auto_dropdown_item = Automatisch
|
||||
|
||||
## OSC router settings
|
||||
settings-osc-router = OSC-router
|
||||
# This cares about multilines
|
||||
settings-osc-router-description =
|
||||
Stuur OSC-berichten door vanuit een ander programma.
|
||||
Nuttig om bijvoorbeeld een ander OSC-programma te gebruiken met VRChat.
|
||||
settings-osc-router-enable = Inschakelen
|
||||
settings-osc-router-enable-description = Schakel het doorsturen van berichten in of uit.
|
||||
settings-osc-router-enable-label = Inschakelen
|
||||
settings-osc-router-network = Netwerkpoorten
|
||||
# This cares about multilines
|
||||
settings-osc-router-network-description =
|
||||
Stel de poorten in voor het verzenden en ontvangen van gegevens.
|
||||
Dit kunnen dezelfde poorten zijn als andere poorten die worden gebruikt in de SlimeVR-server.
|
||||
settings-osc-router-network-port_in =
|
||||
.label = Poort in
|
||||
.placeholder = Poort in (standaard: 9002)
|
||||
settings-osc-router-network-port_out =
|
||||
.label = Poort uit
|
||||
.placeholder = Poort uit (standaard: 9000)
|
||||
settings-osc-router-network-address = Netwerkadres
|
||||
settings-osc-router-network-address-description = Stel het adres in waarnaar gegevens moeten worden verzonden.
|
||||
settings-osc-router-network-address-placeholder = IPV4-adres
|
||||
|
||||
## OSC VRChat settings
|
||||
settings-osc-vrchat = VRChat OSC Trackers
|
||||
# This cares about multilines
|
||||
settings-osc-vrchat-description =
|
||||
Wijzig VRChat-specifieke instellingen om HMD-data te ontvangen en te verzenden
|
||||
trackergegevens voor FBT (werkt op Quest standalone).
|
||||
settings-osc-vrchat-enable = Inschakelen
|
||||
settings-osc-vrchat-enable-description = Schakel het verzenden en ontvangen van gegevens in en uit.
|
||||
settings-osc-vrchat-enable-label = Inschakelen
|
||||
settings-osc-vrchat-network = Netwerkpoorten
|
||||
settings-osc-vrchat-network-description = Stel de poorten in voor het zenden en ontvangen van OSC-gegevens naar VRChat.
|
||||
settings-osc-vrchat-network-port_in =
|
||||
.label = Poort In
|
||||
.placeholder = Poort in (standaard: 9001)
|
||||
settings-osc-vrchat-network-port_out =
|
||||
.label = Poort Out
|
||||
.placeholder = Poort uit (standaard: 9000)
|
||||
settings-osc-vrchat-network-address = Netwerkadres
|
||||
settings-osc-vrchat-network-address-description = Kies naar welk adres u gegevens naar VRChat wilt verzenden (controleer de wifi-instellingen op je apparaat).
|
||||
settings-osc-vrchat-network-address-placeholder = VRChat IP-adres
|
||||
settings-osc-vrchat-network-trackers = Trackers
|
||||
settings-osc-vrchat-network-trackers-description = Schakel het verzenden van specifieke trackers via OSC in en uit.
|
||||
settings-osc-vrchat-network-trackers-chest = Borst
|
||||
settings-osc-vrchat-network-trackers-waist = Taille
|
||||
settings-osc-vrchat-network-trackers-knees = Knieën
|
||||
settings-osc-vrchat-network-trackers-feet = Voeten
|
||||
settings-osc-vrchat-network-trackers-elbows = Ellebogen
|
||||
|
||||
## Setup/onboarding menu
|
||||
onboarding-skip = Setupgids overslaan
|
||||
onboarding-continue = Doorgaan
|
||||
onboarding-wip = WIP
|
||||
|
||||
## WiFi setup
|
||||
onboarding-wifi_creds-back = Ga terug naar de introductie
|
||||
onboarding-wifi_creds = Voer de WiFi-inloggegevens in
|
||||
# This cares about multilines
|
||||
onboarding-wifi_creds-description =
|
||||
Deze gegevens worden gebruikt om de trackers draadloos te verbinden met de server.
|
||||
Gelieve de gegevens te gebruiken van het netwerk waarmee je momenteel bent verbonden.
|
||||
onboarding-wifi_creds-skip = WiFi-instellingen overslaan
|
||||
onboarding-wifi_creds-submit = Verzenden!
|
||||
onboarding-wifi_creds-ssid =
|
||||
.label = WiFi naam
|
||||
.placeholder = Vul WiFi naam in
|
||||
onboarding-wifi_creds-password =
|
||||
.label = Paswoord
|
||||
.placeholder = Vul paswoord in
|
||||
|
||||
## Mounting setup
|
||||
onboarding-reset_tutorial-back = Ga terug naar de bevestigingskalibratie
|
||||
onboarding-reset_tutorial = Reset tutorial
|
||||
onboarding-reset_tutorial-description = Deze stap is nog niet afgewerkt, druk gewoon op doorgaan.
|
||||
|
||||
## Setup start
|
||||
onboarding-home = Welkom bij SlimeVR
|
||||
# This cares about multilines and it's centered!!
|
||||
onboarding-home-description =
|
||||
Maakt full-body tracking beschikbaar
|
||||
voor iedereen!
|
||||
onboarding-home-start = Laten we beginnen!
|
||||
|
||||
## Enter VR part of setup
|
||||
onboarding-enter_vr-back = Ga terug naar de sectie voor toewijzing van trackers
|
||||
onboarding-enter_vr-title = Tijd om VR in te gaan!
|
||||
onboarding-enter_vr-description = Doe al je trackers aan en ga dan in VR!
|
||||
onboarding-enter_vr-ready = Gereed!
|
||||
|
||||
## Setup done
|
||||
onboarding-done-title = Je bent klaar!
|
||||
onboarding-done-description = Geniet van je full-body ervaring
|
||||
onboarding-done-close = Sluit de gids
|
||||
|
||||
## Tracker connection setup
|
||||
onboarding-connect_tracker-back = Ga terug naar de instellingen voor WiFi-configuratie
|
||||
onboarding-connect_tracker-title = Trackers verbinden
|
||||
onboarding-connect_tracker-description-p0 = Nu het leuke gedeelte, verbind al je trackers!
|
||||
onboarding-connect_tracker-description-p1 = Gebruik een USB-kabel om alle trackers te verbinden die nog niet verbonden zijn.
|
||||
onboarding-connect_tracker-issue-serial = Ik heb problemen met verbinden!
|
||||
onboarding-connect_tracker-usb = USB Tracker
|
||||
onboarding-connect_tracker-connection_status-connecting = Wifi-inloggegevens verzenden
|
||||
onboarding-connect_tracker-connection_status-connected = Verbonden via WiFi
|
||||
onboarding-connect_tracker-connection_status-error = Kan geen verbinding maken via WiFi
|
||||
onboarding-connect_tracker-connection_status-start_connecting = Zoeken naar trackers
|
||||
onboarding-connect_tracker-connection_status-handshake = Verbonden met de server
|
||||
# $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] Geen trackers
|
||||
[one] 1 tracker
|
||||
*[other] { $amount } trackers
|
||||
} verbonden
|
||||
onboarding-connect_tracker-next = Ik heb al mijn trackers verbonden
|
||||
|
||||
## Tracker assignment setup
|
||||
onboarding-assign_trackers-back = Ga terug naar de instellingen voor WiFi-configuratie
|
||||
onboarding-assign_trackers-title = Trackers toewijzen
|
||||
onboarding-assign_trackers-description = Laten we de bevesteging van je trackers bepalen. Klik op de lichaamslocatie waar je een tracker wilt toewijzen.
|
||||
# Look at translation of onboarding-connect_tracker-connected_trackers on how to use plurals
|
||||
# $assigned (Number) - Trackers that have been assigned a body part
|
||||
# $trackers (Number) - Trackers connected to the server
|
||||
onboarding-assign_trackers-assigned = { $assigned } van { $trackers ->
|
||||
[one] 1 tracker
|
||||
*[other] { $trackers } trackers
|
||||
} toegewezen
|
||||
onboarding-assign_trackers-advanced = Geavanceerde toewijzingslocaties weergeven
|
||||
onboarding-assign_trackers-next = Ik heb alle trackers toegewezen
|
||||
|
||||
## Tracker manual mounting setup
|
||||
onboarding-manual_mounting-back = Ga terug naar de VR sectie
|
||||
onboarding-manual_mounting = Handmatige bevestiging
|
||||
onboarding-manual_mounting-description = Klik op elke tracker en selecteer op welke manier ze zijn bevestigd
|
||||
onboarding-manual_mounting-auto_mounting = Automatische bevestiging
|
||||
onboarding-manual_mounting-next = Volgende stap
|
||||
|
||||
## Tracker automatic mounting setup
|
||||
onboarding-automatic_mounting-back = Ga terug naar de VR sectie
|
||||
onboarding-automatic_mounting-title = Bevestigingskalibratie
|
||||
onboarding-automatic_mounting-description = Om je trackers te laten werken, moet de rotatie worden ingesteld hoe deze zijn bevestigd op je lichaam.
|
||||
onboarding-automatic_mounting-manual_mounting = Bevestiging handmatig instellen
|
||||
onboarding-automatic_mounting-next = Volgende stap
|
||||
onboarding-automatic_mounting-prev_step = Vorige stap
|
||||
onboarding-automatic_mounting-done-title = Bevestigingsrotaties gekalibreerd.
|
||||
onboarding-automatic_mounting-done-description = Uw bevestigingskalibratie is compleet!
|
||||
onboarding-automatic_mounting-done-restart = Terug naar start
|
||||
onboarding-automatic_mounting-mounting_reset-title = Bevestiging kalibreren
|
||||
onboarding-automatic_mounting-mounting_reset-step-0 = 1. Ga staan in een "skie"-houding met gebogen benen, uw bovenlichaam naar voren gekanteld en armen gebogen.
|
||||
onboarding-automatic_mounting-mounting_reset-step-1 = 2. Druk op de knop "Bevestiging resetten" en wacht 3 seconden voordat de bevestigingsrotaties van de trackers opnieuw worden ingesteld.
|
||||
onboarding-automatic_mounting-preparation-title = Voorbereiding
|
||||
onboarding-automatic_mounting-preparation-step-0 = 1. Sta rechtop met uw armen langs uw zij.
|
||||
onboarding-automatic_mounting-preparation-step-1 = 2. Druk op de knop "Resetten" en wacht 3 seconden voordat de trackers opnieuw worden ingesteld.
|
||||
onboarding-automatic_mounting-put_trackers_on-title = Doe je trackers aan
|
||||
onboarding-automatic_mounting-put_trackers_on-description = Om bevestigingsrotaties te kalibreren, gaan we gebruik maken van de trackers die je net hebt toegewezen. Doe al je trackers aan, je kunt zien welke trackers welke zijn in de figuur rechts.
|
||||
onboarding-automatic_mounting-put_trackers_on-next = Ik heb al mijn trackers aan
|
||||
|
||||
## Tracker manual proportions setup
|
||||
onboarding-manual_proportions-back = Ga terug naar de reset tutorial
|
||||
onboarding-manual_proportions-title = Handmatige lichaamsverhoudingen
|
||||
onboarding-manual_proportions-precision = Precisie-aanpassing
|
||||
onboarding-manual_proportions-auto = Automatische kalibratie
|
||||
|
||||
## Tracker automatic proportions setup
|
||||
onboarding-automatic_proportions-back = Ga terug naar de reset tutorial
|
||||
onboarding-automatic_proportions-title = Meet je lichaam
|
||||
onboarding-automatic_proportions-description = Om SlimeVR-trackers te laten werken, moeten we de lengte van je botten weten. Deze korte kalibratie meet het voor je.
|
||||
onboarding-automatic_proportions-manual = Handmatige kalibratie
|
||||
onboarding-automatic_proportions-prev_step = Vorige stap
|
||||
onboarding-automatic_proportions-put_trackers_on-title = Doe je trackers aan
|
||||
onboarding-automatic_proportions-put_trackers_on-description = Om je verhoudingen te kalibreren, gaan we gebruik maken van de trackers die je net hebt toegewezen. Doe al je trackers aan, je kunt zien welke trackers welke zijn in de figuur rechts.
|
||||
onboarding-automatic_proportions-put_trackers_on-next = Ik heb al mijn trackers aan
|
||||
onboarding-automatic_proportions-preparation-title = Voorbereiding
|
||||
onboarding-automatic_proportions-preparation-description = Plaats een stoel recht achter je binnen je speelruimte. Zorg dat je klaar bent om te gaan zitten tijdens de autobone-configuratie.
|
||||
onboarding-automatic_proportions-preparation-next = Ik sta voor een stoel
|
||||
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
|
||||
onboarding-automatic_proportions-recording-title = REC
|
||||
onboarding-automatic_proportions-recording-description-p0 = Opname bezig...
|
||||
onboarding-automatic_proportions-recording-description-p1 = Voer de onderstaande bewegingen uit:
|
||||
onboarding-automatic_proportions-recording-steps-0 = Buig een paar keer op je knieën.
|
||||
onboarding-automatic_proportions-recording-steps-1 = Ga zitten op een stoel en sta weer op.
|
||||
onboarding-automatic_proportions-recording-steps-2 = Draai je bovenlichaam naar links, buig dan naar rechts.
|
||||
onboarding-automatic_proportions-recording-steps-3 = Draai je bovenlichaam naar rechts, buig dan naar links.
|
||||
onboarding-automatic_proportions-recording-steps-4 = Wiebel rond tot de timer is afgelopen.
|
||||
onboarding-automatic_proportions-recording-processing = Resultaat verwerken
|
||||
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 15)
|
||||
onboarding-automatic_proportions-recording-timer = { $time ->
|
||||
[one] 1 seconde resterend
|
||||
*[other] { $time } seconden resterend
|
||||
}
|
||||
onboarding-automatic_proportions-verify_results-title = Resultaten controleren
|
||||
onboarding-automatic_proportions-verify_results-description = Controleer de resultaten hieronder, zien ze er correct uit?
|
||||
onboarding-automatic_proportions-verify_results-results = Opnameresultaten
|
||||
onboarding-automatic_proportions-verify_results-processing = Resultaat verwerken
|
||||
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!
|
||||
|
||||
## Home
|
||||
home-no_trackers = Geen trackers gedetecteerd of toegewezen
|
||||
540
gui/public/i18n/pl/translation.ftl
Normal file
540
gui/public/i18n/pl/translation.ftl
Normal file
@@ -0,0 +1,540 @@
|
||||
### 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!
|
||||
# And also comment the string if it's something not easy to translate, so you help
|
||||
# translators on what it means
|
||||
|
||||
## Websocket (server) status
|
||||
websocket-connecting = Łączenie z serwerem
|
||||
websocket-connection_lost = Połączenie z serwerem zostało utracone. Próba ponownego połączenia...
|
||||
|
||||
## Tips
|
||||
tips-find_tracker = Nie wiesz który tracker to który? Obracaj Trackerem , podczas obracania będzie sie on podświetlał w serwerze.
|
||||
tips-do_not_move_heels = Upewnij się aby pięty pozostały w bezruchu podczas nagrywania.
|
||||
|
||||
## Body parts
|
||||
body_part-NONE = Nie Przypisano
|
||||
body_part-HEAD = Głowa
|
||||
body_part-NECK = Szyja
|
||||
body_part-RIGHT_SHOULDER = Prawe Ramie
|
||||
body_part-RIGHT_UPPER_ARM = Prawy Biceps
|
||||
body_part-RIGHT_LOWER_ARM = Prawe PrzedRamie
|
||||
body_part-RIGHT_HAND = Prawa Dłoń
|
||||
body_part-RIGHT_UPPER_LEG = Prawe Udo
|
||||
body_part-RIGHT_LOWER_LEG = Prawy Podudzie
|
||||
body_part-RIGHT_FOOT = Prawa Stopa
|
||||
body_part-RIGHT_CONTROLLER = Right controller
|
||||
body_part-CHEST = Klatka Piersiowa
|
||||
body_part-WAIST = Pas
|
||||
body_part-HIP = Biodra
|
||||
body_part-LEFT_SHOULDER = Lewe Ramie
|
||||
body_part-LEFT_UPPER_ARM = Lewy Biceps
|
||||
body_part-LEFT_LOWER_ARM = Lewe PrzedRamie
|
||||
body_part-LEFT_HAND = Lewa Dłoń
|
||||
body_part-LEFT_UPPER_LEG = Lewe Udo
|
||||
body_part-LEFT_LOWER_LEG = Lewe Podudzie
|
||||
body_part-LEFT_FOOT = Lewa Stopa
|
||||
body_part-LEFT_CONTROLLER = Left controller
|
||||
|
||||
## Proportions
|
||||
skeleton_bone-NONE = Brak
|
||||
skeleton_bone-HEAD = Head Shift
|
||||
skeleton_bone-NECK = Długość Szyi
|
||||
skeleton_bone-CHEST = Chest Length
|
||||
skeleton_bone-CHEST_OFFSET = Chest Offset
|
||||
skeleton_bone-WAIST = Waist Length
|
||||
skeleton_bone-HIP = Hip Length
|
||||
skeleton_bone-HIP_OFFSET = Offset Bioder
|
||||
skeleton_bone-HIPS_WIDTH = Szerokość Bioder
|
||||
skeleton_bone-UPPER_LEG = Upper Leg Length
|
||||
skeleton_bone-LOWER_LEG = Lower Leg Length
|
||||
skeleton_bone-FOOT_LENGTH = Długość Stopy
|
||||
skeleton_bone-FOOT_SHIFT = Foot Shift
|
||||
skeleton_bone-SKELETON_OFFSET = Skeleton Offset
|
||||
skeleton_bone-SHOULDERS_DISTANCE = Shoulders Distance
|
||||
skeleton_bone-SHOULDERS_WIDTH = Szerokość Ramion
|
||||
skeleton_bone-UPPER_ARM = Długość Bicepsa
|
||||
skeleton_bone-LOWER_ARM = Długość PrzedRamienia
|
||||
skeleton_bone-CONTROLLER_Z = Controller Distance Z
|
||||
skeleton_bone-CONTROLLER_Y = Controller Distance Y
|
||||
skeleton_bone-ELBOW_OFFSET = Offset Łokcia
|
||||
|
||||
## Tracker reset buttons
|
||||
reset-reset_all = Zresetuj wszystkie wymiary
|
||||
reset-full = Reset
|
||||
reset-mounting = Zresetuj Położenie
|
||||
reset-quick = Szybki Reset
|
||||
|
||||
## Serial detection stuff
|
||||
serial_detection-new_device-p0 = Wykryto Nowe Urządzenie.
|
||||
serial_detection-new_device-p1 = Wprowadź dane Wi-Fi!
|
||||
serial_detection-new_device-p2 = Wybierz co chcesz z nim zrobić.
|
||||
serial_detection-open_wifi = Połącz z Wi-Fi
|
||||
serial_detection-open_serial = Otwórz Konsole
|
||||
serial_detection-submit = Potwierdź!
|
||||
serial_detection-close = Zamknij
|
||||
|
||||
## Navigation bar
|
||||
navbar-home = Strona Główna
|
||||
navbar-body_proportions = Proporcje Ciała
|
||||
navbar-trackers_assign = Przydzielenie Trackerów
|
||||
navbar-mounting = Kalibracja Pozycji
|
||||
navbar-onboarding = Wstępna Konfiguracja
|
||||
navbar-settings = Ustawienia
|
||||
|
||||
## Bounding volume hierarchy recording
|
||||
bvh-start_recording = Nagraj BVH
|
||||
bvh-recording = Nagrywam...
|
||||
|
||||
## Widget: Overlay settings
|
||||
widget-overlay = Overlay
|
||||
widget-overlay-is_visible_label = Pokaż Overlay w SteamVR
|
||||
widget-overlay-is_mirrored_label = Pokaż Overlay jako Lustro
|
||||
|
||||
## Widget: Developer settings
|
||||
widget-developer_mode = Tryb Dewelopera
|
||||
widget-developer_mode-high_contrast = High contrast
|
||||
widget-developer_mode-precise_rotation = Precise rotation
|
||||
widget-developer_mode-fast_data_feed = Fast data feed
|
||||
widget-developer_mode-filter_slimes_and_hmd = Filter slimes and HMD
|
||||
widget-developer_mode-sort_by_name = Sort by name
|
||||
widget-developer_mode-raw_slime_rotation = Raw rotation
|
||||
widget-developer_mode-more_info = More info
|
||||
|
||||
## Widget: IMU Visualizer
|
||||
widget-imu_visualizer = Rotation
|
||||
widget-imu_visualizer-rotation_raw = Raw
|
||||
widget-imu_visualizer-rotation_preview = Preview
|
||||
|
||||
## Tracker status
|
||||
tracker-status-none = Brak Statusu
|
||||
tracker-status-busy = Zajęty
|
||||
tracker-status-error = Error
|
||||
tracker-status-disconnected = Rozłączono
|
||||
tracker-status-occluded = Zablokowany
|
||||
tracker-status-ok = Połączono
|
||||
|
||||
## Tracker status columns
|
||||
tracker-table-column-name = Nazwa
|
||||
tracker-table-column-type = Typ
|
||||
tracker-table-column-battery = Bateria
|
||||
tracker-table-column-ping = Ping
|
||||
tracker-table-column-tps = TPS
|
||||
tracker-table-column-temperature = Temp. °C
|
||||
tracker-table-column-linear-acceleration = Accel. X/Y/Z
|
||||
tracker-table-column-rotation = Rotacja X/Y/Z
|
||||
tracker-table-column-position = Pozycja X/Y/Z
|
||||
tracker-table-column-url = URL
|
||||
|
||||
## Tracker rotation
|
||||
tracker-rotation-front = Przód
|
||||
tracker-rotation-left = Lewa
|
||||
tracker-rotation-right = Prawa
|
||||
tracker-rotation-back = Tył
|
||||
|
||||
## Tracker information
|
||||
tracker-infos-manufacturer = Producent
|
||||
tracker-infos-display_name = Wyświetlana Nazwa
|
||||
tracker-infos-custom_name = Niestandardowa Nazwa
|
||||
tracker-infos-url = Tracker URL
|
||||
|
||||
## Tracker settings
|
||||
tracker-settings-back = Wróć do listy trackerów
|
||||
tracker-settings-title = Ustawienia Trackerów
|
||||
tracker-settings-assignment_section = Przydzielanie
|
||||
tracker-settings-assignment_section-description = Do jakiej części ciała jest przydzielony tracker.
|
||||
tracker-settings-assignment_section-edit = Edytuj
|
||||
tracker-settings-mounting_section = Położenie Trackera
|
||||
tracker-settings-mounting_section-description = Gdzie jest Tracker zamontowany?
|
||||
tracker-settings-mounting_section-edit = Edytuj
|
||||
tracker-settings-drift_compensation_section = Allow drift compensation
|
||||
tracker-settings-drift_compensation_section-description = Should this tracker compensate for its drift when drift compensation is enabled?
|
||||
tracker-settings-drift_compensation_section-edit = Allow drift compensation
|
||||
# The .<name> means it's an attribute and it's related to the top key.
|
||||
# In this case that is the settings for the assignment section.
|
||||
tracker-settings-name_section = Nazwa Trackera
|
||||
tracker-settings-name_section-description = Daj mu słodką nazwę :)
|
||||
tracker-settings-name_section-placeholder = Lewa noga Yexo
|
||||
|
||||
## Tracker part card info
|
||||
tracker-part_card-no_name = Brak Nazwy
|
||||
tracker-part_card-unassigned = Nieprzydzielony
|
||||
|
||||
## Body assignment menu
|
||||
body_assignment_menu = Gdzie chcesz żeby ten tracker był?
|
||||
body_assignment_menu-description = Wybierz miejsce gdzie tracker będzie przydzielony. Alternatywnie możesz ustawić wszystkie na raz.
|
||||
body_assignment_menu-show_advanced_locations = Pokaż zaawansowane położenia
|
||||
body_assignment_menu-manage_trackers = Zarządzaj wszystkimi trackerami
|
||||
body_assignment_menu-unassign_tracker = Usuń przydzielenie
|
||||
|
||||
## Tracker assignment menu
|
||||
# A -translation_key (with a dash in the front) means that it's a label.
|
||||
# It can only be used in the translation file, it's nice for reusing names and that kind of stuff.
|
||||
#
|
||||
# We are using it here because english doesn't require changing the text in each case but
|
||||
# maybe your language does.
|
||||
-tracker_selection-part = Which tracker to assign to your
|
||||
tracker_selection_menu-NONE = Which tracker do you want to be unassigned?
|
||||
tracker_selection_menu-HEAD = { -tracker_selection-part } head?
|
||||
tracker_selection_menu-NECK = { -tracker_selection-part } neck?
|
||||
tracker_selection_menu-RIGHT_SHOULDER = { -tracker_selection-part } right shoulder?
|
||||
tracker_selection_menu-RIGHT_UPPER_ARM = { -tracker_selection-part } right upper arm?
|
||||
tracker_selection_menu-RIGHT_LOWER_ARM = { -tracker_selection-part } right lower arm?
|
||||
tracker_selection_menu-RIGHT_HAND = { -tracker_selection-part } right hand?
|
||||
tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } right thigh?
|
||||
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } right ankle?
|
||||
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } right foot?
|
||||
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } right controller?
|
||||
tracker_selection_menu-CHEST = { -tracker_selection-part } chest?
|
||||
tracker_selection_menu-WAIST = { -tracker_selection-part } waist?
|
||||
tracker_selection_menu-HIP = { -tracker_selection-part } hip?
|
||||
tracker_selection_menu-LEFT_SHOULDER = { -tracker_selection-part } left shoulder?
|
||||
tracker_selection_menu-LEFT_UPPER_ARM = { -tracker_selection-part } left upper arm?
|
||||
tracker_selection_menu-LEFT_LOWER_ARM = { -tracker_selection-part } left lower arm?
|
||||
tracker_selection_menu-LEFT_HAND = { -tracker_selection-part } left hand?
|
||||
tracker_selection_menu-LEFT_UPPER_LEG = { -tracker_selection-part } left thigh?
|
||||
tracker_selection_menu-LEFT_LOWER_LEG = { -tracker_selection-part } left ankle?
|
||||
tracker_selection_menu-LEFT_FOOT = { -tracker_selection-part } left foot?
|
||||
tracker_selection_menu-LEFT_CONTROLLER = { -tracker_selection-part } left controller?
|
||||
|
||||
tracker_selection_menu-unassigned = Nieprzydzielone trackery
|
||||
tracker_selection_menu-assigned = Przydzielone trackery
|
||||
tracker_selection_menu-dont_assign = Nie przydzielaj
|
||||
|
||||
## Mounting menu
|
||||
mounting_selection_menu = Gdzie chciałbyś ten tracker?
|
||||
mounting_selection_menu-close = Zamknij
|
||||
|
||||
## Sidebar settings
|
||||
settings-sidebar-title = Ustawienia
|
||||
settings-sidebar-general = Ogólne
|
||||
settings-sidebar-tracker_mechanics = Tracker mechanics
|
||||
settings-sidebar-fk_settings = FK settings
|
||||
settings-sidebar-gesture_control = Gesture control
|
||||
settings-sidebar-interface = Interfejs
|
||||
settings-sidebar-osc_router = OSC router
|
||||
settings-sidebar-utils = Narzędzia
|
||||
settings-sidebar-serial = Konsola Seryjna
|
||||
|
||||
## SteamVR settings
|
||||
settings-general-steamvr = SteamVR
|
||||
settings-general-steamvr-subtitle = SteamVR trackers
|
||||
# Not all translation keys support multiline, only the ones that specify it will actually
|
||||
# split it in lines (that also means you can split in lines however you want in those).
|
||||
# The first spaces (not tabs) for indentation will be ignored, just to make the file look nice when writing.
|
||||
# This one is one of this cases that cares about multilines
|
||||
settings-general-steamvr-description =
|
||||
Włącz lub Wyłącz specyficzne pozycje trackowania.
|
||||
Przydatne jeżeli chcesz więcej kontroli nad SlimeVR.
|
||||
settings-general-steamvr-trackers-waist = Bruch
|
||||
settings-general-steamvr-trackers-chest = Klatka Piersiowa
|
||||
settings-general-steamvr-trackers-feet = Stopy
|
||||
settings-general-steamvr-trackers-knees = Kolana
|
||||
settings-general-steamvr-trackers-elbows = Łokcie
|
||||
settings-general-steamvr-trackers-hands = Ręce
|
||||
|
||||
## Tracker mechanics
|
||||
settings-general-tracker_mechanics = Tracker mechanics
|
||||
settings-general-tracker_mechanics-filtering = Filtrowanie
|
||||
# This also cares about multilines
|
||||
settings-general-tracker_mechanics-filtering-description =
|
||||
Wybierz Filtry dla twoich trackerów.
|
||||
Przewidywanie przewiduje ruchy a Wygładzanie stara się wygładzić ruchy.
|
||||
settings-general-tracker_mechanics-filtering-type = Filtry
|
||||
settings-general-tracker_mechanics-filtering-type-none = Brak Filtrów
|
||||
settings-general-tracker_mechanics-filtering-type-none-description = Używa rotacji takimi jakimi są.
|
||||
settings-general-tracker_mechanics-filtering-type-smoothing = Wygładzanie
|
||||
settings-general-tracker_mechanics-filtering-type-smoothing-description = Wygładza ruchy lecz dodaje trochę opóźnienia.
|
||||
settings-general-tracker_mechanics-filtering-type-prediction = Przewidywanie
|
||||
settings-general-tracker_mechanics-filtering-type-prediction-description = Zmniejsza opóźnienie i robi ruchy trochę ostrzejszymi, ale może dodać trochę drgań.
|
||||
settings-general-tracker_mechanics-filtering-amount = Ilość
|
||||
settings-general-tracker_mechanics-drift_compensation = Drift compensation
|
||||
# This cares about multilines
|
||||
settings-general-tracker_mechanics-drift_compensation-description =
|
||||
Compensates IMU yaw drift by applying an inverse rotation.
|
||||
Change amount of compensation and up to how many resets are taken into account.
|
||||
settings-general-tracker_mechanics-drift_compensation-enabled-label = Drift compensation
|
||||
settings-general-tracker_mechanics-drift_compensation-amount-label = Compensation amount
|
||||
settings-general-tracker_mechanics-drift_compensation-max_resets-label = Use up to x last resets
|
||||
|
||||
## FK settings
|
||||
settings-general-fk_settings = Tracking settings
|
||||
settings-general-fk_settings-leg_tweak = Leg tweaks
|
||||
settings-general-fk_settings-leg_tweak-description = Floor-clip can Reduce or even eliminates clipping with the floor but may cause problems when on your knees. Skating-correction corrects for ice skating, but can decrease accuracy in certain movement patterns.
|
||||
# Floor clip:
|
||||
# why the name - came from the idea of noclip in video games, but is the opposite where clipping to the floor is a desired feature
|
||||
# definition - Prevents the foot trackers from going lower than they where when a reset was performed
|
||||
settings-general-fk_settings-leg_tweak-floor_clip = Floor clip
|
||||
# Skating correction:
|
||||
# why the name - without this enabled the feet will often slide across the ground as if your skating across the ground,
|
||||
# since this largely prevents this it corrects for it hence skating correction (note this may be renamed to sliding correction)
|
||||
# definition - Guesses when each foot is in contact with the ground and uses that information to improve tracking
|
||||
settings-general-fk_settings-leg_tweak-skating_correction = Skating correction
|
||||
settings-general-fk_settings-leg_tweak-skating_correction-amount = Skating correction strength
|
||||
settings-general-fk_settings-arm_fk = Arm tracking
|
||||
settings-general-fk_settings-arm_fk-description = Change the way the arms are tracked.
|
||||
settings-general-fk_settings-arm_fk-force_arms = Force arms from HMD
|
||||
settings-general-fk_settings-arm_fk-i_pose = Use i-pose instead of t-pose
|
||||
settings-general-fk_settings-skeleton_settings = Skeleton settings
|
||||
settings-general-fk_settings-skeleton_settings-description = Toggle skeleton settings on or off. It is recommended to leave these on.
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine = Extended spine
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis = Extended pelvis
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees = Extended knee
|
||||
settings-general-fk_settings-vive_emulation-title = Vive emulation
|
||||
settings-general-fk_settings-vive_emulation-description = Emulate the waist tracker problems that Vive trackers have. This is a joke and makes tracking worse.
|
||||
settings-general-fk_settings-vive_emulation-label = Enable Vive emulation
|
||||
|
||||
## Gesture control settings (tracker tapping)
|
||||
settings-general-gesture_control = Kontrola Gestami
|
||||
settings-general-gesture_control-subtitle = Dotknij 2 razy by wykonać szybki reset
|
||||
settings-general-gesture_control-description = Włącz lub wyłącz opcje szybkiego resetowanie podwójnym dotknięciem. Stuknij 2 razy w jakąkolwiek część trackera na klatce piersiowej aby wykonać szybki reset. Opóźnienie jest czasem pomiędzy stuknięciem a wykonaniem szybkiego resetu.
|
||||
# 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
|
||||
}
|
||||
settings-general-gesture_control-quickResetEnabled = Enable tap to quick reset
|
||||
settings-general-gesture_control-quickResetDelay = Quick reset delay
|
||||
settings-general-gesture_control-quickResetTaps = Taps for quick reset
|
||||
settings-general-gesture_control-resetEnabled = Enable tap to reset
|
||||
settings-general-gesture_control-resetDelay = Reset delay
|
||||
settings-general-gesture_control-resetTaps = Taps for reset
|
||||
settings-general-gesture_control-mountingResetEnabled = Enable tap to reset mounting
|
||||
settings-general-gesture_control-mountingResetDelay = Mounting reset delay
|
||||
settings-general-gesture_control-mountingResetTaps = Taps for mounting reset
|
||||
|
||||
## Interface settings
|
||||
settings-general-interface = Interfejs
|
||||
settings-general-interface-dev_mode = Tryb Dewelopera
|
||||
settings-general-interface-dev_mode-description = Ten tryb przydaje się do sprawdzania większej ilości danych.
|
||||
settings-general-interface-dev_mode-label = Tryb Dewelopera
|
||||
settings-general-interface-serial_detection = Wykrywanie urządzeń
|
||||
settings-general-interface-serial_detection-description = Ta opcja daje powiadomienia jeżeli serwer wykryje urządzenie które może być trackerem
|
||||
settings-general-interface-serial_detection-label = Wykrywanie urządzeń
|
||||
settings-general-interface-lang = Wybierz Język
|
||||
settings-general-interface-lang-description = Zmień podstawowy język jaki chcesz używać
|
||||
settings-general-interface-lang-placeholder = Wybierz Język który będziesz używać
|
||||
|
||||
## Serial settings
|
||||
settings-serial = Serial Console
|
||||
# This cares about multilines
|
||||
settings-serial-description =
|
||||
This is a live information feed for serial communication.
|
||||
May be useful if you need to know the firmware is acting up.
|
||||
settings-serial-connection_lost = Connection to serial lost, Reconnecting...
|
||||
settings-serial-reboot = Reboot
|
||||
settings-serial-factory_reset = Factory Reset
|
||||
settings-serial-get_infos = Get Infos
|
||||
settings-serial-serial_select = Select a serial port
|
||||
settings-serial-auto_dropdown_item = Auto
|
||||
|
||||
## OSC router settings
|
||||
settings-osc-router = OSC router
|
||||
# This cares about multilines
|
||||
settings-osc-router-description =
|
||||
Forward OSC messages from another program.
|
||||
Useful for using another OSC program with VRChat for example.
|
||||
settings-osc-router-enable = Enable
|
||||
settings-osc-router-enable-description = Toggle the forwarding of messages.
|
||||
settings-osc-router-enable-label = Enable
|
||||
settings-osc-router-network = Network ports
|
||||
# This cares about multilines
|
||||
settings-osc-router-network-description =
|
||||
Set the ports for listening and sending data.
|
||||
These can be the same as other ports used in the SlimeVR server.
|
||||
settings-osc-router-network-port_in =
|
||||
.label = Port In
|
||||
.placeholder = Port in (default: 9002)
|
||||
settings-osc-router-network-port_out =
|
||||
.label = Port Out
|
||||
.placeholder = Port out (default: 9000)
|
||||
settings-osc-router-network-address = Network address
|
||||
settings-osc-router-network-address-description = Set the address to send out data at.
|
||||
settings-osc-router-network-address-placeholder = IPV4 address
|
||||
|
||||
## OSC VRChat settings
|
||||
settings-osc-vrchat = VRChat OSC Trackers
|
||||
# This cares about multilines
|
||||
settings-osc-vrchat-description =
|
||||
Change VRChat-specific settings to receive HMD data and send
|
||||
trackers data for FBT (works on Quest standalone).
|
||||
settings-osc-vrchat-enable = Enable
|
||||
settings-osc-vrchat-enable-description = Toggle the sending and receiving of data.
|
||||
settings-osc-vrchat-enable-label = Enable
|
||||
settings-osc-vrchat-network = Network ports
|
||||
settings-osc-vrchat-network-description = Set the ports for listening and sending data to VRChat.
|
||||
settings-osc-vrchat-network-port_in =
|
||||
.label = Port In
|
||||
.placeholder = Port in (default: 9001)
|
||||
settings-osc-vrchat-network-port_out =
|
||||
.label = Port Out
|
||||
.placeholder = Port out (default: 9000)
|
||||
settings-osc-vrchat-network-address = Network address
|
||||
settings-osc-vrchat-network-address-description = Choose which address to send out data to VRChat (check your Wi-Fi settings on your device).
|
||||
settings-osc-vrchat-network-address-placeholder = VRChat ip address
|
||||
settings-osc-vrchat-network-trackers = Trackers
|
||||
settings-osc-vrchat-network-trackers-description = Toggle the sending of specific trackers via OSC.
|
||||
settings-osc-vrchat-network-trackers-chest = Chest
|
||||
settings-osc-vrchat-network-trackers-waist = Waist
|
||||
settings-osc-vrchat-network-trackers-knees = Knees
|
||||
settings-osc-vrchat-network-trackers-feet = Feet
|
||||
settings-osc-vrchat-network-trackers-elbows = Elbows
|
||||
|
||||
## Setup/onboarding menu
|
||||
onboarding-skip = Pomiń wstępną konfiguracje
|
||||
onboarding-continue = Kontynuuj
|
||||
onboarding-wip = W trakcie prac
|
||||
|
||||
## Wi-Fi setup
|
||||
onboarding-wifi_creds-back = Cofnij się do początku
|
||||
onboarding-wifi_creds = Wpisz dane Wi-Fi
|
||||
# This cares about multilines
|
||||
onboarding-wifi_creds-description =
|
||||
Trackery będą używać tej sieci do łączenia się z serwerem
|
||||
proszę używać sieci do której jest się połączonym
|
||||
onboarding-wifi_creds-skip = Pomiń ustawienia Wi-Fi
|
||||
onboarding-wifi_creds-submit = Potwierdź!
|
||||
onboarding-wifi_creds-ssid =
|
||||
.label = SSID
|
||||
.placeholder = Enter SSID
|
||||
onboarding-wifi_creds-password =
|
||||
.label = Password
|
||||
.placeholder = Enter password
|
||||
|
||||
## Mounting setup
|
||||
onboarding-reset_tutorial-back = Powrót do Konfiguracji Położenia trackerów
|
||||
onboarding-reset_tutorial = Zresetuj poradnik
|
||||
onboarding-reset_tutorial-description = Ta funkcja jeszcze nie jest skończona.
|
||||
|
||||
## Setup start
|
||||
onboarding-home = Witamy w SlimeVR
|
||||
# This cares about multilines and it's centered!!
|
||||
onboarding-home-description =
|
||||
Full-body tracking
|
||||
dla każdego
|
||||
onboarding-home-start = Zaczynajmny!
|
||||
|
||||
## Enter VR part of setup
|
||||
onboarding-enter_vr-back = Cofnij do Przydzielania Trackerów
|
||||
onboarding-enter_vr-title = Czas na wejście do VR!
|
||||
onboarding-enter_vr-description = Załóż wszystkie trackery a potem wejdź do VR!
|
||||
onboarding-enter_vr-ready = Jestem gotów
|
||||
|
||||
## Setup done
|
||||
onboarding-done-title = Wszystko ustawione!
|
||||
onboarding-done-description = Ciesz się Full-Body
|
||||
onboarding-done-close = Zamknij Poradnik
|
||||
|
||||
## Tracker connection setup
|
||||
onboarding-connect_tracker-back = Cofnij się do ustawień Wi-Fi
|
||||
onboarding-connect_tracker-title = Połącz trackery
|
||||
onboarding-connect_tracker-description-p0 = Teraz czas na zabawe, połączenie wszystkich trackerów!
|
||||
onboarding-connect_tracker-description-p1 = Po prostu połącz wszystkie dotychczas nie połączone trackery za pomocą USB
|
||||
onboarding-connect_tracker-issue-serial = Mam problemy z połączeniem!
|
||||
onboarding-connect_tracker-usb = USB Tracker
|
||||
onboarding-connect_tracker-connection_status-connecting = Wysyłanie danych Wi-Fi
|
||||
onboarding-connect_tracker-connection_status-connected = Połączono z Wi-Fi
|
||||
onboarding-connect_tracker-connection_status-error = Nie można połączyć z Wi-Fi
|
||||
onboarding-connect_tracker-connection_status-start_connecting = Szukanie Trackerów
|
||||
onboarding-connect_tracker-connection_status-handshake = Połączono z serwerem
|
||||
# $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] No trackers
|
||||
[one] 1 tracker
|
||||
*[other] { $amount } trackers
|
||||
} connected
|
||||
onboarding-connect_tracker-next = Połączyłem już wszystkie trackery
|
||||
|
||||
## Tracker assignment setup
|
||||
onboarding-assign_trackers-back = Cofnij się do ustawień Wi-Fi
|
||||
onboarding-assign_trackers-title = Przydziel Trackery
|
||||
onboarding-assign_trackers-description = Wybierzmy gdzie idzie jaki tracker. Naciśnij gdzie chcesz go przydzielić
|
||||
# Look at translation of onboarding-connect_tracker-connected_trackers on how to use plurals
|
||||
# $assigned (Number) - Trackers that have been assigned a body part
|
||||
# $trackers (Number) - Trackers connected to the server
|
||||
onboarding-assign_trackers-assigned = { $assigned } of { $trackers ->
|
||||
[one] 1 tracker
|
||||
*[other] { $trackers } trackers
|
||||
} assigned
|
||||
onboarding-assign_trackers-advanced = Pokaż zaawansowane ustawienia pozycji
|
||||
onboarding-assign_trackers-next = Przydzieliłem już wszystkie trackery
|
||||
|
||||
## Tracker manual mounting setup
|
||||
onboarding-manual_mounting-back = Cofnij się żeby wejść do VR
|
||||
onboarding-manual_mounting = Pozycjonowanie Manualne
|
||||
onboarding-manual_mounting-description = Kliknij na każdy tracker i wybierz w jaki sposób są zamontowane
|
||||
onboarding-manual_mounting-auto_mounting = Automatic mounting
|
||||
onboarding-manual_mounting-next = Następny krok
|
||||
|
||||
## Tracker automatic mounting setup
|
||||
onboarding-automatic_mounting-back = Cofnij się żeby wejść do VR
|
||||
onboarding-automatic_mounting-title = Kalibracja Pozycji
|
||||
onboarding-automatic_mounting-description = Aby SlimeVR działało prawidłowo, musimy przypisać rotacje trackera aby zgadzała się ona z tą w prawdziwym życiu.
|
||||
onboarding-automatic_mounting-manual_mounting = Pozycjonowanie Manualne
|
||||
onboarding-automatic_mounting-next = Następny krok
|
||||
onboarding-automatic_mounting-prev_step = Poprzedni krok
|
||||
onboarding-automatic_mounting-done-title = Rotacja trackerów została skalibrowana.
|
||||
onboarding-automatic_mounting-done-description = Kalibracja skończona!
|
||||
onboarding-automatic_mounting-done-restart = Cofnij się na początek
|
||||
onboarding-automatic_mounting-mounting_reset-title = Kalibracja Pozycji
|
||||
onboarding-automatic_mounting-mounting_reset-step-0 = 1. Zrób pozycje "na Małysza" z wygiętymi nogami, tułów pochylony do przodu z wygiętymi rękami.
|
||||
onboarding-automatic_mounting-mounting_reset-step-1 = 2. Naciśnij "Zresetuj Położenie" i poczekaj 3 sekundy zanim trackery się zresetują.
|
||||
onboarding-automatic_mounting-preparation-title = Przygotowania
|
||||
onboarding-automatic_mounting-preparation-step-0 = 1. Stań prosto z rękami wyciągniętymi na bok.
|
||||
onboarding-automatic_mounting-preparation-step-1 = 2. Naciśnij "Reset" i poczekaj 3 sekundy zanim trackery się zresetują.
|
||||
onboarding-automatic_mounting-put_trackers_on-title = Załóż trackery
|
||||
onboarding-automatic_mounting-put_trackers_on-description = Aby skalibrować rotacje, użyjemy trackerów które przed chwilą przypisałeś. Załóż wszystkie trackery, będziesz widział który to który na postaci po prawej.
|
||||
onboarding-automatic_mounting-put_trackers_on-next = Mam wszystkie trackery założone
|
||||
|
||||
## Tracker manual proportions setup
|
||||
onboarding-manual_proportions-back = Go Back to Reset tutorial
|
||||
onboarding-manual_proportions-title = Manualne Proporcje Ciała
|
||||
onboarding-manual_proportions-precision = Precyzyjna Regulacja
|
||||
onboarding-manual_proportions-auto = Automatyczna Kalibracja
|
||||
|
||||
## Tracker automatic proportions setup
|
||||
onboarding-automatic_proportions-back = Go Back to Reset tutorial
|
||||
onboarding-automatic_proportions-title = Zmierz swoje ciało
|
||||
onboarding-automatic_proportions-description = Aby SlimeVR działało poprawnie, musimy znać długość twoich kości. Ta kalibracja zrobi to za ciebie.
|
||||
onboarding-automatic_proportions-manual = Kalibracja Manualna
|
||||
onboarding-automatic_proportions-prev_step = Poprzedni krok
|
||||
onboarding-automatic_proportions-put_trackers_on-title = Załóż trackery
|
||||
onboarding-automatic_proportions-put_trackers_on-description = Aby skalibrować proporcje, użyjemy trackerów które przed chwilą przypisałeś. Załóż wszystkie trackery, będziesz widział który to który na postaci po prawej.
|
||||
onboarding-automatic_proportions-put_trackers_on-next = Mam wszystkie trackery założone
|
||||
onboarding-automatic_proportions-preparation-title = Przygotowania
|
||||
onboarding-automatic_proportions-preparation-description = Połóż krzesło za sobą w twojej przeszczeni grania. Bądź gotowy do siadania podczas automatycznej kalibracji kości.
|
||||
onboarding-automatic_proportions-preparation-next = Jestem przed krzesłem
|
||||
onboarding-automatic_proportions-start_recording-title = Bądź gotowy żeby się ruszać
|
||||
onboarding-automatic_proportions-start_recording-description = Będziemy teraz nagrywać specyficzne pozycje i ruchy. Będą one pokazane w następnym okienku. Bądź gotowy po naciśnięciu przycisku!
|
||||
onboarding-automatic_proportions-start_recording-next = Uruchom nagrywanie
|
||||
onboarding-automatic_proportions-recording-title = REC
|
||||
onboarding-automatic_proportions-recording-description-p0 = Nagrywanie w toku...
|
||||
onboarding-automatic_proportions-recording-description-p1 = Wykonuj ruchy pokazane niżej:
|
||||
onboarding-automatic_proportions-recording-steps-0 = Zegnij kolana kilka razy.
|
||||
onboarding-automatic_proportions-recording-steps-1 = Usiądź na krześle ,po czym wstań.
|
||||
onboarding-automatic_proportions-recording-steps-2 = Przekręć ciało w lewo ,po czym przechyl się w prawo.
|
||||
onboarding-automatic_proportions-recording-steps-3 = Przekręć ciało w prawo ,po czym przechyl się w lewo.
|
||||
onboarding-automatic_proportions-recording-steps-4 = Poruszaj się dopuki czas się nie skończy
|
||||
onboarding-automatic_proportions-recording-processing = Przetwarzanie wyników
|
||||
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 15)
|
||||
onboarding-automatic_proportions-recording-timer = { $time ->
|
||||
[one] 1 second left
|
||||
*[other] { $time } seconds left
|
||||
}
|
||||
onboarding-automatic_proportions-verify_results-title = Zweryfikuj Wyniki
|
||||
onboarding-automatic_proportions-verify_results-description = Sprawdź wyniki poniżej, czy są prawidłowe?
|
||||
onboarding-automatic_proportions-verify_results-results = Wyniki Nagrywania
|
||||
onboarding-automatic_proportions-verify_results-processing = Przetwarzanie wyniku
|
||||
onboarding-automatic_proportions-verify_results-redo = Powtórz Nagrywanie
|
||||
onboarding-automatic_proportions-verify_results-confirm = Są Prawidłowe
|
||||
onboarding-automatic_proportions-done-title = Zmierzono oraz Zapisano.
|
||||
onboarding-automatic_proportions-done-description = Twoja kalibracja ciała została zakończona!
|
||||
|
||||
## Home
|
||||
home-no_trackers = Nie wykryto trackerów
|
||||
540
gui/public/i18n/pt-BR/translation.ftl
Normal file
540
gui/public/i18n/pt-BR/translation.ftl
Normal file
@@ -0,0 +1,540 @@
|
||||
### 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!
|
||||
# And also comment the string if it's something not easy to translate, so you help
|
||||
# translators on what it means
|
||||
|
||||
## Websocket (server) status
|
||||
websocket-connecting = Conectando ao servidor
|
||||
websocket-connection_lost = Conexão perdida com o servidor. Reconectando...
|
||||
|
||||
## Tips
|
||||
tips-find_tracker = Não tem certeza qual tracker é qual? Balance o tracker e ele destacará o item correspondente.
|
||||
tips-do_not_move_heels = Tenha certeza de não mexer seus calcanhares durante a gravação!
|
||||
|
||||
## Body parts
|
||||
body_part-NONE = Não atribuído
|
||||
body_part-HEAD = Cabeça
|
||||
body_part-NECK = Pescoço
|
||||
body_part-RIGHT_SHOULDER = Ombro direito
|
||||
body_part-RIGHT_UPPER_ARM = Braço superior direito
|
||||
body_part-RIGHT_LOWER_ARM = Antebraço direito
|
||||
body_part-RIGHT_HAND = Mão Direita
|
||||
body_part-RIGHT_UPPER_LEG = Coxa direita
|
||||
body_part-RIGHT_LOWER_LEG = Canela direita
|
||||
body_part-RIGHT_FOOT = Pé direito
|
||||
body_part-RIGHT_CONTROLLER = Controle direito
|
||||
body_part-CHEST = Peito
|
||||
body_part-WAIST = Cintura
|
||||
body_part-HIP = Quadril
|
||||
body_part-LEFT_SHOULDER = Ombro esquerdo
|
||||
body_part-LEFT_UPPER_ARM = Braço superior esquerdo
|
||||
body_part-LEFT_LOWER_ARM = Antebraço esquerdo
|
||||
body_part-LEFT_HAND = Mão esquerda
|
||||
body_part-LEFT_UPPER_LEG = Coxa esquerda
|
||||
body_part-LEFT_LOWER_LEG = Canela esquerda
|
||||
body_part-LEFT_FOOT = Pé esquerdo
|
||||
body_part-LEFT_CONTROLLER = Controle esquerdo
|
||||
|
||||
## Proportions
|
||||
skeleton_bone-NONE = Nada
|
||||
skeleton_bone-HEAD = Deslocamento da Cabeça
|
||||
skeleton_bone-NECK = Tamanho do Pescoço
|
||||
skeleton_bone-CHEST = Chest Length
|
||||
skeleton_bone-CHEST_OFFSET = Chest Offset
|
||||
skeleton_bone-WAIST = Waist Length
|
||||
skeleton_bone-HIP = Hip Length
|
||||
skeleton_bone-HIP_OFFSET = Compensação do Quadril
|
||||
skeleton_bone-HIPS_WIDTH = Largura do Quadril
|
||||
skeleton_bone-UPPER_LEG = Upper Leg Length
|
||||
skeleton_bone-LOWER_LEG = Lower Leg Length
|
||||
skeleton_bone-FOOT_LENGTH = Tamanho do Pé
|
||||
skeleton_bone-FOOT_SHIFT = Compensação do Pé
|
||||
skeleton_bone-SKELETON_OFFSET = Compensação do Esqueleto
|
||||
skeleton_bone-SHOULDERS_DISTANCE = Distância dos Ombros
|
||||
skeleton_bone-SHOULDERS_WIDTH = Largura dos Ombros
|
||||
skeleton_bone-UPPER_ARM = Tamanho do Braço Superior
|
||||
skeleton_bone-LOWER_ARM = Distância do Antebraço
|
||||
skeleton_bone-CONTROLLER_Y = Distância do Controle Y
|
||||
skeleton_bone-CONTROLLER_Z = Distância do Controle Z
|
||||
skeleton_bone-ELBOW_OFFSET = Compensação do Cotovelo
|
||||
|
||||
## Tracker reset buttons
|
||||
reset-reset_all = Redefinir todas as proporções
|
||||
reset-full = Reset
|
||||
reset-mounting = Reset de Posição
|
||||
reset-quick = Reset Rápido
|
||||
|
||||
## Serial detection stuff
|
||||
serial_detection-new_device-p0 = Novo dispositivo de serial detectado!
|
||||
serial_detection-new_device-p1 = Insira suas credenciais de Wi-Fi!
|
||||
serial_detection-new_device-p2 = Selecione o que quer fazer com ele
|
||||
serial_detection-open_wifi = Conectar ao Wi-Fi
|
||||
serial_detection-open_serial = Abrir o Console Serial
|
||||
serial_detection-submit = Enviar!
|
||||
serial_detection-close = Fechar
|
||||
|
||||
## Navigation bar
|
||||
navbar-home = Início
|
||||
navbar-body_proportions = Proporções do corpo
|
||||
navbar-trackers_assign = Atribuição de Tracker
|
||||
navbar-mounting = Calibragem de Posição
|
||||
navbar-onboarding = Assistente de Configuração
|
||||
navbar-settings = Opções
|
||||
|
||||
## Bounding volume hierarchy recording
|
||||
bvh-start_recording = Gravar BVH
|
||||
bvh-recording = Gravando...
|
||||
|
||||
## Widget: Overlay settings
|
||||
widget-overlay = Overlay
|
||||
widget-overlay-is_visible_label = Mostrar Overlay na SteamVR
|
||||
widget-overlay-is_mirrored_label = Mostrar Overlay como espelho
|
||||
|
||||
## Widget: Developer settings
|
||||
widget-developer_mode = Modo de desenvolvedor
|
||||
widget-developer_mode-high_contrast = High contrast
|
||||
widget-developer_mode-precise_rotation = Precise rotation
|
||||
widget-developer_mode-fast_data_feed = Fast data feed
|
||||
widget-developer_mode-filter_slimes_and_hmd = Filter slimes and HMD
|
||||
widget-developer_mode-sort_by_name = Sort by name
|
||||
widget-developer_mode-raw_slime_rotation = Raw rotation
|
||||
widget-developer_mode-more_info = More info
|
||||
|
||||
## Widget: IMU Visualizer
|
||||
widget-imu_visualizer = Rotation
|
||||
widget-imu_visualizer-rotation_raw = Raw
|
||||
widget-imu_visualizer-rotation_preview = Preview
|
||||
|
||||
## Tracker status
|
||||
tracker-status-none = Sem Status
|
||||
tracker-status-busy = Ocupado
|
||||
tracker-status-error = Erro
|
||||
tracker-status-disconnected = Desconectado
|
||||
tracker-status-occluded = Ocluso
|
||||
tracker-status-ok = Conectado
|
||||
|
||||
## Tracker status columns
|
||||
tracker-table-column-name = Nome
|
||||
tracker-table-column-type = Tipo
|
||||
tracker-table-column-battery = Bateria
|
||||
tracker-table-column-ping = Ping
|
||||
tracker-table-column-tps = TPS
|
||||
tracker-table-column-temperature = Temp. °C
|
||||
tracker-table-column-linear-acceleration = Accel. X/Y/Z
|
||||
tracker-table-column-rotation = Rotação X/Y/Z
|
||||
tracker-table-column-position = Posição X/Y/Z
|
||||
tracker-table-column-url = URL
|
||||
|
||||
## Tracker rotation
|
||||
tracker-rotation-front = Frente
|
||||
tracker-rotation-left = Esquerda
|
||||
tracker-rotation-right = Direita
|
||||
tracker-rotation-back = Atrás
|
||||
|
||||
## Tracker information
|
||||
tracker-infos-manufacturer = Fabricante
|
||||
tracker-infos-display_name = Nome de exibição
|
||||
tracker-infos-custom_name = Nome personalizado
|
||||
tracker-infos-url = URL do Tracker
|
||||
|
||||
## Tracker settings
|
||||
tracker-settings-back = Voltar para lista de trackers
|
||||
tracker-settings-title = Opções dos trackers
|
||||
tracker-settings-assignment_section = Atribuição
|
||||
tracker-settings-assignment_section-description = Qual parte do seu corpo o tracker está atribuído para.
|
||||
tracker-settings-assignment_section-edit = Editar atribuição
|
||||
tracker-settings-mounting_section = Posicionamento
|
||||
tracker-settings-mounting_section-description = Aonde o tracker está posicionado?
|
||||
tracker-settings-mounting_section-edit = Editar posição
|
||||
tracker-settings-drift_compensation_section = Allow drift compensation
|
||||
tracker-settings-drift_compensation_section-description = Should this tracker compensate for its drift when drift compensation is enabled?
|
||||
tracker-settings-drift_compensation_section-edit = Allow drift compensation
|
||||
# The .<name> means it's an attribute and it's related to the top key.
|
||||
# In this case that is the settings for the assignment section.
|
||||
tracker-settings-name_section = Nome do tracker
|
||||
tracker-settings-name_section-description = Dê um apelido fofo :)
|
||||
tracker-settings-name_section-placeholder = Coxa esquerda de NightyBeast
|
||||
|
||||
## Tracker part card info
|
||||
tracker-part_card-no_name = Sem nome
|
||||
tracker-part_card-unassigned = Não atribuído
|
||||
|
||||
## Body assignment menu
|
||||
body_assignment_menu = Aonde você quer que esse tracker fique?
|
||||
body_assignment_menu-description = Escolha um local onde você quer que esse tracker seja atribuído. Alternativamente você pode escolher arrumar todos os tracker de uma vez, ao invés de um por um.
|
||||
body_assignment_menu-show_advanced_locations = Mostrar locais de atribuição avançados
|
||||
body_assignment_menu-manage_trackers = Arrumar todos os trackers
|
||||
body_assignment_menu-unassign_tracker = Desatribuir tracker
|
||||
|
||||
## Tracker assignment menu
|
||||
# A -translation_key (with a dash in the front) means that it's a label.
|
||||
# It can only be used in the translation file, it's nice for reusing names and that kind of stuff.
|
||||
#
|
||||
# We are using it here because english doesn't require changing the text in each case but
|
||||
# maybe your language does.
|
||||
-tracker_selection-part = Which tracker to assign to your
|
||||
tracker_selection_menu-NONE = Which tracker do you want to be unassigned?
|
||||
tracker_selection_menu-HEAD = { -tracker_selection-part } head?
|
||||
tracker_selection_menu-NECK = { -tracker_selection-part } neck?
|
||||
tracker_selection_menu-RIGHT_SHOULDER = { -tracker_selection-part } right shoulder?
|
||||
tracker_selection_menu-RIGHT_UPPER_ARM = { -tracker_selection-part } right upper arm?
|
||||
tracker_selection_menu-RIGHT_LOWER_ARM = { -tracker_selection-part } right lower arm?
|
||||
tracker_selection_menu-RIGHT_HAND = { -tracker_selection-part } right hand?
|
||||
tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } right thigh?
|
||||
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } right ankle?
|
||||
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } right foot?
|
||||
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } right controller?
|
||||
tracker_selection_menu-CHEST = { -tracker_selection-part } chest?
|
||||
tracker_selection_menu-WAIST = { -tracker_selection-part } waist?
|
||||
tracker_selection_menu-HIP = { -tracker_selection-part } hip?
|
||||
tracker_selection_menu-LEFT_SHOULDER = { -tracker_selection-part } left shoulder?
|
||||
tracker_selection_menu-LEFT_UPPER_ARM = { -tracker_selection-part } left upper arm?
|
||||
tracker_selection_menu-LEFT_LOWER_ARM = { -tracker_selection-part } left lower arm?
|
||||
tracker_selection_menu-LEFT_HAND = { -tracker_selection-part } left hand?
|
||||
tracker_selection_menu-LEFT_UPPER_LEG = { -tracker_selection-part } left thigh?
|
||||
tracker_selection_menu-LEFT_LOWER_LEG = { -tracker_selection-part } left ankle?
|
||||
tracker_selection_menu-LEFT_FOOT = { -tracker_selection-part } left foot?
|
||||
tracker_selection_menu-LEFT_CONTROLLER = { -tracker_selection-part } left controller?
|
||||
|
||||
tracker_selection_menu-unassigned = Trackers não atribuídos
|
||||
tracker_selection_menu-assigned = Trackers atribuídos
|
||||
tracker_selection_menu-dont_assign = Não atribuir
|
||||
|
||||
## Mounting menu
|
||||
mounting_selection_menu = Aonde você quer que esse tracker fique?
|
||||
mounting_selection_menu-close = Fechar
|
||||
|
||||
## Sidebar settings
|
||||
settings-sidebar-title = Opções
|
||||
settings-sidebar-general = Geral
|
||||
settings-sidebar-tracker_mechanics = Mecânicas do Tracker
|
||||
settings-sidebar-fk_settings = Opções de Tracker
|
||||
settings-sidebar-gesture_control = Controle de Gestos
|
||||
settings-sidebar-interface = Interface
|
||||
settings-sidebar-osc_router = Roteador OSC
|
||||
settings-sidebar-utils = Utilidades
|
||||
settings-sidebar-serial = Console Serial
|
||||
|
||||
## SteamVR settings
|
||||
settings-general-steamvr = SteamVR
|
||||
settings-general-steamvr-subtitle = Trackers do SteamVR
|
||||
# Not all translation keys support multiline, only the ones that specify it will actually
|
||||
# split it in lines (that also means you can split in lines however you want in those).
|
||||
# The first spaces (not tabs) for indentation will be ignored, just to make the file look nice when writing.
|
||||
# This one is one of this cases that cares about multilines
|
||||
settings-general-steamvr-description =
|
||||
Ativar ou desativar partes específicas do tracking.
|
||||
Útil se você quer mais controle do que o SlimeVR faz.
|
||||
settings-general-steamvr-trackers-waist = Cintura
|
||||
settings-general-steamvr-trackers-chest = Peito
|
||||
settings-general-steamvr-trackers-feet = Pés
|
||||
settings-general-steamvr-trackers-knees = Joelhos
|
||||
settings-general-steamvr-trackers-elbows = Cotovelos
|
||||
settings-general-steamvr-trackers-hands = Mãos
|
||||
|
||||
## Tracker mechanics
|
||||
settings-general-tracker_mechanics = Mecânicas do Tracker
|
||||
settings-general-tracker_mechanics-filtering = Filtros
|
||||
# This also cares about multilines
|
||||
settings-general-tracker_mechanics-filtering-description =
|
||||
Escolha o tipo de filtro para seus trackers.
|
||||
Predição prediz movimentação enquanto suavização suaviza o movimento.
|
||||
settings-general-tracker_mechanics-filtering-type = Tipo de filtro
|
||||
settings-general-tracker_mechanics-filtering-type-none = Sem filtro
|
||||
settings-general-tracker_mechanics-filtering-type-none-description = Utiliza as rotações como registradas. Sem qualquer tipo de filtro.
|
||||
settings-general-tracker_mechanics-filtering-type-smoothing = Suavização
|
||||
settings-general-tracker_mechanics-filtering-type-smoothing-description = Suaviza o movimento porém introduz um pouco de latência.
|
||||
settings-general-tracker_mechanics-filtering-type-prediction = Predição
|
||||
settings-general-tracker_mechanics-filtering-type-prediction-description = Reduz latência e torna os movimentos mais responsivos, porém aumenta tremulação (Jitter).
|
||||
settings-general-tracker_mechanics-filtering-amount = Quantidade
|
||||
settings-general-tracker_mechanics-drift_compensation = Drift compensation
|
||||
# This cares about multilines
|
||||
settings-general-tracker_mechanics-drift_compensation-description =
|
||||
Compensates IMU yaw drift by applying an inverse rotation.
|
||||
Change amount of compensation and up to how many resets are taken into account.
|
||||
settings-general-tracker_mechanics-drift_compensation-enabled-label = Drift compensation
|
||||
settings-general-tracker_mechanics-drift_compensation-amount-label = Compensation amount
|
||||
settings-general-tracker_mechanics-drift_compensation-max_resets-label = Use up to x last resets
|
||||
|
||||
## FK/Tracking settings
|
||||
settings-general-fk_settings = Opções de Tracker
|
||||
settings-general-fk_settings-leg_tweak = Ajustes de perna
|
||||
settings-general-fk_settings-leg_tweak-description = Atravessar o chão pode reduzir ou até eliminar o clipping(atravessar) com o chão porém pode causar problemas quando ajoelhado. Correção de Deslize corrige o ice skating(deslize dos trackers no chão), porém pode diminuir a precisão de certos padrões de movimento.
|
||||
# Floor clip:
|
||||
# why the name - came from the idea of noclip in video games, but is the opposite where clipping to the floor is a desired feature
|
||||
# definition - Prevents the foot trackers from going lower than they where when a reset was performed
|
||||
settings-general-fk_settings-leg_tweak-floor_clip = Atravessar o chão
|
||||
# Skating correction:
|
||||
# why the name - without this enabled the feet will often slide across the ground as if your skating across the ground,
|
||||
# since this largely prevents this it corrects for it hence skating correction (note this may be renamed to sliding correction)
|
||||
# definition - Guesses when each foot is in contact with the ground and uses that information to improve tracking
|
||||
settings-general-fk_settings-leg_tweak-skating_correction = Correção de deslize
|
||||
settings-general-fk_settings-leg_tweak-skating_correction-amount = Força da correção de deslize
|
||||
settings-general-fk_settings-arm_fk = Opções do Braço
|
||||
settings-general-fk_settings-arm_fk-description = Muda o jeito que os braços são rastreados.
|
||||
settings-general-fk_settings-arm_fk-force_arms = Forçar braços do HMD
|
||||
settings-general-fk_settings-arm_fk-i_pose = Use i-pose instead of t-pose
|
||||
settings-general-fk_settings-skeleton_settings = Opções do esqueleto
|
||||
settings-general-fk_settings-skeleton_settings-description = Ligar ou desligar opções do esqueleto. É recomendado deixar eles ligados.
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine = Estender coluna
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis = Estender pélvis
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees = Estender joelho
|
||||
settings-general-fk_settings-vive_emulation-title = Emulação de Vive
|
||||
settings-general-fk_settings-vive_emulation-description = Emule o problema de tracker da cintura que o Vive tracker tem. Isso é uma piada e faz o tracking ficar pior.
|
||||
settings-general-fk_settings-vive_emulation-label = Ativar emulação de Vive
|
||||
|
||||
## Gesture control settings (tracker tapping)
|
||||
settings-general-gesture_control = Controle de gestos
|
||||
settings-general-gesture_control-subtitle = Resets baseados em toques
|
||||
settings-general-gesture_control-description = Faz com oque os resets sejam ativados tocando um tracker. O Tracker mais alto no seu torso é usado para o Reset Rápido, o tracker mais alto na sua perna esquerda é usado para o Reset, e o tracker mais alto na sua perna direita é usado para o Reset de Posição. Os toques devem ocorrer dentro de 0.6 segundos para serem registrados.
|
||||
# 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
|
||||
}
|
||||
settings-general-gesture_control-quickResetEnabled = Ativar toque para reset rápido
|
||||
settings-general-gesture_control-quickResetDelay = Delay do reset rápido
|
||||
settings-general-gesture_control-quickResetTaps = Toques para o reset rápido
|
||||
settings-general-gesture_control-resetEnabled = Ativar toque para reset
|
||||
settings-general-gesture_control-resetDelay = Delay do reset
|
||||
settings-general-gesture_control-resetTaps = Toques para o reset
|
||||
settings-general-gesture_control-mountingResetEnabled = Toques para o reset de posição
|
||||
settings-general-gesture_control-mountingResetDelay = Delay do reset de posição
|
||||
settings-general-gesture_control-mountingResetTaps = Toques para o reset de posição
|
||||
|
||||
## Interface settings
|
||||
settings-general-interface = Interface
|
||||
settings-general-interface-dev_mode = Modo de desenvolvedor
|
||||
settings-general-interface-dev_mode-description = Este modo pode ser útil se precisar de dados específicos ou para interagir com trackers conectados a um nível mais avançado
|
||||
settings-general-interface-dev_mode-label = Modo de desenvolvedor
|
||||
settings-general-interface-serial_detection = Detecção de dispositivo serial
|
||||
settings-general-interface-serial_detection-description = Esta opção mostrará um pop-up toda vez que você conectar um novo dispositivo serial que pode ser um tracker. Ajuda a melhorar o processo de configuração de um tracker
|
||||
settings-general-interface-serial_detection-label = Detecção de dispositivo serial
|
||||
settings-general-interface-lang = Selecione o idioma
|
||||
settings-general-interface-lang-description = Alterar o idioma padrão que pretende utilizar
|
||||
settings-general-interface-lang-placeholder = Selecione o idioma que vai usar
|
||||
|
||||
## Serial settings
|
||||
settings-serial = Console Serial
|
||||
# This cares about multilines
|
||||
settings-serial-description =
|
||||
Este é um feed de informações ao vivo para comunicação serial.
|
||||
Pode ser útil se você precisar saber se o firmware está tendo problemas.
|
||||
settings-serial-connection_lost = Conexão com o serial perdida, Reconectando...
|
||||
settings-serial-reboot = Reiniciar
|
||||
settings-serial-factory_reset = Restaurar para o padrão de fábrica
|
||||
settings-serial-get_infos = Obter informações
|
||||
settings-serial-serial_select = Selecione uma porta serial
|
||||
settings-serial-auto_dropdown_item = Auto
|
||||
|
||||
## OSC router settings
|
||||
settings-osc-router = Roteador OSC
|
||||
# This cares about multilines
|
||||
settings-osc-router-description =
|
||||
Encaminhar mensagens OSC de outro programa.
|
||||
Útil para usar outro programa OSC com VRChat, por exemplo.
|
||||
settings-osc-router-enable = Ativar
|
||||
settings-osc-router-enable-description = Ligar ou desligar o encaminhamento de mensagens
|
||||
settings-osc-router-enable-label = Ativar
|
||||
settings-osc-router-network = Portas de rede
|
||||
# This cares about multilines
|
||||
settings-osc-router-network-description =
|
||||
Defina as portas para receber e enviar dados
|
||||
Esses podem ser as mesmas portas usadas no servidor do SlimeVR
|
||||
settings-osc-router-network-port_in =
|
||||
.label = Porta de entrada
|
||||
.placeholder = Porta de entrada (padrão: 9002)
|
||||
settings-osc-router-network-port_out =
|
||||
.label = Porta de saída
|
||||
.placeholder = Porta de saída (padrão: 9000)
|
||||
settings-osc-router-network-address = Endereço de rede
|
||||
settings-osc-router-network-address-description = Defina o endereço para mandar dados
|
||||
settings-osc-router-network-address-placeholder = Endereço IPV4
|
||||
|
||||
## OSC VRChat settings
|
||||
settings-osc-vrchat = VRChat OSC Trackers
|
||||
# This cares about multilines
|
||||
settings-osc-vrchat-description =
|
||||
Mudar opções específicas do VRChat para receber e mandar dados do HMD
|
||||
dados de trackers para FBT (funciona no Quest standalone).
|
||||
settings-osc-vrchat-enable = Ativar
|
||||
settings-osc-vrchat-enable-description = Ligar ou desligar o envio e recebimento de dados
|
||||
settings-osc-vrchat-enable-label = Ativar
|
||||
settings-osc-vrchat-network = Portas de rede
|
||||
settings-osc-vrchat-network-description = Defina as portas para receber e enviar dados para o VRChat
|
||||
settings-osc-vrchat-network-port_in =
|
||||
.label = Porta de entrada
|
||||
.placeholder = Porta de entrada (padrão: 9001)
|
||||
settings-osc-vrchat-network-port_out =
|
||||
.label = Porta de saída
|
||||
.placeholder = Porta de saída (padrão: 9000)
|
||||
settings-osc-vrchat-network-address = Endereço de rede
|
||||
settings-osc-vrchat-network-address-description = Escolha qual o endereço para enviar dados para o VRChat (verifique as suas opções de Wi-Fi no seu dispositivo)
|
||||
settings-osc-vrchat-network-address-placeholder = Endereço de ip do VRChat
|
||||
settings-osc-vrchat-network-trackers = Trackers
|
||||
settings-osc-vrchat-network-trackers-description = Ligar ou desligar o envio e recepção de dados.
|
||||
settings-osc-vrchat-network-trackers-chest = Peito
|
||||
settings-osc-vrchat-network-trackers-waist = Cintura
|
||||
settings-osc-vrchat-network-trackers-knees = Joelhos
|
||||
settings-osc-vrchat-network-trackers-feet = Pés
|
||||
settings-osc-vrchat-network-trackers-elbows = Cotovelos
|
||||
|
||||
## Setup/onboarding menu
|
||||
onboarding-skip = Pular configurações
|
||||
onboarding-continue = Continuar
|
||||
onboarding-wip = Trabalho em progresso
|
||||
|
||||
## Wi-Fi setup
|
||||
onboarding-wifi_creds-back = Voltar para introdução
|
||||
onboarding-wifi_creds = Insira as credenciais de Wi-Fi
|
||||
# This cares about multilines
|
||||
onboarding-wifi_creds-description =
|
||||
Os Trackers vão usar essas credenciais para conectar à rede sem fio
|
||||
Use as credenciais da rede em que você está atualmente conectado
|
||||
onboarding-wifi_creds-skip = Pular as configurações de Wi-Fi
|
||||
onboarding-wifi_creds-submit = Enviar!
|
||||
onboarding-wifi_creds-ssid =
|
||||
.label = SSID
|
||||
.placeholder = Enter SSID
|
||||
onboarding-wifi_creds-password =
|
||||
.label = Password
|
||||
.placeholder = Enter password
|
||||
|
||||
## Mounting setup
|
||||
onboarding-reset_tutorial-back = Voltar para a Calibragem de Posição
|
||||
onboarding-reset_tutorial = Resetar Tutorial
|
||||
onboarding-reset_tutorial-description = Esse recurso não está concluído, apenas aperte continue
|
||||
|
||||
## Setup start
|
||||
onboarding-home = Bem vindo ao SlimeVR
|
||||
# This cares about multilines and it's centered!!
|
||||
onboarding-home-description =
|
||||
Trazendo full-body tracking
|
||||
para todos
|
||||
onboarding-home-start = Vamos configurar!
|
||||
|
||||
## Enter VR part of setup
|
||||
onboarding-enter_vr-back = Voltar para atribuição de Trackers
|
||||
onboarding-enter_vr-title = Hora de entrar no VR!
|
||||
onboarding-enter_vr-description = Coloque todos os seus trackers e entre no VR!
|
||||
onboarding-enter_vr-ready = Estou pronto
|
||||
|
||||
## Setup done
|
||||
onboarding-done-title = Está tudo pronto!
|
||||
onboarding-done-description = Aproveite sua experiência com full body
|
||||
onboarding-done-close = Fechar o guia
|
||||
|
||||
## Tracker connection setup
|
||||
onboarding-connect_tracker-back = Voltar para as credenciais de Wi-Fi
|
||||
onboarding-connect_tracker-title = Conectar os trackers
|
||||
onboarding-connect_tracker-description-p0 = Agora para a parte divertida, conectando todos os seus trackers!
|
||||
onboarding-connect_tracker-description-p1 = Simplesmente conecte todos que ainda não estão conectados, via porta USB.
|
||||
onboarding-connect_tracker-issue-serial = Estou tendo problemas para conectar!
|
||||
onboarding-connect_tracker-usb = Tracker USB
|
||||
onboarding-connect_tracker-connection_status-connecting = Enviando credenciais de Wi-Fi
|
||||
onboarding-connect_tracker-connection_status-connected = Conectado ao Wi-Fi
|
||||
onboarding-connect_tracker-connection_status-error = Não é possível conectar ao Wi-Fi
|
||||
onboarding-connect_tracker-connection_status-start_connecting = Procurando por trackers
|
||||
onboarding-connect_tracker-connection_status-handshake = Conectado ao servidor
|
||||
# $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] No trackers
|
||||
[one] 1 tracker
|
||||
*[other] { $amount } trackers
|
||||
} connected
|
||||
onboarding-connect_tracker-next = Eu conectei todos os meus trackers
|
||||
|
||||
## Tracker assignment setup
|
||||
onboarding-assign_trackers-back = Voltar para as credenciais de Wi-Fi
|
||||
onboarding-assign_trackers-title = Atribuir trackers
|
||||
onboarding-assign_trackers-description = Vamos escolher onde cada tracker vai. Clique no local onde você quer colocar o tracker
|
||||
# Look at translation of onboarding-connect_tracker-connected_trackers on how to use plurals
|
||||
# $assigned (Number) - Trackers that have been assigned a body part
|
||||
# $trackers (Number) - Trackers connected to the server
|
||||
onboarding-assign_trackers-assigned = { $assigned } of { $trackers ->
|
||||
[one] 1 tracker
|
||||
*[other] { $trackers } trackers
|
||||
} assigned
|
||||
onboarding-assign_trackers-advanced = Mostrar locais de atribuição avançados
|
||||
onboarding-assign_trackers-next = Atribui todos os trackers
|
||||
|
||||
## Tracker manual mounting setup
|
||||
onboarding-manual_mounting-back = Voltar para entrar no VR
|
||||
onboarding-manual_mounting = Posicionamento Manual
|
||||
onboarding-manual_mounting-description = Clique em cada tracker e selecione de que maneira estão posicionados
|
||||
onboarding-manual_mounting-auto_mounting = Posicionamento automática
|
||||
onboarding-manual_mounting-next = Próximo passo
|
||||
|
||||
## Tracker automatic mounting setup
|
||||
onboarding-automatic_mounting-back = Voltar para entrar no VR
|
||||
onboarding-automatic_mounting-title = Calibragem de Posicionamento
|
||||
onboarding-automatic_mounting-description = Para os trackers do SlimeVR funcionar, nós precisamos atribuir a rotação de posicionamento dos seus trackers para alinhar com a posição física de seus trackers.
|
||||
onboarding-automatic_mounting-manual_mounting = Definir manualmente a posição
|
||||
onboarding-automatic_mounting-next = Próximo passo
|
||||
onboarding-automatic_mounting-prev_step = Passo anterior
|
||||
onboarding-automatic_mounting-done-title = Rotações de posição calibradas.
|
||||
onboarding-automatic_mounting-done-description = Sua calibragem de posicionamento está completa!
|
||||
onboarding-automatic_mounting-done-restart = Voltar ao início
|
||||
onboarding-automatic_mounting-mounting_reset-title = Reset de Posição
|
||||
onboarding-automatic_mounting-mounting_reset-step-0 = 1. Agache-se em uma pose de "esqui" com as pernas dobradas, a parte superior do corpo inclinada para a frente e os braços dobrados.
|
||||
onboarding-automatic_mounting-mounting_reset-step-1 = 2. Pressione o botão "Resetar Posição" e aguarde 3 segundos antes que as rotações de posição dos trackers sejam redefinidas.
|
||||
onboarding-automatic_mounting-preparation-title = Preparação
|
||||
onboarding-automatic_mounting-preparation-step-0 = 1. Fique de pé com os braços ao lado do corpo.
|
||||
onboarding-automatic_mounting-preparation-step-1 = 2. Pressione o botão "Reset" e aguarde 3 segundos antes que os rastreadores sejam reiniciados.
|
||||
onboarding-automatic_mounting-put_trackers_on-title = Coloque seus trackers
|
||||
onboarding-automatic_mounting-put_trackers_on-description = Para calibrar as rotações de posicionamento, usaremos os trackers que você atribuiu. Coloque todos os seus trackers, você pode ver qual é qual na figura na direita.
|
||||
onboarding-automatic_mounting-put_trackers_on-next = Coloquei todos os meus trackers
|
||||
|
||||
## Tracker manual proportions setup
|
||||
onboarding-manual_proportions-back = Voltar para o tutorial de reset
|
||||
onboarding-manual_proportions-title = Proporções de corpo manuais
|
||||
onboarding-manual_proportions-precision = Ajuste de precisão
|
||||
onboarding-manual_proportions-auto = Calibragem Automática
|
||||
|
||||
## Tracker automatic proportions setup
|
||||
onboarding-automatic_proportions-back = Voltar para o tutorial de reset
|
||||
onboarding-automatic_proportions-title = Meça seu corpo
|
||||
onboarding-automatic_proportions-description = Para os trackers SlimeVR funcionarem, precisamos saber o tamanho dos seus ossos. Essa curta calibragem vai medir isso para você.
|
||||
onboarding-automatic_proportions-manual = Calibragem manual
|
||||
onboarding-automatic_proportions-prev_step = Passo anterior
|
||||
onboarding-automatic_proportions-put_trackers_on-title = Coloque seus trackers
|
||||
onboarding-automatic_proportions-put_trackers_on-description = Para calibrar suas proporções, usaremos os trackers que você atribuiu. Coloque todos os seus trackers, você pode ver quais são quais na figura à direita.
|
||||
onboarding-automatic_proportions-put_trackers_on-next = Coloquei todos os meus trackers
|
||||
onboarding-automatic_proportions-preparation-title = Preparação
|
||||
onboarding-automatic_proportions-preparation-description = Coloque uma cadeira diretamente atrás de você dentro da sua área de jogo(Play space). Esteja preparado para sentar durante a configuração de autobone.
|
||||
onboarding-automatic_proportions-preparation-next = Estou em frente a uma cadeira
|
||||
onboarding-automatic_proportions-start_recording-title = Esteja preparado para se mexer
|
||||
onboarding-automatic_proportions-start_recording-description = Começaremos a gravar algumas poses e movimentos específicos. Estes serão solicitados na próxima tela. Esteja preparado para começar quando o botão for pressionado!
|
||||
onboarding-automatic_proportions-start_recording-next = Começar Gravação
|
||||
onboarding-automatic_proportions-recording-title = GRAVAR
|
||||
onboarding-automatic_proportions-recording-description-p0 = Gravação em progresso...
|
||||
onboarding-automatic_proportions-recording-description-p1 = Faça os movimentos apresentados abaixo:
|
||||
onboarding-automatic_proportions-recording-steps-0 = Dobre os joelhos algumas vezes.
|
||||
onboarding-automatic_proportions-recording-steps-1 = Sente-se na cadeira e se levante.
|
||||
onboarding-automatic_proportions-recording-steps-2 = Gire seu tronco para esquerda, e incline para direita.
|
||||
onboarding-automatic_proportions-recording-steps-3 = Gire seu tronco para direita, e incline para esquerda.
|
||||
onboarding-automatic_proportions-recording-steps-4 = Mexa-se até o tempo terminar.
|
||||
onboarding-automatic_proportions-recording-processing = Processando o resultado
|
||||
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 15)
|
||||
onboarding-automatic_proportions-recording-timer = { $time ->
|
||||
[one] 1 second left
|
||||
*[other] { $time } seconds left
|
||||
}
|
||||
onboarding-automatic_proportions-verify_results-title = Verificar os resultados
|
||||
onboarding-automatic_proportions-verify_results-description = Verifique os resultados abaixo, parecem corretos?
|
||||
onboarding-automatic_proportions-verify_results-results = Gravando os resultados
|
||||
onboarding-automatic_proportions-verify_results-processing = Processando o resultado
|
||||
onboarding-automatic_proportions-verify_results-redo = Refazer a gravação
|
||||
onboarding-automatic_proportions-verify_results-confirm = Eles estão corretos
|
||||
onboarding-automatic_proportions-done-title = Corpo medido e salvo.
|
||||
onboarding-automatic_proportions-done-description = Sua calibragem de proporção de corpo está completa!
|
||||
|
||||
## Home
|
||||
home-no_trackers = Nenhum tracker detectado ou atribuído
|
||||
540
gui/public/i18n/vi/translation.ftl
Normal file
540
gui/public/i18n/vi/translation.ftl
Normal file
@@ -0,0 +1,540 @@
|
||||
### 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!
|
||||
# And also comment the string if it's something not easy to translate, so you help
|
||||
# translators on what it means
|
||||
|
||||
## Websocket (server) status
|
||||
websocket-connecting = Đang kết nối với máy chủ
|
||||
websocket-connection_lost = Kết nối với máy chủ đã mất. Đang kết nối lại...
|
||||
|
||||
## Tips
|
||||
tips-find_tracker = Không rõ tracker nào đang được chọn? Di chuyển nó và trong menu sẽ sáng lên tracker đó
|
||||
tips-do_not_move_heels = Không di chuyển gót chân trong khi đo
|
||||
|
||||
## Body parts
|
||||
body_part-NONE = Chưa được gán
|
||||
body_part-HEAD = Đầu
|
||||
body_part-NECK = Cổ
|
||||
body_part-RIGHT_SHOULDER = Vai phải
|
||||
body_part-RIGHT_UPPER_ARM = Bắp tay phải
|
||||
body_part-RIGHT_LOWER_ARM = Cẳng tay phải
|
||||
body_part-RIGHT_HAND = Tay phải
|
||||
body_part-RIGHT_UPPER_LEG = Bắp chân phải
|
||||
body_part-RIGHT_LOWER_LEG = Cẳng chân phải
|
||||
body_part-RIGHT_FOOT = Bàn chân phải
|
||||
body_part-RIGHT_CONTROLLER = Tay cầm bên phải
|
||||
body_part-CHEST = Ngực
|
||||
body_part-WAIST = Eo
|
||||
body_part-HIP = Hông
|
||||
body_part-LEFT_SHOULDER = Vai trái
|
||||
body_part-LEFT_UPPER_ARM = Bắp tay trái
|
||||
body_part-LEFT_LOWER_ARM = Cẳng tay trái
|
||||
body_part-LEFT_HAND = Tay trái
|
||||
body_part-LEFT_UPPER_LEG = Bắp chân trái
|
||||
body_part-LEFT_LOWER_LEG = Cẳng chân trái
|
||||
body_part-LEFT_FOOT = Bàn chân trái
|
||||
body_part-LEFT_CONTROLLER = Tay cầm bên trái
|
||||
|
||||
## Proportions
|
||||
skeleton_bone-NONE = Chưa được gán
|
||||
skeleton_bone-HEAD = Sai số đầu
|
||||
skeleton_bone-NECK = Chiều dài cổ
|
||||
skeleton_bone-CHEST = Khoảng cách ngực
|
||||
skeleton_bone-CHEST_OFFSET = Sai số ngực
|
||||
skeleton_bone-WAIST = Khoảng cách eo
|
||||
skeleton_bone-HIP = Khoảng cách hông
|
||||
skeleton_bone-HIP_OFFSET = Sai số hông
|
||||
skeleton_bone-HIPS_WIDTH = Chiều rộng hông
|
||||
skeleton_bone-UPPER_LEG = Chiều dài bắp chân
|
||||
skeleton_bone-LOWER_LEG = Chiều dài cẳng chân
|
||||
skeleton_bone-FOOT_LENGTH = Chiều dài bàn chân
|
||||
skeleton_bone-FOOT_SHIFT = Sai số bàn chân
|
||||
skeleton_bone-SKELETON_OFFSET = Sai số thân
|
||||
skeleton_bone-SHOULDERS_DISTANCE = Khoảng cách vai
|
||||
skeleton_bone-SHOULDERS_WIDTH = Chiều rộng vai
|
||||
skeleton_bone-UPPER_ARM = Chiều dài bắp tay
|
||||
skeleton_bone-LOWER_ARM = Chiều dài cẳng tay
|
||||
skeleton_bone-CONTROLLER_Y = Khoảng cách tay cầm theo trục Y
|
||||
skeleton_bone-CONTROLLER_Z = Khoảng cách tay cầm theo trục Z
|
||||
skeleton_bone-ELBOW_OFFSET = Sai số khuỷu tay
|
||||
|
||||
## Tracker reset buttons
|
||||
reset-reset_all = Đặt lại tất cả bộ phận
|
||||
reset-full = Đặt lại
|
||||
reset-mounting = Đặt lại hướng gắn tracker
|
||||
reset-quick = Đặt lại nhanh
|
||||
|
||||
## Serial detection stuff
|
||||
serial_detection-new_device-p0 = Tìm thấy thiết bị mới!
|
||||
serial_detection-new_device-p1 = Nhập thông tin Wi-Fi
|
||||
serial_detection-new_device-p2 = Chọn hành động cần thực hiện
|
||||
serial_detection-open_wifi = Kết nối đến Wi-Fi
|
||||
serial_detection-open_serial = Mở cổng Serial
|
||||
serial_detection-submit = Gửi
|
||||
serial_detection-close = Đóng
|
||||
|
||||
## Navigation bar
|
||||
navbar-home = Trang chủ
|
||||
navbar-body_proportions = Tỉ lệ cơ thể
|
||||
navbar-trackers_assign = Phân bố tracker
|
||||
navbar-mounting = Cân chỉnh hướng gắn tracker
|
||||
navbar-onboarding = Trình thiết lập
|
||||
navbar-settings = Cài đặt
|
||||
|
||||
## Bounding volume hierarchy recording
|
||||
bvh-start_recording = Ghi BVH
|
||||
bvh-recording = Đang ghi...
|
||||
|
||||
## Widget: Overlay settings
|
||||
widget-overlay = Overlay
|
||||
widget-overlay-is_visible_label = Xem overlay trên SteamVR
|
||||
widget-overlay-is_mirrored_label = Xem overlay trong gương
|
||||
|
||||
## Widget: Developer settings
|
||||
widget-developer_mode = Chế độ nhà phát triển
|
||||
widget-developer_mode-high_contrast = Chế độ tương phản cao
|
||||
widget-developer_mode-precise_rotation = Hiển thị góc quay chính xác
|
||||
widget-developer_mode-fast_data_feed = Tăng tốc độ gửi dữ liệu
|
||||
widget-developer_mode-filter_slimes_and_hmd = Lọc dữ liệu tracker và kính
|
||||
widget-developer_mode-sort_by_name = Sắp xếp theo tên
|
||||
widget-developer_mode-raw_slime_rotation = Sử dụng giá trị góc quay thực cho tracker
|
||||
widget-developer_mode-more_info = Thêm thông tin
|
||||
|
||||
## Widget: IMU Visualizer
|
||||
widget-imu_visualizer = Góc quay
|
||||
widget-imu_visualizer-rotation_raw = Gốc
|
||||
widget-imu_visualizer-rotation_preview = Qua xử lí
|
||||
|
||||
## Tracker status
|
||||
tracker-status-none = Không có trạng thái
|
||||
tracker-status-busy = Bận
|
||||
tracker-status-error = Lỗi
|
||||
tracker-status-disconnected = Đã ngắt kết nối
|
||||
tracker-status-occluded = Nghẽn
|
||||
tracker-status-ok = Đã kết nối
|
||||
|
||||
## Tracker status columns
|
||||
tracker-table-column-name = Tên
|
||||
tracker-table-column-type = Loại
|
||||
tracker-table-column-battery = Pin
|
||||
tracker-table-column-ping = Ping
|
||||
tracker-table-column-tps = TPS
|
||||
tracker-table-column-temperature = Nhiệt độ (°C)
|
||||
tracker-table-column-linear-acceleration = Tốc độ X/Y/Z
|
||||
tracker-table-column-rotation = Góc quay X/Y/Z
|
||||
tracker-table-column-position = Tọa độ X/Y/Z
|
||||
tracker-table-column-url = Đường dẫn
|
||||
|
||||
## Tracker rotation
|
||||
tracker-rotation-front = Trước
|
||||
tracker-rotation-left = Trái
|
||||
tracker-rotation-right = Phải
|
||||
tracker-rotation-back = Sau
|
||||
|
||||
## Tracker information
|
||||
tracker-infos-manufacturer = Nhà sản xuất
|
||||
tracker-infos-display_name = Tên hiển thị
|
||||
tracker-infos-custom_name = Tên gọi
|
||||
tracker-infos-url = Đường dẫn
|
||||
|
||||
## Tracker settings
|
||||
tracker-settings-back = Quay lại danh sách tracker
|
||||
tracker-settings-title = Cài đặt
|
||||
tracker-settings-assignment_section = Vị trí
|
||||
tracker-settings-assignment_section-description = Vị trí của tracker trên cơ thể
|
||||
tracker-settings-assignment_section-edit = Thay đổi vị trí
|
||||
tracker-settings-mounting_section = Vị trí đặt
|
||||
tracker-settings-mounting_section-description = Tracker được đặt ở đâu?
|
||||
tracker-settings-mounting_section-edit = Thay đổi chỗ đặt
|
||||
tracker-settings-drift_compensation_section = Cho phép bù trừ sai số
|
||||
tracker-settings-drift_compensation_section-description = Tracker này được phép bù trừ cho sai số của nó không?
|
||||
tracker-settings-drift_compensation_section-edit = Cho phép bù trừ sai số
|
||||
# The .<name> means it's an attribute and it's related to the top key.
|
||||
# In this case that is the settings for the assignment section.
|
||||
tracker-settings-name_section = Tên tracker
|
||||
tracker-settings-name_section-description = Đặt cho nó một cái tên đẹp :3
|
||||
tracker-settings-name_section-placeholder = Chân trái của JINODK
|
||||
|
||||
## Tracker part card info
|
||||
tracker-part_card-no_name = Không tên
|
||||
tracker-part_card-unassigned = Chưa gán vị trí
|
||||
|
||||
## Body assignment menu
|
||||
body_assignment_menu = Bạn muốn gán tracker này cho bộ phận nào?
|
||||
body_assignment_menu-description = Chọn vị trí bạn muốn gán tracker, ngoài ra bạn cũng có thể quản lí vị trí tất cả các tracker cùng một lúc
|
||||
body_assignment_menu-show_advanced_locations = Xem thêm vị trí đặt
|
||||
body_assignment_menu-manage_trackers = Quản lí tất cả tracker
|
||||
body_assignment_menu-unassign_tracker = Bỏ gán tracker
|
||||
|
||||
## Tracker assignment menu
|
||||
# A -translation_key (with a dash in the front) means that it's a label.
|
||||
# It can only be used in the translation file, it's nice for reusing names and that kind of stuff.
|
||||
#
|
||||
# We are using it here because english doesn't require changing the text in each case but
|
||||
# maybe your language does.
|
||||
-tracker_selection-part = Tracker nào cho vị trí
|
||||
tracker_selection_menu-NONE = Bạn muốn bỏ gán tracker nào?
|
||||
tracker_selection_menu-HEAD = { -tracker_selection-part } đầu?
|
||||
tracker_selection_menu-NECK = { -tracker_selection-part } cổ?
|
||||
tracker_selection_menu-RIGHT_SHOULDER = { -tracker_selection-part } vai phải?
|
||||
tracker_selection_menu-RIGHT_UPPER_ARM = { -tracker_selection-part } bắp tay phải?
|
||||
tracker_selection_menu-RIGHT_LOWER_ARM = { -tracker_selection-part } cẳng tay phải?
|
||||
tracker_selection_menu-RIGHT_HAND = { -tracker_selection-part } tay phải?
|
||||
tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } bắp chân phải?
|
||||
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } cẳng chân phải?
|
||||
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part } bàn chân phải?
|
||||
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part } tay cầm bên phải?
|
||||
tracker_selection_menu-CHEST = { -tracker_selection-part } ngực?
|
||||
tracker_selection_menu-WAIST = { -tracker_selection-part } eo?
|
||||
tracker_selection_menu-HIP = { -tracker_selection-part } hông?
|
||||
tracker_selection_menu-LEFT_SHOULDER = { -tracker_selection-part } vai trái?
|
||||
tracker_selection_menu-LEFT_UPPER_ARM = { -tracker_selection-part } bắp tay trái?
|
||||
tracker_selection_menu-LEFT_LOWER_ARM = { -tracker_selection-part } cẳng tay trái?
|
||||
tracker_selection_menu-LEFT_HAND = { -tracker_selection-part } tay trái?
|
||||
tracker_selection_menu-LEFT_UPPER_LEG = { -tracker_selection-part } bắp chân trái?
|
||||
tracker_selection_menu-LEFT_LOWER_LEG = { -tracker_selection-part } cẳng chân trái?
|
||||
tracker_selection_menu-LEFT_FOOT = { -tracker_selection-part } bàn chân trái?
|
||||
tracker_selection_menu-LEFT_CONTROLLER = { -tracker_selection-part } tay cầm bên trái?
|
||||
|
||||
tracker_selection_menu-unassigned = Chưa gán vị trí
|
||||
tracker_selection_menu-assigned = Đã gán vị trí
|
||||
tracker_selection_menu-dont_assign = Không gán
|
||||
|
||||
## Mounting menu
|
||||
mounting_selection_menu = Bạn muốn gán tracker này cho bộ phận nào?
|
||||
mounting_selection_menu-close = Đóng
|
||||
|
||||
## Sidebar settings
|
||||
settings-sidebar-title = Cài đặt
|
||||
settings-sidebar-general = Cài đặt chung
|
||||
settings-sidebar-tracker_mechanics = Cơ chế tracker
|
||||
settings-sidebar-fk_settings = Cài đặt tracker
|
||||
settings-sidebar-gesture_control = Cử chỉ điều khiển
|
||||
settings-sidebar-interface = Giao diện
|
||||
settings-sidebar-osc_router = Router OSC
|
||||
settings-sidebar-utils = Công cụ
|
||||
settings-sidebar-serial = Cổng Serial
|
||||
|
||||
## SteamVR settings
|
||||
settings-general-steamvr = SteamVR
|
||||
settings-general-steamvr-subtitle = Tracker SteamVR
|
||||
# Not all translation keys support multiline, only the ones that specify it will actually
|
||||
# split it in lines (that also means you can split in lines however you want in those).
|
||||
# The first spaces (not tabs) for indentation will be ignored, just to make the file look nice when writing.
|
||||
# This one is one of this cases that cares about multilines
|
||||
settings-general-steamvr-description =
|
||||
Bật hoặc tắt tracker SteamVR.
|
||||
Hữu dụng nếu game chỉ hỗ trợ số lượng tracker giới hạn.
|
||||
settings-general-steamvr-trackers-waist = Eo
|
||||
settings-general-steamvr-trackers-chest = Ngực
|
||||
settings-general-steamvr-trackers-feet = Bàn chân
|
||||
settings-general-steamvr-trackers-knees = Đầu gối
|
||||
settings-general-steamvr-trackers-elbows = Khuỷu tay
|
||||
settings-general-steamvr-trackers-hands = Tay
|
||||
|
||||
## Tracker mechanics
|
||||
settings-general-tracker_mechanics = Cơ chế tracker
|
||||
settings-general-tracker_mechanics-filtering = Lọc nhiễu
|
||||
# This also cares about multilines
|
||||
settings-general-tracker_mechanics-filtering-description =
|
||||
Chọn kiểu lọc nhiễu cho tracker
|
||||
"Dự đoán" sẽ dự đoán chuyển động trong khi "Khử nhiễu" sẽ làm chuyển động mềm mại hơn
|
||||
settings-general-tracker_mechanics-filtering-type = Kiểu lọc
|
||||
settings-general-tracker_mechanics-filtering-type-none = Không lọc
|
||||
settings-general-tracker_mechanics-filtering-type-none-description = Sử dụng giá trị thực, không áp dụng bất kì bộ lọc nào
|
||||
settings-general-tracker_mechanics-filtering-type-smoothing = Khử nhiễu
|
||||
settings-general-tracker_mechanics-filtering-type-smoothing-description = Làm chuyển động mềm mại hơn nhưng có thể tăng độ trễ
|
||||
settings-general-tracker_mechanics-filtering-type-prediction = Dự đoán
|
||||
settings-general-tracker_mechanics-filtering-type-prediction-description = Giảm độ trễ và làm chuyển động chân thật hơn, có thể khiến chuyển động không mượt mà
|
||||
settings-general-tracker_mechanics-filtering-amount = Mức độ lọc
|
||||
settings-general-tracker_mechanics-drift_compensation = Bù trừ sai số
|
||||
# This cares about multilines
|
||||
settings-general-tracker_mechanics-drift_compensation-description =
|
||||
Bù trừ sai lệch trục ngang của cảm biến bằng cách thêm một sai lệch chống lại nó
|
||||
Thay đổi mức độ bù trừ và số lần đặt lại được áp dụng bù trừ
|
||||
settings-general-tracker_mechanics-drift_compensation-enabled-label = Bù trừ sai số
|
||||
settings-general-tracker_mechanics-drift_compensation-amount-label = Mức độ bù trừ
|
||||
settings-general-tracker_mechanics-drift_compensation-max_resets-label = Số lần đặt lại được áp dụng bù trừ
|
||||
|
||||
## FK/Tracking settings
|
||||
settings-general-fk_settings = Cài đặt nâng cao
|
||||
settings-general-fk_settings-leg_tweak = Chân
|
||||
settings-general-fk_settings-leg_tweak-description = "Ngăn xuyên sàn" có thể giảm thiểu khả năng chân xuống thấp hơn sàn sau khi đặt lại vị trí tracker, có thể gây vấn đề nếu đang đứng bằng đầu gối. "Sửa trượt" giúp giảm thiểu tình trạng chân có chuyển động nhỏ so với sàn khi đứng yên, có thể làm giảm độ chính xác với một số chuyển động cụ thể
|
||||
# Floor clip:
|
||||
# why the name - came from the idea of noclip in video games, but is the opposite where clipping to the floor is a desired feature
|
||||
# definition - Prevents the foot trackers from going lower than they where when a reset was performed
|
||||
settings-general-fk_settings-leg_tweak-floor_clip = Ngăn xuyên sàn
|
||||
# Skating correction:
|
||||
# why the name - without this enabled the feet will often slide across the ground as if your skating across the ground,
|
||||
# since this largely prevents this it corrects for it hence skating correction (note this may be renamed to sliding correction)
|
||||
# definition - Guesses when each foot is in contact with the ground and uses that information to improve tracking
|
||||
settings-general-fk_settings-leg_tweak-skating_correction = Sửa trượt
|
||||
settings-general-fk_settings-leg_tweak-skating_correction-amount = Mức độ sửa
|
||||
settings-general-fk_settings-arm_fk = Track cánh tay
|
||||
settings-general-fk_settings-arm_fk-description = Thay đổi cách cánh tay được track
|
||||
settings-general-fk_settings-arm_fk-force_arms = Lấy dữ liệu cánh tay từ kính
|
||||
settings-general-fk_settings-arm_fk-i_pose = Use i-pose instead of t-pose
|
||||
settings-general-fk_settings-skeleton_settings = Cài đặt khung cơ thể
|
||||
settings-general-fk_settings-skeleton_settings-description = Bật hoặc tắt các cài đặt về khung cơ thể. Các lựa chọn này nên được giữ bật
|
||||
settings-general-fk_settings-skeleton_settings-extended_spine = Xương sống kéo dài
|
||||
settings-general-fk_settings-skeleton_settings-extended_pelvis = Xương chậu kéo dài
|
||||
settings-general-fk_settings-skeleton_settings-extended_knees = Đầu gối kéo dài
|
||||
settings-general-fk_settings-vive_emulation-title = Giả lập tracker Vive
|
||||
settings-general-fk_settings-vive_emulation-description = Giả lập cách tracker của Vive gặp vấn đề với việc theo dõi eo, đây là 1 tính năng được làm cho vui và sẽ làm giảm độ chính xác
|
||||
settings-general-fk_settings-vive_emulation-label = Giả lập tracker Vive
|
||||
|
||||
## Gesture control settings (tracker tapping)
|
||||
settings-general-gesture_control = Cử chỉ điều khiển
|
||||
settings-general-gesture_control-subtitle = Chạm để đặt lại
|
||||
settings-general-gesture_control-description = Cho phép chạm vào tracker để đặt lại vị trí, chạm hai lần vào tracker cao nhất ở thân để đặt lại nhanh, chạm hai lần vào tracker cao nhất ở chân trái để đặt lại, chạm hai lần vào tracker cao nhất ở chân phải để đặt lại vị trí gắn tracker. Cử chỉ chỉ được tiếp nhận khi thời gian giữa hai lần chạm ngắn hơn 0.6 giây.
|
||||
# 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 } lần
|
||||
}
|
||||
settings-general-gesture_control-quickResetEnabled = Chạm để đặt lại nhanh
|
||||
settings-general-gesture_control-quickResetDelay = Thời gian delay trước khi đặt lại nhanh
|
||||
settings-general-gesture_control-quickResetTaps = Số lần chạm cho đặt lại nhanh
|
||||
settings-general-gesture_control-resetEnabled = Chạm để đặt lại
|
||||
settings-general-gesture_control-resetDelay = Thời gian delay trước khi đặt lại
|
||||
settings-general-gesture_control-resetTaps = Số lần chạm cho đặt lại
|
||||
settings-general-gesture_control-mountingResetEnabled = Chạm để đặt lại hướng gắn tracker
|
||||
settings-general-gesture_control-mountingResetDelay = Thời gian delay trước khi đặt lại hướng gắn tracker
|
||||
settings-general-gesture_control-mountingResetTaps = Số lần chạm cho đặt lại hướng gắn tracker
|
||||
|
||||
## Interface settings
|
||||
settings-general-interface = Giao diện
|
||||
settings-general-interface-dev_mode = Chế độ nhà phát triển
|
||||
settings-general-interface-dev_mode-description = Hữu dụng nếu cần thêm thông tin chi tiết của tracker hay can thiệp sâu hơn vào tracker
|
||||
settings-general-interface-dev_mode-label = Chế độ nhà phát triển
|
||||
settings-general-interface-serial_detection = Nhận dạng thiết bị Serial mới
|
||||
settings-general-interface-serial_detection-description = Hiển thị pop-up mỗi lần một thiết bị Serial mới được kết nối qua USB (có thể là tracker), giúp cải thiện quá trình thiết lập tracker
|
||||
settings-general-interface-serial_detection-label = Nhận dạng thiết bị Serial mới
|
||||
settings-general-interface-lang = Thay đổi ngôn ngữ (Change language)
|
||||
settings-general-interface-lang-description = Đổi ngôn ngữ hiển thị (Change the default language you want to use)
|
||||
settings-general-interface-lang-placeholder = Chọn ngôn ngữ để sử dụng (Select the language to use)
|
||||
|
||||
## Serial settings
|
||||
settings-serial = Cổng Serial
|
||||
# This cares about multilines
|
||||
settings-serial-description =
|
||||
Đây là cổng giao tiếp Serial trực tiếp với tracker
|
||||
Hữu dụng nếu cần kiểm tra tracker có hoạt động như mong muốn hay không
|
||||
settings-serial-connection_lost = Kết nối đến Serial đã mất, đang kết nối lại...
|
||||
settings-serial-reboot = Khởi động lại
|
||||
settings-serial-factory_reset = Khôi phục cài đặt gốc
|
||||
settings-serial-get_infos = Lấy thông tin
|
||||
settings-serial-serial_select = Chọn cổng Serial
|
||||
settings-serial-auto_dropdown_item = Tự động
|
||||
|
||||
## OSC router settings
|
||||
settings-osc-router = Router OSC
|
||||
# This cares about multilines
|
||||
settings-osc-router-description =
|
||||
Chuyển tiếp dữ liệu OSC từ phần mềm khác
|
||||
Hữu dụng cho việc sử dụng phần mềm OSC khác với VRChat, ...
|
||||
settings-osc-router-enable = Chuyển tiếp dữ liệu OSC
|
||||
settings-osc-router-enable-description = Cho phép chuyển tiếp dữ liệu OSC
|
||||
settings-osc-router-enable-label = Chuyển tiếp dữ liệu OSC
|
||||
settings-osc-router-network = Cổng mạng
|
||||
# This cares about multilines
|
||||
settings-osc-router-network-description =
|
||||
Đặt cổng nhận và gửi dữ liệu OSC
|
||||
Có thể dùng chung cổng với server SlimeVR
|
||||
settings-osc-router-network-port_in =
|
||||
.label = Cổng vào
|
||||
.placeholder = Cổng vào (Mặc định: 9002)
|
||||
settings-osc-router-network-port_out =
|
||||
.label = Cổng ra
|
||||
.placeholder = Cổng ra (Mặc định: 9000)
|
||||
settings-osc-router-network-address = Địa chỉ mạng
|
||||
settings-osc-router-network-address-description = Địa chỉ mạng mà SlimeVR sẽ gửi dữ liệu OSC đến
|
||||
settings-osc-router-network-address-placeholder = Địa chỉ IPv4
|
||||
|
||||
## OSC VRChat settings
|
||||
settings-osc-vrchat = VRChat OSC Trackers
|
||||
# This cares about multilines
|
||||
settings-osc-vrchat-description =
|
||||
Thay đổi các cài đặt liên quan đến VRChat để nhận dữ liệu từ kính và
|
||||
gửi dữ liệu tracker cho Full-body tracking (hoạt động với kính ở chế độ standalone)
|
||||
settings-osc-vrchat-enable = Dữ liệu OSC
|
||||
settings-osc-vrchat-enable-description = Cho phép nhận và gửi dữ liệu OSC
|
||||
settings-osc-vrchat-enable-label = Giao tiếp dữ liệu OSC
|
||||
settings-osc-vrchat-network = Cổng mạng
|
||||
settings-osc-vrchat-network-description = Chọn cổng mạng để nhận và gửi dữ liệu OSC đến VRChat
|
||||
settings-osc-vrchat-network-port_in =
|
||||
.label = Cổng vào
|
||||
.placeholder = Cổng vào (Mặc định: 9001)
|
||||
settings-osc-vrchat-network-port_out =
|
||||
.label = Cổng ra
|
||||
.placeholder = Cổng ra (Mặc định: 9000)
|
||||
settings-osc-vrchat-network-address = Địa chỉ mạng
|
||||
settings-osc-vrchat-network-address-description = Địa chỉ mạng mà SlimeVR sẽ gửi dữ liệu OSC đến VRChat (có thể tìm thấy địa chỉ mạng trong menu cài đặt Wi-Fi)
|
||||
settings-osc-vrchat-network-address-placeholder = Địa chỉ IP của thiết bị chơi VRChat
|
||||
settings-osc-vrchat-network-trackers = Cấu hình Tracker
|
||||
settings-osc-vrchat-network-trackers-description = Chọn các tracker mà SlimeVR sẽ gửi dữ liệu OSC đến VRChat
|
||||
settings-osc-vrchat-network-trackers-chest = Ngực
|
||||
settings-osc-vrchat-network-trackers-waist = Eo
|
||||
settings-osc-vrchat-network-trackers-knees = Đầu gối
|
||||
settings-osc-vrchat-network-trackers-feet = Bàn chân
|
||||
settings-osc-vrchat-network-trackers-elbows = Khuỷu tay
|
||||
|
||||
## Setup/onboarding menu
|
||||
onboarding-skip = Bỏ qua cài đặt
|
||||
onboarding-continue = Tiếp tục
|
||||
onboarding-wip = Chưa hoàn thiện
|
||||
|
||||
## WiFi setup
|
||||
onboarding-wifi_creds-back = Quay lại giới thiệu
|
||||
onboarding-wifi_creds = Nhập thông tin Wi-Fi
|
||||
# This cares about multilines
|
||||
onboarding-wifi_creds-description =
|
||||
Tracker sẽ sử dụng thông tin này để kết nối đến mạng
|
||||
Hãy nhập thông tin mạng Wi-Fi bạn đang dùng
|
||||
onboarding-wifi_creds-skip = Bỏ qua cài đặt Wi-Fi
|
||||
onboarding-wifi_creds-submit = Gửi
|
||||
onboarding-wifi_creds-ssid =
|
||||
.label = Tên hiển thị
|
||||
.placeholder = Nhập tên Wi-Fi
|
||||
onboarding-wifi_creds-password =
|
||||
.label = Mật khẩu
|
||||
.placeholder = và mật khẩu
|
||||
|
||||
## Mounting setup
|
||||
onboarding-reset_tutorial-back = Quay lại cân chỉnh vị trí gắn tracker
|
||||
onboarding-reset_tutorial = Làm lại
|
||||
onboarding-reset_tutorial-description = Tính năng này chưa hoàn thiện, vui lòng bấm tiếp tục và quay lại sau
|
||||
|
||||
## Setup start
|
||||
onboarding-home = Chào mừng bạn đến với SlimeVR!
|
||||
# This cares about multilines and it's centered!!
|
||||
onboarding-home-description =
|
||||
Mang FBT đến
|
||||
với mọi người
|
||||
onboarding-home-start = Bắt đầu thiết lập!
|
||||
|
||||
## Enter VR part of setup
|
||||
onboarding-enter_vr-back = Quay lại gán tracker
|
||||
onboarding-enter_vr-title = Chuẩn bị cho việc cân chỉnh trong VR
|
||||
onboarding-enter_vr-description = Đeo tất cả tracker và vào VR trước khi tiếp tục
|
||||
onboarding-enter_vr-ready = Sẵn sàng
|
||||
|
||||
## Setup done
|
||||
onboarding-done-title = Hoàn thành!
|
||||
onboarding-done-description = Bạn đã hoàn tất quá trình thiết lập cơ bản
|
||||
onboarding-done-close = Đóng hướng dẫn
|
||||
|
||||
## Tracker connection setup
|
||||
onboarding-connect_tracker-back = Quay lại cài đặt Wi-Fi
|
||||
onboarding-connect_tracker-title = Kết nối tracker
|
||||
onboarding-connect_tracker-description-p0 = Cập nhật thông tin Wi-Fi cho tracker
|
||||
onboarding-connect_tracker-description-p1 = Hãy kết nối các tracker chưa thiết lập qua cổng USB
|
||||
onboarding-connect_tracker-issue-serial = Có vấn đề với việc kết nối? Kiểm tra thông tin qua cổng Serial
|
||||
onboarding-connect_tracker-usb = USB Tracker
|
||||
onboarding-connect_tracker-connection_status-connecting = Đang gửi thông tin Wi-Fi
|
||||
onboarding-connect_tracker-connection_status-connected = Đã kết nối đến Wi-Fi
|
||||
onboarding-connect_tracker-connection_status-error = Không thể kết nối đến Wi-Fi
|
||||
onboarding-connect_tracker-connection_status-start_connecting = Đang tìm tracker
|
||||
onboarding-connect_tracker-connection_status-handshake = Đã kết nối đến máy chủ SlimeVR
|
||||
# $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] Không có tracker
|
||||
[one] 1 tracker
|
||||
*[other] { $amount } tracker
|
||||
} đã giao
|
||||
onboarding-connect_tracker-next = Đã kết nối với tất cả tracker
|
||||
|
||||
## Tracker assignment setup
|
||||
onboarding-assign_trackers-back = Quay lại cài đặt Wi-Fi
|
||||
onboarding-assign_trackers-title = Gán tracker
|
||||
onboarding-assign_trackers-description = Chọn vị trí bạn muốn gán tracker bằng cách nhấn vào tên bộ phận muốn gán và chọn tracker
|
||||
# Look at translation of onboarding-connect_tracker-connected_trackers on how to use plurals
|
||||
# $assigned (Number) - Trackers that have been assigned a body part
|
||||
# $trackers (Number) - Trackers connected to the server
|
||||
onboarding-assign_trackers-assigned = { $assigned } trên { $trackers ->
|
||||
[one] 1 tracker
|
||||
*[other] { $trackers } tracker
|
||||
} đã giao
|
||||
onboarding-assign_trackers-advanced = Xem thêm vị trí đặt
|
||||
onboarding-assign_trackers-next = Hoàn thành
|
||||
|
||||
## Tracker manual mounting setup
|
||||
onboarding-manual_mounting-back = Quay lại chuẩn bị cân chỉnh
|
||||
onboarding-manual_mounting = Cân chỉnh thủ công
|
||||
onboarding-manual_mounting-description = Chọn từng tracker và chọn hướng nó được gắn
|
||||
onboarding-manual_mounting-auto_mounting = Cân chỉnh tự động
|
||||
onboarding-manual_mounting-next = Tiếp tục
|
||||
|
||||
## Tracker automatic mounting setup
|
||||
onboarding-automatic_mounting-back = Quay lại chuẩn bị cân chỉnh
|
||||
onboarding-automatic_mounting-title = Cân chỉnh hướng gắn
|
||||
onboarding-automatic_mounting-description = SlimeVR cần biết hướng gắn thực của tracker để hoạt động đúng, làm theo hướng dẫn để cân chỉnh hướng gắn tự động
|
||||
onboarding-automatic_mounting-manual_mounting = Cân chỉnh thủ công
|
||||
onboarding-automatic_mounting-next = Tiếp tục
|
||||
onboarding-automatic_mounting-prev_step = Quay lại
|
||||
onboarding-automatic_mounting-done-title = Đã cân chỉnh hướng gắn
|
||||
onboarding-automatic_mounting-done-description = Cài đặt vị trí đã hoàn thành!
|
||||
onboarding-automatic_mounting-done-restart = Thử lại
|
||||
onboarding-automatic_mounting-mounting_reset-title = Đặt lại hướng gắn
|
||||
onboarding-automatic_mounting-mounting_reset-step-0 = 1. Đứng khom người như tư thế trượt tuyết với đầu gối khom lại, thân trên hướng tới trước và hai tay co lại để giữ thăng bằng như hình bên
|
||||
onboarding-automatic_mounting-mounting_reset-step-1 = 2. Nhấn nút đặt lại và chờ 3 giây trước khi hệ thống cân chỉnh hướng gắn tracker
|
||||
onboarding-automatic_mounting-preparation-title = Chuẩn bị tư thế
|
||||
onboarding-automatic_mounting-preparation-step-0 = 1. Đứng thẳng với hai tay duỗi thẳng
|
||||
onboarding-automatic_mounting-preparation-step-1 = 2. Nhấn nút đặt lại và chờ 3 giây trước khi tracker được đặt lại.
|
||||
onboarding-automatic_mounting-put_trackers_on-title = Đeo tracker lên người
|
||||
onboarding-automatic_mounting-put_trackers_on-description = Để cân chỉnh hướng gắn của tracker, SlimeVR sẽ tiến hành đo góc nghiêng của tracker khi đang đeo để cân chỉnh hướng gắn, hãy đeo tracker theo đúng vị trí đã thiết lập
|
||||
onboarding-automatic_mounting-put_trackers_on-next = Tiếp tục
|
||||
|
||||
## Tracker manual proportions setup
|
||||
onboarding-manual_proportions-back = Quay lại cân chỉnh hướng gắn
|
||||
onboarding-manual_proportions-title = Đo kích thước cơ thể thủ công
|
||||
onboarding-manual_proportions-precision = Cân chỉnh cụ thể (giảm hệ số chỉnh)
|
||||
onboarding-manual_proportions-auto = Đo kích thước cơ thể tự động
|
||||
|
||||
## Tracker automatic proportions setup
|
||||
onboarding-automatic_proportions-back = Quay lại cân chỉnh hướng gắn
|
||||
onboarding-automatic_proportions-title = Đo kích thước cơ thể
|
||||
onboarding-automatic_proportions-description = Để tracker có vị trí chính xác, SlimeVR cần biết các chỉ số kích thước cơ thể, làm theo hướng dẫn để đo kích thước cơ thể tự động
|
||||
onboarding-automatic_proportions-manual = Đo kích thước cơ thể thủ công
|
||||
onboarding-automatic_proportions-prev_step = Quay lại
|
||||
onboarding-automatic_proportions-put_trackers_on-title = Đeo tracker lên người
|
||||
onboarding-automatic_proportions-put_trackers_on-description = Để đo kích thước cơ thể, SlimeVR sẽ sử dụng một thuật toán để dự đoán kích thước của các bộ phận, hãy đeo tracker theo đúng vị trí đã thiết lập như hình bên
|
||||
onboarding-automatic_proportions-put_trackers_on-next = Tiếp tục
|
||||
onboarding-automatic_proportions-preparation-title = Chuẩn bị
|
||||
onboarding-automatic_proportions-preparation-description = Chuẩn bị một chiếc ghế trong khu vực chơi vì quá trình đo sẽ yêu cầu đến việc ngồi xuống
|
||||
onboarding-automatic_proportions-preparation-next = Đã có ghế ngồi sau lưng
|
||||
onboarding-automatic_proportions-start_recording-title = Chuẩn bị đo
|
||||
onboarding-automatic_proportions-start_recording-description = Phần mềm sẽ đo một số chuyển động, cử chỉ cụ thể, hãy chuẩn bị cho việc di chuyển theo yêu cầu trong phần tiếp theo
|
||||
onboarding-automatic_proportions-start_recording-next = Bắt đầu
|
||||
onboarding-automatic_proportions-recording-title = REC
|
||||
onboarding-automatic_proportions-recording-description-p0 = Đang ghi...
|
||||
onboarding-automatic_proportions-recording-description-p1 = Thực hiện các thao tác sau:
|
||||
onboarding-automatic_proportions-recording-steps-0 = Uốn duỗi chân vài lần (squat)
|
||||
onboarding-automatic_proportions-recording-steps-1 = Ngồi lên ghế rồi đứng lên
|
||||
onboarding-automatic_proportions-recording-steps-2 = Vặn thân sang trái và uốn người sang phải
|
||||
onboarding-automatic_proportions-recording-steps-3 = Vặn thân sang phải và uốn người sang trái
|
||||
onboarding-automatic_proportions-recording-steps-4 = Làm thêm các chuyển động khác đến khi hết thời gian
|
||||
onboarding-automatic_proportions-recording-processing = Đang xử lí kết quả...
|
||||
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 15)
|
||||
onboarding-automatic_proportions-recording-timer = { $time ->
|
||||
[one] 1 second
|
||||
*[other] còn lại { $time } giây
|
||||
}
|
||||
onboarding-automatic_proportions-verify_results-title = Kiểm tra kết quả
|
||||
onboarding-automatic_proportions-verify_results-description = So sánh kết quả với chỉ số thực, Lưu ý: kết quả chỉ mang tính tương đối
|
||||
onboarding-automatic_proportions-verify_results-results = Kết quả đo
|
||||
onboarding-automatic_proportions-verify_results-processing = Đang chờ kết quả...
|
||||
onboarding-automatic_proportions-verify_results-redo = Thử lại
|
||||
onboarding-automatic_proportions-verify_results-confirm = Kết quả tương đối chính xác
|
||||
onboarding-automatic_proportions-done-title = Đã lưu chỉ số đo
|
||||
onboarding-automatic_proportions-done-description = Quá trình đo đã hoàn tất
|
||||
|
||||
## Home
|
||||
home-no_trackers = Không tìm thấy tracker / Tracker chưa được gán
|
||||
532
gui/public/i18n/zh-Hans/translation.ftl
Normal file
532
gui/public/i18n/zh-Hans/translation.ftl
Normal file
@@ -0,0 +1,532 @@
|
||||
### 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!
|
||||
# And also comment the string if it's something not easy to translate, so you help
|
||||
# translators on what it means
|
||||
|
||||
## Websocket (server) status
|
||||
websocket-connecting = 正在连接到服务器
|
||||
websocket-connection_lost = 与服务器的连接丢失,正在尝试重新连接...
|
||||
|
||||
## Tips
|
||||
tips-find_tracker = 不确定哪个追踪器是哪个?在现实中摇动一个追踪器,对应的那个将在屏幕上高亮显示。
|
||||
tips-do_not_move_heels = 确保你的脚跟在录制的时候不会发生移动!
|
||||
|
||||
## Body parts
|
||||
body_part-NONE = 未分配
|
||||
body_part-HEAD = 头部
|
||||
body_part-NECK = 颈部
|
||||
body_part-RIGHT_SHOULDER = 右肩
|
||||
body_part-RIGHT_UPPER_ARM = 右大臂
|
||||
body_part-RIGHT_LOWER_ARM = 右小臂
|
||||
body_part-RIGHT_HAND = 右手
|
||||
body_part-RIGHT_UPPER_LEG = 右大腿
|
||||
body_part-RIGHT_LOWER_LEG = 右小腿
|
||||
body_part-RIGHT_FOOT = 右脚
|
||||
body_part-RIGHT_CONTROLLER = 右控制器
|
||||
body_part-CHEST = 胸部
|
||||
body_part-WAIST = 腰部
|
||||
body_part-HIP = 髋部
|
||||
body_part-LEFT_SHOULDER = 左肩
|
||||
body_part-LEFT_UPPER_ARM = 左大臂
|
||||
body_part-LEFT_LOWER_ARM = 左小臂
|
||||
body_part-LEFT_HAND = 左手
|
||||
body_part-LEFT_UPPER_LEG = 左大腿
|
||||
body_part-LEFT_LOWER_LEG = 左小腿
|
||||
body_part-LEFT_FOOT = 左脚
|
||||
body_part-LEFT_CONTROLLER = 左控制器
|
||||
|
||||
## Proportions
|
||||
skeleton_bone-NONE = 无
|
||||
skeleton_bone-HEAD = 头部偏移
|
||||
skeleton_bone-NECK = 颈部长度
|
||||
skeleton_bone-CHEST = 胸部长度
|
||||
skeleton_bone-CHEST_OFFSET = 胸部偏移
|
||||
skeleton_bone-WAIST = 腰部长度
|
||||
skeleton_bone-HIP = 髋部长度
|
||||
skeleton_bone-HIP_OFFSET = 髋部偏移
|
||||
skeleton_bone-HIPS_WIDTH = 髋部宽度
|
||||
skeleton_bone-UPPER_LEG = 大腿长度
|
||||
skeleton_bone-LOWER_LEG = 小腿长度
|
||||
skeleton_bone-FOOT_LENGTH = 脚部长度
|
||||
skeleton_bone-FOOT_SHIFT = 脚部偏移
|
||||
skeleton_bone-SKELETON_OFFSET = 骨骼偏移
|
||||
skeleton_bone-SHOULDERS_DISTANCE = 肩膀距离
|
||||
skeleton_bone-SHOULDERS_WIDTH = 肩膀宽度
|
||||
skeleton_bone-UPPER_ARM = 上臂长度
|
||||
skeleton_bone-LOWER_ARM = 前臂距离
|
||||
skeleton_bone-CONTROLLER_Y = 控制器距离 Y
|
||||
skeleton_bone-CONTROLLER_Z = 控制器距离 Z
|
||||
skeleton_bone-ELBOW_OFFSET = 肘部偏移
|
||||
|
||||
## Tracker reset buttons
|
||||
reset-reset_all = 重置身体比例
|
||||
reset-full = 重置
|
||||
reset-mounting = 重置佩戴
|
||||
reset-quick = 快速重置
|
||||
|
||||
## Serial detection stuff
|
||||
serial_detection-new_device-p0 = 检测到了新的串口设备!
|
||||
serial_detection-new_device-p1 = 输入你的 Wi-Fi 凭据!
|
||||
serial_detection-new_device-p2 = 请选择你想对它做什么
|
||||
serial_detection-open_wifi = 连接到 Wi-Fi
|
||||
serial_detection-open_serial = 打开串口控制台
|
||||
serial_detection-submit = 提交!
|
||||
serial_detection-close = 关闭
|
||||
|
||||
## Navigation bar
|
||||
navbar-home = 主页
|
||||
navbar-body_proportions = 身体比例
|
||||
navbar-trackers_assign = 追踪器分配
|
||||
navbar-mounting = 佩戴校准
|
||||
navbar-onboarding = 向导
|
||||
navbar-settings = 设置
|
||||
|
||||
## Bounding volume hierarchy recording
|
||||
bvh-start_recording = 录制 BVH 文件
|
||||
bvh-recording = 录制中...
|
||||
|
||||
## Widget: Overlay settings
|
||||
widget-overlay = 覆盖层
|
||||
widget-overlay-is_visible_label = 在 SteamVR 中显示覆盖层
|
||||
widget-overlay-is_mirrored_label = 镜像显示覆盖层
|
||||
|
||||
## Widget: Developer settings
|
||||
widget-developer_mode = 开发者选项
|
||||
widget-developer_mode-high_contrast = 高对比度
|
||||
widget-developer_mode-precise_rotation = 显示精确旋转
|
||||
widget-developer_mode-fast_data_feed = 快速数据更新
|
||||
widget-developer_mode-filter_slimes_and_hmd = 对追踪器和HMD应用滤波
|
||||
widget-developer_mode-sort_by_name = 根据名称排序
|
||||
widget-developer_mode-raw_slime_rotation = 显示原始旋转
|
||||
widget-developer_mode-more_info = 显示更多信息
|
||||
|
||||
## Widget: IMU Visualizer
|
||||
widget-imu_visualizer = 旋转
|
||||
widget-imu_visualizer-rotation_raw = 原始旋转
|
||||
widget-imu_visualizer-rotation_preview = 预览
|
||||
|
||||
## Tracker status
|
||||
tracker-status-none = 无状态
|
||||
tracker-status-busy = 繁忙
|
||||
tracker-status-error = 错误
|
||||
tracker-status-disconnected = 断开连接
|
||||
tracker-status-occluded = 被遮挡
|
||||
tracker-status-ok = 已连接
|
||||
|
||||
## Tracker status columns
|
||||
tracker-table-column-name = 名字
|
||||
tracker-table-column-type = 类型
|
||||
tracker-table-column-battery = 电量
|
||||
tracker-table-column-ping = 延迟
|
||||
tracker-table-column-tps = TPS
|
||||
tracker-table-column-temperature = 温度 °C
|
||||
tracker-table-column-linear-acceleration = 加速度 X/Y/Z
|
||||
tracker-table-column-rotation = 旋转 X/Y/Z
|
||||
tracker-table-column-position = 位置 X/Y/Z
|
||||
tracker-table-column-url = 地址
|
||||
|
||||
## Tracker rotation
|
||||
tracker-rotation-front = 前
|
||||
tracker-rotation-left = 左
|
||||
tracker-rotation-right = 右
|
||||
tracker-rotation-back = 后
|
||||
|
||||
## Tracker information
|
||||
tracker-infos-manufacturer = 制造商
|
||||
tracker-infos-display_name = 显示名称
|
||||
tracker-infos-custom_name = 自定义名称
|
||||
tracker-infos-url = 追踪器地址
|
||||
|
||||
## Tracker settings
|
||||
tracker-settings-back = 返回追踪器列表
|
||||
tracker-settings-title = 追踪器设置
|
||||
tracker-settings-assignment_section = 分配追踪器
|
||||
tracker-settings-assignment_section-description = 该追踪器要被分配到身体的哪个部位?
|
||||
tracker-settings-assignment_section-edit = 编辑分配
|
||||
tracker-settings-mounting_section = 佩戴位置
|
||||
tracker-settings-mounting_section-description = 该追踪器被佩戴在哪里?
|
||||
tracker-settings-mounting_section-edit = 编辑佩戴
|
||||
tracker-settings-drift_compensation_section = 允许漂移补偿
|
||||
tracker-settings-drift_compensation_section-description = 是否在此追踪器上应用漂移补偿?
|
||||
tracker-settings-drift_compensation_section-edit = 允许漂移补偿
|
||||
# The .<name> means it's an attribute and it's related to the top key.
|
||||
# In this case that is the settings for the assignment section.
|
||||
tracker-settings-name_section = 追踪器名称
|
||||
tracker-settings-name_section-description = 给它起一个可爱的名字吧=w=~
|
||||
tracker-settings-name_section-placeholder = CC 封印着漆黑之力的漆黑左臂
|
||||
|
||||
## Tracker part card info
|
||||
tracker-part_card-no_name = 未命名
|
||||
tracker-part_card-unassigned = 未分配
|
||||
|
||||
## Body assignment menu
|
||||
body_assignment_menu = 你想将此追踪器戴在哪里?
|
||||
body_assignment_menu-description = 选择要将此追踪器分配到的位置,或者你也可以选择一次管理所有追踪器,而不是逐个管理。
|
||||
body_assignment_menu-show_advanced_locations = 显示高级分配位置
|
||||
body_assignment_menu-manage_trackers = 管理所有追踪器
|
||||
body_assignment_menu-unassign_tracker = 取消分配追踪器
|
||||
|
||||
## Tracker assignment menu
|
||||
# A -translation_key (with a dash in the front) means that it's a label.
|
||||
# It can only be used in the translation file, it's nice for reusing names and that kind of stuff.
|
||||
#
|
||||
# We are using it here because english doesn't require changing the text in each case but
|
||||
# maybe your language does.
|
||||
-tracker_selection-part = 哪个追踪器将被分配到你的
|
||||
tracker_selection_menu-NONE = 你想将哪个追踪器解除分配?
|
||||
tracker_selection_menu-HEAD = { -tracker_selection-part }头部?
|
||||
tracker_selection_menu-NECK = { -tracker_selection-part }颈部?
|
||||
tracker_selection_menu-RIGHT_SHOULDER = { -tracker_selection-part }右肩?
|
||||
tracker_selection_menu-RIGHT_UPPER_ARM = { -tracker_selection-part }右大臂?
|
||||
tracker_selection_menu-RIGHT_LOWER_ARM = { -tracker_selection-part }右小臂?
|
||||
tracker_selection_menu-RIGHT_HAND = { -tracker_selection-part }右手?
|
||||
tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part }右大腿?
|
||||
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part }右小腿?
|
||||
tracker_selection_menu-RIGHT_FOOT = { -tracker_selection-part }右脚?
|
||||
tracker_selection_menu-RIGHT_CONTROLLER = { -tracker_selection-part }右控制器?
|
||||
tracker_selection_menu-CHEST = { -tracker_selection-part }胸部?
|
||||
tracker_selection_menu-WAIST = { -tracker_selection-part }腰部?
|
||||
tracker_selection_menu-HIP = { -tracker_selection-part }髋部?
|
||||
tracker_selection_menu-LEFT_SHOULDER = { -tracker_selection-part }左肩?
|
||||
tracker_selection_menu-LEFT_UPPER_ARM = { -tracker_selection-part }左大臂?
|
||||
tracker_selection_menu-LEFT_LOWER_ARM = { -tracker_selection-part }左小臂?
|
||||
tracker_selection_menu-LEFT_HAND = { -tracker_selection-part }左手?
|
||||
tracker_selection_menu-LEFT_UPPER_LEG = { -tracker_selection-part }左大腿?
|
||||
tracker_selection_menu-LEFT_LOWER_LEG = { -tracker_selection-part }左小腿?
|
||||
tracker_selection_menu-LEFT_FOOT = { -tracker_selection-part }左脚?
|
||||
tracker_selection_menu-LEFT_CONTROLLER = { -tracker_selection-part }左控制器?
|
||||
|
||||
tracker_selection_menu-unassigned = 未分配的追踪器
|
||||
tracker_selection_menu-assigned = 已分配的追踪器
|
||||
tracker_selection_menu-dont_assign = 不分配
|
||||
|
||||
## Mounting menu
|
||||
mounting_selection_menu = 你想将此追踪器戴在哪里?
|
||||
mounting_selection_menu-close = 关闭
|
||||
|
||||
## Sidebar settings
|
||||
settings-sidebar-title = 设置
|
||||
settings-sidebar-general = 通用设置
|
||||
settings-sidebar-tracker_mechanics = 追踪器设置
|
||||
settings-sidebar-fk_settings = FK 设置
|
||||
settings-sidebar-gesture_control = 手势控制
|
||||
settings-sidebar-interface = 交互界面
|
||||
settings-sidebar-osc_router = OSC 路由
|
||||
settings-sidebar-utils = 工具
|
||||
settings-sidebar-serial = 串口控制台
|
||||
|
||||
## SteamVR settings
|
||||
settings-general-steamvr = SteamVR
|
||||
settings-general-steamvr-subtitle = SteamVR 追踪器
|
||||
# Not all translation keys support multiline, only the ones that specify it will actually
|
||||
# split it in lines (that also means you can split in lines however you want in those).
|
||||
# The first spaces (not tabs) for indentation will be ignored, just to make the file look nice when writing.
|
||||
# This one is one of this cases that cares about multilines
|
||||
settings-general-steamvr-description =
|
||||
启用或禁用特定的追踪器
|
||||
对于只支持特定追踪器的应用会很有用。
|
||||
settings-general-steamvr-trackers-waist = 腰部
|
||||
settings-general-steamvr-trackers-chest = 胸部
|
||||
settings-general-steamvr-trackers-feet = 脚部
|
||||
settings-general-steamvr-trackers-knees = 膝盖
|
||||
settings-general-steamvr-trackers-elbows = 肘部
|
||||
settings-general-steamvr-trackers-hands = 手部
|
||||
|
||||
## Tracker mechanics
|
||||
settings-general-tracker_mechanics = 追踪器设置
|
||||
settings-general-tracker_mechanics-filtering = 滤波
|
||||
# This also cares about multilines
|
||||
settings-general-tracker_mechanics-filtering-description =
|
||||
选择追踪器的滤波类型。
|
||||
预测型将会对你的运动加以预测,而平滑型将会让你的运动更加平滑。
|
||||
settings-general-tracker_mechanics-filtering-type = 滤波类型
|
||||
settings-general-tracker_mechanics-filtering-type-none = 无滤波
|
||||
settings-general-tracker_mechanics-filtering-type-none-description = 使用原始数据,不进行滤波。
|
||||
settings-general-tracker_mechanics-filtering-type-smoothing = 平滑型
|
||||
settings-general-tracker_mechanics-filtering-type-smoothing-description = 让运动更加平滑,但会增加一些延迟。
|
||||
settings-general-tracker_mechanics-filtering-type-prediction = 预测型
|
||||
settings-general-tracker_mechanics-filtering-type-prediction-description = 减少延迟并使移动更敏捷,但可能会增加一些抖动。
|
||||
settings-general-tracker_mechanics-filtering-amount = 滤波强度
|
||||
settings-general-tracker_mechanics-drift_compensation = 漂移补偿
|
||||
# This cares about multilines
|
||||
settings-general-tracker_mechanics-drift_compensation-description =
|
||||
应用反向旋转以补偿IMU的偏航角漂移。
|
||||
更改补偿量和使用多少次的重置结果用于计算补偿量。
|
||||
settings-general-tracker_mechanics-drift_compensation-enabled-label = 漂移补偿
|
||||
settings-general-tracker_mechanics-drift_compensation-amount-label = 补偿量
|
||||
settings-general-tracker_mechanics-drift_compensation-max_resets-label = 使用几次的重置结果?
|
||||
|
||||
## FK/Tracking settings
|
||||
settings-general-fk_settings = FK 设置
|
||||
settings-general-fk_settings-leg_tweak = 腿部调整
|
||||
settings-general-fk_settings-leg_tweak-description = 本设置可以减少甚至消除脚部穿入地板的情况,但是当你跪在地上的时候可能产生一些问题. 脚滑矫正可以矫正一些脚滑溜冰的问题, 但是可能会降低某些动作的准确性。
|
||||
# Floor clip:
|
||||
# why the name - came from the idea of noclip in video games, but is the opposite where clipping to the floor is a desired feature
|
||||
# definition - Prevents the foot trackers from going lower than they where when a reset was performed
|
||||
settings-general-fk_settings-leg_tweak-floor_clip = 地板限制
|
||||
# Skating correction:
|
||||
# why the name - without this enabled the feet will often slide across the ground as if your skating across the ground,
|
||||
# since this largely prevents this it corrects for it hence skating correction (note this may be renamed to sliding correction)
|
||||
# definition - Guesses when each foot is in contact with the ground and uses that information to improve tracking
|
||||
settings-general-fk_settings-leg_tweak-skating_correction = 脚滑矫正
|
||||
settings-general-fk_settings-leg_tweak-skating_correction-amount = 脚滑矫正量
|
||||
settings-general-fk_settings-arm_fk = 手臂 FK
|
||||
settings-general-fk_settings-arm_fk-description = 更改手臂的追踪方式。
|
||||
settings-general-fk_settings-arm_fk-force_arms = 强制从头显获得数据
|
||||
settings-general-fk_settings-arm_fk-i_pose = Use i-pose instead of t-pose
|
||||
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-vive_emulation-title = Vive 模拟
|
||||
settings-general-fk_settings-vive_emulation-description = 模拟Vive追踪器的腰部丢追问题。( 注:这是一个玩笑功能,会劣化追踪质量。)
|
||||
settings-general-fk_settings-vive_emulation-label = 开启 Vive 模拟
|
||||
|
||||
## Gesture control settings (tracker tapping)
|
||||
settings-general-gesture_control = 手势控制
|
||||
settings-general-gesture_control-subtitle = 敲击重置
|
||||
settings-general-gesture_control-description = 启用或禁用敲击重置。启用时,敲击身上佩戴的最高的追踪器上的任何位置将激活快速重置。延迟是指记录到敲击和重置之间的时间。
|
||||
# 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 ->
|
||||
*[other] { $amount }次敲击
|
||||
}
|
||||
settings-general-gesture_control-quickResetEnabled = 开启敲击快速重置
|
||||
settings-general-gesture_control-quickResetDelay = 敲击快速重置延迟
|
||||
settings-general-gesture_control-quickResetTaps = 快速重置敲击次数
|
||||
settings-general-gesture_control-resetEnabled = 开启敲击重置
|
||||
settings-general-gesture_control-resetDelay = 敲击重置延迟
|
||||
settings-general-gesture_control-resetTaps = 重置敲击次数
|
||||
settings-general-gesture_control-mountingResetEnabled = 开启敲击重置佩戴
|
||||
settings-general-gesture_control-mountingResetDelay = 敲击重置佩戴延迟
|
||||
settings-general-gesture_control-mountingResetTaps = 重置佩戴敲击次数
|
||||
|
||||
## Interface settings
|
||||
settings-general-interface = 交互界面
|
||||
settings-general-interface-dev_mode = 开发者模式
|
||||
settings-general-interface-dev_mode-description = 如果你需要深入的数据或更深入地与连接的追踪器进行交互,打开此模式将会非常有用。
|
||||
settings-general-interface-dev_mode-label = 开发者模式
|
||||
settings-general-interface-serial_detection = 串口设备检测
|
||||
settings-general-interface-serial_detection-description = 每次插入可能是追踪器的新串口设备时,此选项都会显示一个弹出窗口。这有助于改进追踪器的设置过程。
|
||||
settings-general-interface-serial_detection-label = 串口设备检测
|
||||
settings-general-interface-lang = 选择语言
|
||||
settings-general-interface-lang-description = 更改要使用的默认语言
|
||||
settings-general-interface-lang-placeholder = 选择要使用的语言
|
||||
|
||||
## Serial settings
|
||||
settings-serial = 串口控制台
|
||||
# This cares about multilines
|
||||
settings-serial-description =
|
||||
这里用于显示串口的实时信息流。
|
||||
如果你需要了解固件是否出现问题,这将会很有用。
|
||||
settings-serial-connection_lost = 串口连接丢失,正在重新连接..
|
||||
settings-serial-reboot = 重新启动
|
||||
settings-serial-factory_reset = 恢复出厂设置
|
||||
settings-serial-get_infos = 获取信息
|
||||
settings-serial-serial_select = 选择串行端口
|
||||
settings-serial-auto_dropdown_item = 自动
|
||||
|
||||
## OSC router settings
|
||||
settings-osc-router = OSC 路由
|
||||
# This cares about multilines
|
||||
settings-osc-router-description =
|
||||
从另一个程序转发 OSC 信息。
|
||||
在使用另一个 VRChat 的 OSC 程序时会很有用。
|
||||
settings-osc-router-enable = 启用
|
||||
settings-osc-router-enable-description = 控制信息转发功能的开关。
|
||||
settings-osc-router-enable-label = 启用
|
||||
settings-osc-router-network = 网络端口
|
||||
# This cares about multilines
|
||||
settings-osc-router-network-description =
|
||||
设置用于监听和向 VRChat 发送数据的端口
|
||||
这些端口可以与 SlimeVR 服务器中使用的其他端口相同。
|
||||
settings-osc-router-network-port_in =
|
||||
.label = 输入端口
|
||||
.placeholder = 输入端口(默认 9002)
|
||||
settings-osc-router-network-port_out =
|
||||
.label = 输出端口
|
||||
.placeholder = 输出端口(默认 9000)
|
||||
settings-osc-router-network-address = 网络地址
|
||||
settings-osc-router-network-address-description = 设置用来发送数据的地址。
|
||||
settings-osc-router-network-address-placeholder = IPV4 地址
|
||||
|
||||
## OSC VRChat settings
|
||||
settings-osc-vrchat = VRChat OSC Trackers
|
||||
# This cares about multilines
|
||||
settings-osc-vrchat-description =
|
||||
改变 VRChat 的特定设置以接收和发送头显数据。
|
||||
用于全身追踪的追踪器数据(在 Quest 端生效)。
|
||||
settings-osc-vrchat-enable = 启用
|
||||
settings-osc-vrchat-enable-description = 切换数据的发送和接收
|
||||
settings-osc-vrchat-enable-label = 启用
|
||||
settings-osc-vrchat-network = 网络端口
|
||||
settings-osc-vrchat-network-description = 设置用于监听和向 VRChat 发送数据的端口
|
||||
settings-osc-vrchat-network-port_in =
|
||||
.label = 输入端口
|
||||
.placeholder = 输入端口(默认 9001)
|
||||
settings-osc-vrchat-network-port_out =
|
||||
.label = 输出端口
|
||||
.placeholder = 输出端口(默认 9000)
|
||||
settings-osc-vrchat-network-address = 网络地址
|
||||
settings-osc-vrchat-network-address-description = 选择将数据发送到 VRChat 的地址(检查设备上的 Wi-Fi 设置)
|
||||
settings-osc-vrchat-network-address-placeholder = VRChat IP 地址
|
||||
settings-osc-vrchat-network-trackers = 追踪器
|
||||
settings-osc-vrchat-network-trackers-description = 切换数据的发送和接收
|
||||
settings-osc-vrchat-network-trackers-chest = 胸部
|
||||
settings-osc-vrchat-network-trackers-waist = 腰部
|
||||
settings-osc-vrchat-network-trackers-knees = 膝盖
|
||||
settings-osc-vrchat-network-trackers-feet = 脚部
|
||||
settings-osc-vrchat-network-trackers-elbows = 肘部
|
||||
|
||||
## Setup/onboarding menu
|
||||
onboarding-skip = 跳过设置
|
||||
onboarding-continue = 继续
|
||||
onboarding-wip = 仍在开发中
|
||||
|
||||
## Wi-Fi setup
|
||||
onboarding-wifi_creds-back = 返回简介
|
||||
onboarding-wifi_creds = 输入 Wi-Fi 凭据
|
||||
# This cares about multilines
|
||||
onboarding-wifi_creds-description =
|
||||
追踪器将使用这些凭据连接到 Wi-Fi
|
||||
请使用当前连接到 Wi-Fi 的凭据
|
||||
onboarding-wifi_creds-skip = 跳过 Wi-Fi 设置
|
||||
onboarding-wifi_creds-submit = 提交!
|
||||
onboarding-wifi_creds-ssid =
|
||||
.label = SSID
|
||||
.placeholder = 输入 SSID
|
||||
onboarding-wifi_creds-password =
|
||||
.label = 密码
|
||||
.placeholder = 输入密码
|
||||
|
||||
## Mounting setup
|
||||
onboarding-reset_tutorial-back = 返回到佩戴校准
|
||||
onboarding-reset_tutorial = 重置教程
|
||||
onboarding-reset_tutorial-description = 此功能尚未开发完成,请继续就好
|
||||
|
||||
## Setup start
|
||||
onboarding-home = 欢迎来到 SlimeVR
|
||||
# This cares about multilines and it's centered!!
|
||||
onboarding-home-description =
|
||||
将全身追踪
|
||||
带给每一个人
|
||||
onboarding-home-start = 我准备好了!
|
||||
|
||||
## Enter VR part of setup
|
||||
onboarding-enter_vr-back = 返回到追踪器分配
|
||||
onboarding-enter_vr-title = VR 时间到!
|
||||
onboarding-enter_vr-description = 穿戴好所有的追踪器,开始快乐 VR 吧!
|
||||
onboarding-enter_vr-ready = 我准备好了
|
||||
|
||||
## Setup done
|
||||
onboarding-done-title = 都搞定啦!
|
||||
onboarding-done-description = 享受你的全身追踪体验吧
|
||||
onboarding-done-close = 关闭向导
|
||||
|
||||
## Tracker connection setup
|
||||
onboarding-connect_tracker-back = 返回到 Wi-Fi 凭据设置
|
||||
onboarding-connect_tracker-title = 连接追踪器
|
||||
onboarding-connect_tracker-description-p0 = 来到了我第二喜欢的环节,连接所有的追踪器!
|
||||
onboarding-connect_tracker-description-p1 = 只需通过 USB 连接所有尚未连接的设备即可。
|
||||
onboarding-connect_tracker-issue-serial = QAQ 我在连接时遇到问题!
|
||||
onboarding-connect_tracker-usb = USB 追踪器
|
||||
onboarding-connect_tracker-connection_status-connecting = 正在发送 Wi-Fi 凭据
|
||||
onboarding-connect_tracker-connection_status-connected = Wi-Fi 已连接
|
||||
onboarding-connect_tracker-connection_status-error = 无法连接到 Wi-Fi
|
||||
onboarding-connect_tracker-connection_status-start_connecting = 寻找追踪器
|
||||
onboarding-connect_tracker-connection_status-handshake = 已连接到服务器
|
||||
# $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] 没有已连接的追踪器
|
||||
*[other] { $amount } 个追踪器已连接
|
||||
}
|
||||
onboarding-connect_tracker-next = 所有的追踪器都连接好了
|
||||
|
||||
## Tracker assignment setup
|
||||
onboarding-assign_trackers-back = 返回 Wi-Fi 凭据设置
|
||||
onboarding-assign_trackers-title = 分配追踪器
|
||||
onboarding-assign_trackers-description = 让我们选择哪个追踪器在哪里。单击要放置追踪器的部位
|
||||
# Look at translation of onboarding-connect_tracker-connected_trackers on how to use plurals
|
||||
# $assigned (Number) - Trackers that have been assigned a body part
|
||||
# $trackers (Number) - Trackers connected to the server
|
||||
onboarding-assign_trackers-assigned = { $assigned }/{ $trackers } 个追踪器已分配
|
||||
onboarding-assign_trackers-advanced = 显示高级分配部位
|
||||
onboarding-assign_trackers-next = 所有的追踪器都分配好了
|
||||
|
||||
## Tracker manual mounting setup
|
||||
onboarding-manual_mounting-back = 返回到进入 VR
|
||||
onboarding-manual_mounting = 手动佩戴
|
||||
onboarding-manual_mounting-description = 单击每个追踪器并选择它们的配电方式
|
||||
onboarding-manual_mounting-auto_mounting = 自动佩戴
|
||||
onboarding-manual_mounting-next = 下一步
|
||||
|
||||
## Tracker automatic mounting setup
|
||||
onboarding-automatic_mounting-back = 返回到进入 VR
|
||||
onboarding-automatic_mounting-title = 佩戴校准
|
||||
onboarding-automatic_mounting-description = 为了让 SlimeVR 追踪器正常工作,我们需要为你的追踪器分配一个佩戴方向,以使其与你的物理追踪器佩戴方式对齐。
|
||||
onboarding-automatic_mounting-manual_mounting = 手动设置佩戴方向
|
||||
onboarding-automatic_mounting-next = 下一步
|
||||
onboarding-automatic_mounting-prev_step = 上一步
|
||||
onboarding-automatic_mounting-done-title = 佩戴方向已校准。
|
||||
onboarding-automatic_mounting-done-description = 你的佩戴方向校准完成!
|
||||
onboarding-automatic_mounting-done-restart = 返回以开始
|
||||
onboarding-automatic_mounting-mounting_reset-title = 佩戴重置
|
||||
onboarding-automatic_mounting-mounting_reset-step-0 = 1. 双腿弯曲以滑雪的姿势蹲下,上身向前倾斜,手臂弯曲。
|
||||
onboarding-automatic_mounting-mounting_reset-step-1 = 按下佩戴重置按钮并等待 3 秒钟,然后追踪器的佩戴方向将被重置。
|
||||
onboarding-automatic_mounting-preparation-title = 准备
|
||||
onboarding-automatic_mounting-preparation-step-0 = 1. 身体直立,双臂放在身体两侧。
|
||||
onboarding-automatic_mounting-preparation-step-1 = 按下“复位”按钮,等待 3 秒钟,追踪器将复位。
|
||||
onboarding-automatic_mounting-put_trackers_on-title = 穿戴好追踪器
|
||||
onboarding-automatic_mounting-put_trackers_on-description = 为了校准佩戴方向,我们将使用你刚才分配的追踪器。戴上你所有的追踪器,你可以在右边的图中看到哪个追踪器对应哪个。
|
||||
onboarding-automatic_mounting-put_trackers_on-next = 所有的追踪器都已开启!
|
||||
|
||||
## Tracker manual proportions setup
|
||||
onboarding-manual_proportions-back = 返回重置教程
|
||||
onboarding-manual_proportions-title = 手动调整身体比例
|
||||
onboarding-manual_proportions-precision = 精确调整
|
||||
onboarding-manual_proportions-auto = 自动校准
|
||||
|
||||
## Tracker automatic proportions setup
|
||||
onboarding-automatic_proportions-back = 返回重置教程
|
||||
onboarding-automatic_proportions-title = 测量你的身体比例
|
||||
onboarding-automatic_proportions-description = 为了让 SlimeVR 追踪器正常使用,我们需要知道你的骨头的长度。这个简短的校准将为你测量它们。
|
||||
onboarding-automatic_proportions-manual = 手动校准
|
||||
onboarding-automatic_proportions-prev_step = 上一步
|
||||
onboarding-automatic_proportions-put_trackers_on-title = 穿戴好追踪器
|
||||
onboarding-automatic_proportions-put_trackers_on-description = 为了校准你的身体比例,我们将使用你刚才分配的追踪器。戴上你所有的追踪器,你可以在右边的图中看到哪个追踪器对应哪个。
|
||||
onboarding-automatic_proportions-put_trackers_on-next = 所有的追踪器都已开启!
|
||||
onboarding-automatic_proportions-preparation-title = 准备
|
||||
onboarding-automatic_proportions-preparation-description = 在你的正后方放一把椅子,并准备好在接下来的设置过程中坐下。
|
||||
onboarding-automatic_proportions-preparation-next = 我在椅子前面啦
|
||||
onboarding-automatic_proportions-start_recording-title = 准备录制运动
|
||||
onboarding-automatic_proportions-start_recording-description = 我们现在要记录一些特定的姿势和动作。这些将在下一个屏幕中提示。当按钮被按下时,准备好开始!
|
||||
onboarding-automatic_proportions-start_recording-next = 开始录制
|
||||
onboarding-automatic_proportions-recording-title = REC
|
||||
onboarding-automatic_proportions-recording-description-p0 = 录制中...
|
||||
onboarding-automatic_proportions-recording-description-p1 = 依次做出以下动作:
|
||||
onboarding-automatic_proportions-recording-steps-0 = 弯曲几次膝盖。
|
||||
onboarding-automatic_proportions-recording-steps-1 = 坐在椅子上,然后站起来。
|
||||
onboarding-automatic_proportions-recording-steps-2 = 向左扭转上身,然后向右弯。
|
||||
onboarding-automatic_proportions-recording-steps-3 = 向右扭转上身,然后向左弯。
|
||||
onboarding-automatic_proportions-recording-steps-4 = 持续摆动身体,直到计时器结束。
|
||||
onboarding-automatic_proportions-recording-processing = 正在处理结果
|
||||
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 15)
|
||||
onboarding-automatic_proportions-recording-timer = 剩余{ $time }秒
|
||||
onboarding-automatic_proportions-verify_results-title = 校验结果
|
||||
onboarding-automatic_proportions-verify_results-description = 检查下面的结果,它们看起来是正确的吗?
|
||||
onboarding-automatic_proportions-verify_results-results = 录制结果
|
||||
onboarding-automatic_proportions-verify_results-processing = 正在处理结果
|
||||
onboarding-automatic_proportions-verify_results-redo = 重新录制
|
||||
onboarding-automatic_proportions-verify_results-confirm = 他们是正确的!
|
||||
onboarding-automatic_proportions-done-title = 身体数据已测量并保存。
|
||||
onboarding-automatic_proportions-done-description = 你的身体比例校准已完成!
|
||||
|
||||
## Home
|
||||
home-no_trackers = 未检测到或未分配追踪器
|
||||
BIN
gui/public/images/mounting-reset-pose.png
Normal file
BIN
gui/public/images/mounting-reset-pose.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 37 KiB |
BIN
gui/public/images/reset-pose.png
Normal file
BIN
gui/public/images/reset-pose.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 51 KiB |
@@ -1,43 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="theme-color" content="#000000" />
|
||||
<meta
|
||||
name="description"
|
||||
content="Web site created using create-react-app"
|
||||
/>
|
||||
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
|
||||
<!--
|
||||
manifest.json provides metadata used when your web app is installed on a
|
||||
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
|
||||
-->
|
||||
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
|
||||
<!--
|
||||
Notice the use of %PUBLIC_URL% in the tags above.
|
||||
It will be replaced with the URL of the `public` folder during the build.
|
||||
Only files inside the `public` folder can be referenced from the HTML.
|
||||
|
||||
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
|
||||
work correctly both with client-side routing and a non-root public URL.
|
||||
Learn how to configure a non-root public URL by running `npm run build`.
|
||||
-->
|
||||
<title>React App</title>
|
||||
</head>
|
||||
<body>
|
||||
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||
<div id="root"></div>
|
||||
<!--
|
||||
This HTML file is a template.
|
||||
If you open it directly in the browser, you will see an empty page.
|
||||
|
||||
You can add webfonts, meta tags, or analytics to this file.
|
||||
The build step will place the bundled scripts into the <body> tag.
|
||||
|
||||
To begin the development, run `npm start` or `yarn start`.
|
||||
To create a production bundle, use `npm run build` or `yarn build`.
|
||||
-->
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,2 +0,0 @@
|
||||
[toolchain]
|
||||
channel = "stable"
|
||||
@@ -1,217 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
// Do this as the first thing so that any code reading it knows the right env.
|
||||
process.env.BABEL_ENV = 'production';
|
||||
process.env.NODE_ENV = 'production';
|
||||
|
||||
// Makes the script crash on unhandled rejections instead of silently
|
||||
// ignoring them. In the future, promise rejections that are not handled will
|
||||
// terminate the Node.js process with a non-zero exit code.
|
||||
process.on('unhandledRejection', err => {
|
||||
throw err;
|
||||
});
|
||||
|
||||
// Ensure environment variables are read.
|
||||
require('../config/env');
|
||||
|
||||
const path = require('path');
|
||||
const chalk = require('react-dev-utils/chalk');
|
||||
const fs = require('fs-extra');
|
||||
const bfj = require('bfj');
|
||||
const webpack = require('webpack');
|
||||
const configFactory = require('../config/webpack.config');
|
||||
const paths = require('../config/paths');
|
||||
const checkRequiredFiles = require('react-dev-utils/checkRequiredFiles');
|
||||
const formatWebpackMessages = require('react-dev-utils/formatWebpackMessages');
|
||||
const printHostingInstructions = require('react-dev-utils/printHostingInstructions');
|
||||
const FileSizeReporter = require('react-dev-utils/FileSizeReporter');
|
||||
const printBuildError = require('react-dev-utils/printBuildError');
|
||||
|
||||
const measureFileSizesBeforeBuild =
|
||||
FileSizeReporter.measureFileSizesBeforeBuild;
|
||||
const printFileSizesAfterBuild = FileSizeReporter.printFileSizesAfterBuild;
|
||||
const useYarn = fs.existsSync(paths.yarnLockFile);
|
||||
|
||||
// These sizes are pretty large. We'll warn for bundles exceeding them.
|
||||
const WARN_AFTER_BUNDLE_GZIP_SIZE = 512 * 1024;
|
||||
const WARN_AFTER_CHUNK_GZIP_SIZE = 1024 * 1024;
|
||||
|
||||
const isInteractive = process.stdout.isTTY;
|
||||
|
||||
// Warn and crash if required files are missing
|
||||
if (!checkRequiredFiles([paths.appHtml, paths.appIndexJs])) {
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const argv = process.argv.slice(2);
|
||||
const writeStatsJson = argv.indexOf('--stats') !== -1;
|
||||
|
||||
// Generate configuration
|
||||
const config = configFactory('production');
|
||||
|
||||
// We require that you explicitly set browsers and do not fall back to
|
||||
// browserslist defaults.
|
||||
const { checkBrowsers } = require('react-dev-utils/browsersHelper');
|
||||
checkBrowsers(paths.appPath, isInteractive)
|
||||
.then(() => {
|
||||
// First, read the current file sizes in build directory.
|
||||
// This lets us display how much they changed later.
|
||||
return measureFileSizesBeforeBuild(paths.appBuild);
|
||||
})
|
||||
.then(previousFileSizes => {
|
||||
// Remove all content but keep the directory so that
|
||||
// if you're in it, you don't end up in Trash
|
||||
fs.emptyDirSync(paths.appBuild);
|
||||
// Merge with the public folder
|
||||
copyPublicFolder();
|
||||
// Start the webpack build
|
||||
return build(previousFileSizes);
|
||||
})
|
||||
.then(
|
||||
({ stats, previousFileSizes, warnings }) => {
|
||||
if (warnings.length) {
|
||||
console.log(chalk.yellow('Compiled with warnings.\n'));
|
||||
console.log(warnings.join('\n\n'));
|
||||
console.log(
|
||||
'\nSearch for the ' +
|
||||
chalk.underline(chalk.yellow('keywords')) +
|
||||
' to learn more about each warning.'
|
||||
);
|
||||
console.log(
|
||||
'To ignore, add ' +
|
||||
chalk.cyan('// eslint-disable-next-line') +
|
||||
' to the line before.\n'
|
||||
);
|
||||
} else {
|
||||
console.log(chalk.green('Compiled successfully.\n'));
|
||||
}
|
||||
|
||||
console.log('File sizes after gzip:\n');
|
||||
printFileSizesAfterBuild(
|
||||
stats,
|
||||
previousFileSizes,
|
||||
paths.appBuild,
|
||||
WARN_AFTER_BUNDLE_GZIP_SIZE,
|
||||
WARN_AFTER_CHUNK_GZIP_SIZE
|
||||
);
|
||||
console.log();
|
||||
|
||||
const appPackage = require(paths.appPackageJson);
|
||||
const publicUrl = paths.publicUrlOrPath;
|
||||
const publicPath = config.output.publicPath;
|
||||
const buildFolder = path.relative(process.cwd(), paths.appBuild);
|
||||
printHostingInstructions(
|
||||
appPackage,
|
||||
publicUrl,
|
||||
publicPath,
|
||||
buildFolder,
|
||||
useYarn
|
||||
);
|
||||
},
|
||||
err => {
|
||||
const tscCompileOnError = process.env.TSC_COMPILE_ON_ERROR === 'true';
|
||||
if (tscCompileOnError) {
|
||||
console.log(
|
||||
chalk.yellow(
|
||||
'Compiled with the following type errors (you may want to check these before deploying your app):\n'
|
||||
)
|
||||
);
|
||||
printBuildError(err);
|
||||
} else {
|
||||
console.log(chalk.red('Failed to compile.\n'));
|
||||
printBuildError(err);
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
)
|
||||
.catch(err => {
|
||||
if (err && err.message) {
|
||||
console.log(err.message);
|
||||
}
|
||||
process.exit(1);
|
||||
});
|
||||
|
||||
// Create the production build and print the deployment instructions.
|
||||
function build(previousFileSizes) {
|
||||
console.log('Creating an optimized production build...');
|
||||
|
||||
const compiler = webpack(config);
|
||||
return new Promise((resolve, reject) => {
|
||||
compiler.run((err, stats) => {
|
||||
let messages;
|
||||
if (err) {
|
||||
if (!err.message) {
|
||||
return reject(err);
|
||||
}
|
||||
|
||||
let errMessage = err.message;
|
||||
|
||||
// Add additional information for postcss errors
|
||||
if (Object.prototype.hasOwnProperty.call(err, 'postcssNode')) {
|
||||
errMessage +=
|
||||
'\nCompileError: Begins at CSS selector ' +
|
||||
err['postcssNode'].selector;
|
||||
}
|
||||
|
||||
messages = formatWebpackMessages({
|
||||
errors: [errMessage],
|
||||
warnings: [],
|
||||
});
|
||||
} else {
|
||||
messages = formatWebpackMessages(
|
||||
stats.toJson({ all: false, warnings: true, errors: true })
|
||||
);
|
||||
}
|
||||
if (messages.errors.length) {
|
||||
// Only keep the first error. Others are often indicative
|
||||
// of the same problem, but confuse the reader with noise.
|
||||
if (messages.errors.length > 1) {
|
||||
messages.errors.length = 1;
|
||||
}
|
||||
return reject(new Error(messages.errors.join('\n\n')));
|
||||
}
|
||||
if (
|
||||
process.env.CI &&
|
||||
(typeof process.env.CI !== 'string' ||
|
||||
process.env.CI.toLowerCase() !== 'false') &&
|
||||
messages.warnings.length
|
||||
) {
|
||||
// Ignore sourcemap warnings in CI builds. See #8227 for more info.
|
||||
const filteredWarnings = messages.warnings.filter(
|
||||
w => !/Failed to parse source map/.test(w)
|
||||
);
|
||||
if (filteredWarnings.length) {
|
||||
console.log(
|
||||
chalk.yellow(
|
||||
'\nTreating warnings as errors because process.env.CI = true.\n' +
|
||||
'Most CI servers set it automatically.\n'
|
||||
)
|
||||
);
|
||||
return reject(new Error(filteredWarnings.join('\n\n')));
|
||||
}
|
||||
}
|
||||
|
||||
const resolveArgs = {
|
||||
stats,
|
||||
previousFileSizes,
|
||||
warnings: messages.warnings,
|
||||
};
|
||||
|
||||
if (writeStatsJson) {
|
||||
return bfj
|
||||
.write(paths.appBuild + '/bundle-stats.json', stats.toJson())
|
||||
.then(() => resolve(resolveArgs))
|
||||
.catch(error => reject(new Error(error)));
|
||||
}
|
||||
|
||||
return resolve(resolveArgs);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function copyPublicFolder() {
|
||||
fs.copySync(paths.appPublic, paths.appBuild, {
|
||||
dereference: true,
|
||||
filter: file => file !== paths.appHtml,
|
||||
});
|
||||
}
|
||||
97
gui/scripts/check-missing.js
Executable file
97
gui/scripts/check-missing.js
Executable file
@@ -0,0 +1,97 @@
|
||||
#!/bin/node
|
||||
/*
|
||||
Process exit codes:
|
||||
First bit: Fluent syntax error in english file
|
||||
Second bit: Fluent syntax error in translation file
|
||||
Third bit: Missing key
|
||||
Fourth bit: Missing attribute
|
||||
Fifth bit: Extra key
|
||||
Sixth bit: Extra attribute
|
||||
*/
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||
const fs = require('fs');
|
||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||
const path = require('path');
|
||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||
const process = require('process');
|
||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||
const { execSync } = require('child_process');
|
||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||
const { FluentBundle, FluentResource } = require('@fluent/bundle');
|
||||
|
||||
const PATH = path.join(
|
||||
execSync('git rev-parse --show-toplevel', { encoding: 'utf-8' }).trim(),
|
||||
'gui/public/i18n'
|
||||
);
|
||||
|
||||
const langs = fs.readdirSync(PATH).filter((x) => x !== 'en');
|
||||
const en = new FluentBundle('en');
|
||||
const enErrors = en.addResource(
|
||||
new FluentResource(
|
||||
fs.readFileSync(path.join(PATH, 'en/translation.ftl'), 'utf-8')
|
||||
)
|
||||
);
|
||||
if (enErrors.length) {
|
||||
for (const error of enErrors) {
|
||||
console.error(error);
|
||||
}
|
||||
process.exit(1);
|
||||
}
|
||||
const requiredMessages = [...en._messages.keys()];
|
||||
|
||||
process.exitCode = 0;
|
||||
for (const lang of langs) {
|
||||
const resource = new FluentResource(
|
||||
fs.readFileSync(path.join(PATH, lang, 'translation.ftl'), 'utf-8')
|
||||
);
|
||||
const bundle = new FluentBundle(lang);
|
||||
const errors = bundle.addResource(resource);
|
||||
|
||||
// Check for syntax errors
|
||||
for (const error of errors) {
|
||||
console.error(error);
|
||||
process.exitCode &= 0b10;
|
||||
}
|
||||
if (errors.length) process.exit();
|
||||
|
||||
// Check for missing
|
||||
for (const msg of requiredMessages) {
|
||||
if (!bundle._messages.has(msg)) {
|
||||
console.log(`missing key in ${lang}: ${msg}`);
|
||||
process.exitCode &= 0b100;
|
||||
continue;
|
||||
}
|
||||
|
||||
const data = en._messages.get(msg);
|
||||
const localAttributes = Object.keys(bundle._messages.get(msg).attributes);
|
||||
const missing = Object.keys(data.attributes).filter(
|
||||
(x) => !localAttributes.some((y) => x === y)
|
||||
);
|
||||
|
||||
if (missing.length) {
|
||||
console.log(`missing attributes in ${lang} of ${msg}: [${missing}]`);
|
||||
process.exitCode &= 0b1000;
|
||||
}
|
||||
}
|
||||
|
||||
// Check for extra
|
||||
for (const msg of bundle._messages.keys()) {
|
||||
if (!en._messages.has(msg)) {
|
||||
console.log(`extra key in ${lang}: ${msg}`);
|
||||
process.exitCode &= 0b10000;
|
||||
continue;
|
||||
}
|
||||
|
||||
const data = bundle._messages.get(msg);
|
||||
const localAttributes = Object.keys(en._messages.get(msg).attributes);
|
||||
const missing = Object.keys(data.attributes).filter(
|
||||
(x) => !localAttributes.some((y) => x === y)
|
||||
);
|
||||
|
||||
if (missing.length) {
|
||||
console.log(`extra attributes in ${lang} of ${msg}: [${missing}]`);
|
||||
process.exitCode &= 0b100000;
|
||||
}
|
||||
}
|
||||
}
|
||||
108
gui/scripts/convert-fluent.js
Executable file
108
gui/scripts/convert-fluent.js
Executable file
@@ -0,0 +1,108 @@
|
||||
#!/bin/node
|
||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||
const fs = require('fs');
|
||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||
const translation = require('./translation.json');
|
||||
|
||||
const sections = {
|
||||
websocket: 'Websocket status',
|
||||
tips: 'Tips',
|
||||
'body-part': 'Body parts',
|
||||
'skeleton-bone': 'Skeleton stuff',
|
||||
reset: 'Tracker reset buttons',
|
||||
'serial-detection': 'Serial detection stuff',
|
||||
navbar: 'Navigation bar',
|
||||
bvh: 'Bounding volume hierarchy recording',
|
||||
overlay: 'Overlay settings',
|
||||
tracker: {
|
||||
status: 'Tracker status',
|
||||
table: {
|
||||
column: 'Tracker status columns',
|
||||
},
|
||||
rotation: 'Tracker rotation',
|
||||
infos: 'Tracker information',
|
||||
settings: 'Tracker settings',
|
||||
'part-card': 'Tracker part card info',
|
||||
},
|
||||
'body-assignment-menu': 'Body assignment menu',
|
||||
'tracker-selection-menu': 'Tracker assignment menu',
|
||||
'mounting-selection-menu': 'Mounting menu',
|
||||
settings: {
|
||||
sidebar: 'Sidebar settings',
|
||||
general: {
|
||||
steamvr: 'SteamVR settings',
|
||||
'tracker-mechanics': 'Tracker mechanics',
|
||||
'fk-settings': 'FK settings',
|
||||
'gesture-control': 'Gesture control settings (tracker tapping)',
|
||||
interface: 'Interface settings',
|
||||
},
|
||||
serial: 'Serial settings',
|
||||
osc: {
|
||||
router: 'OSC router settings',
|
||||
vrchat: 'OSC VRChat settings',
|
||||
},
|
||||
},
|
||||
onboarding: {
|
||||
default: 'Setup/onboarding menu',
|
||||
'wifi-creds': 'WiFi setup',
|
||||
'reset-tutorial': 'Mounting setup',
|
||||
home: 'Setup start',
|
||||
'enter-vr': 'Enter VR part of setup',
|
||||
done: 'Setup done',
|
||||
'connect-tracker': 'Tracker connection setup',
|
||||
'assign-trackers': 'Tracker assignment setup',
|
||||
'manual-mounting': 'Tracker manual mounting setup',
|
||||
'automatic-mounting': 'Tracker automatic mounting setup',
|
||||
'manual-proportions': 'Tracker manual proportions setup',
|
||||
'automatic-proportions': 'Tracker automatic proportions setup',
|
||||
},
|
||||
home: 'Home',
|
||||
};
|
||||
|
||||
function goTo(obj, property) {
|
||||
const props = property.split('.');
|
||||
if (props.length === 1) {
|
||||
const prop = props.shift();
|
||||
if (typeof obj[prop] === 'string') {
|
||||
return obj[prop];
|
||||
} else if (obj[prop] && obj[prop].default) {
|
||||
return obj[prop].default;
|
||||
}
|
||||
} else {
|
||||
const prop = props.shift();
|
||||
if (obj[prop]) return goTo(obj[prop], props.join('.'));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function recurseObject(obj, prefix = '') {
|
||||
const array = [];
|
||||
let first = false;
|
||||
for (const prop in obj) {
|
||||
if (typeof obj[prop] === 'string') {
|
||||
if (!first) {
|
||||
first = true;
|
||||
const section = goTo(sections, prefix.slice(0, -1).replace(/\0/g, '.'));
|
||||
if (section) {
|
||||
array.push(`\n## ${section}`);
|
||||
}
|
||||
}
|
||||
|
||||
array.push(
|
||||
`${prefix.replace(/-/g, '_').replace(/\0/g, '-')}${prop
|
||||
.replace(/-/g, '_')
|
||||
.replace(/\./g, '-')} = ${obj[prop]
|
||||
.replace(/{{/g, '{ $')
|
||||
.replace(/}}/g, ' }')}`
|
||||
);
|
||||
} else {
|
||||
array.push(...recurseObject(obj[prop], `${prefix}${prop}\0`));
|
||||
}
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
fs.writeFileSync(
|
||||
'./translation.ftl',
|
||||
recurseObject(translation).join('\n').trim() + '\n'
|
||||
);
|
||||
@@ -1,154 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
// Do this as the first thing so that any code reading it knows the right env.
|
||||
process.env.BABEL_ENV = 'development';
|
||||
process.env.NODE_ENV = 'development';
|
||||
|
||||
// Makes the script crash on unhandled rejections instead of silently
|
||||
// ignoring them. In the future, promise rejections that are not handled will
|
||||
// terminate the Node.js process with a non-zero exit code.
|
||||
process.on('unhandledRejection', err => {
|
||||
throw err;
|
||||
});
|
||||
|
||||
// Ensure environment variables are read.
|
||||
require('../config/env');
|
||||
|
||||
const fs = require('fs');
|
||||
const chalk = require('react-dev-utils/chalk');
|
||||
const webpack = require('webpack');
|
||||
const WebpackDevServer = require('webpack-dev-server');
|
||||
const clearConsole = require('react-dev-utils/clearConsole');
|
||||
const checkRequiredFiles = require('react-dev-utils/checkRequiredFiles');
|
||||
const {
|
||||
choosePort,
|
||||
createCompiler,
|
||||
prepareProxy,
|
||||
prepareUrls,
|
||||
} = require('react-dev-utils/WebpackDevServerUtils');
|
||||
const openBrowser = require('react-dev-utils/openBrowser');
|
||||
const semver = require('semver');
|
||||
const paths = require('../config/paths');
|
||||
const configFactory = require('../config/webpack.config');
|
||||
const createDevServerConfig = require('../config/webpackDevServer.config');
|
||||
const getClientEnvironment = require('../config/env');
|
||||
const react = require(require.resolve('react', { paths: [paths.appPath] }));
|
||||
|
||||
const env = getClientEnvironment(paths.publicUrlOrPath.slice(0, -1));
|
||||
const useYarn = fs.existsSync(paths.yarnLockFile);
|
||||
const isInteractive = process.stdout.isTTY;
|
||||
|
||||
// Warn and crash if required files are missing
|
||||
if (!checkRequiredFiles([paths.appHtml, paths.appIndexJs])) {
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// Tools like Cloud9 rely on this.
|
||||
const DEFAULT_PORT = parseInt(process.env.PORT, 10) || 3000;
|
||||
const HOST = process.env.HOST || '0.0.0.0';
|
||||
|
||||
if (process.env.HOST) {
|
||||
console.log(
|
||||
chalk.cyan(
|
||||
`Attempting to bind to HOST environment variable: ${chalk.yellow(
|
||||
chalk.bold(process.env.HOST)
|
||||
)}`
|
||||
)
|
||||
);
|
||||
console.log(
|
||||
`If this was unintentional, check that you haven't mistakenly set it in your shell.`
|
||||
);
|
||||
console.log(
|
||||
`Learn more here: ${chalk.yellow('https://cra.link/advanced-config')}`
|
||||
);
|
||||
console.log();
|
||||
}
|
||||
|
||||
// We require that you explicitly set browsers and do not fall back to
|
||||
// browserslist defaults.
|
||||
const { checkBrowsers } = require('react-dev-utils/browsersHelper');
|
||||
checkBrowsers(paths.appPath, isInteractive)
|
||||
.then(() => {
|
||||
// We attempt to use the default port but if it is busy, we offer the user to
|
||||
// run on a different port. `choosePort()` Promise resolves to the next free port.
|
||||
return choosePort(HOST, DEFAULT_PORT);
|
||||
})
|
||||
.then(port => {
|
||||
if (port == null) {
|
||||
// We have not found a port.
|
||||
return;
|
||||
}
|
||||
|
||||
const config = configFactory('development');
|
||||
const protocol = process.env.HTTPS === 'true' ? 'https' : 'http';
|
||||
const appName = require(paths.appPackageJson).name;
|
||||
|
||||
const useTypeScript = fs.existsSync(paths.appTsConfig);
|
||||
const urls = prepareUrls(
|
||||
protocol,
|
||||
HOST,
|
||||
port,
|
||||
paths.publicUrlOrPath.slice(0, -1)
|
||||
);
|
||||
// Create a webpack compiler that is configured with custom messages.
|
||||
const compiler = createCompiler({
|
||||
appName,
|
||||
config,
|
||||
urls,
|
||||
useYarn,
|
||||
useTypeScript,
|
||||
webpack,
|
||||
});
|
||||
// Load proxy config
|
||||
const proxySetting = require(paths.appPackageJson).proxy;
|
||||
const proxyConfig = prepareProxy(
|
||||
proxySetting,
|
||||
paths.appPublic,
|
||||
paths.publicUrlOrPath
|
||||
);
|
||||
// Serve webpack assets generated by the compiler over a web server.
|
||||
const serverConfig = {
|
||||
...createDevServerConfig(proxyConfig, urls.lanUrlForConfig),
|
||||
host: HOST,
|
||||
port,
|
||||
};
|
||||
const devServer = new WebpackDevServer(serverConfig, compiler);
|
||||
// Launch WebpackDevServer.
|
||||
devServer.startCallback(() => {
|
||||
if (isInteractive) {
|
||||
clearConsole();
|
||||
}
|
||||
|
||||
if (env.raw.FAST_REFRESH && semver.lt(react.version, '16.10.0')) {
|
||||
console.log(
|
||||
chalk.yellow(
|
||||
`Fast Refresh requires React 16.10 or higher. You are using React ${react.version}.`
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
console.log(chalk.cyan('Starting the development server...\n'));
|
||||
openBrowser(urls.localUrlForBrowser);
|
||||
});
|
||||
|
||||
['SIGINT', 'SIGTERM'].forEach(function (sig) {
|
||||
process.on(sig, function () {
|
||||
devServer.close();
|
||||
process.exit();
|
||||
});
|
||||
});
|
||||
|
||||
if (process.env.CI !== 'true') {
|
||||
// Gracefully exit when stdin ends
|
||||
process.stdin.on('end', function () {
|
||||
devServer.close();
|
||||
process.exit();
|
||||
});
|
||||
}
|
||||
})
|
||||
.catch(err => {
|
||||
if (err && err.message) {
|
||||
console.log(err.message);
|
||||
}
|
||||
process.exit(1);
|
||||
});
|
||||
@@ -1,52 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
// Do this as the first thing so that any code reading it knows the right env.
|
||||
process.env.BABEL_ENV = 'test';
|
||||
process.env.NODE_ENV = 'test';
|
||||
process.env.PUBLIC_URL = '';
|
||||
|
||||
// Makes the script crash on unhandled rejections instead of silently
|
||||
// ignoring them. In the future, promise rejections that are not handled will
|
||||
// terminate the Node.js process with a non-zero exit code.
|
||||
process.on('unhandledRejection', err => {
|
||||
throw err;
|
||||
});
|
||||
|
||||
// Ensure environment variables are read.
|
||||
require('../config/env');
|
||||
|
||||
const jest = require('jest');
|
||||
const execSync = require('child_process').execSync;
|
||||
let argv = process.argv.slice(2);
|
||||
|
||||
function isInGitRepository() {
|
||||
try {
|
||||
execSync('git rev-parse --is-inside-work-tree', { stdio: 'ignore' });
|
||||
return true;
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function isInMercurialRepository() {
|
||||
try {
|
||||
execSync('hg --cwd . root', { stdio: 'ignore' });
|
||||
return true;
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Watch unless on CI or explicitly running all tests
|
||||
if (
|
||||
!process.env.CI &&
|
||||
argv.indexOf('--watchAll') === -1 &&
|
||||
argv.indexOf('--watchAll=false') === -1
|
||||
) {
|
||||
// https://github.com/facebook/create-react-app/issues/5210
|
||||
const hasSourceControl = isInGitRepository() || isInMercurialRepository();
|
||||
argv.push(hasSourceControl ? '--watch' : '--watchAll');
|
||||
}
|
||||
|
||||
|
||||
jest.run(argv);
|
||||
1
gui/src-tauri/.gitignore
vendored
1
gui/src-tauri/.gitignore
vendored
@@ -2,3 +2,4 @@
|
||||
# will have compiled files and executables
|
||||
/target/
|
||||
WixTools
|
||||
src/JavaVersion.class
|
||||
|
||||
4067
gui/src-tauri/Cargo.lock
generated
4067
gui/src-tauri/Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -1,12 +1,14 @@
|
||||
[package]
|
||||
name = "slimevr_ui"
|
||||
version = "0.1.0"
|
||||
name = "slimevr"
|
||||
version = "0.0.0"
|
||||
|
||||
description = "SlimeVR GUI Application"
|
||||
license = "MIT OR Apache-2.0"
|
||||
repository = ""
|
||||
default-run = "slimevr_ui"
|
||||
repository = "https://github.com/SlimeVR/SlimeVR-Server"
|
||||
|
||||
edition = "2021"
|
||||
rust-version = "1.59"
|
||||
rust-version = "1.65"
|
||||
default-run = "slimevr"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
@@ -19,16 +21,28 @@ default = ["custom-protocol"]
|
||||
custom-protocol = ["tauri/custom-protocol"]
|
||||
|
||||
[build-dependencies]
|
||||
tauri-build = { version = "1", features = [] }
|
||||
tauri-build = { version = "1.2", features = [] }
|
||||
cfg_aliases = "0.1"
|
||||
shadow-rs = "0.20"
|
||||
|
||||
[dependencies]
|
||||
serde_json = "1"
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
tauri = { version = "1.1.1", features = ["cli", "devtools", "fs-all", "path-all", "shell-execute", "window-close", "window-maximize", "window-minimize", "window-set-resizable", "window-set-title", "window-start-dragging", "window-unmaximize", "window-unminimize"] }
|
||||
tauri = { version = "1.2", features = ["devtools", "dialog", "fs-all", "path-all", "shell-execute", "window-close", "window-maximize", "window-minimize", "window-set-resizable", "window-set-title", "window-start-dragging", "window-unmaximize", "window-unminimize"] }
|
||||
pretty_env_logger = "0.4"
|
||||
log = "0.4"
|
||||
clap-verbosity-flag = "1"
|
||||
tauri-plugin-window-state = "0.1.0"
|
||||
clap = { version = "4.0.29", features = ["derive"] }
|
||||
clap-verbosity-flag = "2"
|
||||
tauri-plugin-window-state = { git = "https://github.com/tauri-apps/tauri-plugin-window-state", rev = "refs/pull/52/head" }
|
||||
rand = "0.8.5"
|
||||
tempfile = "3"
|
||||
which = "4.3"
|
||||
glob = "0.3"
|
||||
open = "3"
|
||||
shadow-rs = { version = "0.20", default-features = false }
|
||||
const_format = "0.2.30"
|
||||
cfg-if = "1"
|
||||
|
||||
[target.'cfg(windows)'.dependencies]
|
||||
win32job = "1"
|
||||
winreg = "0.10.1"
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
fn main() {
|
||||
tauri_build::build()
|
||||
use cfg_aliases::cfg_aliases;
|
||||
|
||||
fn main() -> shadow_rs::SdResult<()> {
|
||||
tauri_build::build();
|
||||
cfg_aliases! {
|
||||
mobile: { any(target_os = "ios", target_os = "android") },
|
||||
desktop: { not(any(target_os = "ios", target_os = "android")) }
|
||||
}
|
||||
shadow_rs::new()
|
||||
}
|
||||
|
||||
BIN
gui/src-tauri/icons/icon.png
Normal file
BIN
gui/src-tauri/icons/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 7.5 KiB |
BIN
gui/src-tauri/src/JavaVersion.jar
Normal file
BIN
gui/src-tauri/src/JavaVersion.jar
Normal file
Binary file not shown.
8
gui/src-tauri/src/JavaVersion.java
Normal file
8
gui/src-tauri/src/JavaVersion.java
Normal file
@@ -0,0 +1,8 @@
|
||||
public class JavaVersion {
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
var version = Runtime.version().version().get(0);
|
||||
System.exit(version);
|
||||
}
|
||||
}
|
||||
@@ -1,127 +1,327 @@
|
||||
#![cfg_attr(
|
||||
all(not(debug_assertions), target_os = "windows"),
|
||||
windows_subsystem = "windows"
|
||||
)]
|
||||
#![cfg_attr(all(not(debug_assertions), windows), windows_subsystem = "windows")]
|
||||
use std::env;
|
||||
use std::ffi::{OsStr, OsString};
|
||||
use std::io::Write;
|
||||
#[cfg(windows)]
|
||||
use std::os::windows::process::CommandExt;
|
||||
use std::panic;
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::process::{Child, Stdio};
|
||||
|
||||
use clap::Parser;
|
||||
use clap_verbosity_flag::{InfoLevel, Verbosity};
|
||||
use std::env;
|
||||
use std::path::PathBuf;
|
||||
use tauri::api::clap;
|
||||
use const_format::concatcp;
|
||||
use rand::{seq::SliceRandom, thread_rng};
|
||||
use shadow_rs::shadow;
|
||||
use tauri::api::process::Command;
|
||||
use tauri::Manager;
|
||||
use tempfile::Builder;
|
||||
|
||||
#[derive(Parser)]
|
||||
#[clap(version, about)]
|
||||
#[cfg(windows)]
|
||||
/// For Commands on Windows so they dont create terminals
|
||||
const CREATE_NO_WINDOW: u32 = 0x0800_0000;
|
||||
/// It's an i32 because we check it through exit codes of the process
|
||||
const MINIMUM_JAVA_VERSION: i32 = 17;
|
||||
const JAVA_BIN: &str = if cfg!(windows) { "java.exe" } else { "java" };
|
||||
static POSSIBLE_TITLES: &[&str] = &[
|
||||
"Panicking situation",
|
||||
"looking for spatula",
|
||||
"never gonna give you up",
|
||||
"never gonna let you down",
|
||||
"uwu sowwy",
|
||||
];
|
||||
shadow!(build);
|
||||
// Tauri has a way to return the package.json version, but it's not a constant...
|
||||
const VERSION: &str = if build::TAG.is_empty() {
|
||||
build::SHORT_COMMIT
|
||||
} else {
|
||||
build::TAG
|
||||
};
|
||||
const MODIFIED: &str = if build::GIT_CLEAN { "" } else { "-dirty" };
|
||||
|
||||
#[derive(Debug, Parser)]
|
||||
#[clap(
|
||||
version = concatcp!(VERSION, MODIFIED),
|
||||
about
|
||||
)]
|
||||
struct Cli {
|
||||
#[clap(short, long)]
|
||||
display_console: bool,
|
||||
#[clap(long)]
|
||||
launch_from_path: Option<PathBuf>,
|
||||
#[clap(flatten)]
|
||||
verbosity: Verbosity<InfoLevel>,
|
||||
#[clap(short, long)]
|
||||
display_console: bool,
|
||||
#[clap(long)]
|
||||
launch_from_path: Option<PathBuf>,
|
||||
#[clap(flatten)]
|
||||
verbose: clap_verbosity_flag::Verbosity,
|
||||
}
|
||||
|
||||
fn is_valid_path(path: &PathBuf) -> bool {
|
||||
|
||||
let java_folder = path.join("jre");
|
||||
let server_path = path.join("slimevr.jar");
|
||||
|
||||
return java_folder.exists() && server_path.exists();
|
||||
fn is_valid_path(path: &Path) -> bool {
|
||||
path.join("slimevr.jar").exists()
|
||||
}
|
||||
|
||||
fn get_launch_path(cli: Cli) -> Option<PathBuf> {
|
||||
let mut path = cli.launch_from_path.unwrap_or_default();
|
||||
if path.exists() && is_valid_path(&path) {
|
||||
return Some(path);
|
||||
}
|
||||
let paths = [
|
||||
cli.launch_from_path,
|
||||
// AppImage passes the fakeroot in `APPDIR` env var.
|
||||
env::var_os("APPDIR").map(|x| PathBuf::from(x)),
|
||||
env::current_dir().ok(),
|
||||
Some(PathBuf::from(env!("CARGO_MANIFEST_DIR"))),
|
||||
// For flatpak container
|
||||
Some(PathBuf::from("/app/share/slimevr/")),
|
||||
Some(PathBuf::from("/usr/share/slimevr/")),
|
||||
];
|
||||
paths
|
||||
.into_iter()
|
||||
.filter_map(|x| x)
|
||||
.find(|x| is_valid_path(x))
|
||||
}
|
||||
|
||||
path = env::current_dir().unwrap();
|
||||
if path.exists() && is_valid_path(&path) {
|
||||
return Some(path);
|
||||
}
|
||||
|
||||
path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
|
||||
if path.exists() && is_valid_path(&path) {
|
||||
return Some(path);
|
||||
}
|
||||
|
||||
None
|
||||
fn spawn_java(java: &OsStr, java_version: &OsStr) -> std::io::Result<Child> {
|
||||
let mut cmd = std::process::Command::new(java);
|
||||
|
||||
#[cfg(windows)]
|
||||
cmd.creation_flags(CREATE_NO_WINDOW);
|
||||
|
||||
cmd.arg("-jar")
|
||||
.arg(java_version)
|
||||
.stdin(Stdio::null())
|
||||
.stderr(Stdio::null())
|
||||
.stdout(Stdio::null())
|
||||
.spawn()
|
||||
}
|
||||
|
||||
#[cfg(desktop)]
|
||||
fn show_error(text: &str) -> bool {
|
||||
use tauri::api::dialog::{
|
||||
blocking::MessageDialogBuilder, MessageDialogButtons, MessageDialogKind,
|
||||
};
|
||||
|
||||
MessageDialogBuilder::new(
|
||||
format!(
|
||||
"SlimeVR GUI crashed - {}",
|
||||
POSSIBLE_TITLES.choose(&mut thread_rng()).unwrap()
|
||||
),
|
||||
text,
|
||||
)
|
||||
.buttons(MessageDialogButtons::Ok)
|
||||
.kind(MessageDialogKind::Error)
|
||||
.show()
|
||||
}
|
||||
|
||||
#[cfg(mobile)]
|
||||
fn show_error(text: &str) -> bool {
|
||||
// needs to do native stuff on mobile
|
||||
false
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let cli = Cli::parse();
|
||||
// Make an error dialog box when panicking
|
||||
panic::set_hook(Box::new(|panic_info| {
|
||||
println!("{}", panic_info);
|
||||
show_error(&panic_info.to_string());
|
||||
}));
|
||||
|
||||
// Set up loggers and global handlers
|
||||
{
|
||||
if std::env::var_os("RUST_LOG").is_none() {
|
||||
std::env::set_var("RUST_LOG", "info")
|
||||
}
|
||||
pretty_env_logger::init();
|
||||
}
|
||||
let cli = Cli::parse();
|
||||
|
||||
// Ensure child processes die when spawned on windows
|
||||
#[cfg(target_os = "windows")]
|
||||
{
|
||||
use win32job::{ExtendedLimitInfo, Job};
|
||||
// Set up loggers and global handlers
|
||||
{
|
||||
if std::env::var_os("RUST_LOG").is_none() {
|
||||
std::env::set_var("RUST_LOG", "info")
|
||||
}
|
||||
pretty_env_logger::init();
|
||||
}
|
||||
|
||||
let mut info = ExtendedLimitInfo::new();
|
||||
info.limit_kill_on_job_close();
|
||||
let job = Job::create_with_limit_info(&mut info).expect("Failed to create Job");
|
||||
job.assign_current_process()
|
||||
.expect("Failed to assign current process to Job");
|
||||
// Ensure child processes die when spawned on windows
|
||||
// and then check for WebView2's existence
|
||||
#[cfg(windows)]
|
||||
{
|
||||
use win32job::{ExtendedLimitInfo, Job};
|
||||
|
||||
// We don't do anything with the job anymore, but we shouldn't drop it because that would
|
||||
// terminate our process tree. So we intentionally leak it instead.
|
||||
std::mem::forget(job);
|
||||
}
|
||||
let mut info = ExtendedLimitInfo::new();
|
||||
info.limit_kill_on_job_close();
|
||||
let job = Job::create_with_limit_info(&mut info).expect("Failed to create Job");
|
||||
job.assign_current_process()
|
||||
.expect("Failed to assign current process to Job");
|
||||
|
||||
// Spawn server process
|
||||
let run_path = get_launch_path(cli);
|
||||
// We don't do anything with the job anymore, but we shouldn't drop it because that would
|
||||
// terminate our process tree. So we intentionally leak it instead.
|
||||
std::mem::forget(job);
|
||||
|
||||
let stdout_recv = if let Some(p) = run_path {
|
||||
log::info!("Server found on path: {}", p.to_str().unwrap());
|
||||
|
||||
let java_folder = p.join("jre");
|
||||
let (recv, _child) = Command::new(java_folder.join("bin/java").to_str().unwrap())
|
||||
.current_dir(p)
|
||||
.args(["-Xmx512M", "-jar", "slimevr.jar", "--no-gui"])
|
||||
.spawn()
|
||||
.expect("Unable to start the server jar");
|
||||
Some(recv)
|
||||
} else {
|
||||
log::warn!("No server found. We will not start the server.");
|
||||
None
|
||||
};
|
||||
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,
|
||||
};
|
||||
|
||||
tauri::Builder::default()
|
||||
.plugin(tauri_plugin_window_state::Builder::default().build())
|
||||
.setup(|app| {
|
||||
if let Some(mut recv) = stdout_recv {
|
||||
let app_handle = app.app_handle();
|
||||
tauri::async_runtime::spawn(async move {
|
||||
use tauri::api::process::CommandEvent;
|
||||
let confirm = MessageDialogBuilder::new("SlimeVR", "Couldn't find WebView2 installed. You can install it with the SlimeVR installer")
|
||||
.buttons(MessageDialogButtons::OkCancel)
|
||||
.kind(MessageDialogKind::Error)
|
||||
.show();
|
||||
if confirm {
|
||||
open::that("https://docs.slimevr.dev/server-setup/installing-and-connecting.html#install-the-latest-slimevr-installer").unwrap();
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
while let Some(cmd_event) = recv.recv().await {
|
||||
let emit_me = match cmd_event {
|
||||
CommandEvent::Stderr(s) => ("stderr", s),
|
||||
CommandEvent::Stdout(s) => ("stdout", s),
|
||||
CommandEvent::Error(s) => ("error", s),
|
||||
CommandEvent::Terminated(s) => ("terminated", format!("{s:?}")),
|
||||
_ => ("other", "".to_string()),
|
||||
};
|
||||
app_handle
|
||||
.emit_all("server-status", emit_me)
|
||||
.expect("Failed to emit");
|
||||
}
|
||||
app_handle
|
||||
.emit_all("server-status", ("other", "receiver cancelled"))
|
||||
.expect("Failed to emit");
|
||||
});
|
||||
}
|
||||
Ok(())
|
||||
})
|
||||
//
|
||||
.run(tauri::generate_context!())
|
||||
.expect("error while running tauri application");
|
||||
// Spawn server process
|
||||
let run_path = get_launch_path(cli);
|
||||
|
||||
let stdout_recv = if let Some(p) = run_path {
|
||||
log::info!("Server found on path: {}", p.to_str().unwrap());
|
||||
|
||||
// Check if any Java already installed is compatible
|
||||
let jre = p.join("jre/bin").join(JAVA_BIN);
|
||||
let java_bin = jre
|
||||
.exists()
|
||||
.then(|| jre.into_os_string())
|
||||
.or_else(|| valid_java_paths().first().map(|x| x.0.to_owned()));
|
||||
let Some(java_bin) = java_bin else {
|
||||
show_error(&format!("Couldn't find a compatible Java version, please download Java {} or higher", MINIMUM_JAVA_VERSION));
|
||||
return;
|
||||
};
|
||||
|
||||
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", "--no-gui"])
|
||||
.spawn()
|
||||
.expect("Unable to start the server jar");
|
||||
Some(recv)
|
||||
} else {
|
||||
log::warn!("No server found. We will not start the server.");
|
||||
None
|
||||
};
|
||||
|
||||
let builder = tauri::Builder::default();
|
||||
#[cfg(not(target_os = "macos"))]
|
||||
let builder = builder.plugin(tauri_plugin_window_state::Builder::default().build());
|
||||
builder
|
||||
.setup(|app| {
|
||||
if let Some(mut recv) = stdout_recv {
|
||||
let app_handle = app.app_handle();
|
||||
tauri::async_runtime::spawn(async move {
|
||||
use tauri::api::process::CommandEvent;
|
||||
|
||||
while let Some(cmd_event) = recv.recv().await {
|
||||
let emit_me = match cmd_event {
|
||||
CommandEvent::Stderr(s) => ("stderr", s),
|
||||
CommandEvent::Stdout(s) => ("stdout", s),
|
||||
CommandEvent::Error(s) => ("error", s),
|
||||
CommandEvent::Terminated(s) => {
|
||||
("terminated", format!("{s:?}"))
|
||||
}
|
||||
_ => ("other", "".to_string()),
|
||||
};
|
||||
app_handle
|
||||
.emit_all("server-status", emit_me)
|
||||
.expect("Failed to emit");
|
||||
}
|
||||
log::error!("Java server receiver died");
|
||||
app_handle
|
||||
.emit_all("server-status", ("other", "receiver cancelled"))
|
||||
.expect("Failed to emit");
|
||||
});
|
||||
}
|
||||
Ok(())
|
||||
})
|
||||
//
|
||||
.run(tauri::generate_context!())
|
||||
.expect("error while running tauri application");
|
||||
}
|
||||
|
||||
#[cfg(windows)]
|
||||
/// Check if WebView2 exists
|
||||
fn webview2_exists() -> bool {
|
||||
use winreg::enums::*;
|
||||
use winreg::RegKey;
|
||||
|
||||
// First on the machine itself
|
||||
let machine: Option<String> = RegKey::predef(HKEY_LOCAL_MACHINE)
|
||||
.open_subkey(r"SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}")
|
||||
.map(|r| r.get_value("pv").ok()).ok().flatten();
|
||||
let mut exists = false;
|
||||
if let Some(version) = machine {
|
||||
exists = version.split('.').any(|x| x != "0");
|
||||
}
|
||||
// Then in the current user
|
||||
if !exists {
|
||||
let user: Option<String> = RegKey::predef(HKEY_CURRENT_USER)
|
||||
.open_subkey(
|
||||
r"Software\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}",
|
||||
)
|
||||
.map(|r| r.get_value("pv").ok())
|
||||
.ok()
|
||||
.flatten();
|
||||
if let Some(version) = user {
|
||||
exists = version.split('.').any(|x| x != "0");
|
||||
}
|
||||
}
|
||||
exists
|
||||
}
|
||||
|
||||
fn valid_java_paths() -> Vec<(OsString, i32)> {
|
||||
let mut file = Builder::new()
|
||||
.suffix(".jar")
|
||||
.tempfile()
|
||||
.expect("Couldn't generate .jar file");
|
||||
file.write_all(include_bytes!("JavaVersion.jar"))
|
||||
.expect("Couldn't write to .jar file");
|
||||
let java_version = file.into_temp_path();
|
||||
|
||||
// Check if main Java is a supported version
|
||||
let main_java = if let Ok(java_home) = std::env::var("JAVA_HOME") {
|
||||
PathBuf::from(java_home)
|
||||
.join("bin")
|
||||
.join(JAVA_BIN)
|
||||
.into_os_string()
|
||||
} else {
|
||||
JAVA_BIN.into()
|
||||
};
|
||||
if let Some(main_child) = spawn_java(&main_java, java_version.as_os_str())
|
||||
.expect("Couldn't spawn the main Java binary")
|
||||
.wait()
|
||||
.expect("Couldn't execute the main Java binary")
|
||||
.code()
|
||||
{
|
||||
if main_child >= MINIMUM_JAVA_VERSION {
|
||||
return vec![(main_java, main_child)];
|
||||
}
|
||||
}
|
||||
|
||||
// Otherwise check if anything else is a supported version
|
||||
let mut childs = vec![];
|
||||
cfg_if::cfg_if! {
|
||||
if #[cfg(target_os = "macos")] {
|
||||
// TODO: Actually use macOS paths
|
||||
let libs = which::which_all(JAVA_BIN).unwrap();
|
||||
} else if #[cfg(unix)] {
|
||||
// Linux JVMs are saved on /usr/lib/jvm from what I found out,
|
||||
// there is usually a default dir and a default-runtime dir also which are linked
|
||||
// to the current default runtime and the current default JDK (I think it's JDK)
|
||||
let libs = glob::glob(concatcp!("/usr/lib/jvm/*/bin/", JAVA_BIN))
|
||||
.unwrap()
|
||||
.filter_map(|res| res.ok());
|
||||
} else {
|
||||
let libs = which::which_all(JAVA_BIN).unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
for java in libs {
|
||||
let res = spawn_java(java.as_os_str(), java_version.as_os_str());
|
||||
|
||||
match res {
|
||||
Ok(child) => childs.push((java.into_os_string(), child)),
|
||||
Err(e) => println!("Error on trying to spawn a Java executable: {}", e),
|
||||
}
|
||||
}
|
||||
|
||||
childs
|
||||
.into_iter()
|
||||
.filter_map(|(p, mut c)| {
|
||||
c.wait()
|
||||
.expect("Failed on executing a Java executable")
|
||||
.code()
|
||||
.map(|code| (p, code))
|
||||
.filter(|(_p, code)| *code >= MINIMUM_JAVA_VERSION)
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"package": {
|
||||
"productName": "slimevr-ui",
|
||||
"version": "0.1.0"
|
||||
"productName": "slimevr",
|
||||
"version": "../package.json"
|
||||
},
|
||||
"build": {
|
||||
"distDir": "../build",
|
||||
"devPath": "http://localhost:3000",
|
||||
"distDir": "../dist",
|
||||
"devPath": "http://localhost:5173",
|
||||
"beforeDevCommand": "npm run start",
|
||||
"beforeBuildCommand": "npm run build"
|
||||
},
|
||||
@@ -14,7 +14,7 @@
|
||||
"active": true,
|
||||
"targets": "all",
|
||||
"identifier": "slimevr.dev",
|
||||
"icon": ["icons/icon.ico"],
|
||||
"icon": ["icons/icon.ico", "icons/icon.png"],
|
||||
"resources": [],
|
||||
"externalBin": [],
|
||||
"copyright": "",
|
||||
@@ -22,14 +22,18 @@
|
||||
"shortDescription": "",
|
||||
"longDescription": "",
|
||||
"deb": {
|
||||
"depends": []
|
||||
"depends": ["openjdk-17-jre-headless"],
|
||||
"files": {
|
||||
"/usr/share/slimevr/slimevr.jar": "../../server/build/libs/slimevr.jar"
|
||||
}
|
||||
},
|
||||
"macOS": {
|
||||
"frameworks": [],
|
||||
"exceptionDomain": "",
|
||||
"exceptionDomain": "localhost",
|
||||
"signingIdentity": null,
|
||||
"providerShortName": null,
|
||||
"entitlements": null
|
||||
"entitlements": null,
|
||||
"license": "../../LICENSE-MIT"
|
||||
},
|
||||
"windows": {
|
||||
"certificateThumbprint": null,
|
||||
@@ -65,7 +69,7 @@
|
||||
},
|
||||
"windows": [
|
||||
{
|
||||
"title": "Slimevr UI",
|
||||
"title": "SlimeVR",
|
||||
"width": 1289,
|
||||
"height": 709,
|
||||
"minWidth": 880,
|
||||
@@ -75,12 +79,13 @@
|
||||
"decorations": false,
|
||||
"transparent": false,
|
||||
"fileDropEnabled": false,
|
||||
"visible": true
|
||||
"visible": true,
|
||||
"hiddenTitle": true,
|
||||
"tabbingIdentifier": "slimevr"
|
||||
}
|
||||
],
|
||||
"security": {
|
||||
"csp": null
|
||||
},
|
||||
"cli": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,42 +1,51 @@
|
||||
import { useEffect } from 'react';
|
||||
import {
|
||||
BrowserRouter as Router,
|
||||
Outlet,
|
||||
Route,
|
||||
Routes,
|
||||
} from 'react-router-dom';
|
||||
import { Home } from './components/home/Home';
|
||||
import { MainLayoutRoute } from './components/MainLayout';
|
||||
import { AppContextProvider } from './components/providers/AppContext';
|
||||
import { GeneralSettings } from './components/settings/pages/GeneralSettings';
|
||||
import { Serial } from './components/settings/pages/Serial';
|
||||
import { SettingsLayoutRoute } from './components/settings/SettingsLayout';
|
||||
import {
|
||||
useProvideWebsocketApi,
|
||||
WebSocketApiContext,
|
||||
} from './hooks/websocket-api';
|
||||
import {
|
||||
BrowserRouter as Router,
|
||||
Routes,
|
||||
Route,
|
||||
Outlet,
|
||||
} from 'react-router-dom';
|
||||
import { Home } from './components/home/Home';
|
||||
import { AppContextProvider } from './components/providers/AppContext';
|
||||
import { useEffect } from 'react';
|
||||
import { MainLayoutRoute } from './components/MainLayout';
|
||||
import { SettingsLayoutRoute } from './components/settings/SettingsLayout';
|
||||
import { GeneralSettings } from './components/settings/pages/GeneralSettings';
|
||||
import { Serial } from './components/settings/pages/Serial';
|
||||
|
||||
import { Event, listen } from '@tauri-apps/api/event';
|
||||
import { TopBar } from './components/TopBar';
|
||||
import { ConfigContextProvider } from './components/providers/ConfigContext';
|
||||
import { OnboardingLayout } from './components/onboarding/OnboardingLayout';
|
||||
import { HomePage } from './components/onboarding/pages/Home';
|
||||
import { WifiCredsPage } from './components/onboarding/pages/WifiCreds';
|
||||
import { ConnectTrackersPage } from './components/onboarding/pages/ConnectTracker';
|
||||
import { OnboardingContextProvider } from './components/onboarding/OnboardingContextProvicer';
|
||||
import { TrackersAssignPage } from './components/onboarding/pages/trackers-assign/TrackerAssignment';
|
||||
import { OnboardingLayout } from './components/onboarding/OnboardingLayout';
|
||||
import { AutomaticProportionsPage } from './components/onboarding/pages/body-proportions/AutomaticProportions';
|
||||
import { ManualProportionsPage } from './components/onboarding/pages/body-proportions/ManualProportions';
|
||||
import { ConnectTrackersPage } from './components/onboarding/pages/ConnectTracker';
|
||||
import { DonePage } from './components/onboarding/pages/Done';
|
||||
import { EnterVRPage } from './components/onboarding/pages/EnterVR';
|
||||
import { HomePage } from './components/onboarding/pages/Home';
|
||||
import { AutomaticMountingPage } from './components/onboarding/pages/mounting/AutomaticMounting';
|
||||
import { ManualMountingPage } from './components/onboarding/pages/mounting/ManualMounting';
|
||||
import { ResetTutorialPage } from './components/onboarding/pages/ResetTutorial';
|
||||
import { AutomaticProportionsPage } from './components/onboarding/pages/body-proportions/AutomaticProportions';
|
||||
import { ManualProportionsPage } from './components/onboarding/pages/body-proportions/ManualProportions';
|
||||
import { TrackersAssignPage } from './components/onboarding/pages/trackers-assign/TrackerAssignment';
|
||||
import { WifiCredsPage } from './components/onboarding/pages/WifiCreds';
|
||||
import { ConfigContextProvider } from './components/providers/ConfigContext';
|
||||
import { SerialDetectionModal } from './components/SerialDetectionModal';
|
||||
import { VRCOSCSettings } from './components/settings/pages/VRCOSCSettings';
|
||||
import { TopBar } from './components/TopBar';
|
||||
import { TrackerSettingsPage } from './components/tracker/TrackerSettings';
|
||||
import { DonePage } from './components/onboarding/pages/Done';
|
||||
import { useConfig } from './hooks/config';
|
||||
import { OSCRouterSettings } from './components/settings/pages/OSCRouterSettings';
|
||||
import { useLocalization } from '@fluent/react';
|
||||
|
||||
function Layout() {
|
||||
const { loading } = useConfig();
|
||||
if (loading) return <></>;
|
||||
|
||||
return (
|
||||
<>
|
||||
<SerialDetectionModal></SerialDetectionModal>
|
||||
<Routes>
|
||||
<Route
|
||||
path="/"
|
||||
@@ -64,6 +73,8 @@ function Layout() {
|
||||
>
|
||||
<Route path="trackers" element={<GeneralSettings />} />
|
||||
<Route path="serial" element={<Serial />} />
|
||||
<Route path="osc/router" element={<OSCRouterSettings />} />
|
||||
<Route path="osc/vrchat" element={<VRCOSCSettings />} />
|
||||
</Route>
|
||||
<Route
|
||||
path="/onboarding"
|
||||
@@ -97,8 +108,9 @@ function Layout() {
|
||||
);
|
||||
}
|
||||
|
||||
function App() {
|
||||
export default function App() {
|
||||
const websocketAPI = useProvideWebsocketApi();
|
||||
const { l10n } = useLocalization();
|
||||
|
||||
useEffect(() => {
|
||||
const unlisten = listen(
|
||||
@@ -152,9 +164,9 @@ function App() {
|
||||
<>
|
||||
<TopBar></TopBar>
|
||||
<div className="flex w-full h-full justify-center items-center p-2">
|
||||
{websocketAPI.isFistConnection
|
||||
? 'Connecting to the server'
|
||||
: 'Connection lost to the server. Trying to reconnect...'}
|
||||
{websocketAPI.isFirstConnection
|
||||
? l10n.getString('websocket-connecting')
|
||||
: l10n.getString('websocket-connection_lost')}
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
@@ -168,5 +180,3 @@ function App() {
|
||||
</Router>
|
||||
);
|
||||
}
|
||||
|
||||
export default App;
|
||||
|
||||
@@ -1,12 +1,16 @@
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { useState } from 'react';
|
||||
import { RpcMessage } from 'solarxr-protocol';
|
||||
import { RecordBVHRequestT } from 'solarxr-protocol/protocol/typescript/dist/solarxr-protocol/rpc/record-bvhrequest';
|
||||
import { RecordBVHStatusT } from 'solarxr-protocol/protocol/typescript/dist/solarxr-protocol/rpc/record-bvhstatus';
|
||||
import {
|
||||
RecordBVHRequestT,
|
||||
RecordBVHStatusT,
|
||||
RpcMessage,
|
||||
} from 'solarxr-protocol';
|
||||
import { useWebsocketAPI } from '../hooks/websocket-api';
|
||||
import { BigButton } from './commons/BigButton';
|
||||
import { RecordIcon } from './commons/icon/RecordIcon';
|
||||
|
||||
export function BVHButton() {
|
||||
const { l10n } = useLocalization();
|
||||
const { useRPCPacket, sendRPCPacket } = useWebsocketAPI();
|
||||
const [recording, setRecording] = useState(false);
|
||||
|
||||
@@ -22,7 +26,7 @@ export function BVHButton() {
|
||||
|
||||
return (
|
||||
<BigButton
|
||||
text={recording ? 'Recording...' : 'Record BVH'}
|
||||
text={l10n.getString(recording ? 'bvh-recording' : 'bvh-start_recording')}
|
||||
icon={<RecordIcon width={20} />}
|
||||
onClick={toggleBVH}
|
||||
></BigButton>
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
import classNames from 'classnames';
|
||||
import { ReactNode } from 'react';
|
||||
import { ResetType } from 'solarxr-protocol';
|
||||
import { useConfig } from '../hooks/config';
|
||||
import { useLayout } from '../hooks/layout';
|
||||
import { BVHButton } from './BVHButton';
|
||||
import { Navbar } from './Navbar';
|
||||
import { ResetButton } from './home/ResetButton';
|
||||
import { Navbar } from './Navbar';
|
||||
import { TopBar } from './TopBar';
|
||||
import classNames from 'classnames';
|
||||
import { DeveloperModeWidget } from './widgets/DeveloperModeWidget';
|
||||
import { OverlayWidget } from './widgets/OverlayWidget';
|
||||
|
||||
export function MainLayoutRoute({
|
||||
@@ -19,6 +21,7 @@ export function MainLayoutRoute({
|
||||
}) {
|
||||
const { layoutHeight, ref } = useLayout<HTMLDivElement>();
|
||||
const { layoutWidth, ref: refw } = useLayout<HTMLDivElement>();
|
||||
const { config } = useConfig();
|
||||
|
||||
return (
|
||||
<>
|
||||
@@ -42,14 +45,28 @@ export function MainLayoutRoute({
|
||||
{widgets && (
|
||||
<div className="flex flex-col px-2 min-w-[274px] w-[274px] gap-2 pt-2 rounded-xl overflow-y-auto bg-background-70">
|
||||
<div className="grid grid-cols-2 gap-2 w-full">
|
||||
<ResetButton type={ResetType.Quick}></ResetButton>
|
||||
<ResetButton type={ResetType.Full}></ResetButton>
|
||||
<ResetButton type={ResetType.Mounting}></ResetButton>
|
||||
<ResetButton
|
||||
type={ResetType.Quick}
|
||||
variant="big"
|
||||
></ResetButton>
|
||||
<ResetButton
|
||||
type={ResetType.Full}
|
||||
variant="big"
|
||||
></ResetButton>
|
||||
<ResetButton
|
||||
type={ResetType.Mounting}
|
||||
variant="big"
|
||||
></ResetButton>
|
||||
<BVHButton></BVHButton>
|
||||
</div>
|
||||
<div className="w-full">
|
||||
<OverlayWidget></OverlayWidget>
|
||||
</div>
|
||||
{config?.debug && (
|
||||
<div className="w-full">
|
||||
<DeveloperModeWidget></DeveloperModeWidget>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import classnames from 'classnames';
|
||||
import { ReactChild } from 'react';
|
||||
import { useMatch, NavLink } from 'react-router-dom';
|
||||
import { ReactNode } from 'react';
|
||||
import { NavLink, useMatch } from 'react-router-dom';
|
||||
import { CubeIcon } from './commons/icon/CubeIcon';
|
||||
import { GearIcon } from './commons/icon/GearIcon';
|
||||
|
||||
@@ -12,10 +13,10 @@ export function NavButton({
|
||||
icon,
|
||||
}: {
|
||||
to: string;
|
||||
children: ReactChild;
|
||||
children: ReactNode;
|
||||
match?: string;
|
||||
state?: any;
|
||||
icon: ReactChild;
|
||||
icon: ReactNode;
|
||||
}) {
|
||||
const doesMatch = useMatch({
|
||||
path: match || to,
|
||||
@@ -56,11 +57,13 @@ export function NavButton({
|
||||
}
|
||||
|
||||
export function Navbar() {
|
||||
const { l10n } = useLocalization();
|
||||
|
||||
return (
|
||||
<div className="flex flex-col px-2 pt-2">
|
||||
<div className="flex flex-col flex-grow gap-2">
|
||||
<NavButton to="/" icon={<CubeIcon></CubeIcon>}>
|
||||
Home
|
||||
{l10n.getString('navbar-home')}
|
||||
</NavButton>
|
||||
<NavButton
|
||||
to="/onboarding/body-proportions/auto"
|
||||
@@ -68,14 +71,14 @@ export function Navbar() {
|
||||
state={{ alonePage: true }}
|
||||
icon={<GearIcon></GearIcon>}
|
||||
>
|
||||
Body proportions
|
||||
{l10n.getString('navbar-body_proportions')}
|
||||
</NavButton>
|
||||
<NavButton
|
||||
to="/onboarding/trackers-assign"
|
||||
state={{ alonePage: true }}
|
||||
icon={<GearIcon></GearIcon>}
|
||||
>
|
||||
Tracker assignment
|
||||
{l10n.getString('navbar-trackers_assign')}
|
||||
</NavButton>
|
||||
<NavButton
|
||||
to="/onboarding/mounting/auto"
|
||||
@@ -83,10 +86,10 @@ export function Navbar() {
|
||||
state={{ alonePage: true }}
|
||||
icon={<GearIcon></GearIcon>}
|
||||
>
|
||||
Mounting Calibration
|
||||
{l10n.getString('navbar-mounting')}
|
||||
</NavButton>
|
||||
<NavButton to="/onboarding/home" icon={<GearIcon></GearIcon>}>
|
||||
Setup Wizard
|
||||
{l10n.getString('navbar-onboarding')}
|
||||
</NavButton>
|
||||
</div>
|
||||
<NavButton
|
||||
@@ -95,7 +98,7 @@ export function Navbar() {
|
||||
state={{ scrollTo: 'steamvr' }}
|
||||
icon={<GearIcon></GearIcon>}
|
||||
>
|
||||
Settings
|
||||
{l10n.getString('navbar-settings')}
|
||||
</NavButton>
|
||||
</div>
|
||||
);
|
||||
|
||||
206
gui/src/components/SerialDetectionModal.tsx
Normal file
206
gui/src/components/SerialDetectionModal.tsx
Normal file
@@ -0,0 +1,206 @@
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { useEffect, useState } from 'react';
|
||||
import { useLocation, useNavigate } from 'react-router-dom';
|
||||
import {
|
||||
RpcMessage,
|
||||
SerialDevicesRequestT,
|
||||
SerialDevicesResponseT,
|
||||
SerialDeviceT,
|
||||
} from 'solarxr-protocol';
|
||||
import { useConfig } from '../hooks/config';
|
||||
import { usePrevious } from '../hooks/previous';
|
||||
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';
|
||||
import { USBIcon } from './commons/icon/UsbIcon';
|
||||
import { Typography } from './commons/Typography';
|
||||
|
||||
const mapItems = <T,>(items: T[], getKey: (item: T) => string) => {
|
||||
const map: any = {};
|
||||
for (const item of items) {
|
||||
const key = getKey(item);
|
||||
map[key] = item;
|
||||
}
|
||||
return map;
|
||||
};
|
||||
|
||||
const detectChanges = <T,>(
|
||||
prevItems: T[],
|
||||
nextItems: T[],
|
||||
getKey: (item: T) => string,
|
||||
compareItems: (a: T, b: T) => boolean
|
||||
) => {
|
||||
const mappedItems = mapItems(prevItems, getKey);
|
||||
const addedItems = [];
|
||||
const updatedItems = [];
|
||||
const removedItems = [];
|
||||
const unchangedItems = [];
|
||||
for (const nextItem of nextItems) {
|
||||
const itemKey = getKey(nextItem);
|
||||
if (itemKey in mappedItems) {
|
||||
const prevItem = mappedItems[itemKey];
|
||||
if (delete mappedItems[itemKey] && compareItems(prevItem, nextItem)) {
|
||||
unchangedItems.push(nextItem);
|
||||
} else {
|
||||
updatedItems.push(nextItem);
|
||||
}
|
||||
} else {
|
||||
addedItems.push(nextItem);
|
||||
}
|
||||
}
|
||||
for (const itemKey in mappedItems) {
|
||||
if (itemKey in mappedItems) {
|
||||
removedItems.push(mappedItems[itemKey]);
|
||||
}
|
||||
}
|
||||
return { addedItems, updatedItems, removedItems, unchangedItems };
|
||||
};
|
||||
|
||||
export function SerialDetectionModal() {
|
||||
const { l10n } = useLocalization();
|
||||
const { config } = useConfig();
|
||||
const nav = useNavigate();
|
||||
const { pathname } = useLocation();
|
||||
const { sendRPCPacket, useRPCPacket } = useWebsocketAPI();
|
||||
const [currentDevices, setCurrentDevices] = useState<SerialDeviceT[] | null>(
|
||||
null
|
||||
);
|
||||
const prevDevices = usePrevious<SerialDeviceT[] | null>(currentDevices);
|
||||
const [isOpen, setOpen] = useState<SerialDeviceT | null>(null);
|
||||
const [showWifiForm, setShowWifiForm] = useState(false);
|
||||
|
||||
const { WifiForm, handleSubmit, submitWifiCreds, formState, hasWifiCreds } =
|
||||
useWifiForm();
|
||||
|
||||
useEffect(() => {
|
||||
if (prevDevices == null) return;
|
||||
|
||||
const changes = detectChanges(
|
||||
prevDevices || [],
|
||||
currentDevices || [],
|
||||
(item) => item.port?.toString() || 'error',
|
||||
(a, b) => a.port == b.port && a.name == b.name
|
||||
);
|
||||
if (changes.addedItems.length === 1) {
|
||||
setOpen(changes.addedItems[0]);
|
||||
}
|
||||
}, [prevDevices, currentDevices]);
|
||||
|
||||
useEffect(() => {
|
||||
let timerId: NodeJS.Timer;
|
||||
|
||||
if (
|
||||
config?.watchNewDevices &&
|
||||
!['/settings/serial', '/onboarding/connect-trackers'].includes(pathname)
|
||||
) {
|
||||
timerId = setInterval(() => {
|
||||
sendRPCPacket(
|
||||
RpcMessage.SerialDevicesRequest,
|
||||
new SerialDevicesRequestT()
|
||||
);
|
||||
}, 3000);
|
||||
}
|
||||
return () => {
|
||||
clearInterval(timerId);
|
||||
};
|
||||
}, [config, sendRPCPacket, pathname]);
|
||||
|
||||
const closeModal = () => {
|
||||
setOpen(null);
|
||||
setShowWifiForm(false);
|
||||
};
|
||||
|
||||
const openSerial = () => {
|
||||
nav('/settings/serial', { state: { serialPort: isOpen?.port } });
|
||||
closeModal();
|
||||
};
|
||||
|
||||
const openWifi = () => {
|
||||
if (!hasWifiCreds) {
|
||||
setShowWifiForm(true);
|
||||
} else {
|
||||
closeModal();
|
||||
nav('/onboarding/connect-trackers', { state: { alonePage: true } });
|
||||
}
|
||||
};
|
||||
|
||||
const modalWifiSubmit = (form: WifiFormData) => {
|
||||
submitWifiCreds(form);
|
||||
closeModal();
|
||||
nav('/onboarding/connect-trackers', { state: { alonePage: true } });
|
||||
};
|
||||
|
||||
useRPCPacket(
|
||||
RpcMessage.SerialDevicesResponse,
|
||||
(val: SerialDevicesResponseT) => {
|
||||
setCurrentDevices(val.devices);
|
||||
}
|
||||
);
|
||||
|
||||
return (
|
||||
<BaseModal isOpen={!!isOpen} onRequestClose={closeModal}>
|
||||
<div className="flex flex-col gap-3">
|
||||
{!showWifiForm && (
|
||||
<>
|
||||
<div className="flex flex-col items-center gap-3 fill-accent-background-20">
|
||||
<USBIcon></USBIcon>
|
||||
<div className="flex flex-col items-center gap-2">
|
||||
<Typography variant="main-title">
|
||||
{l10n.getString('serial_detection-new_device-p0')}
|
||||
</Typography>
|
||||
<Typography variant="section-title">
|
||||
{isOpen?.name || 'unknown'}
|
||||
</Typography>
|
||||
<Typography variant="standard">
|
||||
{l10n.getString('serial_detection-new_device-p2')}
|
||||
</Typography>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<Button variant="primary" onClick={openWifi}>
|
||||
{l10n.getString('serial_detection-open_wifi')}
|
||||
</Button>
|
||||
<Button variant="tiertiary" onClick={openSerial}>
|
||||
{l10n.getString('serial_detection-open_serial')}
|
||||
</Button>
|
||||
<Button variant="secondary" onClick={closeModal}>
|
||||
{l10n.getString('serial_detection-close')}
|
||||
</Button>
|
||||
</>
|
||||
)}
|
||||
{showWifiForm && (
|
||||
<form
|
||||
onSubmit={handleSubmit(modalWifiSubmit)}
|
||||
className="flex flex-col gap-3"
|
||||
>
|
||||
<div className="flex flex-col items-center gap-3">
|
||||
<BulbIcon></BulbIcon>
|
||||
<Typography variant="main-title">
|
||||
{l10n.getString('serial_detection-new_device-p0')}
|
||||
</Typography>
|
||||
<Typography variant="standard">
|
||||
{l10n.getString('serial_detection-new_device-p1')}
|
||||
</Typography>
|
||||
</div>
|
||||
<div className="flex flex-col gap-3 rounded-xl max-w-sm">
|
||||
<WifiForm></WifiForm>
|
||||
</div>
|
||||
|
||||
<Button
|
||||
type="submit"
|
||||
variant="primary"
|
||||
disabled={!formState.isValid}
|
||||
>
|
||||
{l10n.getString('serial_detection-submit')}
|
||||
</Button>
|
||||
<Button variant="secondary" onClick={closeModal}>
|
||||
{l10n.getString('serial_detection-close')}
|
||||
</Button>
|
||||
</form>
|
||||
)}
|
||||
</div>
|
||||
</BaseModal>
|
||||
);
|
||||
}
|
||||
@@ -1,18 +1,17 @@
|
||||
import { ReactChild } from 'react';
|
||||
import { appWindow } from '@tauri-apps/api/window';
|
||||
import { ReactNode } from 'react';
|
||||
import { NavLink } from 'react-router-dom';
|
||||
import { CloseIcon } from './commons/icon/CloseIcon';
|
||||
import { MaximiseIcon } from './commons/icon/MaximiseIcon';
|
||||
import { MinimiseIcon } from './commons/icon/MinimiseIcon';
|
||||
import { SlimeVRIcon } from './commons/icon/SimevrIcon';
|
||||
import { appWindow } from '@tauri-apps/api/window';
|
||||
import { ProgressBar } from './commons/ProgressBar';
|
||||
import { Typography } from './commons/Typography';
|
||||
import packagejson from '../../package.json';
|
||||
|
||||
export function TopBar({
|
||||
progress,
|
||||
}: {
|
||||
children?: ReactChild;
|
||||
children?: ReactNode;
|
||||
progress?: number;
|
||||
}) {
|
||||
return (
|
||||
@@ -36,7 +35,8 @@ export function TopBar({
|
||||
className="mx-2 flex justify-around flex-col text-standard-bold text-status-success bg-status-success bg-opacity-20 rounded-lg px-3"
|
||||
data-tauri-drag-region
|
||||
>
|
||||
v{packagejson.version}
|
||||
{(__VERSION_TAG__ || __COMMIT_HASH__) +
|
||||
(__GIT_CLEAN__ ? '' : '-dirty')}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,18 +1,20 @@
|
||||
import classNames from 'classnames';
|
||||
import { ReactChild, useMemo } from 'react';
|
||||
import { ReactNode, useMemo } from 'react';
|
||||
import { NavLink } from 'react-router-dom';
|
||||
import { ArrowLeftIcon, ArrowRightIcon } from './icon/ArrowIcons';
|
||||
|
||||
export function ArrowLink({
|
||||
to,
|
||||
children,
|
||||
state,
|
||||
direction = 'left',
|
||||
variant = 'flat',
|
||||
}: {
|
||||
to: string;
|
||||
children: ReactChild;
|
||||
children: ReactNode;
|
||||
state?: { SerialPort?: string };
|
||||
direction?: 'left' | 'right';
|
||||
variant?: 'flat' | 'boxed';
|
||||
variant?: 'flat' | 'boxed' | 'boxed-2';
|
||||
}) {
|
||||
const classes = useMemo(() => {
|
||||
const variantsMap = {
|
||||
@@ -20,6 +22,9 @@ export function ArrowLink({
|
||||
boxed: classNames(
|
||||
'justify-between bg-background-70 rounded-md hover:bg-background-60 p-3'
|
||||
),
|
||||
'boxed-2': classNames(
|
||||
'justify-between bg-background-60 rounded-md hover:bg-background-50 p-3'
|
||||
),
|
||||
};
|
||||
return classNames(
|
||||
variantsMap[variant],
|
||||
@@ -28,7 +33,7 @@ export function ArrowLink({
|
||||
}, [variant]);
|
||||
|
||||
return (
|
||||
<NavLink to={to} className={classes}>
|
||||
<NavLink to={to} state={state} className={classes}>
|
||||
{direction === 'left' && (
|
||||
<div className="flex flex-col justify-center">
|
||||
<ArrowLeftIcon></ArrowLeftIcon>
|
||||
|
||||
28
gui/src/components/commons/BaseModal.tsx
Normal file
28
gui/src/components/commons/BaseModal.tsx
Normal file
@@ -0,0 +1,28 @@
|
||||
import classNames from 'classnames';
|
||||
import { ReactNode } from 'react';
|
||||
import ReactModal from 'react-modal';
|
||||
|
||||
export function BaseModal({
|
||||
children,
|
||||
...props
|
||||
}: {
|
||||
isOpen: boolean;
|
||||
children: ReactNode;
|
||||
} & ReactModal.Props) {
|
||||
return (
|
||||
<ReactModal
|
||||
{...props}
|
||||
shouldCloseOnOverlayClick
|
||||
shouldCloseOnEsc
|
||||
overlayClassName={classNames(
|
||||
'fixed top-0 right-0 left-0 bottom-0 flex flex-col justify-center items-center w-full h-full bg-background-90 bg-opacity-60 z-20'
|
||||
)}
|
||||
className={classNames(
|
||||
props.className as string,
|
||||
'items-center focus:ring-transparent focus:ring-offset-transparent focus:outline-transparent outline-none bg-background-60 p-6 rounded-lg text-white'
|
||||
)}
|
||||
>
|
||||
{children}
|
||||
</ReactModal>
|
||||
);
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
import classNames from 'classnames';
|
||||
import React, { ReactChild } from 'react';
|
||||
import React, { ReactNode } from 'react';
|
||||
|
||||
export function BigButton({
|
||||
text,
|
||||
@@ -10,7 +10,7 @@ export function BigButton({
|
||||
}: {
|
||||
text: string;
|
||||
disabled?: boolean;
|
||||
icon: ReactChild;
|
||||
icon: ReactNode;
|
||||
} & React.HTMLAttributes<HTMLButtonElement>) {
|
||||
return (
|
||||
<button
|
||||
|
||||
@@ -1,17 +1,16 @@
|
||||
import classNames from 'classnames';
|
||||
import {
|
||||
ReactChild,
|
||||
ReactNode,
|
||||
useEffect,
|
||||
useLayoutEffect,
|
||||
useMemo,
|
||||
useRef,
|
||||
useState,
|
||||
useState
|
||||
} from 'react';
|
||||
import { BodyPart, TrackerDataT } from 'solarxr-protocol';
|
||||
import { FlatDeviceTracker } from '../../hooks/app';
|
||||
import { useTracker } from '../../hooks/tracker';
|
||||
import { PersonFrontIcon } from './PersonFrontIcon';
|
||||
import { Typography } from './Typography';
|
||||
|
||||
interface SlotDot {
|
||||
id: string;
|
||||
@@ -111,8 +110,8 @@ export function BodyDisplay({
|
||||
dotsSize = 20,
|
||||
variant = 'tracker-select',
|
||||
}: {
|
||||
leftControls?: ReactChild;
|
||||
rightControls?: ReactChild;
|
||||
leftControls?: ReactNode;
|
||||
rightControls?: ReactNode;
|
||||
width?: number;
|
||||
dotsSize?: number;
|
||||
variant?: 'dots' | 'tracker-select';
|
||||
|
||||
@@ -1,12 +1,5 @@
|
||||
import classNames from 'classnames';
|
||||
import {
|
||||
ReactChild,
|
||||
useEffect,
|
||||
useLayoutEffect,
|
||||
useMemo,
|
||||
useRef,
|
||||
useState,
|
||||
} from 'react';
|
||||
import { ReactNode, useLayoutEffect, useRef, useState } from 'react';
|
||||
import { BodyPart } from 'solarxr-protocol';
|
||||
import { PersonFrontIcon } from './PersonFrontIcon';
|
||||
|
||||
@@ -18,8 +11,8 @@ export function BodyInteractions({
|
||||
dotsSize = 20,
|
||||
variant = 'tracker-select',
|
||||
}: {
|
||||
leftControls?: ReactChild;
|
||||
rightControls?: ReactChild;
|
||||
leftControls?: ReactNode;
|
||||
rightControls?: ReactNode;
|
||||
width?: number;
|
||||
dotsSize?: number;
|
||||
variant?: 'dots' | 'tracker-select';
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import classNames from 'classnames';
|
||||
import React, { ReactChild, useMemo } from 'react';
|
||||
import React, { ReactNode, useMemo } from 'react';
|
||||
import { NavLink } from 'react-router-dom';
|
||||
import { LoaderIcon } from './icon/LoaderIcon';
|
||||
|
||||
@@ -9,8 +9,8 @@ function ButtonContent({
|
||||
children,
|
||||
}: {
|
||||
loading: boolean;
|
||||
icon?: ReactChild;
|
||||
children: ReactChild;
|
||||
icon?: ReactNode;
|
||||
children: ReactNode;
|
||||
}) {
|
||||
return (
|
||||
<>
|
||||
@@ -47,9 +47,9 @@ export function Button({
|
||||
rounded = false,
|
||||
...props
|
||||
}: {
|
||||
children: ReactChild;
|
||||
icon?: ReactChild;
|
||||
variant: 'primary' | 'secondary' | 'tierciary';
|
||||
children: ReactNode;
|
||||
icon?: ReactNode;
|
||||
variant: 'primary' | 'secondary' | 'tiertiary' | 'quaternary';
|
||||
to?: string;
|
||||
loading?: boolean;
|
||||
rounded?: boolean;
|
||||
@@ -69,12 +69,18 @@ export function Button({
|
||||
'bg-background-60 hover:bg-background-60 cursor-not-allowed text-background-40':
|
||||
disabled,
|
||||
}),
|
||||
tierciary: classNames({
|
||||
tiertiary: classNames({
|
||||
'bg-background-50 hover:bg-background-40 text-standard text-background-10':
|
||||
!disabled,
|
||||
'bg-background-50 hover:bg-background-50 cursor-not-allowed text-background-40':
|
||||
disabled,
|
||||
}),
|
||||
quaternary: classNames({
|
||||
'bg-background-70 hover:bg-background-60 text-standard text-background-10':
|
||||
!disabled,
|
||||
'bg-background-70 hover:bg-background-70 cursor-not-allowed text-background-40':
|
||||
disabled,
|
||||
}),
|
||||
};
|
||||
return classNames(
|
||||
variantsMap[variant],
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import classNames from 'classnames';
|
||||
import { ReactChild, useMemo } from 'react';
|
||||
import { useMemo } from 'react';
|
||||
import { Control, Controller } from 'react-hook-form';
|
||||
|
||||
export function CheckBox({
|
||||
@@ -8,14 +8,16 @@ export function CheckBox({
|
||||
control,
|
||||
outlined,
|
||||
name,
|
||||
// input props
|
||||
disabled,
|
||||
...props
|
||||
}: {
|
||||
label: string | ReactChild;
|
||||
label: string;
|
||||
control: Control<any>;
|
||||
name: string;
|
||||
variant?: 'checkbox' | 'toggle';
|
||||
outlined?: boolean;
|
||||
}) {
|
||||
} & React.HTMLProps<HTMLInputElement>) {
|
||||
const classes = useMemo(() => {
|
||||
const vriantsMap = {
|
||||
checkbox: {
|
||||
@@ -38,7 +40,7 @@ export function CheckBox({
|
||||
<Controller
|
||||
control={control}
|
||||
name={name}
|
||||
render={({ field: { onChange, value, ref, onBlur, name } }) => (
|
||||
render={({ field: { onChange, value, ref, name } }) => (
|
||||
<div
|
||||
className={classNames(
|
||||
{
|
||||
@@ -51,7 +53,10 @@ export function CheckBox({
|
||||
<label
|
||||
className={classNames(
|
||||
'w-full py-3 flex gap-2 items-center text-standard-bold',
|
||||
{ 'px-3': outlined }
|
||||
{
|
||||
'px-3': outlined,
|
||||
'cursor-pointer': !disabled,
|
||||
}
|
||||
)}
|
||||
>
|
||||
<input
|
||||
|
||||
114
gui/src/components/commons/Dropdown.tsx
Normal file
114
gui/src/components/commons/Dropdown.tsx
Normal file
@@ -0,0 +1,114 @@
|
||||
import classNames from 'classnames';
|
||||
import { useState } from 'react';
|
||||
import { Control, Controller } from 'react-hook-form';
|
||||
|
||||
export interface DropdownItem {
|
||||
label: string;
|
||||
value: string;
|
||||
}
|
||||
|
||||
export type DropdownDirection = 'up' | 'down';
|
||||
|
||||
export function Dropdown({
|
||||
direction = 'up',
|
||||
variant = 'primary',
|
||||
placeholder,
|
||||
control,
|
||||
name,
|
||||
items = [],
|
||||
}: {
|
||||
direction?: DropdownDirection;
|
||||
variant?: 'primary' | 'secondary';
|
||||
placeholder: string;
|
||||
control: Control<any>;
|
||||
name: string;
|
||||
items: DropdownItem[];
|
||||
}) {
|
||||
const [isOpen, setOpen] = useState(false);
|
||||
|
||||
return (
|
||||
<Controller
|
||||
control={control}
|
||||
name={name}
|
||||
render={({ field: { onChange, value } }) => (
|
||||
<>
|
||||
{isOpen && (
|
||||
<div
|
||||
className="absolute top-0 left-0 w-full h-full bg-transparent"
|
||||
onClick={() => setOpen(false)}
|
||||
></div>
|
||||
)}
|
||||
<div className="relative w-fit">
|
||||
<div
|
||||
className={classNames(
|
||||
'min-h-[35px] text-white px-5 py-2.5 rounded-md focus:ring-4 text-center flex',
|
||||
variant == 'primary' &&
|
||||
'bg-background-60 hover:bg-background-50',
|
||||
variant == 'secondary' &&
|
||||
'bg-background-70 hover:bg-background-60'
|
||||
)}
|
||||
onClick={() => setOpen((open) => !open)}
|
||||
>
|
||||
<div className="flex-grow">
|
||||
{items.find((i) => i.value == value)?.label || placeholder}
|
||||
</div>
|
||||
<div
|
||||
className={classNames(
|
||||
'ml-2',
|
||||
direction == 'up' && 'rotate-180',
|
||||
direction == 'down' && 'rotate-0'
|
||||
)}
|
||||
>
|
||||
<svg
|
||||
className="justify-end w-4 h-4 "
|
||||
aria-hidden="true"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
viewBox="0 0 24 24"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
strokeLinecap="round"
|
||||
strokeLinejoin="round"
|
||||
strokeWidth="2"
|
||||
d="M19 9l-7 7-7-7"
|
||||
></path>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
{isOpen && (
|
||||
<div
|
||||
className={classNames(
|
||||
'absolute z-10 rounded shadow right-0 min-w-max',
|
||||
direction === 'up' && 'bottom-[45px]',
|
||||
direction === 'down' && 'top-[45px]',
|
||||
variant == 'primary' && 'bg-background-60',
|
||||
variant == 'secondary' && 'bg-background-70'
|
||||
)}
|
||||
>
|
||||
<ul className="py-1 text-sm text-gray-200 flex flex-col ">
|
||||
{items.map((item) => (
|
||||
<li
|
||||
className={classNames(
|
||||
'py-2 px-4 hover:text-white min-w-max',
|
||||
variant == 'primary' && 'hover:bg-background-50',
|
||||
variant == 'secondary' && 'hover:bg-background-60'
|
||||
)}
|
||||
onClick={() => {
|
||||
onChange(item.value);
|
||||
setOpen(false);
|
||||
}}
|
||||
key={item.value}
|
||||
>
|
||||
{item.label}
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
/>
|
||||
);
|
||||
}
|
||||
@@ -3,19 +3,21 @@ import {
|
||||
forwardRef,
|
||||
HTMLInputTypeAttribute,
|
||||
MouseEvent,
|
||||
useState,
|
||||
useMemo,
|
||||
useState
|
||||
} from 'react';
|
||||
import { EyeIcon } from './icon/EyeIcon';
|
||||
|
||||
export interface InputProps {
|
||||
type: HTMLInputTypeAttribute;
|
||||
placeholder?: string;
|
||||
label?: string;
|
||||
placeholder?: string | null;
|
||||
label?: string | null;
|
||||
autocomplete?: boolean;
|
||||
variant?: 'primary' | 'secondary';
|
||||
}
|
||||
|
||||
export const Input = forwardRef<HTMLInputElement, InputProps>(function AppInput(
|
||||
{ type, placeholder, label, autocomplete, ...props },
|
||||
{ type, placeholder, label, autocomplete, variant = 'primary', ...props },
|
||||
ref
|
||||
) {
|
||||
const [forceText, setForceText] = useState(false);
|
||||
@@ -25,6 +27,18 @@ export const Input = forwardRef<HTMLInputElement, InputProps>(function AppInput(
|
||||
setForceText(!forceText);
|
||||
};
|
||||
|
||||
const classes = useMemo(() => {
|
||||
const variantsMap = {
|
||||
primary: classNames('bg-background-60 border-background-60'),
|
||||
secondary: classNames('bg-background-50 border-background-50'),
|
||||
};
|
||||
|
||||
return classNames(
|
||||
variantsMap[variant],
|
||||
'w-full focus:ring-transparent focus:ring-offset-transparent focus:outline-transparent rounded-md bg-background-60 border-background-60 focus:border-accent-background-40 placeholder:text-background-30 text-standard relative'
|
||||
);
|
||||
}, [variant]);
|
||||
|
||||
return (
|
||||
<label className="flex flex-col gap-1">
|
||||
{label}
|
||||
@@ -32,11 +46,8 @@ export const Input = forwardRef<HTMLInputElement, InputProps>(function AppInput(
|
||||
<input
|
||||
type={forceText ? 'text' : type}
|
||||
ref={ref}
|
||||
className={classNames(
|
||||
'w-full focus:ring-transparent focus:ring-offset-transparent focus:outline-transparent rounded-md bg-background-60 border-background-60 focus:border-accent-background-40 placeholder:text-background-30 text-standard relative',
|
||||
{ 'pr-10': type === 'password' }
|
||||
)}
|
||||
placeholder={placeholder}
|
||||
className={classNames(classes, { 'pr-10': type === 'password' })}
|
||||
placeholder={placeholder || undefined}
|
||||
autoComplete={autocomplete ? 'off' : 'on'}
|
||||
{...props}
|
||||
></input>
|
||||
|
||||
46
gui/src/components/commons/LangSelector.tsx
Normal file
46
gui/src/components/commons/LangSelector.tsx
Normal file
@@ -0,0 +1,46 @@
|
||||
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 { Dropdown, DropdownDirection } from './Dropdown';
|
||||
|
||||
export function LangSelector({
|
||||
direction = 'up',
|
||||
}: {
|
||||
direction?: DropdownDirection;
|
||||
}) {
|
||||
const { changeLocales } = useContext(LangContext);
|
||||
const { l10n } = useLocalization();
|
||||
const { config, setConfig } = useConfig();
|
||||
const { control, watch, handleSubmit } = useForm<{ lang: string }>({
|
||||
defaultValues: { lang: config?.lang || 'en' },
|
||||
});
|
||||
|
||||
const languagesItems = useMemo(
|
||||
() => langs.map(({ key, name }) => ({ label: name, value: key })),
|
||||
[]
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
const subscription = watch(() => handleSubmit(onSubmit)());
|
||||
return () => subscription.unsubscribe();
|
||||
}, []);
|
||||
|
||||
const onSubmit = (value: { lang: string }) => {
|
||||
changeLocales([value.lang]);
|
||||
setConfig({ lang: value.lang });
|
||||
};
|
||||
|
||||
return (
|
||||
<Dropdown
|
||||
control={control}
|
||||
name="lang"
|
||||
placeholder={l10n.getString(
|
||||
'settings-general-interface-lang-placeholder'
|
||||
)}
|
||||
items={languagesItems}
|
||||
direction={direction}
|
||||
></Dropdown>
|
||||
);
|
||||
}
|
||||
@@ -1,11 +1,11 @@
|
||||
import classNames from 'classnames';
|
||||
import { ReactChild } from 'react';
|
||||
import { ReactNode } from 'react';
|
||||
import ReactModal from 'react-modal';
|
||||
|
||||
export function EmptyModal({
|
||||
children,
|
||||
...props
|
||||
}: { children?: ReactChild } & ReactModal.Props) {
|
||||
}: { children?: ReactNode } & ReactModal.Props) {
|
||||
return (
|
||||
<ReactModal
|
||||
{...props}
|
||||
|
||||
@@ -22,7 +22,8 @@ export function NumberSelector({
|
||||
const stepFn =
|
||||
typeof step === 'function'
|
||||
? step
|
||||
: (value: number, add: boolean) => (add ? value + step : value - step);
|
||||
: (value: number, add: boolean) =>
|
||||
+(add ? value + step : value - step).toFixed(2);
|
||||
|
||||
return (
|
||||
<Controller
|
||||
@@ -34,7 +35,7 @@ export function NumberSelector({
|
||||
<div className="flex gap-2 bg-background-60 p-2 rounded-lg">
|
||||
<div className="flex">
|
||||
<Button
|
||||
variant="tierciary"
|
||||
variant="tiertiary"
|
||||
rounded
|
||||
onClick={() => onChange(stepFn(value, false))}
|
||||
disabled={stepFn(value, false) < min}
|
||||
@@ -47,7 +48,7 @@ export function NumberSelector({
|
||||
</div>
|
||||
<div className="flex">
|
||||
<Button
|
||||
variant="tierciary"
|
||||
variant="tiertiary"
|
||||
rounded
|
||||
onClick={() => onChange(stepFn(value, true))}
|
||||
disabled={stepFn(value, true) > max}
|
||||
|
||||
@@ -50,101 +50,101 @@ export function PersonFrontIcon({ width }: { width?: number }) {
|
||||
cx="139.004"
|
||||
cy="170"
|
||||
r={CIRCLE_RADIUS}
|
||||
id={BodyPart[BodyPart.LEFT_HAND]}
|
||||
/>
|
||||
<circle
|
||||
className="body-part-circle"
|
||||
cx="122"
|
||||
cy="93"
|
||||
r={CIRCLE_RADIUS}
|
||||
id={BodyPart[BodyPart.LEFT_UPPER_ARM]}
|
||||
/>
|
||||
<circle
|
||||
className="body-part-circle"
|
||||
cx="122"
|
||||
cy="93"
|
||||
r={CIRCLE_RADIUS}
|
||||
id={BodyPart[BodyPart.LEFT_SHOULDER]}
|
||||
/>
|
||||
<circle
|
||||
className="body-part-circle"
|
||||
cx="139.004"
|
||||
cy="170"
|
||||
r={CIRCLE_RADIUS}
|
||||
id={BodyPart[BodyPart.LEFT_LOWER_ARM]}
|
||||
/>
|
||||
<circle
|
||||
className="body-part-circle"
|
||||
cx="97.004"
|
||||
cy="360"
|
||||
r={CIRCLE_RADIUS}
|
||||
id={BodyPart[BodyPart.LEFT_LOWER_LEG]}
|
||||
/>
|
||||
<circle
|
||||
className="body-part-circle"
|
||||
cx="103.004"
|
||||
cy="260"
|
||||
r={CIRCLE_RADIUS}
|
||||
id={BodyPart[BodyPart.LEFT_UPPER_LEG]}
|
||||
/>
|
||||
<circle
|
||||
className="body-part-circle"
|
||||
cx="97.004"
|
||||
cy="360"
|
||||
r={CIRCLE_RADIUS}
|
||||
id={BodyPart[BodyPart.LEFT_FOOT]}
|
||||
/>
|
||||
|
||||
<circle
|
||||
className="body-part-circle"
|
||||
cx="26.004"
|
||||
cy="170"
|
||||
r={CIRCLE_RADIUS}
|
||||
id={BodyPart[BodyPart.RIGHT_HAND]}
|
||||
/>
|
||||
|
||||
<circle
|
||||
className="body-part-circle"
|
||||
cx="43"
|
||||
cx="122"
|
||||
cy="93"
|
||||
r={CIRCLE_RADIUS}
|
||||
id={BodyPart[BodyPart.RIGHT_UPPER_ARM]}
|
||||
/>
|
||||
<circle
|
||||
className="body-part-circle"
|
||||
cx="43"
|
||||
cx="122"
|
||||
cy="93"
|
||||
r={CIRCLE_RADIUS}
|
||||
id={BodyPart[BodyPart.RIGHT_SHOULDER]}
|
||||
/>
|
||||
<circle
|
||||
className="body-part-circle"
|
||||
cx="26.004"
|
||||
cx="139.004"
|
||||
cy="170"
|
||||
r={CIRCLE_RADIUS}
|
||||
id={BodyPart[BodyPart.RIGHT_LOWER_ARM]}
|
||||
/>
|
||||
<circle
|
||||
className="body-part-circle"
|
||||
cx="67.004"
|
||||
cx="97.004"
|
||||
cy="360"
|
||||
r={CIRCLE_RADIUS}
|
||||
id={BodyPart[BodyPart.RIGHT_LOWER_LEG]}
|
||||
/>
|
||||
<circle
|
||||
className="body-part-circle"
|
||||
cx="103.004"
|
||||
cy="260"
|
||||
r={CIRCLE_RADIUS}
|
||||
id={BodyPart[BodyPart.RIGHT_UPPER_LEG]}
|
||||
/>
|
||||
<circle
|
||||
className="body-part-circle"
|
||||
cx="97.004"
|
||||
cy="360"
|
||||
r={CIRCLE_RADIUS}
|
||||
id={BodyPart[BodyPart.RIGHT_FOOT]}
|
||||
/>
|
||||
|
||||
<circle
|
||||
className="body-part-circle"
|
||||
cx="26.004"
|
||||
cy="170"
|
||||
r={CIRCLE_RADIUS}
|
||||
id={BodyPart[BodyPart.LEFT_HAND]}
|
||||
/>
|
||||
|
||||
<circle
|
||||
className="body-part-circle"
|
||||
cx="43"
|
||||
cy="93"
|
||||
r={CIRCLE_RADIUS}
|
||||
id={BodyPart[BodyPart.LEFT_UPPER_ARM]}
|
||||
/>
|
||||
<circle
|
||||
className="body-part-circle"
|
||||
cx="43"
|
||||
cy="93"
|
||||
r={CIRCLE_RADIUS}
|
||||
id={BodyPart[BodyPart.LEFT_SHOULDER]}
|
||||
/>
|
||||
<circle
|
||||
className="body-part-circle"
|
||||
cx="26.004"
|
||||
cy="170"
|
||||
r={CIRCLE_RADIUS}
|
||||
id={BodyPart[BodyPart.LEFT_LOWER_ARM]}
|
||||
/>
|
||||
<circle
|
||||
className="body-part-circle"
|
||||
cx="67.004"
|
||||
cy="360"
|
||||
r={CIRCLE_RADIUS}
|
||||
id={BodyPart[BodyPart.LEFT_LOWER_LEG]}
|
||||
/>
|
||||
|
||||
<circle
|
||||
className="body-part-circle"
|
||||
cx="61.004"
|
||||
cy="260"
|
||||
r={CIRCLE_RADIUS}
|
||||
id={BodyPart[BodyPart.RIGHT_UPPER_LEG]}
|
||||
id={BodyPart[BodyPart.LEFT_UPPER_LEG]}
|
||||
/>
|
||||
<circle
|
||||
className="body-part-circle"
|
||||
cx="67.004"
|
||||
cy="360"
|
||||
r={CIRCLE_RADIUS}
|
||||
id={BodyPart[BodyPart.RIGHT_FOOT]}
|
||||
id={BodyPart[BodyPart.LEFT_FOOT]}
|
||||
/>
|
||||
</svg>
|
||||
);
|
||||
|
||||
@@ -8,13 +8,16 @@ export function Radio({
|
||||
label,
|
||||
value,
|
||||
desciption,
|
||||
// input props
|
||||
disabled,
|
||||
...props
|
||||
}: {
|
||||
control: Control<any>;
|
||||
name: string;
|
||||
label: string;
|
||||
value: string | number;
|
||||
desciption?: string;
|
||||
}) {
|
||||
desciption?: string | null;
|
||||
} & React.HTMLProps<HTMLInputElement>) {
|
||||
return (
|
||||
<Controller
|
||||
control={control}
|
||||
@@ -26,6 +29,7 @@ export function Radio({
|
||||
{
|
||||
'border-accent-background-30': value == checked,
|
||||
'border-transparent': value != checked,
|
||||
'cursor-pointer': !disabled,
|
||||
}
|
||||
)}
|
||||
>
|
||||
@@ -37,6 +41,7 @@ export function Radio({
|
||||
onChange={onChange}
|
||||
value={value}
|
||||
checked={value == checked}
|
||||
{...props}
|
||||
></input>
|
||||
<div className="flex flex-col gap-2">
|
||||
<Typography bold>{label}</Typography>
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import { ReactChild } from 'react';
|
||||
import { ReactNode } from 'react';
|
||||
import { BulbIcon } from './icon/BulbIcon';
|
||||
import { Typography } from './Typography';
|
||||
|
||||
export function TipBox({ children }: { children: ReactChild }) {
|
||||
export function TipBox({ children }: { children: ReactNode }) {
|
||||
return (
|
||||
<div className="flex flex-row gap-4 bg-accent-background-50 p-4 rounded-md">
|
||||
<div className="fill-accent-background-20 flex flex-col justify-center">
|
||||
|
||||
7
gui/src/components/commons/icon/RouterIcon.tsx
Normal file
7
gui/src/components/commons/icon/RouterIcon.tsx
Normal file
@@ -0,0 +1,7 @@
|
||||
export function RouterIcon() {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" width="24">
|
||||
<path d="M5.3 20q-.7 0-1.162-.462-.463-.463-.463-1.163v-2.75q0-.7.463-1.163Q4.6 14 5.3 14h9.875v-4h1v4h1.875q.7 0 1.162.462.463.463.463 1.163v2.75q0 .7-.463 1.163Q18.75 20 18.05 20Zm2.15-3q0-.325-.225-.55-.225-.225-.55-.225-.325 0-.55.225-.225.225-.225.55 0 .325.225.55.225.225.55.225.325 0 .55-.225.225-.225.225-.55Zm3.5 0q0-.325-.225-.55-.225-.225-.55-.225-.325 0-.55.225-.225.225-.225.55 0 .325.225.55.225.225.55.225.325 0 .55-.225.225-.225.225-.55Zm2.725.775q.325 0 .55-.225.225-.225.225-.55 0-.325-.225-.55-.225-.225-.55-.225-.325 0-.55.225-.225.225-.225.55 0 .325.225.55.225.225.55.225Zm-.1-9.375-.725-.725q.65-.6 1.338-.888.687-.287 1.487-.287t1.488.287q.687.288 1.337.888l-.725.725q-.425-.425-.938-.663-.512-.237-1.162-.237-.65 0-1.163.237-.512.238-.937.663Zm-2.5-2.5-.7-.7Q11.4 4.15 12.75 3.575T15.675 3q1.575 0 2.912.575 1.338.575 2.388 1.625l-.7.7q-.825-.825-1.987-1.363Q17.125 4 15.675 4t-2.613.537Q11.9 5.075 11.075 5.9Z" />
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
7
gui/src/components/commons/icon/UsbIcon.tsx
Normal file
7
gui/src/components/commons/icon/UsbIcon.tsx
Normal file
@@ -0,0 +1,7 @@
|
||||
export function USBIcon() {
|
||||
return (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="48" width="48">
|
||||
<path d="M24 44q-1.6 0-2.6-1t-1-2.6q0-1.1.55-2 .55-.9 1.55-1.45V31.4h-7.4q-1.2 0-2.1-.9-.9-.9-.9-2.1v-5.45q-1-.45-1.55-1.325T10 19.6q0-1.6 1-2.6t2.6-1q1.6 0 2.6 1t1 2.6q0 1.15-.55 2.025T15.1 22.95v5.45h7.4v-17h-4L24 3.95l5.5 7.45h-4v17h7.4v-5.2h-2.1V16H38v7.2h-2.1v5.2q0 1.2-.9 2.1-.9.9-2.1.9h-7.4v5.55q1 .55 1.55 1.5t.55 1.95q0 1.6-1 2.6T24 44Z" />
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
10
gui/src/components/commons/icon/VRCIcon.tsx
Normal file
10
gui/src/components/commons/icon/VRCIcon.tsx
Normal file
@@ -0,0 +1,10 @@
|
||||
export function VRCIcon() {
|
||||
return (
|
||||
<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
|
||||
<path
|
||||
d="M246.1 418.9h531.8c8.4 0 16 3.4 21.5 8.9s8.9 13.1 8.9 21.5v125.4c0 8.4-3.4 16-8.9 21.5-4.8 4.8-11.1 8-18.1 8.7v46.3c0 10.9-8.8 19-19.5 15.1-3.8-1.4-7.9-4.6-11.9-9.9L709.6 605H246.1c-8.4 0-16-3.4-21.5-8.9s-8.9-13.1-8.9-21.5V449.3c0-8.4 3.4-16 8.9-21.5s13.1-8.9 21.5-8.9zm523.8 174.8h8c5.2 0 10-2.1 13.5-5.6 3.5-3.5 5.6-8.2 5.6-13.5V449.3c0-5.2-2.1-10-5.6-13.5-3.5-3.5-8.2-5.6-13.5-5.6H246.1c-5.2 0-10 2.1-13.5 5.6-3.5 3.5-5.6 8.2-5.6 13.5v125.4c0 5.2 2.1 10 5.6 13.5 3.5 3.5 8.2 5.6 13.5 5.6h469.4c15.8 19.8 31.1 40 46.9 59.8 2.5 3.3 7.7 3.9 7.6-2.5v-57.4h-.1zm-132.3-67.1h23.9l-12-42.2-11.9 42.2zm110.8-74.2H460.6c-10.8 0-19.6 8.8-19.6 19.6v79.7c0 10.8 8.8 19.6 19.6 19.6h287.8c10.8 0 19.6-8.8 19.6-19.6V472c0-10.7-8.8-19.6-19.6-19.6zm-270.3 91.4c2.5 2.6 6.2 3.9 10.9 3.9 3.1 0 5.6-.5 7.4-1.5 1.8-1 3.2-2.2 4.1-3.7.9-1.5 1.5-3.1 1.9-4.7.3-1.7.5-3.3.6-4.7.2-2.1 1.1-3.6 2.8-4.4 1.7-.8 3.7-1.2 6.1-1.2 3.1 0 5.4.6 6.9 1.8 1.5 1.2 2.2 3.5 2.2 7 0 4.1-.8 7.9-2.4 11.3-1.6 3.4-3.9 6.3-6.8 8.6s-6.4 4.1-10.5 5.4c-4 1.3-8.4 1.9-13.2 1.9-4.3 0-8.4-.6-12.2-1.7-3.9-1.1-7.2-3-10.1-5.4-2.9-2.5-5.2-5.7-6.8-9.7-1.7-4-2.5-8.9-2.5-14.7v-38.4c0-5.8.8-10.7 2.5-14.7s4-7.2 6.9-9.7c2.9-2.5 6.3-4.3 10.1-5.4 3.9-1.1 7.9-1.7 12.2-1.7 4.8 0 9.2.6 13.2 1.9 4 1.2 7.5 3 10.4 5.2 2.9 2.2 5.1 5 6.7 8.3 1.6 3.3 2.4 6.9 2.4 10.8 0 3.6-.7 5.9-2.2 7.1-1.5 1.1-3.7 1.7-6.7 1.7-2.6 0-4.7-.4-6.3-1.2-1.7-.8-2.5-2.3-2.6-4.4-.1-1.1-.3-2.4-.6-3.9s-.9-3-1.9-4.5c-1-1.5-2.4-2.7-4.2-3.7-1.8-1-4.4-1.5-7.7-1.5-4.7 0-8.3 1.3-10.7 3.9-2.5 2.6-3.7 6.6-3.7 12v38.4c0 5.1 1.3 9.1 3.8 11.6zm122.7 13.1c0 1.8-.9 3.2-2.8 4.2s-3.9 1.4-6.1 1.4c-2.3 0-4.4-.5-6.2-1.4-1.8-1-2.8-2.4-2.8-4.2v-39.5h-31v39.5c0 1.8-.9 3.2-2.8 4.2s-3.9 1.4-6.1 1.4c-2.3 0-4.4-.5-6.2-1.4-1.8-1-2.8-2.4-2.8-4.2v-89.4c0-1.9.9-3.3 2.8-4.2 1.8-.9 3.9-1.3 6.2-1.3 2.2 0 4.2.4 6.1 1.3 1.9.9 2.8 2.3 2.8 4.2v35.9h31v-35.9c0-1.9.9-3.3 2.8-4.2 1.8-.9 3.9-1.3 6.2-1.3 2.2 0 4.2.4 6.1 1.3 1.9.9 2.8 2.3 2.8 4.2v89.4zm86 1.2c-.7.9-1.7 1.7-2.8 2.3-1.1.7-2.3 1.2-3.6 1.6-1.3.4-2.6.6-3.8.6-1.6 0-2.9-.3-3.9-.8-1.1-.6-1.8-1.5-2.1-2.8l-5.2-18.3h-31.5l-5.2 18.3c-.4 1.3-1.1 2.2-2.1 2.8-1.1.5-2.4.8-3.9.8-1.2 0-2.5-.2-3.8-.6-1.3-.4-2.5-.9-3.6-1.5s-2-1.4-2.8-2.3c-.7-.9-1.1-1.9-1.1-3 0-.2.1-.6.3-1.4l26.6-86.5c.6-2.1 2.1-3.6 4.3-4.6 2.2-1 4.6-1.4 7.2-1.4 2.7 0 5.1.5 7.3 1.4 2.2 1 3.6 2.5 4.3 4.6l26.6 86.5c.2.7.3 1.2.3 1.4-.4 1-.7 2-1.5 2.9zm65-82.5c-1 1.7-2.4 2.5-4.2 2.5h-20.1v78.8c0 1.8-.9 3.2-2.8 4.2s-3.9 1.4-6.1 1.4c-2.3 0-4.4-.5-6.2-1.4-1.8-1-2.8-2.4-2.8-4.2v-78.8h-20.2c-1.8 0-3.2-.8-4.2-2.4-1-1.6-1.4-3.5-1.4-5.7 0-1.9.5-3.7 1.4-5.4.9-1.7 2.3-2.5 4.3-2.5h58.2c1.9 0 3.3.8 4.3 2.5.9 1.7 1.4 3.5 1.4 5.4-.2 2.1-.7 3.9-1.6 5.6zm-495.2-4.8 26.6 86.5c.7 2.1 2.2 3.6 4.3 4.6 2.2 1 4.6 1.4 7.2 1.4 2.7 0 5.1-.5 7.3-1.4 2.2-1 3.6-2.5 4.3-4.6l26.4-86.5c.2-.7.3-1.2.3-1.4 0-1.1-.4-2.1-1.1-3-.7-.9-1.7-1.7-2.8-2.3-1.1-.7-2.3-1.2-3.6-1.6-1.3-.4-2.6-.5-3.8-.5-1.6 0-2.9.3-3.9.8-1.1.5-1.8 1.5-2.1 2.8l-20.9 74.6-21-74.6c-.4-1.3-1.1-2.2-2.1-2.8-1.1-.6-2.4-.8-3.9-.8-1.2 0-2.5.2-3.8.5-1.3.4-2.5.9-3.6 1.5s-2 1.4-2.8 2.3c-.7.9-1.1 1.9-1.1 3-.2.3-.1.7.1 1.5zm86.9-3.3c0-1.5.5-2.8 1.6-3.9s2.5-1.7 4.2-1.7h27.2c4.5 0 8.7.5 12.7 1.4 3.9 1 7.4 2.5 10.4 4.7s5.3 5.1 7 8.8c1.7 3.7 2.5 8.3 2.5 13.8 0 7.9-1.7 14.1-5.2 18.5-3.4 4.4-7.7 7.5-12.9 9l18 33.4c.3.4.5.8.5 1.2.1.4.1.8.1 1 0 1.1-.3 2.2-1 3.4-.7 1.1-1.6 2.2-2.6 3-1.1.9-2.2 1.6-3.6 2.1-1.3.6-2.6.8-3.9.8-1.3 0-2.5-.4-3.5-1.1-1.1-.7-1.9-1.8-2.7-3.2l-19.5-38h-11.6v35.9c0 1.8-.9 3.2-2.8 4.2-1.8 1-3.9 1.4-6.2 1.4-2.2 0-4.2-.5-6.1-1.4-1.9-1-2.8-2.4-2.8-4.2v-89.1h.2zm17.9 10.2V507h15.1c4.5 0 8.1-1.1 10.7-3.2 2.7-2.2 4-5.9 4-11.3s-1.3-9.2-4-11.4c-2.7-2.2-6.2-3.3-10.7-3.3h-15.1v-.1z"
|
||||
fill="#fff"
|
||||
/>
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
17
gui/src/components/commons/icon/WarningIcon.tsx
Normal file
17
gui/src/components/commons/icon/WarningIcon.tsx
Normal file
@@ -0,0 +1,17 @@
|
||||
export function WarningIcon(props: any) {
|
||||
return (
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
{...props}
|
||||
className={`w-7 h-7 ${props.className || ''}`}
|
||||
>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
d="M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z"
|
||||
clipRule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
import { useMemo } from 'react';
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { useNavigate } from 'react-router-dom';
|
||||
import { TrackerDataT } from 'solarxr-protocol';
|
||||
import { useConfig } from '../../hooks/config';
|
||||
@@ -8,18 +8,11 @@ import { TrackerCard } from '../tracker/TrackerCard';
|
||||
import { TrackersTable } from '../tracker/TrackersTable';
|
||||
|
||||
export function Home() {
|
||||
const { l10n } = useLocalization();
|
||||
const { config } = useConfig();
|
||||
const { useAssignedTrackers, useUnassignedTrackers } = useTrackers();
|
||||
const { trackers } = useTrackers();
|
||||
const navigate = useNavigate();
|
||||
|
||||
const assignedTrackers = useAssignedTrackers();
|
||||
const unasignedTrackers = useUnassignedTrackers();
|
||||
|
||||
const trackers = useMemo(
|
||||
() => [...assignedTrackers, ...unasignedTrackers],
|
||||
[assignedTrackers, unasignedTrackers]
|
||||
);
|
||||
|
||||
const sendToSettings = (tracker: TrackerDataT) => {
|
||||
navigate(
|
||||
`/tracker/${tracker.trackerId?.trackerNum}/${tracker.trackerId?.deviceId?.id}`
|
||||
@@ -31,7 +24,7 @@ export function Home() {
|
||||
{trackers.length === 0 && (
|
||||
<div className="flex px-5 pt-5 justify-center">
|
||||
<Typography variant="standard">
|
||||
No trackers detected or assigned
|
||||
{l10n.getString('home-no_trackers')}
|
||||
</Typography>
|
||||
</div>
|
||||
)}
|
||||
@@ -47,7 +40,7 @@ export function Home() {
|
||||
smol
|
||||
interactable
|
||||
/>
|
||||
))}{' '}
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
{config?.debug && trackers.length > 0 && (
|
||||
|
||||
@@ -1,28 +1,52 @@
|
||||
import { useRef, useState } from 'react';
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { useMemo } from 'react';
|
||||
import { ResetRequestT, ResetType, RpcMessage } from 'solarxr-protocol';
|
||||
import { useCountdown } from '../../hooks/countdown';
|
||||
import { useWebsocketAPI } from '../../hooks/websocket-api';
|
||||
import { BigButton } from '../commons/BigButton';
|
||||
import { Button } from '../commons/Button';
|
||||
import {
|
||||
MountingResetIcon,
|
||||
QuickResetIcon,
|
||||
ResetIcon,
|
||||
} from '../commons/icon/ResetIcon';
|
||||
|
||||
export function ResetButton({ type }: { type: ResetType }) {
|
||||
const timerid = useRef<NodeJS.Timer | null>(null);
|
||||
const [reseting, setReseting] = useState(false);
|
||||
const [timer, setTimer] = useState(0);
|
||||
export function ResetButton({
|
||||
type,
|
||||
variant = 'big',
|
||||
onReseted,
|
||||
}: {
|
||||
type: ResetType;
|
||||
variant: 'big' | 'small';
|
||||
onReseted?: () => void;
|
||||
}) {
|
||||
const { l10n } = useLocalization();
|
||||
const { sendRPCPacket } = useWebsocketAPI();
|
||||
|
||||
const getText = () => {
|
||||
const reset = () => {
|
||||
const req = new ResetRequestT();
|
||||
req.resetType = type;
|
||||
sendRPCPacket(RpcMessage.ResetRequest, req);
|
||||
};
|
||||
|
||||
const { isCounting, startCountdown, timer } = useCountdown({
|
||||
onCountdownEnd: () => {
|
||||
reset();
|
||||
if (onReseted) onReseted();
|
||||
},
|
||||
});
|
||||
|
||||
const text = useMemo(() => {
|
||||
switch (type) {
|
||||
case ResetType.Quick:
|
||||
return 'Quick Reset';
|
||||
return l10n.getString('reset-quick');
|
||||
case ResetType.Mounting:
|
||||
return 'Reset Mounting';
|
||||
return l10n.getString('reset-mounting');
|
||||
case ResetType.Full:
|
||||
return l10n.getString('reset-full');
|
||||
}
|
||||
return 'Reset';
|
||||
};
|
||||
return l10n.getString('reset-full');
|
||||
}, [type]);
|
||||
|
||||
const getIcon = () => {
|
||||
switch (type) {
|
||||
@@ -34,46 +58,37 @@ export function ResetButton({ type }: { type: ResetType }) {
|
||||
return <ResetIcon width={20} />;
|
||||
};
|
||||
|
||||
const reset = () => {
|
||||
const req = new ResetRequestT();
|
||||
req.resetType = type;
|
||||
setReseting(true);
|
||||
setTimer(0);
|
||||
if (type !== ResetType.Quick) {
|
||||
if (timerid.current) clearInterval(timerid.current);
|
||||
timerid.current = setInterval(() => {
|
||||
setTimer((timer) => {
|
||||
const newTimer = timer + 1;
|
||||
if (newTimer >= 3) {
|
||||
// Stop the current interval
|
||||
if (timerid.current) clearInterval(timerid.current);
|
||||
|
||||
// Only actually reset on exactly 0 so it doesn't repeatedly reset if bugged
|
||||
if (newTimer === 3) sendRPCPacket(RpcMessage.ResetRequest, req);
|
||||
else
|
||||
console.warn(
|
||||
`Reset timer is still running after 3 seconds (newTimer = ${newTimer})`
|
||||
);
|
||||
|
||||
// Reset the state
|
||||
// Don't reset the timer in-case the interval keeps running
|
||||
setReseting(false);
|
||||
}
|
||||
return newTimer;
|
||||
});
|
||||
}, 1000);
|
||||
} else {
|
||||
sendRPCPacket(RpcMessage.ResetRequest, req);
|
||||
setReseting(false);
|
||||
}
|
||||
const variantsMap = {
|
||||
small:
|
||||
type == ResetType.Quick ? (
|
||||
<Button icon={getIcon()} onClick={reset} variant="primary">
|
||||
{text}
|
||||
</Button>
|
||||
) : (
|
||||
<Button
|
||||
icon={getIcon()}
|
||||
onClick={startCountdown}
|
||||
variant="primary"
|
||||
disabled={isCounting}
|
||||
>
|
||||
<div className="relative">
|
||||
<div className="opacity-0 h-0">{text}</div>
|
||||
{!isCounting ? text : String(timer)}
|
||||
</div>
|
||||
</Button>
|
||||
),
|
||||
big:
|
||||
type == ResetType.Quick ? (
|
||||
<BigButton text={text} icon={getIcon()} onClick={reset}></BigButton>
|
||||
) : (
|
||||
<BigButton
|
||||
text={!isCounting ? text : String(timer)}
|
||||
icon={getIcon()}
|
||||
onClick={startCountdown}
|
||||
disabled={isCounting}
|
||||
></BigButton>
|
||||
),
|
||||
};
|
||||
|
||||
return (
|
||||
<BigButton
|
||||
text={!reseting || timer >= 3 ? getText() : `${3 - timer}`}
|
||||
icon={getIcon()}
|
||||
onClick={reset}
|
||||
disabled={reseting}
|
||||
></BigButton>
|
||||
);
|
||||
return variantsMap[variant];
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { useLocalization } from '@fluent/react';
|
||||
import { useMemo } from 'react';
|
||||
import { BodyPart } from 'solarxr-protocol';
|
||||
import { FlatDeviceTracker } from '../../hooks/app';
|
||||
@@ -14,6 +15,7 @@ export function BodyAssignment({
|
||||
onlyAssigned: boolean;
|
||||
onRoleSelected: (role: BodyPart) => void;
|
||||
}) {
|
||||
const { l10n } = useLocalization();
|
||||
const { useAssignedTrackers } = useTrackers();
|
||||
|
||||
const assignedTrackers = useAssignedTrackers();
|
||||
@@ -49,11 +51,10 @@ export function BodyAssignment({
|
||||
<BodyInteractions
|
||||
assignedRoles={assignedRoles}
|
||||
leftControls={
|
||||
<div className="flex flex-col justify-between h-full">
|
||||
<div className="flex flex-col justify-between h-full text-right">
|
||||
<div className="flex flex-col gap-2">
|
||||
{advanced && (
|
||||
<TrackerPartCard
|
||||
label="HEAD"
|
||||
onlyAssigned={onlyAssigned}
|
||||
td={trackerPartGrouped[BodyPart.HEAD]}
|
||||
role={BodyPart.HEAD}
|
||||
@@ -63,7 +64,6 @@ export function BodyAssignment({
|
||||
)}
|
||||
{advanced && (
|
||||
<TrackerPartCard
|
||||
label="NECK"
|
||||
onlyAssigned={onlyAssigned}
|
||||
td={trackerPartGrouped[BodyPart.NECK]}
|
||||
role={BodyPart.NECK}
|
||||
@@ -76,68 +76,61 @@ export function BodyAssignment({
|
||||
<div className="flex flex-col gap-2">
|
||||
{advanced && (
|
||||
<TrackerPartCard
|
||||
label="RIGHT SHOULDER"
|
||||
onlyAssigned={onlyAssigned}
|
||||
td={trackerPartGrouped[BodyPart.RIGHT_SHOULDER]}
|
||||
role={BodyPart.RIGHT_SHOULDER}
|
||||
onClick={() => onRoleSelected(BodyPart.RIGHT_SHOULDER)}
|
||||
td={trackerPartGrouped[BodyPart.LEFT_SHOULDER]}
|
||||
role={BodyPart.LEFT_SHOULDER}
|
||||
onClick={() => onRoleSelected(BodyPart.LEFT_SHOULDER)}
|
||||
direction="right"
|
||||
/>
|
||||
)}
|
||||
<TrackerPartCard
|
||||
label="RIGHT UPPER ARM"
|
||||
onlyAssigned={onlyAssigned}
|
||||
td={trackerPartGrouped[BodyPart.RIGHT_UPPER_ARM]}
|
||||
role={BodyPart.RIGHT_UPPER_ARM}
|
||||
onClick={() => onRoleSelected(BodyPart.RIGHT_UPPER_ARM)}
|
||||
td={trackerPartGrouped[BodyPart.LEFT_UPPER_ARM]}
|
||||
role={BodyPart.LEFT_UPPER_ARM}
|
||||
onClick={() => onRoleSelected(BodyPart.LEFT_UPPER_ARM)}
|
||||
direction="right"
|
||||
/>
|
||||
</div>
|
||||
<div className="flex flex-col gap-2">
|
||||
<TrackerPartCard
|
||||
label="RIGHT LOWER ARM"
|
||||
onlyAssigned={onlyAssigned}
|
||||
td={trackerPartGrouped[BodyPart.RIGHT_LOWER_ARM]}
|
||||
role={BodyPart.RIGHT_LOWER_ARM}
|
||||
onClick={() => onRoleSelected(BodyPart.RIGHT_LOWER_ARM)}
|
||||
td={trackerPartGrouped[BodyPart.LEFT_LOWER_ARM]}
|
||||
role={BodyPart.LEFT_LOWER_ARM}
|
||||
onClick={() => onRoleSelected(BodyPart.LEFT_LOWER_ARM)}
|
||||
direction="right"
|
||||
/>
|
||||
|
||||
{advanced && (
|
||||
<TrackerPartCard
|
||||
label="RIGHT HAND"
|
||||
onlyAssigned={onlyAssigned}
|
||||
td={trackerPartGrouped[BodyPart.RIGHT_HAND]}
|
||||
role={BodyPart.RIGHT_HAND}
|
||||
onClick={() => onRoleSelected(BodyPart.RIGHT_HAND)}
|
||||
td={trackerPartGrouped[BodyPart.LEFT_HAND]}
|
||||
role={BodyPart.LEFT_HAND}
|
||||
onClick={() => onRoleSelected(BodyPart.LEFT_HAND)}
|
||||
direction="right"
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
<div className="flex flex-col gap-2">
|
||||
<TrackerPartCard
|
||||
label="RIGHT UPPER LEG"
|
||||
onlyAssigned={onlyAssigned}
|
||||
td={trackerPartGrouped[BodyPart.RIGHT_UPPER_LEG]}
|
||||
role={BodyPart.RIGHT_UPPER_LEG}
|
||||
onClick={() => onRoleSelected(BodyPart.RIGHT_UPPER_LEG)}
|
||||
td={trackerPartGrouped[BodyPart.LEFT_UPPER_LEG]}
|
||||
role={BodyPart.LEFT_UPPER_LEG}
|
||||
onClick={() => onRoleSelected(BodyPart.LEFT_UPPER_LEG)}
|
||||
direction="right"
|
||||
/>
|
||||
|
||||
<TrackerPartCard
|
||||
label="RIGHT LOWER LEG"
|
||||
onlyAssigned={onlyAssigned}
|
||||
td={trackerPartGrouped[BodyPart.RIGHT_LOWER_LEG]}
|
||||
role={BodyPart.RIGHT_LOWER_LEG}
|
||||
onClick={() => onRoleSelected(BodyPart.RIGHT_LOWER_LEG)}
|
||||
td={trackerPartGrouped[BodyPart.LEFT_LOWER_LEG]}
|
||||
role={BodyPart.LEFT_LOWER_LEG}
|
||||
onClick={() => onRoleSelected(BodyPart.LEFT_LOWER_LEG)}
|
||||
direction="right"
|
||||
/>
|
||||
<TrackerPartCard
|
||||
label="RIGHT FOOT"
|
||||
onlyAssigned={onlyAssigned}
|
||||
td={trackerPartGrouped[BodyPart.RIGHT_FOOT]}
|
||||
role={BodyPart.RIGHT_FOOT}
|
||||
onClick={() => onRoleSelected(BodyPart.RIGHT_FOOT)}
|
||||
td={trackerPartGrouped[BodyPart.LEFT_FOOT]}
|
||||
role={BodyPart.LEFT_FOOT}
|
||||
onClick={() => onRoleSelected(BodyPart.LEFT_FOOT)}
|
||||
direction="right"
|
||||
/>
|
||||
</div>
|
||||
@@ -146,7 +139,6 @@ export function BodyAssignment({
|
||||
rightControls={
|
||||
<div className="flex flex-col justify-between h-full">
|
||||
<TrackerPartCard
|
||||
label="CHEST"
|
||||
onlyAssigned={onlyAssigned}
|
||||
td={trackerPartGrouped[BodyPart.CHEST]}
|
||||
role={BodyPart.CHEST}
|
||||
@@ -157,41 +149,37 @@ export function BodyAssignment({
|
||||
<div className="flex flex-col gap-2">
|
||||
{advanced && (
|
||||
<TrackerPartCard
|
||||
label="LEFT SHOULDER"
|
||||
onlyAssigned={onlyAssigned}
|
||||
td={trackerPartGrouped[BodyPart.LEFT_SHOULDER]}
|
||||
role={BodyPart.LEFT_SHOULDER}
|
||||
onClick={() => onRoleSelected(BodyPart.LEFT_SHOULDER)}
|
||||
td={trackerPartGrouped[BodyPart.RIGHT_SHOULDER]}
|
||||
role={BodyPart.RIGHT_SHOULDER}
|
||||
onClick={() => onRoleSelected(BodyPart.RIGHT_SHOULDER)}
|
||||
direction="left"
|
||||
/>
|
||||
)}
|
||||
|
||||
<TrackerPartCard
|
||||
label="LEFT UPPER ARM"
|
||||
onlyAssigned={onlyAssigned}
|
||||
td={trackerPartGrouped[BodyPart.LEFT_UPPER_ARM]}
|
||||
role={BodyPart.LEFT_UPPER_ARM}
|
||||
onClick={() => onRoleSelected(BodyPart.LEFT_UPPER_ARM)}
|
||||
td={trackerPartGrouped[BodyPart.RIGHT_UPPER_ARM]}
|
||||
role={BodyPart.RIGHT_UPPER_ARM}
|
||||
onClick={() => onRoleSelected(BodyPart.RIGHT_UPPER_ARM)}
|
||||
direction="left"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-col gap-2">
|
||||
<TrackerPartCard
|
||||
label="LEFT LOWER ARM"
|
||||
onlyAssigned={onlyAssigned}
|
||||
td={trackerPartGrouped[BodyPart.LEFT_LOWER_ARM]}
|
||||
role={BodyPart.LEFT_LOWER_ARM}
|
||||
onClick={() => onRoleSelected(BodyPart.LEFT_LOWER_ARM)}
|
||||
td={trackerPartGrouped[BodyPart.RIGHT_LOWER_ARM]}
|
||||
role={BodyPart.RIGHT_LOWER_ARM}
|
||||
onClick={() => onRoleSelected(BodyPart.RIGHT_LOWER_ARM)}
|
||||
direction="left"
|
||||
/>
|
||||
{advanced && (
|
||||
<TrackerPartCard
|
||||
label="LEFT HAND"
|
||||
onlyAssigned={onlyAssigned}
|
||||
td={trackerPartGrouped[BodyPart.LEFT_HAND]}
|
||||
onClick={() => onRoleSelected(BodyPart.LEFT_HAND)}
|
||||
role={BodyPart.LEFT_HAND}
|
||||
td={trackerPartGrouped[BodyPart.RIGHT_HAND]}
|
||||
onClick={() => onRoleSelected(BodyPart.RIGHT_HAND)}
|
||||
role={BodyPart.RIGHT_HAND}
|
||||
direction="left"
|
||||
/>
|
||||
)}
|
||||
@@ -199,7 +187,6 @@ export function BodyAssignment({
|
||||
|
||||
<div className="flex flex-col gap-2">
|
||||
<TrackerPartCard
|
||||
label="WAIST"
|
||||
onlyAssigned={onlyAssigned}
|
||||
td={trackerPartGrouped[BodyPart.WAIST]}
|
||||
onClick={() => onRoleSelected(BodyPart.WAIST)}
|
||||
@@ -207,7 +194,6 @@ export function BodyAssignment({
|
||||
direction="left"
|
||||
/>
|
||||
<TrackerPartCard
|
||||
label="HIP"
|
||||
onlyAssigned={onlyAssigned}
|
||||
td={trackerPartGrouped[BodyPart.HIP]}
|
||||
onClick={() => onRoleSelected(BodyPart.HIP)}
|
||||
@@ -217,28 +203,25 @@ export function BodyAssignment({
|
||||
</div>
|
||||
<div className="flex flex-col gap-2">
|
||||
<TrackerPartCard
|
||||
label="LEFT UPPER LEG"
|
||||
onlyAssigned={onlyAssigned}
|
||||
td={trackerPartGrouped[BodyPart.LEFT_UPPER_LEG]}
|
||||
role={BodyPart.LEFT_UPPER_LEG}
|
||||
onClick={() => onRoleSelected(BodyPart.LEFT_UPPER_LEG)}
|
||||
td={trackerPartGrouped[BodyPart.RIGHT_UPPER_LEG]}
|
||||
role={BodyPart.RIGHT_UPPER_LEG}
|
||||
onClick={() => onRoleSelected(BodyPart.RIGHT_UPPER_LEG)}
|
||||
direction="left"
|
||||
/>
|
||||
|
||||
<TrackerPartCard
|
||||
label="LEFT LOWER LEG"
|
||||
onlyAssigned={onlyAssigned}
|
||||
td={trackerPartGrouped[BodyPart.LEFT_LOWER_LEG]}
|
||||
role={BodyPart.LEFT_LOWER_LEG}
|
||||
onClick={() => onRoleSelected(BodyPart.LEFT_LOWER_LEG)}
|
||||
td={trackerPartGrouped[BodyPart.RIGHT_LOWER_LEG]}
|
||||
role={BodyPart.RIGHT_LOWER_LEG}
|
||||
onClick={() => onRoleSelected(BodyPart.RIGHT_LOWER_LEG)}
|
||||
direction="left"
|
||||
/>
|
||||
<TrackerPartCard
|
||||
label="LEFT FOOT"
|
||||
onlyAssigned={onlyAssigned}
|
||||
td={trackerPartGrouped[BodyPart.LEFT_FOOT]}
|
||||
role={BodyPart.LEFT_FOOT}
|
||||
onClick={() => onRoleSelected(BodyPart.LEFT_FOOT)}
|
||||
td={trackerPartGrouped[BodyPart.RIGHT_FOOT]}
|
||||
role={BodyPart.RIGHT_FOOT}
|
||||
onClick={() => onRoleSelected(BodyPart.RIGHT_FOOT)}
|
||||
direction="left"
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
import { ReactChild } from 'react';
|
||||
import { ReactNode } from 'react';
|
||||
import {
|
||||
OnboardingContextC,
|
||||
useProvideOnboarding,
|
||||
useProvideOnboarding
|
||||
} from '../../hooks/onboarding';
|
||||
|
||||
export function OnboardingContextProvider({
|
||||
children,
|
||||
}: {
|
||||
children: ReactChild;
|
||||
children: ReactNode;
|
||||
}) {
|
||||
const context = useProvideOnboarding();
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { ReactChild } from 'react';
|
||||
import { ReactNode } from 'react';
|
||||
import { useLayout } from '../../hooks/layout';
|
||||
import { useOnboarding } from '../../hooks/onboarding';
|
||||
import { MainLayoutRoute } from '../MainLayout';
|
||||
import { TopBar } from '../TopBar';
|
||||
|
||||
export function OnboardingLayout({ children }: { children: ReactChild }) {
|
||||
export function OnboardingLayout({ children }: { children: ReactNode }) {
|
||||
const { layoutHeight, ref } = useLayout<HTMLDivElement>();
|
||||
const { state } = useOnboarding();
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user