Compare commits

...

59 Commits

Author SHA1 Message Date
Eiren Rain
4d7c931b69 Add workflow dispatch to server build 2023-01-05 16:45:31 +02:00
Erimel
ac6c7da1be Yaw drift compensation (#436) 2023-01-05 17:12:47 +03:00
Uriel
3c5dc4d8b5 try updating vite to latest (#438) 2023-01-05 17:11:02 +03:00
muumi
caac02975c translation in Estonian (#452) 2023-01-05 17:10:15 +03:00
Collin Kees
77858e11f3 Improve tap detection (#432) 2023-01-05 17:09:38 +03:00
MenacingExiler
af807aa9c1 Update Vietnamese (#448)
Updating newly added descriptions
2023-01-05 01:17:35 +03:00
Uriel
3826a49837 Fix some fluent stuff (#447) 2023-01-05 01:17:12 +03:00
Erimel
2450bb0abe fix translation header typos (#451) 2023-01-05 01:15:00 +03:00
Uriel
2d297d6622 only check on main push (#445) 2023-01-03 23:18:41 +03:00
Uriel
2afc2d1c58 fix a little typo that broke everything (#444) 2023-01-03 20:55:37 +03:00
Uriel
8dfeedaf2b make macos gui work (#412) 2023-01-03 20:39:29 +03:00
Uriel
3b75b5168f Start using fluent syntaxing (#423) 2023-01-03 20:18:23 +03:00
Erimel
97818e1504 Switch rotation to orientation (#435) 2023-01-03 19:13:53 +03:00
Erimel
003bb61dfb remove java WindowConfig (#434) 2023-01-03 19:12:35 +03:00
Uriel
c6b9d2b0e0 Fix bug on window state save (#439) 2023-01-03 19:07:37 +03:00
Uriel
8c1061adca Make spotless actually do stuff on kotlin (#437) 2023-01-03 19:06:44 +03:00
Erimel
95b2cb15e4 Rename GUI title to "SlimeVR" instead of "Slimevr UI" (#441) 2023-01-03 19:06:11 +03:00
Uriel
f35da6557b Fix artifact not uploading in linux (#430) 2022-12-28 16:04:39 +02:00
Uriel
1be691e045 update to main (#431) 2022-12-28 02:53:49 +03:00
Uriel
5dd5399e99 Kotlin revolution (#401) 2022-12-27 21:53:05 +03:00
Gabriel S
34818e925c Gesture control new keys & overall changes (calibração > calibragem, Montagem > Posicição/Posicionamento) (#429) 2022-12-27 21:33:10 +03:00
tamakiti
f93d165d6e Controller Translation (#426) 2022-12-27 21:30:32 +03:00
Uriel
25b69f2ca9 Change emoji for latinamerican spanish (#425)
We discussed it on the spanish translation group and ended up choosing this emoji for now
2022-12-27 21:28:16 +03:00
Uriel
84735029f6 Improve developer experience on translation changes (#416) 2022-12-25 14:51:44 +02:00
Uriel
7790e0fdac Add feeder translation keys (#417) 2022-12-25 14:51:26 +02:00
Uriel
f4e13f837b Linux bundling with the jar (#413) 2022-12-25 03:06:28 +03:00
MaxEvil47
b912e0003a Spanish Translation in Fluent (#415)
Co-Authored-By: Fowels <91481489+fowels@users.noreply.github.com>
Co-authored-by: Uriel <urielfontan2002@gmail.com>
2022-12-25 03:05:12 +03:00
Collin Kees
a8fa180ab7 Vive tracker emulation toggle (#418) 2022-12-25 03:03:19 +03:00
Uriel
1ca3980e90 small PR with dialect integrated in the keys (#419) 2022-12-25 03:01:48 +03:00
Uriel
9130b9911a Use fluent format for translations (#414) 2022-12-21 22:02:28 +02:00
namakeingo
f16827eb52 minor italian traslation fix (#409) 2022-12-20 21:14:09 +02:00
Naexen Chen
66d679ef70 typo&grammar fix (#410) 2022-12-20 21:13:49 +02:00
Uriel
9cfde38cdf Fix git versioning (#411) 2022-12-20 00:08:43 +03:00
Uriel
80b24486b3 it was with max (#408) 2022-12-19 21:46:52 +02:00
Disappear9
3c2ee9278c Add and improve some Chinese translations (#403) 2022-12-18 22:58:11 +02:00
TheDevMinerTV
e4667b384a fix: Vietnamese translation key for amount (#407) 2022-12-18 22:54:03 +02:00
Erimel
81c58a8ce4 Fix config.ts and tracker assignment goto (#399) 2022-12-18 22:51:15 +02:00
Erimel
8ce06e4c8b Improve French translation (#402) 2022-12-18 22:49:54 +02:00
Uriel
2c24e4d335 fix languages not fitting (#406) 2022-12-18 22:48:12 +02:00
Uriel
d6218a240a fix npe (#404) 2022-12-18 22:47:29 +02:00
Uriel
76de35e28c Show git commit in version (#351) 2022-12-16 19:14:33 +03:00
Erimel
e7cf1a3008 Remove ReferenceAdjustedTracker (#394) 2022-12-16 18:37:28 +03:00
Collin Kees
88f649ae5c add additional functionality to tap detection (#375) 2022-12-16 16:37:36 +03:00
Butterscotch!
f273d3a9bb Add trackerPort config, defaults to 6969 (#383) 2022-12-16 16:32:52 +03:00
namakeingo
79a0df7b28 Add Italian Translation (#382) 2022-12-16 16:26:40 +03:00
Erimel
ad9e5e0060 Filtering amount check (#378) 2022-12-16 16:25:50 +03:00
Erimel
48c35d9a78 make front the default mounting orientation (#384) 2022-12-16 16:25:05 +03:00
Ryan Butler
9407c6f0d4 Fixed NPE in catch of UDP Server (#388) 2022-12-16 16:24:30 +03:00
Ryan Butler
3dd94b3aa3 Fixed index out of bounds on data feed configs (#389) 2022-12-16 16:24:01 +03:00
Yexo
fbf509ec79 Fixed some polish translations (#387) 2022-12-16 16:23:40 +03:00
Kamilake
5a231ba9ef Korean translation improved and words replaced (#391) 2022-12-16 16:22:54 +03:00
Uriel
9a8c1f1d7b fixes socket not being deleted on exit (#392) 2022-12-16 16:22:33 +03:00
Carl Andersson
871a62e0a5 Include font for colour flags on Windows (#377) 2022-12-16 16:21:44 +03:00
tamakiti
372031ad42 Create new Japanese translation (#374) 2022-12-16 16:21:00 +03:00
Ryan Butler
9227ee4820 Update README.md (#386) 2022-12-16 14:51:16 +03:00
Erimel
4ffbc86588 sort steamvr trackers top-down (#379) 2022-12-13 19:14:37 +03:00
maclux
df43e5fcdf Fix page not opening (#359) 2022-12-13 19:14:09 +03:00
Gabriel S
7bc208fec3 Fix of Brazilian Portuguese translation of the Server GUI (#376) 2022-12-13 19:12:46 +03:00
Erimel
2ee9d5080f log server version on startup (#380) 2022-12-13 19:12:07 +03:00
137 changed files with 11930 additions and 15178 deletions

View File

@@ -2,6 +2,8 @@ name: Build GUI
on:
push:
branches:
- main
paths:
- .github/workflows/build-gui.yml
- gui/**
@@ -18,7 +20,7 @@ jobs:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]
os: [ubuntu-20.04, windows-latest]
runs-on: ${{ matrix.os }}
@@ -31,7 +33,7 @@ jobs:
with:
submodules: recursive
- if: matrix.os == 'ubuntu-latest'
- if: matrix.os == 'ubuntu-20.04'
name: Set up Linux dependencies
run: |
sudo apt-get update
@@ -39,6 +41,8 @@ jobs:
- 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
@@ -49,7 +53,7 @@ jobs:
- name: Build
run: |
npm ci
npm run tauri build
npm run skipbundler
- if: matrix.os == 'windows-latest'
name: Upload a Build Artifact
@@ -60,20 +64,11 @@ jobs:
# A file, directory or wildcard pattern that describes what to upload
path: target/release/slimevr.exe
- if: matrix.os == 'ubuntu-latest'
- if: matrix.os == 'ubuntu-20.04'
name: Upload a Build Artifact
uses: actions/upload-artifact@v3.1.0
with:
# Artifact name
name: SlimeVR-GUI-Deb
name: SlimeVR-GUI-Linux
# A file, directory or wildcard pattern that describes what to upload
path: target/release/bundle/deb/slimevr*.deb
- if: matrix.os == 'ubuntu-latest'
name: Upload a Build Artifact
uses: actions/upload-artifact@v3.1.0
with:
# Artifact name
name: SlimeVR-GUI-AppImage
# A file, directory or wildcard pattern that describes what to upload
path: target/release/bundle/appimage/slimevr*.AppImage
path: target/release/slimevr

View File

@@ -3,7 +3,12 @@
name: SlimeVR Server
on: [push, pull_request]
on:
push:
branches:
- main
pull_request:
workflow_dispatch:
jobs:
test:
@@ -59,3 +64,62 @@ jobs:
name: "SlimeVR-Server" # optional, default is artifact
# A file, directory or wildcard pattern that describes what to upload
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
run: |
sudo apt-get update
sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf libfuse2
- 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

View File

@@ -64,6 +64,15 @@ 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

559
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -35,7 +35,7 @@ on SlimeVR, you need to be aware of them:**
all the open source licenses used, including SlimeVR's.
Please refer to the [LICENSE-MIT] and [LICENSE-APACHE] files if you are at any point
uncertain what the exact the requirements are.
uncertain what the exact requirements are.
## Contributions
Any contributions submitted for inclusion in this repository will be dual-licensed under

View File

@@ -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

View File

@@ -3,9 +3,12 @@
"version": "0.5.1",
"private": true,
"dependencies": {
"@fluent/bundle": "^0.17.1",
"@fluent/react": "^0.14.1",
"@fontsource/poppins": "^4.5.8",
"@tauri-apps/api": "^1.0.2",
"@vitejs/plugin-react": "^2.2.0",
"@formatjs/intl-localematcher": "^0.2.32",
"@tauri-apps/api": "^1.2.0",
"@vitejs/plugin-react": "^3.0.0",
"browserslist": "^4.18.1",
"camelcase": "^6.2.1",
"classnames": "^2.3.1",
@@ -15,8 +18,8 @@
"file-loader": "^6.2.0",
"flatbuffers": "^22.10.26",
"fs-extra": "^10.0.0",
"i18next": "^22.0.6",
"identity-obj-proxy": "^3.0.0",
"intl-pluralrules": "^1.3.1",
"ip-num": "^1.4.1",
"postcss-flexbugs-fixes": "^5.0.2",
"postcss-normalize": "^10.0.1",
@@ -27,7 +30,6 @@
"react-dev-utils": "^12.0.0",
"react-dom": "^18.0.0",
"react-hook-form": "^7.29.0",
"react-i18next": "^12.0.0",
"react-modal": "3.15.1",
"react-router-dom": "^6.2.2",
"semver": "^7.3.5",
@@ -38,6 +40,7 @@
"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}",
@@ -63,9 +66,8 @@
]
},
"devDependencies": {
"@originjs/vite-plugin-commonjs": "^1.0.3",
"@tailwindcss/forms": "^0.5.0",
"@tauri-apps/cli": "^1.2.0",
"@tauri-apps/cli": "^1.2.2",
"@types/react": "18.0.25",
"@types/react-dom": "^18.0.5",
"@types/react-modal": "3.13.1",
@@ -86,6 +88,6 @@
"prettier": "^2.7.1",
"pretty-quick": "^3.1.3",
"tailwindcss": "^3.0.23",
"vite": "^3.2.4"
"vite": "^4.0.3"
}
}

Binary file not shown.

View File

@@ -0,0 +1,519 @@
### 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
## Skeleton stuff
skeleton_bone-NONE = none
skeleton_bone-HEAD = hed shyft
skeleton_bone-NECK = nyeck wength
skeleton_bone-TORSO = towso wength
skeleton_bone-CHEST = chwest disyance
skeleton_bone-WAIST = weyst disyance
skeleton_bone-HIP_OFFSET = hyip awfset
skeleton_bone-HIPS_WIDTH = hyips wiwdth
skeleton_bone-LEGS_LENGTH = wegs wength
skeleton_bone-KNEE_HEIGHT = knyee heiyt
skeleton_bone-FOOT_LENGTH = pawsies wength
skeleton_bone-FOOT_SHIFT = pawsies shyft
skeleton_bone-SKELETON_OFFSET = skeweton awfset
skeleton_bone-CONTROLLER_DISTANCE_Z = cyontwowla disance z
skeleton_bone-CONTROLLER_DISTANCE_Y = cyontwowla disance y
skeleton_bone-FOREARM_LENGTH = fowewawm disyance
skeleton_bone-SHOULDERS_DISTANCE = shouwdews disyance
skeleton_bone-SHOULDERS_WIDTH = shouwdews wiwdth
skeleton_bone-UPPER_ARM_LENGTH = uppew awm wength
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 wifi 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...
## Overlay settings
overlay-is_visible_label = show owovelay in steawmvr
overlay-is_mirrored_label = dispway owovelay as miwwow
## 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-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 = pawbsies~
settings-general-steamvr-trackers-knees = knyees~
settings-general-steamvr-trackers-elbows = ewbows~
settings-general-steamvr-trackers-hands = Hands
## 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 = Skating correction strength
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-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 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 = 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 wifi 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 = chest
settings-osc-vrchat-network-trackers-waist = wayst
settings-osc-vrchat-network-trackers-knees = knees
settings-osc-vrchat-network-trackers-feet = pawbs
settings-osc-vrchat-network-trackers-elbows = elbows
## Setup/onboarding menu
onboarding-skip = skipy setup
onboarding-continue = continyue
onboarding-wip = wowwk in pwowgress
## WiFi setup
onboarding-wifi_creds-back = gaww bawwk to intwoduction
onboarding-wifi_creds = input wifi 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 wifi settiwyngs
onboarding-wifi_creds-submit = suwbmyt!
onboarding-wifi_creds-ssid =
.label = SSID
.placeholder = Enter SSID
onboarding-wifi_creds-password =
.label = Password
.placeholder = Enter password
## 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 wifi 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 wifi cwedentials
onboarding-connect_tracker-connection_status-connected = cownyected to wifi
onboarding-connect_tracker-connection_status-error = unabwe to cownyect to wifi
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 wifi 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

View File

@@ -0,0 +1,519 @@
### 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
## Skeleton stuff
skeleton_bone-NONE = None
skeleton_bone-HEAD = Head Shift
skeleton_bone-NECK = Neck Length
skeleton_bone-TORSO = Torso Length
skeleton_bone-CHEST = Chest Distance
skeleton_bone-WAIST = Waist Distance
skeleton_bone-HIP_OFFSET = Hip Offset
skeleton_bone-HIPS_WIDTH = Hips Width
skeleton_bone-LEGS_LENGTH = Legs Length
skeleton_bone-KNEE_HEIGHT = Knee Height
skeleton_bone-FOOT_LENGTH = Foot Length
skeleton_bone-FOOT_SHIFT = Foot Shift
skeleton_bone-SKELETON_OFFSET = Skeleton Offset
skeleton_bone-CONTROLLER_DISTANCE_Z = Controller Distance Z
skeleton_bone-CONTROLLER_DISTANCE_Y = Controller Distance Y
skeleton_bone-FOREARM_LENGTH = Forearm Distance
skeleton_bone-SHOULDERS_DISTANCE = Shoulders Distance
skeleton_bone-SHOULDERS_WIDTH = Shoulders Width
skeleton_bone-UPPER_ARM_LENGTH = Upper Arm Length
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 WiFi credentials!
serial_detection-new_device-p2 = Please select what you want to do with it
serial_detection-open_wifi = Connect to WiFi
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...
## Overlay settings
overlay-is_visible_label = Show Overlay in SteamVR
overlay-is_mirrored_label = Display Overlay as Mirror
## 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-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-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 wifi 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
## WiFi setup
onboarding-wifi_creds-back = Go Back to introduction
onboarding-wifi_creds = Input WiFi 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 wifi settings
onboarding-wifi_creds-submit = Submit!
onboarding-wifi_creds-ssid =
.label = SSID
.placeholder = Enter SSID
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 WiFi 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 wifi credentials
onboarding-connect_tracker-connection_status-connected = Connected to WiFi
onboarding-connect_tracker-connection_status-error = Unable to connect to Wifi
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 Wifi 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

View File

@@ -0,0 +1,519 @@
### 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
## Skeleton stuff
skeleton_bone-NONE = Nada
skeleton_bone-HEAD = Inclinación de cabeza
skeleton_bone-NECK = Largo del cuello
skeleton_bone-TORSO = Largo del torso
skeleton_bone-CHEST = Distancia del pecho
skeleton_bone-WAIST = Distancia de la cintura
skeleton_bone-HIP_OFFSET = Desplazamiento de la cadera
skeleton_bone-HIPS_WIDTH = Ancho de la cadera
skeleton_bone-LEGS_LENGTH = Largo de las piernas
skeleton_bone-KNEE_HEIGHT = Altura de las rodillas
skeleton_bone-FOOT_LENGTH = Largo de pies
skeleton_bone-FOOT_SHIFT = Desplazamiento de pies
skeleton_bone-SKELETON_OFFSET = Desplazamiento del esqueleto
skeleton_bone-CONTROLLER_DISTANCE_Z = Distancia Z del mando
skeleton_bone-CONTROLLER_DISTANCE_Y = Distancia Y del mando
skeleton_bone-FOREARM_LENGTH = Distancia del antebrazo
skeleton_bone-SHOULDERS_DISTANCE = Distancia de los hombros
skeleton_bone-SHOULDERS_WIDTH = Ancho de los hombros
skeleton_bone-UPPER_ARM_LENGTH = Largo del brazo superior
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 WiFi!
serial_detection-new_device-p2 = Por favor selecciona que quieres hacer con el
serial_detection-open_wifi = Conectarse al WiFi
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...
## Overlay settings
overlay-is_visible_label = Mostrar interfaz en SteamVR
overlay-is_mirrored_label = Mostrar interfaz reflejada
## 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-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 = 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 = 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 = 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 = 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 = 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 = 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-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 tap
*[other] { $amount } taps
}
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 = VRChat OSC Trackers
# 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 WiFi 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
## WiFi setup
onboarding-wifi_creds-back = Volver a la introducción
onboarding-wifi_creds = Ingresar credenciales del WiFi
# This cares about multilines
onboarding-wifi_creds-description =
Los sensores utilizarán estas credenciales para conectarse inalámbricamente.
Por favor usa las credenciales del WiFi al cuál estás conectado actualmente.
onboarding-wifi_creds-skip = Saltar ajustes de WiFi
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 = 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 WiFi
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 WiFi
onboarding-connect_tracker-connection_status-connected = Conectado al WiFi
onboarding-connect_tracker-connection_status-error = Incapaz de conectar al WiFi
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 trackers
[one] 1 tracker
*[other] { $amount } trackers
} connected
onboarding-connect_tracker-next = He conectado todos mis sensores
## Tracker assignment setup
onboarding-assign_trackers-back = Volver a las credenciales WiFi
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 } of { $trackers ->
[one] 1 tracker
*[other] { $trackers } trackers
} assigned
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] 1 second left
*[other] { $time } seconds left
}
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

View File

@@ -0,0 +1,508 @@
### 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 = 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
## Skeleton stuff
skeleton_bone-NONE = Mitte midagi
skeleton_bone-HEAD = Pea Nihe
skeleton_bone-NECK = Kaela Pikkus
skeleton_bone-TORSO = Torso Pikkus
skeleton_bone-CHEST = Rinna Vahemaa
skeleton_bone-WAIST = Vöökoha Vahemaa
skeleton_bone-HIP_OFFSET = Puusa Nihe
skeleton_bone-HIPS_WIDTH = Puusa Laius
skeleton_bone-LEGS_LENGTH = Jalgade Pikkus
skeleton_bone-KNEE_HEIGHT = Põlve Kõrgus
skeleton_bone-FOOT_LENGTH = Jala Pikkus
skeleton_bone-FOOT_SHIFT = Jala Nihe
skeleton_bone-SKELETON_OFFSET = Skeletti Nihe
skeleton_bone-CONTROLLER_DISTANCE_Z = Kontrolleri Kaugus Z
skeleton_bone-CONTROLLER_DISTANCE_Y = Kontrolleri Kaugus Y
skeleton_bone-FOREARM_LENGTH = Käsivarre Kaugus
skeleton_bone-SHOULDERS_DISTANCE = Õlgade Kaugus
skeleton_bone-SHOULDERS_WIDTH = Õlgade Laius
skeleton_bone-UPPER_ARM_LENGTH = Õlavarre Pikkus
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 WiFi andmed!
serial_detection-new_device-p2 = Palun valige, mida te soovite sellega teha
serial_detection-open_wifi = Ühendage WiFi-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
overlay-is_visible_label = Näita Ülekatet SteamVR-is
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
# 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-subtitle = Filtreerimine
# This also cares about multilines
settings-general-tracker_mechanics-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-amount = Summa
## 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-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 WiFi 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
## WiFi setup
onboarding-wifi_creds-back = Mine tagasi juhistele
onboarding-wifi_creds = Sisestage enda WiFi andmed!
# This cares about multilines
onboarding-wifi_creds-description =
Jälgijad kasutavad neid andmeid, et ühendada juhtmevabalt.
Palun kasutage neid WiFi andmeid, millega te praegu olete ühendatud.
onboarding-wifi_creds-skip = Jätke WiFi 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 WiFi 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 WiFi andmeid
onboarding-connect_tracker-connection_status-connected = Ühendatud WiFi võrguga
onboarding-connect_tracker-connection_status-error = WiFi-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 WiFi 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

View File

@@ -0,0 +1,519 @@
### 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
## Skeleton stuff
skeleton_bone-NONE = Aucun
skeleton_bone-HEAD = Décalage de la tête
skeleton_bone-NECK = Longueur du cou
skeleton_bone-TORSO = Longueur du torse
skeleton_bone-CHEST = Distance de la poitrine
skeleton_bone-WAIST = Distance de la taille
skeleton_bone-HIP_OFFSET = Écart de la hanche
skeleton_bone-HIPS_WIDTH = Largeur des hanches
skeleton_bone-LEGS_LENGTH = Longueur des jambes
skeleton_bone-KNEE_HEIGHT = Hauteur des genoux
skeleton_bone-FOOT_LENGTH = Longueur des pieds
skeleton_bone-FOOT_SHIFT = Décalage des pieds
skeleton_bone-SKELETON_OFFSET = Écart du squelette
skeleton_bone-CONTROLLER_DISTANCE_Z = Distance Z des contrôleurs
skeleton_bone-CONTROLLER_DISTANCE_Y = Distance Y des contrôleurs
skeleton_bone-FOREARM_LENGTH = Longueur des avant-bras
skeleton_bone-SHOULDERS_DISTANCE = Distance des épaules
skeleton_bone-SHOULDERS_WIDTH = Largeur des épaules
skeleton_bone-UPPER_ARM_LENGTH = Longueur des bras supérieurs
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...
## Overlay settings
overlay-is_visible_label = Superposer le squelette dans SteamVR
overlay-is_mirrored_label = Afficher le squelette en tant que miroir
## 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-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-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é
## WiFi 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 = SSID
.placeholder = Enter SSID
onboarding-wifi_creds-password =
.label = Password
.placeholder = Enter password
## 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é

View File

@@ -0,0 +1,519 @@
### 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
## Skeleton stuff
skeleton_bone-NONE = Non assegnato
skeleton_bone-HEAD = Correzione Testa
skeleton_bone-NECK = Lunghezza Collo
skeleton_bone-TORSO = Torso Lunghezza
skeleton_bone-CHEST = Distanza Petto
skeleton_bone-WAIST = Distanza Girovita
skeleton_bone-HIP_OFFSET = Correzione Fianchi
skeleton_bone-HIPS_WIDTH = Larghezza Fianchi
skeleton_bone-LEGS_LENGTH = Lunghezza Gambe
skeleton_bone-KNEE_HEIGHT = Altezza Ginocchia
skeleton_bone-FOOT_LENGTH = Lunghezza Piedi
skeleton_bone-FOOT_SHIFT = Correzione Piedi
skeleton_bone-SKELETON_OFFSET = Compensazione scheletro
skeleton_bone-CONTROLLER_DISTANCE_Z = Distanza Z Controller
skeleton_bone-CONTROLLER_DISTANCE_Y = Distanza Y Controller
skeleton_bone-FOREARM_LENGTH = Distanza Avambracci
skeleton_bone-SHOULDERS_DISTANCE = Distanza Spalle
skeleton_bone-SHOULDERS_WIDTH = Larghezza Spalle
skeleton_bone-UPPER_ARM_LENGTH = Lunghezza Braccia
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 WiFi!
serial_detection-new_device-p2 = Seleziona come utilizzare il tracker, per piacere
serial_detection-open_wifi = Connetti al WiFi
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...
## Overlay settings
overlay-is_visible_label = Mostra Overlay in SteamVR
overlay-is_mirrored_label = Includi uno specchio nel Overlay
## 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-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-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 WiFi 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
## WiFi setup
onboarding-wifi_creds-back = Torna all'introduzione
onboarding-wifi_creds = Inserisci credenziali WiFi
# 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 WiFi
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 WiFi
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 WiFi in corso.
onboarding-connect_tracker-connection_status-connected = Connesso al WiFi
onboarding-connect_tracker-connection_status-error = Impossibile connettersi al WiFi
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 WiFi
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

View File

@@ -0,0 +1,519 @@
### 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 = 左コントローラ
## Skeleton stuff
skeleton_bone-NONE = 無し
skeleton_bone-HEAD = ヘッドシフト
skeleton_bone-NECK = 首長さ
skeleton_bone-TORSO = 胴長さ
skeleton_bone-CHEST = 胸部の距離
skeleton_bone-WAIST = 腰部の距離
skeleton_bone-HIP_OFFSET = ヒップオフセット
skeleton_bone-HIPS_WIDTH = ヒップ幅
skeleton_bone-LEGS_LENGTH = 脚長さ
skeleton_bone-KNEE_HEIGHT = 膝高さ
skeleton_bone-FOOT_LENGTH = 足先長さ
skeleton_bone-FOOT_SHIFT = 足先シフト
skeleton_bone-SKELETON_OFFSET = スケルトンオフセット
skeleton_bone-CONTROLLER_DISTANCE_Z = コントローラ距離 Z
skeleton_bone-CONTROLLER_DISTANCE_Y = コントローラ距離 Y
skeleton_bone-FOREARM_LENGTH = 前腕長さ
skeleton_bone-SHOULDERS_DISTANCE = 肩の距離
skeleton_bone-SHOULDERS_WIDTH = 肩幅
skeleton_bone-UPPER_ARM_LENGTH = 上腕長さ
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 = wifiの認証情報を入力してください
serial_detection-new_device-p2 = 何をするか選択してください
serial_detection-open_wifi = WiFiに接続
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 = レコーディング中...
## Overlay settings
overlay-is_visible_label = SteamVRでオーバーレイを表示する
overlay-is_mirrored_label = オーバーレイをミラーとして表示する
## 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 = Battery
tracker-table-column-ping = Ping
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 = 前
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 = 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-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 = 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_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 = Gesture control
settings-sidebar-interface = インターフェース
settings-sidebar-osc_router = OSC router
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 = 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 = No filtering
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 = 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 = 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 = Skating correction strength
settings-general-fk_settings-arm_fk = アームFK
settings-general-fk_settings-arm_fk-description = 腕の追従方法を変更する。
settings-general-fk_settings-arm_fk-force_arms = Force arms from HMD
settings-general-fk_settings-skeleton_settings = スケルトン設定
settings-general-fk_settings-skeleton_settings-description = スケルトン設定のオン/オフを切り替えます。これらはオンのままにしておくことをお勧めします。
settings-general-fk_settings-skeleton_settings-extended_spine = Extended spine
settings-general-fk_settings-skeleton_settings-extended_pelvis = Extended pelvis
settings-general-fk_settings-skeleton_settings-extended_knees = Extended knee
settings-general-fk_settings-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 = ジェスチャーコントロール
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 } 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 = インターフェース
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 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 =
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にデータを送信するアドレスを選択してくださいデバイスのwifi設定を確認してください
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 = 実行中
## WiFi setup
onboarding-wifi_creds-back = 戻る
onboarding-wifi_creds = WiFiの認証情報の入力
# This cares about multilines
onboarding-wifi_creds-description =
トラッカーはこれらの認証情報を使ってwifiに接続します。
現在接続している認証情報を使用してください。
onboarding-wifi_creds-skip = wifi設定をスキップする
onboarding-wifi_creds-submit = 実行!
onboarding-wifi_creds-ssid =
.label = SSID
.placeholder = Enter SSID
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 = Welcome to 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 = WiFi認証に戻る
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 = wifiの認証情報を送信中
onboarding-connect_tracker-connection_status-connected = WiFiに接続されました
onboarding-connect_tracker-connection_status-error = Wifiに接続できません
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 = Wifi認証に戻る
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 = トラッカーを検出できません。もしくは割り当てられていません。

View File

@@ -0,0 +1,519 @@
### 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 = 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 = Left controller
## Skeleton stuff
skeleton_bone-NONE = None
skeleton_bone-HEAD = 머리 밀림
skeleton_bone-NECK = 목 길이
skeleton_bone-TORSO = 몸통 길이
skeleton_bone-CHEST = 가슴 거리
skeleton_bone-WAIST = 허리 거리
skeleton_bone-HIP_OFFSET = 골반 오프셋
skeleton_bone-HIPS_WIDTH = 골반 너비
skeleton_bone-LEGS_LENGTH = 다리 길이
skeleton_bone-KNEE_HEIGHT = 무릎 높이
skeleton_bone-FOOT_LENGTH = 발 크기
skeleton_bone-FOOT_SHIFT = 발 밀림
skeleton_bone-SKELETON_OFFSET = 골격 오프셋
skeleton_bone-CONTROLLER_DISTANCE_Z = 컨트롤러 Z축 거리
skeleton_bone-CONTROLLER_DISTANCE_Y = 컨트롤러 Y축 거리
skeleton_bone-FOREARM_LENGTH = 전완 길이
skeleton_bone-SHOULDERS_DISTANCE = 어깨 거리
skeleton_bone-SHOULDERS_WIDTH = 어깨 너비
skeleton_bone-UPPER_ARM_LENGTH = 위팔 거리
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 = WiFi 자격 증명을 입력해주세요!
serial_detection-new_device-p2 = 원하는 작업을 선택하세요
serial_detection-open_wifi = WiFi 연결
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 = 기록중...
## Overlay settings
overlay-is_visible_label = SteamVR에서 오버레이 표시
overlay-is_mirrored_label = 오버레이 반전
## Tracker status
tracker-status-none = No Status
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-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 = 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-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 = 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_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 = 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 = 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-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 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 = 제스처 제어
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 } 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 = 인터페이스
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 = 아직 공사 중이에요
## WiFi setup
onboarding-wifi_creds-back = 처음으로 돌아가기
onboarding-wifi_creds = WiFi 자격 증명을 입력하세요
# This cares about multilines
onboarding-wifi_creds-description =
트래커는 이 자격 증명을 사용하여 무선으로 연결해요
지금 연결되어 있는 자격 증명을 사용해주세요
onboarding-wifi_creds-skip = WiFi 설정 건너뛰기
onboarding-wifi_creds-submit = 저장!
onboarding-wifi_creds-ssid =
.label = SSID
.placeholder = Enter SSID
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 =
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 = WiFi 자격 증명으로 돌아가기
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 = WiFi 자격증명 전송 중
onboarding-connect_tracker-connection_status-connected = WiFi 연결됨
onboarding-connect_tracker-connection_status-error = Wifi에 연결할 수 없음
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 = WiFi 자격 증명으로 돌아가기
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 = 감지되거나 할당된 트래커가 없어요.

View File

@@ -0,0 +1,519 @@
### 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
## Skeleton stuff
skeleton_bone-NONE = Brak
skeleton_bone-HEAD = Head Shift
skeleton_bone-NECK = Długość Szyi
skeleton_bone-TORSO = Długość Tułowia
skeleton_bone-CHEST = Długość Klatki Piersiowej
skeleton_bone-WAIST = Waist Distance
skeleton_bone-HIP_OFFSET = Offset Bioder
skeleton_bone-HIPS_WIDTH = Szerokość Bioder
skeleton_bone-LEGS_LENGTH = Długość Nóg
skeleton_bone-KNEE_HEIGHT = Wysokość Kolana
skeleton_bone-FOOT_LENGTH = Długość Stopy
skeleton_bone-FOOT_SHIFT = Foot Shift
skeleton_bone-SKELETON_OFFSET = Skeleton Offset
skeleton_bone-CONTROLLER_DISTANCE_Z = Controller Distance Z
skeleton_bone-CONTROLLER_DISTANCE_Y = Controller Distance Y
skeleton_bone-FOREARM_LENGTH = Długość PrzedRamienia
skeleton_bone-SHOULDERS_DISTANCE = Shoulders Distance
skeleton_bone-SHOULDERS_WIDTH = Szerokość Ramion
skeleton_bone-UPPER_ARM_LENGTH = Długość Bicepsa
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 WiFi!
serial_detection-new_device-p2 = Wybierz co chcesz z nim zrobić.
serial_detection-open_wifi = Połącz z WiFi
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...
## Overlay settings
overlay-is_visible_label = Pokaż Overlay w SteamVR
overlay-is_mirrored_label = Pokaż Overlay jako Lustro
## 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-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-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 wifi 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
## WiFi setup
onboarding-wifi_creds-back = Cofnij się do początku
onboarding-wifi_creds = Wpisz dane WiFi
# 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 WiFi
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ń WiFi
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 WiFi
onboarding-connect_tracker-connection_status-connected = Połączono z WiFi
onboarding-connect_tracker-connection_status-error = Nie można połączyć z Wifi
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ń WiFi
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

View File

@@ -0,0 +1,519 @@
### 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
## Skeleton stuff
skeleton_bone-NONE = Nada
skeleton_bone-HEAD = Deslocamento da Cabeça
skeleton_bone-NECK = Tamanho do Pescoço
skeleton_bone-TORSO = Tamanho do Torso
skeleton_bone-CHEST = Distância do Peito
skeleton_bone-WAIST = Distância da Cintura
skeleton_bone-HIP_OFFSET = Compensação do Quadril
skeleton_bone-HIPS_WIDTH = Largura do Quadril
skeleton_bone-LEGS_LENGTH = Tamanho das Perna
skeleton_bone-KNEE_HEIGHT = Altura dos Joelhos
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-CONTROLLER_DISTANCE_Z = Distância do Controle Z
skeleton_bone-CONTROLLER_DISTANCE_Y = Distância do Controle Y
skeleton_bone-FOREARM_LENGTH = Distância do Antebraço
skeleton_bone-SHOULDERS_DISTANCE = Distância dos Ombros
skeleton_bone-SHOULDERS_WIDTH = Largura dos Ombros
skeleton_bone-UPPER_ARM_LENGTH = Tamanho do Braço Superior
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 wifi!
serial_detection-new_device-p2 = Selecione o que quer fazer com ele
serial_detection-open_wifi = Conectar ao WiFi
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...
## Overlay settings
overlay-is_visible_label = Mostrar Overlay na SteamVR
overlay-is_mirrored_label = Mostrar Overlay como espelho
## 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-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-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 wifi 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
## WiFi setup
onboarding-wifi_creds-back = Voltar para introdução
onboarding-wifi_creds = Insira as credenciais de WiFi
# 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 WiFi
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 WiFi
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 wifi
onboarding-connect_tracker-connection_status-connected = Conectado ao WiFi
onboarding-connect_tracker-connection_status-error = Não é possível conectar ao WiFi
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 WiFi
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

View File

@@ -0,0 +1,519 @@
### 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? Lắc tracker và trong menu sẽ sáng lên.
tips-do_not_move_heels = Hãy đảm bảo gót chân không cử động trong khi đo ghi!
## Body parts
body_part-NONE = Chưa liên kết
body_part-HEAD = Đầu
body_part-NECK = Cổ
body_part-RIGHT_SHOULDER = Vai phải
body_part-RIGHT_UPPER_ARM = Tay phải trên
body_part-RIGHT_LOWER_ARM = Tay phải dưới
body_part-RIGHT_HAND = Tay phải
body_part-RIGHT_UPPER_LEG = Chân phải trên
body_part-RIGHT_LOWER_LEG = chân phải dưới
body_part-RIGHT_FOOT = Bàn chân phải
body_part-RIGHT_CONTROLLER = Tay cầm 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 = Tay trái trên
body_part-LEFT_LOWER_ARM = tay trái dưới
body_part-LEFT_HAND = Tay trái
body_part-LEFT_UPPER_LEG = Chân trái trên
body_part-LEFT_LOWER_LEG = Chân trái dưới
body_part-LEFT_FOOT = Bàn chân trái
body_part-LEFT_CONTROLLER = Tay cầm trái
## Skeleton stuff
skeleton_bone-NONE = Chưa liên kết
skeleton_bone-HEAD = Đầu ca
skeleton_bone-NECK = Cổ dài
skeleton_bone-TORSO = Chiều dài thân
skeleton_bone-CHEST = Khoảng cách ngực
skeleton_bone-WAIST = Khoảng cách eo
skeleton_bone-HIP_OFFSET = Lệc đo hông
skeleton_bone-HIPS_WIDTH = Chiều rộng hông
skeleton_bone-LEGS_LENGTH = Chiều dài chân
skeleton_bone-KNEE_HEIGHT = Chiều cao đầu gối
skeleton_bone-FOOT_LENGTH = CHiều dài bàn chân
skeleton_bone-FOOT_SHIFT = Lệch đo bàn chân
skeleton_bone-SKELETON_OFFSET = Lệch đo thân
skeleton_bone-CONTROLLER_DISTANCE_Z = Khoảng cách tay cầm Z
skeleton_bone-CONTROLLER_DISTANCE_Y = Khoảng cách tay cầm Y
skeleton_bone-FOREARM_LENGTH = khoảng cách cánh tay
skeleton_bone-SHOULDERS_DISTANCE = Khoảng cách vai
skeleton_bone-SHOULDERS_WIDTH = Chiều rộng vai
skeleton_bone-UPPER_ARM_LENGTH = Chiều dài tay trên
skeleton_bone-ELBOW_OFFSET = Lệch đo khuỷu tay
## Tracker reset buttons
reset-reset_all = Reset tất cả bộ phận
reset-full = Reset
reset-mounting = Reset vị trí cài
reset-quick = Reset nhanh
## Serial detection stuff
serial_detection-new_device-p0 = New serial device detected!
serial_detection-new_device-p1 = Vui lòng nhập thông tin Wi-Fi!
serial_detection-new_device-p2 = Vui lòng chọn những gì làm với nó
serial_detection-open_wifi = Kết nối Wi-Fi
serial_detection-open_serial = Mở Serial Console
serial_detection-submit = Đăng lên!
serial_detection-close = Đóng
## Navigation bar
navbar-home = Giao diện chính
navbar-body_proportions = Bộ phận cơ thể
navbar-trackers_assign = Giao bộ phận tracker
navbar-mounting = Đo vị trí đặt
navbar-onboarding = Trình hướng dẫn cài đặt
navbar-settings = Cài đặt
## Bounding volume hierarchy recording
bvh-start_recording = Ghi BVH
bvh-recording = Đang ghi...
## Overlay settings
overlay-is_visible_label = Xem overlay trên SteamVR
overlay-is_mirrored_label = Xem overlay trong gương
## Tracker status
tracker-status-none = Không có tình trạng
tracker-status-busy = Bận
tracker-status-error = Lỗi
tracker-status-disconnected = Đã ngắt kết nối
tracker-status-occluded = Bị tắc
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-rotation = Chiều chuyển X/Y/Z
tracker-table-column-position = Vị trí X/Y/Z
tracker-table-column-url = URL
## Tracker rotation
tracker-rotation-front = Đằng trước
tracker-rotation-left = Bên trái
tracker-rotation-right = Bên phải
tracker-rotation-back = Đằng sau
## Tracker information
tracker-infos-manufacturer = Nhà sản xuất
tracker-infos-display_name = Tên gọi
tracker-infos-custom_name = Tên tự chọn
tracker-infos-url = URL
## Tracker settings
tracker-settings-back = Quay lại danh sách tracker
tracker-settings-title = Cài đặt tracker
tracker-settings-assignment_section = Giao bộ phận
tracker-settings-assignment_section-description = Thiết bị này được giao cho bộ phận nào.
tracker-settings-assignment_section-edit = Chỉnh lại giao bộ phận
tracker-settings-mounting_section = Vị trí đặt bộ phận
tracker-settings-mounting_section-description = Tracker đặt ở đâu?
tracker-settings-mounting_section-edit = Chỉnh lại chỗ đặt
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 = Tên tracker
tracker-settings-name_section-description = Hãy cho một tên đẹp :)
tracker-settings-name_section-placeholder = Menaced's left leg
## Tracker part card info
tracker-part_card-no_name = Không tên
tracker-part_card-unassigned = Chưa giao vị trí
## Body assignment menu
body_assignment_menu = Bạn muốn giao tracker này cho bộ phận nào?
body_assignment_menu-description = Chọn vị trí bạn muốn giao tracker cho. Ngoài ra, bạn có thể quản lí tất cả tracker cùng một lúc thay vì từng cái một.
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 = Tracker chưa giao vị trí
## 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 để giao cho vị trí
tracker_selection_menu-NONE = Bạn muốn giao cho tracker nào mà chua giao?
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 } tay phải trên?
tracker_selection_menu-RIGHT_LOWER_ARM = { -tracker_selection-part } tay phải dưới?
tracker_selection_menu-RIGHT_HAND = { -tracker_selection-part } tay phải?
tracker_selection_menu-RIGHT_UPPER_LEG = { -tracker_selection-part } chân phải trên?
tracker_selection_menu-RIGHT_LOWER_LEG = { -tracker_selection-part } chân phải dướ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 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 } tay trái trên?
tracker_selection_menu-LEFT_LOWER_ARM = { -tracker_selection-part } tay trái dưới?
tracker_selection_menu-LEFT_HAND = { -tracker_selection-part } tay trái?
tracker_selection_menu-LEFT_UPPER_LEG = { -tracker_selection-part } chân trái trên?
tracker_selection_menu-LEFT_LOWER_LEG = { -tracker_selection-part } chân trái dưới?
tracker_selection_menu-LEFT_FOOT = { -tracker_selection-part } bàn chân trái?
tracker_selection_menu-LEFT_CONTROLLER = { -tracker_selection-part } tay tráitrái?
tracker_selection_menu-unassigned = Chưa giao vị trí
tracker_selection_menu-assigned = Đã giao vị trí
tracker_selection_menu-dont_assign = Thoát và không giao
## Mounting menu
mounting_selection_menu = Bạn muốn giao tracker này ở đâu?
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ơ khí tracker
settings-sidebar-fk_settings = Cài đặt FK
settings-sidebar-gesture_control = Gesture control
settings-sidebar-interface = Giao diện
settings-sidebar-osc_router = OSC router
settings-sidebar-utils = Hữu dụng
settings-sidebar-serial = Bảng điều khiển Serial
## 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 =
Bặt hoặc tắt tracker SteamVR.
Hữu dụng nếu bạn muốn điều khiển cách SlimeVR hoạt động.
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 (Chân)
settings-general-steamvr-trackers-elbows = Khuỷu tay
settings-general-steamvr-trackers-hands = Hands
## Tracker mechanics
settings-general-tracker_mechanics = Cơ khí tracker
settings-general-tracker_mechanics-filtering = Lọc rung
# This also cares about multilines
settings-general-tracker_mechanics-filtering-description =
Chọn kiểu lọc rung cho tracker.
Dự đoán đoán cử động trong khi lọc rung cử động.
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 = Để đo chiều chuyển y nguyên. Không sử dụlọclọc.
settings-general-tracker_mechanics-filtering-type-smoothing = Làm mượt
settings-general-tracker_mechanics-filtering-type-smoothing-description = Lọc cử động mượt nhưng tạo ít chậm rễ.
settings-general-tracker_mechanics-filtering-type-prediction = Dự đoán
settings-general-tracker_mechanics-filtering-type-prediction-description = Giảm chậm trê và để cử động gọn hơn, nhưng có thể tăng độ rung.
settings-general-tracker_mechanics-filtering-amount = Số luọng
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 = Cài đặt FK
settings-general-fk_settings-leg_tweak = Chỉnh chân
settings-general-fk_settings-leg_tweak-description = Chỉnh chân có thể giảm hoặc loại bỏ chân đi xuyên sàn nhà nhưng có thể ảnh hưởng đầu gối. Sửa trượt sửa khi lướt, nhưng giảm độ chính xác ở một số cử động.
# 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 = 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 = Skating correction strength
settings-general-fk_settings-arm_fk = Tay FK
settings-general-fk_settings-arm_fk-description = Chỉnh cách tay được đo.
settings-general-fk_settings-arm_fk-force_arms = Bắt tay từ kính thực tế ảo
settings-general-fk_settings-skeleton_settings = Cài đặt cơ thể
settings-general-fk_settings-skeleton_settings-description = Bật hoặc tắt hình cơ thể. Khuyên nên luôn để bật lựa chọn này.
settings-general-fk_settings-skeleton_settings-extended_spine = Xương sống mở rộng
settings-general-fk_settings-skeleton_settings-extended_pelvis = Xuong chậu mở rộng
settings-general-fk_settings-skeleton_settings-extended_knees = Đầu gối mở rộng
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 = Điều khiển cử chỉ
settings-general-gesture_control-subtitle = Bấm hai lần để reset nhanh
settings-general-gesture_control-description = Bật hoặc tắt reset nhanh. Khi bật bấm hai lần bất cứ đâu trên điểm cao nhất ở thân sẽ kích hoạt reset nhanh. Delay is the time between registering a tap and resetting.
# 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 = 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 = Giao diện
settings-general-interface-dev_mode = Chế độ nhà phát triển
settings-general-interface-dev_mode-description = Chế độ này có thể hữu dụng nếu như bạn cần thông tin sâu hơn hoặc giao tiếp với tracker nâng cao
settings-general-interface-dev_mode-label = Chế độ nhà phát triển
settings-general-interface-serial_detection = Phát hiện thiết bị Serial
settings-general-interface-serial_detection-description = Lựa chọn này sẽ hiển thị thông báo mỗi lần thiết bị Serial mà có thể là tracker.Lựa chọn này có thể giúp quá trình cài đạt tracker
settings-general-interface-serial_detection-label = Phát hiện thiết bị Serial
settings-general-interface-lang = Chọn ngôn ngữ (Change language)
settings-general-interface-lang-description = Đổi ngôn ngữ cố định (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 = Bảng điều khiển serial
# This cares about multilines
settings-serial-description =
Đâu là thông tin trực tiếp về giao tiếp với Serial.
Hữu dụng nếu muốn biết phần mềm firmware có vấn đề 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ối
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 = 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 =
Đổi cài đặt dành riêng cho VRChat để nhận thông tin từ kính thực tế ảo và gửi
thông tin tracker để track toàn thân (Hoạt động trên Quest một mình standalone).
settings-osc-vrchat-enable = Bật
settings-osc-vrchat-enable-description = Chình gửi và nhận thông tin
settings-osc-vrchat-enable-label = Bật
settings-osc-vrchat-network = Cổng mạng
settings-osc-vrchat-network-description = Chọn cổng mạng để nghe và gửi thông tin lên VRChat
settings-osc-vrchat-network-port_in =
.label = Cổng vào
.placeholder = Cổng vào (Cố định: 9001)
settings-osc-vrchat-network-port_out =
.label = Cổng ra
.placeholder = Cổng ra (Cố định: 9000)
settings-osc-vrchat-network-address = Địa chỉ mạng
settings-osc-vrchat-network-address-description = Chọn địa chỉ mạng nào để gứi lên VRChat (Hãy kiểm tra cài đặt Wi-Fi trên thiết bị để tìm cái này)
settings-osc-vrchat-network-address-placeholder = Địa chỉ IP cho VRChat
settings-osc-vrchat-network-trackers = Trackers
settings-osc-vrchat-network-trackers-description = Chỉnh gửi và nhận thông tin
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 = Đang làm dở (vui lòng quay lại sau update)
## WiFi setup
onboarding-wifi_creds-back = Quay lại đoạn giới thiệuthiệu
onboarding-wifi_creds = Bỏ thông tin Wi-Fi ở đây
# This cares about multilines
onboarding-wifi_creds-description =
Tracker sẽ sử dụng thông tin sau để kết nối không dây
vui lòng bỏ thông tin bạn muốn kết nối
onboarding-wifi_creds-skip = Bỏ qua cài đặt Wi-Fi
onboarding-wifi_creds-submit = Thiết lập!
onboarding-wifi_creds-ssid =
.label = SSID
.placeholder = Enter SSID
onboarding-wifi_creds-password =
.label = Password
.placeholder = Enter password
## Mounting setup
onboarding-reset_tutorial-back = Quay lại đo đạt vị trí
onboarding-reset_tutorial = Làm lại hướng dẫn
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 update
## Setup start
onboarding-home = Chào mừng đến với SlimeVR!
# This cares about multilines and it's centered!!
onboarding-home-description =
Đem đến đo toàn thân
tới tất cả
onboarding-home-start = Hãy bắt đầu cài đặt!
## Enter VR part of setup
onboarding-enter_vr-back = Quay lại giao bộ phận tracker
onboarding-enter_vr-title = Đến giờ lên VR!
onboarding-enter_vr-description = Đeo tất cả tracker và lên VR!
onboarding-enter_vr-ready = Sẵn sàng!
## Setup done
onboarding-done-title = Bạn đã hoàn thành cài đặt!
onboarding-done-description = Hãy tận hưởng đo toàn thân
onboarding-done-close = Đóng hướng dẫn
## Tracker connection setup
onboarding-connect_tracker-back = Quay lại tra thông tin Wi-Fi
onboarding-connect_tracker-title = Kết nối tracker
onboarding-connect_tracker-description-p0 = Đến giờ đoạn hay nhất, kết nối tất cả tracker!
onboarding-connect_tracker-description-p1 = Đơn thuần kết nối tất cả tracker chưa kết nối, qua cổng USB
onboarding-connect_tracker-issue-serial = Mình có vấn đề kết nối!
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 Wi-Fi
onboarding-connect_tracker-connection_status-error = Không thể kết nối Wi-Fi
onboarding-connect_tracker-connection_status-start_connecting = Đang tìm tracker
onboarding-connect_tracker-connection_status-handshake = Đã kết nối với máy chủ
# $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 trackers
[one] 1 tracker
*[other] { $amount } trackers
} đã giao
onboarding-connect_tracker-next = Tôi đã kết nối tất cả tracker
## Tracker assignment setup
onboarding-assign_trackers-back = Quay lại tra thông tin Wi-Fi
onboarding-assign_trackers-title = Giao tracker
onboarding-assign_trackers-description = Hãy chọn tracker nào nằm ở đâu. Chọn vị trí bạn muốn giao tracker cho
# 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
} đã giao
onboarding-assign_trackers-advanced = Xem vị trí mở rộng
onboarding-assign_trackers-next = Hoàn thành
## Tracker manual mounting setup
onboarding-manual_mounting-back = Quay lại đến vào VR
onboarding-manual_mounting = Đặt thủ công
onboarding-manual_mounting-description = Bấm từng tracker một và chọn xem nó được gắn theo chiều nào
onboarding-manual_mounting-auto_mounting = Gắn tự động
onboarding-manual_mounting-next = Bước tiếp theo
## Tracker automatic mounting setup
onboarding-automatic_mounting-back = Quay lại đến vào VR
onboarding-automatic_mounting-title = Đo vị trí đặt
onboarding-automatic_mounting-description = Để SlimeVR hoạt động, bạn cần đạt chiều hướng quay của tracker để khớp với điểm đặt tracker trên cơ thể
onboarding-automatic_mounting-manual_mounting = Đặt vị trí thủ công
onboarding-automatic_mounting-next = Bước tiếp theo
onboarding-automatic_mounting-prev_step = Bước trước
onboarding-automatic_mounting-done-title = Hướng quay đã được đo.
onboarding-automatic_mounting-done-description = Cài đặt vị trí đã hoàn thành!
onboarding-automatic_mounting-done-restart = Quay lại bắt đầu
onboarding-automatic_mounting-mounting_reset-title = Reset vị trí
onboarding-automatic_mounting-mounting_reset-step-0 = 1. Ngồi xổm trong tư thế "skiing" với hai chân cong, thân trên nghiêng về phía trước và hai cánh tay cong.
onboarding-automatic_mounting-mounting_reset-step-1 = 2. Nhấn nút "Reset Mounting" và đợi trong 3 giây trước khi các vòng quay giá đỡ của thiết bị theo dõi sẽ được đặt lại.
onboarding-automatic_mounting-preparation-title = Chuẩn bị
onboarding-automatic_mounting-preparation-step-0 = 1. Đứng thẳng với hai cánh tay sang hai bên.
onboarding-automatic_mounting-preparation-step-1 = 2. Nhấn nút "Reset" và đợi trong 3 giây trước khi trình theo dõi sẽ đặt lại.
onboarding-automatic_mounting-put_trackers_on-title = Hãy đeo tracker lên người
onboarding-automatic_mounting-put_trackers_on-description = Để đo chiều quay của tracker, phần mềm sẽ sử dụng tracker mà bạn đã giao cho. Hãy đeo lên tất cả tracker, và xem cái nào là cái nào trên hình bên phải
onboarding-automatic_mounting-put_trackers_on-next = Hoàn thành (Gắn xong)
## Tracker manual proportions setup
onboarding-manual_proportions-back = Quay lại hướng dẫn reset
onboarding-manual_proportions-title = Cài bộ phận cơ thể thủ công
onboarding-manual_proportions-precision = Chỉnh độ chính xác
onboarding-manual_proportions-auto = Đo cơ thể tự động
## Tracker automatic proportions setup
onboarding-automatic_proportions-back = Quay lại hướng dẫn reset
onboarding-automatic_proportions-title = Đo cơ thể
onboarding-automatic_proportions-description = Để SlimeVR hoạt động, phần mềm cần biết chiều dài của thân. Bước đo tự động này sẽ giúp bạn.
onboarding-automatic_proportions-manual = Đo thủ công
onboarding-automatic_proportions-prev_step = Bước trước
onboarding-automatic_proportions-put_trackers_on-title = Đeo tất cả
onboarding-automatic_proportions-put_trackers_on-description = Để đo bộ phận, phần mềm sẽ sử dụng tracker mà bạn đã giao cho. Hãy đeo lên tất cả tracker, và xem cái nào là cái nào trên hình bên phải.
onboarding-automatic_proportions-put_trackers_on-next = Hoàn thành (Gắn xong)
onboarding-automatic_proportions-preparation-title = Chuẩn bị
onboarding-automatic_proportions-preparation-description = Đặt ghế đằng sau bạn thẳng trong khu vực chơi VR. Hãy chuẩn bị ngồi trong khi cài đặt đo thân tự động.
onboarding-automatic_proportions-preparation-next = Tôi đang đứng trước ghế ngồi
onboarding-automatic_proportions-start_recording-title = Chuẩn bị cử động
onboarding-automatic_proportions-start_recording-description = Phần mềm sẽ ghi một số củ động cử chỉ. Bước này sẽ bắt đầu ở màn hình tiếp theo. Hãy chuẩn bị khi bấm bắt đầu
onboarding-automatic_proportions-start_recording-next = Bắt đầu quay
onboarding-automatic_proportions-recording-title = Quay
onboarding-automatic_proportions-recording-description-p0 = Đang quay...
onboarding-automatic_proportions-recording-description-p1 = Hãy cử động theo hướng dẫn sau:
onboarding-automatic_proportions-recording-steps-0 = Cong đầu gối vài lần.
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 trên sang trái, sau đó uốn cong sang phải.
onboarding-automatic_proportions-recording-steps-3 = Vặn thân trên sang phải, sau đó uốn cong sang trái.
onboarding-automatic_proportions-recording-steps-4 = Đảo xung quanh cho đến khi bộ đếm thời gian kết thúc.
onboarding-automatic_proportions-recording-processing = Đang xử lí kết quả
# $time (Number) - Seconds left for the automatic calibration recording to finish (max 15)
onboarding-automatic_proportions-recording-timer = { $time ->
[one] 1 giây còn lại
*[other] { $time } giây còn
}
onboarding-automatic_proportions-verify_results-title = Xác nhận kết quả
onboarding-automatic_proportions-verify_results-description = Kiểm tra kết quả dưới đây, nó có chính xác không?
onboarding-automatic_proportions-verify_results-results = Đang ghi kết quả
onboarding-automatic_proportions-verify_results-processing = Đang xử lí kết quả
onboarding-automatic_proportions-verify_results-redo = Ghi lại
onboarding-automatic_proportions-verify_results-confirm = Kết quả này chính xác!
onboarding-automatic_proportions-done-title = Thân đã được đo và lưu.
onboarding-automatic_proportions-done-description = Quá trình đo thân đã hoàn thành!
## Home
home-no_trackers = Không tracker nào được phát hiện hoặc giao vị trí

View File

@@ -0,0 +1,519 @@
### 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 = 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 = Left controller
## Skeleton stuff
skeleton_bone-NONE = 无
skeleton_bone-HEAD = 头部偏移
skeleton_bone-NECK = 颈部长度
skeleton_bone-TORSO = 躯干长度
skeleton_bone-CHEST = 胸部距离
skeleton_bone-WAIST = 腰部距离
skeleton_bone-HIP_OFFSET = 髋部偏移
skeleton_bone-HIPS_WIDTH = 髋部宽度
skeleton_bone-LEGS_LENGTH = 腿部长度
skeleton_bone-KNEE_HEIGHT = 膝盖高度
skeleton_bone-FOOT_LENGTH = 脚部长度
skeleton_bone-FOOT_SHIFT = 脚部偏移
skeleton_bone-SKELETON_OFFSET = 骨骼偏移
skeleton_bone-CONTROLLER_DISTANCE_Z = 控制器距离 Z
skeleton_bone-CONTROLLER_DISTANCE_Y = 控制器距离 Y
skeleton_bone-FOREARM_LENGTH = 前臂距离
skeleton_bone-SHOULDERS_DISTANCE = 肩膀距离
skeleton_bone-SHOULDERS_WIDTH = 肩膀宽度
skeleton_bone-UPPER_ARM_LENGTH = 上臂长度
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 = 输入你的 WiFi 凭据!
serial_detection-new_device-p2 = 请选择你想对它做什么
serial_detection-open_wifi = 连接到 WiFi
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 = 录制中...
## Overlay settings
overlay-is_visible_label = 在 SteamVR 中显示覆盖层
overlay-is_mirrored_label = 镜像显示覆盖层
## 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-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 = 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-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 = 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_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 = 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 = 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-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 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 = 手势控制
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 } 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 = 交互界面
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 的地址(检查设备上的 WiFi 设置)
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 = 仍在开发中
## WiFi setup
onboarding-wifi_creds-back = 返回简介
onboarding-wifi_creds = 输入 WiFi 凭据
# This cares about multilines
onboarding-wifi_creds-description =
追踪器将使用这些凭据连接到 WiFi
请使用当前连接到 WiFi 的凭据
onboarding-wifi_creds-skip = 跳过 WiFi 设置
onboarding-wifi_creds-submit = 提交!
onboarding-wifi_creds-ssid =
.label = SSID
.placeholder = Enter SSID
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 = 返回到 WiFi 凭据设置
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 = 正在发送 WiFi 凭据
onboarding-connect_tracker-connection_status-connected = WiFi 已连接
onboarding-connect_tracker-connection_status-error = 无法连接到 WiFi
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 = 返回 WiFi 凭据设置
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 = 按下佩戴重置按钮并等待 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 ->
[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 = 未检测到或未分配追踪器

97
gui/scripts/check-missing.js Executable file
View 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
View 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'
);

View File

@@ -23,19 +23,23 @@ custom-protocol = ["tauri/custom-protocol"]
[build-dependencies]
tauri-build = { version = "1.2", features = [] }
cfg_aliases = "0.1"
shadow-rs = "0.19"
[dependencies]
serde_json = "1"
serde = { version = "1", features = ["derive"] }
tauri = { version = "1.2", features = ["cli", "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"] }
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.0"
open = "3"
shadow-rs = { version = "0.19", default-features = false }
const_format = "0.2.30"
[target.'cfg(windows)'.dependencies]
win32job = "1"

View File

@@ -1,9 +1,10 @@
use cfg_aliases::cfg_aliases;
fn main() {
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()
}

View File

@@ -9,9 +9,10 @@ use std::path::PathBuf;
use std::process::{Child, Stdio};
use clap::Parser;
use clap_verbosity_flag::{InfoLevel, Verbosity};
use const_format::concatcp;
use rand::{seq::SliceRandom, thread_rng};
use tauri::api::{clap, process::Command};
use shadow_rs::shadow;
use tauri::api::process::Command;
use tauri::Manager;
use tempfile::Builder;
use which::which_all;
@@ -21,11 +22,7 @@ use which::which_all;
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"
};
const JAVA_BIN: &str = if cfg!(windows) { "java.exe" } else { "java" };
static POSSIBLE_TITLES: &[&str] = &[
"Panicking situation",
"looking for spatula",
@@ -33,23 +30,31 @@ static POSSIBLE_TITLES: &[&str] = &[
"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(Parser)]
#[clap(version, about)]
#[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>,
verbose: clap_verbosity_flag::Verbosity,
}
fn is_valid_path(path: &PathBuf) -> bool {
// Might need to be changed in the future, at least for linux
let server_path = path.join("slimevr.jar");
return server_path.exists();
path.join("slimevr.jar").exists()
}
fn get_launch_path(cli: Cli) -> Option<PathBuf> {
@@ -59,16 +64,29 @@ fn get_launch_path(cli: Cli) -> Option<PathBuf> {
}
}
let mut path = env::current_dir().unwrap();
let path = env::current_dir().unwrap();
if is_valid_path(&path) {
return Some(path);
}
path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
let path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
if is_valid_path(&path) {
return Some(path);
}
let path = PathBuf::from("/usr/share/slimevr/");
if is_valid_path(&path) {
return Some(path);
}
// This is only for AppImage
if let Some(appimage) = env::var_os("APPDIR") {
let path = PathBuf::from(appimage);
if is_valid_path(&path) {
return Some(path);
}
}
None
}
@@ -190,8 +208,10 @@ fn main() {
None
};
tauri::Builder::default()
.plugin(tauri_plugin_window_state::Builder::default().build())
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();

View File

@@ -1,7 +1,7 @@
{
"package": {
"productName": "slimevr",
"version": "0.0.0"
"version": "../package.json"
},
"build": {
"distDir": "../dist",
@@ -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": {}
}
}
}

View File

@@ -3,7 +3,7 @@ import {
BrowserRouter as Router,
Outlet,
Route,
Routes
Routes,
} from 'react-router-dom';
import { Home } from './components/home/Home';
import { MainLayoutRoute } from './components/MainLayout';
@@ -13,11 +13,10 @@ import { Serial } from './components/settings/pages/Serial';
import { SettingsLayoutRoute } from './components/settings/SettingsLayout';
import {
useProvideWebsocketApi,
WebSocketApiContext
WebSocketApiContext,
} from './hooks/websocket-api';
import { Event, listen } from '@tauri-apps/api/event';
import { useTranslation, withTranslation } from 'react-i18next';
import { OnboardingContextProvider } from './components/onboarding/OnboardingContextProvicer';
import { OnboardingLayout } from './components/onboarding/OnboardingLayout';
import { AutomaticProportionsPage } from './components/onboarding/pages/body-proportions/AutomaticProportions';
@@ -38,6 +37,7 @@ import { TopBar } from './components/TopBar';
import { TrackerSettingsPage } from './components/tracker/TrackerSettings';
import { useConfig } from './hooks/config';
import { OSCRouterSettings } from './components/settings/pages/OSCRouterSettings';
import { useLocalization } from '@fluent/react';
function Layout() {
const { loading } = useConfig();
@@ -108,9 +108,9 @@ function Layout() {
);
}
function App() {
export default function App() {
const websocketAPI = useProvideWebsocketApi();
const { t } = useTranslation();
const { l10n } = useLocalization();
useEffect(() => {
const unlisten = listen(
@@ -165,8 +165,8 @@ function App() {
<TopBar></TopBar>
<div className="flex w-full h-full justify-center items-center p-2">
{websocketAPI.isFirstConnection
? t('websocket.connecting')
: t('websocket.connection-lost')}
? l10n.getString('websocket-connecting')
: l10n.getString('websocket-connection_lost')}
</div>
</>
)}
@@ -180,5 +180,3 @@ function App() {
</Router>
);
}
export default withTranslation()(App);

View File

@@ -1,16 +1,16 @@
import { useLocalization } from '@fluent/react';
import { useState } from 'react';
import { useTranslation } from 'react-i18next';
import {
RecordBVHRequestT,
RecordBVHStatusT,
RpcMessage
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 { t } = useTranslation();
const { l10n } = useLocalization();
const { useRPCPacket, sendRPCPacket } = useWebsocketAPI();
const [recording, setRecording] = useState(false);
@@ -26,7 +26,7 @@ export function BVHButton() {
return (
<BigButton
text={t(recording ? 'bvh.recording' : 'bvh.start-recording')}
text={l10n.getString(recording ? 'bvh-recording' : 'bvh-start_recording')}
icon={<RecordIcon width={20} />}
onClick={toggleBVH}
></BigButton>

View File

@@ -1,6 +1,6 @@
import { useLocalization } from '@fluent/react';
import classnames from 'classnames';
import { ReactNode } from 'react';
import { useTranslation } from 'react-i18next';
import { NavLink, useMatch } from 'react-router-dom';
import { CubeIcon } from './commons/icon/CubeIcon';
import { GearIcon } from './commons/icon/GearIcon';
@@ -57,13 +57,13 @@ export function NavButton({
}
export function Navbar() {
const { t } = useTranslation();
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>}>
{t('navbar.home')}
{l10n.getString('navbar-home')}
</NavButton>
<NavButton
to="/onboarding/body-proportions/auto"
@@ -71,14 +71,14 @@ export function Navbar() {
state={{ alonePage: true }}
icon={<GearIcon></GearIcon>}
>
{t('navbar.body-proportions')}
{l10n.getString('navbar-body_proportions')}
</NavButton>
<NavButton
to="/onboarding/trackers-assign"
state={{ alonePage: true }}
icon={<GearIcon></GearIcon>}
>
{t('navbar.trackers-assign')}
{l10n.getString('navbar-trackers_assign')}
</NavButton>
<NavButton
to="/onboarding/mounting/auto"
@@ -86,10 +86,10 @@ export function Navbar() {
state={{ alonePage: true }}
icon={<GearIcon></GearIcon>}
>
{t('navbar.mounting')}
{l10n.getString('navbar-mounting')}
</NavButton>
<NavButton to="/onboarding/home" icon={<GearIcon></GearIcon>}>
{t('navbar.onboarding')}
{l10n.getString('navbar-onboarding')}
</NavButton>
</div>
<NavButton
@@ -98,7 +98,7 @@ export function Navbar() {
state={{ scrollTo: 'steamvr' }}
icon={<GearIcon></GearIcon>}
>
{t('navbar.settings')}
{l10n.getString('navbar-settings')}
</NavButton>
</div>
);

View File

@@ -1,11 +1,11 @@
import { useLocalization } from '@fluent/react';
import { useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useLocation, useNavigate } from 'react-router-dom';
import {
RpcMessage,
SerialDevicesRequestT,
SerialDevicesResponseT,
SerialDeviceT
SerialDeviceT,
} from 'solarxr-protocol';
import { useConfig } from '../hooks/config';
import { usePrevious } from '../hooks/previous';
@@ -59,7 +59,7 @@ const detectChanges = <T,>(
};
export function SerialDetectionModal() {
const { t } = useTranslation();
const { l10n } = useLocalization();
const { config } = useConfig();
const nav = useNavigate();
const { pathname } = useLocation();
@@ -148,25 +148,25 @@ export function SerialDetectionModal() {
<USBIcon></USBIcon>
<div className="flex flex-col items-center gap-2">
<Typography variant="main-title">
{t('serial-detection.new-device.p0')}
{l10n.getString('serial_detection-new_device-p0')}
</Typography>
<Typography variant="section-title">
{isOpen?.name || 'unknown'}
</Typography>
<Typography variant="standard">
{t('serial-detection.new-device.p2')}
{l10n.getString('serial_detection-new_device-p2')}
</Typography>
</div>
</div>
<Button variant="primary" onClick={openWifi}>
{t('serial-detection.open-wifi')}
{l10n.getString('serial_detection-open_wifi')}
</Button>
<Button variant="tiertiary" onClick={openSerial}>
{t('serial-detection.open-serial')}
{l10n.getString('serial_detection-open_serial')}
</Button>
<Button variant="secondary" onClick={closeModal}>
{t('serial-detection.close')}
{l10n.getString('serial_detection-close')}
</Button>
</>
)}
@@ -178,10 +178,10 @@ export function SerialDetectionModal() {
<div className="flex flex-col items-center gap-3">
<BulbIcon></BulbIcon>
<Typography variant="main-title">
{t('serial-detection.new-device.p0')}
{l10n.getString('serial_detection-new_device-p0')}
</Typography>
<Typography variant="standard">
{t('serial-detection.new-device.p1')}
{l10n.getString('serial_detection-new_device-p1')}
</Typography>
</div>
<div className="flex flex-col gap-3 rounded-xl max-w-sm">
@@ -193,10 +193,10 @@ export function SerialDetectionModal() {
variant="primary"
disabled={!formState.isValid}
>
{t('serial-detection.submit')}
{l10n.getString('serial_detection-submit')}
</Button>
<Button variant="secondary" onClick={closeModal}>
{t('serial-detection.close')}
{l10n.getString('serial_detection-close')}
</Button>
</form>
)}

View File

@@ -1,7 +1,6 @@
import { appWindow } from '@tauri-apps/api/window';
import { ReactNode } from 'react';
import { NavLink } from 'react-router-dom';
import packagejson from '../../package.json';
import { CloseIcon } from './commons/icon/CloseIcon';
import { MaximiseIcon } from './commons/icon/MaximiseIcon';
import { MinimiseIcon } from './commons/icon/MinimiseIcon';
@@ -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>

View File

@@ -6,11 +6,13 @@ import { ArrowLeftIcon, ArrowRightIcon } from './icon/ArrowIcons';
export function ArrowLink({
to,
children,
state,
direction = 'left',
variant = 'flat',
}: {
to: string;
children: ReactNode;
state?: { SerialPort?: string };
direction?: 'left' | 'right';
variant?: 'flat' | 'boxed' | 'boxed-2';
}) {
@@ -31,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>

View File

@@ -79,7 +79,7 @@ export function Dropdown({
{isOpen && (
<div
className={classNames(
'absolute z-10 rounded shadow right-0',
'absolute z-10 rounded shadow right-0 min-w-max',
direction === 'up' && 'bottom-[45px]',
direction === 'down' && 'top-[45px]',
variant == 'primary' && 'bg-background-60',

View File

@@ -1,8 +1,8 @@
import { useEffect, useMemo } from 'react';
import { useLocalization } from '@fluent/react';
import { useEffect, useMemo, useContext } from 'react';
import { useForm } from 'react-hook-form';
import { useTranslation } from 'react-i18next';
import { useConfig } from '../../hooks/config';
import i18next, { langs } from '../../i18n/config';
import { langs, LangContext } from '../../i18n/config';
import { Dropdown, DropdownDirection } from './Dropdown';
export function LangSelector({
@@ -10,7 +10,8 @@ export function LangSelector({
}: {
direction?: DropdownDirection;
}) {
const { t } = useTranslation();
const { changeLocales } = useContext(LangContext);
const { l10n } = useLocalization();
const { config, setConfig } = useConfig();
const { control, watch, handleSubmit } = useForm<{ lang: string }>({
defaultValues: { lang: config?.lang || 'en' },
@@ -27,7 +28,7 @@ export function LangSelector({
}, []);
const onSubmit = (value: { lang: string }) => {
i18next.changeLanguage(value.lang);
changeLocales([value.lang]);
setConfig({ lang: value.lang });
};
@@ -35,7 +36,9 @@ export function LangSelector({
<Dropdown
control={control}
name="lang"
placeholder={t('settings.interface.lang.placeholder')}
placeholder={l10n.getString(
'settings-general-interface-lang-placeholder'
)}
items={languagesItems}
direction={direction}
></Dropdown>

View File

@@ -1,4 +1,4 @@
import { t } from 'i18next';
import { useLocalization } from '@fluent/react';
import { useNavigate } from 'react-router-dom';
import { TrackerDataT } from 'solarxr-protocol';
import { useConfig } from '../../hooks/config';
@@ -8,6 +8,7 @@ import { TrackerCard } from '../tracker/TrackerCard';
import { TrackersTable } from '../tracker/TrackersTable';
export function Home() {
const { l10n } = useLocalization();
const { config } = useConfig();
const { trackers } = useTrackers();
const navigate = useNavigate();
@@ -22,7 +23,9 @@ export function Home() {
<div className="overflow-y-auto flex flex-col gap-2">
{trackers.length === 0 && (
<div className="flex px-5 pt-5 justify-center">
<Typography variant="standard">{t('home.no-trackers')}</Typography>
<Typography variant="standard">
{l10n.getString('home-no_trackers')}
</Typography>
</div>
)}

View File

@@ -1,5 +1,5 @@
import { useLocalization } from '@fluent/react';
import { useMemo } from 'react';
import { useTranslation } from 'react-i18next';
import { ResetRequestT, ResetType, RpcMessage } from 'solarxr-protocol';
import { useCountdown } from '../../hooks/countdown';
import { useWebsocketAPI } from '../../hooks/websocket-api';
@@ -8,7 +8,7 @@ import { Button } from '../commons/Button';
import {
MountingResetIcon,
QuickResetIcon,
ResetIcon
ResetIcon,
} from '../commons/icon/ResetIcon';
export function ResetButton({
@@ -20,7 +20,7 @@ export function ResetButton({
variant: 'big' | 'small';
onReseted?: () => void;
}) {
const { t } = useTranslation();
const { l10n } = useLocalization();
const { sendRPCPacket } = useWebsocketAPI();
const reset = () => {
@@ -39,13 +39,13 @@ export function ResetButton({
const text = useMemo(() => {
switch (type) {
case ResetType.Quick:
return t('reset.quick');
return l10n.getString('reset-quick');
case ResetType.Mounting:
return t('reset.mounting');
return l10n.getString('reset-mounting');
case ResetType.Full:
return t('reset.full');
return l10n.getString('reset-full');
}
return t('reset.full');
return l10n.getString('reset-full');
}, [type]);
const getIcon = () => {

View File

@@ -1,5 +1,5 @@
import { useLocalization } from '@fluent/react';
import { useMemo } from 'react';
import { useTranslation } from 'react-i18next';
import { BodyPart } from 'solarxr-protocol';
import { FlatDeviceTracker } from '../../hooks/app';
import { useTrackers } from '../../hooks/tracker';
@@ -15,7 +15,7 @@ export function BodyAssignment({
onlyAssigned: boolean;
onRoleSelected: (role: BodyPart) => void;
}) {
const { t } = useTranslation();
const { l10n } = useLocalization();
const { useAssignedTrackers } = useTrackers();
const assignedTrackers = useAssignedTrackers();

View File

@@ -1,13 +1,13 @@
import { useLocalization } from '@fluent/react';
import classNames from 'classnames';
import { useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useNavigate } from 'react-router-dom';
import {
CloseSerialRequestT,
OpenSerialRequestT,
RpcMessage,
SerialUpdateResponseT,
SetWifiRequestT
SetWifiRequestT,
} from 'solarxr-protocol';
import { useLayout } from '../../../hooks/layout';
import { useOnboarding } from '../../../hooks/onboarding';
@@ -29,16 +29,16 @@ type ConnectionStatus =
| 'START-CONNECTING';
const statusLabelMap = {
['CONNECTING']: 'onboarding.connect-tracker.connection-status.connecting',
['CONNECTED']: 'onboarding.connect-tracker.connection-status.connected',
['ERROR']: 'onboarding.connect-tracker.connection-status.error',
['CONNECTING']: 'onboarding-connect_tracker-connection_status-connecting',
['CONNECTED']: 'onboarding-connect_tracker-connection_status-connected',
['ERROR']: 'onboarding-connect_tracker-connection_status-error',
['START-CONNECTING']:
'onboarding.connect-tracker.connection-status.start-connecting',
['HANDSHAKE']: 'onboarding.connect-tracker.connection-status.start-handshake',
'onboarding-connect_tracker-connection_status-start_connecting',
['HANDSHAKE']: 'onboarding-connect_tracker-connection_status-handshake',
};
export function ConnectTrackersPage() {
const { t } = useTranslation();
const { l10n } = useLocalization();
const { layoutHeight, ref } = useLayout<HTMLDivElement>();
const { trackers, useConnectedTrackers } = useTrackers();
const { applyProgress, state, skipSetup } = useOnboarding();
@@ -135,17 +135,17 @@ export function ConnectTrackersPage() {
<div className="flex flex-col w-full max-w-sm">
{!state.alonePage && (
<ArrowLink to="/onboarding/wifi-creds">
{t('onboarding.connect-tracker.back')}
{l10n.getString('onboarding-connect_tracker-back')}
</ArrowLink>
)}
<Typography variant="main-title">
{t('onboarding.connect-tracker.title')}
{l10n.getString('onboarding-connect_tracker-title')}
</Typography>
<Typography color="secondary">
{t('onboarding.connect-tracker.description.p0')}
{l10n.getString('onboarding-connect_tracker-description-p0')}
</Typography>
<Typography color="secondary">
{t('onboarding.connect-tracker.description.p1')}
{l10n.getString('onboarding-connect_tracker-description-p1')}
</Typography>
<div className="flex flex-col gap-2 py-5">
{/* <ArrowLink
@@ -157,13 +157,14 @@ export function ConnectTrackersPage() {
</ArrowLink> */}
<ArrowLink
to="/settings/serial"
state={{ SerialPort: 'Auto' }}
direction="right"
variant={state.alonePage ? 'boxed-2' : 'boxed'}
>
{t('onboarding.connect-tracker.issue.serial')}
{l10n.getString('onboarding-connect_tracker-issue-serial')}
</ArrowLink>
</div>
<TipBox>{t('tips.find-tracker')}</TipBox>
<TipBox>{l10n.getString('tips-find_tracker')}</TipBox>
<div
className={classNames(
@@ -179,17 +180,17 @@ export function ConnectTrackersPage() {
</div>
<div className="flex flex-col">
<Typography bold>
{t('onboarding.connect-tracker.usb')}
{l10n.getString('onboarding-connect_tracker-usb')}
</Typography>
<Typography color="secondary">
{t(statusLabelMap[connectionStatus])}
{l10n.getString(statusLabelMap[connectionStatus])}
</Typography>
</div>
</div>
</div>
<div className="flex flex-col flex-grow">
<Typography color="secondary" bold>
{t('onboarding.connect-tracker.connected-trackers', {
{l10n.getString('onboarding-connect_tracker-connected_trackers', {
amount: connectedTrackers.length,
})}
</Typography>
@@ -236,19 +237,19 @@ export function ConnectTrackersPage() {
<div className="flex flex-grow">
{!state.alonePage && (
<Button variant="secondary" to="/" onClick={skipSetup}>
{t('onboarding.skip')}
{l10n.getString('onboarding-skip')}
</Button>
)}
</div>
<div className="flex gap-3">
{!state.alonePage && (
<Button variant="primary" to="/onboarding/trackers-assign">
{t('onboarding.connect-tracker.next')}
{l10n.getString('onboarding-connect_tracker-next')}
</Button>
)}
{state.alonePage && (
<Button variant="primary" to="/">
{t('onboarding.connect-tracker.next')}
{l10n.getString('onboarding-connect_tracker-next')}
</Button>
)}
</div>

View File

@@ -1,11 +1,11 @@
import { useTranslation } from 'react-i18next';
import { useLocalization } from '@fluent/react';
import { useOnboarding } from '../../../hooks/onboarding';
import { Button } from '../../commons/Button';
import { SlimeVRIcon } from '../../commons/icon/SimevrIcon';
import { Typography } from '../../commons/Typography';
export function DonePage() {
const { t } = useTranslation();
const { l10n } = useLocalization();
const { applyProgress, skipSetup } = useOnboarding();
applyProgress(1);
@@ -15,15 +15,15 @@ export function DonePage() {
<div className="flex flex-col gap-5 items-center z-10">
<SlimeVRIcon></SlimeVRIcon>
<Typography variant="main-title">
{t('onboarding.done.title')}
{l10n.getString('onboarding-done-title')}
</Typography>
<div className="flex flex-col items-center">
<Typography color="secondary">
{t('onboarding.done.description')}
{l10n.getString('onboarding-done-description')}
</Typography>
</div>
<Button variant="primary" to="/" onClick={skipSetup}>
{t('onboarding.done.close')}
{l10n.getString('onboarding-done-close')}
</Button>
</div>
</div>

View File

@@ -1,11 +1,11 @@
import { useTranslation } from 'react-i18next';
import { useLocalization } from '@fluent/react';
import { useOnboarding } from '../../../hooks/onboarding';
import { ArrowLink } from '../../commons/ArrowLink';
import { Button } from '../../commons/Button';
import { Typography } from '../../commons/Typography';
export function EnterVRPage() {
const { t } = useTranslation();
const { l10n } = useLocalization();
const { applyProgress, skipSetup } = useOnboarding();
applyProgress(0.6);
@@ -17,13 +17,13 @@ export function EnterVRPage() {
<div className="flex gap-8">
<div className="flex flex-col max-w-md gap-3">
<ArrowLink to="/onboarding/trackers-assign" direction="left">
{t('onboarding.enter-vr.back')}
{l10n.getString('onboarding-enter_vr-back')}
</ArrowLink>
<Typography variant="main-title">
{t('onboarding.enter-vr.title')}
{l10n.getString('onboarding-enter_vr-title')}
</Typography>
<Typography color="secondary">
{t('onboarding.enter-vr.description')}
{l10n.getString('onboarding-enter_vr-description')}
</Typography>
</div>
{/* <div className="flex flex-col flex-grow gap-3 rounded-xl fill-background-50">
@@ -34,12 +34,12 @@ export function EnterVRPage() {
<div className="w-full py-4 flex flex-row">
<div className="flex flex-grow">
<Button variant="secondary" to="/" onClick={skipSetup}>
{t('onboarding.skip')}
{l10n.getString('onboarding-skip')}
</Button>
</div>
<div className="flex gap-3">
<Button variant="primary" to="/onboarding/mounting/auto">
{t('onboarding.enter-vr.ready')}
{l10n.getString('onboarding-enter_vr-ready')}
</Button>
</div>
</div>

View File

@@ -1,4 +1,4 @@
import { useTranslation } from 'react-i18next';
import { useLocalization } from '@fluent/react';
import { NavLink } from 'react-router-dom';
import { useOnboarding } from '../../../hooks/onboarding';
import { Button } from '../../commons/Button';
@@ -7,7 +7,7 @@ import { LangSelector } from '../../commons/LangSelector';
import { Typography } from '../../commons/Typography';
export function HomePage() {
const { t } = useTranslation();
const { l10n } = useLocalization();
const { applyProgress, skipSetup } = useOnboarding();
applyProgress(0.1);
@@ -17,21 +17,27 @@ export function HomePage() {
<div className="flex flex-col gap-5 items-center z-10">
<SlimeVRIcon></SlimeVRIcon>
<Typography variant="main-title">
{t('onboarding.home.title')}
{l10n.getString('onboarding-home')}
</Typography>
<div className="flex flex-col items-center">
<Typography color="secondary">
{t('onboarding.home.description.p0')}
</Typography>
<Typography color="secondary">
{t('onboarding.home.description.p1')}
</Typography>
<>
{l10n
.getString('onboarding-home-description')
.split('\n')
.map((line, i) => (
<Typography color="secondary" key={i}>
{line}
</Typography>
))}
</>
</div>
<Button variant="primary" to="/onboarding/wifi-creds">
{t('onboarding.home.start')}
{l10n.getString('onboarding-home-start')}
</Button>
<NavLink to="/" onClick={skipSetup}>
<Typography color="secondary">{t('onboarding.skip')}</Typography>
<Typography color="secondary">
{l10n.getString('onboarding-skip')}
</Typography>
</NavLink>
</div>
<div className="absolute right-4 bottom-4 z-50">

View File

@@ -1,11 +1,11 @@
import { useTranslation } from 'react-i18next';
import { useLocalization } from '@fluent/react';
import { useOnboarding } from '../../../hooks/onboarding';
import { ArrowLink } from '../../commons/ArrowLink';
import { Button } from '../../commons/Button';
import { Typography } from '../../commons/Typography';
export function ResetTutorialPage() {
const { t } = useTranslation();
const { l10n } = useLocalization();
const { applyProgress, skipSetup } = useOnboarding();
applyProgress(0.8);
@@ -17,16 +17,16 @@ export function ResetTutorialPage() {
<div className="flex gap-8">
<div className="flex flex-col max-w-md gap-3">
<ArrowLink to="/onboarding/mounting/auto" direction="left">
{t('onboarding.reset-tutorial.back')}
{l10n.getString('onboarding-reset_tutorial-back')}
</ArrowLink>
<Typography variant="main-title">
{t('onboarding.reset-tutorial.title')}
{l10n.getString('onboarding-reset_tutorial')}
<span className="mx-2 p-1 bg-accent-background-30 text-standard rounded-md">
{t('onboarding.wip')}
{l10n.getString('onboarding-wip')}
</span>
</Typography>
<Typography color="secondary">
{t('onboarding.reset-tutorial.description')}
{l10n.getString('onboarding-reset_tutorial-description')}
</Typography>
</div>
</div>
@@ -34,12 +34,12 @@ export function ResetTutorialPage() {
<div className="w-full py-4 flex flex-row">
<div className="flex flex-grow">
<Button variant="secondary" to="/" onClick={skipSetup}>
{t('onboarding.skip')}
{l10n.getString('onboarding-skip')}
</Button>
</div>
<div className="flex gap-3">
<Button variant="primary" to="/onboarding/body-proportions/auto">
{t('onboarding.continue')}
{l10n.getString('onboarding-continue')}
</Button>
</div>
</div>

View File

@@ -1,4 +1,4 @@
import { useTranslation } from 'react-i18next';
import { useLocalization } from '@fluent/react';
import { useOnboarding } from '../../../hooks/onboarding';
import { useWifiForm } from '../../../hooks/wifi-form';
import { ArrowLink } from '../../commons/ArrowLink';
@@ -6,7 +6,7 @@ import { Button } from '../../commons/Button';
import { Typography } from '../../commons/Typography';
export function WifiCredsPage() {
const { t } = useTranslation();
const { l10n } = useLocalization();
const { applyProgress, skipSetup } = useOnboarding();
const { WifiForm, handleSubmit, submitWifiCreds, formState } = useWifiForm();
applyProgress(0.2);
@@ -20,17 +20,21 @@ export function WifiCredsPage() {
<div className="flex gap-10">
<div className="flex flex-col max-w-sm">
<ArrowLink to="/onboarding/home" direction="left">
{t('onboarding.wifi-creds.back')}
{l10n.getString('onboarding-wifi_creds-back')}
</ArrowLink>
<Typography variant="main-title">
{t('onboarding.wifi-creds.title')}
</Typography>
<Typography color="secondary">
{t('onboarding.wifi-creds.description.p0')}
</Typography>
<Typography color="secondary">
{t('onboarding.wifi-creds.description.p1')}
{l10n.getString('onboarding-wifi_creds')}
</Typography>
<>
{l10n
.getString('onboarding-wifi_creds-description')
.split('\n')
.map((line, i) => (
<Typography color="secondary" key={i}>
{line}
</Typography>
))}
</>
</div>
<div className="flex flex-col bg-background-70 gap-3 p-10 rounded-xl max-w-sm">
<WifiForm></WifiForm>
@@ -40,15 +44,15 @@ export function WifiCredsPage() {
<div className="w-full py-4 flex flex-row">
<div className="flex flex-grow">
<Button variant="secondary" to="/" onClick={skipSetup}>
{t('onboarding.skip')}
{l10n.getString('onboarding-skip')}
</Button>
</div>
<div className="flex gap-3">
<Button variant="secondary" to="/onboarding/trackers-assign">
{t('onboarding.wifi-creds.skip')}
{l10n.getString('onboarding-wifi_creds-skip')}
</Button>
<Button type="submit" variant="primary" disabled={!formState.isValid}>
{t('onboarding.wifi-creds.submit')}
{l10n.getString('onboarding-wifi_creds-submit')}
</Button>
</div>
</div>

View File

@@ -1,9 +1,9 @@
import { useLocalization } from '@fluent/react';
import { useState } from 'react';
import { useTranslation } from 'react-i18next';
import { RpcMessage, SkeletonResetAllRequestT } from 'solarxr-protocol';
import {
AutoboneContextC,
useProvideAutobone
useProvideAutobone,
} from '../../../../hooks/autobone';
import { useOnboarding } from '../../../../hooks/onboarding';
import { useWebsocketAPI } from '../../../../hooks/websocket-api';
@@ -19,7 +19,7 @@ import { StartRecording } from './autobone-steps/StartRecording';
import { VerifyResultsStep } from './autobone-steps/VerifyResults';
export function AutomaticProportionsPage() {
const { t } = useTranslation();
const { l10n } = useLocalization();
const { applyProgress, skipSetup, state } = useOnboarding();
const { sendRPCPacket } = useWebsocketAPI();
const context = useProvideAutobone();
@@ -46,15 +46,15 @@ export function AutomaticProportionsPage() {
<div className="flex flex-col max-w-lg gap-3">
{!state.alonePage && (
<ArrowLink to="/onboarding/reset-tutorial" direction="left">
{t('onboarding.automatic-proportions.back')}
{l10n.getString('onboarding-automatic_proportions-back')}
</ArrowLink>
)}
<Typography variant="main-title">
{t('onboarding.automatic-proportions.title')}
{l10n.getString('onboarding-automatic_proportions-title')}
</Typography>
<div>
<Typography color="secondary">
{t('onboarding.automatic-proportions.description')}
{l10n.getString('onboarding-automatic_proportions-description')}
</Typography>
</div>
</div>
@@ -76,7 +76,7 @@ export function AutomaticProportionsPage() {
<div className="flex flex-grow gap-3">
{!state.alonePage && (
<Button variant="secondary" to="/" onClick={skipSetup}>
{t('onboarding.skip')}
{l10n.getString('onboarding-skip')}
</Button>
)}
<Button
@@ -84,7 +84,7 @@ export function AutomaticProportionsPage() {
onClick={resetAll}
disabled={resetDisabled}
>
{t('reset.reset-all')}
{l10n.getString('reset-reset_all')}
</Button>
</div>
<div className="flex gap-3">
@@ -93,11 +93,11 @@ export function AutomaticProportionsPage() {
state={{ alonePage: state.alonePage }}
to="/onboarding/body-proportions/manual"
>
{t('onboarding.automatic-proportions.manual')}
{l10n.getString('onboarding-automatic_proportions-manual')}
</Button>
{!state.alonePage && (
<Button variant="primary" to="/onboarding/done">
{t('onboarding.continue')}
{l10n.getString('onboarding-continue')}
</Button>
)}
</div>

View File

@@ -1,18 +1,18 @@
import { useLocalization } from '@fluent/react';
import classNames from 'classnames';
import {
MouseEventHandler,
ReactNode,
useEffect,
useMemo,
useState
useState,
} from 'react';
import { useTranslation } from 'react-i18next';
import {
ChangeSkeletonConfigRequestT,
RpcMessage,
SkeletonBone,
SkeletonConfigRequestT,
SkeletonConfigResponseT
SkeletonConfigResponseT,
} from 'solarxr-protocol';
import { useWebsocketAPI } from '../../../../hooks/websocket-api';
import { Typography } from '../../../commons/Typography';
@@ -45,7 +45,7 @@ export function BodyProportions({
precise: boolean;
variant: 'onboarding' | 'alone';
}) {
const { t } = useTranslation();
const { l10n } = useLocalization();
const { useRPCPacket, sendRPCPacket } = useWebsocketAPI();
const [config, setConfig] = useState<Omit<
SkeletonConfigResponseT,
@@ -56,7 +56,7 @@ export function BodyProportions({
return (
config?.skeletonParts.map(({ bone, value }) => ({
bone,
label: t('skeleton-bone.' + SkeletonBone[bone]),
label: l10n.getString('skeleton_bone-' + SkeletonBone[bone]),
value,
})) || []
);

View File

@@ -1,5 +1,4 @@
import { useForm } from 'react-hook-form';
import { useTranslation } from 'react-i18next';
import { RpcMessage, SkeletonResetAllRequestT } from 'solarxr-protocol';
import { useOnboarding } from '../../../../hooks/onboarding';
import { useWebsocketAPI } from '../../../../hooks/websocket-api';
@@ -9,9 +8,10 @@ import { CheckBox } from '../../../commons/Checkbox';
import { PersonFrontIcon } from '../../../commons/PersonFrontIcon';
import { Typography } from '../../../commons/Typography';
import { BodyProportions } from './BodyProportions';
import { useLocalization } from '@fluent/react';
export function ManualProportionsPage() {
const { t } = useTranslation();
const { l10n } = useLocalization();
const { applyProgress, skipSetup, state } = useOnboarding();
const { sendRPCPacket } = useWebsocketAPI();
@@ -38,15 +38,17 @@ export function ManualProportionsPage() {
<div className="flex flex-col">
{!state.alonePage && (
<ArrowLink to="/onboarding/reset-tutorial" direction="left">
{t('onboarding.manual-proportions.back')}
{l10n.getString('onboarding-manual_proportions-back')}
</ArrowLink>
)}
<Typography variant="main-title">
{t('onboarding.manual-proportions.title')}
{l10n.getString('onboarding-manual_proportions-title')}
</Typography>
<CheckBox
control={control}
label={t('onboarding.manual-proportions.precision')}
label={l10n.getString(
'onboarding-manual_proportions-precision'
)}
name="precise"
variant="toggle"
></CheckBox>
@@ -65,11 +67,11 @@ export function ManualProportionsPage() {
<div className="flex flex-grow gap-3">
{!state.alonePage && (
<Button variant="secondary" to="/" onClick={skipSetup}>
{t('onboarding.skip')}
{l10n.getString('onboarding-skip')}
</Button>
)}
<Button variant="secondary" onClick={resetAll}>
{t('reset.reset-all')}
{l10n.getString('reset-reset_all')}
</Button>
</div>
<div className="flex gap-3">
@@ -78,11 +80,11 @@ export function ManualProportionsPage() {
state={{ alonePage: state.alonePage }}
to="/onboarding/body-proportions/auto"
>
{t('onboarding.manual-proportions.auto')}
{l10n.getString('onboarding-manual_proportions-auto')}
</Button>
{!state.alonePage && (
<Button variant="primary" to="/onboarding/done">
{t('onboarding.continue')}
{l10n.getString('onboarding-continue')}
</Button>
)}
</div>

View File

@@ -1,15 +1,17 @@
import { t } from 'i18next';
import { Typography } from '../../../../commons/Typography';
import { useLocalization } from '@fluent/react';
export function DoneStep() {
const { l10n } = useLocalization();
return (
<div className="flex flex-col items-center w-full justify-center gap-5">
<div className="flex gap-1 flex-col justify-center items-center">
<Typography variant="section-title">
{t('onboarding.automatic-proportions.done.title')}
{l10n.getString('onboarding-automatic_proportions-done-title')}
</Typography>
<Typography color="secondary">
{t('onboarding.automatic-proportions.done.description')}
{l10n.getString('onboarding-automatic_proportions-done-description')}
</Typography>
</div>
</div>

View File

@@ -1,7 +1,7 @@
import { useTranslation } from 'react-i18next';
import { Button } from '../../../../commons/Button';
import { FromtOfChairIcon } from '../../../../commons/icon/FrontOfChair';
import { Typography } from '../../../../commons/Typography';
import { useLocalization } from '@fluent/react';
export function PreparationStep({
nextStep,
@@ -12,18 +12,22 @@ export function PreparationStep({
prevStep: () => void;
variant: 'onboarding' | 'alone';
}) {
const { t } = useTranslation();
const { l10n } = useLocalization();
return (
<>
<div className="flex flex-col flex-grow">
<div className="flex flex-grow flex-col gap-4 max-w-sm">
<Typography variant="main-title" bold>
{t('onboarding.automatic-proportions.preparation.title')}
{l10n.getString(
'onboarding-automatic_proportions-preparation-title'
)}
</Typography>
<div>
<Typography color="secondary">
{t('onboarding.automatic-proportions.preparation.description')}
{l10n.getString(
'onboarding-automatic_proportions-preparation-description'
)}
</Typography>
</div>
</div>
@@ -33,10 +37,12 @@ export function PreparationStep({
variant={variant === 'onboarding' ? 'secondary' : 'tiertiary'}
onClick={prevStep}
>
{t('onboarding.automatic-proportions.prev-step')}
{l10n.getString('onboarding-automatic_proportions-prev_step')}
</Button>
<Button variant="primary" onClick={nextStep}>
{t('onboarding.automatic-proportions.preparation.next')}
{l10n.getString(
'onboarding-automatic_proportions-preparation-next'
)}
</Button>
</div>
</div>

View File

@@ -1,12 +1,12 @@
import { useTranslation } from 'react-i18next';
import { useTrackers } from '../../../../../hooks/tracker';
import { BodyDisplay } from '../../../../commons/BodyDisplay';
import { Button } from '../../../../commons/Button';
import { TipBox } from '../../../../commons/TipBox';
import { Typography } from '../../../../commons/Typography';
import { useLocalization } from '@fluent/react';
export function PutTrackersOnStep({ nextStep }: { nextStep: () => void }) {
const { t } = useTranslation();
const { l10n } = useLocalization();
const { trackers } = useTrackers();
return (
@@ -14,23 +14,27 @@ export function PutTrackersOnStep({ nextStep }: { nextStep: () => void }) {
<div className="flex flex-col flex-grow">
<div className="flex flex-grow flex-col gap-4 max-w-sm">
<Typography variant="main-title" bold>
{t('onboarding.automatic-proportions.put-trackers-on.title')}
{l10n.getString(
'onboarding-automatic_proportions-put_trackers_on-title'
)}
</Typography>
<div>
<Typography color="secondary">
{t(
'onboarding.automatic-proportions.put-trackers-on.description'
{l10n.getString(
'onboarding-automatic_proportions-put_trackers_on-description'
)}
</Typography>
</div>
<div className="flex">
<TipBox>{t('tips.find-tracker')}</TipBox>
<TipBox>{l10n.getString('tips-find_tracker')}</TipBox>
</div>
</div>
<div className="flex">
<Button variant="primary" onClick={nextStep}>
{t('onboarding.automatic-proportions.put-trackers-on.next')}
{l10n.getString(
'onboarding-automatic_proportions-put_trackers_on-next'
)}
</Button>
</div>
</div>

View File

@@ -1,12 +1,12 @@
import { useEffect } from 'react';
import { useTranslation } from 'react-i18next';
import { useAutobone } from '../../../../../hooks/autobone';
import { ProgressBar } from '../../../../commons/ProgressBar';
import { TipBox } from '../../../../commons/TipBox';
import { Typography } from '../../../../commons/Typography';
import { useLocalization } from '@fluent/react';
export function Recording({ nextStep }: { nextStep: () => void }) {
const { t } = useTranslation();
const { l10n } = useLocalization();
const { progress, hasCalibration, hasRecording } = useAutobone();
useEffect(() => {
@@ -15,52 +15,59 @@ export function Recording({ nextStep }: { nextStep: () => void }) {
}
}, [progress, hasCalibration]);
console.log(t('onboarding.automatic-proportions.recording.steps'));
return (
<div className="flex flex-col items-center w-full justify-between">
<div className="flex gap-1 flex-col justify-center items-center">
<div className="flex text-status-critical justify-center items-center gap-1">
<div className="w-2 h-2 rounded-lg bg-status-critical"></div>
<Typography color="text-status-critical">
{t('onboarding.automatic-proportions.recording.title')}
{l10n.getString('onboarding-automatic_proportions-recording-title')}
</Typography>
</div>
<Typography variant="section-title">
{t('onboarding.automatic-proportions.recording.description.p0')}
{l10n.getString(
'onboarding-automatic_proportions-recording-description-p0'
)}
</Typography>
<Typography color="secondary">
{t('onboarding.automatic-proportions.recording.description.p1')}
{l10n.getString(
'onboarding-automatic_proportions-recording-description-p1'
)}
</Typography>
</div>
<div>
<Typography color="secondary">
{t('onboarding.automatic-proportions.recording.steps.0')}
{l10n.getString('onboarding-automatic_proportions-recording-steps-0')}
</Typography>
<Typography color="secondary">
{t('onboarding.automatic-proportions.recording.steps.1')}
{l10n.getString('onboarding-automatic_proportions-recording-steps-1')}
</Typography>
<Typography color="secondary">
{t('onboarding.automatic-proportions.recording.steps.2')}
{l10n.getString('onboarding-automatic_proportions-recording-steps-2')}
</Typography>
<Typography color="secondary">
{t('onboarding.automatic-proportions.recording.steps.3')}
{l10n.getString('onboarding-automatic_proportions-recording-steps-3')}
</Typography>
<Typography color="secondary">
{t('onboarding.automatic-proportions.recording.steps.4')}
{l10n.getString('onboarding-automatic_proportions-recording-steps-4')}
</Typography>
</div>
<div className="flex">
<TipBox>{t('tips.do-not-move-heels')}</TipBox>
<TipBox>{l10n.getString('tips-do_not_move_heels')}</TipBox>
</div>
<div className="flex flex-col gap-2 items-center w-full max-w-[150px]">
<ProgressBar progress={progress} height={2}></ProgressBar>
<Typography color="secondary">
{!hasCalibration && hasRecording
? t('onboarding.automatic-proportions.recording.processing')
: t('onboarding.automatic-proportions.recording.timer', {
time: 15,
})}
? l10n.getString(
'onboarding-automatic_proportions-recording-processing'
)
: l10n.getString(
'onboarding-automatic_proportions-recording-timer',
{
time: 15,
}
)}
</Typography>
</div>
</div>

View File

@@ -1,8 +1,8 @@
import { useTranslation } from 'react-i18next';
import { useAutobone } from '../../../../../hooks/autobone';
import { Button } from '../../../../commons/Button';
import { TipBox } from '../../../../commons/TipBox';
import { Typography } from '../../../../commons/Typography';
import { useLocalization } from '@fluent/react';
export function StartRecording({
nextStep,
@@ -13,7 +13,7 @@ export function StartRecording({
prevStep: () => void;
variant: 'onboarding' | 'alone';
}) {
const { t } = useTranslation();
const { l10n } = useLocalization();
const { startRecording } = useAutobone();
const start = () => {
@@ -26,17 +26,19 @@ export function StartRecording({
<div className="flex flex-col flex-grow">
<div className="flex flex-grow flex-col gap-4 max-w-sm">
<Typography variant="main-title" bold>
{t('onboarding.automatic-proportions.start-recording.title')}
{l10n.getString(
'onboarding-automatic_proportions-start_recording-title'
)}
</Typography>
<div>
<Typography color="secondary">
{t(
'onboarding.automatic-proportions.start-recording.description'
{l10n.getString(
'onboarding-automatic_proportions-start_recording-description'
)}
</Typography>
</div>
<div className="flex">
<TipBox>{t('tips.find-tracker')}</TipBox>
<TipBox>{l10n.getString('tips-find_tracker')}</TipBox>
</div>
</div>
@@ -45,10 +47,12 @@ export function StartRecording({
variant={variant === 'onboarding' ? 'secondary' : 'tiertiary'}
onClick={prevStep}
>
{t('onboarding.automatic-proportions.prev-step')}
{l10n.getString('onboarding-automatic_proportions-prev_step')}
</Button>
<Button variant="primary" onClick={start}>
{t('onboarding.automatic-proportions.start-recording.next')}
{l10n.getString(
'onboarding-automatic_proportions-start_recording-next'
)}
</Button>
</div>
</div>

View File

@@ -1,8 +1,8 @@
import classNames from 'classnames';
import { useTranslation } from 'react-i18next';
import { useAutobone } from '../../../../../hooks/autobone';
import { Button } from '../../../../commons/Button';
import { Typography } from '../../../../commons/Typography';
import { useLocalization } from '@fluent/react';
export function VerifyResultsStep({
nextStep,
@@ -13,7 +13,7 @@ export function VerifyResultsStep({
prevStep: () => void;
variant: 'onboarding' | 'alone';
}) {
const { t } = useTranslation();
const { l10n } = useLocalization();
const {
startRecording,
hasCalibration,
@@ -37,18 +37,24 @@ export function VerifyResultsStep({
<div className="flex flex-col flex-grow justify-between gap-1">
<div className="flex flex-col gap-1 max-w-sm">
<Typography variant="main-title" bold>
{t('onboarding.automatic-proportions.verify-results.title')}
{l10n.getString(
'onboarding-automatic_proportions-verify_results-title'
)}
</Typography>
<div>
<Typography color="secondary">
{t('onboarding.automatic-proportions.verify-results.description')}
{l10n.getString(
'onboarding-automatic_proportions-verify_results-description'
)}
</Typography>
</div>
</div>
<div className="flex w-full items-center flex-col">
<div className="flex flex-col pt-1 gap-2 justify-center w-full max-w-xs">
<Typography bold>
{t('onboarding.automatic-proportions.verify-results.results')}
{l10n.getString(
'onboarding-automatic_proportions-verify_results-results'
)}
</Typography>
<div
className={classNames(
@@ -65,8 +71,8 @@ export function VerifyResultsStep({
))}
{!hasCalibration && hasRecording && (
<Typography>
{t(
'onboarding.automatic-proportions.verify-results.processing'
{l10n.getString(
'onboarding-automatic-proportions-verify-results-processing'
)}
</Typography>
)}
@@ -78,10 +84,14 @@ export function VerifyResultsStep({
variant={variant === 'onboarding' ? 'secondary' : 'tiertiary'}
onClick={redo}
>
{t('onboarding.automatic-proportions.verify-results.redo')}
{l10n.getString(
'onboarding-automatic_proportions-verify_results-redo'
)}
</Button>
<Button variant="primary" onClick={apply}>
{t('onboarding.automatic-proportions.verify-results.confirm')}
{l10n.getString(
'onboarding-automatic_proportions-verify_results-confirm'
)}
</Button>
</div>
</div>

View File

@@ -1,4 +1,3 @@
import { useTranslation } from 'react-i18next';
import { useOnboarding } from '../../../../hooks/onboarding';
import { ArrowLink } from '../../../commons/ArrowLink';
import { Button } from '../../../commons/Button';
@@ -8,9 +7,10 @@ import { DoneStep } from './mounting-steps/Done';
import { MountingResetStep } from './mounting-steps/MountingReset';
import { PreparationStep } from './mounting-steps/Preparation';
import { PutTrackersOnStep } from './mounting-steps/PutTrackersOn';
import { useLocalization } from '@fluent/react';
export function AutomaticMountingPage() {
const { t } = useTranslation();
const { l10n } = useLocalization();
const { applyProgress, skipSetup, state } = useOnboarding();
applyProgress(0.7);
@@ -22,14 +22,14 @@ export function AutomaticMountingPage() {
<div className="flex flex-col max-w-lg gap-3">
{!state.alonePage && (
<ArrowLink to="/onboarding/enter-vr" direction="left">
{t('onboarding.automatic-mounting.back')}
{l10n.getString('onboarding-automatic_mounting-back')}
</ArrowLink>
)}
<Typography variant="main-title">
{t('onboarding.automatic-mounting.title')}
{l10n.getString('onboarding-automatic_mounting-title')}
</Typography>
<Typography color="secondary">
{t('onboarding.automatic-mounting.description')}
{l10n.getString('onboarding-automatic_mounting-description')}
</Typography>
</div>
<div className="flex">
@@ -48,7 +48,7 @@ export function AutomaticMountingPage() {
<div className="flex flex-grow gap-3">
{!state.alonePage && (
<Button variant="secondary" to="/" onClick={skipSetup}>
{t('onboarding.skip')}
{l10n.getString('onboarding-skip')}
</Button>
)}
</div>
@@ -58,11 +58,11 @@ export function AutomaticMountingPage() {
state={{ alonePage: state.alonePage }}
to="/onboarding/mounting/manual"
>
{t('onboarding.automatic-mounting.manual-mounting')}
{l10n.getString('onboarding-automatic_mounting-manual_mounting')}
</Button>
{!state.alonePage && (
<Button variant="primary" to="/onboarding/reset-tutorial">
{t('onboarding.automatic-mounting.next')}
{l10n.getString('onboarding-automatic_mounting-next')}
</Button>
)}
</div>

View File

@@ -1,4 +1,3 @@
import { t } from 'i18next';
import Quaternion from 'quaternion';
import { useMemo, useState } from 'react';
import { AssignTrackerRequestT, BodyPart, RpcMessage } from 'solarxr-protocol';
@@ -13,8 +12,10 @@ import { TipBox } from '../../../commons/TipBox';
import { Typography } from '../../../commons/Typography';
import { BodyAssignment } from '../../BodyAssignment';
import { MountingSelectionMenu } from './MountingSelectionMenu';
import { useLocalization } from '@fluent/react';
export function ManualMountingPage() {
const { l10n } = useLocalization();
const { applyProgress, skipSetup, state } = useOnboarding();
const { sendRPCPacket } = useWebsocketAPI();
@@ -45,7 +46,7 @@ export function ManualMountingPage() {
const assignreq = new AssignTrackerRequestT();
assignreq.bodyPosition = td.tracker.info?.bodyPart || BodyPart.NONE;
assignreq.mountingRotation = QuaternionToQuatT(
assignreq.mountingOrientation = QuaternionToQuatT(
Quaternion.fromEuler(0, +mountingOrientation, 0)
);
assignreq.trackerId = td.tracker.trackerId;
@@ -68,16 +69,16 @@ export function ManualMountingPage() {
<div className="flex flex-col w-full max-w-md gap-3">
{!state.alonePage && (
<ArrowLink to="/onboarding/enter-vr" direction="left">
{t('onboarding.manual-mounting.back')}
{l10n.getString('onboarding-manual_mounting-back')}
</ArrowLink>
)}
<Typography variant="main-title">
{t('onboarding.manual-mounting.title')}
{l10n.getString('onboarding-manual_mounting')}
</Typography>
<Typography color="secondary">
{t('onboarding.manual-mounting.description')}
{l10n.getString('onboarding-manual_mounting-description')}
</Typography>
<TipBox>{t('tips.find-tracker')}</TipBox>
<TipBox>{l10n.getString('tips-find_tracker')}</TipBox>
</div>
<div className="flex flex-col flex-grow gap-3 rounded-xl fill-background-50">
<BodyAssignment
@@ -92,7 +93,7 @@ export function ManualMountingPage() {
<div className="flex flex-grow">
{!state.alonePage && (
<Button variant="secondary" to="/" onClick={skipSetup}>
{t('onboarding.skip')}
{l10n.getString('onboarding-skip')}
</Button>
)}
</div>
@@ -102,11 +103,11 @@ export function ManualMountingPage() {
state={{ alonePage: state.alonePage }}
to="/onboarding/mounting/auto"
>
{t('onboarding.manual-mounting.auto-mounting')}
{l10n.getString('onboarding-manual_mounting-auto_mounting')}
</Button>
{!state.alonePage && (
<Button variant="primary" to="/onboarding/reset-tutorial">
{t('onboarding.manual-mounting.next')}
{l10n.getString('onboarding-manual_mounting-next')}
</Button>
)}
</div>

View File

@@ -1,12 +1,12 @@
import classNames from 'classnames';
import { MouseEventHandler } from 'react';
import { useTranslation } from 'react-i18next';
import ReactModal from 'react-modal';
import { useElemSize, useLayout } from '../../../../hooks/layout';
import { Button } from '../../../commons/Button';
import { FootIcon } from '../../../commons/icon/FootIcon';
import { Typography } from '../../../commons/Typography';
import { rotationToQuatMap } from '../../../tracker/TrackerSettings';
import { useLocalization } from '@fluent/react';
function MoutingOrientationCard({
orientation,
@@ -39,7 +39,7 @@ export function MountingSelectionMenu({
onClose: () => void;
onDirectionSelected: (direction: number) => void;
}) {
const { t } = useTranslation();
const { l10n } = useLocalization();
const { ref: refTrackers, layoutHeight: trackersHeight } =
useLayout<HTMLDivElement>();
const { ref: refOptions, height: optionsHeight } =
@@ -60,7 +60,7 @@ export function MountingSelectionMenu({
>
<div className="flex w-full h-full flex-col ">
<Typography variant="main-title" bold>
{t('mounting-selection-menu.title')}
{l10n.getString('mounting_selection_menu')}
</Typography>
<div
className="flex w-full flex-col flex-grow items-center gap-3 justify-center"
@@ -69,19 +69,19 @@ export function MountingSelectionMenu({
>
<div className="grid grid-cols-2 grid-rows-2 gap-6 w-full">
<MoutingOrientationCard
orientation={t('tracker.rotation.left')}
orientation={l10n.getString('tracker-rotation-left')}
onClick={() => onDirectionSelected(rotationToQuatMap.LEFT)}
/>
<MoutingOrientationCard
orientation={t('tracker.rotation.right')}
orientation={l10n.getString('tracker-rotation-right')}
onClick={() => onDirectionSelected(rotationToQuatMap.RIGHT)}
/>
<MoutingOrientationCard
orientation={t('tracker.rotation.front')}
orientation={l10n.getString('tracker-rotation-front')}
onClick={() => onDirectionSelected(rotationToQuatMap.FRONT)}
/>
<MoutingOrientationCard
orientation={t('tracker.rotation.back')}
orientation={l10n.getString('tracker-rotation-back')}
onClick={() => onDirectionSelected(rotationToQuatMap.BACK)}
/>
</div>
@@ -94,7 +94,7 @@ export function MountingSelectionMenu({
>
<div className="flex flex-col justify-end pointer-events-auto">
<Button variant="primary" onClick={onClose}>
{t('mounting-selection-menu.close')}
{l10n.getString('mounting_selection_menu-close')}
</Button>
</div>
</div>

View File

@@ -1,6 +1,6 @@
import { useTranslation } from 'react-i18next';
import { Button } from '../../../../commons/Button';
import { Typography } from '../../../../commons/Typography';
import { useLocalization } from '@fluent/react';
export function DoneStep({
resetSteps,
@@ -11,16 +11,16 @@ export function DoneStep({
resetSteps: () => void;
variant: 'onboarding' | 'alone';
}) {
const { t } = useTranslation();
const { l10n } = useLocalization();
return (
<div className="flex flex-col items-center w-full justify-center gap-5">
<div className="flex gap-1 flex-col justify-center items-center">
<Typography variant="section-title">
{t('onboarding.automatic-mounting.done.title')}
{l10n.getString('onboarding-automatic_mounting-done-title')}
</Typography>
<Typography color="secondary">
{t('onboarding.automatic-mounting.done.description')}
{l10n.getString('onboarding-automatic_mounting-done-description')}
</Typography>
</div>
{/* <Button variant="primary">Continue to next step</Button> */}
@@ -30,7 +30,7 @@ export function DoneStep({
variant={variant === 'onboarding' ? 'secondary' : 'tiertiary'}
onClick={resetSteps}
>
{t('onboarding.automatic-mounting.done.restart')}
{l10n.getString('onboarding-automatic_mounting-done-restart')}
</Button>
</div>
</div>

View File

@@ -1,8 +1,8 @@
import { useTranslation } from 'react-i18next';
import { ResetType } from 'solarxr-protocol';
import { Button } from '../../../../commons/Button';
import { Typography } from '../../../../commons/Typography';
import { ResetButton } from '../../../../home/ResetButton';
import { useLocalization } from '@fluent/react';
export function MountingResetStep({
nextStep,
@@ -13,21 +13,27 @@ export function MountingResetStep({
prevStep: () => void;
variant: 'onboarding' | 'alone';
}) {
const { t } = useTranslation();
const { l10n } = useLocalization();
return (
<>
<div className="flex flex-col flex-grow">
<div className="flex flex-grow flex-col gap-4 max-w-sm">
<Typography variant="main-title" bold>
{t('onboarding.automatic-mounting.mounting-reset.title')}
{l10n.getString(
'onboarding-automatic_mounting-mounting_reset-title'
)}
</Typography>
<div className="flex flex-col gap-2">
<Typography color="secondary">
{t('onboarding.automatic-mounting.mounting-reset.step.0')}
{l10n.getString(
'onboarding-automatic_mounting-mounting_reset-step-0'
)}
</Typography>
<Typography color="secondary">
{t('onboarding.automatic-mounting.mounting-reset.step.1')}
{l10n.getString(
'onboarding-automatic_mounting-mounting_reset-step-1'
)}
</Typography>
</div>
</div>
@@ -37,7 +43,7 @@ export function MountingResetStep({
variant={variant === 'onboarding' ? 'secondary' : 'tiertiary'}
onClick={prevStep}
>
{t('onboarding.automatic-mounting.prev-step')}
{l10n.getString('onboarding-automatic_mounting-prev_step')}
</Button>
<ResetButton
variant="small"

View File

@@ -1,8 +1,8 @@
import { useTranslation } from 'react-i18next';
import { ResetType } from 'solarxr-protocol';
import { Button } from '../../../../commons/Button';
import { Typography } from '../../../../commons/Typography';
import { ResetButton } from '../../../../home/ResetButton';
import { useLocalization } from '@fluent/react';
export function PreparationStep({
nextStep,
@@ -13,21 +13,25 @@ export function PreparationStep({
prevStep: () => void;
variant: 'onboarding' | 'alone';
}) {
const { t } = useTranslation();
const { l10n } = useLocalization();
return (
<>
<div className="flex flex-col flex-grow">
<div className="flex flex-col gap-4 max-w-sm">
<Typography variant="main-title" bold>
{t('onboarding.automatic-mounting.preparation.title')}
{l10n.getString('onboarding-automatic_mounting-preparation-title')}
</Typography>
<div>
<Typography color="secondary">
{t('onboarding.automatic-mounting.preparation.step.0')}
{l10n.getString(
'onboarding-automatic_mounting-preparation-step-0'
)}
</Typography>
<Typography color="secondary">
{t('onboarding.automatic-mounting.preparation.step.1')}
{l10n.getString(
'onboarding-automatic_mounting-preparation-step-1'
)}
</Typography>
</div>
</div>
@@ -38,7 +42,7 @@ export function PreparationStep({
variant={variant === 'onboarding' ? 'secondary' : 'tiertiary'}
onClick={prevStep}
>
{t('onboarding.automatic-mounting.prev-step')}
{l10n.getString('onboarding-automatic_mounting-prev_step')}
</Button>
<ResetButton
variant="small"

View File

@@ -1,34 +1,40 @@
import { useTranslation } from 'react-i18next';
import { useTrackers } from '../../../../../hooks/tracker';
import { BodyDisplay } from '../../../../commons/BodyDisplay';
import { Button } from '../../../../commons/Button';
import { TipBox } from '../../../../commons/TipBox';
import { Typography } from '../../../../commons/Typography';
import { useLocalization } from '@fluent/react';
export function PutTrackersOnStep({ nextStep }: { nextStep: () => void }) {
const { trackers } = useTrackers();
const { t } = useTranslation();
const { l10n } = useLocalization();
return (
<>
<div className="flex flex-col flex-grow">
<div className="flex flex-grow flex-col gap-4 max-w-sm">
<Typography variant="main-title" bold>
{t('onboarding.automatic-mounting.put-trackers-on.title')}
{l10n.getString(
'onboarding-automatic_mounting-put_trackers_on-title'
)}
</Typography>
<div>
<Typography color="secondary">
{t('onboarding.automatic-mounting.put-trackers-on.description')}
{l10n.getString(
'onboarding-automatic_mounting-put_trackers_on-description'
)}
</Typography>
</div>
<div className="flex">
<TipBox>{t('tips.find-tracker')}</TipBox>
<TipBox>{l10n.getString('tips-find_tracker')}</TipBox>
</div>
</div>
<div className="flex">
<Button variant="primary" onClick={nextStep}>
{t('onboarding.automatic-mounting.put-trackers-on.next')}
{l10n.getString(
'onboarding-automatic_mounting-put_trackers_on-next'
)}
</Button>
</div>
</div>

View File

@@ -1,12 +1,11 @@
import { useMemo, useState } from 'react';
import { useForm } from 'react-hook-form';
import { useTranslation } from 'react-i18next';
import {
AssignTrackerRequestT,
BodyPart,
QuatT,
RpcMessage,
TrackerIdT
TrackerIdT,
} from 'solarxr-protocol';
import { FlatDeviceTracker } from '../../../../hooks/app';
import { useOnboarding } from '../../../../hooks/onboarding';
@@ -19,9 +18,10 @@ import { TipBox } from '../../../commons/TipBox';
import { Typography } from '../../../commons/Typography';
import { BodyAssignment } from '../../BodyAssignment';
import { TrackerSelectionMenu } from './TrackerSelectionMenu';
import { useLocalization } from '@fluent/react';
export function TrackersAssignPage() {
const { t } = useTranslation();
const { l10n } = useLocalization();
const { useAssignedTrackers, trackers } = useTrackers();
const { applyProgress, skipSetup, state } = useOnboarding();
const { sendRPCPacket } = useWebsocketAPI();
@@ -57,7 +57,7 @@ export function TrackersAssignPage() {
const assignreq = new AssignTrackerRequestT();
assignreq.bodyPosition = role;
assignreq.mountingRotation = rotation;
assignreq.mountingOrientation = rotation;
assignreq.trackerId = trackerId;
sendRPCPacket(RpcMessage.AssignTrackerRequest, assignreq);
};
@@ -99,27 +99,27 @@ export function TrackersAssignPage() {
<div className="flex flex-col max-w-sm gap-3">
{!state.alonePage && (
<ArrowLink to="/onboarding/wifi-creds" direction="left">
{t('onboarding.assign-trackers.back')}
{l10n.getString('onboarding-assign_trackers-back')}
</ArrowLink>
)}
<Typography variant="main-title">
{t('onboarding.assign-trackers.title')}
{l10n.getString('onboarding-assign_trackers-title')}
</Typography>
<Typography color="secondary">
{t('onboarding.assign-trackers.description')}
{l10n.getString('onboarding-assign_trackers-description')}
</Typography>
<div className="flex gap-1">
<Typography color="secondary">
{t('onboarding.assign-trackers.assigned', {
{l10n.getString('onboarding-assign_trackers-assigned', {
assigned: assignedTrackers.length,
trackers: trackers.length,
})}
</Typography>
</div>
<TipBox>{t('tips.find-tracker')}</TipBox>
<TipBox>{l10n.getString('tips-find_tracker')}</TipBox>
<CheckBox
control={control}
label={t('onboarding.assign-trackers.advanced')}
label={l10n.getString('onboarding-assign_trackers-advanced')}
name="advanced"
variant="toggle"
></CheckBox>
@@ -137,14 +137,14 @@ export function TrackersAssignPage() {
<div className="flex flex-grow">
{!state.alonePage && (
<Button variant="secondary" to="/" onClick={skipSetup}>
{t('onboarding.skip')}
{l10n.getString('onboarding-skip')}
</Button>
)}
</div>
<div className="flex gap-3">
{!state.alonePage && (
<Button variant="primary" to="/onboarding/enter-vr">
{t('onboarding.assign-trackers.next')}
{l10n.getString('onboarding-assign_trackers-next')}
</Button>
)}
</div>

View File

@@ -1,5 +1,4 @@
import classNames from 'classnames';
import { useTranslation } from 'react-i18next';
import ReactModal from 'react-modal';
import { BodyPart } from 'solarxr-protocol';
import { FlatDeviceTracker } from '../../../../hooks/app';
@@ -9,6 +8,7 @@ import { Button } from '../../../commons/Button';
import { TipBox } from '../../../commons/TipBox';
import { Typography } from '../../../commons/Typography';
import { TrackerCard } from '../../../tracker/TrackerCard';
import { useLocalization } from '@fluent/react';
export function TrackerSelectionMenu({
isOpen = true,
@@ -21,7 +21,7 @@ export function TrackerSelectionMenu({
onClose: () => void;
onTrackerSelected: (tracker: FlatDeviceTracker | null) => void;
}) {
const { t } = useTranslation();
const { l10n } = useLocalization();
const { ref: refTrackers, layoutHeight: trackersHeight } =
useLayout<HTMLDivElement>();
const { ref: refOptions, height: optionsHeight } =
@@ -48,9 +48,7 @@ export function TrackerSelectionMenu({
<div className="flex w-full h-full flex-col ">
<div className="flex w-full flex-col flex-grow items-center gap-3">
<Typography variant="main-title" bold>
{t('tracker-selection-menu.title', {
bodyPart: t('body-part.' + BodyPart[bodyPart]),
})}
{l10n.getString('tracker_selection_menu-' + BodyPart[bodyPart])}
</Typography>
<div className="relative">
<div
@@ -62,7 +60,7 @@ export function TrackerSelectionMenu({
{unassignedTrackers.length && (
<div className="flex flex-col gap-3">
<Typography>
{t('tracker-selection-menu.unassigned')}
{l10n.getString('tracker_selection_menu-unassigned')}
</Typography>
<div className="grid grid-cols-2 gap-3">
{unassignedTrackers.map((fd, index) => (
@@ -82,7 +80,9 @@ export function TrackerSelectionMenu({
</div>
</div>
)}
<Typography>{t('tracker-selection-menu.assigned')}</Typography>
<Typography>
{l10n.getString('tracker_selection_menu-assigned')}
</Typography>
<div className=" grid grid-cols-2 gap-3">
{assignedTrackers.map((fd, index) => (
<TrackerCard
@@ -113,11 +113,11 @@ export function TrackerSelectionMenu({
ref={refOptions}
>
<div className="w-full max-w-sm">
<TipBox>{t('tips.find-tracker')}</TipBox>
<TipBox>{l10n.getString('tips-find_tracker')}</TipBox>
</div>
<div className="flex flex-col justify-end pointer-events-auto">
<Button variant="primary" onClick={() => onTrackerSelected(null)}>
{t('tracker-selection-menu.dont-assign')}
{l10n.getString('tracker_selection_menu-dont_assign')}
</Button>
</div>
</div>

View File

@@ -1,13 +1,14 @@
import { ReactNode, useEffect } from 'react';
import { ReactNode, useEffect, useContext } from 'react';
import { ConfigContextC, useConfigProvider } from '../../hooks/config';
import i18next from '../../i18n/config';
import { DEFAULT_LOCALE, LangContext } from '../../i18n/config';
export function ConfigContextProvider({ children }: { children: ReactNode }) {
const context = useConfigProvider();
const { changeLocales } = useContext(LangContext);
useEffect(() => {
context.loadConfig().then((config) => {
i18next.changeLanguage(config?.lang || 'en');
changeLocales([config?.lang || DEFAULT_LOCALE]);
});
}, []);

View File

@@ -1,8 +1,8 @@
import classNames from 'classnames';
import { ReactNode, useMemo } from 'react';
import { useTranslation } from 'react-i18next';
import { NavLink, useLocation, useMatch } from 'react-router-dom';
import { Typography } from '../commons/Typography';
import { useLocalization } from '@fluent/react';
export function SettingsLink({
to,
@@ -40,31 +40,31 @@ export function SettingsLink({
}
export function SettingsSidebar() {
const { t } = useTranslation();
const { l10n } = useLocalization();
return (
<div className="flex flex-col px-5 w-[280px] min-w-[280px] py-5 gap-3 overflow-y-auto bg-background-70 rounded-lg">
<Typography variant="main-title">
{t('settings.sidebar.title')}
{l10n.getString('settings-sidebar-title')}
</Typography>
<div className="flex flex-col gap-3">
<Typography variant="section-title">
{t('settings.sidebar.general')}
{l10n.getString('settings-sidebar-general')}
</Typography>
<div className="flex flex-col gap-2">
<SettingsLink to="/settings/trackers" scrollTo="steamvr">
SteamVR
</SettingsLink>
<SettingsLink to="/settings/trackers" scrollTo="mechanics">
{t('settings.sidebar.tracker-mechanics')}
{l10n.getString('settings-sidebar-tracker_mechanics')}
</SettingsLink>
<SettingsLink to="/settings/trackers" scrollTo="fksettings">
{t('settings.sidebar.fk-settings')}
{l10n.getString('settings-sidebar-fk_settings')}
</SettingsLink>
<SettingsLink to="/settings/trackers" scrollTo="gestureControl">
{t('settings.sidebar.gesture-control')}
{l10n.getString('settings-sidebar-gesture_control')}
</SettingsLink>
<SettingsLink to="/settings/trackers" scrollTo="interface">
{t('settings.sidebar.interface')}
{l10n.getString('settings-sidebar-interface')}
</SettingsLink>
</div>
</div>
@@ -72,7 +72,7 @@ export function SettingsSidebar() {
<Typography variant="section-title">OSC</Typography>
<div className="flex flex-col gap-2">
<SettingsLink to="/settings/osc/router" scrollTo="router">
{t('settings.sidebar.osc-router')}
{l10n.getString('settings-sidebar-osc_router')}
</SettingsLink>
</div>
<div className="flex flex-col gap-2">
@@ -83,11 +83,11 @@ export function SettingsSidebar() {
</div>
<div className="flex flex-col gap-3">
<Typography variant="section-title">
{t('settings.sidebar.utils')}
{l10n.getString('settings-sidebar-utils')}
</Typography>
<div className="flex flex-col gap-2">
<SettingsLink to="/settings/serial">
{t('settings.sidebar.serial')}
{l10n.getString('settings-sidebar-serial')}
</SettingsLink>
</div>
</div>

View File

@@ -1,6 +1,5 @@
import { useEffect, useRef } from 'react';
import { DefaultValues, useForm } from 'react-hook-form';
import { useTranslation } from 'react-i18next';
import { useLocation } from 'react-router-dom';
import {
ChangeSettingsRequestT,
@@ -14,6 +13,7 @@ import {
SettingsResponseT,
SteamVRTrackersSettingT,
TapDetectionSettingsT,
DriftCompensationSettingsT,
} from 'solarxr-protocol';
import { useConfig } from '../../../hooks/config';
import { useWebsocketAPI } from '../../../hooks/websocket-api';
@@ -26,6 +26,7 @@ import { NumberSelector } from '../../commons/NumberSelector';
import { Radio } from '../../commons/Radio';
import { Typography } from '../../commons/Typography';
import { SettingsPageLayout } from '../SettingsPageLayout';
import { useLocalization } from '@fluent/react';
interface SettingsForm {
trackers: {
@@ -40,6 +41,11 @@ interface SettingsForm {
type: number;
amount: number;
};
driftCompensation: {
enabled: boolean;
amount: number;
maxResets: number;
};
toggles: {
extendedSpine: boolean;
extendedPelvis: boolean;
@@ -47,10 +53,18 @@ interface SettingsForm {
forceArmsFromHmd: boolean;
floorClip: boolean;
skatingCorrection: boolean;
viveEmulation: boolean;
};
tapDetection: {
tapMountingResetEnabled: boolean;
tapQuickResetEnabled: boolean;
tapResetEnabled: boolean;
tapQuickResetDelay: number;
tapResetDelay: number;
tapMountingResetDelay: number;
tapQuickResetTaps: number;
tapResetTaps: number;
tapMountingResetTaps: number;
};
legTweaks: {
correctionStrength: number;
@@ -77,15 +91,31 @@ const defaultValues = {
forceArmsFromHmd: false,
floorClip: false,
skatingCorrection: false,
viveEmulation: false,
},
filtering: { amount: 0.1, type: FilteringType.NONE },
tapDetection: { tapResetEnabled: false, tapResetDelay: 0.2 },
driftCompensation: {
enabled: false,
amount: 0.1,
maxResets: 1,
},
tapDetection: {
tapMountingResetEnabled: false,
tapQuickResetEnabled: false,
tapResetEnabled: false,
tapQuickResetDelay: 0.2,
tapResetDelay: 1.0,
tapMountingResetDelay: 1.0,
tapQuickResetTaps: 2,
tapResetTaps: 3,
tapMountingResetTaps: 3,
},
legTweaks: { correctionStrength: 0.3 },
interface: { devmode: false, watchNewDevices: true },
};
export function GeneralSettings() {
const { t } = useTranslation();
const { l10n } = useLocalization();
const { config, setConfig } = useConfig();
const { state } = useLocation();
const pageRef = useRef<HTMLFormElement | null>(null);
@@ -118,6 +148,7 @@ export function GeneralSettings() {
toggles.extendedPelvis = values.toggles.extendedPelvis;
toggles.extendedSpine = values.toggles.extendedSpine;
toggles.forceArmsFromHmd = values.toggles.forceArmsFromHmd;
toggles.viveEmulation = values.toggles.viveEmulation;
legTweaks.correctionStrength = values.legTweaks.correctionStrength;
modelSettings.toggles = toggles;
@@ -125,8 +156,19 @@ export function GeneralSettings() {
settings.modelSettings = modelSettings;
const tapDetection = new TapDetectionSettingsT();
tapDetection.tapResetEnabled = values.tapDetection.tapResetEnabled;
tapDetection.tapResetDelay = values.tapDetection.tapResetDelay;
tapDetection.tapResetEnabled = values.tapDetection.tapResetEnabled;
tapDetection.tapResetTaps = values.tapDetection.tapResetTaps;
tapDetection.tapQuickResetDelay = values.tapDetection.tapQuickResetDelay;
tapDetection.tapQuickResetEnabled =
values.tapDetection.tapQuickResetEnabled;
tapDetection.tapQuickResetTaps = values.tapDetection.tapQuickResetTaps;
tapDetection.tapMountingResetEnabled =
values.tapDetection.tapMountingResetEnabled;
tapDetection.tapMountingResetDelay =
values.tapDetection.tapMountingResetDelay;
tapDetection.tapMountingResetTaps =
values.tapDetection.tapMountingResetTaps;
settings.tapDetectionSettings = tapDetection;
const filtering = new FilteringSettingsT();
@@ -134,6 +176,12 @@ export function GeneralSettings() {
filtering.amount = values.filtering.amount;
settings.filtering = filtering;
const driftCompensation = new DriftCompensationSettingsT();
driftCompensation.enabled = values.driftCompensation.enabled;
driftCompensation.amount = values.driftCompensation.amount;
driftCompensation.maxResets = values.driftCompensation.maxResets;
settings.driftCompensation = driftCompensation;
sendRPCPacket(RpcMessage.ChangeSettingsRequest, settings);
setConfig({
@@ -163,6 +211,10 @@ export function GeneralSettings() {
formData.filtering = settings.filtering;
}
if (settings.driftCompensation) {
formData.driftCompensation = settings.driftCompensation;
}
if (settings.steamVrTrackers) {
formData.trackers = settings.steamVrTrackers;
}
@@ -182,12 +234,33 @@ export function GeneralSettings() {
if (settings.tapDetectionSettings) {
formData.tapDetection = {
tapResetDelay:
settings.tapDetectionSettings.tapResetDelay ||
defaultValues.tapDetection.tapResetDelay,
tapQuickResetEnabled:
settings.tapDetectionSettings.tapQuickResetEnabled ||
defaultValues.tapDetection.tapQuickResetEnabled,
tapResetEnabled:
settings.tapDetectionSettings.tapResetEnabled ||
defaultValues.tapDetection.tapResetEnabled,
tapMountingResetEnabled:
settings.tapDetectionSettings.tapMountingResetEnabled ||
defaultValues.tapDetection.tapMountingResetEnabled,
tapQuickResetDelay:
settings.tapDetectionSettings.tapQuickResetDelay ||
defaultValues.tapDetection.tapQuickResetDelay,
tapResetDelay:
settings.tapDetectionSettings.tapResetDelay ||
defaultValues.tapDetection.tapResetDelay,
tapMountingResetDelay:
settings.tapDetectionSettings.tapMountingResetDelay ||
defaultValues.tapDetection.tapMountingResetDelay,
tapQuickResetTaps:
settings.tapDetectionSettings.tapQuickResetTaps ||
defaultValues.tapDetection.tapQuickResetTaps,
tapResetTaps:
settings.tapDetectionSettings.tapResetTaps ||
defaultValues.tapDetection.tapResetTaps,
tapMountingResetTaps:
settings.tapDetectionSettings.tapMountingResetTaps ||
defaultValues.tapDetection.tapMountingResetTaps,
};
}
@@ -219,59 +292,65 @@ export function GeneralSettings() {
<SettingsPageLayout icon={<SteamIcon></SteamIcon>} id="steamvr">
<>
<Typography variant="main-title">
{t('settings.general.steamvr.title')}
{l10n.getString('settings-general-steamvr')}
</Typography>
<Typography bold>
{l10n.getString('settings-general-steamvr-subtitle')}
</Typography>
<Typography bold>{t('settings.general.steamvr.subtitle')}</Typography>
<div className="flex flex-col py-2">
<Typography color="secondary">
{t('settings.general.steamvr.description.p0')}
</Typography>
<Typography color="secondary">
{t('settings.general.steamvr.description.p1')}
</Typography>
<>
{l10n
.getString('settings-general-steamvr-description')
.split('\n')
.map((line, i) => (
<Typography color="secondary" key={i}>
{line}
</Typography>
))}
</>
</div>
<div className="grid grid-cols-2 gap-3 pt-3">
<CheckBox
variant="toggle"
outlined
control={control}
name="trackers.waist"
label={t('settings.general.steamvr.trackers.waist')}
/>
<CheckBox
variant="toggle"
outlined
control={control}
name="trackers.chest"
label={t('settings.general.steamvr.trackers.chest')}
label={l10n.getString('settings-general-steamvr-trackers-chest')}
/>
<CheckBox
variant="toggle"
outlined
control={control}
name="trackers.feet"
label={t('settings.general.steamvr.trackers.feet')}
name="trackers.waist"
label={l10n.getString('settings-general-steamvr-trackers-waist')}
/>
<CheckBox
variant="toggle"
outlined
control={control}
name="trackers.knees"
label={t('settings.general.steamvr.trackers.knees')}
label={l10n.getString('settings-general-steamvr-trackers-knees')}
/>
<CheckBox
variant="toggle"
outlined
control={control}
name="trackers.feet"
label={l10n.getString('settings-general-steamvr-trackers-feet')}
/>
<CheckBox
variant="toggle"
outlined
control={control}
name="trackers.elbows"
label={t('settings.general.steamvr.trackers.elbows')}
label={l10n.getString('settings-general-steamvr-trackers-elbows')}
/>
<CheckBox
variant="toggle"
outlined
control={control}
name="trackers.hands"
label={t('settings.general.steamvr.trackers.hands')}
label={l10n.getString('settings-general-steamvr-trackers-hands')}
/>
</div>
</>
@@ -279,53 +358,61 @@ export function GeneralSettings() {
<SettingsPageLayout icon={<WrenchIcon></WrenchIcon>} id="mechanics">
<>
<Typography variant="main-title">
{t('settings.general.tracker-mechanics.title')}
{l10n.getString('settings-general-tracker_mechanics')}
</Typography>
<Typography bold>
{t('settings.general.tracker-mechanics.subtitle')}
{l10n.getString('settings-general-tracker_mechanics-filtering')}
</Typography>
<div className="flex flex-col pt-2 pb-4">
<Typography color="secondary">
{t('settings.general.tracker-mechanics.description.p0')}
</Typography>
<Typography color="secondary">
{t('settings.general.tracker-mechanics.description.p1')}
</Typography>
<>
{l10n
.getString(
'settings-general-tracker_mechanics-filtering-description'
)
.split('\n')
.map((line, i) => (
<Typography color="secondary" key={i}>
{line}
</Typography>
))}
</>
</div>
<Typography>
{t('settings.general.tracker-mechanics.filtering-type.title')}
{l10n.getString(
'settings-general-tracker_mechanics-filtering-type'
)}
</Typography>
<div className="flex md:flex-row flex-col gap-3 pt-2">
<Radio
control={control}
name="filtering.type"
label={t(
'settings.general.tracker-mechanics.filtering-type.none.label'
label={l10n.getString(
'settings-general-tracker_mechanics-filtering-type-none'
)}
desciption={t(
'settings.general.tracker-mechanics.filtering-type.none.description'
desciption={l10n.getString(
'settings-general-tracker_mechanics-filtering-type-none-description'
)}
value={FilteringType.NONE}
></Radio>
<Radio
control={control}
name="filtering.type"
label={t(
'settings.general.tracker-mechanics.filtering-type.smoothing.label'
label={l10n.getString(
'settings-general-tracker_mechanics-filtering-type-smoothing'
)}
desciption={t(
'settings.general.tracker-mechanics.filtering-type.smoothing.description'
desciption={l10n.getString(
'settings-general-tracker_mechanics-filtering-type-smoothing-description'
)}
value={FilteringType.SMOOTHING}
></Radio>
<Radio
control={control}
name="filtering.type"
label={t(
'settings.general.tracker-mechanics.filtering-type.prediction.label'
label={l10n.getString(
'settings-general-tracker_mechanics-filtering-type-prediction'
)}
desciption={t(
'settings.general.tracker-mechanics.filtering-type.prediction.description'
desciption={l10n.getString(
'settings-general-tracker_mechanics-filtering-type-prediction-description'
)}
value={FilteringType.PREDICTION}
></Radio>
@@ -334,26 +421,84 @@ export function GeneralSettings() {
<NumberSelector
control={control}
name="filtering.amount"
label={t('settings.general.tracker-mechanics.amount.label')}
label={l10n.getString(
'settings-general-tracker_mechanics-filtering-amount'
)}
valueLabelFormat={(value) => `${Math.round(value * 100)} %`}
min={0.1}
max={1.0}
step={0.1}
/>
</div>
<div className="flex flex-col pt-4 pb-4"></div>
<Typography bold>
{l10n.getString(
'settings-general-tracker_mechanics-drift_compensation'
)}
</Typography>
<div className="flex flex-col pt-2 pb-4">
<Typography color="secondary">
{l10n
.getString(
'settings-general-tracker_mechanics-drift_compensation-description'
)
.split('\n')
.map((line, i) => (
<Typography color="secondary" key={i}>
{line}
</Typography>
))}
</Typography>
</div>
<CheckBox
variant="toggle"
outlined
control={control}
name="driftCompensation.enabled"
label={l10n.getString(
'settings-general-tracker_mechanics-drift_compensation-enabled-label'
)}
/>
<div className="flex gap-5 pt-5 md:flex-row flex-col">
<NumberSelector
control={control}
name="driftCompensation.amount"
label={l10n.getString(
'settings-general-tracker_mechanics-drift_compensation-amount-label'
)}
valueLabelFormat={(value) => `${Math.round(value * 100)} %`}
min={0.1}
max={1.0}
step={0.1}
/>
</div>
<div className="flex gap-5 pt-5 md:flex-row flex-col">
<NumberSelector
control={control}
name="driftCompensation.maxResets"
label={l10n.getString(
'settings-general-tracker_mechanics-drift_compensation-max_resets-label'
)}
min={1}
max={25}
step={1}
/>
</div>
</>
</SettingsPageLayout>
<SettingsPageLayout icon={<WrenchIcon></WrenchIcon>} id="fksettings">
<>
<Typography variant="main-title">
{t('settings.general.fk-settings.title')}
{l10n.getString('settings-general-fk_settings')}
</Typography>
<Typography bold>
{t('settings.general.fk-settings.leg-tweak.title')}
{l10n.getString('settings-general-fk_settings-leg_tweak')}
</Typography>
<div className="flex flex-col pt-2 pb-4">
<Typography color="secondary">
{t('settings.general.fk-settings.leg-tweak.description')}
{l10n.getString(
'settings-general-fk_settings-leg_tweak-description'
)}
</Typography>
</div>
<div className="grid sm:grid-cols-2 gap-3 pb-5">
@@ -362,15 +507,17 @@ export function GeneralSettings() {
outlined
control={control}
name="toggles.floorClip"
label={t('settings.general.fk-settings.leg-tweak.floor-clip')}
label={l10n.getString(
'settings-general-fk_settings-leg_tweak-floor_clip'
)}
/>
<CheckBox
variant="toggle"
outlined
control={control}
name="toggles.skatingCorrection"
label={t(
'settings.general.fk-settings.leg-tweak.skating-correction'
label={l10n.getString(
'settings-general-fk_settings-leg_tweak-skating_correction'
)}
/>
</div>
@@ -378,8 +525,8 @@ export function GeneralSettings() {
<NumberSelector
control={control}
name="legTweaks.correctionStrength"
label={t(
'settings.general.fk-settings.leg-tweak.skating-correction-amount'
label={l10n.getString(
'settings-general-fk_settings-leg_tweak-skating_correction-amount'
)}
valueLabelFormat={(value) => `${Math.round(value * 100)} %`}
min={0.1}
@@ -387,13 +534,14 @@ export function GeneralSettings() {
step={0.1}
/>
</div>
<Typography bold>
{t('settings.general.fk-settings.arm-fk.title')}
{l10n.getString('settings-general-fk_settings-arm_fk')}
</Typography>
<div className="flex flex-col pt-2 pb-4">
<Typography color="secondary">
{t('settings.general.fk-settings.arm-fk.description')}
{l10n.getString(
'settings-general-fk_settings-arm_fk-description'
)}
</Typography>
</div>
<div className="grid sm:grid-cols-2 pb-5">
@@ -402,18 +550,22 @@ export function GeneralSettings() {
outlined
control={control}
name="toggles.forceArmsFromHmd"
label={t('settings.general.fk-settings.arm-fk.force-arms')}
label={l10n.getString(
'settings-general-fk_settings-arm_fk-force_arms'
)}
/>
</div>
{config?.debug && (
<>
<Typography bold>
{t('settings.general.fk-settings.skeleton-settings.title')}
{l10n.getString(
'settings-general-fk_settings-skeleton_settings'
)}
</Typography>
<div className="flex flex-col pt-2 pb-4">
<Typography color="secondary">
{t(
'settings.general.fk-settings.skeleton-settings.description'
{l10n.getString(
'settings-general-fk_settings-skeleton_settings-description'
)}
</Typography>
</div>
@@ -423,8 +575,8 @@ export function GeneralSettings() {
outlined
control={control}
name="toggles.extendedSpine"
label={t(
'settings.general.fk-settings.skeleton-settings.extended-spine'
label={l10n.getString(
'settings-general-fk_settings-skeleton_settings-extended_spine'
)}
/>
<CheckBox
@@ -432,8 +584,8 @@ export function GeneralSettings() {
outlined
control={control}
name="toggles.extendedPelvis"
label={t(
'settings.general.fk-settings.skeleton-settings.extended-pelvis'
label={l10n.getString(
'settings-general-fk_settings-skeleton_settings-extended_pelvis'
)}
/>
<CheckBox
@@ -441,8 +593,31 @@ export function GeneralSettings() {
outlined
control={control}
name="toggles.extendedKnee"
label={t(
'settings.general.fk-settings.skeleton-settings.extended-knees'
label={l10n.getString(
'settings-general-fk_settings-skeleton_settings-extended_knees'
)}
/>
</div>
<Typography bold>
{l10n.getString(
'settings-general-fk_settings-vive_emulation-title'
)}
</Typography>
<div className="flex flex-col pt-2 pb-4">
<Typography color="secondary">
{l10n.getString(
'settings-general-fk_settings-vive_emulation-description'
)}
</Typography>
</div>
<div className="grid sm:grid-cols-2 gap-3 pb-5">
<CheckBox
variant="toggle"
outlined
control={control}
name="toggles.viveEmulation"
label={l10n.getString(
'settings-general-fk_settings-vive_emulation-label'
)}
/>
</div>
@@ -454,33 +629,126 @@ export function GeneralSettings() {
<SettingsPageLayout icon={<WrenchIcon></WrenchIcon>} id="gestureControl">
<>
<Typography variant="main-title">
{t('settings.general.gesture-control.title')}
{l10n.getString('settings-general-gesture_control')}
</Typography>
<Typography bold>
{t('settings.general.gesture-control.subtitle')}
{l10n.getString('settings-general-gesture_control-subtitle')}
</Typography>
<div className="flex flex-col pt-2 pb-4">
<Typography color="secondary">
{t('settings.general.gesture-control.description')}
{l10n.getString('settings-general-gesture_control-description')}
</Typography>
</div>
<div className="grid sm:grid-cols-1 gap-3 pb-5">
<div className="grid sm:grid-cols-3 gap-5 pb-2">
<CheckBox
variant="toggle"
outlined
control={control}
name="tapDetection.tapQuickResetEnabled"
label={l10n.getString(
'settings-general-gesture_control-quickResetEnabled'
)}
/>
<CheckBox
variant="toggle"
outlined
control={control}
name="tapDetection.tapResetEnabled"
label={t('settings.general.gesture-control.enable')}
label={l10n.getString(
'settings-general-gesture_control-resetEnabled'
)}
/>
<CheckBox
variant="toggle"
outlined
control={control}
name="tapDetection.tapMountingResetEnabled"
label={l10n.getString(
'settings-general-gesture_control-mountingResetEnabled'
)}
/>
</div>
<div className="grid sm:grid-cols-3 gap-5 pb-2">
<NumberSelector
control={control}
name="tapDetection.tapResetDelay"
label={t('settings.general.gesture-control.delay')}
name="tapDetection.tapQuickResetDelay"
label={l10n.getString(
'settings-general-gesture_control-quickResetDelay'
)}
valueLabelFormat={(value) => `${Math.round(value * 10) / 10} s`}
min={0.2}
max={3.0}
step={0.2}
/>
<NumberSelector
control={control}
name="tapDetection.tapResetDelay"
label={l10n.getString(
'settings-general-gesture_control-resetDelay'
)}
valueLabelFormat={(value) => `${Math.round(value * 10) / 10} s`}
min={0.2}
max={3.0}
step={0.2}
/>
<NumberSelector
control={control}
name="tapDetection.tapMountingResetDelay"
label={l10n.getString(
'settings-general-gesture_control-mountingResetDelay'
)}
valueLabelFormat={(value) => `${Math.round(value * 10) / 10} s`}
min={0.2}
max={3.0}
step={0.2}
/>
</div>
<div className="grid sm:grid-cols-3 gap-5 pb-2">
<NumberSelector
control={control}
name="tapDetection.tapQuickResetTaps"
label={l10n.getString(
'settings-general-gesture_control-quickResetTaps'
)}
valueLabelFormat={(value) =>
l10n.getString('settings-general-gesture_control-taps', {
amount: Math.round(value),
})
}
min={2}
max={10}
step={1}
/>
<NumberSelector
control={control}
name="tapDetection.tapResetTaps"
label={l10n.getString(
'settings-general-gesture_control-resetTaps'
)}
valueLabelFormat={(value) =>
l10n.getString('settings-general-gesture_control-taps', {
amount: Math.round(value),
})
}
min={2}
max={10}
step={1}
/>
<NumberSelector
control={control}
name="tapDetection.tapMountingResetTaps"
label={l10n.getString(
'settings-general-gesture_control-mountingResetTaps'
)}
valueLabelFormat={(value) =>
l10n.getString('settings-general-gesture_control-taps', {
amount: Math.round(value),
})
}
min={2}
max={10}
step={1}
/>
</div>
</>
</SettingsPageLayout>
@@ -488,17 +756,19 @@ export function GeneralSettings() {
<SettingsPageLayout icon={<SquaresIcon></SquaresIcon>} id="interface">
<>
<Typography variant="main-title">
{t('settings.general.interface.title')}
{l10n.getString('settings-general-interface')}
</Typography>
<div className="gap-4 grid">
<div className="grid sm:grid-cols-2">
<div>
<Typography bold>
{t('settings.general.interface.dev-mode.title')}
{l10n.getString('settings-general-interface-dev_mode')}
</Typography>
<div className="flex flex-col">
<Typography color="secondary">
{t('settings.general.interface.dev-mode.description')}
{l10n.getString(
'settings-general-interface-dev_mode-description'
)}
</Typography>
</div>
<div className="pt-2">
@@ -507,7 +777,9 @@ export function GeneralSettings() {
control={control}
outlined
name="interface.devmode"
label={t('settings.general.interface.dev-mode.label')}
label={l10n.getString(
'settings-general-interface-dev_mode-label'
)}
/>
</div>
</div>
@@ -515,12 +787,14 @@ export function GeneralSettings() {
<div className="grid sm:grid-cols-2">
<div>
<Typography bold>
{t('settings.general.interface.serial-detection.title')}
{l10n.getString(
'settings-general-interface-serial_detection'
)}
</Typography>
<div className="flex flex-col">
<Typography color="secondary">
{t(
'settings.general.interface.serial-detection.description'
{l10n.getString(
'settings-general-interface-serial_detection-description'
)}
</Typography>
</div>
@@ -530,8 +804,8 @@ export function GeneralSettings() {
control={control}
outlined
name="interface.watchNewDevices"
label={t(
'settings.general.interface.serial-detection.label'
label={l10n.getString(
'settings-general-interface-serial_detection-label'
)}
/>
</div>
@@ -540,11 +814,13 @@ export function GeneralSettings() {
<div className="grid sm:grid-cols-2">
<div>
<Typography bold>
{t('settings.general.interface.lang.title')}
{l10n.getString('settings-general-interface-lang')}
</Typography>
<div className="flex flex-col">
<Typography color="secondary">
{t('settings.general.interface.lang.description')}
{l10n.getString(
'settings-general-interface-lang-description'
)}
</Typography>
</div>
<div className="pt-2">

View File

@@ -1,6 +1,5 @@
import { useEffect, useRef } from 'react';
import { useForm } from 'react-hook-form';
import { useTranslation } from 'react-i18next';
import { useLocation } from 'react-router-dom';
import {
ChangeSettingsRequestT,
@@ -16,6 +15,7 @@ import { RouterIcon } from '../../commons/icon/RouterIcon';
import { Input } from '../../commons/Input';
import { Typography } from '../../commons/Typography';
import { SettingsPageLayout } from '../SettingsPageLayout';
import { Localized, useLocalization } from '@fluent/react';
interface OSCRouterSettingsForm {
router: {
@@ -40,7 +40,7 @@ const defaultValues = {
};
export function OSCRouterSettings() {
const { t } = useTranslation();
const { l10n } = useLocalization();
const { sendRPCPacket, useRPCPacket } = useWebsocketAPI();
const { state } = useLocation();
const pageRef = useRef<HTMLFormElement | null>(null);
@@ -113,20 +113,26 @@ export function OSCRouterSettings() {
<SettingsPageLayout icon={<RouterIcon></RouterIcon>} id="router">
<>
<Typography variant="main-title">
{t('settings.osc.router.title')}
{l10n.getString('settings-osc-router')}
</Typography>
<div className="flex flex-col pt-2 pb-4">
<Typography color="secondary">
{t('settings.osc.router.description.p0')}
</Typography>
<Typography color="secondary">
{t('settings.osc.router.description.p1')}
</Typography>
<>
{l10n
.getString('settings-osc-router-description')
.split('\n')
.map((line, i) => (
<Typography color="secondary" key={i}>
{line}
</Typography>
))}
</>
</div>
<Typography bold>{t('settings.osc.router.enable.title')}</Typography>
<Typography bold>
{l10n.getString('settings-osc-router-enable')}
</Typography>
<div className="flex flex-col pb-2">
<Typography color="secondary">
{t('settings.osc.router.enable.description')}
{l10n.getString('settings-osc-router-enable-description')}
</Typography>
</div>
<div className="grid grid-cols-2 gap-3 pb-5">
@@ -135,42 +141,58 @@ export function OSCRouterSettings() {
outlined
control={control}
name="router.oscSettings.enabled"
label={t('settings.osc.router.enable.label')}
label={l10n.getString('settings-osc-router-enable-label')}
/>
</div>
<Typography bold>{t('settings.osc.router.network.title')}</Typography>
<Typography bold>
{l10n.getString('settings-osc-router-network')}
</Typography>
<div className="flex flex-col pb-2">
<Typography color="secondary">
{t('settings.osc.router.network.description.p0')}
</Typography>
<Typography color="secondary">
{t('settings.osc.router.network.description.p1')}
</Typography>
<>
{l10n
.getString('settings-osc-router-network-description')
.split('\n')
.map((line, i) => (
<Typography color="secondary" key={i}>
{line}
</Typography>
))}
</>
</div>
<div className="grid grid-cols-2 gap-3 pb-5">
<Input
type="number"
{...register('router.oscSettings.portIn', { required: true })}
placeholder={t('settings.osc.router.network.port-in.placeholder')}
label={t('settings.osc.router.network.port-in.label')}
></Input>
<Input
type="number"
{...register('router.oscSettings.portOut', {
required: true,
})}
placeholder={t(
'settings.osc.router.network.port-out.placeholder'
)}
label={t('settings.osc.router.network.port-out.label')}
></Input>
<Localized
id="settings-osc-router-network-port_in"
attrs={{ placeholder: true, label: true }}
>
<Input
type="number"
{...register('router.oscSettings.portIn', { required: true })}
placeholder="9002"
label="Port In"
></Input>
</Localized>
<Localized
id="settings-osc-router-network-port_out"
attrs={{ placeholder: true, label: true }}
>
<Input
type="number"
{...register('router.oscSettings.portOut', {
required: true,
})}
placeholder="9000"
label="Port Out"
></Input>
</Localized>
</div>
<Typography bold>
{t('settings.osc.router.network.address.title')}
{l10n.getString('settings-osc-router-network-address')}
</Typography>
<div className="flex flex-col pb-2">
<Typography color="secondary">
{t('settings.osc.router.network.address.description')}
{l10n.getString(
'settings-osc-router-network-address-description'
)}
</Typography>
</div>
<div className="grid gap-3 pb-5">
@@ -181,7 +203,9 @@ export function OSCRouterSettings() {
pattern:
/^(?!0)(?!.*\.$)((1?\d?\d|25[0-5]|2[0-4]\d)(\.|$)){4}$/i,
})}
placeholder={t('settings.osc.router.network.address.placeholder')}
placeholder={l10n.getString(
'settings-osc-router-network-address-placeholder'
)}
></Input>
</div>
</>

View File

@@ -1,6 +1,5 @@
import { useEffect, useRef, useState } from 'react';
import { useForm } from 'react-hook-form';
import { useTranslation } from 'react-i18next';
import { useLocation } from 'react-router-dom';
import {
CloseSerialRequestT,
@@ -12,13 +11,14 @@ import {
SerialTrackerFactoryResetRequestT,
SerialTrackerGetInfoRequestT,
SerialTrackerRebootRequestT,
SerialUpdateResponseT
SerialUpdateResponseT,
} from 'solarxr-protocol';
import { useElemSize, useLayout } from '../../../hooks/layout';
import { useWebsocketAPI } from '../../../hooks/websocket-api';
import { Button } from '../../commons/Button';
import { Dropdown } from '../../commons/Dropdown';
import { Typography } from '../../commons/Typography';
import { useLocalization } from '@fluent/react';
export interface SerialForm {
port: string;
@@ -30,7 +30,7 @@ export function Serial() {
layoutWidth,
ref: consoleRef,
} = useLayout<HTMLDivElement>();
const { t } = useTranslation();
const { l10n } = useLocalization();
const { state } = useLocation();
@@ -73,7 +73,7 @@ export function Serial() {
useEffect(() => {
sendRPCPacket(RpcMessage.SerialDevicesRequest, new SerialDevicesRequestT());
const typedState: { serialPort: string } = state as any;
if (typedState.serialPort) {
if (typedState?.serialPort) {
reset({ port: typedState.serialPort });
}
}, []);
@@ -105,7 +105,10 @@ export function Serial() {
RpcMessage.SerialDevicesResponse,
(res: SerialDevicesResponseT) => {
setSerialDevices([
{ name: t('settings.serial.auto-dropdown-item'), port: 'Auto' },
{
name: l10n.getString('settings-serial-auto_dropdown_item'),
port: 'Auto',
},
...(res.devices || []),
]);
}
@@ -152,14 +155,18 @@ export function Serial() {
<div className="flex flex-col bg-background-70 h-full p-5 rounded-md">
<div className="flex flex-col pb-2">
<Typography variant="main-title">
{t('settings.serial.title')}
</Typography>
<Typography color="secondary">
{t('settings.serial.description.p0')}
</Typography>
<Typography color="secondary">
{t('settings.serial.description.p1')}
{l10n.getString('settings-serial')}
</Typography>
<>
{l10n
.getString('settings-serial-description')
.split('\n')
.map((line, i) => (
<Typography color="secondary" key={i}>
{line}
</Typography>
))}
</>
</div>
<div className="bg-background-80 rounded-lg flex flex-col p-2">
<div
@@ -174,7 +181,7 @@ export function Serial() {
<pre>
{isSerialOpen
? consoleContent
: t('settings.serial.connection-lost')}
: l10n.getString('settings-serial-connection_lost')}
</pre>
</div>
</div>
@@ -182,13 +189,13 @@ export function Serial() {
<div className="border-t-2 pt-2 border-background-60 border-solid m-2 gap-2 flex flex-row">
<div className="flex flex-grow gap-2">
<Button variant="quaternary" onClick={reboot}>
{t('settings.serial.reboot')}
{l10n.getString('settings-serial-reboot')}
</Button>
<Button variant="quaternary" onClick={factoryReset}>
{t('settings.serial.factory-reset')}
{l10n.getString('settings-serial-factory_reset')}
</Button>
<Button variant="quaternary" onClick={getInfos}>
{t('settings.serial.get-infos')}
{l10n.getString('settings-serial-get_infos')}
</Button>
</div>
@@ -196,7 +203,7 @@ export function Serial() {
<Dropdown
control={control}
name="port"
placeholder={t('settings.serial.serial-select')}
placeholder={l10n.getString('settings-serial-serial_select')}
items={serialDevices.map((device) => ({
label: device.name?.toString() || 'error',
value: device.port?.toString() || 'error',

View File

@@ -1,6 +1,5 @@
import { useEffect, useRef } from 'react';
import { useForm } from 'react-hook-form';
import { useTranslation } from 'react-i18next';
import { useLocation } from 'react-router-dom';
import {
ChangeSettingsRequestT,
@@ -17,6 +16,7 @@ import { VRCIcon } from '../../commons/icon/VRCIcon';
import { Input } from '../../commons/Input';
import { Typography } from '../../commons/Typography';
import { SettingsPageLayout } from '../SettingsPageLayout';
import { Localized, useLocalization } from '@fluent/react';
interface VRCOSCSettingsForm {
vrchat: {
@@ -59,7 +59,7 @@ const defaultValues = {
};
export function VRCOSCSettings() {
const { t } = useTranslation();
const { l10n } = useLocalization();
const { sendRPCPacket, useRPCPacket } = useWebsocketAPI();
const { state } = useLocation();
const pageRef = useRef<HTMLFormElement | null>(null);
@@ -137,19 +137,27 @@ export function VRCOSCSettings() {
<form className="flex flex-col gap-2 w-full" ref={pageRef}>
<SettingsPageLayout icon={<VRCIcon></VRCIcon>} id="vrchat">
<>
<Typography variant="main-title">VRChat OSC Trackers</Typography>
<Typography variant="main-title">
{l10n.getString('settings-osc-vrchat')}
</Typography>
<div className="flex flex-col pt-2 pb-4">
<Typography color="secondary">
{t('settings.osc.vrchat.description.p0')}
</Typography>
<Typography color="secondary">
{t('settings.osc.vrchat.description.p1')}
</Typography>
<>
{l10n
.getString('settings-osc-vrchat-description')
.split('\n')
.map((line, i) => (
<Typography color="secondary" key={i}>
{line}
</Typography>
))}
</>
</div>
<Typography bold>{t('settings.osc.vrchat.enable.title')}</Typography>
<Typography bold>
{l10n.getString('settings-osc-vrchat-enable')}
</Typography>
<div className="flex flex-col pb-2">
<Typography color="secondary">
{t('settings.osc.vrchat.enable.description')}
{l10n.getString('settings-osc-vrchat-enable-description')}
</Typography>
</div>
<div className="grid grid-cols-2 gap-3 pb-5">
@@ -158,39 +166,51 @@ export function VRCOSCSettings() {
outlined
control={control}
name="vrchat.oscSettings.enabled"
label={t('settings.osc.vrchat.enable.label')}
label={l10n.getString('settings-osc-vrchat-enable-label')}
/>
</div>
<Typography bold>{t('settings.osc.vrchat.network.title')}</Typography>
<div className="flex flex-col pb-2">
<Typography color="secondary">
{t('settings.osc.vrchat.network.description')}
</Typography>
</div>
<div className="grid grid-cols-2 gap-3 pb-5">
<Input
type="number"
{...register('vrchat.oscSettings.portIn', { required: true })}
placeholder={t('settings.osc.vrchat.network.port-in.placeholder')}
label={t('settings.osc.vrchat.network.port-in.label')}
></Input>
<Input
type="number"
{...register('vrchat.oscSettings.portOut', {
required: true,
})}
placeholder={t(
'settings.osc.vrchat.network.port-out.placeholder'
)}
label={t('settings.osc.vrchat.network.port-out.label')}
></Input>
</div>
<Typography bold>
{t('settings.osc.vrchat.network.address.title')}
{l10n.getString('settings-osc-vrchat-network')}
</Typography>
<div className="flex flex-col pb-2">
<Typography color="secondary">
{t('settings.osc.vrchat.network.address.description')}
{l10n.getString('settings-osc-vrchat-network-description')}
</Typography>
</div>
<div className="grid grid-cols-2 gap-3 pb-5">
<Localized
id="settings-osc-vrchat-network-port_in"
attrs={{ placeholder: true, label: true }}
>
<Input
type="number"
{...register('vrchat.oscSettings.portIn', { required: true })}
placeholder="9001"
label="Port In"
></Input>
</Localized>
<Localized
id="settings-osc-vrchat-network-port_out"
attrs={{ placeholder: true, label: true }}
>
<Input
type="number"
{...register('vrchat.oscSettings.portOut', {
required: true,
})}
placeholder="9000"
label="Port Out"
></Input>
</Localized>
</div>
<Typography bold>
{l10n.getString('settings-osc-vrchat-network-address')}
</Typography>
<div className="flex flex-col pb-2">
<Typography color="secondary">
{l10n.getString(
'settings-osc-vrchat-network-address-description'
)}
</Typography>
</div>
<div className="grid gap-3 pb-5">
@@ -201,15 +221,19 @@ export function VRCOSCSettings() {
pattern:
/^(?!0)(?!.*\.$)((1?\d?\d|25[0-5]|2[0-4]\d)(\.|$)){4}$/i,
})}
placeholder={t('settings.osc.vrchat.network.address.placeholder')}
placeholder={l10n.getString(
'settings-osc-vrchat-network-address-placeholder'
)}
></Input>
</div>
<Typography bold>
{t('settings.osc.vrchat.network.trackers.title')}
{l10n.getString('settings-osc-vrchat-network-trackers')}
</Typography>
<div className="flex flex-col pb-2">
<Typography color="secondary">
{t('settings.osc.vrchat.network.trackers.description')}
{l10n.getString(
'settings-osc-vrchat-network-trackers-description'
)}
</Typography>
</div>
<div className="grid grid-cols-2 gap-3 pb-5">
@@ -218,35 +242,45 @@ export function VRCOSCSettings() {
outlined
control={control}
name="vrchat.trackers.chest"
label={t('settings.osc.vrchat.network.trackers.chest')}
label={l10n.getString(
'settings-osc-vrchat-network-trackers-chest'
)}
/>
<CheckBox
variant="toggle"
outlined
control={control}
name="vrchat.trackers.waist"
label={t('settings.osc.vrchat.network.trackers.waist')}
label={l10n.getString(
'settings-osc-vrchat-network-trackers-waist'
)}
/>
<CheckBox
variant="toggle"
outlined
control={control}
name="vrchat.trackers.knees"
label={t('settings.osc.vrchat.network.trackers.knees')}
label={l10n.getString(
'settings-osc-vrchat-network-trackers-knees'
)}
/>
<CheckBox
variant="toggle"
outlined
control={control}
name="vrchat.trackers.feet"
label={t('settings.osc.vrchat.network.trackers.feet')}
label={l10n.getString(
'settings-osc-vrchat-network-trackers-feet'
)}
/>
<CheckBox
variant="toggle"
outlined
control={control}
name="vrchat.trackers.elbows"
label={t('settings.osc.vrchat.network.trackers.elbows')}
label={l10n.getString(
'settings-osc-vrchat-network-trackers-elbows'
)}
/>
</div>
</>

View File

@@ -1,12 +1,12 @@
import classNames from 'classnames';
import { useForm } from 'react-hook-form';
import { useTranslation } from 'react-i18next';
import ReactModal from 'react-modal';
import { BodyPart } from 'solarxr-protocol';
import { Button } from '../commons/Button';
import { CheckBox } from '../commons/Checkbox';
import { Typography } from '../commons/Typography';
import { BodyAssignment } from '../onboarding/BodyAssignment';
import { useLocalization } from '@fluent/react';
export function SingleTrackerBodyAssignmentMenu({
isOpen = true,
@@ -17,7 +17,7 @@ export function SingleTrackerBodyAssignmentMenu({
onClose: () => void;
onRoleSelected: (role: BodyPart) => void;
}) {
const { t } = useTranslation();
const { l10n } = useLocalization();
const { control, watch } = useForm<{ advanced: boolean }>({
defaultValues: { advanced: false },
});
@@ -41,20 +41,26 @@ export function SingleTrackerBodyAssignmentMenu({
<div className="flex gap-8">
<div className="flex flex-col max-w-sm gap-3">
<Typography variant="main-title" bold>
{t('body-assignment-menu.title')}
{l10n.getString('body_assignment_menu')}
</Typography>
<Typography color="secondary">
{t('body-assignment-menu.description')}
{l10n.getString('body_assignment_menu-description')}
</Typography>
<CheckBox
control={control}
label={t('body-assignment-menu.show-advanced-locations')}
label={l10n.getString(
'body_assignment_menu-show_advanced_locations'
)}
name="advanced"
variant="toggle"
></CheckBox>
<div className="flex">
<Button variant="secondary" to="/onboarding/trackers-assign">
{t('body-assignment-menu.manage-trackers')}
<Button
variant="secondary"
to="/onboarding/trackers-assign"
state={{ alonePage: true }}
>
{l10n.getString('body_assignment_menu-manage_trackers')}
</Button>
</div>
</div>
@@ -69,7 +75,7 @@ export function SingleTrackerBodyAssignmentMenu({
variant="secondary"
onClick={() => onRoleSelected(BodyPart.NONE)}
>
{t('body-assignment-menu.unassign-tracker')}
{l10n.getString('body_assignment_menu-unassign_tracker')}
</Button>
</div>
</div>

View File

@@ -1,10 +1,10 @@
import classNames from 'classnames';
import { MouseEventHandler, useEffect, useMemo, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { BodyPart, TrackerDataT } from 'solarxr-protocol';
import { FlatDeviceTracker } from '../../hooks/app';
import { useTracker } from '../../hooks/tracker';
import { Typography } from '../commons/Typography';
import { useLocalization } from '@fluent/react';
function Tracker({
tracker,
@@ -13,7 +13,7 @@ function Tracker({
tracker: TrackerDataT;
updateVelocity: (velocity: number) => void;
}) {
const { t } = useTranslation();
const { l10n } = useLocalization();
const { useVelocity } = useTracker(tracker);
const velocity = useVelocity();
@@ -25,7 +25,7 @@ function Tracker({
return (
<Typography>
{`${tracker.info?.customName || tracker.info?.displayName}` ||
t('tracker.part-card.unassigned')}
l10n.getString('tracker-part_card-unassigned')}
</Typography>
);
}
@@ -43,7 +43,7 @@ export function TrackerPartCard({
direction: 'left' | 'right';
onClick?: MouseEventHandler<HTMLDivElement>;
}) {
const { t } = useTranslation();
const { l10n } = useLocalization();
const [velocities, setVelocities] = useState<number[]>([]);
const updateVelocity = (vel: number) => {
@@ -80,7 +80,7 @@ export function TrackerPartCard({
}}
>
<Typography color="secondary">
{t('body-part.' + BodyPart[role])}
{l10n.getString('body_part-' + BodyPart[role])}
</Typography>
{td?.map(({ tracker }, index) => (
<Tracker
@@ -89,7 +89,11 @@ export function TrackerPartCard({
updateVelocity={(vel) => updateVelocity(vel)}
/>
))}
{!td && <Typography>{t('tracker.part-card.unassigned')}</Typography>}
{!td && (
<Typography>
{l10n.getString('tracker-part_card-unassigned')}
</Typography>
)}
</div>
)) || <></>
);

View File

@@ -2,7 +2,6 @@ import { IPv4 } from 'ip-num/IPNumber';
import Quaternion from 'quaternion';
import { useEffect, useMemo, useState } from 'react';
import { useForm } from 'react-hook-form';
import { useTranslation } from 'react-i18next';
import { useParams } from 'react-router-dom';
import { AssignTrackerRequestT, BodyPart, RpcMessage } from 'solarxr-protocol';
import { useDebouncedEffect } from '../../hooks/timeout';
@@ -18,6 +17,8 @@ import { Typography } from '../commons/Typography';
import { MountingSelectionMenu } from '../onboarding/pages/mounting/MountingSelectionMenu';
import { SingleTrackerBodyAssignmentMenu } from './SingleTrackerBodyAssignmentMenu';
import { TrackerCard } from './TrackerCard';
import { CheckBox } from '../commons/Checkbox';
import { useLocalization } from '@fluent/react';
export const rotationToQuatMap = {
FRONT: 180,
@@ -27,14 +28,14 @@ export const rotationToQuatMap = {
};
const rotationsLabels = {
[rotationToQuatMap.BACK]: 'tracker.rotation.back',
[rotationToQuatMap.FRONT]: 'tracker.rotation.front',
[rotationToQuatMap.LEFT]: 'tracker.rotation.left',
[rotationToQuatMap.RIGHT]: 'tracker.rotation.right',
[rotationToQuatMap.BACK]: 'tracker-rotation-back',
[rotationToQuatMap.FRONT]: 'tracker-rotation-front',
[rotationToQuatMap.LEFT]: 'tracker-rotation-left',
[rotationToQuatMap.RIGHT]: 'tracker-rotation-right',
};
export function TrackerSettingsPage() {
const { t } = useTranslation();
const { l10n } = useLocalization();
const { sendRPCPacket } = useWebsocketAPI();
const [firstLoad, setFirstLoad] = useState(false);
@@ -44,13 +45,17 @@ export function TrackerSettingsPage() {
trackernum: string;
deviceid: string;
}>();
const { register, watch, reset, handleSubmit } = useForm<{
const { control, register, watch, reset, handleSubmit } = useForm<{
trackerName: string | null;
allowDriftCompensation: boolean | null;
}>({
defaultValues: { trackerName: null },
defaultValues: {
trackerName: null,
allowDriftCompensation: null,
},
reValidateMode: 'onSubmit',
});
const { trackerName } = watch();
const { trackerName, allowDriftCompensation } = watch();
const tracker = useTrackerFromId(trackernum, deviceid);
@@ -59,7 +64,7 @@ export function TrackerSettingsPage() {
const assignreq = new AssignTrackerRequestT();
assignreq.mountingRotation = QuaternionToQuatT(
assignreq.mountingOrientation = QuaternionToQuatT(
Quaternion.fromEuler(
0,
0,
@@ -69,6 +74,8 @@ export function TrackerSettingsPage() {
);
assignreq.bodyPosition = tracker?.tracker.info?.bodyPart || BodyPart.NONE;
assignreq.trackerId = tracker?.tracker.trackerId;
if (allowDriftCompensation != null)
assignreq.allowDriftCompensation = allowDriftCompensation;
sendRPCPacket(RpcMessage.AssignTrackerRequest, assignreq);
setSelectRotation(false);
};
@@ -79,6 +86,8 @@ export function TrackerSettingsPage() {
const assignreq = new AssignTrackerRequestT();
assignreq.bodyPosition = role;
assignreq.trackerId = tracker?.tracker.trackerId;
if (allowDriftCompensation != null)
assignreq.allowDriftCompensation = allowDriftCompensation;
sendRPCPacket(RpcMessage.AssignTrackerRequest, assignreq);
setSelectBodypart(false);
};
@@ -86,31 +95,45 @@ export function TrackerSettingsPage() {
const currRotation = useMemo(() => {
return tracker?.tracker.info?.mountingOrientation
? FixEuler(GetYaw(tracker.tracker.info?.mountingOrientation) * RAD_TO_DEG)
: rotationToQuatMap.BACK;
: rotationToQuatMap.FRONT;
}, [tracker?.tracker.info?.mountingOrientation]);
const updateTrackerName = () => {
const updateTrackerSettings = () => {
if (!tracker) return;
if (trackerName == tracker.tracker.info?.customName) return;
if (allowDriftCompensation == null) return;
if (
trackerName == tracker.tracker.info?.customName &&
allowDriftCompensation == tracker.tracker.info?.allowDriftCompensation
)
return;
const assignreq = new AssignTrackerRequestT();
assignreq.bodyPosition = tracker?.tracker.info?.bodyPart || BodyPart.NONE;
assignreq.mountingOrientation = assignreq.mountingOrientation =
QuaternionToQuatT(
Quaternion.fromEuler(0, 0, FixEuler(+currRotation) * DEG_TO_RAD, 'XZY')
);
assignreq.displayName = trackerName;
assignreq.trackerId = tracker?.tracker.trackerId;
assignreq.allowDriftCompensation = allowDriftCompensation;
sendRPCPacket(RpcMessage.AssignTrackerRequest, assignreq);
};
const onSettingsSubmit = () => {
updateTrackerName();
updateTrackerSettings();
};
useDebouncedEffect(
() => {
updateTrackerName();
updateTrackerSettings();
},
[trackerName],
1000
);
useEffect(() => {
updateTrackerSettings();
}, [allowDriftCompensation]);
useEffect(() => {
if (tracker && !firstLoad) setFirstLoad(true);
}, [tracker, firstLoad]);
@@ -119,6 +142,7 @@ export function TrackerSettingsPage() {
if (firstLoad) {
reset({
trackerName: tracker?.tracker.info?.customName as string | null,
allowDriftCompensation: tracker?.tracker.info?.allowDriftCompensation,
});
}
}, [firstLoad]);
@@ -166,7 +190,7 @@ export function TrackerSettingsPage() {
<div className="flex flex-col bg-background-70 p-3 rounded-lg gap-2">
<div className="flex justify-between">
<Typography color="secondary">
{t('tracker.infos.manufacturer')}
{l10n.getString('tracker-infos-manufacturer')}
</Typography>
<Typography>
{tracker?.device?.hardwareInfo?.manufacturer}
@@ -174,13 +198,13 @@ export function TrackerSettingsPage() {
</div>
<div className="flex justify-between">
<Typography color="secondary">
{t('tracker.infos.display-name')}
{l10n.getString('tracker-infos-display_name')}
</Typography>
<Typography>{tracker?.tracker.info?.displayName}</Typography>
</div>
<div className="flex justify-between">
<Typography color="secondary">
{t('tracker.infos.custom-name')}
{l10n.getString('tracker-infos-custom_name')}
</Typography>
<Typography>
{tracker?.tracker.info?.customName || '--'}
@@ -188,7 +212,7 @@ export function TrackerSettingsPage() {
</div>
<div className="flex justify-between">
<Typography color="secondary">
{t('tracker.infos.url')}
{l10n.getString('tracker-infos-url')}
</Typography>
<Typography>
udp://
@@ -200,23 +224,27 @@ export function TrackerSettingsPage() {
</div>
</div>
<div className="flex flex-col flex-grow bg-background-70 rounded-lg p-5 gap-3">
<ArrowLink to="/">{t('tracker.settings.back')}</ArrowLink>
<ArrowLink to="/">
{l10n.getString('tracker-settings-back')}
</ArrowLink>
<Typography variant="main-title">
{t('tracker.settings.title')}
{l10n.getString('tracker-settings-title')}
</Typography>
<div className="flex flex-col gap-2 w-full mt-3">
<Typography variant="section-title">
{t('tracker.settings.assignment-section.title')}
{l10n.getString('tracker-settings-assignment_section')}
</Typography>
<Typography color="secondary">
{t('tracker.settings.assignment-section.description')}
{l10n.getString(
'tracker-settings-assignment_section-description'
)}
</Typography>
<div className="flex justify-between bg-background-80 w-full p-3 rounded-lg">
<div className="flex gap-3 items-center">
<FootIcon></FootIcon>
<Typography>
{t(
'body-part.' +
{l10n.getString(
'body_part-' +
BodyPart[tracker?.tracker.info?.bodyPart || BodyPart.NONE]
)}
</Typography>
@@ -226,42 +254,73 @@ export function TrackerSettingsPage() {
variant="secondary"
onClick={() => setSelectBodypart(true)}
>
{t('tracker.settings.assignment-section.edit')}
{l10n.getString('tracker-settings-assignment_section-edit')}
</Button>
</div>
</div>
</div>
<div className="flex flex-col gap-2 w-full mt-3">
<Typography variant="section-title">
{t('tracker.settings.mounting-section.title')}
{l10n.getString('tracker-settings-mounting_section')}
</Typography>
<Typography color="secondary">
{t('tracker.settings.mounting-section.description')}
{l10n.getString('tracker-settings-mounting_section-description')}
</Typography>
<div className="flex justify-between bg-background-80 w-full p-3 rounded-lg">
<div className="flex gap-3 items-center">
<FootIcon></FootIcon>
<Typography>{t(rotationsLabels[currRotation])}</Typography>
<Typography>
{l10n.getString(rotationsLabels[currRotation])}
</Typography>
</div>
<div className="flex">
<Button
variant="secondary"
onClick={() => setSelectRotation(true)}
>
{t('tracker.settings.mounting-section.edit')}
{l10n.getString('tracker-settings-mounting_section-edit')}
</Button>
</div>
</div>
</div>
{tracker?.tracker.info?.isImu && (
<>
<div className="flex flex-col gap-2 w-full mt-3">
<Typography variant="section-title">
{l10n.getString(
'tracker-settings-drift_compensation_section'
)}
</Typography>
<Typography color="secondary">
{l10n.getString(
'tracker-settings-drift_compensation_section-description'
)}
</Typography>
<div className="flex">
<CheckBox
variant="toggle"
outlined
name="allowDriftCompensation"
control={control}
label={l10n.getString(
'tracker-settings-drift_compensation_section-edit'
)}
/>
</div>
</div>
</>
)}
<div className="flex flex-col gap-2 w-full mt-3">
<Typography variant="section-title">
{t('tracker.settings.name-section.title')}
{l10n.getString('tracker-settings-name_section')}
</Typography>
<Typography color="secondary">
{t('tracker.settings.name-section.description')}
{l10n.getString('tracker-settings-name_section-description')}
</Typography>
<Input
placeholder={t('tracker.settings.name-section.input-placeholder')}
placeholder={l10n.getString(
'tracker-settings-name_section-placeholder'
)}
type="text"
autocomplete={false}
{...register('trackerName')}

View File

@@ -1,16 +1,16 @@
import classNames from 'classnames';
import { useMemo } from 'react';
import { useTranslation } from 'react-i18next';
import { TrackerStatus as TrackerStatusEnum } from 'solarxr-protocol';
import { Typography } from '../commons/Typography';
import { useLocalization } from '@fluent/react';
const statusLabelMap: { [key: number]: string } = {
[TrackerStatusEnum.NONE]: 'tracker.status.none',
[TrackerStatusEnum.BUSY]: 'tracker.status.busy',
[TrackerStatusEnum.ERROR]: 'tracker.status.error',
[TrackerStatusEnum.DISCONNECTED]: 'tracker.status.disconnected',
[TrackerStatusEnum.OCCLUDED]: 'tracker.status.occluded',
[TrackerStatusEnum.OK]: 'tracker.status.ok',
[TrackerStatusEnum.NONE]: 'tracker-status-none',
[TrackerStatusEnum.BUSY]: 'tracker-status-busy',
[TrackerStatusEnum.ERROR]: 'tracker-status-error',
[TrackerStatusEnum.DISCONNECTED]: 'tracker-status-disconnected',
[TrackerStatusEnum.OCCLUDED]: 'tracker-status-occluded',
[TrackerStatusEnum.OK]: 'tracker-status-ok',
};
const statusClassMap: { [key: number]: string } = {
@@ -23,7 +23,7 @@ const statusClassMap: { [key: number]: string } = {
};
export function TrackerStatus({ status }: { status: number }) {
const { t } = useTranslation();
const { l10n } = useLocalization();
const statusClass = useMemo(() => statusClassMap[status], [status]);
const statusLabel = useMemo(() => statusLabelMap[status], [status]);
@@ -33,7 +33,7 @@ export function TrackerStatus({ status }: { status: number }) {
<div className="flex flex-col justify-center">
<div className={classNames('w-2 h-2 rounded-full', statusClass)}></div>
</div>
<Typography color="secondary">{t(statusLabel)}</Typography>
<Typography color="secondary">{l10n.getString(statusLabel)}</Typography>
</div>
);
}

View File

@@ -1,11 +1,10 @@
import classNames from 'classnames';
import { IPv4 } from 'ip-num/IPNumber';
import { MouseEventHandler, ReactNode, useState } from 'react';
import { useTranslation } from 'react-i18next';
import {
TrackerDataT,
TrackerIdT,
TrackerStatus as TrackerStatusEnum
TrackerStatus as TrackerStatusEnum,
} from 'solarxr-protocol';
import { FlatDeviceTracker } from '../../hooks/app';
import { useTracker } from '../../hooks/tracker';
@@ -14,6 +13,7 @@ import { Typography } from '../commons/Typography';
import { TrackerBattery } from './TrackerBattery';
import { TrackerStatus } from './TrackerStatus';
import { TrackerWifi } from './TrackerWifi';
import { useLocalization } from '@fluent/react';
export function TrackerNameCol({ tracker }: { tracker: TrackerDataT }) {
const { useName } = useTracker(tracker);
@@ -106,7 +106,7 @@ export function TrackersTable({
clickedTracker: (tracker: TrackerDataT) => void;
flatTrackers: FlatDeviceTracker[];
}) {
const { t } = useTranslation();
const { l10n } = useLocalization();
const [hoverTracker, setHoverTracker] = useState<TrackerIdT | null>(null);
const trackerEqual = (id: TrackerIdT | null) =>
@@ -116,7 +116,9 @@ export function TrackersTable({
return (
<div className="flex w-full overflow-x-auto py-2">
<div className="flex flex-col gap-1">
<div className="flex px-3">{t('tracker.table.column.name')}</div>
<div className="flex px-3">
{l10n.getString('tracker-table-column-name')}
</div>
{flatTrackers.map(({ tracker }, index) => (
<RowContainer
key={index}
@@ -132,7 +134,9 @@ export function TrackersTable({
))}
</div>
<div className="flex flex-col gap-1">
<div className="flex px-3">{t('tracker.table.column.type')}</div>
<div className="flex px-3">
{l10n.getString('tracker-table-column-type')}
</div>
{flatTrackers.map(({ device, tracker }, index) => (
<RowContainer
key={index}
@@ -149,7 +153,9 @@ export function TrackersTable({
))}
</div>
<div className="flex flex-col gap-1">
<div className="flex px-3">{t('tracker.table.column.battery')}</div>
<div className="flex px-3">
{l10n.getString('tracker-table-column-battery')}
</div>
{flatTrackers.map(({ device, tracker }, index) => (
<RowContainer
key={index}
@@ -171,7 +177,9 @@ export function TrackersTable({
))}
</div>
<div className="flex flex-col gap-1">
<div className="flex px-3">{t('tracker.table.column.ping')}</div>
<div className="flex px-3">
{l10n.getString('tracker-table-column-ping')}
</div>
{flatTrackers.map(({ device, tracker }, index) => (
<RowContainer
key={index}
@@ -196,7 +204,7 @@ export function TrackersTable({
</div>
<div className="flex flex-col gap-1">
<div className="flex px-3 whitespace-nowrap">
{t('tracker.table.column.rotation')}
{l10n.getString('tracker-table-column-rotation')}
</div>
{flatTrackers.map(({ tracker }, index) => (
<RowContainer
@@ -213,7 +221,7 @@ export function TrackersTable({
</div>
<div className="flex flex-col gap-1">
<div className="flex px-3 whitespace-nowrap">
{t('tracker.table.column.position')}
{l10n.getString('tracker-table-column-position')}
</div>
{flatTrackers.map(({ tracker }, index) => (
<RowContainer
@@ -239,7 +247,9 @@ export function TrackersTable({
))}
</div>
<div className="flex flex-col gap-1 flex-grow">
<div className="flex px-3">{t('tracker.table.column.url')}</div>
<div className="flex px-3">
{l10n.getString('tracker-table-column-url')}
</div>
{flatTrackers.map(({ device, tracker }, index) => (
<RowContainer

View File

@@ -1,16 +1,16 @@
import { useEffect } from 'react';
import { useForm } from 'react-hook-form';
import { useTranslation } from 'react-i18next';
import { KeyValuesT, MessageT, Payload, Topic } from 'solarxr-protocol';
import {
OVERLAY_DISPLAY_SETTINGS_TOPIC,
PayloadData,
usePubSub
usePubSub,
} from '../../hooks/pubSub';
import { CheckBox } from '../commons/Checkbox';
import { useLocalization } from '@fluent/react';
export function OverlayWidget() {
const { t } = useTranslation();
const { l10n } = useLocalization();
const { publish, subscribe, keyValues } = usePubSub();
const { reset, control, handleSubmit, watch } = useForm<{
isVisible: boolean;
@@ -68,13 +68,13 @@ export function OverlayWidget() {
control={control}
name="isVisible"
variant="toggle"
label={t('overlay.is-visible-label')}
label={l10n.getString('overlay-is_visible_label')}
></CheckBox>
<CheckBox
control={control}
name="isMirrored"
variant="toggle"
label={t('overlay.is-mirrored-label')}
label={l10n.getString('overlay-is_mirrored_label')}
></CheckBox>
</form>
);

View File

@@ -1,5 +1,4 @@
import { createContext, useContext, useMemo, useState } from 'react';
import { useTranslation } from 'react-i18next';
import {
AutoBoneEpochResponseT,
AutoBoneProcessRequestT,
@@ -8,9 +7,10 @@ import {
RpcMessage,
SkeletonBone,
SkeletonConfigRequestT,
SkeletonPartT
SkeletonPartT,
} from 'solarxr-protocol';
import { useWebsocketAPI } from './websocket-api';
import { useLocalization } from '@fluent/react';
export interface AutoboneContext {
hasRecording: boolean;
@@ -23,7 +23,7 @@ export interface AutoboneContext {
}
export function useProvideAutobone(): AutoboneContext {
const { t } = useTranslation();
const { l10n } = useLocalization();
const { useRPCPacket, sendRPCPacket } = useWebsocketAPI();
const [hasRecording, setHasRecording] = useState(false);
const [hasCalibration, setHasCalibration] = useState(false);
@@ -36,7 +36,7 @@ export function useProvideAutobone(): AutoboneContext {
return (
skeletonParts?.map(({ bone, value }) => ({
bone,
label: t('skeleton-bone.' + SkeletonBone[bone]),
label: l10n.getString('skeleton_bone-' + SkeletonBone[bone]),
value,
})) || []
);

View File

@@ -1,9 +1,9 @@
import { useEffect, useMemo, useRef, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { BodyPart, TrackerDataT, TrackerStatus } from 'solarxr-protocol';
import { RAD_TO_DEG } from '../maths/angle';
import { QuaternionFromQuatT } from '../maths/quaternion';
import { useAppContext } from './app';
import { useLocalization } from '@fluent/react';
export function useTrackers() {
const { trackers } = useAppContext();
@@ -38,7 +38,7 @@ export function useTrackers() {
}
export function useTracker(tracker: TrackerDataT) {
const { t } = useTranslation();
const { l10n } = useLocalization();
const computeRot = (rot: { x: number; y: number; z: number; w: number }) =>
QuaternionFromQuatT({
x: rot.x || 0,
@@ -52,7 +52,9 @@ export function useTracker(tracker: TrackerDataT) {
useMemo(() => {
if (tracker.info?.customName) return tracker.info?.customName;
if (tracker.info?.bodyPart)
return t('body-part.' + BodyPart[tracker.info?.bodyPart]);
return l10n.getString(
'body_part-' + BodyPart[tracker.info?.bodyPart]
);
return tracker.info?.displayName || 'NONE';
}, [tracker.info]),
useRotation: () =>

View File

@@ -3,6 +3,7 @@ import { useForm } from 'react-hook-form';
import { useNavigate } from 'react-router-dom';
import { Input } from '../components/commons/Input';
import { useOnboarding } from './onboarding';
import { Localized } from '@fluent/react';
export interface WifiFormData {
ssid: string;
@@ -41,20 +42,30 @@ export function useWifiForm() {
hasWifiCreds: !!state.wifi,
WifiForm: () => (
<>
<Input
{...register('ssid', { required: true })}
type="text"
label="SSID"
placeholder="Enter SSID"
variant="secondary"
/>
<Input
{...register('password')}
type="password"
label="Password"
placeholder="Enter password"
variant="secondary"
/>
<Localized
id="onboarding-wifi_creds-ssid"
attrs={{ placeholder: true, label: true }}
>
<Input
{...register('ssid', { required: true })}
type="text"
label="SSID"
placeholder="ssid"
variant="secondary"
/>
</Localized>
<Localized
id="onboarding-wifi_creds-password"
attrs={{ placeholder: true, label: true }}
>
<Input
{...register('password')}
type="password"
label="Password"
placeholder="password"
variant="secondary"
/>
</Localized>
</>
),
};

View File

@@ -1,83 +0,0 @@
import i18next from 'i18next';
import { initReactI18next } from 'react-i18next';
import en from './en/translation.json';
import fr from './fr/translation.json';
import ko from './ko/translation.json';
import pl from './pl/translation.json';
import ptBR from './pt-BR/translation.json';
import vi from './vi/translation.json';
import zh from './zh/translation.json';
import owo from './owo/translation.json';
export const defaultNS = 'translation';
export const langs = [
{
name: '🇺🇸 English',
key: 'en',
},
{
name: '🇫🇷 Français',
key: 'fr',
},
{
name: '🇰🇷 한국어',
key: 'ko',
},
{
name: 'Polski',
key: 'pl',
},
{
name: '🇧🇷 Português Brasileiro',
key: 'ptBR',
},
{
name: 'Tiếng Việt',
key: 'vi',
},
{
name: '🇨🇳 简体中文',
key: 'zh',
},
{
name: '🥺 Engwish~ OwO',
key: 'owo',
},
];
export const resources = {
en: {
translation: en,
},
fr: {
translation: fr,
},
ko: {
translation: ko,
},
pl: {
translation: pl,
},
ptBR: {
translation: ptBR,
},
vi: {
translation: vi,
},
zh: {
translation: zh,
},
owo: {
translation: owo,
},
};
i18next.use(initReactI18next).init({
lng: 'en', // if you're using a language detector, do not define the lng option
resources,
fallbackLng: 'en',
defaultNS,
});
export default i18next;

143
gui/src/i18n/config.tsx Normal file
View File

@@ -0,0 +1,143 @@
import { match } from '@formatjs/intl-localematcher';
import { FluentBundle, FluentResource } from '@fluent/bundle';
import { LocalizationProvider, ReactLocalization } from '@fluent/react';
import { Children, ReactNode, useEffect, useState, createContext } from 'react';
export const defaultNS = 'translation';
export const DEFAULT_LOCALE = 'en';
export const langs = [
{
name: '🇺🇸 English',
key: 'en',
},
{
name: '🌎 Español Latinoamericano',
key: 'es-419',
},
{
name: '🇪🇪 Eesti',
key: 'et',
},
{
name: '🇫🇷 Français',
key: 'fr',
},
{
name: '🇮🇹 Italiano',
key: 'it',
},
{
name: '🇯🇵 日本語',
key: 'ja',
},
{
name: '🇰🇷 한국어',
key: 'ko',
},
{
name: '🇵🇱 Polski',
key: 'pl',
},
{
name: '🇧🇷 Português Brasileiro',
key: 'pt-BR',
},
{
name: '🇻🇳 Tiếng Việt',
key: 'vi',
},
{
name: '🇨🇳 简体中文',
key: 'zh-Hans',
},
{
name: '🥺 Engwish~ OwO',
key: 'en-x-owo',
},
];
// Fetch translation file
async function fetchMessages(locale: string): Promise<[string, string]> {
const response = await fetch(`/i18n/${locale}/translation.ftl`);
const messages = await response.text();
return [locale, messages];
}
// Generator function for making FluentBundles from the translation file
function* lazilyParsedBundles(fetchedMessages: [string, string][]) {
for (const [locale, messages] of fetchedMessages) {
const resource = new FluentResource(messages);
const bundle = new FluentBundle(locale);
bundle.addResource(resource);
yield bundle;
}
}
function verifyLocale(locale: string | null): string | null {
if (!locale) return null;
try {
new Intl.Locale(locale);
return locale;
} catch (e) {
console.error(e);
return null;
}
}
interface AppLocalizationProviderProps {
children: ReactNode;
}
interface i18n {
currentLocales: string[];
changeLocales: (userLocales: string[]) => Promise<void>;
}
export const LangContext = createContext<i18n>(undefined as never);
export function AppLocalizationProvider(props: AppLocalizationProviderProps) {
const [currentLocales, setCurrentLocales] = useState([DEFAULT_LOCALE]);
const [l10n, setL10n] = useState<ReactLocalization | null>(null);
async function changeLocales(userLocales: string[]) {
const currentLocale = match(
userLocales.filter((x) => verifyLocale(x) !== null),
langs.map((x) => x.key),
DEFAULT_LOCALE
);
setCurrentLocales([currentLocale]);
const fetchedMessages = [
await fetchMessages(currentLocale),
await fetchMessages(DEFAULT_LOCALE),
];
const bundles = lazilyParsedBundles(fetchedMessages);
localStorage.setItem('i18nextLng', currentLocale);
setL10n(new ReactLocalization(bundles));
}
useEffect(() => {
const lang = verifyLocale(localStorage.getItem('i18nextLng'));
const array = [];
if (lang) array.push(lang);
changeLocales([...array, ...navigator.languages]);
// detect hot reload translation file changes
if (import.meta.hot) {
import.meta.hot.on('locales-update', () => changeLocales(currentLocales));
}
}, []);
if (l10n === null) {
return <></>;
}
return (
<>
<LocalizationProvider l10n={l10n}>
<LangContext.Provider value={{ currentLocales, changeLocales }}>
{Children.only(props.children)}
</LangContext.Provider>
</LocalizationProvider>
</>
);
}

View File

@@ -1,492 +0,0 @@
{
"websocket": {
"connecting": "Connecting to the server",
"connection-lost": "Connection lost to the server. Trying to reconnect..."
},
"tips": {
"find-tracker": "Not sure which tracker is which? Shake a tracker and it will highlight the corresponding item.",
"do-not-move-heels": "Ensure your heels do not move during recording!"
},
"body-part": {
"NONE": "Unassigned",
"HEAD": "Head",
"NECK": "Neck",
"RIGHT_SHOULDER": "Right shoulder",
"RIGHT_UPPER_ARM": "Right upper arm",
"RIGHT_LOWER_ARM": "Right lower arm",
"RIGHT_HAND": "Right hand",
"RIGHT_UPPER_LEG": "Right thigh",
"RIGHT_LOWER_LEG": "Right ankle",
"RIGHT_FOOT": "Right foot",
"CHEST": "Chest",
"WAIST": "Waist",
"HIP": "Hip",
"LEFT_SHOULDER": "Left shoulder",
"LEFT_UPPER_ARM": "Left upper arm",
"LEFT_LOWER_ARM": "Left lower arm",
"LEFT_HAND": "Left hand",
"LEFT_UPPER_LEG": "Left thigh",
"LEFT_LOWER_LEG": "Left ankle",
"LEFT_FOOT": "Left foot"
},
"skeleton-bone": {
"NONE": "None",
"HEAD": "Head Shift",
"NECK": "Neck Length",
"TORSO": "Torso Length",
"CHEST": "Chest Distance",
"WAIST": "Waist Distance",
"HIP_OFFSET": "Hip Offset",
"HIPS_WIDTH": "Hips Width",
"LEGS_LENGTH": "Legs Length",
"KNEE_HEIGHT": "Knee Height",
"FOOT_LENGTH": "Foot Length",
"FOOT_SHIFT": "Foot Shift",
"SKELETON_OFFSET": "Skeleton Offset",
"CONTROLLER_DISTANCE_Z": "Controller Distance Z",
"CONTROLLER_DISTANCE_Y": "Controller Distance Y",
"FOREARM_LENGTH": "Forearm Distance",
"SHOULDERS_DISTANCE": "Shoulders Distance",
"SHOULDERS_WIDTH": "Shoulders Width",
"UPPER_ARM_LENGTH": "Upper Arm Length",
"ELBOW_OFFSET": "Elbow Offset"
},
"reset": {
"reset-all": "Reset all proportions",
"full": "Reset",
"mounting": "Reset Mounting",
"quick": "Quick Reset"
},
"serial-detection": {
"new-device.p0": "New serial device detected!" ,
"new-device.p1": "Enter your wifi credentials!",
"new-device.p2": "Please select what you want to do with it",
"open-wifi": "Connect to WiFi",
"open-serial": "Open Serial Console",
"submit": "Submit!",
"close": "Close"
},
"navbar": {
"home": "Home",
"body-proportions": "Body Proportions",
"trackers-assign": "Tracker Assignment",
"mounting": "Mounting Calibration",
"onboarding": "Setup Wizard",
"settings": "Settings"
},
"bvh": {
"start-recording": "Record BVH",
"recording": "Recording..."
},
"overlay": {
"is-visible-label": "Show Overlay in SteamVR",
"is-mirrored-label": "Display Overlay as Mirror"
},
"tracker": {
"status": {
"none": "No Status",
"busy": "Busy",
"error": "Error",
"disconnected": "Disconnected",
"occluded": "Occluded",
"ok": "Connected"
},
"table": {
"column": {
"name": "Name",
"type": "Type",
"battery": "Battery",
"ping": "Ping",
"rotation": "Rotation X/Y/Z",
"position": "Position X/Y/Z",
"url": "URL"
}
},
"rotation": {
"front": "Front",
"left": "Left",
"right": "Right",
"back": "Back"
},
"infos": {
"manufacturer": "Manufacturer",
"display-name": "Display Name",
"custom-name": "Custom Name",
"url": "Tracker URL"
},
"settings": {
"back": "Go back to trackers list",
"title": "Tracker settings",
"assignment-section": {
"title": "Assignment",
"description": "What part of the body the tracker is assigned to.",
"edit": "Edit assignment"
},
"mounting-section": {
"title": "Mounting position",
"description": "Where is the tracker mounted?",
"edit": "Edit mounting"
},
"name-section": {
"title": "Tracker name",
"description": "Give it a cute nickname :)",
"input-placeholder": "NightyBeast's left leg"
}
},
"part-card": {
"no-name": "No name",
"unassigned": "Unassigned"
}
},
"body-assignment-menu": {
"title": "Where do you want this tracker to be?",
"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.",
"show-advanced-locations": "Show advanced assign locations",
"manage-trackers": "Manage all trackers",
"unassign-tracker": "Unassign tracker"
},
"tracker-selection-menu": {
"title": "Which tracker to assign to the {{bodyPart}}?",
"unassigned": "Unassigned Trackers",
"assigned": "Assigned Trackers",
"dont-assign": "Do not assign"
},
"mounting-selection-menu": {
"title": "Where do you want this tracker to be?",
"close": "Close"
},
"settings": {
"sidebar": {
"title": "Settings",
"general": "General",
"tracker-mechanics": "Tracker mechanics",
"fk-settings": "FK settings",
"gesture-control": "Gesture control",
"interface": "Interface",
"osc-router": "OSC router",
"utils": "Utilities",
"serial": "Serial console"
},
"general": {
"steamvr": {
"title": "SteamVR",
"subtitle": "SteamVR trackers",
"description.p0": "Enable or disable specific SteamVR trackers.",
"description.p1": "Useful for games or apps that only support certain trackers.",
"trackers": {
"waist": "Waist",
"chest": "Chest",
"feet": "Feet",
"knees": "Knees",
"elbows": "Elbows",
"hands": "Hands"
}
},
"tracker-mechanics": {
"title": "Tracker mechanics",
"subtitle": "Filtering",
"description.p0": "Choose the filtering type for your trackers.",
"description.p1": "Prediction predicts movement while smoothing smoothens movement.",
"filtering-type": {
"title": "Filtering type",
"none": {
"label": "No filtering",
"description":"Use rotations as is. Will not do any filtering."
},
"smoothing": {
"label": "Smoothing",
"description":"Smooths movements but adds some latency."
},
"prediction": {
"label": "Prediction",
"description":"Reduces latency and makes movements more snappy, but may increase jitter."
}
},
"amount": {
"label": "Amount"
}
},
"fk-settings": {
"title": "FK settings",
"leg-tweak": {
"title": "Leg tweaks",
"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": "Floor clip",
"skating-correction": "Skating correction",
"skating-correction-amount": "Skating correction strength"
},
"arm-fk": {
"title": "Arm FK",
"description": "Change the way the arms are tracked.",
"force-arms": "Force arms from HMD"
},
"skeleton-settings": {
"title": "Skeleton settings",
"description": "Toggle skeleton settings on or off. It is recommended to leave these on.",
"extended-spine": "Extended spine",
"extended-pelvis": "Extended pelvis",
"extended-knees": "Extended knee"
}
},
"gesture-control": {
"title": "Gesture control",
"subtitle": "Double Tap quick reset",
"description": "Enable or disable double tap quick reset. When enabled double tapping anywhere on the highest torso tracker will activate a quick reset. Delay is the time between registering a tap and resetting.",
"enable": "Double tap quick reset",
"delay": "Delay"
},
"interface": {
"title": "Interface",
"dev-mode": {
"title": "Developer Mode",
"description": "This mode can be useful if you need in-depth data or to interact with connected trackers on a more advanced level",
"label": "Developer Mode"
},
"serial-detection": {
"title": "Serial device 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",
"label": "Serial device detection"
},
"lang": {
"title": "Select language",
"description": "Change the default language you want to use",
"placeholder": "Select the language to use"
}
}
},
"serial": {
"title": "Serial Console",
"description.p0": "This is a live information feed for serial communication.",
"description.p1": "May be useful if you need to know the firmware is acting up.",
"connection-lost": "Connection to serial lost, Reconnecting...",
"reboot": "Reboot",
"factory-reset": "Factory Reset",
"get-infos": "Get Infos",
"serial-select": "Select a serial port",
"auto-dropdown-item": "Auto"
},
"osc": {
"router": {
"title": "OSC router",
"description.p0": "Forward OSC messages from another program.",
"description.p1": "Useful for using another OSC program with VRChat for example.",
"enable": {
"title": "Enable",
"description": "Toggle the forwarding of messages",
"label": "Enable"
},
"network": {
"title": "Network ports",
"description.p0": "Set the ports for listening and sending data",
"description.p1": "These can be the same as other ports used in the SlimeVR server",
"port-in": {
"label": "Port In",
"placeholder": "Port in (default: 9002)"
},
"port-out": {
"label": "Port Out",
"placeholder": "Port out (default: 9000)"
},
"address": {
"title": "Network address",
"description": "Set the address to send out data at",
"placeholder": "IPV4 address"
}
}
},
"vrchat": {
"description.p0": "Change VRChat-specific settings to receive HMD data and send",
"description.p1": "trackers data for FBT (works on Quest standalone).",
"enable": {
"title": "Enable",
"description": "Toggle the sending and receiving of data",
"label": "Enable"
},
"network": {
"title": "Network ports",
"description": "Set the ports for listening and sending data to VRChat",
"port-in": {
"label": "Port In",
"placeholder": "Port in (default: 9001)"
},
"port-out": {
"label": "Port Out",
"placeholder": "Port out (default: 9000)"
},
"address": {
"title": "Network address",
"description": "Choose which address to send out data to VRChat (check your wifi settings on your device)",
"placeholder": "VRChat ip address"
},
"trackers": {
"title": "Trackers",
"description": "Toggle the sending and receiving of data",
"chest": "Chest",
"waist": "Waist",
"knees": "Knees",
"feet": "Feet",
"elbows": "Elbows"
}
}
}
}
},
"onboarding": {
"skip": "Skip setup",
"continue": "Continue",
"wip": "Work in progress",
"wifi-creds": {
"back": "Go Back to introduction",
"title": "Input WiFi credentials",
"description.p0": "The Trackers will use these credentials to connect wirelessly",
"description.p1": "please use the credentials that you are currently connected to",
"skip": "Skip wifi settings",
"submit": "Submit!"
},
"reset-tutorial": {
"back": "Go Back to Mounting calibration",
"title": "Reset tutorial",
"description": "This feature isn't done, just press continue"
},
"home": {
"title": "Welcome to SlimeVR",
"description.p0": "Bringing full-body tracking",
"description.p1": "to everyone",
"start": "Lets get set up!"
},
"enter-vr": {
"back": "Go Back to Tracker assignent",
"title": "Time to enter VR!",
"description": "Put on all your trackers and then enter VR!",
"ready": "I'm ready"
},
"done": {
"title": "You're all set!",
"description": "Enjoy your full body experience",
"close": "Close the guide"
},
"connect-tracker": {
"back": "Go Back to WiFi credentials",
"title": "Connect trackers",
"description.p0": "Now onto the fun part, connecting all the trackers!",
"description.p1": "Simply connect all that aren't connected yet, through a USB port.",
"issue": {
"serial": "I'm having trouble connecting!"
},
"usb": "USB Tracker",
"connection-status": {
"connecting": "Sending wifi credentials",
"connected": "Connected to WiFi",
"error": "Unable to connect to Wifi",
"start-connecting": "Looking for trackers",
"handshake": "Connected to the Server"
},
"connected-trackers": "{{amount}} trackers connected",
"next": "I connected all my trackers"
},
"assign-trackers": {
"back": "Go Back to Wifi Credentials",
"title": "Assign trackers",
"description": "Let's choose which tracker goes where. Click on a location where you want to place a tracker",
"assigned": "{{assigned}} of {{trackers}} trackers assigned",
"advanced": "Show advanced assign locations",
"next": "I assigned all the trackers"
},
"manual-mounting": {
"back": "Go Back to Enter VR",
"title": "Manual Mounting",
"description": "Click on every tracker and select which way they are mounted",
"auto-mounting": "Automatic mounting",
"next": "Next step"
},
"automatic-mounting": {
"back": "Go Back to Enter VR",
"title": "Mounting Calibration",
"description": "For SlimeVR trackers to work, we need to assign a mounting rotation to your trackers to align them with your physical tracker mounting.",
"manual-mounting": "Manually set mounting",
"next": "Next step",
"prev-step": "Previous step",
"done": {
"title": "Mounting rotations calibrated.",
"description": "Your mounting calibration is complete!",
"restart": "Return to start"
},
"mounting-reset": {
"title": "Mounting Reset",
"step": {
"0": "1. Squat in a \"skiing\" pose with your legs bent, your upper body tilted forwards, and your arms bent.",
"1": "2. Press the \"Reset Mounting\" button and wait for 3 seconds before the trackers' mounting rotations will reset."
}
},
"preparation": {
"title": "Preparation",
"step": {
"0": "1. Stand upright with your arms to your sides.",
"1": "2. Press the \"Reset\" button and wait for 3 seconds before the trackers will reset."
}
},
"put-trackers-on": {
"title": "Put on your trackers",
"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.",
"next": "I have all my trackers on"
}
},
"manual-proportions": {
"back": "Go Back to Reset tutorial",
"title": "Manual Body Proportions",
"precision": "Precision adjust",
"auto": "Automatic calibration"
},
"automatic-proportions": {
"back": "Go Back to Reset tutorial",
"title": "Measure your body",
"description": "For SlimeVR trackers to work, we need to know the length of your bones. This short calibration will measure it for you.",
"manual": "Manual calibration",
"prev-step": "Previous step",
"put-trackers-on": {
"title": "Put on your trackers",
"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.",
"next": "I have all my trackers on"
},
"preparation": {
"title": "Preparation",
"description": "Place a chair directly behind you inside your play space. Be prepared to sit down during the autobone setup.",
"next": "I am in front of a chair"
},
"start-recording": {
"title": "Get ready to move",
"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!",
"next": "Start Recording"
},
"recording": {
"title": "REC",
"description.p0": "Recording in progress...",
"description.p1": "Make the moves shown below:",
"steps": {
"0": "Bend knees a few times.",
"1": "Sit on a chair then stand up.",
"2": "Twist upper body left, then bend right.",
"3": "Twist upper body right, then bend left.",
"4": "Wiggle around until timer ends."
},
"processing": "Processing the result",
"timer": "{{time}} seconds left"
},
"verify-results": {
"title": "Verify results",
"description": "Check the results below, do they look correct?",
"results": "Recording results",
"processing": "Processing the result",
"redo": "Redo recording",
"confirm": "They're correct"
},
"done": {
"title": "Body measured and saved.",
"description": "Your body proportions calibration is complete!"
}
}
},
"home": {
"no-trackers": "No trackers detected or assigned"
}
}

View File

@@ -1,492 +0,0 @@
{
"websocket": {
"connecting": "Connexion au serveur..",
"connection-lost": "Connexion avec le serveur perdu. Reconnexion..."
},
"tips": {
"find-tracker": "Tu n'arrives pas à identifier quel capteur est lequel? Bouge le capteur pour qu'il s'affiche",
"do-not-move-heels": "Faites attention à ne pas bouger vos pieds pendant la calibration !"
},
"body-part": {
"NONE": "Non assigné",
"HEAD": "Tête",
"NECK": "Cou",
"RIGHT_SHOULDER": "Épaule droite",
"RIGHT_UPPER_ARM": "Épaule gauche",
"RIGHT_LOWER_ARM": "Avant-bras droit",
"RIGHT_HAND": "Main droite",
"RIGHT_UPPER_LEG": "Haut de la jambe droite",
"RIGHT_LOWER_LEG": "Bas de la jambe droite",
"RIGHT_FOOT": "Pied droit",
"CHEST": "Poitrine",
"WAIST": "Taille",
"HIP": "Hanche",
"LEFT_SHOULDER": "Épaule gauche",
"LEFT_UPPER_ARM": "Haut du bras gauche",
"LEFT_LOWER_ARM": "Avant-bras gauche",
"LEFT_HAND": "Main gauche",
"LEFT_UPPER_LEG": "Haut de la jambe gauche",
"LEFT_LOWER_LEG": "Bas de la jambe gauche",
"LEFT_FOOT": "Pied gauche"
},
"skeleton-bone": {
"NONE": "Aucun",
"HEAD": "Décalage de la tête",
"NECK": "Longueur du cou",
"TORSO": "Longueur du torse",
"CHEST": "Distance poitrine",
"WAIST": "Distance de la taille",
"HIP_OFFSET": "Écart de la hanche",
"HIPS_WIDTH": "Largeur aux hanches",
"LEGS_LENGTH": "Longueur des jambes",
"KNEE_HEIGHT": "Hauteur du genou",
"FOOT_LENGTH": "Longueur du pied",
"FOOT_SHIFT": "Décalage du pied",
"SKELETON_OFFSET": "Decalage du squelette",
"CONTROLLER_DISTANCE_Z": "Distance Z du contrôleur",
"CONTROLLER_DISTANCE_Y": "Distance Y du contrôleur",
"FOREARM_LENGTH": "Distance avant-bras",
"SHOULDERS_DISTANCE": "Distance des épaules",
"SHOULDERS_WIDTH": "Largeur des épaules",
"UPPER_ARM_LENGTH": "Longueur du bras supérieur",
"ELBOW_OFFSET": "Décalage du coude"
},
"reset": {
"reset-all": "Réinitialiser toutes les proportions",
"full": "Réinitialiser",
"mounting": "Réinitialiser le montage",
"quick": "Réinitialisation rapide"
},
"serial-detection": {
"new-device.p0": "Nouveau périphérique détecté!",
"new-device.p1": "Entrez vos identifiants wifi!",
"new-device.p2": "Veuillez sélectionner ce que vous voulez en faire",
"open-wifi": "Connectez-vous au Wi-Fi",
"open-serial": "Ouvrir la console série",
"submit": "Soumettre!",
"close": "Fermer"
},
"navbar": {
"home": "Accueil",
"body-proportions": "Proportions du corps",
"trackers-assign": "Asignement des capteurs",
"mounting": "Position des capteurs",
"onboarding": "Assistant de configuration",
"settings": "Réglages"
},
"bvh": {
"start-recording": "Enregistrer BVH",
"recording": "Enregistrement..."
},
"overlay": {
"is-visible-label": "Afficher la superposition dans SteamVR",
"is-mirrored-label": "Afficher la superposition en miroir"
},
"tracker": {
"status": {
"none": "Pas de statut",
"busy": "Occupé",
"error": "Erreur",
"disconnected": "Deconnecté",
"occluded": "Occulté",
"ok": "Ok"
},
"table": {
"column": {
"name": "Nom",
"type": "Type",
"battery": "Batterie",
"ping": "Ping",
"rotation": "Rotation X/Y/Z",
"position": "Position X/Y/Z",
"url": "URL"
}
},
"rotation": {
"front": "Avant",
"left": "Gauche",
"right": "Droite",
"back": "Arrière"
},
"infos": {
"manufacturer": "Fabricant",
"display-name": "Nom",
"custom-name": "Nom Personalisé",
"url": "URL"
},
"settings": {
"back": "Retour à la liste des capteurs",
"title": "Parametres des capteurs",
"assignment-section": {
"title": "Assignement du capteur",
"description": "À quelle partie du corps le capteur est attribué.",
"edit": "Changer la position"
},
"mounting-section": {
"title": "Direction du capteur",
"description": "Comment est tourné le capteur ?",
"edit": "Changer la direction"
},
"name-section": {
"title": "Nom personalisé",
"description": "Donnez-lui un joli surnom :)",
"input-placeholder": "Jambe gauche de NightyBeast"
}
},
"part-card": {
"no-name": "Sans nom",
"unassigned": "Non attribué"
}
},
"body-assignment-menu": {
"title": "Où voulez-vous que ce capteur soit assigné ?",
"description": "Choisissez un emplacement où vous souhaitez que ce capteur soit affecté. ",
"show-advanced-locations": "Afficher les emplacements d'attribution avancés",
"manage-trackers": "Gérer tous les capteurs",
"unassign-tracker": "Ne pas attribuer"
},
"tracker-selection-menu": {
"title": "Quel capteur attribuer à {{bodyPart}}?",
"unassigned": "capteurs non attribués",
"assigned": "capteurs assignés",
"dont-assign": "Ne pas attribuer"
},
"mounting-selection-menu": {
"title": "Où voulez-vous que ce capteur soit?",
"close": "Fermer"
},
"settings": {
"sidebar": {
"title": "Réglages",
"general": "Général",
"tracker-mechanics": "Fonctionnement des capteurs",
"fk-settings": "Paramètres du squelette",
"gesture-control": "Contrôle gestuel",
"interface": "Interface",
"osc-router": "Routeur OSC",
"utils": "Utilitaires",
"serial": "Console série"
},
"general": {
"steamvr": {
"title": "SteamVR",
"subtitle": "capteurs SteamVR",
"description.p0": "Activez ou désactivez des capteurs SteamVR.",
"description.p1": "Utile pour les jeux ou applications qui ne supportent que certains capteurs.",
"trackers": {
"waist": "Taille",
"chest": "Poitrine",
"feet": "Pieds",
"knees": "Genoux",
"elbows": "Coudes",
"hands": "Mains"
}
},
"tracker-mechanics": {
"title": "Fonctionnement des capteurs",
"subtitle": "Filtrage",
"description.p0": "Choisissez le type de filtrage pour vos capteurs.",
"description.p1": "La prédiction prédit le mouvement tandis que le lissage lisse le mouvement.",
"filtering-type": {
"title": "Type de filtrage",
"none": {
"label": "Pas de filtrage",
"description": "Utilisez les rotations telles quelles."
},
"smoothing": {
"label": "Lissage",
"description": "Lisse les mouvements mais ajoute une certaine latence."
},
"prediction": {
"label": "Prédiction",
"description": "Réduit la latence et rend les mouvements plus rapides, mais peut augmenter le gigue."
}
},
"amount": {
"label": "Force du filtrage"
}
},
"fk-settings": {
"title": "Paramètres FK",
"leg-tweak": {
"title": "Jambes",
"description": "Le limitage au sol peut réduire ou même éliminer les accrocs avec le sol, mais peut causer des problèmes lorsque vous êtes à genoux. ",
"floor-clip": "Limitage au sol",
"skating-correction": "Correction du patinage",
"skating-correction-amount": "Force de la correction du patinage"
},
"arm-fk": {
"title": "Bras",
"description": "Changez la façon dont les bras sont suivis.",
"force-arms": "Forcer les bras a partir du Casque VR"
},
"skeleton-settings": {
"title": "Paramètres du squelette",
"description": "Activez ou désactivez les paramètres de squelette.",
"extended-spine": "Colone vertébrale avancée",
"extended-pelvis": "Bassin avancé",
"extended-knees": "Genou avancé"
}
},
"gesture-control": {
"title": "Contrôle gestuel",
"subtitle": "Double tape pour réinitialisation rapide",
"description": "Active ou désactive le double tape pour réinitialisation rapide. Si activée, double taper sur le capteur le plus haut sur le torse déclenchera une réinitialisation rapide. Le délai est le temps entre la deuxième tape et la réinitialisation rapide.",
"enable": "Double tape pour réinitialisation rapide",
"delay": "Délai"
},
"interface": {
"title": "Interface",
"dev-mode": {
"title": "Mode développeur",
"description": "Ce mode peut être utile si vous avez besoin de données approfondies ou pour interagir avec des capteurs connectés à un niveau plus avancé",
"label": "Mode développeur"
},
"serial-detection": {
"title": "Détection de périphérique série",
"description": "Cette option affichera une fenêtre chaque fois que vous branchez un nouveau périphérique série qui pourrait être un capteur.",
"label": "Détection de périphérique série"
},
"lang": {
"title": "Selectionner la language",
"description": "Choisir la langue par default",
"placeholder": "Choisissez la langue"
}
}
},
"serial": {
"title": "Console série",
"description.p0": "Il s'agit d'un flux d'informations en direct pour la communication série.",
"description.p1": "Peut être utile si vous avez besoin de savoir que capteur fonctionne correctement.",
"connection-lost": "Connexion à l'appareil perdue, reconnexion...",
"reboot": "Redémarrer",
"factory-reset": "Retour aux paramètres d'usine",
"get-infos": "Obtenir des informations",
"serial-select": "Sélectionnez un port série",
"auto-dropdown-item": "Automatique"
},
"osc": {
"router": {
"title": "Routeur OSC",
"description.p0": "Transférez les messages OSC provenant d'un autre programme",
"description.p1": "Utile pour utiliser un autre programme OSC avec VRChat par exemple",
"enable": {
"title": "Activer",
"description": "Activer/désactiver le transfert de messages",
"label": "Activer"
},
"network": {
"title": "Network ports",
"description.p0": "Définissez les ports pour écouter et envoyer des données",
"description.p1": "Ces ports peuvent être les mêmes que les autres utilisés dans le Serveur SlimeVR",
"port-in": {
"label": "Port d'entrée",
"placeholder": "Port d'entrée (par défault: 9002)"
},
"port-out": {
"label": "Port de sortie",
"placeholder": "Port de sortie (par défault: 9000)"
},
"address": {
"title": "Adresse réseau",
"description": "Choisissez l'adresse à laquelle envoyer les données",
"placeholder": "Adresse IPV4"
}
}
},
"vrchat": {
"description.p0": "Modifiez les paramètres spécifiques à VRChat pour recevoir et envoyer des données HMD",
"description.p1": "données de suivi pour FBT (fonctionne sur Quest autonome).",
"enable": {
"title": "Activer",
"description": "Activer/désactiver l'envoi et la réception de données",
"label": "Activer"
},
"network": {
"title": "Connexions réseau",
"description": "Définissez les ports pour écouter et envoyer des données à VRChat",
"port-in": {
"label": "Port d'entrée",
"placeholder": "Port d'entrée (par défaut : 9001)"
},
"port-out": {
"label": "Port de sortie",
"placeholder": "Port de sortie (par défaut : 9000)"
},
"address": {
"title": "Adresse réseau",
"description": "Choisissez l'adresse à laquelle envoyer les données à VRChat (vérifiez vos paramètres wifi sur votre appareil)",
"placeholder": "Adresse IP VRChat"
},
"trackers": {
"title": "capteurs",
"description": "Activer les capteurs utilisant OSC",
"chest": "Poitrine",
"waist": "Taille",
"knees": "Genoux",
"feet": "Pieds",
"elbows": "Coudes"
}
}
}
}
},
"onboarding": {
"skip": "Passer",
"continue": "Continuer",
"wip": "Pas encore implementé",
"wifi-creds": {
"back": "Retour à l'introduction",
"title": "Saisir les identifiants WiFi",
"description.p0": "Les capteurs utiliseront ces informations d'identification pour se connecter au WiFi",
"description.p1": "veuillez utiliser les identifiants auxquels vous êtes actuellement connecté",
"skip": "Ignorer les paramètres Wi-Fi",
"submit": "Valider"
},
"reset-tutorial": {
"back": "Retourner à la rotation des capteurs",
"title": "Tutoriel de réinitialisation",
"description": "Cette fonctionnalité n'est pas terminée, appuyez simplement sur continuer"
},
"home": {
"title": "Bienvenue sur SlimeVR",
"description.p0": "Rendre la capture des mouvements",
"description.p1": "accessible à tous!",
"start": "Commencer!"
},
"enter-vr": {
"back": "Revenir à Attribuer des capteurs",
"title": "Il est temps d'entrer en VR !",
"description": "Mettez tous vos capteurs puis entrez en VR !",
"ready": "je suis prêt!"
},
"done": {
"title": "Vous êtes prêt !",
"description": "Amusez-vous bien :)",
"close": "Fermer le guide"
},
"connect-tracker": {
"back": "Revenir aux informations d'identification WiFi",
"title": "Connecter les capteurs",
"description.p0": "Passons maintenant à la partie amusante, en connectant tous les capteurs !",
"description.p1": "Connectez simplement tout ce qui n'est pas encore connecté, via un port USB.",
"issue": {
"serial": "J'ai du mal à me connecter !"
},
"usb": "capteur USB",
"connection-status": {
"connecting": "Envoi d'identifiants wifi",
"connected": "Connecté au Wi-Fi",
"error": "Impossible de se connecter au Wifi",
"start-connecting": "Recherche de capteurs",
"handshake": "Connecté au serveur"
},
"connected-trackers": "{{amount}} capteurs connectés",
"next": "J'ai connecté tous mes capteurs"
},
"assign-trackers": {
"back": "Revenir aux identifiants Wifi",
"title": "Attribuer des capteurs",
"description": "Choisissons quel capteur va où. ",
"assigned": "{{assigned}} de {{trackers}} capteurs attribués",
"advanced": "Afficher les emplacements d'attribution avancés",
"next": "J'ai assigné tous les capteurs"
},
"manual-mounting": {
"back": "Retournez à entrer dans la réalité virtuelle",
"title": "Rotation manuelle",
"description": "Cliquez sur chaque capteur et sélectionnez la manière dont ils sont tournés",
"auto-mounting": "Detecton automatique",
"next": "Prochaine etape"
},
"automatic-mounting": {
"back": "Retournez à entrer dans la réalité virtuelle",
"title": "Detecton de la rotation automatique",
"description": "Pour que les capteurs SlimeVR fonctionnent, nous devons attribuer une rotation à vos capteurs pour les aligner avec la rotation réelle de votre capteur.",
"manual-mounting": "Rotation manuelle",
"next": "Prochaine etape",
"prev-step": "Étape précédente",
"done": {
"title": "C'est terminé!",
"description": "La rotation des capteurs est calibrée!",
"restart": "Retourner au début"
},
"mounting-reset": {
"title": "Réinitialisation de la rotation",
"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.",
"1": "2. Appuyez sur le bouton \"Réinitialiser le montage\" et attendez 3 secondes avant que les rotations de montage des capteurs ne se réinitialisent."
}
},
"preparation": {
"title": "Préparation",
"step": {
"0": "1. Tenez-vous debout avec vos bras à vos côtés.",
"1": "2. Appuyez sur le bouton \"Réinitialiser\" et attendez 3 secondes avant que les capteurs ne se réinitialisent."
}
},
"put-trackers-on": {
"title": "Enfilez vos capteurs",
"description": "Pour calibrer les rotations de montage, nous allons utiliser les capteurs que vous venez d'affecter.",
"next": "J'ai tous mes capteurs allumés"
}
},
"manual-proportions": {
"back": "Revenir au didacticiel de réinitialisation",
"title": "Proportions manuelles du corps",
"precision": "Ajustement de précision",
"auto": "Calibration automatique"
},
"automatic-proportions": {
"back": "Revenir au didacticiel de réinitialisation",
"title": "Mesurez votre corps",
"description": "Pour que les capteurs SlimeVR fonctionnent, nous devons connaître la longueur de vos os.",
"manual": "Calibration manuelle",
"prev-step": "Étape précédente",
"put-trackers-on": {
"title": "Enfilez vos capteurs",
"description": "Pour calibrer vos proportions, nous allons utiliser les capteurs que vous venez d'assigner.",
"next": "J'ai tous mes capteurs allumés"
},
"preparation": {
"title": "Préparation",
"description": "Placez une chaise directement derrière vous dans votre espace de jeu.",
"next": "je suis devant une chaise"
},
"start-recording": {
"title": "Préparez-vous à bouger",
"description": "Nous allons maintenant enregistrer des poses et des mouvements spécifiques. ",
"next": "Commencer l'enregistrement"
},
"recording": {
"title": "Enregistrement",
"description.p0": "Enregistrement en cours...",
"description.p1": "Effectuez les mouvements indiqués ci-dessous:",
"steps": {
"0": "Pliez les genoux plusieurs fois.",
"1": "Asseyez-vous sur une chaise puis levez-vous.",
"2": "Tournez le haut du corps vers la gauche, puis panchez vers la droite.",
"3": "Tournez le haut du corps vers la droite, puis panchez vers la gauche.",
"4": "Remuez jusqu'à ce que la minuterie se termine."
},
"processing": "Traitement du résultat",
"timer": "{{time}} secondes restantes"
},
"verify-results": {
"title": "Vérifier les résultats",
"description": "Vérifiez les résultats ci-dessous, semblent-ils corrects ?",
"results": "Enregistrement des résultats",
"processing": "Traitement du résultat",
"redo": "Refaire l'enregistrement",
"confirm": "Les resultats sont bons"
},
"done": {
"title": "Calibration terminée",
"description": "Votre calibration est terminée!"
}
}
},
"home": {
"no-trackers": "Aucun capteur détecté ou attribué"
}
}

View File

@@ -1,491 +0,0 @@
{
"websocket": {
"connecting": "서버에 연결 중...",
"connection-lost": "서버와의 연결이 끊어졌어요. 다시 연결하는 중..."
},
"tips": {
"find-tracker": "내 트래커가 어떤 트래커인지 모르시겠다구요? 트래커를 흔들면 해당 항목이 빛날 거에요.",
"do-not-move-heels": "기록하는 동안 발뒤꿈치가 움직이지 않도록 조심하세요!"
},
"body-part": {
"NONE": "할당되지 않음",
"HEAD": "머리",
"NECK": "목",
"RIGHT_SHOULDER": "오른쪽 어께",
"RIGHT_UPPER_ARM": "오른쪽 위팔",
"RIGHT_LOWER_ARM": "오른쪽 아래팔",
"RIGHT_HAND": "오른손",
"RIGHT_UPPER_LEG": "오른쪽 허벅지",
"RIGHT_LOWER_LEG": "오른쪽 종아리",
"RIGHT_FOOT": "오른발",
"CHEST": "가슴",
"WAIST": "허리",
"HIP": "엉덩이",
"LEFT_SHOULDER": "오른쪽 어께",
"LEFT_UPPER_ARM": "왼쪽 위팔",
"LEFT_LOWER_ARM": "왼쪽 아래팔",
"LEFT_HAND": "왼손",
"LEFT_UPPER_LEG": "왼쪽 허벅지",
"LEFT_LOWER_LEG": "왼쪽 종아리",
"LEFT_FOOT": "왼발"
},
"skeleton-bone": {
"NONE": "None",
"HEAD": "머리 밀림",
"NECK": "목 길이",
"TORSO": "몸통 길이",
"CHEST": "가슴 거리",
"WAIST": "허리 거리",
"HIP_OFFSET": "엉덩이 오프셋",
"HIPS_WIDTH": "엉덩이 너비",
"LEGS_LENGTH": "다리 길이",
"KNEE_HEIGHT": "무릎 높이",
"FOOT_LENGTH": "발 크기",
"FOOT_SHIFT": "발 밀림",
"SKELETON_OFFSET": "골격 오프셋",
"CONTROLLER_DISTANCE_Z": "컨트롤러 Z축 거리",
"CONTROLLER_DISTANCE_Y": "컨트롤러 Y축 거리",
"FOREARM_LENGTH": "아래팔 거리",
"SHOULDERS_DISTANCE": "어께 거리",
"SHOULDERS_WIDTH": "어깨 너비",
"UPPER_ARM_LENGTH": "위팔 거리",
"ELBOW_OFFSET": "팔꿈치 오프셋"
},
"reset": {
"reset-all": "모든 신체 비율 리셋",
"full": "리셋",
"mounting": "마운팅 재설정",
"quick": "퀵 리셋"
},
"serial-detection": {
"new-device.p0": "새로운 시리얼 디바이스를 찾았어요!" ,
"new-device.p1": "WiFi 자격 증명을 입력해주세요!",
"new-device.p2": "원하는 작업을 선택하세요",
"open-wifi": "WiFi 연결",
"open-serial": "시리얼 콘솔 열기",
"submit": "저장!",
"close": "닫기"
},
"navbar": {
"home": "홈",
"body-proportions": "신체 비율",
"trackers-assign": "트래커 위치",
"mounting": "마운팅 재설정",
"onboarding": "설정 마법사",
"settings": "설정"
},
"bvh": {
"start-recording": "BVH 기록",
"recording": "기록중..."
},
"overlay": {
"is-visible-label": "SteamVR에서 오버레이 표시",
"is-mirrored-label": "오버레이 반전"
},
"tracker": {
"status": {
"none": "No Status",
"busy": "바쁨",
"error": "오류",
"disconnected": "연결되지 않음",
"occluded": "사용할 수 없음",
"ok": "연결됨"
},
"table": {
"column": {
"name": "이름",
"type": "타입",
"battery": "배터리",
"ping": "Ping",
"rotation": "X/Y/Z 회전",
"position": "X/Y/Z 위치",
"url": "URL"
}
},
"rotation": {
"front": "앞쪽",
"left": "왼쪽",
"right": "오른쪽",
"back": "뒤쪽"
},
"infos": {
"manufacturer": "제조사",
"display-name": "표시되는 이름",
"custom-name": "사용자 정의 이름",
"url": "트래커 URL"
},
"settings": {
"back": "트래커 목록으로 돌아가기",
"title": "트래커 설정",
"assignment-section": {
"title": "트래커 위치 지정",
"description": "트래커가 위치한 신체 부위",
"edit": "위치 수정"
},
"mounting-section": {
"title": "착용 방향",
"description": "트래커는 어디에 착용하나요?",
"edit": "방향 수정"
},
"name-section": {
"title": "트래커 이름",
"description": "귀여운 이름을 지어주세요! >_<",
"input-placeholder": "NightyBeast's left leg"
}
},
"part-card": {
"no-name": "이름 없음",
"unassigned": "할당되지 않음"
}
},
"body-assignment-menu": {
"title": "트래커가 어디에 있나요?",
"description": "이 트래커를 할당할 위치를 선택하세요. 또는, 모든 트래커를 한 번에 설정할 수도 있어요.",
"show-advanced-locations": "고급 할당 위치 표시",
"manage-trackers": "모든 트래커 설정",
"unassign-tracker": "할당하지 않기"
},
"tracker-selection-menu": {
"title": "{{bodyPart}}에 어떤 트래커를 할당할까요?",
"unassigned": "할당되지 않은 트래커",
"assigned": "할당된 트래커",
"dont-assign": "할당하지 않기"
},
"mounting-selection-menu": {
"title": "트래커가 어디에 있나요?",
"close": "닫기"
},
"settings": {
"sidebar": {
"title": "설정",
"general": "일반",
"tracker-mechanics": "트래커 역학",
"fk-settings": "FK 설정",
"gesture-control": "제스처 제어",
"interface": "인터페이스",
"osc-router": "OSC 라우터",
"utils": "유틸리티",
"serial": "시리얼 콘솔"
},
"general": {
"steamvr": {
"title": "SteamVR",
"subtitle": "SteamVR 트래커",
"description.p0": "SteamVR 트래커를 켜거나 끄세요",
"description.p1": "특정 트래커 구성만 허용하는 게임 또는 앱에서 유용해요.",
"trackers": {
"waist": "Waist",
"chest": "Chest",
"feet": "Feet",
"knees": "Knees",
"elbows": "Elbows"
}
},
"tracker-mechanics": {
"title": "트래커 역학",
"subtitle": "필터링",
"description.p0": "트래커의 필터링 유형을 선택하세요.",
"description.p1": "Prediction은 움직임을 예측하고 Smoothing은 움직임을 부드럽게 해요.",
"filtering-type": {
"title": "필터링 타입",
"none": {
"label": "필터링 없음",
"description":"어떠한 필터링도 사용하지 않아요. 있는 그대로의 회전값을 사용해요."
},
"smoothing": {
"label": "Smoothing",
"description":"움직임을 부드럽게 하지만 약간의 대기 시간이 추가돼요."
},
"prediction": {
"label": "Prediction",
"description":"대기 시간이 줄어들고 움직임이 더 빨라지지만 지터가 증가할 수 있어요."
}
},
"amount": {
"label": "강도"
}
},
"fk-settings": {
"title": "FK 설정",
"leg-tweak": {
"title": "다리 보정",
"description": "플로어 클립은 바닥과의 클리핑을 줄이거나 제거할 수 있지만 무릎을 꿇을 때 문제를 일으킬 수 있어요. 스케이팅 보정은 아이스 스케이팅을 보정하지만 특정 움직임 패턴에서 정확도를 저하시킬 수 있어요.",
"floor-clip": "플로어 클립",
"skating-correction": "스케이팅 보정",
"skating-correction-amount": "스케이팅 보정 강도"
},
"arm-fk": {
"title": "팔 운동학",
"description": "팔이 추적되는 방식을 변경할 수 있어요.",
"force-arms": "팔을 HMD에서만 받아오기"
},
"skeleton-settings": {
"title": "골격 설정",
"description": "골격 설정을 설정하거나 해제해요. 이것들은 켜두는 게 좋아요.",
"extended-spine": "척추 확장",
"extended-pelvis": "골반 확장",
"extended-knees": "무릎 확장"
}
},
"gesture-control": {
"title": "제스처 제어",
"subtitle": "두번 탭해서 퀵 리셋하기",
"description": "활성화하면 가장 높이 있는 추적기의 아무 곳이나 두 번 탭해서 퀵 리셋을 활성화할 수 있어요. 두번 탭하는 간격은 딜레이로 조절할 수 있어요.",
"enable": "두번 탭해서 퀵 리셋",
"delay": "딜레이"
},
"interface": {
"title": "인터페이스",
"dev-mode": {
"title": "개발자 모드",
"description": "이 모드는 더 많은 데이터가 필요하거나 고급 수준에서 연결된 추적기와 상호 작용하는 경우에 유용할 수 있어요.",
"label": "개발자 모드"
},
"serial-detection": {
"title": "시리얼 디바이스 감지",
"description": "이 옵션은 트래커일 수도 있는 새로운 시리얼 디바이스를 연결할 때마다 팝업을 표시해요. 트래커 설정 프로세스를 개선하는 데 도움이 될 거에요.",
"label": "시리얼 디바이스 감지"
},
"lang": {
"title": "언어 선택",
"description": "사용하고 싶은 기본 언어를 선택하세요.",
"placeholder": "사용할 언어를 선택하세요"
}
}
},
"serial": {
"title": "시리얼 콘솔",
"description.p0": "이 라이브 피드에서 시리얼 디바이스와 통신할 수 있어요.",
"description.p1": "펌웨어가 제대로 작동하는지 알아야 할 때 유용할 거에요.",
"connection-lost": "시리얼 연결 끊김, 다시 연결 중...",
"reboot": "재부팅",
"factory-reset": "공장 초기화",
"get-infos": "정보 가져오기",
"serial-select": "시리얼 포트 선택",
"auto-dropdown-item": "자동"
},
"osc": {
"router": {
"title": "OSC 라우터",
"description.p0": "다른 프로그램으로 OSC 메시지를 전달해요.",
"description.p1": "예를 들어 VRChat과 함께 다른 OSC 프로그램을 사용하는 데 유용할 거에요.",
"enable": {
"title": "활성화",
"description": "활성화해서 메세지 전달 켜기",
"label": "활성화"
},
"network": {
"title": "네트워크 포트",
"description.p0": "데이터 수신 및 전송을 위한 포트 설정",
"description.p1": "이들은 SlimeVR 서버에서 사용되는 다른 포트와 동일할 수 있어요.",
"port-in": {
"label": "들어오는 포트",
"placeholder": "Port in (기본값: 9002)"
},
"port-out": {
"label": "나가는 포트",
"placeholder": "Port out (기본값: 9000)"
},
"address": {
"title": "네트워크 주소",
"description": "데이터를 보낼 주소를 설정하세요.",
"placeholder": "IPV4 주소"
}
}
},
"vrchat": {
"description.p0": "HMD 데이터 수신 및 전송을 위한 VRChat 관련 설정 변경",
"description.p1": "FBT용 트래커 데이터(Quest 단독에서 작동)",
"enable": {
"title": "활성화",
"description": "활성화해서 데이터 송수신 전환",
"label": "활성화"
},
"network": {
"title": "네트워크 포트",
"description": "VRChat과 데이터를 주고받는 포트 설정",
"port-in": {
"label": "들어오는 포트",
"placeholder": "Port in (기본값: 9001)"
},
"port-out": {
"label": "나가는 포트",
"placeholder": "Port out (기본값: 9000)"
},
"address": {
"title": "네트워크 주소",
"description": "VRChat으로 데이터를 보낼 주소를 선택하십시오(장치의 Wi-Fi 설정 확인).",
"placeholder": "VRChat IP 주소"
},
"trackers": {
"title": "트래커",
"description": "활성화해서 데이터 송수신 전환",
"chest": "Chest",
"waist": "Waist",
"knees": "Knees",
"feet": "Feet",
"elbows": "Elbows"
}
}
}
}
},
"onboarding": {
"skip": "설정 건너뛰기",
"continue": "계속하기",
"wip": "아직 공사중이에요",
"wifi-creds": {
"back": "Go Back to introduction",
"title": "WiFi 자격 증명을 입력하세요",
"description.p0": "트래커는 이 자격 증명을 사용하여 무선으로 연결해요",
"description.p1": "지금 연결되어 있는 자격 증명을 사용해주세요",
"skip": "WiFi 설정 건너뛰기",
"submit": "저장!"
},
"reset-tutorial": {
"back": "Go Back to Mounting calibration",
"title": "Reset tutorial",
"description": "This feature isn't done, just press continue"
},
"home": {
"title": "SlimeVR에 어서오세요!",
"description.p0": "Bringing full-body tracking",
"description.p1": "to everyone",
"start": "설정하러 가보죠!"
},
"enter-vr": {
"back": "트래커 위치 지정으로 돌아가기",
"title": "VR에 들어갈 시간이에요!",
"description": "모든 트래커를 착용하고 VR에 입장하세요!",
"ready": "준비됐어요!"
},
"done": {
"title": "모든 설정을 마쳤어요!",
"description": "풀바디 트래킹을 즐기세요!",
"close": "마법사 닫기"
},
"connect-tracker": {
"back": "WiFi 자격 증명으로 돌아가기",
"title": "트래커 연결",
"description.p0": "이제 모든 추적기를 연결하는 재미있는 부분으로 가봐요!",
"description.p1": "그냥 모든 트래커를 USB 포트에 연결하기만 하면 돼요",
"issue": {
"serial": "연결하는 데 문제가 생겼어요!"
},
"usb": "USB 트래커",
"connection-status": {
"connecting": "WiFi 자격증명 전송중",
"connected": "WiFi 연결됨",
"error": "Wifi에 연결할 수 없음",
"start-connecting": "트래커 찾는 중",
"handshake": "서버에 연결됨"
},
"connected-trackers": "트래커 {{amount}}개 연결됨",
"next": "모든 트래커를 잘 연결했어요"
},
"assign-trackers": {
"back": "WiFi 자격 증명으로 돌아가기",
"title": "트래커 위치 지정",
"description": "이제, 어떤 트래커가 어디에 있는지 선택할 시간이에요. 트래커를 배치할 위치를 클릭해보세요",
"assigned": "{{assigned}}/{{trackers}} 트래커 할당됨",
"advanced": "고급 할당 위치 보기",
"next": "모든 트래커를 배치했어요"
},
"manual-mounting": {
"back": "VR 입장 페이지로 돌아가기",
"title": "수동 마운팅",
"description": "Click on every tracker and select which way they are mounted",
"auto-mounting": "자동으로 마운팅 설정",
"next": "다음 단계"
},
"automatic-mounting": {
"back": "VR 입장 페이지로 돌아가기",
"title": "마운팅 재설정",
"description": "SlimeVR 트래커가 작동하려면, 마운팅 방향을 정해야 해요. 이 단계에서는 실제 트래커의 회전과 맞게 마운팅 방향을 정렬할 거에요.",
"manual-mounting": "수동으로 마운팅 설정",
"next": "다음 단계",
"prev-step": "이전 단계",
"done": {
"title": "Mounting rotations calibrated.",
"description": "Your mounting calibration is complete!",
"restart": "Return to start"
},
"mounting-reset": {
"title": "마운팅 리셋",
"step": {
"0": "1. 다리를 구부리고 상체를 앞으로 기울이고 팔을 구부린 상태에서 \"스키\" 자세로 쪼그리고 앉으세요.",
"1": "2. \"마운팅 재설정\" 버튼을 누르고 추적기의 마운팅 회전이 재설정되기 전에 3초 동안 기다리세요."
}
},
"preparation": {
"title": "준비",
"step": {
"0": "1. 팔을 몸에 붙이고 똑바로 서 주세요",
"1": "2. \"리셋\" 버튼을 누르고 트래커가 리셋될 때까지 3초 동안 기다려주세요"
}
},
"put-trackers-on": {
"title": "트래커를 착용해주세요",
"description": "마운팅 회전을 보정하기 위해 방금 할당한 트래커를 사용할 거에요. 모든 트래커를 착용하면 오른쪽 그림에서 어떤 트래커인지 확인할 수 있어요.",
"next": "모든 트래커를 착용했어요"
}
},
"manual-proportions": {
"back": "리셋 튜토리얼로 돌아가기",
"title": "수동 신체 비율 설정",
"precision": "Precision adjust",
"auto": "자동 신체 비율 설정"
},
"automatic-proportions": {
"back": "리셋 튜토리얼로 돌아가기",
"title": "신체 비율을 측정해보세요",
"description": "SlimeVR 트래커가 작동하려면 뼈의 길이를 알아야 하는데, 이 짧은 보정을 통해 측정할 수 있어요.",
"manual": "수동 신체 비율 설정",
"prev-step": "뒤로",
"put-trackers-on": {
"title": "트래커를 착용하세요",
"description": "비율을 조정하기 위해 방금 할당한 트래커를 사용할 거에요. 모든 트래커를 착용하면 오른쪽 그림에서 어떤 것이 있는지 알 수 있어요.",
"next": "트래커를 다 착용했어요"
},
"preparation": {
"title": "준비하기",
"description": "여러분의 놀이 공간 안에 여러분의 바로 뒤에 의자를 놓으세요. 오토본 설정 중에 앉을 수 있도록 준비해주세요.",
"next": "의자 앞에 섰어요"
},
"start-recording": {
"title": "움직일 준비",
"description": "이제 몇 가지 특정 포즈와 동작을 기록할 거에요. 다음 화면에서 메시지가 표시되면 버튼을 눌러서 시작하세요!",
"next": "기록 시작하기"
},
"recording": {
"title": "REC",
"description.p0": "기록하는 중...",
"description.p1": "아래에 표시된 동작을 따라하세요",
"steps": {
"0": "무릎을 몇 번 구부리세요",
"1": "의자에 앉았다가 일어서세요.",
"2": "상체를 왼쪽으로 비틀고 오른쪽으로 구부리세요.",
"3": "상체를 오른쪽으로 비틀고 왼쪽으로 구부리세요.",
"4": "타이머가 종료될 때까지 이리저리 움직여 보세요."
},
"processing": "결과 처리중",
"timer": "{{time}} 초 남음"
},
"verify-results": {
"title": "결과를 확인하세요",
"description": "아래 결과를 한번 보세요, 어때요?",
"results": "기록 결과",
"processing": "결과 처리중",
"redo": "다시 기록하기",
"confirm": "정확해요!"
},
"done": {
"title": "몸을 측정하고 저장했어요",
"description": "신체 비율 보정이 완료되었어요!"
}
}
},
"home": {
"no-trackers": "감지되거나 할당된 추적기가 없어요."
}
}

View File

@@ -1,489 +0,0 @@
{
"websocket": {
"connecting": "weconnyecting to teh sewvew",
"connection-lost": "oopsie woopsie~ connyection wost to teh sewvew ;m;... uwu am twying to weconnyect owo!"
},
"tips": {
"find-tracker": "nawt suwe whicsh twayckyaw is whicsh? shayke a twackaw and it will hyighwight the cowowesponding iytem.",
"do-not-move-heels": "ensuwe yoowr pawsies do nawt mowve duwing wecowding! ^w^"
},
"body-part": {
"NONE": "unassyigned",
"HEAD": "hed",
"NECK": "nyecky wecky",
"RIGHT_SHOULDER": "wight shouwder~",
"RIGHT_UPPER_ARM": "wight uppew awm",
"RIGHT_LOWER_ARM": "wight wowwe awm",
"RIGHT_HAND": "wight pawb",
"RIGHT_UPPER_LEG": "wight uppew weg",
"RIGHT_LOWER_LEG": "wight wowwe weg",
"RIGHT_FOOT": "wight pawb",
"CHEST": "chwest",
"WAIST": "wyayst",
"HIP": "hyip",
"LEFT_SHOULDER": "weft shouwder~",
"LEFT_UPPER_ARM": "weft uppew awm",
"LEFT_LOWER_ARM": "weft wowwe awm",
"LEFT_HAND": "weft pawb",
"LEFT_UPPER_LEG": "weft uppew weg",
"LEFT_LOWER_LEG": "weft wowwe weg",
"LEFT_FOOT": "weft pawb"
},
"skeleton-bone": {
"NONE": "none",
"HEAD": "hed shyft",
"NECK": "nyeck wength",
"TORSO": "towso wength",
"CHEST": "chwest disyance",
"WAIST": "weyst disyance",
"HIP_OFFSET": "hyip awfset",
"HIPS_WIDTH": "hyips wiwdth",
"LEGS_LENGTH": "wegs wength",
"KNEE_HEIGHT": "knyee heiyt",
"FOOT_LENGTH": "pawsies wength",
"FOOT_SHIFT": "pawsies shyft",
"SKELETON_OFFSET": "skeweton awfset",
"CONTROLLER_DISTANCE_Z": "cyontwowla disance z",
"CONTROLLER_DISTANCE_Y": "cyontwowla disance y",
"FOREARM_LENGTH": "fowewawm disyance",
"SHOULDERS_DISTANCE": "shouwdews disyance",
"SHOULDERS_WIDTH": "shouwdews wiwdth",
"UPPER_ARM_LENGTH": "uppew awm wength",
"ELBOW_OFFSET": "ewbow awfsewt"
},
"reset": {
"reset-all": "weset aww pwopowtions~",
"full": "weset~",
"mounting": "weset meownting",
"quick": "quick weset"
},
"serial-detection": {
"new-device.p0": "nyu sewiaw device detected~!",
"new-device.p1": "entaw youw wifi cwedentiaws~!",
"new-device.p2": "pwease sewect what youw want to do wit it",
"open-wifi": "cownnyect to wyfy~",
"open-serial": "awpen sewiaw console >w<",
"submit": "suwbmyt~!",
"close": "cwose"
},
"navbar": {
"home": "howme",
"body-proportions": "body pwopowshons",
"trackers-assign": "twackaws assigwment",
"mounting": "meownting calibwation",
"onboarding": "suwep wisawd",
"settings": "sewtings"
},
"bvh": {
"start-recording": "wecowd bvh",
"recording": "wecowding..."
},
"overlay": {
"is-visible-label": "show owovelay in steawmvr",
"is-mirrored-label": "dispway owovelay as miwwow"
},
"tracker": {
"status": {
"none": "no stawtus",
"busy": "busy",
"error": "ewwow",
"disconnected": "disconnyected",
"occluded": "occwuded",
"ok": "connyected"
},
"table": {
"column": {
"name": "nayme",
"type": "type",
"battery": "battewy",
"ping": "pyng",
"rotation": "wotaytion x/y/z",
"position": "pawsytion x/y/z",
"url": "uawl"
}
},
"rotation": {
"front": "fwowt",
"left": "lewft",
"right": "wight",
"back": "bak"
},
"infos": {
"manufacturer": "mawufactuwer",
"display-name": "dispway name",
"custom-name": "custowm name",
"url": "twackaw uawl"
},
"settings": {
"back": "go bak to twackaws liwst",
"title": "twackaw sewtings",
"assignment-section": {
"title": "assiwnment",
"description": "what pawt of the bawdy the twackaw is assiwned to uwu",
"edit": "ewdit assiwnment"
},
"mounting-section": {
"title": "meownting pawsition",
"description": "whewe is the twackaw mownted?",
"edit": "edit meownting"
},
"name-section": {
"title": "twackaw name",
"description": "owo whats dis?",
"input-placeholder": "ewimewl's weft pawb"
}
},
"part-card": {
"no-name": "no name",
"unassigned": "unassigwed"
}
},
"body-assignment-menu": {
"title": "whewe doo yew want dis twayckaw to be?? >~>",
"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.",
"show-advanced-locations": "show advawnced assyign wocations",
"manage-trackers": "manage awl twackaws",
"unassign-tracker": "unassyign twayckaw"
},
"tracker-selection-menu": {
"title": "which twayckaw to assyign to the {{bodyPart}}?",
"unassigned": "unassyigned twackaws",
"assigned": "assyigned twackaws",
"dont-assign": "do nawt assyign"
},
"mounting-selection-menu": {
"title": "whewe doo yew want dis twayckaw to be?",
"close": "cwose"
},
"settings": {
"sidebar": {
"title": "settyings~",
"general": "genyawaw",
"tracker-mechanics": "twayckaw mechanics~",
"fk-settings": "fk settyings",
"interface": "intyawface~",
"osc-router": "OSC wouwter",
"utils": "utiwities",
"serial": "sewiaw cownsaw"
},
"general": {
"steamvr": {
"title": "steamvr~",
"subtitle": "steamvr twayckaws~",
"description.p0": "enyable or dysabywe specific twacking pawts.",
"description.p1": "usefuw if yew want mowwe contwoww owew what swimevr does.",
"trackers": {
"waist": "wyayst",
"chest": "chwest",
"feet": "pawbsies~",
"knees": "knyees~",
"elbows": "ewbows~"
}
},
"tracker-mechanics": {
"title": "twayckaw mechanics~",
"subtitle": "fiwtering~",
"description.p0": "chooce teh fiwwtewing type fow youw twackaws.",
"description.p1": "pwediction pwedicts movment while smowthing smowthens movment.",
"filtering-type": {
"title": "fiwtewing type~",
"none": {
"label": "no fiwwtewing~",
"description": "use wowtations as is. wiw nawt do any fiwwtewing."
},
"smoothing": {
"label": "smowthing",
"description": "smowthes movements but adds some watency~"
},
"prediction": {
"label": "pwediction~",
"description": "wowduces wowcyancy and makes wowvements mowe wowappy, but may incwease jiwitty"
}
},
"amount": {
"label": "amownt"
}
},
"fk-settings": {
"title": "fk sewttings",
"leg-tweak": {
"title": "leg tweeks",
"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": "fwoow cwip",
"skating-correction": "skayting wowcowwection"
},
"arm-fk": {
"title": "awm fk",
"description": "chawnge teh way teh awms awe twacked.",
"force-arms": "fowce awms fwom hmd"
},
"skeleton-settings": {
"title": "skeweton sewttings",
"description": "toggwe skeweton sewttings on owow off. is wowcommended to weawve these on~",
"extended-spine": "ewtended spine",
"extended-pelvis": "ewtended pelvis",
"extended-knees": "ewtended neey"
}
},
"gesture-control": {
"title": "gestauw cantwol",
"subtitle": "dubble bap qwick weset",
"description": "enawbwe owr disawbwe dubble bap qwick weset. when enawbwed dubble bapping enywhewe on teh hyighest towso twackaw wil activate a qwick weset. deway is teh time between wowgistewing a bap and wowstting.",
"enable": "dubble bap qwick weset",
"delay": "deway"
},
"interface": {
"title": "intewface",
"dev-mode": {
"title": "devwowwewow mode",
"description": "this mode can be wowseffuw if you need in-dipth data owow to intewact with cownnected twackaws on a wowowe wowadvanced wowwevew",
"label": "devwowwewow mode"
},
"serial-detection": {
"title": "shewyaw device deteccion",
"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",
"label": "shewyaw device deteccion"
},
"lang": {
"title": "sewect wanguage",
"description": "change the defawwt wanguage yuw want to use",
"placeholder": "sewect teh wanguage to use"
}
}
},
"serial": {
"title": "shewyaw console",
"description.p0": "this is a wiwve infowmation feed fow shewyaw comyunicaytion",
"description.p1": "may be usefuw if yuw need to know teh fiwmwawe is acting up",
"connection-lost": "connyection to shewyaw wost, weconnyecting... >~<",
"reboot": "weboot",
"factory-reset": "fawctowy reset",
"get-infos": "get infows",
"serial-select": "sewect a shewyaw pawt",
"auto-dropdown-item": "awto"
},
"osc": {
"router": {
"title": "OSC wouwter",
"description.p0": "fowwawd osc messages fwom anothew pwogwam",
"description.p1": "usefuww fow uwsing anothew osc pwogwam with VRChat fow exampwe",
"enable": {
"title": "enaybwe",
"description": "toggle teh fowwawding of data",
"label": "enaybwe"
},
"network": {
"title": "network pawts",
"description.p0": "set the pawts fow wistening awnd sending data",
"description.p1": "these can be the same as othew powts uwsed in the swimevr sewvew",
"port-in": {
"label": "pawt in",
"placeholder": "pawt in (defawwt: 9002)"
},
"port-out": {
"label": "pawt out",
"placeholder": "pawt out (defawwt: 9000)"
},
"address": {
"title": "network addwess",
"description": "choose which addwess to send out data at",
"placeholder": "IPV4 addwess"
}
}
},
"vrchat": {
"description.p0": "change vwchat-specific settwings to wweceive hmd data awnd send",
"description.p1": "twayckaws data fow fbt (wawwks on quest standalone).",
"enable": {
"title": "enaybwe",
"description": "toggle teh sending awnd wweceiving of data",
"label": "enaybwe"
},
"network": {
"title": "network pawts",
"description": "set the pawts fow wistening awnd sending data to vwchawt",
"port-in": {
"label": "pawt in",
"placeholder": "pawt in (defawwt: 9001)"
},
"port-out": {
"label": "pawt out",
"placeholder": "pawt out (defawwt: 9000)"
},
"address": {
"title": "network addwess",
"description": "choose which addwess to send out data to vwchat (check yuw wifi settwings on yuw device)",
"placeholder": "vwchat ip addwess"
},
"trackers": {
"title": "trayckawws",
"description": "toggle teh sending awnd wweceiving of daya",
"chest": "chest",
"waist": "wayst",
"knees": "knees",
"feet": "pawbs",
"elbows": "elbows"
}
}
}
}
},
"onboarding": {
"skip": "skipy setup",
"continue": "continyue",
"wip": "wowwk in pwowgress",
"wifi-creds": {
"back": "gaww bawwk to intwoduction",
"title": "input wifi cwedentials",
"description.p0": "teh twawckaws will use these cwedentials to connect wirelessly",
"description.p1": "pwease use teh cwedentials that yaww awe cwowently cownyected to",
"skip": "skipy wifi settiwyngs",
"submit": "suwbmyt!"
},
"reset-tutorial": {
"back": "gaww bawwk to meownting cawwibwation",
"title": "weset tutowial",
"description": "dis featuwe isn't done, just pwess continyue"
},
"home": {
"title": "wewcome to swimevr",
"description.p0": "bwinging fuww-bawdy twacking",
"description.p1": "to everyone",
"start": "wets get set up!"
},
"enter-vr": {
"back": "gaww bawwk to twacker assignyment",
"title": "time to entew vr!",
"description": "put on awe yoaww twackaws and then entew vr!",
"ready": "iym ready"
},
"done": {
"title": "yaww awe awe set!",
"description": "enjoy yoaww fuww body expewwience",
"close": "cwose the guide"
},
"connect-tracker": {
"back": "gaww bawwk to wifi cwedentials",
"title": "connect twackaws",
"description.p0": "now onto teh fun pawwt, connecting awe teh twackaws!",
"description.p1": "simply connect awe that awe nawt cownyected yet, through a usb powwt.",
"issue": {
"serial": "i'm having twouble connecting!"
},
"usb": "usb twacker",
"connection-status": {
"connecting": "sending wifi cwedentials",
"connected": "cownyected to wifi",
"error": "unabwe to cownyect to wifi",
"start-connecting": "wooking for twackaws",
"handshake": "cownyected to teh sewvew"
},
"connected-trackers": "{{amount}} twackers cownyected",
"next": "i cownyected awe my twackaws"
},
"assign-trackers": {
"back": "go bak to wifi credyentials",
"title": "assign twackaws",
"description": "wets choyse which twackaw goes whewe. cwick on a wocation whewe yowo want to payce a twackaw",
"assigned": "{{assigned}} of {{trackers}} twackaws assigned",
"advanced": "show advanced assign wocations",
"next": "i assigned awe the twackaws"
},
"manual-mounting": {
"back": "go bak to entaw vawe",
"title": "manual meownting",
"description": "cwick on evewy twackaw and sewect which way they awe mownted",
"auto-mounting": "awtomawic meownting",
"next": "newt stewp"
},
"automatic-mounting": {
"back": "go bak to entaw vawe",
"title": "meownting cawibwation",
"description": "fow SlimeVR twackaws to wowk, we need to assign a meownting wowation to yowo twackaws to awign them with yowo pwysical twackaw mounting.",
"manual-mounting": "manually set meownting",
"next": "next step",
"prev-step": "pwevious step",
"done": {
"title": "mounting wowations cawibwated.",
"description": "yowo meownting cawibwation is compwete!",
"restart": "weturn to start"
},
"mounting-reset": {
"title": "meownting weset",
"step": {
"0": "1. squawt in a \"skiing\" pose with yowo wegs bent, yowo upper body tilted fowwawds, and yowo awems bent.",
"1": "2. pwess the \"weset meownting\" button and wait fow 3 seconds befowe the twackaws' meownting wowations will weset."
}
},
"preparation": {
"title": "pwepairation",
"step": {
"0": "1. stand upwight with yowo awems to yowo sides.",
"1": "2. pwess the \"weset\" button and wait fow 3 seconds befowe the twackaws will weset."
}
},
"put-trackers-on": {
"title": "put on yowo twackaws",
"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.",
"next": "i haff awe my twackaws on"
}
},
"manual-proportions": {
"back": "go bawck to weset tutowiaw",
"title": "manyuaw bodee pwopowtiesions",
"precision": "pwecision adjusty",
"auto": "owtomatic cawybwation"
},
"automatic-proportions": {
"back": "go bawck to weweset tutowiaw",
"title": "measuwe yowuw bodee",
"description": "fow swimevw twackaws to wowk, we need to know teh wowkty of yowuw bones. dis showt cawybwation will measuwe it fow yowu",
"manual": "manyuaw cawybwation",
"prev-step": "pwevious stwep",
"put-trackers-on": {
"title": "put on yowuw twackaws",
"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.",
"next": "i have awl my twackaws on"
},
"preparation": {
"title": "pwepawation",
"description": "pwace a chayaw diwectly behind yowu inside yowuw pway spawce. be pwepawed to sit down duwing teh owtobone setyup.",
"next": "i am in fwont of a chayaw"
},
"start-recording": {
"title": "get wowdy to move",
"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!",
"next": "stawt wowcawding"
},
"recording": {
"title": "wowcawd",
"description.p0": "wowcawding in pwowgress...",
"description.p1": "make teh moves shown bowow:",
"steps": {
"0": "bend knees a few times.",
"1": "sit on a chayaw then stawnd up.",
"2": "twist upwe wowdy wowft, then bend wowft.",
"3": "twist upwe wowdy wowight, then bend wowight.",
"4": "wiggy aweound until tymey ends."
},
"processing": "pwowcessing teh wowesult",
"timer": "{{time}} secondsy wowft"
},
"verify-results": {
"title": "vewify wowesults",
"description": "check teh wewesults below, do tehy weok coowect?",
"results": "wecowding wewesults",
"processing": "pwocessing teh wewesult",
"redo": "wedo wecowding",
"confirm": "tehywee coowect"
},
"done": {
"title": "bawdy meowsured anwd sayved uwu",
"description": "yoww body pwopowwtions cawybowwation is cowowplete! ^w^"
}
}
},
"home": {
"no-trackers": "no twackaws detecyted owo wowigned"
}
}

View File

@@ -1,461 +0,0 @@
{
"websocket": {
"connecting": "Łączenie z serwerem",
"connection-lost": "Połączenie z serwerem zostało utracone. Próba ponownego połączenia..."
},
"tips": {
"find-tracker": "Nie wiesz który tracker to który? Obracaj Trackerem , podczas obracania będzie sie on podświetlał w serwerze.",
"do-not-move-heels": "Ensure your heels do not move during recording!"
},
"body-part": {
"NONE": "Nieprzyznaczony",
"HEAD": "Głowa",
"NECK": "Szyja",
"RIGHT_SHOULDER": "Prawe Ramie",
"RIGHT_UPPER_ARM": "Prawy Biceps",
"RIGHT_LOWER_ARM": "Prawe PrzedRamie",
"RIGHT_HAND": "Prawa Dłoń",
"RIGHT_UPPER_LEG": "Prawe Udo",
"RIGHT_LOWER_LEG": "Prawy Podudzie",
"RIGHT_FOOT": "Prawa Stopa",
"CHEST": "Klatka Piersiowa",
"WAIST": "Pas",
"HIP": "Biodra",
"LEFT_SHOULDER": "Lewe Ramie",
"LEFT_UPPER_ARM": "Lewy Biceps",
"LEFT_LOWER_ARM": "Lewe PrzedRamie",
"LEFT_HAND": "Lewa Dłoń",
"LEFT_UPPER_LEG": "Lewe Udo",
"LEFT_LOWER_LEG": "Lewe Podudzie",
"LEFT_FOOT": "Lewa Stopa"
},
"skeleton-bone": {
"NONE": "Brak",
"HEAD": "Head Shift",
"NECK": "Długość Szyi",
"TORSO": "Długość Tułowia",
"CHEST": "Długość Klatki Piersiowej",
"WAIST": "Waist Distance",
"HIP_OFFSET": "Offset Bioder",
"HIPS_WIDTH": "Szerokość Bioder",
"LEGS_LENGTH": "Długość Nóg",
"KNEE_HEIGHT": "Wysokość Kolana",
"FOOT_LENGTH": "Długość Stopy",
"FOOT_SHIFT": "Foot Shift",
"SKELETON_OFFSET": "Skeleton Offset",
"CONTROLLER_DISTANCE_Z": "Controller Distance Z",
"CONTROLLER_DISTANCE_Y": "Controller Distance Y",
"FOREARM_LENGTH": "Długość PrzedRamienia",
"SHOULDERS_DISTANCE": "Shoulders Distance",
"SHOULDERS_WIDTH": "Szerokość Ramion",
"UPPER_ARM_LENGTH": "Długość Bicepsa",
"ELBOW_OFFSET": "Offset Łokcia"
},
"reset": {
"reset-all": "Zresetuj wszystkie wymiary",
"full": "Reset",
"mounting": "Zresetuj Położenie",
"quick": "Szybki Reset"
},
"serial-detection": {
"new-device.p0": "Wykryto Nowe Urządzenie." ,
"new-device.p1": "Wprowadź dane WiFi!",
"new-device.p2": "Wybierz co chcesz z nim zrobić.",
"open-wifi": "Połącz z WiFi",
"open-serial": "Otwórz Konsole",
"submit": "Potwierdź!",
"close": "Zamknij"
},
"navbar": {
"home": "Strona Główna",
"body-proportions": "Proporcje Ciała",
"trackers-assign": "Przydzielenie Trackerów",
"mounting": "Kalibracja Pozycji",
"onboarding": "Wstępna Konfiguracja",
"settings": "Ustawienia"
},
"bvh": {
"start-recording": "Nagraj BVH",
"recording": "Nagrywam..."
},
"overlay": {
"is-visible-label": "Pokaż Overlay w SteamVR",
"is-mirrored-label": "Pokaż Overlay jako Lustro"
},
"tracker": {
"status": {
"none": "Brak Statusu",
"busy": "Zajęty",
"error": "Error",
"disconnected": "Rozłączono",
"occluded": "Zablokowany",
"ok": "Połączono"
},
"table": {
"column": {
"name": "Nazwa",
"type": "Typ",
"battery": "Bateria",
"ping": "Ping",
"rotation": "Rotacja X/Y/Z",
"position": "Pozycja X/Y/Z",
"url": "URL"
}
},
"rotation": {
"front": "Przód",
"left": "Lewa",
"right": "Prawa",
"back": "Tył"
},
"infos": {
"manufacturer": "Producent",
"display-name": "Wyświetlana Nazwa",
"custom-name": "Niestandardowa Nazwa",
"url": "Tracker URL"
},
"settings": {
"back": "Wróć do listy trackerów",
"title": "Ustawienia Trackerów",
"assignment-section": {
"title": "Przydzielanie",
"description": "Do jakiej części ciała jest przydzielony tracker.",
"edit": "Edytuj"
},
"mounting-section": {
"title": "Położenie Trackera",
"description": "Gdzie jest Tracker zamontowany?",
"edit": "Edytuj"
},
"name-section": {
"title": "Nazwa Trackera",
"description": "Daj mu słodką nazwę :)",
"input-placeholder": "Lewa noga Yexo"
}
},
"part-card": {
"no-name": "Brak Nazwy",
"unassigned": "Nieprzydzielony"
}
},
"body-assignment-menu": {
"title": "Gdzie chcesz żeby ten tracker był?",
"description": "Wybierz miejsce gdzie tracker będzie przydzielony. Alternatywnie możesz ustawić wszystkie na raz.",
"show-advanced-locations": "Pokaż zaawansowane położenia",
"manage-trackers": "Zarządzaj wszystkimi trackerami",
"unassign-tracker": "Usuń przydzielenie"
},
"tracker-selection-menu": {
"title": "Który tracker ustawić na {{bodyPart}}?",
"unassigned": "Nieprzydzielone trackery",
"assigned": "Przydzielone trackery",
"dont-assign": "Nie przydzielaj"
},
"mounting-selection-menu": {
"title": "Gdzie chciałbyś ten tracker?",
"close": "Zamknij"
},
"settings": {
"sidebar": {
"title": "Ustawienia",
"general": "Ogólne",
"tracker-mechanics": "Tracker mechanics",
"fk-settings": "FK settings",
"interface": "Interfejs",
"utils": "Narzędzia",
"serial": "Konsola Seryjna"
},
"general": {
"steamvr": {
"title": "SteamVR",
"subtitle": "SteamVR trackers",
"description.p0": "Włącz lub Wyłącz specyficzne pozycje trackowania.",
"description.p1": "Przydatne jeżeli chcesz więcej kontroli nad SlimeVR.",
"trackers": {
"waist": "Bruch",
"chest": "Klatka Piersiowa",
"feet": "Stopy",
"knees": "Kolana",
"elbows": "Łokcie",
"hands": "Ręce"
}
},
"tracker-mechanics": {
"title": "Tracker mechanics",
"subtitle": "Filtrowanie",
"description.p0": "Wybierz Filtry dla twoich trackerów.",
"description.p1": "Przewidywanie przewiduje ruchy a Wygładzanie stara się wygładzić ruchy.",
"filtering-type": {
"title": "Filtry",
"none": {
"label": "Brak Filtrów",
"description":"Używa rotacji takimi jakimi są."
},
"smoothing": {
"label": "Wygładzanie",
"description":"Wygładza ruchy lecz dodaje trochę opóźnienia."
},
"prediction": {
"label": "Przewidywanie",
"description":"Zmniejsza opóźnienie i robi ruchy trochę ostrzejszymi, ale może dodać trochę drgań."
}
},
"amount": {
"label": "Ilość"
}
},
"fk-settings": {
"title": "FK settings",
"leg-tweak": {
"title": "Leg tweaks",
"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": "Floor clip",
"skating-correction": "Skating correction"
},
"arm-fk": {
"title": "Arm FK",
"description": "Change the way the arms are tracked.",
"force-arms": "Force arms from HMD"
},
"skeleton-settings": {
"title": "Skeleton settings",
"description": "Toggle skeleton settings on or off. It is recommended to leave these on.",
"extended-spine": "Extended spine",
"extended-pelvis": "Extended pelvis",
"extended-knees": "Extended knee"
}
},
"gesture-control": {
"title": "Kontrola Gestami",
"subtitle": "Dotknij 2 razy by wykonać szybki reset",
"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.",
"enable": "Dotknij 2 razy by wykonać szybki reset",
"delay": "Opóźnienie"
},
"interface": {
"title": "Interfejs",
"dev-mode": {
"title": "Tryb Dewelopera",
"description": "Ten tryb przydaje się do sprawdzania większej ilości danych.",
"label": "Tryb Dewelopera"
},
"serial-detection": {
"title": "Wykrywanie urządzeń",
"description": "Ta opcja daje powiadomienia jeżeli serwer wykryje urządzenie które może być trackerem",
"label": "Wykrywanie urządzeń"
},
"lang": {
"title": "Wybierz Język",
"description": "Zmień podstawowy język jaki chcesz używać",
"placeholder": "Wybierz Język który będziesz używać"
}
}
},
"serial": {
"title": "Serial Console",
"description.p0": "This is a live information feed for serial communication.",
"description.p1": "May be useful if you need to know the firmware is acting up.",
"connection-lost": "Connection to serial lost, Reconnecting...",
"reboot": "Reboot",
"factory-reset": "Factory Reset",
"get-infos": "Get Infos",
"serial-select": "Select a serial port",
"auto-dropdown-item": "Auto"
},
"osc": {
"vrchat": {
"description.p0": "Change VRChat-specific settings to receive HMD data and send",
"description.p1": "trackers data for FBT (works on Quest standalone).",
"enable": {
"title": "Enable",
"description": "Toggle the sending and receiving of data",
"label": "Enable"
},
"network": {
"title": "Network ports",
"description": "Set the ports for listening and sending data to VRChat",
"port-in": {
"label": "Port In",
"placeholder": "Port in (default: 9001)"
},
"port-out": {
"label": "Port Out",
"placeholder": "Port out (default: 9000)"
},
"address": {
"title": "Network address",
"description": "Choose which address to send out data to VRChat (check your wifi settings on your device)",
"placeholder": "VRChat ip address"
},
"trackers": {
"title": "Trackers",
"description": "Toggle the sending and receiving of data",
"chest": "Chest",
"waist": "Waist",
"knees": "Knees",
"feet": "Feet",
"elbows": "Elbows"
}
}
}
}
},
"onboarding": {
"skip": "Pomiń wstępną konfiguracje",
"continue": "Kontynuuj",
"wip": "W trakcie prac",
"wifi-creds": {
"back": "Cofnij się do początku",
"title": "Wpisz dane WiFi",
"description.p0": "Trackery będą używać tej sieci do łączenia się z serwerem",
"description.p1": "proszę używać sieci do której jest się połączonym",
"skip": "Pomiń ustawienia WiFi",
"submit": "Potwierdź!"
},
"reset-tutorial": {
"back": "Powrót do Konfiguracji Położenia trackerów",
"title": "Zresetuj poradnik",
"description": "Ta funkcja jeszcze nie jest skończona."
},
"home": {
"title": "Witamy w SlimeVR",
"description.p0": "Full-body tracking",
"description.p1": "dla każdego",
"start": "Zaczynajmny!"
},
"enter-vr": {
"back": "Cofnij do Przydzielania Trackerów",
"title": "Czas na wejście do VR!",
"description": "Załóż wszystkie trackery a potem wejdź do VR!",
"ready": "Jestem gotów"
},
"done": {
"title": "Wszystko ustawione!",
"description": "Ciesz się Full-Body",
"close": "Zamknij Poradnik"
},
"connect-tracker": {
"back": "Cofnij się do ustawień WiFi",
"title": "Połącz trackery",
"description.p0": "Teraz czas na zabawe, połączenie wszystkich trackerów!",
"description.p1": "Po prostu połącz wszystkie dotychczas nie połączone trackery za pomocą USB",
"issue": {
"serial": "Mam problemy z połączeniem!"
},
"usb": "USB Tracker",
"connection-status": {
"connecting": "Wysyłanie danych WiFi",
"connected": "Połączono z WiFi",
"error": "Nie można połączyć z Wifi",
"start-connecting": "Szukanie Trackerów",
"handshake": "Połączono z serwerem"
},
"connected-trackers": "{{amount}} połączonych trackerów",
"next": "Połączyłem już wszystkie trackery"
},
"assign-trackers": {
"back": "Cofnij się do ustawień WiFi",
"title": "Przydziel Trackery",
"description": "Wybierzmy gdzie idzie jaki tracker. Naciśnij gdzie chcesz go przydzielić",
"assigned": "{{assigned}} przydzielonych trackerów z {{trackers}}",
"advanced": "Pokaż zaawansowane ustawienia pozycji",
"next": "Przydzieliłem już wszystkie trackery"
},
"manual-mounting": {
"back": "Cofnij się żeby wejść do VR",
"title": "Pozycjonowanie Manualne",
"description": "Kliknij na każdy tracker i wybierz w jaki sposób są zamontowane",
"auto-mounting": "Automatic mounting",
"next": "Następny krok"
},
"automatic-mounting": {
"back": "Cofnij się żeby wejść do VR",
"title": "Kalibracja Pozycji",
"description": "Aby SlimeVR działało prawidłowo, musimy przypisać rotacje trackera aby zgadzała się ona z tą w prawdziwym życiu.",
"manual-mounting": "Pozycjonowanie Manualne",
"next": "Następny krok",
"prev-step": "Poprzedni krok",
"done": {
"title": "Rotacja trackerów została skalibrowana.",
"description": "Kalibracja skończona!",
"restart": "Cofnij się na początek"
},
"mounting-reset": {
"title": "Kalibracja Pozycji",
"step": {
"0": "1. Zrób pozycje \"na Małysza\" z wygiętymi nogami, tułów pochylony do przodu z wygiętymi rękami.",
"1": "2. Naciśnij \"Zresetuj Położenie\" i poczekaj 3 sekundy zanim trackery się zresetują."
}
},
"preparation": {
"title": "Przygotowania",
"step": {
"0": "1. Stań prosto z rękami wyciągniętymi na bok.",
"1": "2. Naciśnij \"Reset\" i poczekaj 3 sekundy zanim trackery się zresetują."
}
},
"put-trackers-on": {
"title": "Załóż trackery",
"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.",
"next": "Mam wszystkie trackery założone"
}
},
"manual-proportions": {
"back": "Go Back to Reset tutorial",
"title": "Manualne Proporcje Ciała",
"precision": "Precyzyjna Regulacja",
"auto": "Automatyczna Kalibracja"
},
"automatic-proportions": {
"back": "Go Back to Reset tutorial",
"title": "Zmierz swoje ciało",
"description": "Aby SlimeVR działało poprawnie, musimy znać długość twoich kości. Ta kalibracja zrobi to za ciebie.",
"manual": "Kalibracja Manualna",
"prev-step": "Poprzedni krok",
"put-trackers-on": {
"title": "Załóż trackery",
"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.",
"next": "Mam wszystkie trackery założone"
},
"preparation": {
"title": "Przygotowania",
"description": "Połóż krzesło za sobą w twojej przeszczeni grania. Bądź gotowy do siadania podczas automatycznej kalibracji kości.",
"next": "Jestem przed krzesłem"
},
"start-recording": {
"title": "Bądź gotowy żeby się ruszać",
"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!",
"next": "Uruchom nagrywanie"
},
"recording": {
"title": "REC",
"description.p0": "Nagrywanie w toku...",
"description.p1": "Wykonuj ruchy pokazane niżej:",
"steps": {
"0": "Zegnij kolana kilka razy.",
"1": "Usiądź na krześle ,po czym wstań.",
"2": "Przekręć ciało w lewo ,po czym przechyl się w prawo.",
"3": "Przekręć ciało w prawo ,po czym przechyl się w lewo.",
"4": "Poruszaj się dopuki czas się nie skończy"
},
"processing": "Przetwarzanie wyników",
"timer": "Pozostały czas {{time}} sekundy"
},
"verify-results": {
"title": "Zweryfikuj Wyniki",
"description": "Sprawdź wyniki poniżej, czy są prawidłowe?",
"results": "Wyniki Nagrywania",
"processing": "Przetwarzanie wyniku",
"redo": "Powtórz Nagrywanie",
"confirm": "Są Prawidłowe"
},
"done": {
"title": "Zmierzono oraz Zapisano.",
"description": "Twoja kalibracja ciała została zakończona!"
}
}
},
"home": {
"no-trackers": "Nie wykryto trackerów"
}
}

View File

@@ -1,460 +0,0 @@
{
"websocket": {
"connecting": "Conectando ao servidor",
"connection-lost": "Conexão perdida com o servidor. Reconectando..."
},
"tips": {
"find-tracker": "Não tem certeza qual tracker é qual? Balance o tracker e ele destacará o item correspondente.",
"do-not-move-heels": "Tenha certeza de não mexer seus calcanhares durante a gravação!"
},
"body-part": {
"NONE": "Não atribuído",
"HEAD": "Cabeça",
"NECK": "Pescoço",
"RIGHT_SHOULDER": "Ombro direito",
"RIGHT_UPPER_ARM": "Braço superior direito",
"RIGHT_LOWER_ARM": "Antebraço direito",
"RIGHT_HAND": "Mão Direita",
"RIGHT_UPPER_LEG": "Coxa direita",
"RIGHT_LOWER_LEG": "Canela direita",
"RIGHT_FOOT": "Pé direito",
"CHEST": "Peito",
"WAIST": "Cintura",
"HIP": "Quadril",
"LEFT_SHOULDER": "Ombro esquerdo",
"LEFT_UPPER_ARM": "Braço superior esquerdo",
"LEFT_LOWER_ARM": "Antebraço esquerdo",
"LEFT_HAND": "Mão esquerda",
"LEFT_UPPER_LEG": "Coxa esquerda",
"LEFT_LOWER_LEG": "Canela esquerda",
"LEFT_FOOT": "Pé esquerdo"
},
"skeleton-bone": {
"NONE": "Nada",
"HEAD": "Deslocamento da Cabeça",
"NECK": "Tamanho do Pescoço",
"TORSO": "Tamanho do Torso",
"CHEST": "Distancia do Peito",
"WAIST": "Distancia da Cintura",
"HIP_OFFSET": "Compensação do Quadril",
"HIPS_WIDTH": "Largura do Quadril",
"LEGS_LENGTH": "Tamanho das Perna",
"KNEE_HEIGHT": "Altura dos Joelhos",
"FOOT_LENGTH": "Tamanho do Pé",
"FOOT_SHIFT": "Compensação do Pé",
"SKELETON_OFFSET": "Compensação do Esqueleto",
"CONTROLLER_DISTANCE_Z": "Distancia do Controle Z",
"CONTROLLER_DISTANCE_Y": "Distancia do Controle Y",
"FOREARM_LENGTH": "Distancia do Antebraço",
"SHOULDERS_DISTANCE": "Distancia dos Ombros",
"SHOULDERS_WIDTH": "Largura dos Ombros",
"UPPER_ARM_LENGTH": "Tamanho do Braço Superior",
"ELBOW_OFFSET": "Compensação do Cotovelo"
},
"reset": {
"reset-all": "Redefinir todas as proporções",
"full": "Reset",
"mounting": "Redefinir Mounting",
"quick": "Reset Rápido"
},
"serial-detection": {
"new-device.p0": "Novo despositivo de serial detectado!" ,
"new-device.p1": "Insira suas credenciais de wifi!",
"new-device.p2": "Selecione o que quer fazer com ele",
"open-wifi": "Conectar ao WiFi",
"open-serial": "Abrir o Console Serial",
"submit": "Enviar!",
"close": "Fechar"
},
"navbar": {
"home": "Início",
"body-proportions": "Proporções do corpo",
"trackers-assign": "Atribuição de Tracker",
"mounting": "Calibração de Montagem",
"onboarding": "Assistente de Configuração",
"settings": "Opções"
},
"bvh": {
"start-recording": "Gravar BVH",
"recording": "Gravando..."
},
"overlay": {
"is-visible-label": "Mostrar Overlay na SteamVR",
"is-mirrored-label": "Mostrar Overlay como espelho"
},
"tracker": {
"status": {
"none": "Sem Status",
"busy": "Ocupado",
"error": "Erro",
"disconnected": "Desconectado",
"occluded": "Ocluso",
"ok": "Conectado"
},
"table": {
"column": {
"name": "Nome",
"type": "Tipo",
"battery": "Bateria",
"ping": "Ping",
"rotation": "Rotação X/Y/Z",
"position": "Posição X/Y/Z",
"url": "URL"
}
},
"rotation": {
"front": "Frente",
"left": "Esquerda",
"right": "Direita",
"back": "Atrás"
},
"infos": {
"manufacturer": "Fabricante",
"display-name": "Nome de exibição",
"custom-name": "Nome personalizado",
"url": "URL do Tracker"
},
"settings": {
"back": "Voltar para lista de trackers",
"title": "Opções dos trackers",
"assignment-section": {
"title": "Atribuição",
"description": "Qual parte do seu corpo o tracker está atribuído para.",
"edit": "Editar atribuição"
},
"mounting-section": {
"title": "Posição de montagem",
"description": "Aonde o tracker está montado?",
"edit": "Editar montagem"
},
"name-section": {
"title": "Nome do tracker",
"description": "Dê um apelido fofo :)",
"input-placeholder": "Coxa esquerda de NightyBeast"
}
},
"part-card": {
"no-name": "Sem nome",
"unassigned": "Não atribuído"
}
},
"body-assignment-menu": {
"title": "Aonde você quer que esse tracker fique?",
"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.",
"show-advanced-locations": "Mostrar locais de atribuição avançados",
"manage-trackers": "Arrumar todos os trackers",
"unassign-tracker": "Desatribuir tracker"
},
"tracker-selection-menu": {
"title": "Qual tracker atribuir a {{bodyPart}}?",
"unassigned": "Trackers não atribuídos",
"assigned": "Trackers atribuídos",
"dont-assign": "Não atribuir"
},
"mounting-selection-menu": {
"title": "Aonde você quer que esse tracker fique?",
"close": "Fechar"
},
"settings": {
"sidebar": {
"title": "Opções",
"general": "Geral",
"tracker-mechanics": "Mecânicas do Tracker",
"fk-settings": "Opções de FK",
"interface": "Interface",
"utils": "Utilidades",
"serial": "Console Serial"
},
"general": {
"steamvr": {
"title": "SteamVR",
"subtitle": "Trackers do SteamVR",
"description.p0": "Ativar ou desativar partes específicas do tracking.",
"description.p1": "Útil se você quer mais controle do oque o SlimeVR faz.",
"trackers": {
"waist": "Cintura",
"chest": "Peito",
"feet": "Pés",
"knees": "Joelhos",
"elbows": "Cotovelos"
}
},
"tracker-mechanics": {
"title": "Mecânicas do Tracker",
"subtitle": "Filtros",
"description.p0": "Escolha o tipo de filtro para seus trackers.",
"description.p1": "Predição prediz movimentação enquanto suavização suaviza o movimento.",
"filtering-type": {
"title": "Tipo de filtro",
"none": {
"label": "Sem filtro",
"description":"Usa a rotação como está. Não haverá filtração."
},
"smoothing": {
"label": "Suavização",
"description":"Suaviza o movimento porém introduz um pouco de latência."
},
"prediction": {
"label": "Predição",
"description":"Reduz latência e faz os movimentos ficarem mais responsivos, porém aumenta tremulação(Jitter)."
}
},
"amount": {
"label": "Quantidade"
}
},
"fk-settings": {
"title": "Opções de FK",
"leg-tweak": {
"title": "Ajustes de perna",
"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": "Atravessar o chão",
"skating-correction": "Correção de Deslize"
},
"arm-fk": {
"title": "FK do Braço",
"description": "Muda o jeito que os braços são rastreados.",
"force-arms": "Forçar braços do HMD"
},
"skeleton-settings": {
"title": "Opções do esqueleto",
"description": "Ligar ou desligar opções do esqueleto. É recomendado deixar eles ligados.",
"extended-spine": "Estender coluna",
"extended-pelvis": "Estender pélvis",
"extended-knees": "Estender joelho"
}
},
"gesture-control": {
"title": "Controle de gestos",
"subtitle": "Dois toques para o reset rápido",
"description": "Ativa ou desativa os dois toques para o reset rápido. Quando ativado dois toques em qualquer lugar no tracker mais alto do torso irá ativar o reset rápido. Delay é o tempo entre registrando o toque e resetando.",
"enable": "Dois toques para o reset rápido",
"delay": "Delay"
},
"interface": {
"title": "Interface",
"dev-mode": {
"title": "Modo de desenvolverdor",
"description": "Este modo pode ser útil se precisar de dados em profundidade ou para interagir com trackers conectados a um nível mais avançado",
"label": "Modo de desenvolvedor"
},
"serial-detection": {
"title": "Detecção de dispositivo serial",
"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",
"label": "Detecção de dispositivo serial"
},
"lang": {
"title": "Selecione a linguagem",
"description": "Alterar a língua padrão que pretende utilizar",
"placeholder": "Selecione a linguagem qual vai usar"
}
}
},
"serial": {
"title": "Console Serial",
"description.p0": "Este é um feed de informações ao vivo para comunicação serial.",
"description.p1": "Pode ser útil se você precisar saber se o firmware está dando problema.",
"connection-lost": "Conexão com o serial perdida, Reconectando...",
"reboot": "Reiniciar",
"factory-reset": "Restaurar para o padrão de fábrica",
"get-infos": "Obter informações",
"serial-select": "Selecione uma porta serial",
"auto-dropdown-item": "Auto"
},
"osc": {
"vrchat": {
"description.p0": "Mudar opções específicas do VRChat para receber e enviar dados do HMD",
"description.p1": "dados do tracker para FBT (funciona no Quest standalone).",
"enable": {
"title": "Ativar",
"description": "Ligar ou desligar o envio e a recepção de dados",
"label": "Ativar"
},
"network": {
"title": "Portas de rede",
"description": "Defina as portas para ouvir e enviar dados para o VRChat",
"port-in": {
"label": "Porta de entrada",
"placeholder": "Porta de entrada (padrão: 9001)"
},
"port-out": {
"label": "Porta de saída",
"placeholder": "Porta de saída (padrão: 9000)"
},
"address": {
"title": "Endereço de rede",
"description": "Escolha qual o endereço para enviar dados para o VRChat (verifique as suas opções de wifi no seu dispositivo)",
"placeholder": "Endereço de ip do VRChat"
},
"trackers": {
"title": "Trackers",
"description": "Ligar ou desligar o envio e recepção de dados.",
"chest": "Peito",
"waist": "Cintura",
"knees": "Joelhos",
"feet": "Pés",
"elbows": "Cotovelos"
}
}
}
}
},
"onboarding": {
"skip": "Pular configurações",
"continue": "Continuar",
"wip": "Trabalho em progresso",
"wifi-creds": {
"back": "Voltar para introdução",
"title": "Insira as credenciais de WiFi",
"description.p0": "Os Trackers vão usar essas credenciais para conectar a rede sem fio",
"description.p1": "Use as credenciais do que você está atualmente conectado",
"skip": "Pular as configurações de WiFi",
"submit": "Enviar!"
},
"reset-tutorial": {
"back": "Voltar para a Calibração de Montagem",
"title": "Resetar Tutorial",
"description": "This feature isn't done, just press continue"
},
"home": {
"title": "Bem vindo ao SlimeVR",
"description.p0": "Trazendo full-body tracking",
"description.p1": "para todos",
"start": "Vamos configurar!"
},
"enter-vr": {
"back": "Voltar para atribuição de Trackers",
"title": "Hora de entrar no VR!",
"description": "Coloque todos os seus tracker e entre no VR!",
"ready": "Estou pronto"
},
"done": {
"title": "Está tudo pronto!",
"description": "Aproveite sua experiência com full body",
"close": "Fechar o guia"
},
"connect-tracker": {
"back": "Voltar para as credenciais de WiFi",
"title": "Conectar os trackers",
"description.p0": "Agora para a parte divertida, conectando todos seus trackers!",
"description.p1": "Simplesmente conecte todos que ainda não estão conectados, via porta USB.",
"issue": {
"serial": "Estou tendo problemas a conectar!"
},
"usb": "Tracker USB",
"connection-status": {
"connecting": "Enviando credenciais de wifi",
"connected": "Conectado ao WiFi",
"error": "Não é possível conectar ao WiFi",
"start-connecting": "Procurando por trackers",
"handshake": "Conectado ao servidor"
},
"connected-trackers": "{{amount}} trackers conectado",
"next": "Eu conectei todos meus trackers"
},
"assign-trackers": {
"back": "Voltar para as credenciais de WiFi",
"title": "Atribuir trackers",
"description": "Vamos escolher onde cada tracker vai. Clique no local onde você quer colocar o tracker",
"assigned": "{{assigned}} de {{trackers}} trackers atribuídos",
"advanced": "Mostrar locais de atribuição avançados",
"next": "Atribui todos os trackers"
},
"manual-mounting": {
"back": "Voltar para entrar no VR",
"title": "Montagem Manual",
"description": "Clique em cada tracker e selecione qual o jeito que eles estão montados",
"auto-mounting": "Montagem automática",
"next": "Próximo passo"
},
"automatic-mounting": {
"back": "Voltar para entrar no VR",
"title": "Calibração de Montagem",
"description": "Para os trackers do SlimeVR funcionar, nós precisamos atribuir a rotação de montagem dos seus trackers para alinhar com a montagem física de seus trackers.",
"manual-mounting": "Definir manualmente a montagem",
"next": "Próximo passo",
"prev-step": "Passo anterior",
"done": {
"title": "Rotações de montagens calibradas.",
"description": "Sua calibração de montagem está completa!",
"restart": "Voltar ao início"
},
"mounting-reset": {
"title": "Reset de Montagem",
"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.",
"1": "2. Pressione o botão \"Resetar Montagem\" e aguarde 3 segundos antes que as rotações de montagem dos rastreadores sejam redefinidas."
}
},
"preparation": {
"title": "Preparação",
"step": {
"0": "1. Fique de pé com os braços ao lado do corpo.",
"1": "2. Pressione o botão \"Reset\" e aguarde 3 segundos antes que os rastreadores sejam reiniciados."
}
},
"put-trackers-on": {
"title": "Coloque seus trackers",
"description": "Para calibrar as rotações de montagem, usaremos os trackers que você atribuiu. Coloque todos seus trackers, você pode ver qual é qual na figura na direita.",
"next": "Coloquei todos meus trackers"
}
},
"manual-proportions": {
"back": "Voltar para o tutorial de reset",
"title": "Proporções de corpo manuais",
"precision": "Ajuste de precisão",
"auto": "Calibração Automática"
},
"automatic-proportions": {
"back": "Voltar para o tutorial de reset",
"title": "Meça seu corpo",
"description": "Para os trackers SlimeVR funcionarem, precisamos saber o tamanho dos seus ossos. Essa curta calibração vai medir isso para você.",
"manual": "Calibração manual",
"prev-step": "Passo anterior",
"put-trackers-on": {
"title": "Coloque seus trackers",
"description": "Para calibrar suas proporções, usaremos os trackers que você atribuiu. Coloque todos seus trackers, você pode ver quais são quais na figura à direita.",
"next": "Coloquei todos meus trackers"
},
"preparation": {
"title": "Preparação",
"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.",
"next": "Estou em frente a uma cadeira"
},
"start-recording": {
"title": "Esteja preparado para se mexer",
"description": "Começaremos a gravar algumas poses e movimentos específicas. Estes serão solicitados na próxima tela. Esteja preparado para começar quando o botão for pressionado!",
"next": "Começar Gravação"
},
"recording": {
"title": "GRAVAR",
"description.p0": "Gravação em progresso...",
"description.p1": "Faça os movimentos apresentados abaixo:",
"steps": {
"0": "Dobre os joelhos algumas vezes.",
"1": "Sente-se na cadeira e se levante.",
"2": "Gire seu tronco para esquerda, e dobre para direita.",
"3": "Gire seu tronco para direita, e dobre para esquerda.",
"4": "Mexa-se até que o tempo termine."
},
"processing": "Processando o resultado",
"timer": "{{time}} segundos restantes"
},
"verify-results": {
"title": "Verificar os resultados",
"description": "Verifique os resultados abaixo, parecem corretos?",
"results": "Gravando os resultados",
"processing": "Processando o resultado",
"redo": "Refazer a gravação",
"confirm": "Eles estão correto"
},
"done": {
"title": "Corpo medido e salvo.",
"description": "Sua calibração de proporção de corpo está completa!"
}
}
},
"home": {
"no-trackers": "Nenhum tracker detectado ou atribuído"
}
}

View File

@@ -1,460 +0,0 @@
{
"websocket": {
"connecting": "Đang kết nối với máy chủ",
"connection-lost": "Kết nối với máy chủ đã mất. Đang kết nối lại..."
},
"tips": {
"find-tracker": "Không rõ tracker nào? Lắc tracker và trong menu sẽ sáng lên.",
"do-not-move-heels": "Hãy đảm bảo gót chân không cử động trong khi đo ghi!"
},
"body-part": {
"NONE": "Chưa liên kết",
"HEAD": "Đầu",
"NECK": "Cổ",
"RIGHT_SHOULDER": "Vai phải",
"RIGHT_UPPER_ARM": "Tay phải trên",
"RIGHT_LOWER_ARM": "Tay phải dưới",
"RIGHT_HAND": "Tay phải",
"RIGHT_UPPER_LEG": "Chân phải trên",
"RIGHT_LOWER_LEG": "chân phải dưới",
"RIGHT_FOOT": "Bàn chân phải",
"CHEST": "Ngực",
"WAIST": "Eo",
"HIP": "Hông",
"LEFT_SHOULDER": "Vai trái",
"LEFT_UPPER_ARM": "Tay trái trên",
"LEFT_LOWER_ARM": "tay trái dưới",
"LEFT_HAND": "Tay trái",
"LEFT_UPPER_LEG": "Chân trái trên",
"LEFT_LOWER_LEG": "Chân trái dưới",
"LEFT_FOOT": "Bàn chân trái"
},
"skeleton-bone": {
"NONE": "Chưa liên kết",
"HEAD": "Đầu ca",
"NECK": "Cổ dài",
"TORSO": "Chiều dài thân",
"CHEST": "Khoảng cách ngực",
"WAIST": "Khoảng cách eo",
"HIP_OFFSET": "Lệc đo hông",
"HIPS_WIDTH": "Chiều rộng hông",
"LEGS_LENGTH": "Chiều dài chân",
"KNEE_HEIGHT": "Chiều cao đầu gối",
"FOOT_LENGTH": "CHiều dài bàn chân",
"FOOT_SHIFT": "Lệch đo bàn chân",
"SKELETON_OFFSET": "Lệch đo thân",
"CONTROLLER_DISTANCE_Z": "Khoảng cách tay cầm Z",
"CONTROLLER_DISTANCE_Y": "Khoảng cách tay cầm Y",
"FOREARM_LENGTH": "khoảng cách cánh tay",
"SHOULDERS_DISTANCE": "Khoảng cách vai",
"SHOULDERS_WIDTH": "Chiều rộng vai",
"UPPER_ARM_LENGTH": "Chiều dài tay trên",
"ELBOW_OFFSET": "Lệch đo khuỷu tay"
},
"reset": {
"reset-all": "Reset tất cả bộ phận",
"full": "Reset",
"mounting": "Reset vị trí cài",
"quick": "Reset nhanh"
},
"serial-detection": {
"new-device.p0": "New serial device detected!" ,
"new-device.p1": "Vui lòng nhập thông tin Wi-Fi!",
"new-device.p2": "Vui lòng chọn những gì làm với nó",
"open-wifi": "Kết nối Wi-Fi",
"open-serial": "Mở Serial Console",
"submit": "Đăng lên!",
"close": "Đóng"
},
"navbar": {
"home": "Giao diện chính",
"body-proportions": "Bộ phận cơ thể",
"trackers-assign": "Giao bộ phận tracker",
"mounting": "Đo vị trí đặt",
"onboarding": "Trình hướng dẫn cài đặt",
"settings": "Cài đặt"
},
"bvh": {
"start-recording": "Ghi BVH",
"recording": "Đang ghi..."
},
"overlay": {
"is-visible-label": "Xem overlay trên SteamVR",
"is-mirrored-label": "Xem overlay trong gương"
},
"tracker": {
"status": {
"none": "Không có tình trạng",
"busy": "Bận",
"error": "Lỗi",
"disconnected": "Đã ngắt kết nối",
"occluded": "Bị tắc",
"ok": "Đã kết nối"
},
"table": {
"column": {
"name": "Tên",
"type": "Loại",
"battery": "Pin",
"ping": "Ping",
"rotation": "Chiều chuyển X/Y/Z",
"position": "Vị trí X/Y/Z",
"url": "URL"
}
},
"rotation": {
"front": "Đằng trước",
"left": "Bên trái",
"right": "Bên phải",
"back": "Đằng sau"
},
"infos": {
"manufacturer": "Nhà sản xuất",
"display-name": "Tên gọi",
"custom-name": "Tên tự chọn",
"url": " URL"
},
"settings": {
"back": "Quay lại danh sách tracker",
"title": "Cài đặt tracker",
"assignment-section": {
"title": "Giao bộ phận",
"description": "Thiết bị này được giao cho bộ phận nào.",
"edit": "Chỉnh lại giao bộ phận"
},
"mounting-section": {
"title": "Vị trí đặt bộ phận",
"description": "Tracker đặt ở đâu?",
"edit": "Chỉnh lại chỗ đặt"
},
"name-section": {
"title": "Tên tracker",
"description": "Hãy cho một tên đẹp :)",
"input-placeholder": "Menaced's left leg"
}
},
"part-card": {
"no-name": "Không tên",
"unassigned": "Chưa giao vị trí"
}
},
"body-assignment-menu": {
"title": "Bạn muốn giao tracker này cho bộ phận nào?",
"description": "Chọn vị trí bạn muốn giao tracker cho. Ngoài ra, bạn có thể quản lí tất cả tracker cùng một lúc thay vì từng cái một.",
"show-advanced-locations": "Xem thêm vị trí đặt",
"manage-trackers": "Quản lí tất cả tracker",
"unassign-tracker": "Tracker chưa giao vị trí"
},
"tracker-selection-menu": {
"title": "Tracker nào để giao cho {{bodyPart}}?",
"unassigned": "Chưa giao vị trí",
"assigned": "Đã giao vị trí",
"dont-assign": "Thoát và không giao"
},
"mounting-selection-menu": {
"title": "Bạn muốn giao tracker này ở đâu?",
"close": "Đóng"
},
"settings": {
"sidebar": {
"title": "Cài đặt",
"general": "Cài đặt chung",
"tracker-mechanics": "Cơ khí tracker",
"fk-settings": "Cài đặt FK",
"interface": "Giao diện",
"utils": "Hữu dụng",
"serial": "Bảng điều khiển Serial"
},
"general": {
"steamvr": {
"title": "SteamVR",
"subtitle": "SteamVR trackers",
"description.p0": "Bặt hoặc tắt tracker SteamVR.",
"description.p1": "Hữu dụng nếu bạn muốn điều khiển cách SlimeVR hoạt động.",
"trackers": {
"waist": "Eo",
"chest": "Ngực",
"feet": "Bàn chân",
"knees": "Đầu gối (Chân)",
"elbows": "Khuỷu tay"
}
},
"tracker-mechanics": {
"title": "Cơ khí tracker",
"subtitle": "Lọc rung",
"description.p0": "Chọn kiểu lọc rung cho tracker.",
"description.p1": "Dự đoán đoán cử động trong khi lọc rung cử động.",
"filtering-type": {
"title": "Kiểu lọc",
"none": {
"label": "Không lọc",
"description":"Để đo chiều chuyển y nguyên. Không sử dụlọclọc."
},
"smoothing": {
"label": "Làm mượt",
"description":"Lọc cử động mượt nhưng tạo ít chậm rễ."
},
"prediction": {
"label": "Dự đoán",
"description":"Giảm chậm trê và để cử động gọn hơn, nhưng có thể tăng độ rung."
}
},
"amount": {
"Ghi chú": "Số luọng"
}
},
"fk-settings": {
"title": "Cài đặt FK",
"leg-tweak": {
"title": "Chỉnh chân",
"description": "Chỉnh chân có thể giảm hoặc loại bỏ chân đi xuyên sàn nhà nhưng có thể ảnh hưởng đầu gối. Sửa trượt sửa khi lướt, nhưng giảm độ chính xác ở một số cử động.",
"floor-clip": "Xuyên sàn",
"skating-correction": "Sửa trượt"
},
"arm-fk": {
"title": "Tay FK",
"description": "Chỉnh cách tay được đo.",
"force-arms": "Bắt tay từ kính thực tế ảo"
},
"skeleton-settings": {
"title": "Cài đặt cơ thể",
"description": "Bật hoặc tắt hình cơ thể. Khuyên nên luôn để bật lựa chọn này.",
"extended-spine": "Xương sống mở rộng",
"extended-pelvis": "Xuong chậu mở rộng",
"extended-knees": "Đầu gối mở rộng"
}
},
"gesture-control": {
"title": "Điều khiển cử chỉ",
"subtitle": "Bấm hai lần để reset nhanh",
"description": "Bật hoặc tắt reset nhanh. Khi bật bấm hai lần bất cứ đâu trên điểm cao nhất ở thân sẽ kích hoạt reset nhanh. Delay is the time between registering a tap and resetting.",
"enable": "Bấm hai lần để reset nhanh",
"delay": "Chậm trễ"
},
"interface": {
"title": "Giao diện",
"dev-mode": {
"title": "Chế độ nhà phát triển",
"description": "Chế độ này có thể hữu dụng nếu như bạn cần thông tin sâu hơn hoặc giao tiếp với tracker nâng cao",
"label": "Chế độ nhà phát triển"
},
"serial-detection": {
"title": "Phát hiện thiết bị Serial",
"description": "Lựa chọn này sẽ hiển thị thông báo mỗi lần thiết bị Serial mà có thể là tracker.Lựa chọn này có thể giúp quá trình cài đạt tracker",
"label": "Phát hiện thiết bị Serial"
},
"lang": {
"title": "Chọn ngôn ngữ (Change language)",
"description": "Đổi ngôn ngữ cố định (Change the default language you want to use)",
"placeholder": "Chọn ngôn ngữ để sử dụng (Select the language to use)"
}
}
},
"serial": {
"title": "Bảng điều khiển serial",
"description.p0": "Đâu là thông tin trực tiếp về giao tiếp với Serial.",
"description.p1": "Hữu dụng nếu muốn biết phần mềm firmware có vấn đề không.",
"connection-lost": "Kết nối đến Serial đã mất, đang kết nối lại...",
"reboot": "Khởi động lại",
"factory-reset": "Khôi phục cài đặt gối",
"get-infos": "Lấy thông tin",
"serial-select": "Chọn cổng Serial",
"auto-dropdown-item": "Tự động"
},
"osc": {
"vrchat": {
"description.p0": "Đổi cài đặt dành riêng cho VRChat để nhận thông tin từ kính thực tế ảo và gửi",
"description.p1": "thông tin tracker để track toàn thân (Hoạt động trên Quest một mình standalone).",
"enable": {
"title": "Bật",
"description": "Chình gửi và nhận thông tin",
"label": "Bật"
},
"network": {
"title": "Cổng mạng",
"description": "Chọn cổng mạng để nghe và gửi thông tin lên VRChat",
"port-in": {
"label": "Cổng vào",
"placeholder": "Cổng vào (Cố định: 9001)"
},
"port-out": {
"label": "Cổng ra",
"placeholder": "Cổng ra (Cố định: 9000)"
},
"address": {
"title": "Địa chỉ mạng",
"description": "Chọn địa chỉ mạng nào để gứi lên VRChat (Hãy kiểm tra cài đặt Wi-Fi trên thiết bị để tìm cái này)",
"placeholder": "Địa chỉ IP cho VRChat"
},
"trackers": {
"title": "Trackers",
"description": "Chỉnh gửi và nhận thông tin",
"chest": "Ngực",
"waist": "Eo",
"knees": "Đầu gối",
"feet": "Bàn chân",
"elbows": "Khuỷu tay"
}
}
}
}
},
"onboarding": {
"skip": "Bỏ qua cài đặt",
"continue": "Tiếp tục",
"wip": "Đang làm dở (vui lòng quay lại sau update)",
"wifi-creds": {
"back": "Quay lại đoạn giới thiệuthiệu",
"title": "Bỏ thông tin Wi-Fi ở đây",
"description.p0": "Tracker sẽ sử dụng thông tin sau để kết nối không dây",
"description.p1": "vui lòng bỏ thông tin bạn muốn kết nối",
"skip": "Bỏ qua cài đặt Wi-Fi",
"submit": "Thiết lập!"
},
"reset-tutorial": {
"back": "Quay lại đo đạt vị trí",
"title": "Làm lại hướng dẫn",
"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 update"
},
"home": {
"title": "Chào mừng đến với SlimeVR!",
"description.p0": "Đem đến đo toàn thân",
"description.p1": "tới tất cả",
"start": "Hãy bắt đầu cài đặt!"
},
"enter-vr": {
"back": "Quay lại giao bộ phận tracker",
"title": "Đến giờ lên VR!",
"description": "Đeo tất cả tracker và lên VR!",
"ready": "Sẵn sàng!"
},
"done": {
"title": "Bạn đã hoàn thành cài đặt!",
"description": "Hãy tận hưởng đo toàn thân",
"close": "Đóng hướng dẫn"
},
"connect-tracker": {
"back": "Quay lại tra thông tin Wi-Fi",
"title": "Kết nối tracker",
"description.p0": "Đến giờ đoạn hay nhất, kết nối tất cả tracker!",
"description.p1": "Đơn thuần kết nối tất cả tracker chưa kết nối, qua cổng USB",
"issue": {
"serial": "Mình có vấn đề kết nối!"
},
"usb": "USB Tracker",
"connection-status": {
"connecting": "Đang gửi thông tin Wi-Fi",
"connected": "Đã kết nối Wi-Fi",
"error": "Không thể kết nối Wi-Fi",
"start-connecting": "Đang tìm tracker",
"handshake": "Đã kết nối với máy chủ"
},
"connected-trackers": "{{amount}} tracker đã kết nối",
"next": "Tôi đã kết nối tất cả tracker"
},
"assign-trackers": {
"back": "Quay lại tra thông tin Wi-Fi",
"title": "Giao tracker",
"description": "Hãy chọn tracker nào nằm ở đâu. Chọn vị trí bạn muốn giao tracker cho",
"assigned": "{{assigned}} trong {{trackers}} tracker đã được giao",
"advanced": "Xem vị trí mở rộng",
"next": "Hoàn thành"
},
"manual-mounting": {
"back": "Quay lại đến vào VR",
"title": "Đặt thủ công",
"description": "Bấm từng tracker một và chọn xem nó được gắn theo chiều nào",
"auto-mounting": "Gắn tự động",
"next": "Bước tiếp theo"
},
"automatic-mounting": {
"back": "Quay lại đến vào VR",
"title": "Đo vị trí đặt",
"description": "Để SlimeVR hoạt động, bạn cần đạt chiều hướng quay của tracker để khớp với điểm đặt tracker trên cơ thể",
"manual-mounting": "Đặt vị trí thủ công",
"next": "Bước tiếp theo",
"prev-step": "Bước trước",
"done": {
"title": "Hướng quay đã được đo.",
"description": "Cài đặt vị trí đã hoàn thành!",
"restart": "Quay lại bắt đầu"
},
"mounting-reset": {
"title": "Reset vị trí",
"step": {
"0": "1. Ngồi xổm trong tư thế \"skiing\" với hai chân cong, thân trên nghiêng về phía trước và hai cánh tay cong.",
"1": "2. Nhấn nút \"Reset Mounting\" và đợi trong 3 giây trước khi các vòng quay giá đỡ của thiết bị theo dõi sẽ được đặt lại."
}
},
"preparation": {
"title": "Chuẩn bị",
"step": {
"0": "1. Đứng thẳng với hai cánh tay sang hai bên.",
"1": "2. Nhấn nút \"Reset\" và đợi trong 3 giây trước khi trình theo dõi sẽ đặt lại."
}
},
"put-trackers-on": {
"title": "Hãy đeo tracker lên người",
"description": "Để đo chiều quay của tracker, phần mềm sẽ sử dụng tracker mà bạn đã giao cho. Hãy đeo lên tất cả tracker, và xem cái nào là cái nào trên hình bên phải",
"next": "Hoàn thành (Gắn xong)"
}
},
"manual-proportions": {
"back": "Quay lại hướng dẫn reset",
"title": "Cài bộ phận cơ thể thủ công",
"precision": "Chỉnh độ chính xác",
"auto": "Đo cơ thể tự động"
},
"automatic-proportions": {
"back": "Quay lại hướng dẫn reset",
"title": "Đo cơ thể",
"description": "Để SlimeVR hoạt động, phần mềm cần biết chiều dài của thân. Bước đo tự động này sẽ giúp bạn.",
"manual": "Đo thủ công",
"prev-step": "Bước trước",
"put-trackers-on": {
"title": "Đeo tất cả",
"description": "Để đo bộ phận, phần mềm sẽ sử dụng tracker mà bạn đã giao cho. Hãy đeo lên tất cả tracker, và xem cái nào là cái nào trên hình bên phải.",
"next": "Hoàn thành (Gắn xong)"
},
"preparation": {
"title": "Chuẩn bị",
"description": "Đặt ghế đằng sau bạn thẳng trong khu vực chơi VR. Hãy chuẩn bị ngồi trong khi cài đặt đo thân tự động.",
"next": "Tôi đang đứng trước ghế ngồi"
},
"start-recording": {
"title": "Chuẩn bị cử động",
"description": "Phần mềm sẽ ghi một số củ động cử chỉ. Bước này sẽ bắt đầu ở màn hình tiếp theo. Hãy chuẩn bị khi bấm bắt đầu",
"next": "Bắt đầu quay"
},
"recording": {
"title": "Quay",
"description.p0": "Đang quay...",
"description.p1": "Hãy cử động theo hướng dẫn sau:",
"steps": {
"0": "Cong đầu gối vài lần.",
"1": "Ngồi lên ghế rồi đứng lên.",
"2": "Vặn thân trên sang trái, sau đó uốn cong sang phải.",
"3": "Vặn thân trên sang phải, sau đó uốn cong sang trái.",
"4": "Đảo xung quanh cho đến khi bộ đếm thời gian kết thúc."
},
"processing": "Đang xử lí kết quả",
"timer": "Còn {{time}} giây"
},
"verify-results": {
"title": "Xác nhận kết quả",
"description": "Kiểm tra kết quả dưới đây, nó có chính xác không?",
"results": "Đang ghi kết quả",
"processing": "Đang xử lí kết quả",
"redo": "Ghi lại",
"confirm": "Kết quả này chính xác!"
},
"done": {
"title": "Thân đã được đo và lưu.",
"description": "Quá trình đo thân đã hoàn thành!"
}
}
},
"home": {
"no-trackers": "Không tracker nào được phát hiện hoặc giao vị trí"
}
}

View File

@@ -1,491 +0,0 @@
{
"websocket": {
"connecting": "正在连接到服务器",
"connection-lost": "与服务器的链接丢失,正在尝试重新链接..."
},
"tips": {
"find-tracker": "不确定哪个追踪器是哪个?在现实中摇动一个追踪器,对应的那个将在屏幕上高亮显示。",
"do-not-move-heels": "确保你的脚跟在录制的时候不会发生移动!"
},
"body-part": {
"NONE": "未分配",
"HEAD": "头部",
"NECK": "颈部",
"RIGHT_SHOULDER": "右肩",
"RIGHT_UPPER_ARM": "右大臂",
"RIGHT_LOWER_ARM": "左小臂",
"RIGHT_HAND": "右手",
"RIGHT_UPPER_LEG": "右大腿",
"RIGHT_LOWER_LEG": "右小腿",
"RIGHT_FOOT": "右脚",
"CHEST": "胸部",
"WAIST": "腰部",
"HIP": "髋部",
"LEFT_SHOULDER": "左肩",
"LEFT_UPPER_ARM": "左大臂",
"LEFT_LOWER_ARM": "右小臂",
"LEFT_HAND": "左手",
"LEFT_UPPER_LEG": "左大腿",
"LEFT_LOWER_LEG": "左小腿",
"LEFT_FOOT": "左脚"
},
"skeleton-bone": {
"NONE": "无",
"HEAD": "头部偏移",
"NECK": "颈部长度",
"TORSO": "躯干长度",
"CHEST": "胸部距离",
"WAIST": "腰部距离",
"HIP_OFFSET": "髋部偏移",
"HIPS_WIDTH": "髋部宽度",
"LEGS_LENGTH": "腿部长度",
"KNEE_HEIGHT": "膝盖高度",
"FOOT_LENGTH": "脚部长度",
"FOOT_SHIFT": "脚部偏移",
"SKELETON_OFFSET": "骨骼偏移",
"CONTROLLER_DISTANCE_Z": "控制器距离 Z",
"CONTROLLER_DISTANCE_Y": "控制器距离 Y",
"FOREARM_LENGTH": "前臂距离",
"SHOULDERS_DISTANCE": "肩膀距离",
"SHOULDERS_WIDTH": "肩膀宽度",
"UPPER_ARM_LENGTH": "上臂长度",
"ELBOW_OFFSET": "肘部偏移"
},
"reset": {
"reset-all": "重置所有比例",
"full": "重置",
"mounting": "重置佩戴",
"quick": "快速重置"
},
"serial-detection": {
"new-device.p0": "检测到了新的串口设备!",
"new-device.p1": "输入你的 WiFi 凭据!",
"new-device.p2": "请选择你想对它做什么",
"open-wifi": "连接到 WiFi",
"open-serial": "打开串口控制器",
"submit": "提交!",
"close": "关闭"
},
"navbar": {
"home": "主页",
"body-proportions": "身体比例",
"trackers-assign": "追踪器分配",
"mounting": "佩戴校准",
"onboarding": "向导",
"settings": "设置"
},
"bvh": {
"start-recording": "录制 BVH 文件",
"recording": "录制中..."
},
"overlay": {
"is-visible-label": "在 SteamVR 中显示覆盖层",
"is-mirrored-label": "镜像显示覆盖层"
},
"tracker": {
"status": {
"none": "无状态",
"busy": "繁忙",
"error": "错误",
"disconnected": "断开连接",
"occluded": "被遮挡",
"ok": "已连接"
},
"table": {
"column": {
"name": "名字",
"type": "类型",
"battery": "电池",
"ping": "延迟",
"rotation": "旋转 X/Y/Z",
"position": "位置 X/Y/Z",
"url": "地址"
}
},
"rotation": {
"front": "前",
"left": "左",
"right": "右",
"back": "后"
},
"infos": {
"manufacturer": "制造商",
"display-name": "显示名称",
"custom-name": "自定义名称",
"url": "追踪器地址"
},
"settings": {
"back": "返回追踪器列表",
"title": "追踪器设置",
"assignment-section": {
"title": "分配追踪器",
"description": "追踪器要分配到身体哪个部位?",
"edit": "编辑分配"
},
"mounting-section": {
"title": "佩戴位置",
"description": "追踪器佩戴在哪里?",
"edit": "编辑佩戴"
},
"name-section": {
"title": "追踪器名称",
"description": "给它起一个可爱的名字吧=w=~",
"input-placeholder": "CC 封印着漆黑之力的漆黑左臂"
}
},
"part-card": {
"no-name": "未命名",
"unassigned": "未分配"
}
},
"body-assignment-menu": {
"title": "你想把追踪器放在哪里?",
"description": "选择要将此追踪器分配到的位置,或者你也可以选择一次管理所有追踪器,而不是逐个管理。",
"show-advanced-locations": "显示高级分配位置",
"manage-trackers": "管理所有追踪器",
"unassign-tracker": "取消分配追踪器"
},
"tracker-selection-menu": {
"title": "要将哪个追踪器分配给 {{bodypart}}",
"unassigned": "未分配的追踪器",
"assigned": "已分配的追踪器",
"dont-assign": "不分配"
},
"mounting-selection-menu": {
"title": "你想把追踪器放在哪里?",
"close": "关闭"
},
"settings": {
"sidebar": {
"title": "设置",
"general": "通用设置",
"tracker-mechanics": "追踪器设置",
"fk-settings": "FK 设置",
"gesture-control": "手势控制",
"interface": "交互界面",
"osc-router": "OSC 路由",
"utils": "工具",
"serial": "串行控制器"
},
"general": {
"steamvr": {
"title": "SteamVR",
"subtitle": "SteamVR 追踪器",
"description.p0": "启用或禁用特定的追踪部分.",
"description.p1": "如果你想对 SlimeVR 做更多的控制将会很有用。",
"trackers": {
"waist": "腰部",
"chest": "胸部",
"feet": "脚部",
"knees": "膝盖",
"elbows": "肘部"
}
},
"tracker-mechanics": {
"title": "追踪器设置",
"subtitle": "滤波",
"description.p0": "选择追踪器的滤波类型。",
"description.p1": "预测型将会对你的运动加以预测,而平滑型将会让你的运动更加平滑。",
"filtering-type": {
"title": "滤波类型",
"none": {
"label": "无滤波",
"description": "使用原始数据,不会进行任何过滤。"
},
"smoothing": {
"label": "平滑型",
"description": "让运动更加平滑,但会增加一些延迟。"
},
"prediction": {
"label": "预测型",
"description": "减少延迟并使移动更敏捷,但可能会增加一些抖动。"
}
},
"amount": {
"label": "滤波数值"
}
},
"fk-settings": {
"title": "FK 设置",
"leg-tweak": {
"title": "腿部调整",
"description": "本设置可以减少甚至消除与地板的摩擦情况,但是当你跪在地上的时候可能产生一些问题. 脚滑矫正可以矫正一些脚滑溜冰的问题, 但是可能会降低某些运动动作的准确性。",
"floor-clip": "地板限制",
"skating-correction": "脚滑矫正",
"skating-correction-amount": "脚滑矫正数值"
},
"arm-fk": {
"title": "手臂 FK",
"description": "更改手臂的追踪方式。",
"force-arms": "强制从头显获得数据"
},
"skeleton-settings": {
"title": "骨架设置",
"description": "打开或关闭骨架设置。建议保持这些设置不变。",
"extended-spine": "脊柱延伸",
"extended-pelvis": "骨盆延伸",
"extended-knees": "膝盖延伸"
}
},
"gesture-control": {
"title": "手势控制",
"subtitle": "双击快速重置",
"description": "启用或禁用双击快速重置。启用时,双击身上佩戴的最高的追踪器上的任何位置将激活快速重置。延迟是指记录敲击和重置之间的时间。",
"enable": "双击快速重置",
"delay": "延迟"
},
"interface": {
"title": "交互界面",
"dev-mode": {
"title": "开发者模式",
"description": "如果你需要深入的数据或更深入地与连接的追踪器进行交互,打开此模式将会非常有用。",
"label": "开发者模式"
},
"serial-detection": {
"title": "串行设备检测",
"description": "每次插入可能是追踪器的新串行设备时,此选项都会显示一个弹出窗口。这有助于改进追踪器的设置过程。",
"label": "串行设备检测"
},
"lang": {
"title": "选择语言",
"description": "更改要使用的默认语言",
"placeholder": "选择要使用的语言"
}
}
},
"serial": {
"title": "串行控制台",
"description.p0": "这是用于串行通信的实时信息馈送。",
"description.p1": "如果你需要了解固件是否出现问题,这将会很有用。",
"connection-lost": "串行连接丢失,正在重新连接..",
"reboot": "重新启动",
"factory-reset": "恢复出厂设置",
"get-infos": "获取信息",
"serial-select": "选择串行端口",
"auto-dropdown-item": "自动"
},
"osc": {
"router": {
"title": "OSC 路由",
"description.p0": "从另一个程序转发 OSC 信息。",
"description.p1": "在使用另一个 VRChat 的 OSC 程序时会很有用。",
"enable": {
"title": "启用",
"description": "控制信息转发功能的开关。",
"label": "启用"
},
"network": {
"title": "网络端口",
"description.p0": "设置用于监听和向 VRChat 发送数据的端口",
"description.p1": "这些端口可以与 SlimeVR 服务器中使用的其他端口相同。",
"port-in": {
"label": "输入端口",
"placeholder": "输入端口(默认 9002"
},
"port-out": {
"label": "输出端口",
"placeholder": "输出端口(默认 9000"
},
"address": {
"title": "网络地址",
"description": "设置用来发送数据的地址。",
"placeholder": "IPV4 地址"
}
}
},
"vrchat": {
"description.p0": "改变 VRChat 的特定设置以接收和发送头显数据。",
"description.p1": "用于全身追踪的追踪器数据(在 Quest 端生效)。",
"enable": {
"title": "启用",
"description": "切换数据的发送和接收",
"label": "启用"
},
"network": {
"title": "网络端口",
"description": "设置用于监听和向 VRChat 发送数据的端口",
"port-in": {
"label": "输入端口",
"placeholder": "输入端口(默认 9001"
},
"port-out": {
"label": "输出端口",
"placeholder": "输出端口(默认 9000"
},
"address": {
"title": "网络地址",
"description": "选择将数据发送到 VRChat 的地址(检查设备上的 WiFi 设置)",
"placeholder": "VRChat IP 地址"
},
"trackers": {
"title": "追踪器",
"description": "切换数据的发送和接收",
"chest": "胸部",
"waist": "腰部",
"knees": "膝盖",
"feet": "脚部",
"elbows": "肘部"
}
}
}
}
},
"onboarding": {
"skip": "跳过设置",
"continue": "继续",
"wip": "仍在开发中",
"wifi-creds": {
"back": "返回简介",
"title": "输入 WiFi 凭据",
"description.p0": "追踪器将使用这些凭据连接到 WiFi",
"description.p1": "请使用当前连接到 WiFi 的凭据",
"skip": "跳过 WiFi 设置",
"submit": "提交!"
},
"reset-tutorial": {
"back": "返回到佩戴校准",
"title": "重置教程",
"description": "此功能尚未开发完成,请继续就好"
},
"home": {
"title": "欢迎来到 SlimeVR",
"description.p0": "将全身追踪",
"description.p1": "带给每一个人",
"start": "我准备好了!"
},
"enter-vr": {
"back": "返回到追踪器分配",
"title": "VR 时间到!",
"description": "穿戴好所有的追踪器,开始快乐 VR 吧!",
"ready": "我准备好了"
},
"done": {
"title": "都搞定啦!",
"description": "享受你的全身追踪体验吧",
"close": "关闭向导"
},
"connect-tracker": {
"back": "返回到 WiFi 凭据设置",
"title": "连接追踪器",
"description.p0": "来到了我第二喜欢的环节,连接所有的追踪器!",
"description.p1": "只需通过 USB 连接所有尚未连接的设备即可。",
"issue": {
"serial": "QAQ 我在连接时遇到问题!"
},
"usb": "USB 追踪器",
"connection-status": {
"connecting": "正在发送 WiFi 凭据",
"connected": "WiFi 已连接",
"error": "无法连接到 WiFi",
"start-connecting": "寻找追踪器",
"handshake": "已连接到服务器"
},
"connected-trackers": "{{Amount}} 个追踪器已连接",
"next": "所有的追踪器都连接好了"
},
"assign-trackers": {
"back": "返回 WiFi 凭据设置",
"title": "分配追踪器",
"description": "让我们选择哪个追踪器在哪里。单击要放置追踪器的部位",
"assigned": "{{assigned}} / {{trackers}} 个已分配的追踪器",
"advanced": "显示高级分配部位",
"next": "所有的追踪器都分配好了"
},
"manual-mounting": {
"back": "返回到进入 VR",
"title": "手动佩戴",
"description": "单击每个追踪器并选择它们的配电方式",
"auto-mounting": "自动佩戴",
"next": "下一步"
},
"automatic-mounting": {
"back": "返回到进入 VR",
"title": "佩戴校准",
"description": "为了让 SlimeVR 追踪器正常工作,我们需要为你的追踪器分配一个佩戴方向,以使其与你的物理追踪器佩戴方式对齐。",
"manual-mounting": "手动设置佩戴方向",
"next": "下一步",
"prev-step": "上一步",
"done": {
"title": "佩戴方向已校准。",
"description": "你的佩戴方向校准完成!",
"restart": "返回以开始"
},
"mounting-reset": {
"title": "佩戴重置",
"step": {
"0": "1. 双腿弯曲以滑雪的姿势蹲下,上身向前倾斜,手臂弯曲。",
"1": "按下佩戴重置按钮并等待 3 秒钟,然后追踪器的佩戴方向将被重置。"
}
},
"preparation": {
"title": "准备",
"step": {
"0": "1. 身体直立,双臂放在身体两侧。",
"1": "按下“复位”按钮,等待 3 秒钟,追踪器将复位。"
}
},
"put-trackers-on": {
"title": "穿戴好追踪器",
"description": "为了校准佩戴方向,我们将使用你刚才分配的追踪器。戴上你所有的追踪器,你可以在右边的图中看到哪个追踪器对应哪个。",
"next": "所有的追踪器都已开启!"
}
},
"manual-proportions": {
"back": "返回重置教程",
"title": "手动调整身体比例",
"precision": "精确调整",
"auto": "自动校准"
},
"automatic-proportions": {
"back": "返回重置教程",
"title": "测量你的身体比例",
"description": "为了让 SlimeVR 追踪器正常使用,我们需要知道你的骨头的长度。这个简短的校准将为你测量它们。",
"manual": "手动校准",
"prev-step": "上一步",
"put-trackers-on": {
"title": "穿戴好追踪器",
"description": "为了校准你的身体比例,我们将使用你刚才分配的追踪器。戴上你所有的追踪器,你可以在右边的图中看到哪个追踪器对应哪个。",
"next": "所有的追踪器都已开启!"
},
"preparation": {
"title": "准备",
"description": "在你的游戏空间里,在你的正后方放一把椅子。随时准备好在接下来的设置过程中坐下。",
"next": "我在椅子前面啦"
},
"start-recording": {
"title": "准备移动",
"description": "我们现在要记录一些特定的姿势和动作。这些将在下一个屏幕中提示。当按钮被按下时,准备好开始!",
"next": "开始录制"
},
"recording": {
"title": "REC",
"description.p0": "录制中...",
"description.p1": "做下面的动作:",
"steps": {
"0": "弯曲几次膝盖。",
"1": "坐在椅子上,然后站起来。",
"2": "向左扭转上身,然后向右弯。",
"3": "向右扭转上身,然后向左弯。",
"4": "持续摆动身体,直到计时器结束。"
},
"processing": "正在处理结果",
"timer": "剩余 {{time}} 秒"
},
"verify-results": {
"title": "校验结果",
"description": "检查下面的结果,它们看起来是正确的吗?",
"results": "录制结果",
"processing": "正在处理结果",
"redo": "重新录制",
"confirm": "他们是正确的!"
},
"done": {
"title": "身体数据已测量并保存。",
"description": "你的身体比例校准已完成!"
}
}
},
"home": {
"no-trackers": "未检测到或未分配追踪器"
}
}

View File

@@ -4,13 +4,21 @@
body {
font-variant-numeric: tabular-nums;
font-family: 'poppins', sans-serif;
font-family: "Twemoji Country Flags", 'poppins', sans-serif;
height: 100vh;
width: 100vw;
user-select: none;
background: theme('colors.background.20');
}
@font-face {
font-family: "Twemoji Country Flags";
unicode-range: U+1F1E6-1F1FF, U+1F3F4, U+E0062-E0063, U+E0065, U+E0067,
U+E006C, U+E006E, U+E0073-E0074, U+E0077, U+E007F;
src: url('/fonts/TwemojiCountryFlags.woff2') format('woff2');
font-display: swap;
}
html {
overflow: hidden;
background: theme('colors.background.20');

View File

@@ -4,7 +4,7 @@ import React from 'react';
import * as ReactDOMClient from 'react-dom/client';
import Modal from 'react-modal';
import App from './App';
import './i18n/config';
import { AppLocalizationProvider } from './i18n/config';
import './index.css';
Modal.setAppElement('#root');
@@ -15,7 +15,9 @@ if (container) {
const root = ReactDOMClient.createRoot(container);
root.render(
<React.StrictMode>
<App />
<AppLocalizationProvider>
<App />
</AppLocalizationProvider>
</React.StrictMode>
);
}

View File

@@ -1 +1,5 @@
/// <reference types="vite/client" />
declare const __COMMIT_HASH__: string;
declare const __VERSION_TAG__: string;
declare const __GIT_CLEAN__: boolean;

View File

@@ -1,10 +1,44 @@
import { esbuildCommonjs, viteCommonjs } from '@originjs/vite-plugin-commonjs';
import react from '@vitejs/plugin-react';
import { defineConfig } from 'vite';
import { defineConfig, PluginOption } from 'vite';
import { execSync } from 'child_process';
const commitHash = execSync('git rev-parse --verify --short HEAD')
.toString()
.trim();
const versionTag = execSync('git --no-pager tag --points-at HEAD')
.toString()
.trim();
// If not empty then it's not clean
const gitClean = execSync('git status --porcelain').toString() ? false : true;
console.log(
`version is ${versionTag || commitHash}${gitClean ? '' : '-dirty'}`
);
// Detect fluent file changes
export function i18nHotReload(): PluginOption {
return {
name: 'i18n-hot-reload',
handleHotUpdate({ file, server }) {
if (file.endsWith('.ftl')) {
console.log('Fluent files updated');
server.ws.send({
type: 'custom',
event: 'locales-update',
});
}
},
};
}
// https://vitejs.dev/config/
export default defineConfig({
plugins: [viteCommonjs(), react()],
define: {
__COMMIT_HASH__: JSON.stringify(commitHash),
__VERSION_TAG__: JSON.stringify(versionTag),
__GIT_CLEAN__: gitClean,
},
plugins: [react(), i18nHotReload()],
build: {
target: 'es2020',
emptyOutDir: true,
@@ -15,7 +49,6 @@ export default defineConfig({
optimizeDeps: {
esbuildOptions: {
target: 'es2020',
plugins: [esbuildCommonjs(['solarxr-protocol'])],
},
needsInterop: ['solarxr-protocol'],
include: ['solarxr-protocol'],

11412
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -7,8 +7,9 @@
"gui"
],
"scripts": {
"gui": "npm run update-solarxr && cd gui && npm run tauri dev",
"gui": "npm run update-solarxr && cd gui && npm run dev",
"tauri": "cd gui && npm run tauri",
"skipbundler": "cd gui && npm run skipbundler",
"build": "npm run tauri build",
"update-solarxr": "cd solarxr-protocol && npm run build",
"prepare": "husky install && npm run update-solarxr"

View File

@@ -1,109 +0,0 @@
/*
* This file was generated by the Gradle 'init' task.
*
* This generated file contains a sample Java Library project to get you started.
* For more details take a look at the Java Libraries chapter in the Gradle
* User Manual available at https://docs.gradle.org/6.3/userguide/java_library_plugin.html
*/
plugins {
id 'application'
id "com.github.johnrengelman.shadow" version "7.1.2"
id "com.diffplug.spotless" version "6.5.1"
}
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
// Set compiler to use UTF-8
compileJava.options.encoding = 'UTF-8'
compileTestJava.options.encoding = 'UTF-8'
javadoc.options.encoding = 'UTF-8'
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
// if (JavaVersion.current().isJava9Compatible()) {
// options.release = 8
// }
}
tasks.withType(Test) {
systemProperty('file.encoding', 'UTF-8')
}
tasks.withType(Javadoc) {
options.encoding = 'UTF-8'
}
allprojects {
repositories {
// Use jcenter for resolving dependencies.
// You can declare any Maven/Ivy/file repository here.
mavenCentral()
}
}
dependencies {
implementation project(":solarxr-protocol")
// This dependency is used internally, and not exposed to consumers on their own compile classpath.
implementation group: 'com.google.flatbuffers', name: 'flatbuffers-java', version: '22.10.26'
implementation group: 'commons-cli', name: 'commons-cli', version: '1.3.1'
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.12.6.1'
implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.13.3'
implementation 'com.github.jonpeterson:jackson-module-model-versioning:1.2.2'
implementation 'org.apache.commons:commons-math3:3.6.1'
implementation 'org.apache.commons:commons-lang3:3.12.0'
implementation 'net.java.dev.jna:jna:5.+'
implementation 'net.java.dev.jna:jna-platform:5.+'
implementation 'com.illposed.osc:javaosc-core:0.8'
implementation 'com.fazecast:jSerialComm:2.+'
implementation 'com.google.protobuf:protobuf-java:3.+'
implementation 'org.java-websocket:Java-WebSocket:1.+'
implementation 'com.melloware:jintellitype:1.+'
// Use JUnit test framework
testImplementation platform('org.junit:junit-bom:5.9.0')
testImplementation 'org.junit.jupiter:junit-jupiter'
testImplementation 'org.junit.platform:junit-platform-launcher'
}
test {
useJUnitPlatform()
}
shadowJar {
archiveBaseName.set('slimevr')
archiveClassifier.set('')
archiveVersion.set('')
}
application {
getMainClass().set('dev.slimevr.Main')
}
spotless {
// optional: limit format enforcement to just the files changed by this feature branch
// ratchetFrom 'origin/main'
format 'misc', {
// define the files to apply `misc` to
target '*.gradle', '*.md', '.gitignore'
// define the steps to apply to those files
trimTrailingWhitespace()
endWithNewline()
indentWithTabs()
}
// format 'yaml', {
// target '*.yml', '*.yaml',
// trimTrailingWhitespace()
// endWithNewline()
// indentWithSpaces(2) // YAML cannot contain tabs: https://yaml.org/faq.html
// }
java {
removeUnusedImports()
// Use eclipse JDT formatter
eclipse().configFile("spotless.xml")
}
}

163
server/build.gradle.kts Normal file
View File

@@ -0,0 +1,163 @@
/*
* This file was generated by the Gradle "init" task.
*
* This generated file contains a sample Java Library project to get you started.
* For more details take a look at the Java Libraries chapter in the Gradle
* User Manual available at https://docs.gradle.org/6.3/userguide/java_library_plugin.html
*/
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import java.io.ByteArrayOutputStream
plugins {
kotlin("jvm") version "1.7.21"
application
id("com.github.johnrengelman.shadow") version "7.1.2"
id("com.diffplug.spotless") version "6.12.0"
id("com.github.gmazzo.buildconfig") version "3.1.0"
}
kotlin {
jvmToolchain {
languageVersion.set(JavaLanguageVersion.of(17))
}
}
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(17))
}
}
tasks.withType<KotlinCompile> {
kotlinOptions.jvmTarget = "17"
}
// Set compiler to use UTF-8
tasks.withType<JavaCompile> {
options.encoding = "UTF-8"
}
tasks.withType<Test> {
systemProperty("file.encoding", "UTF-8")
}
tasks.withType<Javadoc> {
options.encoding = "UTF-8"
}
allprojects {
repositories {
// Use jcenter for resolving dependencies.
// You can declare any Maven/Ivy/file repository here.
mavenCentral()
}
}
dependencies {
implementation(project(":solarxr-protocol"))
// This dependency is used internally, and not exposed to consumers on their own compile classpath.
implementation("com.google.flatbuffers:flatbuffers-java:22.10.26")
implementation("commons-cli:commons-cli:1.3.1")
implementation("com.fasterxml.jackson.core:jackson-databind:2.12.6.1")
implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.3")
implementation("com.github.jonpeterson:jackson-module-model-versioning:1.2.2")
implementation("org.apache.commons:commons-math3:3.6.1")
implementation("org.apache.commons:commons-lang3:3.12.0")
implementation("net.java.dev.jna:jna:5.+")
implementation("net.java.dev.jna:jna-platform:5.+")
implementation("com.illposed.osc:javaosc-core:0.8")
implementation("com.fazecast:jSerialComm:2.+")
implementation("com.google.protobuf:protobuf-java:3.+")
implementation("org.java-websocket:Java-WebSocket:1.+")
implementation("com.melloware:jintellitype:1.+")
testImplementation(kotlin("test"))
// Use JUnit test framework
testImplementation(platform("org.junit:junit-bom:5.9.0"))
testImplementation("org.junit.jupiter:junit-jupiter")
testImplementation("org.junit.platform:junit-platform-launcher")
}
tasks.test {
useJUnitPlatform()
}
tasks.shadowJar {
archiveBaseName.set("slimevr")
archiveClassifier.set("")
archiveVersion.set("")
}
application {
mainClass.set("dev.slimevr.Main")
}
fun String.runCommand(currentWorkingDir: File = file("./")): String {
val byteOut = ByteArrayOutputStream()
project.exec {
workingDir = currentWorkingDir
commandLine = this@runCommand.split("\\s".toRegex())
standardOutput = byteOut
}
return String(byteOut.toByteArray()).trim()
}
buildConfig {
val gitCommitHash = "git rev-parse --verify --short HEAD".runCommand().trim()
val gitVersionTag = "git --no-pager tag --points-at HEAD".runCommand().trim()
val gitClean = "git status --porcelain".runCommand().trim().isEmpty()
useKotlinOutput { topLevelConstants = true }
packageName("dev.slimevr")
buildConfigField("String", "GIT_COMMIT_HASH", "\"${gitCommitHash}\"")
buildConfigField("String", "GIT_VERSION_TAG", "\"${gitVersionTag}\"")
buildConfigField("boolean", "GIT_CLEAN", gitClean.toString())
}
configure<com.diffplug.gradle.spotless.SpotlessExtension> {
// optional: limit format enforcement to just the files changed by this feature branch
// ratchetFrom "origin/main"
format("misc") {
// define the files to apply `misc` to
target("*.gradle", "*.md", ".gitignore")
// define the steps to apply to those files
trimTrailingWhitespace()
endWithNewline()
indentWithTabs()
}
// format "yaml", {
// target "*.yml", "*.yaml",
// trimTrailingWhitespace()
// endWithNewline()
// indentWithSpaces(2) // YAML cannot contain tabs: https://yaml.org/faq.html
// }
// .editorconfig doesn't work so, manual override
// https://github.com/diffplug/spotless/issues/142
val editorConfig =
mapOf(
"indent_size" to 4,
"indent_style" to "tab",
"max_line_length" to 88,
"ktlint_experimental" to "enabled"
)
val ktlintVersion = "0.47.1"
kotlinGradle {
target("*.gradle.kts") // default target for kotlinGradle
ktlint(ktlintVersion)
.setUseExperimental(true)
.editorConfigOverride(editorConfig)
}
kotlin {
targetExclude("build/**/**.kt")
ktlint(ktlintVersion)
.setUseExperimental(true)
.editorConfigOverride(editorConfig)
}
java {
targetExclude("**/BuildConfig.java")
removeUnusedImports()
// Use eclipse JDT formatter
eclipse().configFile("spotless.xml")
}
}

View File

@@ -1443,4 +1443,404 @@ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
---------------------------------------------------------------
---------------------------------------------------------------
---------------------------------------------------------------
Font file containing language flags by:
Twitter Emoji (Twemoji)
https://github.com/twitter/twemoji
Attribution 4.0 International
=======================================================================
Creative Commons Corporation ("Creative Commons") is not a law firm and
does not provide legal services or legal advice. Distribution of
Creative Commons public licenses does not create a lawyer-client or
other relationship. Creative Commons makes its licenses and related
information available on an "as-is" basis. Creative Commons gives no
warranties regarding its licenses, any material licensed under their
terms and conditions, or any related information. Creative Commons
disclaims all liability for damages resulting from their use to the
fullest extent possible.
Using Creative Commons Public Licenses
Creative Commons public licenses provide a standard set of terms and
conditions that creators and other rights holders may use to share
original works of authorship and other material subject to copyright
and certain other rights specified in the public license below. The
following considerations are for informational purposes only, are not
exhaustive, and do not form part of our licenses.
Considerations for licensors: Our public licenses are
intended for use by those authorized to give the public
permission to use material in ways otherwise restricted by
copyright and certain other rights. Our licenses are
irrevocable. Licensors should read and understand the terms
and conditions of the license they choose before applying it.
Licensors should also secure all rights necessary before
applying our licenses so that the public can reuse the
material as expected. Licensors should clearly mark any
material not subject to the license. This includes other CC-
licensed material, or material used under an exception or
limitation to copyright. More considerations for licensors:
wiki.creativecommons.org/Considerations_for_licensors
Considerations for the public: By using one of our public
licenses, a licensor grants the public permission to use the
licensed material under specified terms and conditions. If
the licensor's permission is not necessary for any reason--for
example, because of any applicable exception or limitation to
copyright--then that use is not regulated by the license. Our
licenses grant only permissions under copyright and certain
other rights that a licensor has authority to grant. Use of
the licensed material may still be restricted for other
reasons, including because others have copyright or other
rights in the material. A licensor may make special requests,
such as asking that all changes be marked or described.
Although not required by our licenses, you are encouraged to
respect those requests where reasonable. More_considerations
for the public:
wiki.creativecommons.org/Considerations_for_licensees
=======================================================================
Creative Commons Attribution 4.0 International Public License
By exercising the Licensed Rights (defined below), You accept and agree
to be bound by the terms and conditions of this Creative Commons
Attribution 4.0 International Public License ("Public License"). To the
extent this Public License may be interpreted as a contract, You are
granted the Licensed Rights in consideration of Your acceptance of
these terms and conditions, and the Licensor grants You such rights in
consideration of benefits the Licensor receives from making the
Licensed Material available under these terms and conditions.
Section 1 -- Definitions.
a. Adapted Material means material subject to Copyright and Similar
Rights that is derived from or based upon the Licensed Material
and in which the Licensed Material is translated, altered,
arranged, transformed, or otherwise modified in a manner requiring
permission under the Copyright and Similar Rights held by the
Licensor. For purposes of this Public License, where the Licensed
Material is a musical work, performance, or sound recording,
Adapted Material is always produced where the Licensed Material is
synched in timed relation with a moving image.
b. Adapter's License means the license You apply to Your Copyright
and Similar Rights in Your contributions to Adapted Material in
accordance with the terms and conditions of this Public License.
c. Copyright and Similar Rights means copyright and/or similar rights
closely related to copyright including, without limitation,
performance, broadcast, sound recording, and Sui Generis Database
Rights, without regard to how the rights are labeled or
categorized. For purposes of this Public License, the rights
specified in Section 2(b)(1)-(2) are not Copyright and Similar
Rights.
d. Effective Technological Measures means those measures that, in the
absence of proper authority, may not be circumvented under laws
fulfilling obligations under Article 11 of the WIPO Copyright
Treaty adopted on December 20, 1996, and/or similar international
agreements.
e. Exceptions and Limitations means fair use, fair dealing, and/or
any other exception or limitation to Copyright and Similar Rights
that applies to Your use of the Licensed Material.
f. Licensed Material means the artistic or literary work, database,
or other material to which the Licensor applied this Public
License.
g. Licensed Rights means the rights granted to You subject to the
terms and conditions of this Public License, which are limited to
all Copyright and Similar Rights that apply to Your use of the
Licensed Material and that the Licensor has authority to license.
h. Licensor means the individual(s) or entity(ies) granting rights
under this Public License.
i. Share means to provide material to the public by any means or
process that requires permission under the Licensed Rights, such
as reproduction, public display, public performance, distribution,
dissemination, communication, or importation, and to make material
available to the public including in ways that members of the
public may access the material from a place and at a time
individually chosen by them.
j. Sui Generis Database Rights means rights other than copyright
resulting from Directive 96/9/EC of the European Parliament and of
the Council of 11 March 1996 on the legal protection of databases,
as amended and/or succeeded, as well as other essentially
equivalent rights anywhere in the world.
k. You means the individual or entity exercising the Licensed Rights
under this Public License. Your has a corresponding meaning.
Section 2 -- Scope.
a. License grant.
1. Subject to the terms and conditions of this Public License,
the Licensor hereby grants You a worldwide, royalty-free,
non-sublicensable, non-exclusive, irrevocable license to
exercise the Licensed Rights in the Licensed Material to:
a. reproduce and Share the Licensed Material, in whole or
in part; and
b. produce, reproduce, and Share Adapted Material.
2. Exceptions and Limitations. For the avoidance of doubt, where
Exceptions and Limitations apply to Your use, this Public
License does not apply, and You do not need to comply with
its terms and conditions.
3. Term. The term of this Public License is specified in Section
6(a).
4. Media and formats; technical modifications allowed. The
Licensor authorizes You to exercise the Licensed Rights in
all media and formats whether now known or hereafter created,
and to make technical modifications necessary to do so. The
Licensor waives and/or agrees not to assert any right or
authority to forbid You from making technical modifications
necessary to exercise the Licensed Rights, including
technical modifications necessary to circumvent Effective
Technological Measures. For purposes of this Public License,
simply making modifications authorized by this Section 2(a)
(4) never produces Adapted Material.
5. Downstream recipients.
a. Offer from the Licensor -- Licensed Material. Every
recipient of the Licensed Material automatically
receives an offer from the Licensor to exercise the
Licensed Rights under the terms and conditions of this
Public License.
b. No downstream restrictions. You may not offer or impose
any additional or different terms or conditions on, or
apply any Effective Technological Measures to, the
Licensed Material if doing so restricts exercise of the
Licensed Rights by any recipient of the Licensed
Material.
6. No endorsement. Nothing in this Public License constitutes or
may be construed as permission to assert or imply that You
are, or that Your use of the Licensed Material is, connected
with, or sponsored, endorsed, or granted official status by,
the Licensor or others designated to receive attribution as
provided in Section 3(a)(1)(A)(i).
b. Other rights.
1. Moral rights, such as the right of integrity, are not
licensed under this Public License, nor are publicity,
privacy, and/or other similar personality rights; however, to
the extent possible, the Licensor waives and/or agrees not to
assert any such rights held by the Licensor to the limited
extent necessary to allow You to exercise the Licensed
Rights, but not otherwise.
2. Patent and trademark rights are not licensed under this
Public License.
3. To the extent possible, the Licensor waives any right to
collect royalties from You for the exercise of the Licensed
Rights, whether directly or through a collecting society
under any voluntary or waivable statutory or compulsory
licensing scheme. In all other cases the Licensor expressly
reserves any right to collect such royalties.
Section 3 -- License Conditions.
Your exercise of the Licensed Rights is expressly made subject to the
following conditions.
a. Attribution.
1. If You Share the Licensed Material (including in modified
form), You must:
a. retain the following if it is supplied by the Licensor
with the Licensed Material:
i. identification of the creator(s) of the Licensed
Material and any others designated to receive
attribution, in any reasonable manner requested by
the Licensor (including by pseudonym if
designated);
ii. a copyright notice;
iii. a notice that refers to this Public License;
iv. a notice that refers to the disclaimer of
warranties;
v. a URI or hyperlink to the Licensed Material to the
extent reasonably practicable;
b. indicate if You modified the Licensed Material and
retain an indication of any previous modifications; and
c. indicate the Licensed Material is licensed under this
Public License, and include the text of, or the URI or
hyperlink to, this Public License.
2. You may satisfy the conditions in Section 3(a)(1) in any
reasonable manner based on the medium, means, and context in
which You Share the Licensed Material. For example, it may be
reasonable to satisfy the conditions by providing a URI or
hyperlink to a resource that includes the required
information.
3. If requested by the Licensor, You must remove any of the
information required by Section 3(a)(1)(A) to the extent
reasonably practicable.
4. If You Share Adapted Material You produce, the Adapter's
License You apply must not prevent recipients of the Adapted
Material from complying with this Public License.
Section 4 -- Sui Generis Database Rights.
Where the Licensed Rights include Sui Generis Database Rights that
apply to Your use of the Licensed Material:
a. for the avoidance of doubt, Section 2(a)(1) grants You the right
to extract, reuse, reproduce, and Share all or a substantial
portion of the contents of the database;
b. if You include all or a substantial portion of the database
contents in a database in which You have Sui Generis Database
Rights, then the database in which You have Sui Generis Database
Rights (but not its individual contents) is Adapted Material; and
c. You must comply with the conditions in Section 3(a) if You Share
all or a substantial portion of the contents of the database.
For the avoidance of doubt, this Section 4 supplements and does not
replace Your obligations under this Public License where the Licensed
Rights include other Copyright and Similar Rights.
Section 5 -- Disclaimer of Warranties and Limitation of Liability.
a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
c. The disclaimer of warranties and limitation of liability provided
above shall be interpreted in a manner that, to the extent
possible, most closely approximates an absolute disclaimer and
waiver of all liability.
Section 6 -- Term and Termination.
a. This Public License applies for the term of the Copyright and
Similar Rights licensed here. However, if You fail to comply with
this Public License, then Your rights under this Public License
terminate automatically.
b. Where Your right to use the Licensed Material has terminated under
Section 6(a), it reinstates:
1. automatically as of the date the violation is cured, provided
it is cured within 30 days of Your discovery of the
violation; or
2. upon express reinstatement by the Licensor.
For the avoidance of doubt, this Section 6(b) does not affect any
right the Licensor may have to seek remedies for Your violations
of this Public License.
c. For the avoidance of doubt, the Licensor may also offer the
Licensed Material under separate terms or conditions or stop
distributing the Licensed Material at any time; however, doing so
will not terminate this Public License.
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
License.
Section 7 -- Other Terms and Conditions.
a. The Licensor shall not be bound by any additional or different
terms or conditions communicated by You unless expressly agreed.
b. Any arrangements, understandings, or agreements regarding the
Licensed Material not stated herein are separate from and
independent of the terms and conditions of this Public License.
Section 8 -- Interpretation.
a. For the avoidance of doubt, this Public License does not, and
shall not be interpreted to, reduce, limit, restrict, or impose
conditions on any use of the Licensed Material that could lawfully
be made without permission under this Public License.
b. To the extent possible, if any provision of this Public License is
deemed unenforceable, it shall be automatically reformed to the
minimum extent necessary to make it enforceable. If the provision
cannot be reformed, it shall be severed from this Public License
without affecting the enforceability of the remaining terms and
conditions.
c. No term or condition of this Public License will be waived and no
failure to comply consented to unless expressly agreed to by the
Licensor.
d. Nothing in this Public License constitutes or may be interpreted
as a limitation upon, or waiver of, any privileges and immunities
that apply to the Licensor or You, including from the legal
processes of any jurisdiction or authority.
=======================================================================
Creative Commons is not a party to its public licenses.
Notwithstanding, Creative Commons may elect to apply one of its public
licenses to material it publishes and in those instances will be
considered the "Licensor." Except for the limited purpose of indicating
that material is shared under a Creative Commons public license or as
otherwise permitted by the Creative Commons policies published at
creativecommons.org/policies, Creative Commons does not authorize the
use of the trademark "Creative Commons" or any other trademark or logo
of Creative Commons without its prior written consent including,
without limitation, in connection with any unauthorized modifications
to any of its public licenses or any other arrangements,
understandings, or agreements concerning use of licensed material. For
the avoidance of doubt, this paragraph does not form part of the public
licenses.
Creative Commons may be contacted at creativecommons.org.
---------------------------------------------------------------

View File

@@ -36,6 +36,7 @@ import io.eiren.math.FloatMath;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.AbstractList;
import java.util.logging.Logger;
@@ -351,7 +352,7 @@ public final class Quaternion implements Cloneable, java.io.Serializable {
/**
* Returns Euler rotation angle around y axis (yaw).
*
*
* @return
* @see #toAngles(float[])
*/
@@ -923,6 +924,74 @@ public final class Quaternion implements Cloneable, java.io.Serializable {
normalizeLocal();
}
/**
* Sets the values of this quaternion to the unit average of the given
* Quaternions and return itself
*
* @param qn list of all the Quaternions to average
* @return a new Quaternion resulting from the average of the given
* Quaternions
*/
public Quaternion fromAveragedQuaternions(AbstractList<Quaternion> qn) {
if (qn.size() == 0) {
throw new IllegalArgumentException("qn's length can't be 0");
}
float sumX = 0f;
float sumY = 0f;
float sumZ = 0f;
float sumW = 0f;
for (Quaternion q : qn) {
sumX += q.x;
sumY += q.y;
sumZ += q.z;
sumW += q.w;
}
x = sumX / qn.size();
y = sumY / qn.size();
z = sumZ / qn.size();
w = sumW / qn.size();
return this;
}
/**
* Sets the values of this quaternion to the unit average of the given
* Quaternions and return itself
*
* @param qn list of all the Quaternions to average
* @param tn 0-1, averaging weight for Quaternions (sum = 1)
* @return a new Quaternion resulting from the weighted average of the given
* Quaternions
*/
public Quaternion fromAveragedQuaternions(AbstractList<Quaternion> qn, AbstractList<Float> tn) {
if (qn.size() == 0) {
throw new IllegalArgumentException("qn's length can't be 0");
}
if (qn.size() != tn.size()) {
throw new IllegalArgumentException("qn and tn must have the same length");
}
float averagedX = 0f;
float averagedY = 0f;
float averagedZ = 0f;
float averagedW = 0f;
for (int i = 0; i < qn.size(); i++) {
averagedX += qn.get(i).x * tn.get(i);
averagedY += qn.get(i).y * tn.get(i);
averagedZ += qn.get(i).z * tn.get(i);
averagedW += qn.get(i).w * tn.get(i);
}
x = averagedX;
y = averagedY;
z = averagedZ;
w = averagedW;
return this;
}
/**
* <code>add</code> adds the values of this quaternion to those of the
* parameter quaternion. The result is returned as a new quaternion.
@@ -1436,8 +1505,8 @@ public final class Quaternion implements Cloneable, java.io.Serializable {
float invNorm = 1.0f / norm;
return new Quaternion(-x * invNorm, -y * invNorm, -z * invNorm, w * invNorm);
}
// return an invalid result to flag the error
return null;
// return itself since it has no inverse
return this;
}
/**

View File

@@ -1,106 +0,0 @@
package dev.slimevr;
import io.eiren.util.logging.LogManager;
import org.apache.commons.cli.*;
import org.apache.commons.lang3.JavaVersion;
import org.apache.commons.lang3.SystemUtils;
import javax.swing.*;
import java.io.File;
import java.io.IOException;
import java.net.ServerSocket;
public class Main {
public static String VERSION = "0.5.1";
public static VRServer vrServer;
public static void main(String[] args) {
System.setProperty("awt.useSystemAAFontSettings", "on");
System.setProperty("swing.aatext", "true");
CommandLineParser parser = new DefaultParser();
HelpFormatter formatter = new HelpFormatter();
CommandLine cmd = null;
Options options = new Options();
Option help = new Option("h", "help", false, "Show help");
options.addOption(help);
try {
cmd = parser.parse(options, args, true);
} catch (ParseException e) {
System.out.println(e.getMessage());
formatter.printHelp("slimevr.jar", options);
System.exit(1);
}
if (cmd.hasOption("help")) {
formatter.printHelp("slimevr.jar", options);
System.exit(0);
}
File dir = new File("").getAbsoluteFile();
try {
LogManager.initialize(new File(dir, "logs/"), dir);
} catch (Exception e1) {
e1.printStackTrace();
}
if (!SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_17)) {
LogManager.severe("SlimeVR start-up error! A minimum of Java 17 is required.");
JOptionPane
.showMessageDialog(
null,
"SlimeVR start-up error! A minimum of Java 17 is required.",
"SlimeVR: Java Runtime Mismatch",
JOptionPane.ERROR_MESSAGE
);
return;
}
try {
new ServerSocket(6969).close();
new ServerSocket(35903).close();
new ServerSocket(21110).close();
} catch (IOException e) {
LogManager
.severe(
"SlimeVR start-up error! Required ports are busy. Make sure there is no other instance of SlimeVR Server running."
);
JOptionPane
.showMessageDialog(
null,
"SlimeVR start-up error! Required ports are busy. Make sure there is no other instance of SlimeVR Server running.",
"SlimeVR: Ports are busy",
JOptionPane.ERROR_MESSAGE
);
return;
}
try {
vrServer = new VRServer();
vrServer.start();
new Keybinding(vrServer);
} catch (Throwable e) {
e.printStackTrace();
try {
Thread.sleep(2000L);
} catch (InterruptedException e2) {
e.printStackTrace();
}
System.exit(1); // Exit in case error happened on init and window
// not appeared, but some thread
// started
} finally {
try {
Thread.sleep(2000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

View File

@@ -0,0 +1,110 @@
@file:JvmName("Main")
package dev.slimevr
import io.eiren.util.logging.LogManager
import org.apache.commons.cli.CommandLine
import org.apache.commons.cli.CommandLineParser
import org.apache.commons.cli.DefaultParser
import org.apache.commons.cli.HelpFormatter
import org.apache.commons.cli.Option
import org.apache.commons.cli.Options
import org.apache.commons.lang3.SystemUtils
import java.io.File
import java.io.IOException
import java.lang.System
import java.net.ServerSocket
import javax.swing.JOptionPane
import kotlin.system.exitProcess
val VERSION =
(GIT_VERSION_TAG.ifEmpty { GIT_COMMIT_HASH }) +
if (GIT_CLEAN) "" else "-dirty"
var vrServer: VRServer? = null
fun main(args: Array<String>) {
System.setProperty("awt.useSystemAAFontSettings", "on")
System.setProperty("swing.aatext", "true")
val parser: CommandLineParser = DefaultParser()
val formatter = HelpFormatter()
val options = Options()
val help = Option("h", "help", false, "Show help")
val version = Option("V", "version", false, "Show version")
options.addOption(help)
options.addOption(version)
val cmd: CommandLine = try {
parser.parse(options, args, true)
} catch (e: org.apache.commons.cli.ParseException) {
formatter.printHelp("slimevr.jar", options)
exitProcess(1)
}
if (cmd.hasOption("help")) {
formatter.printHelp("slimevr.jar", options)
exitProcess(0)
}
if (cmd.hasOption("version")) {
println("SlimeVR Server $VERSION")
exitProcess(0)
}
val dir = File("").absoluteFile
try {
LogManager.initialize(File(dir, "logs/"), dir)
} catch (e1: java.lang.Exception) {
e1.printStackTrace()
}
LogManager.info("Running version $VERSION")
if (!SystemUtils.isJavaVersionAtLeast(org.apache.commons.lang3.JavaVersion.JAVA_17)) {
LogManager.severe("SlimeVR start-up error! A minimum of Java 17 is required.")
JOptionPane
.showMessageDialog(
null,
"SlimeVR start-up error! A minimum of Java 17 is required.",
"SlimeVR: Java Runtime Mismatch",
JOptionPane.ERROR_MESSAGE
)
return
}
try {
// This is disabled because the config can't be read at this point
// new ServerSocket(6969).close();
ServerSocket(35903).close()
ServerSocket(21110).close()
} catch (e: IOException) {
LogManager
.severe(
"SlimeVR start-up error! Required ports are busy. " +
"Make sure there is no other instance of SlimeVR Server running."
)
JOptionPane
.showMessageDialog(
null,
"SlimeVR start-up error! Required ports are busy. " +
"Make sure there is no other instance of SlimeVR Server running.",
"SlimeVR: Ports are busy",
JOptionPane.ERROR_MESSAGE
)
return
}
try {
vrServer = VRServer()
vrServer!!.start()
Keybinding(vrServer)
} catch (e: Throwable) {
e.printStackTrace()
try {
Thread.sleep(2000L)
} catch (e2: InterruptedException) {
e.printStackTrace()
}
exitProcess(1) // Exit in case error happened on init and window
// not appeared, but some thread
// started
} finally {
try {
Thread.sleep(2000L)
} catch (e: InterruptedException) {
e.printStackTrace()
}
}
}

View File

@@ -27,6 +27,7 @@ import io.eiren.util.OperatingSystem;
import io.eiren.util.ann.ThreadSafe;
import io.eiren.util.ann.ThreadSecure;
import io.eiren.util.collections.FastList;
import io.eiren.util.logging.LogManager;
import solarxr_protocol.datatypes.TrackerIdT;
import java.net.InetAddress;
@@ -88,10 +89,16 @@ public class VRServer extends Thread {
shareTrackers = humanPoseProcessor.getComputedTrackers();
// Start server for SlimeVR trackers
trackersServer = new TrackersUDPServer(6969, "Sensors UDP server", this::registerTracker);
int trackerPort = configManager.getVrConfig().getServer().getTrackerPort();
LogManager.info("Starting the tracker server on port " + trackerPort + "...");
trackersServer = new TrackersUDPServer(
trackerPort,
"Sensors UDP server",
this::registerTracker
);
// OpenVR bridge currently only supports Windows
SteamVRBridge driverBridge = null;
final SteamVRBridge driverBridge;
if (OperatingSystem.getCurrentPlatform() == OperatingSystem.WINDOWS) {
// Create named pipe bridge for SteamVR driver
@@ -119,18 +126,40 @@ public class VRServer extends Thread {
tasks.add(feederBridge::startBridge);
bridges.add(feederBridge);
} else if (OperatingSystem.getCurrentPlatform() == OperatingSystem.LINUX) {
driverBridge = new UnixSocketBridge(
this,
hmdTracker,
"steamvr",
"SteamVR Driver Bridge",
"/tmp/SlimeVRDriver",
shareTrackers
);
tasks.add(driverBridge::startBridge);
bridges.add(driverBridge);
SteamVRBridge linuxBridge = null;
try {
linuxBridge = new UnixSocketBridge(
this,
hmdTracker,
"steamvr",
"SteamVR Driver Bridge",
"/tmp/SlimeVRDriver",
shareTrackers
);
} catch (Exception ex) {
LogManager.severe("Failed to initiate Unix socket, disabling driver bridge...", ex);
}
driverBridge = linuxBridge;
if (driverBridge != null) {
tasks.add(driverBridge::startBridge);
bridges.add(driverBridge);
}
} else {
driverBridge = null;
}
// Add shutdown hook
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
try {
if (driverBridge instanceof UnixSocketBridge linuxBridge) {
// Auto-close Linux SteamVR bridge on JVM shutdown
linuxBridge.close();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}));
// Create WebSocket server
WebSocketVRBridge wsBridge = new WebSocketVRBridge(hmdTracker, shareTrackers, this);
tasks.add(wsBridge::startBridge);

View File

@@ -167,7 +167,7 @@ public abstract class ProtobufBridge<T extends VRTracker> implements Bridge {
if (trackerAdded.getTrackerRole() == TrackerRole.HMD.id) {
hmdTracker = tracker;
} else {
Main.vrServer.registerTracker(tracker);
Main.getVrServer().registerTracker(tracker);
}
}
@@ -179,10 +179,10 @@ public abstract class ProtobufBridge<T extends VRTracker> implements Bridge {
.warning("[" + bridgeName + "] Received deprecated user action 'calibrate'!");
case "reset":
// TODO : Check pose field
Main.vrServer.resetTrackers();
Main.getVrServer().resetTrackers();
break;
case "fast_reset":
Main.vrServer.resetTrackersYaw();
Main.getVrServer().resetTrackersYaw();
break;
}
}

Some files were not shown because too many files have changed in this diff Show More